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=-0.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED 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 56F8EC5DF61 for ; Tue, 5 Nov 2019 19:48:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 15C1F21A4A for ; Tue, 5 Nov 2019 19:48:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="TqEhtOSM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726458AbfKETsJ (ORCPT ); Tue, 5 Nov 2019 14:48:09 -0500 Received: from mail-ot1-f66.google.com ([209.85.210.66]:42327 "EHLO mail-ot1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725385AbfKETsI (ORCPT ); Tue, 5 Nov 2019 14:48:08 -0500 Received: by mail-ot1-f66.google.com with SMTP id b16so18704276otk.9 for ; Tue, 05 Nov 2019 11:48:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Sqb7GQLcQVbw2N0rPy5gzCBrbUzJToKITpBvRXsoKJk=; b=TqEhtOSMPG3KFe2OzLNhU+XMMbv3vQ/UqX1lLqTkWkQHbMfW2xSa8I+ZgpqLZJzmyu ncJDa/AGRBUW4mEfDae3GLEC+fv4Z8ax12Y/U/zSO4qDKwd3x8lHX787XzXBGAhOlo60 EFccP+d8WXqgsnNWQiUXxAUsJ0zmHLBnnuL5roOl4R20eQp6/md4ZSVBWvwAmEWc2NJN b7Gw6Cc7NCurX68LC1mDzuTbDIfX50hy9aThsGbd0YypIocJGwv0KMbijNcisjHvwm7b GKqgWjpqG6WgtTSZGcB2zqF61YRU572ZtWOEqaItvhdW3gFvfwsMqyC0jG5FZmb2uw57 xyjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Sqb7GQLcQVbw2N0rPy5gzCBrbUzJToKITpBvRXsoKJk=; b=ZNqEw0PPdm/ZWLoh2VQkjPakM20QjcEwV68et7Tt8P9PY8Z0UGgjogKyFGCwj6tmrc rrMP7AeqBVOp21XSeYP1HqWH/pGDQC0unt/lp5HWWdU7naQBE0c+NnhfXN0WHSocAnyg 4R44EsAsLR42334gI7YnKzqKHomRZLubI6EilGVb6bm9t4JsR+sjRoLUPfRw3UrvfZ6F gwKngoju1ArLedd4NhH2QYu+bOK/6yeEUZGe/w+60bMUXaDovVmG6dq2c84bQy4BCEv2 JVXOiNeSIbhp5Z7V58yRP/uzWxBsrZ1YwVNaVg6WATurDUoiv9QMmTuLEiSxldPnq2YT VGpg== X-Gm-Message-State: APjAAAUB0lTNOLT2kDndVXK+7HMpxHTHksQCbxqJ53PrHVk/NabpkS5J FRtcssUkG7eX4Vwbd+no9wxoR0aqmniVQFX27zfunQ== X-Google-Smtp-Source: APXvYqx/5UhLYjy08pWDrSssq4y3azdX7VIiqTt2QeupWH16xoX87fJYkAl89Qva0MNLhr3vdAmwGjb9v53y9mZuS9w= X-Received: by 2002:a9d:75c7:: with SMTP id c7mr4595580otl.12.1572983285883; Tue, 05 Nov 2019 11:48:05 -0800 (PST) MIME-Version: 1.0 References: <20191025234834.28214-1-john.stultz@linaro.org> <20191104095823.GD10326@phenom.ffwll.local> <20191105094259.GX10326@phenom.ffwll.local> In-Reply-To: From: John Stultz Date: Tue, 5 Nov 2019 11:47:53 -0800 Message-ID: Subject: Re: [RFC][PATCH 0/2] Allow DMA BUF heaps to be loaded as modules To: Daniel Vetter Cc: lkml , Sandeep Patil , Mike Rapoport , Chenbo Feng , Alistair Strachan , Liam Mark , Yue Hu , dri-devel , "Andrew F . Davis" , Hridya Valsaraju , Andrew Morton , Pratik Patel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Nov 5, 2019 at 11:19 AM Daniel Vetter wrote: > On Tue, Nov 5, 2019 at 6:41 PM John Stultz wrote: > > On Tue, Nov 5, 2019 at 1:43 AM Daniel Vetter wrote: > > > > > > On Mon, Nov 04, 2019 at 10:57:44AM -0800, John Stultz wrote: > > > > On Mon, Nov 4, 2019 at 1:58 AM Daniel Vetter wrote: > > > > > On Fri, Oct 25, 2019 at 11:48:32PM +0000, John Stultz wrote: > > > > So even if the heaps are configured via DT (which at the moment there > > > > is no such binding, so that's not really a valid method yet), there's > > > > still the question of if the heap is necessary/makes sense on the > > > > device. And the DT would only control the availability of the heap > > > > interface, not if the heap driver is loaded or not. > > > > > > Hm I thought the cma regions are configured in DT? How does that work if > > > it's not using DT? > > > > So yea, CMA regions are either configured by DT or setup at build time > > (I think there's a cmdline option to set it up as well). > > > > But the CMA regions and the dmabuf cma heap driver are separate > > things. The latter uses the former. > > Huh, I assumed the plan is that whenever there's a cma region, we want > to instantiate a dma-buf heap for it? Why/when would we not want to do > that? Not quite. Andrew noted that we may not want to expose all CMA regions via dmabuf heaps, so right now we only expose the default region. I have follow on patches that I sent out earlier (which requires a to-be-finalized DT binding) which allows us to specify which other CMA regions to expose. > > > > On the HiKey/HiKey960 boards, we have to allocate contiguous buffers > > > > for the display framebuffer. So gralloc uses ION to allocate from the > > > > CMA heap. However on the db845c, it has no such restrictions, so the > > > > CMA heap isn't necessary. > > > > > > Why do you have a CMA region for the 2nd board if you don't need it? > > > _That_ sounds like some serious memory waster, not a few lines of code > > > loaded for nothing :-) > > > > ??? That's not what I said above. If the db845c doesn't need CMA it > > won't have a CMA region. > > > > The issue at hand is that we may want to avoid loading the dmabuf CMA > > heap driver on a board that doesn't use CMA. > > So the CMA core code is also a module, or how does that work? Not No. CMA core isn't available as a module. > loading the cma dma-buf heap, but keeping all the other cma code > around feels slightly silly. Do we have numbers that justify this > silliness? I agree that is maybe not the most critical item on the list, but its one of many that do add up over time. Again, I'll defer to Sandeep or other folks on the Google side to help with the importance here. Mostly I'm trying to ensure there is functional parity to ION so we don't give folks any reason they could object to deprecating it. > > The main reason I'm only submitting system and CMA is because those > > are the only two I personally have a user for (HiKey/HiKey960 boards). > > It's my hope that once we deprecate ION in Android, vendors will > > migrate and we'll be able to push them to upstream their heaps as > > well. > > I think for upstream I'd want to see those other heaps first. If > they're mostly driver allocators exposed as heaps, then I think we > need something different than heap modules, maybe allow dma-buf to > allocate from drivers instead. But afaiui all such driver allocators > we have in upstream are cma regions only right now. I'm sorry, I'm not sure I understand what you mean here (I'm not sure what action I should be taking). Could you clarify this point? thanks -john 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=-0.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 26414C5DF60 for ; Tue, 5 Nov 2019 19:48:10 +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 E0A8521929 for ; Tue, 5 Nov 2019 19:48:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E0A8521929 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org 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 4FE3F6E131; Tue, 5 Nov 2019 19:48:09 +0000 (UTC) Received: from mail-ot1-x341.google.com (mail-ot1-x341.google.com [IPv6:2607:f8b0:4864:20::341]) by gabe.freedesktop.org (Postfix) with ESMTPS id 231396E131 for ; Tue, 5 Nov 2019 19:48:08 +0000 (UTC) Received: by mail-ot1-x341.google.com with SMTP id z6so18732612otb.2 for ; Tue, 05 Nov 2019 11:48:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Sqb7GQLcQVbw2N0rPy5gzCBrbUzJToKITpBvRXsoKJk=; b=AMJUFJBP8U57msgdTut1srrH9DNW86V/dEWl/dHdDDeoOU4m7etBBBkTFTPzbwR/xy YwAbVlNq6S1jlpAqQZWzwRgHUBsZONoSYMcPYrUBQdh4H0kEK3Dx0KlPBAqMRwV356ux DXU7sy1DdB7TqWZqnGwTXDWh+od8r3UxKTnOx4d7+XsFWGAAF4ioWHf+XF7BucTMm0ex 3mII735dtrHEdssBBdY//mdyVGo9K14hVp0+ZrLKWStRTn4Tws3g89Qmw3vzTFc5zk6l F1Em+sC/6QRxiKHJywFvXQ9tmvPZxiPZJCYYSx2qP0617cnJf38IirJT12uM4fJO3L9D PwZA== X-Gm-Message-State: APjAAAVS0A+TyqreLg37Nlr+diLPdZJ/DqqCFS+M5N43dyyxNsQiZrPf wZJDLcQw42+jMNSaBorlZmf176ugFHPyAn9KW789NQ== X-Google-Smtp-Source: APXvYqx/5UhLYjy08pWDrSssq4y3azdX7VIiqTt2QeupWH16xoX87fJYkAl89Qva0MNLhr3vdAmwGjb9v53y9mZuS9w= X-Received: by 2002:a9d:75c7:: with SMTP id c7mr4595580otl.12.1572983285883; Tue, 05 Nov 2019 11:48:05 -0800 (PST) MIME-Version: 1.0 References: <20191025234834.28214-1-john.stultz@linaro.org> <20191104095823.GD10326@phenom.ffwll.local> <20191105094259.GX10326@phenom.ffwll.local> In-Reply-To: From: John Stultz Date: Tue, 5 Nov 2019 11:47:53 -0800 Message-ID: Subject: Re: [RFC][PATCH 0/2] Allow DMA BUF heaps to be loaded as modules To: Daniel Vetter X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=Sqb7GQLcQVbw2N0rPy5gzCBrbUzJToKITpBvRXsoKJk=; b=TqEhtOSMPG3KFe2OzLNhU+XMMbv3vQ/UqX1lLqTkWkQHbMfW2xSa8I+ZgpqLZJzmyu ncJDa/AGRBUW4mEfDae3GLEC+fv4Z8ax12Y/U/zSO4qDKwd3x8lHX787XzXBGAhOlo60 EFccP+d8WXqgsnNWQiUXxAUsJ0zmHLBnnuL5roOl4R20eQp6/md4ZSVBWvwAmEWc2NJN b7Gw6Cc7NCurX68LC1mDzuTbDIfX50hy9aThsGbd0YypIocJGwv0KMbijNcisjHvwm7b GKqgWjpqG6WgtTSZGcB2zqF61YRU572ZtWOEqaItvhdW3gFvfwsMqyC0jG5FZmb2uw57 xyjQ== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sandeep Patil , Chenbo Feng , Alistair Strachan , Liam Mark , lkml , Yue Hu , dri-devel , "Andrew F . Davis" , Hridya Valsaraju , Andrew Morton , Mike Rapoport , Pratik Patel Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191105194753.YsyZ39Y75zZyN-zZ8o5LkNMk9v2-QqNp2lbGq0JMdFo@z> T24gVHVlLCBOb3YgNSwgMjAxOSBhdCAxMToxOSBBTSBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3 bGwuY2g+IHdyb3RlOgo+IE9uIFR1ZSwgTm92IDUsIDIwMTkgYXQgNjo0MSBQTSBKb2huIFN0dWx0 eiA8am9obi5zdHVsdHpAbGluYXJvLm9yZz4gd3JvdGU6Cj4gPiBPbiBUdWUsIE5vdiA1LCAyMDE5 IGF0IDE6NDMgQU0gRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90ZToKPiA+ID4K PiA+ID4gT24gTW9uLCBOb3YgMDQsIDIwMTkgYXQgMTA6NTc6NDRBTSAtMDgwMCwgSm9obiBTdHVs dHogd3JvdGU6Cj4gPiA+ID4gT24gTW9uLCBOb3YgNCwgMjAxOSBhdCAxOjU4IEFNIERhbmllbCBW ZXR0ZXIgPGRhbmllbEBmZndsbC5jaD4gd3JvdGU6Cj4gPiA+ID4gPiBPbiBGcmksIE9jdCAyNSwg MjAxOSBhdCAxMTo0ODozMlBNICswMDAwLCBKb2huIFN0dWx0eiB3cm90ZToKPiA+ID4gPiBTbyBl dmVuIGlmIHRoZSBoZWFwcyBhcmUgY29uZmlndXJlZCB2aWEgRFQgKHdoaWNoIGF0IHRoZSBtb21l bnQgdGhlcmUKPiA+ID4gPiBpcyBubyBzdWNoIGJpbmRpbmcsIHNvIHRoYXQncyBub3QgcmVhbGx5 IGEgdmFsaWQgbWV0aG9kIHlldCksIHRoZXJlJ3MKPiA+ID4gPiBzdGlsbCB0aGUgcXVlc3Rpb24g b2YgaWYgdGhlIGhlYXAgaXMgbmVjZXNzYXJ5L21ha2VzIHNlbnNlIG9uIHRoZQo+ID4gPiA+IGRl dmljZS4gQW5kIHRoZSBEVCB3b3VsZCBvbmx5IGNvbnRyb2wgdGhlIGF2YWlsYWJpbGl0eSBvZiB0 aGUgaGVhcAo+ID4gPiA+IGludGVyZmFjZSwgbm90IGlmIHRoZSBoZWFwIGRyaXZlciBpcyBsb2Fk ZWQgb3Igbm90Lgo+ID4gPgo+ID4gPiBIbSBJIHRob3VnaHQgdGhlIGNtYSByZWdpb25zIGFyZSBj b25maWd1cmVkIGluIERUPyBIb3cgZG9lcyB0aGF0IHdvcmsgaWYKPiA+ID4gaXQncyBub3QgdXNp bmcgRFQ/Cj4gPgo+ID4gU28geWVhLCBDTUEgcmVnaW9ucyBhcmUgZWl0aGVyIGNvbmZpZ3VyZWQg YnkgRFQgb3Igc2V0dXAgYXQgYnVpbGQgdGltZQo+ID4gKEkgdGhpbmsgdGhlcmUncyBhIGNtZGxp bmUgb3B0aW9uIHRvIHNldCBpdCB1cCBhcyB3ZWxsKS4KPiA+Cj4gPiBCdXQgdGhlIENNQSByZWdp b25zIGFuZCB0aGUgZG1hYnVmIGNtYSBoZWFwIGRyaXZlciBhcmUgc2VwYXJhdGUKPiA+IHRoaW5n cy4gVGhlIGxhdHRlciB1c2VzIHRoZSBmb3JtZXIuCj4KPiBIdWgsIEkgYXNzdW1lZCB0aGUgcGxh biBpcyB0aGF0IHdoZW5ldmVyIHRoZXJlJ3MgYSBjbWEgcmVnaW9uLCB3ZSB3YW50Cj4gdG8gaW5z dGFudGlhdGUgYSBkbWEtYnVmIGhlYXAgZm9yIGl0PyBXaHkvd2hlbiB3b3VsZCB3ZSBub3Qgd2Fu dCB0byBkbwo+IHRoYXQ/CgpOb3QgcXVpdGUuIEFuZHJldyBub3RlZCB0aGF0IHdlIG1heSBub3Qg d2FudCB0byBleHBvc2UgYWxsIENNQSByZWdpb25zCnZpYSBkbWFidWYgaGVhcHMsIHNvIHJpZ2h0 IG5vdyB3ZSBvbmx5IGV4cG9zZSB0aGUgZGVmYXVsdCByZWdpb24uIEkKaGF2ZSBmb2xsb3cgb24g cGF0Y2hlcyB0aGF0IEkgc2VudCBvdXQgZWFybGllciAod2hpY2ggcmVxdWlyZXMgYQp0by1iZS1m aW5hbGl6ZWQgRFQgYmluZGluZykgd2hpY2ggYWxsb3dzIHVzIHRvIHNwZWNpZnkgd2hpY2ggb3Ro ZXIgQ01BCnJlZ2lvbnMgdG8gZXhwb3NlLgoKPiA+ID4gPiBPbiB0aGUgSGlLZXkvSGlLZXk5NjAg Ym9hcmRzLCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGNvbnRpZ3VvdXMgYnVmZmVycwo+ID4gPiA+IGZv ciB0aGUgZGlzcGxheSBmcmFtZWJ1ZmZlci4gU28gZ3JhbGxvYyB1c2VzIElPTiB0byBhbGxvY2F0 ZSBmcm9tIHRoZQo+ID4gPiA+IENNQSBoZWFwLiBIb3dldmVyIG9uIHRoZSBkYjg0NWMsIGl0IGhh cyBubyBzdWNoIHJlc3RyaWN0aW9ucywgc28gdGhlCj4gPiA+ID4gQ01BIGhlYXAgaXNuJ3QgbmVj ZXNzYXJ5Lgo+ID4gPgo+ID4gPiBXaHkgZG8geW91IGhhdmUgYSBDTUEgcmVnaW9uIGZvciB0aGUg Mm5kIGJvYXJkIGlmIHlvdSBkb24ndCBuZWVkIGl0Pwo+ID4gPiBfVGhhdF8gc291bmRzIGxpa2Ug c29tZSBzZXJpb3VzIG1lbW9yeSB3YXN0ZXIsIG5vdCBhIGZldyBsaW5lcyBvZiBjb2RlCj4gPiA+ IGxvYWRlZCBmb3Igbm90aGluZyA6LSkKPiA+Cj4gPiA/Pz8gVGhhdCdzIG5vdCB3aGF0IEkgc2Fp ZCBhYm92ZS4gIElmIHRoZSBkYjg0NWMgZG9lc24ndCBuZWVkIENNQSBpdAo+ID4gd29uJ3QgaGF2 ZSBhIENNQSByZWdpb24uCj4gPgo+ID4gVGhlIGlzc3VlIGF0IGhhbmQgaXMgdGhhdCB3ZSBtYXkg d2FudCB0byBhdm9pZCBsb2FkaW5nIHRoZSBkbWFidWYgQ01BCj4gPiBoZWFwIGRyaXZlciBvbiBh IGJvYXJkIHRoYXQgZG9lc24ndCB1c2UgQ01BLgo+Cj4gU28gdGhlIENNQSBjb3JlIGNvZGUgaXMg YWxzbyBhIG1vZHVsZSwgb3IgaG93IGRvZXMgdGhhdCB3b3JrPyBOb3QKCk5vLiAgQ01BIGNvcmUg aXNuJ3QgYXZhaWxhYmxlIGFzIGEgbW9kdWxlLgoKPiBsb2FkaW5nIHRoZSBjbWEgZG1hLWJ1ZiBo ZWFwLCBidXQga2VlcGluZyBhbGwgdGhlIG90aGVyIGNtYSBjb2RlCj4gYXJvdW5kIGZlZWxzIHNs aWdodGx5IHNpbGx5LiBEbyB3ZSBoYXZlIG51bWJlcnMgdGhhdCBqdXN0aWZ5IHRoaXMKPiBzaWxs aW5lc3M/CgpJIGFncmVlIHRoYXQgaXMgbWF5YmUgbm90IHRoZSBtb3N0IGNyaXRpY2FsIGl0ZW0g b24gdGhlIGxpc3QsIGJ1dCBpdHMKb25lIG9mIG1hbnkgdGhhdCBkbyBhZGQgdXAgb3ZlciB0aW1l LgoKQWdhaW4sIEknbGwgZGVmZXIgdG8gU2FuZGVlcCBvciBvdGhlciBmb2xrcyBvbiB0aGUgR29v Z2xlIHNpZGUgdG8gaGVscAp3aXRoIHRoZSBpbXBvcnRhbmNlIGhlcmUuIE1vc3RseSBJJ20gdHJ5 aW5nIHRvIGVuc3VyZSB0aGVyZSBpcwpmdW5jdGlvbmFsIHBhcml0eSB0byBJT04gc28gd2UgZG9u J3QgZ2l2ZSBmb2xrcyBhbnkgcmVhc29uIHRoZXkgY291bGQKb2JqZWN0IHRvIGRlcHJlY2F0aW5n IGl0LgoKPiA+IFRoZSBtYWluIHJlYXNvbiBJJ20gb25seSBzdWJtaXR0aW5nIHN5c3RlbSBhbmQg Q01BIGlzIGJlY2F1c2UgdGhvc2UKPiA+IGFyZSB0aGUgb25seSB0d28gSSBwZXJzb25hbGx5IGhh dmUgYSB1c2VyIGZvciAoSGlLZXkvSGlLZXk5NjAgYm9hcmRzKS4KPiA+IEl0J3MgbXkgaG9wZSB0 aGF0IG9uY2Ugd2UgZGVwcmVjYXRlIElPTiBpbiBBbmRyb2lkLCB2ZW5kb3JzIHdpbGwKPiA+IG1p Z3JhdGUgYW5kIHdlJ2xsIGJlIGFibGUgdG8gcHVzaCB0aGVtIHRvIHVwc3RyZWFtIHRoZWlyIGhl YXBzIGFzCj4gPiB3ZWxsLgo+Cj4gSSB0aGluayBmb3IgdXBzdHJlYW0gSSdkIHdhbnQgdG8gc2Vl IHRob3NlIG90aGVyIGhlYXBzIGZpcnN0LiBJZgo+IHRoZXkncmUgbW9zdGx5IGRyaXZlciBhbGxv Y2F0b3JzIGV4cG9zZWQgYXMgaGVhcHMsIHRoZW4gSSB0aGluayB3ZQo+IG5lZWQgc29tZXRoaW5n IGRpZmZlcmVudCB0aGFuIGhlYXAgbW9kdWxlcywgbWF5YmUgYWxsb3cgZG1hLWJ1ZiB0bwo+IGFs bG9jYXRlIGZyb20gZHJpdmVycyBpbnN0ZWFkLiBCdXQgYWZhaXVpIGFsbCBzdWNoIGRyaXZlciBh bGxvY2F0b3JzCj4gd2UgaGF2ZSBpbiB1cHN0cmVhbSBhcmUgY21hIHJlZ2lvbnMgb25seSByaWdo dCBub3cuCgpJJ20gc29ycnksIEknbSBub3Qgc3VyZSBJIHVuZGVyc3RhbmQgd2hhdCB5b3UgbWVh biBoZXJlIChJJ20gbm90IHN1cmUKd2hhdCBhY3Rpb24gSSBzaG91bGQgYmUgdGFraW5nKS4gQ291 bGQgeW91IGNsYXJpZnkgdGhpcyBwb2ludD8KCnRoYW5rcwotam9obgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=