From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="EhvLwV57" Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B713D1 for ; Wed, 6 Dec 2023 06:10:50 -0800 (PST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20231206141048euoutp01a21d863b35d08597207b13d435b7bab3~eQ23VDHMw1988619886euoutp01k for ; Wed, 6 Dec 2023 14:10:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20231206141048euoutp01a21d863b35d08597207b13d435b7bab3~eQ23VDHMw1988619886euoutp01k DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1701871848; bh=edIwML3jWW+obfJFiKLJcLniVknFSbiYMOdwMDZT4gE=; h=From:To:CC:Subject:Date:In-Reply-To:References:From; b=EhvLwV57NeSe23I4Lm/VJY3UaeJx3xunNwhhYyhn1LTORidYUuf3vxJeELhL4hu5O 1pUon5EcbJ34Q4hT1EZzHfz0z4p/qx0+j4R1PWb9oJFo7QVV8m4HbtRHbbaL26/AP1 rMRd0r0GcNV4UHCU4g2r3BFO4Iglu24VlXEhy//A= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20231206141047eucas1p2710f91983ba112fc8541f09d9847e786~eQ229b7-y0100901009eucas1p2_; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 3D.37.09552.7E080756; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20231206141047eucas1p1b6c2b022717a6b3a2e24e37b6a6d5d23~eQ22iUd7W0734807348eucas1p1Z; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20231206141047eusmtrp2e6038c78c1ae53a6c3a2cc899689f6c9~eQ22gvGiL2068120681eusmtrp2w; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) X-AuditID: cbfec7f5-853ff70000002550-3a-657080e7e691 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 19.32.09274.7E080756; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) Received: from CAMSVWEXC01.scsc.local (unknown [106.1.227.71]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20231206141047eusmtip11607a627249b7c242db65ed9fe7d25a5~eQ22SCiIY2136921369eusmtip1_; Wed, 6 Dec 2023 14:10:47 +0000 (GMT) Received: from CAMSVWEXC02.scsc.local (2002:6a01:e348::6a01:e348) by CAMSVWEXC01.scsc.local (2002:6a01:e347::6a01:e347) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 6 Dec 2023 14:10:46 +0000 Received: from CAMSVWEXC02.scsc.local ([::1]) by CAMSVWEXC02.scsc.local ([fe80::3c08:6c51:fa0a:6384%13]) with mapi id 15.00.1497.012; Wed, 6 Dec 2023 14:10:46 +0000 From: Andreas Hindborg To: =?utf-8?B?TWHDrXJhIENhbmFs?= CC: Asahi Lina , Miguel Ojeda , "Alex Gaynor" , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?utf-8?B?QmrDtnJuIFJveSBCYXJvbg==?= , Benno Lossin , Alice Ryhl , Matthew Wilcox , "rust-for-linux@vger.kernel.org" , "kernel-dev@igalia.com" Subject: Re: [PATCH v5] rust: xarray: Add an abstraction for XArray Thread-Topic: [PATCH v5] rust: xarray: Add an abstraction for XArray Thread-Index: AQHaJJBKToNXHiUjIk6XrLJdWQl7abCcSSkA Date: Wed, 6 Dec 2023 14:10:45 +0000 Message-ID: <87cyvjjuak.fsf@samsung.com> In-Reply-To: <20231201195300.1329092-1-mcanal@igalia.com> Accept-Language: en-US, en-GB Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 Precedence: bulk X-Mailing-List: rust-for-linux@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrAKsWRmVeSWpSXmKPExsWy7djPc7rPGwpSDS6c17T4O3s7u8WJ600s Fh+uNbFa3Liwn9lizZZGJouLZ14zWpx78Z3JYl/3cVaLGf9eM1msnL+c0WL9s8PMFhuWrWW0 +P1jDpsDr8enec+ZPJZ0/mLy2DnrLrvHgk2lHhNmd7N5bF6h5bFpVSebx/f2PWwePW2bmDw+ b5IL4IrisklJzcksSy3St0vgynjZ+5W1oGcVY0X3l20sDYx3ljJ2MXJySAiYSGy4e5q5i5GL Q0hgBaPE/cPr2SCcL4wS3f2HWUGqhAQ+M0rcbnOE6dj04z1Ux3JGidlfulggHKCiz9d+QGVO M0o87TvICDd46olDYBvZBPQlrq25xgxiiwDNOv54OlgHs0Ani8TOR6fZQRLCAs4SF7//AUpw ABW5SFydUwJRbyTR+nQmG4jNIqAisfzYXLCZvAIaEsuu7WQHKecUsJTo/WoCEmYUkJV4tPIX 2ERmAXGJW0/mM0G8ICixaPYeZghbTOLfrodsELaOxNnrT6ABYyCxdek+FghbUeJaz01GkPHM ApoS63fpQ5iWEncOckNMV5SY0v2QHeIYQYmTM5+Aw0RCYCWXxPaOD1AjXSQmbroDdYKwxKvj W9gnMOrMQnLdLIQNsxA2zEKyYRaSDQsYWVcxiqeWFuempxYb56WW6xUn5haX5qXrJefnbmIE JsLT/45/3cG44tVHvUOMTByMhxglOJiVRHhzzuenCvGmJFZWpRblxxeV5qQWH2KU5mBREudV TZFPFRJITyxJzU5NLUgtgskycXBKNTAxHQ9Ze8H+v46b1O/ZBc8/KDWl7kzm8PpnZ7P/1yFL UcYHTMWPb5upGxXFXtK56t5xUXmiCM866W9FFucaXqxgCiuR2DDBXG2D7WMmlhtuHlXPfZSi Wd7IrtdP/Xjn+YuZniwCe+NuP7u29Wt1aGB05KGJOeGbrHRl+Pbu5r7o/Hj+nh6JFOaMbUo3 30RM4lRf8zDdUqvz3O2FZS++PPGY53NH4IkGa853e3eHrXuaHrz/8OLUVEezh4duM1o+TZnF dlZaeMILLTHZ7sx528/d/P7RTab+XewOzdNxzft5j6XptWtWVz/wCjmXyvi5yPvQNs29X47u 6fz//uDWe6uOGf3PnXbxBN/rpRK/fqUuUWIpzkg01GIuKk4EALur4A/zAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrGKsWRmVeSWpSXmKPExsVy+t/xu7rPGwpSDW784bH4O3s7u8WJ600s Fh+uNbFa3Liwn9lizZZGJouLZ14zWpx78Z3JYl/3cVaLGf9eM1msnL+c0WL9s8PMFhuWrWW0 +P1jDpsDr8enec+ZPJZ0/mLy2DnrLrvHgk2lHhNmd7N5bF6h5bFpVSebx/f2PWwePW2bmDw+ b5IL4IrSsynKLy1JVcjILy6xVYo2tDDSM7S00DMysdQzNDaPtTIyVdK3s0lJzcksSy3St0vQ y3jZ+5W1oGcVY0X3l20sDYx3ljJ2MXJySAiYSGz68Z65i5GLQ0hgKaPEyUNH2CESMhIbv1xl hbCFJf5c62KDKPrIKHF25S5GCOc0o8TbnU/YQKqEBFYwSnxdrgliswnoS1xbc40ZxBYBWnH8 8XSwFcwCnSwSPZ9nMYEkhAWcJS5+/wOU4AAqcpG4OqcEot5IovXpTLCZLAIqEsuPzQU7lVdA Q2LZtZ3sIOVCAhYSG77bgJicApYSvV9NQCoYBWQlHq38BXY/s4C4xK0n85kg7heQWLLnPDOE LSrx8vE/qL90JM5efwINCAOJrUv3sUDYihLXem4ygoxnFtCUWL9LH8K0lLhzkBtiuqLElO6H 7BB3CUqcnPmEZQKjzCwki2chNM9CaJ6FpHkWkuYFjKyrGEVSS4tz03OLjfSKE3OLS/PS9ZLz czcxAhPctmM/t+xgXPnqo94hRiYOxkOMEhzMSiK8OefzU4V4UxIrq1KL8uOLSnNSiw8xmgJD bSKzlGhyPjDF5pXEG5oZmBqamFkamFqaGSuJ83oWdCQKCaQnlqRmp6YWpBbB9DFxcEo1MC0O mD1vSn+KXeSaCXOks5pN/m/f5pESuaHYtvy5WJfH9cb1KV6K2tM+LHrjy3aBddO1W0ePsnC4 VCntbzXwmeUreExNOGFZSKLWOnlfa49tRXvD2RwUbxjdLl1634JrquX2XtepM7abMlfvkrdO Xtq0zWW/tX5Znf4XRobL0wP57sRvbrwsmM/udiyp4f5MkyjX3XHhVRen2n9f3+UaZXPqm5HN 4rVWz8qrelNfJxUW3PqxTXtvQcRCU/VT03/ZHinYNGPdtuPlmbpd/H+mHhPjs2h4Fq06lWFd 7f6zX54kTDkQPTFiflFO9oJ7URwPZH9L2JhePTOn7KdO/asa+UJmM9fr534XiT4KdmjQVWIp zkg01GIuKk4EAAPt0tf5AwAA X-CMS-MailID: 20231206141047eucas1p1b6c2b022717a6b3a2e24e37b6a6d5d23 X-Msg-Generator: CA X-RootMTR: 20231206141047eucas1p1b6c2b022717a6b3a2e24e37b6a6d5d23 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20231206141047eucas1p1b6c2b022717a6b3a2e24e37b6a6d5d23 References: <20231201195300.1329092-1-mcanal@igalia.com> DQpIaSBNYWlyYSwNCg0KVGhhbmtzIGZvciB3b3JraW5nIG9uIHRoaXMhDQoNCkkgaGF2ZSBhIGZl dyBjb21tZW50cy4gSSB0aGluayBtb3N0IGhhdmUgYmVlbiBicm91Z2h0IHVwIGluIGVhcmxpZXIN CnJldmlzaW9ucywgYnV0IHNpbmNlIHRoZXkgYXJlIG5vdCByZXNvbHZlZCwgSSBwdXQgdGhlbSBh Z2FpbiBiZWxvdy4NCg0KTWHDrXJhIENhbmFsIDxtY2FuYWxAaWdhbGlhLmNvbT4gd3JpdGVzOg0K PiBkaWZmIC0tZ2l0IGEvcnVzdC9rZXJuZWwveGFycmF5LnJzIGIvcnVzdC9rZXJuZWwveGFycmF5 LnJzDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAwMDAwMC4uMWFhNzdl NmFiZmQ0DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvcnVzdC9rZXJuZWwveGFycmF5LnJzDQo+ IEBAIC0wLDAgKzEsMzQwIEBADQo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MA0KPiArDQo+ICsvLyEgWEFycmF5IGFic3RyYWN0aW9uLg0KPiArLy8hDQo+ICsvLyEgQyBoZWFk ZXI6IFtgaW5jbHVkZS9saW51eC94YXJyYXkuaGBdKC4uLy4uL2luY2x1ZGUvbGludXgveGFycmF5 LmgpDQo+ICsNCj4gK3VzZSBjcmF0ZTo6ew0KPiArICAgIGJpbmRpbmdzLA0KPiArICAgIGVycm9y Ojp7dG9fcmVzdWx0LCBFcnJvciwgUmVzdWx0fSwNCj4gKyAgICB0eXBlczo6e0ZvcmVpZ25Pd25h YmxlLCBPcGFxdWUsIFNjb3BlR3VhcmR9LA0KPiArfTsNCj4gK3VzZSBjb3JlOjp7DQo+ICsgICAg bWFya2VyOjp7UGhhbnRvbURhdGEsIFBoYW50b21QaW5uZWR9LA0KPiArICAgIG9wczo6RGVyZWYs DQo+ICsgICAgcGluOjpQaW4sDQo+ICsgICAgcHRyOjpOb25OdWxsLA0KPiArfTsNCj4gKw0KPiAr Ly8vIEZsYWdzIHBhc3NlZCB0byBgWEFycmF5OjpuZXdgIHRvIGNvbmZpZ3VyZSB0aGUgYFhBcnJh eWAuDQo+ICt0eXBlIEZsYWdzID0gYmluZGluZ3M6OmdmcF90Ow0KPiArDQo+ICsvLy8gRmxhZyB2 YWx1ZXMgcGFzc2VkIHRvIGBYQXJyYXk6Om5ld2AgdG8gY29uZmlndXJlIHRoZSBgWEFycmF5YC4N Cj4gK3B1YiBtb2QgZmxhZ3Mgew0KPiArICAgIC8vLyBVc2UgSVJRLXNhZmUgbG9ja2luZy4NCj4g KyAgICBwdWIgY29uc3QgTE9DS19JUlE6IHN1cGVyOjpGbGFncyA9IGJpbmRpbmdzOjpCSU5ESU5H U19YQV9GTEFHU19MT0NLX0lSUTsNCj4gKyAgICAvLy8gVXNlIHNvZnRpcnEtc2FmZSBsb2NraW5n Lg0KPiArICAgIHB1YiBjb25zdCBMT0NLX0JIOiBzdXBlcjo6RmxhZ3MgPSBiaW5kaW5nczo6QklO RElOR1NfWEFfRkxBR1NfTE9DS19CSDsNCj4gKyAgICAvLy8gVHJhY2sgd2hpY2ggZW50cmllcyBh cmUgZnJlZSAoZGlzdGluY3QgZnJvbSBOb25lKS4NCj4gKyAgICBwdWIgY29uc3QgVFJBQ0tfRlJF RTogc3VwZXI6OkZsYWdzID0gYmluZGluZ3M6OkJJTkRJTkdTX1hBX0ZMQUdTX1RSQUNLX0ZSRUU7 DQo+ICsgICAgLy8vIEluaXRpYWxpemUgYXJyYXkgaW5kZXggMCBhcyBidXN5Lg0KPiArICAgIHB1 YiBjb25zdCBaRVJPX0JVU1k6IHN1cGVyOjpGbGFncyA9IGJpbmRpbmdzOjpCSU5ESU5HU19YQV9G TEFHU19aRVJPX0JVU1k7DQo+ICsgICAgLy8vIFVzZSBHRlBfQUNDT1VOVCBmb3IgaW50ZXJuYWwg bWVtb3J5IGFsbG9jYXRpb25zLg0KPiArICAgIHB1YiBjb25zdCBBQ0NPVU5UOiBzdXBlcjo6Rmxh Z3MgPSBiaW5kaW5nczo6QklORElOR1NfWEFfRkxBR1NfQUNDT1VOVDsNCj4gKyAgICAvLy8gQ3Jl YXRlIGFuIGFsbG9jYXRpbmcgYFhBcnJheWAgc3RhcnRpbmcgYXQgaW5kZXggMC4NCj4gKyAgICBw dWIgY29uc3QgQUxMT0M6IHN1cGVyOjpGbGFncyA9IGJpbmRpbmdzOjpCSU5ESU5HU19YQV9GTEFH U19BTExPQzsNCj4gKyAgICAvLy8gQ3JlYXRlIGFuIGFsbG9jYXRpbmcgYFhBcnJheWAgc3RhcnRp bmcgYXQgaW5kZXggMS4NCj4gKyAgICBwdWIgY29uc3QgQUxMT0MxOiBzdXBlcjo6RmxhZ3MgPSBi aW5kaW5nczo6QklORElOR1NfWEFfRkxBR1NfQUxMT0MxOw0KPiArfQ0KPiArDQo+ICsvLy8gV3Jh cHBlciBmb3IgYSB2YWx1ZSBvd25lZCBieSB0aGUgYFhBcnJheWAgd2hpY2ggaG9sZHMgdGhlIGBY QXJyYXlgIGxvY2sgdW50aWwgZHJvcHBlZC4NCj4gK3B1YiBzdHJ1Y3QgR3VhcmQ8J2EsIFQ6IEZv cmVpZ25Pd25hYmxlPihOb25OdWxsPFQ+LCBQaW48JidhIFhBcnJheTxUPj4pOw0KPiArDQo+ICsv LyBJTlZBUklBTlRTOiBUaGUgbG9jayBoZWxkIGJ5IHRoZSBHdWFyZCBwcmV2ZW50cyBjb25jdXJy ZW50IGFjY2VzcyB0byB0aGUgWEFycmF5Lg0KPiArLy8gVGhlIEd1YXJkJ3MgRHJvcCBpbXBsZW1l bnRhdGlvbiByZWxlYXNlcyB0aGUgbG9jayBvbmx5IHdoZW4gdGhlIEd1YXJkIGlzDQo+ICsvLyBk cm9wcGVkLCBlbnN1cmluZyBleGNsdXNpdmUgYWNjZXNzIGR1cmluZyBpdHMgZXhpc3RlbmNlLiBU aGVyZWZvcmUsIHdpdGhpbg0KPiArLy8gdGhlIEd1YXJkJ3MgbGlmZXRpbWUsIG5vIG90aGVyIG9w ZXJhdGlvbiAoaW5jbHVkaW5nIHRoZSBYQXJyYXkNCj4gKy8vIGNhbGxpbmcgYFQ6OmZyb21fZm9y ZWlnbmApIGNhbiBhY2Nlc3Mgb3IgbW9kaWZ5IHRoZSB1bmRlcmx5aW5nIHZhbHVlLg0KPiArLy8N Cj4gKy8vIFRoZSBHdWFyZCBob2xkcyBhIHJlZmVyZW5jZSAoYHNlbGYuMGApIHRvIHRoZSB1bmRl cmx5aW5nIHZhbHVlIG93bmVkIGJ5DQo+ICsvLyBYQXJyYXkuIFlvdSBjYW4gdXNlIHRoZSBgaW50 b19mb3JlaWduYCBtZXRob2QgdG8gb2J0YWluIGEgcG9pbnRlciB0byB0aGUNCj4gKy8vIGZvcmVp Z24gcmVwcmVzZW50YXRpb24gb2YgdGhlIG93bmVkIHZhbHVlLCB3aGljaCBpcyB2YWxpZCBmb3Ig dGhlIGxpZmV0aW1lDQo+ICsvLyBvZiB0aGUgR3VhcmQuDQo+ICtpbXBsPCdhLCBUOiBGb3JlaWdu T3duYWJsZT4gR3VhcmQ8J2EsIFQ+IHsNCj4gKyAgICAvLy8gQm9ycm93IHRoZSB1bmRlcmx5aW5n IHZhbHVlIHdyYXBwZWQgYnkgdGhlIGBHdWFyZGAuDQo+ICsgICAgLy8vDQo+ICsgICAgLy8vIFJl dHVybnMgYSBgVDo6Qm9ycm93ZWRgIHR5cGUgZm9yIHRoZSBvd25lZCBgRm9yZWlnbk93bmFibGVg IHR5cGUuDQo+ICsgICAgcHViIGZuIGJvcnJvdygmc2VsZikgLT4gVDo6Qm9ycm93ZWQ8J18+IHsN Cj4gKyAgICAgICAgLy8gU0FGRVRZOiBUaGUgdmFsdWUgaXMgb3duZWQgYnkgdGhlIGBYQXJyYXlg LCB0aGUgbGlmZXRpbWUgaXQgaXMgYm9ycm93ZWQgZm9yIG11c3Qgbm90DQo+ICsgICAgICAgIC8v IG91dGxpdmUgdGhlIGBYQXJyYXlgIGl0c2VsZiwgbm9yIHRoZSBHdWFyZCB0aGF0IGhvbGRzIHRo ZSBsb2NrIGVuc3VyaW5nIHRoZSB2YWx1ZQ0KPiArICAgICAgICAvLyByZW1haW5zIGluIHRoZSBg WEFycmF5YC4NCj4gKyAgICAgICAgdW5zYWZlIHsgVDo6Ym9ycm93KHNlbGYuMC5hc19wdHIoKSBh cyBfKSB9DQoNCkkgdGhpbmsgc3BlY2lmeWluZyB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGNhc3Qg aGVyZSBpcyBwcmVmZXJhYmxlLiBUaGVuDQp0aGUgY29kZSB3aWxsIG5vdCBicmVhayBzaWxlbnRs eSBpZiBzb21ldGhpbmcgc2hvdWxkIGNoYW5nZS4NCg0KPiArICAgIH0NCj4gK30NCj4gKw0KPiAr Ly8gQ29udmVuaWVuY2UgaW1wbCBmb3IgYEZvcmVpZ25Pd25hYmxlYCB0eXBlcyB3aG9zZSBgQm9y cm93ZWRgDQo+ICsvLyBmb3JtIGltcGxlbWVudHMgRGVyZWYuDQo+ICtpbXBsPCdhLCBUOiBGb3Jl aWduT3duYWJsZT4gRGVyZWYgZm9yIEd1YXJkPCdhLCBUPg0KPiArd2hlcmUNCj4gKyAgICBUOjpC b3Jyb3dlZDwnYT46IERlcmVmLA0KPiArICAgIGZvcjwnYj4gVDo6Qm9ycm93ZWQ8J2I+OiBJbnRv PCYnYiA8VDo6Qm9ycm93ZWQ8J2E+IGFzIERlcmVmPjo6VGFyZ2V0PiwNCj4gK3sNCj4gKyAgICB0 eXBlIFRhcmdldCA9IDxUOjpCb3Jyb3dlZDwnYT4gYXMgRGVyZWY+OjpUYXJnZXQ7DQo+ICsNCj4g KyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7DQo+ICsgICAgICAgIHNlbGYu Ym9ycm93KCkuaW50bygpDQo+ICsgICAgfQ0KPiArfQ0KPiArDQo+ICtpbXBsPCdhLCBUOiBGb3Jl aWduT3duYWJsZT4gRHJvcCBmb3IgR3VhcmQ8J2EsIFQ+IHsNCj4gKyAgICBmbiBkcm9wKCZtdXQg c2VsZikgew0KPiArICAgICAgICAvLyBTQUZFVFk6IFRoZSBYQXJyYXkgd2UgaGF2ZSBhIHJlZmVy ZW5jZSB0byBvd25zIHRoZSBDIHhhcnJheSBvYmplY3QuDQo+ICsgICAgICAgIHVuc2FmZSB7IGJp bmRpbmdzOjp4YV91bmxvY2soc2VsZi4xLnhhLmdldCgpKSB9Ow0KPiArICAgIH0NCj4gK30NCj4g Kw0KPiArLy8vIFJlcHJlc2VudHMgYSByZXNlcnZlZCBzbG90IGluIGFuIGBYQXJyYXlgLCB3aGlj aCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHZhbHVlIGJ1dCBoYXMgYW4gYXNzaWduZWQNCj4gKy8vLyBp bmRleCBhbmQgbWF5IG5vdCBiZSBhbGxvY2F0ZWQgYnkgYW55IG90aGVyIHVzZXIuIElmIHRoZSBS ZXNlcnZhdGlvbiBpcyBkcm9wcGVkIHdpdGhvdXQNCj4gKy8vLyBiZWluZyBmaWxsZWQsIHRoZSBl bnRyeSBpcyBtYXJrZWQgYXMgYXZhaWxhYmxlIGFnYWluLg0KPiArLy8vDQo+ICsvLy8gVXNlcnMg bXVzdCBlbnN1cmUgdGhhdCByZXNlcnZlZCBzbG90cyBhcmUgbm90IGZpbGxlZCBieSBvdGhlciBt ZWNoYW5pc21zLCBvciBvdGhlcndpc2UgdGhlaXINCj4gKy8vLyBjb250ZW50cyBtYXkgYmUgZHJv cHBlZCBhbmQgcmVwbGFjZWQgKHdoaWNoIHdpbGwgcHJpbnQgYSB3YXJuaW5nKS4NCj4gK3B1YiBz dHJ1Y3QgUmVzZXJ2YXRpb248J2EsIFQ6IEZvcmVpZ25Pd25hYmxlPihQaW48JidhIFhBcnJheTxU Pj4sIHVzaXplLCBQaGFudG9tRGF0YTxUPik7DQo+ICsNCj4gK2ltcGw8J2EsIFQ6IEZvcmVpZ25P d25hYmxlPiBSZXNlcnZhdGlvbjwnYSwgVD4gew0KPiArICAgIC8vLyBTdG9yZXMgYSB2YWx1ZSBp bnRvIHRoZSByZXNlcnZlZCBzbG90Lg0KPiArICAgIHB1YiBmbiBzdG9yZShzZWxmLCB2YWx1ZTog VCkgLT4gUmVzdWx0PHVzaXplPiB7DQo+ICsgICAgICAgIGlmIHNlbGYuMC5yZXBsYWNlKHNlbGYu MSwgdmFsdWUpPy5pc19zb21lKCkgew0KPiArICAgICAgICAgICAgY3JhdGU6OnByX2VyciEoIlhB cnJheTogUmVzZXJ2YXRpb24gc3RvcmVkIGJ1dCB0aGUgZW50cnkgYWxyZWFkeSBoYWQgZGF0YSFc biIpOw0KPiArICAgICAgICAgICAgLy8gQ29uc2lkZXIgaXQgYSBzdWNjZXNzIGFueXdheSwgbm90 IG11Y2ggd2UgY2FuIGRvDQo+ICsgICAgICAgIH0NCj4gKyAgICAgICAgbGV0IGluZGV4ID0gc2Vs Zi4xOw0KPiArICAgICAgICAvLyBUaGUgcmVzZXJ2YXRpb24gaXMgbm93IGZ1bGZpbGxlZCwgc28g ZG8gbm90IHJ1biBvdXIgZGVzdHJ1Y3Rvci4NCj4gKyAgICAgICAgY29yZTo6bWVtOjpmb3JnZXQo c2VsZik7DQo+ICsgICAgICAgIE9rKGluZGV4KQ0KPiArICAgIH0NCj4gKw0KPiArICAgIC8vLyBS ZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHJlc2VydmF0aW9uLg0KPiArICAgIHB1YiBmbiBpbmRl eCgmc2VsZikgLT4gdXNpemUgew0KPiArICAgICAgICBzZWxmLjENCj4gKyAgICB9DQo+ICt9DQo+ ICsNCj4gK2ltcGw8J2EsIFQ6IEZvcmVpZ25Pd25hYmxlPiBEcm9wIGZvciBSZXNlcnZhdGlvbjwn YSwgVD4gew0KPiArICAgIGZuIGRyb3AoJm11dCBzZWxmKSB7DQo+ICsgICAgICAgIGlmIHNlbGYu MC5yZW1vdmUoc2VsZi4xKS5pc19zb21lKCkgew0KPiArICAgICAgICAgICAgY3JhdGU6OnByX2Vy ciEoIlhBcnJheTogUmVzZXJ2YXRpb24gZHJvcHBlZCBidXQgdGhlIGVudHJ5IHdhcyBub3QgZW1w dHkhXG4iKTsNCj4gKyAgICAgICAgfQ0KPiArICAgIH0NCj4gK30NCj4gKw0KPiArLy8vIEFuIGFy cmF5IHdoaWNoIGVmZmljaWVudGx5IG1hcHMgc3BhcnNlIGludGVnZXIgaW5kaWNlcyB0byBvd25l ZCBvYmplY3RzLg0KPiArLy8vDQo+ICsvLy8gVGhpcyBpcyBzaW1pbGFyIHRvIGEgYFZlYzxPcHRp b248VD4+YCwgYnV0IG1vcmUgZWZmaWNpZW50IHdoZW4gdGhlcmUgYXJlIGhvbGVzIGluIHRoZQ0K PiArLy8vIGluZGV4IHNwYWNlLCBhbmQgY2FuIGJlIGVmZmljaWVudGx5IGdyb3duLg0KPiArLy8v DQo+ICsvLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gb2Z0ZW4gYmUgdXNlZCB3aXRo IGFuIGlubmVyIHR5cGUgdGhhdA0KPiArLy8vIGNhbiBiZSBlZmZpY2llbnRseSBjbG9uZWQsIHN1 Y2ggYXMgYW4gYEFyYzxUPmAuDQo+ICtwdWIgc3RydWN0IFhBcnJheTxUOiBGb3JlaWduT3duYWJs ZT4gew0KPiArICAgIHhhOiBPcGFxdWU8YmluZGluZ3M6OnhhcnJheT4sDQo+ICsgICAgX3A6IFBo YW50b21EYXRhPFQ+LA0KPiArICAgIF9xOiBQaGFudG9tUGlubmVkLA0KPiArfQ0KPiArDQo+ICtp bXBsPFQ6IEZvcmVpZ25Pd25hYmxlPiBYQXJyYXk8VD4gew0KPiArICAgIC8vLyBDcmVhdGVzIGEg bmV3IGBYQXJyYXlgIHdpdGggdGhlIGdpdmVuIGZsYWdzLg0KPiArICAgIHB1YiBmbiBuZXcoZmxh Z3M6IEZsYWdzKSAtPiBYQXJyYXk8VD4gew0KPiArICAgICAgICBsZXQgeGEgPSBPcGFxdWU6OnVu aW5pdCgpOw0KPiArDQo+ICsgICAgICAgIC8vIFNBRkVUWTogV2UgaGF2ZSBqdXN0IGNyZWF0ZWQg YHhhYC4gVGhpcyBkYXRhIHN0cnVjdHVyZSBkb2VzIG5vdCByZXF1aXJlDQo+ICsgICAgICAgIC8v IHBpbm5pbmcuDQo+ICsgICAgICAgIHVuc2FmZSB7IGJpbmRpbmdzOjp4YV9pbml0X2ZsYWdzKHhh LmdldCgpLCBmbGFncykgfTsNCj4gKw0KPiArICAgICAgICAvLyBJTlZBUklBTlQ6IEFsbCBwb2lu dGVycyBzdG9yZWQgaW4gdGhlIGFycmF5IGFyZSBwb2ludGVycyBvYnRhaW5lZCBieQ0KPiArICAg ICAgICAvLyBjYWxsaW5nIGBUOjppbnRvX2ZvcmVpZ25gLg0KPiArICAgICAgICBYQXJyYXkgew0K PiArICAgICAgICAgICAgeGEsDQo+ICsgICAgICAgICAgICBfcDogUGhhbnRvbURhdGEsDQo+ICsg ICAgICAgICAgICBfcTogUGhhbnRvbVBpbm5lZCwNCj4gKyAgICAgICAgfQ0KPiArICAgIH0NCg0K U2luY2UgYHhhcnJheWAgaG9sZHMgYSBsb2NrLCBJIHRoaW5rIGl0IHNob3VsZCBiZSBwaW5uZWQu IEkgdGhpbmsgd2UNCmRpc2N1c3NlZCB0aGF0IGZvciB4ODYgaXQgZG9lcyBub3QgbmVlZCB0byBi ZSBwaW5uZWQgd2hlbiBpdCBpcyBub3QNCmxvY2tlZCwgYnV0IHdlIGFyZSBub3Qgc3VyZSBpZiB0 aGF0IGhvbGRzIGZvciBhbGwgYXJjaGl0ZWN0dXJlcy4NCg0KQWxzbyBlcmdvbm9taWNzIG1pZ2h0 IGJlIGJldHRlciBpZiB0aGUgY29uc3RydWN0b3IgcmV0dXJucyBhbg0KaW5pdGlhbGl6YXRpb24g cmF0aGVyIHRoYW4gdGhlIGNhbGxlciBoYXZpbmcgdG8gcGluIGFmdGVyIGluaXRpYWxpemF0aW9u Lg0KDQo+ICsNCj4gKyAgICAvLy8gUmVwbGFjZXMgYW4gZW50cnkgd2l0aCBhIG5ldyB2YWx1ZSwg cmV0dXJuaW5nIHRoZSBvbGQgdmFsdWUgKGlmIGFueSkuDQo+ICsgICAgcHViIGZuIHJlcGxhY2Uo c2VsZjogUGluPCZTZWxmPiwgaW5kZXg6IHVzaXplLCB2YWx1ZTogVCkgLT4gUmVzdWx0PE9wdGlv bjxUPj4gew0KPiArICAgICAgICBsZXQgbmV3ID0gdmFsdWUuaW50b19mb3JlaWduKCk7DQo+ICsg ICAgICAgIC8vIFNBRkVUWTogYG5ld2AganVzdCBjYW1lIGZyb20gaW50b19mb3JlaWduKCksIGFu ZCB3ZSBkaXNtaXNzIHRoaXMgZ3VhcmQgaWYNCj4gKyAgICAgICAgLy8gdGhlIHhhX3N0b3JlIG9w ZXJhdGlvbiBzdWNjZWVkcyBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyLg0KPiAr ICAgICAgICBsZXQgZ3VhcmQgPSBTY29wZUd1YXJkOjpuZXcofHwgdW5zYWZlIHsNCj4gKyAgICAg ICAgICAgIFQ6OmZyb21fZm9yZWlnbihuZXcpOw0KPiArICAgICAgICB9KTsNCj4gKw0KPiArICAg ICAgICAvLyBTQUZFVFk6IGBzZWxmLnhhYCBpcyBhbHdheXMgdmFsaWQgYnkgdGhlIHR5cGUgaW52 YXJpYW50LCBhbmQgd2UgYXJlIHN0b3JpbmcNCj4gKyAgICAgICAgLy8gYSBgVDo6aW50b19mb3Jl aWduKClgIHJlc3VsdCB3aGljaCB1cGhvbGRzIHRoZSBsYXRlciBpbnZhcmlhbnRzLg0KDQpUIGhh cyB0byBiZSA0LWJ5dGUgYWxpZ25lZCBhY2NvcmRpbmcgdG8geGFycmF5IGRvY3MuIEFsbCB0eXBl cyB0aGF0IHdlDQppbXBsZW1lbnQgYEZvcmVpZ25Pd25hYmxlYCBmb3IgaXMgYWxpZ25lZCBzdWNo LCBiZWNhdXNlDQpgS2VybmVsQWxsb2NhdG9yYCBpcyBwcm9kdWNpbmcgYWxsb2NhdGlvbnMgb2Yg YWxpZ25tZW50DQpgQVJDSF9TTEFCX01JTkFMSUdOYCwgd2hpY2ggaXMgYF9fYWxpZ25vZl9fKHVu c2lnbmVkIGxvbmcgbG9uZylgLiBCdXQgaXQNCnNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNhZmV0 eSByZXF1aXJlbWVudCBzb21ld2hlcmUuIFBlcmhhcHMgb24NCmBGb3JlaWduT3duYWJsZWAgYW5k IHRoZW4gbWFrZSB0aGF0IGFuIHVuc2FmZSB0cmFpdD8NCg0KPiArICAgICAgICBsZXQgb2xkID0g dW5zYWZlIHsNCj4gKyAgICAgICAgICAgIGJpbmRpbmdzOjp4YV9zdG9yZSgNCj4gKyAgICAgICAg ICAgICAgICBzZWxmLnhhLmdldCgpLA0KPiArICAgICAgICAgICAgICAgIGluZGV4LnRyeV9pbnRv KCk/LA0KPiArICAgICAgICAgICAgICAgIG5ldyBhcyAqbXV0IF8sDQoNClNhbWUgaGVyZSwgSSB3 b3VsZCBwcmVmZXIgZnVsbCB0eXBlLg0KDQo+ICsgICAgICAgICAgICAgICAgYmluZGluZ3M6OkdG UF9LRVJORUwsDQo+ICsgICAgICAgICAgICApDQo+ICsgICAgICAgIH07DQo+ICsNCj4gKyAgICAg ICAgLy8gU0FGRVRZOiBgeGFfc3RvcmVgIHJldHVybnMgdGhlIG9sZCBlbnRyeSBhdCB0aGlzIGlu ZGV4IG9uIHN1Y2Nlc3Mgb3INCj4gKyAgICAgICAgLy8gYSBYQXJyYXkgcmVzdWx0LCB3aGljaCBj YW4gYmUgdHVybiBpbnRvIGFuIGVycm5vIHRocm91Z2ggYHhhX2VycmAuDQo+ICsgICAgICAgIHRv X3Jlc3VsdCh1bnNhZmUgeyBiaW5kaW5nczo6eGFfZXJyKG9sZCkgfSk/Ow0KPiArICAgICAgICBn dWFyZC5kaXNtaXNzKCk7DQo+ICsNCj4gKyAgICAgICAgT2soaWYgb2xkLmlzX251bGwoKSB7DQo+ ICsgICAgICAgICAgICBOb25lDQo+ICsgICAgICAgIH0gZWxzZSB7DQo+ICsgICAgICAgICAgICAv LyBTQUZFVFk6IFRoZSBvbGQgdmFsdWUgbXVzdCBoYXZlIGJlZW4gc3RvcmVkIGJ5IGVpdGhlciB0 aGlzIGZ1bmN0aW9uIG9yDQo+ICsgICAgICAgICAgICAvLyBgYWxsb2NfbGltaXRzX29wdGAsIGJv dGggb2Ygd2hpY2ggZW5zdXJlIG5vbi1OVUxMIGVudHJpZXMgYXJlIHZhbGlkDQo+ICsgICAgICAg ICAgICAvLyBGb3JlaWduT3duYWJsZSBwb2ludGVycy4NCj4gKyAgICAgICAgICAgIFNvbWUodW5z YWZlIHsgVDo6ZnJvbV9mb3JlaWduKG9sZCkgfSkNCj4gKyAgICAgICAgfSkNCj4gKyAgICB9DQo+ ICsNCj4gKyAgICAvLy8gUmVwbGFjZXMgYW4gZW50cnkgd2l0aCBhIG5ldyB2YWx1ZSwgZHJvcHBp bmcgdGhlIG9sZCB2YWx1ZSAoaWYgYW55KS4NCj4gKyAgICBwdWIgZm4gc2V0KHNlbGY6IFBpbjwm U2VsZj4sIGluZGV4OiB1c2l6ZSwgdmFsdWU6IFQpIC0+IFJlc3VsdCB7DQo+ICsgICAgICAgIHNl bGYucmVwbGFjZShpbmRleCwgdmFsdWUpPzsNCj4gKyAgICAgICAgT2soKCkpDQo+ICsgICAgfQ0K PiArDQo+ICsgICAgLy8vIExvb2tzIHVwIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGVu dHJ5IGluIHRoZSBhcnJheSwgcmV0dXJuaW5nIGEgYEd1YXJkYCBpZiBpdA0KPiArICAgIC8vLyBl eGlzdHMuDQo+ICsgICAgLy8vDQo+ICsgICAgLy8vIFRoaXMgZ3VhcmQgYmxvY2tzIGFsbCBvdGhl ciBhY3Rpb25zIG9uIHRoZSBgWEFycmF5YC4gQ2FsbGVycyBhcmUgZXhwZWN0ZWQgdG8gZHJvcCB0 aGUNCj4gKyAgICAvLy8gYEd1YXJkYCBlYWdlcmx5IHRvIGF2b2lkIGJsb2NraW5nIG90aGVyIHVz ZXJzLCBzdWNoIGFzIGJ5IHRha2luZyBhIGNsb25lIG9mIHRoZSB2YWx1ZS4NCj4gKyAgICBwdWIg Zm4gZ2V0KHNlbGY6IFBpbjwmU2VsZj4sIGluZGV4OiB1c2l6ZSkgLT4gT3B0aW9uPEd1YXJkPCdf LCBUPj4gew0KPiArICAgICAgICAvLyBTQUZFVFk6IGBzZWxmLnhhYCBpcyBhbHdheXMgdmFsaWQg YnkgdGhlIHR5cGUgaW52YXJpYW50Lg0KPiArICAgICAgICB1bnNhZmUgeyBiaW5kaW5nczo6eGFf bG9jayhzZWxmLnhhLmdldCgpKSB9Ow0KPiArDQo+ICsgICAgICAgIC8vIFNBRkVUWTogYHNlbGYu eGFgIGlzIGFsd2F5cyB2YWxpZCBieSB0aGUgdHlwZSBpbnZhcmlhbnQuDQo+ICsgICAgICAgIGxl dCBndWFyZCA9IFNjb3BlR3VhcmQ6Om5ldyh8fCB1bnNhZmUgeyBiaW5kaW5nczo6eGFfdW5sb2Nr KHNlbGYueGEuZ2V0KCkpIH0pOw0KPiArDQo+ICsgICAgICAgIC8vIFNBRkVUWTogYHNlbGYueGFg IGlzIGFsd2F5cyB2YWxpZCBieSB0aGUgdHlwZSBpbnZhcmlhbnQuDQo+ICsgICAgICAgIGxldCBw ID0gdW5zYWZlIHsgYmluZGluZ3M6OnhhX2xvYWQoc2VsZi54YS5nZXQoKSwgaW5kZXgudHJ5X2lu dG8oKS5vaygpPykgfTsNCj4gKw0KPiArICAgICAgICBOb25OdWxsOjpuZXcocCBhcyAqbXV0IFQp Lm1hcCh8cHwgew0KPiArICAgICAgICAgICAgZ3VhcmQuZGlzbWlzcygpOw0KPiArICAgICAgICAg ICAgR3VhcmQocCwgc2VsZikNCj4gKyAgICAgICAgfSkNCj4gKyAgICB9DQo+ICsNCj4gKyAgICAv Ly8gUmVtb3ZlcyBhbmQgcmV0dXJucyBhbiBlbnRyeSwgcmV0dXJuaW5nIGl0IGlmIGl0IGV4aXN0 ZWQuDQo+ICsgICAgcHViIGZuIHJlbW92ZShzZWxmOiBQaW48JlNlbGY+LCBpbmRleDogdXNpemUp IC0+IE9wdGlvbjxUPiB7DQo+ICsgICAgICAgIC8vIFNBRkVUWTogYHNlbGYueGFgIGlzIGFsd2F5 cyB2YWxpZCBieSB0aGUgdHlwZSBpbnZhcmlhbnQuDQo+ICsgICAgICAgIGxldCBwID0gdW5zYWZl IHsgYmluZGluZ3M6OnhhX2VyYXNlKHNlbGYueGEuZ2V0KCksIGluZGV4LnRyeV9pbnRvKCkub2so KT8pIH07DQo+ICsgICAgICAgIGlmIHAuaXNfbnVsbCgpIHsNCj4gKyAgICAgICAgICAgIE5vbmUN Cj4gKyAgICAgICAgfSBlbHNlIHsNCj4gKyAgICAgICAgICAgIC8vIFNBRkVUWTogQWxsIHBvaW50 ZXJzIHN0b3JlZCBpbiB0aGUgYXJyYXkgYXJlIHBvaW50ZXJzIG9idGFpbmVkIGJ5DQo+ICsgICAg ICAgICAgICAvLyBjYWxsaW5nIGBUOjppbnRvX2ZvcmVpZ25gLg0KPiArICAgICAgICAgICAgU29t ZSh1bnNhZmUgeyBUOjpmcm9tX2ZvcmVpZ24ocCkgfSkNCj4gKyAgICAgICAgfQ0KPiArICAgIH0N Cj4gKw0KPiArICAgIC8vLyBBbGxvY2F0ZXMgYSBuZXcgaW5kZXggaW4gdGhlIGFycmF5LCBvcHRp b25hbGx5IHN0b3JpbmcgYSBuZXcgdmFsdWUgaW50byBpdCwgd2l0aA0KPiArICAgIC8vLyBjb25m aWd1cmFibGUgYm91bmRzIGZvciB0aGUgaW5kZXggcmFuZ2UgdG8gYWxsb2NhdGUgZnJvbS4NCj4g KyAgICAvLy8NCj4gKyAgICAvLy8gSWYgYHZhbHVlYCBpcyBgTm9uZWAsIHRoZW4gdGhlIGluZGV4 IGlzIHJlc2VydmVkIGZyb20gZnVydGhlciBhbGxvY2F0aW9uIGJ1dCByZW1haW5zDQo+ICsgICAg Ly8vIGZyZWUgZm9yIHN0b3JpbmcgYSB2YWx1ZSBpbnRvIGl0Lg0KPiArICAgIGZuIGFsbG9jX2xp bWl0c19vcHQoc2VsZjogUGluPCZTZWxmPiwgdmFsdWU6IE9wdGlvbjxUPiwgbWluOiB1MzIsIG1h eDogdTMyKSAtPiBSZXN1bHQ8dXNpemU+IHsNCj4gKyAgICAgICAgbGV0IG5ldyA9IHZhbHVlLm1h cF9vcihjb3JlOjpwdHI6Om51bGwoKSwgfGF8IGEuaW50b19mb3JlaWduKCkpOw0KPiArICAgICAg ICBsZXQgbXV0IGlkOiB1MzIgPSAwOw0KPiArDQo+ICsgICAgICAgIGxldCBndWFyZCA9IFNjb3Bl R3VhcmQ6Om5ldyh8fCB7DQo+ICsgICAgICAgICAgICBpZiAhbmV3LmlzX251bGwoKSB7DQo+ICsg ICAgICAgICAgICAgICAgLy8gU0FGRVRZOiBJZiBgbmV3YCBpcyBub3QgTlVMTCwgaXQgY2FtZSBm cm9tIHRoZSBgRm9yZWlnbk93bmFibGVgIHdlIGdvdA0KPiArICAgICAgICAgICAgICAgIC8vIGZy b20gdGhlIGNhbGxlci4NCj4gKyAgICAgICAgICAgICAgICB1bnNhZmUgeyBUOjpmcm9tX2ZvcmVp Z24obmV3KSB9Ow0KPiArICAgICAgICAgICAgfQ0KPiArICAgICAgICB9KTsNCj4gKw0KPiArICAg ICAgICAvLyBTQUZFVFk6IGBzZWxmLnhhYCBpcyBhbHdheXMgdmFsaWQgYnkgdGhlIHR5cGUgaW52 YXJpYW50LiBJZiB0aGlzIHN1Y2NlZWRzLCBpdA0KPiArICAgICAgICAvLyB0YWtlcyBvd25lcnNo aXAgb2YgdGhlIHBhc3NlZCBgVGAgKGlmIGFueSkuIElmIGl0IGZhaWxzLCB3ZSBtdXN0IGRyb3Ag dGhlDQo+ICsgICAgICAgIC8vIGBUYCBhZ2Fpbi4NCj4gKyAgICAgICAgbGV0IHJldCA9IHVuc2Fm ZSB7DQo+ICsgICAgICAgICAgICBiaW5kaW5nczo6eGFfYWxsb2MoDQo+ICsgICAgICAgICAgICAg ICAgc2VsZi54YS5nZXQoKSwNCj4gKyAgICAgICAgICAgICAgICAmbXV0IGlkLA0KPiArICAgICAg ICAgICAgICAgIG5ldyBhcyAqbXV0IF8sDQoNCkFnYWluLCBJIHByZWZlciB0aGUgZnVsbCB0eXBl IGhlcmUuDQoNCj4gKyAgICAgICAgICAgICAgICBiaW5kaW5nczo6eGFfbGltaXQgeyBtaW4sIG1h eCB9LA0KPiArICAgICAgICAgICAgICAgIGJpbmRpbmdzOjpHRlBfS0VSTkVMLA0KPiArICAgICAg ICAgICAgKQ0KPiArICAgICAgICB9Ow0KPiArDQo+ICsgICAgICAgIGlmIHJldCA8IDAgew0KPiAr ICAgICAgICAgICAgRXJyKEVycm9yOjpmcm9tX2Vycm5vKHJldCkpDQo+ICsgICAgICAgIH0gZWxz ZSB7DQo+ICsgICAgICAgICAgICBndWFyZC5kaXNtaXNzKCk7DQo+ICsgICAgICAgICAgICBPayhp ZCBhcyB1c2l6ZSkNCj4gKyAgICAgICAgfQ0KPiArICAgIH0NCj4gKw0KPiArICAgIC8vLyBBbGxv Y2F0ZXMgYSBuZXcgaW5kZXggaW4gdGhlIGFycmF5LCBzdG9yaW5nIGEgbmV3IHZhbHVlIGludG8g aXQsIHdpdGggY29uZmlndXJhYmxlDQo+ICsgICAgLy8vIGJvdW5kcyBmb3IgdGhlIGluZGV4IHJh bmdlIHRvIGFsbG9jYXRlIGZyb20uDQo+ICsgICAgcHViIGZuIGFsbG9jX2xpbWl0cyhzZWxmOiBQ aW48JlNlbGY+LCB2YWx1ZTogVCwgbWluOiB1MzIsIG1heDogdTMyKSAtPiBSZXN1bHQ8dXNpemU+ IHsNCj4gKyAgICAgICAgc2VsZi5hbGxvY19saW1pdHNfb3B0KFNvbWUodmFsdWUpLCBtaW4sIG1h eCkNCj4gKyAgICB9DQo+ICsNCj4gKyAgICAvLy8gQWxsb2NhdGVzIGEgbmV3IGluZGV4IGluIHRo ZSBhcnJheSwgc3RvcmluZyBhIG5ldyB2YWx1ZSBpbnRvIGl0Lg0KPiArICAgIHB1YiBmbiBhbGxv YyhzZWxmOiBQaW48JlNlbGY+LCB2YWx1ZTogVCkgLT4gUmVzdWx0PHVzaXplPiB7DQo+ICsgICAg ICAgIHNlbGYuYWxsb2NfbGltaXRzKHZhbHVlLCAwLCB1MzI6Ok1BWCkNCj4gKyAgICB9DQo+ICsN Cj4gKyAgICAvLy8gUmVzZXJ2ZXMgYSBuZXcgaW5kZXggaW4gdGhlIGFycmF5IHdpdGhpbiBjb25m aWd1cmFibGUgYm91bmRzIGZvciB0aGUgaW5kZXguDQo+ICsgICAgLy8vDQo+ICsgICAgLy8vIFJl dHVybnMgYSBgUmVzZXJ2YXRpb25gIG9iamVjdCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBz dG9yZSBhIHZhbHVlIGF0IHRoaXMgaW5kZXggb3INCj4gKyAgICAvLy8gb3RoZXJ3aXNlIGZyZWUg aXQgZm9yIHJldXNlLg0KPiArICAgIHB1YiBmbiByZXNlcnZlX2xpbWl0cyhzZWxmOiBQaW48JlNl bGY+LCBtaW46IHUzMiwgbWF4OiB1MzIpIC0+IFJlc3VsdDxSZXNlcnZhdGlvbjwnXywgVD4+IHsN Cj4gKyAgICAgICAgT2soUmVzZXJ2YXRpb24oDQo+ICsgICAgICAgICAgICBzZWxmLA0KPiArICAg ICAgICAgICAgc2VsZi5hbGxvY19saW1pdHNfb3B0KE5vbmUsIG1pbiwgbWF4KT8sDQo+ICsgICAg ICAgICAgICBQaGFudG9tRGF0YSwNCj4gKyAgICAgICAgKSkNCj4gKyAgICB9DQo+ICsNCj4gKyAg ICAvLy8gUmVzZXJ2ZXMgYSBuZXcgaW5kZXggaW4gdGhlIGFycmF5Lg0KPiArICAgIC8vLw0KPiAr ICAgIC8vLyBSZXR1cm5zIGEgYFJlc2VydmF0aW9uYCBvYmplY3QsIHdoaWNoIGNhbiB0aGVuIGJl IHVzZWQgdG8gc3RvcmUgYSB2YWx1ZSBhdCB0aGlzIGluZGV4IG9yDQo+ICsgICAgLy8vIG90aGVy d2lzZSBmcmVlIGl0IGZvciByZXVzZS4NCj4gKyAgICBwdWIgZm4gcmVzZXJ2ZShzZWxmOiBQaW48 JlNlbGY+KSAtPiBSZXN1bHQ8UmVzZXJ2YXRpb248J18sIFQ+PiB7DQo+ICsgICAgICAgIE9rKFJl c2VydmF0aW9uKA0KPiArICAgICAgICAgICAgc2VsZiwNCj4gKyAgICAgICAgICAgIHNlbGYuYWxs b2NfbGltaXRzX29wdChOb25lLCAwLCB1MzI6Ok1BWCk/LA0KPiArICAgICAgICAgICAgUGhhbnRv bURhdGEsDQo+ICsgICAgICAgICkpDQo+ICsgICAgfQ0KPiArfQ0KPiArDQo+ICtpbXBsPFQ6IEZv cmVpZ25Pd25hYmxlPiBEcm9wIGZvciBYQXJyYXk8VD4gew0KPiArICAgIGZuIGRyb3AoJm11dCBz ZWxmKSB7DQo+ICsgICAgICAgIGxldCBtdXQgaW5kZXg6IGNvcmU6OmZmaTo6Y191bG9uZyA9IDA7 DQo+ICsNCj4gKyAgICAgICAgLy8gU0FGRVRZOiBgc2VsZi54YWAgaXMgdmFsaWQgYnkgdGhlIHR5 cGUgaW52YXJpYW50LCBhbmQgYXMgd2UgaGF2ZQ0KPiArICAgICAgICAvLyB0aGUgb25seSByZWZl cmVuY2UgdG8gdGhlIGBYQXJyYXlgIHdlIGNhbiBzYWZlbHkgaXRlcmF0ZSBpdHMgY29udGVudHMN Cj4gKyAgICAgICAgLy8gYW5kIGRyb3AgZXZlcnl0aGluZy4NCj4gKyAgICAgICAgdW5zYWZlIHsN Cj4gKyAgICAgICAgICAgIGxldCBtdXQgZW50cnkgPSBiaW5kaW5nczo6eGFfZmluZCgNCj4gKyAg ICAgICAgICAgICAgICBzZWxmLnhhLmdldCgpLA0KPiArICAgICAgICAgICAgICAgICZtdXQgaW5k ZXgsDQo+ICsgICAgICAgICAgICAgICAgY29yZTo6ZmZpOjpjX3Vsb25nOjpNQVgsDQo+ICsgICAg ICAgICAgICAgICAgYmluZGluZ3M6OkJJTkRJTkdTX1hBX1BSRVNFTlQsDQo+ICsgICAgICAgICAg ICApOw0KPiArDQo+ICsgICAgICAgICAgICB3aGlsZSAhZW50cnkuaXNfbnVsbCgpIHsNCj4gKyAg ICAgICAgICAgICAgICBUOjpmcm9tX2ZvcmVpZ24oZW50cnkpOw0KPiArICAgICAgICAgICAgICAg IGVudHJ5ID0gYmluZGluZ3M6OnhhX2ZpbmRfYWZ0ZXIoDQo+ICsgICAgICAgICAgICAgICAgICAg IHNlbGYueGEuZ2V0KCksDQo+ICsgICAgICAgICAgICAgICAgICAgICZtdXQgaW5kZXgsDQo+ICsg ICAgICAgICAgICAgICAgICAgIGNvcmU6OmZmaTo6Y191bG9uZzo6TUFYLA0KPiArICAgICAgICAg ICAgICAgICAgICBiaW5kaW5nczo6QklORElOR1NfWEFfUFJFU0VOVCwNCj4gKyAgICAgICAgICAg ICAgICApOw0KPiArICAgICAgICAgICAgfQ0KPiArICAgICAgICB9DQo+ICsNCj4gKyAgICAgICAg Ly8gU0FGRVRZOiBMb2NrZWQgbG9ja3MgYXJlIG5vdCBzYWZlIHRvIGRyb3AuIE5vcm1hbGx5IHdl IHdvdWxkIHdhbnQgdG8NCj4gKyAgICAgICAgLy8gdHJ5X2xvY2soKS91bmxvY2soKSBoZXJlIGZv ciBzYWZldHkgb3Igc29tZXRoaW5nIHNpbWlsYXIsIGJ1dCBpbiB0aGlzDQo+ICsgICAgICAgIC8v IGNhc2UgeGFfZGVzdHJveSgpIGlzIGd1YXJhbnRlZWQgdG8gYWNxdWlyZSB0aGUgbG9jayBhbnl3 YXkuIFRoaXMgd2lsbA0KPiArICAgICAgICAvLyBkZWFkbG9jayBpZiBhIGxvY2sgZ3VhcmQgd2Fz IGltcHJvcGVybHkgZHJvcHBlZCwgYnV0IHRoYXQgaXMgbm90IFVCLA0KPiArICAgICAgICAvLyBz byBpdCdzIHN1ZmZpY2llbnQgZm9yIHNvdW5kbmVzcyBwdXJwb3Nlcy4NCj4gKyAgICAgICAgdW5z YWZlIHsNCj4gKyAgICAgICAgICAgIGJpbmRpbmdzOjp4YV9kZXN0cm95KHNlbGYueGEuZ2V0KCkp Ow0KPiArICAgICAgICB9DQo+ICsgICAgfQ0KPiArfQ0KPiArDQo+ICsvLyBTQUZFVFk6IFhBcnJh eSBpcyB0aHJlYWQtc2FmZSBhbmQgYWxsIG11dGF0aW9uIG9wZXJhdGlvbnMgYXJlIGludGVybmFs bHkgbG9ja2VkLg0KPiArdW5zYWZlIGltcGw8VDogU2VuZCArIEZvcmVpZ25Pd25hYmxlPiBTZW5k IGZvciBYQXJyYXk8VD4ge30NCj4gK3Vuc2FmZSBpbXBsPFQ6IFN5bmMgKyBGb3JlaWduT3duYWJs ZT4gU3luYyBmb3IgWEFycmF5PFQ+IHt9DQoNCkRvIHdlIGFjdHVhbGx5IG5lZWQgdG8gc3BlY2lm eSBgRm9yZWlnbk93bmFibGVgIGhlcmU/DQoNCg0KQmVzdCByZWdhcmRzLA0KQW5kcmVhcyBIaW5k Ym9yZw0K