From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: Re: [PATCH V5 2/6] modpost: add support for mdev class id Date: Fri, 25 Oct 2019 09:44:05 +0800 Message-ID: <7eb2c515-74a9-7d65-e09c-dee4f952e9c1@redhat.com> References: <20191023130752.18980-1-jasowang@redhat.com> <20191023130752.18980-3-jasowang@redhat.com> <20191023154245.32e4fa49@x1.home> <555a101e-0ed1-2e9d-c1a4-e3b37d76bd18@redhat.com> <20191024135441.160daa56@x1.home> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <20191024135441.160daa56@x1.home> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Alex Williamson Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-gvt-dev@lists.freedesktop.org, kwankhede@nvidia.com, mst@redhat.com, tiwei.bie@intel.com, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, cohuck@redhat.com, maxime.coquelin@redhat.com, cunming.liang@intel.com, zhihong.wang@intel.com, rob.miller@broadcom.com, xiao.w.wang@intel.com, haotian.wang@sifive.com, zhenyuw@linux.intel.com, zhi.a.wang@intel.com, jani.nikula@linux.intel.com, joonas.lahtinen@linux.intel.com, rodrigo.vivi@intel.com, airlied@linux.ie, daniel@ffwll.ch, farman@linux.ibm.com, pasic@linux.ibm.com, sebott@linux.ibm.com, oberpar@linux.ibm.com, heiko.carstens@de.ibm.com, gor@linux.ibm.com List-Id: intel-gfx@lists.freedesktop.org On 2019/10/25 =E4=B8=8A=E5=8D=883:54, Alex Williamson wrote: > On Thu, 24 Oct 2019 11:31:04 +0800 > Jason Wang wrote: > >> On 2019/10/24 =E4=B8=8A=E5=8D=885:42, Alex Williamson wrote: >>> On Wed, 23 Oct 2019 21:07:48 +0800 >>> Jason Wang wrote: >>> =20 >>>> Add support to parse mdev class id table. >>>> >>>> Reviewed-by: Parav Pandit >>>> Signed-off-by: Jason Wang >>>> --- >>>> drivers/vfio/mdev/vfio_mdev.c | 2 ++ >>>> scripts/mod/devicetable-offsets.c | 3 +++ >>>> scripts/mod/file2alias.c | 10 ++++++++++ >>>> 3 files changed, 15 insertions(+) >>>> >>>> diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_md= ev.c >>>> index 7b24ee9cb8dd..cb701cd646f0 100644 >>>> --- a/drivers/vfio/mdev/vfio_mdev.c >>>> +++ b/drivers/vfio/mdev/vfio_mdev.c >>>> @@ -125,6 +125,8 @@ static const struct mdev_class_id id_table[] =3D { >>>> =09{ 0 }, >>>> }; >>>> =20 >>>> +MODULE_DEVICE_TABLE(mdev, id_table); >>>> + >>> Two questions, first we have: >>> >>> #define MODULE_DEVICE_TABLE(type, name) = \ >>> extern typeof(name) __mod_##type##__##name##_device_table = \ >>> __attribute__ ((unused, alias(__stringify(name)))) >>> >>> Therefore we're defining __mod_mdev__id_table_device_table with alias >>> id_table. When the virtio mdev bus driver is added in 5/6 it uses the >>> same name value. I see virtio types all register this way (virtio, >>> id_table), so I assume there's no conflict, but pci types mostly (not >>> entirely) seem to use unique names. Is there a preference to one way >>> or the other or it simply doesn't matter? >> >> It looks to me that those symbol were local, so it doesn't matter. But >> if you wish I can switch to use unique name. > I don't have a strong opinion, I'm just trying to make sure we're not > doing something obviously broken. Yes, to be more safe I will switch to unique names here. > >>>> static struct mdev_driver vfio_mdev_driver =3D { >>>> =09.name=09=3D "vfio_mdev", >>>> =09.probe=09=3D vfio_mdev_probe, >>>> diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetab= le-offsets.c >>>> index 054405b90ba4..6cbb1062488a 100644 >>>> --- a/scripts/mod/devicetable-offsets.c >>>> +++ b/scripts/mod/devicetable-offsets.c >>>> @@ -231,5 +231,8 @@ int main(void) >>>> =09DEVID(wmi_device_id); >>>> =09DEVID_FIELD(wmi_device_id, guid_string); >>>> =20 >>>> +=09DEVID(mdev_class_id); >>>> +=09DEVID_FIELD(mdev_class_id, id); >>>> + >>>> =09return 0; >>>> } >>>> diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c >>>> index c91eba751804..d365dfe7c718 100644 >>>> --- a/scripts/mod/file2alias.c >>>> +++ b/scripts/mod/file2alias.c >>>> @@ -1335,6 +1335,15 @@ static int do_wmi_entry(const char *filename, v= oid *symval, char *alias) >>>> =09return 1; >>>> } >>>> =20 >>>> +/* looks like: "mdev:cN" */ >>>> +static int do_mdev_entry(const char *filename, void *symval, char *al= ias) >>>> +{ >>>> +=09DEF_FIELD(symval, mdev_class_id, id); >>>> + >>>> +=09sprintf(alias, "mdev:c%02X", id); >>> A lot of entries call add_wildcard() here, should we? Sorry for the >>> basic questions, I haven't played in this code. Thanks, >> >> It's really good question. My understanding is we won't have a module >> that can deal with all kinds of classes like CLASS_ID_ANY. So there's >> probably no need for the wildcard. > The comment for add_wildcard() indicates future extension, so it's hard > to know what we might need in the future until we do need it. The > majority of modules.alias entries on my laptop (even if I exclude pci > aliases) end with a wildcard. Thanks, Yes, so I will add that for future extension. Thanks > > Alex > 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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 78A4ECA9EAF for ; Fri, 25 Oct 2019 01:44:52 +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 57B0F21928 for ; Fri, 25 Oct 2019 01:44:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 57B0F21928 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E70826E889; Fri, 25 Oct 2019 01:44:50 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3ABD26E888 for ; Fri, 25 Oct 2019 01:44:49 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-193-MJT2DVAnPa2BFC_zHXHHbQ-1; Thu, 24 Oct 2019 21:44:44 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 73A47476; Fri, 25 Oct 2019 01:44:40 +0000 (UTC) Received: from [10.72.12.158] (ovpn-12-158.pek2.redhat.com [10.72.12.158]) by smtp.corp.redhat.com (Postfix) with ESMTP id A17835C1D4; Fri, 25 Oct 2019 01:44:06 +0000 (UTC) To: Alex Williamson References: <20191023130752.18980-1-jasowang@redhat.com> <20191023130752.18980-3-jasowang@redhat.com> <20191023154245.32e4fa49@x1.home> <555a101e-0ed1-2e9d-c1a4-e3b37d76bd18@redhat.com> <20191024135441.160daa56@x1.home> From: Jason Wang Message-ID: <7eb2c515-74a9-7d65-e09c-dee4f952e9c1@redhat.com> Date: Fri, 25 Oct 2019 09:44:05 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20191024135441.160daa56@x1.home> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: MJT2DVAnPa2BFC_zHXHHbQ-1 X-Mimecast-Spam-Score: 0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571967888; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qh0akrNYwC0Elz7QBIFcRniueVNDTS2+GYfPxYhIx0c=; b=F2sR4ys3CW0SPnhs00iI9LPAVsdidjB+RR1WajZzKb4rZ+JMzNahjeQ+/wJyOcH7embj4O 1UoFR4oSzOl67RLY+K0g1UgzctpuixHK69VG3py0N9w/27ebIRsaQPyZiCyQ2Ztbjdx9ZO 0HQaJG8S61sLu7jeT6M27RKWXmEtdpQ= Subject: Re: [Intel-gfx] [PATCH V5 2/6] modpost: add support for mdev class id X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: stefanha@redhat.com, christophe.de.dinechin@gmail.com, kvm@vger.kernel.org, mst@redhat.com, airlied@linux.ie, heiko.carstens@de.ibm.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, kwankhede@nvidia.com, rob.miller@broadcom.com, linux-s390@vger.kernel.org, sebott@linux.ibm.com, lulu@redhat.com, eperezma@redhat.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, haotian.wang@sifive.com, cunming.liang@intel.com, farman@linux.ibm.com, idos@mellanox.com, gor@linux.ibm.com, intel-gfx@lists.freedesktop.org, xiao.w.wang@intel.com, freude@linux.ibm.com, parav@mellanox.com, zhihong.wang@intel.com, intel-gvt-dev@lists.freedesktop.org, akrowiak@linux.ibm.com, oberpar@linux.ibm.com, tiwei.bie@intel.com, netdev@vger.kernel.org, cohuck@redhat.com, linux-kernel@vger.kernel.org, maxime.coquelin@redhat.com, lingshan.zhu@intel.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Message-ID: <20191025014405.c2JoAIQ-F_eTQVEhXRuU0nQiXx9bQdpDMoqUOMcdxgM@z> Ck9uIDIwMTkvMTAvMjUg5LiK5Y2IMzo1NCwgQWxleCBXaWxsaWFtc29uIHdyb3RlOgo+IE9uIFRo dSwgMjQgT2N0IDIwMTkgMTE6MzE6MDQgKzA4MDAKPiBKYXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRo YXQuY29tPiB3cm90ZToKPgo+PiBPbiAyMDE5LzEwLzI0IOS4iuWNiDU6NDIsIEFsZXggV2lsbGlh bXNvbiB3cm90ZToKPj4+IE9uIFdlZCwgMjMgT2N0IDIwMTkgMjE6MDc6NDggKzA4MDAKPj4+IEph c29uIFdhbmcgPGphc293YW5nQHJlZGhhdC5jb20+IHdyb3RlOgo+Pj4gICAKPj4+PiBBZGQgc3Vw cG9ydCB0byBwYXJzZSBtZGV2IGNsYXNzIGlkIHRhYmxlLgo+Pj4+Cj4+Pj4gUmV2aWV3ZWQtYnk6 IFBhcmF2IFBhbmRpdCA8cGFyYXZAbWVsbGFub3guY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IEph c29uIFdhbmcgPGphc293YW5nQHJlZGhhdC5jb20+Cj4+Pj4gLS0tCj4+Pj4gICAgZHJpdmVycy92 ZmlvL21kZXYvdmZpb19tZGV2LmMgICAgIHwgIDIgKysKPj4+PiAgICBzY3JpcHRzL21vZC9kZXZp Y2V0YWJsZS1vZmZzZXRzLmMgfCAgMyArKysKPj4+PiAgICBzY3JpcHRzL21vZC9maWxlMmFsaWFz LmMgICAgICAgICAgfCAxMCArKysrKysrKysrCj4+Pj4gICAgMyBmaWxlcyBjaGFuZ2VkLCAxNSBp bnNlcnRpb25zKCspCj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL21kZXYvdmZp b19tZGV2LmMgYi9kcml2ZXJzL3ZmaW8vbWRldi92ZmlvX21kZXYuYwo+Pj4+IGluZGV4IDdiMjRl ZTljYjhkZC4uY2I3MDFjZDY0NmYwIDEwMDY0NAo+Pj4+IC0tLSBhL2RyaXZlcnMvdmZpby9tZGV2 L3ZmaW9fbWRldi5jCj4+Pj4gKysrIGIvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMKPj4+ PiBAQCAtMTI1LDYgKzEyNSw4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9jbGFzc19pZCBp ZF90YWJsZVtdID0gewo+Pj4+ICAgIAl7IDAgfSwKPj4+PiAgICB9Owo+Pj4+ICAgIAo+Pj4+ICtN T0RVTEVfREVWSUNFX1RBQkxFKG1kZXYsIGlkX3RhYmxlKTsKPj4+PiArCj4+PiBUd28gcXVlc3Rp b25zLCBmaXJzdCB3ZSBoYXZlOgo+Pj4KPj4+ICNkZWZpbmUgTU9EVUxFX0RFVklDRV9UQUJMRSh0 eXBlLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4+IGV4dGVybiB0 eXBlb2YobmFtZSkgX19tb2RfIyN0eXBlIyNfXyMjbmFtZSMjX2RldmljZV90YWJsZSAgICAgICAg ICAgICAgIFwKPj4+ICAgICBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBhbGlhcyhfX3N0cmluZ2lm eShuYW1lKSkpKQo+Pj4KPj4+IFRoZXJlZm9yZSB3ZSdyZSBkZWZpbmluZyBfX21vZF9tZGV2X19p ZF90YWJsZV9kZXZpY2VfdGFibGUgd2l0aCBhbGlhcwo+Pj4gaWRfdGFibGUuICBXaGVuIHRoZSB2 aXJ0aW8gbWRldiBidXMgZHJpdmVyIGlzIGFkZGVkIGluIDUvNiBpdCB1c2VzIHRoZQo+Pj4gc2Ft ZSBuYW1lIHZhbHVlLiAgSSBzZWUgdmlydGlvIHR5cGVzIGFsbCByZWdpc3RlciB0aGlzIHdheSAo dmlydGlvLAo+Pj4gaWRfdGFibGUpLCBzbyBJIGFzc3VtZSB0aGVyZSdzIG5vIGNvbmZsaWN0LCBi dXQgcGNpIHR5cGVzIG1vc3RseSAobm90Cj4+PiBlbnRpcmVseSkgc2VlbSB0byB1c2UgdW5pcXVl IG5hbWVzLiAgSXMgdGhlcmUgYSBwcmVmZXJlbmNlIHRvIG9uZSB3YXkKPj4+IG9yIHRoZSBvdGhl ciBvciBpdCBzaW1wbHkgZG9lc24ndCBtYXR0ZXI/Cj4+Cj4+IEl0IGxvb2tzIHRvIG1lIHRoYXQg dGhvc2Ugc3ltYm9sIHdlcmUgbG9jYWwsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyLiBCdXQKPj4gaWYg eW91IHdpc2ggSSBjYW4gc3dpdGNoIHRvIHVzZSB1bmlxdWUgbmFtZS4KPiBJIGRvbid0IGhhdmUg YSBzdHJvbmcgb3BpbmlvbiwgSSdtIGp1c3QgdHJ5aW5nIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QK PiBkb2luZyBzb21ldGhpbmcgb2J2aW91c2x5IGJyb2tlbi4KCgpZZXMsIHRvIGJlIG1vcmUgc2Fm ZSBJIHdpbGwgc3dpdGNoIHRvIHVuaXF1ZSBuYW1lcyBoZXJlLgoKCj4KPj4+PiAgICBzdGF0aWMg c3RydWN0IG1kZXZfZHJpdmVyIHZmaW9fbWRldl9kcml2ZXIgPSB7Cj4+Pj4gICAgCS5uYW1lCT0g InZmaW9fbWRldiIsCj4+Pj4gICAgCS5wcm9iZQk9IHZmaW9fbWRldl9wcm9iZSwKPj4+PiBkaWZm IC0tZ2l0IGEvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jIGIvc2NyaXB0cy9tb2Qv ZGV2aWNldGFibGUtb2Zmc2V0cy5jCj4+Pj4gaW5kZXggMDU0NDA1YjkwYmE0Li42Y2JiMTA2MjQ4 OGEgMTAwNjQ0Cj4+Pj4gLS0tIGEvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jCj4+ Pj4gKysrIGIvc2NyaXB0cy9tb2QvZGV2aWNldGFibGUtb2Zmc2V0cy5jCj4+Pj4gQEAgLTIzMSw1 ICsyMzEsOCBAQCBpbnQgbWFpbih2b2lkKQo+Pj4+ICAgIAlERVZJRCh3bWlfZGV2aWNlX2lkKTsK Pj4+PiAgICAJREVWSURfRklFTEQod21pX2RldmljZV9pZCwgZ3VpZF9zdHJpbmcpOwo+Pj4+ICAg IAo+Pj4+ICsJREVWSUQobWRldl9jbGFzc19pZCk7Cj4+Pj4gKwlERVZJRF9GSUVMRChtZGV2X2Ns YXNzX2lkLCBpZCk7Cj4+Pj4gKwo+Pj4+ICAgIAlyZXR1cm4gMDsKPj4+PiAgICB9Cj4+Pj4gZGlm ZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxp YXMuYwo+Pj4+IGluZGV4IGM5MWViYTc1MTgwNC4uZDM2NWRmZTdjNzE4IDEwMDY0NAo+Pj4+IC0t LSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwo+Pj4+ICsrKyBiL3NjcmlwdHMvbW9kL2ZpbGUy YWxpYXMuYwo+Pj4+IEBAIC0xMzM1LDYgKzEzMzUsMTUgQEAgc3RhdGljIGludCBkb193bWlfZW50 cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKnN5bXZhbCwgY2hhciAqYWxpYXMpCj4+Pj4g ICAgCXJldHVybiAxOwo+Pj4+ICAgIH0KPj4+PiAgICAKPj4+PiArLyogbG9va3MgbGlrZTogIm1k ZXY6Y04iICovCj4+Pj4gK3N0YXRpYyBpbnQgZG9fbWRldl9lbnRyeShjb25zdCBjaGFyICpmaWxl bmFtZSwgdm9pZCAqc3ltdmFsLCBjaGFyICphbGlhcykKPj4+PiArewo+Pj4+ICsJREVGX0ZJRUxE KHN5bXZhbCwgbWRldl9jbGFzc19pZCwgaWQpOwo+Pj4+ICsKPj4+PiArCXNwcmludGYoYWxpYXMs ICJtZGV2OmMlMDJYIiwgaWQpOwo+Pj4gQSBsb3Qgb2YgZW50cmllcyBjYWxsIGFkZF93aWxkY2Fy ZCgpIGhlcmUsIHNob3VsZCB3ZT8gIFNvcnJ5IGZvciB0aGUKPj4+IGJhc2ljIHF1ZXN0aW9ucywg SSBoYXZlbid0IHBsYXllZCBpbiB0aGlzIGNvZGUuICBUaGFua3MsCj4+Cj4+IEl0J3MgcmVhbGx5 IGdvb2QgcXVlc3Rpb24uIE15IHVuZGVyc3RhbmRpbmcgaXMgd2Ugd29uJ3QgaGF2ZSBhIG1vZHVs ZQo+PiB0aGF0IGNhbiBkZWFsIHdpdGggYWxsIGtpbmRzIG9mIGNsYXNzZXMgbGlrZSBDTEFTU19J RF9BTlkuIFNvIHRoZXJlJ3MKPj4gcHJvYmFibHkgbm8gbmVlZCBmb3IgdGhlIHdpbGRjYXJkLgo+ IFRoZSBjb21tZW50IGZvciBhZGRfd2lsZGNhcmQoKSBpbmRpY2F0ZXMgZnV0dXJlIGV4dGVuc2lv biwgc28gaXQncyBoYXJkCj4gdG8ga25vdyB3aGF0IHdlIG1pZ2h0IG5lZWQgaW4gdGhlIGZ1dHVy ZSB1bnRpbCB3ZSBkbyBuZWVkIGl0LiAgVGhlCj4gbWFqb3JpdHkgb2YgbW9kdWxlcy5hbGlhcyBl bnRyaWVzIG9uIG15IGxhcHRvcCAoZXZlbiBpZiBJIGV4Y2x1ZGUgcGNpCj4gYWxpYXNlcykgZW5k IHdpdGggYSB3aWxkY2FyZC4gIFRoYW5rcywKCgpZZXMsIHNvIEkgd2lsbCBhZGQgdGhhdCBmb3Ig ZnV0dXJlIGV4dGVuc2lvbi4KClRoYW5rcwoKCj4KPiBBbGV4Cj4KCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==