From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Mon, 05 Mar 2018 12:08:12 +0200 Subject: [PATCH v3 1/8] drm/blend: Add a generic alpha property In-Reply-To: <20180305085841.GF22212@phenom.ffwll.local> References: <20180221130757.al7i57kiptrqh4j2@flea.lan> <20180305085841.GF22212@phenom.ffwll.local> Message-ID: <16735594.PliY9Ubb24@avalon> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Daniel, On Monday, 5 March 2018 10:58:41 EET Daniel Vetter wrote: > On Wed, Feb 21, 2018 at 02:07:57PM +0100, Maxime Ripard wrote: > > On Mon, Feb 19, 2018 at 10:58:40PM +0100, Daniel Vetter wrote: > >> On Mon, Feb 19, 2018 at 9:19 PM, Laurent Pinchart wrote: > >>> On Friday, 16 February 2018 20:20:41 EET Ville Syrj?l? wrote: > >>>> On Fri, Feb 16, 2018 at 06:39:29PM +0100, Maxime Ripard wrote: > >>>>> Some drivers duplicate the logic to create a property to store a > >>>>> per-plane alpha. > >>>>> > >>>>> This is especially useful if we ever want to support extra > >>>>> protocols for Wayland like: > >>>>> https://lists.freedesktop.org/archives/wayland-devel/2017-August/03 > >>>>> 4741.html > >>>>> > >>>>> Let's create a helper in order to move that to the core. > >>>>> > >>>>> Cc: Laurent Pinchart > >>>>> Reviewed-by: Boris Brezillon > >>>>> Signed-off-by: Maxime Ripard > >>>>> --- > >>>>> > >>>>> Documentation/gpu/kms-properties.csv | 2 +- > >>>>> drivers/gpu/drm/drm_atomic.c | 4 ++++- > >>>>> drivers/gpu/drm/drm_atomic_helper.c | 4 ++++- > >>>>> drivers/gpu/drm/drm_blend.c | 32 +++++++++++++++++++++++- > >>>>> include/drm/drm_blend.h | 1 +- > >>>>> include/drm/drm_plane.h | 6 +++++- > >>>>> 6 files changed, 48 insertions(+), 1 deletion(-) > >>>>> > >>>>> diff --git a/Documentation/gpu/kms-properties.csv > >>>>> b/Documentation/gpu/kms-properties.csv index > >>>>> 927b65e14219..25ad3503d663 > >>>>> 100644 > >>>>> --- a/Documentation/gpu/kms-properties.csv > >>>>> +++ b/Documentation/gpu/kms-properties.csv > >>>>> @@ -99,5 +99,5 @@ radeon,DVI-I,?coherent?,RANGE,"Min=0, > >>>>> Max=1",Connector,TBD> > >>>>> > >>>>> ,,"""underscan vborder""",RANGE,"Min=0, Max=128",Connector,TBD > >>>>> ,Audio,?audio?,ENUM,"{ ""off"", ""on"", ""auto"" }",Connector,TBD > >>>>> ,FMT Dithering,?dither?,ENUM,"{ ""off"", ""on"" }",Connector,TBD > >>>>> > >>>>> -rcar-du,Generic,"""alpha""",RANGE,"Min=0, Max=255",Plane,TBD > >>>>> +,,"""alpha""",RANGE,"Min=0, Max=Driver dependant",Plane,Opacity of > >>>>> the plane from transparent (0) to fully opaque (MAX). If this > >>>>> property is set to a value different than max, and that the pixel > >>>>> will define an alpha component, the property will have precendance > >>>>> and the pixel value will be ignored. > >> > >> Please don't document new properties in that csv file, it's an > >> unreadable mess. Instead follow how we document standardized > >> properties nowadays in full-blown sections. For plane blending we > >> have: > >> > >> https://dri.freedesktop.org/docs/drm/gpu/drm-kms.html#plane-composition-> >> properties > > > > Ack > > > >>>>> diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h > >>>>> index 8185e3468a23..5a6f29524f12 100644 > >>>>> --- a/include/drm/drm_plane.h > >>>>> +++ b/include/drm/drm_plane.h > >>>>> @@ -42,6 +42,7 @@ struct drm_modeset_acquire_ctx; > >>>>> * plane (in 16.16) > >>>>> * @src_w: width of visible portion of plane (in 16.16) > >>>>> * @src_h: height of visible portion of plane (in 16.16) > >>>>> + * @alpha: opacity of the plane > >>>>> * @rotation: rotation of the plane > >>>>> * @zpos: priority of the given plane on crtc (optional) > >>>>> * Note that multiple active planes on the same crtc can have an > >>>>> identical > >>>>> @@ -105,6 +106,9 @@ struct drm_plane_state { > >>>>> uint32_t src_x, src_y; > >>>>> uint32_t src_h, src_w; > >>>>> > >>>>> + /* Plane opacity */ > >>>>> + u8 alpha; > >>>> > >>>> We may want to make that u16. The general we expect 16bpc for most > >>>> color related things, but since this is a range prop I suppose we > >>>> should just expose the actual hardware range. But making it u16 might > >>>> avoid some head scratching for the first person to have hardware with > >>>> higher precision. Either that or we should make the prop creation > >>>> fail if the driver asks for more bits than we have in the state. > >>> > >>> I'm tempted to go one step further and always make the alpha property > >>> 16-bits wide for new users (we can't do so for existing users as it > >>> could break userspace), and let drivers convert that internally to > >>> the range they need. There could however be drawbacks I don't > >>> foresee. > >> > >> I think scaling the range to match the hw is the most sensible (yes > >> I'm flip-flopping around here). And once someone needs more than u8, > >> we can extend the internal representation easily. The external > >> representation in the property is an u64, that /should/ be enough for > >> the next few years :-) > > > > Just to make sure we're on the same page, you want to keep the u8, and > > if the hardware uses say an u16, the driver for that hardware will do > > the upscaling? > > The idea is that we'd set the u16 limit in the property and so inform > userspace that a different range applies. But that's probably going to be > ignored. > > Could we do the property itself as u16 range, and (for now, only > internally in drm in drm_plane_state) throw the lower u8 bits away? Or > just let drivers do this. I'm fine with this except for the drivers that currently implement the alpha property with a different range. The rcar-du driver for instances has the alpha range set to 0x00 to 0xff, so we can't change it without risk of breaking userspace. I don't know whether there's any userspace using the property, and whether that userspace has any hardcoded assumption. > Sorry that I'm flip-flopping around on this, but we just have an ongoing > discussion about a range/size mixup in the CTM uapi, I think assuming that > all userspace will correctly scale is not realistic. So larger scale in > the uapi (but maybe not internally) from the start seems like a good idea. Can we make the range randomly chosen at every boot then ? :-) That would force userspace to be generic. -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 1/8] drm/blend: Add a generic alpha property Date: Mon, 05 Mar 2018 12:08:12 +0200 Message-ID: <16735594.PliY9Ubb24@avalon> References: <20180221130757.al7i57kiptrqh4j2@flea.lan> <20180305085841.GF22212@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [IPv6:2001:4b98:dc2:45:216:3eff:febb:480d]) by gabe.freedesktop.org (Postfix) with ESMTPS id C0D566E0FF for ; Mon, 5 Mar 2018 10:07:20 +0000 (UTC) In-Reply-To: <20180305085841.GF22212@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: Maxime Ripard , dri-devel , Boris Brezillon , Chen-Yu Tsai , Daniel Vetter , Linux ARM List-Id: dri-devel@lists.freedesktop.org SGkgRGFuaWVsLAoKT24gTW9uZGF5LCA1IE1hcmNoIDIwMTggMTA6NTg6NDEgRUVUIERhbmllbCBW ZXR0ZXIgd3JvdGU6Cj4gT24gV2VkLCBGZWIgMjEsIDIwMTggYXQgMDI6MDc6NTdQTSArMDEwMCwg TWF4aW1lIFJpcGFyZCB3cm90ZToKPiA+IE9uIE1vbiwgRmViIDE5LCAyMDE4IGF0IDEwOjU4OjQw UE0gKzAxMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPj4gT24gTW9uLCBGZWIgMTksIDIwMTgg YXQgOToxOSBQTSwgTGF1cmVudCBQaW5jaGFydCB3cm90ZToKPiA+Pj4gT24gRnJpZGF5LCAxNiBG ZWJydWFyeSAyMDE4IDIwOjIwOjQxIEVFVCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4gPj4+PiBP biBGcmksIEZlYiAxNiwgMjAxOCBhdCAwNjozOToyOVBNICswMTAwLCBNYXhpbWUgUmlwYXJkIHdy b3RlOgo+ID4+Pj4+IFNvbWUgZHJpdmVycyBkdXBsaWNhdGUgdGhlIGxvZ2ljIHRvIGNyZWF0ZSBh IHByb3BlcnR5IHRvIHN0b3JlIGEKPiA+Pj4+PiBwZXItcGxhbmUgYWxwaGEuCj4gPj4+Pj4gCj4g Pj4+Pj4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB3ZSBldmVyIHdhbnQgdG8gc3VwcG9y dCBleHRyYQo+ID4+Pj4+IHByb3RvY29scyBmb3IgV2F5bGFuZCBsaWtlOgo+ID4+Pj4+IGh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL2FyY2hpdmVzL3dheWxhbmQtZGV2ZWwvMjAxNy1BdWd1 c3QvMDMKPiA+Pj4+PiA0NzQxLmh0bWwKPiA+Pj4+PiAKPiA+Pj4+PiBMZXQncyBjcmVhdGUgYSBo ZWxwZXIgaW4gb3JkZXIgdG8gbW92ZSB0aGF0IHRvIHRoZSBjb3JlLgo+ID4+Pj4+IAo+ID4+Pj4+ IENjOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+ Cj4gPj4+Pj4gUmV2aWV3ZWQtYnk6IEJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemlsbG9uQGJv b3RsaW4uY29tPgo+ID4+Pj4+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZS5y aXBhcmRAYm9vdGxpbi5jb20+Cj4gPj4+Pj4gLS0tCj4gPj4+Pj4gCj4gPj4+Pj4gIERvY3VtZW50 YXRpb24vZ3B1L2ttcy1wcm9wZXJ0aWVzLmNzdiB8ICAyICstCj4gPj4+Pj4gIGRyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljLmMgICAgICAgICB8ICA0ICsrKystCj4gPj4+Pj4gIGRyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX2hlbHBlci5jICB8ICA0ICsrKystCj4gPj4+Pj4gIGRyaXZlcnMvZ3B1 L2RybS9kcm1fYmxlbmQuYyAgICAgICAgICB8IDMyICsrKysrKysrKysrKysrKysrKysrKysrLQo+ ID4+Pj4+ICBpbmNsdWRlL2RybS9kcm1fYmxlbmQuaCAgICAgICAgICAgICAgfCAgMSArLQo+ID4+ Pj4+ICBpbmNsdWRlL2RybS9kcm1fcGxhbmUuaCAgICAgICAgICAgICAgfCAgNiArKysrKy0KPiA+ Pj4+PiAgNiBmaWxlcyBjaGFuZ2VkLCA0OCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4g Pj4+Pj4gCj4gPj4+Pj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3B1L2ttcy1wcm9wZXJ0 aWVzLmNzdgo+ID4+Pj4+IGIvRG9jdW1lbnRhdGlvbi9ncHUva21zLXByb3BlcnRpZXMuY3N2IGlu ZGV4Cj4gPj4+Pj4gOTI3YjY1ZTE0MjE5Li4yNWFkMzUwM2Q2NjMKPiA+Pj4+PiAxMDA2NDQKPiA+ Pj4+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YKPiA+Pj4+PiAr KysgYi9Eb2N1bWVudGF0aW9uL2dwdS9rbXMtcHJvcGVydGllcy5jc3YKPiA+Pj4+PiBAQCAtOTks NSArOTksNSBAQCByYWRlb24sRFZJLUks4oCcY29oZXJlbnTigJ0sUkFOR0UsIk1pbj0wLAo+ID4+ Pj4+IE1heD0xIixDb25uZWN0b3IsVEJEPgo+ID4+Pj4+IAo+ID4+Pj4+ICAsLCIiInVuZGVyc2Nh biB2Ym9yZGVyIiIiLFJBTkdFLCJNaW49MCwgTWF4PTEyOCIsQ29ubmVjdG9yLFRCRAo+ID4+Pj4+ ICAsQXVkaW8s4oCcYXVkaW/igJ0sRU5VTSwieyAiIm9mZiIiLCAiIm9uIiIsICIiYXV0byIiIH0i LENvbm5lY3RvcixUQkQKPiA+Pj4+PiAgLEZNVCBEaXRoZXJpbmcs4oCcZGl0aGVy4oCdLEVOVU0s InsgIiJvZmYiIiwgIiJvbiIiIH0iLENvbm5lY3RvcixUQkQKPiA+Pj4+PiAKPiA+Pj4+PiAtcmNh ci1kdSxHZW5lcmljLCIiImFscGhhIiIiLFJBTkdFLCJNaW49MCwgTWF4PTI1NSIsUGxhbmUsVEJE Cj4gPj4+Pj4gKywsIiIiYWxwaGEiIiIsUkFOR0UsIk1pbj0wLCBNYXg9RHJpdmVyIGRlcGVuZGFu dCIsUGxhbmUsT3BhY2l0eSBvZgo+ID4+Pj4+IHRoZSBwbGFuZSBmcm9tIHRyYW5zcGFyZW50ICgw KSB0byBmdWxseSBvcGFxdWUgKE1BWCkuIElmIHRoaXMKPiA+Pj4+PiBwcm9wZXJ0eSBpcyBzZXQg dG8gYSB2YWx1ZSBkaWZmZXJlbnQgdGhhbiBtYXgsIGFuZCB0aGF0IHRoZSBwaXhlbAo+ID4+Pj4+ IHdpbGwgZGVmaW5lIGFuIGFscGhhIGNvbXBvbmVudCwgdGhlIHByb3BlcnR5IHdpbGwgaGF2ZSBw cmVjZW5kYW5jZQo+ID4+Pj4+IGFuZCB0aGUgcGl4ZWwgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgo+ ID4+IAo+ID4+IFBsZWFzZSBkb24ndCBkb2N1bWVudCBuZXcgcHJvcGVydGllcyBpbiB0aGF0IGNz diBmaWxlLCBpdCdzIGFuCj4gPj4gdW5yZWFkYWJsZSBtZXNzLiBJbnN0ZWFkIGZvbGxvdyBob3cg d2UgZG9jdW1lbnQgc3RhbmRhcmRpemVkCj4gPj4gcHJvcGVydGllcyBub3dhZGF5cyBpbiBmdWxs LWJsb3duIHNlY3Rpb25zLiBGb3IgcGxhbmUgYmxlbmRpbmcgd2UKPiA+PiBoYXZlOgo+ID4+IAo+ ID4+IGh0dHBzOi8vZHJpLmZyZWVkZXNrdG9wLm9yZy9kb2NzL2RybS9ncHUvZHJtLWttcy5odG1s I3BsYW5lLWNvbXBvc2l0aW9uLT4gPj4gcHJvcGVydGllcwo+ID4gCj4gPiBBY2sKPiA+IAo+ID4+ Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGxhbmUuaCBiL2luY2x1ZGUvZHJtL2Ry bV9wbGFuZS5oCj4gPj4+Pj4gaW5kZXggODE4NWUzNDY4YTIzLi41YTZmMjk1MjRmMTIgMTAwNjQ0 Cj4gPj4+Pj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BsYW5lLmgKPiA+Pj4+PiArKysgYi9pbmNs dWRlL2RybS9kcm1fcGxhbmUuaAo+ID4+Pj4+IEBAIC00Miw2ICs0Miw3IEBAIHN0cnVjdCBkcm1f bW9kZXNldF9hY3F1aXJlX2N0eDsKPiA+Pj4+PiAgICogcGxhbmUgKGluIDE2LjE2KQo+ID4+Pj4+ ICAgKiBAc3JjX3c6IHdpZHRoIG9mIHZpc2libGUgcG9ydGlvbiBvZiBwbGFuZSAoaW4gMTYuMTYp Cj4gPj4+Pj4gICAqIEBzcmNfaDogaGVpZ2h0IG9mIHZpc2libGUgcG9ydGlvbiBvZiBwbGFuZSAo aW4gMTYuMTYpCj4gPj4+Pj4gKyAqIEBhbHBoYTogb3BhY2l0eSBvZiB0aGUgcGxhbmUKPiA+Pj4+ PiAgICogQHJvdGF0aW9uOiByb3RhdGlvbiBvZiB0aGUgcGxhbmUKPiA+Pj4+PiAgICogQHpwb3M6 IHByaW9yaXR5IG9mIHRoZSBnaXZlbiBwbGFuZSBvbiBjcnRjIChvcHRpb25hbCkKPiA+Pj4+PiAg ICogTm90ZSB0aGF0IG11bHRpcGxlIGFjdGl2ZSBwbGFuZXMgb24gdGhlIHNhbWUgY3J0YyBjYW4g aGF2ZSBhbgo+ID4+Pj4+ICAgaWRlbnRpY2FsCj4gPj4+Pj4gQEAgLTEwNSw2ICsxMDYsOSBAQCBz dHJ1Y3QgZHJtX3BsYW5lX3N0YXRlIHsKPiA+Pj4+PiAgICAgdWludDMyX3Qgc3JjX3gsIHNyY195 Owo+ID4+Pj4+ICAgICB1aW50MzJfdCBzcmNfaCwgc3JjX3c7Cj4gPj4+Pj4gCj4gPj4+Pj4gKyAg IC8qIFBsYW5lIG9wYWNpdHkgKi8KPiA+Pj4+PiArICAgdTggYWxwaGE7Cj4gPj4+PiAKPiA+Pj4+ IFdlIG1heSB3YW50IHRvIG1ha2UgdGhhdCB1MTYuIFRoZSBnZW5lcmFsIHdlIGV4cGVjdCAxNmJw YyBmb3IgbW9zdAo+ID4+Pj4gY29sb3IgcmVsYXRlZCB0aGluZ3MsIGJ1dCBzaW5jZSB0aGlzIGlz IGEgcmFuZ2UgcHJvcCBJIHN1cHBvc2Ugd2UKPiA+Pj4+IHNob3VsZCBqdXN0IGV4cG9zZSB0aGUg YWN0dWFsIGhhcmR3YXJlIHJhbmdlLiBCdXQgbWFraW5nIGl0IHUxNiBtaWdodAo+ID4+Pj4gYXZv aWQgc29tZSBoZWFkIHNjcmF0Y2hpbmcgZm9yIHRoZSBmaXJzdCBwZXJzb24gdG8gaGF2ZSBoYXJk d2FyZSB3aXRoCj4gPj4+PiBoaWdoZXIgcHJlY2lzaW9uLiBFaXRoZXIgdGhhdCBvciB3ZSBzaG91 bGQgbWFrZSB0aGUgcHJvcCBjcmVhdGlvbgo+ID4+Pj4gZmFpbCBpZiB0aGUgZHJpdmVyIGFza3Mg Zm9yIG1vcmUgYml0cyB0aGFuIHdlIGhhdmUgaW4gdGhlIHN0YXRlLgo+ID4+PiAKPiA+Pj4gSSdt IHRlbXB0ZWQgdG8gZ28gb25lIHN0ZXAgZnVydGhlciBhbmQgYWx3YXlzIG1ha2UgdGhlIGFscGhh IHByb3BlcnR5Cj4gPj4+IDE2LWJpdHMgd2lkZSBmb3IgbmV3IHVzZXJzICh3ZSBjYW4ndCBkbyBz byBmb3IgZXhpc3RpbmcgdXNlcnMgYXMgaXQKPiA+Pj4gY291bGQgYnJlYWsgdXNlcnNwYWNlKSwg YW5kIGxldCBkcml2ZXJzIGNvbnZlcnQgdGhhdCBpbnRlcm5hbGx5IHRvCj4gPj4+IHRoZSByYW5n ZSB0aGV5IG5lZWQuIFRoZXJlIGNvdWxkIGhvd2V2ZXIgYmUgZHJhd2JhY2tzIEkgZG9uJ3QKPiA+ Pj4gZm9yZXNlZS4KPiA+PiAKPiA+PiBJIHRoaW5rIHNjYWxpbmcgdGhlIHJhbmdlIHRvIG1hdGNo IHRoZSBodyBpcyB0aGUgbW9zdCBzZW5zaWJsZSAoeWVzCj4gPj4gSSdtIGZsaXAtZmxvcHBpbmcg YXJvdW5kIGhlcmUpLiBBbmQgb25jZSBzb21lb25lIG5lZWRzIG1vcmUgdGhhbiB1OCwKPiA+PiB3 ZSBjYW4gZXh0ZW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBlYXNpbHkuIFRoZSBleHRl cm5hbAo+ID4+IHJlcHJlc2VudGF0aW9uIGluIHRoZSBwcm9wZXJ0eSBpcyBhbiB1NjQsIHRoYXQg L3Nob3VsZC8gYmUgZW5vdWdoIGZvcgo+ID4+IHRoZSBuZXh0IGZldyB5ZWFycyA6LSkKPiA+IAo+ ID4gSnVzdCB0byBtYWtlIHN1cmUgd2UncmUgb24gdGhlIHNhbWUgcGFnZSwgeW91IHdhbnQgdG8g a2VlcCB0aGUgdTgsIGFuZAo+ID4gaWYgdGhlIGhhcmR3YXJlIHVzZXMgc2F5IGFuIHUxNiwgdGhl IGRyaXZlciBmb3IgdGhhdCBoYXJkd2FyZSB3aWxsIGRvCj4gPiB0aGUgdXBzY2FsaW5nPwo+IAo+ IFRoZSBpZGVhIGlzIHRoYXQgd2UnZCBzZXQgdGhlIHUxNiBsaW1pdCBpbiB0aGUgcHJvcGVydHkg YW5kIHNvIGluZm9ybQo+IHVzZXJzcGFjZSB0aGF0IGEgZGlmZmVyZW50IHJhbmdlIGFwcGxpZXMu IEJ1dCB0aGF0J3MgcHJvYmFibHkgZ29pbmcgdG8gYmUKPiBpZ25vcmVkLgo+IAo+IENvdWxkIHdl IGRvIHRoZSBwcm9wZXJ0eSBpdHNlbGYgYXMgdTE2IHJhbmdlLCBhbmQgKGZvciBub3csIG9ubHkK PiBpbnRlcm5hbGx5IGluIGRybSBpbiBkcm1fcGxhbmVfc3RhdGUpIHRocm93IHRoZSBsb3dlciB1 OCBiaXRzIGF3YXk/IE9yCj4ganVzdCBsZXQgZHJpdmVycyBkbyB0aGlzLgoKSSdtIGZpbmUgd2l0 aCB0aGlzIGV4Y2VwdCBmb3IgdGhlIGRyaXZlcnMgdGhhdCBjdXJyZW50bHkgaW1wbGVtZW50IHRo ZSBhbHBoYSAKcHJvcGVydHkgd2l0aCBhIGRpZmZlcmVudCByYW5nZS4gVGhlIHJjYXItZHUgZHJp dmVyIGZvciBpbnN0YW5jZXMgaGFzIHRoZSAKYWxwaGEgcmFuZ2Ugc2V0IHRvIDB4MDAgdG8gMHhm Ziwgc28gd2UgY2FuJ3QgY2hhbmdlIGl0IHdpdGhvdXQgcmlzayBvZiAKYnJlYWtpbmcgdXNlcnNw YWNlLiBJIGRvbid0IGtub3cgd2hldGhlciB0aGVyZSdzIGFueSB1c2Vyc3BhY2UgdXNpbmcgdGhl IApwcm9wZXJ0eSwgYW5kIHdoZXRoZXIgdGhhdCB1c2Vyc3BhY2UgaGFzIGFueSBoYXJkY29kZWQg YXNzdW1wdGlvbi4KCj4gU29ycnkgdGhhdCBJJ20gZmxpcC1mbG9wcGluZyBhcm91bmQgb24gdGhp cywgYnV0IHdlIGp1c3QgaGF2ZSBhbiBvbmdvaW5nCj4gZGlzY3Vzc2lvbiBhYm91dCBhIHJhbmdl L3NpemUgbWl4dXAgaW4gdGhlIENUTSB1YXBpLCBJIHRoaW5rIGFzc3VtaW5nIHRoYXQKPiBhbGwg dXNlcnNwYWNlIHdpbGwgY29ycmVjdGx5IHNjYWxlIGlzIG5vdCByZWFsaXN0aWMuIFNvIGxhcmdl ciBzY2FsZSBpbgo+IHRoZSB1YXBpIChidXQgbWF5YmUgbm90IGludGVybmFsbHkpIGZyb20gdGhl IHN0YXJ0IHNlZW1zIGxpa2UgYSBnb29kIGlkZWEuCgpDYW4gd2UgbWFrZSB0aGUgcmFuZ2UgcmFu ZG9tbHkgY2hvc2VuIGF0IGV2ZXJ5IGJvb3QgdGhlbiA/IDotKSBUaGF0IHdvdWxkIApmb3JjZSB1 c2Vyc3BhY2UgdG8gYmUgZ2VuZXJpYy4KCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==