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.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, 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 BB429C33CB3 for ; Tue, 14 Jan 2020 10:05:54 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 731162467A for ; Tue, 14 Jan 2020 10:05:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="iWC0Zr0A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 731162467A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:35944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1irJ57-00064k-HQ for qemu-devel@archiver.kernel.org; Tue, 14 Jan 2020 05:05:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37080) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1irJ41-00052p-7P for qemu-devel@nongnu.org; Tue, 14 Jan 2020 05:04:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1irJ3y-0000GI-9P for qemu-devel@nongnu.org; Tue, 14 Jan 2020 05:04:45 -0500 Received: from esa3.hc3370-68.iphmx.com ([216.71.145.155]:40059) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1irJ3x-0000Ev-NJ for qemu-devel@nongnu.org; Tue, 14 Jan 2020 05:04:42 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1578996282; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=qxx3rA9hhMlVPBelH0+xqpyRUHbQaUMIaiHea6JarYk=; b=iWC0Zr0AjiMPxvLbTlKu81lrdaUhHwsK5e5GDjkPlarW/iGCMGsUFc6s rUx1f8ftYrwgmHiFjkrIZg8KkKcoN51BEpSLT8/lyG9ZuYmdWl4JQcCga kuoE7tUcBLUdBDKLncmDJXAdxwMi0Z2bGCQKUxbH7SjzwGLQf0MOPYuTl s=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=roger.pau@citrix.com; spf=Pass smtp.mailfrom=roger.pau@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of roger.pau@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of roger.pau@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: sghE+WHFnhZzApVd7UGFx09uGuh5xokj5Vfu6eoVGE96Nb/Tme3ifWwBRgpOHjJ8Oi3gnppU+z XBFOnJHDebAboMUOjp8mRhDLgQngNbUNLx9KTjU5vqZeNXe3ayp49yYNAif7QTSRIKwDsIdada xDa0Bc+6xbEVs5lfsI4ee3+K0tfqe+Oh0hIq6Vg9udrdNoIk6DeIFBlA1mEOz2s0aCcX1KCJ3+ DiH1N+88oUD2sT4jNfinb/1ELpzaTGTD4HWlz/s9HMY9kWNP93IxLzyuA5vngncRmuYlZ0802g dw8= X-SBRS: 2.7 X-MesageID: 10874124 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.69,432,1571716800"; d="scan'208";a="10874124" Date: Tue, 14 Jan 2020 11:04:06 +0100 From: Roger Pau =?iso-8859-1?Q?Monn=E9?= To: Jason Andryuk Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE Message-ID: <20200114100406.GF11756@Air-de-Roger> References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-ClientProxiedBy: AMSPEX02CAS02.citrite.net (10.69.22.113) To AMSPEX02CL01.citrite.net (10.69.22.125) X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 216.71.145.155 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Paul Durrant , Anthony Perard , "xen-devel@lists.xenproject.org" Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" On Mon, Jan 13, 2020 at 02:01:47PM -0500, Jason Andryuk wrote: > On Fri, Mar 22, 2019 at 3:43 PM Jason Andryuk wrote: > > > > On Thu, Mar 21, 2019 at 11:09 PM Roger Pau Monné wrote: > > > > > > On Wed, Mar 20, 2019 at 01:28:47PM -0400, Jason Andryuk wrote: > > > > On Fri, Mar 15, 2019 at 12:28 PM Andrew Cooper > > > > wrote: > > > > > > > > > > On 15/03/2019 09:17, Paul Durrant wrote: > > > > > >> -----Original Message----- > > > > > >> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > > >> Sent: 14 March 2019 18:16 > > > > > >> To: Paul Durrant > > > > > >> Cc: qemu-devel@nongnu.org; xen-devel@lists.xenproject.org; marmarek@invisiblethingslab.com; Simon > > > > > >> Gaiser ; Stefano Stabellini ; Anthony Perard > > > > > >> > > > > > >> Subject: Re: [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE > > > > > >> > > > > > >> On Wed, Mar 13, 2019 at 11:09 AM Paul Durrant wrote: > > > > > >>>> -----Original Message----- > > > > > >>>> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > > >>>> Sent: 11 March 2019 18:02 > > > > > >>>> To: qemu-devel@nongnu.org > > > > > >>>> Cc: xen-devel@lists.xenproject.org; marmarek@invisiblethingslab.com; Simon Gaiser > > > > > >>>> ; Jason Andryuk ; Stefano Stabellini > > > > > >>>> ; Anthony Perard ; Paul Durrant > > > > > >>>> > > > > > >>>> Subject: [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE > > > > > >>>> > > > > > >>>> From: Simon Gaiser > > > > > >>>> > > > > > >>>> If a pci memory region has a size < XEN_PAGE_SIZE it can get located at > > > > > >>>> an address which is not page aligned. > > > > > >>> IIRC the PCI spec says that the minimum memory region size should be at least 4k. Should we even be > > > > > >> tolerating BARs smaller than that? > > > > > >>> Paul > > > > > >>> > > > > > >> Hi, Paul. > > > > > >> > > > > > >> Simon found this, so it affects a real device. Simon, do you recall > > > > > >> which device was affected? > > > > > >> > > > > > >> I think BARs only need to be power-of-two size and aligned, and 4k is > > > > > >> not a minimum. 16bytes may be a minimum, but I don't know what the > > > > > >> spec says. > > > > > >> > > > > > >> On an Ivy Bridge system, here are some of the devices with BARs smaller than 4K: > > > > > >> 00:16.0 Communication controller: Intel Corporation 7 Series/C210 > > > > > >> Series Chipset Family MEI Controller #1 (rev 04) > > > > > >> Memory at d0735000 (64-bit, non-prefetchable) [disabled] [size=16] > > > > > >> 00:1d.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset > > > > > >> Family USB Enhanced Host Controller #1 (rev 04) (prog-if 20 [EHCI]) > > > > > >> Memory at d0739000 (32-bit, non-prefetchable) [disabled] [size=1K] > > > > > >> 00:1f.3 SMBus: Intel Corporation 7 Series/C210 Series Chipset Family > > > > > >> SMBus Controller (rev 04) > > > > > >> Memory at d0734000 (64-bit, non-prefetchable) [disabled] [size=256] > > > > > >> 02:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host > > > > > >> Controller (rev 30) > > > > > >> Memory at d0503000 (32-bit, non-prefetchable) [disabled] [size=256] > > > > > >> > > > > > >> These examples are all 4K aligned, so this is not an issue on this machine. > > > > > >> > > > > > >> Reviewing the code, I'm now wondering if the following in > > > > > >> hw/xen/xen_pt.c:xen_pt_region_update is wrong: rc = > > > > > >> xc_domain_memory_mapping(xen_xc, xen_domid, > > > > > >> XEN_PFN(guest_addr + XC_PAGE_SIZE - 1), > > > > > >> XEN_PFN(machine_addr + XC_PAGE_SIZE - 1), > > > > > >> XEN_PFN(size + XC_PAGE_SIZE - 1), > > > > > >> op); > > > > > >> > > > > > >> If a bar of size 0x100 is at 0xd0500800, then the machine_addr passed > > > > > >> in would be 0xd0501000 which is past the actual location. Should the > > > > > >> call arguments just be XEN_PFN(guest_addr) & XEN_PFN(machine_addr)? > > > > > >> > > > > > >> BARs smaller than a page would also be a problem if BARs for different > > > > > >> devices shared the same page. > > > > > > Exactly. We cannot pass them through with any degree of safety (not that passthrough of an arbitrary device is a particularly safe thing to do anyway). The xen-pt code would instead need to trap those BARs and perform the accesses to the real BAR itself. Ultimately though I think we should be retiring the xen-pt code in favour of a standalone emulator. > > > > > > > > > > It doesn't matter if the BAR is smaller than 4k, if there are holes next > > > > > to it. > > > > > > > > > > Do we know what the case is in practice for these USB controllers? > > > > > > > > > > If the worst comes to the worst, we can re-enumerate the PCI bus to > > > > > ensure that all bars smaller than 4k still have 4k alignment between > > > > > them. That way we can safely pass them through even when they are smaller. > > > > > > > > Andrew, thanks for checking the spec on the minimum BAR size. > > > > > > > > Dropping the Round PCI region patch from QMEU, the guest HVM will have: > > > > > > > > 00:06.0 SD Host controller: Ricoh Co Ltd PCIe SDXC/MMC Host Controller (rev 07) > > > > Memory at f2028800 (32-bit, non-prefetchable) [size=256] > > > > 00:07.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host > > > > Controller (rev 04) (prog-if 30 [XHCI]) > > > > Memory at f2024000 (64-bit, non-prefetchable) [size=8K] > > > > 00:08.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset > > > > Family USB Enhanced Host Controller #2 (rev 05) (prog-if 20 [EHCI]) > > > > Memory at f2028000 (32-bit, non-prefetchable) [size=1K] > > > > 00:09.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset > > > > Family USB Enhanced Host Controller #1 (rev 05) (prog-if 20 [EHCI]) > > > > Memory at f2028400 (32-bit, non-prefetchable) [size=1K] > > > > > > > > 00:09.0, 00:08.0 & 00:06.0 all share the same page. Only 00:08.0 is > > > > working. With some added debugging output, you'll see that the same > > > > page* is used for three of the BARs. > > > > > > > > [00:06.0] mapping guest_addr 0xf2028800 gfn 0xf2028 to maddr > > > > 0xe1a30000 mfn 0xe1a30 > > > > [00:07.0] mapping guest_addr 0xf2024000 gfn 0xf2024 to maddr > > > > 0xe0800000 mfn 0xe0800 > > > > [00:09.0] mapping guest_addr 0xf2028400 gfn 0xf2028 to maddr > > > > 0xe1900000 mfn 0xe1900 > > > > [00:08.0] mapping guest_addr 0xf2028000 gfn 0xf2028 to maddr > > > > 0xe1a2f000 mfn 0xe1a2f > > > > > > The patch below should prevent hvmloader from placing multiple BARs on > > > the same page, could you give it a try? > > > > > > Note that this is not going to prevent the guest from moving those > > > BARs around and place them in the same page, thus breaking the initial > > > placement done by hvmloader. > > > > > > Thanks, Roger. > > > > Hi, Roger. > > > > I've minimally tested this. Yes, this patch seems to place small BARs > > into separate pages. The linux stubdom and QEMU then use the spacing > > as provided by hvmloader. > > Roger, > > Would you mind submitting this patch to Xen? Hm, I'm half minded regarding this patch. It feels more like a bandaid than a proper solution. Mapping BARs not multiple of page-sizes is dangerous because AFAIK there's no entity that asserts there isn't any other BAR from a different device on the same page, and hence you might end up mapping some MMIO region from another device inadvertently. Anyway, I can formally submit the patch since it's no worse than what's currently done, but I would clearly state this is not safe in it's current state. Thanks, Roger. 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.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, 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 A72BEC3F68F for ; Tue, 14 Jan 2020 10:04:59 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 6B3A02467E for ; Tue, 14 Jan 2020 10:04:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="UEFVIIiq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6B3A02467E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1irJ3x-0001I5-QE; Tue, 14 Jan 2020 10:04:41 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1irJ3w-0001Hz-RD for xen-devel@lists.xenproject.org; Tue, 14 Jan 2020 10:04:40 +0000 X-Inumbo-ID: 45cf9bf4-36b5-11ea-835f-12813bfff9fa Received: from esa3.hc3370-68.iphmx.com (unknown [216.71.145.155]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 45cf9bf4-36b5-11ea-835f-12813bfff9fa; Tue, 14 Jan 2020 10:04:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1578996279; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=qxx3rA9hhMlVPBelH0+xqpyRUHbQaUMIaiHea6JarYk=; b=UEFVIIiqMxyIUAFJRygRLWQ2XMoItTewAVzwx73dPKHRC9F+lnwjpM6g TknDKrKERUeZChGpsiMAbfAdIXvlpa/PjjDeQXBrmTM0xRImNpHbTHwt2 8SV6pwwK4u7tqww+zDMUo4D1i09YeGiF/vCy4bbkfOUnCwTnlwckcHdzw M=; Authentication-Results: esa3.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=roger.pau@citrix.com; spf=Pass smtp.mailfrom=roger.pau@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of roger.pau@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa3.hc3370-68.iphmx.com: domain of roger.pau@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="roger.pau@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa3.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa3.hc3370-68.iphmx.com; envelope-from="roger.pau@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: sghE+WHFnhZzApVd7UGFx09uGuh5xokj5Vfu6eoVGE96Nb/Tme3ifWwBRgpOHjJ8Oi3gnppU+z XBFOnJHDebAboMUOjp8mRhDLgQngNbUNLx9KTjU5vqZeNXe3ayp49yYNAif7QTSRIKwDsIdada xDa0Bc+6xbEVs5lfsI4ee3+K0tfqe+Oh0hIq6Vg9udrdNoIk6DeIFBlA1mEOz2s0aCcX1KCJ3+ DiH1N+88oUD2sT4jNfinb/1ELpzaTGTD4HWlz/s9HMY9kWNP93IxLzyuA5vngncRmuYlZ0802g dw8= X-SBRS: 2.7 X-MesageID: 10874124 X-Ironport-Server: esa3.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.69,432,1571716800"; d="scan'208";a="10874124" Date: Tue, 14 Jan 2020 11:04:06 +0100 From: Roger Pau =?iso-8859-1?Q?Monn=E9?= To: Jason Andryuk Message-ID: <20200114100406.GF11756@Air-de-Roger> References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-ClientProxiedBy: AMSPEX02CAS02.citrite.net (10.69.22.113) To AMSPEX02CL01.citrite.net (10.69.22.125) Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Paul Durrant , Anthony Perard , "xen-devel@lists.xenproject.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gTW9uLCBKYW4gMTMsIDIwMjAgYXQgMDI6MDE6NDdQTSAtMDUwMCwgSmFzb24gQW5kcnl1ayB3 cm90ZToKPiBPbiBGcmksIE1hciAyMiwgMjAxOSBhdCAzOjQzIFBNIEphc29uIEFuZHJ5dWsgPGph bmRyeXVrQGdtYWlsLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gVGh1LCBNYXIgMjEsIDIwMTkgYXQg MTE6MDkgUE0gUm9nZXIgUGF1IE1vbm7DqSA8cm9nZXIucGF1QGNpdHJpeC5jb20+IHdyb3RlOgo+ ID4gPgo+ID4gPiBPbiBXZWQsIE1hciAyMCwgMjAxOSBhdCAwMToyODo0N1BNIC0wNDAwLCBKYXNv biBBbmRyeXVrIHdyb3RlOgo+ID4gPiA+IE9uIEZyaSwgTWFyIDE1LCAyMDE5IGF0IDEyOjI4IFBN IEFuZHJldyBDb29wZXIKPiA+ID4gPiA8YW5kcmV3LmNvb3BlcjNAY2l0cml4LmNvbT4gd3JvdGU6 Cj4gPiA+ID4gPgo+ID4gPiA+ID4gT24gMTUvMDMvMjAxOSAwOToxNywgUGF1bCBEdXJyYW50IHdy b3RlOgo+ID4gPiA+ID4gPj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+ID4gPiA+ID4+ IEZyb206IEphc29uIEFuZHJ5dWsgW21haWx0bzpqYW5kcnl1a0BnbWFpbC5jb21dCj4gPiA+ID4g PiA+PiBTZW50OiAxNCBNYXJjaCAyMDE5IDE4OjE2Cj4gPiA+ID4gPiA+PiBUbzogUGF1bCBEdXJy YW50IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4KPiA+ID4gPiA+ID4+IENjOiBxZW11LWRldmVs QG5vbmdudS5vcmc7IHhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZzsgbWFybWFyZWtAaW52 aXNpYmxldGhpbmdzbGFiLmNvbTsgU2ltb24KPiA+ID4gPiA+ID4+IEdhaXNlciA8c2ltb25AaW52 aXNpYmxldGhpbmdzbGFiLmNvbT47IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3N0YWJlbGxpbmlAa2Vy bmVsLm9yZz47IEFudGhvbnkgUGVyYXJkCj4gPiA+ID4gPiA+PiA8YW50aG9ueS5wZXJhcmRAY2l0 cml4LmNvbT4KPiA+ID4gPiA+ID4+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggNi82XSB4ZW4tcHQ6IFJv dW5kIHBjaSByZWdpb25zIHNpemVzIHRvIFhFTl9QQUdFX1NJWkUKPiA+ID4gPiA+ID4+Cj4gPiA+ ID4gPiA+PiBPbiBXZWQsIE1hciAxMywgMjAxOSBhdCAxMTowOSBBTSBQYXVsIER1cnJhbnQgPFBh dWwuRHVycmFudEBjaXRyaXguY29tPiB3cm90ZToKPiA+ID4gPiA+ID4+Pj4gLS0tLS1PcmlnaW5h bCBNZXNzYWdlLS0tLS0KPiA+ID4gPiA+ID4+Pj4gRnJvbTogSmFzb24gQW5kcnl1ayBbbWFpbHRv OmphbmRyeXVrQGdtYWlsLmNvbV0KPiA+ID4gPiA+ID4+Pj4gU2VudDogMTEgTWFyY2ggMjAxOSAx ODowMgo+ID4gPiA+ID4gPj4+PiBUbzogcWVtdS1kZXZlbEBub25nbnUub3JnCj4gPiA+ID4gPiA+ Pj4+IENjOiB4ZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmc7IG1hcm1hcmVrQGludmlzaWJs ZXRoaW5nc2xhYi5jb207IFNpbW9uIEdhaXNlcgo+ID4gPiA+ID4gPj4+PiA8c2ltb25AaW52aXNp YmxldGhpbmdzbGFiLmNvbT47IEphc29uIEFuZHJ5dWsgPGphbmRyeXVrQGdtYWlsLmNvbT47IFN0 ZWZhbm8gU3RhYmVsbGluaQo+ID4gPiA+ID4gPj4+PiA8c3N0YWJlbGxpbmlAa2VybmVsLm9yZz47 IEFudGhvbnkgUGVyYXJkIDxhbnRob255LnBlcmFyZEBjaXRyaXguY29tPjsgUGF1bCBEdXJyYW50 Cj4gPiA+ID4gPiA+Pj4+IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4KPiA+ID4gPiA+ID4+Pj4g U3ViamVjdDogW1BBVENIIDYvNl0geGVuLXB0OiBSb3VuZCBwY2kgcmVnaW9ucyBzaXplcyB0byBY RU5fUEFHRV9TSVpFCj4gPiA+ID4gPiA+Pj4+Cj4gPiA+ID4gPiA+Pj4+IEZyb206IFNpbW9uIEdh aXNlciA8c2ltb25AaW52aXNpYmxldGhpbmdzbGFiLmNvbT4KPiA+ID4gPiA+ID4+Pj4KPiA+ID4g PiA+ID4+Pj4gSWYgYSBwY2kgbWVtb3J5IHJlZ2lvbiBoYXMgYSBzaXplIDwgWEVOX1BBR0VfU0la RSBpdCBjYW4gZ2V0IGxvY2F0ZWQgYXQKPiA+ID4gPiA+ID4+Pj4gYW4gYWRkcmVzcyB3aGljaCBp cyBub3QgcGFnZSBhbGlnbmVkLgo+ID4gPiA+ID4gPj4+IElJUkMgdGhlIFBDSSBzcGVjIHNheXMg dGhhdCB0aGUgbWluaW11bSBtZW1vcnkgcmVnaW9uIHNpemUgc2hvdWxkIGJlIGF0IGxlYXN0IDRr LiBTaG91bGQgd2UgZXZlbiBiZQo+ID4gPiA+ID4gPj4gdG9sZXJhdGluZyBCQVJzIHNtYWxsZXIg dGhhbiB0aGF0Pwo+ID4gPiA+ID4gPj4+ICAgUGF1bAo+ID4gPiA+ID4gPj4+Cj4gPiA+ID4gPiA+ PiBIaSwgUGF1bC4KPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+PiBTaW1vbiBmb3VuZCB0aGlzLCBz byBpdCBhZmZlY3RzIGEgcmVhbCBkZXZpY2UuICBTaW1vbiwgZG8geW91IHJlY2FsbAo+ID4gPiA+ ID4gPj4gd2hpY2ggZGV2aWNlIHdhcyBhZmZlY3RlZD8KPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+ PiBJIHRoaW5rIEJBUnMgb25seSBuZWVkIHRvIGJlIHBvd2VyLW9mLXR3byBzaXplIGFuZCBhbGln bmVkLCBhbmQgNGsgaXMKPiA+ID4gPiA+ID4+IG5vdCBhIG1pbmltdW0uICAxNmJ5dGVzIG1heSBi ZSBhIG1pbmltdW0sIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGUKPiA+ID4gPiA+ID4+IHNwZWMg c2F5cy4KPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+PiBPbiBhbiBJdnkgQnJpZGdlIHN5c3RlbSwg aGVyZSBhcmUgc29tZSBvZiB0aGUgZGV2aWNlcyB3aXRoIEJBUnMgc21hbGxlciB0aGFuIDRLOgo+ ID4gPiA+ID4gPj4gMDA6MTYuMCBDb21tdW5pY2F0aW9uIGNvbnRyb2xsZXI6IEludGVsIENvcnBv cmF0aW9uIDcgU2VyaWVzL0MyMTAKPiA+ID4gPiA+ID4+IFNlcmllcyBDaGlwc2V0IEZhbWlseSBN RUkgQ29udHJvbGxlciAjMSAocmV2IDA0KQo+ID4gPiA+ID4gPj4gICAgTWVtb3J5IGF0IGQwNzM1 MDAwICg2NC1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtkaXNhYmxlZF0gW3NpemU9MTZdCj4gPiA+ ID4gPiA+PiAwMDoxZC4wIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlvbiA3IFNlcmll cy9DMjEwIFNlcmllcyBDaGlwc2V0Cj4gPiA+ID4gPiA+PiBGYW1pbHkgVVNCIEVuaGFuY2VkIEhv c3QgQ29udHJvbGxlciAjMSAocmV2IDA0KSAocHJvZy1pZiAyMCBbRUhDSV0pCj4gPiA+ID4gPiA+ PiAgICBNZW1vcnkgYXQgZDA3MzkwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW2Rpc2Fi bGVkXSBbc2l6ZT0xS10KPiA+ID4gPiA+ID4+IDAwOjFmLjMgU01CdXM6IEludGVsIENvcnBvcmF0 aW9uIDcgU2VyaWVzL0MyMTAgU2VyaWVzIENoaXBzZXQgRmFtaWx5Cj4gPiA+ID4gPiA+PiBTTUJ1 cyBDb250cm9sbGVyIChyZXYgMDQpCj4gPiA+ID4gPiA+PiAgICBNZW1vcnkgYXQgZDA3MzQwMDAg KDY0LWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW2Rpc2FibGVkXSBbc2l6ZT0yNTZdCj4gPiA+ID4g PiA+PiAwMjowMC4wIFN5c3RlbSBwZXJpcGhlcmFsOiBKTWljcm9uIFRlY2hub2xvZ3kgQ29ycC4g U0QvTU1DIEhvc3QKPiA+ID4gPiA+ID4+IENvbnRyb2xsZXIgKHJldiAzMCkKPiA+ID4gPiA+ID4+ ICAgIE1lbW9yeSBhdCBkMDUwMzAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbZGlzYWJs ZWRdIFtzaXplPTI1Nl0KPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+PiBUaGVzZSBleGFtcGxlcyBh cmUgYWxsIDRLIGFsaWduZWQsIHNvIHRoaXMgaXMgbm90IGFuIGlzc3VlIG9uIHRoaXMgbWFjaGlu ZS4KPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+PiBSZXZpZXdpbmcgdGhlIGNvZGUsIEknbSBub3cg d29uZGVyaW5nIGlmIHRoZSBmb2xsb3dpbmcgaW4KPiA+ID4gPiA+ID4+IGh3L3hlbi94ZW5fcHQu Yzp4ZW5fcHRfcmVnaW9uX3VwZGF0ZSBpcyB3cm9uZzogICAgICAgIHJjID0KPiA+ID4gPiA+ID4+ IHhjX2RvbWFpbl9tZW1vcnlfbWFwcGluZyh4ZW5feGMsIHhlbl9kb21pZCwKPiA+ID4gPiA+ID4+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRU5fUEZOKGd1ZXN0X2FkZHIg KyBYQ19QQUdFX1NJWkUgLSAxKSwKPiA+ID4gPiA+ID4+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBYRU5fUEZOKG1hY2hpbmVfYWRkciArIFhDX1BBR0VfU0laRSAtIDEpLAo+ ID4gPiA+ID4gPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhFTl9QRk4o c2l6ZSArIFhDX1BBR0VfU0laRSAtIDEpLAo+ID4gPiA+ID4gPj4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG9wKTsKPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+PiBJZiBhIGJh ciBvZiBzaXplIDB4MTAwIGlzIGF0IDB4ZDA1MDA4MDAsIHRoZW4gdGhlIG1hY2hpbmVfYWRkciBw YXNzZWQKPiA+ID4gPiA+ID4+IGluIHdvdWxkIGJlIDB4ZDA1MDEwMDAgd2hpY2ggaXMgcGFzdCB0 aGUgYWN0dWFsIGxvY2F0aW9uLiAgU2hvdWxkIHRoZQo+ID4gPiA+ID4gPj4gY2FsbCBhcmd1bWVu dHMganVzdCBiZSBYRU5fUEZOKGd1ZXN0X2FkZHIpICYgWEVOX1BGTihtYWNoaW5lX2FkZHIpPwo+ ID4gPiA+ID4gPj4KPiA+ID4gPiA+ID4+IEJBUnMgc21hbGxlciB0aGFuIGEgcGFnZSB3b3VsZCBh bHNvIGJlIGEgcHJvYmxlbSBpZiBCQVJzIGZvciBkaWZmZXJlbnQKPiA+ID4gPiA+ID4+IGRldmlj ZXMgc2hhcmVkIHRoZSBzYW1lIHBhZ2UuCj4gPiA+ID4gPiA+IEV4YWN0bHkuIFdlIGNhbm5vdCBw YXNzIHRoZW0gdGhyb3VnaCB3aXRoIGFueSBkZWdyZWUgb2Ygc2FmZXR5IChub3QgdGhhdCBwYXNz dGhyb3VnaCBvZiBhbiBhcmJpdHJhcnkgZGV2aWNlIGlzIGEgcGFydGljdWxhcmx5IHNhZmUgdGhp bmcgdG8gZG8gYW55d2F5KS4gVGhlIHhlbi1wdCBjb2RlIHdvdWxkIGluc3RlYWQgbmVlZCB0byB0 cmFwIHRob3NlIEJBUnMgYW5kIHBlcmZvcm0gdGhlIGFjY2Vzc2VzIHRvIHRoZSByZWFsIEJBUiBp dHNlbGYuIFVsdGltYXRlbHkgdGhvdWdoIEkgdGhpbmsgd2Ugc2hvdWxkIGJlIHJldGlyaW5nIHRo ZSB4ZW4tcHQgY29kZSBpbiBmYXZvdXIgb2YgYSBzdGFuZGFsb25lIGVtdWxhdG9yLgo+ID4gPiA+ ID4KPiA+ID4gPiA+IEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBCQVIgaXMgc21hbGxlciB0aGFu IDRrLCBpZiB0aGVyZSBhcmUgaG9sZXMgbmV4dAo+ID4gPiA+ID4gdG8gaXQuCj4gPiA+ID4gPgo+ ID4gPiA+ID4gRG8gd2Uga25vdyB3aGF0IHRoZSBjYXNlIGlzIGluIHByYWN0aWNlIGZvciB0aGVz ZSBVU0IgY29udHJvbGxlcnM/Cj4gPiA+ID4gPgo+ID4gPiA+ID4gSWYgdGhlIHdvcnN0IGNvbWVz IHRvIHRoZSB3b3JzdCwgd2UgY2FuIHJlLWVudW1lcmF0ZSB0aGUgUENJIGJ1cyB0bwo+ID4gPiA+ ID4gZW5zdXJlIHRoYXQgYWxsIGJhcnMgc21hbGxlciB0aGFuIDRrIHN0aWxsIGhhdmUgNGsgYWxp Z25tZW50IGJldHdlZW4KPiA+ID4gPiA+IHRoZW0uICBUaGF0IHdheSB3ZSBjYW4gc2FmZWx5IHBh c3MgdGhlbSB0aHJvdWdoIGV2ZW4gd2hlbiB0aGV5IGFyZSBzbWFsbGVyLgo+ID4gPiA+Cj4gPiA+ ID4gQW5kcmV3LCB0aGFua3MgZm9yIGNoZWNraW5nIHRoZSBzcGVjIG9uIHRoZSBtaW5pbXVtIEJB UiBzaXplLgo+ID4gPiA+Cj4gPiA+ID4gRHJvcHBpbmcgdGhlIFJvdW5kIFBDSSByZWdpb24gcGF0 Y2ggZnJvbSBRTUVVLCB0aGUgZ3Vlc3QgSFZNIHdpbGwgaGF2ZToKPiA+ID4gPgo+ID4gPiA+IDAw OjA2LjAgU0QgSG9zdCBjb250cm9sbGVyOiBSaWNvaCBDbyBMdGQgUENJZSBTRFhDL01NQyBIb3N0 IENvbnRyb2xsZXIgKHJldiAwNykKPiA+ID4gPiAgICAgTWVtb3J5IGF0IGYyMDI4ODAwICgzMi1i aXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTI1Nl0KPiA+ID4gPiAwMDowNy4wIFVTQiBjb250 cm9sbGVyOiBORUMgQ29ycG9yYXRpb24gdVBENzIwMjAwIFVTQiAzLjAgSG9zdAo+ID4gPiA+IENv bnRyb2xsZXIgKHJldiAwNCkgKHByb2ctaWYgMzAgW1hIQ0ldKQo+ID4gPiA+ICAgICBNZW1vcnkg YXQgZjIwMjQwMDAgKDY0LWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9OEtdCj4gPiA+ID4g MDA6MDguMCBVU0IgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gNiBTZXJpZXMvQzIwMCBT ZXJpZXMgQ2hpcHNldAo+ID4gPiA+IEZhbWlseSBVU0IgRW5oYW5jZWQgSG9zdCBDb250cm9sbGVy ICMyIChyZXYgMDUpIChwcm9nLWlmIDIwIFtFSENJXSkKPiA+ID4gPiAgICAgTWVtb3J5IGF0IGYy MDI4MDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTFLXQo+ID4gPiA+IDAwOjA5 LjAgVVNCIGNvbnRyb2xsZXI6IEludGVsIENvcnBvcmF0aW9uIDYgU2VyaWVzL0MyMDAgU2VyaWVz IENoaXBzZXQKPiA+ID4gPiBGYW1pbHkgVVNCIEVuaGFuY2VkIEhvc3QgQ29udHJvbGxlciAjMSAo cmV2IDA1KSAocHJvZy1pZiAyMCBbRUhDSV0pCj4gPiA+ID4gICAgIE1lbW9yeSBhdCBmMjAyODQw MCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xS10KPiA+ID4gPgo+ID4gPiA+IDAw OjA5LjAsIDAwOjA4LjAgJiAwMDowNi4wIGFsbCBzaGFyZSB0aGUgc2FtZSBwYWdlLiAgT25seSAw MDowOC4wIGlzCj4gPiA+ID4gd29ya2luZy4gIFdpdGggc29tZSBhZGRlZCBkZWJ1Z2dpbmcgb3V0 cHV0LCB5b3UnbGwgc2VlIHRoYXQgdGhlIHNhbWUKPiA+ID4gPiBwYWdlKiBpcyB1c2VkIGZvciB0 aHJlZSBvZiB0aGUgQkFScy4KPiA+ID4gPgo+ID4gPiA+IFswMDowNi4wXSBtYXBwaW5nIGd1ZXN0 X2FkZHIgMHhmMjAyODgwMCBnZm4gMHhmMjAyOCB0byBtYWRkcgo+ID4gPiA+IDB4ZTFhMzAwMDAg bWZuIDB4ZTFhMzAKPiA+ID4gPiBbMDA6MDcuMF0gbWFwcGluZyBndWVzdF9hZGRyIDB4ZjIwMjQw MDAgZ2ZuIDB4ZjIwMjQgdG8gbWFkZHIKPiA+ID4gPiAweGUwODAwMDAwIG1mbiAweGUwODAwCj4g PiA+ID4gWzAwOjA5LjBdIG1hcHBpbmcgZ3Vlc3RfYWRkciAweGYyMDI4NDAwIGdmbiAweGYyMDI4 IHRvIG1hZGRyCj4gPiA+ID4gMHhlMTkwMDAwMCBtZm4gMHhlMTkwMAo+ID4gPiA+IFswMDowOC4w XSBtYXBwaW5nIGd1ZXN0X2FkZHIgMHhmMjAyODAwMCBnZm4gMHhmMjAyOCB0byBtYWRkcgo+ID4g PiA+IDB4ZTFhMmYwMDAgbWZuIDB4ZTFhMmYKPiA+ID4KPiA+ID4gVGhlIHBhdGNoIGJlbG93IHNo b3VsZCBwcmV2ZW50IGh2bWxvYWRlciBmcm9tIHBsYWNpbmcgbXVsdGlwbGUgQkFScyBvbgo+ID4g PiB0aGUgc2FtZSBwYWdlLCBjb3VsZCB5b3UgZ2l2ZSBpdCBhIHRyeT8KPiA+ID4KPiA+ID4gTm90 ZSB0aGF0IHRoaXMgaXMgbm90IGdvaW5nIHRvIHByZXZlbnQgdGhlIGd1ZXN0IGZyb20gbW92aW5n IHRob3NlCj4gPiA+IEJBUnMgYXJvdW5kIGFuZCBwbGFjZSB0aGVtIGluIHRoZSBzYW1lIHBhZ2Us IHRodXMgYnJlYWtpbmcgdGhlIGluaXRpYWwKPiA+ID4gcGxhY2VtZW50IGRvbmUgYnkgaHZtbG9h ZGVyLgo+ID4gPgo+ID4gPiBUaGFua3MsIFJvZ2VyLgo+ID4KPiA+IEhpLCBSb2dlci4KPiA+Cj4g PiBJJ3ZlIG1pbmltYWxseSB0ZXN0ZWQgdGhpcy4gIFllcywgdGhpcyBwYXRjaCBzZWVtcyB0byBw bGFjZSBzbWFsbCBCQVJzCj4gPiBpbnRvIHNlcGFyYXRlIHBhZ2VzLiAgVGhlIGxpbnV4IHN0dWJk b20gYW5kIFFFTVUgdGhlbiB1c2UgdGhlIHNwYWNpbmcKPiA+IGFzIHByb3ZpZGVkIGJ5IGh2bWxv YWRlci4KPiAKPiBSb2dlciwKPiAKPiBXb3VsZCB5b3UgbWluZCBzdWJtaXR0aW5nIHRoaXMgcGF0 Y2ggdG8gWGVuPwoKSG0sIEknbSBoYWxmIG1pbmRlZCByZWdhcmRpbmcgdGhpcyBwYXRjaC4gSXQg ZmVlbHMgbW9yZSBsaWtlIGEgYmFuZGFpZAp0aGFuIGEgcHJvcGVyIHNvbHV0aW9uLiBNYXBwaW5n IEJBUnMgbm90IG11bHRpcGxlIG9mIHBhZ2Utc2l6ZXMgaXMKZGFuZ2Vyb3VzIGJlY2F1c2UgQUZB SUsgdGhlcmUncyBubyBlbnRpdHkgdGhhdCBhc3NlcnRzIHRoZXJlIGlzbid0IGFueQpvdGhlciBC QVIgZnJvbSBhIGRpZmZlcmVudCBkZXZpY2Ugb24gdGhlIHNhbWUgcGFnZSwgYW5kIGhlbmNlIHlv dQptaWdodCBlbmQgdXAgbWFwcGluZyBzb21lIE1NSU8gcmVnaW9uIGZyb20gYW5vdGhlciBkZXZp Y2UKaW5hZHZlcnRlbnRseS4KCkFueXdheSwgSSBjYW4gZm9ybWFsbHkgc3VibWl0IHRoZSBwYXRj aCBzaW5jZSBpdCdzIG5vIHdvcnNlIHRoYW4Kd2hhdCdzIGN1cnJlbnRseSBkb25lLCBidXQgSSB3 b3VsZCBjbGVhcmx5IHN0YXRlIHRoaXMgaXMgbm90IHNhZmUgaW4KaXQncyBjdXJyZW50IHN0YXRl LgoKVGhhbmtzLCBSb2dlci4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2pl Y3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4t ZGV2ZWw=