From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8B76C43B2D; Mon, 19 Feb 2024 12:10:46 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4EA4940289; Mon, 19 Feb 2024 12:10:46 +0100 (CET) Received: from dkmailrelay1.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id 9D65140275 for ; Mon, 19 Feb 2024 12:10:45 +0100 (CET) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesys.local [192.168.4.10]) by dkmailrelay1.smartsharesystems.com (Postfix) with ESMTP id 7A9CA208E6; Mon, 19 Feb 2024 12:10:43 +0100 (CET) Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Subject: RE: [RFC 1/5] eal: add static per-lcore memory allocation facility X-MimeOLE: Produced By Microsoft Exchange V6.5 Date: Mon, 19 Feb 2024 12:10:40 +0100 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35E9F22E@smartserver.smartshare.dk> In-Reply-To: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [RFC 1/5] eal: add static per-lcore memory allocation facility Thread-Index: AdpjCCF8oyuUMp2KTMiw3BVm+HYqiQAE1kJQ References: <20240208181644.455233-1-mattias.ronnblom@ericsson.com> <20240208181644.455233-2-mattias.ronnblom@ericsson.com> <98CBD80474FA8B44BF855DF32C47DC35E9F200@smartserver.smartshare.dk> <98CBD80474FA8B44BF855DF32C47DC35E9F203@smartserver.smartshare.dk> From: =?utf-8?B?TW9ydGVuIEJyw7hydXA=?= To: =?utf-8?B?TWF0dGlhcyBSw7ZubmJsb20=?= , =?utf-8?B?TWF0dGlhcyBSw7ZubmJsb20=?= , Cc: "Stephen Hemminger" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org PiBGcm9tOiBNYXR0aWFzIFLDtm5uYmxvbSBbbWFpbHRvOmhvZm9yc0BseXNhdG9yLmxpdS5zZV0N Cj4gU2VudDogTW9uZGF5LCAxOSBGZWJydWFyeSAyMDI0IDA4LjQ5DQo+IA0KPiBPbiAyMDI0LTAy LTA5IDE0OjA0LCBNb3J0ZW4gQnLDuHJ1cCB3cm90ZToNCj4gPj4gRnJvbTogTWF0dGlhcyBSw7Zu bmJsb20gW21haWx0bzpob2ZvcnNAbHlzYXRvci5saXUuc2VdDQo+ID4+IFNlbnQ6IEZyaWRheSwg OSBGZWJydWFyeSAyMDI0IDEyLjQ2DQo+ID4+DQo+ID4+IE9uIDIwMjQtMDItMDkgMDk6MjUsIE1v cnRlbiBCcsO4cnVwIHdyb3RlOg0KPiA+Pj4+IEZyb206IE1hdHRpYXMgUsO2bm5ibG9tIFttYWls dG86bWF0dGlhcy5yb25uYmxvbUBlcmljc3Nvbi5jb21dDQo+ID4+Pj4gU2VudDogVGh1cnNkYXks IDggRmVicnVhcnkgMjAyNCAxOS4xNw0KPiA+Pj4+DQo+ID4+Pj4gSW50cm9kdWNlIERQREsgcGVy LWxjb3JlIGlkIHZhcmlhYmxlcywgb3IgbGNvcmUgdmFyaWFibGVzIGZvcg0KPiBzaG9ydC4NCj4g Pj4+Pg0KPiA+Pj4+IEFuIGxjb3JlIHZhcmlhYmxlIGhhcyBvbmUgdmFsdWUgZm9yIGV2ZXJ5IGN1 cnJlbnQgYW5kIGZ1dHVyZSBsY29yZQ0KPiA+Pj4+IGlkLWVxdWlwcGVkIHRocmVhZC4NCj4gPj4+ Pg0KPiA+Pj4+IFRoZSBwcmltYXJ5IDxydGVfbGNvcmVfdmFyLmg+IHVzZSBjYXNlIGlzIGZvciBz dGF0aWNhbGx5DQo+IGFsbG9jYXRpbmcNCj4gPj4+PiBzbWFsbCBjaHVua3Mgb2Ygb2Z0ZW4tdXNl ZCBkYXRhLCB3aGljaCBpcyByZWxhdGVkIGxvZ2ljYWxseSwgYnV0DQo+ID4+IHdoZXJlDQo+ID4+ Pj4gdGhlcmUgYXJlIHBlcmZvcm1hbmNlIGJlbmVmaXRzIHRvIHJlYXAgZnJvbSBoYXZpbmcgdXBk YXRlcyBiZWluZw0KPiA+PiBsb2NhbA0KPiA+Pj4+IHRvIGFuIGxjb3JlLg0KPiA+Pj4+DQo+ID4+ Pj4gTGNvcmUgdmFyaWFibGVzIGFyZSBzaW1pbGFyIHRvIHRocmVhZC1sb2NhbCBzdG9yYWdlIChU TFMsIGUuZy4sDQo+IEMxMQ0KPiA+Pj4+IF9UaHJlYWRfbG9jYWwpLCBidXQgZGVjb3VwbGluZyB0 aGUgdmFsdWVzJyBsaWZlIHRpbWUgd2l0aCB0aGF0IG9mDQo+ID4+IHRoZQ0KPiA+Pj4+IHRocmVh ZHMuDQo+ID4+Pj4NCj4gPj4+PiBMY29yZSB2YXJpYWJsZXMgYXJlIGFsc28gc2ltaWxhciBpbiB0 ZXJtcyBvZiBmdW5jdGlvbmFsaXR5DQo+IHByb3ZpZGVkDQo+ID4+IGJ5DQo+ID4+Pj4gRnJlZUJT RCBrZXJuZWwncyBEUENQVV8qKCkgZmFtaWx5IG9mIG1hY3JvcyBhbmQgdGhlIGFzc29jaWF0ZWQN Cj4gPj4+PiBidWlsZC10aW1lIG1hY2hpbmVyeS4gRFBDUFUgdXNlcyBsaW5rZXIgc2NyaXB0cywg d2hpY2ggZWZmZWN0aXZlbHkNCj4gPj4+PiBwcmV2ZW50cyB0aGUgcmV1c2Ugb2YgaXRzLCBvdGhl cndpc2Ugc2VlbWluZ2x5IHZpYWJsZSwgYXBwcm9hY2guDQo+ID4+Pj4NCj4gPj4+PiBUaGUgY3Vy cmVudGx5LXByZXZhaWxpbmcgd2F5IHRvIHNvbHZlIHRoZSBzYW1lIHByb2JsZW0gYXMgbGNvcmUN Cj4gPj4+PiB2YXJpYWJsZXMgaXMgdG8ga2VlcCBhIG1vZHVsZSdzIHBlci1sY29yZSBkYXRhIGFz IFJURV9NQVhfTENPUkUtDQo+ID4+IHNpemVkDQo+ID4+Pj4gYXJyYXkgb2YgY2FjaGUtYWxpZ25l ZCwgUlRFX0NBQ0hFX0dVQVJEZWQgc3RydWN0cy4gVGhlIGJlbmVmaXQgb2YNCj4gPj4+PiBsY29y ZSB2YXJpYWJsZXMgb3ZlciB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgZGF0YSByZWxhdGVkIHRvIHRo ZQ0KPiBzYW1lDQo+ID4+Pj4gbGNvcmUgbm93IGlzIGNsb3NlIChzcGF0aWFsbHksIGluIG1lbW9y eSksIHJhdGhlciB0aGFuIGRhdGEgdXNlZA0KPiBieQ0KPiA+Pj4+IHRoZSBzYW1lIG1vZHVsZSwg d2hpY2ggaW4gdHVybiBhdm9pZCBleGNlc3NpdmUgdXNlIG9mIHBhZGRpbmcsDQo+ID4+Pj4gcG9s bHV0aW5nIGNhY2hlcyB3aXRoIHVudXNlZCBkYXRhLg0KPiA+Pj4+DQo+ID4+Pj4gU2lnbmVkLW9m Zi1ieTogTWF0dGlhcyBSw7ZubmJsb20gPG1hdHRpYXMucm9ubmJsb21AZXJpY3Nzb24uY29tPg0K PiA+Pj4+IC0tLQ0KPiA+Pj4NCj4gPj4+IFRoaXMgbG9va3MgdmVyeSBwcm9taXNpbmcuIDotKQ0K PiA+Pj4NCj4gPj4+IEhlcmUncyBhIGJ1bmNoIG9mIGNvbW1lbnRzLCBxdWVzdGlvbnMgYW5kIHN1 Z2dlc3Rpb25zLg0KPiA+Pj4NCj4gPj4+DQo+ID4+PiAqIFF1ZXN0aW9uOiBQZXJmb3JtYW5jZS4N Cj4gPj4+IFdoYXQgaXMgdGhlIGNvc3Qgb2YgYWNjZXNzaW5nIGFuIGxjb3JlIHZhcmlhYmxlIHZz IGEgdmFyaWFibGUgaW4NCj4gVExTPw0KPiA+Pj4gSSBzdXBwb3NlIHRoZSByZWxhdGl2ZSBjb3N0 IGRpbWluaXNoZXMgaWYgdGhlIHZhcmlhYmxlIGlzIGEgbGFyZ2VyDQo+ID4+IHN0cnVjdCwgY29t cGFyZWQgdG8gYSBzaW1wbGUgdWludDY0X3QuDQo+ID4+Pg0KPiA+Pg0KPiA+PiBJbiBjYXNlIGFs bCB0aGUgcmVsZXZhbnQgZGF0YSBpcyBhdmFpbGFibGUgaW4gYSBjYWNoZSBjbG9zZSB0byB0aGUN Cj4gPj4gY29yZSwNCj4gPj4gYm90aCBvcHRpb25zIGNhcnJ5IHF1aXRlIGxvdyBvdmVyaGVhZC4N Cj4gPj4NCj4gPj4gQWNjZXNzaW5nIGEgbGNvcmUgdmFyaWFibGUgd2lsbCBhbHdheXMgcmVxdWly ZSBhIFRMUyBsb29rdXAsIGluIHRoZQ0KPiA+PiBmb3JtDQo+ID4+IG9mIHJldHJpZXZpbmcgdGhl IGxjb3JlX2lkIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gSW4gdGhhdCBzZW5zZSwNCj4gdGhlcmUN Cj4gPj4gd2lsbCBsaWtlbHkgYmUgYSBudW1iZXIgb2YgZXh0cmEgaW5zdHJ1Y3Rpb25zIHJlcXVp cmVkIHRvIGRvIHRoZQ0KPiBsY29yZQ0KPiA+PiB2YXJpYWJsZSBhZGRyZXNzIGxvb2t1cCAoaS5l LiwgZG9pbmcgdGhlIGxvYWQgZnJvbSBydGVfbGNvcmVfdmFyDQo+IHRhYmxlDQo+ID4+IGJhc2Vk IG9uIHRoZSBsY29yZV9pZCB5b3UganVzdCBsb29rZWQgdXAsIGFuZCBhZGRpbmcgdGhlIHZhcmlh YmxlJ3MNCj4gPj4gb2Zmc2V0KS4NCj4gPj4NCj4gPj4gQSBUTFMgbG9va3VwIHdpbGwgaW5jdXIg YW4gZXh0cmEgb3ZlcmhlYWQgb2YgbGVzcyB0aGFuIGEgY2xvY2sNCj4gY3ljbGUsDQo+ID4+IGNv bXBhcmVkIHRvIGFjY2Vzc2luZyBhIG5vbi1UTFMgc3RhdGljIHZhcmlhYmxlLCBpbiBjYXNlIHN0 YXRpYw0KPiBsaW5raW5nDQo+ID4+IGlzIHVzZWQuIEZvciBzaGFyZWQgb2JqZWN0cywgVExTIGlz IG11Y2ggbW9yZSBleHBlbnNpdmUgKHNvbWV0aGluZw0KPiA+PiBvZnRlbg0KPiA+PiB2aXNpYmxl IGluIGR5bmFtaWNhbGx5IGxpbmtlZCBEUERLIGFwcCBmbGFtZSBncmFwaHMsIGluIHRoZSBmb3Jt IG9mDQo+IHRoZQ0KPiA+PiBfX3Rsc19hZGRyIHN5bWJvbCkuIFRoZW4geW91IG5lZWQgdG8gYWRk IH4zIGNjL2FjY2Vzcy4gVGhpcyBvbiBhDQo+IG1pY3JvDQo+ID4+IGJlbmNobWFyayBydW5uaW5n IG9uIGEgeDg2XzY0IFJhcHRvciBMYWtlIFAtY29yZS4NCj4gPj4NCj4gPj4gKFRvIHZpc2lhbGl6 ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNoYXJlZCBvYmplY3QgYW5kIG5vdCwgb25lIGNhbg0K PiB1c2UNCj4gPj4gQ29tcGlsZXIgRXhwbG9yZXIgYW5kIC1mUElDIHZlcnN1cyAtZlBJRS4pDQo+ ID4+DQo+ID4+IFRoaW5ncyBnZXQgbW9yZSBjb21wbGljYXRlZCBpZiB5b3UgYWNjZXNzIHRoZSBz YW1lIHZhcmlhYmxlIGluIHRoZQ0KPiBzYW1lDQo+ID4+IHNlY3Rpb24gY29kZSwgc2luY2UgdGhl biBpdCBjYW4gYmUgbGVmdCBvbiB0aGUgc3RhY2svaW4gYSByZWdpc3Rlcg0KPiBieQ0KPiA+PiB0 aGUgY29tcGlsZXIsIGVzcGVjaWFsbHkgaWYgTFRPIGlzIHVzZWQuIEluIG90aGVyIHdvcmRzLCBp ZiB5b3UgZG8NCj4gPj4gcnRlX2xjb3JlX2lkKCkgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdywgb25s eSB0aGUgZmlyc3Qgb25lIHdpbGwgY29zdA0KPiB5b3UNCj4gPj4gYW55dGhpbmcuIFRoaXMgaGFw cGVucyBmYWlybHkgb2Z0ZW4gaW4gRFBESywgd2l0aCBydGVfbGNvcmVfaWQoKS4NCj4gPj4NCj4g Pj4gRmluYWxseSwgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlDQo+ID4+DQo+ID4+IGRpZmYgLS1n aXQgYS9saWIvZWFsL2NvbW1vbi9ydGVfcmFuZG9tLmMNCj4gYi9saWIvZWFsL2NvbW1vbi9ydGVf cmFuZG9tLmMNCj4gPj4gaW5kZXggYWY5ZmZmZDgxYi4uYTY1YzMwZDI3ZSAxMDA2NDQNCj4gPj4g LS0tIGEvbGliL2VhbC9jb21tb24vcnRlX3JhbmRvbS5jDQo+ID4+ICsrKyBiL2xpYi9lYWwvY29t bW9uL3J0ZV9yYW5kb20uYw0KPiA+PiBAQCAtMTI1LDE0ICsxMjUsNyBAQCBfX3J0ZV9yYW5kX2xm c3IyNTgoc3RydWN0IHJ0ZV9yYW5kX3N0YXRlDQo+ICpzdGF0ZSkNCj4gPj4gICAgc3RhdGljIF9f cnRlX2Fsd2F5c19pbmxpbmUNCj4gPj4gICAgc3RydWN0IHJ0ZV9yYW5kX3N0YXRlICpfX3J0ZV9y YW5kX2dldF9zdGF0ZSh2b2lkKQ0KPiA+PiAgICB7DQo+ID4+IC0gICAgICAgdW5zaWduZWQgaW50 IGlkeDsNCj4gPj4gLQ0KPiA+PiAtICAgICAgIGlkeCA9IHJ0ZV9sY29yZV9pZCgpOw0KPiA+PiAt DQo+ID4+IC0gICAgICAgaWYgKHVubGlrZWx5KGlkeCA9PSBMQ09SRV9JRF9BTlkpKQ0KPiA+PiAt ICAgICAgICAgICAgICAgcmV0dXJuICZ1bnJlZ2lzdGVyZWRfcmFuZF9zdGF0ZTsNCj4gPj4gLQ0K PiA+PiAtICAgICAgIHJldHVybiBSVEVfTENPUkVfVkFSX1BUUihyYW5kX3N0YXRlKTsNCj4gPj4g KyAgICAgICByZXR1cm4gJnVucmVnaXN0ZXJlZF9yYW5kX3N0YXRlOw0KPiA+PiAgICB9DQo+ID4+ DQo+ID4+ICAgIHVpbnQ2NF90DQo+ID4+DQo+ID4+IC4uLmFuZCByZS1ydW4gdGhlIHJhbmRfcGVy Zl9hdXRvdGVzdCwgYXQgbGVhc3QgSSBzZWUgbm8gZGlmZmVyZW5jZQ0KPiBhdA0KPiA+PiBhbGwg KGluIGEgc3RhdGljYWxseSBsaW5rZWQgYnVpbGQpLiBCb3RoIHJlc3VsdHMgaW4gcnRlX3JhbmQo KSB1c2luZw0KPiA+PiB+MTENCj4gPj4gY2MvY2FsbC4gV2hhdCB0aGF0IHN1Z2dlc3RzIGlzIHRo YXQgVExTIG92ZXJoZWFkIGlzIHZlcnkgc21hbGwsIGFuZA0KPiA+PiB0aGF0DQo+ID4+IGFueSBl eHRyYSBpbnN0cnVjdGlvbnMgcmVxdWlyZWQgYnkgbGNvcmUgdmFyaWFibGVzIGRvZXNuJ3QgYWRk IG11Y2gsDQo+IGlmDQo+ID4+IGFueXRoaW5nIGF0IGFsbCwgYXQgbGVhc3QgaW4gdGhpcyBwYXJ0 aWN1bGFyIGNhc2UuDQo+ID4NCj4gPiBFeGNlbGxlbnQuIFRoYW5rIHlvdSBmb3IgYSB0aG9yb3Vn aCBhbmQgZGV0YWlsZWQgYW5zd2VyLCBNYXR0aWFzLg0KPiA+DQo+ID4+DQo+ID4+PiBTb21lIG9m IG15IHN1Z2dlc3Rpb25zIGJlbG93IG1pZ2h0IGFsc28gYWZmZWN0IHBlcmZvcm1hbmNlLg0KPiA+ Pj4NCj4gPj4+DQo+ID4+PiAqIEFkdmFudGFnZTogUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB3 b3JrZXIgdGhyZWFkIHZhcmlhYmxlcy4NCj4gPj4+IFdpdGggdGhlIGN1cnJlbnQgYWx0ZXJuYXRp dmUgKHRocmVhZC1sb2NhbCBzdG9yYWdlKSwgdGhlIG1haW4NCj4gdGhyZWFkDQo+ID4+IGNhbm5v dCBhY2Nlc3MgdGhlIFRMUyB2YXJpYWJsZXMgb2YgdGhlIHdvcmtlciB0aHJlYWRzLA0KPiA+Pj4g dW5sZXNzIHdvcmtlciB0aHJlYWRzIHB1Ymxpc2ggZ2xvYmFsIGFjY2VzcyBwb2ludGVycy4NCj4g Pj4+IExjb3JlIHZhcmlhYmxlcyBvZiBhbnkgbGNvcmUgdGhyZWFkIGNhbiBiZSBkaXJlY2N0bHkg YWNjZXNzZWQgYnkNCj4gYW55DQo+ID4+IHRocmVhZCwgd2hpY2ggc2ltcGxpZmllcyBjb2RlLg0K PiA+Pj4NCj4gPj4+DQo+ID4+PiAqIEFkdmFudGFnZTogUm9hZG1hcCB0b3dhcmRzIGh1Z2VtZW0u DQo+ID4+PiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBsY29yZSB2YXJpYWJsZSBtZW1vcnkgd2Fz IGFsbG9jYXRlZCBpbg0KPiA+PiBodWdlbWVtLCB0byByZWR1Y2UgVExCIG1pc3Nlcy4NCj4gPj4+ IFRoZSBjdXJyZW50IGFsdGVybmF0aXZlICh0aHJlYWQtbG9jYWwgc3RvcmFnZSkgaXMgYWxzbyBu b3QgdXNpbmcNCj4gPj4gaHVnZW1lbnQsIHNvIG5vdCBhIGRlZ3JhZGF0aW9uLg0KPiA+Pj4NCj4g Pj4NCj4gPj4gSSBhZ3JlZSwgYnV0IHRoZSB0aGluZyBpcyBpdCdzIGhhcmQgdG8gZmlndXJlIG91 dCBob3cgbXVjaCBtZW1vcnkgaXMNCj4gPj4gcmVxdWlyZWQgZm9yIHRoZXNlIGtpbmQgb2YgdmFy aWFibGVzLCBnaXZlbiBob3cgRFBESyBpcyBidWlsdCBhbmQNCj4gPj4gbGlua2VkLiBJbiBhbiBP UyBrZXJuZWwsIHlvdSBjYW4ganVzdCB0YWtlIGFsbCB0aGUgc3ltYm9scywgcHV0IHRoZW0NCj4g aW4NCj4gPj4gYSBzcGVjaWFsIHNlY3Rpb24sIGFuZCBzaXplIHRoYXQgc2VjdGlvbi4gU3VjaCBh IHRoaW5nIGNhbid0IGVhc2lseQ0KPiBiZQ0KPiA+PiBkb25lIHdpdGggRFBESywgc2luY2Ugc2hh cmVkIG9iamVjdCBidWlsZHMgYXJlIHN1cHBvcnRlZCwgcGx1cyB0aGF0DQo+ID4+IHRoaXMNCj4g Pj4gZmFjaWxpdHkgc2hvdWxkIGJlIGF2YWlsYWJsZSBub3Qgb25seSB0byBEUERLIG1vZHVsZXMs IGJ1dCBhbHNvIHRoZQ0KPiA+PiBhcHBsaWNhdGlvbiwgc28gcmVseWluZyBvbiBsaW5rZXIgc2Ny aXB0cyBpc24ndCByZWFsbHkgZmVhc2libGUgKG5vdA0KPiA+PiBwcm9iYWJseSBub3QgZXZlbiBm ZWFzaWJsZSBmb3IgRFBESyBpdHNlbGYpLg0KPiA+Pg0KPiA+PiBJbiB0aGF0IHNjZW5hcmlvLCB5 b3Ugd2FudCB0byBzaXplIHVwIHRoZSBwZXItbGNvcmUgYnVmZmVyIHRvIGJlIHNvDQo+ID4+IGxh cmdlLCB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBvdmVycnVucy4gVGhhdCB3aWxsIHdh c3RlDQo+IG1lbW9yeS4NCj4gPj4gSWYgeW91IHVzZSBodWdlIHBhZ2UgbWVtb3J5LCBwYWdpbmcg Y2FuJ3QgaGVscCB5b3UgdG8gYXZvaWQNCj4gPj4gcHJlLWFsbG9jYXRpbmcgYWN0dWFsIHBoeXNp Y2FsIG1lbW9yeS4NCj4gPg0KPiA+IEdvb2QgcG9pbnQuDQo+ID4gSSBoYWQgbm90aWNlZCB0aGF0 IFJURV9NQVhfTENPUkVfVkFSIHdhcyAxIE1CIChwZXIgUlRFX01BWF9MQ09SRSksDQo+IGJ1dCBJ IGhhZG4ndCBjb25zaWRlcmVkIGhvdyBwYWdpbmcgaGVscHMgdXMgdXNlIGxlc3MgcGh5c2ljYWwg bWVtb3J5DQo+IHRoYW4gdGhhdC4NCj4gPg0KPiA+Pg0KPiA+PiBUaGF0IHNhaWQsIGV2ZW4gbGFy Z2UgKGJ5IHN0YXRpYyBwZXItbGNvcmUgZGF0YSBzdGFuZGFyZHMpIGJ1ZmZlcnMNCj4gYXJlDQo+ ID4+IHBvdGVudGlhbGx5IHNtYWxsIGVub3VnaCBub3QgdG8gZ3JvdyB0aGUgYW1vdW50IG9mIG1l bW9yeSB1c2VkIGJ5IGENCj4gPj4gRFBESw0KPiA+PiBwcm9jZXNzIHRvbyBtdWNoLiBZb3UgbmVl ZCB0byBwcm92aXNpb24gZm9yIFJURV9NQVhfTENPUkUgb2YgdGhlbQ0KPiA+PiB0aG91Z2guDQo+ ID4+DQo+ID4+IFRoZSB2YWx1ZSBvZiBsY29yZSB2YXJpYWJsZXMgc2hvdWxkIGJlIHNtYWxsLCBh bmQgdGh1cyBpbmN1ciBmZXcgVExCDQo+ID4+IG1pc3Nlcywgc28geW91IG1heSBub3QgZ2FpbiBt dWNoIGZyb20gaHVnZSBwYWdlcy4gSW4gbXkgd29ybGQsIGl0J3MNCj4gPj4gbW9yZQ0KPiA+PiBh Ym91dCAiZml0dGluZyBvZnRlbi11c2VkIHBlci1sY29yZSBkYXRhIGludG8gTDEgb3IgTDIgQ1BV IGNhY2hlcyIsDQo+ID4+IHJhdGhlciB0aGFuIHRoZSBlYXNpZXIgImZpdHRpbmcgb2Z0ZW4tdXNl ZCBwZXItbGNvcmUgZGF0YSBpbnRvIGENCj4gPj4gd29ya2luZw0KPiA+PiBzZXQgc2l6ZSByZWFz b25hYmx5IGV4cGVjdGVkIHRvIGJlIGNvdmVyZWQgYnkgaGFyZHdhcmUgVExCL2NhY2hlcyIuDQo+ ID4NCj4gPiBZZXMsIEkgc3VwcG9zZSB0aGF0IGxjb3JlIHZhcmlhYmxlcyBhcmUgaW50ZW5kZWQg dG8gYmUgc21hbGwsIGFuZA0KPiBsYXJnZSBwZXItbGNvcmUgc3RydWN0dXJlcyBzaG91bGQga2Vl cCBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgZGVzaWduDQo+IHBhdHRlcm5zIGZvciBhbGxvY2F0aW9u IGFuZCBhY2Nlc3MuDQo+ID4NCj4gDQo+IEl0IHNlZW1zIHRvIG1lIHRoYXQgc3VwcG9ydCBmb3Ig cGVyLWxjb3JlIGhlYXBzIHNob3VsZCBiZSB0aGUgc29sdXRpb24NCj4gZm9yIHN1cHBvcnRpbmcg dXNlIGNhc2VzIHJlcXVpcmluZyBtYW55LCBsYXJnZXIgYW5kL29yIGR5bmFtaWMgb2JqZWN0cw0K PiBvbiBhIHBlci1sY29yZSBiYXNpcy4NCj4gDQo+IElkZWFsbHksIHlvdSB3b3VsZCBkZXNpZ24g Ym90aCB0aGF0IG1lY2hhbmlzbSBhbmQgbGNvcmUgdmFyaWFibGVzDQo+IHRvZ2V0aGVyLCBidXQg dGhlbiBpZiB5b3UgY291cGxlIGVub3VnaCBhbW91bnQgb2YgaW1wcm92ZW1lbnRzIHRvZ2V0aGVy DQo+IHlvdSB3aWxsIG5ldmVyIGdldCBhbnl3aGVyZS4gQW4gaW5zdGFuY2Ugb2Ygd2hlcmUgcGVy ZmVjdCBpcyB0aGUgZW5lbXkNCj4gb2YgZ29vZCwgcGVyaGFwcy4NCg0KU28gdHJ1ZS4gOi0pDQoN Cj4gDQo+ID4gUGVyaGFwcyB0aGlzIGd1aWRlbGluZSBpcyB3b3J0aCBtZW50aW9uaW5nIGluIHRo ZSBkb2N1bWVudGF0aW9uLg0KPiA+DQo+IA0KPiBXaGF0IGlzIG1pc3NpbmcsIG1vcmUgc3BlY2lm aWNhbGx5PyBUaGUgc2l6ZSBsaW1pdGF0aW9uIGFuZCB0aGUgc3RhdGljDQo+IG5hdHVyZSBvZiBs Y29yZSB2YXJpYWJsZXMgaXMgZGVzY3JpYmVkLCBhbmQgd2hhdCBjdXJyZW50IGRlc2lnbg0KPiBw YXR0ZXJucw0KPiB0aGV5IGV4cGVjdGVkIHRvIChwYXJ0bHkpIHJlcGxhY2UgaXMgYWxzbyBjb3Zl cmVkLg0KDQpZb3VyIGRvY3VtZW50YXRpb24gaXMgZmluZSwgYW5kIG5vdGhpbmcgc3BlY2lmaWMg aXMgbWlzc2luZyBoZXJlLg0KSSB3YXMgdGhpbmtpbmcgb3V0IGxvdWQgdGhhdCB0aGUgaGlnaCBs ZXZlbCBEUERLIGRvY3VtZW50YXRpb24gc2hvdWxkIGRlc2NyaWJlIGNvbW1vbiBkZXNpZ24gcGF0 dGVybnMuDQoNCj4gDQo+ID4+DQo+ID4+PiBMY29yZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB2 ZXJ5IGVhcmx5IGF0IHN0YXJ0dXAsIHNvIEkgZ3Vlc3MgdGhlDQo+ID4+IFJURSBtZW1vcnkgYWxs b2NhdG9yIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLg0KPiA+Pj4gSHVnZW1lbSBjb3VsZCBiZSBhbGxv Y2F0ZWQgdXNpbmcgTy9TIGFsbG9jYXRpb24sIHNvIHRoZXJlIGlzIGENCj4gPj4gcG9zc2libGUg cm9hZCB0b3dhcmRzIHVzaW5nIGh1Z2VtZW0uDQo+ID4+Pg0KPiA+Pg0KPiA+PiBXaXRoIHRoZSBj dXJyZW50IGRlc2lnbiwgdGhhdCB0cnVlLiBJJ20gbm90IHN1cmUgaXQncyBhIHN0cmljdA0KPiA+ PiByZXF1aXJlbWVudCB0aG91Z2gsIGJ1dCBpdCBkb2VzIG1ha2VzIHRoaW5ncyBzaW1wbGVyLg0K PiA+Pg0KPiA+Pj4gRWl0aGVyIHdheSwgdXNpbmcgaHVnZW1lbnQgd291bGQgcmVxdWlyZSBvbmUg bW9yZSBpbmRpcmVjdGlvbiAodGhlDQo+ID4+IHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBodWdl bWVtKS4NCj4gPj4+IEkgZG9uJ3Qga25vdyB3aGljaCBoYXMgYmV0dGVyIHBlcmZvcm1hbmNlLCB1 c2luZyBodWdlbWVtIG9yDQo+IGF2b2lkaW5nDQo+ID4+IHRoZSBhZGRpdGlvbmFsIHBvaW50ZXIg ZGVyZWZlcmVuY2luZy4NCj4gPj4+DQo+ID4+Pg0KPiA+Pj4gKiBTdWdnZXN0aW9uOiBDb25zaWRl ciBhZGRpbmcgYW4gZW50cnkgZm9yIHVucmVnaXN0ZXJlZCBub24tRUFMDQo+ID4+IHRocmVhZHMu DQo+ID4+PiBQbGVhc2UgY29uc2lkZXIgbWFraW5nIHJvb20gZm9yIG9uZSBtb3JlIGVudHJ5LCBz aGFyZWQgYnkgYWxsDQo+ID4+IHVucmVnaXN0ZXJlZCBub24tRUFMIHRocmVhZHMsIGkuZS4NCj4g Pj4+IG1ha2luZyB0aGUgYXJyYXkgc2l6ZSBSVEVfTUFYX0xDT1JFICsgMSBhbmQgaW5kZXhpbmcg YnkNCj4gPj4gKHJ0ZV9sY29yZV9pZCgpIDwgUlRFX01BWF9MQ09SRSA/IHJ0ZV9sY29yZV9pZCgp IDogUlRFX01BWF9MQ09SRSkuDQo+ID4+Pg0KPiA+Pj4gSXQgd291bGQgYmUgY29udmVuaWVudCBm b3IgdGhlIHVzZSBjYXNlcyB3aGVyZSBhIHZhcmlhYmxlIHNoYXJlZCBieQ0KPiA+PiB0aGUgdW5y ZWdpc3RlcmVkIG5vbi1FQUwgdGhyZWFkcyBkb24ndCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50Lg0K PiA+Pj4NCj4gPj4NCj4gPj4gSSB0aG91Z2h0IGFib3V0IHRoaXMsIGJ1dCBpdCB3b3VsZCByZXF1 aXJlIGEgY29uZGl0aW9uYWwgaW4gdGhlDQo+IGxvb2t1cA0KPiA+PiBtYWNybywgYXMgeW91IHNo b3cuIE1vcmUgaW1wb3J0YW50bHksIGl0IHdvdWxkIG1ha2UgdGhlIHdob2xlDQo+ID4+IDxydGVf bGNvcmVfdmFyLmg+IHRoaW5nIGxlc3MgZWxlZ2FudCBhbmQgaGFyZGVyIHRvIHVuZGVyc3RhbmQu IEl0J3MNCj4gYmFkDQo+ID4+IGVub3VnaCB0aGF0ICJwZXItbGNvcmUiIGlzIGFjdHVhbGx5ICJw ZXItbGNvcmUgaWQiIChvciB0aGUNCj4gZXF1aXZhbGVudA0KPiA+PiAicGVyLUVBTCB0aHJlYWQg YW5kIHVucmVnaXN0ZXJlZCBFQUwtdGhyZWFkIikuIEFkZGluZyBhICJidHcgaXQncw0KPiA8d2hh dA0KPiA+PiBJIHNhaWQgYmVmb3JlPiArIDEiIGlzIG5vdCBhbiBpbXByb3ZlbWVudC4NCj4gPg0K PiA+IFdlIGNvdWxkIHByb21vdGUgIm9uZSBtb3JlIGVudHJ5IGZvciB1bnJlZ2lzdGVyZWQgbm9u LUVBTCB0aHJlYWRzIg0KPiBkZXNpZ24gcGF0dGVybiAoZm9yIHJlbGV2YW50IHVzZSBjYXNlcyBv bmx5ISkgYnkgZXh0ZW5kaW5nIEVBTCB3aXRoIG9uZQ0KPiBtb3JlIFRMUyB2YXJpYWJsZSwgbWFp bnRhaW5lZCBsaWtlIF90aHJlYWRfaWQsIGJ1dCBzZXQgdG8gUlRFX01BWF9MQ09SRQ0KPiB3aGVu IF90cmVhZF9pZCBpcyBzZXQgdG8gLTE6DQo+ID4NCj4gPiArKysgZWFsX2NvbW1vbl90aHJlYWQu YzoNCj4gPiAgICBSVEVfREVGSU5FX1BFUl9MQ09SRShpbnQsIF90aHJlYWRfaWQpID0gLTE7DQo+ ID4gKyBSVEVfREVGSU5FX1BFUl9MQ09SRShpbnQsIF90aHJlYWRfaWR4KSA9IFJURV9NQVhfTENP UkU7DQoNClVwcy4uLiB3cm9uZyByZWZlcmVuY2UhIEkgbWVhbnQgdG8gcmVmZXIgdG8gX2xjb3Jl X2lkLCBub3QgX3RocmVhZF9pZC4gQ29ycmVjdGlvbjoNCg0KV2UgY291bGQgcHJvbW90ZSAib25l IG1vcmUgZW50cnkgZm9yIHVucmVnaXN0ZXJlZCBub24tRUFMIHRocmVhZHMiIGRlc2lnbiBwYXR0 ZXJuIChmb3IgcmVsZXZhbnQgdXNlIGNhc2VzIG9ubHkhKSBieSBleHRlbmRpbmcgRUFMIHdpdGgg b25lIG1vcmUgVExTIHZhcmlhYmxlLCBtYWludGFpbmVkIGxpa2UgX2xjb3JlX2lkLCBidXQgc2V0 IHRvIFJURV9NQVhfTENPUkUgd2hlbiBfbGNvcmVfaWQgaXMgc2V0IHRvIExDT1JFX0lEX0FOWToN Cg0KKysrIGVhbF9jb21tb25fdGhyZWFkLmM6DQogIFJURV9ERUZJTkVfUEVSX0xDT1JFKHVuc2ln bmVkIGludCwgX2xjb3JlX2lkKSA9IExDT1JFX0lEX0FOWTsNCisgUlRFX0RFRklORV9QRVJfTENP UkUodW5zaWduZWQgaW50LCBfbGNvcmVfaWR4KSA9IFJURV9NQVhfTENPUkU7DQoNCj4gPg0KPiA+ IGFuZA0KPiA+DQo+ID4gKysrIHJ0ZV9sY29yZS5oOg0KPiA+IHN0YXRpYyBpbmxpbmUgdW5zaWdu ZWQNCj4gPiBydGVfbGNvcmVfaWQodm9pZCkNCj4gPiB7DQo+ID4gCXJldHVybiBSVEVfUEVSX0xD T1JFKF9sY29yZV9pZCk7DQo+ID4gfQ0KPiA+ICsgc3RhdGljIGlubGluZSB1bnNpZ25lZA0KPiA+ ICsgcnRlX2xjb3JlX2lkeCh2b2lkKQ0KPiA+ICsgew0KPiA+ICsgCXJldHVybiBSVEVfUEVSX0xD T1JFKF9sY29yZV9pZHgpOw0KPiA+ICsgfQ0KPiA+DQo+ID4gVGhhdCB3b3VsZCBlbGltaW5hdGUg dGhlIChydGVfbGNvcmVfaWQoKSA8IFJURV9NQVhfTENPUkUgPw0KPiBydGVfbGNvcmVfaWQoKSA6 IFJURV9NQVhfTENPUkUpIGNvbmRpdGlvbmFsLCBhbHNvIHdoZXJlIGN1cnJlbnRseSB1c2VkLg0K PiA+DQo+IA0KPiBXb3VsZG4ndCB0aGF0IGVmZmVjdGl2ZWx5IGdpdmUgYSBzaGFyZWQgbGNvcmUg aWQgdG8gYWxsIHVucmVnaXN0ZXJlZA0KPiB0aHJlYWRzPw0KDQpZZXMsIGp1c3QgbGlrZSB0aGUg cnRlX2xjb3JlX2lkKCkgaXMgTENPUkVfSURfQU5ZIChpLmUuIFVJTlQzMl9NQVgpIGZvciBhbGwg dW5yZWdpc3RlcmVkIHRocmVhZHM7IGJ1dCBpdCB3aWxsIGJlIHVzYWJsZSBmb3IgYXJyYXkgaW5k ZXhpbmcsIGJlaGF2aW5nIGFzIGEgc2hhZG93IHZhcmlhYmxlIG9mIFJURV9QRVJfTENPUkUoX2xj b3JlX2lkKSBmb3Igb3B0aW1pemluZyBhd2F5IHRoZSAicnRlX2xjb3JlX2lkKCkgPCBSVEVfTUFY X0xDT1JFID8gcnRlX2xjb3JlX2lkKCkgOiBSVEVfTUFYX0xDT1JFIiB3aGVuIGluZGV4aW5nLg0K DQo+IA0KPiBXZSBkZWZpbml0ZWx5IHNob3VsZG4ndCBmdXJ0aGVyIGNvbXBsaWNhdGUgYW55dGhp bmcgcmVsYXRlZCB0byB0aGUgRFBESw0KPiB0aHJlYWRpbmcgbW9kZWwsIGluIG15IG9waW5pb24u DQo+IA0KPiBJZiBhIG1vZHVsZSBuZWVkcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBpbnN0YW5jZXMg dGhhdCBhcmVuJ3QgcGVyIGxjb3JlLA0KPiB1c2UgcmVndWxhciBzdGF0aWMgYWxsb2NhdGlvbiBp bnN0ZWFkLiBJIHdvdWxkIGZhdm9yIGNsYXJpdHkgb3Zlcg0KPiBjb252ZW5pZW5jZSBoZXJlLCBh dCBsZWFzdCB1bnRpbCB3ZSBrbm93IGJldHRlciAoc2VlIGJlbG93IGFzIHdlbGwpLg0KPiANCj4g Pj4NCj4gPj4gQnV0IHVzZWZ1bD8gU3VyZS4NCj4gPj4NCj4gPj4gSSB0aGluayB5b3UgbWF5IHN0 aWxsIG5lZWQgb3RoZXIgZGF0YSBmb3IgZGVhbGluZyB3aXRoIHVucmVnaXN0ZXJlZA0KPiA+PiB0 aHJlYWRzLCBmb3IgZXhhbXBsZSBhIG11dGV4IG9yIHNwaW4gbG9jayB0byBkZWFsIHdpdGggY29u Y3VycmVuY3kNCj4gPj4gaXNzdWVzIHRoYXQgYXJpc2VzIHdpdGggc2hhcmVkIGRhdGEuDQo+ID4N Cj4gPiBBZGRpbmcgdGhlIGV4dHJhIGVudHJ5IGlzIG9ubHkgZm9yIHRoZSBiZW5lZml0IG9mIHVz ZSBjYXNlcyB3aGVyZQ0KPiBzcGVjaWFsIGhhbmRsaW5nIGlzIG5vdCByZXF1aXJlZC4gSXQgd2ls bCBtYWtlIHRoZSBjb2RlIGZvciB0aG9zZSB1c2UNCj4gY2FzZXMgbXVjaCBjbGVhbmVyLiBJIHRo aW5rIGl0IGlzIHVzZWZ1bC4NCj4gPg0KPiANCj4gSXQgd2lsbCBtYWtlIGl0IHNob3J0ZXIsIGJ1 dCBub3QgbGVzcyBjbGVhbiwgSSB3b3VsZCBhcmd1ZS4NCj4gDQo+ID4gVXNlIGNhc2VzIHJlcXVp cmluZyBzcGVjaWFsIGhhbmRsaW5nIHNob3VsZCBzdGlsbCBkbyB0aGUgc3BlY2lhbA0KPiBoYW5k bGluZyB0aGV5IGRvIHRvZGF5Lg0KPiA+DQo+IA0KPiBGb3IgRFBESyBtb2R1bGVzIHVzaW5nIGxj b3JlIHZhcmlhYmxlcyBhbmQgd2hpY2ggdHJlYXQgdW5yZWdpc3RlcmVkDQo+IHRocmVhZHMgYXMg ImZ1bGwgY2l0aXplbnMiLCBJIGV4cGVjdCBzcGVjaWFsIGhhbmRsaW5nIG9mIHVucmVnaXN0ZXJl ZA0KPiB0aHJlYWRzIHRvIGJlIHRoZSBub3JtLiBUYWtlIHJ0ZV9yYW5kb20uaCBhcyBhbiBleGFt cGxlLiBDdXJyZW50IEFQSQ0KPiBkb2VzIG5vdCBndWFyYW50ZWUgTVQgc2FmZXR5IGZvciBjb25j dXJyZW50IGNhbGxzIG9mIHVucmVnaXN0ZXJlZA0KPiB0aHJlYWRzLiBJdCBwcm9iYWJseSBzaG91 bGQsIGFuZCBpdCBzaG91bGQgcHJvYmFibHkgYmUgYnkgbWVhbnMgb2YgYQ0KPiBtdXRleCAobm90 IHNwaW5sb2NrKS4NCj4gDQo+IFRoZSByZWFzb24gSSdtIG5vdCBydW5uaW5nIG9mZiB0byBtYWtl IGEgcnRlX3JhbmRvbS5jIHBhdGNoIGlzIHRoYXQncw0KPiBpdCdzIHVuY2xlYXIgdG8gbWUgd2hh dCBpcyB0aGUgcm9sZSBvZiB1bnJlZ2lzdGVyZWQgdGhyZWFkcyBpbiBEUERLLg0KPiBJJ20NCj4g cmVhc29uYWJseSBjb21mb3J0YWJsZSB3aXRoIGEgbW9kZWwgd2hlcmUgdGhlcmUgYXJlIG1hbnkg dGhyZWFkcyB0aGF0DQo+IGJhc2ljYWxseSBkb24ndCBpbnRlcmFjdCB3aXRoIHRoZSBEUERLIEFQ SXMgKGV4Y2VwdCBtYXliZSBzb21lIHZlcnkNCj4gbmFycm93IGV4cG9zdXJlLCBsaWtlIHRoZSBw cmVlbXB0aW9uLXNhZmUgcmluZyB2YXJpYW50KS4gT25lIGV4YW1wbGUgb2YNCj4gc3VjaCBhIGRl c2lnbiB3b3VsZCBiZSBiaWcgc2xvdyBjb250cm9sIHBsYW5lIHdoaWNoIHVzZXMgbXVsdGktDQo+ IHRocmVhZGluZw0KPiBhbmQgdGhlIExpbnV4IHByb2Nlc3Mgc2NoZWR1bGVyIGZvciB3b3JrIHNj aGVkdWxpbmcsIGhvc3RlZCBpbiB0aGUgc2FtZQ0KPiBwcm9jZXNzIGFzIGEgRFBESyBkYXRhIHBs YW5lIGFwcC4NCj4gDQo+IFdoYXQgSSBmaW5kIG1vcmUgc3RyYW5nZSBpcyBhIHNjZW5hcmlvIHdo ZXJlIHRoZXJlIGFyZSB1bnJlZ2lzdGVyZWQNCj4gdGhyZWFkcyB3aGljaCBpbnRlcmFjdHMgd2l0 aCBhIHdpZGUgdmFyaWV0eSBvZiBEUERLIEFQSXMsIGRvZXMgc28NCj4gYXQtaGlnaC1yYXRlcy93 aXRoLWhpZ2gtcGVyZm9ybWFuY2UtcmVxdWlyZW1lbnRzIGFuZCBhcmUgZXhwZWN0ZWQgdG8gYmUN Cj4gcHJlZW1wdGlvbi1zYWZlLiBTbyB0aGV5IGFyZSBiYXNpY2FsbHkgRUFMIHRocmVhZHMgd2l0 aG91dCBhIGxjb3JlIGlkLg0KDQpZZXMsIHRoaXMgaXMgaGFwcGVuaW5nIGluIHRoZSB3aWxkLg0K RS5nLiBvdXIgYXBwbGljYXRpb24gaGFzIGEgbW9kZSB3aGVyZSBpdCB1c2VzIGZld2VyIEVBTCB0 aHJlYWRzLCBhbmQgcHJvY2Vzc2VzIG1vcmUgaW4gbm9uLUVBTCB0aHJlYWRzLiBTbyB0byBzYXks IHRoZSBzYW1lIHdvcmsgaXMgcHJvY2Vzc2VkIGVpdGhlciBieSBhbiBFQUwgdGhyZWFkIG9yIGEg bm9uLUVBTCB0aHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24ncyBtb2RlLg0KVGhl IGV4dHJhIGFycmF5IGVudHJ5IHdvdWxkIGJlIHVzZWZ1bCBmb3Igc3VjaCB1c2UgY2FzZXMuDQoN Cj4gDQo+IFN1cHBvcnQgZm9yIHRoYXQgbGF0dGVyIHNjZW5hcmlvIGhhcyBhbHNvIGJlZW4gdm9p Y2VkLCBpbiBwcmV2aW91cw0KPiBkaXNjdXNzaW9ucywgZnJvbSB3aGF0IEkgcmVjYWxsLg0KPiAN Cj4gSSB0aGluayBpdCdzIGhhcmQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiBvZiBhICJ1bnJlZ2lz dGVyZWQgdGhyZWFkDQo+IHNwYXJlIiBmb3IgbGNvcmUgdmFyaWFibGVzIHdpdGhvdXQgZmlyc3Qg a25vd2luZyB3aGF0IHRoZSBmdXR1cmUgc2hvdWxkDQo+IGxvb2sgbGlrZSBmb3IgdW5yZWdpc3Rl cmVkIHRocmVhZHMgaW4gRFBESywgaW4gdGVybXMgb2YgYmVpbmcgYWJsZSB0bw0KPiBjYWxsIGlu dG8gRFBESyBBUElzLCBwcmVlbXB0aW9uLXNhZmV0eSBndWFyYW50ZWVzLCBldGMuDQo+IA0KPiBJ dCBzZWVtcyB0aGF0IHVudGlsIHlvdSBoYXZlIGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyBnZW5l cmFsbHkgdG8NCj4gdHJlYXQNCj4gdW5yZWdpc3RlcmVkIHRocmVhZHMsIHlvdSBhcmUgYmVzdCBv ZmYgd2l0aCBqdXN0IGEgcGVyLWxjb3JlIGlkDQo+IGluc3RhbmNlDQo+IG9mIGxjb3JlIHZhcmlh Ymxlcy4NCg0KSSBnZXQgeW91ciBwb2ludC4gSXQgYWxzbyByZWR1Y2VzIHRoZSByaXNrIG9mIGJ1 Z3MgY2F1c2VkIGJ5IGluY29ycmVjdCB1c2Ugb2YgdGhlIGFkZGl0aW9uYWwgZW50cnkuDQoNCkkg YW0gYXJndWluZyBmb3IgYSBkaWZmZXJlbnQgYW5nbGU6IFByb3ZpZGluZyB0aGUgZXh0cmEgZW50 cnkgd2lsbCBoZWxwIHVuY292ZXJpbmcgcmVsZXZhbnQgdXNlIGNhc2VzLg0KDQo+IA0KPiA+Pg0K PiA+PiBUaGVyZSBtYXkgYWxzbyBiZSBjYXNlcyB3ZXJlIHlvdSBhcmUgYmVzdCBvZmYgYnkgc2lt cGx5IGRpc2FsbG93aW5nDQo+ID4+IHVucmVnaXN0ZXJlZCB0aHJlYWRzIGZyb20gY2FsbGluZyBp bnRvIHRoYXQgQVBJLg0KPiA+Pg0KPiA+Pj4gT2J2aW91c2x5LCB0aGlzIG1pZ2h0IGFmZmVjdCBw ZXJmb3JtYW5jZS4NCj4gPj4+IElmIHRoZSBwZXJmb3JtYW5jZSBjb3N0IGlzIG5vdCBuZWdsaWdi bGUsIHRoZSBhZGR0aW9uYWwgZW50cnkgKGFuZA0KPiA+PiBpbmRleGluZyBicmFuY2gpIGNvdWxk IGJlIGRpc2FibGVkIGF0IGJ1aWxkIHRpbWUuDQo+ID4+Pg0KPiA+Pj4NCj4gPj4+ICogU3VnZ2Vz dGlvbjogRG8gbm90IGZpeCB0aGUgYWxpZ25tZW50IGF0IDE2IGJ5dGUuDQo+ID4+PiBQYXNzIGFu IGFsaWdubWVudCBwYXJhbWV0ZXIgdG8gcnRlX2xjb3JlX3Zhcl9hbGxvYygpIGFuZCB1c2UNCj4g Pj4gYWxpZ25vZigpIHdoZW4gY2FsbGluZyBpdDoNCj4gPj4+DQo+ID4+PiArI2luY2x1ZGUgPHN0 ZGFsaWduLmg+DQo+ID4+PiArDQo+ID4+PiArI2RlZmluZSBSVEVfTENPUkVfVkFSX0FMTE9DKG5h bWUpCQkJXA0KPiA+Pj4gKwluYW1lID0gcnRlX2xjb3JlX3Zhcl9hbGxvYyhzaXplb2YoKihuYW1l KSksIGFsaWdub2YoKihuYW1lKSkpDQo+ID4+PiArDQo+ID4+PiArI2RlZmluZSBSVEVfTENPUkVf VkFSX0FMTE9DX1NJWkVfQUxJR04obmFtZSwgc2l6ZSwgYWxpZ25tZW50KQ0KPiAJXA0KPiA+Pj4g KwluYW1lID0gcnRlX2xjb3JlX3Zhcl9hbGxvYyhzaXplLCBhbGlnbm1lbnQpDQo+ID4+PiArDQo+ ID4+PiArI2RlZmluZSBSVEVfTENPUkVfVkFSX0FMTE9DX1NJWkUobmFtZSwgc2l6ZSkJXA0KPiA+ Pj4gKwluYW1lID0gcnRlX2xjb3JlX3Zhcl9hbGxvYyhzaXplLCBSVEVfTENPUkVfVkFSX0FMSUdO TUVOVF9ERUZBVUxUKQ0KPiA+Pj4gKw0KPiA+Pj4gKyArKysgL2Njb25maWcvcnRlX2NvbmZpZy5o DQo+ID4+PiArI2RlZmluZSBSVEVfTENPUkVfVkFSX0FMSUdOTUVOVF9ERUZBVUxUIDE2DQo+ID4+ Pg0KPiA+Pj4NCj4gPj4NCj4gPj4gVGhhdCBzZWVtcyBsaWtlIGEgdmVyeSBnb29kIGlkZWEuIEkn bGwgbG9vayBpbnRvIGl0Lg0KPiA+Pg0KPiA+Pj4gKiBDb25jZXJuOiBSVEVfTENPUkVfVkFSX0ZP UkVBQ0goKSByZXNlbWJsZXMgUlRFX0xDT1JFX0ZPUkVBQ0goKSwNCj4gYnV0DQo+ID4+IGJlaGF2 ZXMgZGlmZmVyZW50bHkuDQo+ID4+Pg0KPiA+Pj4+ICsvKioNCj4gPj4+PiArICogSXRlcmF0ZSBv dmVyIGVhY2ggbGNvcmUgaWQncyB2YWx1ZSBmb3IgYSBsY29yZSB2YXJpYWJsZS4NCj4gPj4+PiAr ICovDQo+ID4+Pj4gKyNkZWZpbmUgUlRFX0xDT1JFX1ZBUl9GT1JFQUNIKHZhciwgbmFtZSkJCQkJ XA0KPiA+Pj4+ICsJZm9yICh1bnNpZ25lZCBpbnQgbGNvcmVfaWQgPQkJCQkJXA0KPiA+Pj4+ICsJ CSAgICAgKCgodmFyKSA9IFJURV9MQ09SRV9WQVJfTENPUkVfUFRSKDAsIG5hbWUpKSwgMCk7DQo+ IAlcDQo+ID4+Pj4gKwkgICAgIGxjb3JlX2lkIDwgUlRFX01BWF9MQ09SRTsNCj4gCVwNCj4gPj4+ PiArCSAgICAgbGNvcmVfaWQrKywgKHZhcikgPSBSVEVfTENPUkVfVkFSX0xDT1JFX1BUUihsY29y ZV9pZCwNCj4gbmFtZSkpDQo+ID4+Pj4gKw0KPiA+Pj4NCj4gPj4+IFRoZSBtYWNybyBuYW1lIFJU RV9MQ09SRV9WQVJfRk9SRUFDSCgpIHJlc2VtYmxlcw0KPiA+PiBSVEVfTENPUkVfRk9SRUFDSChp KSwgd2hpY2ggb25seSBpdGVyYXRlcyBvbiBydW5uaW5nIGNvcmVzLg0KPiA+Pj4gWW91IG1pZ2h0 IHdhbnQgdG8gZ2l2ZSBpdCBhIG5hbWUgdGhhdCBkaWZmZXJzIG1vcmUuDQo+ID4+Pg0KPiA+Pg0K PiA+PiBUcnVlLg0KPiA+Pg0KPiA+PiBNYXliZSBSVEVfTENPUkVfVkFSX0ZPUkVBQ0hfVkFMVUUo KSBpcyBiZXR0ZXI/IFN0aWxsIHJvb20gZm9yDQo+ID4+IGNvbmZ1c2lvbiwNCj4gPj4gZm9yIHN1 cmUuDQo+ID4+DQo+ID4+IEJlaW5nIGNvbnNpc3RlbnQgd2l0aCA8cnRlX2xjb3JlLmg+IGlzIG5v dCBzbyBlYXN5LCBzaW5jZSBpdCdzIG5vdA0KPiBldmVuDQo+ID4+IGNvbnNpc3RlbnQgd2l0aCBp dHNlbGYuIEZvciBleGFtcGxlLCBydGVfbGNvcmVfY291bnQoKSByZXR1cm5zIHRoZQ0KPiA+PiBu dW1iZXIgb2YgbGNvcmVzIChFQUwgdGhyZWFkcykgKnBsdXMgdGhlIG51bWJlciBvZiByZWdpc3Rl cmVkIG5vbi0NCj4gRUFMDQo+ID4+IHRocmVhZHMqLCBhbmQgUlRFX0xDT1JFX0ZPUkVBQ0goKSBn aXZlIGEgZGlmZmVyZW50IGNvdW50LiA6KQ0KPiA+DQo+ID4gTmFtaW5nIGlzIGhhcmQuIEkgZG9u J3QgaGF2ZSBhIGdvb2QgbmFtZSwgYW5kIGNhbiBvbmx5IG9mZmVyDQo+IGluc3BpcmF0aW9uLi4u DQo+ID4NCj4gPiA8cnRlX2xjb3JlLmg+IGhhcyBSVEVfTENPUkVfRk9SRUFDSCgpIGFuZCBpdHMN Cj4gUlRFX0xDT1JFX0ZPUkVBQ0hfV09SS0VSKCkgdmFyaWFudCB3aXRoIF9XT1JLRVIgYXBwZW5k ZWQuDQo+ID4NCj4gPiBQZXJoYXBzIFJURV9MQ09SRV9WQVJfRk9SRUFDSF9BTEwoKSwgd2l0aCBf QUxMIGFwcGVuZGVkIHRvIGluZGljYXRlIGENCj4gdmFyaWFudC4NCj4gPg0KPiA+Pg0KPiA+Pj4g SWYgaXQgd2Fzbid0IGZvciBBUEkgYnJlYWthZ2UsIEkgd291bGQgc3VnZ2VzdCByZW5hbWluZw0K PiA+PiBSVEVfTENPUkVfRk9SRUFDSCgpIGluc3RlYWQsIGJ1dCB0aGF0J3Mgbm90IHJlYWxpc3Rp Yy4gOy0pDQo+ID4+Pg0KPiA+Pj4gU21hbGwgZGV0YWlsOiAidmFyIiBpcyBhIHBvaW50ZXIsIHNv IGNvbnNpZGVyIHJlbmFtaW5nIGl0IHRvICJwdHIiDQo+ID4+IGFuZCBhZGRpbmcgX1BUUiB0byB0 aGUgbWFjcm8gbmFtZS4NCj4gPj4NCj4gPj4gVGhlICJ2YXIiIG5hbWUgY29tZXMgZnJvbSBob3cg PHN5cy9xdWV1ZS5oPiBuYW1lcyB0aGluZ3MuIEkgdGhpbmsgSQ0KPiBoYWQNCj4gPj4gaXQgYXMg InB0ciIgaW5pdGlhbGx5LiBJJ2xsIGNoYW5nZSBpdCBiYWNrLg0KPiA+DQo+ID4gVGhhbmtzLg0K PiA+DQo+ID4+DQo+ID4+IFRoYW5rcyBhIGxvdCBNb3J0ZW4uDQo=