From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 57D011B42F for ; Wed, 20 Jun 2018 06:00:06 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 21:00:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,245,1526367600"; d="scan'208";a="60663670" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga003.jf.intel.com with ESMTP; 19 Jun 2018 21:00:04 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Tue, 19 Jun 2018 21:00:03 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.51]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.87]) with mapi id 14.03.0319.002; Wed, 20 Jun 2018 12:00:01 +0800 From: "Zhang, Qi Z" To: "Burakov, Anatoly" , "thomas@monjalon.net" CC: "Ananyev, Konstantin" , "dev@dpdk.org" , "Richardson, Bruce" , "Yigit, Ferruh" , "Shelton, Benjamin H" , "Vangati, Narender" Thread-Topic: [PATCH 05/22] ethdev: introduce device lock Thread-Index: AQHUBL+GBVCVeOqaBU6hufOQOUk106RoiNIg Date: Wed, 20 Jun 2018 04:00:01 +0000 Message-ID: <039ED4275CED7440929022BC67E706115323AA7F@SHSMSX103.ccr.corp.intel.com> References: <20180607123849.14439-1-qi.z.zhang@intel.com> <20180607123849.14439-6-qi.z.zhang@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYjEyODAzZTgtMDljMS00ODdhLWI1MWYtNTQ3MGVlNGQ1MTY5IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoibGNiOFIrYnVVRnA4dENhQ3ZUWWEwYnBoVEZscVJaRG1ibjZYM3pNdWtwRmlGMk5US0xjcmNYb3RCZTF2VnoyUCJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.200.100 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH 05/22] ethdev: introduce device lock X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Jun 2018 04:00:08 -0000 SGkgQW5hdG9seToNCglTb3JyeSB0byBtaXNzIHRoaXMgZW1haWwgYW5kIHJlcGx5IGxhdGUuDQoN Cj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQnVyYWtvdiwgQW5hdG9seQ0K PiBTZW50OiBGcmlkYXksIEp1bmUgMTUsIDIwMTggMTE6NDMgUE0NCj4gVG86IFpoYW5nLCBRaSBa IDxxaS56LnpoYW5nQGludGVsLmNvbT47IHRob21hc0Btb25qYWxvbi5uZXQNCj4gQ2M6IEFuYW55 ZXYsIEtvbnN0YW50aW4gPGtvbnN0YW50aW4uYW5hbnlldkBpbnRlbC5jb20+OyBkZXZAZHBkay5v cmc7DQo+IFJpY2hhcmRzb24sIEJydWNlIDxicnVjZS5yaWNoYXJkc29uQGludGVsLmNvbT47IFlp Z2l0LCBGZXJydWgNCj4gPGZlcnJ1aC55aWdpdEBpbnRlbC5jb20+OyBTaGVsdG9uLCBCZW5qYW1p biBIDQo+IDxiZW5qYW1pbi5oLnNoZWx0b25AaW50ZWwuY29tPjsgVmFuZ2F0aSwgTmFyZW5kZXIN Cj4gPG5hcmVuZGVyLnZhbmdhdGlAaW50ZWwuY29tPg0KPiBTdWJqZWN0OiBSZTogW1BBVENIIDA1 LzIyXSBldGhkZXY6IGludHJvZHVjZSBkZXZpY2UgbG9jaw0KPiANCj4gT24gMDctSnVuLTE4IDE6 MzggUE0sIFFpIFpoYW5nIHdyb3RlOg0KPiA+IEludHJvZHVjZSBBUEkgcnRlX2V0aF9kZXZfbG9j ayBhbmQgcnRlX2V0aF9kZXZfdW5sb2NrIHRvIGxldA0KPiA+IGFwcGxpY2F0aW9uIGxvY2sgb3Ig dW5sb2NrIG9uIHNwZWNpZmljIGV0aGRldiwgYSBsb2NrZWQgZGV2aWNlIGNhbid0DQo+ID4gYmUg ZGV0YWNoZWQsIHRoaXMgaGVscCBhcHBsaWNhaXRvbiB0byBwcmV2ZW50IHVuZXhwZWN0ZWQgZGV2 aWNlDQo+ID4gZGV0YWNoaW5nLCBlc3BlY2lhbGx5IGluIG11bHRpLXByb2Nlc3MgZW52cmlvbm1l bnQuDQo+ID4NCj4gPiBBc2xvIHRoZSBuZXcgQVBJIGxldCBhcHBsaWNhdGlvbiB0byByZWdpc3Rl ciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoDQo+ID4gd2lsbCBiZSBpbnZva2VkIGJlZm9yZSBh IGRldmljZSBpcyBnb2luZyB0byBiZSBkZXRhY2hlZCwgdGhlIHJldHVybg0KPiA+IHZhbHVlIG9m IHRoZSBmdW5jdGlvbiB3aWxsIGRlY2lkZSBpZiBkZXZpY2Ugd2lsbCBjb250aW51ZSBiZSBkZXRh Y2hlZA0KPiA+IG9yIG5vdCwgdGhpcyBzdXBwb3J0IGFwcGxpY2F0aW9uIHRvIGRvIGNvbmRpdGlv biBjaGVjayBhdCBydW50aW1lLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogUWkgWmhhbmcgPHFp LnouemhhbmdAaW50ZWwuY29tPg0KPiA+IC0tLQ0KPiANCj4gPHNuaXA+DQo+IA0KPiA+ICsNCj4g PiAraW50DQo+ID4gK3J0ZV9ldGhfZGV2X2xvY2sodWludDE2X3QgcG9ydF9pZCwgcnRlX2V0aF9k ZXZfbG9ja19jYWxsYmFja190IGNhbGxiYWNrLA0KPiA+ICsJCSB2b2lkICp1c2VyX2FyZ3MpDQo+ ID4gK3sNCj4gPiArCVJURV9FVEhfVkFMSURfUE9SVElEX09SX0VSUl9SRVQocG9ydF9pZCwgLUVO T0RFVik7DQo+ID4gKw0KPiA+ICsJaWYgKGNhbGxiYWNrID09IE5VTEwpDQo+ID4gKwkJcmV0dXJu IHJlZ2lzdGVyX2xvY2tfY2FsbGJhY2socG9ydF9pZCwgZGV2X2lzX2J1c3ksIE5VTEwpOw0KPiA+ ICsJZWxzZQ0KPiA+ICsJCXJldHVybiByZWdpc3Rlcl9sb2NrX2NhbGxiYWNrKHBvcnRfaWQsIGNh bGxiYWNrLCB1c2VyX2FyZ3MpOw0KPiANCj4gQXMgbXVjaCBhcyBpIGRvbid0IGxpa2Ugc2VlaW5n IG5lZ2F0aXZlIGVycm5vIHZhbHVlcyBhcyByZXR1cm4sIHRoZSByZXN0IG9mDQo+IGV0aGRldiBs aWJyYXJ5IHVzZXMgdGhvc2UsIHNvIHRoaXMgaXMgT0sgOikNCj4gDQo+ID4gK30NCj4gPiArDQo+ ID4gK2ludA0KPiA+ICtydGVfZXRoX2Rldl91bmxvY2sodWludDE2X3QgcG9ydF9pZCwgcnRlX2V0 aF9kZXZfbG9ja19jYWxsYmFja190IGNhbGxiYWNrLA0KPiA+ICsJCSAgIHZvaWQgKnVzZXJfYXJn cykNCj4gPiArew0KPiA+ICsJUlRFX0VUSF9WQUxJRF9QT1JUSURfT1JfRVJSX1JFVChwb3J0X2lk LCAtRU5PREVWKTsNCj4gPiArDQo+IA0KPiA8c25pcD4NCj4gDQo+ID4gKyAqIEFsc28sIGFueSBj YWxsYmFjayBmdW5jdGlvbiByZXR1cm4gITAgdmFsdWUgd2lsbCBwcmV2ZW50IGRldmljZSBiZQ0K PiA+ICsgKiBkZXRhY2hlZChyZWYuIHJ0ZV9ldGhfZGV2X2xvY2sgYW5kIHJ0ZV9ldGhfZGV2X3Vu bG9jaykuDQo+ID4gKyAqDQo+ID4gKyAqIEBwYXJhbSBwb3J0X2lkDQo+ID4gKyAqICAgVGhlIHBv cnQgaWRlbnRpZmllciBvZiB0aGUgRXRoZXJuZXQgZGV2aWNlLg0KPiA+ICsgKiBAcGFyYW0gdXNl cl9hcmdzDQo+ID4gKyAqICAgVGhpcyBpcyBwYXJhbWV0ZXIgInVzZXJfYXJncyIgYmUgc2F2ZWQg d2hlbiBjYWxsYmFjayBmdW5jdGlvbiBpcw0KPiA+ICsgKiAgIHJlZ2lzdGVyZWQocnRlX2Rldl9l dGhfbG9jaykuDQo+ID4gKyAqDQo+ID4gKyAqIEByZXR1cm4NCj4gPiArICogICAwICBkZXZpY2Ug aXMgYWxsb3dlZCBiZSBkZXRhY2hlZC4NCj4gPiArICogICAhMCBkZXZpY2UgaXMgbm90IGFsbG93 ZWQgYmUgZGV0YWNoZWQuDQo+IA0KPiAhMCBjYW4gYmUgbmVnYXRpdmUgb3IgcG9zaXRpdmUuIEFy ZSB3ZSBleHBlY3RpbmcgcG9zaXRpdmUgcmV0dXJuIHZhbHVlcyBmcm9tDQo+IHRoaXMgQVBJPw0K DQpJIGhhdmUgbm8gc3Ryb25nIG9waW5pb24sIGJ1dCBpZiB5b3UgdGhpbmsgYmVsb3cgb3Igb3Ro ZXIgb3B0aW9uIGlzIGJldHRlciwgSSBjYW4gY2hhbmdlDQoNCj49MCAgZGV2aWNlIGlzIGFsbG93 ZWQgYmUgZGV0YWNoZWQuDQo8MCBkZXZpY2UgaXMgbm90IGFsbG93ZWQgYmUgZGV0YWNoZWQuDQoN Cj4gDQo+ID4gKyAqLw0KPiA+ICt0eXBlZGVmIGludCAoKnJ0ZV9ldGhfZGV2X2xvY2tfY2FsbGJh Y2tfdCkodWludDE2X3QgcG9ydF9pZCwgdm9pZA0KPiA+ICsqdXNlcl9hcmdzKTsNCj4gPiArDQo+ ID4gKy8qKg0KPiA+ICsgKiBMb2NrIGFuIEV0aGVybmV0IERldmljZSBkaXJlY3RseSBvciByZWdp c3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uDQo+ID4gKyAqIGZvciBjb25kaXRpb24gY2hlY2sgYXQg cnVudGltZSwgdGhpcyBoZWxwIGFwcGxpY2F0aW9uIHRvIHByZXZlbnQNCj4gPiArICogYSBkZXZp Y2UgYmUgZGV0YWNoZWQgdW5leHBlY3RlZGx5IA0KPiA+ICsgKiBOT1RFOiBMb2NrIGEgZGV2aWNl IG11bHRpcGxlIHRpbWVzIHdpdGggc2FtZSBwYXJtZXRlciB3aWxsDQo+ID4gK2luY3JlYXNlDQo+ ID4gKyAqIGEgcmVmX2NvdW50LCBhbmQgY29ycmVzcG9uZGluZyB1bmxvY2sgZGVjcmVhc2UgdGhl IHJlZl9jb3VudCwgdGhlDQo+ID4gKyAqIGRldmljZSB3aWxsIGJlIHVubG9ja2VkIHdoZW4gcmVm X2NvdW50IHJlYWNoIDAuDQo+IA0KPiBOaXRwaWNrOiAibm90ZSIgc2VjdGlvbnMgc2hvdWxkIGJl IGRvbmUgd2l0aCBAbm90ZSBtYXJrZXIuDQo+IA0KPiBBbHNvLCBpIHdvdWxkIG1lbnRpb24gdGhh dCB0aGlzIGlzIGEgcGVyLXByb2Nlc3MgbG9jayB0aGF0IGRvZXMgbm90IGFmZmVjdCBvdGhlcg0K PiBwcm9jZXNzZXMgKGFzc3VtaW5nIGkgdW5kZXJzdG9vZCB0aGUgY29kZSBjb3JyZWN0bHksIG9m IGNvdXJzZS4uLikuDQoNCk9LLCBJIHdpbGwgYWRkIG1vcmUgY29tbWVudCB0byBleHBsYWluIHRo aXMuDQoNCj4gDQo+ID4gKyAqDQo+ID4gKyAqIEBwYXJhbSBwb3J0X2lkDQo+ID4gKyAqICAgVGhl IHBvcnQgaWRlbnRpZmllciBvZiB0aGUgRXRoZXJuZXQgZGV2aWNlLg0KPiA+ICsgKiBAcGFyYW0g Y2FsbGJhY2sNCj4gPiArICogICAhTlVMTCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBh ZGRlZCBpbnRvIGEgcHJlLWRldGFjaCBsaXN0LA0KPiA+ICsgKiAgICAgICAgIGl0IHdpbGwgYmUg aW52b2tlZCB3aGVuIGEgZGV2aWNlIGlzIGdvaW5nIHRvIGJlIGRldGFjaGVkLiBUaGUNCj4gPiAr ICogICAgICAgICByZXR1cm4gdmFsdWUgd2lsbCBkZWNpZGUgaWYgY29udGludWUgZGV0YWNoIHRo ZSBkZXZpY2Ugb3Igbm90Lg0KPiA+ICsgKiAgIE5VTEwgIGxvY2sgdGhlIGRldmljZSBkaXJlY3Rs eSwgYmFzaWNhbGx5IHRoaXMganVzdCByZWdpdGVyIGEgZW1wdHkNCj4gPiArICogICAgICAgICBj YWxsYmFjayBmdW5jdGlvbihkZXZfaXNfYnVzeSkgdGhhdCByZXR1cm4gLUVCVVNZLCBzbyB3ZSBj YW4NCj4gPiArICogICAgICAgICBoYW5kbGUgdGhlIHByZS1kZXRhY2ggY2hlY2sgaW4gdW5pZmll ZCB3YXkuDQo+ID4gKyAqIEBwYXJhbSB1c2VyX2FyZ3MNCj4gPiArICogICBwYXJhbWV0ZXIgd2ls bCBiZSBwYXJzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24sIG9ubHkgdmFsaWQgd2hlbg0KPiA+ICsg KiAgIGNhbGxiYWNrICE9IE5VTEwuDQo+ID4gKyAqIEByZXR1cm4NCj4gPiArICogICAwIG9uIHN1 Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLg0KPiA+ICsgKi8NCj4gPiAraW50IHJ0ZV9ldGhfZGV2 X2xvY2sodWludDE2X3QgcG9ydF9pZCwgcnRlX2V0aF9kZXZfbG9ja19jYWxsYmFja190DQo+IGNh bGxiYWNrLA0KPiA+ICsJCSAgICAgdm9pZCAqdXNlcl9hcmdzKTsNCj4gDQo+IE5pdHBpY2tzOiBE UERLIHN0eWxlIGd1aWRlIGRpc2NvdXJhZ2VzIHVzaW5nIHNwYWNlcyBhcyBpbmRlbnRhdGlvbiAo b3RoZXIgcGFydHMNCj4gb2YgdGhpcyBwYXRjaCwgYW5kIG90aGVyIHBhdGNoZXMgaGF2ZSB0aGlz IGlzc3VlIGFzIHdlbGwpLg0KDQpPSywgd2lsbCBmaXggYWxsLg0KPiANCj4gPiArDQo+ID4gKy8q Kg0KPiA+ICsgKiBSZXZlcnNlIG9wZXJhdGlvbiBvZiBydGVfZXRoX2Rldl9sb2NrLg0KPiA+ICsg Kg0KPiA+ICsgKiBAcGFyYW0gcG9ydF9pZA0KPiA+ICsgKiAgIFRoZSBwb3J0IGlkZW50aWZpZXIg b2YgdGhlIEV0aGVybmV0IGRldmljZS4NCj4gPiArICogQHBhcmFtIGNhbGxiYWNrDQo+ID4gKyAq ICAgTlVMTCAgZGVjcmVhc2UgdGhlIHJlZl9jb3VudCBvZiBkZWZhdWx0IGNhbGxiYWNrIGZ1bmN0 aW9uLg0KPiA+ICsgKiAgICFOVUxMIGRlY3JlYXNlIHRoZSByZWZfY291bnQgb2Ygc3BlY2lmaWMg Y2FsbGJhY2sgd2l0aCBtYXRjaGVkDQo+ID4gKyAqICAgICAgICAgdXNlcl9hcmdzLg0KPiA+ICsg KiBAcGFyYW0gdXNlcl9hcmdzDQo+ID4gKyAqICAgcGFyYW1ldGVyIHRvIG1hdGNoLCBvbmx5IHZh bGlkIHdoZW4gY2FsbGJhY2sgIT0gTlVMTC4NCj4gPiArICogQHJldHVybg0KPiA+ICsgKiAgIDAg b24gc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IuDQo+ID4gKyAqLw0KPiA+ICtpbnQgcnRlX2V0 aF9kZXZfdW5sb2NrKHVpbnQxNl90IHBvcnRfaWQsIHJ0ZV9ldGhfZGV2X2xvY2tfY2FsbGJhY2tf dA0KPiBjYWxsYmFjaywNCj4gPiArCQkgICAgICAgdm9pZCAqdXNlcl9hcmdzKTsNCj4gPiArDQo+ ID4gICAjaWZkZWYgX19jcGx1c3BsdXMNCj4gPiAgIH0NCj4gPiAgICNlbmRpZg0KPiA+IGRpZmYg LS1naXQgYS9saWIvbGlicnRlX2V0aGRldi9ydGVfZXRoZGV2X2xvY2suYw0KPiA+IGIvbGliL2xp YnJ0ZV9ldGhkZXYvcnRlX2V0aGRldl9sb2NrLmMNCj4gDQo+IHJ0ZV9ldGhkZXZfbG9jay4qIHNl ZW0gdG8gYmUgaW50ZXJuYWwtb25seSBmaWxlcy4gUGVyaGFwcyB5b3Ugc2hvdWxkIG5hbWUNCj4g dGhlbSB3aXRob3V0IHRoZSBydGVfIHByZWZpeCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkncmUgbm90 IGV4cG9ydGVkPw0KPiANCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAw MDAwMC4uNjg4ZDFkNzBhDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2xpYi9saWJydGVf ZXRoZGV2L3J0ZV9ldGhkZXZfbG9jay5jDQo+ID4gQEAgLTAsMCArMSwxMDIgQEANCj4gPiArLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQ0KPiA+ICsgKiBDb3B5cmlnaHQo YykgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbiAgKi8gI2luY2x1ZGUNCj4gPiArInJ0ZV9ldGhkZXZf bG9jay5oIg0KPiA+ICsNCj4gPiArc3RydWN0IGxvY2tfZW50cnkgew0KPiA+ICsJVEFJTFFfRU5U UlkobG9ja19lbnRyeSkgbmV4dDsNCj4gPiArCXJ0ZV9ldGhfZGV2X2xvY2tfY2FsbGJhY2tfdCBj YWxsYmFjazsNCj4gPiArCXVpbnQxNl90IHBvcnRfaWQ7DQo+IA0KPiA8c25pcD4NCj4gDQo+ID4g K3JlZ2lzdGVyX2xvY2tfY2FsbGJhY2sodWludDE2X3QgcG9ydF9pZCwNCj4gPiArCQkgICAgICAg cnRlX2V0aF9kZXZfbG9ja19jYWxsYmFja190IGNhbGxiYWNrLA0KPiA+ICsJCSAgICAgICB2b2lk ICp1c2VyX2FyZ3MpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBsb2NrX2VudHJ5ICpsZTsNCj4gPiAr DQo+ID4gKwlydGVfc3BpbmxvY2tfbG9jaygmbG9ja19lbnRyeV9sb2NrKTsNCj4gPiArDQo+ID4g KwlUQUlMUV9GT1JFQUNIKGxlLCAmbG9ja19lbnRyeV9saXN0LCBuZXh0KSB7DQo+ID4gKwkJaWYg KGxlLT5wb3J0X2lkID09IHBvcnRfaWQgJiYNCj4gPiArCQkgICAgbGUtPmNhbGxiYWNrID09IGNh bGxiYWNrICYmDQo+ID4gKwkJICAgIGxlLT51c2VyX2FyZ3MgPT0gdXNlcl9hcmdzKQ0KPiA+ICsJ CQlicmVhazsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlpZiAoIWxlKSB7DQo+ID4gKwkJbGUgPSBj YWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2VudHJ5KSk7DQo+ID4gKwkJaWYgKCFsZSkgew0K PiANCj4gTml0cGljazogZ2VuZXJhbGx5LCBEUERLIHN0eWxlIGd1aWRlIHByZWZlcnMgImlmICh2 YWx1ZSkiIG9yICJpZiAoIXZhbHVlKSIgdG8gb25seQ0KPiBiZSByZXNlcnZlZCBmb3IgYm9vbGVh biB2YWx1ZXMsIGFuZCB1c2UgZXhwbGljaXQgY29tcGFyaXNvbiAoZS5nLiAiaWYgKHZhbHVlID09 DQo+IE5VTEwpIiBvciAiaWYgKHZhbHVlID09IDApIikgZm9yIGFsbCBvdGhlciBjYXNlcy4NCg0K T0ssIHdpbGwgZml4DQo+IA0KPiAtLQ0KPiBUaGFua3MsDQo+IEFuYXRvbHkNCg==