From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Osipenko Subject: Re: [PATCH v3 2/2] drm/tegra: output: rgb: Support LVDS encoder bridge Date: Fri, 17 Apr 2020 01:22:57 +0300 Message-ID: <481f003b-78d2-51b4-ce7a-b917abea8ac7@gmail.com> References: <20200416172405.5051-1-digetx@gmail.com> <20200416172405.5051-3-digetx@gmail.com> <20200416174112.GS4796@pendragon.ideasonboard.com> <6275bcd3-c0b2-4c1c-1817-9e713d3747c7@gmail.com> <7cf27640-4fdc-8617-01cb-85f4c5847bb8@gmail.com> <20200416205012.GA28162@pendragon.ideasonboard.com> <20200416213919.GB28162@pendragon.ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20200416213919.GB28162-N3hz7ZxfLydczECFQUw77jytWr6r+dGw0E9HWUfgJXw@public.gmane.org> Content-Language: en-US Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Laurent Pinchart Cc: Thierry Reding , Sam Ravnborg , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-tegra@vger.kernel.org 17.04.2020 00:39, Laurent Pinchart пишет: > Hi Dmitry, > > On Fri, Apr 17, 2020 at 12:15:33AM +0300, Dmitry Osipenko wrote: >> 16.04.2020 23:50, Laurent Pinchart пишет: >>> On Thu, Apr 16, 2020 at 11:21:40PM +0300, Dmitry Osipenko wrote: >>>> 16.04.2020 21:52, Dmitry Osipenko пишет: >>>> ... >>>>>> May I also recommend switching to the DRM panel bridge helper ? It will >>>>>> simplify the code. >>>>> >>>>> Could you please clarify what is the "DRM panel bridge helper"? >>>>> >>>>> I think we won't need any additional helpers after switching to the >>>>> bridge connector helper, no? >>>> >>>> Actually, I now see that the panel needs to be manually attached to the >>>> connector. >>> >>> The DRM panel bridge helper creates a bridge from a panel (with >>> devm_drm_panel_bridge_add()). You can then attach that bridge to the >>> chain, like any other bridge, and the enable/disable operations will be >>> called automatically without any need to call the panel enable/disable >>> manually as done currently. >>> >>>> Still it's not apparent to me how to get panel out of the bridge. It >>>> looks like there is no such "panel helper" for the bridge API or I just >>>> can't find it. >>> >>> You don't need to get a panel out of the bridge. You should get the >>> bridge as done today, >> >> You mean "get the panel", correct? > > Yes, sorry. > >>> and wrap it in a bridge with >>> devm_drm_panel_bridge_add(). >>> >> >> The lvds-codec already wraps panel into the bridge using >> devm_drm_panel_bridge_add() and chains it for us, please see >> lvds_codec_probe() / lvds_codec_attach(). >> >> Does it mean that lvds-codec is not supporting the new model? > > No, that *is* the new model :-) As I think I've commented during review, > when you have an LVDS encoder and a panel, you don't need to handle the > panel at all. When you have an RGB panel connected directly to the RGB > output, you need to wrap it in a bridge, exactly the same way as > lvds-codec does for its panel. > >> Everything works nicely using the old model, where bridge creates >> connector and attaches panel to it for us. >> >> [I'm still not sure what is the point to use the new model in a case of >> a simple chain of bridges] >> >> Using the new model, the connector isn't created by the bridge, so I >> need to duplicate that creation effort in the driver. Once the bridge >> connector is manually created, I need to attach panel to this connector, >> but panel is reachable only via the remote bridge (which wraps the panel). >> >> driver connector -> LVDS bridge -> panel bridge -> panel > > With the new model, > > 1. The display driver and the bridge drivers need to get hold of the > bridge directly connected to their output (for instance with > of_drm_find_panel()). If the output is connected to a panel, they > need to wrap that panel in a bridge (with > devm_drm_panel_bridge_add()). I plan, in the future, to make creation > of panel bridges automatic, so drivers won't have to care. > > 2. The display driver needs to create a dummy drm_encoder for each of > its outputs (for instance with drm_simple_encoder_init()). > > 3. The display driver needs to create a drm_connector for each of its > outputs, and implement connector operations by delegating them to the > bridges in the pipeline. Unless there's a good reason not to do so, > this should be done with drm_bridge_connector_init(). > > That's it. Every driver then focusses on its own needs, bridge drivers > handle only the device they're associated with, and the DRM core and DRM > bridge connector helper will handle all the rest. > Thank you very much for the clarification again! :) Now I realized what was the missing part.. in my case display panel is mounted upside-down and display output needs to be rotated by 180°. I have a local patch (hack) that adds orientation-property support to the panel-lvds driver and previously the panel's orientation was assigned to the connector using drm_panel_attach(), but now this attachment doesn't happen and I found that panel_lvds_get_modes() missed drm_connector_set_panel_orientation() in my patch. Everything is okay once the panel_lvds_get_modes() is corrected. I'll prepare the v4. 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=-1.8 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=no 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 AFD74C2BB85 for ; Fri, 17 Apr 2020 07:00:37 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 82418221E9 for ; Fri, 17 Apr 2020 07:00:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SOHaXPX5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 82418221E9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2F1A66E36F; Fri, 17 Apr 2020 06:59:49 +0000 (UTC) Received: from mail-lf1-x142.google.com (mail-lf1-x142.google.com [IPv6:2a00:1450:4864:20::142]) by gabe.freedesktop.org (Postfix) with ESMTPS id 23B2F6EB80 for ; Thu, 16 Apr 2020 22:23:01 +0000 (UTC) Received: by mail-lf1-x142.google.com with SMTP id j14so100999lfg.9 for ; Thu, 16 Apr 2020 15:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=4xY56Og7CtQVBrHOGKhkCb7oz9KM5IaKu7x+R3qPWt4=; b=SOHaXPX5VjkytmczvkPZvJNsViulqzWRt9GQZBqZcqNm3RUEX9oNOcywbg3Vm1VqkO qi+G3I5U06Ps8JxIEVDUDN49A+m/tgeF49zNtGBOvUAuLw/8DALMzj/dWbUJV2F3PlrW 6seuE77SOUzgUi105x/F12Apw+agK+TLX1tBfpd8uiU2ex5Z7FlHGn+ArwXjHBQJLXSo +oqz1a5aLyTP03PzRIHG5Ykm2dGM2H5be9onaQaO8S371DiTdWPDBvA2KQE9dtk21NWz d2f7kTyiM9ODfKTfv22vgJRsNYNlcdDZSMN0nu2zaFbEYK3I2RrkK0UGxJoWWW1fvIAu lLzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=4xY56Og7CtQVBrHOGKhkCb7oz9KM5IaKu7x+R3qPWt4=; b=c3iinuS0RYprn6pIlvOse1lF0d+3joiU66v/U7Bh24/PFtwyl+0Xx+KuspM/bPJC7M UnZt/CpAzrvoMthUl0HEm+lw1hqfcJmORuyzRDZeOTOnhcOWnqz3SlZT9OMC7bJ7Cbe6 +RpHcpQ8NTpLaFmN1OTgKWJ0tiy1uyefxJe1t9w/m2r3cljGPngHIw93U32ouBZlbo4R Q+vd71uZmIKb5VGvH7g4qd9NVgmKNYkoSlBWinJJEf4ucfPcc7jVikA6J2l2OWhSSqh/ 45ZhoE1b6Ag6Ywfw+Zz2WqVq3XUZzTuRbb97hQlid5qHGP4WS7uLZnKekXSbK6gGRtyW WH+g== X-Gm-Message-State: AGi0PubTPgas3/GaseUXTvWECBUIVI5n8WHuPowaiqTC6I/eGSkCjF/w WEVxDXD9USMzXNa9GMIzMYg= X-Google-Smtp-Source: APiQypKatJQozjLGbQ9+PS5rsH8YeHUguNUxb1chBgXi9ILl6zhND+1TjO2awm/Xst3u/m+wYqO1iQ== X-Received: by 2002:a19:ae06:: with SMTP id f6mr30773lfc.97.1587075779508; Thu, 16 Apr 2020 15:22:59 -0700 (PDT) Received: from [192.168.2.145] (ppp91-78-208-152.pppoe.mtu-net.ru. [91.78.208.152]) by smtp.googlemail.com with ESMTPSA id l7sm17170684lfg.79.2020.04.16.15.22.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Apr 2020 15:22:58 -0700 (PDT) Subject: Re: [PATCH v3 2/2] drm/tegra: output: rgb: Support LVDS encoder bridge To: Laurent Pinchart References: <20200416172405.5051-1-digetx@gmail.com> <20200416172405.5051-3-digetx@gmail.com> <20200416174112.GS4796@pendragon.ideasonboard.com> <6275bcd3-c0b2-4c1c-1817-9e713d3747c7@gmail.com> <7cf27640-4fdc-8617-01cb-85f4c5847bb8@gmail.com> <20200416205012.GA28162@pendragon.ideasonboard.com> <20200416213919.GB28162@pendragon.ideasonboard.com> From: Dmitry Osipenko Message-ID: <481f003b-78d2-51b4-ce7a-b917abea8ac7@gmail.com> Date: Fri, 17 Apr 2020 01:22:57 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200416213919.GB28162@pendragon.ideasonboard.com> Content-Language: en-US X-Mailman-Approved-At: Fri, 17 Apr 2020 06:59:46 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-tegra@vger.kernel.org, Thierry Reding , Sam Ravnborg , dri-devel@lists.freedesktop.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" MTcuMDQuMjAyMCAwMDozOSwgTGF1cmVudCBQaW5jaGFydCDQv9C40YjQtdGCOgo+IEhpIERtaXRy eSwKPiAKPiBPbiBGcmksIEFwciAxNywgMjAyMCBhdCAxMjoxNTozM0FNICswMzAwLCBEbWl0cnkg T3NpcGVua28gd3JvdGU6Cj4+IDE2LjA0LjIwMjAgMjM6NTAsIExhdXJlbnQgUGluY2hhcnQg0L/Q uNGI0LXRgjoKPj4+IE9uIFRodSwgQXByIDE2LCAyMDIwIGF0IDExOjIxOjQwUE0gKzAzMDAsIERt aXRyeSBPc2lwZW5rbyB3cm90ZToKPj4+PiAxNi4wNC4yMDIwIDIxOjUyLCBEbWl0cnkgT3NpcGVu a28g0L/QuNGI0LXRgjoKPj4+PiAuLi4KPj4+Pj4+IE1heSBJIGFsc28gcmVjb21tZW5kIHN3aXRj aGluZyB0byB0aGUgRFJNIHBhbmVsIGJyaWRnZSBoZWxwZXIgPyBJdCB3aWxsCj4+Pj4+PiBzaW1w bGlmeSB0aGUgY29kZS4KPj4+Pj4KPj4+Pj4gQ291bGQgeW91IHBsZWFzZSBjbGFyaWZ5IHdoYXQg aXMgdGhlICJEUk0gcGFuZWwgYnJpZGdlIGhlbHBlciI/Cj4+Pj4+Cj4+Pj4+IEkgdGhpbmsgd2Ug d29uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBoZWxwZXJzIGFmdGVyIHN3aXRjaGluZyB0byB0aGUK Pj4+Pj4gYnJpZGdlIGNvbm5lY3RvciBoZWxwZXIsIG5vPwo+Pj4+Cj4+Pj4gQWN0dWFsbHksIEkg bm93IHNlZSB0aGF0IHRoZSBwYW5lbCBuZWVkcyB0byBiZSBtYW51YWxseSBhdHRhY2hlZCB0byB0 aGUKPj4+PiBjb25uZWN0b3IuCj4+Pgo+Pj4gVGhlIERSTSBwYW5lbCBicmlkZ2UgaGVscGVyIGNy ZWF0ZXMgYSBicmlkZ2UgZnJvbSBhIHBhbmVsICh3aXRoCj4+PiBkZXZtX2RybV9wYW5lbF9icmlk Z2VfYWRkKCkpLiBZb3UgY2FuIHRoZW4gYXR0YWNoIHRoYXQgYnJpZGdlIHRvIHRoZQo+Pj4gY2hh aW4sIGxpa2UgYW55IG90aGVyIGJyaWRnZSwgYW5kIHRoZSBlbmFibGUvZGlzYWJsZSBvcGVyYXRp b25zIHdpbGwgYmUKPj4+IGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdpdGhvdXQgYW55IG5lZWQgdG8g Y2FsbCB0aGUgcGFuZWwgZW5hYmxlL2Rpc2FibGUKPj4+IG1hbnVhbGx5IGFzIGRvbmUgY3VycmVu dGx5Lgo+Pj4KPj4+PiBTdGlsbCBpdCdzIG5vdCBhcHBhcmVudCB0byBtZSBob3cgdG8gZ2V0IHBh bmVsIG91dCBvZiB0aGUgYnJpZGdlLiBJdAo+Pj4+IGxvb2tzIGxpa2UgdGhlcmUgaXMgbm8gc3Vj aCAicGFuZWwgaGVscGVyIiBmb3IgdGhlIGJyaWRnZSBBUEkgb3IgSSBqdXN0Cj4+Pj4gY2FuJ3Qg ZmluZCBpdC4KPj4+Cj4+PiBZb3UgZG9uJ3QgbmVlZCB0byBnZXQgYSBwYW5lbCBvdXQgb2YgdGhl IGJyaWRnZS4gWW91IHNob3VsZCBnZXQgdGhlCj4+PiBicmlkZ2UgYXMgZG9uZSB0b2RheSwKPj4K Pj4gWW91IG1lYW4gImdldCB0aGUgcGFuZWwiLCBjb3JyZWN0Pwo+IAo+IFllcywgc29ycnkuCj4g Cj4+PiBhbmQgd3JhcCBpdCBpbiBhIGJyaWRnZSB3aXRoCj4+PiBkZXZtX2RybV9wYW5lbF9icmlk Z2VfYWRkKCkuCj4+Pgo+Pgo+PiBUaGUgbHZkcy1jb2RlYyBhbHJlYWR5IHdyYXBzIHBhbmVsIGlu dG8gdGhlIGJyaWRnZSB1c2luZwo+PiBkZXZtX2RybV9wYW5lbF9icmlkZ2VfYWRkKCkgYW5kIGNo YWlucyBpdCBmb3IgdXMsIHBsZWFzZSBzZWUKPj4gbHZkc19jb2RlY19wcm9iZSgpIC8gbHZkc19j b2RlY19hdHRhY2goKS4KPj4KPj4gRG9lcyBpdCBtZWFuIHRoYXQgbHZkcy1jb2RlYyBpcyBub3Qg c3VwcG9ydGluZyB0aGUgbmV3IG1vZGVsPwo+IAo+IE5vLCB0aGF0ICppcyogdGhlIG5ldyBtb2Rl bCA6LSkgQXMgSSB0aGluayBJJ3ZlIGNvbW1lbnRlZCBkdXJpbmcgcmV2aWV3LAo+IHdoZW4geW91 IGhhdmUgYW4gTFZEUyBlbmNvZGVyIGFuZCBhIHBhbmVsLCB5b3UgZG9uJ3QgbmVlZCB0byBoYW5k bGUgdGhlCj4gcGFuZWwgYXQgYWxsLiBXaGVuIHlvdSBoYXZlIGFuIFJHQiBwYW5lbCBjb25uZWN0 ZWQgZGlyZWN0bHkgdG8gdGhlIFJHQgo+IG91dHB1dCwgeW91IG5lZWQgdG8gd3JhcCBpdCBpbiBh IGJyaWRnZSwgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMKPiBsdmRzLWNvZGVjIGRvZXMgZm9yIGl0 cyBwYW5lbC4KPiAKPj4gRXZlcnl0aGluZyB3b3JrcyBuaWNlbHkgdXNpbmcgdGhlIG9sZCBtb2Rl bCwgd2hlcmUgYnJpZGdlIGNyZWF0ZXMKPj4gY29ubmVjdG9yIGFuZCBhdHRhY2hlcyBwYW5lbCB0 byBpdCBmb3IgdXMuCj4+Cj4+IFtJJ20gc3RpbGwgbm90IHN1cmUgd2hhdCBpcyB0aGUgcG9pbnQg dG8gdXNlIHRoZSBuZXcgbW9kZWwgaW4gYSBjYXNlIG9mCj4+IGEgc2ltcGxlIGNoYWluIG9mIGJy aWRnZXNdCj4+Cj4+IFVzaW5nIHRoZSBuZXcgbW9kZWwsIHRoZSBjb25uZWN0b3IgaXNuJ3QgY3Jl YXRlZCBieSB0aGUgYnJpZGdlLCBzbyBJCj4+IG5lZWQgdG8gZHVwbGljYXRlIHRoYXQgY3JlYXRp b24gZWZmb3J0IGluIHRoZSBkcml2ZXIuIE9uY2UgdGhlIGJyaWRnZQo+PiBjb25uZWN0b3IgaXMg bWFudWFsbHkgY3JlYXRlZCwgSSBuZWVkIHRvIGF0dGFjaCBwYW5lbCB0byB0aGlzIGNvbm5lY3Rv ciwKPj4gYnV0IHBhbmVsIGlzIHJlYWNoYWJsZSBvbmx5IHZpYSB0aGUgcmVtb3RlIGJyaWRnZSAo d2hpY2ggd3JhcHMgdGhlIHBhbmVsKS4KPj4KPj4gZHJpdmVyIGNvbm5lY3RvciAtPiBMVkRTIGJy aWRnZSAtPiBwYW5lbCBicmlkZ2UgLT4gcGFuZWwKPiAKPiBXaXRoIHRoZSBuZXcgbW9kZWwsCj4g Cj4gMS4gVGhlIGRpc3BsYXkgZHJpdmVyIGFuZCB0aGUgYnJpZGdlIGRyaXZlcnMgbmVlZCB0byBn ZXQgaG9sZCBvZiB0aGUKPiAgICBicmlkZ2UgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZWlyIG91 dHB1dCAoZm9yIGluc3RhbmNlIHdpdGgKPiAgICBvZl9kcm1fZmluZF9wYW5lbCgpKS4gSWYgdGhl IG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gYSBwYW5lbCwgdGhleQo+ICAgIG5lZWQgdG8gd3JhcCB0 aGF0IHBhbmVsIGluIGEgYnJpZGdlICh3aXRoCj4gICAgZGV2bV9kcm1fcGFuZWxfYnJpZGdlX2Fk ZCgpKS4gSSBwbGFuLCBpbiB0aGUgZnV0dXJlLCB0byBtYWtlIGNyZWF0aW9uCj4gICAgb2YgcGFu ZWwgYnJpZGdlcyBhdXRvbWF0aWMsIHNvIGRyaXZlcnMgd29uJ3QgaGF2ZSB0byBjYXJlLgo+IAo+ IDIuIFRoZSBkaXNwbGF5IGRyaXZlciBuZWVkcyB0byBjcmVhdGUgYSBkdW1teSBkcm1fZW5jb2Rl ciBmb3IgZWFjaCBvZgo+ICAgIGl0cyBvdXRwdXRzIChmb3IgaW5zdGFuY2Ugd2l0aCBkcm1fc2lt cGxlX2VuY29kZXJfaW5pdCgpKS4KPiAKPiAzLiBUaGUgZGlzcGxheSBkcml2ZXIgbmVlZHMgdG8g Y3JlYXRlIGEgZHJtX2Nvbm5lY3RvciBmb3IgZWFjaCBvZiBpdHMKPiAgICBvdXRwdXRzLCBhbmQg aW1wbGVtZW50IGNvbm5lY3RvciBvcGVyYXRpb25zIGJ5IGRlbGVnYXRpbmcgdGhlbSB0byB0aGUK PiAgICBicmlkZ2VzIGluIHRoZSBwaXBlbGluZS4gVW5sZXNzIHRoZXJlJ3MgYSBnb29kIHJlYXNv biBub3QgdG8gZG8gc28sCj4gICAgdGhpcyBzaG91bGQgYmUgZG9uZSB3aXRoIGRybV9icmlkZ2Vf Y29ubmVjdG9yX2luaXQoKS4KPiAKPiBUaGF0J3MgaXQuIEV2ZXJ5IGRyaXZlciB0aGVuIGZvY3Vz c2VzIG9uIGl0cyBvd24gbmVlZHMsIGJyaWRnZSBkcml2ZXJzCj4gaGFuZGxlIG9ubHkgdGhlIGRl dmljZSB0aGV5J3JlIGFzc29jaWF0ZWQgd2l0aCwgYW5kIHRoZSBEUk0gY29yZSBhbmQgRFJNCj4g YnJpZGdlIGNvbm5lY3RvciBoZWxwZXIgd2lsbCBoYW5kbGUgYWxsIHRoZSByZXN0Lgo+IAoKVGhh bmsgeW91IHZlcnkgbXVjaCBmb3IgdGhlIGNsYXJpZmljYXRpb24gYWdhaW4hIDopCgpOb3cgSSBy ZWFsaXplZCB3aGF0IHdhcyB0aGUgbWlzc2luZyBwYXJ0Li4gaW4gbXkgY2FzZSBkaXNwbGF5IHBh bmVsIGlzCm1vdW50ZWQgdXBzaWRlLWRvd24gYW5kIGRpc3BsYXkgb3V0cHV0IG5lZWRzIHRvIGJl IHJvdGF0ZWQgYnkgMTgwwrAuIEkKaGF2ZSBhIGxvY2FsIHBhdGNoIChoYWNrKSB0aGF0IGFkZHMg b3JpZW50YXRpb24tcHJvcGVydHkgc3VwcG9ydCB0byB0aGUKcGFuZWwtbHZkcyBkcml2ZXIgYW5k IHByZXZpb3VzbHkgdGhlIHBhbmVsJ3Mgb3JpZW50YXRpb24gd2FzIGFzc2lnbmVkIHRvCnRoZSBj b25uZWN0b3IgdXNpbmcgZHJtX3BhbmVsX2F0dGFjaCgpLCBidXQgbm93IHRoaXMgYXR0YWNobWVu dCBkb2Vzbid0CmhhcHBlbiBhbmQgSSBmb3VuZCB0aGF0IHBhbmVsX2x2ZHNfZ2V0X21vZGVzKCkg bWlzc2VkCmRybV9jb25uZWN0b3Jfc2V0X3BhbmVsX29yaWVudGF0aW9uKCkgaW4gbXkgcGF0Y2gu IEV2ZXJ5dGhpbmcgaXMgb2theQpvbmNlIHRoZSBwYW5lbF9sdmRzX2dldF9tb2RlcygpIGlzIGNv cnJlY3RlZC4gSSdsbCBwcmVwYXJlIHRoZSB2NC4KX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVsCg==