From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v9 04/27] xen/xsplice: Hypervisor implementation of XEN_XSPLICE_op Date: Wed, 27 Apr 2016 09:47:10 -0400 Message-ID: <20160427134710.GB26384@x230.dumpdata.com> References: <1461598514-5440-1-git-send-email-konrad.wilk@oracle.com> <1461598514-5440-5-git-send-email-konrad.wilk@oracle.com> <571F5D3602000078000E5BE0@prv-mh.provo.novell.com> <20160426174954.GA6301@localhost.localdomain> <57207D9602000078000E627B@prv-mh.provo.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1avPoD-0004aC-M7 for xen-devel@lists.xenproject.org; Wed, 27 Apr 2016 13:47:17 +0000 Received: by mail-qg0-f65.google.com with SMTP id d90so3148376qgd.1 for ; Wed, 27 Apr 2016 06:47:15 -0700 (PDT) Content-Disposition: inline In-Reply-To: <57207D9602000078000E627B@prv-mh.provo.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Jan Beulich Cc: Stefano Stabellini , Wei Liu , andrew.cooper3@citrix.com, Ian Jackson , mpohlack@amazon.de, ross.lagerwall@citrix.com, sasha.levin@oracle.com, xen-devel@lists.xenproject.org, Daniel De Graaf List-Id: xen-devel@lists.xenproject.org T24gV2VkLCBBcHIgMjcsIDIwMTYgYXQgMTI6NTE6MzRBTSAtMDYwMCwgSmFuIEJldWxpY2ggd3Jv dGU6Cj4gPj4+IE9uIDI2LjA0LjE2IGF0IDE5OjUwLCA8a29ucmFkLndpbGtAb3JhY2xlLmNvbT4g d3JvdGU6Cj4gPiBPbiBUdWUsIEFwciAyNiwgMjAxNiBhdCAwNDoyMToxMEFNIC0wNjAwLCBKYW4g QmV1bGljaCB3cm90ZToKPiA+PiA+Pj4gT24gMjUuMDQuMTYgYXQgMTc6MzQsIDxrb25yYWQud2ls a0BvcmFjbGUuY29tPiB3cm90ZToKPiA+PiA+IFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBh Y3R1YWxseSBkbyBhbnkgcGF0Y2hpbmcuCj4gPj4gPiAKPiA+PiA+IEl0IGp1c3QgYWRkcyB0aGUg ZnJhbWV3b3JrIGZvciBkb2luZyB0aGUgaHlwZXJjYWxscywKPiA+PiA+IGtlZXBpbmcgdHJhY2sg b2YgRUxGIHBheWxvYWRzLCBhbmQgdGhlIGJhc2ljIG9wZXJhdGlvbnM6Cj4gPj4gPiAgLSBxdWVy eSB3aGljaCBwYXlsb2FkcyBleGlzdCwKPiA+PiA+ICAtIHF1ZXJ5IGZvciBzcGVjaWZpYyBwYXls b2FkcywKPiA+PiA+ICAtIGNoZWNrKjEsIGFwcGx5KjEsIHJlcGxhY2UqMSwgYW5kIHVubG9hZCBw YXlsb2Fkcy4KPiA+PiA+IAo+ID4+ID4gKjE6IFdoaWNoIG9mIGNvdXJzZSBpbiB0aGlzIHBhdGNo IGFyZSBub3BzLgo+ID4+ID4gCj4gPj4gPiBUaGUgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZCBv biBBUk0gdW50aWwgYWxsIGFyY2gKPiA+PiA+IGNvbXBvbmVudHMgYXJlIGltcGxlbWVudGVkLgo+ ID4+ID4gCj4gPj4gPiBBbHNvIGJ5IGRlZmF1bHQgaXQgaXMgZGlzYWJsZWQgdW50aWwgdGhlIGlt cGxlbWVudGF0aW9uCj4gPj4gPiBpcyBpbiBwbGFjZS4KPiA+PiA+IAo+ID4+ID4gV2UgYWxzbyB1 c2UgcmVjdXJzaXZlIHNwaW5sb2NrcyB0byBzbyB0aGF0IHRoZSBmaW5kX3BheWxvYWQKPiA+PiA+ IGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQgdG8gaGF2ZSBhICdsb2NrJyBhbmQgJ25vbi1sb2NrJyB2 YXJpYW50Lgo+ID4+ID4gCj4gPj4gPiBTaWduZWQtb2ZmLWJ5OiBLb25yYWQgUnplc3p1dGVrIFdp bGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+Cj4gPj4gPiBTaWduZWQtb2ZmLWJ5OiBSb3NzIExh Z2Vyd2FsbCA8cm9zcy5sYWdlcndhbGxAY2l0cml4LmNvbT4KPiA+PiA+IFJldmlld2VkLWJ5OiBB bmRyZXcgQ29vcGVyIDxhbmRyZXcuY29vcGVyM0BjaXRyaXguY29tPgo+ID4+ID4gQWNrZWQtYnk6 IERhbmllbCBEZSBHcmFhZiA8ZGdkZWdyYUB0eWNoby5uc2EuZ292Pgo+ID4+IAo+ID4+IEknbSBo ZXNpdGFudCB0byBzYXkgdGhhdCwgYnV0IHdpdGggYWxsIG9mIHRoaXM6Cj4gPj4gCj4gPj4gPiB2 OToKPiA+PiA+ICAgICBzL2ZpbmRfbmFtZS9nZXRfbmFtZS8sIGRyb3AgbG9ja3Mgd2hlbiBhbGxv Y2F0aW5nIGRhdGEuCj4gPj4gPiAgICAgRHJvcCBjb25kaXRpb25hbCBleHByZXNzaW9uIG9uIGNv cHliYWNrCj4gPj4gPiAgICAgTW92ZSB0aGUgYWxsb2NhdGlvbiBvbiB1cGxvYWQgb3V0c2lkZSB0 aGUgc3BpbmxvY2suCj4gPj4gPiAgICAgQWRkIChURUNIIFBSRVZJRVcpIHRvIHRoZSBLY29uZmln IGhlbHAKPiA+PiA+ICAgICBSZXR1cm4gLUVJTlZBTCBpZiB0aGUgQ0hFQ0sgb3IgVU5MT0FEIGFj dGlvbiBpcyB0byBiZSBwZXJmb3JtZWQgYW5kIHRoZSBwYXlsb2FkCj4gPj4gPiAgICAgc3RhdGUg aXMgbm90IGluIGV4cGVjdGVkIHN0YXRlLgo+ID4+ID4gICAgIFByaW50ICdjJyBub3QgJ3UnIHdo ZW4gaW52b2tpbmcgdGhlIGtleWhhbmRsZXIuCj4gPj4gCj4gPj4gLi4uIEknbSBub3Qgc3VyZSB0 aGUgZWFybGllciBSLWIgY2FuIHN0aWxsIGJlIGNvbnNpZGVyZWQgdmFsaWQuIEFuZHJldz8KPiA+ IAo+ID4gSSBkb24ndCBrbm93IHdoYXQgdGhlIGNyaXRlcmlhIGlzIGZvciBkcm9wcGluZyBhbiBS ZXZpZXdlZC1ieS4KPiA+IEkgYW0gaGFwcHkgdG8gZHJvcCBpdCBpZiB5b3Ugd291bGQgbGlrZSAt IGJ1dCBpdCBtYXkgYmUgdGhhdCBBbmRyZXcKPiA+IGlzIE9LIHdpdGggdGhlIHdheSBoZSBoYWQg aGlzIHJldmlldz8KPiA+IAo+ID4gT3IgaXMgdGhpcyBtb3JlIG9mIHlvdXIgdmlldyBhcyBtYWlu dGFpbmVyIC0gdGhhdCBpcyB0aGUgcGF0Y2gKPiA+IGNoYW5nZWQgY29uc2lkZXJhYmx5IChhbmQg d2hhdCBpcyB0aGF0PyBwZXJjZW50YWdlIG9mIHRoZSBwYXRjaD8KPiA+IHNtYWxsIGFtb3VudCBv ZiB0aGUgcGF0Y2g/IFRyaXZpYWwgY2hhbmdlcz8gRHJvcHBpbmcgY29kZT8pPwo+IAo+IEluZGVl ZCwgdGhhdCdzIHRoZSBhc3BlY3RzIHRoYXQgbWF0dGVyOiBfQW55XyBub24tdHJpdmlhbCBjaGFu Z2UKPiB0byB0aGUgYXJlYSBhIHRhZyB3YXMgb2ZmZXJlZCBvZiBzaG91bGQgbGVhZCB0byB0aGUg dGFnIGdldHRpbmcKPiBkcm9wcGVkLiBUaGF0IGlzLCBpZiB5b3UgbWFrZSBzdWJzdGFudGlhbCBj aGFuZ2VzIHRvIGUuZy4gbm9uLVhTTQo+IHBhcnRzIGJ1dCBoYXZlIGFuIFhTTSBhY2ssIHRoYXQg Y2FuIG9mIGNvdXJzZSBzdGF5Lgo+IAo+IEFtb25nIHRoZSBhYm92ZSwgdGhlIG9idmlvdXNseSAo dG8gbWUpIG5vbi10cml2aWFsIGNoYW5nZXMgYXJlCj4gdGhlIG9yZGVyaW5nIGFkanVzdG1lbnQg b2YgYWxsb2NhdGlvbiB2cyBsb2NraW5nLgo+IAo+ID4+ID4gK3N0YXRpYyBpbnQgZ2V0X25hbWUo Y29uc3QgeGVuX3hzcGxpY2VfbmFtZV90ICpuYW1lLCBjaGFyICpuKQo+ID4+ID4gK3sKPiA+PiA+ ICsgICAgaWYgKCAhbmFtZS0+c2l6ZSB8fCBuYW1lLT5zaXplID4gWEVOX1hTUExJQ0VfTkFNRV9T SVpFICkKPiA+PiA+ICsgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4+ID4gKwo+ID4+ID4gKyAg ICBpZiAoIG5hbWUtPnBhZFswXSB8fCBuYW1lLT5wYWRbMV0gfHwgbmFtZS0+cGFkWzJdICkKPiA+ PiA+ICsgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4+ID4gKwo+ID4+ID4gKyAgICBpZiAoICFn dWVzdF9oYW5kbGVfb2theShuYW1lLT5uYW1lLCBuYW1lLT5zaXplKSApCj4gPj4gPiArICAgICAg ICByZXR1cm4gLUVJTlZBTDsKPiA+PiA+ICsKPiA+PiA+ICsgICAgaWYgKCBfX2NvcHlfZnJvbV9n dWVzdChuLCBuYW1lLT5uYW1lLCBuYW1lLT5zaXplKSApCj4gPj4gPiArICAgICAgICByZXR1cm4g LUVGQVVMVDsKPiA+PiAKPiA+PiBRdW90aW5nIHBhcnQgb2YgbXkgdjguMSByZXBseToKPiA+PiAi SXMgdGhlcmUgYSBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgeW91IG9wZW4gY29kZSBjb3B5X2Zyb21f Z3Vlc3QoKSBoZXJlPyIKPiA+IAo+ID4gWW91IG1lYW4gd2h5IEkgdXNlIGd1ZXN0X2hhbmRsZV9v a2F5IGFuZCBfX2NvcHlfZnJvbV9ndWVzdCBpbnN0ZWFkIG9mCj4gPiBzYXkgY29weV9mcm9tX2d1 ZXN0Pwo+ID4gCj4gPiBJIHRoaW5rIGl0IGlzIGFuIGFydGlmaWNhdCBvZiBlYXJsaWVyIGNoYW5n ZXMgLSBpbiB3aGljaCB0aGUgZmluZF9uYW1lCj4gPiB3b3VsZCBvbmx5IGNoZWNrICduYW1lLXNp emUnIGFuZCB0aGVuIGluIGFub3RoZXIgZnVuY3Rpb24gd2Ugd291bGQKPiA+IGp1c3QgZG8gJ19f Y29weV9mcm9tX2d1ZXN0Jy4gQnV0IHRoYXQgaXMgbm90IG5lZWRlZCBhbnltb3JlIC0gc28gbGV0 Cj4gPiBtZSBjaGFuZ2UgaXQgdG8gJ2NvcHlfZnJvbV9ndWVzdCcKPiAKPiBSaWdodCwgYnV0IHRo YXQgY2hhbmdlIGRpZG4ndCBoYXBwZW4uCj4gCj4gPiBJIHRob3VnaHQgYXQgc29tZSBwb2ludCB5 b3UgYXNrZWQgZm9yIHRoYXQgYXMgdGhlIGNoZWNrIHdhcyBkb25lIGZvcgo+ID4gaXQgb25jZSBh bmQgdGhlcmUgd2FzIG5vIHBvaW50Cj4gCj4gVGhpcyBtYXkgd2VsbCBoYXZlIGJlZW4gaW4gc29t ZSBtdWNoIGVhcmxpZXIgdmVyc2lvbiwgd2hlcmUgdGhlCj4gdHdvIGxpdmVkIGluIGRpZmZlcmVu dCBwbGFjZXMuIEJ1dCB3aGVuIHRoZXkncmUgdG9nZXRoZXIsIHRoZXkKPiBjbGVhcmx5IHNob3Vs ZCBiZSBmb2xkZWQgYmFjay4KPiAKPiA+PiA+ICtzdGF0aWMgaW50IHhzcGxpY2VfdXBsb2FkKHhl bl9zeXNjdGxfeHNwbGljZV91cGxvYWRfdCAqdXBsb2FkKQo+ID4+ID4gK3sKPiA+PiA+ICsgICAg c3RydWN0IHBheWxvYWQgKmRhdGEsICpmb3VuZDsKPiA+PiA+ICsgICAgY2hhciBuW1hFTl9YU1BM SUNFX05BTUVfU0laRV07Cj4gPj4gPiArICAgIGludCByYzsKPiA+PiA+ICsKPiA+PiA+ICsgICAg cmMgPSB2ZXJpZnlfcGF5bG9hZCh1cGxvYWQsIG4pOwo+ID4+ID4gKyAgICBpZiAoIHJjICkKPiA+ PiA+ICsgICAgICAgIHJldHVybiByYzsKPiA+PiA+ICsKPiA+PiA+ICsgICAgZGF0YSA9IHh6YWxs b2Moc3RydWN0IHBheWxvYWQpOwo+ID4+ID4gKwo+ID4+ID4gKyAgICBzcGluX2xvY2soJnBheWxv YWRfbG9jayk7Cj4gPj4gPiArCj4gPj4gPiArICAgIGZvdW5kID0gZmluZF9wYXlsb2FkKG4pOwo+ ID4+ID4gKyAgICBpZiAoIElTX0VSUihmb3VuZCkgKQo+ID4+ID4gKyAgICB7Cj4gPj4gPiArICAg ICAgICByYyA9IFBUUl9FUlIoZm91bmQpOwo+ID4+ID4gKyAgICAgICAgZ290byBvdXQ7Cj4gPj4g PiArICAgIH0KPiA+PiA+ICsgICAgZWxzZSBpZiAoIGZvdW5kICkKPiA+PiA+ICsgICAgewo+ID4+ ID4gKyAgICAgICAgcmMgPSAtRUVYSVNUOwo+ID4+ID4gKyAgICAgICAgZ290byBvdXQ7Cj4gPj4g PiArICAgIH0KPiA+PiA+ICsKPiA+PiA+ICsgICAgaWYgKCAhZGF0YSApCj4gPj4gPiArICAgIHsK PiA+PiA+ICsgICAgICAgIHJjID0gLUVOT01FTTsKPiA+PiA+ICsgICAgICAgIGdvdG8gb3V0Owo+ ID4+ID4gKyAgICB9Cj4gPj4gPiArCj4gPj4gPiArICAgIHJjID0gMDsKPiA+PiAKPiA+PiByYyBp cyBhbHJlYWR5IHplcm8gYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuCj4gPj4gCj4gPj4gSSBhbHNv IHdvbmRlciB3aGV0aGVyIHRoZSBjb2RlIHdvdWxkbid0IGJlIGVhc2llciB0byByZWFkIGlmIHlv dQo+ID4+IHVzZWQganVzdCBhIHNlcXVlbmNlIG9mIGlmKCkvZWxzZSBpZigpIGhlcmUsIHdpdGhv dXQgYW55IGdvdG8tcy4KPiA+IAo+ID4gQnV0IEkgZG8gbmVlZCB0byBmcmVlKGRhdGEpIGFuZCB1 bmxvY2sgdGhlIHNwaW5sb2NrIC0gc28gaGF2aW5nCj4gPiBhIGNvbW1vbiBjb2RlIHRvIHBhc3Mg dGhyb3VnaCBtYWtlcyBzZW5zZS4KPiA+IAo+ID4gVW5sZXNzIHlvdSBtZWFuIGhhdmUgYW4gY29u ZGl0aW9uIG9uIGlmICggIXJjICksIGFuZCBkbyB0aGUgbm9ybWFsIHBhdGg/Cj4gPiBMaWtlIHNv Ogo+ID4gCj4gPiAgICAgcmMgPSB2ZXJpZnlfcGF5bG9hZCh1cGxvYWQsIG4pOwo+ID4gICAgIGlm ICggcmMgKQo+ID4gICAgICAgICByZXR1cm4gcmM7Cj4gPiAKPiA+ICAgICBkYXRhID0geHphbGxv YyhzdHJ1Y3QgcGF5bG9hZCk7Cj4gPiAKPiA+ICAgICBzcGluX2xvY2soJnBheWxvYWRfbG9jayk7 Cj4gPiAKPiA+ICAgICBmb3VuZCA9IGZpbmRfcGF5bG9hZChuKTsKPiA+ICAgICBpZiAoIElTX0VS Uihmb3VuZCkgKQo+ID4gICAgICAgICByYyA9IFBUUl9FUlIoZm91bmQpOwo+ID4gICAgIGVsc2Ug aWYgKCBmb3VuZCApCj4gPiAgICAgICAgIHJjID0gLUVFWElTVDsKPiA+IAo+ID4gICAgIGlmICgg IXJjICYmICFkYXRhICkKPiAKPiBUaGlzIGNhbiBqdXN0IGJlICJlbHNlIGlmICggIWRhdGEgKSIg YWZhaWN0LgoKQnV0IHRoZW4gd2UgImxvc2UiCj4gCj4gPiAgICAgICAgIHJjID0gLUVOT01FTTsK PiA+IAo+ID4gICAgIGlmICggIXJjICkKPiAKPiBBbmQgdGhpcyBvbmUgdGhlbiBqdXN0ICJlbHNl Ii4KPiAKPiA+ICAgICB7Cj4gPiAgICAgICAgIG1lbWNweShkYXRhLT5uYW1lLCBuLCBzdHJsZW4o bikpOwo+ID4gICAgICAgICBkYXRhLT5zdGF0ZSA9IFhTUExJQ0VfU1RBVEVfQ0hFQ0tFRDsKPiA+ ICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmRhdGEtPmxpc3QpOwo+ID4gCj4gPiAgICAgICAgIGxp c3RfYWRkX3RhaWwoJmRhdGEtPmxpc3QsICZwYXlsb2FkX2xpc3QpOwo+ID4gICAgICAgICBwYXls b2FkX2NudCsrOwo+ID4gICAgICAgICBwYXlsb2FkX3ZlcnNpb24rKzsKPiA+ICAgICB9Cj4gPiAK PiA+ICAgICBzcGluX3VubG9jaygmcGF5bG9hZF9sb2NrKTsKPiA+IAo+ID4gICAgIGlmICggcmMg KQo+ID4gICAgICAgICB4ZnJlZShkYXRhKTsKPiA+IAo+ID4gICAgIHJldHVybiByYzsKPiA+IAo+ ID4gCj4gPiBUaGF0IGxvb2tzIGZpbmUgaGVyZSwgYnV0IGluIHRoZSBzdWJzZXF1ZW50IHBhdGNo IEkgaGF2ZSB0byBhbHNvCj4gPiBjaGVjayBmb3IKPiA+IAo+ID4gaWYgKCBfX2NvcHlfZnJvbV9n dWVzdChyYXdfZGF0YSwgdXBsb2FkLT5wYXlsb2FkLCB1cGxvYWQtPnNpemUpICkgICAgICAgCj4g Cj4gVGhpcyBjb3VsZCBlYXNpbHkgYmUgYW5vdGhlciAiZWxzZSBpZigpIiBpbiB0aGUgY2hhaW4g b3V0bGluZWQgYWJvdmUuCj4gCj4gPiBhbmQKPiA+IHJjID0gbG9hZF9wYXlsb2FkX2RhdGEoZGF0 YSwgcmF3X2RhdGEsIHVwbG9hZC0+c2l6ZSk7Cj4gCj4gQnV0IEkgY2FuIHNlZSB0aGF0IHRoaXMg b25lIHdvdWxkIGJlIGEgbGl0dGxlIGxlc3MgbmVhdCB0byBpbnRlZ3JhdGUuCgpCdXQgaXQgaXMg bmVhdGVyIHRoYW4gd2hhdCBpdCBoYXMgbm93LgpUaGUgZmluYWwgcHJvZHVjdCBlbmRzIHVwIGJl aW5nOgoKICAgIHJjID0gdmVyaWZ5X3BheWxvYWQodXBsb2FkLCBuKTsKICAgIGlmICggcmMgKQog ICAgICAgIHJldHVybiByYzsKCiAgICBkYXRhID0geHphbGxvYyhzdHJ1Y3QgcGF5bG9hZCk7CiAg ICByYXdfZGF0YSA9IHZtYWxsb2ModXBsb2FkLT5zaXplKTsKCiAgICBzcGluX2xvY2soJnBheWxv YWRfbG9jayk7CgogICAgZm91bmQgPSBmaW5kX3BheWxvYWQobik7CiAgICBpZiAoIElTX0VSUihm b3VuZCkgKQogICAgICAgIHJjID0gUFRSX0VSUihmb3VuZCk7CiAgICBlbHNlIGlmICggZm91bmQg KQogICAgICAgIHJjID0gLUVFWElTVDsKICAgIGVsc2UgaWYgKCAhZGF0YSB8fCAhcmF3X2RhdGEg KQogICAgICAgIHJjID0gLUVOT01FTTsKICAgIGVsc2UgaWYgKCBfX2NvcHlfZnJvbV9ndWVzdChy YXdfZGF0YSwgdXBsb2FkLT5wYXlsb2FkLCB1cGxvYWQtPnNpemUpICkKICAgICAgICByYyA9IC1F RkFVTFQ7CiAgICBlbHNlCiAgICB7CiAgICAgICAgbWVtY3B5KGRhdGEtPm5hbWUsIG4sIHN0cmxl bihuKSk7CgogICAgICAgIHJjID0gbG9hZF9wYXlsb2FkX2RhdGEoZGF0YSwgcmF3X2RhdGEsIHVw bG9hZC0+c2l6ZSk7CiAgICAgICAgaWYgKCByYyApCiAgICAgICAgICAgIGdvdG8gb3V0OwoKICAg ICAgICBkYXRhLT5zdGF0ZSA9IFhTUExJQ0VfU1RBVEVfQ0hFQ0tFRDsKICAgICAgICBJTklUX0xJ U1RfSEVBRCgmZGF0YS0+bGlzdCk7CgogICAgICAgIGxpc3RfYWRkX3RhaWwoJmRhdGEtPmxpc3Qs ICZwYXlsb2FkX2xpc3QpOwogICAgICAgIHBheWxvYWRfY250Kys7CiAgICAgICAgcGF5bG9hZF92 ZXJzaW9uKys7CiAgICB9Cgogb3V0OgogICAgc3Bpbl91bmxvY2soJnBheWxvYWRfbG9jayk7Cgog ICAgdmZyZWUocmF3X2RhdGEpOwoKICAgIGlmICggcmMgKQogICAgICAgIHhmcmVlKGRhdGEpOwoK ICAgIHJldHVybiByYzsKCj4gCj4gPiBhbmQgZ290byBzdGF0ZW1lbnQgaGVscCBhIGxvdCB0aGVy ZS4KPiA+IAo+ID4gSSB3b3VsZCByYXRoZXIgaGF2ZSBpdCB0aGUgd2F5IGl0IGlzIG5vdyBpZiB5 b3UgYXJlIE9LIHdpdGggdGhhdD8KPiAKPiBBcyBJIGhhdmUgdHJpZWQgdG8gZXhwcmVzcyBieSBz YXlpbmcgIkkgYWxzbyB3b25kZXIiLCBhbmQgYXMgdGhpcwo+IGNsZWFybHkgaXMgYSBtYXR0ZXIg b2YgdGFzdGUgdG8gc29tZSBkZWdyZWUsIEknbSBub3QgaW5zaXN0aW5nIG9uCj4gdGhhdCBhbHRl cm5hdGl2ZSBjb2RlIGZsb3cuIFdoYXQgSSdkIHJlYWxseSBsaWtlIHRvIGFzayBmb3IgaXMKPiBj b25zaXN0ZW5jeSB0aG91Z2g6IFdoaWxlIGluIHRoZSBwYXRjaCBoZXJlIHlvdSB1c2UKPiAKPiAg ICAgaWYgKCAuLi4gKQo+ICAgICB7Cj4gICAgICAgICByYyA9IC4uLjsKPiAgICAgICAgIGdvdG8g Li4uOwo+ICAgICB9Cj4gCj4gcGF0Y2ggMTEgaW50cm9kdWNlcyBhbiBpbnN0YW5jZSBvZiB0aGUg YWx0ZXJuYXRpdmUKPiAKPiAgICAgcmMgPSAtRS4uLjsKPiAgICAgaWYgKCAuLi4gKQo+ICAgICAg ICAgZ290byAuLi47Cj4gCj4gU2ltaWxhcmx5IChzZWUgYWJvdmUpIHlvdSBzaG91bGQgYWltIGF0 IGNvbnNpc3RlbmN5IGJldHdlZW4KPiBpZi9lbHNlLWlmIGNoYWlucyBvciBjaGFpbnMgb2YganVz dCBpZi1zLCB3aGVuIGVhY2ggb2YgdGhlbSBlbmRzIGluIGFuCj4gdW5jb25kaXRpb25hbCBnb3Rv IChvciByZXR1cm4sIGNvbnRpbnVlLCBvciBicmVhaywgdGFraW5nIGEgbW9yZQo+IGdlbmVyYWwg cGVyc3BlY3RpdmUpLiBOb3QgbWl4aW5nIHN0eWxlcyBoZWxwcyBhdm9pZCAocG9zc2libHkgc2ls ZW50KQo+IHF1ZXN0aW9ucyBieSByZWFkZXJzIGFsb25nIHRoZSBsaW5lcyBvZiAiSXMgdGhlcmUg YSByZWFzb24gaXQncyBkb25lCj4gb25lIHdheSBoZXJlIGFuZCBhbm90aGVyIHdheSBhIGZldyBs aW5lcyBkb3duPyIKCkRpZmZlcmVudCBhdXRob3JzLCBkaWZmZXJlbnQgbWF0dGVyIG9mIHRhc3Rl IC0gYXMgeW91IHNhdyB3aXRoCnRoZSBzaXplb2YgYW5kIHRoaXMgb25lIC0gUm9zcyBhbmQgbWUg d3JpdGUgY29kZSBkaWZmZXJlbnRseS4KCkhvdyBkbyB5b3UgYW5kIEFuZHJldyBkZWFsIHdpdGgg dGhpcyBvbmU/Cj4gCj4gSmFuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3Jn Cmh0dHA6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=