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 1viRtC-006YdD-38 for pgsql-hackers@arkaria.postgresql.org; Wed, 21 Jan 2026 06:40:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1viRtC-005HQT-0K for pgsql-hackers@arkaria.postgresql.org; Wed, 21 Jan 2026 06:40:26 +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 1viRtB-005HQG-1K for pgsql-hackers@lists.postgresql.org; Wed, 21 Jan 2026 06:40:26 +0000 Received: from mail-qv1-xf41.google.com ([2607:f8b0:4864:20::f41]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1viRt9-001Xyx-01 for pgsql-hackers@lists.postgresql.org; Wed, 21 Jan 2026 06:40:24 +0000 Received: by mail-qv1-xf41.google.com with SMTP id 6a1803df08f44-88fca7bce90so72905126d6.3 for ; Tue, 20 Jan 2026 22:40:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1768977623; cv=none; d=google.com; s=arc-20240605; b=UG0BvndS55oKt3iuNgLBcP1tfshF26eVHuo5n/X5bDwEEpis/3IBRr51od7PiO6DQK P67CCDcTqooWaZsbJCb1YfUGK05LmrgB5cnGHInfjW3W4HM5MiV/KF0l1Cy0thdLdZBq 3iT9CZeh5bFIsEg7085xsaiX9YvT+xk7W08Cz+9JZMuZAWmD59Q7QVzmD43jFAwmVv8R 4bhO5EjcFm982pxtcMG22i5l8b1Q16P8y+s8p/GKzvBwasD8CDlLJT+IDljCDFWcHm9v LC26OrJn7vN1ire8GRvpVVjq+4jupiCQnyxtpZ4X2ko5fHr0jF/bx2yZvywnd5PPmXRU sscQ== 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=AgaSXne4NBiEIRYQ4qQn6izFq5XMepVARL7TDtsdHsA=; fh=UVmsJLLF/u0J6muc0O62mFMf1lxQ2mmZTwwdAxSXWG0=; b=Z8iu3f3Y7zpqQEpiC/dAengIAR+zsi4T05nVyKd08VIfD02rqprqlQ9PBZ6cvkbxVb FBxqlu4ngh0m6U9D2qAwACYFNx9HW+frWJ3RS41gMeWAhLjq0r5ygJCL+mcHK0Ib3MvY aZgK2w9nkEr69yLuWJMntjVb39xCIrTnte+AaLELrvcpDgBMufEDy09sRDLwMDGVSuDO O+qLm+BEceOs0eKhROVv5oULuvhyY5iUOLWYWjzgGJGftgUE+qCUkyJC0XA6E7vcDyEh OnfdJaBV1mkgPlafNA7T3WKD7LIG2ZRM+uRTDkIMKbbblTuemz9ASdHSRkmkxYZaxw7T yvBw==; 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=20230601; t=1768977623; x=1769582423; darn=lists.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=AgaSXne4NBiEIRYQ4qQn6izFq5XMepVARL7TDtsdHsA=; b=nJnH4r4qKMlgmG2+uD4H5yTJwIzuXXsE6eaiX8LIlOGQwqXqsauu+khs02ZfE6kzGk u3tWGSKS9jywGj/Hy2cCdeF/5eGhyA2D/yxmLsxs9sVq8mt0H26Nyb0WczNPHYGE2lBd cTOIswXhlvc77NjdAB/YrhII9v5hsJr8zeg6XdH/L3bpciWKUKtCXBdkmwkc73q1Qr7W 4gqIJ0s2niVzIS42mgSX7ikHj33azbSBlkX752J8l8ibO6ZDgcDVDQBi8HJbldCzbYH0 YeO9iwsi03OAL6lxvvf7mmpt5HSEqgg1J1EpFREHG5n7pmP6WMTo0OuafNZTFZdesyff JMPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768977623; x=1769582423; 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=AgaSXne4NBiEIRYQ4qQn6izFq5XMepVARL7TDtsdHsA=; b=QJ+aPQzSZJRKqV6K5lI/rTe+LFeJFSDICoGs1pSUOyo/GUf92xyrQnA5BB/EXxIRYX /FCkkmHU4xic90VKczK0SEsOX3K3IFPb5/uOLJUXV215WOsBp7mipFMa4kj3HOamh+vm xLPH1fknDcrH1esUYAPJXyE4Fupr/FPhLezANU/jTWAFl0IQlm58rv0bbI4+PCCfA2LU wfTkN5ZCq3ComPLAJJ0SQWrFhJcdzrmGItbOPm4S8za/B/IhuLSol1dksI30RvVnbw5q vyY0Xo9wQtacdY69E0SQjsw6ygOwvcGFIM9Dgd9Pgdy32Cdn5E3a9b0GUk9xF5Ov9pvn OiDA== X-Forwarded-Encrypted: i=1; AJvYcCVSQzTv1YG4hwp/Ll+4W2RpC7Pr2oAVm8D4xIu8jjoq1ZIsSk3uY+HrftJ50xnCa4UDZ1tHZfcbqdo7FH5J@lists.postgresql.org X-Gm-Message-State: AOJu0YwQKMAiiE+OlI27ijCXSSVghkrAFwRvSOU1NiVpA8AqCn4r2efc OBOjZGtXjcCz//4+Fb/F/+4beChCh+3795AmLvn4PE9p83+jvvKpsngO2DGZZYTp8/nZbvdrYkC MqFvzsLIBJoV1MTY/yiaYXrHuToPVQ/4= X-Gm-Gg: AZuq6aKlKvBYrZS1Z0WmyejJjNIpxh+xcCe2zNb3ZlTI8gXvaPk5fMexVWsoabvnfjY C6h63gdsSjQrJ4Eobvs5iOvhWk3EjIX1RHSwAGk1vwTzyqrThDjBo6mpqWYsIizdQD9VUg+JJnf JirBkkexCfwzZvfhiO0c3rRkfZP5edXC66Rv4jdpQrv5Db1tm4FcauiUIp5OLJNOP7RHNg5egNv nUzTlxoKlE9riscjKtgS2XnXAHxsYHn1NEGRpWQvtDiiUJ0t0wOWF3kFn8jAe57xXdW+elVW12W VP53N8ANCuoLlurEwzyKQewnhk4JdxE2F6HJzAPSr1Nqf9PK8X2tT1EsThcvxSkIwvyT6eK6Y6Z EtECIjLI+m6lVAyg= X-Received: by 2002:ad4:594b:0:b0:88f:caaa:fdb8 with SMTP id 6a1803df08f44-89463e12c27mr68490466d6.42.1768977622884; Tue, 20 Jan 2026 22:40:22 -0800 (PST) MIME-Version: 1.0 References: <269A8FB9-6D43-43CF-A6FE-52D28CBDB8A9@Outlook.com> <606C775A-4C1A-482B-BE7D-2E7A46AE14B9@gmail.com> <9D3D4647-868B-4562-B382-D201478AD67B@gmail.com> <54659731-2232-4E74-9533-D136D01B153F@gmail.com> In-Reply-To: <54659731-2232-4E74-9533-D136D01B153F@gmail.com> From: John Naylor Date: Wed, 21 Jan 2026 13:40:11 +0700 X-Gm-Features: AZwV_QhdoIMWckXGUYRN3YilW6xBq2h9PfdyXl-nUTvZt6wyXOsfgy-6LUdOFCE Message-ID: Subject: Re: tuple radix sort To: Chao Li Cc: Chengpeng Yan , "pgsql-hackers@lists.postgresql.org" , Peter Geoghegan Content-Type: multipart/mixed; boundary="000000000000d4a0eb0648e032a8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d4a0eb0648e032a8 Content-Type: text/plain; charset="UTF-8" Attached is v6, which seems pretty close to committable. The temporary GUC is gone, as are all the integer-like qsort specializations. There are a few cosmetic rearrangements, but the algorithm is pretty much the same as v5. The only visible behavior difference should be the addition of a presorted check just like qsort has. * The only things I have doubts about are the user-visible messages mentioning "qsort". For trace_sort, it seemed logical to re-use the term "internal sort" from other such messages, so I've done that for v6. EXPLAIN ANALYZE is a bit harder: Do we want to even change anything here? When things like this come up, there is the question of tools that parse the output. It doesn't seem particularly important to try to display exact info here, especially since radix sort must divert to qsort for multiple keys etc. Other updates: 1) I wanted a better test for small input, in case the threshold needed adjusting. I lost the test during a fumbled rebase, but it's easy to describe: instead of calling tuplesort_sort_memtuples(), call both radix sort and qsort on copies of the input, with RDTSC calls around each. I've attached the results, which are average ticks per element sorted, averaging a million runs. The threshold seems to be fine at 40, even down to a cardinality of 6. It's important to be as low as we can get away with, since "qsort" here is qsort_tuple, not the former specialized variants for integer comparators. 2) We don't need to try harder in the NULL partitioning step For example, the case below with all NULL in the first key. The underlying behavioral difference is, with qsort the comparator tries the NULL first key (which ties every time), and then tries the second key. With radix sort, the first key NULLs are partitioned first, doing no useful work since they're all NULL, then qsort is called with the tiebreak comparator on the whole input. By this test, there is only noise difference with low cardinality (before I removed the GUC): drop table if exists test; create unlogged table test (a bigint, b bigint not null); insert into test select NULL, (1_000_000_000 * random())::bigint % 8 from generate_series(1,1_000_000,1) i; vacuum freeze test; select pg_prewarm('test'); set work_mem = '500MB'; \timing set wip_radix_sort = 'off'; select * from test order by a, b offset 1_000_000_000; 280ms set wip_radix_sort = 'on'; select * from test order by a, b offset 1_000_000_000; 277ms Speaking of the NULL partitioning step, I've tried to add some comments that make sense, but the pictures in the linked blog are more helpful than any words I can come up with. It's easier to understand than to describe. -- John Naylor Amazon Web Services --000000000000d4a0eb0648e032a8 Content-Type: text/plain; charset="US-ASCII"; name="20260120-radix-sort-threshold-test.txt" Content-Disposition: attachment; filename="20260120-radix-sort-threshold-test.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkmh2z9q0 LSBudW0gZWxlbSBpcyBhY3R1YWwgc2l6ZSBvZiBpbnB1dCBhcnJheSBzb3J0ZWQKCi0gbWVhc3Vy ZW1lbnRzIGFyZSBpbiBSRFRTQyB0aWNrcyBwZXIgZWxlbWVudCBzb3J0ZWQKCioqKiBtZWFucyBz bWFsbGVzdCBpbnB1dCB0aGF0IHJhZGl4IHNvcnQgbWVhc3VyZWQgZXF1YWwgb3IgZmFzdGVyCgpz ZWxlY3QgaSAlIDIgYXMgcmVzIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwLDEpIGkgb3JkZXIg YnkgcmVzIG9mZnNldCAxMDAwOwpTRVQKTk9USUNFOiAgbnVtIGVsZW06ICAzMCAgIHFzb3J0OiAy Ni42IHJhZGl4OiA0OS4zCk5PVElDRTogIG51bSBlbGVtOiAgNDAgICBxc29ydDogMjkuNCByYWRp eDogNDMuMgpOT1RJQ0U6ICBudW0gZWxlbTogIDUwICAgcXNvcnQ6IDI4LjMgcmFkaXg6IDM3LjcK Tk9USUNFOiAgbnVtIGVsZW06ICA2MCAgIHFzb3J0OiAyNy42IHJhZGl4OiAzNS4xCk5PVElDRTog IG51bSBlbGVtOiAgNzAgICBxc29ydDogMjcuMCByYWRpeDogMzIuOQpOT1RJQ0U6ICBudW0gZWxl bTogIDgwICAgcXNvcnQ6IDMwLjAgcmFkaXg6IDMwLjUgKioqCk5PVElDRTogIG51bSBlbGVtOiAg OTAgICBxc29ydDogMjkuNyByYWRpeDogMjkuOQoKc2VsZWN0IGkgJSA0IGFzIHJlcyBmcm9tIGdl bmVyYXRlX3NlcmllcygxLDEwMCwxKSBpIG9yZGVyIGJ5IHJlcyBvZmZzZXQgMTAwMDsKTk9USUNF OiAgbnVtIGVsZW06ICAzMCAgIHFzb3J0OiAzOC4xIHJhZGl4OiA1NC40Ck5PVElDRTogIG51bSBl bGVtOiAgNDAgICBxc29ydDogMzYuNSByYWRpeDogNDYuMwpOT1RJQ0U6ICBudW0gZWxlbTogIDUw ICAgcXNvcnQ6IDM3LjAgcmFkaXg6IDQwLjQKTk9USUNFOiAgbnVtIGVsZW06ICA2MCAgIHFzb3J0 OiAzNS42IHJhZGl4OiAzNy45Ck5PVElDRTogIG51bSBlbGVtOiAgNzAgICBxc29ydDogMzUuNCBy YWRpeDogMzQuOCAqKioKTk9USUNFOiAgbnVtIGVsZW06ICA4MCAgIHFzb3J0OiAzNi44IHJhZGl4 OiAzMi40Ck5PVElDRTogIG51bSBlbGVtOiAgOTAgICBxc29ydDogMzguMyByYWRpeDogMzAuNAoK c2VsZWN0IGkgJSA2IGFzIHJlcyBmcm9tIGdlbmVyYXRlX3NlcmllcygxLDEwMCwxKSBpIG9yZGVy IGJ5IHJlcyBvZmZzZXQgMTAwMDsKU0VUCk5PVElDRTogIG51bSBlbGVtOiAgMzAgICBxc29ydDog NDguNiByYWRpeDogNTQuNgpOT1RJQ0U6ICBudW0gZWxlbTogIDQwICAgcXNvcnQ6IDUwLjYgcmFk aXg6IDQ2LjggKioqCk5PVElDRTogIG51bSBlbGVtOiAgNTAgICBxc29ydDogNTAuMiByYWRpeDog NDEuOQpOT1RJQ0U6ICBudW0gZWxlbTogIDYwICAgcXNvcnQ6IDQzLjYgcmFkaXg6IDM3LjIKTk9U SUNFOiAgbnVtIGVsZW06ICA3MCAgIHFzb3J0OiA0OC42IHJhZGl4OiAzNi40Ck5PVElDRTogIG51 bSBlbGVtOiAgODAgICBxc29ydDogNDMuMiByYWRpeDogMzQuMwpOT1RJQ0U6ICBudW0gZWxlbTog IDkwICAgcXNvcnQ6IDQ1LjQgcmFkaXg6IDMyLjIKCnNlbGVjdCBpICUgMTAgYXMgcmVzIGZyb20g Z2VuZXJhdGVfc2VyaWVzKDEsMTAwLDEpIGkgb3JkZXIgYnkgcmVzIG9mZnNldCAxMDAwOwpOT1RJ Q0U6ICBudW0gZWxlbTogIDMwICAgcXNvcnQ6IDY2LjYgcmFkaXg6IDYwLjYgKioqCk5PVElDRTog IG51bSBlbGVtOiAgNDAgICBxc29ydDogNjYuOSByYWRpeDogNTIuNwpOT1RJQ0U6ICBudW0gZWxl bTogIDUwICAgcXNvcnQ6IDYwLjQgcmFkaXg6IDQ1LjkKTk9USUNFOiAgbnVtIGVsZW06ICA2MCAg IHFzb3J0OiA1OC40IHJhZGl4OiA0MS44Ck5PVElDRTogIG51bSBlbGVtOiAgNzAgICBxc29ydDog NjMuOSByYWRpeDogMzcuOApOT1RJQ0U6ICBudW0gZWxlbTogIDgwICAgcXNvcnQ6IDU2LjggcmFk aXg6IDM3LjEKTk9USUNFOiAgbnVtIGVsZW06ICA5MCAgIHFzb3J0OiA1OC43IHJhZGl4OiAzMy41 CgpzZWxlY3QgKDI1MCpyYW5kb20oKSk6OmludCAgYXMgcmVzIGZyb20gZ2VuZXJhdGVfc2VyaWVz KDEsMTAwLDEpIGkgb3JkZXIgYnkgcmVzIG9mZnNldCAxMDAwOwpTRVQKTk9USUNFOiAgbnVtIGVs ZW06ICAzMCAgIHFzb3J0OiA3Ny45IHJhZGl4OiA3OS43Ck5PVElDRTogIG51bSBlbGVtOiAgNDAg ICBxc29ydDogNzQuMiByYWRpeDogNzIuMiAqKioKTk9USUNFOiAgbnVtIGVsZW06ICA1MCAgIHFz b3J0OiA4OC4wIHJhZGl4OiA2NC42Ck5PVElDRTogIG51bSBlbGVtOiAgNjAgICBxc29ydDogOTAu NyByYWRpeDogNjQuNgpOT1RJQ0U6ICBudW0gZWxlbTogIDcwICAgcXNvcnQ6IDk3LjIgcmFkaXg6 IDYxLjIKTk9USUNFOiAgbnVtIGVsZW06ICA4MCAgIHFzb3J0OiA5Ni44IHJhZGl4OiA2MC4zCk5P VElDRTogIG51bSBlbGVtOiAgOTAgICBxc29ydDogOTQuNiByYWRpeDogNjMuNgoKc2VsZWN0ICg2 NDAwMCpyYW5kb20oKSk6OmludCAgYXMgcmVzIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwLDEp IGkgb3JkZXIgYnkgcmVzIG9mZnNldCAxMDAwOwpOT1RJQ0U6ICBudW0gZWxlbTogIDMwICAgcXNv cnQ6IDgyLjYgcmFkaXg6IDgzLjkKTk9USUNFOiAgbnVtIGVsZW06ICA0MCAgIHFzb3J0OiA5MS4y IHJhZGl4OiA3Ni45ICoqKgpOT1RJQ0U6ICBudW0gZWxlbTogIDUwICAgcXNvcnQ6IDg2LjcgcmFk aXg6IDcwLjkKTk9USUNFOiAgbnVtIGVsZW06ICA2MCAgIHFzb3J0OiA5MS40IHJhZGl4OiA3NS4w Ck5PVElDRTogIG51bSBlbGVtOiAgNzAgICBxc29ydDogOTEuMSByYWRpeDogNzQuNQpOT1RJQ0U6 ICBudW0gZWxlbTogIDgwICAgcXNvcnQ6IDk2LjggcmFkaXg6IDYzLjYKTk9USUNFOiAgbnVtIGVs ZW06ICA5MCAgIHFzb3J0OiAxMDcuOSByYWRpeDogNjEuMwoKc2VsZWN0ICgxXzAwMF8wMDBfMDAw KnJhbmRvbSgpKTo6aW50ICBhcyByZXMgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAsMSkgaSBv cmRlciBieSByZXMgb2Zmc2V0IDEwMDA7ClNFVApOT1RJQ0U6ICBudW0gZWxlbTogIDMwICAgcXNv cnQ6IDc2LjAgcmFkaXg6IDg0LjMKTk9USUNFOiAgbnVtIGVsZW06ICA0MCAgIHFzb3J0OiA3OC43 IHJhZGl4OiA3NC44ICoqKgpOT1RJQ0U6ICBudW0gZWxlbTogIDUwICAgcXNvcnQ6IDkxLjcgcmFk aXg6IDc0LjYKTk9USUNFOiAgbnVtIGVsZW06ICA2MCAgIHFzb3J0OiA5Mi43IHJhZGl4OiA3MC4z Ck5PVElDRTogIG51bSBlbGVtOiAgNzAgICBxc29ydDogOTguMiByYWRpeDogNjguMQpOT1RJQ0U6 ICBudW0gZWxlbTogIDgwICAgcXNvcnQ6IDEwNC44IHJhZGl4OiA3MC41Ck5PVElDRTogIG51bSBl bGVtOiAgOTAgICBxc29ydDogMTExLjAgcmFkaXg6IDcwLjYKCg== --000000000000d4a0eb0648e032a8 Content-Type: application/x-patch; name="v6-0002-Detect-common-prefix-to-avoid-wasted-work-during-.patch" Content-Disposition: attachment; filename="v6-0002-Detect-common-prefix-to-avoid-wasted-work-during-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkng6b9v1 RnJvbSA0MTRjMzMyM2I4ZjBmYmU4NDVhNWYwYTQzZDc2MWJjMjcyZWI3MWE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IFdlZCwgMTIgTm92IDIwMjUgMTQ6MzE6MjQgKzA3MDAKU3ViamVjdDogW1BBVENI IHY2IDIvMl0gRGV0ZWN0IGNvbW1vbiBwcmVmaXggdG8gYXZvaWQgd2FzdGVkIHdvcmsgZHVyaW5n IHJhZGl4CiBzb3J0CgpUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGludGVnZXJzLCBz aW5jZSB0aGV5IGNvbW1vbmx5CmhhdmUgc29tZSB6ZXJvIHVwcGVyIGJ5dGVzLgoKUmV2aWV3ZWQt Ynk6IENoZW5ncGVuZyBZYW4gPGNoZW5ncGVuZ195YW5Ab3V0bG9vay5jb20+Ci0tLQogc3JjL2Jh Y2tlbmQvdXRpbHMvc29ydC90dXBsZXNvcnQuYyB8IDY2ICsrKysrKysrKysrKysrKysrKysrKysr KysrKystLQogMSBmaWxlIGNoYW5nZWQsIDYyIGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXNvcnQuYyBiL3NyYy9i YWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKaW5kZXggZjg3MjM1YjkwZDcuLjhiNTczZDQ4 ZDFkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydC5jCisrKyBi L3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKQEAgLTEwNCw2ICsxMDQsNyBAQAog I2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlc3BhY2UuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIK ICNpbmNsdWRlICJwZ190cmFjZS5oIgorI2luY2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKICNp bmNsdWRlICJzdG9yYWdlL3NobWVtLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKQEAgLTI5MTUsMTAgKzI5MTYsNjcgQEAgc29ydF9ieXZhbHVl X2RhdHVtKFNvcnRUdXBsZSAqZGF0YSwgc2l6ZV90IG4sIFR1cGxlc29ydHN0YXRlICpzdGF0ZSkK IAl7CiAJCWlmIChub3RfbnVsbF9jb3VudCA+IFJBRElYX1NPUlRfVEhSRVNIT0xEKQogCQl7Ci0J CQlyYWRpeF9zb3J0X3R1cGxlKG5vdF9udWxsX3N0YXJ0LAotCQkJCQkJCSBub3RfbnVsbF9jb3Vu dCwKLQkJCQkJCQkgMCwKLQkJCQkJCQkgc3RhdGUpOworCQkJaW50CQkJY29tbW9uX3ByZWZpeDsK KwkJCURhdHVtCQlmaXJzdF9kYXR1bSA9IDA7CisJCQlEYXR1bQkJY29tbW9uX3VwcGVyX2JpdHMg PSAwOworCisJCQkvKgorCQkJICogQ29tcHV0ZSB0aGUgY29tbW9uIHByZWZpeCB0byBza2lwIHVu cHJvZHVjdGl2ZSByZWN1cnNpb24gc3RlcHMKKwkJCSAqIGR1cmluZyByYWRpeCBzb3J0LgorCQkJ ICovCisJCQlmb3IgKFNvcnRUdXBsZSAqc3QgPSBub3RfbnVsbF9zdGFydDsKKwkJCQkgc3QgPCBu b3RfbnVsbF9zdGFydCArIG5vdF9udWxsX2NvdW50OworCQkJCSBzdCsrKQorCQkJeworCQkJCURh dHVtCQl0aGlzX2RhdHVtID0gc3QtPmRhdHVtMTsKKworCQkJCWlmIChzdCA9PSBub3RfbnVsbF9z dGFydCkKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIE5lZWQgdG8gc3RhcnQgd2l0aCBzb21lIHZh bHVlLCBtYXkgYXMgd2VsbCBiZSB0aGUgZmlyc3QKKwkJCQkJICogb25lLgorCQkJCQkgKi8KKwkJ CQkJZmlyc3RfZGF0dW0gPSB0aGlzX2RhdHVtOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJ CQkvKgorCQkJCQkgKiBBY2N1bXVsYXRlIGJpdHMgdGhhdCByZXByZXNlbnQgYSBkaWZmZXJlbmNl IGZyb20gdGhlCisJCQkJCSAqIHJlZmVyZW5jZSBkYXR1bS4KKwkJCQkJICovCisJCQkJCWNvbW1v bl91cHBlcl9iaXRzIHw9IGZpcnN0X2RhdHVtIF4gdGhpc19kYXR1bTsKKwkJCQl9CisJCQl9CisK KwkJCWlmIChjb21tb25fdXBwZXJfYml0cyA9PSAwKQorCQkJeworCQkJCS8qCisJCQkJICogQWxs IE5PVCBOVUxMIHR1cGxlcyBoYXZlIHRoZSBzYW1lIGRhdHVtLCBzbyB3ZSBjYW4gc2tpcAorCQkJ CSAqIHJhZGl4IHNvcnQuIFNvcnQgdXNpbmcgdGhlIHRpZWJyZWFrIGNvbXBhcmF0b3IgaWYgbmVj ZXNzYXJ5LgorCQkJCSAqLworCQkJCWlmIChzdGF0ZS0+YmFzZS5vbmx5S2V5ID09IE5VTEwpCisJ CQkJeworCQkJCQlxc29ydF90dXBsZShub3RfbnVsbF9zdGFydCwKKwkJCQkJCQkJbm90X251bGxf Y291bnQsCisJCQkJCQkJCXN0YXRlLT5iYXNlLmNvbXBhcmV0dXBfdGllYnJlYWssCisJCQkJCQkJ CXN0YXRlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyoKKwkJCQkgKiBUaGUg dXBwZXIgYml0cyBvZiBjb21tb25fdXBwZXJfYml0cyBhcmUgemVybyB3aGVyZSBhbGwKKwkJCQkg KiBkYXR1bXMgaGF2ZSB0aGUgc2FtZSBiaXRzLiBUaGUgYnl0ZSBwb3NpdGlvbiBvZiB0aGUKKwkJ CQkgKiBsZWZ0bW9zdCBvbmUgYml0IGlzIHRoZSBieXRlIHdoZXJlIHJhZGl4IHNvcnQgc2hvdWxk IHN0YXJ0LgorCQkJCSAqLworCQkJCWNvbW1vbl9wcmVmaXggPSBTSVpFT0ZfREFUVU0gLSAxIC0K KwkJCQkJKHBnX2xlZnRtb3N0X29uZV9wb3M2NChjb21tb25fdXBwZXJfYml0cykgLyBCSVRTX1BF Ul9CWVRFKTsKKworCQkJCXJhZGl4X3NvcnRfdHVwbGUobm90X251bGxfc3RhcnQsCisJCQkJCQkJ CSBub3RfbnVsbF9jb3VudCwKKwkJCQkJCQkJIGNvbW1vbl9wcmVmaXgsCisJCQkJCQkJCSBzdGF0 ZSk7CisJCQl9CiAJCX0KIAkJZWxzZQogCQl7Ci0tIAoyLjUyLjAKCg== --000000000000d4a0eb0648e032a8 Content-Type: application/x-patch; name="v6-0001-Use-radix-sort-when-SortTuple-contains-a-pass-by-.patch" Content-Disposition: attachment; filename="v6-0001-Use-radix-sort-when-SortTuple-contains-a-pass-by-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkng6ba12 RnJvbSBhYjA1ODA3ZDY2MWZkZjQ2MGIzMTNjYzc0YTg3ODg1NTE1NzFhYTBiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKb2huIE5heWxvciA8am9obi5uYXlsb3JAcG9zdGdyZXNxbC5v cmc+CkRhdGU6IEZyaSwgMTcgT2N0IDIwMjUgMDk6NTc6NDMgKzA3MDAKU3ViamVjdDogW1BBVENI IHY2IDEvMl0gVXNlIHJhZGl4IHNvcnQgd2hlbiBTb3J0VHVwbGUgY29udGFpbnMgYSBwYXNzLWJ5 LXZhbHVlCiBkYXR1bQpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47 IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKRm9yIG5vdyB0 aGlzIG9ubHkgd29ya3MgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50cwp3aXRoIHRoZSB1c3Vh bCBjb21wYXJpc29uIHNlbWFudGljcywgdGhlIHNhbWUgdHlwZXMKZm9yIHdoaWNoIHdlIHByZXZp b3VzbHkgaGFkIHNlcGFyYXRlIHFzb3J0CnNwZWNpYWxpemF0aW9ucy4KCltUT0RPLi4uXQoKUmV2 aWV3ZWQtYnk6IENoZW5ncGVuZyBZYW4gPGNoZW5ncGVuZ195YW5Ab3V0bG9vay5jb20+ClJldmll d2VkLWJ5OiDDgWx2YXJvIEhlcnJlcmEgPGFsdmhlcnJlQGt1cmlsZW11LmRlPgpUZXN0ZWQtYnk6 IENoYW8gTGkgPGxpLmV2YW4uY2hhb0BnbWFpbC5jb20+IChlYXJsaWVyIHZlcnNpb24pCi0tLQog c3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXNvcnQuYyAgICAgIHwgNTQ3ICsrKysrKysrKysr KysrKysrKy0tLS0tLQogc3JjL2luY2x1ZGUvdXRpbHMvZ3VjLmggICAgICAgICAgICAgICAgIHwg ICAxICsKIHNyYy9pbmNsdWRlL3V0aWxzL3NvcnRzdXBwb3J0LmggICAgICAgICB8IDEwMSAtLS0t LQogc3JjL2luY2x1ZGUvdXRpbHMvdHVwbGVzb3J0LmggICAgICAgICAgIHwgICAxICsKIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHVwbGVzb3J0Lm91dCB8ICAgNiArLQogc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgIHwgICAxICsKIDYgZmlsZXMgY2hhbmdlZCwgNDIw IGluc2VydGlvbnMoKyksIDIzNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC91dGlscy9zb3J0L3R1cGxlc29ydC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXNv cnQuYwppbmRleCA5ZTRjZDgxNjEzNy4uZjg3MjM1YjkwZDcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3V0aWxzL3NvcnQvdHVwbGVzb3J0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90 dXBsZXNvcnQuYwpAQCAtNyw4ICs3LDggQEAKICAqIGFwcGxpZWQgdG8gZGlmZmVyZW50IGtpbmRz IG9mIHNvcnRhYmxlIG9iamVjdHMuICBJbXBsZW1lbnRhdGlvbiBvZgogICogdGhlIHBhcnRpY3Vs YXIgc29ydGluZyB2YXJpYW50cyBpcyBnaXZlbiBpbiB0dXBsZXNvcnR2YXJpYW50cy5jLgogICog VGhpcyBtb2R1bGUgd29ya3MgZWZmaWNpZW50bHkgZm9yIGJvdGggc21hbGwgYW5kIGxhcmdlIGFt b3VudHMKLSAqIG9mIGRhdGEuICBTbWFsbCBhbW91bnRzIGFyZSBzb3J0ZWQgaW4tbWVtb3J5IHVz aW5nIHFzb3J0KCkuICBMYXJnZQotICogYW1vdW50cyBhcmUgc29ydGVkIHVzaW5nIHRlbXBvcmFy eSBmaWxlcyBhbmQgYSBzdGFuZGFyZCBleHRlcm5hbCBzb3J0CisgKiBvZiBkYXRhLiAgU21hbGwg YW1vdW50cyBhcmUgc29ydGVkIGluLW1lbW9yeS4gIExhcmdlIGFtb3VudHMgYXJlCisgKiBzb3J0 ZWQgdXNpbmcgdGVtcG9yYXJ5IGZpbGVzIGFuZCBhIHN0YW5kYXJkIGV4dGVybmFsIHNvcnQKICAq IGFsZ29yaXRobS4KICAqCiAgKiBTZWUgS251dGgsIHZvbHVtZSAzLCBmb3IgbW9yZSB0aGFuIHlv dSB3YW50IHRvIGtub3cgYWJvdXQgZXh0ZXJuYWwKQEAgLTMyLDcgKzMyLDcgQEAKICAqIGlzIHNw ZWNpZmllZCBpbiBraWxvYnl0ZXMgYnkgdGhlIGNhbGxlciAobW9zdCBwYXNzIHdvcmtfbWVtKS4g IEluaXRpYWxseSwKICAqIHdlIGFic29yYiB0dXBsZXMgYW5kIHNpbXBseSBzdG9yZSB0aGVtIGlu IGFuIHVuc29ydGVkIGFycmF5IGFzIGxvbmcgYXMKICAqIHdlIGhhdmVuJ3QgZXhjZWVkZWQgd29y a01lbS4gIElmIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGlucHV0IHdpdGhvdXQKLSAqIGV4Y2Vl ZGluZyB3b3JrTWVtLCB3ZSBzb3J0IHRoZSBhcnJheSB1c2luZyBxc29ydCgpIGFuZCBzdWJzZXF1 ZW50bHkgcmV0dXJuCisgKiBleGNlZWRpbmcgd29ya01lbSwgd2Ugc29ydCB0aGUgYXJyYXkgaW4g bWVtb3J5IGFuZCBzdWJzZXF1ZW50bHkgcmV0dXJuCiAgKiB0dXBsZXMganVzdCBieSBzY2Fubmlu ZyB0aGUgdHVwbGUgYXJyYXkgc2VxdWVudGlhbGx5LiAgSWYgd2UgZG8gZXhjZWVkCiAgKiB3b3Jr TWVtLCB3ZSBiZWdpbiB0byBlbWl0IHR1cGxlcyBpbnRvIHNvcnRlZCBydW5zIGluIHRlbXBvcmFy eSB0YXBlcy4KICAqIFdoZW4gdHVwbGVzIGFyZSBkdW1wZWQgaW4gYmF0Y2ggYWZ0ZXIgcXVpY2tz b3J0aW5nLCB3ZSBiZWdpbiBhIG5ldyBydW4KQEAgLTQ3NywxMjEgKzQ3NywxNSBAQCBzdGF0aWMg dm9pZCBmcmVlX3NvcnRfdHVwbGUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBTb3J0VHVwbGUgKnN0 dXApOwogc3RhdGljIHZvaWQgdHVwbGVzb3J0X2ZyZWUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlKTsK IHN0YXRpYyB2b2lkIHR1cGxlc29ydF91cGRhdGVtYXgoVHVwbGVzb3J0c3RhdGUgKnN0YXRlKTsK IAotLyoKLSAqIFNwZWNpYWxpemVkIGNvbXBhcmF0b3JzIHRoYXQgd2UgY2FuIGlubGluZSBpbnRv IHNwZWNpYWxpemVkIHNvcnRzLiAgVGhlIGdvYWwKLSAqIGlzIHRvIHRyeSB0byBzb3J0IHR3byB0 dXBsZXMgd2l0aG91dCBoYXZpbmcgdG8gZm9sbG93IHRoZSBwb2ludGVycyB0byB0aGUKLSAqIGNv bXBhcmF0b3Igb3IgdGhlIHR1cGxlLgotICoKLSAqIFhYWDogRm9yIG5vdywgdGhlcmUgaXMgbm8g c3BlY2lhbGl6YXRpb24gZm9yIGNhc2VzIHdoZXJlIGRhdHVtMSBpcwotICogYXV0aG9yaXRhdGl2 ZSBhbmQgd2UgZG9uJ3QgZXZlbiBuZWVkIHRvIGZhbGwgYmFjayB0byBhIGNhbGxiYWNrIGF0IGFs bCAodGhhdAotICogd291bGQgYmUgdHJ1ZSBmb3IgdHlwZXMgbGlrZSBpbnQ0L2ludDgvdGltZXN0 YW1wL2RhdGUsIGJ1dCBub3QgdHJ1ZSBmb3IKLSAqIGFiYnJldmlhdGlvbnMgb2YgdGV4dCBvciBt dWx0aS1rZXkgc29ydHMuICBUaGVyZSBjb3VsZCBiZSEgIElzIGl0IHdvcnRoIGl0PwotICovCi0K LS8qIFVzZWQgaWYgZmlyc3Qga2V5J3MgY29tcGFyYXRvciBpcyBzc3VwX2RhdHVtX3Vuc2lnbmVk X2NtcCAqLwotc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIGludAotcXNvcnRfdHVw bGVfdW5zaWduZWRfY29tcGFyZShTb3J0VHVwbGUgKmEsIFNvcnRUdXBsZSAqYiwgVHVwbGVzb3J0 c3RhdGUgKnN0YXRlKQotewotCWludAkJCWNvbXBhcmU7Ci0KLQljb21wYXJlID0gQXBwbHlVbnNp Z25lZFNvcnRDb21wYXJhdG9yKGEtPmRhdHVtMSwgYS0+aXNudWxsMSwKLQkJCQkJCQkJCQkgIGIt PmRhdHVtMSwgYi0+aXNudWxsMSwKLQkJCQkJCQkJCQkgICZzdGF0ZS0+YmFzZS5zb3J0S2V5c1sw XSk7Ci0JaWYgKGNvbXBhcmUgIT0gMCkKLQkJcmV0dXJuIGNvbXBhcmU7Ci0KLQkvKgotCSAqIE5v IG5lZWQgdG8gd2FzdGUgZWZmb3J0IGNhbGxpbmcgdGhlIHRpZWJyZWFrIGZ1bmN0aW9uIHdoZW4g dGhlcmUgYXJlIG5vCi0JICogb3RoZXIga2V5cyB0byBzb3J0IG9uLgotCSAqLwotCWlmIChzdGF0 ZS0+YmFzZS5vbmx5S2V5ICE9IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHN0YXRlLT5i YXNlLmNvbXBhcmV0dXBfdGllYnJlYWsoYSwgYiwgc3RhdGUpOwotfQotCi0vKiBVc2VkIGlmIGZp cnN0IGtleSdzIGNvbXBhcmF0b3IgaXMgc3N1cF9kYXR1bV9zaWduZWRfY21wICovCi1zdGF0aWMg cGdfYXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgaW50Ci1xc29ydF90dXBsZV9zaWduZWRfY29tcGFy ZShTb3J0VHVwbGUgKmEsIFNvcnRUdXBsZSAqYiwgVHVwbGVzb3J0c3RhdGUgKnN0YXRlKQotewot CWludAkJCWNvbXBhcmU7Ci0KLQljb21wYXJlID0gQXBwbHlTaWduZWRTb3J0Q29tcGFyYXRvcihh LT5kYXR1bTEsIGEtPmlzbnVsbDEsCi0JCQkJCQkJCQkJYi0+ZGF0dW0xLCBiLT5pc251bGwxLAot CQkJCQkJCQkJCSZzdGF0ZS0+YmFzZS5zb3J0S2V5c1swXSk7Ci0KLQlpZiAoY29tcGFyZSAhPSAw KQotCQlyZXR1cm4gY29tcGFyZTsKLQotCS8qCi0JICogTm8gbmVlZCB0byB3YXN0ZSBlZmZvcnQg Y2FsbGluZyB0aGUgdGllYnJlYWsgZnVuY3Rpb24gd2hlbiB0aGVyZSBhcmUgbm8KLQkgKiBvdGhl ciBrZXlzIHRvIHNvcnQgb24uCi0JICovCi0JaWYgKHN0YXRlLT5iYXNlLm9ubHlLZXkgIT0gTlVM TCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gc3RhdGUtPmJhc2UuY29tcGFyZXR1cF90aWVicmVh ayhhLCBiLCBzdGF0ZSk7Ci19Ci0KLS8qIFVzZWQgaWYgZmlyc3Qga2V5J3MgY29tcGFyYXRvciBp cyBzc3VwX2RhdHVtX2ludDMyX2NtcCAqLwotc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5s aW5lIGludAotcXNvcnRfdHVwbGVfaW50MzJfY29tcGFyZShTb3J0VHVwbGUgKmEsIFNvcnRUdXBs ZSAqYiwgVHVwbGVzb3J0c3RhdGUgKnN0YXRlKQotewotCWludAkJCWNvbXBhcmU7Ci0KLQljb21w YXJlID0gQXBwbHlJbnQzMlNvcnRDb21wYXJhdG9yKGEtPmRhdHVtMSwgYS0+aXNudWxsMSwKLQkJ CQkJCQkJCSAgIGItPmRhdHVtMSwgYi0+aXNudWxsMSwKLQkJCQkJCQkJCSAgICZzdGF0ZS0+YmFz ZS5zb3J0S2V5c1swXSk7Ci0KLQlpZiAoY29tcGFyZSAhPSAwKQotCQlyZXR1cm4gY29tcGFyZTsK LQotCS8qCi0JICogTm8gbmVlZCB0byB3YXN0ZSBlZmZvcnQgY2FsbGluZyB0aGUgdGllYnJlYWsg ZnVuY3Rpb24gd2hlbiB0aGVyZSBhcmUgbm8KLQkgKiBvdGhlciBrZXlzIHRvIHNvcnQgb24uCi0J ICovCi0JaWYgKHN0YXRlLT5iYXNlLm9ubHlLZXkgIT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQly ZXR1cm4gc3RhdGUtPmJhc2UuY29tcGFyZXR1cF90aWVicmVhayhhLCBiLCBzdGF0ZSk7Ci19CiAK IC8qCiAgKiBTcGVjaWFsIHZlcnNpb25zIG9mIHFzb3J0IGp1c3QgZm9yIFNvcnRUdXBsZSBvYmpl Y3RzLiAgcXNvcnRfdHVwbGUoKSBzb3J0cwogICogYW55IHZhcmlhbnQgb2YgU29ydFR1cGxlcywg dXNpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbXBhcmV0dXAgZnVuY3Rpb24uCiAgKiBxc29ydF9zc3Vw KCkgaXMgc3BlY2lhbGl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wYXJldHVwIGZ1bmN0 aW9uCiAgKiByZWR1Y2VzIHRvIEFwcGx5U29ydENvbXBhcmF0b3IoKSwgdGhhdCBpcyBzaW5nbGUt a2V5IE1pbmltYWxUdXBsZSBzb3J0cwotICogYW5kIERhdHVtIHNvcnRzLiAgcXNvcnRfdHVwbGVf e3Vuc2lnbmVkLHNpZ25lZCxpbnQzMn0gYXJlIHNwZWNpYWxpemVkIGZvcgotICogY29tbW9uIGNv bXBhcmlzb24gZnVuY3Rpb25zIG9uIHBhc3MtYnktdmFsdWUgbGVhZGluZyBkYXR1bXMuCisgKiBh bmQgRGF0dW0gc29ydHMuCiAgKi8KIAotI2RlZmluZSBTVF9TT1JUIHFzb3J0X3R1cGxlX3Vuc2ln bmVkCi0jZGVmaW5lIFNUX0VMRU1FTlRfVFlQRSBTb3J0VHVwbGUKLSNkZWZpbmUgU1RfQ09NUEFS RShhLCBiLCBzdGF0ZSkgcXNvcnRfdHVwbGVfdW5zaWduZWRfY29tcGFyZShhLCBiLCBzdGF0ZSkK LSNkZWZpbmUgU1RfQ09NUEFSRV9BUkdfVFlQRSBUdXBsZXNvcnRzdGF0ZQotI2RlZmluZSBTVF9D SEVDS19GT1JfSU5URVJSVVBUUwotI2RlZmluZSBTVF9TQ09QRSBzdGF0aWMKLSNkZWZpbmUgU1Rf REVGSU5FCi0jaW5jbHVkZSAibGliL3NvcnRfdGVtcGxhdGUuaCIKLQotI2RlZmluZSBTVF9TT1JU IHFzb3J0X3R1cGxlX3NpZ25lZAotI2RlZmluZSBTVF9FTEVNRU5UX1RZUEUgU29ydFR1cGxlCi0j ZGVmaW5lIFNUX0NPTVBBUkUoYSwgYiwgc3RhdGUpIHFzb3J0X3R1cGxlX3NpZ25lZF9jb21wYXJl KGEsIGIsIHN0YXRlKQotI2RlZmluZSBTVF9DT01QQVJFX0FSR19UWVBFIFR1cGxlc29ydHN0YXRl Ci0jZGVmaW5lIFNUX0NIRUNLX0ZPUl9JTlRFUlJVUFRTCi0jZGVmaW5lIFNUX1NDT1BFIHN0YXRp YwotI2RlZmluZSBTVF9ERUZJTkUKLSNpbmNsdWRlICJsaWIvc29ydF90ZW1wbGF0ZS5oIgotCi0j ZGVmaW5lIFNUX1NPUlQgcXNvcnRfdHVwbGVfaW50MzIKLSNkZWZpbmUgU1RfRUxFTUVOVF9UWVBF IFNvcnRUdXBsZQotI2RlZmluZSBTVF9DT01QQVJFKGEsIGIsIHN0YXRlKSBxc29ydF90dXBsZV9p bnQzMl9jb21wYXJlKGEsIGIsIHN0YXRlKQotI2RlZmluZSBTVF9DT01QQVJFX0FSR19UWVBFIFR1 cGxlc29ydHN0YXRlCi0jZGVmaW5lIFNUX0NIRUNLX0ZPUl9JTlRFUlJVUFRTCi0jZGVmaW5lIFNU X1NDT1BFIHN0YXRpYwotI2RlZmluZSBTVF9ERUZJTkUKLSNpbmNsdWRlICJsaWIvc29ydF90ZW1w bGF0ZS5oIgotCiAjZGVmaW5lIFNUX1NPUlQgcXNvcnRfdHVwbGUKICNkZWZpbmUgU1RfRUxFTUVO VF9UWVBFIFNvcnRUdXBsZQogI2RlZmluZSBTVF9DT01QQVJFX1JVTlRJTUVfUE9JTlRFUgpAQCAt NjEzLDYgKzUwNywyMCBAQCBxc29ydF90dXBsZV9pbnQzMl9jb21wYXJlKFNvcnRUdXBsZSAqYSwg U29ydFR1cGxlICpiLCBUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCiAjZGVmaW5lIFNUX0RFRklORQog I2luY2x1ZGUgImxpYi9zb3J0X3RlbXBsYXRlLmgiCiAKKy8qIHN0YXRlIGZvciByYWRpeCBzb3J0 ICovCit0eXBlZGVmIHN0cnVjdCBSYWRpeFBhcnRpdGlvbkluZm8KK3sKKwl1bmlvbgorCXsKKwkJ c2l6ZV90CQljb3VudDsKKwkJc2l6ZV90CQlvZmZzZXQ7CisJfTsKKwlzaXplX3QJCW5leHRfb2Zm c2V0OworfSBSYWRpeFBhcnRpdGlvbkluZm87CisKKyNkZWZpbmUgUkFESVhfU09SVF9USFJFU0hP TEQgNDAKKworCiAvKgogICoJCXR1cGxlc29ydF9iZWdpbl94eHgKICAqCkBAIC0xMzY0LDcgKzEy NzIsNyBAQCB0dXBsZXNvcnRfcGVyZm9ybXNvcnQoVHVwbGVzb3J0c3RhdGUgKnN0YXRlKQogCQkJ ICovCiAJCQlpZiAoU0VSSUFMKHN0YXRlKSkKIAkJCXsKLQkJCQkvKiBKdXN0IHFzb3J0ICdlbSBh bmQgd2UncmUgZG9uZSAqLworCQkJCS8qIFNvcnQgaW4gbWVtb3J5IGFuZCB3ZSdyZSBkb25lICov CiAJCQkJdHVwbGVzb3J0X3NvcnRfbWVtdHVwbGVzKHN0YXRlKTsKIAkJCQlzdGF0ZS0+c3RhdHVz ID0gVFNTX1NPUlRFRElOTUVNOwogCQkJfQpAQCAtMjMzMiw3ICsyMjQwLDcgQEAgZHVtcHR1cGxl cyhUdXBsZXNvcnRzdGF0ZSAqc3RhdGUsIGJvb2wgYWxsdHVwbGVzKQogCXN0YXRlLT5jdXJyZW50 UnVuKys7CiAKIAlpZiAodHJhY2Vfc29ydCkKLQkJZWxvZyhMT0csICJ3b3JrZXIgJWQgc3RhcnRp bmcgcXVpY2tzb3J0IG9mIHJ1biAlZDogJXMiLAorCQllbG9nKExPRywgIndvcmtlciAlZCBzdGFy dGluZyBpbnRlcm5hbCBzb3J0IG9mIHJ1biAlZDogJXMiLAogCQkJIHN0YXRlLT53b3JrZXIsIHN0 YXRlLT5jdXJyZW50UnVuLAogCQkJIHBnX3J1c2FnZV9zaG93KCZzdGF0ZS0+cnVfc3RhcnQpKTsK IApAQCAtMjM0Myw3ICsyMjUxLDcgQEAgZHVtcHR1cGxlcyhUdXBsZXNvcnRzdGF0ZSAqc3RhdGUs IGJvb2wgYWxsdHVwbGVzKQogCXR1cGxlc29ydF9zb3J0X21lbXR1cGxlcyhzdGF0ZSk7CiAKIAlp ZiAodHJhY2Vfc29ydCkKLQkJZWxvZyhMT0csICJ3b3JrZXIgJWQgZmluaXNoZWQgcXVpY2tzb3J0 IG9mIHJ1biAlZDogJXMiLAorCQllbG9nKExPRywgIndvcmtlciAlZCBmaW5pc2hlZCBpbnRlcm5h bCBzb3J0IG9mIHJ1biAlZDogJXMiLAogCQkJIHN0YXRlLT53b3JrZXIsIHN0YXRlLT5jdXJyZW50 UnVuLAogCQkJIHBnX3J1c2FnZV9zaG93KCZzdGF0ZS0+cnVfc3RhcnQpKTsKIApAQCAtMjY1Mywx MCArMjU2MSwzOTEgQEAgc29ydF9ib3VuZGVkX2hlYXAoVHVwbGVzb3J0c3RhdGUgKnN0YXRlKQog CXN0YXRlLT5ib3VuZFVzZWQgPSB0cnVlOwogfQogCisKKy8qIHJhZGl4IHNvcnQgcm91dGluZXMg Ki8KKworLyoKKyAqIFJldHJpZXZlIGJ5dGUgZnJvbSBkYXR1bSwgaW5kZXhlZCBieSAnbGV2ZWwn OiAwIGZvciBMU0IsIDcgZm9yIE1TQgorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4CitjdXJyZW50 X2J5dGUoRGF0dW0ga2V5LCBpbnQgbGV2ZWwpCit7CisJaW50CQkJc2hpZnQgPSAoU0laRU9GX0RB VFVNIC0gMSAtIGxldmVsKSAqIEJJVFNfUEVSX0JZVEU7CisKKwlyZXR1cm4gKGtleSA+PiBzaGlm dCkgJiAweEZGOworfQorCisvKgorICogTm9ybWFsaXplIGRhdHVtIHN1Y2ggdGhhdCB1bnNpZ25l ZCBjb21wYXJpc29uIGlzIG9yZGVyLXByZXNlcnZpbmcsCisgKiB0YWtpbmcgQVNDL0RFU0MgaW50 byBhY2NvdW50IGFzIHdlbGwuCisgKi8KK3N0YXRpYyBpbmxpbmUgRGF0dW0KK25vcm1hbGl6ZV9k YXR1bShEYXR1bSBvcmlnLCBTb3J0U3VwcG9ydCBzc3VwKQoreworCURhdHVtCQlub3JtX2RhdHVt MTsKKworCWlmIChzc3VwLT5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fc2lnbmVkX2NtcCkKKwl7 CisJCW5vcm1fZGF0dW0xID0gb3JpZyArICgodWludDY0KSBQR19JTlQ2NF9NQVgpICsgMTsKKwl9 CisJZWxzZSBpZiAoc3N1cC0+Y29tcGFyYXRvciA9PSBzc3VwX2RhdHVtX2ludDMyX2NtcCkKKwl7 CisJCS8qCisJCSAqIEZpcnN0IHRydW5jYXRlIHRvIHVpbnQzMi4gVGVjaG5pY2FsbHksIHdlIGRv bid0IG5lZWQgdG8gZG8gdGhpcywKKwkJICogYnV0IGl0IGZvcmNlcyB0aGUgdXBwZXIgaGFsZiBv ZiB0aGUgZGF0dW0gdG8gYmUgemVybyByZWdhcmRsZXNzIG9mCisJCSAqIHNpZ24uCisJCSAqLwor CQl1aW50MzIJCXUzMiA9IERhdHVtR2V0VUludDMyKG9yaWcpICsgKCh1aW50MzIpIFBHX0lOVDMy X01BWCkgKyAxOworCisJCW5vcm1fZGF0dW0xID0gVUludDMyR2V0RGF0dW0odTMyKTsKKwl9CisJ ZWxzZQorCXsKKwkJQXNzZXJ0KHNzdXAtPmNvbXBhcmF0b3IgPT0gc3N1cF9kYXR1bV91bnNpZ25l ZF9jbXApOworCQlub3JtX2RhdHVtMSA9IG9yaWc7CisJfQorCisJaWYgKHNzdXAtPnNzdXBfcmV2 ZXJzZSkKKwkJbm9ybV9kYXR1bTEgPSB+bm9ybV9kYXR1bTE7CisKKwlyZXR1cm4gbm9ybV9kYXR1 bTE7Cit9CisKKy8qCisgKiByYWRpeF9zb3J0X3R1cGxlCisgKgorICogUmFkaXggc29ydCBieSB0 aGUgcGFzcy1ieS12YWx1ZSBkYXR1bSBpbiBkYXR1bTEuIFRoaXMgaXMgYSBtb2RpZmljYXRpb24g b2YKKyAqIHNrYV9ieXRlX3NvcnQoKSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9za2FydXBrZS9z a2Ffc29ydAorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgZm9sbG93czoKKyAqCisg KiBDb3B5cmlnaHQgTWFsdGUgU2thcnVwa2UgMjAxNi4KKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRo ZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAqCisgKiBCb29zdCBTb2Z0 d2FyZSBMaWNlbnNlIC0gVmVyc2lvbiAxLjAgLSBBdWd1c3QgMTd0aCwgMjAwMworICoKKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u IG9yIG9yZ2FuaXphdGlvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5k IGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKKyAqIHRoaXMgbGljZW5zZSAo dGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAor ICogZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVy aXZhdGl2ZSB3b3JrcyBvZiB0aGUKKyAqIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBh cnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCisgKiBkbyBzbywgYWxs IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKKyAqCisgKiBUaGUgY29weXJpZ2h0IG5vdGljZXMg aW4gdGhlIFNvZnR3YXJlIGFuZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZworICog dGhlIGFib3ZlIGxpY2Vuc2UgZ3JhbnQsIHRoaXMgcmVzdHJpY3Rpb24gYW5kIHRoZSBmb2xsb3dp bmcgZGlzY2xhaW1lciwKKyAqIG11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGFuZAorICogYWxsIGRlcml2YXRpdmUgd29y a3Mgb2YgdGhlIFNvZnR3YXJlLCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQorICog d29ya3MgYXJlIHNvbGVseSBpbiB0aGUgZm9ybSBvZiBtYWNoaW5lLWV4ZWN1dGFibGUgb2JqZWN0 IGNvZGUgZ2VuZXJhdGVkIGJ5CisgKiBhIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuCisgKgor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBF VkVOVAorICogU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJ TkcgVEhFIFNPRlRXQVJFIEJFIExJQUJMRQorICogRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklT SU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRI RSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworc3RhdGlj IHZvaWQKK3JhZGl4X3NvcnRfdHVwbGUoU29ydFR1cGxlICpiZWdpbiwgc2l6ZV90IG5fZWxlbXMs IGludCBsZXZlbCwgVHVwbGVzb3J0c3RhdGUgKnN0YXRlKQoreworCVJhZGl4UGFydGl0aW9uSW5m byBwYXJ0aXRpb25zWzI1Nl0gPSB7MH07CisJdWludDgJCXJlbWFpbmluZ19wYXJ0aXRpb25zWzI1 Nl07CisJc2l6ZV90CQl0b3RhbCA9IDA7CisJaW50CQkJbnVtX3BhcnRpdGlvbnMgPSAwOworCWlu dAkJCW51bV9yZW1haW5pbmc7CisJU29ydFN1cHBvcnQgc3N1cCA9ICZzdGF0ZS0+YmFzZS5zb3J0 S2V5c1swXTsKKwlzaXplX3QJCXN0YXJ0X29mZnNldCA9IDA7CisJU29ydFR1cGxlICAqcGFydGl0 aW9uX2JlZ2luID0gYmVnaW47CisKKwkvKiBjb3VudCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Yg ZWFjaCBieXRlICovCisJZm9yIChTb3J0VHVwbGUgKnN0ID0gYmVnaW47IHN0IDwgYmVnaW4gKyBu X2VsZW1zOyBzdCsrKQorCXsKKwkJdWludDgJCXRoaXNfcGFydGl0aW9uOworCisJCS8qIGV4dHJh Y3QgdGhlIGJ5dGUgZm9yIHRoaXMgbGV2ZWwgZnJvbSB0aGUgbm9ybWFsaXplZCBkYXR1bSAqLwor CQl0aGlzX3BhcnRpdGlvbiA9IGN1cnJlbnRfYnl0ZShub3JtYWxpemVfZGF0dW0oc3QtPmRhdHVt MSwgc3N1cCksCisJCQkJCQkJCQkgIGxldmVsKTsKKworCQkvKiBzYXZlIGl0IGZvciB0aGUgcGVy bXV0YXRpb24gc3RlcCAqLworCQlzdC0+Y3VyYnl0ZSA9IHRoaXNfcGFydGl0aW9uOworCisJCXBh cnRpdGlvbnNbdGhpc19wYXJ0aXRpb25dLmNvdW50Kys7CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQ VFMoKTsKKwl9CisKKwkvKiBjb21wdXRlIHBhcnRpdGlvbiBvZmZzZXRzICovCisJZm9yIChpbnQg aSA9IDA7IGkgPCAyNTY7IGkrKykKKwl7CisJCXNpemVfdAkJY291bnQgPSBwYXJ0aXRpb25zW2ld LmNvdW50OworCisJCWlmIChjb3VudCAhPSAwKQorCQl7CisJCQlwYXJ0aXRpb25zW2ldLm9mZnNl dCA9IHRvdGFsOworCQkJdG90YWwgKz0gY291bnQ7CisJCQlyZW1haW5pbmdfcGFydGl0aW9uc1tu dW1fcGFydGl0aW9uc10gPSBpOworCQkJbnVtX3BhcnRpdGlvbnMrKzsKKwkJfQorCQlwYXJ0aXRp b25zW2ldLm5leHRfb2Zmc2V0ID0gdG90YWw7CisJfQorCisJLyoKKwkgKiBTd2FwIHR1cGxlcyB0 byBjb3JyZWN0IHBhcnRpdGlvbi4KKwkgKgorCSAqIEluIHRyYWRpdGlvbmFsIEFtZXJpY2FuIGZs YWcgc29ydCwgYSBzd2FwIHNlbmRzIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8KKwkgKiB0aGUgY29y cmVjdCBwYXJ0aXRpb24sIGJ1dCB0aGUgYXJyYXkgcG9pbnRlciBvbmx5IGFkdmFuY2VzIGlmIHRo ZQorCSAqIHBhcnRuZXIgb2YgdGhlIHN3YXAgaGFwcGVucyB0byBiZSBhbiBlbGVtZW50IHRoYXQg YmVsb25ncyB0byB0aGUKKwkgKiBjdXJyZW50IHBhcnRpdGlvbi4gVGhhdCBvbmx5IHJlcXVpcmVz IG9uZSBwYXNzIHRocm91Z2ggdGhlIGFycmF5LCBidXQKKwkgKiB0aGUgZGlzYWR2YW50YWdlIGlz IHdlIGRvbid0IGtub3cgaWYgdGhlIHBvaW50ZXIgY2FuIGFkdmFuY2UgdW50aWwgdGhlCisJICog c3dhcCBjb21wbGV0ZXMuIEhlcmUgbGllcyB0aGUgbW9zdCBpbnRlcmVzdGluZyBpbm5vdmF0aW9u IGZyb20gdGhlCisJICogdXBzdHJlYW0gc2thX2J5dGVfc29ydDogQWZ0ZXIgaW5pdGlhdGluZyB0 aGUgc3dhcCwgd2UgaW1tZWRpYXRlbHkKKwkgKiBwcm9jZWVkIHRvIHRoZSBuZXh0IGVsZW1lbnQu IFRoaXMgbWFrZXMgYmV0dGVyIHVzZSBvZiBDUFUgcGlwZWxpbmluZywKKwkgKiBidXQgYWxzbyBt ZWFucyB0aGF0IHdlIHdpbGwgb2Z0ZW4gbmVlZCBtdWx0aXBsZSBpdGVyYXRpb25zIG9mIHRoaXMK KwkgKiBsb29wLiBza2FfYnl0ZV9zb3J0KCkgbWFpbnRhaW5zIGEgc2VwYXJhdGUgbGlzdCBvZiB3 aGljaCBwYXJ0aXRpb25zCisJICogaGF2ZW4ndCBmaW5pc2hlZCwgd2hpY2ggaXMgdXBkYXRlZCBl dmVyeSBsb29wIGl0ZXJhdGlvbi4gSGVyZSB3ZSBzaW1wbHkKKwkgKiBjaGVjayBlYWNoIHBhcnRp dGlvbiBkdXJpbmcgZXZlcnkgaXRlcmF0aW9uLgorCSAqCisJICogSWYgd2Ugc3RhcnRlZCB3aXRo IGEgc2luZ2xlIHBhcnRpdGlvbiwgdGhlcmUgaXMgbm90aGluZyB0byBkby4gSWYgYQorCSAqIHBy ZXZpb3VzIGxvb3AgaXRlcmF0aW9uIHJlc3VsdHMgaW4gb25seSBvbmUgcGFydGl0aW9uIHRoYXQg aGFzbid0IGJlZW4KKwkgKiBjb3VudGVkIGFzIHNvcnRlZCwgd2Uga25vdyBpdCdzIGFjdHVhbGx5 IHNvcnRlZCBhbmQgY2FuIGV4aXQgdGhlIGxvb3AuCisJICovCisJbnVtX3JlbWFpbmluZyA9IG51 bV9wYXJ0aXRpb25zOworCXdoaWxlIChudW1fcmVtYWluaW5nID4gMSkKKwl7CisJCS8qIHN0YXJ0 IHRoZSBjb3VudCBvdmVyICovCisJCW51bV9yZW1haW5pbmcgPSBudW1fcGFydGl0aW9uczsKKwor CQlmb3IgKGludCBpID0gMDsgaSA8IG51bV9wYXJ0aXRpb25zOyBpKyspCisJCXsKKwkJCXVpbnQ4 CQlpZHggPSByZW1haW5pbmdfcGFydGl0aW9uc1tpXTsKKworCQkJZm9yIChTb3J0VHVwbGUgKnN0 ID0gYmVnaW4gKyBwYXJ0aXRpb25zW2lkeF0ub2Zmc2V0OworCQkJCSBzdCA8IGJlZ2luICsgcGFy dGl0aW9uc1tpZHhdLm5leHRfb2Zmc2V0OworCQkJCSBzdCsrKQorCQkJeworCQkJCXNpemVfdAkJ b2Zmc2V0ID0gcGFydGl0aW9uc1tzdC0+Y3VyYnl0ZV0ub2Zmc2V0Kys7CisJCQkJU29ydFR1cGxl CXRtcDsKKworCQkJCS8qIHN3YXAgY3VycmVudCB0dXBsZSB3aXRoIGRlc3RpbmF0aW9uIHBvc2l0 aW9uICovCisJCQkJQXNzZXJ0KG9mZnNldCA8IG5fZWxlbXMpOworCQkJCXRtcCA9ICpzdDsKKwkJ CQkqc3QgPSBiZWdpbltvZmZzZXRdOworCQkJCWJlZ2luW29mZnNldF0gPSB0bXA7CisKKwkJCQlD SEVDS19GT1JfSU5URVJSVVBUUygpOworCQkJfTsKKworCQkJLyogY291bnQgc29ydGVkIHBhcnRp dGlvbnMgKi8KKwkJCWlmIChwYXJ0aXRpb25zW2lkeF0ub2Zmc2V0ID09IHBhcnRpdGlvbnNbaWR4 XS5uZXh0X29mZnNldCkKKwkJCQludW1fcmVtYWluaW5nLS07CisJCX0KKwl9CisKKwkvKiByZWN1 cnNlICovCisJZm9yICh1aW50OCAqcnAgPSByZW1haW5pbmdfcGFydGl0aW9uczsKKwkJIHJwIDwg cmVtYWluaW5nX3BhcnRpdGlvbnMgKyBudW1fcGFydGl0aW9uczsKKwkJIHJwKyspCisJeworCQlz aXplX3QJCWVuZF9vZmZzZXQgPSBwYXJ0aXRpb25zWypycF0ubmV4dF9vZmZzZXQ7CisJCVNvcnRU dXBsZSAgKnBhcnRpdGlvbl9lbmQgPSBiZWdpbiArIGVuZF9vZmZzZXQ7CisJCXB0cmRpZmZfdAlu dW1fZWxlbWVudHMgPSBlbmRfb2Zmc2V0IC0gc3RhcnRfb2Zmc2V0OworCisJCWlmIChudW1fZWxl bWVudHMgPiAxKQorCQl7CisJCQlpZiAobGV2ZWwgPCBTSVpFT0ZfREFUVU0gLSAxKQorCQkJewor CQkJCWlmIChudW1fZWxlbWVudHMgPiBSQURJWF9TT1JUX1RIUkVTSE9MRCkKKwkJCQl7CisJCQkJ CXJhZGl4X3NvcnRfdHVwbGUocGFydGl0aW9uX2JlZ2luLAorCQkJCQkJCQkJIG51bV9lbGVtZW50 cywKKwkJCQkJCQkJCSBsZXZlbCArIDEsCisJCQkJCQkJCQkgc3RhdGUpOworCQkJCX0KKwkJCQll bHNlCisJCQkJeworCQkJCQlxc29ydF90dXBsZShwYXJ0aXRpb25fYmVnaW4sCisJCQkJCQkJCW51 bV9lbGVtZW50cywKKwkJCQkJCQkJc3RhdGUtPmJhc2UuY29tcGFyZXR1cCwKKwkJCQkJCQkJc3Rh dGUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHN0YXRlLT5iYXNlLm9ubHlLZXkgPT0gTlVM TCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFdlJ3ZlIGZpbmlzaGVkIHJhZGl4IHNvcnQgb24gYWxs IGJ5dGVzIG9mIHRoZSBwYXNzLWJ5LXZhbHVlCisJCQkJICogZGF0dW0gKHBvc3NpYmx5IGFiYnJl dmlhdGVkKSwgbm93IHNvcnQgdXNpbmcgdGhlIHRpZWJyZWFrCisJCQkJICogY29tcGFyYXRvci4K KwkJCQkgKi8KKwkJCQlxc29ydF90dXBsZShwYXJ0aXRpb25fYmVnaW4sCisJCQkJCQkJbnVtX2Vs ZW1lbnRzLAorCQkJCQkJCXN0YXRlLT5iYXNlLmNvbXBhcmV0dXBfdGllYnJlYWssCisJCQkJCQkJ c3RhdGUpOworCQkJfQorCQl9CisKKwkJc3RhcnRfb2Zmc2V0ID0gZW5kX29mZnNldDsKKwkJcGFy dGl0aW9uX2JlZ2luID0gcGFydGl0aW9uX2VuZDsKKwl9Cit9CisKKy8qCisgKiBQYXJ0aXRpb24g dHVwbGVzIGJ5IE5VTEwgYW5kIE5PVCBOVUxMIGZpcnN0IHNvcnQga2V5LgorICogVGhlbiBkaXNw YXRjaCB0byBlaXRoZXIgcmFkaXggc29ydCBvciBxc29ydC4KKyAqLworc3RhdGljIHZvaWQKK3Nv cnRfYnl2YWx1ZV9kYXR1bShTb3J0VHVwbGUgKmRhdGEsIHNpemVfdCBuLCBUdXBsZXNvcnRzdGF0 ZSAqc3RhdGUpCit7CisJYm9vbAkJbnVsbHNfZmlyc3QgPSBzdGF0ZS0+YmFzZS5zb3J0S2V5c1sw XS5zc3VwX251bGxzX2ZpcnN0OworCVNvcnRUdXBsZSAgKm51bGxfc3RhcnQ7CisJU29ydFR1cGxl ICAqbm90X251bGxfc3RhcnQ7CisJc2l6ZV90CQlkMSA9IDAsCisJCQkJZDIsCisJCQkJbnVsbF9j b3VudCwKKwkJCQlub3RfbnVsbF9jb3VudDsKKwlib29sCQlwcmVzb3J0ZWQgPSB0cnVlOworCisJ LyogcHJlc29ydGVkIGNoZWNrICovCisJZm9yIChTb3J0VHVwbGUgKnN0ID0gZGF0YSArIDE7IHN0 IDwgZGF0YSArIG47IHN0KyspCisJeworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCWlm IChDT01QQVJFVFVQKHN0YXRlLCBzdCAtIDEsIHN0KSA+IDApCisJCXsKKwkJCXByZXNvcnRlZCA9 IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHByZXNvcnRlZCkKKwkJcmV0dXJuOwor CisJLyoKKwkgKiBQYXJ0aXRpb24gYnkgTlVMTC1uZXNzIG9mIHRoZSBsZWFkaW5nIHNvcnQga2V5 LCBzaW5jZSB3ZSBjYW4gb25seSByYWRpeAorCSAqIHNvcnQgb24gTk9UIE5VTEwgcGFzcy1ieS12 YWx1ZSBkYXR1bXMuCisJICovCisKKwkvKgorCSAqIEZpbmQgdGhlIGZpcnN0IE5PVCBOVUxMIHR1 cGxlIGlmIE5VTExTIEZJUlNULCBvciBmaXJzdCBOVUxMIGVsZW1lbnQgaWYKKwkgKiBOVUxMUyBM QVNULiBUaGlzIGlzIGEgcXVpY2sgY2hlY2sgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhbGwg dHVwbGVzCisJICogYXJlIE5PVCBOVUxMIGluIHRoZSBmaXJzdCBzb3J0IGtleS4KKwkgKi8KKwl3 aGlsZSAoZDEgPCBuICYmIGRhdGFbZDFdLmlzbnVsbDEgPT0gbnVsbHNfZmlyc3QpCisJCWQxKys7 CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB0dXBsZSBsZWZ0IGFmdGVyIHRo ZSBxdWljayBjaGVjaywgcGFydGl0aW9uCisJICogdGhlIHJlbWFpbmRlciB1c2luZyBicmFuY2hs ZXNzIGN5Y2xpYyBwZXJtdXRhdGlvbiwgYmFzZWQgb24KKwkgKiBodHRwczovL29ybHAubmV0L2Js b2cvYnJhbmNobGVzcy1sb211dG8tcGFydGl0aW9uaW5nLworCSAqLworCWlmIChkMSA8IG4gLSAx KQorCXsKKwkJc2l6ZV90CQlqID0gZDE7CQkvKiBmb3J3YXJkIGluZGV4ICovCisJCVNvcnRUdXBs ZQlzYXZlID0gZGF0YVtkMV07CS8qIGNyZWF0ZSBnYXAgYXQgZnJvbnQgKi8KKworCQl3aGlsZSAo aiA8IG4gLSAxKQorCQl7CisJCQkvKiBnYXAgaXMgYXQgaiwgbW92ZSBkMSdzIGVsZW1lbnQgdG8g Z2FwICovCisJCQlkYXRhW2pdID0gZGF0YVtkMV07CisKKwkJCS8qIGFkdmFuY2UgaiB0byBmaXJz dCB1bmtub3duIGVsZW1lbnQgKi8KKwkJCWogKz0gMTsKKworCQkJLyogbW92ZSBqJ3MgZWxlbWVu dCBiYWNrIHRvIGQxICovCisJCQlkYXRhW2QxXSA9IGRhdGFbal07CisKKwkJCS8qIGFkdmFuY2Ug ZDEgaWYgdGhlIGVsZW1lbnQgYmVsb25ncyBpbiB0aGUgbGVmdCBwYXJ0aXRpb24gKi8KKwkJCWQx ICs9IChkYXRhW2QxXS5pc251bGwxID09IG51bGxzX2ZpcnN0KTsKKwkJfQorCisJCS8qIHBsYWNl IGdhcCBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IHBhcnRpdGlvbnMgKi8KKwkJZGF0YVtqXSA9IGRh dGFbZDFdOworCisJCS8qIHJlc3RvcmUgdGhlIHNhdmVkIGVsZW1lbnQgKi8KKwkJZGF0YVtkMV0g PSBzYXZlOworCisJCS8qIGFzc2lnbiBpdCB0byB0aGUgY29ycmVjdCBwYXJ0aXRpb24gKi8KKwkJ ZDEgKz0gKGRhdGFbZDFdLmlzbnVsbDEgPT0gbnVsbHNfZmlyc3QpOworCX0KKworCS8qIGQxIGlz IG5vdyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsZWZ0IHBhcnRpdGlvbiAqLworCWQy ID0gbiAtIGQxOworCisJLyogc2V0IHBvaW50ZXJzIGFuZCBjb3VudHMgZm9yIGVhY2ggcGFydGl0 aW9uICovCisJaWYgKG51bGxzX2ZpcnN0KQorCXsKKwkJbnVsbF9zdGFydCA9IHN0YXRlLT5tZW10 dXBsZXM7CisJCW51bGxfY291bnQgPSBkMTsKKwkJbm90X251bGxfc3RhcnQgPSBzdGF0ZS0+bWVt dHVwbGVzICsgZDE7CisJCW5vdF9udWxsX2NvdW50ID0gZDI7CisJfQorCWVsc2UKKwl7CisJCW5v dF9udWxsX3N0YXJ0ID0gc3RhdGUtPm1lbXR1cGxlczsKKwkJbm90X251bGxfY291bnQgPSBkMTsK KwkJbnVsbF9zdGFydCA9IHN0YXRlLT5tZW10dXBsZXMgKyBkMTsKKwkJbnVsbF9jb3VudCA9IGQy OworCX0KKworCWZvciAoU29ydFR1cGxlICpzdCA9IG51bGxfc3RhcnQ7CisJCSBzdCA8IG51bGxf c3RhcnQgKyBudWxsX2NvdW50OworCQkgc3QrKykKKwkJQXNzZXJ0KHN0LT5pc251bGwxID09IHRy dWUpOworCWZvciAoU29ydFR1cGxlICpzdCA9IG5vdF9udWxsX3N0YXJ0OworCQkgc3QgPCBub3Rf bnVsbF9zdGFydCArIG5vdF9udWxsX2NvdW50OworCQkgc3QrKykKKwkJQXNzZXJ0KHN0LT5pc251 bGwxID09IGZhbHNlKTsKKworCS8qCisJICogU29ydCB0aGUgTlVMTCBwYXJ0aXRpb24gdXNpbmcg dGllYnJlYWsgY29tcGFyYXRvciwgaWYgbmVjZXNzYXJ5LiBUaGlzCisJICogd2lsbCByZXBlYXQg dGhlIGNvbXBhcmlzb24gb24gaXNudWxsMSBmb3IgYWJicmV2aWF0ZWQga2V5cywgYnV0IGl0J3MK KwkgKiBub3Qgd29ydGggYWRkaW5nIGNvbXBsZXhpdHkgdG8gYXZvaWQgdGhhdC4KKwkgKi8KKwlp ZiAoc3RhdGUtPmJhc2Uub25seUtleSA9PSBOVUxMICYmIG51bGxfY291bnQgPiAxKQorCXsKKwkJ cXNvcnRfdHVwbGUobnVsbF9zdGFydCwKKwkJCQkJbnVsbF9jb3VudCwKKwkJCQkJc3RhdGUtPmJh c2UuY29tcGFyZXR1cF90aWVicmVhaywKKwkJCQkJc3RhdGUpOworCX0KKworCS8qCisJICogU29y dCB0aGUgTk9UIE5VTEwgcGFydGl0aW9uLCB1c2luZyByYWRpeCBzb3J0IGlmIGxhcmdlIGVub3Vn aCwKKwkgKiBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHF1aWNrc29ydC4KKwkgKi8KKwlpZiAobm90 X251bGxfY291bnQgPiAxKQorCXsKKwkJaWYgKG5vdF9udWxsX2NvdW50ID4gUkFESVhfU09SVF9U SFJFU0hPTEQpCisJCXsKKwkJCXJhZGl4X3NvcnRfdHVwbGUobm90X251bGxfc3RhcnQsCisJCQkJ CQkJIG5vdF9udWxsX2NvdW50LAorCQkJCQkJCSAwLAorCQkJCQkJCSBzdGF0ZSk7CisJCX0KKwkJ ZWxzZQorCQl7CisJCQlxc29ydF90dXBsZShub3RfbnVsbF9zdGFydCwKKwkJCQkJCW5vdF9udWxs X2NvdW50LAorCQkJCQkJc3RhdGUtPmJhc2UuY29tcGFyZXR1cCwKKwkJCQkJCXN0YXRlKTsKKwkJ fQorCX0KK30KKworLyogVmVyaWZ5IGluLW1lbW9yeSBzb3J0IHVzaW5nIHN0YW5kYXJkIGNvbXBh cmF0b3IuICovCitzdGF0aWMgdm9pZAordmVyaWZ5X21lbXR1cGxlc19zb3J0ZWQoVHVwbGVzb3J0 c3RhdGUgKnN0YXRlKQoreworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKKwlmb3IgKFNvcnRU dXBsZSAqc3QgPSBzdGF0ZS0+bWVtdHVwbGVzICsgMTsKKwkJIHN0IDwgc3RhdGUtPm1lbXR1cGxl cyArIHN0YXRlLT5tZW10dXBjb3VudDsKKwkJIHN0KyspCisJCUFzc2VydChDT01QQVJFVFVQKHN0 YXRlLCBzdCAtIDEsIHN0KSA8PSAwKTsKKyNlbmRpZgorfQorCiAvKgotICogU29ydCBhbGwgbWVt dHVwbGVzIHVzaW5nIHNwZWNpYWxpemVkIHFzb3J0KCkgcm91dGluZXMuCisgKiBTb3J0IGFsbCBt ZW10dXBsZXMgdXNpbmcgc3BlY2lhbGl6ZWQgcm91dGluZXMuCiAgKgotICogUXVpY2tzb3J0IGlz IHVzZWQgZm9yIHNtYWxsIGluLW1lbW9yeSBzb3J0cywgYW5kIGV4dGVybmFsIHNvcnQgcnVucy4K KyAqIFF1aWNrc29ydCBvciByYWRpeCBzb3J0IGlzIHVzZWQgZm9yIHNtYWxsIGluLW1lbW9yeSBz b3J0cywgYW5kIGV4dGVybmFsIHNvcnQgcnVucy4KICAqLwogc3RhdGljIHZvaWQKIHR1cGxlc29y dF9zb3J0X21lbXR1cGxlcyhUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCkBAIC0yNjY2LDMwICsyOTU1 LDIyIEBAIHR1cGxlc29ydF9zb3J0X21lbXR1cGxlcyhUdXBsZXNvcnRzdGF0ZSAqc3RhdGUpCiAJ aWYgKHN0YXRlLT5tZW10dXBjb3VudCA+IDEpCiAJewogCQkvKgotCQkgKiBEbyB3ZSBoYXZlIHRo ZSBsZWFkaW5nIGNvbHVtbidzIHZhbHVlIG9yIGFiYnJldmlhdGlvbiBpbiBkYXR1bTEsCi0JCSAq IGFuZCBpcyB0aGVyZSBhIHNwZWNpYWxpemF0aW9uIGZvciBpdHMgY29tcGFyYXRvcj8KKwkJICog RG8gd2UgaGF2ZSB0aGUgbGVhZGluZyBjb2x1bW4ncyB2YWx1ZSBvciBhYmJyZXZpYXRpb24gaW4g ZGF0dW0xPwogCQkgKi8KIAkJaWYgKHN0YXRlLT5iYXNlLmhhdmVEYXR1bTEgJiYgc3RhdGUtPmJh c2Uuc29ydEtleXMpCiAJCXsKLQkJCWlmIChzdGF0ZS0+YmFzZS5zb3J0S2V5c1swXS5jb21wYXJh dG9yID09IHNzdXBfZGF0dW1fdW5zaWduZWRfY21wKQotCQkJewotCQkJCXFzb3J0X3R1cGxlX3Vu c2lnbmVkKHN0YXRlLT5tZW10dXBsZXMsCi0JCQkJCQkJCQkgc3RhdGUtPm1lbXR1cGNvdW50LAot CQkJCQkJCQkJIHN0YXRlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIGlmIChzdGF0ZS0+ YmFzZS5zb3J0S2V5c1swXS5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fc2lnbmVkX2NtcCkKKwkJ CVNvcnRTdXBwb3J0RGF0YSBzc3VwID0gc3RhdGUtPmJhc2Uuc29ydEtleXNbMF07CisKKwkJCS8q IERvZXMgaXQgY29tcGFyZSBhcyBhbiBpbnRlZ2VyPyAqLworCQkJaWYgKHN0YXRlLT5tZW10dXBj b3VudCA+IFJBRElYX1NPUlRfVEhSRVNIT0xEICYmCisJCQkJKHNzdXAuY29tcGFyYXRvciA9PSBz c3VwX2RhdHVtX3Vuc2lnbmVkX2NtcCB8fAorCQkJCSBzc3VwLmNvbXBhcmF0b3IgPT0gc3N1cF9k YXR1bV9zaWduZWRfY21wIHx8CisJCQkJIHNzdXAuY29tcGFyYXRvciA9PSBzc3VwX2RhdHVtX2lu dDMyX2NtcCkpCiAJCQl7Ci0JCQkJcXNvcnRfdHVwbGVfc2lnbmVkKHN0YXRlLT5tZW10dXBsZXMs CisJCQkJc29ydF9ieXZhbHVlX2RhdHVtKHN0YXRlLT5tZW10dXBsZXMsCiAJCQkJCQkJCSAgIHN0 YXRlLT5tZW10dXBjb3VudCwKIAkJCQkJCQkJICAgc3RhdGUpOwotCQkJCXJldHVybjsKLQkJCX0K LQkJCWVsc2UgaWYgKHN0YXRlLT5iYXNlLnNvcnRLZXlzWzBdLmNvbXBhcmF0b3IgPT0gc3N1cF9k YXR1bV9pbnQzMl9jbXApCi0JCQl7Ci0JCQkJcXNvcnRfdHVwbGVfaW50MzIoc3RhdGUtPm1lbXR1 cGxlcywKLQkJCQkJCQkJICBzdGF0ZS0+bWVtdHVwY291bnQsCi0JCQkJCQkJCSAgc3RhdGUpOwor CQkJCXZlcmlmeV9tZW10dXBsZXNfc29ydGVkKHN0YXRlKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJ CX0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL2d1Yy5oIGIvc3JjL2luY2x1ZGUvdXRp bHMvZ3VjLmgKaW5kZXggYmYzOTg3OGM0M2UuLmRhZTM1ZGQzZmMwIDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS91dGlscy9ndWMuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9ndWMuaApAQCAtMzI0 LDYgKzMyNCw3IEBAIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgdGNwX3VzZXJfdGltZW91dDsKIGV4 dGVybiBQR0RMTElNUE9SVCBjaGFyICpyb2xlX3N0cmluZzsKIGV4dGVybiBQR0RMTElNUE9SVCBi b29sIGluX2hvdF9zdGFuZGJ5X2d1YzsKIGV4dGVybiBQR0RMTElNUE9SVCBib29sIHRyYWNlX3Nv cnQ7CitleHRlcm4gUEdETExJTVBPUlQgYm9vbCB3aXBfcmFkaXhfc29ydDsKIAogI2lmZGVmIERF QlVHX0JPVU5ERURfU09SVAogZXh0ZXJuIFBHRExMSU1QT1JUIGJvb2wgb3B0aW1pemVfYm91bmRl ZF9zb3J0OwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvc29ydHN1cHBvcnQuaCBiL3Ny Yy9pbmNsdWRlL3V0aWxzL3NvcnRzdXBwb3J0LmgKaW5kZXggMDA4Mzc1NmJiZGIuLmE4ZjhmOWYw MjZhIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9zb3J0c3VwcG9ydC5oCisrKyBiL3Ny Yy9pbmNsdWRlL3V0aWxzL3NvcnRzdXBwb3J0LmgKQEAgLTIyOSwxMDcgKzIyOSw2IEBAIEFwcGx5 U29ydENvbXBhcmF0b3IoRGF0dW0gZGF0dW0xLCBib29sIGlzTnVsbDEsCiAJcmV0dXJuIGNvbXBh cmU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1BcHBseVVuc2lnbmVkU29ydENvbXBhcmF0b3Io RGF0dW0gZGF0dW0xLCBib29sIGlzTnVsbDEsCi0JCQkJCQkJRGF0dW0gZGF0dW0yLCBib29sIGlz TnVsbDIsCi0JCQkJCQkJU29ydFN1cHBvcnQgc3N1cCkKLXsKLQlpbnQJCQljb21wYXJlOwotCi0J aWYgKGlzTnVsbDEpCi0JewotCQlpZiAoaXNOdWxsMikKLQkJCWNvbXBhcmUgPSAwOwkJLyogTlVM TCAiPSIgTlVMTCAqLwotCQllbHNlIGlmIChzc3VwLT5zc3VwX251bGxzX2ZpcnN0KQotCQkJY29t cGFyZSA9IC0xOwkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KLQkJZWxzZQotCQkJY29tcGFyZSA9 IDE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLwotCX0KLQllbHNlIGlmIChpc051bGwyKQotCXsK LQkJaWYgKHNzdXAtPnNzdXBfbnVsbHNfZmlyc3QpCi0JCQljb21wYXJlID0gMTsJCS8qIE5PVF9O VUxMICI+IiBOVUxMICovCi0JCWVsc2UKLQkJCWNvbXBhcmUgPSAtMTsJCS8qIE5PVF9OVUxMICI8 IiBOVUxMICovCi0JfQotCWVsc2UKLQl7Ci0JCWNvbXBhcmUgPSBkYXR1bTEgPCBkYXR1bTIgPyAt MSA6IGRhdHVtMSA+IGRhdHVtMiA/IDEgOiAwOwotCQlpZiAoc3N1cC0+c3N1cF9yZXZlcnNlKQot CQkJSU5WRVJUX0NPTVBBUkVfUkVTVUxUKGNvbXBhcmUpOwotCX0KLQotCXJldHVybiBjb21wYXJl OwotfQotCi1zdGF0aWMgaW5saW5lIGludAotQXBwbHlTaWduZWRTb3J0Q29tcGFyYXRvcihEYXR1 bSBkYXR1bTEsIGJvb2wgaXNOdWxsMSwKLQkJCQkJCSAgRGF0dW0gZGF0dW0yLCBib29sIGlzTnVs bDIsCi0JCQkJCQkgIFNvcnRTdXBwb3J0IHNzdXApCi17Ci0JaW50CQkJY29tcGFyZTsKLQotCWlm IChpc051bGwxKQotCXsKLQkJaWYgKGlzTnVsbDIpCi0JCQljb21wYXJlID0gMDsJCS8qIE5VTEwg Ij0iIE5VTEwgKi8KLQkJZWxzZSBpZiAoc3N1cC0+c3N1cF9udWxsc19maXJzdCkKLQkJCWNvbXBh cmUgPSAtMTsJCS8qIE5VTEwgIjwiIE5PVF9OVUxMICovCi0JCWVsc2UKLQkJCWNvbXBhcmUgPSAx OwkJLyogTlVMTCAiPiIgTk9UX05VTEwgKi8KLQl9Ci0JZWxzZSBpZiAoaXNOdWxsMikKLQl7Ci0J CWlmIChzc3VwLT5zc3VwX251bGxzX2ZpcnN0KQotCQkJY29tcGFyZSA9IDE7CQkvKiBOT1RfTlVM TCAiPiIgTlVMTCAqLwotCQllbHNlCi0JCQljb21wYXJlID0gLTE7CQkvKiBOT1RfTlVMTCAiPCIg TlVMTCAqLwotCX0KLQllbHNlCi0JewotCQljb21wYXJlID0gRGF0dW1HZXRJbnQ2NChkYXR1bTEp IDwgRGF0dW1HZXRJbnQ2NChkYXR1bTIpID8gLTEgOgotCQkJRGF0dW1HZXRJbnQ2NChkYXR1bTEp ID4gRGF0dW1HZXRJbnQ2NChkYXR1bTIpID8gMSA6IDA7Ci0JCWlmIChzc3VwLT5zc3VwX3JldmVy c2UpCi0JCQlJTlZFUlRfQ09NUEFSRV9SRVNVTFQoY29tcGFyZSk7Ci0JfQotCi0JcmV0dXJuIGNv bXBhcmU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1BcHBseUludDMyU29ydENvbXBhcmF0b3Io RGF0dW0gZGF0dW0xLCBib29sIGlzTnVsbDEsCi0JCQkJCQkgRGF0dW0gZGF0dW0yLCBib29sIGlz TnVsbDIsCi0JCQkJCQkgU29ydFN1cHBvcnQgc3N1cCkKLXsKLQlpbnQJCQljb21wYXJlOwotCi0J aWYgKGlzTnVsbDEpCi0JewotCQlpZiAoaXNOdWxsMikKLQkJCWNvbXBhcmUgPSAwOwkJLyogTlVM TCAiPSIgTlVMTCAqLwotCQllbHNlIGlmIChzc3VwLT5zc3VwX251bGxzX2ZpcnN0KQotCQkJY29t cGFyZSA9IC0xOwkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KLQkJZWxzZQotCQkJY29tcGFyZSA9 IDE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLwotCX0KLQllbHNlIGlmIChpc051bGwyKQotCXsK LQkJaWYgKHNzdXAtPnNzdXBfbnVsbHNfZmlyc3QpCi0JCQljb21wYXJlID0gMTsJCS8qIE5PVF9O VUxMICI+IiBOVUxMICovCi0JCWVsc2UKLQkJCWNvbXBhcmUgPSAtMTsJCS8qIE5PVF9OVUxMICI8 IiBOVUxMICovCi0JfQotCWVsc2UKLQl7Ci0JCWNvbXBhcmUgPSBEYXR1bUdldEludDMyKGRhdHVt MSkgPCBEYXR1bUdldEludDMyKGRhdHVtMikgPyAtMSA6Ci0JCQlEYXR1bUdldEludDMyKGRhdHVt MSkgPiBEYXR1bUdldEludDMyKGRhdHVtMikgPyAxIDogMDsKLQkJaWYgKHNzdXAtPnNzdXBfcmV2 ZXJzZSkKLQkJCUlOVkVSVF9DT01QQVJFX1JFU1VMVChjb21wYXJlKTsKLQl9Ci0KLQlyZXR1cm4g Y29tcGFyZTsKLX0KLQogLyoKICAqIEFwcGx5IGEgc29ydCBjb21wYXJhdG9yIGZ1bmN0aW9uIGFu ZCByZXR1cm4gYSAzLXdheSBjb21wYXJpc29uIHVzaW5nIGZ1bGwsCiAgKiBhdXRob3JpdGF0aXZl IGNvbXBhcmF0b3IuICBUaGlzIHRha2VzIGNhcmUgb2YgaGFuZGxpbmcgcmV2ZXJzZS1zb3J0IGFu ZApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvdHVwbGVzb3J0LmggYi9zcmMvaW5jbHVk ZS91dGlscy90dXBsZXNvcnQuaAppbmRleCA1ZmUyMjllMjExYi4uZGE2OGY0NWFjZjIgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3R1cGxlc29ydC5oCisrKyBiL3NyYy9pbmNsdWRlL3V0 aWxzL3R1cGxlc29ydC5oCkBAIC0xMTYsNiArMTE2LDcgQEAgdHlwZWRlZiBzdHJ1Y3QKIAl2b2lk CSAgICp0dXBsZTsJCQkvKiB0aGUgdHVwbGUgaXRzZWxmICovCiAJRGF0dW0JCWRhdHVtMTsJCQkv KiB2YWx1ZSBvZiBmaXJzdCBrZXkgY29sdW1uICovCiAJYm9vbAkJaXNudWxsMTsJCS8qIGlzIGZp cnN0IGtleSBjb2x1bW4gTlVMTD8gKi8KKwl1aW50OAkJY3VyYnl0ZTsJCS8qIGNodW5rIG9mIGRh dHVtMSBmb3IgY3VycmVudCByYWRpeCBzb3J0IHBhc3MgKi8KIAlpbnQJCQlzcmN0YXBlOwkJLyog c291cmNlIHRhcGUgbnVtYmVyICovCiB9IFNvcnRUdXBsZTsKIApkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC90dXBsZXNvcnQub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC90dXBsZXNvcnQub3V0CmluZGV4IDZkZDk3ZTc0MjdhLi5mYzEzMjFiZjQ0MyAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC90dXBsZXNvcnQub3V0CisrKyBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHVwbGVzb3J0Lm91dApAQCAtMzA0LDkgKzMwNCw5IEBAIEZS T00gYWJicmV2X2Fib3J0X3V1aWRzCiBPUkRFUiBCWSBjdGlkIERFU0MgTElNSVQgNTsKICAgaWQg ICB8ICAgICAgICAgICBhYm9ydF9pbmNyZWFzaW5nICAgICAgICAgICB8ICAgICAgICAgICBhYm9y dF9kZWNyZWFzaW5nICAgICAgICAgICB8ICAgICAgICAgIG5vYWJvcnRfaW5jcmVhc2luZyAgICAg ICAgICB8ICAgICAgICAgIG5vYWJvcnRfZGVjcmVhc2luZyAgICAgICAgICAKIC0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgMCB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAogIDIw MDAyIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgCiAgMjAwMDMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAKKyAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAogIDEwMDA5IHwgMDAwMDAwMDAt MDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA4IHwgMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAw MDAwMDA5OTkyIHwgMDAwMTAwMDgtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA4IHwgMDAwMDk5 OTItMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkyCiAgMTAwMDggfCAwMDAwMDAwMC0wMDAwLTAw MDAtMDAwMC0wMDAwMDAwMTAwMDcgfCAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDk5 OTMgfCAwMDAxMDAwNy0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMTAwMDcgfCAwMDAwOTk5My0wMDAw LTAwMDAtMDAwMC0wMDAwMDAwMDk5OTMKICg1IHJvd3MpCkBAIC0zMzUsOSArMzM1LDkgQEAgRlJP TSBhYmJyZXZfYWJvcnRfdXVpZHMKIE9SREVSIEJZIGN0aWQgREVTQyBMSU1JVCA1OwogICBpZCAg IHwgICAgICAgICAgIGFib3J0X2luY3JlYXNpbmcgICAgICAgICAgIHwgICAgICAgICAgIGFib3J0 X2RlY3JlYXNpbmcgICAgICAgICAgIHwgICAgICAgICAgbm9hYm9ydF9pbmNyZWFzaW5nICAgICAg ICAgIHwgICAgICAgICAgbm9hYm9ydF9kZWNyZWFzaW5nICAgICAgICAgIAogLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAwIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCi0gMjAw MDMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAKICAyMDAwMiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IAorIDIwMDAzIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCisgICAgIDAgfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKICAgOTk5 MyB8IDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwOTk5MiB8IDAwMDAwMDAwLTAwMDAt MDAwMC0wMDAwLTAwMDAwMDAxMDAwOCB8IDAwMDA5OTkyLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAw OTk5MiB8IDAwMDEwMDA4LTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAxMDAwOAogICA5OTk0IHwgMDAw MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkzIHwgMDAwMDAwMDAtMDAwMC0wMDAwLTAw MDAtMDAwMDAwMDEwMDA3IHwgMDAwMDk5OTMtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDA5OTkzIHwg MDAwMTAwMDctMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDEwMDA3CiAoNSByb3dzKQpkaWZmIC0tZ2l0 IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQv dHlwZWRlZnMubGlzdAppbmRleCAxNGRlYzJkNDljMS4uMGM0ZTk1MTExNTEgMTAwNjQ0Ci0tLSBh L3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVu dC90eXBlZGVmcy5saXN0CkBAIC00MDQ4LDYgKzQwNDgsNyBAQCBxc29ydF9jb21wYXJhdG9yCiBx dWVyeV9wYXRoa2V5c19jYWxsYmFjawogcmFkaXVzX2F0dHJpYnV0ZQogcmFkaXVzX3BhY2tldAor UmFkaXhQYXJ0aXRpb25JbmZvCiByYW5nZVRhYmxlRW50cnlfdXNlZF9jb250ZXh0CiByYW5rX2Nv bnRleHQKIHJidF9hbGxvY2Z1bmMKLS0gCjIuNTIuMAoK --000000000000d4a0eb0648e032a8--