From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753906AbdLMVfN (ORCPT ); Wed, 13 Dec 2017 16:35:13 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36174 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753360AbdLMVfK (ORCPT ); Wed, 13 Dec 2017 16:35:10 -0500 X-Google-Smtp-Source: ACJfBosGStkt2WMW9FVKcnDbstnbs+eIVtZzSB1jZ5kVMjZQO9k5fynS+/xwkFs8L7S+4zdq5ZNltA== Date: Wed, 13 Dec 2017 22:35:06 +0100 From: Daniel Vetter To: Max Staudt Cc: b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org, michal@markovi.net, sndirsch@suse.com, oneukum@suse.com, tiwai@suse.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, bernhard.rosenkranzer@linaro.org, philm@manjaro.org Subject: Re: [RFC PATCH v2 03/13] bootsplash: Flush framebuffer after drawing Message-ID: <20171213213506.GD26573@phenom.ffwll.local> Mail-Followup-To: Max Staudt , b.zolnierkie@samsung.com, linux-fbdev@vger.kernel.org, michal@markovi.net, sndirsch@suse.com, oneukum@suse.com, tiwai@suse.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, bernhard.rosenkranzer@linaro.org, philm@manjaro.org References: <20171213194755.3409-1-mstaudt@suse.de> <20171213194755.3409-4-mstaudt@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20171213194755.3409-4-mstaudt@suse.de> X-Operating-System: Linux phenom 4.13.0-1-amd64 User-Agent: Mutt/1.9.1 (2017-09-22) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Dec 13, 2017 at 08:47:45PM +0100, Max Staudt wrote: > Framebuffers with deferred I/O need to be flushed to the screen > explicitly, since we use neither the mmap nor the file I/O abstractions > that handle this for userspace FB clients. > > Example: xenfb > > Some framebuffer drivers implement lazy access to the screen without > actually exposing a fbdefio interface - we also match some known ones, > currently: > - ast > - cirrus > - mgag200 > > Signed-off-by: Max Staudt > Reviewed-by: Oliver Neukum > --- > drivers/video/fbdev/core/bootsplash.c | 2 ++ > drivers/video/fbdev/core/bootsplash_internal.h | 1 + > drivers/video/fbdev/core/bootsplash_render.c | 33 ++++++++++++++++++++++++++ > 3 files changed, 36 insertions(+) > > diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c > index 843c5400fefc..815b007f81ca 100644 > --- a/drivers/video/fbdev/core/bootsplash.c > +++ b/drivers/video/fbdev/core/bootsplash.c > @@ -112,6 +112,8 @@ void bootsplash_render_full(struct fb_info *info) > > bootsplash_do_render_pictures(info, splash_state.file); > > + bootsplash_do_render_flush(info); > + > out: > mutex_unlock(&splash_state.data_lock); > } > diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h > index 71e2a27ac0b8..0acb383aa4e3 100644 > --- a/drivers/video/fbdev/core/bootsplash_internal.h > +++ b/drivers/video/fbdev/core/bootsplash_internal.h > @@ -89,6 +89,7 @@ void bootsplash_do_render_background(struct fb_info *info, > const struct splash_file_priv *fp); > void bootsplash_do_render_pictures(struct fb_info *info, > const struct splash_file_priv *fp); > +void bootsplash_do_render_flush(struct fb_info *info); > > > void bootsplash_free_file(struct splash_file_priv *fp); > diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c > index 2ae36949d0e3..8c09c306ff67 100644 > --- a/drivers/video/fbdev/core/bootsplash_render.c > +++ b/drivers/video/fbdev/core/bootsplash_render.c > @@ -186,3 +186,36 @@ void bootsplash_do_render_pictures(struct fb_info *info, > pp->pic_header->width, pp->pic_header->height); > } > } > + > + > +void bootsplash_do_render_flush(struct fb_info *info) > +{ > + /* > + * FB drivers using deferred_io (such as Xen) need to sync the > + * screen after modifying its contents. When the FB is mmap()ed > + * from userspace, this happens via a dirty pages callback, but > + * when modifying the FB from the kernel, there is no such thing. > + * > + * So let's issue a fake fb_copyarea (copying the FB onto itself) > + * to trick the FB driver into syncing the screen. Using drm directly would allow you to flush the contents without the fake (and tbh, really expensive on most drivers) copy op. If you insist on using fbdev for this stuff, then at least add a new hook to flush cpu rendering. > + * > + * A few DRM drivers' FB implementations are broken by not using > + * deferred_io when they really should - we match on the known > + * bad ones manually for now. > + */ > + if (info->fbdefio > + || !strcmp(info->fix.id, "astdrmfb") > + || !strcmp(info->fix.id, "cirrusdrmfb") > + || !strcmp(info->fix.id, "mgadrmfb")) { We have a shared defio implementation now in drm_fb_helper.c, there's not really many excuses to not fix up these drivers to just use those ... -Daniel > + struct fb_copyarea area; > + > + area.dx = 0; > + area.dy = 0; > + area.width = info->var.xres; > + area.height = info->var.yres; > + area.sx = 0; > + area.sy = 0; > + > + info->fbops->fb_copyarea(info, &area); > + } > +} > -- > 2.12.3 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Date: Wed, 13 Dec 2017 21:35:06 +0000 Subject: Re: [RFC PATCH v2 03/13] bootsplash: Flush framebuffer after drawing Message-Id: <20171213213506.GD26573@phenom.ffwll.local> List-Id: References: <20171213194755.3409-1-mstaudt@suse.de> <20171213194755.3409-4-mstaudt@suse.de> In-Reply-To: <20171213194755.3409-4-mstaudt@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Max Staudt Cc: linux-fbdev@vger.kernel.org, michal@markovi.net, b.zolnierkie@samsung.com, sndirsch@suse.com, oneukum@suse.com, tiwai@suse.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, philm@manjaro.org, bernhard.rosenkranzer@linaro.org On Wed, Dec 13, 2017 at 08:47:45PM +0100, Max Staudt wrote: > Framebuffers with deferred I/O need to be flushed to the screen > explicitly, since we use neither the mmap nor the file I/O abstractions > that handle this for userspace FB clients. > > Example: xenfb > > Some framebuffer drivers implement lazy access to the screen without > actually exposing a fbdefio interface - we also match some known ones, > currently: > - ast > - cirrus > - mgag200 > > Signed-off-by: Max Staudt > Reviewed-by: Oliver Neukum > --- > drivers/video/fbdev/core/bootsplash.c | 2 ++ > drivers/video/fbdev/core/bootsplash_internal.h | 1 + > drivers/video/fbdev/core/bootsplash_render.c | 33 ++++++++++++++++++++++++++ > 3 files changed, 36 insertions(+) > > diff --git a/drivers/video/fbdev/core/bootsplash.c b/drivers/video/fbdev/core/bootsplash.c > index 843c5400fefc..815b007f81ca 100644 > --- a/drivers/video/fbdev/core/bootsplash.c > +++ b/drivers/video/fbdev/core/bootsplash.c > @@ -112,6 +112,8 @@ void bootsplash_render_full(struct fb_info *info) > > bootsplash_do_render_pictures(info, splash_state.file); > > + bootsplash_do_render_flush(info); > + > out: > mutex_unlock(&splash_state.data_lock); > } > diff --git a/drivers/video/fbdev/core/bootsplash_internal.h b/drivers/video/fbdev/core/bootsplash_internal.h > index 71e2a27ac0b8..0acb383aa4e3 100644 > --- a/drivers/video/fbdev/core/bootsplash_internal.h > +++ b/drivers/video/fbdev/core/bootsplash_internal.h > @@ -89,6 +89,7 @@ void bootsplash_do_render_background(struct fb_info *info, > const struct splash_file_priv *fp); > void bootsplash_do_render_pictures(struct fb_info *info, > const struct splash_file_priv *fp); > +void bootsplash_do_render_flush(struct fb_info *info); > > > void bootsplash_free_file(struct splash_file_priv *fp); > diff --git a/drivers/video/fbdev/core/bootsplash_render.c b/drivers/video/fbdev/core/bootsplash_render.c > index 2ae36949d0e3..8c09c306ff67 100644 > --- a/drivers/video/fbdev/core/bootsplash_render.c > +++ b/drivers/video/fbdev/core/bootsplash_render.c > @@ -186,3 +186,36 @@ void bootsplash_do_render_pictures(struct fb_info *info, > pp->pic_header->width, pp->pic_header->height); > } > } > + > + > +void bootsplash_do_render_flush(struct fb_info *info) > +{ > + /* > + * FB drivers using deferred_io (such as Xen) need to sync the > + * screen after modifying its contents. When the FB is mmap()ed > + * from userspace, this happens via a dirty pages callback, but > + * when modifying the FB from the kernel, there is no such thing. > + * > + * So let's issue a fake fb_copyarea (copying the FB onto itself) > + * to trick the FB driver into syncing the screen. Using drm directly would allow you to flush the contents without the fake (and tbh, really expensive on most drivers) copy op. If you insist on using fbdev for this stuff, then at least add a new hook to flush cpu rendering. > + * > + * A few DRM drivers' FB implementations are broken by not using > + * deferred_io when they really should - we match on the known > + * bad ones manually for now. > + */ > + if (info->fbdefio > + || !strcmp(info->fix.id, "astdrmfb") > + || !strcmp(info->fix.id, "cirrusdrmfb") > + || !strcmp(info->fix.id, "mgadrmfb")) { We have a shared defio implementation now in drm_fb_helper.c, there's not really many excuses to not fix up these drivers to just use those ... -Daniel > + struct fb_copyarea area; > + > + area.dx = 0; > + area.dy = 0; > + area.width = info->var.xres; > + area.height = info->var.yres; > + area.sx = 0; > + area.sy = 0; > + > + info->fbops->fb_copyarea(info, &area); > + } > +} > -- > 2.12.3 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [RFC PATCH v2 03/13] bootsplash: Flush framebuffer after drawing Date: Wed, 13 Dec 2017 22:35:06 +0100 Message-ID: <20171213213506.GD26573@phenom.ffwll.local> References: <20171213194755.3409-1-mstaudt@suse.de> <20171213194755.3409-4-mstaudt@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3745B6E5E2 for ; Wed, 13 Dec 2017 21:35:11 +0000 (UTC) Received: by mail-wm0-x241.google.com with SMTP id b76so7861641wmg.1 for ; Wed, 13 Dec 2017 13:35:10 -0800 (PST) Content-Disposition: inline In-Reply-To: <20171213194755.3409-4-mstaudt@suse.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Max Staudt Cc: linux-fbdev@vger.kernel.org, michal@markovi.net, b.zolnierkie@samsung.com, sndirsch@suse.com, oneukum@suse.com, tiwai@suse.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, philm@manjaro.org, bernhard.rosenkranzer@linaro.org List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBEZWMgMTMsIDIwMTcgYXQgMDg6NDc6NDVQTSArMDEwMCwgTWF4IFN0YXVkdCB3cm90 ZToKPiBGcmFtZWJ1ZmZlcnMgd2l0aCBkZWZlcnJlZCBJL08gbmVlZCB0byBiZSBmbHVzaGVkIHRv IHRoZSBzY3JlZW4KPiBleHBsaWNpdGx5LCBzaW5jZSB3ZSB1c2UgbmVpdGhlciB0aGUgbW1hcCBu b3IgdGhlIGZpbGUgSS9PIGFic3RyYWN0aW9ucwo+IHRoYXQgaGFuZGxlIHRoaXMgZm9yIHVzZXJz cGFjZSBGQiBjbGllbnRzLgo+IAo+IEV4YW1wbGU6IHhlbmZiCj4gCj4gU29tZSBmcmFtZWJ1ZmZl ciBkcml2ZXJzIGltcGxlbWVudCBsYXp5IGFjY2VzcyB0byB0aGUgc2NyZWVuIHdpdGhvdXQKPiBh Y3R1YWxseSBleHBvc2luZyBhIGZiZGVmaW8gaW50ZXJmYWNlIC0gd2UgYWxzbyBtYXRjaCBzb21l IGtub3duIG9uZXMsCj4gY3VycmVudGx5Ogo+ICAtIGFzdAo+ICAtIGNpcnJ1cwo+ICAtIG1nYWcy MDAKPiAKPiBTaWduZWQtb2ZmLWJ5OiBNYXggU3RhdWR0IDxtc3RhdWR0QHN1c2UuZGU+Cj4gUmV2 aWV3ZWQtYnk6IE9saXZlciBOZXVrdW0gPG9uZXVrdW1Ac3VzZS5jb20+Cj4gLS0tCj4gIGRyaXZl cnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3BsYXNoLmMgICAgICAgICAgfCAgMiArKwo+ICBkcml2 ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvYm9vdHNwbGFzaF9pbnRlcm5hbC5oIHwgIDEgKwo+ICBkcml2 ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvYm9vdHNwbGFzaF9yZW5kZXIuYyAgIHwgMzMgKysrKysrKysr KysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAzNiBpbnNlcnRpb25zKCspCj4g Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3BsYXNoLmMgYi9k cml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvYm9vdHNwbGFzaC5jCj4gaW5kZXggODQzYzU0MDBmZWZj Li44MTViMDA3ZjgxY2EgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2Jv b3RzcGxhc2guYwo+ICsrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3BsYXNoLmMK PiBAQCAtMTEyLDYgKzExMiw4IEBAIHZvaWQgYm9vdHNwbGFzaF9yZW5kZXJfZnVsbChzdHJ1Y3Qg ZmJfaW5mbyAqaW5mbykKPiAgCj4gIAlib290c3BsYXNoX2RvX3JlbmRlcl9waWN0dXJlcyhpbmZv LCBzcGxhc2hfc3RhdGUuZmlsZSk7Cj4gIAo+ICsJYm9vdHNwbGFzaF9kb19yZW5kZXJfZmx1c2go aW5mbyk7Cj4gKwo+ICBvdXQ6Cj4gIAltdXRleF91bmxvY2soJnNwbGFzaF9zdGF0ZS5kYXRhX2xv Y2spOwo+ICB9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3Bs YXNoX2ludGVybmFsLmggYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvYm9vdHNwbGFzaF9pbnRl cm5hbC5oCj4gaW5kZXggNzFlMmEyN2FjMGI4Li4wYWNiMzgzYWE0ZTMgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2Jvb3RzcGxhc2hfaW50ZXJuYWwuaAo+ICsrKyBiL2Ry aXZlcnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3BsYXNoX2ludGVybmFsLmgKPiBAQCAtODksNiAr ODksNyBAQCB2b2lkIGJvb3RzcGxhc2hfZG9fcmVuZGVyX2JhY2tncm91bmQoc3RydWN0IGZiX2lu Zm8gKmluZm8sCj4gIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBzcGxhc2hfZmlsZV9wcml2ICpmcCk7 Cj4gIHZvaWQgYm9vdHNwbGFzaF9kb19yZW5kZXJfcGljdHVyZXMoc3RydWN0IGZiX2luZm8gKmlu Zm8sCj4gIAkJCQkgICBjb25zdCBzdHJ1Y3Qgc3BsYXNoX2ZpbGVfcHJpdiAqZnApOwo+ICt2b2lk IGJvb3RzcGxhc2hfZG9fcmVuZGVyX2ZsdXNoKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKPiAgCj4g IAo+ICB2b2lkIGJvb3RzcGxhc2hfZnJlZV9maWxlKHN0cnVjdCBzcGxhc2hfZmlsZV9wcml2ICpm cCk7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9ib290c3BsYXNoX3Jl bmRlci5jIGIvZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2Jvb3RzcGxhc2hfcmVuZGVyLmMKPiBp bmRleCAyYWUzNjk0OWQwZTMuLjhjMDljMzA2ZmY2NyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3Zp ZGVvL2ZiZGV2L2NvcmUvYm9vdHNwbGFzaF9yZW5kZXIuYwo+ICsrKyBiL2RyaXZlcnMvdmlkZW8v ZmJkZXYvY29yZS9ib290c3BsYXNoX3JlbmRlci5jCj4gQEAgLTE4NiwzICsxODYsMzYgQEAgdm9p ZCBib290c3BsYXNoX2RvX3JlbmRlcl9waWN0dXJlcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKPiAg CQkJCXBwLT5waWNfaGVhZGVyLT53aWR0aCwgcHAtPnBpY19oZWFkZXItPmhlaWdodCk7Cj4gIAl9 Cj4gIH0KPiArCj4gKwo+ICt2b2lkIGJvb3RzcGxhc2hfZG9fcmVuZGVyX2ZsdXNoKHN0cnVjdCBm Yl9pbmZvICppbmZvKQo+ICt7Cj4gKwkvKgo+ICsJICogRkIgZHJpdmVycyB1c2luZyBkZWZlcnJl ZF9pbyAoc3VjaCBhcyBYZW4pIG5lZWQgdG8gc3luYyB0aGUKPiArCSAqIHNjcmVlbiBhZnRlciBt b2RpZnlpbmcgaXRzIGNvbnRlbnRzLiBXaGVuIHRoZSBGQiBpcyBtbWFwKCllZAo+ICsJICogZnJv bSB1c2Vyc3BhY2UsIHRoaXMgaGFwcGVucyB2aWEgYSBkaXJ0eSBwYWdlcyBjYWxsYmFjaywgYnV0 Cj4gKwkgKiB3aGVuIG1vZGlmeWluZyB0aGUgRkIgZnJvbSB0aGUga2VybmVsLCB0aGVyZSBpcyBu byBzdWNoIHRoaW5nLgo+ICsJICoKPiArCSAqIFNvIGxldCdzIGlzc3VlIGEgZmFrZSBmYl9jb3B5 YXJlYSAoY29weWluZyB0aGUgRkIgb250byBpdHNlbGYpCj4gKwkgKiB0byB0cmljayB0aGUgRkIg ZHJpdmVyIGludG8gc3luY2luZyB0aGUgc2NyZWVuLgoKVXNpbmcgZHJtIGRpcmVjdGx5IHdvdWxk IGFsbG93IHlvdSB0byBmbHVzaCB0aGUgY29udGVudHMgd2l0aG91dCB0aGUgZmFrZQooYW5kIHRi aCwgcmVhbGx5IGV4cGVuc2l2ZSBvbiBtb3N0IGRyaXZlcnMpIGNvcHkgb3AuIElmIHlvdSBpbnNp c3Qgb24KdXNpbmcgZmJkZXYgZm9yIHRoaXMgc3R1ZmYsIHRoZW4gYXQgbGVhc3QgYWRkIGEgbmV3 IGhvb2sgdG8gZmx1c2ggY3B1CnJlbmRlcmluZy4KCj4gKwkgKgo+ICsJICogQSBmZXcgRFJNIGRy aXZlcnMnIEZCIGltcGxlbWVudGF0aW9ucyBhcmUgYnJva2VuIGJ5IG5vdCB1c2luZwo+ICsJICog ZGVmZXJyZWRfaW8gd2hlbiB0aGV5IHJlYWxseSBzaG91bGQgLSB3ZSBtYXRjaCBvbiB0aGUga25v d24KPiArCSAqIGJhZCBvbmVzIG1hbnVhbGx5IGZvciBub3cuCj4gKwkgKi8KPiArCWlmIChpbmZv LT5mYmRlZmlvCj4gKwkgICAgfHwgIXN0cmNtcChpbmZvLT5maXguaWQsICJhc3Rkcm1mYiIpCj4g KwkgICAgfHwgIXN0cmNtcChpbmZvLT5maXguaWQsICJjaXJydXNkcm1mYiIpCj4gKwkgICAgfHwg IXN0cmNtcChpbmZvLT5maXguaWQsICJtZ2Fkcm1mYiIpKSB7CgpXZSBoYXZlIGEgc2hhcmVkIGRl ZmlvIGltcGxlbWVudGF0aW9uIG5vdyBpbiBkcm1fZmJfaGVscGVyLmMsIHRoZXJlJ3Mgbm90CnJl YWxseSBtYW55IGV4Y3VzZXMgdG8gbm90IGZpeCB1cCB0aGVzZSBkcml2ZXJzIHRvIGp1c3QgdXNl IHRob3NlIC4uLgotRGFuaWVsCgo+ICsJCXN0cnVjdCBmYl9jb3B5YXJlYSBhcmVhOwo+ICsKPiAr CQlhcmVhLmR4ID0gMDsKPiArCQlhcmVhLmR5ID0gMDsKPiArCQlhcmVhLndpZHRoID0gaW5mby0+ dmFyLnhyZXM7Cj4gKwkJYXJlYS5oZWlnaHQgPSBpbmZvLT52YXIueXJlczsKPiArCQlhcmVhLnN4 ID0gMDsKPiArCQlhcmVhLnN5ID0gMDsKPiArCj4gKwkJaW5mby0+ZmJvcHMtPmZiX2NvcHlhcmVh KGluZm8sICZhcmVhKTsKPiArCX0KPiArfQo+IC0tIAo+IDIuMTIuMwo+IAo+IF9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gZHJpLWRldmVsIG1haWxpbmcg bGlzdAo+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAoKLS0gCkRhbmllbCBWZXR0 ZXIKU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCmh0dHA6Ly9ibG9nLmZmd2xs LmNoCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=