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 1vN2jS-009Suh-0d for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Nov 2025 05:33:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vN2jQ-00DbKV-2a for pgsql-hackers@arkaria.postgresql.org; Sun, 23 Nov 2025 05:33:53 +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 1vN2jQ-00DbKM-1M for pgsql-hackers@lists.postgresql.org; Sun, 23 Nov 2025 05:33:52 +0000 Received: from mail-japanwestazolkn19011008.outbound.protection.outlook.com ([52.103.66.8] helo=OS0P286CU010.outbound.protection.outlook.com) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vN2jO-0010qR-1z for pgsql-hackers@lists.postgresql.org; Sun, 23 Nov 2025 05:33:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GOMjpFawOCLr7rT1D0O+LwWb/qmpmJ8dM/JAGYKK9ZIWv6X4OdjMutLnMjeymwlNBsNNe4q/IGNXVeHpZOceeewnF/S0Q2q6uI2P/wQvXBiyDl6B2ml46Er9pMZ/8u3tquXPkSxzUOwgKoz0+xvhny+pbUf0VbkF/z1+/mLw5lPn5mbqekzrBC5+Me6kgpAzpHApvKQwuHFW2drdjrtZEaqes/3WeO9BGnBG8V6J/lPlyc5auPuHQlWR619+BxQsLJrOzLSllZU2D88tvgcrbeybdxH622HvyB/FMs9c9xog0J3kIBoMBtsTKmcPWMrcD5OuASysbExHpwpOCePriQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JoyaA2wsJp4y82UtxiAxrIo8fPt49eYqs+aRRDuEcbw=; b=QuTJMIUAdpuJTFJ2cuNtCRVy3EMgI+Si3kiyu6eL6Ce8IhHIEAA/dyu0I06hKpnJO3N3WOhhs3UHkT3ufv+knmzzPxuUv/jzZczyqkmHgevuEPgc9oPC6oAVp6ADlgSmo2WOxvbboqvs7JBsMRyspxZKdqw8h7U4JmDi4dQ94MkBuiLrXIvT+XnOoHuQgN0pWeeirsrBr3MIluHR8MPevRgpNIblU1RJvSyWNLG3NIlckgudwfLNVGOSlM4BKA86WYVZvf2Cygp8nJ9TK+ugBFZsxUa8YEqvt9oSVyOdNhLJj1LVJLGSCuk13slU5nVGHvS/hTA70LZCAiyOUM13mg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JoyaA2wsJp4y82UtxiAxrIo8fPt49eYqs+aRRDuEcbw=; b=LGLT+1lufZ+RjE/rCHziQ/mNM/lnQNxWZPZjLoLSpxbDkMtp+uEpRjXDjT7y8kaPzKMsOUQXcXSeW6wTLGFQa664yWrwcN8PmGzRCS549OXTUtfZY2gfNqOnkHBMQEJ+AWNXLRQDPh66KnJzY7HQ6XMBK62c2hQRkbDTuB1TT0OT+85jGFNvKjlnJOTwH6hU0UBaICG/20sMzK8+If+GOFaMwyLEhnDPuSsDUDW/NE9BzSd6dFd0i0F9iXWaCihJ418E+q/Fso4+xcVEJ5RvGHjQEbWpX3P/Clq7JBhHNUnmPfXK+LfQ8PY6v6gdkfh+XNUjgRFsrmXszr02nGDvAg== Received: from TYYPR01MB14116.jpnprd01.prod.outlook.com (2603:1096:405:212::9) by TY4PR01MB17197.jpnprd01.prod.outlook.com (2603:1096:405:334::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.8; Sun, 23 Nov 2025 05:33:44 +0000 Received: from TYYPR01MB14116.jpnprd01.prod.outlook.com ([fe80::31dd:4ff2:eea8:c663]) by TYYPR01MB14116.jpnprd01.prod.outlook.com ([fe80::31dd:4ff2:eea8:c663%7]) with mapi id 15.20.9366.005; Sun, 23 Nov 2025 05:33:44 +0000 From: Chengpeng Yan To: John Naylor CC: "pgsql-hackers@lists.postgresql.org" , Peter Geoghegan Subject: Re: tuple radix sort Thread-Topic: tuple radix sort Thread-Index: AQHcSJ1LLiXE1YSjHE+hUcicuzPN/LTg+SmAgA4uRYCAELzGgA== Date: Sun, 23 Nov 2025 05:33:44 +0000 Message-ID: <269A8FB9-6D43-43CF-A6FE-52D28CBDB8A9@Outlook.com> References: In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-ms-traffictypediagnostic: TYYPR01MB14116:EE_|TY4PR01MB17197:EE_ x-ms-office365-filtering-correlation-id: a928b88b-3d2d-476b-3cbb-08de2a51de7a x-microsoft-antispam: BCL:0;ARA:14566002|51005399006|461199028|31061999003|12121999013|41001999006|8060799015|8062599012|19110799012|15080799012|3412199025|440099028|40105399003|12091999003|102099032|56899033; x-microsoft-antispam-message-info: =?utf-8?B?VmhKYlIrZXJMVmZJUFdDTVV1dVFiZTVSOGZSY3F6Qi9hVVRPbzltOFladVlW?= =?utf-8?B?SXJObjJkanFOVEl0Y25oWU5ON1hpam0vRVdJdUwwSGI4Y1M4T0FieG1abmZU?= =?utf-8?B?RU5kM2k5eTZUSEphbXFPZzNYVTRnSzczTDd4ZllKR0VWVGlYMUUwNElQTjdF?= =?utf-8?B?Umh6YU9NMXdBT2JHZGNBYkhyaXp4NGFyYlcxUmVqU0U0bUszZXNwMHNpV01a?= =?utf-8?B?czBJTEJOcUdLb1hybENpRTQvb0ticnVaR09NZUVzd2VnQTRJRzdxTWo5WStq?= =?utf-8?B?NDIrL05zNkxsQWxWKy9YeEJiNHNYM0RhRGx2Vk0yakhFU0hpbUhXM1Q4ejdS?= =?utf-8?B?b011ZmRaZXlPSEpKejIvUXFzbEprcVAweGlETSsrQU9iQ0lJWnNZR3MvZGJX?= =?utf-8?B?ZlZxM1lCSWxNVVRUUmtNN0VQN0l6bHZzUHlOcWNTZkRpc1dKcUE0MTlHSkpq?= =?utf-8?B?c0hObEptZnJZTTVKMDloaGRMcHFoUGcwc1JMYkxSYWUzRzUxZnN3LzRIc1hP?= =?utf-8?B?NU0yMU5RVzJha1RnZ2IybkpVMW80MmVIRllUOCtUUVovYThWSDBITS9TZ0lU?= =?utf-8?B?SlZDZmtiR0tjNnFHQTZNSUFKcUpEaVV4NFh1ckZqN3lXSG1JSW1SdndTUldu?= =?utf-8?B?NVQ4OGhPQTFSSWppR0dZRWlYR0dCZWxMY1JwbXlJZWJLYXN4bzZaU25BYk5F?= =?utf-8?B?MitmWWlTQlNSZG5sNW1GME8wd3QyMjZNZkxlakhCaHRyeklRY1FrWTF1M09U?= =?utf-8?B?dWluajUzZVV2am1YZlQ0Y0hxMW93dVRKbVJsanFQVGFKTlFGN2tzbUhLMFR4?= =?utf-8?B?Mmk2eVZCVm41RFVMU0ZiZHdhTmt5ZnVSQllrbUtmcnFGN3BlZm9XNSthekpI?= =?utf-8?B?cGdpWGtRSGtDZ25ZSVZxQUpRWW5CR1FrRmpacit1YkQ1QTh0TndwMFc0cDF0?= =?utf-8?B?cDd5ZjJ1M1VKckVTdzZQckhlZWtRT3Y3NE1JRzZKRXJsbTdQS2ZJdENCRTZM?= =?utf-8?B?cWpjMVl0S3pRaHVuTlJzemNadURLY3F4MzEwNkNSVnpaYVh1bG1XMEF3K1lu?= =?utf-8?B?NDhIVkF4SEZ2K2JNZlhyME0yY0NjVWdXaEZhMEtKQW9BVG85cU1qYmRoa0g5?= =?utf-8?B?aksxejgzVUM5REw5bnVvNUhBclMyTHZYWkdTR2hKMVBXTkxpblZmc0dqeVhx?= =?utf-8?B?R0NkTE1lYW9ZVzZ6NytjeUVJVU1rdUl4N1phWFRZb2JFdWRJMEk5WjU4bGNj?= =?utf-8?B?WldNSFFOV2Q0dDhZWGppNUJKRzhsU09wdVpBYVNkbEhhYUtUanA0VURURytn?= =?utf-8?B?cHpaWFRrYy9SWnpYa1hEcXNETytQTzZudUhtcDErRksxSC9pSFlteUV3Nkhi?= =?utf-8?B?VjNIcG5Yano2b00wMWkrTlJ3WWc4WUg3RjQyNG9NelRveHlXbk1KcmVzTkFZ?= =?utf-8?B?T0xmTmhwUDI4R1lTREllME1OWFN3K1MwSXBvSmh0KzNLa0ZFcnllcHQrTmo1?= =?utf-8?B?ZVBROE5qbE9XS1J2ZURJcmptN2tzNVJ1MkNwcC93dTJGOXJxYTJNdjdveExr?= =?utf-8?B?WFNBQzVSeFRsd3doaWRrNEZVQW5BUThST3FQZTlBWUsrWDgxdU11RDBDcVEx?= =?utf-8?B?eUxWeVFXaTdIUEw1ODBTMGtJNnU0U3pxK1M0RUs0Q0ZoQ0krUExCVGNteklp?= =?utf-8?B?YjI3eVNhQSt3SGg5dWhEYURRQU9YUGNaQlRUdmlHdTMva0FOcXZVcHhnPT0=?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?UWR6RHhwb0YySlMyN25WYkoxNEkvVFdqeXphenIzQkFwT0kwSnhBOXFDdG5N?= =?utf-8?B?TWpCaGx5Z092cnc4OFZaVnViQjRzMkhQd0xzRldrZWhwMTBWQjNIVzV2aFor?= =?utf-8?B?bC9SZCtJNXhFT013OW5ybm9RRXVDU29PS3Z5dVpDYU9laEx6ZGhQeFREVkZ2?= =?utf-8?B?cFgraHAyRnYxR0FkTHYxRHhSVmJzckhqZUVWZmt6SmpjMFRGQmVDSmtrckcx?= =?utf-8?B?eDJmajhtZC9GdnprbGM3eTZFUU9jcEducjlwRnpFL0ZWQ0ZTaWg3Q1dkWEtY?= =?utf-8?B?R01GNGZ3WFZTRER4REVzV0NXaktUVGVwbnd6eU93cEdkZ2NDaEpXVVBaRDdl?= =?utf-8?B?WkptdDFobldMM2hVTzFjVm1zY05ObFdLRmJYQzBGTEpFem9JY2dCZlY3eWtx?= =?utf-8?B?cUlzYW1oK3ZqeklWN3YyWnB4SnFZYXg2dW1hN29SczBpdUJrUGJmb2RUWGNX?= =?utf-8?B?Q1JGVm5qdzd6Z29jQjlmWGkxTzNETUFLbGVySUptQXZvK3plYVplckNqbHJU?= =?utf-8?B?VXp2bk9CNFVjaCthVzdUM0k4d2hSUTdRQ1haQll2QWR6TWJkTnh1RG1JTGFY?= =?utf-8?B?eXBNM1pNaDN3N2VWc2cwY21ZRmFaZ2Iya2lDRXRtY0lCbnlTQVovQnk4VzNj?= =?utf-8?B?N3MzM1Z5U0FXVmczQ2ZubHdLeDB0aHdYMVNLWjFFbFcyOW9iVjZtL0gzVmla?= =?utf-8?B?QjVVZmMzVDM3YXE3ZGgydmpMaitwbFRJNGEwL1VCMFRpRVNyZG9wclVMcXIx?= =?utf-8?B?dUwxaVRoTHA0MkhibFR1ZVVtK0lMT1RIUGR6blZ2ZnQ3cVcvS1M4enIwb1Va?= =?utf-8?B?ejdCNjdYUHVUY0Q3VE8wVkpxdGZqMkdxbElXVysycWR4NEhkbUovWURteS9p?= =?utf-8?B?a3k2L2xQTFEyelZaUkFMSXVGNW1aTjBVY2xFMUZ4YlI2eDBoNUUxSFkwWHIr?= =?utf-8?B?SmtGM3laOTFoQW9jcXVIelI1YUNJcUhjK2dRcHFHY3R4N3lWZGtHVjU2YUlX?= =?utf-8?B?dWdMcFZRbWZzYmsvYW8xSkNkalRxYlNMU0dCbjA2aDlTSmU3WjduRFhrUU5r?= =?utf-8?B?cWpUUXpCdXBkRnVWTHUrbURhZFZVWUp3RjdpWmZRRVJKZkxEVVpGVm5uQk5B?= =?utf-8?B?M2U1R3NjZ3o5bmdCRzAwd3lVZUNDWmNpVHZWMExEdkZRb09na3lCV0RDR3Na?= =?utf-8?B?VGU2enZsY05kNjJOd01OaGtoZ3JOR1hsMDl0VW5sV3NOWDJvbWJRQm5lbzIr?= =?utf-8?B?K2FicmNlN3plTVZvU1lHNlhpSmVwaHRMa3FTMnBrM2R5VVRzVjJ3ZnJCTFVO?= =?utf-8?B?cHdUaS9TOHljWVRialJkNTZ3Ym4rUTIrL3g1ZDkyOGN0UmZSS2k4S2JxVVc4?= =?utf-8?B?SWV4UkMxNnltN05IQkUzelEyN2kzYTVPcDRLbjVTZGlpSlVkTFpMQ00ycnZ6?= =?utf-8?B?eG01K2Flc2hsMzMwVFhwc2RObXAzMUNyeHhGQjNxWTE4VjVia2FHMjlDL0th?= =?utf-8?B?SDE0SVZUQ1hYM1ZXS0FRb2ZTbkRRbG9wYkQreE9RbFlXUjIvRFJzQVdJaDgw?= =?utf-8?B?SWRrM3RZN3hNMVVWS0wvQ1Nxazcwd1FwbXBQblVTVjJUeUdFMnNLODZTc3Ry?= =?utf-8?B?dXBmcjhWTERzQTB4NG1teVIwa2NiUDlpTGtyS1VrdkQ3RSsxWCtxNjFDYmhL?= =?utf-8?Q?yOdBmFO9nlQwAjNY8FuV?= Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: TYYPR01MB14116.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: a928b88b-3d2d-476b-3cbb-08de2a51de7a X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Nov 2025 05:33:44.6277 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: TY4PR01MB17197 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk DQo+IE9uIE5vdiAxMiwgMjAyNSwgYXQgMjE6NTcsIEpvaG4gTmF5bG9yIDxqb2huY25heWxvcmxz QGdtYWlsLmNvbT4gd3JvdGU6DQo+IA0KPiBJIGRlY2lkZWQgSSB3YXNuJ3QgcXVpdGUgY29tZm9y dGFibGUgd2l0aCB0aGUgZnVsbCBub3JtYWxpemVkIGRhdHVtDQo+IHNoYXJpbmcgc3BhY2UgaW4g U29ydFR1cGxlIHdpdGggaXNudWxsMS4gVGhlcmUncyB0b28gbXVjaCBvZiBhDQo+IGNvZ25pdGl2 ZSBidXJkZW4gaW52b2x2ZWQgaW4gZGVjaWRpbmcgd2hlbiB3ZSBkbyBvciBkb24ndCBuZWVkIHRv DQo+IHJlc2V0IGlzbnVsbDEsIGFuZCB0aGVyZSdzIGEgbm9uLXplcm8gcmlzayBvZiBkaWZmaWN1 bHQtdG8tZGV0ZWN0DQo+IGJ1Z3MuIEZvciB2NCBJJ3ZlIGluc3RlYWQgdXNlZCBvbmUgYnl0ZSBv ZiBwYWRkaW5nIHNwYWNlIGluIFNvcnRUdXBsZQ0KPiB0byBzdG9yZSBvbmx5IHRoZSBieXRlIHVz ZWQgZm9yIHRoZSBjdXJyZW50IHBhc3MuIFRoYXQgbWVhbnMgd2UgbXVzdA0KPiBjb21wdXRlIHRo ZSBub3JtYWxpemVkIGRhdHVtIG9uIGV2ZXJ5IHBhc3MuIFRoYXQncyBhY3R1YWxseSBiZXR0ZXIN Cj4gdGhhbiBpdCBzb3VuZHMsIHNpbmNlIHRoYXQgb25lIGJ5dGUgY2FuIG5vdyBiZSB1c2VkIGRp cmVjdGx5IGR1cmluZw0KPiB0aGUgImRlYWwiIHN0ZXAsIHJhdGhlciB0aGFuIGhhdmluZyB0byBl eHRyYWN0IHRoZSBieXRlIGZyb20gdGhlDQo+IG5vcm1hbGl6ZWQgZGF0dW0gYnkgc2hpZnRpbmcg YW5kIG1hc2tpbmcuIFRoYXQgZXh0cmFjdGlvbiBzdGVwIG1pZ2h0DQo+IGFkZCBzaWduaWZpY2Fu dCBjeWNsZXMgaW4gY2FzZXMgd2hlcmUgYSBwYXNzIHJlcXVpcmVzIG11bHRpcGxlDQo+IGl0ZXJh dGlvbnMgdGhyb3VnaCB0aGUgImRlYWwiIGxvb3AuIEl0IGRvZXNuJ3Qgc2VlbSB0byBtYWtlIG11 Y2gNCj4gZGlmZmVyZW5jZSBpbiBwcmFjdGljZSwgcGVyZm9ybWFuY2Utd2lzZSwgZXZlbiB3aXRo IHRoZSBmb2xsb3dpbmcNCj4gcGVzc2ltaXphdGlvbjoNCj4gDQo+IEkgaGFkIHRvIHNjcmFwIHRo ZSBxc29ydCBzcGVjaWFsaXphdGlvbiBvbiB0aGUgbm9ybWFsaXplZCBkYXR1bSBmb3INCj4gc21h bGwgc29ydHMsIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHN0b3JlZC4gSXQgY291bGQgc3RpbGwgYmUg d29ydGggaXQNCj4gdG8gY29tcHV0ZSB0aGUgIm5leHQgYnl0ZSBvZiB0aGUgbm9ybWFsaXplZCBk YXR1bSIgYW5kIHBlcmZvcm0gYSBxc29ydA0KPiBvbiB0aGF0IChmYWxsaW5nIGJhY2sgdG8gdGhl IGNvbXBhcmF0b3IgZnVuY3Rpb24gaW4gdGhlIHVzdWFsIHdheSksDQo+IGJ1dCBJIGhhdmVuJ3Qg ZmVsdCB0aGUgbmVlZCB0byByZXNvcnQgdG8gdGhhdCB5ZXQuIEZvciB2NCwgSSBqdXN0DQo+IGRp dmVydCB0byBxc29ydF90dXBsZSBpbiBub24tYXNzZXJ0IGJ1aWxkcywgd2l0aCBhIHRocmVzaG9s ZCBvZiA0MC4NCj4gW+KApl0NCj4gDQo+IEkgbWFkZSBhbiBhdHRlbXB0IGF0IGNsZWFuLXVwLCBi dXQgaXQncyBzdGlsbCB1bmRlci1jb21tZW50ZWQuIFRoZQ0KPiBjb21tb24gcHJlZml4IGRldGVj dGlvbiBoYXMgbW92ZWQgdG8gYSBzZXBhcmF0ZSBwYXRjaCAodjQtMDAwNCkuDQo+IA0KPiBJJ3Zl IGJlZW4gZm9yY2luZyBhbGwgZWxpZ2libGUgc29ydHMgdG8gdXNlIHJhZGl4IHNvcnQgaW4gYXNz ZXJ0DQo+IGJ1aWxkcywgZXZlbiB3aGVuIHNtYWxsIGVub3VnaCB0aGF0IHFzb3J0IHdvdWxkIGJl IGZhc3Rlci4gU2luY2UgYm90aA0KPiBxc29ydCBhbmQgaW4tcGxhY2UgcmFkaXggc29ydCBhcmUg dW5zdGFibGUsIGl0J3MgZXhwZWN0ZWQgdGhhdCBzb21lDQo+IHJlZ3Jlc3Npb24gdGVzdHMgbmVl ZCBhZGp1c3RtZW50ICh2NC0wMDAyKS4gT25lIHRoaW5nIHN1cnByaXNlZCBtZSwNCj4gaG93ZXZl cjogVGhlIHBnX3VwZ3JhZGUgVEFQIHRlc3QgdGhhdCBydW5zIHJlZ3Jlc3Npb24gdGVzdHMgb24g dGhlIG9sZA0KPiBjbHVzdGVyIHNob3dlZCBhZGRpdGlvbmFsIGZhaWx1cmVzIHRoYXQgSSBjYW4n dCBleHBsYWluLiBJIGhhdmVuJ3QNCj4gc2VlbiB0aGlzIGJlZm9yZSwgYnV0IGl0J3MgcG9zc2li bGUgSSBuZXZlciByYW4gVEFQIHRlc3RzIHdoZW4gdGVzdGluZw0KPiBuZXcgc29ydCBhbGdvcml0 aG1zIHByZXZpb3VzbHkuIFRoaXMgZG9lc24ndCBoYXBwZW4gaWYgeW91IGNoYW5nZSB0aGUNCj4g Y3VycmVudCBpbnNlcnRpb24gc29ydCB0aHJlc2hvbGQsIHNvIEkgaGF2ZW4ndCBiZWVuIGFibGUg dG8gcmVwcm9kdWNlDQo+IGl0IGFzaWRlIGZyb20gdGhpcyBwYXRjaC4gRm9yIHRoYXQgcmVhc29u IEkgY2FuJ3QgY29tcGxldGVseSBydWxlIG91dA0KPiBhbiBhY3R1YWwgYnVnLCBhbHRob3VnaCBJ IGFjdHVhbGx5IGhhdmUgbW9yZSBjb25maWRlbmNlIGluIHRoZQ0KPiB2ZXJpZmljYXRpb24gb2Yg Y29ycmVjdCBzb3J0IG9yZGVyIGluIHY0LCBzaW5jZSBpc251bGwxIG5vdyBuZXZlcg0KPiBjaGFu Z2VzLCBqdXN0IGFzIGluIG1hc3Rlci4gSSBmb3VuZCB0aGF0IGNoYW5naW5nIHNvbWUgdGVzdHMg dG8gaGF2ZQ0KPiBhZGRpdGlvbmFsIHNvcnQga2V5cyBzZWVtcyB0byBmaXggaXQgKHY0LTAwMDMp LiBJIGRpZCB0aGlzIGluIGEgcmF0aGVyDQo+IHF1aWNrIGFuZCBoYXBoYXphcmQgZmFzaGlvbi4g VGhlcmUncyBwcm9iYWJseSBhIGxvbmdlciBjb252ZXJzYXRpb24gdG8NCj4gYmUgaGFkIGFib3V0 IG1ha2luZyB0ZXN0IG91dHB1dCBtb3JlIGRldGVybWluaXN0aWMgd2hpbGUgc3RpbGwNCj4gY292 ZXJpbmcgdGhlIGludGVuZGVkIGV4ZWN1dG9yIHBhdGhzLg0KPiANCj4gQXNpZGUgZnJvbSB0aGF0 LCB0aGlzIHNlZW1zIGxpa2UgYSBnb29kIHBsYWNlIHRvIHNldHRsZSBkb3duLCBzbyBJJ20NCj4g Z29pbmcgdG8gY3JlYXRlIGEgQ0YgZW50cnkgZm9yIHRoaXMuIEknbGwgc3RhcnQgbW9yZSByaWdv cm91cw0KPiBwZXJmb3JtYW5jZSB0ZXN0aW5nIGluIHRoZSBuZWFyIGZ1dHVyZS4NCj4gDQoNCkhp IEpvaG4sDQoNCkkgaGF2ZSByZXZpZXdlZCB0aGUgdjQgcGF0Y2ggc2V0LiBJIGFwcGxpZWQgdGhl IHBhdGNoZXMgYW5kIHJhbg0KIm1ha2UgY2hlY2siIG9uIG1hY09TIDE0LjIuMSAoTTEpLCBhbmQg YWxsIHJlZ3Jlc3Npb24gdGVzdHMgcGFzc2VkLg0KDQpPdmVyYWxsLCB0aGUgaW1wbGVtZW50YXRp b24gbG9va3Mgc29saWQgYW5kIHRoZSBmZWF0dXJlIGlzIGEgZ3JlYXQNCmFkZGl0aW9uLiBJIGhh dmUgYSBmZXcgc3VnZ2VzdGlvbnMgcmVnYXJkaW5nIGNvZGUgb3B0aW1pemF0aW9uIGFuZCBvbmUN CmRpc2N1c3Npb24gcG9pbnQgcmVnYXJkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSBkZXNpZ24uDQoN Ck1pbm9yIENvbW1lbnRzIC8gT3B0aW1pemF0aW9uczoNCg0KMS4gT3B0aW1pemF0aW9uIGluIHJh ZGl4X3NvcnRfdHVwbGUgKHY0LTAwMDEpDQoNCkluIHJhZGl4X3NvcnRfdHVwbGUsIHRoZXJlIGlz IGEgY2hlY2s6DQoNCmBgYA0KaWYgKHBhcnQub2Zmc2V0ID09IHBhcnQubmV4dF9vZmZzZXQpDQpg YGANCg0KU2luY2UgInBhcnQiIGlzIGEgbG9jYWwgY29weSBvZiB0aGUgc3RydWN0LCB0aGlzIGNo ZWNrIG1pZ2h0IG5vdA0KcmVmbGVjdCB0aGUgbGF0ZXN0IHN0YXRlIHVwZGF0ZWQgaW5zaWRlIHRo ZSBsb29wLiBJdCBtaWdodCBiZSBzbGlnaHRseQ0KbW9yZSBlZmZpY2llbnQgdG8gY2hlY2sgdGhl IGFycmF5IGRpcmVjdGx5Og0KDQpgYGANCmlmIChwYXJ0aXRpb25zW2lkeF0ub2Zmc2V0ID09IHBh cnRpdGlvbnNbaWR4XS5uZXh0X29mZnNldCkNCmBgYA0KDQpUaGlzIGFsbG93cyB1cyB0byBkZXRl Y3QgaWYgYSBwYXJ0aXRpb24gaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQvc29ydGVkDQp3aXRoaW4g dGhlIGN1cnJlbnQgcGFzcywgcG90ZW50aWFsbHkgc2F2aW5nIGFuIGl0ZXJhdGlvbiBvZiB0aGUN CiJ3aGlsZSAobnVtX3JlbWFpbmluZyA+IDEpIiBsb29wLg0KDQoxLiBCcmFuY2hsZXNzIGNhbGN1 bGF0aW9uIGluIENvbW1vbiBQcmVmaXggKHY0LTAwMDQpDQoNCkluIHNvcnRfYnl2YWx1ZV9kYXR1 bSwgd2hlbiBjYWxjdWxhdGluZyB0aGUgY29tbW9uIGJpdHM6DQoNCmBgYA0KaWYgKHRoaXNfY29t bW9uX2JpdHMgPiBjb21tb25fdXBwZXJfYml0cykNCmNvbW1vbl91cHBlcl9iaXRzID0gdGhpc19j b21tb25fYml0czsNCmBgYA0KDQpTaW5jZSB3ZSBhcmUgbG9va2luZyBmb3IgdGhlIGxlZnRtb3N0 IGJpdCBkaWZmZXJlbmNlLCB3ZSBjb3VsZA0KYWNjdW11bGF0ZSB0aGUgZGlmZmVyZW5jZXMgdXNp bmcgYml0d2lzZSBPUi4gVGhpcyBhdm9pZHMgYSBjb25kaXRpb25hbA0KYnJhbmNoIGluc2lkZSB0 aGUgbG9vcDoNCg0KYGBgDQpjb21tb25fdXBwZXJfYml0cyB8PSB0aGlzX2NvbW1vbl9iaXRzOw0K YGBgDQoNCjMuIFNob3J0LWNpcmN1aXQgZm9yIGlkZW50aWNhbCBrZXlzICh2NC0wMDA0KQ0KDQpX aGVuIGNhbGN1bGF0aW5nIGNvbW1vbl9wcmVmaXgsIGlmIGNvbW1vbl91cHBlcl9iaXRzIGlzIDAs IGl0IGltcGxpZXMNCnRoYXQgYWxsIG5vbi1udWxsIGtleXMgYXJlIGlkZW50aWNhbCAoZm9yIHRo ZSBiaXRzIHdlIGNhcmUgYWJvdXQpLiBJbg0KdGhpcyBjYXNlLCB3ZSBtaWdodCBiZSBhYmxlIHRv IHNraXAgdGhlIHJhZGl4IHNvcnQgZW50aXJlbHkgb3IgaGFuZGxlDQppdCBhcyBhIHNpbmdsZSBw YXJ0aXRpb24uIEN1cnJlbnRseSwgdGhlIGNvZGUgaGFuZGxlcyBpdCBieSBwYXNzaW5nDQoiY29t bW9uX3VwcGVyX2JpdHMgfCAxIiB0byBwZ19sZWZ0bW9zdF9vbmVfcG9zNjQsIHdoaWNoIGlzIHNh ZmUgYnV0DQpwZXJoYXBzIG5vdCB0aGUgbW9zdCBvcHRpbWFsIHBhdGggZm9yIGlkZW50aWNhbCBr ZXlzLg0KDQotLS0tLQ0KDQpEaXNjdXNzaW9uOiBTb3J0VHVwbGUgTGF5b3V0IGFuZCBub3JtYWxp emVfZGF0dW0NCg0KSSBoYXZlIGEgY29uY2VybiByZWdhcmRpbmcgdGhlIGFkZGl0aW9uIG9mICJ1 aW50OCBjdXJyZW50X2J5dGUiIHRvIHRoZQ0KU29ydFR1cGxlIHN0cnVjdC4NCg0KMS4gU3RydWN0 IFNpemUgYW5kIEFic3RyYWN0aW9uOg0KDQpTb3J0VHVwbGUgaXMgdGhlIGdlbmVyaWMgYXRvbSBm b3IgdGhlIGVudGlyZSBzb3J0aW5nIG1vZHVsZS4gQWRkaW5nIGENCmZpZWxkIHNwZWNpZmljIHRv IGludGVnZXIgUmFkaXggU29ydCBmZWVscyBsaWtlIGEgYml0IG9mIGEgbGVha3kNCmFic3RyYWN0 aW9uLiBXaGlsZSBpdCBtaWdodCBmaXQgaW50byBwYWRkaW5nIG9uIHNvbWUgNjQtYml0IHBsYXRm b3Jtcw0KKGtlZXBpbmcgdGhlIHNpemUgYXQgMzIgYnl0ZXMpLCByZWx5aW5nIG9uIHBhZGRpbmcg aXMgZnJhZ2lsZS4gSWYgdGhlDQpzdHJ1Y3Qgc2l6ZSBpbmNyZWFzZXMsIGl0IHJlZHVjZXMgdGhl IG51bWJlciBvZiB0dXBsZXMgd29ya19tZW0gY2FuDQpob2xkLCBhZmZlY3RpbmcgYWxsIHNvcnQg b3BlcmF0aW9ucywgbm90IGp1c3QgaW50ZWdlcnMuDQoNCjIuIENhY2hlIEludmFsaWRhdGlvbiAo UmVhZCB2cy4gV3JpdGUpOg0KDQpDdXJyZW50bHksIHJhZGl4X3NvcnRfdHVwbGUgd3JpdGVzIHRv IHR1cC0+Y3VycmVudF9ieXRlIGluIGV2ZXJ5IHBhc3MuDQpUaGlzIHR1cm5zIHdoYXQgY291bGQg YmUgYSByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSB0dXBsZSBhcnJheSBpbnRvIGENCnJlYWQtd3Jp dGUgYWNjZXNzLCBwb3RlbnRpYWxseSBkaXJ0eWluZyBjYWNoZSBsaW5lcyBhbmQgY2F1c2luZw0K dW5uZWNlc3NhcnkgbWVtb3J5IHRyYWZmaWMuDQoNClByb3Bvc2FsOiBPbi10aGUtZmx5IE5vcm1h bGl6YXRpb24NCg0KV2UgY2FuIGF2b2lkIHN0b3JpbmcgY3VycmVudF9ieXRlIGJ5IGNhbGN1bGF0 aW5nIHRoZSByZWxldmFudCBieXRlIG9uDQp0aGUgZmx5LiBXaGlsZSB0aGlzIG1lYW5zIHJlLWNh bGN1bGF0aW5nIHRoZSBieXRlIGV4dHJhY3Rpb24sIHdlIGNhbg0Kb3B0aW1pemUgbm9ybWFsaXpl X2RhdHVtLg0KDQpUaGUgbm9ybWFsaXphdGlvbiBsb2dpYyAobWFwcGluZyBzaWduZWQgaW50ZWdl cnMgdG8gdW5zaWduZWQgc3BhY2UpDQplc3NlbnRpYWxseSBmbGlwcyB0aGUgc2lnbiBiaXQuIElu c3RlYWQgb2YgZG9pbmcgYSBmdWxsIDY0LWJpdA0Kbm9ybWFsaXphdGlvbiBmb3IgZXZlcnkgYnl0 ZSBleHRyYWN0aW9uLCB3ZSBjYW4gYXBwbHkgdGhpcw0KdHJhbnNmb3JtYXRpb24gb25seSB3aGVu IGV4dHJhY3RpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAoTVNCKS4NCg0KVGhlIGxvZ2lj IGNvdWxkIGxvb2sgbGlrZSB0aGlzOg0KDQpgYGANCi8qDQogKiBFeHRyYWN0IHRoZSBieXRlIGF0 ICdsZXZlbCcgZnJvbSAna2V5Jy4NCiAqIGxldmVsIDAgZGVub3RlcyB0aGUgTW9zdCBTaWduaWZp Y2FudCBCeXRlLg0KICovDQpzdGF0aWMgaW5saW5lIHVpbnQ4X3QNCmV4dHJhY3RfcmF3X2J5dGUo RGF0dW0ga2V5LCBpbnQgbGV2ZWwpDQp7DQogICAgcmV0dXJuIChrZXkgPj4gKCgoU0laRU9GX0RB VFVNIC0gMSkgLSBsZXZlbCkgKiA4KSkgJiAweEZGOw0KfQ0KDQovKg0KICogRXh0cmFjdCB0aGUg ImxvZ2ljYWxseSBub3JtYWxpemVkIiBieXRlIGF0ICdsZXZlbCcuDQogKg0KICogVGhpcyBlZmZl Y3RpdmVseSByZXBsYWNlcyB0aGUgbmVlZCB0byBjYWxsIG5vcm1hbGl6ZV9kYXR1bSgpIG9uDQog KiB0aGUgZnVsbCBrZXkuDQogKiAtIEZvciBub24tTVNCIGxldmVsczogcmV0dXJuIHRoZSByYXcg Ynl0ZS4NCiAqIC0gRm9yIHRoZSBNU0IgbGV2ZWw6IGZsaXAgdGhlIHNpZ24gYml0IGlmIHRoZSBj b21wYXJhdG9yDQogKiByZXF1aXJlcyBpdC4NCiAqIC0gSWYgc29ydGluZyBERVNDOiBpbnZlcnQg dGhlIHJlc3VsdC4NCiAqLw0Kc3RhdGljIGlubGluZSB1aW50OF90DQpyYWRpeF9leHRyYWN0X2J5 dGUoRGF0dW0gb3JpZywgaW50IGxldmVsLCBTb3J0U3VwcG9ydCBzc3VwKQ0Kew0KICAgIHVpbnQ4 X3QgYnl0ZTsNCg0KICAgIC8qIDEuIEV4dHJhY3QgcmF3IGJ5dGUgZmlyc3QgKi8NCiAgICBieXRl ID0gZXh0cmFjdF9yYXdfYnl0ZShvcmlnLCBsZXZlbCk7DQoNCiAgICAvKg0KICAgICAqIDIuIEFw cGx5IG5vcm1hbGl6YXRpb24gb25seSB0byB0aGUgTW9zdCBTaWduaWZpY2FudCBCeXRlLg0KICAg ICAqDQogICAgICogTWF0aGVtYXRpY2FsbHksIG5vcm1hbGl6aW5nIGEgc2lnbmVkIGludGVnZXIg Zm9yIHVuc2lnbmVkDQogICAgICogY29tcGFyaXNvbiBpcyBlcXVpdmFsZW50IHRvIGZsaXBwaW5n IHRoZSBzaWduIGJpdCAoYWRkaW5nDQogICAgICogMl4oV2lkdGgtMSkpLg0KICAgICAqIEluIHRo ZSBieXRlIGRvbWFpbiwgdGhpcyBtZWFucyBYT1JpbmcgdGhlIE1TQiB3aXRoIDB4ODAuDQogICAg ICovDQogICAgaWYgKGxldmVsID09IDApDQogICAgew0KICAgICAgICBpZiAoc3N1cC0+Y29tcGFy YXRvciA9PSBzc3VwX2RhdHVtX3NpZ25lZF9jbXAgfHwNCiAgICAgICAgICAgIHNzdXAtPmNvbXBh cmF0b3IgPT0gc3N1cF9kYXR1bV9pbnQzMl9jbXApDQogICAgICAgIHsNCiAgICAgICAgICAgIGJ5 dGUgXj0gMHg4MDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAg ICAgIEFzc2VydChzc3VwLT5jb21wYXJhdG9yID09IHNzdXBfZGF0dW1fdW5zaWduZWRfY21wKTsN CiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qDQogICAgICogMy4gSGFuZGxlIFJldmVyc2UgU29y dA0KICAgICAqIEluc3RlYWQgb2YgaW52ZXJ0aW5nIHRoZSB3aG9sZSBEYXR1bSwgd2UganVzdCBp bnZlcnQgdGhlDQogICAgICogY3VycmVudCBieXRlLg0KICAgICAqLw0KICAgIGlmIChzc3VwLT5z c3VwX3JldmVyc2UpDQogICAgICAgIGJ5dGUgPSB+Ynl0ZTsNCg0KICAgIHJldHVybiBieXRlOw0K fQ0KYGBgDQoNCkJlbmVmaXRzOg0KDQoxLiBLZWVwcyBTb3J0VHVwbGUgbWluaW1hbDogTm8gcmlz ayBvZiBzdHJ1Y3QgYmxvYXQuDQoyLiBSZWFkLW9ubHkgcGFzc2VzOiBUaGUgdHVwbGUgYXJyYXkg cmVtYWlucyBjbGVhbiBpbiBjYWNoZSBkdXJpbmcgdGhlDQpjb3VudGluZyBwaGFzZS4NCjMuIFJl ZHVjZWQgaW5zdHJ1Y3Rpb24gY291bnQ6IFdlIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBmdWxsDQpu b3JtYWxpemVfZGF0dW0gY2FsbHMgZm9yIGxvd2VyIGJ5dGVzLg0KDQpJJ20gaGFwcHkgdG8gaGVs cCB2ZXJpZnkgdGhpcyBhcHByb2FjaCBpZiB5b3UgdGhpbmsgaXQncyB3b3J0aA0KcHVyc3Vpbmcu DQoNCkJlc3QgcmVnYXJkcywNCkNoZW5ncGVuZyBZYW4=