From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B4C94C6FD20 for ; Fri, 24 Mar 2023 17:42:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Nn2vA9kWTn9ADrlQ8KXjXPhoyAtKulmJ8tSQzSsoMy4=; b=LrIYLIZ7OFyK7j XWmYSB7+Hrmsf7xJoXGnpzTd9v5acCS3IAwyi9W0HPdbUw7Cx3H62MxiAzCh2EncfWDD2Zg1c82Vc pE7rNmcEj8zVMGmyLgjXlcYYVO6pPo8by0vbJlwV+BdurL99w5Uyrraai3DtdOr6KRftRKlESMGQb 0Wx3L9EOGR4fL3QroTGuul4c7ejPUrM3AcOiCgVXpD2uVtUSzvkR4yZgy0i8G45BImT2dHOkvTLA4 hy/Xyhi8yg/hKpb7qm+8v/yvzN5OVzUUtx2PUQNPNBbx+Mo37vXjkZ3h1779XiC8LSKoytcOAm/+g FEjg/mTe4OBCh00O5HBw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1pflPr-0057dB-15; Fri, 24 Mar 2023 17:41:27 +0000 Received: from relay10.mail.gandi.net ([217.70.178.230]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1pflPm-0057bM-15; Fri, 24 Mar 2023 17:41:25 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 16682240005; Fri, 24 Mar 2023 17:41:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1679679677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v++Eiwx/bgURPVJ7FGQRJ6T89nvRrUE1yKPw73SO1U8=; b=BZTWml8YDALzuUizC7Gf53nxV5Rog5h21GrymFnjWDRo2H1CjVQn+968SVjtbrq2pTFwjV dym5wiEe5mqjsJq4W++I08oQK9BkQkaNbPs8yoZ7joxeTjsnzKN5mcBoVg4DQcy+ZIXbSH 7bmOPrOeLr755uzSD+k89ZEttXvRKHaAJr9Qhi2nd5kCAEhl4S8CUo/fVfuXGOfPZT6pMN Hs+sAvIrMJNT2zEcwhmI/ZVCYZI4y+Yolc1FucJ3KLBeiS8KfV7yfwBUx0/vooY0oAxi+h POSvBFqRPwimxcfANI1+jZPEo3zGJDUNOj14RfktLZ9VSiX/GtJklpvduhYP7w== Date: Fri, 24 Mar 2023 18:41:12 +0100 From: Miquel Raynal To: Tudor Ambarus Cc: Richard Weinberger , Vignesh Raghavendra , Pratyush Yadav , Michael Walle , linux-mtd@lists.infradead.org, Julien Su , Jaime Liao , Jaime Liao , Alvin Zhou , Thomas Petazzoni , Michal Simek , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v4 7/8] mtd: spi-nor: Enhance locking to support reads while writes Message-ID: <20230324184112.2090f4a7@xps-13> In-Reply-To: References: <20230201113603.293758-1-miquel.raynal@bootlin.com> <20230201113603.293758-8-miquel.raynal@bootlin.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230324_104122_665078_90448EA9 X-CRM114-Status: GOOD ( 63.09 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgVHVkb3IsCgp0dWRvci5hbWJhcnVzQGxpbmFyby5vcmcgd3JvdGUgb24gRnJpLCAxNyBNYXIg MjAyMyAwNTo1OTowOCArMDAwMDoKCj4gSGksIE1pcXVlbCwKPiAKPiBJIGZpbmQgdGhlIG92ZXJh bGwgaWRlYSBnb29kLgoKVGhhbmtzIGEgbG90IGZvciB0aGUgZGV0YWlsZWQgcmV2aWV3IQoKPiBP biAyLzEvMjMgMTE6MzYsIE1pcXVlbCBSYXluYWwgd3JvdGU6Cj4gPiBPbiBkZXZpY2VzIGZlYXR1 cmluZyBzZXZlcmFsIGJhbmtzLCB0aGUgUmVhZCBXaGlsZSBXcml0ZSAoUldXKSBmZWF0dXJlCj4g PiBpcyBoZXJlIHRvIGltcHJvdmUgdGhlIG92ZXJhbGwgcGVyZm9ybWFuY2Ugd2hlbiBwZXJmb3Jt aW5nIHBhcmFsbGVsCj4gPiByZWFkcyBhbmQgd3JpdGVzIGF0IGRpZmZlcmVudCBsb2NhdGlvbnMg KGRpZmZlcmVudCBiYW5rcykuIFRoZSBmb2xsb3dpbmcKPiA+IGNvbnN0cmFpbnRzIGhhdmUgdG8g YmUgdGFrZW4gaW50byBhY2NvdW50Ogo+ID4gMSM6IEEgc2luZ2xlIG9wZXJhdGlvbiBjYW4gYmUg cGVyZm9ybWVkIGluIGEgZ2l2ZW4gYmFuay4KPiA+IDIjOiBPbmx5IGEgc2luZ2xlIHByb2dyYW0g b3IgZXJhc2Ugb3BlcmF0aW9uIGNhbiBoYXBwZW4gb24gdGhlIGVudGlyZQo+ID4gICAgIGNoaXAg KGNvbW1vbiBoYXJkd2FyZSBsaW1pdGF0aW9uIHRvIGxpbWl0IGNvc3RzKQo+ID4gMyM6IFJlYWRz IG11c3QgcmVtYWluIHNlcmlhbGl6ZWQgZXZlbiB0aG91Z2ggcmVhZHMgb24gZGlmZmVyZW50IGJh bmtzCj4gPiAgICAgbWlnaHQgb2NjdXIgYXQgdGhlIHNhbWUgdGltZS4gIAo+IAo+IDMjIGlzIHVu Y2xlYXIgaWYgb25lIGxpbWl0cyBqdXN0IGF0IHJlYWRpbmcgdGhlIGNvbW1pdCBtZXNzYWdlLiBB cmUgdGhlCj4gcmVhZHMgc2VyaWFsaXplZCBwZXIgYmFuayBvciBwZXIgZmxhc2g/CgpQZXIgZmxh c2guCgo+IEFmdGVyIHJlYWRpbmcgdGhlIGNvZGUsIGl0IGxvb2tzIGxpa2UgYWxsIHRoZSByZWFk cyBhcmUgc2VyaWFsaXplZCBwZXIKPiBmbGFzaCByZWdhcmRsZXNzIGlmIGl0IHJlYWRzIHJlZ2lz dGVycyBvciBtZW1vcnkuIEkgYXNzdW1lIHlvdSBtZWFudAo+IHRoYXQgY3Jvc3NpbmcgYSBiYW5r IGJvdW5kYXJ5IHdpdGggYSBzaW5nbGUgcmVhZCBpcyBmaW5lLgoKWWVzLCBJIHdpbGwgdXBkYXRl IHRoYXQgaXRlbSB0byBjbGFyaWZ5LgoKPiBCdXQgY2FuIHlvdQo+IHJlYWxseSByZWFkIGZyb20g YmFuayAxIGFuZCBiYW5rIDMgYXQgdGhlIHNhbWUgdGltZT8gVGhlIGNvZGUgZG9lc24ndAo+IHRh a2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24uCgpZZXMgdGhpcyBpcyB0YWtlbiBpbnRvIGFjY291 bnQgYW5kIHN1cHBvcnRlZCwgYSByZWFkIGNhbiBjcm9zcyBhIGJhbmsKYm91bmRhcnkuCgo+IAo+ ID4gNCM6IFRoZSBJL08gYnVzIGlzIHVuaXF1ZSBhbmQgdGh1cyBpcyB0aGUgbW9zdCBjb25zdHJh aW5lZCByZXNvdXJjZSwgYWxsCj4gPiAgICAgc3BpLW5vciBvcGVyYXRpb25zIHJlcXVpcmluZyBh Y2Nlc3MgdG8gdGhlIHNwaSBidXMgKHRocm91Z2ggdGhlIHNwaQo+ID4gICAgIGNvbnRyb2xsZXIp IG11c3QgYmUgc2VyaWFsaXplZCB1bnRpbCB0aGUgYnVzIGV4Y2hhbmdlcyBhcmUgb3Zlci4gU28K PiA+ICAgICB3ZSBtdXN0IGVuc3VyZSBhIHNpbmdsZSBvcGVyYXRpb24gY2FuIGJlICJzZW50IiBh dCBhIHRpbWUuCj4gPiA1IzogQW55IG90aGVyIG9wZXJhdGlvbiB0aGF0IHdvdWxkIG5vdCBiZSBl aXRoZXIgYSByZWFkIG9yIGEgd3JpdGUgb3IgYW4KPiA+ICAgICBlcmFzZSBpcyBjb25zaWRlcmVk IHJlcXVpcmluZyBhY2Nlc3MgdG8gdGhlIGZ1bGwgY2hpcCBhbmQgY2Fubm90IGJlCj4gPiAgICAg cGFyYWxsZWxpemVkLCB3ZSB0aGVuIG5lZWQgdG8gZW5zdXJlIHRoZSBmdWxsIGNoaXAgaXMgaW4g dGhlIGlkbGUKPiA+ICAgICBzdGF0ZSB3aGVuIHRoaXMgb2NjdXJzLgo+ID4gCj4gPiBBbGwgdGhl c2UgY29uc3RyYWludHMgY2FuIGVhc2lseSBiZSBtYW5hZ2VkIHdpdGggYSBwcm9wZXIgbG9ja2lu ZyBtb2RlbDoKPiA+IDEjOiBJcyBlbmZvcmNlZCBieSBhIGJpdGZpZWxkIG9mIHRoZSBpbi11c2Ug YmFua3MsIHNvIHRoYXQgb25seSBhIHNpbmdsZQo+ID4gICAgIG9wZXJhdGlvbiBjYW4gaGFwcGVu IGluIGEgc3BlY2lmaWMgYmFuayBhdCBhbnkgdGltZS4KPiA+IDIjOiBJcyBoYW5kbGVkIGJ5IHRo ZSBvbmdvaW5nX3BlIGJvb2xlYW4gd2hpY2ggaXMgc2V0IGJlZm9yZSBhbnkgd3JpdGUKPiA+ICAg ICBvciBlcmFzZSwgYW5kIGlzIHJlbGVhc2VkIG9ubHkgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZQo+ ID4gICAgIG9wZXJhdGlvbi4gVGhpcyB3YXksIG5vIG90aGVyIGRlc3RydWN0aXZlIG9wZXJhdGlv biBvbiB0aGUgY2hpcCBjYW4KPiA+ICAgICBzdGFydCBkdXJpbmcgdGhpcyB0aW1lIGZyYW1lLgo+ ID4gMyM6IEFuIG9uZ29pbmdfcmQgYm9vbGVhbiBhbGxvd3MgdG8gdHJhY2sgdGhlIG9uZ29pbmcg cmVhZHMsIHNvIHRoYXQKPiA+ICAgICBvbmx5IG9uZSBjYW4gYmUgcGVyZm9ybWVkIGF0IGEgdGlt ZS4KPiA+IDQjOiBBbiBvbmdvaW5nX2lvIGJvb2xlYW4gaXMgaW50cm9kdWNlZCBpbiBvcmRlciB0 byBjYXB0dXJlIGFuZCBzZXJpYWxpemUKPiA+ICAgICBidXMgYWNjZXNzZWQuIFRoaXMgaXMgdGhl IG9uZSBiZWluZyByZWxlYXNlZCAic29vbmVyIiB0aGFuIGJlZm9yZSwKPiA+ICAgICBiZWNhdXNl IHdlIG9ubHkgbmVlZCB0byBwcm90ZWN0IHRoZSBjaGlwIGFnYWluc3Qgb3RoZXIgU1BJIGFjY2Vz c2VzCj4gPiAgICAgZHVyaW5nIHRoZSBJL08gcGhhc2UsIHdoaWNoIGZvciB0aGUgZGVzdHJ1Y3Rp dmUgb3BlcmF0aW9ucyBpcyB0aGUKPiA+ICAgICBiZWdpbm5pbmcgb2YgdGhlIG9wZXJhdGlvbiAo d2hlbiB3ZSBzZW5kIHRoZSBjb21tYW5kIGN5Y2xlcyBhbmQKPiA+ICAgICBwb3NzaWJseSB0aGUg ZGF0YSksIHdoaWxlIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgb3BlcmF0aW9uICh0aGUKPiA+ICAg ICBlcmFzZSBkZWxheSBvciB0aGUgcHJvZ3JhbW1hdGlvbiBkZWxheSkgaXMgd2hlbiB3ZSBjYW4g ZG8gc29tZXRoaW5nCj4gPiAgICAgZWxzZSBpbiBhbm90aGVyIGJhbmsuCj4gPiA1IzogSXMgaGFu ZGxlZCBieSB0aGUgdGhyZWUgYm9vbGVhbnMgcHJlc2VudGVkIGFib3ZlLCBpZiBhbnkgb2YgdGhl bSBpcwo+ID4gICAgIHNldCwgdGhlIGNoaXAgaXMgbm90IHlldCByZWFkeSBmb3IgdGhlIG9wZXJh dGlvbiBhbmQgbXVzdCB3YWl0Lgo+ID4gCj4gPiBBbGwgdGhlc2UgaW50ZXJuYWwgdmFyaWFibGVz IGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGV4aXN0aW5nIGxvY2ssIHNvIHRoYXQKPiA+IGNoYW5nZXMg aW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGF0b21pYy4gVGhlIHNlcmlhbGl6YXRpb24gaXMgaGFuZGxl ZCB3aXRoCj4gPiBhIHdhaXQgcXVldWUuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IE1pcXVlbCBS YXluYWwgPG1pcXVlbC5yYXluYWxAYm9vdGxpbi5jb20+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL210 ZC9zcGktbm9yL2NvcmUuYyAgfCAzMTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Ky0tCj4gPiAgaW5jbHVkZS9saW51eC9tdGQvc3BpLW5vci5oIHwgIDEzICsrCj4gPiAgMiBmaWxl cyBjaGFuZ2VkLCAzMTcgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCj4gPiAKPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvcmUuYyBiL2RyaXZlcnMvbXRkL3NwaS1u b3IvY29yZS5jCj4gPiBpbmRleCBhYzQ2MjdlMGQ2YzIuLmFkMjQzNmUzNjg4ZiAxMDA2NDQKPiA+ IC0tLSBhL2RyaXZlcnMvbXRkL3NwaS1ub3IvY29yZS5jCj4gPiArKysgYi9kcml2ZXJzL210ZC9z cGktbm9yL2NvcmUuYwo+ID4gQEAgLTU4OSw2ICs1ODksNjYgQEAgaW50IHNwaV9ub3Jfc3JfcmVh ZHkoc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ICAJcmV0dXJuICEobm9yLT5ib3VuY2VidWZbMF0g JiBTUl9XSVApOwo+ID4gIH0KPiA+ICAKPiA+ICsvKioKPiA+ICsgKiBzcGlfbm9yX3BhcmFsbGVs X2xvY2tpbmcoKSAtIENoZWNrcyBpZiB0aGUgUldXIGxvY2tpbmcgc2NoZW1lIHNoYWxsIGJlIHVz ZWQKPiA+ICsgKiBAbm9yOglwb2ludGVyIHRvICdzdHJ1Y3Qgc3BpX25vcicuCj4gPiArICoKPiA+ ICsgKiBSZXR1cm46IHRydWUgaWYgcGFyYWxsZWwgbG9ja2luZyBpcyBlbmFibGVkLCBmYWxzZSBv dGhlcndpc2UuCj4gPiArICovCj4gPiArc3RhdGljIGJvb2wgc3BpX25vcl9wYXJhbGxlbF9sb2Nr aW5nKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiArewo+ID4gKwlpZiAobm9yLT5jb250cm9sbGVy X29wcyAmJgo+ID4gKwkgICAgKG5vci0+Y29udHJvbGxlcl9vcHMtPnByZXBhcmUgfHwgbm9yLT5j b250cm9sbGVyX29wcy0+dW5wcmVwYXJlKSkKPiA+ICsJCXJldHVybiBmYWxzZTsgIAo+IAo+IFdl IHdvbid0IGFsbG93IGNvbnRyb2xsZXIgZHJpdmVycyBpbiBzcGktbm9yL2NvbnRyb2xsZXJzIHRv IGJlbmVmaXQgb2YKPiB0aGlzIGZlYXR1cmUsIGp1c3QgZG86Cj4gCWlmIChub3ItPmNvbnRyb2xs ZXJfb3BzKQo+IAkJcmV0dXJuIGZhbHNlOwoKVGhhdCBpcyBhbHNvIGNoZWNrZWQgaW4gdGhlIHNw aS1ub3IgaW5pdCBoZWxwZXIsIHdoZXJlIFNOT1JfRl9SV1cgaXMKbm93IHNldCwgc28gbm8gbmVl ZCB0byBjaGVjayBpdCBhZ2FpbiBhbmQgYWdhaW4uCgo+ID4gKwlyZXR1cm4gbm9yLT5pbmZvLT5u X2JhbmtzID4gMSAmJiBub3ItPmluZm8tPm5vX3NmZHBfZmxhZ3MgJiBTUElfTk9SX1JXVzsgIAo+ IAo+IHdlIGRvbid0IHBsYXkgd2l0aCBmbGFzaCBpbmZvIGZsYWdzIHRocm91Z2hvdXQgdGhlIGNv cmUuIEludHJvZHVjZSBhCj4gU05PUl9GIGVxdWl2YWxlbnQgZmxhZywgc2VlIGhvdyB0aGV5J3Jl IHVzZWQuIFlvdSdsbCBiZSBhYmxlIHRvIGdldCByaWQKPiBvZiB0aGUgbl9iYW5rcyBjaGVjayBh cyB3ZWxsLgoKVGhhbmtzIGZvciB0aGUgY2xlYXIgcG9pbnRlcnMsIGxvb2tzIG11Y2ggbmljZXIg bm93IQoKPiA+ICt9Cj4gPiArCj4gPiArLyogTG9ja2luZyBoZWxwZXJzIGZvciBzdGF0dXMgcmVh ZCBvcGVyYXRpb25zICovCj4gPiArc3RhdGljIGludCBzcGlfbm9yX3J3d19zdGFydF9yZHN0KHN0 cnVjdCBzcGlfbm9yICpub3IpCj4gPiArewo+ID4gKwlpbnQgcmV0ID0gLUVBR0FJTjsgIAo+IAo+ IHlvdSBjYW4gaGF2ZSBhIHBvaW50ZXIgdG8gcnd3IGhlcmUsIHlvdSdsbCBhdm9pZCBhbGwgdGhv c2UgZGVyZWZlcmVuY2VzCj4gZnJvbSBub3IuIEkgd291bGQgYWRkIHN1Y2ggYSBwb2ludGVyIHdo ZXJldmVyIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKPiBkZXJlZmVyZW5jZSwgc28gdGhlIGNvbW1l bnQgaXMgZm9yIHRoZSBlbnRpcmUgcGF0Y2guCgpoYWhhLCBJIGd1ZXNzIHRoaXMgaXMgYSBtYXR0 ZXIgb2YgdGFzdGUsIEknbSBub3QgYm90aGVyZWQgYnkgdGhvc2UsIGJ1dApvaywgSSdsbCBtYWtl IHRoZSBjaGFuZ2UgaGVyZSBhbmQgYWZ0ZXIgOi0pCgo+ID4gKwo+ID4gKwltdXRleF9sb2NrKCZu b3ItPmxvY2spOwo+ID4gKwo+ID4gKwlpZiAobm9yLT5yd3cub25nb2luZ19pbyB8fCBub3ItPnJ3 dy5vbmdvaW5nX3JkKQo+ID4gKwkJZ290byBidXN5Owo+ID4gKwo+ID4gKwlub3ItPnJ3dy5vbmdv aW5nX2lvID0gdHJ1ZTsKPiA+ICsJbm9yLT5yd3cub25nb2luZ19yZCA9IHRydWU7Cj4gPiArCXJl dCA9IDA7Cj4gPiArCj4gPiArYnVzeToKPiA+ICsJbXV0ZXhfdW5sb2NrKCZub3ItPmxvY2spOwo+ ID4gKwlyZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzcGlfbm9yX3J3 d19lbmRfcmRzdChzdHJ1Y3Qgc3BpX25vciAqbm9yKQo+ID4gK3sKPiA+ICsJbXV0ZXhfbG9jaygm bm9yLT5sb2NrKTsKPiA+ICsKPiA+ICsJbm9yLT5yd3cub25nb2luZ19pbyA9IGZhbHNlOwo+ID4g Kwlub3ItPnJ3dy5vbmdvaW5nX3JkID0gZmFsc2U7Cj4gPiArCj4gPiArCW11dGV4X3VubG9jaygm bm9yLT5sb2NrKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBzcGlfbm9yX2xvY2tfcmRz dChzdHJ1Y3Qgc3BpX25vciAqbm9yKQo+ID4gK3sKPiA+ICsJaWYgKHNwaV9ub3JfcGFyYWxsZWxf bG9ja2luZyhub3IpKQo+ID4gKwkJcmV0dXJuIHNwaV9ub3Jfcnd3X3N0YXJ0X3Jkc3Qobm9yKTsK PiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHNwaV9u b3JfdW5sb2NrX3Jkc3Qoc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ICt7Cj4gPiArCWlmIChzcGlf bm9yX3BhcmFsbGVsX2xvY2tpbmcobm9yKSkgewo+ID4gKwkJc3BpX25vcl9yd3dfZW5kX3Jkc3Qo bm9yKTsKPiA+ICsJCXdha2VfdXAoJm5vci0+cnd3LndhaXQpOwo+ID4gKwl9Cj4gPiArfQo+ID4g Kwo+ID4gIC8qKgo+ID4gICAqIHNwaV9ub3JfcmVhZHkoKSAtIFF1ZXJ5IHRoZSBmbGFzaCB0byBz ZWUgaWYgaXQgaXMgcmVhZHkgZm9yIG5ldyBjb21tYW5kcy4KPiA+ICAgKiBAbm9yOglwb2ludGVy IHRvICdzdHJ1Y3Qgc3BpX25vcicuCj4gPiBAQCAtNTk3LDExICs2NTcsMjEgQEAgaW50IHNwaV9u b3Jfc3JfcmVhZHkoc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ICAgKi8KPiA+ICBzdGF0aWMgaW50 IHNwaV9ub3JfcmVhZHkoc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ICB7Cj4gPiArCWludCByZXQ7 Cj4gPiArCj4gPiArCXJldCA9IHNwaV9ub3JfbG9ja19yZHN0KG5vcik7Cj4gPiArCWlmIChyZXQp Cj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICAJLyogRmxhc2hlcyBtaWdodCBvdmVycmlkZSB0 aGUgc3RhbmRhcmQgcm91dGluZS4gKi8KPiA+ICAJaWYgKG5vci0+cGFyYW1zLT5yZWFkeSkKPiA+ IC0JCXJldHVybiBub3ItPnBhcmFtcy0+cmVhZHkobm9yKTsKPiA+ICsJCXJldCA9IG5vci0+cGFy YW1zLT5yZWFkeShub3IpOwo+ID4gKwllbHNlCj4gPiArCQlyZXQgPSBzcGlfbm9yX3NyX3JlYWR5 KG5vcik7Cj4gPiAgCj4gPiAtCXJldHVybiBzcGlfbm9yX3NyX3JlYWR5KG5vcik7Cj4gPiArCXNw aV9ub3JfdW5sb2NrX3Jkc3Qobm9yKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICB9Cj4g PiAgCj4gPiAgLyoqCj4gPiBAQCAtMTA4Nyw3ICsxMTU3LDgxIEBAIHN0YXRpYyB2b2lkIHNwaV9u b3JfdW5wcmVwKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiAgCQlub3ItPmNvbnRyb2xsZXJfb3Bz LT51bnByZXBhcmUobm9yKTsKPiA+ICB9Cj4gPiAgCj4gPiArc3RhdGljIHZvaWQgc3BpX25vcl9v ZmZzZXRfdG9fYmFua3Moc3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IHN0YXJ0LCBzaXplX3Qg bGVuLCAgCj4gCj4gcGFzcyBkaXJlY3RseSB0aGUgYmFua19zaXplIGluc3RlYWQgb2YgdGhlIHBv aW50ZXIgdG8gbm9yLCB5b3UnbGwgYXZvaWQKPiB0aGUgZG91YmxlIGRlcmVmZXJlbmNlLgoKRG9u ZQoKPiAKPiA+ICsJCQkJICAgIHVuc2lnbmVkIGludCAqZmlyc3QsIHVuc2lnbmVkIGludCAqbGFz dCkgIAo+IAo+IHVuc2lnbmVkIGxvbmcgbG9uZyAqZmlyc3QsICpsYXN0ID8KCkFjdHVhbGx5IEkg d2FudCB0aGVzZSB0byByZW1haW4gdW5zaWduZWQgaW50LCB0aGUgVUxMIHN1ZmZpeCBqdXN0IG1l YW4KdGhlIGlucHV0IG1pZ2h0IGJlIGEgNjQtYml0IHZhbHVlLCBidXQgaXQgaXMgcXVpdGUgY29t bW9uIHRvIHRyZWF0IHRoZQpvdXRwdXQgYXMgMzItYml0LiBIZXJlIHdlIGRvIG5vdCBleHBlY3Qg dmFsdWVzIGdyZWF0ZXIgdGhhbiA0LgoKPiA+ICt7Cj4gPiArCSpmaXJzdCA9IERJVl9ST1VORF9E T1dOX1VMTChzdGFydCwgbm9yLT5wYXJhbXMtPmJhbmtfc2l6ZSk7Cj4gPiArCSpsYXN0ID0gRElW X1JPVU5EX0RPV05fVUxMKHN0YXJ0ICsgbGVuIC0gMSwgbm9yLT5wYXJhbXMtPmJhbmtfc2l6ZSk7 Cj4gPiArfQo+ID4gKwo+ID4gIC8qIEdlbmVyaWMgaGVscGVycyBmb3IgaW50ZXJuYWwgbG9ja2lu ZyBhbmQgc2VyaWFsaXphdGlvbiAqLwo+ID4gK3N0YXRpYyBib29sIHNwaV9ub3Jfcnd3X3N0YXJ0 X2lvKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiArewo+ID4gKwlib29sIHN0YXJ0ID0gZmFsc2U7 Cj4gPiArCj4gPiArCW11dGV4X2xvY2soJm5vci0+bG9jayk7Cj4gPiArCj4gPiArCWlmIChub3It PnJ3dy5vbmdvaW5nX2lvKQo+ID4gKwkJZ290byBidXN5Owo+ID4gKwo+ID4gKwlub3ItPnJ3dy5v bmdvaW5nX2lvID0gdHJ1ZTsKPiA+ICsJc3RhcnQgPSB0cnVlOwo+ID4gKwo+ID4gK2J1c3k6Cj4g PiArCW11dGV4X3VubG9jaygmbm9yLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHN0YXJ0Owo+ID4gK30K PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzcGlfbm9yX3J3d19lbmRfaW8oc3RydWN0IHNwaV9ub3Ig Km5vcikKPiA+ICt7Cj4gPiArCW11dGV4X2xvY2soJm5vci0+bG9jayk7Cj4gPiArCW5vci0+cnd3 Lm9uZ29pbmdfaW8gPSBmYWxzZTsKPiA+ICsJbXV0ZXhfdW5sb2NrKCZub3ItPmxvY2spOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHNwaV9ub3JfbG9ja19kZXZpY2Uoc3RydWN0IHNwaV9u b3IgKm5vcikKPiA+ICt7Cj4gPiArCWlmICghc3BpX25vcl9wYXJhbGxlbF9sb2NraW5nKG5vcikp Cj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJcmV0dXJuIHdhaXRfZXZlbnRfa2lsbGFibGUo bm9yLT5yd3cud2FpdCwgc3BpX25vcl9yd3dfc3RhcnRfaW8obm9yKSk7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyB2b2lkIHNwaV9ub3JfdW5sb2NrX2RldmljZShzdHJ1Y3Qgc3BpX25vciAqbm9y KQo+ID4gK3sKPiA+ICsJaWYgKHNwaV9ub3JfcGFyYWxsZWxfbG9ja2luZyhub3IpKQo+ID4gKwkJ c3BpX25vcl9yd3dfZW5kX2lvKG5vcik7ICAKPiAKPiBzaGFsbCB3ZSB3YWtlX3VwIGhlcmUgdG9v PwoKVHJ1ZQoKPiAKPiA+ICt9Cj4gPiArCj4gPiArLyogR2VuZXJpYyBoZWxwZXJzIGZvciBpbnRl cm5hbCBsb2NraW5nIGFuZCBzZXJpYWxpemF0aW9uICovCj4gPiArc3RhdGljIGJvb2wgc3BpX25v cl9yd3dfc3RhcnRfZXhjbHVzaXZlKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiArewo+ID4gKwli b29sIHN0YXJ0ID0gZmFsc2U7Cj4gPiArCj4gPiArCW11dGV4X2xvY2soJm5vci0+bG9jayk7Cj4g PiArCj4gPiArCWlmIChub3ItPnJ3dy5vbmdvaW5nX2lvIHx8IG5vci0+cnd3Lm9uZ29pbmdfcmQg fHwgbm9yLT5yd3cub25nb2luZ19wZSkKPiA+ICsJCWdvdG8gYnVzeTsKPiA+ICsKPiA+ICsJbm9y LT5yd3cub25nb2luZ19pbyA9IHRydWU7Cj4gPiArCW5vci0+cnd3Lm9uZ29pbmdfcmQgPSB0cnVl Owo+ID4gKwlub3ItPnJ3dy5vbmdvaW5nX3BlID0gdHJ1ZTsKPiA+ICsJc3RhcnQgPSB0cnVlOwo+ ID4gKwo+ID4gK2J1c3k6Cj4gPiArCW11dGV4X3VubG9jaygmbm9yLT5sb2NrKTsKPiA+ICsJcmV0 dXJuIHN0YXJ0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzcGlfbm9yX3J3d19lbmRf ZXhjbHVzaXZlKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiArewo+ID4gKwltdXRleF9sb2NrKCZu b3ItPmxvY2spOwo+ID4gKwlub3ItPnJ3dy5vbmdvaW5nX2lvID0gZmFsc2U7Cj4gPiArCW5vci0+ cnd3Lm9uZ29pbmdfcmQgPSBmYWxzZTsKPiA+ICsJbm9yLT5yd3cub25nb2luZ19wZSA9IGZhbHNl Owo+ID4gKwltdXRleF91bmxvY2soJm5vci0+bG9jayk7Cj4gPiArfQo+ID4gKwo+ID4gIGludCBz cGlfbm9yX3ByZXBfYW5kX2xvY2soc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ICB7Cj4gPiAgCWlu dCByZXQ7Cj4gPiBAQCAtMTA5NiwxOSArMTI0MCw3MSBAQCBpbnQgc3BpX25vcl9wcmVwX2FuZF9s b2NrKHN0cnVjdCBzcGlfbm9yICpub3IpCj4gPiAgCWlmIChyZXQpCj4gPiAgCQlyZXR1cm4gcmV0 Owo+ID4gIAo+ID4gLQltdXRleF9sb2NrKCZub3ItPmxvY2spOwo+ID4gKwlpZiAoIXNwaV9ub3Jf cGFyYWxsZWxfbG9ja2luZyhub3IpKQo+ID4gKwkJbXV0ZXhfbG9jaygmbm9yLT5sb2NrKTsKPiA+ ICsJZWxzZQo+ID4gKwkJcmV0ID0gd2FpdF9ldmVudF9raWxsYWJsZShub3ItPnJ3dy53YWl0LAo+ ID4gKwkJCQkJICBzcGlfbm9yX3J3d19zdGFydF9leGNsdXNpdmUobm9yKSk7Cj4gPiAgCj4gCj4g Tm8sIGRvbid0IHRvdWNoIHNwaV9ub3JfcHJlcF9hbmRfbG9jaygpIGFuZCBzcGlfbm9yX3VubG9j a19hbmRfdW5wcmVwKCksCj4geW91J3JlIGdpdmluZyB0aGUgaW1wcmVzaW9uIHRoYXQgdXNlcnMg b2YgaXQgKE9UUCwgU1dQKSBhcmUgc2FmZSB0byB1c2UKPiB0aGVtIHdoaWxlIHJlYWRzIG9yIFBF IGFyZSBpbiBwcm9ncmVzcywgd2hpY2ggaXMgbm90IHRoZSBjYXNlLCBiZWNhdXNlCj4geW91IGRv bid0IGd1YXJkIHRoZSBvcHMgdGhhdCB0aGV5J3JlIHVzaW5nLiBZb3UnbGwgYWxzbyBoYXZlIHRv IGRvY3VtZW50Cj4gdGhlIGZsYXNoIGluZm8gUldXIGZsYWcgYW5kcyBzYXkgaXQgaXMgbXV0dWFs IGV4Y2x1c2l2ZSB3aXRoIFNXUCBhbmQgT1RQCj4gZmVhdHVyZXMuCgpBY3R1YWxseSBJJ20gbm90 IGdldHRpbmcgd2hhdCB5b3UgbWVhbiBoZXJlLiBBbnkgYWNjZXNzIHRoYXQgaXMgbm90CmEgcHVy ZSByZWFkLCB3cml0ZSBvciBlcmFzZSAobGlrZSByZWdpc3RlciBhY2Nlc3Nlcywgb3RwIGFuZCBz d3AKYWNjZXNzZXMpIGFyZSBhdXRvbWF0aWNhbGx5IHRyZWF0ZWQgYXMgbmVlZGluZyBmdWxsIGFu ZCBleGNsdXNpdmUKYWNjZXNzIHRvIHRoZSBjaGlwLiBTbyBldmVyeXRoaW5nIHdvcmtzIGFzIGJl Zm9yZSB3aXRoIHRoZXNlLCBldmVuCmlmIFJXVyBpcyBlbmFibGVkLCBiZWNhdXNlIHRoYXQncyBu b3Qgd2hlcmUgd2Ugd2FudCBwZXJmb3JtYW5jZQppbXByb3ZlbWVudHMuIFNvIEkgbmVlZCB0byBp bXBsZW1lbnQgYSBkZWRpY2F0ZWQgInBhcmFsbGVsX2xvY2tpbmciCnBhdGggaW5zaWRlIHRoZXNl IGhlbHBlcnMgdG8gY2xlYXJseSBlbmZvcmNpbmcgYW4gZXhjbHVzaXZlIGFjY2VzcyB0bwp0aGUg Y2hpcC4KCj4gPiAtCXJldHVybiAwOwo+ID4gKwlyZXR1cm4gcmV0Owo+ID4gIH0KPiA+ICAKPiA+ ICB2b2lkIHNwaV9ub3JfdW5sb2NrX2FuZF91bnByZXAoc3RydWN0IHNwaV9ub3IgKm5vcikKPiA+ ICB7Cj4gPiAtCW11dGV4X3VubG9jaygmbm9yLT5sb2NrKTsKPiA+ICsJaWYgKCFzcGlfbm9yX3Bh cmFsbGVsX2xvY2tpbmcobm9yKSkgewo+ID4gKwkJbXV0ZXhfdW5sb2NrKCZub3ItPmxvY2spOwo+ ID4gKwl9IGVsc2Ugewo+ID4gKwkJc3BpX25vcl9yd3dfZW5kX2V4Y2x1c2l2ZShub3IpOwo+ID4g KwkJd2FrZV91cCgmbm9yLT5yd3cud2FpdCk7Cj4gPiArCX0KPiA+ICAKPiA+ICAJc3BpX25vcl91 bnByZXAobm9yKTsKPiA+ICB9Cj4gPiAgCj4gPiAgLyogSW50ZXJuYWwgbG9ja2luZyBoZWxwZXJz IGZvciBwcm9ncmFtIGFuZCBlcmFzZSBvcGVyYXRpb25zICovCj4gPiArc3RhdGljIGJvb2wgc3Bp X25vcl9yd3dfc3RhcnRfcGUoc3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IHN0YXJ0LCBzaXpl X3QgbGVuKQo+ID4gK3sKPiA+ICsJdW5zaWduZWQgaW50IGZpcnN0LCBsYXN0Owo+ID4gKwlib29s IHN0YXJ0ZWQgPSBmYWxzZTsKPiA+ICsJaW50IGJhbms7Cj4gPiArCj4gPiArCW11dGV4X2xvY2so Jm5vci0+bG9jayk7Cj4gPiArCj4gPiArCWlmIChub3ItPnJ3dy5vbmdvaW5nX2lvIHx8IG5vci0+ cnd3Lm9uZ29pbmdfcmQgfHwgbm9yLT5yd3cub25nb2luZ19wZSkKPiA+ICsJCWdvdG8gYnVzeTsK PiA+ICsKPiA+ICsJc3BpX25vcl9vZmZzZXRfdG9fYmFua3Mobm9yLCBzdGFydCwgbGVuLCAmZmly c3QsICZsYXN0KTsKPiA+ICsJZm9yIChiYW5rID0gZmlyc3Q7IGJhbmsgPD0gbGFzdDsgYmFuaysr KQo+ID4gKwkJaWYgKG5vci0+cnd3LnVzZWRfYmFua3MgJiBCSVQoYmFuaykpCj4gPiArCQkJZ290 byBidXN5Owo+ID4gKwo+ID4gKwlmb3IgKGJhbmsgPSBmaXJzdDsgYmFuayA8PSBsYXN0OyBiYW5r KyspICAKPiB5b3UgY2FuIGF2b2lkIHRoaXMgc2Vjb25kIGxvb2sgYnkgaW50cm9kdWNpbmcgYSBs b2NhbCB1c2VkX2JhbmtzCj4gdmFyaWFibGUgYW5kIGhhdmUgdGhlIG1hc2sgc2V0IGluIHRoZSBw cmV2aW91cyBsb29wLiBUaGVuIHlvdSdsbCBqdXN0IGRvCj4gYW4gaW5pdCBhdCB0aGlzIHBvaW50 LgoKRG9uZS4KCj4gCj4gPiArCQlub3ItPnJ3dy51c2VkX2JhbmtzIHw9IEJJVChiYW5rKTsKPiA+ ICsKPiA+ICsJbm9yLT5yd3cub25nb2luZ19wZSA9IHRydWU7Cj4gPiArCXN0YXJ0ZWQgPSB0cnVl Owo+ID4gKwo+ID4gK2J1c3k6Cj4gPiArCW11dGV4X3VubG9jaygmbm9yLT5sb2NrKTsKPiA+ICsJ cmV0dXJuIHN0YXJ0ZWQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHNwaV9ub3Jfcnd3 X2VuZF9wZShzdHJ1Y3Qgc3BpX25vciAqbm9yLCBsb2ZmX3Qgc3RhcnQsIHNpemVfdCBsZW4pCj4g PiArewo+ID4gKwl1bnNpZ25lZCBpbnQgZmlyc3QsIGxhc3Q7Cj4gPiArCWludCBiYW5rOwo+ID4g Kwo+ID4gKwltdXRleF9sb2NrKCZub3ItPmxvY2spOwo+ID4gKwo+ID4gKwlzcGlfbm9yX29mZnNl dF90b19iYW5rcyhub3IsIHN0YXJ0LCBsZW4sICZmaXJzdCwgJmxhc3QpOwo+ID4gKwlmb3IgKGJh bmsgPSBmaXJzdDsgYmFuayA8PSBsYXN0OyBiYW5rKyspCj4gPiArCQlub3ItPnJ3dy51c2VkX2Jh bmtzICY9IH5CSVQoYmFuayk7Cj4gPiArCj4gPiArCW5vci0+cnd3Lm9uZ29pbmdfcGUgPSBmYWxz ZTsKPiA+ICsKPiA+ICsJbXV0ZXhfdW5sb2NrKCZub3ItPmxvY2spOwo+ID4gK30KPiA+ICsKPiA+ ICBzdGF0aWMgaW50IHNwaV9ub3JfcHJlcF9hbmRfbG9ja19wZShzdHJ1Y3Qgc3BpX25vciAqbm9y LCBsb2ZmX3Qgc3RhcnQsIHNpemVfdCBsZW4pCj4gPiAgewo+ID4gIAlpbnQgcmV0Owo+ID4gQEAg LTExMTcsMTkgKzEzMTMsNzMgQEAgc3RhdGljIGludCBzcGlfbm9yX3ByZXBfYW5kX2xvY2tfcGUo c3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IHN0YXJ0LCBzaXplX3QgbGUKPiA+ICAJaWYgKHJl dCkKPiA+ICAJCXJldHVybiByZXQ7Cj4gPiAgCj4gPiAtCW11dGV4X2xvY2soJm5vci0+bG9jayk7 Cj4gPiArCWlmICghc3BpX25vcl9wYXJhbGxlbF9sb2NraW5nKG5vcikpCj4gPiArCQltdXRleF9s b2NrKCZub3ItPmxvY2spOwo+ID4gKwllbHNlCj4gPiArCQlyZXQgPSB3YWl0X2V2ZW50X2tpbGxh YmxlKG5vci0+cnd3LndhaXQsCj4gPiArCQkJCQkgIHNwaV9ub3Jfcnd3X3N0YXJ0X3BlKG5vciwg c3RhcnQsIGxlbikpOwo+ID4gIAo+ID4gLQlyZXR1cm4gMDsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ ICB9Cj4gPiAgCj4gPiAgc3RhdGljIHZvaWQgc3BpX25vcl91bmxvY2tfYW5kX3VucHJlcF9wZShz dHJ1Y3Qgc3BpX25vciAqbm9yLCBsb2ZmX3Qgc3RhcnQsIHNpemVfdCBsZW4pCj4gPiAgewo+ID4g LQltdXRleF91bmxvY2soJm5vci0+bG9jayk7Cj4gPiArCWlmICghc3BpX25vcl9wYXJhbGxlbF9s b2NraW5nKG5vcikpIHsKPiA+ICsJCW11dGV4X3VubG9jaygmbm9yLT5sb2NrKTsKPiA+ICsJfSBl bHNlIHsKPiA+ICsJCXNwaV9ub3Jfcnd3X2VuZF9wZShub3IsIHN0YXJ0LCBsZW4pOwo+ID4gKwkJ d2FrZV91cCgmbm9yLT5yd3cud2FpdCk7Cj4gPiArCX0KPiA+ICAKPiA+ICAJc3BpX25vcl91bnBy ZXAobm9yKTsKPiA+ICB9Cj4gPiAgCj4gPiAgLyogSW50ZXJuYWwgbG9ja2luZyBoZWxwZXJzIGZv ciByZWFkIG9wZXJhdGlvbnMgKi8KPiA+ICtzdGF0aWMgYm9vbCBzcGlfbm9yX3J3d19zdGFydF9y ZChzdHJ1Y3Qgc3BpX25vciAqbm9yLCBsb2ZmX3Qgc3RhcnQsIHNpemVfdCBsZW4pCj4gPiArewo+ ID4gKwl1bnNpZ25lZCBpbnQgZmlyc3QsIGxhc3Q7Cj4gPiArCWJvb2wgc3RhcnRlZCA9IGZhbHNl Owo+ID4gKwlpbnQgYmFuazsKPiA+ICsKPiA+ICsJbXV0ZXhfbG9jaygmbm9yLT5sb2NrKTsKPiA+ ICsKPiA+ICsJaWYgKG5vci0+cnd3Lm9uZ29pbmdfaW8gfHwgbm9yLT5yd3cub25nb2luZ19yZCkK PiA+ICsJCWdvdG8gYnVzeTsKPiA+ICsKPiA+ICsJc3BpX25vcl9vZmZzZXRfdG9fYmFua3Mobm9y LCBzdGFydCwgbGVuLCAmZmlyc3QsICZsYXN0KTsKPiA+ICsJZm9yIChiYW5rID0gZmlyc3Q7IGJh bmsgPD0gbGFzdDsgYmFuaysrKQo+ID4gKwkJaWYgKG5vci0+cnd3LnVzZWRfYmFua3MgJiBCSVQo YmFuaykpCj4gPiArCQkJZ290byBidXN5Owo+ID4gKwo+ID4gKwlmb3IgKGJhbmsgPSBmaXJzdDsg YmFuayA8PSBsYXN0OyBiYW5rKyspICAKPiAKPiBtYXNrIHRvIGF2b2lkIDJuZCBsb29wCgpEb25l IGFzIHdlbGwuCgpUaGFua3MgYSBsb3QhCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK