From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F27E43CF53; Mon, 19 Feb 2024 16:27:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.194 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708360082; cv=none; b=lf1L+E1xTVE6NPpbXCK81K6wyO+zN5HRos7DIMZmx7DaA7m80ZySbXl0tKt8w+Llp6K7ZzDFxKVIgOiLiNnix1mivsymGzrwK/f7fKrG/6mhyZlGlBcVVkgbOOpMLnlE2CK8VY2wreuoQTcEJX4vdV+4rCunEoxQu7mSOBho0AA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708360082; c=relaxed/simple; bh=9JU8MTOHh8Epoa0sQCXObDtkwAXHJu26UejiP9YuhEk=; h=Mime-Version:Content-Type:Date:Message-Id:To:From:Subject:Cc: References:In-Reply-To; b=Vx8bu1uXy6i2xn1OLQCFsMZK8hroZrotarwL1cwkB/e6ebVAyKIvCsqSz36GNFMR1MoD/Zy4pYKo7Oz1ZQk1ib/V6yAVdftxfBem5Fzb55c7gKs8+KTaIsQGqliinK59dfB0pcr7bNzPkm6/NxIr4OhSDrncRFJ1BvSiZhXwbEA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=c4YDXXkS; arc=none smtp.client-ip=217.70.183.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="c4YDXXkS" Received: by mail.gandi.net (Postfix) with ESMTPSA id A9C7340002; Mon, 19 Feb 2024 16:27:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1708360078; 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=0QSZ4uv/p4jrEtAF8IYICmdIzO8A6oWIZZjz46OQJxA=; b=c4YDXXkSeglvXQRkC8C9eSW8vjieW62azbJ98JOq6+hpqUqn8y6CzjzJJpEJ6OpIjEZPgC Uhkm9TNo59+SKB0GzB39RQnpCL50WsxTpjv12GFQGrjvd1g7gRoD8RCngl/W46fep77eyy P7xvtdjEYUpjRYZcsyE4hP9ipXeTfPOuIUf9vA42KKRjUrP/0Gmdxl+etilbgCR2PWp5Sk SHvQNactB6Nseu0E0hCx/HdxGE+9RMC7HDGSDb4iySDjWPkU9T/QE2LTvamfnZ/dNF/Bwp bxNmNIfO/u1x2ojLgVuNocNUgVgfIFdw63KzTpNVNB9Uv8bXjfXPEVxYQi/q6A== Precedence: bulk X-Mailing-List: linux-i2c@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Mon, 19 Feb 2024 17:27:56 +0100 Message-Id: To: =?utf-8?q?Th=C3=A9o_Lebrun?= , "Linus Walleij" From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH 10/13] i2c: nomadik: support Mobileye EyeQ5 I2C controller Cc: "Andi Shyti" , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Thomas Bogendoerfer" , , , , , , "Gregory Clement" , "Vladimir Kondratiev" , "Thomas Petazzoni" , "Tawfik Bayouk" X-Mailer: aerc 0.15.2 References: <20240215-mbly-i2c-v1-0-19a336e91dca@bootlin.com> <20240215-mbly-i2c-v1-10-19a336e91dca@bootlin.com> In-Reply-To: X-GND-Sasl: theo.lebrun@bootlin.com Hello, On Mon Feb 19, 2024 at 3:52 PM CET, Th=C3=A9o Lebrun wrote: > On Mon Feb 19, 2024 at 3:35 PM CET, Linus Walleij wrote: > > On Thu, Feb 15, 2024 at 5:52=E2=80=AFPM Th=C3=A9o Lebrun wrote: > > > > > Add compatible for the integration of the same DB8500 IP block into t= he > > > Mobileye EyeQ5 platform. Two quirks are present: > > > > > > - The memory bus only supports 32-bit accesses. One writeb() is done= to > > > fill the Tx FIFO which we replace with a writel(). > > > > > > - A register must be configured for the I2C speed mode; it is locate= d > > > in a shared register region called OLB. We access that memory regi= on > > > using a syscon & regmap that gets passed as a phandle (mobileye,ol= b). > > > > > > A two-bit enum per controller is written into the register; that > > > requires us to know the global index of the I2C > > > controller (mobileye,id). > > > > > > We add #include and and sort > > > headers. > > > > > > Signed-off-by: Th=C3=A9o Lebrun > > > > (...) > > > > > - writeb(*priv->cli.buffer, priv->virtbase + I2C_TFR); > > > + if (priv->has_32b_bus) > > > + writel(*priv->cli.buffer, priv->virtbase + I2= C_TFR); > > > + else > > > + writeb(*priv->cli.buffer, priv->virtbase + I2= C_TFR); > > > > Are the other byte accessors working flawlessly? I get the shivers. > > If it's needed in one place I bet the others prefer 32bit access too. > > I see where your shivers come from; I'll investigate as I don't remember > my conclusion from the time when I worked on this driver (a few months > ago). > > > Further the MIPS is big-endian is it not? It feels that this just happe= ns > > to work because of byte order access? writel() is little-endian by > > definition. > > Actually, no. Our platform is little-endian. > > The full story, summarised: the endianness of our cores in kernel and > hypervisor mode is defined by a pin read at reset. User mode can toggle > the endianness at runtime I believe, but that is not of our concern. > Our endianness in kernel mode is little-endian because the pin in > question is hardwired to the value meaning little-endian. > > > What happens if you replace all writeb():s with something like > > > > static void nmk_write_reg(struct nmk_i2c_dev *priv, u32 reg, u8 val) > > { > > if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) > > writeb(val, priv->virtbase + reg + 3); > > // if this doesn't work then use writeb((u32)val, > > priv->virtbase + reg) I guess > > else > > writeb(val, priv->virtbase + reg); > > } > > > > and conversely for readb()? > > As mentionned above, big endian isn't the worry for us. I'll be checking > the readb() calls found in i2c_irq_handler() though. Follow up on this. It was working by luck. - writeb() are generating Store Byte (sb) instructions which are unsupported on the memory bus. - readb() are generating Load Doubleword (ld) instructions and not the expected Load Byte (lb). It explains why readb() are working. To be safe I'll make sure to use readl() and writel() everywhere for our compatible. There is one writeb() and three readb(). Only the writeb() was covered by this V1. Thanks, -- Th=C3=A9o Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com 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 2CBB1C48BF8 for ; Mon, 19 Feb 2024 16:28:16 +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:References:Cc:Subject:From: To:Message-Id:Date:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=k3Ya00102whIykUdcu5JZymAp8eauQe1DB5C1SMzkYk=; b=wC7HRdno5Nn2Jn laUwX2l2QwmNFRNMfeJSAZN9Drw3N8vyv2/OoQZNJnMsEnZx/BRZUqaWU2Kv24XCJHwti5Nax0uLl ErsarNAri/vl5F1STJYB4PdN1GZ6RNA4tso941MPzoI4jXLCewqJ/XKUDwbH11HsXk5YSgNmHETrh ElD4pFkm3Eg4hmMtECs3MYY+PcRLqHD47Unfk+yeqhZl+UGxEDJ8NZ2OtV5nMnb3il/X2hep10Q8h STxSi8eG+AnzGbzuArjCp40HGxVxRUrcSqwT0xb8crQ2xAFlqde4JxhyVOZovz+DXZohwmYtJZhF2 /RmVi12ft2h7TR3mzoNg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rc6Ut-0000000BLvA-3RtT; Mon, 19 Feb 2024 16:28:03 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rc6Uq-0000000BLtx-2pby for linux-arm-kernel@lists.infradead.org; Mon, 19 Feb 2024 16:28:02 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id A9C7340002; Mon, 19 Feb 2024 16:27:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1708360078; 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=0QSZ4uv/p4jrEtAF8IYICmdIzO8A6oWIZZjz46OQJxA=; b=c4YDXXkSeglvXQRkC8C9eSW8vjieW62azbJ98JOq6+hpqUqn8y6CzjzJJpEJ6OpIjEZPgC Uhkm9TNo59+SKB0GzB39RQnpCL50WsxTpjv12GFQGrjvd1g7gRoD8RCngl/W46fep77eyy P7xvtdjEYUpjRYZcsyE4hP9ipXeTfPOuIUf9vA42KKRjUrP/0Gmdxl+etilbgCR2PWp5Sk SHvQNactB6Nseu0E0hCx/HdxGE+9RMC7HDGSDb4iySDjWPkU9T/QE2LTvamfnZ/dNF/Bwp bxNmNIfO/u1x2ojLgVuNocNUgVgfIFdw63KzTpNVNB9Uv8bXjfXPEVxYQi/q6A== Mime-Version: 1.0 Date: Mon, 19 Feb 2024 17:27:56 +0100 Message-Id: To: =?utf-8?q?Th=C3=A9o_Lebrun?= , "Linus Walleij" From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH 10/13] i2c: nomadik: support Mobileye EyeQ5 I2C controller Cc: "Andi Shyti" , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Thomas Bogendoerfer" , , , , , , "Gregory Clement" , "Vladimir Kondratiev" , "Thomas Petazzoni" , "Tawfik Bayouk" X-Mailer: aerc 0.15.2 References: <20240215-mbly-i2c-v1-0-19a336e91dca@bootlin.com> <20240215-mbly-i2c-v1-10-19a336e91dca@bootlin.com> In-Reply-To: X-GND-Sasl: theo.lebrun@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240219_082800_999783_D8D4D7A0 X-CRM114-Status: GOOD ( 29.30 ) 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 SGVsbG8sCgpPbiBNb24gRmViIDE5LCAyMDI0IGF0IDM6NTIgUE0gQ0VULCBUaMOpbyBMZWJydW4g d3JvdGU6Cj4gT24gTW9uIEZlYiAxOSwgMjAyNCBhdCAzOjM1IFBNIENFVCwgTGludXMgV2FsbGVp aiB3cm90ZToKPiA+IE9uIFRodSwgRmViIDE1LCAyMDI0IGF0IDU6NTLigK9QTSBUaMOpbyBMZWJy dW4gPHRoZW8ubGVicnVuQGJvb3RsaW4uY29tPiB3cm90ZToKPiA+Cj4gPiA+IEFkZCBjb21wYXRp YmxlIGZvciB0aGUgaW50ZWdyYXRpb24gb2YgdGhlIHNhbWUgREI4NTAwIElQIGJsb2NrIGludG8g dGhlCj4gPiA+IE1vYmlsZXllIEV5ZVE1IHBsYXRmb3JtLiBUd28gcXVpcmtzIGFyZSBwcmVzZW50 Ogo+ID4gPgo+ID4gPiAgLSBUaGUgbWVtb3J5IGJ1cyBvbmx5IHN1cHBvcnRzIDMyLWJpdCBhY2Nl c3Nlcy4gT25lIHdyaXRlYigpIGlzIGRvbmUgdG8KPiA+ID4gICAgZmlsbCB0aGUgVHggRklGTyB3 aGljaCB3ZSByZXBsYWNlIHdpdGggYSB3cml0ZWwoKS4KPiA+ID4KPiA+ID4gIC0gQSByZWdpc3Rl ciBtdXN0IGJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBJMkMgc3BlZWQgbW9kZTsgaXQgaXMgbG9jYXRl ZAo+ID4gPiAgICBpbiBhIHNoYXJlZCByZWdpc3RlciByZWdpb24gY2FsbGVkIE9MQi4gV2UgYWNj ZXNzIHRoYXQgbWVtb3J5IHJlZ2lvbgo+ID4gPiAgICB1c2luZyBhIHN5c2NvbiAmIHJlZ21hcCB0 aGF0IGdldHMgcGFzc2VkIGFzIGEgcGhhbmRsZSAobW9iaWxleWUsb2xiKS4KPiA+ID4KPiA+ID4g ICAgQSB0d28tYml0IGVudW0gcGVyIGNvbnRyb2xsZXIgaXMgd3JpdHRlbiBpbnRvIHRoZSByZWdp c3RlcjsgdGhhdAo+ID4gPiAgICByZXF1aXJlcyB1cyB0byBrbm93IHRoZSBnbG9iYWwgaW5kZXgg b2YgdGhlIEkyQwo+ID4gPiAgICBjb250cm9sbGVyIChtb2JpbGV5ZSxpZCkuCj4gPiA+Cj4gPiA+ IFdlIGFkZCAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPiBhbmQgPGxpbnV4L3JlZ21hcC5o PiBhbmQgc29ydAo+ID4gPiBoZWFkZXJzLgo+ID4gPgo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBUaMOp byBMZWJydW4gPHRoZW8ubGVicnVuQGJvb3RsaW4uY29tPgo+ID4KPiA+ICguLi4pCj4gPgo+ID4g PiAtICAgICAgICAgICAgICAgd3JpdGViKCpwcml2LT5jbGkuYnVmZmVyLCBwcml2LT52aXJ0YmFz ZSArIEkyQ19URlIpOwo+ID4gPiArICAgICAgICAgICAgICAgaWYgKHByaXYtPmhhc18zMmJfYnVz KQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWwoKnByaXYtPmNsaS5idWZmZXIs IHByaXYtPnZpcnRiYXNlICsgSTJDX1RGUik7Cj4gPiA+ICsgICAgICAgICAgICAgICBlbHNlCj4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlYigqcHJpdi0+Y2xpLmJ1ZmZlciwgcHJp di0+dmlydGJhc2UgKyBJMkNfVEZSKTsKPiA+Cj4gPiBBcmUgdGhlIG90aGVyIGJ5dGUgYWNjZXNz b3JzIHdvcmtpbmcgZmxhd2xlc3NseT8gSSBnZXQgdGhlIHNoaXZlcnMuCj4gPiBJZiBpdCdzIG5l ZWRlZCBpbiBvbmUgcGxhY2UgSSBiZXQgdGhlIG90aGVycyBwcmVmZXIgMzJiaXQgYWNjZXNzIHRv by4KPgo+IEkgc2VlIHdoZXJlIHlvdXIgc2hpdmVycyBjb21lIGZyb207IEknbGwgaW52ZXN0aWdh dGUgYXMgSSBkb24ndCByZW1lbWJlcgo+IG15IGNvbmNsdXNpb24gZnJvbSB0aGUgdGltZSB3aGVu IEkgd29ya2VkIG9uIHRoaXMgZHJpdmVyIChhIGZldyBtb250aHMKPiBhZ28pLgo+Cj4gPiBGdXJ0 aGVyIHRoZSBNSVBTIGlzIGJpZy1lbmRpYW4gaXMgaXQgbm90PyBJdCBmZWVscyB0aGF0IHRoaXMg anVzdCBoYXBwZW5zCj4gPiB0byB3b3JrIGJlY2F1c2Ugb2YgYnl0ZSBvcmRlciBhY2Nlc3M/IHdy aXRlbCgpIGlzIGxpdHRsZS1lbmRpYW4gYnkKPiA+IGRlZmluaXRpb24uCj4KPiBBY3R1YWxseSwg bm8uIE91ciBwbGF0Zm9ybSBpcyBsaXR0bGUtZW5kaWFuLgo+Cj4gVGhlIGZ1bGwgc3RvcnksIHN1 bW1hcmlzZWQ6IHRoZSBlbmRpYW5uZXNzIG9mIG91ciBjb3JlcyBpbiBrZXJuZWwgYW5kCj4gaHlw ZXJ2aXNvciBtb2RlIGlzIGRlZmluZWQgYnkgYSBwaW4gcmVhZCBhdCByZXNldC4gVXNlciBtb2Rl IGNhbiB0b2dnbGUKPiB0aGUgZW5kaWFubmVzcyBhdCBydW50aW1lIEkgYmVsaWV2ZSwgYnV0IHRo YXQgaXMgbm90IG9mIG91ciBjb25jZXJuLgo+IE91ciBlbmRpYW5uZXNzIGluIGtlcm5lbCBtb2Rl IGlzIGxpdHRsZS1lbmRpYW4gYmVjYXVzZSB0aGUgcGluIGluCj4gcXVlc3Rpb24gaXMgaGFyZHdp cmVkIHRvIHRoZSB2YWx1ZSBtZWFuaW5nIGxpdHRsZS1lbmRpYW4uCj4KPiA+IFdoYXQgaGFwcGVu cyBpZiB5b3UgcmVwbGFjZSBhbGwgd3JpdGViKCk6cyB3aXRoIHNvbWV0aGluZyBsaWtlCj4gPgo+ ID4gc3RhdGljIHZvaWQgbm1rX3dyaXRlX3JlZyhzdHJ1Y3Qgbm1rX2kyY19kZXYgKnByaXYsIHUz MiByZWcsIHU4IHZhbCkKPiA+IHsKPiA+ICAgICBpZiAoSVNfRU5BQkxFRChDT05GSUdfQ1BVX0JJ R19FTkRJQU4pKQo+ID4gICAgICAgICB3cml0ZWIodmFsLCBwcml2LT52aXJ0YmFzZSArIHJlZyAr IDMpOwo+ID4gICAgICAgICAvLyBpZiB0aGlzIGRvZXNuJ3Qgd29yayB0aGVuIHVzZSB3cml0ZWIo KHUzMil2YWwsCj4gPiBwcml2LT52aXJ0YmFzZSArIHJlZykgSSBndWVzcwo+ID4gICAgZWxzZQo+ ID4gICAgICAgICB3cml0ZWIodmFsLCBwcml2LT52aXJ0YmFzZSArIHJlZyk7Cj4gPiB9Cj4gPgo+ ID4gYW5kIGNvbnZlcnNlbHkgZm9yIHJlYWRiKCk/Cj4KPiBBcyBtZW50aW9ubmVkIGFib3ZlLCBi aWcgZW5kaWFuIGlzbid0IHRoZSB3b3JyeSBmb3IgdXMuIEknbGwgYmUgY2hlY2tpbmcKPiB0aGUg cmVhZGIoKSBjYWxscyBmb3VuZCBpbiBpMmNfaXJxX2hhbmRsZXIoKSB0aG91Z2guCgpGb2xsb3cg dXAgb24gdGhpcy4gSXQgd2FzIHdvcmtpbmcgYnkgbHVjay4KCiAtIHdyaXRlYigpIGFyZSBnZW5l cmF0aW5nIFN0b3JlIEJ5dGUgKHNiKSBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlCiAgIHVuc3VwcG9y dGVkIG9uIHRoZSBtZW1vcnkgYnVzLgoKIC0gcmVhZGIoKSBhcmUgZ2VuZXJhdGluZyBMb2FkIERv dWJsZXdvcmQgKGxkKSBpbnN0cnVjdGlvbnMgYW5kIG5vdCB0aGUKICAgZXhwZWN0ZWQgTG9hZCBC eXRlIChsYikuIEl0IGV4cGxhaW5zIHdoeSByZWFkYigpIGFyZSB3b3JraW5nLgoKVG8gYmUgc2Fm ZSBJJ2xsIG1ha2Ugc3VyZSB0byB1c2UgcmVhZGwoKSBhbmQgd3JpdGVsKCkgZXZlcnl3aGVyZSBm b3Igb3VyCmNvbXBhdGlibGUuIFRoZXJlIGlzIG9uZSB3cml0ZWIoKSBhbmQgdGhyZWUgcmVhZGIo KS4gT25seSB0aGUgd3JpdGViKCkKd2FzIGNvdmVyZWQgYnkgdGhpcyBWMS4KClRoYW5rcywKCi0t ClRow6lvIExlYnJ1biwgQm9vdGxpbgpFbWJlZGRlZCBMaW51eCBhbmQgS2VybmVsIGVuZ2luZWVy aW5nCmh0dHBzOi8vYm9vdGxpbi5jb20KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK