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 1wERsF-0041G7-0o for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Apr 2026 13:07:43 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wERrD-00FAYo-1f for pgsql-hackers@arkaria.postgresql.org; Sun, 19 Apr 2026 13:06:39 +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 1wERrC-00FAYM-2w for pgsql-hackers@lists.postgresql.org; Sun, 19 Apr 2026 13:06:39 +0000 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wERrA-00000001m5m-2rSz for pgsql-hackers@postgresql.org; Sun, 19 Apr 2026 13:06:38 +0000 Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-48896199cbaso23092265e9.1 for ; Sun, 19 Apr 2026 06:06:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776603994; cv=none; d=google.com; s=arc-20240605; b=YdCyozs1+pYOmhbRnOpVI6CpoDfqe8ctP5i0APC/bmDZkq5sZjzXq396Hj2Gl1B3yX Mdj4CGlyPk996pRLVmr/WFwZJO+vtP8wn8Cr7VOIstinT+uZTxRg6koN4tugIJsjRgGu JGt82NBu7dRBWHtfxCTslPpItR1wnDpuMLqK2QmGM9OFnNRm0PwvJ2pabU8kM8235Xzw 1gu0o3+qMqRnVfz/qWWQVaxbjQFO2We7pcFC6iUrOSTD4FTIS0Qd67qPPtV23Z3wF1j9 V3sT/X8Qqk2drtP5CE4Fg1McdESo8MObjCgIfBPcA/slQKDxMwkGjrV87BFRvQfu45Fd ukTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=FBv3gus4qBhQGREnMs7814ukuj0NdA5uKPDzOueAUR0=; fh=w3pee8IDyHfSqhNS9OCHuPVZbcEtPNOuZa9frb3/zc0=; b=LHW2+HfgpuQ0y4KxbH8O9CublQrkuutOlu0bQXw7LKSiu3TomyiRXiadnxb4D1Q3YH WUUTX3dMvMQBBcXqy64DulOQdZ9n64KygC178vZvJEgflP9ZihhUIMHFo7yzz0c2zk72 q7GV6QBpecihoW2qVZFv+JRopeSejeDjlycI5G3AtxETpfn98GaEClqPUdorxlp9bVAX ZZMoispUgTjAOnZo6GuEcNiHkb55boqs2ceJBSZihfuvAGyYwmQHCegqodiE/HOcTcgH /rGmoX+vuvZgGqVHbNRsy0iRdnKSOBWZsnUF5s9zLAb54ELb5/+w/4vQYtj2eOyL3x6Y KQ2Q==; darn=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=1776603994; x=1777208794; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=FBv3gus4qBhQGREnMs7814ukuj0NdA5uKPDzOueAUR0=; b=NxXb985BlaUaokWYA+zj1+ay8RHCrg9SkI1t4wCjxa0z46GI5xNui8veAKSrBIzKPD 36xHPfDqcXAzTcaT3SkiCE/LZATw7juQLtr9rM7e/W5lHfUD7soTOc6QCXBw8Hhhm2vS +fUSB2NQgiWOYugi02IterxaKqsQxv+93tOgBDbgm5tnzY5gRjLZjn3hmXRS5TyeiMe2 KgmGYFh8hZIQCQ2TZwf9d6j7CXVxt8DbscK9odmKvPBQnvPsRNmCXq9RJf1ycer4+ESE H9LrOfMP3z/BamfY7AP/uJmaijRwbPlAAgpRrkNDZD2BkPTmcHJjR+5Fcu4CmGAMHDzZ 8PNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776603994; x=1777208794; h=cc: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=FBv3gus4qBhQGREnMs7814ukuj0NdA5uKPDzOueAUR0=; b=C9iblSUv8RVDP4L6iD17AGb7J6k+FPtDUpI/jP1MwtXQjmTZkIsI9+9agMkFQ/5JAi iUMF8pxhDDQT2F5IZ5G9M2n66lfwBJEk0vWgX6T1RobGVzan8Hcwhkl2WH8MoKuzEe0w 7SzQWqvMMnxmyLY08R2kSI8Fsf3TbW3SumSdK6DCbdMr2reBD5eza7NgzOIzXraOBGhB dT0ZJGOE1JQBSJiIYdDdHc9Lfn2KXa0L9aK5Eg2moi2u3IylkkloBc9UTg/PhmaRDWlw N1SNWuuHTqNSj32r2Qd4ZqUkms3CWCil6K3bwTk1l3lvMlmnV57wKhmDlOBcCFiJCBEF hDBQ== X-Gm-Message-State: AOJu0YzqkUrf99rBb1NIHMExdU5y+rkgX3eNmz9zdzV99pyy429yIf6X 4cQ4lapyRR8jxyPTlf33Zikmq3+g1mwtLUVHPQrct29cJ7FhXYKEEJaGsqTNq0bOT9C2a+j4juD JHa1L2B2DrwTLjlAHpUnXC0zZsHxRnphIBq/b X-Gm-Gg: AeBDiesPFAmgaEwyHU2G4JPMFD3a8hQv9RTcaqFp9CwlKPYg4kUscnuHy1yVT2KanDb qMUZRqAT3dF1HvtFqdOmN8uG+m53KMCfy2c9Pl31oaEW1cY461SYEoieWbl9StDAIjlyKG0qbTp EOXD9KtEL9iNYBMDC1uReHQbpT7m6Uyg0Q3I6WvU5G7yejRiKj//7vHEC8PvEAVQ6Ix/w4u9qd+ 16fqIlxzg6DDOmZkeYecwJPVUwJO0/3VyjYnMbaFf5qbXCZV7r5ExB0L3Y0JKfWJ+eYodL/py08 zryXhsYq5fJCNKIYkfjaCRMv5b1styyvfqUEd8FHu34LmmQ/tFrF2LrbH+jSLZvR8vdV2S1C/6k EOWhkTXM= X-Received: by 2002:a05:600c:8901:b0:47e:e48b:506d with SMTP id 5b1f17b1804b1-488fb77813cmr105351545e9.16.1776603993688; Sun, 19 Apr 2026 06:06:33 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: David Rowley Date: Mon, 20 Apr 2026 01:06:20 +1200 X-Gm-Features: AQROBzDpGCl5VqWUlEBgEkT1U4LEgIP9xWHpkjzVudg7lxrm3yxTSYXu5Mhk5h0 Message-ID: Subject: Re: [PATCH] Fix hashed ScalarArrayOp semantics for NULL LHS with non-strict comparators To: Chengpeng Yan Cc: PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000f41edf064fcfd91b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f41edf064fcfd91b Content-Type: text/plain; charset="UTF-8" On Fri, 17 Apr 2026 at 01:01, Chengpeng Yan wrote: > The first attached patch fixes this by bypassing hash probing when the > LHS is NULL and the comparator is non-strict, falling back to a linear > evaluation consistent with ExecEvalScalarArrayOp(). For NOT IN, only > non-NULL results are inverted. Thanks for the bug report. I don't think we need to fallback on a linear search. If the non-strict function returns false for NULL = NULL, then as far as I can see, we can still get the correct result by checking if the hash table contains any other members. What I'm not certain of is if a non-strict function must return NULL for NULL = non-NULL. If yes, then we could just do it as the attached patch. I made this check the hash table to see if it has non-NULL Datums hashed. This means something like "WHERE NULL IN (NULL, 1)" for a non-strict function returning false for NULL = NULL and NULL for NULL = 1 would evaluate the same as "WHERE false OR NULL", which is NULL. Whereas, "WHERE NULL IN(NULL)" would be "false". If we need to assume the non-strict function could return false on NULL = non-NULL, then we could test for that when inserting the first datum into the hash table and store the behaviour in the expression. It may also be worth doing that check for NULL = NULL so that we don't need to call the equals function every time we see a NULL. I'll need to dig a bit deeper to see if we've written down any rules about non-strict equality functions anywhere... David --000000000000f41edf064fcfd91b Content-Type: application/octet-stream; name="v2-0001-Fix-incorrect-logic-for-hashed-IN-NOT-IN-with-non.patch" Content-Disposition: attachment; filename="v2-0001-Fix-incorrect-logic-for-hashed-IN-NOT-IN-with-non.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo5s1x4i0 RnJvbSBkZjgzNGQzZGNhMzRhMGNlMzE0NmQ4NzEwODMwMWI3NGM5ZTMwNmM5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBSb3dsZXkgPGRncm93bGV5QGdtYWlsLmNvbT4KRGF0 ZTogU3VuLCAxOSBBcHIgMjAyNiAxNToyNDozOSArMTIwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIEZp eCBpbmNvcnJlY3QgbG9naWMgZm9yIGhhc2hlZCBJTiAvIE5PVCBJTiB3aXRoIG5vbi1zdHJpY3QK IG9wZXJhdG9ycwoKVGhpcyBmaXhlcyB0aGUgaW5jb3JyZWN0IGxvZ2ljIGZvciBoYXNoZWQgSU4g YW5kIE5PVCBJTiBjbGF1c2VzIHdoaWNoCnRyaWdnZXJzIHdoZW4gdGhlcmUgYXJlIDkgb3IgbW9y ZSBjb25zdGFudCBlbGVtZW50cyBpbiB0aGUgY2xhdXNlIGFuZAp0aGUgZGF0YXR5cGUgc3VwcG9y dHMgaGFzaGluZy4KCldoZW4gdGhlIHZhbHVlIGJlaW5nIGxvb2tlZCB1cCB3YXMgTlVMTCwgaW4g c29tZSBjYXNlcyBpdCB3YXMgcG9zc2libGUKdGhhdCB0aGUgaGFzaGVkIHZlcnNpb24gZXZhbHVh dGVkIHRvIGZhbHNlIHJhdGhlciB0aGFuIE5VTEwsIGFuZCBpbiBtdWNoCm1vcmUgcmFyZSBjYXNl cywgdHJ1ZSBpbnN0ZWFkIG9mIE5VTEwuICBUaGUgZm9ybWVyIHRlY2huaWNhbGx5IHdvdWxkbid0 CmNhdXNlIGFuIGlzc3VlIGZvciBhbiBJTiBvciBOT1QgSU4gaW4gYSBXSEVSRSBjbGF1c2UgYXMg ZmFsc2UgYW5kIE5VTEwKbWVhbiB0aGUgc2FtZSB0aGluZyB0aGVyZSwgaG93ZXZlciwgdGhlIGxh dHRlciBjb3VsZCBjYXVzZSByb3dzIHRvIG1hdGNoCnRoZSBXSEVSRSBjbGF1c2UgdGhhdCBzaG91 bGRuJ3QuCgpTaW5jZSBhbGwgYnVpbHQtaW4gb3BlcmF0b3JzIGFyZSBzdHJpY3QsIHRoaXMgY291 bGQgb25seSBhZmZlY3QgY3VzdG9tCnR5cGVzLgoKUmVwb3J0ZWQtYnk6IENoZW5ncGVuZyBZYW4g PGNoZW5ncGVuZ195YW5Ab3V0bG9vay5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVz L20vQTE2MTg3QUUtMjM1OS00MjY1LTlGNUUtNzFEMDE1RUMyQjJEQG91dGxvb2suY29tCi0tLQog c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0V4cHJJbnRlcnAuYyAgICAgfCAxMDkgKysrKysrKysr Ky0tLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwcmVzc2lvbnMub3V0IHwgMTQx ICsrKysrKysrKysrKysrKystLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2V4cHJlc3Npb25z LnNxbCAgICAgIHwgIDc1ICsrKysrKysrKystLQogMyBmaWxlcyBjaGFuZ2VkLCAyMzYgaW5zZXJ0 aW9ucygrKSwgODkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0 b3IvZXhlY0V4cHJJbnRlcnAuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNFeHBySW50ZXJw LmMKaW5kZXggM2M0ODQzY2RlODYuLmZmNTYxZGY0ZTFmIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9leGVjdXRvci9leGVjRXhwckludGVycC5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4 ZWNFeHBySW50ZXJwLmMKQEAgLTQyNDYsOSArNDI0NiwxMCBAQCBFeGVjRXZhbEhhc2hlZFNjYWxh ckFycmF5T3AoRXhwclN0YXRlICpzdGF0ZSwgRXhwckV2YWxTdGVwICpvcCwgRXhwckNvbnRleHQg KmVjbwogCSAqIElmIHRoZSBzY2FsYXIgaXMgTlVMTCwgYW5kIHRoZSBmdW5jdGlvbiBpcyBzdHJp Y3QsIHJldHVybiBOVUxMOyBubwogCSAqIHBvaW50IGluIGV4ZWN1dGluZyB0aGUgc2VhcmNoLgog CSAqLwotCWlmIChmY2luZm8tPmFyZ3NbMF0uaXNudWxsICYmIHN0cmljdGZ1bmMpCisJaWYgKHNj YWxhcl9pc251bGwgJiYgc3RyaWN0ZnVuYykKIAl7CiAJCSpvcC0+cmVzbnVsbCA9IHRydWU7CisJ CSpvcC0+cmVzdmFsdWUgPSAoRGF0dW0pIDA7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQzNDgsNTkg KzQzNDksNzkgQEAgRXhlY0V2YWxIYXNoZWRTY2FsYXJBcnJheU9wKEV4cHJTdGF0ZSAqc3RhdGUs IEV4cHJFdmFsU3RlcCAqb3AsIEV4cHJDb250ZXh0ICplY28KIAkJb3AtPmQuaGFzaGVkc2NhbGFy YXJyYXlvcC5oYXNfbnVsbHMgPSBoYXNfbnVsbHM7CiAJfQogCi0JLyogQ2hlY2sgdGhlIGhhc2gg dG8gc2VlIGlmIHdlIGhhdmUgYSBtYXRjaC4gKi8KLQloYXNoZm91bmQgPSBOVUxMICE9IHNhb3Bo YXNoX2xvb2t1cChlbGVtZW50c190YWItPmhhc2h0YWIsIHNjYWxhcik7Ci0KLQkvKiB0aGUgcmVz dWx0IGRlcGVuZHMgb24gaWYgdGhlIGNsYXVzZSBpcyBhbiBJTiBvciBOT1QgSU4gY2xhdXNlICov Ci0JaWYgKGluY2xhdXNlKQotCQlyZXN1bHQgPSBCb29sR2V0RGF0dW0oaGFzaGZvdW5kKTsJLyog SU4gKi8KLQllbHNlCi0JCXJlc3VsdCA9IEJvb2xHZXREYXR1bSghaGFzaGZvdW5kKTsJLyogTk9U IElOICovCi0KLQlyZXN1bHRudWxsID0gZmFsc2U7Ci0KLQkvKgotCSAqIElmIHdlIGRpZG4ndCBm aW5kIGEgbWF0Y2ggaW4gdGhlIGFycmF5LCB3ZSBzdGlsbCBtaWdodCBuZWVkIHRvIGhhbmRsZQot CSAqIHRoZSBwb3NzaWJpbGl0eSBvZiBudWxsIHZhbHVlcy4gIFdlIGRpZG4ndCBwdXQgYW55IE5V TExzIGludG8gdGhlCi0JICogaGFzaHRhYmxlLCBidXQgaW5zdGVhZCBtYXJrZWQgaWYgd2UgZm91 bmQgYW55IHdoZW4gYnVpbGRpbmcgdGhlIHRhYmxlCi0JICogaW4gaGFzX251bGxzLgotCSAqLwot CWlmICghaGFzaGZvdW5kICYmIG9wLT5kLmhhc2hlZHNjYWxhcmFycmF5b3AuaGFzX251bGxzKQor CWlmICghc2NhbGFyX2lzbnVsbCkKIAl7Ci0JCWlmIChzdHJpY3RmdW5jKQotCQl7CisJCS8qIHBl cmZvcm0gaGFzaCBsb29rdXAgb24gdGhlIG5vbi1OVUxMIHZhbHVlICovCisJCWhhc2hmb3VuZCA9 IE5VTEwgIT0gc2FvcGhhc2hfbG9va3VwKGVsZW1lbnRzX3RhYi0+aGFzaHRhYiwgc2NhbGFyKTsK IAotCQkJLyoKLQkJCSAqIFdlIGhhdmUgbnVsbHMgaW4gdGhlIGFycmF5IHNvIGEgbm9uLW51bGwg bGhzIGFuZCBubyBtYXRjaCBtdXN0Ci0JCQkgKiB5aWVsZCBOVUxMLgotCQkJICovCisJCS8qCisJ CSAqIElmIHdlIGRpZG4ndCBmaW5kIHRoZSB2YWx1ZSBhbmQgdGhlIGFycmF5IGNvbnRhaW5zIGEg TlVMTCwgdGhlCisJCSAqIHJlc3VsdCBpcyBOVUxMCisJCSAqLworCQlpZiAoIWhhc2hmb3VuZCAm JiBvcC0+ZC5oYXNoZWRzY2FsYXJhcnJheW9wLmhhc19udWxscykKKwkJewogCQkJcmVzdWx0ID0g KERhdHVtKSAwOwogCQkJcmVzdWx0bnVsbCA9IHRydWU7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQkv KgotCQkJICogRXhlY3V0ZSBmdW5jdGlvbiB3aWxsIG51bGwgcmhzIGp1c3Qgb25jZS4KLQkJCSAq Ci0JCQkgKiBUaGUgaGFzaCBsb29rdXAgcGF0aCB3aWxsIGhhdmUgc2NyaWJibGVkIG9uIHRoZSBs aHMgYXJndW1lbnQgc28KLQkJCSAqIHdlIG5lZWQgdG8gc2V0IGl0IHVwIGFsc28gKGV2ZW4gdGhv dWdoIHdlIGVudGVyZWQgdGhpcyBmdW5jdGlvbgotCQkJICogd2l0aCBpdCBhbHJlYWR5IHNldCku Ci0JCQkgKi8KLQkJCWZjaW5mby0+YXJnc1swXS52YWx1ZSA9IHNjYWxhcjsKLQkJCWZjaW5mby0+ YXJnc1swXS5pc251bGwgPSBzY2FsYXJfaXNudWxsOwotCQkJZmNpbmZvLT5hcmdzWzFdLnZhbHVl ID0gKERhdHVtKSAwOwotCQkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9IHRydWU7CisJCQkvKiB0 aGUgcmVzdWx0IGRlcGVuZHMgb24gaWYgdGhlIGNsYXVzZSBpcyBhbiBJTiBvciBOT1QgSU4gY2xh dXNlICovCisJCQlpZiAoaW5jbGF1c2UpCisJCQkJcmVzdWx0ID0gQm9vbEdldERhdHVtKGhhc2hm b3VuZCk7CS8qIElOICovCisJCQllbHNlCisJCQkJcmVzdWx0ID0gQm9vbEdldERhdHVtKCFoYXNo Zm91bmQpOwkvKiBOT1QgSU4gKi8KIAotCQkJcmVzdWx0ID0gb3AtPmQuaGFzaGVkc2NhbGFyYXJy YXlvcC5maW5mby0+Zm5fYWRkcihmY2luZm8pOwotCQkJcmVzdWx0bnVsbCA9IGZjaW5mby0+aXNu dWxsOworCQkJcmVzdWx0bnVsbCA9IGZhbHNlOworCQl9CisJfQorCWVsc2UgaWYgKG9wLT5kLmhh c2hlZHNjYWxhcmFycmF5b3AuaGFzX251bGxzKQorCXsKKwkJLyoKKwkJICogVGhlIHNob3J0LWNp cmN1aXQgZWFybGllciBtZWFucyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgd2l0aCBhCisJCSAq IE5VTEwgTEhTIGFuZCBhIHN0cmljdCBmdW5jdGlvbi4KKwkJICovCisJCUFzc2VydCghc3RyaWN0 ZnVuYyk7CiAKLQkJCS8qCi0JCQkgKiBSZXZlcnNlIHRoZSByZXN1bHQgZm9yIE5PVCBJTiBjbGF1 c2VzIHNpbmNlIHRoZSBhYm92ZSBmdW5jdGlvbgotCQkJICogaXMgdGhlIGVxdWFsaXR5IGZ1bmN0 aW9uIGFuZCB3ZSBuZWVkIG5vdC1lcXVhbHMuCi0JCQkgKi8KLQkJCWlmICghaW5jbGF1c2UpCi0J CQkJcmVzdWx0ID0gQm9vbEdldERhdHVtKCFEYXR1bUdldEJvb2wocmVzdWx0KSk7CisJCS8qCisJ CSAqIFdlIGhhdmUgbm9uLXN0cmljdCBvcGVyYXRvciwgYSBOVUxMIExIUyBhbmQgdGhlIGFycmF5 IGNvbnRhaW5zIGEKKwkJICogTlVMTC4gIENhbGwgdGhlIGZ1bmN0aW9uIHRvIHNlZSBpZiBpdCBj bGFzc2VzIE5VTExzIGFzIGVxdWFsLgorCQkgKi8KKwkJZmNpbmZvLT5hcmdzWzBdLnZhbHVlID0g KERhdHVtKSAwOworCQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gdHJ1ZTsKKwkJZmNpbmZvLT5h cmdzWzFdLnZhbHVlID0gKERhdHVtKSAwOworCQlmY2luZm8tPmFyZ3NbMV0uaXNudWxsID0gdHJ1 ZTsKKworCQlyZXN1bHQgPSBvcC0+ZC5oYXNoZWRzY2FsYXJhcnJheW9wLmZpbmZvLT5mbl9hZGRy KGZjaW5mbyk7CisJCXJlc3VsdG51bGwgPSBmY2luZm8tPmlzbnVsbDsKKworCQkvKgorCQkgKiBJ ZiB0aGUgbm9uLXN0cmljdCBmdW5jdGlvbiByZXR1cm5lZCBmYWxzZSBmb3IgTlVMTCA9IE5VTEwg dGhlbiB3ZQorCQkgKiBtdXN0IHN0aWxsIGNvbnNpZGVyIG90aGVyIGFycmF5IG1lbWJlcnMuICBJ ZiBhbnkgbm9uLU5VTEwgZWxlbWVudHMKKwkJICogZXhpc3RzIHRoZW4gTlVMTCA9IGFueS1ub24t TlVMTCBtdXN0IHlpZWxkIE5VTEwgZXZlbiB3aXRoIGEKKwkJICogbm9uLXN0cmljdCBmdW5jdGlv bi4gIEhlcmUgd2UncmUgZW11bGF0aW5nICJGQUxTRSBPUiBOVUxMIiBmb3IgSU4KKwkJICogYW5k ICJUUlVFIEFORCBOVUxMIiBmb3IgTk9UIElOLCBib3RoIG9mIHdoaWNoIHlpZWxkIE5VTEwuICBX ZSBkb24ndAorCQkgKiBuZWVkIHRvIGhhbmRsZSBOT1QgSU4gc3BlY2lmaWNhbGx5IGhlcmUgYXMg d2UgcmV2ZXJzZSB0aGUgcmVzdWx0IG9mCisJCSAqIHRoYXQgYmVsb3cuCisJCSAqLworCQlpZiAo IXJlc3VsdG51bGwgJiYgIURhdHVtR2V0Qm9vbChyZXN1bHQpICYmCisJCQlvcC0+ZC5oYXNoZWRz Y2FsYXJhcnJheW9wLmVsZW1lbnRzX3RhYi0+aGFzaHRhYi0+bWVtYmVycyA+IDApCisJCXsKKwkJ CXJlc3VsdCA9IChEYXR1bSkgMDsKKwkJCXJlc3VsdG51bGwgPSB0cnVlOwogCQl9CisKKwkJLyoK KwkJICogUmV2ZXJzZSB0aGUgcmVzdWx0IGZvciBOT1QgSU4gY2xhdXNlcyBzaW5jZSB0aGUgYWJv dmUgZnVuY3Rpb24gaXMKKwkJICogdGhlIGVxdWFsaXR5IGZ1bmN0aW9uIGFuZCB3ZSBuZWVkIG5v dC1lcXVhbHMuCisJCSAqLworCQllbHNlIGlmICghaW5jbGF1c2UpCisJCQlyZXN1bHQgPSBCb29s R2V0RGF0dW0oIURhdHVtR2V0Qm9vbChyZXN1bHQpKTsKKwl9CisJZWxzZQorCXsKKwkJLyogTlVM TCBMSFMgYW5kIGFycmF5IGhhcyBubyBOVUxMcy4gIE5VTEwgcmVzdWx0ICovCisJCXJlc3VsdCA9 IChEYXR1bSkgMDsKKwkJcmVzdWx0bnVsbCA9IHRydWU7CiAJfQogCiAJKm9wLT5yZXN2YWx1ZSA9 IHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXhwcmVzc2lv bnMub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9leHByZXNzaW9ucy5vdXQKaW5kZXgg OWEzYzk3YjE1YTMuLmNiZmEzZjVhMWNjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2V4cHJlc3Npb25zLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2V4 cHJlc3Npb25zLm91dApAQCAtMzg3LDQyICszODcsMTE1IEBAIGRlZmF1bHQgZm9yIHR5cGUgbXlp bnQgdXNpbmcgaGFzaCBhcwogICBvcGVyYXRvciAgICAxICAgPSAgKG15aW50LCBteWludCksCiAg IGZ1bmN0aW9uICAgIDEgICBteWludGhhc2gobXlpbnQpOwogY3JlYXRlIHRhYmxlIGludHRlc3Qg KGEgbXlpbnQpOwotaW5zZXJ0IGludG8gaW50dGVzdCB2YWx1ZXMoMTo6bXlpbnQpLChudWxsKTsK LS0tIHRyeSBhbiBhcnJheSB3aXRoIGVub3VnaCBlbGVtZW50cyB0byBjYXVzZSBoYXNoaW5nCi1z ZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hlcmUgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlp bnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQs IG51bGwpOwotIGEgCi0tLS0KLSAxCi0gCi0oMiByb3dzKQoraW5zZXJ0IGludG8gaW50dGVzdCB2 YWx1ZXMgKDE6Om15aW50KSwgKDI6Om15aW50KSwgKG51bGwpOworLS0gVGVzdCBFRU9QX0hBU0hF RF9TQ0FMQVJBUlJBWU9QIGFnYWluc3QgRUVPUF9TQ0FMQVJBUlJBWU9QLiAgRW5zdXJlIHRoZQor LS0gcmVzdWx0IG9mIG5vbi1oYXNoZWQgdnMgaGFzaGVkIGlzIHRoZSBzYW1lLgorc2VsZWN0Cisg IGEsCisgIGEgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50 LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIGluICgxOjpt eWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWlu dCw4OjpteWludCw5OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CisgYSB8IG5vdF9o YXNoZWQgfCBoYXNoZWQgCistLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tCisgMSB8IHQgICAgICAg ICAgfCB0CisgMiB8IHQgICAgICAgICAgfCB0CisgICB8ICAgICAgICAgICAgfCAKKygzIHJvd3Mp CiAKLXNlbGVjdCAqIGZyb20gaW50dGVzdCB3aGVyZSBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlp bnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQs OTo6bXlpbnQsIG51bGwpOwotIGEgCi0tLS0KLSgwIHJvd3MpCi0KLXNlbGVjdCAqIGZyb20gaW50 dGVzdCB3aGVyZSBhIG5vdCBpbiAoMDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQs NTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQsIG51bGwpOwotIGEg Ci0tLS0KLSgwIHJvd3MpCi0KLS0tIGVuc3VyZSB0aGUgcmVzdWx0IG1hdGNoZWQgd2l0aCB0aGUg bm9uLWhhc2hlZCB2ZXJzaW9uLiAgV2Ugc2ltcGx5IHJlbW92ZQotLS0gc29tZSBhcnJheSBlbGVt ZW50cyBzbyB0aGF0IHdlIGRvbid0IHJlYWNoIHRoZSBoYXNoaW5nIHRocmVzaG9sZC4KLXNlbGVj dCAqIGZyb20gaW50dGVzdCB3aGVyZSBhIGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0 OjpteWludCw1OjpteWludCwgbnVsbCk7Ci0gYSAKLS0tLQotIDEKLSAKLSgyIHJvd3MpCitzZWxl Y3QKKyAgYSwKKyAgYSBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQs NTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5vdF9oYXNoZWQsCisgIGEg aW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15 aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKKyBmcm9tIGludHRlc3Q7 CisgYSB8IG5vdF9oYXNoZWQgfCBoYXNoZWQgCistLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tCisg MSB8ICAgICAgICAgICAgfCAKKyAyIHwgdCAgICAgICAgICB8IHQKKyAgIHwgdCAgICAgICAgICB8 IHQKKygzIHJvd3MpCiAKLXNlbGVjdCAqIGZyb20gaW50dGVzdCB3aGVyZSBhIG5vdCBpbiAoMTo6 bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsIG51bGwpOwotIGEgCi0t LS0KLSgwIHJvd3MpCitzZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4gKDE6Om15aW50LDI6Om15aW50 LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBh cyBub3RfaGFzaGVkLAorICBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6 bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhh c2hlZAorZnJvbSBpbnR0ZXN0OworIGEgfCBub3RfaGFzaGVkIHwgaGFzaGVkIAorLS0tKy0tLS0t LS0tLS0tLSstLS0tLS0tLQorIDEgfCBmICAgICAgICAgIHwgZgorIDIgfCBmICAgICAgICAgIHwg ZgorICAgfCAgICAgICAgICAgIHwgCisoMyByb3dzKQorCitzZWxlY3QKKyAgYSwKKyAgYSBub3Qg aW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15 aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIG5vdCBpbiAobnVsbDo6 bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlp bnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0OworIGEgfCBub3Rf aGFzaGVkIHwgaGFzaGVkIAorLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLQorIDEgfCAgICAgICAg ICAgIHwgCisgMiB8IGYgICAgICAgICAgfCBmCisgICB8IGYgICAgICAgICAgfCBmCisoMyByb3dz KQogCi1zZWxlY3QgKiBmcm9tIGludHRlc3Qgd2hlcmUgYSBub3QgaW4gKDA6Om15aW50LDI6Om15 aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LCBudWxsKTsKLSBhIAotLS0tCi0oMCByb3dz KQorLS0gTm93IG1ha2UgdGhlIGVxdWFsIGZ1bmN0aW9uIHJldHVybiBmYWxzZSB3aGVuIGdpdmVu IHR3byBOVUxMcworY3JlYXRlIG9yIHJlcGxhY2UgZnVuY3Rpb24gbXlpbnRlcShteWludCwgbXlp bnQpIHJldHVybnMgYm9vbCBhcyAkJAorYmVnaW4KKyAgaWYgJDEgaXMgbnVsbCBhbmQgJDIgaXMg bnVsbCB0aGVuCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlCisgICAgcmV0dXJuICQxOjppbnQg PSAkMjo6aW50OworICBlbmQgaWY7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3FsIGltbXV0YWJs ZTsKKy0tIEFuZCB0cnkgdGhlIHNhbWUgYWdhaW4gdG8gZW5zdXJlIEVFT1BfSEFTSEVEX1NDQUxB UkFSUkFZT1AgZG9lcyB0aGUgc2FtZQorLS0gdGhpbmcgYXMgRUVPUF9TQ0FMQVJBUlJBWU9QLgor c2VsZWN0CisgIGEsCisgIGEgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50 LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBh IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWlu dCw3OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7Cisg YSB8IG5vdF9oYXNoZWQgfCBoYXNoZWQgCistLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tCisgMSB8 IHQgICAgICAgICAgfCB0CisgMiB8IHQgICAgICAgICAgfCB0CisgICB8ICAgICAgICAgICAgfCAK KygzIHJvd3MpCisKK3NlbGVjdAorICBhLAorICBhIGluIChudWxsOjpteWludCwyOjpteWludCwz OjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMg bm90X2hhc2hlZCwKKyAgYSBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlp bnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hl ZAorIGZyb20gaW50dGVzdDsKKyBhIHwgbm90X2hhc2hlZCB8IGhhc2hlZCAKKy0tLSstLS0tLS0t LS0tLS0rLS0tLS0tLS0KKyAxIHwgICAgICAgICAgICB8IAorIDIgfCB0ICAgICAgICAgIHwgdAor ICAgfCAgICAgICAgICAgIHwgCisoMyByb3dzKQorCitzZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4g KDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6 Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6 bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlp bnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0OworIGEgfCBub3RfaGFzaGVkIHwg aGFzaGVkIAorLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLQorIDEgfCBmICAgICAgICAgIHwgZgor IDIgfCBmICAgICAgICAgIHwgZgorICAgfCAgICAgICAgICAgIHwgCisoMyByb3dzKQorCitzZWxl Y3QKKyAgYSwKKyAgYSBub3QgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15 aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAor ICBhIG5vdCBpbiAobnVsbDo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlp bnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBp bnR0ZXN0OworIGEgfCBub3RfaGFzaGVkIHwgaGFzaGVkIAorLS0tKy0tLS0tLS0tLS0tLSstLS0t LS0tLQorIDEgfCAgICAgICAgICAgIHwgCisgMiB8IGYgICAgICAgICAgfCBmCisgICB8ICAgICAg ICAgICAgfCAKKygzIHJvd3MpCiAKIHJvbGxiYWNrOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvZXhwcmVzc2lvbnMuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXhwcmVzc2lv bnMuc3FsCmluZGV4IGUwMmMyMWYzMzY4Li45YzM2MmIxMDM2NSAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvZXhwcmVzc2lvbnMuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2V4cHJlc3Npb25zLnNxbApAQCAtMTk2LDE2ICsxOTYsNjkgQEAgZGVmYXVsdCBmb3IgdHlwZSBt eWludCB1c2luZyBoYXNoIGFzCiAgIGZ1bmN0aW9uICAgIDEgICBteWludGhhc2gobXlpbnQpOwog CiBjcmVhdGUgdGFibGUgaW50dGVzdCAoYSBteWludCk7Ci1pbnNlcnQgaW50byBpbnR0ZXN0IHZh bHVlcygxOjpteWludCksKG51bGwpOwotCi0tLSB0cnkgYW4gYXJyYXkgd2l0aCBlbm91Z2ggZWxl bWVudHMgdG8gY2F1c2UgaGFzaGluZwotc2VsZWN0ICogZnJvbSBpbnR0ZXN0IHdoZXJlIGEgaW4g KDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6 Om15aW50LDg6Om15aW50LDk6Om15aW50LCBudWxsKTsKLXNlbGVjdCAqIGZyb20gaW50dGVzdCB3 aGVyZSBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlp bnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlpbnQsIG51bGwpOwotc2VsZWN0ICog ZnJvbSBpbnR0ZXN0IHdoZXJlIGEgbm90IGluICgwOjpteWludCwyOjpteWludCwzOjpteWludCw0 OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCwgbnVs bCk7Ci0tLSBlbnN1cmUgdGhlIHJlc3VsdCBtYXRjaGVkIHdpdGggdGhlIG5vbi1oYXNoZWQgdmVy c2lvbi4gIFdlIHNpbXBseSByZW1vdmUKLS0tIHNvbWUgYXJyYXkgZWxlbWVudHMgc28gdGhhdCB3 ZSBkb24ndCByZWFjaCB0aGUgaGFzaGluZyB0aHJlc2hvbGQuCi1zZWxlY3QgKiBmcm9tIGludHRl c3Qgd2hlcmUgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlp bnQsIG51bGwpOwotc2VsZWN0ICogZnJvbSBpbnR0ZXN0IHdoZXJlIGEgbm90IGluICgxOjpteWlu dCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCwgbnVsbCk7Ci1zZWxlY3QgKiBm cm9tIGludHRlc3Qgd2hlcmUgYSBub3QgaW4gKDA6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6 Om15aW50LDU6Om15aW50LCBudWxsKTsKK2luc2VydCBpbnRvIGludHRlc3QgdmFsdWVzICgxOjpt eWludCksICgyOjpteWludCksIChudWxsKTsKKworLS0gVGVzdCBFRU9QX0hBU0hFRF9TQ0FMQVJB UlJBWU9QIGFnYWluc3QgRUVPUF9TQ0FMQVJBUlJBWU9QLiAgRW5zdXJlIHRoZQorLS0gcmVzdWx0 IG9mIG5vbi1oYXNoZWQgdnMgaGFzaGVkIGlzIHRoZSBzYW1lLgorc2VsZWN0CisgIGEsCisgIGEg aW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50 LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIGluICgxOjpteWludCwyOjpt eWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWlu dCw5OjpteWludCkgYXMgaGFzaGVkCitmcm9tIGludHRlc3Q7CisKK3NlbGVjdAorICBhLAorICBh IGluIChudWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1OjpteWludCw2Ojpt eWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBpbiAobnVsbDo6bXlp bnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQs ODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorIGZyb20gaW50dGVzdDsKKworc2VsZWN0Cisg IGEsCisgIGEgbm90IGluICgxOjpteWludCwyOjpteWludCwzOjpteWludCw0OjpteWludCw1Ojpt eWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hlZCwKKyAgYSBub3Qg aW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50 LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zyb20gaW50dGVzdDsKKwor c2VsZWN0CisgIGEsCisgIGEgbm90IGluIChudWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0 OjpteWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCkgYXMgbm90X2hhc2hl ZCwKKyAgYSBub3QgaW4gKG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6 Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zy b20gaW50dGVzdDsKKworLS0gTm93IG1ha2UgdGhlIGVxdWFsIGZ1bmN0aW9uIHJldHVybiBmYWxz ZSB3aGVuIGdpdmVuIHR3byBOVUxMcworY3JlYXRlIG9yIHJlcGxhY2UgZnVuY3Rpb24gbXlpbnRl cShteWludCwgbXlpbnQpIHJldHVybnMgYm9vbCBhcyAkJAorYmVnaW4KKyAgaWYgJDEgaXMgbnVs bCBhbmQgJDIgaXMgbnVsbCB0aGVuCisgICAgcmV0dXJuIGZhbHNlOworICBlbHNlCisgICAgcmV0 dXJuICQxOjppbnQgPSAkMjo6aW50OworICBlbmQgaWY7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBn c3FsIGltbXV0YWJsZTsKKworLS0gQW5kIHRyeSB0aGUgc2FtZSBhZ2FpbiB0byBlbnN1cmUgRUVP UF9IQVNIRURfU0NBTEFSQVJSQVlPUCBkb2VzIHRoZSBzYW1lCistLSB0aGluZyBhcyBFRU9QX1ND QUxBUkFSUkFZT1AuCitzZWxlY3QKKyAgYSwKKyAgYSBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6 bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQpIGFzIG5v dF9oYXNoZWQsCisgIGEgaW4gKDE6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6 Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50LDk6Om15aW50KSBhcyBoYXNoZWQKK2Zy b20gaW50dGVzdDsKKworc2VsZWN0CisgIGEsCisgIGEgaW4gKG51bGw6Om15aW50LDI6Om15aW50 LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6Om15aW50KSBh cyBub3RfaGFzaGVkLAorICBhIGluIChudWxsOjpteWludCwyOjpteWludCwzOjpteWludCw0Ojpt eWludCw1OjpteWludCw2OjpteWludCw3OjpteWludCw4OjpteWludCw5OjpteWludCkgYXMgaGFz aGVkCisgZnJvbSBpbnR0ZXN0OworCitzZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4gKDE6Om15aW50 LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50LDc6Om15aW50LDg6 Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIG5vdCBpbiAoMTo6bXlpbnQsMjo6bXlpbnQsMzo6 bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQsODo6bXlpbnQsOTo6bXlp bnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0OworCitzZWxlY3QKKyAgYSwKKyAgYSBub3QgaW4g KG51bGw6Om15aW50LDI6Om15aW50LDM6Om15aW50LDQ6Om15aW50LDU6Om15aW50LDY6Om15aW50 LDc6Om15aW50LDg6Om15aW50KSBhcyBub3RfaGFzaGVkLAorICBhIG5vdCBpbiAobnVsbDo6bXlp bnQsMjo6bXlpbnQsMzo6bXlpbnQsNDo6bXlpbnQsNTo6bXlpbnQsNjo6bXlpbnQsNzo6bXlpbnQs ODo6bXlpbnQsOTo6bXlpbnQpIGFzIGhhc2hlZAorZnJvbSBpbnR0ZXN0OwogCiByb2xsYmFjazsK LS0gCjIuNTEuMAoK --000000000000f41edf064fcfd91b--