From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Andrew F. Davis" Subject: Re: [RFC][PATCH 4/6 v3] dma-buf: heaps: Add CMA heap to dmabuf heapss Date: Fri, 29 Mar 2019 11:48:15 -0500 Message-ID: References: <1553818562-2516-1-git-send-email-john.stultz@linaro.org> <1553818562-2516-5-git-send-email-john.stultz@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fllv0016.ext.ti.com (fllv0016.ext.ti.com [198.47.19.142]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A80F6E91D for ; Fri, 29 Mar 2019 16:48:37 +0000 (UTC) In-Reply-To: <1553818562-2516-5-git-send-email-john.stultz@linaro.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: John Stultz , lkml Cc: Yudongbin , Sudipto Paul , Xu YiPing , Vincent Donnefort , "Chenfeng (puck)" , dri-devel@lists.freedesktop.org, Chenbo Feng , Alistair Strachan , Liam Mark , Christoph Hellwig , "Xiaqing (A)" , Pratik Patel , butao List-Id: dri-devel@lists.freedesktop.org T24gMy8yOC8xOSA3OjE2IFBNLCBKb2huIFN0dWx0eiB3cm90ZToKPiBUaGlzIGFkZHMgYSBDTUEg aGVhcCwgd2hpY2ggYWxsb3dzIHVzZXJzcGFjZSB0byBhbGxvY2F0ZQo+IGEgZG1hLWJ1ZiBvZiBj b250aWd1b3VzIG1lbW9yeSBvdXQgb2YgYSBDTUEgcmVnaW9uLgo+IAo+IFRoaXMgY29kZSBpcyBh biBldm9sdXRpb24gb2YgdGhlIEFuZHJvaWQgSU9OIGltcGxlbWVudGF0aW9uLCBzbwo+IHRoYW5r cyB0byBpdHMgb3JpZ2luYWwgYXV0aG9yIGFuZCBtYWludGFpbnRlcnM6Cj4gICBCZW5qYW1pbiBH YWlnbmFyZCwgTGF1cmEgQWJib3R0LCBhbmQgb3RoZXJzIQo+IAo+IENjOiBMYXVyYSBBYmJvdHQg PGxhYmJvdHRAcmVkaGF0LmNvbT4KPiBDYzogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdh aWduYXJkQGxpbmFyby5vcmc+Cj4gQ2M6IFN1bWl0IFNlbXdhbCA8c3VtaXQuc2Vtd2FsQGxpbmFy by5vcmc+Cj4gQ2M6IExpYW0gTWFyayA8bG1hcmtAY29kZWF1cm9yYS5vcmc+Cj4gQ2M6IFByYXRp ayBQYXRlbCA8cHJhdGlrcEBjb2RlYXVyb3JhLm9yZz4KPiBDYzogQnJpYW4gU3RhcmtleSA8QnJp YW4uU3RhcmtleUBhcm0uY29tPgo+IENjOiBWaW5jZW50IERvbm5lZm9ydCA8VmluY2VudC5Eb25u ZWZvcnRAYXJtLmNvbT4KPiBDYzogU3VkaXB0byBQYXVsIDxTdWRpcHRvLlBhdWxAYXJtLmNvbT4K PiBDYzogQW5kcmV3IEYuIERhdmlzIDxhZmRAdGkuY29tPgo+IENjOiBYdSBZaVBpbmcgPHh1eWlw aW5nQGhpc2lsaWNvbi5jb20+Cj4gQ2M6ICJDaGVuZmVuZyAocHVjaykiIDxwdWNrLmNoZW5AaGlz aWxpY29uLmNvbT4KPiBDYzogYnV0YW8gPGJ1dGFvQGhpc2lsaWNvbi5jb20+Cj4gQ2M6ICJYaWFx aW5nIChBKSIgPHNhYmVybGlseS54aWFAaGlzaWxpY29uLmNvbT4KPiBDYzogWXVkb25nYmluIDx5 dWRvbmdiaW5AaGlzaWxpY29uLmNvbT4KPiBDYzogQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZy YWRlYWQub3JnPgo+IENjOiBDaGVuYm8gRmVuZyA8ZmVuZ2NAZ29vZ2xlLmNvbT4KPiBDYzogQWxp c3RhaXIgU3RyYWNoYW4gPGFzdHJhY2hhbkBnb29nbGUuY29tPgo+IENjOiBkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCj4gU2lnbmVkLW9mZi1ieTogSm9obiBTdHVsdHogPGpvaG4uc3R1 bHR6QGxpbmFyby5vcmc+Cj4gLS0tCj4gdjI6Cj4gKiBTd2l0Y2ggYWxsb2NhdGUgdG8gcmV0dXJu IGRtYWJ1ZiBmZAo+ICogU2ltcGxpZnkgaW5pdCBjb2RlCj4gKiBDaGVja3BhdGNoIGZpeHVwcwo+ IHYzOgo+ICogU3dpdGNoIHRvIGlubGluZSBmdW5jdGlvbiBmb3IgdG9fY21hX2hlYXAoKQo+ICog TWlub3IgY2xlYW51cHMgc3VnZ2VzdGVkIGJ5IEJyaWFuCj4gKiBGb2xkIGluIG5ldyByZWdpc3Ry YXRpb24gc3R5bGUgZnJvbSBBbmRyZXcKPiAqIEZvbGRlZCBpbiBjaGFuZ2VzIGZyb20gQW5kcmV3 IHRvIHVzZSBzaW1wbGlmaWVkIHBhZ2UgbGlzdAo+ICAgZnJvbSB0aGUgaGVhcCBoZWxwZXJzCj4g LS0tCj4gIGRyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9LY29uZmlnICAgIHwgICA4ICsrCj4gIGRyaXZl cnMvZG1hLWJ1Zi9oZWFwcy9NYWtlZmlsZSAgIHwgICAxICsKPiAgZHJpdmVycy9kbWEtYnVmL2hl YXBzL2NtYV9oZWFwLmMgfCAxNzAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTc5IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9jbWFfaGVhcC5jCj4gCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9LY29uZmlnIGIvZHJpdmVycy9kbWEtYnVmL2hlYXBzL0tj b25maWcKPiBpbmRleCAyMDUwNTI3Li5hNWVlZjA2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZG1h LWJ1Zi9oZWFwcy9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2hlYXBzL0tjb25maWcK PiBAQCAtNCwzICs0LDExIEBAIGNvbmZpZyBETUFCVUZfSEVBUFNfU1lTVEVNCj4gIAloZWxwCj4g IAkgIENob29zZSB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIHN5c3RlbSBkbWFidWYgaGVhcC4g VGhlIHN5c3RlbSBoZWFwCj4gIAkgIGlzIGJhY2tlZCBieSBwYWdlcyBmcm9tIHRoZSBidWRkeSBh bGxvY2F0b3IuIElmIGluIGRvdWJ0LCBzYXkgWS4KPiArCj4gK2NvbmZpZyBETUFCVUZfSEVBUFNf Q01BCj4gKwlib29sICJETUEtQlVGIENNQSBIZWFwIgo+ICsJZGVwZW5kcyBvbiBETUFCVUZfSEVB UFMgJiYgRE1BX0NNQQo+ICsJaGVscAo+ICsJICBDaG9vc2UgdGhpcyBvcHRpb24gdG8gZW5hYmxl IGRtYS1idWYgQ01BIGhlYXAuIFRoaXMgaGVhcCBpcyBiYWNrZWQKPiArCSAgYnkgdGhlIENvbnRp Z3VvdXMgTWVtb3J5IEFsbG9jYXRvciAoQ01BKS4gSWYgeW91ciBzeXN0ZW0gaGFzIHRoZXNlCj4g KwkgIHJlZ2lvbnMsIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9kbWEtYnVmL2hlYXBzL01ha2VmaWxlIGIvZHJpdmVycy9kbWEtYnVmL2hlYXBzL01ha2VmaWxl Cj4gaW5kZXggZDE4MDhlYy4uNmU1NGNkZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2RtYS1idWYv aGVhcHMvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL2RtYS1idWYvaGVhcHMvTWFrZWZpbGUKPiBA QCAtMSwzICsxLDQgQEAKPiAgIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ICBv YmoteQkJCQkJKz0gaGVhcC1oZWxwZXJzLm8KPiAgb2JqLSQoQ09ORklHX0RNQUJVRl9IRUFQU19T WVNURU0pCSs9IHN5c3RlbV9oZWFwLm8KPiArb2JqLSQoQ09ORklHX0RNQUJVRl9IRUFQU19DTUEp CQkrPSBjbWFfaGVhcC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9jbWFf aGVhcC5jIGIvZHJpdmVycy9kbWEtYnVmL2hlYXBzL2NtYV9oZWFwLmMKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmY0NDg1YzYwCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2RyaXZlcnMvZG1hLWJ1Zi9oZWFwcy9jbWFfaGVhcC5jCj4gQEAgLTAsMCArMSwxNzAgQEAKPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogRE1BQlVGIENN QSBoZWFwIGV4cG9ydGVyCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxOSBMaW5h cm8gTHRkLgo+ICsgKiBBdXRob3I6IDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPiBmb3Ig U1QtRXJpY3Nzb24uCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsj aW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hLWhlYXAuaD4K PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2NtYS5oPgo+ICsjaW5j bHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4K PiArCj4gKyNpbmNsdWRlICJoZWFwLWhlbHBlcnMuaCIKPiArCj4gK3N0cnVjdCBjbWFfaGVhcCB7 Cj4gKwlzdHJ1Y3QgZG1hX2hlYXAgKmhlYXA7Cj4gKwlzdHJ1Y3QgY21hICpjbWE7Cj4gK307Cj4g Kwo+ICtzdGF0aWMgdm9pZCBjbWFfaGVhcF9mcmVlKHN0cnVjdCBoZWFwX2hlbHBlcl9idWZmZXIg KmJ1ZmZlcikKPiArewo+ICsJc3RydWN0IGNtYV9oZWFwICpjbWFfaGVhcCA9IGRtYV9oZWFwX2dl dF9kYXRhKGJ1ZmZlci0+aGVhcF9idWZmZXIuaGVhcCk7Cj4gKwlzdHJ1Y3QgcGFnZSAqcGFnZXMg PSBidWZmZXItPnByaXZfdmlydDsKPiArCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7Cj4gKwo+ICsJ bnJfcGFnZXMgPSBidWZmZXItPmhlYXBfYnVmZmVyLnNpemUgPj4gUEFHRV9TSElGVDsKCkNvdWxk IGFsc28gdXNlIHRoZSBjb3VudCBpbiBoZWxwZXJfYnVmZmVyLT5wYWdlY291bnQuCgo+ICsKPiAr CS8qIGZyZWUgcGFnZSBsaXN0ICovCj4gKwlrZnJlZShidWZmZXItPnBhZ2VzKTsKPiArCS8qIHJl bGVhc2UgbWVtb3J5ICovCj4gKwljbWFfcmVsZWFzZShjbWFfaGVhcC0+Y21hLCBwYWdlcywgbnJf cGFnZXMpOwo+ICsJa2ZyZWUoYnVmZmVyKTsKPiArfQo+ICsKPiArLyogZG1hYnVmIGhlYXAgQ01B IG9wZXJhdGlvbnMgZnVuY3Rpb25zICovCj4gK3N0YXRpYyBpbnQgY21hX2hlYXBfYWxsb2NhdGUo c3RydWN0IGRtYV9oZWFwICpoZWFwLAo+ICsJCQkJdW5zaWduZWQgbG9uZyBsZW4sCj4gKwkJCQl1 bnNpZ25lZCBsb25nIGZsYWdzKQo+ICt7Cj4gKwlzdHJ1Y3QgY21hX2hlYXAgKmNtYV9oZWFwID0g ZG1hX2hlYXBfZ2V0X2RhdGEoaGVhcCk7Cj4gKwlzdHJ1Y3QgaGVhcF9oZWxwZXJfYnVmZmVyICpo ZWxwZXJfYnVmZmVyOwo+ICsJc3RydWN0IHBhZ2UgKnBhZ2VzOwo+ICsJc2l6ZV90IHNpemUgPSBQ QUdFX0FMSUdOKGxlbik7Cj4gKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gc2l6ZSA+PiBQQUdF X1NISUZUOwo+ICsJdW5zaWduZWQgbG9uZyBhbGlnbiA9IGdldF9vcmRlcihzaXplKTsKPiArCURF RklORV9ETUFfQlVGX0VYUE9SVF9JTkZPKGV4cF9pbmZvKTsKPiArCXN0cnVjdCBkbWFfYnVmICpk bWFidWY7Cj4gKwlpbnQgcmV0ID0gLUVOT01FTTsKPiArCXBnb2ZmX3QgcGc7Cj4gKwo+ICsJaWYg KGFsaWduID4gQ09ORklHX0NNQV9BTElHTk1FTlQpCj4gKwkJYWxpZ24gPSBDT05GSUdfQ01BX0FM SUdOTUVOVDsKPiArCj4gKwloZWxwZXJfYnVmZmVyID0ga3phbGxvYyhzaXplb2YoKmhlbHBlcl9i dWZmZXIpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghaGVscGVyX2J1ZmZlcikKPiArCQlyZXR1cm4g LUVOT01FTTsKPiArCj4gKwlJTklUX0hFQVBfSEVMUEVSX0JVRkZFUihoZWxwZXJfYnVmZmVyLCBj bWFfaGVhcF9mcmVlKTsKPiArCWhlbHBlcl9idWZmZXItPmhlYXBfYnVmZmVyLmZsYWdzID0gZmxh Z3M7Cj4gKwloZWxwZXJfYnVmZmVyLT5oZWFwX2J1ZmZlci5oZWFwID0gaGVhcDsKPiArCWhlbHBl cl9idWZmZXItPmhlYXBfYnVmZmVyLnNpemUgPSBsZW47Cj4gKwo+ICsJcGFnZXMgPSBjbWFfYWxs b2MoY21hX2hlYXAtPmNtYSwgbnJfcGFnZXMsIGFsaWduLCBmYWxzZSk7Cj4gKwlpZiAoIXBhZ2Vz KQo+ICsJCWdvdG8gZnJlZV9idWY7Cj4gKwo+ICsJaWYgKFBhZ2VIaWdoTWVtKHBhZ2VzKSkgewoK Q2FuIHRoZSBhbGxvY2F0ZWQgcGFnZXMgbGlzdCBjcm9zcyB0aGUgaGlnaCBtZW0gbGluZT8KCklm IHNvIHRoZW46Cgpmb3JlYWNoKG5yX3BhZ2VzKSB7CglpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCgkJ Y2xlYXJfaGlnaHBhZ2UocGFnZSk7CgllbHNlCgkJY2xlYXJfcGFnZShwYWdlX2FkZHJlc3MocGFn ZSkpOwp9CgpJZiBub3Qgc3RpbGwgc2hvdWxkIHVzZSBjbGVhcl9oaWdocGFnZSgpIGJlbG93LgoK QW5kcmV3Cgo+ICsJCXVuc2lnbmVkIGxvbmcgbnJfY2xlYXJfcGFnZXMgPSBucl9wYWdlczsKPiAr CQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzOwo+ICsKPiArCQl3aGlsZSAobnJfY2xlYXJfcGFn ZXMgPiAwKSB7Cj4gKwkJCXZvaWQgKnZhZGRyID0ga21hcF9hdG9taWMocGFnZSk7Cj4gKwo+ICsJ CQltZW1zZXQodmFkZHIsIDAsIFBBR0VfU0laRSk7Cj4gKwkJCWt1bm1hcF9hdG9taWModmFkZHIp Owo+ICsJCQlwYWdlKys7Cj4gKwkJCW5yX2NsZWFyX3BhZ2VzLS07Cj4gKwkJfQo+ICsJfSBlbHNl IHsKPiArCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2VzKSwgMCwgc2l6ZSk7Cj4gKwl9Cj4gKwo+ ICsJaGVscGVyX2J1ZmZlci0+cGFnZWNvdW50ID0gbnJfcGFnZXM7Cj4gKwloZWxwZXJfYnVmZmVy LT5wYWdlcyA9IGttYWxsb2NfYXJyYXkoaGVscGVyX2J1ZmZlci0+cGFnZWNvdW50LAo+ICsJCQkJ CSAgICAgc2l6ZW9mKCpoZWxwZXJfYnVmZmVyLT5wYWdlcyksCj4gKwkJCQkJICAgICBHRlBfS0VS TkVMKTsKPiArCWlmICghaGVscGVyX2J1ZmZlci0+cGFnZXMpIHsKPiArCQlyZXQgPSAtRU5PTUVN Owo+ICsJCWdvdG8gZnJlZV9jbWE7Cj4gKwl9Cj4gKwo+ICsJZm9yIChwZyA9IDA7IHBnIDwgaGVs cGVyX2J1ZmZlci0+cGFnZWNvdW50OyBwZysrKSB7Cj4gKwkJaGVscGVyX2J1ZmZlci0+cGFnZXNb cGddID0gJnBhZ2VzW3BnXTsKPiArCQlpZiAoIWhlbHBlcl9idWZmZXItPnBhZ2VzW3BnXSkKPiAr CQkJZ290byBmcmVlX3BhZ2VzOwo+ICsJfQo+ICsKPiArCS8qIGNyZWF0ZSB0aGUgZG1hYnVmICov Cj4gKwlleHBfaW5mby5vcHMgPSAmaGVhcF9oZWxwZXJfb3BzOwo+ICsJZXhwX2luZm8uc2l6ZSA9 IGxlbjsKPiArCWV4cF9pbmZvLmZsYWdzID0gT19SRFdSOwo+ICsJZXhwX2luZm8ucHJpdiA9ICZo ZWxwZXJfYnVmZmVyLT5oZWFwX2J1ZmZlcjsKPiArCWRtYWJ1ZiA9IGRtYV9idWZfZXhwb3J0KCZl eHBfaW5mbyk7Cj4gKwlpZiAoSVNfRVJSKGRtYWJ1ZikpIHsKPiArCQlyZXQgPSBQVFJfRVJSKGRt YWJ1Zik7Cj4gKwkJZ290byBmcmVlX3BhZ2VzOwo+ICsJfQo+ICsKPiArCWhlbHBlcl9idWZmZXIt PmhlYXBfYnVmZmVyLmRtYWJ1ZiA9IGRtYWJ1ZjsKPiArCWhlbHBlcl9idWZmZXItPnByaXZfdmly dCA9IHBhZ2VzOwo+ICsKPiArCXJldCA9IGRtYV9idWZfZmQoZG1hYnVmLCBPX0NMT0VYRUMpOwo+ ICsJaWYgKHJldCA8IDApIHsKPiArCQlkbWFfYnVmX3B1dChkbWFidWYpOwo+ICsJCS8qIGp1c3Qg cmV0dXJuLCBhcyBwdXQgd2lsbCBjYWxsIHJlbGVhc2UgYW5kIHRoYXQgd2lsbCBmcmVlICovCj4g KwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICsKPiArZnJlZV9wYWdl czoKPiArCWtmcmVlKGhlbHBlcl9idWZmZXItPnBhZ2VzKTsKPiArZnJlZV9jbWE6Cj4gKwljbWFf cmVsZWFzZShjbWFfaGVhcC0+Y21hLCBwYWdlcywgbnJfcGFnZXMpOwo+ICtmcmVlX2J1ZjoKPiAr CWtmcmVlKGhlbHBlcl9idWZmZXIpOwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGlj IHN0cnVjdCBkbWFfaGVhcF9vcHMgY21hX2hlYXBfb3BzID0gewo+ICsJLmFsbG9jYXRlID0gY21h X2hlYXBfYWxsb2NhdGUsCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IF9fYWRkX2NtYV9oZWFwKHN0 cnVjdCBjbWEgKmNtYSwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGNtYV9oZWFwICpjbWFf aGVhcDsKPiArCXN0cnVjdCBkbWFfaGVhcF9leHBvcnRfaW5mbyBleHBfaW5mbzsKPiArCj4gKwlj bWFfaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWFfaGVhcCksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFjbWFfaGVhcCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCWNtYV9oZWFwLT5jbWEgPSBjbWE7 Cj4gKwo+ICsJZXhwX2luZm8ubmFtZSA9IGNtYV9nZXRfbmFtZShjbWEpOwo+ICsJZXhwX2luZm8u b3BzID0gJmNtYV9oZWFwX29wczsKPiArCWV4cF9pbmZvLnByaXYgPSBjbWFfaGVhcDsKPiArCj4g KwljbWFfaGVhcC0+aGVhcCA9IGRtYV9oZWFwX2FkZCgmZXhwX2luZm8pOwo+ICsJaWYgKElTX0VS UihjbWFfaGVhcC0+aGVhcCkpIHsKPiArCQlpbnQgcmV0ID0gUFRSX0VSUihjbWFfaGVhcC0+aGVh cCk7Cj4gKwo+ICsJCWtmcmVlKGNtYV9oZWFwKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsK PiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFkZF9jbWFfaGVhcHModm9pZCkK PiArewo+ICsJY21hX2Zvcl9lYWNoX2FyZWEoX19hZGRfY21hX2hlYXAsIE5VTEwpOwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArZGV2aWNlX2luaXRjYWxsKGFkZF9jbWFfaGVhcHMpOwo+IApfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=