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 94B66C0015E for ; Sun, 6 Aug 2023 13:57:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230162AbjHFN5J (ORCPT ); Sun, 6 Aug 2023 09:57:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229498AbjHFN5I (ORCPT ); Sun, 6 Aug 2023 09:57:08 -0400 Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E0B4B102; Sun, 6 Aug 2023 06:57:06 -0700 (PDT) Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4RJgxC5Jwjz9sbh; Sun, 6 Aug 2023 15:57:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1691330223; 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=UWdULM/cMKhvgQZZICo8f8j2JPsZ03rAx8n6aRyuTRA=; b=cRrsE4QE68olJg41DT12TrP6oz9WiyLfh3ctxU8hb6u72TCHbjPe9kNDHQEtpjCu5h4CrJ G8sKs9jUK90tY8wNxFnRYBsd8ksnBchzceLuUYuW4BZ6KDans2C1W9qgmtgfk4V4FeGZaf WSKB+PIQbC3x8SfejzP9l6fLvB9cBoLFe3ccIfsg6N+I9VWqkUB/OtaDlXNJpr/LcmZkma ong5/6JgPHopQGK0/5/J/auUoD8jDqYB64gEgz9MIZ3aLTZ5zRMn8yf3seQSJrWaimAagW srxG6/Q4OkM0Rb0EE0G8idbPWvLQvgbsFCV4KB0Eo0gRqB0Rkiw+V8y5h10KiA== References: <20230806-pll-mipi_set_rate_parent-v5-0-db4f5ca33fc3@oltmanns.dev> <20230806-pll-mipi_set_rate_parent-v5-2-db4f5ca33fc3@oltmanns.dev> <3752134.kQq0lBPeGt@jernej-laptop> From: Frank Oltmanns To: Jernej =?utf-8?Q?=C5=A0krabec?= Cc: Maxime Ripard , Michael Turquette , Stephen Boyd , Chen-Yu Tsai , Samuel Holland , Andre Przywara , Roman Beranek , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 02/11] clk: sunxi-ng: nkm: consider alternative parent rates when determining rate In-reply-to: <3752134.kQq0lBPeGt@jernej-laptop> Date: Sun, 06 Aug 2023 15:57:00 +0200 Message-ID: <87h6pc9sur.fsf@oltmanns.dev> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org On 2023-08-06 at 15:32:29 +0200, Jernej =C5=A0krabec wrote: > Dne nedelja, 06. avgust 2023 ob 15:06:47 CEST je Frank Oltmanns napisal(a= ): >> In case the CLK_SET_RATE_PARENT flag is set, consider using a different >> parent rate when determining a new rate. >> >> To find the best match for the requested rate, perform the following >> steps for each NKM combination: >> - calculate the optimal parent rate, >> - find the best parent rate that the parent clock actually supports >> - use that parent rate to calculate the effective rate. >> >> In case the clk does not support setting the parent rate, use the same >> algorithm as before. >> >> Acked-by: Maxime Ripard >> Signed-off-by: Frank Oltmanns >> --- >> drivers/clk/sunxi-ng/ccu_nkm.c | 45 >> +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 >> insertions(+), 1 deletion(-) >> >> diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_n= km.c >> index f267142e58b3..ea1b77e9b57f 100644 >> --- a/drivers/clk/sunxi-ng/ccu_nkm.c >> +++ b/drivers/clk/sunxi-ng/ccu_nkm.c >> @@ -6,6 +6,7 @@ >> >> #include >> #include >> +#include > > Why do you need above include? It's not needed. It's a leftover from an earlier version. I'll remove it in v6. Thank you for your review, Frank > > Best regards, > Jernej > >> >> #include "ccu_gate.h" >> #include "ccu_nkm.h" >> @@ -16,6 +17,45 @@ struct _ccu_nkm { >> unsigned long m, min_m, max_m; >> }; >> >> +static unsigned long ccu_nkm_find_best_with_parent_adj(struct clk_hw >> *parent_hw, + > unsigned long *parent, unsigned long rate, >> + > struct _ccu_nkm *nkm) >> +{ >> + unsigned long best_rate =3D 0, best_parent_rate =3D *parent, tmp_parent > =3D >> *parent; + unsigned long best_n =3D 0, best_k =3D 0, best_m =3D 0; >> + unsigned long _n, _k, _m; >> + >> + for (_k =3D nkm->min_k; _k <=3D nkm->max_k; _k++) { >> + for (_n =3D nkm->min_n; _n <=3D nkm->max_n; _n++) { >> + for (_m =3D nkm->min_m; _m <=3D nkm->max_m; _m++) > { >> + unsigned long tmp_rate; >> + >> + tmp_parent =3D > clk_hw_round_rate(parent_hw, rate * _m / (_n * _k)); >> + >> + tmp_rate =3D tmp_parent * _n * _k / > _m; >> + if (tmp_rate > rate) >> + continue; >> + >> + if ((rate - tmp_rate) < (rate - > best_rate)) { >> + best_rate =3D tmp_rate; >> + best_parent_rate =3D > tmp_parent; >> + best_n =3D _n; >> + best_k =3D _k; >> + best_m =3D _m; >> + } >> + } >> + } >> + } >> + >> + nkm->n =3D best_n; >> + nkm->k =3D best_k; >> + nkm->m =3D best_m; >> + >> + *parent =3D best_parent_rate; >> + >> + return best_rate; >> +} >> + >> static unsigned long ccu_nkm_find_best(unsigned long parent, unsigned l= ong >> rate, struct _ccu_nkm *nkm) >> { >> @@ -124,7 +164,10 @@ static unsigned long ccu_nkm_round_rate(struct >> ccu_mux_internal *mux, if (nkm->common.features & >> CCU_FEATURE_FIXED_POSTDIV) >> rate *=3D nkm->fixed_post_div; >> >> - rate =3D ccu_nkm_find_best(*parent_rate, rate, &_nkm); >> + if (!clk_hw_can_set_rate_parent(&nkm->common.hw)) >> + rate =3D ccu_nkm_find_best(*parent_rate, rate, &_nkm); >> + else >> + rate =3D ccu_nkm_find_best_with_parent_adj(parent_hw, > parent_rate, rate, >> &_nkm); >> >> if (nkm->common.features & CCU_FEATURE_FIXED_POSTDIV) >> rate /=3D nkm->fixed_post_div; 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 F0E7AC0015E for ; Sun, 6 Aug 2023 13:57:32 +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:MIME-Version:Message-ID:Date: In-reply-to:Subject:Cc:To:From:References:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=AmICutOXy4J+7s2+5KVnAXm0i4znrLBgJYL25zhKgXw=; b=CS/e/VFQ09amWil1o3dqYIrvJN h+t/XRM1F6Jx94lvKQdQppKob8X+0F1dZWw5ZT7Pi69gAW93MHYXMzRn7azPXCp31LuJ1379X7Py+ 1fDbIxtecfKx8UZbipSIr/5i7SpkrHHu9Ab5cqqf93TUhqxd8W6Hd17mfSzKK7ufEkNNOz0hN72pF m3QDIwi3uuHWxsblznM8AlDt5pEgzgtOla8dNvsgOEEZjkTIeawUPLRrhjnAxL27GOuH/vW4+cJ8x qrt9dWWo+BiCHXvOPMd4PVfZ/+dQi1/3TN8VyuwKVzFIZdszk0SORndu9DllnSJMmEYUXFg7GYzhL LhGqj53A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qSeFq-00FU55-1A; Sun, 06 Aug 2023 13:57:10 +0000 Received: from mout-p-101.mailbox.org ([80.241.56.151]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qSeFn-00FU4e-2O for linux-arm-kernel@lists.infradead.org; Sun, 06 Aug 2023 13:57:09 +0000 Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4RJgxC5Jwjz9sbh; Sun, 6 Aug 2023 15:57:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1691330223; 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=UWdULM/cMKhvgQZZICo8f8j2JPsZ03rAx8n6aRyuTRA=; b=cRrsE4QE68olJg41DT12TrP6oz9WiyLfh3ctxU8hb6u72TCHbjPe9kNDHQEtpjCu5h4CrJ G8sKs9jUK90tY8wNxFnRYBsd8ksnBchzceLuUYuW4BZ6KDans2C1W9qgmtgfk4V4FeGZaf WSKB+PIQbC3x8SfejzP9l6fLvB9cBoLFe3ccIfsg6N+I9VWqkUB/OtaDlXNJpr/LcmZkma ong5/6JgPHopQGK0/5/J/auUoD8jDqYB64gEgz9MIZ3aLTZ5zRMn8yf3seQSJrWaimAagW srxG6/Q4OkM0Rb0EE0G8idbPWvLQvgbsFCV4KB0Eo0gRqB0Rkiw+V8y5h10KiA== References: <20230806-pll-mipi_set_rate_parent-v5-0-db4f5ca33fc3@oltmanns.dev> <20230806-pll-mipi_set_rate_parent-v5-2-db4f5ca33fc3@oltmanns.dev> <3752134.kQq0lBPeGt@jernej-laptop> From: Frank Oltmanns To: Jernej =?utf-8?Q?=C5=A0krabec?= Cc: Maxime Ripard , Michael Turquette , Stephen Boyd , Chen-Yu Tsai , Samuel Holland , Andre Przywara , Roman Beranek , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 02/11] clk: sunxi-ng: nkm: consider alternative parent rates when determining rate In-reply-to: <3752134.kQq0lBPeGt@jernej-laptop> Date: Sun, 06 Aug 2023 15:57:00 +0200 Message-ID: <87h6pc9sur.fsf@oltmanns.dev> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230806_065707_996757_2EEAE853 X-CRM114-Status: GOOD ( 17.67 ) 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 Ck9uIDIwMjMtMDgtMDYgYXQgMTU6MzI6MjkgKzAyMDAsIEplcm5laiDFoGtyYWJlYyA8amVybmVq LnNrcmFiZWNAZ21haWwuY29tPiB3cm90ZToKPiBEbmUgbmVkZWxqYSwgMDYuIGF2Z3VzdCAyMDIz IG9iIDE1OjA2OjQ3IENFU1QgamUgRnJhbmsgT2x0bWFubnMgbmFwaXNhbChhKToKPj4gSW4gY2Fz ZSB0aGUgQ0xLX1NFVF9SQVRFX1BBUkVOVCBmbGFnIGlzIHNldCwgY29uc2lkZXIgdXNpbmcgYSBk aWZmZXJlbnQKPj4gcGFyZW50IHJhdGUgd2hlbiBkZXRlcm1pbmluZyBhIG5ldyByYXRlLgo+Pgo+ PiBUbyBmaW5kIHRoZSBiZXN0IG1hdGNoIGZvciB0aGUgcmVxdWVzdGVkIHJhdGUsIHBlcmZvcm0g dGhlIGZvbGxvd2luZwo+PiBzdGVwcyBmb3IgZWFjaCBOS00gY29tYmluYXRpb246Cj4+ICAtIGNh bGN1bGF0ZSB0aGUgb3B0aW1hbCBwYXJlbnQgcmF0ZSwKPj4gIC0gZmluZCB0aGUgYmVzdCBwYXJl bnQgcmF0ZSB0aGF0IHRoZSBwYXJlbnQgY2xvY2sgYWN0dWFsbHkgc3VwcG9ydHMKPj4gIC0gdXNl IHRoYXQgcGFyZW50IHJhdGUgdG8gY2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgcmF0ZS4KPj4KPj4g SW4gY2FzZSB0aGUgY2xrIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyB0aGUgcGFyZW50IHJhdGUs IHVzZSB0aGUgc2FtZQo+PiBhbGdvcml0aG0gYXMgYmVmb3JlLgo+Pgo+PiBBY2tlZC1ieTogTWF4 aW1lIFJpcGFyZCA8bXJpcGFyZEBrZXJuZWwub3JnPgo+PiBTaWduZWQtb2ZmLWJ5OiBGcmFuayBP bHRtYW5ucyA8ZnJhbmtAb2x0bWFubnMuZGV2Pgo+PiAtLS0KPj4gIGRyaXZlcnMvY2xrL3N1bnhp LW5nL2NjdV9ua20uYyB8IDQ1Cj4+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLSAxIGZpbGUgY2hhbmdlZCwgNDQKPj4gaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigt KQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5jIGIvZHJp dmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5jCj4+IGluZGV4IGYyNjcxNDJlNThiMy4uZWExYjc3 ZTliNTdmIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmMKPj4g KysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5jCj4+IEBAIC02LDYgKzYsNyBAQAo+ Pgo+PiAgI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgo+PiAgI2luY2x1ZGUgPGxpbnV4 L2lvLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvbWF0aC5oPgo+Cj4gV2h5IGRvIHlvdSBuZWVkIGFi b3ZlIGluY2x1ZGU/CgpJdCdzIG5vdCBuZWVkZWQuIEl0J3MgYSBsZWZ0b3ZlciBmcm9tIGFuIGVh cmxpZXIgdmVyc2lvbi4gSSdsbCByZW1vdmUgaXQKaW4gdjYuCgpUaGFuayB5b3UgZm9yIHlvdXIg cmV2aWV3LAogIEZyYW5rCgo+Cj4gQmVzdCByZWdhcmRzLAo+IEplcm5lago+Cj4+Cj4+ICAjaW5j bHVkZSAiY2N1X2dhdGUuaCIKPj4gICNpbmNsdWRlICJjY3VfbmttLmgiCj4+IEBAIC0xNiw2ICsx Nyw0NSBAQCBzdHJ1Y3QgX2NjdV9ua20gewo+PiAgCXVuc2lnbmVkIGxvbmcJbSwgbWluX20sIG1h eF9tOwo+PiAgfTsKPj4KPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNjdV9ua21fZmluZF9iZXN0 X3dpdGhfcGFyZW50X2FkaihzdHJ1Y3QgY2xrX2h3Cj4+ICpwYXJlbnRfaHcsICsKPiAgICAgICAg dW5zaWduZWQgbG9uZyAqcGFyZW50LCB1bnNpZ25lZCBsb25nIHJhdGUsCj4+ICsKPiBzdHJ1Y3Qg X2NjdV9ua20gKm5rbSkKPj4gK3sKPj4gKwl1bnNpZ25lZCBsb25nIGJlc3RfcmF0ZSA9IDAsIGJl c3RfcGFyZW50X3JhdGUgPSAqcGFyZW50LCB0bXBfcGFyZW50Cj4gPQo+PiAqcGFyZW50OyArCXVu c2lnbmVkIGxvbmcgYmVzdF9uID0gMCwgYmVzdF9rID0gMCwgYmVzdF9tID0gMDsKPj4gKwl1bnNp Z25lZCBsb25nIF9uLCBfaywgX207Cj4+ICsKPj4gKwlmb3IgKF9rID0gbmttLT5taW5fazsgX2sg PD0gbmttLT5tYXhfazsgX2srKykgewo+PiArCQlmb3IgKF9uID0gbmttLT5taW5fbjsgX24gPD0g bmttLT5tYXhfbjsgX24rKykgewo+PiArCQkJZm9yIChfbSA9IG5rbS0+bWluX207IF9tIDw9IG5r bS0+bWF4X207IF9tKyspCj4gewo+PiArCQkJCXVuc2lnbmVkIGxvbmcgdG1wX3JhdGU7Cj4+ICsK Pj4gKwkJCQl0bXBfcGFyZW50ID0KPiBjbGtfaHdfcm91bmRfcmF0ZShwYXJlbnRfaHcsIHJhdGUg KiBfbSAvIChfbiAqIF9rKSk7Cj4+ICsKPj4gKwkJCQl0bXBfcmF0ZSA9IHRtcF9wYXJlbnQgKiBf biAqIF9rIC8KPiBfbTsKPj4gKwkJCQlpZiAodG1wX3JhdGUgPiByYXRlKQo+PiArCQkJCQljb250 aW51ZTsKPj4gKwo+PiArCQkJCWlmICgocmF0ZSAtIHRtcF9yYXRlKSA8IChyYXRlIC0KPiBiZXN0 X3JhdGUpKSB7Cj4+ICsJCQkJCWJlc3RfcmF0ZSA9IHRtcF9yYXRlOwo+PiArCQkJCQliZXN0X3Bh cmVudF9yYXRlID0KPiB0bXBfcGFyZW50Owo+PiArCQkJCQliZXN0X24gPSBfbjsKPj4gKwkJCQkJ YmVzdF9rID0gX2s7Cj4+ICsJCQkJCWJlc3RfbSA9IF9tOwo+PiArCQkJCX0KPj4gKwkJCX0KPj4g KwkJfQo+PiArCX0KPj4gKwo+PiArCW5rbS0+biA9IGJlc3RfbjsKPj4gKwlua20tPmsgPSBiZXN0 X2s7Cj4+ICsJbmttLT5tID0gYmVzdF9tOwo+PiArCj4+ICsJKnBhcmVudCA9IGJlc3RfcGFyZW50 X3JhdGU7Cj4+ICsKPj4gKwlyZXR1cm4gYmVzdF9yYXRlOwo+PiArfQo+PiArCj4+ICBzdGF0aWMg dW5zaWduZWQgbG9uZyBjY3VfbmttX2ZpbmRfYmVzdCh1bnNpZ25lZCBsb25nIHBhcmVudCwgdW5z aWduZWQgbG9uZwo+PiByYXRlLCBzdHJ1Y3QgX2NjdV9ua20gKm5rbSkKPj4gIHsKPj4gQEAgLTEy NCw3ICsxNjQsMTAgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgY2N1X25rbV9yb3VuZF9yYXRlKHN0 cnVjdAo+PiBjY3VfbXV4X2ludGVybmFsICptdXgsIGlmIChua20tPmNvbW1vbi5mZWF0dXJlcyAm Cj4+IENDVV9GRUFUVVJFX0ZJWEVEX1BPU1RESVYpCj4+ICAJCXJhdGUgKj0gbmttLT5maXhlZF9w b3N0X2RpdjsKPj4KPj4gLQlyYXRlID0gY2N1X25rbV9maW5kX2Jlc3QoKnBhcmVudF9yYXRlLCBy YXRlLCAmX25rbSk7Cj4+ICsJaWYgKCFjbGtfaHdfY2FuX3NldF9yYXRlX3BhcmVudCgmbmttLT5j b21tb24uaHcpKQo+PiArCQlyYXRlID0gY2N1X25rbV9maW5kX2Jlc3QoKnBhcmVudF9yYXRlLCBy YXRlLCAmX25rbSk7Cj4+ICsJZWxzZQo+PiArCQlyYXRlID0gY2N1X25rbV9maW5kX2Jlc3Rfd2l0 aF9wYXJlbnRfYWRqKHBhcmVudF9odywKPiBwYXJlbnRfcmF0ZSwgcmF0ZSwKPj4gJl9ua20pOwo+ Pgo+PiAgCWlmIChua20tPmNvbW1vbi5mZWF0dXJlcyAmIENDVV9GRUFUVVJFX0ZJWEVEX1BPU1RE SVYpCj4+ICAJCXJhdGUgLz0gbmttLT5maXhlZF9wb3N0X2RpdjsKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK