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 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 495C6C282DD for ; Sat, 20 Apr 2019 23:05:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0310820651 for ; Sat, 20 Apr 2019 23:05:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="OITZP19F" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727743AbfDTXFl (ORCPT ); Sat, 20 Apr 2019 19:05:41 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:57422 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725965AbfDTXFl (ORCPT ); Sat, 20 Apr 2019 19:05:41 -0400 Received: from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7BBB75F; Sun, 21 Apr 2019 01:05:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1555801538; bh=fKctR+w3M27wicw756d7Gy6T2oMXCpcSlojCaIGpFsQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OITZP19Fm0zDB3WlrBcClJxvi34UwVFjyC86SQNoQ/K1xU4eqUL8u8t52XCf0MGbf eycJ+3kGW3fhnJf6oHr5qO6iJVeBGsujMHb1pfULtsPyl+hdyrhlRwgmRfTD71d6Ni a6+THT4iTeDiuPlUGcvtdIcIHgffYi8BubE0CKLc= Date: Sun, 21 Apr 2019 02:05:29 +0300 From: Laurent Pinchart To: Maxime Ripard Cc: Daniel Vetter , Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Mauro Carvalho Chehab , Sakari Ailus , Linux Kernel Mailing List , dri-devel , Paul Kocialkowski , Hans Verkuil , Thomas Petazzoni , "open list:DMA BUFFER SHARING FRAMEWORK" Subject: Re: [PATCH 00/20] drm: Split out the formats API and move it to a common place Message-ID: <20190420230529.GA4964@pendragon.ideasonboard.com> References: <20190417154121.GJ13337@phenom.ffwll.local> <20190418062229.eyog4i62eg4pr6uf@flea> <20190418090221.e57dogn4yx5nwdni@flea> <20190418120143.4x7bvhgkh23mgsup@flea> <20190418205630.6i7cvfmtoyq5uhvl@flea> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190418205630.6i7cvfmtoyq5uhvl@flea> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Maxime, On Thu, Apr 18, 2019 at 10:56:30PM +0200, Maxime Ripard wrote: > On Thu, Apr 18, 2019 at 02:32:14PM +0200, Daniel Vetter wrote: > >>>>> Unifying the formats themselves, and all the associated metadata is > >>>>> imo a no-go, and was a pretty conscious decision when we implemented > >>>>> drm_fourcc a few years back. > >>>>> > >>>>>> If we want to keep the current library in DRM, we have two options > >>>>>> then: > >>>>>> > >>>>>> - Support all the v4l2 formats in the DRM library, which is > >>>>>> essentially what I'm doing in the last patches. However, that > >>>>>> would require to have the v4l2 developpers also reviewing stuff > >>>>>> there. And given how busy they are, I cannot really see how that > >>>>>> would work. > >>>>> > >>>>> Well, if we end up with a common library then yes we need cross > >>>>> review. There's no way around that. Doesn't matter where exactly that > >>>>> library is in the filesystem tree, and adding a special MAINTAINERS > >>>>> entry for anything related to fourcc (both drm and v4l) to make sure > >>>>> they get cross-posted is easy. No file renaming needed. > >>>> > >>>> That would create some governing issues as well. For example, if you > >>>> ever have a patch from one fourcc addition (that might or might not be > >>>> covered by v4l2), will you wait for any v4l2 developper to review it? > >>> > >>> None of this is fixed by code renaming or locations. Either way we > >>> need to figure that out. > >>> > >>> And yes part of the reasons for not moving this out of drm is that I'm > >>> not a fan of boutique trees for small stuff. If sharing means we need > >>> to split the drm_fourcc code and library out of drm trees, I'm not > >>> sure that's a good idea. We're already super liberal with merging > >>> anything through driver trees with acks, and integrating them quickly > >>> into drm-next. This would still be workable if v4l sends regular pull > >>> requests to drm-next (every 1-2 weeks, like the other big gpu trees > >>> do). If we can only sync up once per merge window with a shared > >>> boutique tree for formats only, life is going to be painful. > >> > >> I don't get why we want to turn DRM into some kind of a black hole > >> that would pull everything. We don't have to, really. And at the same > >> time it carries the message that v4l2 is less important than DRM for > >> some reason, which I'm really not comfortable with. > > > > Make another tree somewhere that pulls in trees more often than every > > merge window, and I'm happy. It's the coordination effort of lots of > > trees that creates the black hole, not the other way round. Yes topic > > trees work, but if topic trees are persistent something with the > > organization of trees is wrong and needs to change. This very much > > looks like we'll end up with a perpetual topic branch for format stuff > > between drm and v4l. > > Well, if v4l2 sends a PR to DRM every 1 or 2 weeks, that definitely > looks like a topic branch to me. And on a far more frequent basis than > when we will merge a format description. > > > The other shared stuff (like hdmi infoframes) seems to change a lot > > less often, so the occasional patch hasn't been a pain. But drm_fourcc > > related stuff sees a lot of work, both in adding new formats and in > > refactoring the library to keep up with all the new use-cases. > > When was the last time a refactoring that changed the API happened? > > Most of the changes will be new format descriptions, and I guess that > would only concern a single tree. > > And really, we're doing this all the time, so I'm not sure what the > big deal is here. > > I feel like there's something that you don't really like about this, > but you're not saying this out loud. > > Sure, the exact process needs to be figured out, and everyone needs to > agree upon that process. But that's pretty much it, and it's nothing > out of the ordinary. > > > And yes I think an overall gfx-like-stuff.git tree for drm and v4l and > > the few other bits really makes tons of sense. Not as a tree where > > people commit, but as the 2nd-level integration tree (like drm.git > > right now for gpu stuff). > > > >> And I don't really get why you're against this in the first > >> place. When you have some code in a single driver that would benefit > >> more driver, you create a helper and move it into the core. > > > > It's a feature that drm doesn't share that much code with other parts > > of the kernel, it makes backporting the gfx stack to lts kernels a lot > > easier. Until someone fixes the upstream kernel release model to no > > longer need large scale gpu driver backports, we need to keep that. > > > >> In this case, we have some code used by a framework that more > >> framework could use, and we move it to a core-er place. How is that > >> different? > > > > Imo core sharing for code sharing's sake is overrated. If we already > > have drm and v4l tightly integrated as a community, then code sharing > > becomes a lot easier, and a lot more reasonable to do. > > At least Laurent, Boris, Ezequiel, Gustavo and I have been working on > v4l2, so I'm not sure how not integrated we are. Let's also mention that we'll need more code sharing as we move forward. We already have chips that have two drivers, one in V4L2 and one in DRM (I'm thinking about the adv7511 bridge driver for instance). I know SoC vendors that are not happy about this state of things as they have IP cores that can be used in both camera and display pipelines. It's a long standing issue, it won't be solve today, but we'll need to get to it eventually. Sharing a 4CC library would be a great step forward in my opinion, in order to get the two subsystems to collaborate better. > > Plus we can then just stuff code int drivers/gpu or drivers/video > > (or merge these two because really it's all the same). But my > > understanding is that integrating more tightly with the drm folks is > > a very contreversial topic in v4l > > So, I sent the RFC expecting that kind of feedback. > > Hans replied mainly to that patch https://patchwork.freedesktop.org/patch/293043/ > > " > If we are creating a common library then I think we should change that rule > to: "unless they are in use by a DRM or V4L2 driver". And when new formats are > added, and they exists already for DRM or V4L2, then we should use the same > fourcc for the other subsystem. > > I.e. if pixelformat V4L2_PIX_FMT_FOO was already defined, then add a: > > #define DRM_FORMAT_FOO V4L2_PIX_FMT_FOO > > rather than creating a new fourcc. I would like to point out here that we have two different items we call 4CC, the macro name (FOO in your example here), and the numerical value. If a numerical value already exists in DRM or V4L2 for a given pixel format, it should be used, period. The macro name, however, could be changed, as many of them carry historical mistakes. > We could even start looking at redoing the whole scheme in a unified way, but > that's something for the (far) future. > > This is already a big step forward. > " > > So, not controversial at all. > > > and until that's resolved I don't see a huge need or benefit in > > sharing tons of code. > > That's mostly tons of data though. The code is pretty small and > trivial. > > > And the format stuff is a lot more central to kms than e.g. the > > infoframe helpers. > > > > Au contraire, I think forcing this has a lot of potential for > > needless fights between drm and v4l. > > We're all reasonable, so I'm not sure why we would need to fight here. > > > Hence my suggestion to try a minimal format conversion library > > between the drm format world and the v4l format wolrd, and see how > > that goes. That contains a lot less risk than going all in right > > from the start. > > And it's really not about getting access to the DRM fourcc. It's about > getting access to DRM's format description, so I'm not really sure > what there is to convert, we just want a lookup. -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 00/20] drm: Split out the formats API and move it to a common place Date: Sun, 21 Apr 2019 02:05:29 +0300 Message-ID: <20190420230529.GA4964@pendragon.ideasonboard.com> References: <20190417154121.GJ13337@phenom.ffwll.local> <20190418062229.eyog4i62eg4pr6uf@flea> <20190418090221.e57dogn4yx5nwdni@flea> <20190418120143.4x7bvhgkh23mgsup@flea> <20190418205630.6i7cvfmtoyq5uhvl@flea> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 58E9E89219 for ; Sat, 20 Apr 2019 23:05:40 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190418205630.6i7cvfmtoyq5uhvl@flea> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Maxime Ripard Cc: Thomas Petazzoni , Sakari Ailus , David Airlie , Linux Kernel Mailing List , dri-devel , Paul Kocialkowski , Hans Verkuil , Sean Paul , Daniel Vetter , Mauro Carvalho Chehab , "open list:DMA BUFFER SHARING FRAMEWORK" List-Id: dri-devel@lists.freedesktop.org SGkgTWF4aW1lLAoKT24gVGh1LCBBcHIgMTgsIDIwMTkgYXQgMTA6NTY6MzBQTSArMDIwMCwgTWF4 aW1lIFJpcGFyZCB3cm90ZToKPiBPbiBUaHUsIEFwciAxOCwgMjAxOSBhdCAwMjozMjoxNFBNICsw MjAwLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+ID4+Pj4+IFVuaWZ5aW5nIHRoZSBmb3JtYXRzIHRo ZW1zZWx2ZXMsIGFuZCBhbGwgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgaXMKPiA+Pj4+PiBpbW8g YSBuby1nbywgYW5kIHdhcyBhIHByZXR0eSBjb25zY2lvdXMgZGVjaXNpb24gd2hlbiB3ZSBpbXBs ZW1lbnRlZAo+ID4+Pj4+IGRybV9mb3VyY2MgYSBmZXcgeWVhcnMgYmFjay4KPiA+Pj4+Pgo+ID4+ Pj4+PiBJZiB3ZSB3YW50IHRvIGtlZXAgdGhlIGN1cnJlbnQgbGlicmFyeSBpbiBEUk0sIHdlIGhh dmUgdHdvIG9wdGlvbnMKPiA+Pj4+Pj4gdGhlbjoKPiA+Pj4+Pj4KPiA+Pj4+Pj4gICAtIFN1cHBv cnQgYWxsIHRoZSB2NGwyIGZvcm1hdHMgaW4gdGhlIERSTSBsaWJyYXJ5LCB3aGljaCBpcwo+ID4+ Pj4+PiAgICAgZXNzZW50aWFsbHkgd2hhdCBJJ20gZG9pbmcgaW4gdGhlIGxhc3QgcGF0Y2hlcy4g SG93ZXZlciwgdGhhdAo+ID4+Pj4+PiAgICAgd291bGQgcmVxdWlyZSB0byBoYXZlIHRoZSB2NGwy IGRldmVsb3BwZXJzIGFsc28gcmV2aWV3aW5nIHN0dWZmCj4gPj4+Pj4+ICAgICB0aGVyZS4gQW5k IGdpdmVuIGhvdyBidXN5IHRoZXkgYXJlLCBJIGNhbm5vdCByZWFsbHkgc2VlIGhvdyB0aGF0Cj4g Pj4+Pj4+ICAgICB3b3VsZCB3b3JrLgo+ID4+Pj4+Cj4gPj4+Pj4gV2VsbCwgaWYgd2UgZW5kIHVw IHdpdGggYSBjb21tb24gbGlicmFyeSB0aGVuIHllcyB3ZSBuZWVkIGNyb3NzCj4gPj4+Pj4gcmV2 aWV3LiBUaGVyZSdzIG5vIHdheSBhcm91bmQgdGhhdC4gRG9lc24ndCBtYXR0ZXIgd2hlcmUgZXhh Y3RseSB0aGF0Cj4gPj4+Pj4gbGlicmFyeSBpcyBpbiB0aGUgZmlsZXN5c3RlbSB0cmVlLCBhbmQg YWRkaW5nIGEgc3BlY2lhbCBNQUlOVEFJTkVSUwo+ID4+Pj4+IGVudHJ5IGZvciBhbnl0aGluZyBy ZWxhdGVkIHRvIGZvdXJjYyAoYm90aCBkcm0gYW5kIHY0bCkgdG8gbWFrZSBzdXJlCj4gPj4+Pj4g dGhleSBnZXQgY3Jvc3MtcG9zdGVkIGlzIGVhc3kuIE5vIGZpbGUgcmVuYW1pbmcgbmVlZGVkLgo+ ID4+Pj4KPiA+Pj4+IFRoYXQgd291bGQgY3JlYXRlIHNvbWUgZ292ZXJuaW5nIGlzc3VlcyBhcyB3 ZWxsLiBGb3IgZXhhbXBsZSwgaWYgeW91Cj4gPj4+PiBldmVyIGhhdmUgYSBwYXRjaCBmcm9tIG9u ZSBmb3VyY2MgYWRkaXRpb24gKHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlCj4gPj4+PiBjb3Zl cmVkIGJ5IHY0bDIpLCB3aWxsIHlvdSB3YWl0IGZvciBhbnkgdjRsMiBkZXZlbG9wcGVyIHRvIHJl dmlldyBpdD8KPiA+Pj4KPiA+Pj4gTm9uZSBvZiB0aGlzIGlzIGZpeGVkIGJ5IGNvZGUgcmVuYW1p bmcgb3IgbG9jYXRpb25zLiBFaXRoZXIgd2F5IHdlCj4gPj4+IG5lZWQgdG8gZmlndXJlIHRoYXQg b3V0Lgo+ID4+Pgo+ID4+PiBBbmQgeWVzIHBhcnQgb2YgdGhlIHJlYXNvbnMgZm9yIG5vdCBtb3Zp bmcgdGhpcyBvdXQgb2YgZHJtIGlzIHRoYXQgSSdtCj4gPj4+IG5vdCBhIGZhbiBvZiBib3V0aXF1 ZSB0cmVlcyBmb3Igc21hbGwgc3R1ZmYuIElmIHNoYXJpbmcgbWVhbnMgd2UgbmVlZAo+ID4+PiB0 byBzcGxpdCB0aGUgZHJtX2ZvdXJjYyBjb2RlIGFuZCBsaWJyYXJ5IG91dCBvZiBkcm0gdHJlZXMs IEknbSBub3QKPiA+Pj4gc3VyZSB0aGF0J3MgYSBnb29kIGlkZWEuIFdlJ3JlIGFscmVhZHkgc3Vw ZXIgbGliZXJhbCB3aXRoIG1lcmdpbmcKPiA+Pj4gYW55dGhpbmcgdGhyb3VnaCBkcml2ZXIgdHJl ZXMgd2l0aCBhY2tzLCBhbmQgaW50ZWdyYXRpbmcgdGhlbSBxdWlja2x5Cj4gPj4+IGludG8gZHJt LW5leHQuIFRoaXMgd291bGQgc3RpbGwgYmUgd29ya2FibGUgaWYgdjRsIHNlbmRzIHJlZ3VsYXIg cHVsbAo+ID4+PiByZXF1ZXN0cyB0byBkcm0tbmV4dCAoZXZlcnkgMS0yIHdlZWtzLCBsaWtlIHRo ZSBvdGhlciBiaWcgZ3B1IHRyZWVzCj4gPj4+IGRvKS4gSWYgd2UgY2FuIG9ubHkgc3luYyB1cCBv bmNlIHBlciBtZXJnZSB3aW5kb3cgd2l0aCBhIHNoYXJlZAo+ID4+PiBib3V0aXF1ZSB0cmVlIGZv ciBmb3JtYXRzIG9ubHksIGxpZmUgaXMgZ29pbmcgdG8gYmUgcGFpbmZ1bC4KPiA+Pgo+ID4+IEkg ZG9uJ3QgZ2V0IHdoeSB3ZSB3YW50IHRvIHR1cm4gRFJNIGludG8gc29tZSBraW5kIG9mIGEgYmxh Y2sgaG9sZQo+ID4+IHRoYXQgd291bGQgcHVsbCBldmVyeXRoaW5nLiBXZSBkb24ndCBoYXZlIHRv LCByZWFsbHkuIEFuZCBhdCB0aGUgc2FtZQo+ID4+IHRpbWUgaXQgY2FycmllcyB0aGUgbWVzc2Fn ZSB0aGF0IHY0bDIgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBEUk0gZm9yCj4gPj4gc29tZSByZWFz b24sIHdoaWNoIEknbSByZWFsbHkgbm90IGNvbWZvcnRhYmxlIHdpdGguCj4gPgo+ID4gTWFrZSBh bm90aGVyIHRyZWUgc29tZXdoZXJlIHRoYXQgcHVsbHMgaW4gdHJlZXMgbW9yZSBvZnRlbiB0aGFu IGV2ZXJ5Cj4gPiBtZXJnZSB3aW5kb3csIGFuZCBJJ20gaGFwcHkuIEl0J3MgdGhlIGNvb3JkaW5h dGlvbiBlZmZvcnQgb2YgbG90cyBvZgo+ID4gdHJlZXMgdGhhdCBjcmVhdGVzIHRoZSBibGFjayBo b2xlLCBub3QgdGhlIG90aGVyIHdheSByb3VuZC4gWWVzIHRvcGljCj4gPiB0cmVlcyB3b3JrLCBi dXQgaWYgdG9waWMgdHJlZXMgYXJlIHBlcnNpc3RlbnQgc29tZXRoaW5nIHdpdGggdGhlCj4gPiBv cmdhbml6YXRpb24gb2YgdHJlZXMgaXMgd3JvbmcgYW5kIG5lZWRzIHRvIGNoYW5nZS4gVGhpcyB2 ZXJ5IG11Y2gKPiA+IGxvb2tzIGxpa2Ugd2UnbGwgZW5kIHVwIHdpdGggYSBwZXJwZXR1YWwgdG9w aWMgYnJhbmNoIGZvciBmb3JtYXQgc3R1ZmYKPiA+IGJldHdlZW4gZHJtIGFuZCB2NGwuCj4gCj4g V2VsbCwgaWYgdjRsMiBzZW5kcyBhIFBSIHRvIERSTSBldmVyeSAxIG9yIDIgd2Vla3MsIHRoYXQg ZGVmaW5pdGVseQo+IGxvb2tzIGxpa2UgYSB0b3BpYyBicmFuY2ggdG8gbWUuIEFuZCBvbiBhIGZh ciBtb3JlIGZyZXF1ZW50IGJhc2lzIHRoYW4KPiB3aGVuIHdlIHdpbGwgbWVyZ2UgYSBmb3JtYXQg ZGVzY3JpcHRpb24uCj4gCj4gPiBUaGUgb3RoZXIgc2hhcmVkIHN0dWZmIChsaWtlIGhkbWkgaW5m b2ZyYW1lcykgc2VlbXMgdG8gY2hhbmdlIGEgbG90Cj4gPiBsZXNzIG9mdGVuLCBzbyB0aGUgb2Nj YXNpb25hbCBwYXRjaCBoYXNuJ3QgYmVlbiBhIHBhaW4uIEJ1dCBkcm1fZm91cmNjCj4gPiByZWxh dGVkIHN0dWZmIHNlZXMgYSBsb3Qgb2Ygd29yaywgYm90aCBpbiBhZGRpbmcgbmV3IGZvcm1hdHMg YW5kIGluCj4gPiByZWZhY3RvcmluZyB0aGUgbGlicmFyeSB0byBrZWVwIHVwIHdpdGggYWxsIHRo ZSBuZXcgdXNlLWNhc2VzLgo+IAo+IFdoZW4gd2FzIHRoZSBsYXN0IHRpbWUgYSByZWZhY3Rvcmlu ZyB0aGF0IGNoYW5nZWQgdGhlIEFQSSBoYXBwZW5lZD8KPiAKPiBNb3N0IG9mIHRoZSBjaGFuZ2Vz IHdpbGwgYmUgbmV3IGZvcm1hdCBkZXNjcmlwdGlvbnMsIGFuZCBJIGd1ZXNzIHRoYXQKPiB3b3Vs ZCBvbmx5IGNvbmNlcm4gYSBzaW5nbGUgdHJlZS4KPiAKPiBBbmQgcmVhbGx5LCB3ZSdyZSBkb2lu ZyB0aGlzIGFsbCB0aGUgdGltZSwgc28gSSdtIG5vdCBzdXJlIHdoYXQgdGhlCj4gYmlnIGRlYWwg aXMgaGVyZS4KPiAKPiBJIGZlZWwgbGlrZSB0aGVyZSdzIHNvbWV0aGluZyB0aGF0IHlvdSBkb24n dCByZWFsbHkgbGlrZSBhYm91dCB0aGlzLAo+IGJ1dCB5b3UncmUgbm90IHNheWluZyB0aGlzIG91 dCBsb3VkLgo+IAo+IFN1cmUsIHRoZSBleGFjdCBwcm9jZXNzIG5lZWRzIHRvIGJlIGZpZ3VyZWQg b3V0LCBhbmQgZXZlcnlvbmUgbmVlZHMgdG8KPiBhZ3JlZSB1cG9uIHRoYXQgcHJvY2Vzcy4gQnV0 IHRoYXQncyBwcmV0dHkgbXVjaCBpdCwgYW5kIGl0J3Mgbm90aGluZwo+IG91dCBvZiB0aGUgb3Jk aW5hcnkuCj4gCj4gPiBBbmQgeWVzIEkgdGhpbmsgYW4gb3ZlcmFsbCBnZngtbGlrZS1zdHVmZi5n aXQgdHJlZSBmb3IgZHJtIGFuZCB2NGwgYW5kCj4gPiB0aGUgZmV3IG90aGVyIGJpdHMgcmVhbGx5 IG1ha2VzIHRvbnMgb2Ygc2Vuc2UuIE5vdCBhcyBhIHRyZWUgd2hlcmUKPiA+IHBlb3BsZSBjb21t aXQsIGJ1dCBhcyB0aGUgMm5kLWxldmVsIGludGVncmF0aW9uIHRyZWUgKGxpa2UgZHJtLmdpdAo+ ID4gcmlnaHQgbm93IGZvciBncHUgc3R1ZmYpLgo+ID4KPiA+PiBBbmQgSSBkb24ndCByZWFsbHkg Z2V0IHdoeSB5b3UncmUgYWdhaW5zdCB0aGlzIGluIHRoZSBmaXJzdAo+ID4+IHBsYWNlLiBXaGVu IHlvdSBoYXZlIHNvbWUgY29kZSBpbiBhIHNpbmdsZSBkcml2ZXIgdGhhdCB3b3VsZCBiZW5lZml0 Cj4gPj4gbW9yZSBkcml2ZXIsIHlvdSBjcmVhdGUgYSBoZWxwZXIgYW5kIG1vdmUgaXQgaW50byB0 aGUgY29yZS4KPiA+Cj4gPiBJdCdzIGEgZmVhdHVyZSB0aGF0IGRybSBkb2Vzbid0IHNoYXJlIHRo YXQgbXVjaCBjb2RlIHdpdGggb3RoZXIgcGFydHMKPiA+IG9mIHRoZSBrZXJuZWwsIGl0IG1ha2Vz IGJhY2twb3J0aW5nIHRoZSBnZnggc3RhY2sgdG8gbHRzIGtlcm5lbHMgYSBsb3QKPiA+IGVhc2ll ci4gVW50aWwgc29tZW9uZSBmaXhlcyB0aGUgdXBzdHJlYW0ga2VybmVsIHJlbGVhc2UgbW9kZWwg dG8gbm8KPiA+IGxvbmdlciBuZWVkIGxhcmdlIHNjYWxlIGdwdSBkcml2ZXIgYmFja3BvcnRzLCB3 ZSBuZWVkIHRvIGtlZXAgdGhhdC4KPiA+Cj4gPj4gSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIHNvbWUg Y29kZSB1c2VkIGJ5IGEgZnJhbWV3b3JrIHRoYXQgbW9yZQo+ID4+IGZyYW1ld29yayBjb3VsZCB1 c2UsIGFuZCB3ZSBtb3ZlIGl0IHRvIGEgY29yZS1lciBwbGFjZS4gSG93IGlzIHRoYXQKPiA+PiBk aWZmZXJlbnQ/Cj4gPgo+ID4gSW1vIGNvcmUgc2hhcmluZyBmb3IgY29kZSBzaGFyaW5nJ3Mgc2Fr ZSBpcyBvdmVycmF0ZWQuIElmIHdlIGFscmVhZHkKPiA+IGhhdmUgZHJtIGFuZCB2NGwgdGlnaHRs eSBpbnRlZ3JhdGVkIGFzIGEgY29tbXVuaXR5LCB0aGVuIGNvZGUgc2hhcmluZwo+ID4gYmVjb21l cyBhIGxvdCBlYXNpZXIsIGFuZCBhIGxvdCBtb3JlIHJlYXNvbmFibGUgdG8gZG8uCj4gCj4gQXQg bGVhc3QgTGF1cmVudCwgQm9yaXMsIEV6ZXF1aWVsLCBHdXN0YXZvIGFuZCBJIGhhdmUgYmVlbiB3 b3JraW5nIG9uCj4gdjRsMiwgc28gSSdtIG5vdCBzdXJlIGhvdyBub3QgaW50ZWdyYXRlZCB3ZSBh cmUuCgpMZXQncyBhbHNvIG1lbnRpb24gdGhhdCB3ZSdsbCBuZWVkIG1vcmUgY29kZSBzaGFyaW5n IGFzIHdlIG1vdmUgZm9yd2FyZC4KV2UgYWxyZWFkeSBoYXZlIGNoaXBzIHRoYXQgaGF2ZSB0d28g ZHJpdmVycywgb25lIGluIFY0TDIgYW5kIG9uZSBpbiBEUk0KKEknbSB0aGlua2luZyBhYm91dCB0 aGUgYWR2NzUxMSBicmlkZ2UgZHJpdmVyIGZvciBpbnN0YW5jZSkuIEkga25vdyBTb0MKdmVuZG9y cyB0aGF0IGFyZSBub3QgaGFwcHkgYWJvdXQgdGhpcyBzdGF0ZSBvZiB0aGluZ3MgYXMgdGhleSBo YXZlIElQCmNvcmVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCBjYW1lcmEgYW5kIGRpc3BsYXkg cGlwZWxpbmVzLiBJdCdzIGEgbG9uZwpzdGFuZGluZyBpc3N1ZSwgaXQgd29uJ3QgYmUgc29sdmUg dG9kYXksIGJ1dCB3ZSdsbCBuZWVkIHRvIGdldCB0byBpdApldmVudHVhbGx5LiBTaGFyaW5nIGEg NENDIGxpYnJhcnkgd291bGQgYmUgYSBncmVhdCBzdGVwIGZvcndhcmQgaW4gbXkKb3Bpbmlvbiwg aW4gb3JkZXIgdG8gZ2V0IHRoZSB0d28gc3Vic3lzdGVtcyB0byBjb2xsYWJvcmF0ZSBiZXR0ZXIu Cgo+ID4gUGx1cyB3ZSBjYW4gdGhlbiBqdXN0IHN0dWZmIGNvZGUgaW50IGRyaXZlcnMvZ3B1IG9y IGRyaXZlcnMvdmlkZW8KPiA+IChvciBtZXJnZSB0aGVzZSB0d28gYmVjYXVzZSByZWFsbHkgaXQn cyBhbGwgdGhlIHNhbWUpLiBCdXQgbXkKPiA+IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpbnRlZ3Jh dGluZyBtb3JlIHRpZ2h0bHkgd2l0aCB0aGUgZHJtIGZvbGtzIGlzCj4gPiBhIHZlcnkgY29udHJl dmVyc2lhbCB0b3BpYyBpbiB2NGwKPiAKPiBTbywgSSBzZW50IHRoZSBSRkMgZXhwZWN0aW5nIHRo YXQga2luZCBvZiBmZWVkYmFjay4KPiAKPiBIYW5zIHJlcGxpZWQgbWFpbmx5IHRvIHRoYXQgcGF0 Y2ggaHR0cHM6Ly9wYXRjaHdvcmsuZnJlZWRlc2t0b3Aub3JnL3BhdGNoLzI5MzA0My8KPiAKPiAi Cj4gSWYgd2UgYXJlIGNyZWF0aW5nIGEgY29tbW9uIGxpYnJhcnkgdGhlbiBJIHRoaW5rIHdlIHNo b3VsZCBjaGFuZ2UgdGhhdCBydWxlCj4gdG86ICJ1bmxlc3MgdGhleSBhcmUgaW4gdXNlIGJ5IGEg RFJNIG9yIFY0TDIgZHJpdmVyIi4gQW5kIHdoZW4gbmV3IGZvcm1hdHMgYXJlCj4gYWRkZWQsIGFu ZCB0aGV5IGV4aXN0cyBhbHJlYWR5IGZvciBEUk0gb3IgVjRMMiwgdGhlbiB3ZSBzaG91bGQgdXNl IHRoZSBzYW1lCj4gZm91cmNjIGZvciB0aGUgb3RoZXIgc3Vic3lzdGVtLgo+IAo+IEkuZS4gaWYg cGl4ZWxmb3JtYXQgVjRMMl9QSVhfRk1UX0ZPTyB3YXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIGFk ZCBhOgo+IAo+ICNkZWZpbmUgRFJNX0ZPUk1BVF9GT08gVjRMMl9QSVhfRk1UX0ZPTwo+IAo+IHJh dGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGZvdXJjYy4KCkkgd291bGQgbGlrZSB0byBwb2ludCBv dXQgaGVyZSB0aGF0IHdlIGhhdmUgdHdvIGRpZmZlcmVudCBpdGVtcyB3ZSBjYWxsCjRDQywgdGhl IG1hY3JvIG5hbWUgKEZPTyBpbiB5b3VyIGV4YW1wbGUgaGVyZSksIGFuZCB0aGUgbnVtZXJpY2Fs IHZhbHVlLgpJZiBhIG51bWVyaWNhbCB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiBEUk0gb3IgVjRM MiBmb3IgYSBnaXZlbiBwaXhlbApmb3JtYXQsIGl0IHNob3VsZCBiZSB1c2VkLCBwZXJpb2QuIFRo ZSBtYWNybyBuYW1lLCBob3dldmVyLCBjb3VsZCBiZQpjaGFuZ2VkLCBhcyBtYW55IG9mIHRoZW0g Y2FycnkgaGlzdG9yaWNhbCBtaXN0YWtlcy4KCj4gV2UgY291bGQgZXZlbiBzdGFydCBsb29raW5n IGF0IHJlZG9pbmcgdGhlIHdob2xlIHNjaGVtZSBpbiBhIHVuaWZpZWQgd2F5LCBidXQKPiB0aGF0 J3Mgc29tZXRoaW5nIGZvciB0aGUgKGZhcikgZnV0dXJlLgo+IAo+IFRoaXMgaXMgYWxyZWFkeSBh IGJpZyBzdGVwIGZvcndhcmQuCj4gIgo+IAo+IFNvLCBub3QgY29udHJvdmVyc2lhbCBhdCBhbGwu Cj4gCj4gPiBhbmQgdW50aWwgdGhhdCdzIHJlc29sdmVkIEkgZG9uJ3Qgc2VlIGEgaHVnZSBuZWVk IG9yIGJlbmVmaXQgaW4KPiA+IHNoYXJpbmcgdG9ucyBvZiBjb2RlLgo+IAo+IFRoYXQncyBtb3N0 bHkgdG9ucyBvZiBkYXRhIHRob3VnaC4gVGhlIGNvZGUgaXMgcHJldHR5IHNtYWxsIGFuZAo+IHRy aXZpYWwuCj4gCj4gPiBBbmQgdGhlIGZvcm1hdCBzdHVmZiBpcyBhIGxvdCBtb3JlIGNlbnRyYWwg dG8ga21zIHRoYW4gZS5nLiB0aGUKPiA+IGluZm9mcmFtZSBoZWxwZXJzLgo+ID4KPiA+IEF1IGNv bnRyYWlyZSwgSSB0aGluayBmb3JjaW5nIHRoaXMgaGFzIGEgbG90IG9mIHBvdGVudGlhbCBmb3IK PiA+IG5lZWRsZXNzIGZpZ2h0cyBiZXR3ZWVuIGRybSBhbmQgdjRsLgo+IAo+IFdlJ3JlIGFsbCBy ZWFzb25hYmxlLCBzbyBJJ20gbm90IHN1cmUgd2h5IHdlIHdvdWxkIG5lZWQgdG8gZmlnaHQgaGVy ZS4KPiAKPiA+IEhlbmNlIG15IHN1Z2dlc3Rpb24gdG8gdHJ5IGEgbWluaW1hbCBmb3JtYXQgY29u dmVyc2lvbiBsaWJyYXJ5Cj4gPiBiZXR3ZWVuIHRoZSBkcm0gZm9ybWF0IHdvcmxkIGFuZCB0aGUg djRsIGZvcm1hdCB3b2xyZCwgYW5kIHNlZSBob3cKPiA+IHRoYXQgZ29lcy4gVGhhdCBjb250YWlu cyBhIGxvdCBsZXNzIHJpc2sgdGhhbiBnb2luZyBhbGwgaW4gcmlnaHQKPiA+IGZyb20gdGhlIHN0 YXJ0Lgo+IAo+IEFuZCBpdCdzIHJlYWxseSBub3QgYWJvdXQgZ2V0dGluZyBhY2Nlc3MgdG8gdGhl IERSTSBmb3VyY2MuIEl0J3MgYWJvdXQKPiBnZXR0aW5nIGFjY2VzcyB0byBEUk0ncyBmb3JtYXQg ZGVzY3JpcHRpb24sIHNvIEknbSBub3QgcmVhbGx5IHN1cmUKPiB3aGF0IHRoZXJlIGlzIHRvIGNv bnZlcnQsIHdlIGp1c3Qgd2FudCBhIGxvb2t1cC4KCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5j aGFydApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmkt ZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=