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 D9824C4345F for ; Sun, 14 Apr 2024 03:10:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References: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:List-Owner; bh=YnqSxmSzK2g5rrJ3lt1ur1wL7vNzyqI0uUCpOXspf1c=; b=jnlWdFvZMhPPHo2/Ei0Mee2TTZ oXu/sOomuUqJPoMsqjZKAYUDH4ntMPlimCae2dedpevORqh6AiU735YvFL8fEj+1uby5wMT2647OM lQaX9JjeEUDX8g5lw5niR36rEvnrzq2OFByIxcL8g9dY7qKbZjnl+qaz7hw3BKY0LJebFrhi52XtU 4G/pi+u1GB7srg4EDLojK/h1cKS1XAJZalg6LepcKb5PDCAi19sTXDSpibrIWVgnb7X9lhXCVpE0m UDYBZjJGd1I5O/6W9naCiix7bUNnC9MfaDZfxWtPxN5w8aYuOHb7KwQNMQfKbo4SDOn4Mvc+8V24q v0lRIXQQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvqGX-00000004T6S-34ON; Sun, 14 Apr 2024 03:10:49 +0000 Received: from pidgin.makrotopia.org ([185.142.180.65]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvqGT-00000004T5O-3Csa; Sun, 14 Apr 2024 03:10:48 +0000 Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96.2) (envelope-from ) id 1rvqG4-00018x-1q; Sun, 14 Apr 2024 03:10:20 +0000 Date: Sun, 14 Apr 2024 04:10:16 +0100 From: Daniel Golle To: arinc.unal@arinc9.com Cc: DENG Qingfang , Sean Wang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , Bartel Eerdekens , mithat.guner@xeront.com, erkin.bozoglu@xeront.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH net-next 1/2] net: dsa: mt7530-mdio: read PHY address of switch from device tree Message-ID: References: <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-0-b08936df2770@arinc9.com> <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-1-b08936df2770@arinc9.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-1-b08936df2770@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240413_201045_986895_71DBA1B7 X-CRM114-Status: GOOD ( 30.18 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Sun, Apr 14, 2024 at 01:08:19AM +0300, Arınç ÜNAL via B4 Relay wrote: > From: Arınç ÜNAL > > Read the PHY address the switch listens on from the reg property of the > switch node on the device tree. This change brings support for MT7530 > switches on boards with such bootstrapping configuration where the switch > listens on a different PHY address than the hardcoded PHY address on the > driver, 31. > > As described on the "MT7621 Programming Guide v0.4" document, the MT7530 > switch and its PHYs can be configured to listen on the range of 7-12, > 15-20, 23-28, and 31 and 0-4 PHY addresses. > > There are operations where the switch PHY registers are used. For the PHY > address of the control PHY, transform the MT753X_CTRL_PHY_ADDR constant > into a macro and use it. The PHY address for the control PHY is 0 when the > switch listens on 31. In any other case, it is one greater than the PHY > address the switch listens on. > > Signed-off-by: Arınç ÜNAL See minor nit inline below. Reviewed-by: Daniel Golle Tested-by: Daniel Golle (only MT7530 and MT7531 on address 0x1f has been tested, I don't have any board configuring the switch to any other base-address) > --- > drivers/net/dsa/mt7530-mdio.c | 28 ++++++++++++++-------------- > drivers/net/dsa/mt7530.c | 35 ++++++++++++++++++++++------------- > drivers/net/dsa/mt7530.h | 4 +++- > 3 files changed, 39 insertions(+), 28 deletions(-) > > diff --git a/drivers/net/dsa/mt7530-mdio.c b/drivers/net/dsa/mt7530-mdio.c > index fa3ee85a99c1..599b28c8a340 100644 > --- a/drivers/net/dsa/mt7530-mdio.c > +++ b/drivers/net/dsa/mt7530-mdio.c > @@ -18,7 +18,8 @@ > static int > mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) > { > - struct mii_bus *bus = context; > + struct mt7530_priv *priv = context; > + struct mii_bus *bus = priv->bus; > u16 page, r, lo, hi; > int ret; > > @@ -27,36 +28,35 @@ mt7530_regmap_write(void *context, unsigned int reg, unsigned int val) > lo = val & 0xffff; > hi = val >> 16; > > - /* MT7530 uses 31 as the pseudo port */ > - ret = bus->write(bus, 0x1f, 0x1f, page); > + ret = bus->write(bus, priv->phy_addr, 0x1f, page); > if (ret < 0) > return ret; > > - ret = bus->write(bus, 0x1f, r, lo); > + ret = bus->write(bus, priv->phy_addr, r, lo); > if (ret < 0) > return ret; > > - ret = bus->write(bus, 0x1f, 0x10, hi); > + ret = bus->write(bus, priv->phy_addr, 0x10, hi); > return ret; > } > > static int > mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val) > { > - struct mii_bus *bus = context; > + struct mt7530_priv *priv = context; > + struct mii_bus *bus = priv->bus; > u16 page, r, lo, hi; > int ret; > > page = (reg >> 6) & 0x3ff; > r = (reg >> 2) & 0xf; > > - /* MT7530 uses 31 as the pseudo port */ > - ret = bus->write(bus, 0x1f, 0x1f, page); > + ret = bus->write(bus, priv->phy_addr, 0x1f, page); > if (ret < 0) > return ret; > > - lo = bus->read(bus, 0x1f, r); > - hi = bus->read(bus, 0x1f, 0x10); > + lo = bus->read(bus, priv->phy_addr, r); > + hi = bus->read(bus, priv->phy_addr, 0x10); > > *val = (hi << 16) | (lo & 0xffff); > > @@ -107,8 +107,7 @@ mt7531_create_sgmii(struct mt7530_priv *priv) > mt7531_pcs_config[i]->unlock = mt7530_mdio_regmap_unlock; > mt7531_pcs_config[i]->lock_arg = &priv->bus->mdio_lock; > > - regmap = devm_regmap_init(priv->dev, > - &mt7530_regmap_bus, priv->bus, > + regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, priv, > mt7531_pcs_config[i]); > if (IS_ERR(regmap)) { > ret = PTR_ERR(regmap); > @@ -153,6 +152,7 @@ mt7530_probe(struct mdio_device *mdiodev) > > priv->bus = mdiodev->bus; > priv->dev = &mdiodev->dev; > + priv->phy_addr = mdiodev->addr; > > ret = mt7530_probe_common(priv); > if (ret) > @@ -203,8 +203,8 @@ mt7530_probe(struct mdio_device *mdiodev) > regmap_config->reg_stride = 4; > regmap_config->max_register = MT7530_CREV; > regmap_config->disable_locking = true; > - priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, > - priv->bus, regmap_config); > + priv->regmap = devm_regmap_init(priv->dev, &mt7530_regmap_bus, priv, > + regmap_config); > if (IS_ERR(priv->regmap)) > return PTR_ERR(priv->regmap); > > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c > index c0d0bce0b594..fefa6dd151fa 100644 > --- a/drivers/net/dsa/mt7530.c > +++ b/drivers/net/dsa/mt7530.c > @@ -86,22 +86,26 @@ core_read_mmd_indirect(struct mt7530_priv *priv, int prtad, int devad) > int value, ret; > > /* Write the desired MMD Devad */ > - ret = bus->write(bus, 0, MII_MMD_CTRL, devad); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_CTRL, devad); > if (ret < 0) > goto err; > > /* Write the desired MMD register address */ > - ret = bus->write(bus, 0, MII_MMD_DATA, prtad); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_DATA, prtad); > if (ret < 0) > goto err; > > /* Select the Function : DATA with no post increment */ > - ret = bus->write(bus, 0, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_CTRL, devad | MII_MMD_CTRL_NOINCR); > if (ret < 0) > goto err; > > /* Read the content of the MMD's selected register */ > - value = bus->read(bus, 0, MII_MMD_DATA); > + value = bus->read(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_DATA); > > return value; > err: > @@ -118,22 +122,26 @@ core_write_mmd_indirect(struct mt7530_priv *priv, int prtad, > int ret; > > /* Write the desired MMD Devad */ > - ret = bus->write(bus, 0, MII_MMD_CTRL, devad); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_CTRL, devad); > if (ret < 0) > goto err; > > /* Write the desired MMD register address */ > - ret = bus->write(bus, 0, MII_MMD_DATA, prtad); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_DATA, prtad); > if (ret < 0) > goto err; > > /* Select the Function : DATA with no post increment */ > - ret = bus->write(bus, 0, MII_MMD_CTRL, (devad | MII_MMD_CTRL_NOINCR)); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_CTRL, devad | MII_MMD_CTRL_NOINCR); > if (ret < 0) > goto err; > > /* Write the data into MMD's selected register */ > - ret = bus->write(bus, 0, MII_MMD_DATA, data); > + ret = bus->write(bus, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MII_MMD_DATA, data); > err: > if (ret < 0) > dev_err(&bus->dev, > @@ -2671,16 +2679,17 @@ mt7531_setup(struct dsa_switch *ds) > * phy_[read,write]_mmd_indirect is called, we provide our own > * mt7531_ind_mmd_phy_[read,write] to complete this function. > */ > - val = mt7531_ind_c45_phy_read(priv, MT753X_CTRL_PHY_ADDR, > + val = mt7531_ind_c45_phy_read(priv, > + MT753X_CTRL_PHY_ADDR(priv->phy_addr), > MDIO_MMD_VEND2, CORE_PLL_GROUP4); > val |= MT7531_RG_SYSPLL_DMY2 | MT7531_PHY_PLL_BYPASS_MODE; > val &= ~MT7531_PHY_PLL_OFF; > - mt7531_ind_c45_phy_write(priv, MT753X_CTRL_PHY_ADDR, MDIO_MMD_VEND2, > - CORE_PLL_GROUP4, val); > + mt7531_ind_c45_phy_write(priv, MT753X_CTRL_PHY_ADDR(priv->phy_addr), > + MDIO_MMD_VEND2, CORE_PLL_GROUP4, val); > > /* Disable EEE advertisement on the switch PHYs. */ > - for (i = MT753X_CTRL_PHY_ADDR; > - i < MT753X_CTRL_PHY_ADDR + MT7530_NUM_PHYS; i++) { > + for (i = MT753X_CTRL_PHY_ADDR(priv->phy_addr); > + i < MT753X_CTRL_PHY_ADDR(priv->phy_addr) + MT7530_NUM_PHYS; i++) { > mt7531_ind_c45_phy_write(priv, i, MDIO_MMD_AN, MDIO_AN_EEE_ADV, > 0); > } > diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h > index 585db03c0548..76adc9d21bcf 100644 > --- a/drivers/net/dsa/mt7530.h > +++ b/drivers/net/dsa/mt7530.h > @@ -625,7 +625,7 @@ enum mt7531_clk_skew { > #define MT7531_PHY_PLL_OFF BIT(5) > #define MT7531_PHY_PLL_BYPASS_MODE BIT(4) > > -#define MT753X_CTRL_PHY_ADDR 0 > +#define MT753X_CTRL_PHY_ADDR(phy_addr) (phy_addr == 0x1f ? 0 : phy_addr + 1) #define MT753X_CTRL_PHY_ADDR(phy_addr) (phy_addr + 1 & 0x1f) It's shorter, and works without conditional operator which is expensive. > > #define CORE_PLL_GROUP5 0x404 > #define RG_LCDDS_PCW_NCPO1(x) ((x) & 0xffff) > @@ -774,6 +774,7 @@ struct mt753x_info { > * @irq_enable: IRQ enable bits, synced to SYS_INT_EN > * @create_sgmii: Pointer to function creating SGMII PCS instance(s) > * @active_cpu_ports: Holding the active CPU ports > + * @phy_addr: Holding the PHY address the switch listens on > */ > struct mt7530_priv { > struct device *dev; > @@ -800,6 +801,7 @@ struct mt7530_priv { > u32 irq_enable; > int (*create_sgmii)(struct mt7530_priv *priv); > u8 active_cpu_ports; > + int phy_addr; > }; > > struct mt7530_hw_vlan_entry { > > -- > 2.40.1 > > 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 A2803C04FF6 for ; Sun, 14 Apr 2024 03:11:02 +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:References: 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: List-Owner; bh=qTsXPtf6BIFoHwLcbSP40sxdYS+qeik5c8SWVoWuwlA=; b=GvpcFEqiuYLFIQ 0v5AL7I5xCAb2dcGBGSZHhUbDFRNtC4Hl0fmwIQ3qNa8uiOZI8oIzdJKuuK98b0PSLtU1kCTS/oDi 9e7Xni+EDaVTdWVCG/4Xn+2tFEY4o234EqrIYPE0wdfWizc5fGRqOrKK1fAIzocFhZW0n0kq43XIt JcVNq17ifcfpmpkEwRo/2NTHCoj4OPe7p5RGho94HJ/p4DcS+sDhWkApW2zdO+XlleClbE4TDwHcG cDRDEpTcgkw1dGDqzIIRq//GsUBhZXo2OKPqs5uNlMJTVS4+OBkooaMZ665A6t33e5Z4tJAQjhsTM +JTdJHUg9kAgLrNYF4sw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvqGX-00000004T6G-0VD9; Sun, 14 Apr 2024 03:10:49 +0000 Received: from pidgin.makrotopia.org ([185.142.180.65]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rvqGT-00000004T5O-3Csa; Sun, 14 Apr 2024 03:10:48 +0000 Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.96.2) (envelope-from ) id 1rvqG4-00018x-1q; Sun, 14 Apr 2024 03:10:20 +0000 Date: Sun, 14 Apr 2024 04:10:16 +0100 From: Daniel Golle To: arinc.unal@arinc9.com Cc: DENG Qingfang , Sean Wang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , Bartel Eerdekens , mithat.guner@xeront.com, erkin.bozoglu@xeront.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH net-next 1/2] net: dsa: mt7530-mdio: read PHY address of switch from device tree Message-ID: References: <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-0-b08936df2770@arinc9.com> <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-1-b08936df2770@arinc9.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240414-b4-for-netnext-mt7530-phy-addr-from-dt-and-simplify-core-ops-v1-1-b08936df2770@arinc9.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240413_201045_986895_71DBA1B7 X-CRM114-Status: GOOD ( 30.18 ) 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 T24gU3VuLCBBcHIgMTQsIDIwMjQgYXQgMDE6MDg6MTlBTSArMDMwMCwgQXLEsW7DpyDDnE5BTCB2 aWEgQjQgUmVsYXkgd3JvdGU6Cj4gRnJvbTogQXLEsW7DpyDDnE5BTCA8YXJpbmMudW5hbEBhcmlu YzkuY29tPgo+IAo+IFJlYWQgdGhlIFBIWSBhZGRyZXNzIHRoZSBzd2l0Y2ggbGlzdGVucyBvbiBm cm9tIHRoZSByZWcgcHJvcGVydHkgb2YgdGhlCj4gc3dpdGNoIG5vZGUgb24gdGhlIGRldmljZSB0 cmVlLiBUaGlzIGNoYW5nZSBicmluZ3Mgc3VwcG9ydCBmb3IgTVQ3NTMwCj4gc3dpdGNoZXMgb24g Ym9hcmRzIHdpdGggc3VjaCBib290c3RyYXBwaW5nIGNvbmZpZ3VyYXRpb24gd2hlcmUgdGhlIHN3 aXRjaAo+IGxpc3RlbnMgb24gYSBkaWZmZXJlbnQgUEhZIGFkZHJlc3MgdGhhbiB0aGUgaGFyZGNv ZGVkIFBIWSBhZGRyZXNzIG9uIHRoZQo+IGRyaXZlciwgMzEuCj4gCj4gQXMgZGVzY3JpYmVkIG9u IHRoZSAiTVQ3NjIxIFByb2dyYW1taW5nIEd1aWRlIHYwLjQiIGRvY3VtZW50LCB0aGUgTVQ3NTMw Cj4gc3dpdGNoIGFuZCBpdHMgUEhZcyBjYW4gYmUgY29uZmlndXJlZCB0byBsaXN0ZW4gb24gdGhl IHJhbmdlIG9mIDctMTIsCj4gMTUtMjAsIDIzLTI4LCBhbmQgMzEgYW5kIDAtNCBQSFkgYWRkcmVz c2VzLgo+IAo+IFRoZXJlIGFyZSBvcGVyYXRpb25zIHdoZXJlIHRoZSBzd2l0Y2ggUEhZIHJlZ2lz dGVycyBhcmUgdXNlZC4gRm9yIHRoZSBQSFkKPiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIFBIWSwg dHJhbnNmb3JtIHRoZSBNVDc1M1hfQ1RSTF9QSFlfQUREUiBjb25zdGFudAo+IGludG8gYSBtYWNy byBhbmQgdXNlIGl0LiBUaGUgUEhZIGFkZHJlc3MgZm9yIHRoZSBjb250cm9sIFBIWSBpcyAwIHdo ZW4gdGhlCj4gc3dpdGNoIGxpc3RlbnMgb24gMzEuIEluIGFueSBvdGhlciBjYXNlLCBpdCBpcyBv bmUgZ3JlYXRlciB0aGFuIHRoZSBQSFkKPiBhZGRyZXNzIHRoZSBzd2l0Y2ggbGlzdGVucyBvbi4K PiAKPiBTaWduZWQtb2ZmLWJ5OiBBcsSxbsOnIMOcTkFMIDxhcmluYy51bmFsQGFyaW5jOS5jb20+ CgpTZWUgbWlub3Igbml0IGlubGluZSBiZWxvdy4KClJldmlld2VkLWJ5OiBEYW5pZWwgR29sbGUg PGRhbmllbEBtYWtyb3RvcGlhLm9yZz4KVGVzdGVkLWJ5OiBEYW5pZWwgR29sbGUgPGRhbmllbEBt YWtyb3RvcGlhLm9yZz4KKG9ubHkgTVQ3NTMwIGFuZCBNVDc1MzEgb24gYWRkcmVzcyAweDFmIGhh cyBiZWVuIHRlc3RlZCwgSSBkb24ndCBoYXZlCmFueSBib2FyZCBjb25maWd1cmluZyB0aGUgc3dp dGNoIHRvIGFueSBvdGhlciBiYXNlLWFkZHJlc3MpCgo+IC0tLQo+ICBkcml2ZXJzL25ldC9kc2Ev bXQ3NTMwLW1kaW8uYyB8IDI4ICsrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0KPiAgZHJpdmVy cy9uZXQvZHNhL210NzUzMC5jICAgICAgfCAzNSArKysrKysrKysrKysrKysrKysrKysrLS0tLS0t LS0tLS0tLQo+ICBkcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmggICAgICB8ICA0ICsrKy0KPiAgMyBm aWxlcyBjaGFuZ2VkLCAzOSBpbnNlcnRpb25zKCspLCAyOCBkZWxldGlvbnMoLSkKPiAKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL210NzUzMC1tZGlvLmMgYi9kcml2ZXJzL25ldC9kc2Ev bXQ3NTMwLW1kaW8uYwo+IGluZGV4IGZhM2VlODVhOTljMS4uNTk5YjI4YzhhMzQwIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdDc1MzAtbWRpby5jCj4gKysrIGIvZHJpdmVycy9uZXQv ZHNhL210NzUzMC1tZGlvLmMKPiBAQCAtMTgsNyArMTgsOCBAQAo+ICBzdGF0aWMgaW50Cj4gIG10 NzUzMF9yZWdtYXBfd3JpdGUodm9pZCAqY29udGV4dCwgdW5zaWduZWQgaW50IHJlZywgdW5zaWdu ZWQgaW50IHZhbCkKPiAgewo+IC0Jc3RydWN0IG1paV9idXMgKmJ1cyA9IGNvbnRleHQ7Cj4gKwlz dHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYgPSBjb250ZXh0Owo+ICsJc3RydWN0IG1paV9idXMgKmJ1 cyA9IHByaXYtPmJ1czsKPiAgCXUxNiBwYWdlLCByLCBsbywgaGk7Cj4gIAlpbnQgcmV0Owo+ICAK PiBAQCAtMjcsMzYgKzI4LDM1IEBAIG10NzUzMF9yZWdtYXBfd3JpdGUodm9pZCAqY29udGV4dCwg dW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKPiAgCWxvID0gdmFsICYgMHhmZmZm Owo+ICAJaGkgPSB2YWwgPj4gMTY7Cj4gIAo+IC0JLyogTVQ3NTMwIHVzZXMgMzEgYXMgdGhlIHBz ZXVkbyBwb3J0ICovCj4gLQlyZXQgPSBidXMtPndyaXRlKGJ1cywgMHgxZiwgMHgxZiwgcGFnZSk7 Cj4gKwlyZXQgPSBidXMtPndyaXRlKGJ1cywgcHJpdi0+cGh5X2FkZHIsIDB4MWYsIHBhZ2UpOwo+ ICAJaWYgKHJldCA8IDApCj4gIAkJcmV0dXJuIHJldDsKPiAgCj4gLQlyZXQgPSBidXMtPndyaXRl KGJ1cywgMHgxZiwgciwgIGxvKTsKPiArCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCBwcml2LT5waHlf YWRkciwgciwgbG8pOwo+ICAJaWYgKHJldCA8IDApCj4gIAkJcmV0dXJuIHJldDsKPiAgCj4gLQly ZXQgPSBidXMtPndyaXRlKGJ1cywgMHgxZiwgMHgxMCwgaGkpOwo+ICsJcmV0ID0gYnVzLT53cml0 ZShidXMsIHByaXYtPnBoeV9hZGRyLCAweDEwLCBoaSk7Cj4gIAlyZXR1cm4gcmV0Owo+ICB9Cj4g IAo+ICBzdGF0aWMgaW50Cj4gIG10NzUzMF9yZWdtYXBfcmVhZCh2b2lkICpjb250ZXh0LCB1bnNp Z25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgKnZhbCkKPiAgewo+IC0Jc3RydWN0IG1paV9idXMg KmJ1cyA9IGNvbnRleHQ7Cj4gKwlzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYgPSBjb250ZXh0Owo+ ICsJc3RydWN0IG1paV9idXMgKmJ1cyA9IHByaXYtPmJ1czsKPiAgCXUxNiBwYWdlLCByLCBsbywg aGk7Cj4gIAlpbnQgcmV0Owo+ICAKPiAgCXBhZ2UgPSAocmVnID4+IDYpICYgMHgzZmY7Cj4gIAly ID0gKHJlZyA+PiAyKSAmIDB4ZjsKPiAgCj4gLQkvKiBNVDc1MzAgdXNlcyAzMSBhcyB0aGUgcHNl dWRvIHBvcnQgKi8KPiAtCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCAweDFmLCAweDFmLCBwYWdlKTsK PiArCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCBwcml2LT5waHlfYWRkciwgMHgxZiwgcGFnZSk7Cj4g IAlpZiAocmV0IDwgMCkKPiAgCQlyZXR1cm4gcmV0Owo+ICAKPiAtCWxvID0gYnVzLT5yZWFkKGJ1 cywgMHgxZiwgcik7Cj4gLQloaSA9IGJ1cy0+cmVhZChidXMsIDB4MWYsIDB4MTApOwo+ICsJbG8g PSBidXMtPnJlYWQoYnVzLCBwcml2LT5waHlfYWRkciwgcik7Cj4gKwloaSA9IGJ1cy0+cmVhZChi dXMsIHByaXYtPnBoeV9hZGRyLCAweDEwKTsKPiAgCj4gIAkqdmFsID0gKGhpIDw8IDE2KSB8IChs byAmIDB4ZmZmZik7Cj4gIAo+IEBAIC0xMDcsOCArMTA3LDcgQEAgbXQ3NTMxX2NyZWF0ZV9zZ21p aShzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYpCj4gIAkJbXQ3NTMxX3Bjc19jb25maWdbaV0tPnVu bG9jayA9IG10NzUzMF9tZGlvX3JlZ21hcF91bmxvY2s7Cj4gIAkJbXQ3NTMxX3Bjc19jb25maWdb aV0tPmxvY2tfYXJnID0gJnByaXYtPmJ1cy0+bWRpb19sb2NrOwo+ICAKPiAtCQlyZWdtYXAgPSBk ZXZtX3JlZ21hcF9pbml0KHByaXYtPmRldiwKPiAtCQkJCQkgICZtdDc1MzBfcmVnbWFwX2J1cywg cHJpdi0+YnVzLAo+ICsJCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQocHJpdi0+ZGV2LCAmbXQ3 NTMwX3JlZ21hcF9idXMsIHByaXYsCj4gIAkJCQkJICBtdDc1MzFfcGNzX2NvbmZpZ1tpXSk7Cj4g IAkJaWYgKElTX0VSUihyZWdtYXApKSB7Cj4gIAkJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKPiBA QCAtMTUzLDYgKzE1Miw3IEBAIG10NzUzMF9wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9k ZXYpCj4gIAo+ICAJcHJpdi0+YnVzID0gbWRpb2Rldi0+YnVzOwo+ICAJcHJpdi0+ZGV2ID0gJm1k aW9kZXYtPmRldjsKPiArCXByaXYtPnBoeV9hZGRyID0gbWRpb2Rldi0+YWRkcjsKPiAgCj4gIAly ZXQgPSBtdDc1MzBfcHJvYmVfY29tbW9uKHByaXYpOwo+ICAJaWYgKHJldCkKPiBAQCAtMjAzLDgg KzIwMyw4IEBAIG10NzUzMF9wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCj4gIAly ZWdtYXBfY29uZmlnLT5yZWdfc3RyaWRlID0gNDsKPiAgCXJlZ21hcF9jb25maWctPm1heF9yZWdp c3RlciA9IE1UNzUzMF9DUkVWOwo+ICAJcmVnbWFwX2NvbmZpZy0+ZGlzYWJsZV9sb2NraW5nID0g dHJ1ZTsKPiAtCXByaXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQocHJpdi0+ZGV2LCAmbXQ3 NTMwX3JlZ21hcF9idXMsCj4gLQkJCQkJcHJpdi0+YnVzLCByZWdtYXBfY29uZmlnKTsKPiArCXBy aXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQocHJpdi0+ZGV2LCAmbXQ3NTMwX3JlZ21hcF9i dXMsIHByaXYsCj4gKwkJCQkJcmVnbWFwX2NvbmZpZyk7Cj4gIAlpZiAoSVNfRVJSKHByaXYtPnJl Z21hcCkpCj4gIAkJcmV0dXJuIFBUUl9FUlIocHJpdi0+cmVnbWFwKTsKPiAgCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbmV0L2RzYS9tdDc1MzAuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdDc1MzAuYwo+ IGluZGV4IGMwZDBiY2UwYjU5NC4uZmVmYTZkZDE1MWZhIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv bmV0L2RzYS9tdDc1MzAuYwo+ICsrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdDc1MzAuYwo+IEBAIC04 NiwyMiArODYsMjYgQEAgY29yZV9yZWFkX21tZF9pbmRpcmVjdChzdHJ1Y3QgbXQ3NTMwX3ByaXYg KnByaXYsIGludCBwcnRhZCwgaW50IGRldmFkKQo+ICAJaW50IHZhbHVlLCByZXQ7Cj4gIAo+ICAJ LyogV3JpdGUgdGhlIGRlc2lyZWQgTU1EIERldmFkICovCj4gLQlyZXQgPSBidXMtPndyaXRlKGJ1 cywgMCwgTUlJX01NRF9DVFJMLCBkZXZhZCk7Cj4gKwlyZXQgPSBidXMtPndyaXRlKGJ1cywgTVQ3 NTNYX0NUUkxfUEhZX0FERFIocHJpdi0+cGh5X2FkZHIpLAo+ICsJCQkgTUlJX01NRF9DVFJMLCBk ZXZhZCk7Cj4gIAlpZiAocmV0IDwgMCkKPiAgCQlnb3RvIGVycjsKPiAgCj4gIAkvKiBXcml0ZSB0 aGUgZGVzaXJlZCBNTUQgcmVnaXN0ZXIgYWRkcmVzcyAqLwo+IC0JcmV0ID0gYnVzLT53cml0ZShi dXMsIDAsIE1JSV9NTURfREFUQSwgcHJ0YWQpOwo+ICsJcmV0ID0gYnVzLT53cml0ZShidXMsIE1U NzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBoeV9hZGRyKSwKPiArCQkJIE1JSV9NTURfREFUQSwg cHJ0YWQpOwo+ICAJaWYgKHJldCA8IDApCj4gIAkJZ290byBlcnI7Cj4gIAo+ICAJLyogU2VsZWN0 IHRoZSBGdW5jdGlvbiA6IERBVEEgd2l0aCBubyBwb3N0IGluY3JlbWVudCAqLwo+IC0JcmV0ID0g YnVzLT53cml0ZShidXMsIDAsIE1JSV9NTURfQ1RSTCwgKGRldmFkIHwgTUlJX01NRF9DVFJMX05P SU5DUikpOwo+ICsJcmV0ID0gYnVzLT53cml0ZShidXMsIE1UNzUzWF9DVFJMX1BIWV9BRERSKHBy aXYtPnBoeV9hZGRyKSwKPiArCQkJIE1JSV9NTURfQ1RSTCwgZGV2YWQgfCBNSUlfTU1EX0NUUkxf Tk9JTkNSKTsKPiAgCWlmIChyZXQgPCAwKQo+ICAJCWdvdG8gZXJyOwo+ICAKPiAgCS8qIFJlYWQg dGhlIGNvbnRlbnQgb2YgdGhlIE1NRCdzIHNlbGVjdGVkIHJlZ2lzdGVyICovCj4gLQl2YWx1ZSA9 IGJ1cy0+cmVhZChidXMsIDAsIE1JSV9NTURfREFUQSk7Cj4gKwl2YWx1ZSA9IGJ1cy0+cmVhZChi dXMsIE1UNzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBoeV9hZGRyKSwKPiArCQkJICBNSUlfTU1E X0RBVEEpOwo+ICAKPiAgCXJldHVybiB2YWx1ZTsKPiAgZXJyOgo+IEBAIC0xMTgsMjIgKzEyMiwy NiBAQCBjb3JlX3dyaXRlX21tZF9pbmRpcmVjdChzdHJ1Y3QgbXQ3NTMwX3ByaXYgKnByaXYsIGlu dCBwcnRhZCwKPiAgCWludCByZXQ7Cj4gIAo+ICAJLyogV3JpdGUgdGhlIGRlc2lyZWQgTU1EIERl dmFkICovCj4gLQlyZXQgPSBidXMtPndyaXRlKGJ1cywgMCwgTUlJX01NRF9DVFJMLCBkZXZhZCk7 Cj4gKwlyZXQgPSBidXMtPndyaXRlKGJ1cywgTVQ3NTNYX0NUUkxfUEhZX0FERFIocHJpdi0+cGh5 X2FkZHIpLAo+ICsJCQkgTUlJX01NRF9DVFJMLCBkZXZhZCk7Cj4gIAlpZiAocmV0IDwgMCkKPiAg CQlnb3RvIGVycjsKPiAgCj4gIAkvKiBXcml0ZSB0aGUgZGVzaXJlZCBNTUQgcmVnaXN0ZXIgYWRk cmVzcyAqLwo+IC0JcmV0ID0gYnVzLT53cml0ZShidXMsIDAsIE1JSV9NTURfREFUQSwgcHJ0YWQp Owo+ICsJcmV0ID0gYnVzLT53cml0ZShidXMsIE1UNzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBo eV9hZGRyKSwKPiArCQkJIE1JSV9NTURfREFUQSwgcHJ0YWQpOwo+ICAJaWYgKHJldCA8IDApCj4g IAkJZ290byBlcnI7Cj4gIAo+ICAJLyogU2VsZWN0IHRoZSBGdW5jdGlvbiA6IERBVEEgd2l0aCBu byBwb3N0IGluY3JlbWVudCAqLwo+IC0JcmV0ID0gYnVzLT53cml0ZShidXMsIDAsIE1JSV9NTURf Q1RSTCwgKGRldmFkIHwgTUlJX01NRF9DVFJMX05PSU5DUikpOwo+ICsJcmV0ID0gYnVzLT53cml0 ZShidXMsIE1UNzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBoeV9hZGRyKSwKPiArCQkJIE1JSV9N TURfQ1RSTCwgZGV2YWQgfCBNSUlfTU1EX0NUUkxfTk9JTkNSKTsKPiAgCWlmIChyZXQgPCAwKQo+ ICAJCWdvdG8gZXJyOwo+ICAKPiAgCS8qIFdyaXRlIHRoZSBkYXRhIGludG8gTU1EJ3Mgc2VsZWN0 ZWQgcmVnaXN0ZXIgKi8KPiAtCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCAwLCBNSUlfTU1EX0RBVEEs IGRhdGEpOwo+ICsJcmV0ID0gYnVzLT53cml0ZShidXMsIE1UNzUzWF9DVFJMX1BIWV9BRERSKHBy aXYtPnBoeV9hZGRyKSwKPiArCQkJIE1JSV9NTURfREFUQSwgZGF0YSk7Cj4gIGVycjoKPiAgCWlm IChyZXQgPCAwKQo+ICAJCWRldl9lcnIoJmJ1cy0+ZGV2LAo+IEBAIC0yNjcxLDE2ICsyNjc5LDE3 IEBAIG10NzUzMV9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCj4gIAkgKiBwaHlfW3JlYWQs d3JpdGVdX21tZF9pbmRpcmVjdCBpcyBjYWxsZWQsIHdlIHByb3ZpZGUgb3VyIG93bgo+ICAJICog bXQ3NTMxX2luZF9tbWRfcGh5X1tyZWFkLHdyaXRlXSB0byBjb21wbGV0ZSB0aGlzIGZ1bmN0aW9u Lgo+ICAJICovCj4gLQl2YWwgPSBtdDc1MzFfaW5kX2M0NV9waHlfcmVhZChwcml2LCBNVDc1M1hf Q1RSTF9QSFlfQUREUiwKPiArCXZhbCA9IG10NzUzMV9pbmRfYzQ1X3BoeV9yZWFkKHByaXYsCj4g KwkJCQkgICAgICBNVDc1M1hfQ1RSTF9QSFlfQUREUihwcml2LT5waHlfYWRkciksCj4gIAkJCQkg ICAgICBNRElPX01NRF9WRU5EMiwgQ09SRV9QTExfR1JPVVA0KTsKPiAgCXZhbCB8PSBNVDc1MzFf UkdfU1lTUExMX0RNWTIgfCBNVDc1MzFfUEhZX1BMTF9CWVBBU1NfTU9ERTsKPiAgCXZhbCAmPSB+ TVQ3NTMxX1BIWV9QTExfT0ZGOwo+IC0JbXQ3NTMxX2luZF9jNDVfcGh5X3dyaXRlKHByaXYsIE1U NzUzWF9DVFJMX1BIWV9BRERSLCBNRElPX01NRF9WRU5EMiwKPiAtCQkJCSBDT1JFX1BMTF9HUk9V UDQsIHZhbCk7Cj4gKwltdDc1MzFfaW5kX2M0NV9waHlfd3JpdGUocHJpdiwgTVQ3NTNYX0NUUkxf UEhZX0FERFIocHJpdi0+cGh5X2FkZHIpLAo+ICsJCQkJIE1ESU9fTU1EX1ZFTkQyLCBDT1JFX1BM TF9HUk9VUDQsIHZhbCk7Cj4gIAo+ICAJLyogRGlzYWJsZSBFRUUgYWR2ZXJ0aXNlbWVudCBvbiB0 aGUgc3dpdGNoIFBIWXMuICovCj4gLQlmb3IgKGkgPSBNVDc1M1hfQ1RSTF9QSFlfQUREUjsKPiAt CSAgICAgaSA8IE1UNzUzWF9DVFJMX1BIWV9BRERSICsgTVQ3NTMwX05VTV9QSFlTOyBpKyspIHsK PiArCWZvciAoaSA9IE1UNzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBoeV9hZGRyKTsKPiArCSAg ICAgaSA8IE1UNzUzWF9DVFJMX1BIWV9BRERSKHByaXYtPnBoeV9hZGRyKSArIE1UNzUzMF9OVU1f UEhZUzsgaSsrKSB7Cj4gIAkJbXQ3NTMxX2luZF9jNDVfcGh5X3dyaXRlKHByaXYsIGksIE1ESU9f TU1EX0FOLCBNRElPX0FOX0VFRV9BRFYsCj4gIAkJCQkJIDApOwo+ICAJfQo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmggYi9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgKPiBp bmRleCA1ODVkYjAzYzA1NDguLjc2YWRjOWQyMWJjZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25l dC9kc2EvbXQ3NTMwLmgKPiArKysgYi9kcml2ZXJzL25ldC9kc2EvbXQ3NTMwLmgKPiBAQCAtNjI1 LDcgKzYyNSw3IEBAIGVudW0gbXQ3NTMxX2Nsa19za2V3IHsKPiAgI2RlZmluZSAgTVQ3NTMxX1BI WV9QTExfT0ZGCQlCSVQoNSkKPiAgI2RlZmluZSAgTVQ3NTMxX1BIWV9QTExfQllQQVNTX01PREUJ QklUKDQpCj4gIAo+IC0jZGVmaW5lIE1UNzUzWF9DVFJMX1BIWV9BRERSCQkwCj4gKyNkZWZpbmUg TVQ3NTNYX0NUUkxfUEhZX0FERFIocGh5X2FkZHIpCShwaHlfYWRkciA9PSAweDFmID8gMCA6IHBo eV9hZGRyICsgMSkKCiNkZWZpbmUgTVQ3NTNYX0NUUkxfUEhZX0FERFIocGh5X2FkZHIpCShwaHlf YWRkciArIDEgJiAweDFmKQoKSXQncyBzaG9ydGVyLCBhbmQgd29ya3Mgd2l0aG91dCBjb25kaXRp b25hbCBvcGVyYXRvciB3aGljaCBpcyBleHBlbnNpdmUuCgo+ICAKPiAgI2RlZmluZSBDT1JFX1BM TF9HUk9VUDUJCQkweDQwNAo+ICAjZGVmaW5lICBSR19MQ0REU19QQ1dfTkNQTzEoeCkJCSgoeCkg JiAweGZmZmYpCj4gQEAgLTc3NCw2ICs3NzQsNyBAQCBzdHJ1Y3QgbXQ3NTN4X2luZm8gewo+ICAg KiBAaXJxX2VuYWJsZToJCUlSUSBlbmFibGUgYml0cywgc3luY2VkIHRvIFNZU19JTlRfRU4KPiAg ICogQGNyZWF0ZV9zZ21paToJUG9pbnRlciB0byBmdW5jdGlvbiBjcmVhdGluZyBTR01JSSBQQ1Mg aW5zdGFuY2UocykKPiAgICogQGFjdGl2ZV9jcHVfcG9ydHM6CUhvbGRpbmcgdGhlIGFjdGl2ZSBD UFUgcG9ydHMKPiArICogQHBoeV9hZGRyOgkJSG9sZGluZyB0aGUgUEhZIGFkZHJlc3MgdGhlIHN3 aXRjaCBsaXN0ZW5zIG9uCj4gICAqLwo+ICBzdHJ1Y3QgbXQ3NTMwX3ByaXYgewo+ICAJc3RydWN0 IGRldmljZQkJKmRldjsKPiBAQCAtODAwLDYgKzgwMSw3IEBAIHN0cnVjdCBtdDc1MzBfcHJpdiB7 Cj4gIAl1MzIgaXJxX2VuYWJsZTsKPiAgCWludCAoKmNyZWF0ZV9zZ21paSkoc3RydWN0IG10NzUz MF9wcml2ICpwcml2KTsKPiAgCXU4IGFjdGl2ZV9jcHVfcG9ydHM7Cj4gKwlpbnQgcGh5X2FkZHI7 Cj4gIH07Cj4gIAo+ICBzdHJ1Y3QgbXQ3NTMwX2h3X3ZsYW5fZW50cnkgewo+IAo+IC0tIAo+IDIu NDAuMQo+IAo+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtYXJtLWtlcm5lbAo=