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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 76E7EC433FE for ; Thu, 20 Oct 2022 17:12:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229705AbiJTRMq (ORCPT ); Thu, 20 Oct 2022 13:12:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55540 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229608AbiJTRMT (ORCPT ); Thu, 20 Oct 2022 13:12:19 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2560C1A9109; Thu, 20 Oct 2022 10:12:17 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id A3AC3B826AE; Thu, 20 Oct 2022 17:12:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EF1CC433C1; Thu, 20 Oct 2022 17:12:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666285934; bh=JAbklPdWA2kNdSMvOQRBF6Ch5NifGjOncSXTOt9A7WA=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=YBU+i3Rc69OnfayDbsDVf6+t8E46fzm125M6mX9NwPHQ3cKl4b97FDk86RC+wM4RA Mh3HPnilZs66oyCdtApQnm12b20T7bAdSPngYTU/D9Y80e6AbetSqF9cdFH4xTD0PI x4iCZ2gvczPrXiOX7L8lKbSoOaqIwg3+sATUtcbhtbIJttHz8devZSK+gAUZEwu2VE kVWhREi3ZkyS+2L32w9RD5hAC/17hvMsdMl/hGhCobBAZkmCVunL/Gw/cEck1Q7kPz A8nrKmZcajXQT3OaHB2pX1bNHrtwMfgffPVPvYLaEptMd7t3poN2D70CL2HFQUOKdT jBkEEaFDkN82w== Date: Thu, 20 Oct 2022 12:12:12 -0500 From: Bjorn Helgaas To: Elad Nachman Cc: Pali =?iso-8859-1?Q?Roh=E1r?= , Lorenzo Pieralisi , Bjorn Helgaas , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [EXT] Re: [PATCH v2] PCI: aardvark: Implement workaround for PCIe Completion Timeout Message-ID: <20221020171212.GA132958@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Thu, Oct 06, 2022 at 08:14:48AM +0000, Elad Nachman wrote: > Hi, > > Regarding number #1 : > The H/W erratum means strong ordering mode is not properly > implemented in the H/W. The workaround is to set DIS_ORD_CHK to > disable the ordered check, to prevent the issues Pali mentioned. > > Leaving it without the workaround means encountering the crashes > Pali mentioned. The H/W was originally designed to have the strong > ordering mode, per what is expected of PCI Express, but due to this > erratum, it cannot be supported by the taped-out H/W. There is > nothing to do about it now in the H/W, as this is a years old SOC. > Software wise the only option is the workaround above, or to accept > sporadic crashes of the kernel. > > Regarding number #2 : > The impact of the workaround is that the DMA done status could be > set before the last data is written to the host memory, causing the > host to read incomplete data. This is the reason why I recommended > to add a memory barrier. If this is bothering, the memory barrier > can be removed from the patch, although I suggest to thoroughly test > the data integrity if implementing the patch without the memory > barrier. Thank you very much for these details, Elad. If I understand correctly, this patch avoids many issues (or at least makes them much less likely), but there is still a small possibility of corner cases where a correctly-written driver would work on other platforms but not on this hardware. Since this definitely improves things dramatically, I think it's worth doing even if it's not absolutely 100%. The commit log and code comments should be enough of a hint. > -----Original Message----- > From: Pali Rohár > Sent: Tuesday, October 4, 2022 11:40 AM > To: Elad Nachman ; Lorenzo Pieralisi > Cc: Bjorn Helgaas ; Krzysztof Wilczyński ; linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org > Subject: Re: [EXT] Re: [PATCH v2] PCI: aardvark: Implement workaround for PCIe Completion Timeout > > + Elad > > Could you please look at Lorenzo's comments and help with this fix? > > On Tuesday 04 October 2022 10:02:32 Lorenzo Pieralisi wrote: > > On Mon, Oct 03, 2022 at 11:14:12PM +0200, Pali Rohár wrote: > > > Lorenzo, is something more needed for this patch? As it workarounds > > > crashing it is really needed to have it in mainline and backports. > > > > Yes, a clear explanation from Marvell about what this is actually > > fixing - it took me a while to go through the whole thread but I still > > don't understand what this patch actually does and why. > > > > An Erratum workaround (if there is any) should define and explain a SW > > workaround. > > > > (1) Bjorn's concerns in relation to PCI memory model weren't addressed > > (2) We don't add undocumented memory barriers to the kernel to "minimize > > risks". Either we fix a bug or we don't. If we do, write that down > > and document why the barrier is there and the issue it solves. > > > > I understand that basically you are reverse engineering a HW bug but I > > am afraid we can't fix the kernel this way - more so with patches > > going to be backported to stable kernels. > > > > Lorenzo > > > > > On Wednesday 28 September 2022 14:05:10 Elad Nachman wrote: > > > > Reviewed-by: Elad Nachman > > > > > > > > Thanks, > > > > > > > > Elad. > > > > > > > > -----Original Message----- > > > > From: Pali Rohár > > > > Sent: Monday, September 26, 2022 3:35 PM > > > > To: Elad Nachman > > > > Cc: Thomas Petazzoni ; Lorenzo > > > > Pieralisi ; Bjorn Helgaas > > > > ; Krzysztof Wilczyński ; Rob > > > > Herring ; linux-pci@vger.kernel.org; > > > > linux-arm-kernel@lists.infradead.org; > > > > linux-kernel@vger.kernel.org; Gregory Clement > > > > ; Marek Behún ; > > > > Remi Pommarel ; Xogium ; > > > > Tomasz Maciej Nowak > > > > Subject: [EXT] Re: [PATCH v2] PCI: aardvark: Implement workaround > > > > for PCIe Completion Timeout > > > > > > > > External Email > > > > > > > > ------------------------------------------------------------------ > > > > ---- Hello Elad, could you please review this patch? I have > > > > implemented it according your instructions, including that full memory barrier as you described. > > > > > > > > On Tuesday 02 August 2022 14:38:16 Pali Rohár wrote: > > > > > Marvell Armada 3700 Functional Errata, Guidelines, and > > > > > Restrictions document describes in erratum 3.12 PCIe Completion Timeout (Ref #: > > > > > 251), that PCIe IP does not support a strong-ordered model for inbound posted vs. > > > > > outbound completion. > > > > > > > > > > As a workaround for this erratum, DIS_ORD_CHK flag in Debug Mux > > > > > Control register must be set. It disables the ordering check in > > > > > the core between Completions and Posted requests received from the link. > > > > > > > > > > Marvell also suggests to do full memory barrier at the beginning > > > > > of aardvark summary interrupt handler before calling interrupt > > > > > handlers of endpoint drivers in order to minimize the risk for > > > > > the race condition documented in the Erratum between the DMA > > > > > done status reading and the completion of writing to the host memory. > > > > > > > > > > More details about this issue and suggested workarounds are in discussion: > > > > > https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel > > > > > .org_l > > > > > inux-2Dpci_BN9PR18MB425154FE5019DCAF2028A1D5DB8D9-40BN9PR18MB425 > > > > > 1.namp > > > > > rd18.prod.outlook.com_t_-23u&d=DwIDaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r > > > > > =eTeNT > > > > > LEK5-TxXczjOcKPhANIFtlB9pP4lq9qhdlFrwQ&m=bjgkhgPgOjqCEsbHYHONCZM > > > > > iFDX72 > > > > > MztWaE0AvWBktQVn3zKEDtUdn02Kx_KJ14B&s=SToGsDGEObwbZGilVtVZPyME8j > > > > > NiRgrq > > > > > 4SDYvqqT0TA&e= > > > > > > > > > > It was reported that enabling this workaround fixes instability > > > > > issues and "Unhandled fault" errors when using 60 GHz WiFi > > > > > 802.11ad card with Qualcomm > > > > > QCA6335 chip under significant load which were caused by > > > > > interrupt status stuck in the outbound CMPLT queue traced back to this erratum. > > > > > > > > > > This workaround fixes also kernel panic triggered after some > > > > > minutes of usage 5 GHz WiFi 802.11ax card with Mediatek MT7915 chip: > > > > > > > > > > Internal error: synchronous external abort: 96000210 [#1] SMP > > > > > Kernel panic - not syncing: Fatal exception in interrupt > > > > > > > > > > Signed-off-by: Thomas Petazzoni > > > > > Signed-off-by: Pali Rohár > > > > > Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host > > > > > controller > > > > > driver") > > > > > Cc: stable@vger.kernel.org > > > > > --- > > > > > drivers/pci/controller/pci-aardvark.c | 10 ++++++++++ > > > > > 1 file changed, 10 insertions(+) > > > > > > > > > > diff --git a/drivers/pci/controller/pci-aardvark.c > > > > > b/drivers/pci/controller/pci-aardvark.c > > > > > index 060936ef01fe..3ae8a85ec72e 100644 > > > > > --- a/drivers/pci/controller/pci-aardvark.c > > > > > +++ b/drivers/pci/controller/pci-aardvark.c > > > > > @@ -210,6 +210,8 @@ enum { > > > > > }; > > > > > > > > > > #define VENDOR_ID_REG (LMI_BASE_ADDR + 0x44) > > > > > +#define DEBUG_MUX_CTRL_REG (LMI_BASE_ADDR + 0x208) > > > > > +#define DIS_ORD_CHK BIT(30) > > > > > > > > > > /* PCIe core controller registers */ > > > > > #define CTRL_CORE_BASE_ADDR 0x18000 > > > > > @@ -558,6 +560,11 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) > > > > > PCIE_CORE_CTRL2_TD_ENABLE; > > > > > advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG); > > > > > > > > > > + /* Disable ordering checks, workaround for erratum 3.12 "PCIe completion timeout" */ > > > > > + reg = advk_readl(pcie, DEBUG_MUX_CTRL_REG); > > > > > + reg |= DIS_ORD_CHK; > > > > > + advk_writel(pcie, reg, DEBUG_MUX_CTRL_REG); > > > > > + > > > > > /* Set lane X1 */ > > > > > reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); > > > > > reg &= ~LANE_CNT_MSK; > > > > > @@ -1581,6 +1588,9 @@ static irqreturn_t advk_pcie_irq_handler(int irq, void *arg) > > > > > struct advk_pcie *pcie = arg; > > > > > u32 status; > > > > > > > > > > + /* Full memory barrier (ARM dsb sy), workaround for erratum 3.12 "PCIe completion timeout" */ > > > > > + mb(); > > > > > + > > > > > status = advk_readl(pcie, HOST_CTRL_INT_STATUS_REG); > > > > > if (!(status & PCIE_IRQ_CORE_INT)) > > > > > return IRQ_NONE; > > > > > -- > > > > > 2.20.1 > > > > > > > > > > > _______________________________________________ > > > linux-arm-kernel mailing list > > > linux-arm-kernel@lists.infradead.org > > > https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.infradead. > > > org_mailman_listinfo_linux-2Darm-2Dkernel&d=DwIDaQ&c=nKjWec2b6R0mOyP > > > az7xtfQ&r=eTeNTLEK5-TxXczjOcKPhANIFtlB9pP4lq9qhdlFrwQ&m=2NzkT9KLO26k > > > efUOw2nIeSeRnJVZLxEiBXqEoRvDQ0ueww6n4YaXWgAN1uCJX20o&s=nczACS_2jERbA > > > -c4Gfar0-HTA4PtvZdJmsBv8jhW8G0&e= > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C4930C43217 for ; Thu, 20 Oct 2022 17:13:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:References: List-Owner; bh=Aa3j9ZZdsB/+J4oIfCF/d9pL/mKg5+lKS+VrRUOI38o=; b=sdo4cYhG0/zzeH f9NnJkPGQtCwx0AIJ0RTqy8q0j40NRSV7W6w9Kknf6d79K38dyRGodPEqDiff6ej/RUMfIl+u94ma 2JNpb6IfFAk4h0i5IfgD+dH4Sm489tjuunwsGVnMg3x9iTK6Db34Ocu7qwjiokLIkkyhkFpWQFaFX spvBpnu5FWrEXp4aANeEu5CXrnENApA7uUnUVha0/1k63qIjacWH8OGwyl3BZMdkO1sOM1MFzVdIW IihJWG5XLX/jl6Kd88O2P3i6kkKHRzbDgeN9OC6yRGM9LXl3j2hXYOCn972tKlsqdliLRTAOoJy/l d7Pzm/WHFHl9ZS0L+sjA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1olZ5i-000mVR-Jw; Thu, 20 Oct 2022 17:12:22 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1olZ5d-000mSn-On for linux-arm-kernel@lists.infradead.org; Thu, 20 Oct 2022 17:12:20 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 08BCC61CAF; Thu, 20 Oct 2022 17:12:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EF1CC433C1; Thu, 20 Oct 2022 17:12:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666285934; bh=JAbklPdWA2kNdSMvOQRBF6Ch5NifGjOncSXTOt9A7WA=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=YBU+i3Rc69OnfayDbsDVf6+t8E46fzm125M6mX9NwPHQ3cKl4b97FDk86RC+wM4RA Mh3HPnilZs66oyCdtApQnm12b20T7bAdSPngYTU/D9Y80e6AbetSqF9cdFH4xTD0PI x4iCZ2gvczPrXiOX7L8lKbSoOaqIwg3+sATUtcbhtbIJttHz8devZSK+gAUZEwu2VE kVWhREi3ZkyS+2L32w9RD5hAC/17hvMsdMl/hGhCobBAZkmCVunL/Gw/cEck1Q7kPz A8nrKmZcajXQT3OaHB2pX1bNHrtwMfgffPVPvYLaEptMd7t3poN2D70CL2HFQUOKdT jBkEEaFDkN82w== Date: Thu, 20 Oct 2022 12:12:12 -0500 From: Bjorn Helgaas To: Elad Nachman Cc: Pali =?iso-8859-1?Q?Roh=E1r?= , Lorenzo Pieralisi , Bjorn Helgaas , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" Subject: Re: [EXT] Re: [PATCH v2] PCI: aardvark: Implement workaround for PCIe Completion Timeout Message-ID: <20221020171212.GA132958@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221020_101217_925273_B0EF8574 X-CRM114-Status: GOOD ( 66.21 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVGh1LCBPY3QgMDYsIDIwMjIgYXQgMDg6MTQ6NDhBTSArMDAwMCwgRWxhZCBOYWNobWFuIHdy b3RlOgo+IEhpLAo+IAo+IFJlZ2FyZGluZyBudW1iZXIgIzEgOgo+IFRoZSBIL1cgZXJyYXR1bSBt ZWFucyBzdHJvbmcgb3JkZXJpbmcgbW9kZSBpcyBub3QgcHJvcGVybHkKPiBpbXBsZW1lbnRlZCBp biB0aGUgSC9XLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gc2V0IERJU19PUkRfQ0hLIHRvCj4gZGlz YWJsZSB0aGUgb3JkZXJlZCBjaGVjaywgdG8gcHJldmVudCB0aGUgaXNzdWVzIFBhbGkgbWVudGlv bmVkLgo+Cj4gTGVhdmluZyBpdCB3aXRob3V0IHRoZSB3b3JrYXJvdW5kIG1lYW5zIGVuY291bnRl cmluZyB0aGUgY3Jhc2hlcwo+IFBhbGkgbWVudGlvbmVkLiAgVGhlIEgvVyB3YXMgb3JpZ2luYWxs eSBkZXNpZ25lZCB0byBoYXZlIHRoZSBzdHJvbmcKPiBvcmRlcmluZyBtb2RlLCBwZXIgd2hhdCBp cyBleHBlY3RlZCBvZiBQQ0kgRXhwcmVzcywgYnV0IGR1ZSB0byB0aGlzCj4gZXJyYXR1bSwgaXQg Y2Fubm90IGJlIHN1cHBvcnRlZCBieSB0aGUgdGFwZWQtb3V0IEgvVy4gIFRoZXJlIGlzCj4gbm90 aGluZyB0byBkbyBhYm91dCBpdCBub3cgaW4gdGhlIEgvVywgYXMgdGhpcyBpcyBhIHllYXJzIG9s ZCBTT0MuCj4gU29mdHdhcmUgd2lzZSB0aGUgb25seSBvcHRpb24gaXMgdGhlIHdvcmthcm91bmQg YWJvdmUsIG9yIHRvIGFjY2VwdAo+IHNwb3JhZGljIGNyYXNoZXMgb2YgdGhlIGtlcm5lbC4KPiAK PiBSZWdhcmRpbmcgbnVtYmVyICMyIDoKPiBUaGUgaW1wYWN0IG9mIHRoZSB3b3JrYXJvdW5kIGlz IHRoYXQgdGhlIERNQSBkb25lIHN0YXR1cyBjb3VsZCBiZQo+IHNldCBiZWZvcmUgdGhlIGxhc3Qg ZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBob3N0IG1lbW9yeSwgY2F1c2luZyB0aGUKPiBob3N0IHRv IHJlYWQgaW5jb21wbGV0ZSBkYXRhLiBUaGlzIGlzIHRoZSByZWFzb24gd2h5IEkgcmVjb21tZW5k ZWQKPiB0byBhZGQgYSBtZW1vcnkgYmFycmllci4gSWYgdGhpcyBpcyBib3RoZXJpbmcsIHRoZSBt ZW1vcnkgYmFycmllcgo+IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHBhdGNoLCBhbHRob3VnaCBJ IHN1Z2dlc3QgdG8gdGhvcm91Z2hseSB0ZXN0Cj4gdGhlIGRhdGEgaW50ZWdyaXR5IGlmIGltcGxl bWVudGluZyB0aGUgcGF0Y2ggd2l0aG91dCB0aGUgbWVtb3J5Cj4gYmFycmllci4KClRoYW5rIHlv dSB2ZXJ5IG11Y2ggZm9yIHRoZXNlIGRldGFpbHMsIEVsYWQuCgpJZiBJIHVuZGVyc3RhbmQgY29y cmVjdGx5LCB0aGlzIHBhdGNoIGF2b2lkcyBtYW55IGlzc3VlcyAob3IgYXQgbGVhc3QKbWFrZXMg dGhlbSBtdWNoIGxlc3MgbGlrZWx5KSwgYnV0IHRoZXJlIGlzIHN0aWxsIGEgc21hbGwgcG9zc2li aWxpdHkKb2YgY29ybmVyIGNhc2VzIHdoZXJlIGEgY29ycmVjdGx5LXdyaXR0ZW4gZHJpdmVyIHdv dWxkIHdvcmsgb24gb3RoZXIKcGxhdGZvcm1zIGJ1dCBub3Qgb24gdGhpcyBoYXJkd2FyZS4KClNp bmNlIHRoaXMgZGVmaW5pdGVseSBpbXByb3ZlcyB0aGluZ3MgZHJhbWF0aWNhbGx5LCBJIHRoaW5r IGl0J3Mgd29ydGgKZG9pbmcgZXZlbiBpZiBpdCdzIG5vdCBhYnNvbHV0ZWx5IDEwMCUuICBUaGUg Y29tbWl0IGxvZyBhbmQgY29kZQpjb21tZW50cyBzaG91bGQgYmUgZW5vdWdoIG9mIGEgaGludC4K Cj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiBGcm9tOiBQYWxpIFJvaMOhciA8cGFsaUBr ZXJuZWwub3JnPiAKPiBTZW50OiBUdWVzZGF5LCBPY3RvYmVyIDQsIDIwMjIgMTE6NDAgQU0KPiBU bzogRWxhZCBOYWNobWFuIDxlbmFjaG1hbkBtYXJ2ZWxsLmNvbT47IExvcmVuem8gUGllcmFsaXNp IDxscGllcmFsaXNpQGtlcm5lbC5vcmc+Cj4gQ2M6IEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdv b2dsZS5jb20+OyBLcnp5c3p0b2YgV2lsY3p5xYRza2kgPGt3QGxpbnV4LmNvbT47IGxpbnV4LXBj aUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsg bGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwo+IFN1YmplY3Q6IFJlOiBbRVhUXSBSZTogW1BB VENIIHYyXSBQQ0k6IGFhcmR2YXJrOiBJbXBsZW1lbnQgd29ya2Fyb3VuZCBmb3IgUENJZSBDb21w bGV0aW9uIFRpbWVvdXQKPiAKPiArIEVsYWQKPiAKPiBDb3VsZCB5b3UgcGxlYXNlIGxvb2sgYXQg TG9yZW56bydzIGNvbW1lbnRzIGFuZCBoZWxwIHdpdGggdGhpcyBmaXg/Cj4gCj4gT24gVHVlc2Rh eSAwNCBPY3RvYmVyIDIwMjIgMTA6MDI6MzIgTG9yZW56byBQaWVyYWxpc2kgd3JvdGU6Cj4gPiBP biBNb24sIE9jdCAwMywgMjAyMiBhdCAxMToxNDoxMlBNICswMjAwLCBQYWxpIFJvaMOhciB3cm90 ZToKPiA+ID4gTG9yZW56bywgaXMgc29tZXRoaW5nIG1vcmUgbmVlZGVkIGZvciB0aGlzIHBhdGNo PyBBcyBpdCB3b3JrYXJvdW5kcyAKPiA+ID4gY3Jhc2hpbmcgaXQgaXMgcmVhbGx5IG5lZWRlZCB0 byBoYXZlIGl0IGluIG1haW5saW5lIGFuZCBiYWNrcG9ydHMuCj4gPiAKPiA+IFllcywgYSBjbGVh ciBleHBsYW5hdGlvbiBmcm9tIE1hcnZlbGwgYWJvdXQgd2hhdCB0aGlzIGlzIGFjdHVhbGx5IAo+ ID4gZml4aW5nIC0gaXQgdG9vayBtZSBhIHdoaWxlIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRo cmVhZCBidXQgSSBzdGlsbCAKPiA+IGRvbid0IHVuZGVyc3RhbmQgd2hhdCB0aGlzIHBhdGNoIGFj dHVhbGx5IGRvZXMgYW5kIHdoeS4KPiA+IAo+ID4gQW4gRXJyYXR1bSB3b3JrYXJvdW5kIChpZiB0 aGVyZSBpcyBhbnkpIHNob3VsZCBkZWZpbmUgYW5kIGV4cGxhaW4gYSBTVyAKPiA+IHdvcmthcm91 bmQuCj4gPiAKPiA+ICgxKSBCam9ybidzIGNvbmNlcm5zIGluIHJlbGF0aW9uIHRvIFBDSSBtZW1v cnkgbW9kZWwgd2VyZW4ndCBhZGRyZXNzZWQKPiA+ICgyKSBXZSBkb24ndCBhZGQgdW5kb2N1bWVu dGVkIG1lbW9yeSBiYXJyaWVycyB0byB0aGUga2VybmVsIHRvICJtaW5pbWl6ZQo+ID4gICAgIHJp c2tzIi4gRWl0aGVyIHdlIGZpeCBhIGJ1ZyBvciB3ZSBkb24ndC4gSWYgd2UgZG8sIHdyaXRlIHRo YXQgZG93bgo+ID4gICAgIGFuZCBkb2N1bWVudCB3aHkgdGhlIGJhcnJpZXIgaXMgdGhlcmUgYW5k IHRoZSBpc3N1ZSBpdCBzb2x2ZXMuCj4gPiAKPiA+IEkgdW5kZXJzdGFuZCB0aGF0IGJhc2ljYWxs eSB5b3UgYXJlIHJldmVyc2UgZW5naW5lZXJpbmcgYSBIVyBidWcgYnV0IEkgCj4gPiBhbSBhZnJh aWQgd2UgY2FuJ3QgZml4IHRoZSBrZXJuZWwgdGhpcyB3YXkgLSBtb3JlIHNvIHdpdGggcGF0Y2hl cyAKPiA+IGdvaW5nIHRvIGJlIGJhY2twb3J0ZWQgdG8gc3RhYmxlIGtlcm5lbHMuCj4gPiAKPiA+ IExvcmVuem8KPiA+IAo+ID4gPiBPbiBXZWRuZXNkYXkgMjggU2VwdGVtYmVyIDIwMjIgMTQ6MDU6 MTAgRWxhZCBOYWNobWFuIHdyb3RlOgo+ID4gPiA+IFJldmlld2VkLWJ5OiBFbGFkIE5hY2htYW4g PGVuYWNobWFuQG1hcnZlbGwuY29tPgo+ID4gPiA+IAo+ID4gPiA+IFRoYW5rcywKPiA+ID4gPiAK PiA+ID4gPiBFbGFkLgo+ID4gPiA+IAo+ID4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t Cj4gPiA+ID4gRnJvbTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KPiA+ID4gPiBTZW50 OiBNb25kYXksIFNlcHRlbWJlciAyNiwgMjAyMiAzOjM1IFBNCj4gPiA+ID4gVG86IEVsYWQgTmFj aG1hbiA8ZW5hY2htYW5AbWFydmVsbC5jb20+Cj4gPiA+ID4gQ2M6IFRob21hcyBQZXRhenpvbmkg PHRob21hcy5wZXRhenpvbmlAYm9vdGxpbi5jb20+OyBMb3JlbnpvIAo+ID4gPiA+IFBpZXJhbGlz aSA8bHBpZXJhbGlzaUBrZXJuZWwub3JnPjsgQmpvcm4gSGVsZ2FhcyAKPiA+ID4gPiA8YmhlbGdh YXNAZ29vZ2xlLmNvbT47IEtyenlzenRvZiBXaWxjennFhHNraSA8a3dAbGludXguY29tPjsgUm9i IAo+ID4gPiA+IEhlcnJpbmcgPHJvYmhAa2VybmVsLm9yZz47IGxpbnV4LXBjaUB2Z2VyLmtlcm5l bC5vcmc7IAo+ID4gPiA+IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsgCj4g PiA+ID4gbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZzsgR3JlZ29yeSBDbGVtZW50IAo+ID4g PiA+IDxncmVnb3J5LmNsZW1lbnRAYm9vdGxpbi5jb20+OyBNYXJlayBCZWjDum4gPGthYmVsQGtl cm5lbC5vcmc+OyAKPiA+ID4gPiBSZW1pIFBvbW1hcmVsIDxyZXBrQHRyaXBsZWZhdS5sdD47IFhv Z2l1bSA8Y29udGFjdEB4b2dpdW0ubWU+OyAKPiA+ID4gPiBUb21hc3ogTWFjaWVqIE5vd2FrIDx0 bW41MDVAZ21haWwuY29tPgo+ID4gPiA+IFN1YmplY3Q6IFtFWFRdIFJlOiBbUEFUQ0ggdjJdIFBD STogYWFyZHZhcms6IEltcGxlbWVudCB3b3JrYXJvdW5kIAo+ID4gPiA+IGZvciBQQ0llIENvbXBs ZXRpb24gVGltZW91dAo+ID4gPiA+IAo+ID4gPiA+IEV4dGVybmFsIEVtYWlsCj4gPiA+ID4gCj4g PiA+ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCj4gPiA+ID4gLS0tLSBIZWxsbyBFbGFkLCBjb3VsZCB5b3UgcGxlYXNl IHJldmlldyB0aGlzIHBhdGNoPyBJIGhhdmUgCj4gPiA+ID4gaW1wbGVtZW50ZWQgaXQgYWNjb3Jk aW5nIHlvdXIgaW5zdHJ1Y3Rpb25zLCBpbmNsdWRpbmcgdGhhdCBmdWxsIG1lbW9yeSBiYXJyaWVy IGFzIHlvdSBkZXNjcmliZWQuCj4gPiA+ID4gCj4gPiA+ID4gT24gVHVlc2RheSAwMiBBdWd1c3Qg MjAyMiAxNDozODoxNiBQYWxpIFJvaMOhciB3cm90ZToKPiA+ID4gPiA+IE1hcnZlbGwgQXJtYWRh IDM3MDAgRnVuY3Rpb25hbCBFcnJhdGEsIEd1aWRlbGluZXMsIGFuZCAKPiA+ID4gPiA+IFJlc3Ry aWN0aW9ucyBkb2N1bWVudCBkZXNjcmliZXMgaW4gZXJyYXR1bSAzLjEyIFBDSWUgQ29tcGxldGlv biBUaW1lb3V0IChSZWYgIzoKPiA+ID4gPiA+IDI1MSksIHRoYXQgUENJZSBJUCBkb2VzIG5vdCBz dXBwb3J0IGEgc3Ryb25nLW9yZGVyZWQgbW9kZWwgZm9yIGluYm91bmQgcG9zdGVkIHZzLgo+ID4g PiA+ID4gb3V0Ym91bmQgY29tcGxldGlvbi4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gQXMgYSB3b3Jr YXJvdW5kIGZvciB0aGlzIGVycmF0dW0sIERJU19PUkRfQ0hLIGZsYWcgaW4gRGVidWcgTXV4IAo+ ID4gPiA+ID4gQ29udHJvbCByZWdpc3RlciBtdXN0IGJlIHNldC4gSXQgZGlzYWJsZXMgdGhlIG9y ZGVyaW5nIGNoZWNrIGluIAo+ID4gPiA+ID4gdGhlIGNvcmUgYmV0d2VlbiBDb21wbGV0aW9ucyBh bmQgUG9zdGVkIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20gdGhlIGxpbmsuCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IE1hcnZlbGwgYWxzbyBzdWdnZXN0cyB0byBkbyBmdWxsIG1lbW9yeSBiYXJyaWVyIGF0 IHRoZSBiZWdpbm5pbmcgCj4gPiA+ID4gPiBvZiBhYXJkdmFyayBzdW1tYXJ5IGludGVycnVwdCBo YW5kbGVyIGJlZm9yZSBjYWxsaW5nIGludGVycnVwdCAKPiA+ID4gPiA+IGhhbmRsZXJzIG9mIGVu ZHBvaW50IGRyaXZlcnMgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIHJpc2sgZm9yIAo+ID4gPiA+ ID4gdGhlIHJhY2UgY29uZGl0aW9uIGRvY3VtZW50ZWQgaW4gdGhlIEVycmF0dW0gYmV0d2VlbiB0 aGUgRE1BIAo+ID4gPiA+ID4gZG9uZSBzdGF0dXMgcmVhZGluZyBhbmQgdGhlIGNvbXBsZXRpb24g b2Ygd3JpdGluZyB0byB0aGUgaG9zdCBtZW1vcnkuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IE1vcmUg ZGV0YWlscyBhYm91dCB0aGlzIGlzc3VlIGFuZCBzdWdnZXN0ZWQgd29ya2Fyb3VuZHMgYXJlIGlu IGRpc2N1c3Npb246Cj4gPiA+ID4gPiBodHRwczovL3VybGRlZmVuc2UucHJvb2Zwb2ludC5jb20v djIvdXJsP3U9aHR0cHMtM0FfX2xvcmUua2VybmVsCj4gPiA+ID4gPiAub3JnX2wgCj4gPiA+ID4g PiBpbnV4LTJEcGNpX0JOOVBSMThNQjQyNTE1NEZFNTAxOURDQUYyMDI4QTFENURCOEQ5LTQwQk45 UFIxOE1CNDI1Cj4gPiA+ID4gPiAxLm5hbXAgCj4gPiA+ID4gPiByZDE4LnByb2Qub3V0bG9vay5j b21fdF8tMjN1JmQ9RHdJRGFRJmM9bktqV2VjMmI2UjBtT3lQYXo3eHRmUSZyCj4gPiA+ID4gPiA9 ZVRlTlQKPiA+ID4gPiA+IExFSzUtVHhYY3pqT2NLUGhBTklGdGxCOXBQNGxxOXFoZGxGcndRJm09 Ympna2hnUGdPanFDRXNiSFlIT05DWk0KPiA+ID4gPiA+IGlGRFg3MiAKPiA+ID4gPiA+IE16dFdh RTBBdldCa3RRVm4zektFRHRVZG4wMkt4X0tKMTRCJnM9U1RvR3NER0VPYndiWkdpbFZ0VlpQeU1F OGoKPiA+ID4gPiA+IE5pUmdycQo+ID4gPiA+ID4gNFNEWXZxcVQwVEEmZT0KPiA+ID4gPiA+IAo+ ID4gPiA+ID4gSXQgd2FzIHJlcG9ydGVkIHRoYXQgZW5hYmxpbmcgdGhpcyB3b3JrYXJvdW5kIGZp eGVzIGluc3RhYmlsaXR5IAo+ID4gPiA+ID4gaXNzdWVzIGFuZCAiVW5oYW5kbGVkIGZhdWx0IiBl cnJvcnMgd2hlbiB1c2luZyA2MCBHSHogV2lGaSAKPiA+ID4gPiA+IDgwMi4xMWFkIGNhcmQgd2l0 aCBRdWFsY29tbQo+ID4gPiA+ID4gUUNBNjMzNSBjaGlwIHVuZGVyIHNpZ25pZmljYW50IGxvYWQg d2hpY2ggd2VyZSBjYXVzZWQgYnkgCj4gPiA+ID4gPiBpbnRlcnJ1cHQgc3RhdHVzIHN0dWNrIGlu IHRoZSBvdXRib3VuZCBDTVBMVCBxdWV1ZSB0cmFjZWQgYmFjayB0byB0aGlzIGVycmF0dW0uCj4g PiA+ID4gPiAKPiA+ID4gPiA+IFRoaXMgd29ya2Fyb3VuZCBmaXhlcyBhbHNvIGtlcm5lbCBwYW5p YyB0cmlnZ2VyZWQgYWZ0ZXIgc29tZSAKPiA+ID4gPiA+IG1pbnV0ZXMgb2YgdXNhZ2UgNSBHSHog V2lGaSA4MDIuMTFheCBjYXJkIHdpdGggTWVkaWF0ZWsgTVQ3OTE1IGNoaXA6Cj4gPiA+ID4gPiAK PiA+ID4gPiA+ICAgICBJbnRlcm5hbCBlcnJvcjogc3luY2hyb25vdXMgZXh0ZXJuYWwgYWJvcnQ6 IDk2MDAwMjEwIFsjMV0gU01QCj4gPiA+ID4gPiAgICAgS2VybmVsIHBhbmljIC0gbm90IHN5bmNp bmc6IEZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQKPiA+ID4gPiA+IAo+ID4gPiA+ID4gU2ln bmVkLW9mZi1ieTogVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBib290bGluLmNv bT4KPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IFBhbGkgUm9ow6FyIDxwYWxpQGtlcm5lbC5vcmc+ Cj4gPiA+ID4gPiBGaXhlczogOGMzOWQ3MTAzNjNjICgiUENJOiBhYXJkdmFyazogQWRkIEFhcmR2 YXJrIFBDSSBob3N0IAo+ID4gPiA+ID4gY29udHJvbGxlcgo+ID4gPiA+ID4gZHJpdmVyIikKPiA+ ID4gPiA+IENjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnCj4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jIHwgMTAgKysrKysrKysrKwo+ ID4gPiA+ID4gIDEgZmlsZSBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5j Cj4gPiA+ID4gPiBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMKPiA+ID4g PiA+IGluZGV4IDA2MDkzNmVmMDFmZS4uM2FlOGE4NWVjNzJlIDEwMDY0NAo+ID4gPiA+ID4gLS0t IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYwo+ID4gPiA+ID4gKysrIGIv ZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYwo+ID4gPiA+ID4gQEAgLTIxMCw2 ICsyMTAsOCBAQCBlbnVtIHsKPiA+ID4gPiA+ICB9Owo+ID4gPiA+ID4gIAo+ID4gPiA+ID4gICNk ZWZpbmUgVkVORE9SX0lEX1JFRwkJCQkoTE1JX0JBU0VfQUREUiArIDB4NDQpCj4gPiA+ID4gPiAr I2RlZmluZSBERUJVR19NVVhfQ1RSTF9SRUcJCQkoTE1JX0JBU0VfQUREUiArIDB4MjA4KQo+ID4g PiA+ID4gKyNkZWZpbmUgICAgIERJU19PUkRfQ0hLCQkJCUJJVCgzMCkKPiA+ID4gPiA+ICAKPiA+ ID4gPiA+ICAvKiBQQ0llIGNvcmUgY29udHJvbGxlciByZWdpc3RlcnMgKi8KPiA+ID4gPiA+ICAj ZGVmaW5lIENUUkxfQ09SRV9CQVNFX0FERFIJCQkweDE4MDAwCj4gPiA+ID4gPiBAQCAtNTU4LDYg KzU2MCwxMSBAQCBzdGF0aWMgdm9pZCBhZHZrX3BjaWVfc2V0dXBfaHcoc3RydWN0IGFkdmtfcGNp ZSAqcGNpZSkKPiA+ID4gPiA+ICAJCVBDSUVfQ09SRV9DVFJMMl9URF9FTkFCTEU7Cj4gPiA+ID4g PiAgCWFkdmtfd3JpdGVsKHBjaWUsIHJlZywgUENJRV9DT1JFX0NUUkwyX1JFRyk7Cj4gPiA+ID4g PiAgCj4gPiA+ID4gPiArCS8qIERpc2FibGUgb3JkZXJpbmcgY2hlY2tzLCB3b3JrYXJvdW5kIGZv ciBlcnJhdHVtIDMuMTIgIlBDSWUgY29tcGxldGlvbiB0aW1lb3V0IiAqLwo+ID4gPiA+ID4gKwly ZWcgPSBhZHZrX3JlYWRsKHBjaWUsIERFQlVHX01VWF9DVFJMX1JFRyk7Cj4gPiA+ID4gPiArCXJl ZyB8PSBESVNfT1JEX0NISzsKPiA+ID4gPiA+ICsJYWR2a193cml0ZWwocGNpZSwgcmVnLCBERUJV R19NVVhfQ1RSTF9SRUcpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gIAkvKiBTZXQgbGFuZSBYMSAq Lwo+ID4gPiA+ID4gIAlyZWcgPSBhZHZrX3JlYWRsKHBjaWUsIFBDSUVfQ09SRV9DVFJMMF9SRUcp Owo+ID4gPiA+ID4gIAlyZWcgJj0gfkxBTkVfQ05UX01TSzsKPiA+ID4gPiA+IEBAIC0xNTgxLDYg KzE1ODgsOSBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgYWR2a19wY2llX2lycV9oYW5kbGVyKGludCBp cnEsIHZvaWQgKmFyZykKPiA+ID4gPiA+ICAJc3RydWN0IGFkdmtfcGNpZSAqcGNpZSA9IGFyZzsK PiA+ID4gPiA+ICAJdTMyIHN0YXR1czsKPiA+ID4gPiA+ICAKPiA+ID4gPiA+ICsJLyogRnVsbCBt ZW1vcnkgYmFycmllciAoQVJNIGRzYiBzeSksIHdvcmthcm91bmQgZm9yIGVycmF0dW0gMy4xMiAi UENJZSBjb21wbGV0aW9uIHRpbWVvdXQiICovCj4gPiA+ID4gPiArCW1iKCk7Cj4gPiA+ID4gPiAr Cj4gPiA+ID4gPiAgCXN0YXR1cyA9IGFkdmtfcmVhZGwocGNpZSwgSE9TVF9DVFJMX0lOVF9TVEFU VVNfUkVHKTsKPiA+ID4gPiA+ICAJaWYgKCEoc3RhdHVzICYgUENJRV9JUlFfQ09SRV9JTlQpKQo+ ID4gPiA+ID4gIAkJcmV0dXJuIElSUV9OT05FOwo+ID4gPiA+ID4gLS0KPiA+ID4gPiA+IDIuMjAu MQo+ID4gPiA+ID4gCj4gPiA+IAo+ID4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwo+ID4gPiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+ID4g PiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+ID4gaHR0cHM6Ly91cmxk ZWZlbnNlLnByb29mcG9pbnQuY29tL3YyL3VybD91PWh0dHAtM0FfX2xpc3RzLmluZnJhZGVhZC4K PiA+ID4gb3JnX21haWxtYW5fbGlzdGluZm9fbGludXgtMkRhcm0tMkRrZXJuZWwmZD1Ed0lEYVEm Yz1uS2pXZWMyYjZSMG1PeVAKPiA+ID4gYXo3eHRmUSZyPWVUZU5UTEVLNS1UeFhjempPY0tQaEFO SUZ0bEI5cFA0bHE5cWhkbEZyd1EmbT0yTnprVDlLTE8yNmsKPiA+ID4gZWZVT3cybkllU2VSbkpW Wkx4RWlCWHFFb1J2RFEwdWV3dzZuNFlhWFdnQU4xdUNKWDIwbyZzPW5jekFDU18yakVSYkEKPiA+ ID4gLWM0R2ZhcjAtSFRBNFB0dlpkSm1zQnY4amhXOEcwJmU9Cj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdAo+IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=