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 D774EA0032; Fri, 22 Jul 2022 12:44:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B6C484021E; Fri, 22 Jul 2022 12:44:23 +0200 (CEST) Received: from smartserver.smartsharesystems.com (smartserver.smartsharesystems.com [77.243.40.215]) by mails.dpdk.org (Postfix) with ESMTP id DB36240156 for ; Fri, 22 Jul 2022 12:44:21 +0200 (CEST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Subject: RE: [RFC v2] non-temporal memcpy Date: Fri, 22 Jul 2022 12:44:20 +0200 Message-ID: <98CBD80474FA8B44BF855DF32C47DC35D871DB@smartserver.smartshare.dk> In-Reply-To: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [RFC v2] non-temporal memcpy Thread-Index: AdidWFrYRLiwuItOQLqe4aE2V3NS8gAUWpXg References: <98CBD80474FA8B44BF855DF32C47DC35D871D4@smartserver.smartshare.dk> From: =?UTF-8?B?TW9ydGVuIEJyw7hydXA=?= To: "Konstantin Ananyev" , , "Bruce Richardson" Cc: "Jan Viktorin" , "Ruifeng Wang" , "David Christensen" , "Stanislaw Kardach" 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 PiBGcm9tOiBLb25zdGFudGluIEFuYW55ZXYgW21haWx0bzprb25zdGFudGluLnYuYW5hbnlldkB5 YW5kZXgucnVdDQo+IFNlbnQ6IEZyaWRheSwgMjIgSnVseSAyMDIyIDAxLjIwDQo+IA0KPiBIaSBN b3J0ZW4sDQo+IA0KPiA+IFRoaXMgUkZDIHByb3Bvc2VzIGEgc2V0IG9mIGZ1bmN0aW9ucyBvcHRp bWl6ZWQgZm9yIG5vbi10ZW1wb3JhbA0KPiBtZW1vcnkgY29weS4NCj4gPg0KPiA+IEF0IHRoaXMg c3RhZ2UsIEkgYW0gYXNraW5nIGZvciBmZWVkYmFjayBvbiB0aGUgY29uY2VwdC4NCj4gPg0KPiA+ IEFwcGxpY2F0aW9ucyBzb21ldGltZXMgZGF0YSB0byBhbm90aGVyIG1lbW9yeSBsb2NhdGlvbiwg d2hpY2ggaXMgb25seQ0KPiB1c2VkDQo+ID4gbXVjaCBsYXRlci4NCj4gPiBJbiB0aGlzIGNhc2Us IGl0IGlzIGluZWZmaWNpZW50IHRvIHBvbGx1dGUgdGhlIGRhdGEgY2FjaGUgd2l0aCB0aGUNCj4g Y29waWVkDQo+ID4gZGF0YS4NCj4gPg0KPiA+IEFuIGV4YW1wbGUgdXNlIGNhc2UgKG9yaWdpbmF0 aW5nIGZyb20gYSByZWFsIGxpZmUgYXBwbGljYXRpb24pOg0KPiA+IENvcHlpbmcgZmlsdGVyZWQg cGFja2V0cywgb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlbSwgaW50byBhIGNhcHR1cmUNCj4gYnVm ZmVyDQo+ID4gZm9yIG9mZmxpbmUgYW5hbHlzaXMuDQo+ID4NCj4gPiBUaGUgcHVycG9zZSBvZiB0 aGVzZSBmdW5jdGlvbnMgaXMgdG8gYWNoaWV2ZSBhIHBlcmZvcm1hbmNlIGdhaW4gYnkNCj4gbm90 DQo+ID4gcG9sbHV0aW5nIHRoZSBjYWNoZSB3aGVuIGNvcHlpbmcgZGF0YS4NCj4gPiBBbHRob3Vn aCB0aGUgdGhyb3VnaHB1dCBtYXkgYmUgaW1wcm92ZWQgYnkgZnVydGhlciBvcHRpbWl6YXRpb24s IEkgZG8NCj4gbm90DQo+ID4gY29uc2lkZXIgdGhyb3VncHV0IG9wdGltaXphdGlvbiByZWxldmFu dCBpbml0aWFsbHkuDQo+ID4NCj4gPiBUaGUgeDg2IG5vbi10ZW1wb3JhbCBsb2FkIGluc3RydWN0 aW9ucyBoYXZlIDE2IGJ5dGUgYWxpZ25tZW50DQo+ID4gcmVxdWlyZW1lbnRzIFsxXSwgd2hpbGUg QVJNIG5vbi10ZW1wb3JhbCBsb2FkIGluc3RydWN0aW9ucyBhcmUNCj4gYXZhaWxhYmxlIHdpdGgN Cj4gPiA0IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBbMl0uDQo+ID4gQm90aCBwbGF0Zm9y bXMgb2ZmZXIgbm9uLXRlbXBvcmFsIHN0b3JlIGluc3RydWN0aW9ucyB3aXRoIDQgYnl0ZQ0KPiBh bGlnbm1lbnQNCj4gPiByZXF1aXJlbWVudHMuDQo+ID4NCj4gPiBJbiBhZGRpdGlvbiB0byB0aGUg cHJpbWFyeSBmdW5jdGlvbiB3aXRob3V0IGFueSBhbGlnbm1lbnQNCj4gcmVxdWlyZW1lbnRzLCB3 ZQ0KPiA+IGFsc28gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlc3BlY3Rpdmx5IDE2IGFuZCA0IGJ5 dGUgYWxpZ25lZCBhY2Nlc3MNCj4gZm9yDQo+ID4gcGVyZm9ybWFuY2UgcHVycG9zZXMuDQo+ID4N Cj4gPiBUaGUgZnVuY3Rpb24gbmFtZXMgcmVzZW1ibGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0 aW9uIG5hbWVzLCBidXQNCj4gdGhlaXINCj4gPiBzaWduYXR1cmVzIGFyZSBpbnRlbnRpb25hbGx5 IGRpZmZlcmVudC4gTm8gbmVlZCB0byBkcmFnIGxlZ2FjeSBpbnRvDQo+IGl0Lg0KPiA+DQo+ID4g TkI6IERvbid0IGNvbW1lbnQgb24gc3BhY2VzIGZvciBpbmRlbnRhdGlvbjsgYSBwYXRjaCB3aWxs IGZvbGxvdyBEUERLDQo+IGNvZGluZw0KPiA+IHN0eWxlIGFuZCB1c2UgVEFCLg0KPiANCj4gDQo+ IEkgdGhpbmsgdGhlcmUgd2VyZSBkaXNjdXNzaW9ucyBpbiBvdGhlciBkaXJlY3Rpb24gLSByZW1v dmUgcnRlX21lbWNweSgpDQo+IGNvbXBsZXRlbHkgYW5kIHVzZSBtZW1jcHkoKSBpbnN0ZWFkLi4u DQoNClllcywgdGhlIGhpZ2hseSBvcHRpbWl6ZWQgcnRlX21lbWNweSgpIGltcGxlbWVudGF0aW9u IG9mIG1lbWNweSgpIGhhcyBiZWNvbWUgb2Jzb2xldGUsIG5vdyB0aGF0IG1vZGVybiBjb21waWxl cnMgcHJvdmlkZSBhbiBlZmZpY2llbnQgbWVtY3B5KCkgaW1wbGVtZW50YXRpb24uDQoNCkl0J3Mg YW4gZXhjZWxsZW50IHJlZmVyZW5jZSwgYmVjYXVzZSB3ZSBzaG91bGQgbGVhcm4gZnJvbSBpdCwg YW5kIGF2b2lkIGludHJvZHVjaW5nIHNpbWlsYXIgbWlzdGFrZXMgd2l0aCBub24tdGVtcG9yYWwg bWVtY3B5Lg0KDQo+IEJ1dCBpZiB3ZSBoYXZlIGEgZ29vZCB1c2UgY2FzZSBmb3IgdGhhdCwgdGhl biBJIGFtIHBvc2l0aXZlIGluDQo+IHByaW5jaXBsZS4NCg0KVGhlIHN0YW5kYXJkIEMgbGlicmFy eSBkb2Vzbid0IG9mZmVyIG5vbi10ZW1wb3JhbCBtZW1jcHkoKSwgc28gd2UgbmVlZCB0byBpbXBs ZW1lbnQgaXQgb3Vyc2VsdmVzLg0KDQo+IFRob3VnaCBJIHRoaW5rIHdlIG5lZWQgYSBjbGVhciB1 c2UtY2FzZSB3aXRoaW4gZHBkayBmb3IgaXQNCj4gdG8gZGVtb25zdHJhdGUgcGVyZm9tYW5jZSBn YWluLg0KDQpUaGUgcGVyZm9ybWFuY2UgZ2FpbiBpcyB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGRh dGEgY2FjaGUuIERQREsgZXhhbXBsZSBhcHBsaWNhdGlvbnMsIGxpa2UgbDNmd2QsIGFyZSBwcm9i YWJseSB0b28gcHJpbWl0aXZlIHRvIG1lYXN1cmUgYW55IGJlbmVmaXQgaW4gdGhpcyByZWdhcmQu DQoNCj4gUHJvYmFibHkgY29weWluZyBwYWNrZXRzIHdpdGhpbiBwZHVtcCBsaWIsIG9yIGV4YW1w bGVzL2RtYS4gb3IgLi4uDQoNCkdvb2QgcG9pbnQgLSB0aGUgbmV3IGZ1bmN0aW9ucyBzaG91bGQg YmUgdXNlZCBzb21ld2hlcmUgd2l0aGluIERQREsuIEZvciB0aGlzIHB1cnBvc2UsIEkgd2lsbCBs b29rIGludG8gbW9kaWZ5aW5nIHJ0ZV9wa3RtYnVmX2NvcHkoKSwgd2hpY2ggaXMgdXNlZCBieSBw ZHVtcF9jb3B5KCksIHRvIHVzZSBub24tdGVtcG9yYWwgY29weWluZyBvZiB0aGUgcGFja2V0IGRh dGEuDQoNCj4gQW5vdGhlciB0aG91Z2h0IC0gZG8gd2UgcmVhbGx5IG5lZWQgYSBzZXBhcmF0ZSBp bmxpbmUgZnVuY3Rpb24gZm9yIGVhY2gNCj4gZmxhdm91cj8NCj4gTWlnaHQgYmUganVzdCBvbmUg bm9uLWlubGluZSBydGVfbWVtY3B5X250KGRzdCwgc3JjLCBzaXplLCBmbGFncyksDQo+IHdoZXJl IGZsYWdzIGNvdWxkIGJlIGNvbWJpbmF0aW9uIG9mIE5UX1NSQywgTlRfRFNULCBhbmQga2VlcCBh bGlnbm1lbnQNCj4gZGV0ZWN0aW9uL2RlY2lzaW9ucyB0byBwYXJ0aWN1bGFyIGltcGxlbWVudGF0 aW9uPw0KDQpUaGFuayB5b3UgZm9yIHRoZSBmZWVkYmFjaywgS29uc3RhbnRpbi4NCg0KTXkgYW5z d2VyIHRvIHRoaXMgc3VnZ2VzdGlvbiBnZXRzIGEgbGl0dGxlIGxvbmd3aW5kZWQuLi4NCg0KTG9v a2luZyBhdCB0aGUgRFBESyBwY2FwbmcgbGlicmFyeSwgaXQgY29waWVzIGEgNCBieXRlIGFsaWdu ZWQgbWV0YWRhdGEgc3RydWN0dXJlIHNpemVkIDI4IGJ5dGUuIFNvIGl0IGNhbiBkbyB3aXRoIDQg Ynl0ZSBhbGlnbmVkIGZ1bmN0aW9ucy4NCg0KT3VyIGFwcGxpY2F0aW9uIGNhbiBjYXB0dXJlIHBh Y2tldHMgc3RhcnRpbmcgYXQgdGhlIElQIGhlYWRlciwgd2hpY2ggaXMgb2Zmc2V0IGJ5IDE0IGJ5 dGUgKEV0aGVybmV0IGhlYWRlciBzaXplKSBmcm9tIHRoZSBwYWNrZXQgYnVmZmVyLCBzbyBpdCBy ZXF1aXJlcyAyIGJ5dGUgYWxpZ25tZW50LiBBbmQgdGh1cywgcmVxdWlyaW5nIDQgYnl0ZSBhbGln bm1lbnQgaXMgbm90IGFjY2VwdGFibGUuDQoNCk91ciBhcHBsaWNhdGlvbiB1c2VzIDE2IGJ5dGUg YWxpZ25tZW50IGluIHRoZSBjYXB0dXJlIGJ1ZmZlciBhcmVhLCBhbmQgY2FuIGJlbmVmaXQgZnJv bSAxNiBieXRlIGFsaWduZWQgZnVuY3Rpb25zLiBGdXJ0aGVybW9yZSwgeDg2IHByb2Nlc3NvcnMg cmVxdWlyZSAxNiBieXRlIGFsaWdubWVudCBmb3Igbm9uLXRlbXBvcmFsIGxvYWQgaW5zdHJ1Y3Rp b25zLCBzbyBJIHRoaW5rIGEgMTYgYnl0ZSBhbGlnbmVkIG5vbi10ZW1wb3JhbCBtZW1jcHkgZnVu Y3Rpb24gc2hvdWxkIGJlIG9mZmVyZWQuDQoNCldoaWxlIHdvcmtpbmcgb24gdGhlc2UgZnVudGlv bnMsIEkgZXhwZXJpbWVudGVkIHdpdGggYW4gcnRlX21lbWNweV9udCgpIHRha2luZyBmbGFncywg d2hpY2ggaXMgYWxzbyBteSBwZXJzb25hbCBwcmVmZXJlbmNlLCBidXQgaGF2ZW4ndCBzdWNjZWVk IHlldC4gRXNwZWNpYWxseSB3aGVuIGNvcHlpbmcgYSAxNiBieXRlIGFsaWduZWQgc3RydWN0dXJl IG9mIG9ubHkgMTYgYnl0ZSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBmdW5jdGlvbiBjYWxsICsgY29t cGFyaW5nIHRoZSBmbGFncyArIHRoZSBjb3B5IGxvb3Agb3ZlcmhlYWQgaXMgc2lnbmlmaWNhbnQs IGNvbXBhcmVkIHRvIGlubGluZSBjb2RlIGNvbnNpc3Rpbmcgb2Ygb25seSBvbmUgcGFpciBvZiAi bW92bnRkcWEgKCVyc2kpLCV4bW0wOyBtb3ZudGRxICV4bW0wLCglcmRpKSIgaW5zdHJ1Y3Rpb25z Lg0KDQpSZW1lbWJlciB0aGF0IGEgbm9uLWlubGluZWQgcnRlX21lbWNweV9udCgpIHdpbGwgYmUg Y2FsbGVkIHdpdGggdmVyeSB2YXJ5aW5nIHNpemUsIGR1ZSB0byB0aGUgdHlwaWNhbCBtaXggb2Yg c21hbGwgYW5kIGJpZyBwYWNrZXRzLCBzbyBicmFuY2ggcHJlZGljdGlvbiB3aWxsIG5vdCBoZWxw Lg0KDQpUaGlzIFJGQyBkb2VzIG5vdCB5ZXQgc2hvdyB0aGUgcnRlX21lbWNweV9udCgpIGZ1bmN0 aW9uIGhhbmRsaW5nIHVuYWxpZ25lZCBsb2FkL3N0b3JlLCBidXQgaXQgaXMgbW9yZSBjb21wbGV4 IHRoYW4gdGhlIGFsaWduZWQgZnVuY3Rpb25zLiBTbyBJIHRoaW5rIHRoZSBhbGlnbmVkIHZhcmlh bnRzIGFyZSB3YXJyYW50ZWQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4NCg0KU29tZSBvZiB0 aGUgbmVlZCBmb3IgZXhwb3NpbmcgaW5kaXZpZHVhbCBmdW5jdGlvbnMgZm9yIGRpZmZlcmVudCBh bGlnbm1lbnQgc3RlbXMgZnJvbSB0aGUgY29tcGlsZXIgYmVpbmcgdW5hYmxlIHRvIGRldGVybWlu ZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzIGF0 IGJ1aWxkIHRpbWUuIFNvIHdlIG5lZWQgdG8gaGVscCB0aGUgY29tcGlsZXIgd2l0aCB0aGlzIGF0 IGJ1aWxkIHRpbWUsIGFuZCB0aHVzIHRoZSBuZWVkIGZvciBpbmxpbmluZyB0aGUgZnVuY3Rpb24u IElmIHdlIGV4cG9zZSBhIGJ1bmNoIG9mIHNtYWxsIGlubGluZSBmdW5jdGlvbnMgb3IgYSBiaWcg aW5saW5lIGZ1bmN0aW9uIHdpdGggZmxhZ3Mgc2VlbXMgdG8gYmUgYSBtYXR0ZXIgb2YgdGFzdGUu DQoNClRoaW5raW5nIGFib3V0IGl0LCB5b3UgYXJlIHByb2JhYmx5IHJpZ2h0IHRoYXQgZXhwb3Np bmcgYSBzaW5nbGUgZnVuY3Rpb24gd2l0aCBmbGFncyBpcyBiZXR0ZXIgZm9yIGRvY3VtZW50YXRp b24gcHVycG9zZXMgYW5kIGVhc2llciBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0byBpbXBsZW1l bnQuIEJ1dCBpdCBzdGlsbCBuZWVkcyB0byBiZSBpbmxpbmUsIGZvciB0aGUgcmVhc29ucyBkZXNj cmliZWQgYWJvdmUuDQoNCj4gDQo+IA0KPiA+IFsxXSBodHRwczovL3d3dy5pbnRlbC5jb20vY29u dGVudC93d3cvdXMvZW4vZG9jcy9pbnRyaW5zaWNzLQ0KPiBndWlkZS9pbmRleC5odG1sI3RleHQ9 X21tX3N0cmVhbV9sb2FkDQo+ID4gWzJdIGh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vZG9jdW1l bnRhdGlvbi8xMDAwNzYvMDEwMC9BNjQtDQo+IEluc3RydWN0aW9uLVNldC1SZWZlcmVuY2UvQTY0 LUZsb2F0aW5nLXBvaW50LUluc3RydWN0aW9ucy9MRE5QLS1TSU1ELQ0KPiBhbmQtRlAtDQo+ID4N Cj4gPiBWMjoNCj4gPiAtIE9ubHkgY29weSBmcm9tIG5vbi10ZW1wb3JhbCBzb3VyY2UgdG8gbm9u LXRlbXBvcmFsIGRlc3RpbmF0aW9uLg0KPiA+ICAgIEkuZS4gcmVtb3ZlIHRoZSB0d28gdmFyaWFu dHMgd2l0aCBvbmx5IHNvdXJjZSBhbmQvb3IgZGVzdGluYXRpb24NCj4gYmVpbmcNCj4gPiAgICBu b24tdGVtcG9yYWwuDQo+ID4gLSBEbyBub3QgcmVxdWlyZSBhbGlnbm1lbnQuDQo+ID4gICAgSW5z dGVhZCwgb2ZmZXIgYWRkaXRpb25hbCA0IGFuZCAxNiBieXRlIGFsaWduZWQgZnVuY3Rpb25zIGZv cg0KPiBwZXJmb3JtYW5jZQ0KPiA+ICAgIHB1cnBvc2VzLg0KPiA+IC0gSW1wbGVtZW50ZWQgdHdv IG9mIHRoZSBmdW5jdGlvbnMgZm9yIHg4Ni4NCj4gPiAtIFJlbW92ZSBtZW1zZXQgZnVuY3Rpb24u DQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBNb3J0ZW4gQnLDuHJ1cCA8bWJAc21hcnRzaGFyZXN5 c3RlbXMuY29tPg0KPiA+IC0tLQ0KPiA+DQo+ID4gLyoqDQo+ID4gICAqIEB3YXJuaW5nDQo+ID4g ICAqIEBiIEVYUEVSSU1FTlRBTDogdGhpcyBBUEkgbWF5IGNoYW5nZSB3aXRob3V0IHByaW9yIG5v dGljZS4NCj4gPiAgICoNCj4gPiAgICogQ29weSBkYXRhIGZyb20gbm9uLXRlbXBvcmFsIHNvdXJj ZSB0byBub24tdGVtcG9yYWwgZGVzdGluYXRpb24uDQo+ID4gICAqDQo+ID4gICAqIEBwYXJhbSBk c3QNCj4gPiAgICogICBQb2ludGVyIHRvIHRoZSBub24tdGVtcG9yYWwgZGVzdGluYXRpb24gb2Yg dGhlIGRhdGEuDQo+ID4gICAqICAgU2hvdWxkIGJlIDQgYnl0ZSBhbGlnbmVkLCBmb3Igb3B0aW1h bCBwZXJmb3JtYW5jZS4NCj4gPiAgICogQHBhcmFtIHNyYw0KPiA+ICAgKiAgIFBvaW50ZXIgdG8g dGhlIG5vbi10ZW1wb3JhbCBzb3VyY2UgZGF0YS4NCj4gPiAgICogICBObyBhbGlnbm1lbnQgcmVx dWlyZW1lbnRzLg0KPiA+ICAgKiBAcGFyYW0gbGVuDQo+ID4gICAqICAgTnVtYmVyIG9mIGJ5dGVz IHRvIGNvcHkuDQo+ID4gICAqICAgU2hvdWxkIGJlIGJlIGRpdmlzaWJsZSBieSA0LCBmb3Igb3B0 aW1hbCBwZXJmb3JtYW5jZS4NCj4gPiAgICovDQo+ID4gX19ydGVfZXhwZXJpbWVudGFsDQo+ID4g c3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUNCj4gPiBfX2F0dHJpYnV0ZV9fKChfX25vbm51bGxf XygxLCAyKSwgX19hY2Nlc3NfXyh3cml0ZV9vbmx5LCAxLCAzKSwNCj4gX19hY2Nlc3NfXyhyZWFk X29ubHksIDIsIDMpKSkNCj4gPiB2b2lkIHJ0ZV9tZW1jcHlfbnQodm9pZCAqIF9fcnRlX3Jlc3Ry aWN0IGRzdCwgY29uc3Qgdm9pZCAqDQo+IF9fcnRlX3Jlc3RyaWN0IHNyYywgc2l6ZV90IGxlbikN Cj4gPiAvKiBJbXBsZW1lbnRhdGlvbiBULkIuRC4gKi8NCj4gPg0KPiA+IC8qKg0KPiA+ICAgKiBA d2FybmluZw0KPiA+ICAgKiBAYiBFWFBFUklNRU5UQUw6IHRoaXMgQVBJIG1heSBjaGFuZ2Ugd2l0 aG91dCBwcmlvciBub3RpY2UuDQo+ID4gICAqDQo+ID4gICAqIENvcHkgZGF0YSBpbiBibG9ja3Mg b2YgMTYgYnl0ZSBmcm9tIGFsaWduZWQgbm9uLXRlbXBvcmFsIHNvdXJjZQ0KPiA+ICAgKiB0byBh bGlnbmVkIG5vbi10ZW1wb3JhbCBkZXN0aW5hdGlvbi4NCj4gPiAgICoNCj4gPiAgICogQHBhcmFt IGRzdA0KPiA+ICAgKiAgIFBvaW50ZXIgdG8gdGhlIG5vbi10ZW1wb3JhbCBkZXN0aW5hdGlvbiBv ZiB0aGUgZGF0YS4NCj4gPiAgICogICBNdXN0IGJlIDE2IGJ5dGUgYWxpZ25lZC4NCj4gPiAgICog QHBhcmFtIHNyYw0KPiA+ICAgKiAgIFBvaW50ZXIgdG8gdGhlIG5vbi10ZW1wb3JhbCBzb3VyY2Ug ZGF0YS4NCj4gPiAgICogICBNdXN0IGJlIDE2IGJ5dGUgYWxpZ25lZC4NCj4gPiAgICogQHBhcmFt IGxlbg0KPiA+ICAgKiAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5Lg0KPiA+ICAgKiAgIE11c3Qg YmUgZGl2aXNpYmxlIGJ5IDE2Lg0KPiA+ICAgKi8NCj4gPiBfX3J0ZV9leHBlcmltZW50YWwNCj4g PiBzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZQ0KPiA+IF9fYXR0cmlidXRlX18oKF9fbm9ubnVs bF9fKDEsIDIpLCBfX2FjY2Vzc19fKHdyaXRlX29ubHksIDEsIDMpLA0KPiBfX2FjY2Vzc19fKHJl YWRfb25seSwgMiwgMykpKQ0KPiA+IHZvaWQgcnRlX21lbWNweV9udDE2YSh2b2lkICogX19ydGVf cmVzdHJpY3QgZHN0LCBjb25zdCB2b2lkICoNCj4gX19ydGVfcmVzdHJpY3Qgc3JjLCBzaXplX3Qg bGVuKQ0KPiA+IHsNCj4gPiAgICAgIGNvbnN0IHZvaWQgKiBjb25zdCAgZW5kID0gUlRFX1BUUl9B REQoc3JjLCBsZW4pOw0KPiA+DQo+ID4gICAgICBSVEVfQVNTRVJUKHJ0ZV9pc19hbGlnbmVkKGRz dCwgc2l6ZW9mKF9fbTEyOGkpKSk7DQo+ID4gICAgICBSVEVfQVNTRVJUKHJ0ZV9pc19hbGlnbmVk KHNyYywgc2l6ZW9mKF9fbTEyOGkpKSk7DQo+ID4gICAgICBSVEVfQVNTRVJUKHJ0ZV9pc19hbGln bmVkKGxlbiwgc2l6ZW9mKF9fbTEyOGkpKSk7DQo+ID4NCj4gPiAgICAgIC8qIENvcHkgbGFyZ2Ug cG9ydGlvbiBvZiBkYXRhLiAqLw0KPiA+ICAgICAgd2hpbGUgKFJURV9QVFJfRElGRihlbmQsIHNy YykgPj0gNCAqIHNpemVvZihfX20xMjhpKSkgew0KPiA+ICAgICAgICAgIHJlZ2lzdGVyIF9fbTEy OGkgICAgeG1tMCwgeG1tMSwgeG1tMiwgeG1tMzsNCj4gPg0KPiA+IC8qIE5vdGU6IFdvcmthcm91 bmQgZm9yIF9tbV9zdHJlYW1fbG9hZF9zaTEyOCgpIG5vdCB0YWtpbmcgYSBjb25zdA0KPiBwb2lu dGVyIGFzIHBhcmFtZXRlci4gKi8NCj4gPiAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gNCj4g PiAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVkLXF1YWxpZmllcnMi DQo+ID4gICAgICAgICAgeG1tMCA9IF9tbV9zdHJlYW1fbG9hZF9zaTEyOChSVEVfUFRSX0FERChz cmMsIDAgKg0KPiBzaXplb2YoX19tMTI4aSkpKTsNCj4gPiAgICAgICAgICB4bW0xID0gX21tX3N0 cmVhbV9sb2FkX3NpMTI4KFJURV9QVFJfQUREKHNyYywgMSAqDQo+IHNpemVvZihfX20xMjhpKSkp Ow0KPiA+ICAgICAgICAgIHhtbTIgPSBfbW1fc3RyZWFtX2xvYWRfc2kxMjgoUlRFX1BUUl9BREQo c3JjLCAyICoNCj4gc2l6ZW9mKF9fbTEyOGkpKSk7DQo+ID4gICAgICAgICAgeG1tMyA9IF9tbV9z dHJlYW1fbG9hZF9zaTEyOChSVEVfUFRSX0FERChzcmMsIDMgKg0KPiBzaXplb2YoX19tMTI4aSkp KTsNCj4gPiAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcA0KPiA+ICAgICAgICAgIF9tbV9zdHJl YW1fc2kxMjgoUlRFX1BUUl9BREQoZHN0LCAwICogc2l6ZW9mKF9fbTEyOGkpKSwNCj4geG1tMCk7 DQo+ID4gICAgICAgICAgX21tX3N0cmVhbV9zaTEyOChSVEVfUFRSX0FERChkc3QsIDEgKiBzaXpl b2YoX19tMTI4aSkpLA0KPiB4bW0xKTsNCj4gPiAgICAgICAgICBfbW1fc3RyZWFtX3NpMTI4KFJU RV9QVFJfQUREKGRzdCwgMiAqIHNpemVvZihfX20xMjhpKSksDQo+IHhtbTIpOw0KPiA+ICAgICAg ICAgIF9tbV9zdHJlYW1fc2kxMjgoUlRFX1BUUl9BREQoZHN0LCAzICogc2l6ZW9mKF9fbTEyOGkp KSwNCj4geG1tMyk7DQo+ID4gICAgICAgICAgc3JjID0gUlRFX1BUUl9BREQoc3JjLCA0ICogc2l6 ZW9mKF9fbTEyOGkpKTsNCj4gPiAgICAgICAgICBkc3QgPSBSVEVfUFRSX0FERChkc3QsIDQgKiBz aXplb2YoX19tMTI4aSkpOw0KPiA+ICAgICAgfQ0KPiA+DQo+ID4gICAgICAvKiBDb3B5IHJlbWFp bmluZyBkYXRhLiAqLw0KPiA+ICAgICAgd2hpbGUgKHNyYyAhPSBlbmQpIHsNCj4gPiAgICAgICAg ICByZWdpc3RlciBfX20xMjhpICAgIHhtbTsNCj4gPg0KPiA+IC8qIE5vdGU6IFdvcmthcm91bmQg Zm9yIF9tbV9zdHJlYW1fbG9hZF9zaTEyOCgpIG5vdCB0YWtpbmcgYSBjb25zdA0KPiBwb2ludGVy IGFzIHBhcmFtZXRlci4gKi8NCj4gPiAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gNCj4gPiAj cHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVkLXF1YWxpZmllcnMiDQo+ ID4gICAgICAgICAgeG1tID0gX21tX3N0cmVhbV9sb2FkX3NpMTI4KHNyYyk7DQo+ID4gI3ByYWdt YSBHQ0MgZGlhZ25vc3RpYyBwb3ANCj4gPiAgICAgICAgICBfbW1fc3RyZWFtX3NpMTI4KGRzdCwg eG1tKTsNCj4gPiAgICAgICAgICBzcmMgPSBSVEVfUFRSX0FERChzcmMsIHNpemVvZihfX20xMjhp KSk7DQo+ID4gICAgICAgICAgZHN0ID0gUlRFX1BUUl9BREQoZHN0LCBzaXplb2YoX19tMTI4aSkp Ow0KPiA+ICAgICAgfQ0KPiA+IH0NCj4gPg0KPiA+IC8qKg0KPiA+ICAgKiBAd2FybmluZw0KPiA+ ICAgKiBAYiBFWFBFUklNRU5UQUw6IHRoaXMgQVBJIG1heSBjaGFuZ2Ugd2l0aG91dCBwcmlvciBu b3RpY2UuDQo+ID4gICAqDQo+ID4gICAqIENvcHkgZGF0YSBpbiBibG9ja3Mgb2YgNCBieXRlIGZy b20gYWxpZ25lZCBub24tdGVtcG9yYWwgc291cmNlDQo+ID4gICAqIHRvIGFsaWduZWQgbm9uLXRl bXBvcmFsIGRlc3RpbmF0aW9uLg0KPiA+ICAgKg0KPiA+ICAgKiBAcGFyYW0gZHN0DQo+ID4gICAq ICAgUG9pbnRlciB0byB0aGUgbm9uLXRlbXBvcmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBkYXRhLg0K PiA+ICAgKiAgIE11c3QgYmUgNCBieXRlIGFsaWduZWQuDQo+ID4gICAqIEBwYXJhbSBzcmMNCj4g PiAgICogICBQb2ludGVyIHRvIHRoZSBub24tdGVtcG9yYWwgc291cmNlIGRhdGEuDQo+ID4gICAq ICAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4NCj4gPiAgICogQHBhcmFtIGxlbg0KPiA+ICAgKiAg IE51bWJlciBvZiBieXRlcyB0byBjb3B5Lg0KPiA+ICAgKiAgIE11c3QgYmUgZGl2aXNpYmxlIGJ5 IDQuDQo+ID4gICAqLw0KPiA+IF9fcnRlX2V4cGVyaW1lbnRhbA0KPiA+IHN0YXRpYyBfX3J0ZV9h bHdheXNfaW5saW5lDQo+ID4gX19hdHRyaWJ1dGVfXygoX19ub25udWxsX18oMSwgMiksIF9fYWNj ZXNzX18od3JpdGVfb25seSwgMSwgMyksDQo+IF9fYWNjZXNzX18ocmVhZF9vbmx5LCAyLCAzKSkp DQo+ID4gdm9pZCBydGVfbWVtY3B5X250NGEodm9pZCAqIF9fcnRlX3Jlc3RyaWN0IGRzdCwgY29u c3Qgdm9pZCAqDQo+IF9fcnRlX3Jlc3RyaWN0IHNyYywgc2l6ZV90IGxlbikNCj4gPiB7DQo+ID4g ICAgICBpbnQzMl90ICAgICAgICAgICAgIGJ1ZltzaXplb2YoX19tMTI4aSkgLyBzaXplb2YoaW50 MzJfdCldDQo+IF9fcnRlX2FsaWduZWQoc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPiAgICAgIC8qKiBB ZGRyZXNzIG9mIHNvdXJjZSBkYXRhLCByb3VuZGVkIGRvd24gdG8gYWNoaWV2ZSBhbGlnbm1lbnQu DQo+ICovDQo+ID4gICAgICBjb25zdCB2b2lkICogICAgICAgIHNyY2EgPSBSVEVfUFRSX0FMSUdO X0ZMT09SKHNyYywNCj4gc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPiAgICAgIC8qKiBBZGRyZXNzIG9m IGVuZCBvZiBzb3VyY2UgZGF0YSwgcm91bmRlZCBkb3duIHRvIGFjaGlldmUNCj4gYWxpZ25tZW50 LiAqLw0KPiA+ICAgICAgY29uc3Qgdm9pZCAqIGNvbnN0ICBzcmNlbmRhID0NCj4gUlRFX1BUUl9B TElHTl9GTE9PUihSVEVfUFRSX0FERChzcmMsIGxlbiksIHNpemVvZihfX20xMjhpKSk7DQo+ID4g ICAgICBjb25zdCBpbnQgICAgICAgICAgIG9mZnNldCA9ICBSVEVfUFRSX0RJRkYoc3JjLCBzcmNh KSAvDQo+IHNpemVvZihpbnQzMl90KTsNCj4gPiAgICAgIHJlZ2lzdGVyIF9fbTEyOGkgICAgeG1t MDsNCj4gPg0KPiA+ICAgICAgUlRFX0FTU0VSVChydGVfaXNfYWxpZ25lZChkc3QsIHNpemVvZihp bnQzMl90KSkpOw0KPiA+ICAgICAgUlRFX0FTU0VSVChydGVfaXNfYWxpZ25lZChzcmMsIHNpemVv ZihpbnQzMl90KSkpOw0KPiA+ICAgICAgUlRFX0FTU0VSVChydGVfaXNfYWxpZ25lZChsZW4sIHNp emVvZihpbnQzMl90KSkpOw0KPiA+DQo+ID4gICAgICBpZiAodW5saWtlbHkobGVuID09IDApKSBy ZXR1cm47DQo+ID4NCj4gPiAgICAgIC8qIENvcHkgZmlyc3QsIG5vbi1fX20xMjhpIGFsaWduZWQs IHBhcnQgb2Ygc291cmNlIGRhdGEuICovDQo+ID4gICAgICBpZiAob2Zmc2V0KSB7DQo+ID4gLyog Tm90ZTogV29ya2Fyb3VuZCBmb3IgX21tX3N0cmVhbV9sb2FkX3NpMTI4KCkgbm90IHRha2luZyBh IGNvbnN0DQo+IHBvaW50ZXIgYXMgcGFyYW1ldGVyLiAqLw0KPiA+ICNwcmFnbWEgR0NDIGRpYWdu b3N0aWMgcHVzaA0KPiA+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkaXNjYXJk ZWQtcXVhbGlmaWVycyINCj4gPiAgICAgICAgICB4bW0wID0gX21tX3N0cmVhbV9sb2FkX3NpMTI4 KHNyY2EpOw0KPiA+ICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgodm9pZCAqKWJ1ZiwgeG1tMCk7 DQo+ID4gI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3ANCj4gPiAgICAgICAgICBzd2l0Y2ggKG9m ZnNldCkgew0KPiA+ICAgICAgICAgICAgICBjYXNlIDE6DQo+ID4gICAgICAgICAgICAgICAgICBf bW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAwICoNCj4gc2l6ZW9mKGludDMyX3QpKSwg YnVmWzFdKTsNCj4gPiAgICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseShsZW4gPT0gMSAqIHNp emVvZihpbnQzMl90KSkpIHJldHVybjsNCj4gPiAgICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1f c2kzMihSVEVfUFRSX0FERChkc3QsIDEgKg0KPiBzaXplb2YoaW50MzJfdCkpLCBidWZbMl0pOw0K PiA+ICAgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KGxlbiA9PSAyICogc2l6ZW9mKGludDMy X3QpKSkgcmV0dXJuOw0KPiA+ICAgICAgICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9Q VFJfQUREKGRzdCwgMiAqDQo+IHNpemVvZihpbnQzMl90KSksIGJ1ZlszXSk7DQo+ID4gICAgICAg ICAgICAgICAgICBicmVhazsNCj4gPiAgICAgICAgICAgICAgY2FzZSAyOg0KPiA+ICAgICAgICAg ICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRzdCwgMCAqDQo+IHNpemVvZihp bnQzMl90KSksIGJ1ZlsyXSk7DQo+ID4gICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkobGVu ID09IDEgKiBzaXplb2YoaW50MzJfdCkpKSByZXR1cm47DQo+ID4gICAgICAgICAgICAgICAgICBf bW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAxICoNCj4gc2l6ZW9mKGludDMyX3QpKSwg YnVmWzNdKTsNCj4gPiAgICAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICAgICAgICAgICAgICBj YXNlIDM6DQo+ID4gICAgICAgICAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQo ZHN0LCAwICoNCj4gc2l6ZW9mKGludDMyX3QpKSwgYnVmWzNdKTsNCj4gPiAgICAgICAgICAgICAg ICAgIGJyZWFrOw0KPiA+ICAgICAgICAgIH0NCj4gPiAgICAgICAgICBzcmNhID0gUlRFX1BUUl9B REQoc3JjYSwgKDQgLSBvZmZzZXQpICogc2l6ZW9mKGludDMyX3QpKTsNCj4gPiAgICAgICAgICBk c3QgPSBSVEVfUFRSX0FERChkc3QsICg0IC0gb2Zmc2V0KSAqIHNpemVvZihpbnQzMl90KSk7DQo+ ID4gICAgICB9DQo+ID4NCj4gPiAgICAgIC8qIENvcHkgbWlkZGxlLCBfX20xMjhpIGFsaWduZWQs IHBhcnQgb2Ygc291cmNlIGRhdGEuICovDQo+ID4gICAgICB3aGlsZSAoc3JjYSAhPSBzcmNlbmRh KSB7DQo+ID4gLyogTm90ZTogV29ya2Fyb3VuZCBmb3IgX21tX3N0cmVhbV9sb2FkX3NpMTI4KCkg bm90IHRha2luZyBhIGNvbnN0DQo+IHBvaW50ZXIgYXMgcGFyYW1ldGVyLiAqLw0KPiA+ICNwcmFn bWEgR0NDIGRpYWdub3N0aWMgcHVzaA0KPiA+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3Jl ZCAiLVdkaXNjYXJkZWQtcXVhbGlmaWVycyINCj4gPiAgICAgICAgICB4bW0wID0gX21tX3N0cmVh bV9sb2FkX3NpMTI4KHNyY2EpOw0KPiA+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wDQo+ID4g ICAgICAgICAgX21tX3N0b3JlX3NpMTI4KCh2b2lkICopYnVmLCB4bW0wKTsNCj4gPiAgICAgICAg ICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAwICogc2l6ZW9mKGludDMyX3QpKSwN Cj4gYnVmWzBdKTsNCj4gPiAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0 LCAxICogc2l6ZW9mKGludDMyX3QpKSwNCj4gYnVmWzFdKTsNCj4gPiAgICAgICAgICBfbW1fc3Ry ZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAyICogc2l6ZW9mKGludDMyX3QpKSwNCj4gYnVmWzJd KTsNCj4gPiAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0LCAzICogc2l6 ZW9mKGludDMyX3QpKSwNCj4gYnVmWzNdKTsNCj4gPiAgICAgICAgICBzcmNhID0gUlRFX1BUUl9B REQoc3JjYSwgc2l6ZW9mKF9fbTEyOGkpKTsNCj4gPiAgICAgICAgICBkc3QgPSBSVEVfUFRSX0FE RChkc3QsIDQgKiBzaXplb2YoaW50MzJfdCkpOw0KPiA+ICAgICAgfQ0KPiA+DQo+ID4gICAgICAv KiBDb3B5IGxhc3QsIG5vbi1fX20xMjhpIGFsaWduZWQsIHBhcnQgb2Ygc291cmNlIGRhdGEuICov DQo+ID4gICAgICBpZiAoUlRFX1BUUl9ESUZGKHNyY2EsIHNyYykgIT0gNCkgew0KPiA+IC8qIE5v dGU6IFdvcmthcm91bmQgZm9yIF9tbV9zdHJlYW1fbG9hZF9zaTEyOCgpIG5vdCB0YWtpbmcgYSBj b25zdA0KPiBwb2ludGVyIGFzIHBhcmFtZXRlci4gKi8NCj4gPiAjcHJhZ21hIEdDQyBkaWFnbm9z dGljIHB1c2gNCj4gPiAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGlzY2FyZGVk LXF1YWxpZmllcnMiDQo+ID4gICAgICAgICAgeG1tMCA9IF9tbV9zdHJlYW1fbG9hZF9zaTEyOChz cmNhKTsNCj4gPiAgICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKHZvaWQgKilidWYsIHhtbTApOw0K PiA+ICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wDQo+ID4gICAgICAgICAgc3dpdGNoIChvZmZz ZXQpIHsNCj4gPiAgICAgICAgICAgICAgY2FzZSAxOg0KPiA+ICAgICAgICAgICAgICAgICAgX21t X3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRzdCwgMCAqDQo+IHNpemVvZihpbnQzMl90KSksIGJ1 ZlswXSk7DQo+ID4gICAgICAgICAgICAgICAgICBicmVhazsNCj4gPiAgICAgICAgICAgICAgY2Fz ZSAyOg0KPiA+ICAgICAgICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJURV9QVFJfQUREKGRz dCwgMCAqDQo+IHNpemVvZihpbnQzMl90KSksIGJ1ZlswXSk7DQo+ID4gICAgICAgICAgICAgICAg ICBpZiAodW5saWtlbHkoUlRFX1BUUl9ESUZGKHNyY2EsIHNyYykgPT0gMSAqDQo+IHNpemVvZihp bnQzMl90KSkpIHJldHVybjsNCj4gPiAgICAgICAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihS VEVfUFRSX0FERChkc3QsIDEgKg0KPiBzaXplb2YoaW50MzJfdCkpLCBidWZbMV0pOw0KPiA+ICAg ICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gICAgICAgICAgICAgIGNhc2UgMzoNCj4gPiAgICAg ICAgICAgICAgICAgIF9tbV9zdHJlYW1fc2kzMihSVEVfUFRSX0FERChkc3QsIDAgKg0KPiBzaXpl b2YoaW50MzJfdCkpLCBidWZbMF0pOw0KPiA+ICAgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5 KFJURV9QVFJfRElGRihzcmNhLCBzcmMpID09IDEgKg0KPiBzaXplb2YoaW50MzJfdCkpKSByZXR1 cm47DQo+ID4gICAgICAgICAgICAgICAgICBfbW1fc3RyZWFtX3NpMzIoUlRFX1BUUl9BREQoZHN0 LCAxICoNCj4gc2l6ZW9mKGludDMyX3QpKSwgYnVmWzFdKTsNCj4gPiAgICAgICAgICAgICAgICAg IGlmICh1bmxpa2VseShSVEVfUFRSX0RJRkYoc3JjYSwgc3JjKSA9PSAyICoNCj4gc2l6ZW9mKGlu dDMyX3QpKSkgcmV0dXJuOw0KPiA+ICAgICAgICAgICAgICAgICAgX21tX3N0cmVhbV9zaTMyKFJU RV9QVFJfQUREKGRzdCwgMiAqDQo+IHNpemVvZihpbnQzMl90KSksIGJ1ZlsyXSk7DQo+ID4gICAg ICAgICAgICAgICAgICBicmVhazsNCj4gPiAgICAgICAgICB9DQo+ID4gICAgICB9DQo+ID4gfQ0K PiA+DQo+IA0KDQo=