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=-6.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_PASS,URIBL_BLOCKED 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 EBC61C43387 for ; Tue, 18 Dec 2018 07:39:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BA236214C6 for ; Tue, 18 Dec 2018 07:39:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Fy3TkuKT" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726370AbeLRHjw (ORCPT ); Tue, 18 Dec 2018 02:39:52 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:33222 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726346AbeLRHjw (ORCPT ); Tue, 18 Dec 2018 02:39:52 -0500 Received: from avalon.localnet (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2D74553A; Tue, 18 Dec 2018 08:39:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1545118789; bh=4Q4wZ4X6y1NmHhb0q6L3P1+ro0uP5EBl6elh7bEaOwM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fy3TkuKTdeAhWxpSKlm5UE4g2YFs24EzKQ6EP+a1qsNLLlbZQiwNxY+nIL1sayzHn sZ0dsJm4a3cyHteYhOym9jhcPTt29Qqi+fv11mwl92kOYDK3iAjmWqoeBkiwgzJsb/ SonZ/mpVEok2drE3m0RTL0w9Po4HU2K4J9QGUPHY= From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Cc: Kieran Bingham , Laurent Pinchart , linux-renesas-soc@vger.kernel.org, Daniel Vetter , Liviu Dudau Subject: Re: [PATCH/RFC 0/2] R-Car DU: Support importing non-contiguous dma-buf with VSP Date: Tue, 18 Dec 2018 09:40:40 +0200 Message-ID: <1982141.kWhUBg2rcG@avalon> Organization: Ideas on Board Oy In-Reply-To: References: <20171113103228.23312-1-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org Hi Kieran, On Monday, 13 November 2017 15:48:19 EET Kieran Bingham wrote: > On 13/11/17 10:32, Laurent Pinchart wrote: > > Hello everybody, > > > > This patch series fixes two issues related to dma-buf import for the > > Renesas R-Car DU when the imported buffer is either not physically > > contiguous or located in high memory. > > > > Both cases require the use of an IOMMU to remap the buffers contiguously > > and in 32-bit DMA space. On Gen2 platforms this is transparent and works > > already, but on Gen3 platforms the situation is more complex. > > > > The Gen3 DU doesn't perform DMA access directly but instead goes through a > > VSP IP core that acts as an external composer. When importing a dma-buf > > buffer the GEM PRIME helper drm_gem_prime_import() maps the buffer to the > > DU device, and the DU driver later remaps it to the VSP device. The > > driver unfortunately can't use the drm_gem_prime_import_dev() helper to > > map th buffer to the VSP device directly, as at import time we don't know > > yet to which VSP device the buffer will need to be mapped (there is one > > VSP composer per CRTC). Mapping the buffer to the VSP can thus only be > > done when pinning the framebuffer, as we know at that time which plane > > and CRTC it will be used with. > > > > This works currently (with the caveat that an unneeded mapping to the DU > > is created), but fails when the imported buffer is not physically > > contiguous or is located in high memory. In the first case the GEM CMA > > helper drm_gem_cma_prime_import_sg_table() will reject the buffer as it > > hasn't been mapped contiguously in the DU DMA address space (because the > > DU has no IOMMU), and in the second case the DMA mapping API will try to > > allocate a bounce buffer and fail due to bounce buffer memory exhaustion. > > > > The first patch in this series fixes the second issue by setting the DMA > > coherent mask of the DU device to the full 40 bits address space. All > > memory will thus be accepted without trying to allocate a bounce buffer. > > > > The second patch in this series fixes the first issue by using an internal > > copy of the drm_gem_cma_prime_import_sg_table() function that doesn't > > ensure that the buffer is contiguous in memory. This is what caused me to > > post this series as an RFC, as I'm not very happy with duplication of > > helper code in the driver that could lead to breakages when the GEM CMA > > helpers are modified. If this approach is accepted, I would prefer > > implementing the code in the GEM CMA helpers. > > > > Another point that bothers me is that buffers can now be imported > > unconditionally on Gen3 platforms, but atomic commits will fail if the > > buffer can't be remapped through the VSP (for instance if no IOMMU is > > available). Given the hardware architecture and the DRM/KMS API I don't > > really see a way around this. > > > > Testing this series isn't easy as it requires getting hold of exported > > dma-bufs located in high memory or not physically contiguous. I have used > > the V4L2 vivid driver as an exporter for that purpose, with a few hacks > > that can be found at > > > > git://linuxtv.org/pinchartl/media.git drm/du/devel/iommu > > Ok - testing from this branch with "drm: rcar-du: Allow importing > non-contiguous dma-buf with VSP" applied on top (it appeared to be missing) > > > On the userspace side I have used the v4l2-drm-example test application > > available at > > > > git://git.infradead.org/users/kmpark/public-apps > > > > and run with > > > > dmabuf-sharing -M rcar-du -i /dev/video0 -S 640,480 -f YUYV -F YUYV \ > > > > -s 640,480@0,0 -t 640,480@0,0 -o 70:68:640x480 -b 4 -e v4l2 > > > > (the -o argument needs to be modified based on the connector and CRTC ID). > > I've build dmabuf-sharing from kmpark/public-apps/v4l2-drm-example, but it > doesn't appear to have a "-e v4l2" option (not listed in the -h, and > complains with "ERROR(dmabuf-sharing.c:560) : failed to parse arguments") > > Have you also modified this application to run your tests? Oops, yes, I have. Sorry for not mentioning that. The modified version can be found at git://git.ideasonboard.org/samsung-utils.git > If it's easier, I can look at the screen while you run the test under your > control as well. > > > Up to patch "[DEBUG] v4l: videobuf2-dma-contig: Print allocated buffer > > address" buffer sharing should work. Patch "[HACK] vivid: Allocate buffers > > from high memory" then breaks buffer import, and the issue is fixed by > > patch "drm: rcar-du: Set the DMA coherent mask for the DU device". Patch > > "[HACK] vivid: Use vmalloc allocator" breaks buffer import again, and is > > fixed by "drm: rcar-du: Allow importing non-contiguous dma-buf with VSP". > > > > Kieran, I have tested this remotely on your Salvator-X H3 ES1.1 and > > haven't noticed any problem, but couldn't check the output on the screen. > > Would you be able to rerun the test locally for me ? Please note that the > > IPMMU is known to have issues on H3 ES1.1, so you might need to test the > > code on H3 ES2.0 instead. > > > > Laurent Pinchart (2): > > drm: rcar-du: Set the DMA coherent mask for the DU device > > drm: rcar-du: Allow importing non-contiguous dma-buf with VSP > > > > drivers/gpu/drm/rcar-du/rcar_du_drv.c | 13 +++++++++++- > > drivers/gpu/drm/rcar-du/rcar_du_kms.c | 39 ++++++++++++++++++++++++++++++ > > drivers/gpu/drm/rcar-du/rcar_du_kms.h | 7 +++++++ > > 3 files changed, 58 insertions(+), 1 deletion(-) -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH/RFC 0/2] R-Car DU: Support importing non-contiguous dma-buf with VSP Date: Tue, 18 Dec 2018 09:40:40 +0200 Message-ID: <1982141.kWhUBg2rcG@avalon> References: <20171113103228.23312-1-laurent.pinchart+renesas@ideasonboard.com> 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 169C56E865 for ; Tue, 18 Dec 2018 07:39:51 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: linux-renesas-soc@vger.kernel.org, Daniel Vetter , Laurent Pinchart , Liviu Dudau , Kieran Bingham List-Id: dri-devel@lists.freedesktop.org SGkgS2llcmFuLAoKT24gTW9uZGF5LCAxMyBOb3ZlbWJlciAyMDE3IDE1OjQ4OjE5IEVFVCBLaWVy YW4gQmluZ2hhbSB3cm90ZToKPiBPbiAxMy8xMS8xNyAxMDozMiwgTGF1cmVudCBQaW5jaGFydCB3 cm90ZToKPiA+IEhlbGxvIGV2ZXJ5Ym9keSwKPiA+IAo+ID4gVGhpcyBwYXRjaCBzZXJpZXMgZml4 ZXMgdHdvIGlzc3VlcyByZWxhdGVkIHRvIGRtYS1idWYgaW1wb3J0IGZvciB0aGUKPiA+IFJlbmVz YXMgUi1DYXIgRFUgd2hlbiB0aGUgaW1wb3J0ZWQgYnVmZmVyIGlzIGVpdGhlciBub3QgcGh5c2lj YWxseQo+ID4gY29udGlndW91cyBvciBsb2NhdGVkIGluIGhpZ2ggbWVtb3J5Lgo+ID4gCj4gPiBC b3RoIGNhc2VzIHJlcXVpcmUgdGhlIHVzZSBvZiBhbiBJT01NVSB0byByZW1hcCB0aGUgYnVmZmVy cyBjb250aWd1b3VzbHkKPiA+IGFuZCBpbiAzMi1iaXQgRE1BIHNwYWNlLiBPbiBHZW4yIHBsYXRm b3JtcyB0aGlzIGlzIHRyYW5zcGFyZW50IGFuZCB3b3Jrcwo+ID4gYWxyZWFkeSwgYnV0IG9uIEdl bjMgcGxhdGZvcm1zIHRoZSBzaXR1YXRpb24gaXMgbW9yZSBjb21wbGV4Lgo+ID4gCj4gPiBUaGUg R2VuMyBEVSBkb2Vzbid0IHBlcmZvcm0gRE1BIGFjY2VzcyBkaXJlY3RseSBidXQgaW5zdGVhZCBn b2VzIHRocm91Z2ggYQo+ID4gVlNQIElQIGNvcmUgdGhhdCBhY3RzIGFzIGFuIGV4dGVybmFsIGNv bXBvc2VyLiBXaGVuIGltcG9ydGluZyBhIGRtYS1idWYKPiA+IGJ1ZmZlciB0aGUgR0VNIFBSSU1F IGhlbHBlciBkcm1fZ2VtX3ByaW1lX2ltcG9ydCgpIG1hcHMgdGhlIGJ1ZmZlciB0byB0aGUKPiA+ IERVIGRldmljZSwgYW5kIHRoZSBEVSBkcml2ZXIgbGF0ZXIgcmVtYXBzIGl0IHRvIHRoZSBWU1Ag ZGV2aWNlLiBUaGUKPiA+IGRyaXZlciB1bmZvcnR1bmF0ZWx5IGNhbid0IHVzZSB0aGUgZHJtX2dl bV9wcmltZV9pbXBvcnRfZGV2KCkgaGVscGVyIHRvCj4gPiBtYXAgdGggYnVmZmVyIHRvIHRoZSBW U1AgZGV2aWNlIGRpcmVjdGx5LCBhcyBhdCBpbXBvcnQgdGltZSB3ZSBkb24ndCBrbm93Cj4gPiB5 ZXQgdG8gd2hpY2ggVlNQIGRldmljZSB0aGUgYnVmZmVyIHdpbGwgbmVlZCB0byBiZSBtYXBwZWQg KHRoZXJlIGlzIG9uZQo+ID4gVlNQIGNvbXBvc2VyIHBlciBDUlRDKS4gTWFwcGluZyB0aGUgYnVm ZmVyIHRvIHRoZSBWU1AgY2FuIHRodXMgb25seSBiZQo+ID4gZG9uZSB3aGVuIHBpbm5pbmcgdGhl IGZyYW1lYnVmZmVyLCBhcyB3ZSBrbm93IGF0IHRoYXQgdGltZSB3aGljaCBwbGFuZQo+ID4gYW5k IENSVEMgaXQgd2lsbCBiZSB1c2VkIHdpdGguCj4gPiAKPiA+IFRoaXMgd29ya3MgY3VycmVudGx5 ICh3aXRoIHRoZSBjYXZlYXQgdGhhdCBhbiB1bm5lZWRlZCBtYXBwaW5nIHRvIHRoZSBEVQo+ID4g aXMgY3JlYXRlZCksIGJ1dCBmYWlscyB3aGVuIHRoZSBpbXBvcnRlZCBidWZmZXIgaXMgbm90IHBo eXNpY2FsbHkKPiA+IGNvbnRpZ3VvdXMgb3IgaXMgbG9jYXRlZCBpbiBoaWdoIG1lbW9yeS4gSW4g dGhlIGZpcnN0IGNhc2UgdGhlIEdFTSBDTUEKPiA+IGhlbHBlciBkcm1fZ2VtX2NtYV9wcmltZV9p bXBvcnRfc2dfdGFibGUoKSB3aWxsIHJlamVjdCB0aGUgYnVmZmVyIGFzIGl0Cj4gPiBoYXNuJ3Qg YmVlbiBtYXBwZWQgY29udGlndW91c2x5IGluIHRoZSBEVSBETUEgYWRkcmVzcyBzcGFjZSAoYmVj YXVzZSB0aGUKPiA+IERVIGhhcyBubyBJT01NVSksIGFuZCBpbiB0aGUgc2Vjb25kIGNhc2UgdGhl IERNQSBtYXBwaW5nIEFQSSB3aWxsIHRyeSB0bwo+ID4gYWxsb2NhdGUgYSBib3VuY2UgYnVmZmVy IGFuZCBmYWlsIGR1ZSB0byBib3VuY2UgYnVmZmVyIG1lbW9yeSBleGhhdXN0aW9uLgo+ID4gCj4g PiBUaGUgZmlyc3QgcGF0Y2ggaW4gdGhpcyBzZXJpZXMgZml4ZXMgdGhlIHNlY29uZCBpc3N1ZSBi eSBzZXR0aW5nIHRoZSBETUEKPiA+IGNvaGVyZW50IG1hc2sgb2YgdGhlIERVIGRldmljZSB0byB0 aGUgZnVsbCA0MCBiaXRzIGFkZHJlc3Mgc3BhY2UuIEFsbAo+ID4gbWVtb3J5IHdpbGwgdGh1cyBi ZSBhY2NlcHRlZCB3aXRob3V0IHRyeWluZyB0byBhbGxvY2F0ZSBhIGJvdW5jZSBidWZmZXIuCj4g PiAKPiA+IFRoZSBzZWNvbmQgcGF0Y2ggaW4gdGhpcyBzZXJpZXMgZml4ZXMgdGhlIGZpcnN0IGlz c3VlIGJ5IHVzaW5nIGFuIGludGVybmFsCj4gPiBjb3B5IG9mIHRoZSBkcm1fZ2VtX2NtYV9wcmlt ZV9pbXBvcnRfc2dfdGFibGUoKSBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QKPiA+IGVuc3VyZSB0aGF0 IHRoZSBidWZmZXIgaXMgY29udGlndW91cyBpbiBtZW1vcnkuIFRoaXMgaXMgd2hhdCBjYXVzZWQg bWUgdG8KPiA+IHBvc3QgdGhpcyBzZXJpZXMgYXMgYW4gUkZDLCBhcyBJJ20gbm90IHZlcnkgaGFw cHkgd2l0aCBkdXBsaWNhdGlvbiBvZgo+ID4gaGVscGVyIGNvZGUgaW4gdGhlIGRyaXZlciB0aGF0 IGNvdWxkIGxlYWQgdG8gYnJlYWthZ2VzIHdoZW4gdGhlIEdFTSBDTUEKPiA+IGhlbHBlcnMgYXJl IG1vZGlmaWVkLiBJZiB0aGlzIGFwcHJvYWNoIGlzIGFjY2VwdGVkLCBJIHdvdWxkIHByZWZlcgo+ ID4gaW1wbGVtZW50aW5nIHRoZSBjb2RlIGluIHRoZSBHRU0gQ01BIGhlbHBlcnMuCj4gPiAKPiA+ IEFub3RoZXIgcG9pbnQgdGhhdCBib3RoZXJzIG1lIGlzIHRoYXQgYnVmZmVycyBjYW4gbm93IGJl IGltcG9ydGVkCj4gPiB1bmNvbmRpdGlvbmFsbHkgb24gR2VuMyBwbGF0Zm9ybXMsIGJ1dCBhdG9t aWMgY29tbWl0cyB3aWxsIGZhaWwgaWYgdGhlCj4gPiBidWZmZXIgY2FuJ3QgYmUgcmVtYXBwZWQg dGhyb3VnaCB0aGUgVlNQIChmb3IgaW5zdGFuY2UgaWYgbm8gSU9NTVUgaXMKPiA+IGF2YWlsYWJs ZSkuIEdpdmVuIHRoZSBoYXJkd2FyZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBEUk0vS01TIEFQSSBJ IGRvbid0Cj4gPiByZWFsbHkgc2VlIGEgd2F5IGFyb3VuZCB0aGlzLgo+ID4gCj4gPiBUZXN0aW5n IHRoaXMgc2VyaWVzIGlzbid0IGVhc3kgYXMgaXQgcmVxdWlyZXMgZ2V0dGluZyBob2xkIG9mIGV4 cG9ydGVkCj4gPiBkbWEtYnVmcyBsb2NhdGVkIGluIGhpZ2ggbWVtb3J5IG9yIG5vdCBwaHlzaWNh bGx5IGNvbnRpZ3VvdXMuIEkgaGF2ZSB1c2VkCj4gPiB0aGUgVjRMMiB2aXZpZCBkcml2ZXIgYXMg YW4gZXhwb3J0ZXIgZm9yIHRoYXQgcHVycG9zZSwgd2l0aCBhIGZldyBoYWNrcwo+ID4gdGhhdCBj YW4gYmUgZm91bmQgYXQKPiA+IAo+ID4gCWdpdDovL2xpbnV4dHYub3JnL3BpbmNoYXJ0bC9tZWRp YS5naXQgZHJtL2R1L2RldmVsL2lvbW11Cj4gCj4gT2sgLSB0ZXN0aW5nIGZyb20gdGhpcyBicmFu Y2ggd2l0aCAiZHJtOiByY2FyLWR1OiBBbGxvdyBpbXBvcnRpbmcKPiBub24tY29udGlndW91cyBk bWEtYnVmIHdpdGggVlNQIiBhcHBsaWVkIG9uIHRvcCAoaXQgYXBwZWFyZWQgdG8gYmUgbWlzc2lu ZykKPiAKPiA+IE9uIHRoZSB1c2Vyc3BhY2Ugc2lkZSBJIGhhdmUgdXNlZCB0aGUgdjRsMi1kcm0t ZXhhbXBsZSB0ZXN0IGFwcGxpY2F0aW9uCj4gPiBhdmFpbGFibGUgYXQKPiA+IAo+ID4gCWdpdDov L2dpdC5pbmZyYWRlYWQub3JnL3VzZXJzL2ttcGFyay9wdWJsaWMtYXBwcwo+ID4gCj4gPiBhbmQg cnVuIHdpdGgKPiA+IAo+ID4gZG1hYnVmLXNoYXJpbmcgLU0gcmNhci1kdSAtaSAvZGV2L3ZpZGVv MCAtUyA2NDAsNDgwIC1mIFlVWVYgLUYgWVVZViBcCj4gPiAKPiA+IAktcyA2NDAsNDgwQDAsMCAt dCA2NDAsNDgwQDAsMCAtbyA3MDo2ODo2NDB4NDgwIC1iIDQgLWUgdjRsMgo+ID4gCj4gPiAodGhl IC1vIGFyZ3VtZW50IG5lZWRzIHRvIGJlIG1vZGlmaWVkIGJhc2VkIG9uIHRoZSBjb25uZWN0b3Ig YW5kIENSVEMgSUQpLgo+IAo+IEkndmUgYnVpbGQgZG1hYnVmLXNoYXJpbmcgZnJvbSBrbXBhcmsv cHVibGljLWFwcHMvdjRsMi1kcm0tZXhhbXBsZSwgYnV0IGl0Cj4gZG9lc24ndCBhcHBlYXIgdG8g aGF2ZSBhICItZSB2NGwyIiBvcHRpb24gKG5vdCBsaXN0ZWQgaW4gdGhlIC1oLCBhbmQKPiBjb21w bGFpbnMgd2l0aCAiRVJST1IoZG1hYnVmLXNoYXJpbmcuYzo1NjApIDogZmFpbGVkIHRvIHBhcnNl IGFyZ3VtZW50cyIpCj4gCj4gSGF2ZSB5b3UgYWxzbyBtb2RpZmllZCB0aGlzIGFwcGxpY2F0aW9u IHRvIHJ1biB5b3VyIHRlc3RzPwoKT29wcywgeWVzLCBJIGhhdmUuIFNvcnJ5IGZvciBub3QgbWVu dGlvbmluZyB0aGF0LiBUaGUgbW9kaWZpZWQgdmVyc2lvbiBjYW4gYmUgCmZvdW5kIGF0CgoJZ2l0 Oi8vZ2l0LmlkZWFzb25ib2FyZC5vcmcvc2Ftc3VuZy11dGlscy5naXQKCj4gSWYgaXQncyBlYXNp ZXIsIEkgY2FuIGxvb2sgYXQgdGhlIHNjcmVlbiB3aGlsZSB5b3UgcnVuIHRoZSB0ZXN0IHVuZGVy IHlvdXIKPiBjb250cm9sIGFzIHdlbGwuCj4gCj4gPiBVcCB0byBwYXRjaCAiW0RFQlVHXSB2NGw6 IHZpZGVvYnVmMi1kbWEtY29udGlnOiBQcmludCBhbGxvY2F0ZWQgYnVmZmVyCj4gPiBhZGRyZXNz IiBidWZmZXIgc2hhcmluZyBzaG91bGQgd29yay4gUGF0Y2ggIltIQUNLXSB2aXZpZDogQWxsb2Nh dGUgYnVmZmVycwo+ID4gZnJvbSBoaWdoIG1lbW9yeSIgdGhlbiBicmVha3MgYnVmZmVyIGltcG9y dCwgYW5kIHRoZSBpc3N1ZSBpcyBmaXhlZCBieQo+ID4gcGF0Y2ggImRybTogcmNhci1kdTogU2V0 IHRoZSBETUEgY29oZXJlbnQgbWFzayBmb3IgdGhlIERVIGRldmljZSIuIFBhdGNoCj4gPiAiW0hB Q0tdIHZpdmlkOiBVc2Ugdm1hbGxvYyBhbGxvY2F0b3IiIGJyZWFrcyBidWZmZXIgaW1wb3J0IGFn YWluLCBhbmQgaXMKPiA+IGZpeGVkIGJ5ICJkcm06IHJjYXItZHU6IEFsbG93IGltcG9ydGluZyBu b24tY29udGlndW91cyBkbWEtYnVmIHdpdGggVlNQIi4KPiA+IAo+ID4gS2llcmFuLCBJIGhhdmUg dGVzdGVkIHRoaXMgcmVtb3RlbHkgb24geW91ciBTYWx2YXRvci1YIEgzIEVTMS4xIGFuZAo+ID4g aGF2ZW4ndCBub3RpY2VkIGFueSBwcm9ibGVtLCBidXQgY291bGRuJ3QgY2hlY2sgdGhlIG91dHB1 dCBvbiB0aGUgc2NyZWVuLgo+ID4gV291bGQgeW91IGJlIGFibGUgdG8gcmVydW4gdGhlIHRlc3Qg bG9jYWxseSBmb3IgbWUgPyBQbGVhc2Ugbm90ZSB0aGF0IHRoZQo+ID4gSVBNTVUgaXMga25vd24g dG8gaGF2ZSBpc3N1ZXMgb24gSDMgRVMxLjEsIHNvIHlvdSBtaWdodCBuZWVkIHRvIHRlc3QgdGhl Cj4gPiBjb2RlIG9uIEgzIEVTMi4wIGluc3RlYWQuCj4gPiAKPiA+IExhdXJlbnQgUGluY2hhcnQg KDIpOgo+ID4gICBkcm06IHJjYXItZHU6IFNldCB0aGUgRE1BIGNvaGVyZW50IG1hc2sgZm9yIHRo ZSBEVSBkZXZpY2UKPiA+ICAgZHJtOiByY2FyLWR1OiBBbGxvdyBpbXBvcnRpbmcgbm9uLWNvbnRp Z3VvdXMgZG1hLWJ1ZiB3aXRoIFZTUAo+ID4gIAo+ID4gIGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1 L3JjYXJfZHVfZHJ2LmMgfCAxMyArKysrKysrKysrKy0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vcmNh ci1kdS9yY2FyX2R1X2ttcy5jIHwgMzkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g PiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9rbXMuaCB8ICA3ICsrKysrKysKPiA+ ICAzIGZpbGVzIGNoYW5nZWQsIDU4IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCi0tIApS ZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWwK