From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([209.51.188.92]:58821) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1goCA3-0000lh-Ko for qemu-devel@nongnu.org; Mon, 28 Jan 2019 14:01:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1goC9v-0007l3-2v for qemu-devel@nongnu.org; Mon, 28 Jan 2019 14:01:33 -0500 From: Vladimir Sementsov-Ogievskiy Date: Mon, 28 Jan 2019 19:00:55 +0000 Message-ID: <49203b0e-468e-4175-bd4d-47d435f2c271@email.android.com> In-Reply-To: <20190128174036.GK5756@localhost.localdomain> Content-Language: en-US MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Subject: Re: [Qemu-devel] [PATCH v5 11/11] block/backup: use backup-top instead of write notifiers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: Max Reitz , "qemu-block@nongnu.org " , "qemu-devel@nongnu.org" , " fam@euphon.net" , "stefanha@redhat.com " , "jcody@redhat.com" , Denis Lunev , "eblake@redhat.com" , " jsnow@redhat.com" Mjgg0Y/QvdCyLiAyMDE5INCzLiAyMDo0MCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YwgS2V2aW4g V29sZiA8a3dvbGZAcmVkaGF0LmNvbT4g0L3QsNC/0LjRgdCw0Ls6DQoNCkFtIDI4LjAxLjIwMTkg dW0gMTc6NDQgaGF0IFZsYWRpbWlyIFNlbWVudHNvdi1PZ2lldnNraXkgZ2VzY2hyaWViZW46DQo+ IDI4LjAxLjIwMTkgMTg6NTksIE1heCBSZWl0eiB3cm90ZToNCj4gPiBPbiAyOC4wMS4xOSAxMjoy OSwgVmxhZGltaXIgU2VtZW50c292LU9naWV2c2tpeSB3cm90ZToNCj4gPj4gMTguMDEuMjAxOSAx Nzo1NiwgTWF4IFJlaXR6IHdyb3RlOg0KPiA+Pj4gT24gMjkuMTIuMTggMTM6MjAsIFZsYWRpbWly IFNlbWVudHNvdi1PZ2lldnNraXkgd3JvdGU6DQo+ID4+Pj4gRHJvcCB3cml0ZSBub3RpZmllcnMg YW5kIHVzZSBmaWx0ZXIgbm9kZSBpbnN0ZWFkLiBDaGFuZ2VzOg0KPiA+Pj4+DQo+ID4+Pj4gMS4g Y29weS1iZWZvcmUtd3JpdGVzIG5vdyBoYW5kbGVkIGJ5IGZpbHRlciBub2RlLCBzbywgZHJvcCBh bGwNCj4gPj4+PiAgICAgIGlzX3dyaXRlX25vdGlmaWVyIGFyZ3VtZW50cy4NCj4gPj4+Pg0KPiA+ Pj4+IDIuIHdlIGRvbid0IGhhdmUgaW50ZXJzZWN0aW5nIHJlcXVlc3RzLCBzbyB0aGVpciBoYW5k bGluZyBpcyBkcm9wcGVkLg0KPiA+Pj4+IEluc3RlYWQsIHN5bmNocm9uaXphdGlvbiB3b3JrcyBh cyBmb2xsb3dzOg0KPiA+Pj4+IHdoZW4gYmFja3VwIG9yIGJhY2t1cC10b3Agc3RhcnRzIGNvcHlp bmcgb2Ygc29tZSBhcmVhIGl0IGZpcnN0bHkNCj4gPj4+PiBjbGVhcnMgY29weS1iaXRtYXAgYml0 cywgYW5kIG5vYm9keSB0b3VjaGVzIGFyZWFzLCBub3QgbWFya2VkIHdpdGgNCj4gPj4+PiBkaXJ0 eSBiaXRzIGluIGNvcHktYml0bWFwLCBzbyB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uIEFsc28s IGJhY2t1cA0KPiA+Pj4+IGpvYiBjb3B5IG9wZXJhdGlvbnMgYXJlIHN1cnJvdW5kZWQgYnkgYmRy diByZWdpb24gbG9jaywgd2hpY2ggaXMNCj4gPj4+PiBhY3R1YWxseSBzZXJpYWxpemluZyByZXF1 ZXN0LCB0byBub3QgaW50ZXJmZXIgd2l0aCBndWVzdCB3cml0ZXMgYW5kDQo+ID4+Pj4gbm90IHJl YWQgY2hhbmdlZCBkYXRhIGZyb20gc291cmNlIChiZWZvcmUgcmVhZGluZyB3ZSBjbGVhcg0KPiA+ Pj4+IGNvcnJlc3BvbmRpbmcgYml0IGluIGNvcHktYml0bWFwLCBzbywgdGhpcyBhcmVhIGlzIG5v dCBtb3JlIGhhbmRsZWQgYnkNCj4gPj4+PiBiYWNrdXAtdG9wKS4NCj4gPj4+Pg0KPiA+Pj4+IDMu IFRvIHN5bmMgd2l0aCBpbi1mbGlnaHQgcmVxdWVzdHMgd2Ugbm93IGp1c3QgZHJhaW4gaG9vayBu b2RlLCB3ZQ0KPiA+Pj4+IGRvbid0IG5lZWQgcnctbG9jay4NCj4gPj4+Pg0KPiA+Pj4+IDQuIEFm dGVyIHRoZSB3aG9sZSBiYWNrdXAgbG9vcCAodG9wLCBmdWxsLCBpbmNyZW1lbnRhbCBtb2Rlcyks IHdlIG5lZWQNCj4gPj4+PiB0byBjaGVjayBmb3Igbm90IGNvcGllZCBjbHVzdGVycywgd2hpY2gg d2VyZSB1bmRlciBiYWNrdXAtdG9wIG9wZXJhdGlvbg0KPiA+Pj4+IGFuZCB3ZSBza2lwcGVkIHRo ZW0sIGJ1dCBiYWNrdXAtdG9wIG9wZXJhdGlvbiBmYWlsZWQsIGVycm9yIHJldHVybmVkIHRvDQo+ ID4+Pj4gdGhlIGd1ZXN0IGFuZCBkaXJ0eSBiaXRzIHNldCBiYWNrLg0KPiA+Pj4+DQo+ID4+Pj4g NS4gRG9uJ3QgY3JlYXRlIGFkZGl0aW9uYWwgYmxrLCB1c2UgYmFja3VwLXRvcCBjaGlsZHJlbiBm b3IgY29weQ0KPiA+Pj4+IG9wZXJhdGlvbnMuDQo+ID4+Pj4NCj4gPj4+PiBTaWduZWQtb2ZmLWJ5 OiBWbGFkaW1pciBTZW1lbnRzb3YtT2dpZXZza2l5IDx2c2VtZW50c292QHZpcnR1b3p6by5jb20+ DQo+ID4+Pj4gLS0tDQo+ID4+Pj4gICAgYmxvY2svYmFja3VwLmMgfCAyODUgKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiA+Pj4+ICAgIDEgZmlsZSBj aGFuZ2VkLCAxNDkgaW5zZXJ0aW9ucygrKSwgMTM2IGRlbGV0aW9ucygtKQ0KPiA+Pj4+DQo+ID4+ Pj4gZGlmZiAtLWdpdCBhL2Jsb2NrL2JhY2t1cC5jIGIvYmxvY2svYmFja3VwLmMNCj4gPj4+PiBp bmRleCA4OGMwMjQyYjRlLi5lMzMyOTA5ZmI3IDEwMDY0NA0KPiA+Pj4+IC0tLSBhL2Jsb2NrL2Jh Y2t1cC5jDQo+ID4+Pj4gKysrIGIvYmxvY2svYmFja3VwLmMNCj4gPj4+DQo+ID4+PiBbLi4uXQ0K PiA+Pj4NCj4gPj4+PiBAQCAtMzAwLDIxICsyMzEsMjMgQEAgc3RhdGljIHZvaWQgYmFja3VwX2Fi b3J0KEpvYiAqam9iKQ0KPiA+Pj4+ICAgIHN0YXRpYyB2b2lkIGJhY2t1cF9jbGVhbihKb2IgKmpv YikNCj4gPj4+PiAgICB7DQo+ID4+Pj4gICAgICAgIEJhY2t1cEJsb2NrSm9iICpzID0gY29udGFp bmVyX29mKGpvYiwgQmFja3VwQmxvY2tKb2IsIGNvbW1vbi5qb2IpOw0KPiA+Pj4+IC0gICAgYXNz ZXJ0KHMtPnRhcmdldCk7DQo+ID4+Pj4gLSAgICBibGtfdW5yZWYocy0+dGFyZ2V0KTsNCj4gPj4+ PiArDQo+ID4+Pj4gKyAgICAvKiBXZSBtdXN0IGNsZWFuIGl0IHRvIG5vdCBjcmFzaCBpbiBiYWNr dXBfZHJhaW4uICovDQo+ID4+Pj4gICAgICAgIHMtPnRhcmdldCA9IE5VTEw7DQo+ID4+Pg0KPiA+ Pj4gV2h5IG5vdCBzZXQgcy0+c291cmNlIHRvIE5VTEwgYWxvbmcgd2l0aCBpdD8gIEl0IG1ha2Vz IHNlbnNlIGlmIHlvdSdyZQ0KPiA+Pj4gZ29pbmcgdG8gZHJvcCB0aGUgYmFja3VwLXRvcCBub2Rl IGJlY2F1c2UgYm90aCBvZiB0aGVzZSBhcmUgaXRzIGNoaWxkcmVuLg0KPiA+Pg0KPiA+PiBhZ3Jl ZS4NCj4gPj4NCj4gPj4+DQo+ID4+Pj4NCj4gPj4+PiAgICAgICAgaWYgKHMtPmNvcHlfYml0bWFw KSB7DQo+ID4+Pj4gICAgICAgICAgICBoYml0bWFwX2ZyZWUocy0+Y29weV9iaXRtYXApOw0KPiA+ Pj4+ICAgICAgICAgICAgcy0+Y29weV9iaXRtYXAgPSBOVUxMOw0KPiA+Pj4+ICAgICAgICB9DQo+ ID4+Pj4gKw0KPiA+Pj4+ICsgICAgYmRydl9iYWNrdXBfdG9wX2Ryb3Aocy0+YmFja3VwX3RvcCk7 DQo+ID4+Pj4gICAgfQ0KPiA+Pj4NCj4gPj4+IFsuLi5dDQo+ID4+Pg0KPiA+Pj4+IEBAIC0zODYs MjEgKzMxOSw0NSBAQCBzdGF0aWMgaW50IGNvcm91dGluZV9mbiBiYWNrdXBfcnVuX2luY3JlbWVu dGFsKEJhY2t1cEJsb2NrSm9iICpqb2IpDQo+ID4+Pj4gICAgICAgIGJvb2wgZXJyb3JfaXNfcmVh ZDsNCj4gPj4+PiAgICAgICAgaW50NjRfdCBvZmZzZXQ7DQo+ID4+Pj4gICAgICAgIEhCaXRtYXBJ dGVyIGhiaTsNCj4gPj4+PiArICAgIHZvaWQgKmxvY2sgPSBOVUxMOw0KPiA+Pj4+DQo+ID4+Pj4g ICAgICAgIGhiaXRtYXBfaXRlcl9pbml0KCZoYmksIGpvYi0+Y29weV9iaXRtYXAsIDApOw0KPiA+ Pj4+IC0gICAgd2hpbGUgKChvZmZzZXQgPSBoYml0bWFwX2l0ZXJfbmV4dCgmaGJpKSkgIT0gLTEp IHsNCj4gPj4+PiArICAgIHdoaWxlIChoYml0bWFwX2NvdW50KGpvYi0+Y29weV9iaXRtYXApKSB7 DQo+ID4+Pj4gKyAgICAgICAgb2Zmc2V0ID0gaGJpdG1hcF9pdGVyX25leHQoJmhiaSk7DQo+ID4+ Pj4gKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgew0KPiA+Pj4+ICsgICAgICAgICAgICAvKg0K PiA+Pj4+ICsgICAgICAgICAgICAgKiB3ZSBtYXkgaGF2ZSBza2lwcGVkIHNvbWUgY2x1c3RlcnMs IHdoaWNoIHdlcmUgaGFuZGxlZCBieQ0KPiA+Pj4+ICsgICAgICAgICAgICAgKiBiYWNrdXAtdG9w LCBidXQgZmFpbGVkIGFuZCBmaW5pc2hlZCBieSByZXR1cm5pbmcgZXJyb3IgdG8NCj4gPj4+PiAr ICAgICAgICAgICAgICogdGhlIGd1ZXN0IGFuZCBzZXQgZGlydHkgYml0IGJhY2suDQo+ID4+Pj4g KyAgICAgICAgICAgICAqLw0KPiA+Pj4+ICsgICAgICAgICAgICBoYml0bWFwX2l0ZXJfaW5pdCgm aGJpLCBqb2ItPmNvcHlfYml0bWFwLCAwKTsNCj4gPj4+PiArICAgICAgICAgICAgb2Zmc2V0ID0g aGJpdG1hcF9pdGVyX25leHQoJmhiaSk7DQo+ID4+Pj4gKyAgICAgICAgICAgIGFzc2VydChvZmZz ZXQpOw0KPiA+Pj4NCj4gPj4+IEkgdGhpbmsgeW91IHdhbnQgdG8gYXNzZXJ0ICJvZmZzZXQgPj0g MCIuDQo+ID4+Pg0KPiA+Pj4+ICsgICAgICAgIH0NCj4gPj4+PiArDQo+ID4+Pj4gKyAgICAgICAg bG9jayA9IGJkcnZfY29fdHJ5X2xvY2soam9iLT5zb3VyY2UsIG9mZnNldCwgam9iLT5jbHVzdGVy X3NpemUpOw0KPiA+Pj4+ICsgICAgICAgIC8qDQo+ID4+Pj4gKyAgICAgICAgICogRGlydHkgYml0 IGlzIHNldCwgd2hpY2ggbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gaW4tZmxpZ2h0DQo+ID4+Pj4g KyAgICAgICAgICogd3JpdGUgcmVxdWVzdHMgb24gdGhpcyBhcmVhLiBXZSBtdXN0IHN1Y2NlZWQu DQo+ID4+Pj4gKyAgICAgICAgICovDQo+ID4+Pj4gKyAgICAgICAgYXNzZXJ0KGxvY2spOw0KPiA+ Pj4NCj4gPj4+IEknbSBub3Qgc3VyZSB0aGF0IGlzIHRydWUgcmlnaHQgbm93LCBidXQgbW9yZSBv biB0aGF0IGJlbG93IGluIGJhY2t1cF9ydW4oKS4NCj4gPj4+DQo+ID4+Pj4gKw0KPiA+Pj4+ICAg ICAgICAgICAgZG8gew0KPiA+Pj4+ICAgICAgICAgICAgICAgIGlmICh5aWVsZF9hbmRfY2hlY2so am9iKSkgew0KPiA+Pj4+ICsgICAgICAgICAgICAgICAgYmRydl9jb191bmxvY2sobG9jayk7DQo+ ID4+Pj4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KPiA+Pj4+ICAgICAgICAgICAgICAg IH0NCj4gPj4+PiAtICAgICAgICAgICAgcmV0ID0gYmFja3VwX2RvX2Nvdyhqb2IsIG9mZnNldCwN Cj4gPj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ItPmNsdXN0ZXJfc2l6 ZSwgJmVycm9yX2lzX3JlYWQsIGZhbHNlKTsNCj4gPj4+PiArICAgICAgICAgICAgcmV0ID0gYmFj a3VwX2RvX2Nvdyhqb2IsIG9mZnNldCwgam9iLT5jbHVzdGVyX3NpemUsICZlcnJvcl9pc19yZWFk KTsNCj4gPj4+PiAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiBiYWNrdXBfZXJyb3JfYWN0 aW9uKGpvYiwgZXJyb3JfaXNfcmVhZCwgLXJldCkgPT0NCj4gPj4+PiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBCTE9DS19FUlJPUl9BQ1RJT05fUkVQT1JUKQ0KPiA+Pj4+ICAgICAgICAg ICAgICAgIHsNCj4gPj4+PiArICAgICAgICAgICAgICAgIGJkcnZfY29fdW5sb2NrKGxvY2spOw0K PiA+Pj4+ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPiA+Pj4+ICAgICAgICAgICAg ICAgIH0NCj4gPj4+PiAgICAgICAgICAgIH0gd2hpbGUgKHJldCA8IDApOw0KPiA+Pj4+ICsNCj4g Pj4+PiArICAgICAgICBiZHJ2X2NvX3VubG9jayhsb2NrKTsNCj4gPj4+PiArICAgICAgICBsb2Nr ID0gTlVMTDsNCj4gPj4+DQo+ID4+PiBUaGlzIHN0YXRlbWVudCBzZWVtcyB1bm5lY2Vzc2FyeSBo ZXJlLg0KPiA+Pj4NCj4gPj4+PiAgICAgICAgfQ0KPiA+Pj4+DQo+ID4+Pj4gICAgICAgIHJldHVy biAwOw0KPiA+Pj4NCj4gPj4+IFsuLi5dDQo+ID4+Pg0KPiA+Pj4+IEBAIC00NDcsMjYgKzQwMiwz OSBAQCBzdGF0aWMgaW50IGNvcm91dGluZV9mbiBiYWNrdXBfcnVuKEpvYiAqam9iLCBFcnJvciAq KmVycnApDQo+ID4+Pj4gICAgICAgICAgICBoYml0bWFwX3NldChzLT5jb3B5X2JpdG1hcCwgMCwg cy0+bGVuKTsNCj4gPj4+PiAgICAgICAgfQ0KPiA+Pj4+DQo+ID4+Pj4gLSAgICBzLT5iZWZvcmVf d3JpdGUubm90aWZ5ID0gYmFja3VwX2JlZm9yZV93cml0ZV9ub3RpZnk7DQo+ID4+Pj4gLSAgICBi ZHJ2X2FkZF9iZWZvcmVfd3JpdGVfbm90aWZpZXIoYnMsICZzLT5iZWZvcmVfd3JpdGUpOw0KPiA+ Pj4+IC0NCj4gPj4+PiAgICAgICAgaWYgKHMtPnN5bmNfbW9kZSA9PSBNSVJST1JfU1lOQ19NT0RF X05PTkUpIHsNCj4gPj4+PiAgICAgICAgICAgIC8qIEFsbCBiaXRzIGFyZSBzZXQgaW4gY29weV9i aXRtYXAgdG8gYWxsb3cgYW55IGNsdXN0ZXIgdG8gYmUgY29waWVkLg0KPiA+Pj4+ICAgICAgICAg ICAgICogVGhpcyBkb2VzIG5vdCBhY3R1YWxseSByZXF1aXJlIHRoZW0gdG8gYmUgY29waWVkLiAq Lw0KPiA+Pj4+ICAgICAgICAgICAgd2hpbGUgKCFqb2JfaXNfY2FuY2VsbGVkKGpvYikpIHsNCj4g Pj4+PiAtICAgICAgICAgICAgLyogWWllbGQgdW50aWwgdGhlIGpvYiBpcyBjYW5jZWxsZWQuICBX ZSBqdXN0IGxldCBvdXIgYmVmb3JlX3dyaXRlDQo+ID4+Pj4gLSAgICAgICAgICAgICAqIG5vdGlm eSBjYWxsYmFjayBzZXJ2aWNlIENvVyByZXF1ZXN0cy4gKi8NCj4gPj4+PiArICAgICAgICAgICAg LyoNCj4gPj4+PiArICAgICAgICAgICAgICogWWllbGQgdW50aWwgdGhlIGpvYiBpcyBjYW5jZWxs ZWQuICBXZSBqdXN0IGxldCBvdXIgYmFja3VwLXRvcA0KPiA+Pj4+ICsgICAgICAgICAgICAgKiBm aWxldGVyIGRyaXZlciBzZXJ2aWNlIENiVyByZXF1ZXN0cy4NCj4gPj4+DQo+ID4+PiAqZmlsdGVy DQo+ID4+Pg0KPiA+Pj4+ICsgICAgICAgICAgICAgKi8NCj4gPj4+PiAgICAgICAgICAgICAgICBq b2JfeWllbGQoam9iKTsNCj4gPj4+PiAgICAgICAgICAgIH0NCj4gPj4+PiAgICAgICAgfSBlbHNl IGlmIChzLT5zeW5jX21vZGUgPT0gTUlSUk9SX1NZTkNfTU9ERV9JTkNSRU1FTlRBTCkgew0KPiA+ Pj4+ICAgICAgICAgICAgcmV0ID0gYmFja3VwX3J1bl9pbmNyZW1lbnRhbChzKTsNCj4gPj4+PiAg ICAgICAgfSBlbHNlIHsNCj4gPj4+DQo+ID4+PiBbLi4uXQ0KPiA+Pj4NCj4gPj4+PiBAQCAtNTA1 LDggKzQ3NCwyMCBAQCBzdGF0aWMgaW50IGNvcm91dGluZV9mbiBiYWNrdXBfcnVuKEpvYiAqam9i LCBFcnJvciAqKmVycnApDQo+ID4+Pj4gICAgICAgICAgICAgICAgaWYgKGFsbG9jZWQgPCAwKSB7 DQo+ID4+Pj4gICAgICAgICAgICAgICAgICAgIHJldCA9IGFsbG9jZWQ7DQo+ID4+Pj4gICAgICAg ICAgICAgICAgfSBlbHNlIHsNCj4gPj4+PiArICAgICAgICAgICAgICAgIGlmICghaGJpdG1hcF9n ZXQocy0+Y29weV9iaXRtYXAsIG9mZnNldCkpIHsNCj4gPj4+PiArICAgICAgICAgICAgICAgICAg ICB0cmFjZV9iYWNrdXBfZG9fY293X3NraXAoam9iLCBvZmZzZXQpOw0KPiA+Pj4+ICsgICAgICAg ICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBhbHJlYWR5IGNvcGllZCAqLw0KPiA+Pj4+ICsgICAg ICAgICAgICAgICAgfQ0KPiA+Pj4+ICsgICAgICAgICAgICAgICAgaWYgKCFsb2NrKSB7DQo+ID4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgbG9jayA9IGJkcnZfY29fdHJ5X2xvY2socy0+c291cmNl LCBvZmZzZXQsIHMtPmNsdXN0ZXJfc2l6ZSk7DQo+ID4+Pj4gKyAgICAgICAgICAgICAgICAgICAg LyoNCj4gPj4+PiArICAgICAgICAgICAgICAgICAgICAgKiBEaXJ0eSBiaXQgaXMgc2V0LCB3aGlj aCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBpbi1mbGlnaHQNCj4gPj4+PiArICAgICAgICAgICAg ICAgICAgICAgKiB3cml0ZSByZXF1ZXN0cyBvbiB0aGlzIGFyZWEuIFdlIG11c3Qgc3VjY2VlZC4N Cj4gPj4+PiArICAgICAgICAgICAgICAgICAgICAgKi8NCj4gPj4+PiArICAgICAgICAgICAgICAg ICAgICBhc3NlcnQobG9jayk7DQo+ID4+Pg0KPiA+Pj4gV2hhdCBpZiBJIGhhdmUgYSBkaWZmZXJl bnQgcGFyZW50IG5vZGUgZm9yIHRoZSBzb3VyY2UgdGhhdCBpc3N1ZXMNCj4gPj4+IGNvbmN1cnJl bnQgd3JpdGVzPyAgVGhpcyB1c2VkIHRvIHdvcmsgZmluZSBiZWNhdXNlIHRoZSBiZWZvcmVfd3Jp dGUNCj4gPj4+IG5vdGlmaWVyIHdvdWxkIHN0aWxsIHdvcmsuICBBZnRlciB0aGlzIHBhdGNoLCB0 aGF0IHdvdWxkIGJlIGJyb2tlbg0KPiA+Pj4gYmVjYXVzZSB0aG9zZSB3cml0ZXMgd291bGQgbm90 IGNhdXNlIGEgQ2JXLg0KPiA+Pg0KPiA+PiBCdXQgaGF3IGNvdWxkIHlvdSBoYXZlIHRoaXMgZGlm ZmVyZW50IHBhcmVudCBub2RlPyBBZnRlciBhcHBlbmRpbmcgZmlsdGVyLA0KPiA+PiB0aGVyZSBz aG91bGQgbm90IGJlIHN1Y2ggbm9kZXMuDQo+ID4NCj4gPiBVbmxlc3MgeW91IGFwcGVuZCB0aGVt IGFmdGVyd2FyZHM6DQo+ID4NCj4gPj4gQW5kIEkgdGhpbmssIGR1cmluZyBiYWNrdXAgaXQgc2hv dWxkIGJlDQo+ID4+IGZvcmJpZGRlbiB0byBhcHBlbmQgbmV3IHBhcmVudHMgdG8gc291cmNlLCBp Z25vcmluZyBmaWx0ZXIsIGFzIGl0IGRlZmluaXRlbHkNCj4gPj4gYnJlYWtzIHdoYXQgZmlsdGVy IGRvZXMuDQo+ID4NCj4gPiBBZ3JlZWQsIGJ1dCB0aGVuIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVt ZW50ZWQuDQo+ID4NCj4gPj4gQW5kIGl0IGFwcGxpZXMgdG8gb3RoZXIgYmxvY2stam9iIHdpdGgg dGhlaXIgZmlsdGVycy4NCj4gPj4gSWYgd2UgYXBwZW5kZWQgYSBmaWx0ZXIsIHdlIGRvbid0IHdh bnQgc29tZW9uZSBvdGhlciB0byB3cml0ZSBvbWl0IG91ciBmaWx0ZXIuDQo+ID4+DQo+ID4+Pg0K PiA+Pj4gVGhhdCdzIG5vdCBzbyBiYWQgYmVjYXVzZSB3ZSBqdXN0IGhhdmUgdG8gbWFrZSBzdXJl IHRoYXQgYWxsIHdyaXRlcyBnbw0KPiA+Pj4gdGhyb3VnaCB0aGUgYmFja3VwLXRvcCBub2RlLiAg VGhhdCB3b3VsZCBtYWtlIHRoaXMgYXNzZXJ0aW9uIHZhbGlkDQo+ID4+PiBhZ2FpbiwgdG9vLiAg QnV0IHRoYXQgbWVhbnMgd2UgY2Fubm90IHNoYXJlIFBFUk1fV1JJVEU7IHNlZSBbMV0uDQo+ID4+ DQo+ID4+IEJ1dCB3ZSBkb24ndCBzaGFyZSBQRVJNX1dSSVRFIG9uIHNvdXJjZSBpbiBiYWNrdXBf dG9wLCBvbmx5IG9uIHRhcmdldC4NCj4gPg0KPiA+IEFyZSB5b3Ugc3VyZT8gIFRoZSBqb2IgaXRz ZWxmIHNoYXJlcyBpdCwgYW5kIHRoZSBmaWx0ZXIgc2hhcmVzIGl0LCB0b28sDQo+ID4gYXMgZmFy IGFzIEkgY2FuIHNlZS4gIEl0IHVzZXMgYmRydl9maWx0ZXJfZGVmYXVsdF9wZXJtcygpLCBhbmQg dGhhdCBkb2VzDQo+ID4gc2VlbSB0byBzaGFyZSBQRVJNX1dSSVRFLg0KPg0KPiBBbmQgaW4gYmRy dl9GaWx0ZXJfZGVmYXVsdF9wZXJtcyBpdCBkb2VzICIqbnNoYXJlZCA9ICpuc2hhcmVkIHwgQkxL X1BFUk1fV1JJVEUiDQo+IG9ubHkgZm9yIGNoaWxkX2ZpbGUsIGl0IGlzIHRhcmdldC4gU291cmNl IGlzIGNoaWxkX2JhY2tpbmcuDQo+DQo+ID4NCj4gPj4+DQo+ID4+Pj4gKyAgICAgICAgICAgICAg ICB9DQo+ID4+Pj4gICAgICAgICAgICAgICAgICAgIHJldCA9IGJhY2t1cF9kb19jb3cocywgb2Zm c2V0LCBzLT5jbHVzdGVyX3NpemUsDQo+ID4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICZlcnJvcl9pc19yZWFkLCBmYWxzZSk7DQo+ID4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9pc19yZWFkKTsNCj4gPj4+PiAgICAgICAgICAg ICAgICB9DQo+ID4+Pj4gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsNCj4gPj4+PiAgICAg ICAgICAgICAgICAgICAgLyogRGVwZW5kaW5nIG9uIGVycm9yIGFjdGlvbiwgZmFpbCBub3cgb3Ig cmV0cnkgY2x1c3RlciAqLw0KPiA+Pj4+IEBAIC01MTYsMTcgKzQ5NywzNCBAQCBzdGF0aWMgaW50 IGNvcm91dGluZV9mbiBiYWNrdXBfcnVuKEpvYiAqam9iLCBFcnJvciAqKmVycnApDQo+ID4+Pj4g ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4gPj4+PiAgICAgICAgICAgICAgICAgICAg fSBlbHNlIHsNCj4gPj4+PiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBzLT5jbHVz dGVyX3NpemU7DQo+ID4+Pj4gKyAgICAgICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOw0KPiA+ Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQo+ID4+Pj4gICAgICAgICAgICAg ICAgICAgIH0NCj4gPj4+PiAgICAgICAgICAgICAgICB9DQo+ID4+Pj4gICAgICAgICAgICB9DQo+ ID4+Pj4gKyAgICAgICAgaWYgKGxvY2spIHsNCj4gPj4+PiArICAgICAgICAgICAgYmRydl9jb191 bmxvY2sobG9jayk7DQo+ID4+Pj4gKyAgICAgICAgICAgIGxvY2sgPSBOVUxMOw0KPiA+Pj4+ICsg ICAgICAgIH0NCj4gPj4+PiArICAgICAgICBpZiAocmV0ID09IDAgJiYgIWpvYl9pc19jYW5jZWxs ZWQoam9iKSAmJg0KPiA+Pj4+ICsgICAgICAgICAgICBoYml0bWFwX2NvdW50KHMtPmNvcHlfYml0 bWFwKSkNCj4gPj4+PiArICAgICAgICB7DQo+ID4+Pj4gKyAgICAgICAgICAgIC8qDQo+ID4+Pj4g KyAgICAgICAgICAgICAqIHdlIG1heSBoYXZlIHNraXBwZWQgc29tZSBjbHVzdGVycywgd2hpY2gg d2VyZSBoYW5kbGVkIGJ5DQo+ID4+Pj4gKyAgICAgICAgICAgICAqIGJhY2t1cC10b3AsIGJ1dCBm YWlsZWQgYW5kIGZpbmlzaGVkIGJ5IHJldHVybmluZyBlcnJvciB0bw0KPiA+Pj4+ICsgICAgICAg ICAgICAgKiB0aGUgZ3Vlc3QgYW5kIHNldCBkaXJ0eSBiaXQgYmFjay4NCj4gPj4+DQo+ID4+PiBT byBpdCdzIGEgbWF0dGVyIG9mIGEgcmFjZT8NCj4gPj4+DQo+ID4+Pj4gKyAgICAgICAgICAgICAq Lw0KPiA+Pj4+ICsgICAgICAgICAgICBnb3RvIGl0ZXJhdGlvbjsNCj4gPj4+PiArICAgICAgICB9 DQo+ID4+Pg0KPiA+Pj4gV2h5IG5vdCB3cmFwIGV2ZXJ5dGhpbmcgaW4gYSBkbyB7fSB3aGlsZSAo cmV0ID09IDAgJiYgIWpvYl9pcy4uLikNCj4gPj4+IGluc3RlYWQ/ICBCZWNhdXNlIGl0IHdvdWxk IG1lYW4gcmVpbmRlbnRpbmcgZXZlcnl0aGluZz8NCj4gPj4NCj4gPj4gRG9uJ3QgcmVtZW1iZXIs IGJ1dCBhc3N1bWUgdGhhdCB5ZXMuIEFuZCB0aGlzIGNvZGUgaXMgYW55d2F5ICJUbyBiZSByZWZh Y3RvcmVkIiwNCj4gPj4gSSB3YW50IGFsbCBGVUxML1RPUC9JTkNSRU1FTlRBTCBnbyB0aHJvdWdo IHRoZSBzYW1lIChtb3N0bHkpIGNvZGUgcGF0aC4NCj4gPg0KPiA+IEhtLCB3ZWxsLCBpZiB5b3Ug d2FudCB0byByZWZhY3RvciBpdCBsYXRlciBhbnl3YXkuLi4gIEJ1dCBJIGRvbid0IGxpa2UNCj4g PiBnb3RvcyB0aGF0IGdvIGJhY2t3YXJkcyB2ZXJ5IG11Y2gsIHVubGVzcyB0aGVyZSBpcyBhIGdv b2QgcmVhc29uIHRvIGhhdmUNCj4gPiB0aGVtIChhbmQgdGhlcmUgaXNuJ3QgaGVyZSkuDQo+DQo+ DQo+IE9rLCBub3QgYSByZWFsIHByb2JsZW0uIExldCdzIGdvIG9uIHdpdGggZG8td2hpbGUuDQo+ DQo+DQo+ID4NCj4gPj4+PiAgICAgICAgfQ0KPiA+Pj4+DQo+ID4+Pj4gLSAgICBub3RpZmllcl93 aXRoX3JldHVybl9yZW1vdmUoJnMtPmJlZm9yZV93cml0ZSk7DQo+ID4+Pj4gKyAgICAvKiB3YWl0 IHBlbmRpbmcgQ0JXIG9wZXJhdGlvbnMgaW4gYmFja3VwLXRvcCAqLw0KPiA+Pj4+ICsgICAgYmRy dl9kcmFpbihzLT5iYWNrdXBfdG9wKTsNCj4gPj4+Pg0KPiA+Pj4+IC0gICAgLyogd2FpdCB1bnRp bCBwZW5kaW5nIGJhY2t1cF9kb19jb3coKSBjYWxscyBoYXZlIGNvbXBsZXRlZCAqLw0KPiA+Pj4+ IC0gICAgcWVtdV9jb19yd2xvY2tfd3Jsb2NrKCZzLT5mbHVzaF9yd2xvY2spOw0KPiA+Pj4+IC0g ICAgcWVtdV9jb19yd2xvY2tfdW5sb2NrKCZzLT5mbHVzaF9yd2xvY2spOw0KPiA+Pj4+ICsgICAg YmFja3VwX3RvcF9wcm9ncmVzcyA9IGJkcnZfYmFja3VwX3RvcF9wcm9ncmVzcyhzLT5iYWNrdXBf dG9wKTsNCj4gPj4+PiArICAgIGpvYl9wcm9ncmVzc191cGRhdGUoam9iLCByZXQgKyBiYWNrdXBf dG9wX3Byb2dyZXNzIC0NCj4gPj4+DQo+ID4+PiBXaHkgdGhlICJyZXQiPw0KPiA+Pg0KPiA+PiBv b3BzLCBpdCBsb29rcyBsaWtlIGEgY29weS1wYXN0ZSBidWcgKCJyZXQiIGlzIHJlYXNvbmFibGUg aW4gYmFja3VwX2RvX2NvdygpKQ0KPiA+Pg0KPiA+Pj4NCj4gPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgcy0+YmFja3VwX3RvcF9wcm9ncmVzcyk7DQo+ID4+Pj4gKyAgICBzLT5iYWNrdXBf dG9wX3Byb2dyZXNzID0gYmFja3VwX3RvcF9wcm9ncmVzczsNCj4gPj4+DQo+ID4+PiBTbyB0aGUg YmFja3VwLXRvcCBwcm9ncmVzcyBpcyBpZ25vcmVkIGR1cmluZyBiYXNpY2FsbHkgYWxsIG9mIHRo ZSBibG9jaw0KPiA+Pj4gam9iIHVudGlsIGl0IHN1ZGRlbmx5IGp1bXBzIHRvIDEwMCAlIGNvbXBs ZXRpb24/ICBUaGF0IGRvZXNuJ3Qgc291bmQgaWRlYWwuDQo+ID4+Pg0KPiA+Pj4gT3IgZGlkIHlv dSBtZWFuIHRvIHB1dCB0aGlzIGludG8gdGhlIGZvciAoKSBsb29wIG9mIE1PREVfVE9QL01PREVf RlVMTD8NCj4gPj4+ICAgIChBbmQgdGhlIHdoaWxlKCkgbG9vcCBvZiBNT0RFX05PTkUpDQo+ID4+ DQo+ID4+DQo+ID4+IEl0IGlzIGRvbmUgaW4gYmFja3VwX2RvX2NvdygpLCBzbyBGVUxMIGFuZCBU T1AgYXJlIGNvdmVyZWQuDQo+ID4+DQo+ID4+IEJ1dCB5b3UgYXJlIHJpZ2h0IHRoYXQgTU9ERV9O T05FIHNlZW1zIHRvIGhhdmUgYSBwcm9ibGVtIGFib3V0IGl0Li4gQW5kIGp1c3QgdXBkYXRpbmcg aXQNCj4gPj4gaW4gYSB3aGlsZSBsb29wIHdvdWxkIG5vdCB3b3JrLCBhcyBJIGRvdWJ0IHRoYXQg am9iX3lpZWxkIHdpbGwgcmV0dXJuIHVudGlsIGpvYiBmaW5pc2gNCj4gPj4gb3IgdXNlciBpbnRl cmFjdGlvbiBsaWtlIHBhdXNlL2NvbnRpbnVlL2NhbmNlbC4uDQo+ID4+DQo+ID4+IFNvIG5vdywg aXQgbG9va3MgYmV0dGVyIHRvIGNhbGwgam9iX3Byb2dyZXNzX3VwZGF0ZSgpIGZyb20gYmFja3Vw X3RvcCBkaXJlY3RseSwgYW5kIGRyb3ANCj4gPj4gdGhpcyBoYWNrLg0KPiA+DQo+ID4gSG1tbS4u LiAgSSBkb24ndCB0aGluayBqb2JfKigpIGNhbGxzIGJlbG9uZyBpbiBiYWNrdXBfdG9wLiAgSG93 IGFib3V0DQo+ID4gYWRkaW5nIGEgY2FsbGJhY2sgdG8gYmRydl9iYWNrdXBfdG9wX2FwcGVuZCgp Pw0KPg0KPiBPayBmb3IgbWUgYXQgbGVhc3QgYXMgYSB0ZW1wb3Jhcnkgc3RlcC4NCj4NCj4gPg0K PiA+Pj4+DQo+ID4+Pj4gICAgICAgIHJldHVybiByZXQ7DQo+ID4+Pj4gICAgfQ0KPiA+Pj4+IEBA IC01NjMsNiArNTYxLDkgQEAgQmxvY2tKb2IgKmJhY2t1cF9qb2JfY3JlYXRlKGNvbnN0IGNoYXIg KmpvYl9pZCwgQmxvY2tEcml2ZXJTdGF0ZSAqYnMsDQo+ID4+Pj4gICAgICAgIGludCByZXQ7DQo+ ID4+Pj4gICAgICAgIGludDY0X3QgY2x1c3Rlcl9zaXplOw0KPiA+Pj4+ICAgICAgICBIQml0bWFw ICpjb3B5X2JpdG1hcCA9IE5VTEw7DQo+ID4+Pj4gKyAgICBCbG9ja0RyaXZlclN0YXRlICpiYWNr dXBfdG9wID0gTlVMTDsNCj4gPj4+PiArICAgIHVpbnQ2NF90IGFsbF9leGNlcHRfcmVzaXplID0g QkxLX1BFUk1fQ09OU0lTVEVOVF9SRUFEIHwgQkxLX1BFUk1fV1JJVEUgfA0KPiA+Pj4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTEtfUEVSTV9XUklURV9VTkNIQU5HRUQgfCBC TEtfUEVSTV9HUkFQSF9NT0Q7DQo+ID4+Pg0KPiA+Pj4gQkxLX1BFUk1fQUxMICYgfkJMS19QRVJN X1JFU0laRT8NCj4gPj4+DQo+ID4+PiBbMV0gQnV0IHdlIHByb2JhYmx5IGRvIG5vdCB3YW50IHRv IHNoYXJlIGVpdGhlciBQRVJNX1dSSVRFIG9yDQo+ID4+PiBQRVJNX1dSSVRFX1VOQ0hBTkdFRCBi ZWNhdXNlIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGJhY2t1cCwNCj4gPj4+IGV2ZXJ5dGhp bmcgc2hvdWxkIGdvIHRocm91Z2ggdGhlIGJhY2t1cC10b3AgZmlsdGVyIChub3Qgc3VyZSBhYm91 dA0KPiA+Pj4gUEVSTV9XUklURV9VTkNIQU5HRUQgcmlnaHQgbm93KS4gIE9yIGlzIHRoYXQgc29t ZXRoaW5nIHRoYXQgdGhlIGZpbHRlcg0KPiA+Pj4gbm9kZSBzaG91bGQgZW5mb3JjZSBpbiBiYWNr dXBfdG9wX2NoaWxkX3Blcm0oKT8NCj4gPj4NCj4gPj4gSXQncyBub3Qgc2hhcmVkIHBlcm0gb2Yg YmFja3VwX3RvcCwgaXQncyBhIHNoYXJlZCBwZXJtIG9mIGJsb2NrLWpvYiBjb21tb24uYmxrLCB3 aGljaCBpcw0KPiA+PiB1c2VkIG9ubHkgdG8gImpvYi0+bGVuIGlzIGZpeGVkLCBzbyB3ZSBjYW4n dCBhbGxvdyByZXNpemUiLCBzbyB0aGlzIHBhcnQgaXMgbm90IGNoYW5nZWQuDQo+ID4+DQo+ID4+ IFNvIHllcywgdGhlIHByb2JsZW0geW91IG1lYW4gYnkgWzFdIGlzIGFib3V0IGJhY2t1cF90b3Bf Y2hpbGRfcGVybSgpIHdoZXJlIHdlIHNoYXJlIFBFUk1fV1JJVEUuDQo+ID4+IEFuZCBpdCBpcyBk ZXNjcmliZWQgYnkgY29tbWVudCwgd2UgbXVzdCBzaGFyZSB0aGlzIHdyaXRlIHBlcm0sIG90aGVy d2lzZSB3ZSBicmVhayBndWVzdCB3cml0ZXMuDQo+ID4NCj4gPiBGb3IgdGhlIHRhcmdldCwgeWVz LCBidXQgdGhlIHByb2JsZW0gaXMgc2hhcmluZyBpdCBvbiB0aGUgc291cmNlLg0KPiA+DQo+ID4+ IFdlIHNoYXJlIFBFUk1fV1JJVEUgaW4gYmFja3VwX3RvcCB0byBmb3JjZSBpdHMgdGFyZ2V0IGNo aWxkIHNoYXJlIFBFUk1fV1JJVEUgb24gaXRzIGJhY2tpbmcsDQo+ID4+IGFzIGJhY2tpbmcgb2Yg dGFyZ2V0IGlzIHNvdXJjZS4NCj4gPj4NCj4gPj4gQnV0IGFnYWluLCB3ZSBzaGFyZSBQRVJNX1dS SVRFIG9ubHkgb24gdGFyZ2V0LCBhbmQgaXQgaXMgc2hhcmVkIGluIGN1cnJlbnQgY29kZSB0b28u DQo+ID4NCj4gPiBJJ20gbm90IHNvIHN1cmUgd2hldGhlciBQRVJNX1dSSVRFIGlzIHNoYXJlZCBv bmx5IG9uIHRoZSB0YXJnZXQuDQo+DQo+IE9ubHkgb24gdGFyZ2V0LCBhcyBjaGlsZF9maWxlIGlz IHRhcmdldC4NCj4NCj4gPg0KPiA+Pj4NCj4gPj4+Pg0KPiA+Pj4+ICAgICAgICBhc3NlcnQoYnMp Ow0KPiA+Pj4+ICAgICAgICBhc3NlcnQodGFyZ2V0KTsNCj4gPj4+PiBAQCAtNjU1LDI1ICs2NTYs MzEgQEAgQmxvY2tKb2IgKmJhY2t1cF9qb2JfY3JlYXRlKGNvbnN0IGNoYXIgKmpvYl9pZCwgQmxv Y2tEcml2ZXJTdGF0ZSAqYnMsDQo+ID4+Pj4NCj4gPj4+PiAgICAgICAgY29weV9iaXRtYXAgPSBo Yml0bWFwX2FsbG9jKGxlbiwgY3R6MzIoY2x1c3Rlcl9zaXplKSk7DQo+ID4+Pj4NCj4gPj4+PiAt ICAgIC8qIGpvYi0+bGVuIGlzIGZpeGVkLCBzbyB3ZSBjYW4ndCBhbGxvdyByZXNpemUgKi8NCj4g Pj4+PiAtICAgIGpvYiA9IGJsb2NrX2pvYl9jcmVhdGUoam9iX2lkLCAmYmFja3VwX2pvYl9kcml2 ZXIsIHR4biwgYnMsDQo+ID4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMS19QRVJN X0NPTlNJU1RFTlRfUkVBRCwNCj4gPj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxL X1BFUk1fQ09OU0lTVEVOVF9SRUFEIHwgQkxLX1BFUk1fV1JJVEUgfA0KPiA+Pj4+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICBCTEtfUEVSTV9XUklURV9VTkNIQU5HRUQgfCBCTEtfUEVSTV9H UkFQSF9NT0QsDQo+ID4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkLCBjcmVh dGlvbl9mbGFncywgY2IsIG9wYXF1ZSwgZXJycCk7DQo+ID4+Pj4gLSAgICBpZiAoIWpvYikgew0K PiA+Pj4+ICsgICAgLyoNCj4gPj4+PiArICAgICAqIGJkcnZfZ2V0X2RldmljZV9uYW1lIHdpbGwg bm90IGhlbHAgdG8gZmluZCBkZXZpY2UgbmFtZSBzdGFydGluZyBmcm9tDQo+ID4+Pj4gKyAgICAg KiBAYnMgYWZ0ZXIgYmFja3VwLXRvcCBhcHBlbmQsDQo+ID4+Pg0KPiA+Pj4gV2h5IG5vdD8gIFNp bmNlIGJhY2t1cC10b3AgaXMgYXBwZW5kZWQsIHNob3VsZG4ndCBhbGwgcGFyZW50cyBvZiBAYnMg YmUNCj4gPj4+IHBhcmVudHMgb2YgQGJhY2t1cF90b3AgdGhlbj8gIChNYWtpbmcgYmRydl9nZXRf cGFyZW50X25hbWUoKSByZXR1cm4gdGhlDQo+ID4+PiBzYW1lIHJlc3VsdCkNCj4gPj4NCj4gPj4g YmRydl9nZXRfZGV2aWNlX25hbWUgZ29lcyBmaW5hbGx5IHRocm91Z2ggcm9sZS0+Z2V0X25hbWUs IGFuZCBvbmx5IHJvb3Qgcm9sZSBoYXMNCj4gPj4gdGhpcyBoYW5kbGVyLiBBZnRlciBhcHBlbmQg d2UnbGwgaGF2ZSBiYWNraW5nIHJvbGUgaW5zdGVhZCBvZiByb290Lg0KPiA+DQo+ID4gQWgsIEkg c2VlLCBJIGFza2VkIHRoZSB3cm9uZyBxdWVzdGlvbi4NCj4gPg0KPiA+IFdoeSBpcyBibG9ja19q b2JfY3JlYXRlKCkgY2FsbGVkIG9uIGJzIGFuZCBub3Qgb24gYmFja3VwX3RvcD8gIG1pcnJvcg0K PiA+IGNhbGxzIGl0IG9uIG1pcnJvcl90b3BfYnMuDQo+DQo+IEdvb2QgcXVlc3Rpb24uIEkgZG9u J3QgZXhhY3RseSByZW1lbWJlciwgbWF5IGJlIHRoZXJlIGFyZSB3ZXJlIG1vcmUgdHJvdWJsZXMg d2l0aA0KPiBwZXJtaXNzaW9ucyBvciBzb210aGluZy4gU28sIEkndmUgdG8gdHJ5IGl0IGFnYWlu Li4NCj4NCj4gV2hhdCBpcyBtb3JlIGJlbmVmaWNpYWw/DQo+DQo+IE15IGN1cnJlbnQgYXBwcm9h Y2gsIGlzIHRoYXQgam9iIGFuZCBmaWx0ZXIgYXJlIHR3byBzaWJsaW5nIHVzZXJzIG9mIHNvdXJj ZSBub2RlLA0KPiB0aGV5IGRvIGNvcHlpbmcsIHRoZXkgYXJlIHN5bmNocm9uaXplZC4gQW5kIGlu IHRoaXMgd2F5LCBpdCBpcyBiZXR0ZXIgdG8gcmVhZCBmcm9tDQo+IHNvdXJjZSBkaXJlY3RseSwg dG8gbm90IGNyZWF0ZSBleHRyYSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBqb2IgYW5kIGZpbHRlci4u DQo+DQo+IE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSByZWFkIHRocm91Z2ggdGhlIGZpbHRlciwg d2UgcG9zc2libGUgc2hvdWxkIGRvIHRoZSB3aG9sZQ0KPiBjb3B5IG9wZXJhdGlvbiB0aHJvdWdo IHRoZSBmaWx0ZXIuLg0KPg0KPiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZ3Vlc3Qg cmVhZCBhbmQgYmFja3VwLWpvYiByZWFkLCBpbiBmaWx0ZXIgUE9WPyBJIHRoaW5rOg0KPg0KPiBG b3IgZ3Vlc3QgcmVhZCwgZmlsdGVyIE1VU1QgcmVhZCAoYXMgd2UgbXVzdCBoYW5kbGUgZ3Vlc3Qg cmVxdWVzdCksIGFuZCB0aGFuLCBpZg0KPiB3ZSBkb24ndCBoYXZlIHRvbyBtdWNoIGluLWZsaWdo dCByZXF1ZXN0cywgcmFtLWNhY2hlIGlzIG5vdCBmdWxsLCBldGMsIHdlIGNhbiBoYW5kbGUNCj4g YWxyZWFkeSByZWFkIGRhdGEgaW4gdGVybXMgb2YgYmFja3VwLCBzbywgY29weSBpdCBzb21ld2hl cmUuIE9yIHdlIGNhbiBkcm9wIGl0LCBpZg0KPiB3ZSBjYW4ndCBoYW5kbGUgaXQgYXQgdGhlIG1v bWVudC4uDQo+DQo+IEZvciBqb2IgcmVhZCwgd2UgZXZlbiBNQVkgbm90IHJlYWQsIGlmIG91ciBx dWV1ZXMgYXJlIGZ1bGwsIHBvc3Rwb25pbmcgam9iIHJlcXVlc3QuDQo+DQo+IFNvDQo+DQo+IEd1 ZXN0IHJlYWQ6IE1VU1QgcmVhZCwgTUFZIGJhY2t1cA0KPiBKb2IgcmVhZDogTUFZIHJlYWQgYW5k IGJhY2t1cA0KPg0KPiBTbywgcmVhZGluZyB0aHJvdWdoIGZpbHRlciBoYXMgYSBwb3NzaWJpbGl0 eSBvZiBjb21tb24gY29kZSBwYXRoICsgbmF0aXZlIHByaW9yaXRpemF0aW9uDQo+IG9mIGNvcHkg b3BlcmF0aW9ucy4gVGhpcyBvZiBjb3Vyc2Ugd2lsbCBuZWVkIG1vcmUgcmVmYWN0b3Jpbmcgb2Yg YmFja3VwLCBhbmQgbWF5IGJlIGRvbmUNCj4gYXMgYSBzZXBhcmF0ZSBzdGVwLCBidXQgZGVmaW5p dGVseSwgSSBoYXZlIHRvIGF0IGxlYXN0IHRyeSB0byBjcmVhdGUgam9iIGFib3ZlIHRoZSBmaWx0 ZXIuDQo+DQo+ID4NCj4gPj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzbyBsZXQncyBjYWxjdWxhdGUgam9iX2lkIGJlZm9yZS4gRG8NCj4gPj4+PiArICAgICAqIGl0 IGluIHRoZSBzYW1lIHdheSBsaWtlIGJsb2NrX2pvYl9jcmVhdGUNCj4gPj4+PiArICAgICAqLw0K PiA+Pj4+ICsgICAgaWYgKGpvYl9pZCA9PSBOVUxMICYmICEoY3JlYXRpb25fZmxhZ3MgJiBKT0Jf SU5URVJOQUwpKSB7DQo+ID4+Pj4gKyAgICAgICAgam9iX2lkID0gYmRydl9nZXRfZGV2aWNlX25h bWUoYnMpOw0KPiA+Pj4+ICsgICAgfQ0KPiA+Pj4+ICsNCj4gPj4+PiArICAgIGJhY2t1cF90b3Ag PSBiZHJ2X2JhY2t1cF90b3BfYXBwZW5kKGJzLCB0YXJnZXQsIGNvcHlfYml0bWFwLCBlcnJwKTsN Cj4gPj4+PiArICAgIGlmICghYmFja3VwX3RvcCkgew0KPiA+Pj4+ICAgICAgICAgICAgZ290byBl cnJvcjsNCj4gPj4+PiAgICAgICAgfQ0KPiA+Pj4+DQo+ID4+Pj4gLSAgICAvKiBUaGUgdGFyZ2V0 IG11c3QgbWF0Y2ggdGhlIHNvdXJjZSBpbiBzaXplLCBzbyBubyByZXNpemUgaGVyZSBlaXRoZXIg Ki8NCj4gPj4+PiAtICAgIGpvYi0+dGFyZ2V0ID0gYmxrX25ldyhCTEtfUEVSTV9XUklURSwNCj4g Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICBCTEtfUEVSTV9DT05TSVNURU5UX1JFQUQg fCBCTEtfUEVSTV9XUklURSB8DQo+ID4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgQkxL X1BFUk1fV1JJVEVfVU5DSEFOR0VEIHwgQkxLX1BFUk1fR1JBUEhfTU9EKTsNCj4gPj4+PiAtICAg IHJldCA9IGJsa19pbnNlcnRfYnMoam9iLT50YXJnZXQsIHRhcmdldCwgZXJycCk7DQo+ID4+Pj4g LSAgICBpZiAocmV0IDwgMCkgew0KPiA+Pj4+ICsgICAgLyogam9iLT5sZW4gaXMgZml4ZWQsIHNv IHdlIGNhbid0IGFsbG93IHJlc2l6ZSAqLw0KPiA+Pj4+ICsgICAgam9iID0gYmxvY2tfam9iX2Ny ZWF0ZShqb2JfaWQsICZiYWNrdXBfam9iX2RyaXZlciwgdHhuLCBicywgMCwNCj4gPj4+DQo+ID4+ PiBJcyB0aGVyZSBhIHJlYXNvbiB5b3UgZHJvcHBlZCBQRVJNX0NPTlNJU1RFTlRfUkVBRCBoZXJl Pw0KPiA+Pg0KPiA+PiBCZWNhdXNlLCB3ZSBkb24ndCB1c2UgdGhpcyBibGsgZm9yIHJlYWQgbm93 LCB3ZSByZWFkIHRocm91Z2ggYmFja3VwX3RvcCBjaGlsZC4NCj4gPg0KPiA+IE1ha2VzIHNlbnNl Lg0KPiA+DQo+ID4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9leGNlcHRfcmVz aXplLCBzcGVlZCwgY3JlYXRpb25fZmxhZ3MsDQo+ID4+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNiLCBvcGFxdWUsIGVycnApOw0KPiA+Pj4+ICsgICAgaWYgKCFqb2IpIHsNCj4gPj4+ PiAgICAgICAgICAgIGdvdG8gZXJyb3I7DQo+ID4+Pj4gICAgICAgIH0NCj4gPj4+Pg0KPiA+Pj4+ ICsgICAgam9iLT5zb3VyY2UgPSBiYWNrdXBfdG9wLT5iYWNraW5nOw0KPiA+Pj4+ICsgICAgam9i LT50YXJnZXQgPSAoKEJEUlZCYWNrdXBUb3BTdGF0ZSAqKWJhY2t1cF90b3AtPm9wYXF1ZSktPnRh cmdldDsNCj4gPj4+DQo+ID4+PiBUaGlzIGxvb2tzIHJlYWxseSB1Z2x5LiAgSSB0aGluayBhcyBs b25nIGFzIHRoZSBibG9jayBqb2IgcGVyZm9ybXMNCj4gPj4+IHdyaXRlcyBpdHNlbGYsIGl0IHNo b3VsZCB1c2UgaXRzIG93biBCbG9ja0JhY2tlbmQuDQo+ID4+DQo+ID4+IFRoZXkgYXJlIG5vdCBC bG9ja0JhY2tlbmRzLCB0aGV5IGFyZSBCZHJ2Q2hpbGRyZW4uDQo+ID4NCj4gPiBFeGFjdGx5LCB3 aGljaCBpcyB3aGF0IEkgZG9uJ3QgbGlrZS4gIFRoZXkgYXJlIGNoaWxkcmVuIG9mIGEgbm9kZSB0 aGF0DQo+ID4gaXMgaW1wbGVtZW50ZWQgaW4gYSBkaWZmZXJlbnQgZmlsZSwgaXQgbG9va3Mgd2Vp cmQgdG8gdXNlIHRoZW0gaGVyZS4NCj4gPg0KPiA+PiBJdCB3YXMgS2V2aW4ncyBpZGVhIHRvIHJl dXNlIGZpbHRlcidzDQo+ID4+IGNoaWxkcmVuIGluIGJhY2t1cCBqb2I6DQo+ID4+DQo+ID4+IGh0 dHBzOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvcWVtdS1kZXZlbC8yMDE4LTEwL21zZzAx MDE3Lmh0bWwNCj4gPg0KPiA+IEl0J3Mgc3RpbGwgdWdseSBpZiBiYWNrdXBfdG9wIGlzIGluIGEg ZGlmZmVyZW50IGZpbGUuICBXZWxsLCBtYXliZSBqdXN0DQo+ID4gdG8gbWUuDQo+ID4NCj4gPj4g SG1tLCBhbmQgdGhpcyBpcyBhbHNvIHdoeSBJIG5lZWQgUEVSTV9XUklURSBpbiBiYWNrdXBfdG9w LCB0byB3cml0ZSB0byB0YXJnZXQuDQo+ID4+DQo+ID4+Pg0KPiA+Pj4gQWx0ZXJuYXRpdmVseSwg SSB0aGluayBpdCB3b3VsZCBtYWtlIHNlbnNlIGZvciB0aGUgYmFja3VwLXRvcCBmaWx0ZXIgdG8N Cj4gPj4+IG9mZmVyIGZ1bmN0aW9ucyB0aGF0IHRoaXMgam9iIGNhbiB1c2UgdG8gaXNzdWUgd3Jp dGVzIHRvIHRoZSB0YXJnZXQuDQo+ID4+PiBUaGVuIHRoZSBiYWNrdXAgam9iIHdvdWxkIG5vIGxv bmdlciBuZWVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHRhcmdldCBhcw0KPiA+Pj4gYSBCZHJ2Q2hp bGQuDQo+ID4NCj4gPiBTbyB3aGF0IHdvdWxkIGJlIHRoZSBwcm9ibGVtIHdpdGggdGhpcz8NCj4N Cj4gSSBoYXZlIG5vIHNwZWNpZmljIGFyZ3VtZW50cyBhZ2FpbnN0LCBJJ2xsIHRyeS4gS2V2aW4s IGRvIGhhdmUgY29tbWVudHMgb24gdGhpcz8NCg0KSSBoYXZlbid0IHJlYWxseSBmb2xsb3dlZCB0 aGlzIHRocmVhZCByZWNlbnRseSBiZWNhdXNlIHRoZXJlIHdhcyBvdGhlcg0Kc3R1ZmYgdGhhdCBu ZWVkZWQgbXkgYXR0ZW50aW9uIGFuZCB5b3Ugc2VlbWVkIHRvIGhhdmUgYSBnb29kIGRpc2N1c3Np b24NCndpdGggTWF4LiBJZiB5b3UgdGhpbmsgbXkgaW5wdXQgd291bGQgYmUgaW1wb3J0YW50IGF0 IHRoaXMgcG9pbnQsIEkgY2FuDQp0cnkgdG8gcmVhZCB1cCBvbiBpdCB0b21vcnJvdy4NCg0KS2V2 aW4NCg0KSG1tLiBPaywgSSB0aGluayBJIG5vdyBoYXZlIGVub3VnaCBub3RlcyBmcm9tIE1heCB0 byB0aGluayBhbmQgdG8gZXhpcmVtZW50LCBzbywgeW91IGNhbiBzYWZlbHkgc2tpcCBpdCBmb3Ig bm93Lg0K