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 1weYpS-004rzA-1p for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 13:48:46 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1weYpQ-008XNu-0v for pgsql-hackers@arkaria.postgresql.org; Tue, 30 Jun 2026 13:48:44 +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.96) (envelope-from ) id 1weYpP-008XNm-2z for pgsql-hackers@lists.postgresql.org; Tue, 30 Jun 2026 13:48:43 +0000 Received: from mail-qk1-x731.google.com ([2607:f8b0:4864:20::731]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1weYpN-000000011Jt-22Wp for pgsql-hackers@lists.postgresql.org; Tue, 30 Jun 2026 13:48:43 +0000 Received: by mail-qk1-x731.google.com with SMTP id af79cd13be357-92e50c5d14cso141851585a.2 for ; Tue, 30 Jun 2026 06:48:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782827319; cv=none; d=google.com; s=arc-20260327; b=k55XAVbvEN/uWHhcSgBqk/bsDAYreGvYXDldcmbTYSxjgMna+CEdh2aDnoFfpGWJKe uiCfsSoaNTBO8Zo4rkK5r9z/185oPbWM1djGcMqdwGHWe1Cz+qtWU/wL1x/4Gx0bVp5a r7B+FEQKGgoQstrzexyjOutOTNRRa/EcJGVwxaCj218VgNfg0TBq0szhpyxHCNlHAGD2 DQ8QowChRFUUG9rRQR3UuaCg0uYDaN58g9GuVW6LOvH/RtKJutMT3QJWHwrlGQ4nrJwb Z6ZVhz+eSV6ssSBwtKMkC/Y1mh0yR1qzpOef9xcZZ50XqIS6ZYCCEOugrZEjfO7ooLEQ CyLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=lJfoYryZ7wJz6DKe5LJJdopgxXa5q71i3+QIMqq4VQ4=; fh=nwNxTtLLPTU0ewfLM7SSbrjMajMl+wwnFkCY/fi90vE=; b=I05X7CjZZRRcqRET6pSngKKOYxe3pJ8eXGNXBlLZW64nz/X1qB5fdmr/LcE+65MBii Mp2bkah6DmZHCqKtw4uhzdm+4npuONmevpyDUhH1Wkg/8Hdqfkcnz1oZWMLBkG8R2/Wq YMRh0scGevKFF+GTZcIHpTKTa/kG4K5w3832LoPR+HVLIePK2BM2PfK+bgeYV0/hB5/u UCRWfM1n7v4pNA9qCilKsOnYzypJEYluw3kKiih5V5eVY6bb6t2/zBSUiqBnfbJc8EC5 KbmX8w73I0oLJQgQUrtCEzningOI2nZO8vitboUiA37HbiBG1SJY86pSaho3GGr7s2ji Iw5w==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782827319; x=1783432119; darn=lists.postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=lJfoYryZ7wJz6DKe5LJJdopgxXa5q71i3+QIMqq4VQ4=; b=WzkvWIX1Fj2vstH1g7Ir1TC+F/5SdOw9JNM8v97pYXdL86owibCSvUrSMj5T5rZ+uo CWSTIB40pZHMBhO2AKOmSieQw4SeHSxagX17Mmts9mx1borYtPzJdwJwIBqqDcyxZqEG JL9vRh2ttpo7YKMqsjt5cEnLdarQIfuwb61UEO9xL/otqe5V1MJ1RH8UkyLrq4gjWPW4 DNGOrJ5Komkp0KJbd6eiADE19IvG0uLHUAopKGVCo9DyJgLSzDD+bsmTiAQHdH1yDnRv tTZjSb0RFuXOVmz1q6DqC9db/M4YHrcgS0iDFjQyaRG1Qpjf5xWXBaLmWiAE06S6stgb mY/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782827319; x=1783432119; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lJfoYryZ7wJz6DKe5LJJdopgxXa5q71i3+QIMqq4VQ4=; b=ZHTFRR4ivcHg2v031RKU8Lfn3S9VPZZ9X+3Z8gpTI7qkQwB6EfiSuwqHcNTIZH01Rw tMTEplNToEVdfk+yWdupMXpCGWiuxCrGF94+R+ZIstGytdUjs8oE1XcJheZZS3PyVM1G gGDIQbBvSCw9zJ2tiOgWyJNwGgmUVVRZ3DprBjNzrZqPCuhrMVZpEmQxY/xwfG4u/HO0 HMiKhfJn5+PsAhimjiD63q1YPOt7icGreYObn7iqbhfs8qk6lI6uCsO7YFl8P8HlFLoc Y0o4fRcj03nXqoR7FmdlCxWc/gK2JjU3fc+GGjtJEIOrtKdajwXcq8iG3SFafp3A/pCB JwWg== X-Gm-Message-State: AOJu0Yy6e5d1ecWQBBv8xnMZ9tlQcZkbK34D3Z4qZuoGtYyC53DaLVmq OG1CpKBzjkm3SH6jjFjDVbkNZqdjYCkvcG4XapG60BZX4S29UF07Kyg+BG1saVwMcOROa0tH3fp tzEGmBopIpzOug4fOVJk6Ml+JsD6/FotgwMWVUFY= X-Gm-Gg: AfdE7cnXwNG4XJJRDELNdUz4ZVILhsbIg8BTbzKvU5cIE31iqocn7xxyrxyzixo7VM7 6Fszjd861DEttklFxFYlymts1gbtjo6gJbrp2XHqX2V8pMDuxXXEMlMqwvxmWrlx6xlCJyY/GZq nfYXN+AlrnGYIRf2G/tW+NjsyuBwB2cXKAi+Mj4WoHlBCFX+Q7nnlXvtqwhgSQVxRZrV7GI3vqq ztKdztkEs2sZEwzmF2IKl8LiUzrUrZO+Bjeb5711IEK6fGHOOM3fcecN4H7RHMGhD5OQP8= X-Received: by 2002:a05:620a:468d:b0:92a:1d33:bcc8 with SMTP id af79cd13be357-92e6267196cmr624298285a.19.1782827319506; Tue, 30 Jun 2026 06:48:39 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: prankware Date: Tue, 30 Jun 2026 16:48:26 +0300 X-Gm-Features: AVVi8CeIW6YxyCjsaJX-FtCsU3xWxEm3aHvhEWmdVau4ZDRJPqQKqqel5jwDKGQ Message-ID: Subject: Re: COALESCE patch To: pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000135055065578d57f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000135055065578d57f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable rebase and refactor format for cfbot =D0=B2=D1=82, 30 =D0=B8=D1=8E=D0=BD. 2026=E2=80=AF=D0=B3. =D0=B2 14:26, pra= nkware : > > Hi everyone, > > The planner ignores column statistics when an equality has a COALESCE > expression on one side. For a clause like COALESCE(a, b) =3D $1, or a joi= n on > COALESCE(t1.a, t1.b) =3D COALESCE(t2.c, t2.d), there are no statistics on= the > COALESCE node itself, so eqsel() and eqjoinsel() return the generic 0.005 > estimate while the per-column stats for a, b, c and d sit unused. The onl= y way > around this today is an expression index or extended statistics on that e= xact > expression, which doesn't scale across many different COALESCE clauses. > estimate_hash_bucket_stats() has the same gap: a COALESCE hash key gets a > default ndistinct and therefore a default bucket size. Since these expres= sions > are common in joins and filters over nullable or fallback columns, the de= fault > estimate can be far enough off to flip the join order or join method. > > The idea is to estimate straight from the existing per-column stats, with= no > extra statistics object. COALESCE(arg_1, ..., arg_n) returns arg_i only w= hen > arg_1 .. arg_{i-1} are all NULL, so the chance of reaching branch i is th= e > product of stanullfrac over the earlier branches. Selectivity of > COALESCE(l_1..l_M) =3D COALESCE(r_1..r_N) is then the sum over branch pai= rs of > P(reach l_i) * P(reach r_j) * sel(l_i =3D r_j), and each sel(l_i =3D r_j)= is a > recursive call back into eqsel()/eqjoinsel(). A non-COALESCE side is trea= ted as > a one-branch list, so scalar COALESCE(a, b) =3D const falls out of the sa= me code, > and the same decomposition feeds estimate_hash_bucket_stats(). If any bra= nch is > missing stats, the code bails and today's behavior is unchanged. > > A minimal example: > > CREATE TABLE t (a int, b int); > INSERT INTO t > SELECT CASE WHEN i % 5 < 2 THEN NULL ELSE i END, i > FROM generate_series(1, 1000) i; > ANALYZE t; > > EXPLAIN SELECT * FROM t WHERE COALESCE(a, b) =3D 42; > > After ANALYZE, a is NULL in 400 of the 1000 rows (stanullfrac 0.4, ndisti= nct > 600) and b has no NULLs (stanullfrac 0, ndistinct 1000). COALESCE(a, b) i= s > unique, so exactly one row matches. Each branch is weighted by the probab= ility > of reaching it, the product of stanullfrac over the branches before it: > > branch a: reach 1.0, sel(a =3D 42) =3D (1 - 0.4) / 600 =3D 0.001 > branch b: reach 0.4, sel(b =3D 42) =3D (1 - 0.0) / 1000 =3D 0.001 > > selectivity =3D 1.0 * 0.001 + 0.4 * 0.001 =3D 0.0014 -> ~1 row out = of 1000 > > The patch lands on ~1 row, matching reality. The 0.005 default (5 rows) i= s not > derived from the table at all: it is the 1/DEFAULT_NUM_DISTINCT constant = the > planner falls back to with no statistics on the expression, so it stays 5= rows > regardless of the null fraction or the ndistinct of a and b. > > Feedback is welcome. > > Regards, > Egor Savelev, > Tantor Labs LLC, > https://tantorlabs.com/ --000000000000135055065578d57f Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-Coalesce-eqsel-eqjoinsel.patch" Content-Disposition: attachment; filename="v1-0001-Coalesce-eqsel-eqjoinsel.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mr0pbk0x0 RnJvbSA3ZjcyZjI1NzVlN2UxMzJkMGVkMjFhNDVmODMwNmM5Njg1ZjY4MmI2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBwcmFua3dhcmUgPGVzYXZlbGlldmNvZGVAZ21haWwuY29tPgpE YXRlOiBUdWUsIDMwIEp1biAyMDI2IDE2OjQ1OjE0ICswMzAwClN1YmplY3Q6IFtQQVRDSCB2MV0g Q29hbGVzY2UgZXFzZWwgZXFqb2luc2VsCgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxm dW5jcy5jIHwgNDY0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KIDEgZmlsZSBjaGFu Z2VkLCA0MzQgaW5zZXJ0aW9ucygrKSwgMzAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs ZnVuY3MuYwppbmRleCBjYmM3MGZkZTcxNi4uZWIzOGZhNzI0ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jCkBAIC0zMDIsNiArMzAyLDI3OCBAQCBlcXNlbChQR19GVU5DVElPTl9BUkdTKQog CVBHX1JFVFVSTl9GTE9BVDgoKGZsb2F0OCkgZXFzZWxfaW50ZXJuYWwoZmNpbmZvLCBmYWxzZSkp OwogfQogCisvKgorICogRXh0cmFjdCB0aGUgZXN0aW1hYmxlIGJyYW5jaGVzIG9mIGEgQ29hbGVz Y2VFeHByLiAgU3RyaXBzIFJlbGFiZWxUeXBlLAorICogc2tpcHMgTlVMTC1jb25zdGFudCBicmFu Y2hlcywgYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCBub24tTlVMTCBDb25zdAorICogKHNldHRpbmcg KnRlcm1pbmF0ZXNfd2l0aF9jb25zdCkuICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBleHByZXNzaW9u CisgKiBpcyBjb25zdGFudCBvciBubyBicmFuY2hlcyByZW1haW4uCisgKi8KK3N0YXRpYyBib29s CittYXRjaF9jb2FsZXNjZV9qb2luX3NpZGUoTm9kZSAqc2lkZSwKKwkJCQkJCSBMaXN0ICoqc3Ry aXBwZWRfYXJncywKKwkJCQkJCSBib29sICp0ZXJtaW5hdGVzX3dpdGhfY29uc3QpCit7CisJQ29h bGVzY2VFeHByICpjOworCUxpc3RDZWxsICAgKmxjOworCUxpc3QJICAgKnJlc3VsdCA9IE5JTDsK KworCSp0ZXJtaW5hdGVzX3dpdGhfY29uc3QgPSBmYWxzZTsKKwkqc3RyaXBwZWRfYXJncyA9IE5J TDsKKworCWlmIChzaWRlID09IE5VTEwgfHwgIUlzQShzaWRlLCBDb2FsZXNjZUV4cHIpKQorCQly ZXR1cm4gZmFsc2U7CisKKwljID0gKENvYWxlc2NlRXhwciAqKSBzaWRlOworCisJaWYgKGxpc3Rf bGVuZ3RoKGMtPmFyZ3MpIDwgMikKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yZWFjaChsYywgYy0+ YXJncykKKwl7CisJCU5vZGUJICAgKmFyZyA9IChOb2RlICopIGxmaXJzdChsYyk7CisKKwkJLyog c3RyaXAgUmVsYWJlbFR5cGUgKi8KKwkJd2hpbGUgKGFyZyAmJiBJc0EoYXJnLCBSZWxhYmVsVHlw ZSkpCisJCQlhcmcgPSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIGFyZyktPmFyZzsKKworCQkv KiBsZWFkaW5nIENvbnN0IG1ha2VzIENPQUxFU0NFIGl0c2VsZiBjb25zdGFudCAqLworCQlpZiAo YXJnID09IE5VTEwgfHwgKGxjID09IGxpc3RfaGVhZChjLT5hcmdzKSAmJiBJc0EoYXJnLCBDb25z dCkpKQorCQl7CisJCQlsaXN0X2ZyZWUocmVzdWx0KTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQor CisJCWlmIChJc0EoYXJnLCBDb25zdCkpCisJCXsKKwkJCWlmICgoKENvbnN0ICopIGFyZyktPmNv bnN0dHlwZSAhPSBjLT5jb2FsZXNjZXR5cGUpCisJCQl7CisJCQkJbGlzdF9mcmVlKHJlc3VsdCk7 CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvKiBOVUxMIENvbnN0IGlzIHNraXBwZWQg Ki8KKwkJCWlmICghKChDb25zdCAqKSBhcmcpLT5jb25zdGlzbnVsbCkKKwkJCXsKKwkJCQlyZXN1 bHQgPSBsYXBwZW5kKHJlc3VsdCwgYXJnKTsKKwkJCQkqdGVybWluYXRlc193aXRoX2NvbnN0ID0g dHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChleHByVHlw ZShhcmcpICE9IGMtPmNvYWxlc2NldHlwZSkKKwkJCXsKKwkJCQlsaXN0X2ZyZWUocmVzdWx0KTsK KwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgYXJn KTsKKwkJfQorCX0KKworCWlmIChyZXN1bHQgPT0gTklMKQorCQlyZXR1cm4gZmFsc2U7CisKKwkq c3RyaXBwZWRfYXJncyA9IHJlc3VsdDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEZpbGwg cHJlZml4X3Byb2JzW2ldID0gUHJvZF97ajxpfSBzdGFudWxsZnJhYyhhcmdzW2pdKSBmb3IgYSBz dHJpcHBlZAorICogQ09BTEVTQ0UgYXJnIGxpc3QuICBSZXR1cm5zIGZhbHNlIGlmIGFueSBub24t Q29uc3QgYXJnIGxhY2tzIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBib29sCitnZXRfY29hbGVz Y2VfcHJlZml4X3Byb2JzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICphcmdzLCBkb3VibGUgKnBy ZWZpeF9wcm9icykKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKwlpbnQJCQlpID0gMDsKKwlkb3VibGUJ CXByZWZpeCA9IDEuMDsKKworCWZvcmVhY2gobGMsIGFyZ3MpCisJeworCQlOb2RlCSAgICphcmcg PSAoTm9kZSAqKSBsZmlyc3QobGMpOworCisJCXByZWZpeF9wcm9ic1tpKytdID0gcHJlZml4Owor CisJCS8qIG5vdGhpbmcgdG8gZm9sZCBmb3IgdGhlIGxhc3QgYXJnIG9yIGEgQ29uc3QgKi8KKwkJ aWYgKGxuZXh0KGFyZ3MsIGxjKSA9PSBOVUxMIHx8IElzQShhcmcsIENvbnN0KSkKKwkJCWNvbnRp bnVlOworCisJCXsKKwkJCVZhcmlhYmxlU3RhdERhdGEgdmQ7CisJCQlkb3VibGUJCXBfaTsKKwor CQkJZXhhbWluZV92YXJpYWJsZShyb290LCBhcmcsIDAsICZ2ZCk7CisJCQlpZiAoIUhlYXBUdXBs ZUlzVmFsaWQodmQuc3RhdHNUdXBsZSkpCisJCQl7CisJCQkJUmVsZWFzZVZhcmlhYmxlU3RhdHMo dmQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXBfaSA9ICgoRm9ybV9wZ19zdGF0aXN0 aWMpIEdFVFNUUlVDVCh2ZC5zdGF0c1R1cGxlKSktPnN0YW51bGxmcmFjOworCQkJUmVsZWFzZVZh cmlhYmxlU3RhdHModmQpOworCisJCQlpZiAocF9pIDwgMC4wIHx8IHBfaSA+IDEuMCkKKwkJCQly ZXR1cm4gZmFsc2U7CisKKwkJCXByZWZpeCAqPSBwX2k7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1 ZTsKK30KKworLyoKKyAqIENvbW1vbiBndXRzIG9mIGVxc2VsL2Vxam9pbnNlbCB3aGVuIG9uZSBv ciBib3RoIG9wZXJhbmRzIGFyZSBDb2FsZXNjZUV4cHIuCisgKiBDb21wdXRlczoKKyAqCisgKiAg IHNlbChDT0FMRVNDRShsXzEsLi4uLGxfTSkgPSBDT0FMRVNDRShyXzEsLi4uLHJfTikpID0KKyAq ICAgICAgIFN1bV97aSxqfSAgUF9MKHJlYWNoIGkpICogUF9SKHJlYWNoIGopICogc2VsKGxfaSA9 IHJfaikKKyAqCisgKiB3aGVyZSBQKHJlYWNoIGkpID0gUHJvZF97ajxpfSBzdGFudWxsZnJhYyhh cmdfaikuICBBIG5vbi1DT0FMRVNDRSBvcGVyYW5kCisgKiBpcyB0cmVhdGVkIGFzIGEgc2luZ2xl LWVsZW1lbnQgbGlzdC4KKyAqLworc3RhdGljIGJvb2wKK3RyeV9jb2FsZXNjZV9lcShQR19GVU5D VElPTl9BUkdTLCBkb3VibGUgKnNlbGVjX291dCkKK3sKKwlQbGFubmVySW5mbyAqcm9vdCA9IChQ bGFubmVySW5mbyAqKSBQR19HRVRBUkdfUE9JTlRFUigwKTsKKwlPaWQJCQlvcGVyYXRvciA9IFBH X0dFVEFSR19PSUQoMSk7CisJTGlzdAkgICAqYXJncyA9IChMaXN0ICopIFBHX0dFVEFSR19QT0lO VEVSKDIpOworCWJvb2wJCWlzX2Vxam9pbiA9IChmY2luZm8tPmZsaW5mbyAhPSBOVUxMICYmCisJ CQkJCQkJIGZjaW5mby0+ZmxpbmZvLT5mbl9vaWQgPT0gRl9FUUpPSU5TRUwpOworCVNwZWNpYWxK b2luSW5mbyAqc2ppbmZvID0gaXNfZXFqb2luID8KKwkJKFNwZWNpYWxKb2luSW5mbyAqKSBQR19H RVRBUkdfUE9JTlRFUig0KSA6IE5VTEw7CisJaW50CQkJZXFzZWxfdmFyUmVsaWQgPSBpc19lcWpv aW4gPyAwIDogUEdfR0VUQVJHX0lOVDMyKDMpOworCU9pZAkJCWNvbGxhdGlvbiA9IFBHX0dFVF9D T0xMQVRJT04oKTsKKwlOb2RlCSAgICpsZWZ0OworCU5vZGUJICAgKnJpZ2h0OworCUxpc3QJICAg KmxlZnRfYXJncyA9IE5JTDsKKwlMaXN0CSAgICpyaWdodF9hcmdzID0gTklMOworCWJvb2wJCWxl ZnRfaXNfY29hbGVzY2U7CisJYm9vbAkJcmlnaHRfaXNfY29hbGVzY2U7CisJYm9vbAkJbGVmdF90 ZXJtX2NvbnN0ID0gZmFsc2U7CisJYm9vbAkJcmlnaHRfdGVybV9jb25zdCA9IGZhbHNlOworCWRv dWJsZQkgICAqbGVmdF9wcmVmaXg7CisJZG91YmxlCSAgICpyaWdodF9wcmVmaXg7CisJZG91Ymxl CQlhY2Nfc2VsZWMgPSAwLjA7CisJTGlzdENlbGwgICAqbGxjOworCWludAkJCWxpOworCisJaWYg KGxpc3RfbGVuZ3RoKGFyZ3MpICE9IDIpCisJCXJldHVybiBmYWxzZTsKKworCWxlZnQgPSAoTm9k ZSAqKSBsaW5pdGlhbChhcmdzKTsKKwlyaWdodCA9IChOb2RlICopIGxzZWNvbmQoYXJncyk7CisK KwlsZWZ0X2lzX2NvYWxlc2NlID0gbWF0Y2hfY29hbGVzY2Vfam9pbl9zaWRlKGxlZnQsICZsZWZ0 X2FyZ3MsCisJCQkJCQkJCQkJCQkmbGVmdF90ZXJtX2NvbnN0KTsKKwlyaWdodF9pc19jb2FsZXNj ZSA9IG1hdGNoX2NvYWxlc2NlX2pvaW5fc2lkZShyaWdodCwgJnJpZ2h0X2FyZ3MsCisJCQkJCQkJ CQkJCQkgJnJpZ2h0X3Rlcm1fY29uc3QpOworCisJaWYgKCFsZWZ0X2lzX2NvYWxlc2NlICYmICFy aWdodF9pc19jb2FsZXNjZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogb25lIHNpZGUgaXMgYSBD b2FsZXNjZUV4cHIgdGhhdCBtYXRjaF9jb2FsZXNjZV9qb2luX3NpZGUgcmVqZWN0ZWQgKi8KKwlp ZiAoKGxlZnRfaXNfY29hbGVzY2UgJiYgIXJpZ2h0X2lzX2NvYWxlc2NlICYmIElzQShyaWdodCwg Q29hbGVzY2VFeHByKSkgfHwKKwkJKHJpZ2h0X2lzX2NvYWxlc2NlICYmICFsZWZ0X2lzX2NvYWxl c2NlICYmIElzQShsZWZ0LCBDb2FsZXNjZUV4cHIpKSkKKwl7CisJCWxpc3RfZnJlZShsZWZ0X2Fy Z3MpOworCQlsaXN0X2ZyZWUocmlnaHRfYXJncyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlp ZiAoIWxlZnRfaXNfY29hbGVzY2UpCisJeworCQlsZWZ0X2FyZ3MgPSBsaXN0X21ha2UxKGxlZnQp OworCQlsZWZ0X3Rlcm1fY29uc3QgPSBJc0EobGVmdCwgQ29uc3QpOworCX0KKwlpZiAoIXJpZ2h0 X2lzX2NvYWxlc2NlKQorCXsKKwkJcmlnaHRfYXJncyA9IGxpc3RfbWFrZTEocmlnaHQpOworCQly aWdodF90ZXJtX2NvbnN0ID0gSXNBKHJpZ2h0LCBDb25zdCk7CisJfQorCisJaWYgKGlzX2Vxam9p biAmJiBsZWZ0X3Rlcm1fY29uc3QgJiYgcmlnaHRfdGVybV9jb25zdCkKKwl7CisJCWxpc3RfZnJl ZShsZWZ0X2FyZ3MpOworCQlsaXN0X2ZyZWUocmlnaHRfYXJncyk7CisJCXJldHVybiBmYWxzZTsK Kwl9CisKKwlsZWZ0X3ByZWZpeCA9IChkb3VibGUgKikgcGFsbG9jKHNpemVvZihkb3VibGUpICog bGlzdF9sZW5ndGgobGVmdF9hcmdzKSk7CisJcmlnaHRfcHJlZml4ID0gKGRvdWJsZSAqKSBwYWxs b2Moc2l6ZW9mKGRvdWJsZSkgKiBsaXN0X2xlbmd0aChyaWdodF9hcmdzKSk7CisKKwlpZiAoIWdl dF9jb2FsZXNjZV9wcmVmaXhfcHJvYnMocm9vdCwgbGVmdF9hcmdzLCBsZWZ0X3ByZWZpeCkgfHwK KwkJIWdldF9jb2FsZXNjZV9wcmVmaXhfcHJvYnMocm9vdCwgcmlnaHRfYXJncywgcmlnaHRfcHJl Zml4KSkKKwl7CisJCXBmcmVlKGxlZnRfcHJlZml4KTsKKwkJcGZyZWUocmlnaHRfcHJlZml4KTsK KwkJbGlzdF9mcmVlKGxlZnRfYXJncyk7CisJCWxpc3RfZnJlZShyaWdodF9hcmdzKTsKKwkJcmV0 dXJuIGZhbHNlOworCX0KKworCWxpID0gMDsKKwlmb3JlYWNoKGxsYywgbGVmdF9hcmdzKQorCXsK KwkJTm9kZQkgICAqbGFyZyA9IChOb2RlICopIGxmaXJzdChsbGMpOworCQlib29sCQlsY29uc3Qg PSBJc0EobGFyZywgQ29uc3QpOworCQlMaXN0Q2VsbCAgICpybGM7CisJCWludAkJCXJpID0gMDsK KworCQlpZiAobGVmdF9wcmVmaXhbbGldIDwgMS4wZS0xMikKKwkJCWJyZWFrOworCisJCWZvcmVh Y2gocmxjLCByaWdodF9hcmdzKQorCQl7CisJCQlOb2RlCSAgICpyYXJnID0gKE5vZGUgKikgbGZp cnN0KHJsYyk7CisJCQlib29sCQlyY29uc3QgPSBJc0EocmFyZywgQ29uc3QpOworCQkJTGlzdAkg ICAqc3ViX2FyZ3M7CisJCQlTZWxlY3Rpdml0eSBjb250cmliOworCisJCQlpZiAocmlnaHRfcHJl Zml4W3JpXSA8IDEuMGUtMTIpCisJCQkJYnJlYWs7CisKKwkJCXN1Yl9hcmdzID0gbGlzdF9tYWtl Mihjb3B5T2JqZWN0KGxhcmcpLCBjb3B5T2JqZWN0KHJhcmcpKTsKKworCQkJaWYgKCFpc19lcWpv aW4gfHwgbGNvbnN0IHx8IHJjb25zdCkKKwkJCXsKKwkJCQljb250cmliID0gRGF0dW1HZXRGbG9h dDgoRGlyZWN0RnVuY3Rpb25DYWxsNENvbGwoZXFzZWwsCisJCQkJCQkJCQkJCQkJCQkJIGNvbGxh dGlvbiwKKwkJCQkJCQkJCQkJCQkJCQkgUG9pbnRlckdldERhdHVtKHJvb3QpLAorCQkJCQkJCQkJ CQkJCQkJCSBPYmplY3RJZEdldERhdHVtKG9wZXJhdG9yKSwKKwkJCQkJCQkJCQkJCQkJCQkgUG9p bnRlckdldERhdHVtKHN1Yl9hcmdzKSwKKwkJCQkJCQkJCQkJCQkJCQkgSW50MzJHZXREYXR1bShl cXNlbF92YXJSZWxpZCkpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQljb250cmliID0gRGF0 dW1HZXRGbG9hdDgoRGlyZWN0RnVuY3Rpb25DYWxsNUNvbGwoZXFqb2luc2VsLAorCQkJCQkJCQkJ CQkJCQkJCSBjb2xsYXRpb24sCisJCQkJCQkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bShyb290 KSwKKwkJCQkJCQkJCQkJCQkJCQkgT2JqZWN0SWRHZXREYXR1bShvcGVyYXRvciksCisJCQkJCQkJ CQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1bShzdWJfYXJncyksCisJCQkJCQkJCQkJCQkJCQkJIElu dDE2R2V0RGF0dW0oSk9JTl9JTk5FUiksCisJCQkJCQkJCQkJCQkJCQkJIFBvaW50ZXJHZXREYXR1 bShzamluZm8pKSk7CisJCQl9CisKKwkJCUNMQU1QX1BST0JBQklMSVRZKGNvbnRyaWIpOworCQkJ YWNjX3NlbGVjICs9IGxlZnRfcHJlZml4W2xpXSAqIHJpZ2h0X3ByZWZpeFtyaV0gKiBjb250cmli OworCisJCQlsaXN0X2ZyZWUoc3ViX2FyZ3MpOworCQkJcmkrKzsKKwkJfQorCisJCWxpKys7CisJ fQorCisJcGZyZWUobGVmdF9wcmVmaXgpOworCXBmcmVlKHJpZ2h0X3ByZWZpeCk7CisJbGlzdF9m cmVlKGxlZnRfYXJncyk7CisJbGlzdF9mcmVlKHJpZ2h0X2FyZ3MpOworCisJQ0xBTVBfUFJPQkFC SUxJVFkoYWNjX3NlbGVjKTsKKwkqc2VsZWNfb3V0ID0gYWNjX3NlbGVjOworCXJldHVybiB0cnVl OworfQorCiAvKgogICogQ29tbW9uIGNvZGUgZm9yIGVxc2VsKCkgYW5kIG5lcXNlbCgpCiAgKi8K QEAgLTMxOCw2ICs1OTAsOSBAQCBlcXNlbF9pbnRlcm5hbChQR19GVU5DVElPTl9BUkdTLCBib29s IG5lZ2F0ZSkKIAlib29sCQl2YXJvbmxlZnQ7CiAJZG91YmxlCQlzZWxlYzsKIAorCWlmICh0cnlf Y29hbGVzY2VfZXEoZmNpbmZvLCAmc2VsZWMpKQorCQlyZXR1cm4gc2VsZWM7CisKIAkvKgogCSAq IFdoZW4gYXNrZWQgYWJvdXQgPD4sIHdlIGRvIHRoZSBlc3RpbWF0aW9uIHVzaW5nIHRoZSBjb3Jy ZXNwb25kaW5nID0KIAkgKiBvcGVyYXRvciwgdGhlbiBjb252ZXJ0IHRvIDw+IHZpYSAiMS4wIC0g ZXFfc2VsZWN0aXZpdHkgLSBudWxsZnJhYyIuCkBAIC0yNDE4LDYgKzI2OTMsOSBAQCBlcWpvaW5z ZWwoUEdfRlVOQ1RJT05fQVJHUykKIAlib29sCQlqb2luX2lzX3JldmVyc2VkOwogCVJlbE9wdElu Zm8gKmlubmVyX3JlbDsKIAorCWlmICh0cnlfY29hbGVzY2VfZXEoZmNpbmZvLCAmc2VsZWMpKQor CQlQR19SRVRVUk5fRkxPQVQ4KChmbG9hdDgpIHNlbGVjKTsKKwogCWdldF9qb2luX3ZhcmlhYmxl cyhyb290LCBhcmdzLCBzamluZm8sCiAJCQkJCSAgICZ2YXJkYXRhMSwgJnZhcmRhdGEyLCAmam9p bl9pc19yZXZlcnNlZCk7CiAKQEAgLTQzNzQsNiArNDY1MiwxNTQgQEAgZXN0aW1hdGVfbXVsdGl2 YXJpYXRlX2J1Y2tldHNpemUoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmlubmVyLAog CXJldHVybiBvdGhlcmNsYXVzZXM7CiB9CiAKKy8qCisgKiBNb3N0LWNvbW1vbi12YWx1ZSBmcmVx dWVuY3kgZm9yIHZhcmRhdGEuICBGYWxscyBiYWNrIHRvIDEvbnR1cGxlcyB3aGVuCisgKiBvbmx5 IGEgaGlzdG9ncmFtIHNsb3QgaXMgcHJlc2VudC4gIFJldHVybnMgMC4wIGlmIG5vIHN0YXRpc3Rp Y3MgYXJlCisgKiBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfdmFyaWFibGVfbWN2 X2ZyZXEoVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwgU2VsZWN0aXZpdHkgKm1jdl9mcmVxKQor eworCUF0dFN0YXRzU2xvdCBzc2xvdDsKKworCSptY3ZfZnJlcSA9IDAuMDsKKworCWlmICghSGVh cFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxlKSkKKwkJcmV0dXJuOworCisJaWYgKGdl dF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJkYXRhLT5zdGF0c1R1cGxlLAorCQkJCQkJIFNUQVRJ U1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKKwkJCQkJCSBBVFRTVEFUU1NMT1RfTlVNQkVSUykp CisJeworCQlpZiAoc3Nsb3Qubm51bWJlcnMgPiAwKQorCQkJKm1jdl9mcmVxID0gc3Nsb3QubnVt YmVyc1swXTsKKwkJZnJlZV9hdHRzdGF0c3Nsb3QoJnNzbG90KTsKKwl9CisJZWxzZSBpZiAoZ2V0 X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEtPnN0YXRzVHVwbGUsCisJCQkJCQkJICBTVEFU SVNUSUNfS0lORF9ISVNUT0dSQU0sIEludmFsaWRPaWQsCisJCQkJCQkJICAwKSkKKwl7CisJCS8q IG5vIE1DVnMgYnV0IGhpc3RvZ3JhbSBwcmVzZW50OiBjb2x1bW4gaXMgbGlrZWx5IHVuaXF1ZSAq LworCQlpZiAodmFyZGF0YS0+cmVsICYmIHZhcmRhdGEtPnJlbC0+dHVwbGVzID4gMCkKKwkJCSpt Y3ZfZnJlcSA9IDEuMCAvIHZhcmRhdGEtPnJlbC0+dHVwbGVzOworCX0KK30KKworLyoKKyAqIEVz dGltYXRlIGJ1Y2tldCBzdGF0cyBmb3IgYSBDb2FsZXNjZUV4cHIgaGFzaGtleSB3aGVuIGV4YW1p bmVfdmFyaWFibGUoKQorICogcmV0dXJuZWQgYSBkZWZhdWx0IG5kaXN0aW5jdC4gIFVzZXMgcGVy LWJyYW5jaCBuZGlzdGluY3QgYW5kIG1jdl9mcmVxLAorICogd2VpZ2h0ZWQgYnkgbnVsbCBmYWxs LXRocm91Z2ggcHJvYmFiaWxpdHkuCisgKi8KK3N0YXRpYyBib29sCitoYXNoX2J1Y2tldF9zdGF0 c19jb2FsZXNjZV9kaXNwYXRjaChQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCU5vZGUgKmhh c2hrZXksCisJCQkJCQkJCQlkb3VibGUgbmJ1Y2tldHMsCisJCQkJCQkJCQlTZWxlY3Rpdml0eSAq bWN2X2ZyZXEsCisJCQkJCQkJCQlTZWxlY3Rpdml0eSAqYnVja2V0c2l6ZV9mcmFjKQoreworCUxp c3QJICAgKnN0cmlwcGVkX2FyZ3M7CisJYm9vbAkJdGVybWluYXRlc193aXRoX2NvbnN0OworCWRv dWJsZQkgICAqcHJlZml4OworCWludAkJCW5hcmdzOworCWludAkJCWk7CisJTGlzdENlbGwgICAq bGM7CisJZG91YmxlCQluZF9taXggPSAwLjA7CisJU2VsZWN0aXZpdHkgbWN2X21peCA9IDAuMDsK Kwlkb3VibGUJCXJlbF9yb3dzX3Byb3h5ID0gMC4wOworCWRvdWJsZQkJcmVsX3R1cGxlc19wcm94 eSA9IDAuMDsKKwlkb3VibGUJCWVzdGZyYWN0OworCisJaWYgKCFtYXRjaF9jb2FsZXNjZV9qb2lu X3NpZGUoaGFzaGtleSwgJnN0cmlwcGVkX2FyZ3MsICZ0ZXJtaW5hdGVzX3dpdGhfY29uc3QpKQor CQlyZXR1cm4gZmFsc2U7CisKKwluYXJncyA9IGxpc3RfbGVuZ3RoKHN0cmlwcGVkX2FyZ3MpOwor CXByZWZpeCA9IChkb3VibGUgKikgcGFsbG9jKHNpemVvZihkb3VibGUpICogbmFyZ3MpOworCisJ aWYgKCFnZXRfY29hbGVzY2VfcHJlZml4X3Byb2JzKHJvb3QsIHN0cmlwcGVkX2FyZ3MsIHByZWZp eCkpCisJeworCQlwZnJlZShwcmVmaXgpOworCQlsaXN0X2ZyZWUoc3RyaXBwZWRfYXJncyk7CisJ CXJldHVybiBmYWxzZTsKKwl9CisKKwlpID0gMDsKKwlmb3JlYWNoKGxjLCBzdHJpcHBlZF9hcmdz KQorCXsKKwkJTm9kZQkgICAqYXJnID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKworCQlpZiAoSXNB KGFyZywgQ29uc3QpKQorCQl7CisJCQltY3ZfbWl4ID0gTWF4KG1jdl9taXgsIHByZWZpeFtpXSk7 CisJCQlpZiAocHJlZml4W2ldID4gMC4wKQorCQkJCW5kX21peCArPSAxLjA7CisJCX0KKwkJZWxz ZQorCQl7CisJCQlWYXJpYWJsZVN0YXREYXRhIHZkOworCQkJZG91YmxlCQluZF9pOworCQkJYm9v bAkJaXNkZWZhdWx0OworCQkJU2VsZWN0aXZpdHkgbWN2X2k7CisKKwkJCWV4YW1pbmVfdmFyaWFi bGUocm9vdCwgYXJnLCAwLCAmdmQpOworCQkJbmRfaSA9IGdldF92YXJpYWJsZV9udW1kaXN0aW5j dCgmdmQsICZpc2RlZmF1bHQpOworCisJCQlpZiAoaXNkZWZhdWx0KQorCQkJeworCQkJCVJlbGVh c2VWYXJpYWJsZVN0YXRzKHZkKTsKKwkJCQlwZnJlZShwcmVmaXgpOworCQkJCWxpc3RfZnJlZShz dHJpcHBlZF9hcmdzKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWdldF92YXJpYWJs ZV9tY3ZfZnJlcSgmdmQsICZtY3ZfaSk7CisKKwkJCW5kX21peCA9IE1heChuZF9taXgsIG5kX2kp OworCQkJbWN2X21peCA9IE1heChtY3ZfbWl4LCBwcmVmaXhbaV0gKiBtY3ZfaSk7CisKKwkJCWlm IChpID09IDAgJiYgdmQucmVsICYmIHZkLnJlbC0+dHVwbGVzID4gMCkKKwkJCXsKKwkJCQlyZWxf cm93c19wcm94eSA9IHZkLnJlbC0+cm93czsKKwkJCQlyZWxfdHVwbGVzX3Byb3h5ID0gdmQucmVs LT50dXBsZXM7CisJCQl9CisKKwkJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZkKTsKKwkJfQorCisJ CWkrKzsKKwl9CisKKwlwZnJlZShwcmVmaXgpOworCWxpc3RfZnJlZShzdHJpcHBlZF9hcmdzKTsK KworCWlmIChyZWxfdHVwbGVzX3Byb3h5ID4gMC4wKQorCXsKKwkJbmRfbWl4ICo9IHJlbF9yb3dz X3Byb3h5IC8gcmVsX3R1cGxlc19wcm94eTsKKwkJbmRfbWl4ID0gY2xhbXBfcm93X2VzdChuZF9t aXgpOworCX0KKworCWlmIChuZF9taXggPD0gMC4wKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAo bmRfbWl4ID4gbmJ1Y2tldHMpCisJCWVzdGZyYWN0ID0gMS4wIC8gbmJ1Y2tldHM7CisJZWxzZQor CQllc3RmcmFjdCA9IDEuMCAvIG5kX21peDsKKworCUNMQU1QX1BST0JBQklMSVRZKG1jdl9taXgp OworCSptY3ZfZnJlcSA9IE1heCgqbWN2X2ZyZXEsIG1jdl9taXgpOworCUNMQU1QX1BST0JBQklM SVRZKCptY3ZfZnJlcSk7CisJZXN0ZnJhY3QgPSBNYXgoZXN0ZnJhY3QsICptY3ZfZnJlcSk7CisK KwlpZiAoZXN0ZnJhY3QgPCAxLjBlLTYpCisJCWVzdGZyYWN0ID0gMS4wZS02OworCWVsc2UgaWYg KGVzdGZyYWN0ID4gMS4wKQorCQllc3RmcmFjdCA9IDEuMDsKKworCSpidWNrZXRzaXplX2ZyYWMg PSAoU2VsZWN0aXZpdHkpIGVzdGZyYWN0OworCisJcmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBF c3RpbWF0ZSBoYXNoIGJ1Y2tldCBzdGF0aXN0aWNzIHdoZW4gdGhlIHNwZWNpZmllZCBleHByZXNz aW9uIGlzIHVzZWQKICAqIGFzIGEgaGFzaCBrZXkgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYnVj a2V0cy4KQEAgLTQ0MjcsNDMgKzQ4NTMsMjEgQEAgZXN0aW1hdGVfaGFzaF9idWNrZXRfc3RhdHMo UGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmhhc2hrZXksIGRvdWJsZSBuYnVja2V0cywKIAlkb3Vi bGUJCWVzdGZyYWN0LAogCQkJCW5kaXN0aW5jdDsKIAlib29sCQlpc2RlZmF1bHQ7Ci0JQXR0U3Rh dHNTbG90IHNzbG90OwogCiAJZXhhbWluZV92YXJpYWJsZShyb290LCBoYXNoa2V5LCAwLCAmdmFy ZGF0YSk7CiAKLQkvKiBJbml0aWFsaXplICptY3ZfZnJlcSB0byAidW5rbm93biIgKi8KLQkqbWN2 X2ZyZXEgPSAwLjA7Ci0KLQkvKiBMb29rIHVwIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1vc3QgY29t bW9uIHZhbHVlLCBpZiBhdmFpbGFibGUgKi8KLQlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRh LnN0YXRzVHVwbGUpKQotCXsKLQkJaWYgKGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJkYXRh LnN0YXRzVHVwbGUsCi0JCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKLQkJ CQkJCQkgQVRUU1RBVFNTTE9UX05VTUJFUlMpKQotCQl7Ci0JCQkvKgotCQkJICogVGhlIGZpcnN0 IE1DViBzdGF0IGlzIGZvciB0aGUgbW9zdCBjb21tb24gdmFsdWUuCi0JCQkgKi8KLQkJCWlmIChz c2xvdC5ubnVtYmVycyA+IDApCi0JCQkJKm1jdl9mcmVxID0gc3Nsb3QubnVtYmVyc1swXTsKLQkJ CWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0X2F0dHN0YXRz c2xvdCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNUdXBsZSwKLQkJCQkJCQkJICBTVEFUSVNUSUNfS0lO RF9ISVNUT0dSQU0sIEludmFsaWRPaWQsCi0JCQkJCQkJCSAgMCkpCi0JCXsKLQkJCS8qCi0JCQkg KiBJZiB0aGVyZSBhcmUgbm8gcmVjb3JkZWQgTUNWcywgYnV0IHdlIGRvIGhhdmUgYSBoaXN0b2dy YW0sIHRoZW4KLQkJCSAqIGFzc3VtZSB0aGF0IEFOQUxZWkUgZGV0ZXJtaW5lZCB0aGF0IHRoZSBj b2x1bW4gaXMgdW5pcXVlLgotCQkJICovCi0JCQlpZiAodmFyZGF0YS5yZWwgJiYgdmFyZGF0YS5y ZWwtPnR1cGxlcyA+IDApCi0JCQkJKm1jdl9mcmVxID0gMS4wIC8gdmFyZGF0YS5yZWwtPnR1cGxl czsKLQkJfQotCX0KKwlnZXRfdmFyaWFibGVfbWN2X2ZyZXEoJnZhcmRhdGEsIG1jdl9mcmVxKTsK IAogCS8qIEdldCBudW1iZXIgb2YgZGlzdGluY3QgdmFsdWVzICovCiAJbmRpc3RpbmN0ID0gZ2V0 X3ZhcmlhYmxlX251bWRpc3RpbmN0KCZ2YXJkYXRhLCAmaXNkZWZhdWx0KTsKIAorCWlmIChpc2Rl ZmF1bHQgJiYgaGFzaF9idWNrZXRfc3RhdHNfY29hbGVzY2VfZGlzcGF0Y2gocm9vdCwgaGFzaGtl eSwgbmJ1Y2tldHMsCisJCQkJCQkJCQkJCQkJCSBtY3ZfZnJlcSwgYnVja2V0c2l6ZV9mcmFjKSkK Kwl7CisJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCQlyZXR1cm47CisJfQorCiAJ LyoKIAkgKiBJZiBuZGlzdGluY3QgaXNuJ3QgcmVhbCwgcHVudC4gIFdlIG5vcm1hbGx5IHJldHVy biAwLjEsIGJ1dCBpZiB0aGUKIAkgKiBtY3ZfZnJlcSBpcyBrbm93biB0byBiZSBldmVuIGhpZ2hl ciB0aGFuIHRoYXQsIHVzZSBpdCBpbnN0ZWFkLgoKYmFzZS1jb21taXQ6IGNkM2FkM2JjMDM1Njdl ZTEyMGE2MzhjODQwMTEyYjg4NjVlMDU1YTgKLS0gCjIuNDMuMAoK --000000000000135055065578d57f--