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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 2A085C55160 for ; Thu, 30 Jul 2026 01:50:28 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3D3F010ED15; Thu, 30 Jul 2026 01:50:27 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="ZuiVhjnX"; dkim-atps=neutral Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6E2A910ED15 for ; Thu, 30 Jul 2026 01:50:26 +0000 (UTC) Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id E42414044D; Thu, 30 Jul 2026 01:50:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F58C1F000E9; Thu, 30 Jul 2026 01:50:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785376225; bh=sPJ6ULkhyfrBg52VO2+8LMzp105F0zO8YixV9ovEcUc=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZuiVhjnXxVBf02//xANfakl9wU1LltELFcyHQV/Jtero2uW/0ST5g2vPuFj0hiiDm RKrHdAtSbcDW9PWLp8IoN0VFVVttetzOC/3r+Wzk7tp1uavXbyMf0+0felVw/hCLai Th8v54+/nEvRTpg8MNec3CdNUNJpKCOVQuU0kK56rsjZ35+VxyD302ii/TxIdOLb6K CYk1HTZlJndOeoYFHTG+yTkWHQgUPX0o6DVLgq0g/bTbS8dHXnvXQCpD4eLuyCaN9l WqspbZe8ryvgxWO+hcDDEmEYt5f5j17a19jb3erjuvmQlFFv1Jnqln4zFFi1MacYXY 3LvZlH7MNg4FA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v5 1/6] drm/bridge: Implement generic USB Type-C DP HPD bridge To: "Chaoyi Chen" Cc: linux-phy@lists.infradead.org, olteanv@gmail.com, vkoul@kernel.org, neil.armstrong@linaro.org, dri-devel@lists.freedesktop.org In-Reply-To: <20260730013349.51-2-kernel@airkyi.com> References: <20260730013349.51-1-kernel@airkyi.com> <20260730013349.51-2-kernel@airkyi.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 30 Jul 2026 01:50:24 +0000 Message-Id: <20260730015025.5F58C1F000E9@smtp.kernel.org> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Thank you for your contribution! Sashiko AI review found 3 potential issue(= s) to consider: - [High] Resource leak and duplicate bridge registration on module reload d= ue to lifecycle mismatch. - [High] Duplicate registration conflict with USB-C controller drivers that= natively implement HPD bridges. - [Medium] Race condition between bus notifier registration and device iter= ation leading to duplicate bridge registration. -- --- Patch [1]: [PATCH v5 1/6] drm/bridge: Implement generic USB Type-C DP H= PD bridge --- commit 9877135b6e3e85a72f21170c14a083ad3e0308af Author: Chaoyi Chen drm/bridge: Implement generic USB Type-C DP HPD bridge This patch implements a generic USB Type-C DP HPD bridge that monitors the Type-C bus for devices containing the DP SVID. It automatically creates an HPD bridge for these devices without requiring the USB-C controller driver to implement it manually. > diff --git a/drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c b/drivers/g= pu/drm/bridge/aux-hpd-typec-dp-bridge.c > new file mode 100644 > index 0000000000000..43af3ea20f201 > --- /dev/null > +++ b/drivers/gpu/drm/bridge/aux-hpd-typec-dp-bridge.c > @@ -0,0 +1,64 @@ [ ... ] > +static int drm_typec_bus_event(struct notifier_block *nb, > + unsigned long action, void *data) > +{ > + struct device *dev =3D (struct device *)data; > + struct typec_altmode *alt =3D to_typec_altmode(dev); > + > + if (action !=3D BUS_NOTIFY_ADD_DEVICE) > + return NOTIFY_OK; > + > + /* > + * alt->dev.parent->parent : USB-C controller device > + * alt->dev.parent : USB-C connector device > + */ > + if (is_typec_port_altmode(&alt->dev) && alt->svid =3D=3D USB_TYPEC_DP_S= ID) > + drm_dp_hpd_bridge_register(alt->dev.parent->parent, > + to_of_node(alt->dev.parent->fwnode)); [Severity: High] Does this unconditional registration create duplicate bridges for controller drivers (like fusb302 or qcom_pmic_typec) that already manually allocate their own HPD bridge for the same device node? If the DRM subsystem binds to the generic bridge instead of the native one, could HPD events sent by the controller via drm_aux_hpd_bridge_notify() to its private bridge be lost? [ ... ] > +static void drm_aux_hpd_typec_dp_bridge_module_exit(void) > +{ > + bus_unregister_notifier(&typec_bus, &drm_typec_event_nb); > +} [Severity: High] Does this leak resources and create duplicate bridges if the module is unlo= aded and reloaded? Since drm_dp_hpd_bridge_register() uses devm semantics tied to the USB-C controller device (alt->dev.parent->parent) rather than this observer modul= e, the bridges will outlive the module. When the module is reloaded, it will iterate the bus and unconditionally allocate a second set of duplicate brid= ges. > + > +static int __init drm_aux_hpd_typec_dp_bridge_module_init(void) > +{ > + bus_register_notifier(&typec_bus, &drm_typec_event_nb); > + /* > + * Before module initialization, some devices may have already been add= ed. > + * Register the HPD bridge for these devices. > + */ > + bus_for_each_dev(&typec_bus, NULL, NULL, check_device_already_added); [Severity: Medium] Is there a race condition here between registering the bus notifier and ite= rating over the existing devices? If a Type-C altmode device is added concurrently during module initializati= on, could it trigger the notifier callback and also be processed by the bus ite= ration loop? Since drm_dp_hpd_bridge_register() lacks deduplication logic, this TO= CTOU race might result in duplicate bridge registrations. > + return 0; > +} > + > +module_init(drm_aux_hpd_typec_dp_bridge_module_init); > +module_exit(drm_aux_hpd_typec_dp_bridge_module_exit); --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260730013349.51-1= -kernel@airkyi.com?part=3D1 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 77E45C54FCD for ; Thu, 30 Jul 2026 01:50:27 +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:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=KwJwhKBVsZkc5R1oiv73SonXAZBUxeoqaNhW32mITvI=; b=3r9Z6gfqla5fPx 6FBdW+f1tBsRIfCXBkF4u//uSXJP9lkIMZkIqpjmN+fZOQIbRhoQZqrRT/njEqfnUhEUTPrjjyto7 xf/BeuhBNfnqtfIHTYtZyVcetGY+rtoi0Oq6I3g1HXIX8XQcjj5yb51lif9e+UZt/9VmtLyF5g/wf ESd0Bb/P1k2F9P0//yt6aflexOGPd9ikb+dTnNMlMNWGcAfd5t3yvwemtcym2YTMH+mhapq0RnDJB 8cz0OLoqDVKUwNAjaudBXCC2lI2QjIBDIQbQDtVtooCkdO2dcqaCYoXUou9CZChn1qWPF58QESrfk rvuGsuNq7TTrwCMPeIMw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpFul-00000009IEp-0aiu; Thu, 30 Jul 2026 01:50:27 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpFuk-00000009IEd-0fDF for linux-phy@lists.infradead.org; Thu, 30 Jul 2026 01:50:26 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id E42414044D; Thu, 30 Jul 2026 01:50:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F58C1F000E9; Thu, 30 Jul 2026 01:50:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785376225; bh=sPJ6ULkhyfrBg52VO2+8LMzp105F0zO8YixV9ovEcUc=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZuiVhjnXxVBf02//xANfakl9wU1LltELFcyHQV/Jtero2uW/0ST5g2vPuFj0hiiDm RKrHdAtSbcDW9PWLp8IoN0VFVVttetzOC/3r+Wzk7tp1uavXbyMf0+0felVw/hCLai Th8v54+/nEvRTpg8MNec3CdNUNJpKCOVQuU0kK56rsjZ35+VxyD302ii/TxIdOLb6K CYk1HTZlJndOeoYFHTG+yTkWHQgUPX0o6DVLgq0g/bTbS8dHXnvXQCpD4eLuyCaN9l WqspbZe8ryvgxWO+hcDDEmEYt5f5j17a19jb3erjuvmQlFFv1Jnqln4zFFi1MacYXY 3LvZlH7MNg4FA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v5 1/6] drm/bridge: Implement generic USB Type-C DP HPD bridge To: "Chaoyi Chen" Cc: linux-phy@lists.infradead.org, olteanv@gmail.com, vkoul@kernel.org, neil.armstrong@linaro.org, dri-devel@lists.freedesktop.org In-Reply-To: <20260730013349.51-2-kernel@airkyi.com> References: <20260730013349.51-1-kernel@airkyi.com> <20260730013349.51-2-kernel@airkyi.com> Date: Thu, 30 Jul 2026 01:50:24 +0000 Message-Id: <20260730015025.5F58C1F000E9@smtp.kernel.org> X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFJlc291cmNlIGxlYWsg YW5kIGR1cGxpY2F0ZSBicmlkZ2UgcmVnaXN0cmF0aW9uIG9uIG1vZHVsZSByZWxvYWQgZHVlIHRv IGxpZmVjeWNsZSBtaXNtYXRjaC4KLSBbSGlnaF0gRHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBjb25m bGljdCB3aXRoIFVTQi1DIGNvbnRyb2xsZXIgZHJpdmVycyB0aGF0IG5hdGl2ZWx5IGltcGxlbWVu dCBIUEQgYnJpZGdlcy4KLSBbTWVkaXVtXSBSYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGJ1cyBub3Rp ZmllciByZWdpc3RyYXRpb24gYW5kIGRldmljZSBpdGVyYXRpb24gbGVhZGluZyB0byBkdXBsaWNh dGUgYnJpZGdlIHJlZ2lzdHJhdGlvbi4KLS0KCi0tLSBQYXRjaCBbMV06IFtQQVRDSCB2NSAxLzZd IGRybS9icmlkZ2U6IEltcGxlbWVudCBnZW5lcmljIFVTQiBUeXBlLUMgRFAgSFBEIGJyaWRnZSAt LS0KY29tbWl0IDk4NzcxMzViNmUzZTg1YTcyZjIxMTcwYzE0YTA4M2FkM2UwMzA4YWYKQXV0aG9y OiBDaGFveWkgQ2hlbiA8Y2hhb3lpLmNoZW5Acm9jay1jaGlwcy5jb20+Cgpkcm0vYnJpZGdlOiBJ bXBsZW1lbnQgZ2VuZXJpYyBVU0IgVHlwZS1DIERQIEhQRCBicmlkZ2UKClRoaXMgcGF0Y2ggaW1w bGVtZW50cyBhIGdlbmVyaWMgVVNCIFR5cGUtQyBEUCBIUEQgYnJpZGdlIHRoYXQgbW9uaXRvcnMg dGhlClR5cGUtQyBidXMgZm9yIGRldmljZXMgY29udGFpbmluZyB0aGUgRFAgU1ZJRC4gSXQgYXV0 b21hdGljYWxseSBjcmVhdGVzIGFuCkhQRCBicmlkZ2UgZm9yIHRoZXNlIGRldmljZXMgd2l0aG91 dCByZXF1aXJpbmcgdGhlIFVTQi1DIGNvbnRyb2xsZXIgZHJpdmVyCnRvIGltcGxlbWVudCBpdCBt YW51YWxseS4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYXV4LWhwZC10 eXBlYy1kcC1icmlkZ2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYXV4LWhwZC10eXBlYy1k cC1icmlkZ2UuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwMC4u NDNhZjNlYTIwZjIwMQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL2F1eC1ocGQtdHlwZWMtZHAtYnJpZGdlLmMKPiBAQCAtMCwwICsxLDY0IEBACgpbIC4uLiBd Cgo+ICtzdGF0aWMgaW50IGRybV90eXBlY19idXNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpuYiwKPiArCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQo+ICt7 Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoc3RydWN0IGRldmljZSAqKWRhdGE7Cj4gKwlzdHJ1 Y3QgdHlwZWNfYWx0bW9kZSAqYWx0ID0gdG9fdHlwZWNfYWx0bW9kZShkZXYpOwo+ICsKPiArCWlm IChhY3Rpb24gIT0gQlVTX05PVElGWV9BRERfREVWSUNFKQo+ICsJCXJldHVybiBOT1RJRllfT0s7 Cj4gKwo+ICsJLyoKPiArCSAqIGFsdC0+ZGV2LnBhcmVudC0+cGFyZW50IDogVVNCLUMgY29udHJv bGxlciBkZXZpY2UKPiArCSAqIGFsdC0+ZGV2LnBhcmVudCAgICAgICAgIDogVVNCLUMgY29ubmVj dG9yIGRldmljZQo+ICsJICovCj4gKwlpZiAoaXNfdHlwZWNfcG9ydF9hbHRtb2RlKCZhbHQtPmRl dikgJiYgYWx0LT5zdmlkID09IFVTQl9UWVBFQ19EUF9TSUQpCj4gKwkJZHJtX2RwX2hwZF9icmlk Z2VfcmVnaXN0ZXIoYWx0LT5kZXYucGFyZW50LT5wYXJlbnQsCj4gKwkJCQkJICAgdG9fb2Zfbm9k ZShhbHQtPmRldi5wYXJlbnQtPmZ3bm9kZSkpOwoKW1NldmVyaXR5OiBIaWdoXQpEb2VzIHRoaXMg dW5jb25kaXRpb25hbCByZWdpc3RyYXRpb24gY3JlYXRlIGR1cGxpY2F0ZSBicmlkZ2VzIGZvciBj b250cm9sbGVyCmRyaXZlcnMgKGxpa2UgZnVzYjMwMiBvciBxY29tX3BtaWNfdHlwZWMpIHRoYXQg YWxyZWFkeSBtYW51YWxseSBhbGxvY2F0ZQp0aGVpciBvd24gSFBEIGJyaWRnZSBmb3IgdGhlIHNh bWUgZGV2aWNlIG5vZGU/CgpJZiB0aGUgRFJNIHN1YnN5c3RlbSBiaW5kcyB0byB0aGUgZ2VuZXJp YyBicmlkZ2UgaW5zdGVhZCBvZiB0aGUgbmF0aXZlIG9uZSwKY291bGQgSFBEIGV2ZW50cyBzZW50 IGJ5IHRoZSBjb250cm9sbGVyIHZpYSBkcm1fYXV4X2hwZF9icmlkZ2Vfbm90aWZ5KCkgdG8KaXRz IHByaXZhdGUgYnJpZGdlIGJlIGxvc3Q/CgpbIC4uLiBdCgo+ICtzdGF0aWMgdm9pZCBkcm1fYXV4 X2hwZF90eXBlY19kcF9icmlkZ2VfbW9kdWxlX2V4aXQodm9pZCkKPiArewo+ICsJYnVzX3VucmVn aXN0ZXJfbm90aWZpZXIoJnR5cGVjX2J1cywgJmRybV90eXBlY19ldmVudF9uYik7Cj4gK30KCltT ZXZlcml0eTogSGlnaF0KRG9lcyB0aGlzIGxlYWsgcmVzb3VyY2VzIGFuZCBjcmVhdGUgZHVwbGlj YXRlIGJyaWRnZXMgaWYgdGhlIG1vZHVsZSBpcyB1bmxvYWRlZAphbmQgcmVsb2FkZWQ/CgpTaW5j ZSBkcm1fZHBfaHBkX2JyaWRnZV9yZWdpc3RlcigpIHVzZXMgZGV2bSBzZW1hbnRpY3MgdGllZCB0 byB0aGUgVVNCLUMKY29udHJvbGxlciBkZXZpY2UgKGFsdC0+ZGV2LnBhcmVudC0+cGFyZW50KSBy YXRoZXIgdGhhbiB0aGlzIG9ic2VydmVyIG1vZHVsZSwKdGhlIGJyaWRnZXMgd2lsbCBvdXRsaXZl IHRoZSBtb2R1bGUuIFdoZW4gdGhlIG1vZHVsZSBpcyByZWxvYWRlZCwgaXQgd2lsbAppdGVyYXRl IHRoZSBidXMgYW5kIHVuY29uZGl0aW9uYWxseSBhbGxvY2F0ZSBhIHNlY29uZCBzZXQgb2YgZHVw bGljYXRlIGJyaWRnZXMuCgo+ICsKPiArc3RhdGljIGludCBfX2luaXQgZHJtX2F1eF9ocGRfdHlw ZWNfZHBfYnJpZGdlX21vZHVsZV9pbml0KHZvaWQpCj4gK3sKPiArCWJ1c19yZWdpc3Rlcl9ub3Rp ZmllcigmdHlwZWNfYnVzLCAmZHJtX3R5cGVjX2V2ZW50X25iKTsKPiArCS8qCj4gKwkgKiBCZWZv cmUgbW9kdWxlIGluaXRpYWxpemF0aW9uLCBzb21lIGRldmljZXMgbWF5IGhhdmUgYWxyZWFkeSBi ZWVuIGFkZGVkLgo+ICsgICAgICAgICAqIFJlZ2lzdGVyIHRoZSBIUEQgYnJpZGdlIGZvciB0aGVz ZSBkZXZpY2VzLgo+ICsJICovCj4gKwlidXNfZm9yX2VhY2hfZGV2KCZ0eXBlY19idXMsIE5VTEws IE5VTEwsIGNoZWNrX2RldmljZV9hbHJlYWR5X2FkZGVkKTsKCltTZXZlcml0eTogTWVkaXVtXQpJ cyB0aGVyZSBhIHJhY2UgY29uZGl0aW9uIGhlcmUgYmV0d2VlbiByZWdpc3RlcmluZyB0aGUgYnVz IG5vdGlmaWVyIGFuZCBpdGVyYXRpbmcKb3ZlciB0aGUgZXhpc3RpbmcgZGV2aWNlcz8KCklmIGEg VHlwZS1DIGFsdG1vZGUgZGV2aWNlIGlzIGFkZGVkIGNvbmN1cnJlbnRseSBkdXJpbmcgbW9kdWxl IGluaXRpYWxpemF0aW9uLApjb3VsZCBpdCB0cmlnZ2VyIHRoZSBub3RpZmllciBjYWxsYmFjayBh bmQgYWxzbyBiZSBwcm9jZXNzZWQgYnkgdGhlIGJ1cyBpdGVyYXRpb24KbG9vcD8gU2luY2UgZHJt X2RwX2hwZF9icmlkZ2VfcmVnaXN0ZXIoKSBsYWNrcyBkZWR1cGxpY2F0aW9uIGxvZ2ljLCB0aGlz IFRPQ1RPVQpyYWNlIG1pZ2h0IHJlc3VsdCBpbiBkdXBsaWNhdGUgYnJpZGdlIHJlZ2lzdHJhdGlv bnMuCgo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK21vZHVsZV9pbml0KGRybV9hdXhfaHBkX3R5 cGVjX2RwX2JyaWRnZV9tb2R1bGVfaW5pdCk7Cj4gK21vZHVsZV9leGl0KGRybV9hdXhfaHBkX3R5 cGVjX2RwX2JyaWRnZV9tb2R1bGVfZXhpdCk7CgotLSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0 cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0LzIwMjYwNzMwMDEzMzQ5LjUxLTEta2VybmVsQGFp cmt5aS5jb20/cGFydD0xCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1waHkK