From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935397AbeBMO2E (ORCPT ); Tue, 13 Feb 2018 09:28:04 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:45122 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933612AbeBMO2A (ORCPT ); Tue, 13 Feb 2018 09:28:00 -0500 Subject: Re: [PATCH v3 1/2] drm/virtio: Add window server support To: Gerd Hoffmann Cc: linux-kernel@vger.kernel.org, Zach Reizner , kernel@collabora.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, "Michael S. Tsirkin" , David Airlie , Jason Wang , Stefan Hajnoczi References: <20180126135803.29781-1-tomeu.vizoso@collabora.com> <20180126135803.29781-2-tomeu.vizoso@collabora.com> <20180201163623.5cs2ysykg5wgulf4@sirius.home.kraxel.org> <49785e0d-936a-c3b4-62dd-aafc7083a942@collabora.com> <20180205122017.4vb5nlpodkq2uhxa@sirius.home.kraxel.org> <20180205160322.sntv5uoqp5o7flnh@sirius.home.kraxel.org> <20180206142302.vdjyqmnoypydci4t@sirius.home.kraxel.org> <04687943-847b-25a7-42ef-a21b4c7ef0cf@collabora.com> <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> From: Tomeu Vizoso Message-ID: <37179029-8ccb-8eb2-0901-04b64cef3608@collabora.com> Date: Tue, 13 Feb 2018 15:27:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/12/2018 12:45 PM, Gerd Hoffmann wrote: > Hi, > >>> (a) software rendering: client allocates shared memory buffer, renders >>> into it, then passes a file handle for that shmem block together >>> with some meta data (size, format, ...) to the wayland server. >>> >>> (b) gpu rendering: client opens a render node, allocates a buffer, >>> asks the cpu to renders into it, exports the buffer as dma-buf >>> (DRM_IOCTL_PRIME_HANDLE_TO_FD), passes this to the wayland server >>> (again including meta data of course). >>> >>> Is that correct? >> >> Both are correct descriptions of typical behaviors. But it isn't spec'ed >> anywhere who has to do the buffer allocation. > > Well, according to Pekka's reply it is spec'ed that way, for the > existing buffer types. So for server allocated buffers you need > (a) a wayland protocol extension and (b) support for the extension > in the clients. > >> That's to say that if we cannot come up with a zero-copy solution for >> unmodified clients, we should at least support zero-copy for cooperative >> clients. > > "cooperative clients" == "client which has support for the wayland > protocol extension", correct? Guess it could be that, but I was rather thinking of clients that would allocate the buffer for wl_shm_pool with DRM_VIRTGPU_RESOURCE_CREATE or equivalent. Then that buffer would be exported and the fd passed using the standard wl_shm protocol. >>>> 4. QEMU maps that buffer to the guest's address space >>>> (KVM_SET_USER_MEMORY_REGION), passes the guest PFN to the virtio driver >>> >>> That part is problematic. The host can't simply allocate something in >>> the physical address space, because most physical address space >>> management is done by the guest. All pci bars are mapped by the guest >>> firmware for example (or by the guest OS in case of hotplug). >> >> How can KVM_SET_USER_MEMORY_REGION ever be safely used then? I would have >> expected that callers of that ioctl have enough knowledge to be able to >> choose a physical address that won't conflict with the guest's kernel. > > Depends on the kind of region. Guest RAM is allocated and mapped by > qemu, guest firmware can query qemu about RAM mappings using a special > interface, then create a e820 memory map for the guest os. PCI device > bars are mapped according to the pci config space registers, which in > turn are initialized by the guest firmware, so it is basically in the > guests hand where they show up. > >> I see that the ivshmem device in QEMU registers the memory region in BAR 2 >> of a PCI device instead. Would that be better in your opinion? > > Yes. Would it make sense for virtio-gpu to map buffers to the guest via PCI BARs? So we can use a single drm driver for both 2d and 3d. >>>> 4. QEMU pops data+buffers from the virtqueue, looks up shmem FD for each >>>> resource, sends data + FDs to the compositor with SCM_RIGHTS >>> >>> BTW: Is there a 1:1 relationship between buffers and shmem blocks? Or >>> does the wayland protocol allow for offsets in buffer meta data, so you >>> can place multiple buffers in a single shmem block? >> >> The latter: >> https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_shm_pool > > Ah, good, that makes it alot easier. > > So, yes, using ivshmem would be one option. Tricky part here is the > buffer management though. It's just a raw piece of memory. The guest > proxy could mmap the pci bar and manage it. But then it is again either > unmodified guest + copying the data, or modified client (which requests > buffers from guest proxy) for zero-copy. > > Another idea would be extending stdvga. Basically qemu would have to > use shmem as backing storage for vga memory instead of anonymous memory, > so it would be very simliar to ivshmem on the host side. But on the > guest side we have a drm driver for it (bochs-drm). So clients can > allocate dumb drm buffers for software rendering, and the buffer would > already be backed by a host shmem segment. Given that wayland already > supports drm buffers for 3d rendering that could work without extending > the wayland protocol. The client proxy would have to translate the drm > buffer into an pci bar offset and pass it to the host side. The host > proxy could register the pci bar as wl_shm_pool, then just pass through > the offset to reference the individual buffers. > > Drawback of both approaches would be that software rendering and gpu > rendering would use quite different code paths. Yeah, would be great if we could find a way to avoid that. > We also need a solution for the keymap shmem block. I guess the keymap > doesn't change all that often, so maybe it is easiest to just copy it > over (host proxy -> guest proxy) instead of trying to map the host shmem > into the guest? I think that should be fine for now. Something similar will have to happen for the clipboard, which currently uses pipes to exchange data. Thanks, Tomeu From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tomeu Vizoso Subject: Re: [PATCH v3 1/2] drm/virtio: Add window server support Date: Tue, 13 Feb 2018 15:27:54 +0100 Message-ID: <37179029-8ccb-8eb2-0901-04b64cef3608@collabora.com> References: <20180126135803.29781-1-tomeu.vizoso@collabora.com> <20180126135803.29781-2-tomeu.vizoso@collabora.com> <20180201163623.5cs2ysykg5wgulf4@sirius.home.kraxel.org> <49785e0d-936a-c3b4-62dd-aafc7083a942@collabora.com> <20180205122017.4vb5nlpodkq2uhxa@sirius.home.kraxel.org> <20180205160322.sntv5uoqp5o7flnh@sirius.home.kraxel.org> <20180206142302.vdjyqmnoypydci4t@sirius.home.kraxel.org> <04687943-847b-25a7-42ef-a21b4c7ef0cf@collabora.com> <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by gabe.freedesktop.org (Postfix) with ESMTPS id EE32F6E251 for ; Tue, 13 Feb 2018 14:27:59 +0000 (UTC) In-Reply-To: <20180212114540.iygbha554busy4ip@sirius.home.kraxel.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Gerd Hoffmann Cc: "Michael S. Tsirkin" , David Airlie , Stefan Hajnoczi , Jason Wang , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, kernel@collabora.com List-Id: dri-devel@lists.freedesktop.org T24gMDIvMTIvMjAxOCAxMjo0NSBQTSwgR2VyZCBIb2ZmbWFubiB3cm90ZToKPiAgICBIaSwKPiAK Pj4+ICAgICAoYSkgc29mdHdhcmUgcmVuZGVyaW5nOiBjbGllbnQgYWxsb2NhdGVzIHNoYXJlZCBt ZW1vcnkgYnVmZmVyLCByZW5kZXJzCj4+PiAgICAgICAgIGludG8gaXQsIHRoZW4gcGFzc2VzIGEg ZmlsZSBoYW5kbGUgZm9yIHRoYXQgc2htZW0gYmxvY2sgdG9nZXRoZXIKPj4+ICAgICAgICAgd2l0 aCBzb21lIG1ldGEgZGF0YSAoc2l6ZSwgZm9ybWF0LCAuLi4pIHRvIHRoZSB3YXlsYW5kIHNlcnZl ci4KPj4+Cj4+PiAgICAgKGIpIGdwdSByZW5kZXJpbmc6IGNsaWVudCBvcGVucyBhIHJlbmRlciBu b2RlLCBhbGxvY2F0ZXMgYSBidWZmZXIsCj4+PiAgICAgICAgIGFza3MgdGhlIGNwdSB0byByZW5k ZXJzIGludG8gaXQsIGV4cG9ydHMgdGhlIGJ1ZmZlciBhcyBkbWEtYnVmCj4+PiAgICAgICAgIChE Uk1fSU9DVExfUFJJTUVfSEFORExFX1RPX0ZEKSwgcGFzc2VzIHRoaXMgdG8gdGhlIHdheWxhbmQg c2VydmVyCj4+PiAgICAgICAgIChhZ2FpbiBpbmNsdWRpbmcgbWV0YSBkYXRhIG9mIGNvdXJzZSku Cj4+Pgo+Pj4gSXMgdGhhdCBjb3JyZWN0Pwo+Pgo+PiBCb3RoIGFyZSBjb3JyZWN0IGRlc2NyaXB0 aW9ucyBvZiB0eXBpY2FsIGJlaGF2aW9ycy4gQnV0IGl0IGlzbid0IHNwZWMnZWQKPj4gYW55d2hl cmUgd2hvIGhhcyB0byBkbyB0aGUgYnVmZmVyIGFsbG9jYXRpb24uCj4gCj4gV2VsbCwgYWNjb3Jk aW5nIHRvIFBla2thJ3MgcmVwbHkgaXQgaXMgc3BlYydlZCB0aGF0IHdheSwgZm9yIHRoZQo+IGV4 aXN0aW5nIGJ1ZmZlciB0eXBlcy4gIFNvIGZvciBzZXJ2ZXIgYWxsb2NhdGVkIGJ1ZmZlcnMgeW91 IG5lZWQKPiAoYSkgYSB3YXlsYW5kIHByb3RvY29sIGV4dGVuc2lvbiBhbmQgKGIpIHN1cHBvcnQg Zm9yIHRoZSBleHRlbnNpb24KPiBpbiB0aGUgY2xpZW50cy4KPiAKPj4gVGhhdCdzIHRvIHNheSB0 aGF0IGlmIHdlIGNhbm5vdCBjb21lIHVwIHdpdGggYSB6ZXJvLWNvcHkgc29sdXRpb24gZm9yCj4+ IHVubW9kaWZpZWQgY2xpZW50cywgd2Ugc2hvdWxkIGF0IGxlYXN0IHN1cHBvcnQgemVyby1jb3B5 IGZvciBjb29wZXJhdGl2ZQo+PiBjbGllbnRzLgo+IAo+ICJjb29wZXJhdGl2ZSBjbGllbnRzIiA9 PSAiY2xpZW50IHdoaWNoIGhhcyBzdXBwb3J0IGZvciB0aGUgd2F5bGFuZAo+IHByb3RvY29sIGV4 dGVuc2lvbiIsIGNvcnJlY3Q/CgpHdWVzcyBpdCBjb3VsZCBiZSB0aGF0LCBidXQgSSB3YXMgcmF0 aGVyIHRoaW5raW5nIG9mIGNsaWVudHMgdGhhdCB3b3VsZCAKYWxsb2NhdGUgdGhlIGJ1ZmZlciBm b3Igd2xfc2htX3Bvb2wgd2l0aCBEUk1fVklSVEdQVV9SRVNPVVJDRV9DUkVBVEUgb3IgCmVxdWl2 YWxlbnQuIFRoZW4gdGhhdCBidWZmZXIgd291bGQgYmUgZXhwb3J0ZWQgYW5kIHRoZSBmZCBwYXNz ZWQgdXNpbmcgCnRoZSBzdGFuZGFyZCB3bF9zaG0gcHJvdG9jb2wuCgo+Pj4+IDQuIFFFTVUgbWFw cyB0aGF0IGJ1ZmZlciB0byB0aGUgZ3Vlc3QncyBhZGRyZXNzIHNwYWNlCj4+Pj4gKEtWTV9TRVRf VVNFUl9NRU1PUllfUkVHSU9OKSwgcGFzc2VzIHRoZSBndWVzdCBQRk4gdG8gdGhlIHZpcnRpbyBk cml2ZXIKPj4+Cj4+PiBUaGF0IHBhcnQgaXMgcHJvYmxlbWF0aWMuICBUaGUgaG9zdCBjYW4ndCBz aW1wbHkgYWxsb2NhdGUgc29tZXRoaW5nIGluCj4+PiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFj ZSwgYmVjYXVzZSBtb3N0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKPj4+IG1hbmFnZW1lbnQgaXMg ZG9uZSBieSB0aGUgZ3Vlc3QuICBBbGwgcGNpIGJhcnMgYXJlIG1hcHBlZCBieSB0aGUgZ3Vlc3QK Pj4+IGZpcm13YXJlIGZvciBleGFtcGxlIChvciBieSB0aGUgZ3Vlc3QgT1MgaW4gY2FzZSBvZiBo b3RwbHVnKS4KPj4KPj4gSG93IGNhbiBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTiBldmVyIGJl IHNhZmVseSB1c2VkIHRoZW4/IEkgd291bGQgaGF2ZQo+PiBleHBlY3RlZCB0aGF0IGNhbGxlcnMg b2YgdGhhdCBpb2N0bCBoYXZlIGVub3VnaCBrbm93bGVkZ2UgdG8gYmUgYWJsZSB0bwo+PiBjaG9v c2UgYSBwaHlzaWNhbCBhZGRyZXNzIHRoYXQgd29uJ3QgY29uZmxpY3Qgd2l0aCB0aGUgZ3Vlc3Qn cyBrZXJuZWwuCj4gCj4gRGVwZW5kcyBvbiB0aGUga2luZCBvZiByZWdpb24uICBHdWVzdCBSQU0g aXMgYWxsb2NhdGVkIGFuZCBtYXBwZWQgYnkKPiBxZW11LCBndWVzdCBmaXJtd2FyZSBjYW4gcXVl cnkgcWVtdSBhYm91dCBSQU0gbWFwcGluZ3MgdXNpbmcgYSBzcGVjaWFsCj4gaW50ZXJmYWNlLCB0 aGVuIGNyZWF0ZSBhIGU4MjAgbWVtb3J5IG1hcCBmb3IgdGhlIGd1ZXN0IG9zLiAgUENJIGRldmlj ZQo+IGJhcnMgYXJlIG1hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHBjaSBjb25maWcgc3BhY2UgcmVn aXN0ZXJzLCB3aGljaCBpbgo+IHR1cm4gYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBndWVzdCBmaXJt d2FyZSwgc28gaXQgaXMgYmFzaWNhbGx5IGluIHRoZQo+IGd1ZXN0cyBoYW5kIHdoZXJlIHRoZXkg c2hvdyB1cC4KPiAKPj4gSSBzZWUgdGhhdCB0aGUgaXZzaG1lbSBkZXZpY2UgaW4gUUVNVSByZWdp c3RlcnMgdGhlIG1lbW9yeSByZWdpb24gaW4gQkFSIDIKPj4gb2YgYSBQQ0kgZGV2aWNlIGluc3Rl YWQuIFdvdWxkIHRoYXQgYmUgYmV0dGVyIGluIHlvdXIgb3Bpbmlvbj8KPiAKPiBZZXMuCgpXb3Vs ZCBpdCBtYWtlIHNlbnNlIGZvciB2aXJ0aW8tZ3B1IHRvIG1hcCBidWZmZXJzIHRvIHRoZSBndWVz dCB2aWEgUENJIApCQVJzPyBTbyB3ZSBjYW4gdXNlIGEgc2luZ2xlIGRybSBkcml2ZXIgZm9yIGJv dGggMmQgYW5kIDNkLgoKPj4+PiA0LiBRRU1VIHBvcHMgZGF0YStidWZmZXJzIGZyb20gdGhlIHZp cnRxdWV1ZSwgbG9va3MgdXAgc2htZW0gRkQgZm9yIGVhY2gKPj4+PiByZXNvdXJjZSwgc2VuZHMg ZGF0YSArIEZEcyB0byB0aGUgY29tcG9zaXRvciB3aXRoIFNDTV9SSUdIVFMKPj4+Cj4+PiBCVFc6 IElzIHRoZXJlIGEgMToxIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJ1ZmZlcnMgYW5kIHNobWVtIGJs b2Nrcz8gIE9yCj4+PiBkb2VzIHRoZSB3YXlsYW5kIHByb3RvY29sIGFsbG93IGZvciBvZmZzZXRz IGluIGJ1ZmZlciBtZXRhIGRhdGEsIHNvIHlvdQo+Pj4gY2FuIHBsYWNlIG11bHRpcGxlIGJ1ZmZl cnMgaW4gYSBzaW5nbGUgc2htZW0gYmxvY2s/Cj4+Cj4+IFRoZSBsYXR0ZXI6Cj4+IGh0dHBzOi8v d2F5bGFuZC5mcmVlZGVza3RvcC5vcmcvZG9jcy9odG1sL2FwYS5odG1sI3Byb3RvY29sLXNwZWMt d2xfc2htX3Bvb2wKPiAKPiBBaCwgZ29vZCwgdGhhdCBtYWtlcyBpdCBhbG90IGVhc2llci4KPiAK PiBTbywgeWVzLCB1c2luZyBpdnNobWVtIHdvdWxkIGJlIG9uZSBvcHRpb24uICBUcmlja3kgcGFy dCBoZXJlIGlzIHRoZQo+IGJ1ZmZlciBtYW5hZ2VtZW50IHRob3VnaC4gIEl0J3MganVzdCBhIHJh dyBwaWVjZSBvZiBtZW1vcnkuICBUaGUgZ3Vlc3QKPiBwcm94eSBjb3VsZCBtbWFwIHRoZSBwY2kg YmFyIGFuZCBtYW5hZ2UgaXQuICBCdXQgdGhlbiBpdCBpcyBhZ2FpbiBlaXRoZXIKPiB1bm1vZGlm aWVkIGd1ZXN0ICsgY29weWluZyB0aGUgZGF0YSwgb3IgbW9kaWZpZWQgY2xpZW50ICh3aGljaCBy ZXF1ZXN0cwo+IGJ1ZmZlcnMgZnJvbSBndWVzdCBwcm94eSkgZm9yIHplcm8tY29weS4KPiAKPiBB bm90aGVyIGlkZWEgd291bGQgYmUgZXh0ZW5kaW5nIHN0ZHZnYS4gIEJhc2ljYWxseSBxZW11IHdv dWxkIGhhdmUgdG8KPiB1c2Ugc2htZW0gYXMgYmFja2luZyBzdG9yYWdlIGZvciB2Z2EgbWVtb3J5 IGluc3RlYWQgb2YgYW5vbnltb3VzIG1lbW9yeSwKPiBzbyBpdCB3b3VsZCBiZSB2ZXJ5ICBzaW1s aWFyIHRvIGl2c2htZW0gb24gdGhlIGhvc3Qgc2lkZS4gIEJ1dCBvbiB0aGUKPiBndWVzdCBzaWRl IHdlIGhhdmUgYSBkcm0gZHJpdmVyIGZvciBpdCAoYm9jaHMtZHJtKS4gIFNvIGNsaWVudHMgY2Fu Cj4gYWxsb2NhdGUgZHVtYiBkcm0gYnVmZmVycyBmb3Igc29mdHdhcmUgcmVuZGVyaW5nLCBhbmQg dGhlIGJ1ZmZlciB3b3VsZAo+IGFscmVhZHkgYmUgYmFja2VkIGJ5IGEgaG9zdCBzaG1lbSBzZWdt ZW50LiAgR2l2ZW4gdGhhdCB3YXlsYW5kIGFscmVhZHkKPiBzdXBwb3J0cyBkcm0gYnVmZmVycyBm b3IgM2QgcmVuZGVyaW5nIHRoYXQgY291bGQgd29yayB3aXRob3V0IGV4dGVuZGluZwo+IHRoZSB3 YXlsYW5kIHByb3RvY29sLiAgVGhlIGNsaWVudCBwcm94eSB3b3VsZCBoYXZlIHRvIHRyYW5zbGF0 ZSB0aGUgZHJtCj4gYnVmZmVyIGludG8gYW4gcGNpIGJhciBvZmZzZXQgYW5kIHBhc3MgaXQgdG8g dGhlIGhvc3Qgc2lkZS4gIFRoZSBob3N0Cj4gcHJveHkgY291bGQgcmVnaXN0ZXIgdGhlIHBjaSBi YXIgYXMgd2xfc2htX3Bvb2wsIHRoZW4ganVzdCBwYXNzIHRocm91Z2gKPiB0aGUgb2Zmc2V0IHRv IHJlZmVyZW5jZSB0aGUgaW5kaXZpZHVhbCBidWZmZXJzLgo+IAo+IERyYXdiYWNrIG9mIGJvdGgg YXBwcm9hY2hlcyB3b3VsZCBiZSB0aGF0IHNvZnR3YXJlIHJlbmRlcmluZyBhbmQgZ3B1Cj4gcmVu ZGVyaW5nIHdvdWxkIHVzZSBxdWl0ZSBkaWZmZXJlbnQgY29kZSBwYXRocy4KClllYWgsIHdvdWxk IGJlIGdyZWF0IGlmIHdlIGNvdWxkIGZpbmQgYSB3YXkgdG8gYXZvaWQgdGhhdC4KCj4gV2UgYWxz byBuZWVkIGEgc29sdXRpb24gZm9yIHRoZSBrZXltYXAgc2htZW0gYmxvY2suICBJIGd1ZXNzIHRo ZSBrZXltYXAKPiBkb2Vzbid0IGNoYW5nZSBhbGwgdGhhdCBvZnRlbiwgc28gbWF5YmUgaXQgaXMg ZWFzaWVzdCB0byBqdXN0IGNvcHkgaXQKPiBvdmVyIChob3N0IHByb3h5IC0+IGd1ZXN0IHByb3h5 KSBpbnN0ZWFkIG9mIHRyeWluZyB0byBtYXAgdGhlIGhvc3Qgc2htZW0KPiBpbnRvIHRoZSBndWVz dD8KCkkgdGhpbmsgdGhhdCBzaG91bGQgYmUgZmluZSBmb3Igbm93LiBTb21ldGhpbmcgc2ltaWxh ciB3aWxsIGhhdmUgdG8gCmhhcHBlbiBmb3IgdGhlIGNsaXBib2FyZCwgd2hpY2ggY3VycmVudGx5 IHVzZXMgcGlwZXMgdG8gZXhjaGFuZ2UgZGF0YS4KClRoYW5rcywKClRvbWV1Cl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=