From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (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 4C353366054; Mon, 9 Feb 2026 09:51:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770630661; cv=none; b=V7kuQsFYLz3TaGl8qlqpPKItfRq4t1RY3US6gBzjNkAyj8bOs6v+dfuHjQ9e+4jny0qAm6AdVhaKqUuiNB5w5BEYSLVlAsz6nTtK9dtx/VVr4Dyngb7E9IO93Cy6fYnoEcuh4yMvrGUHj6/NJPwaYJhNsZX1j1+2pqpNhN+QmRw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770630661; c=relaxed/simple; bh=lg8CE3wdX+dcJL6yDeqGzT+IDyDi7+zFMbcdS7bHqvY=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SL64xOU/lhztYU2quyLTJhPytfmKQEwNM9+v69emsPTFHDrG20e3BNoCx+mfGyNM6hXe9H2Ak/nHec+2gduTJO8xudfR/n7lRXT0Q+rdca42Q1r3GxGjSWKH8IuG/ho0EQWakppUeJg9jFcmoEYrO8VfFqtQUr8WGZ5ArsB1RNk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=GAl5PSI0; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="GAl5PSI0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1770630653; bh=lg8CE3wdX+dcJL6yDeqGzT+IDyDi7+zFMbcdS7bHqvY=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=GAl5PSI0gxZCB4fRfIXmb+OCpJY8qNOwXLz9veN8T1muQZoP1SLZuyEN5jFkvF2vC ipEp3b4sMip86VDrIuyv0saU6cadpiIbCjLXvBVVbeZAQqEsKVjT0taFlrKIdQOG5o OZQLZf2qXFX+xYlx0veU9pFtFvMJZFR5drDK3SDbpdlXo4c3lYspdavKG7jiw9NlZW xa/6D7KeI3iQ35tMqN3uTY1pHR6VVhFsLSaG8GVpX+qBCwtkSmIJAVf9ZN5odCFfCe 6XncsOBtXX+6Ns4d6I4xWWAvxrKDHBZuGV6cEunws0xUFhCtHMLYrEcFSnZW8x55/J GOPQBqzU8Vu7A== Received: from fedora (unknown [IPv6:2a01:e0a:2c:6930:d919:a6e:5ea1:8a9f]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by bali.collaboradmins.com (Postfix) with ESMTPSA id F334C17E12C5; Mon, 9 Feb 2026 10:50:51 +0100 (CET) Date: Mon, 9 Feb 2026 10:50:47 +0100 From: Boris Brezillon To: Maxime Ripard Cc: Daniel Almeida , Danilo Krummrich , Alice Ryhl , "Rafael J. Wysocki" , Viresh Kumar , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Drew Fustini , Guo Ren , Fu Wei , Uwe =?UTF-8?B?S2xlaW5lLUs=?= =?UTF-8?B?w7ZuaWc=?= , Michael Turquette , Stephen Boyd , Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?B?QmrDtnJu?= Roy Baron , Benno Lossin , Andreas Hindborg , Trevor Gross , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org, linux-pwm@vger.kernel.org, linux-clk@vger.kernel.org, rust-for-linux@vger.kernel.org Subject: Re: [PATCH v3 1/3] rust: clk: use the type-state pattern Message-ID: <20260209105047.693f2515@fedora> In-Reply-To: <20260204-angelic-vermilion-beagle-fd1507@houat> References: <20260119-thundering-tested-robin-4be817@houat> <518D8B09-B9A1-4DB4-85CD-37A2DD3D5FB1@collabora.com> <20260119-weightless-pelican-of-anger-190db0@houat> <20260122-majestic-masterful-jaguarundi-d0abde@houat> <2F3D3A40-6EF9-46FC-A769-E5A3AAF67E65@collabora.com> <20260204-nickel-seal-of-poetry-8fdefb@houat> <91A92D84-1F2E-45F3-82EC-6A97D32E2A78@collabora.com> <20260204-angelic-vermilion-beagle-fd1507@houat> Organization: Collabora X-Mailer: Claws Mail 4.3.1 (GTK 3.24.51; x86_64-redhat-linux-gnu) Precedence: bulk X-Mailing-List: linux-clk@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Maxime, On Wed, 4 Feb 2026 15:34:29 +0100 Maxime Ripard wrote: > On Wed, Feb 04, 2026 at 09:43:55AM -0300, Daniel Almeida wrote: > > > I'm probably missing something then, but let's assume you have a driv= er > > > that wants its clock prepared and enabled in an hypothetical enable() > > > callback, and disabled / unprepared in a disable() callback. > > >=20 > > > From a PM management perspective, this usecase makes total sense, is a > > > valid usecase, is widely used in the kernel, and is currently support= ed > > > by both the C and Rust clk APIs. > > >=20 > > > The only solution to this you suggested so far (I think?) to implement > > > this on top of the new clk API you propose is to have a driver specif= ic > > > enum that would store each of the possible state transition. =20 > >=20 > > Yes, you need an enum _if_ you want to model transitions at runtime. II= UC you > > only need two variants to implement the pattern you described. I do not > > consider this =E2=80=9Cboilerplate=E2=80=9D, but rather a small cost t= o pay. =20 >=20 > A maintenance cost to pay by every driver is kind of the textbook > definition of boilerplate to me. >=20 > > I would understand if this was some elaborate pattern that had to be > > implemented by all drivers, but a two-variant enum is as > > straightforward as it gets. =20 >=20 > And yet, that framework has dozens of helpers that do not remove > anything from drivers but a couple of lines. So surely its users must > find value in reducing that boilerplate as much as possible. And you do > implement some of them, so you must find value in that too. >=20 > > > That's the boilerplate I'm talking about. If every driver wanting to > > > implement that pattern has to make such an enum, with all the relevant > > > traits implementation that might come with it, we go from an API where > > > everything works at no-cost from a code-size perspective to a situati= on > > > where every driver has to develop and maintain that enum. =20 > > > > There are no "traits that come with it". It's just an enum, with two > > variants. > > =20 > > > API where everything works at no-cost =20 > >=20 > > The previous API was far from =E2=80=9Ceverything works=E2=80=9D. It wa= s fundamentally > > broken by design in multiple ways, i.e.: =20 >=20 > Out of context and not what I meant, but ok. >=20 > > > a) It only keeps track of a count to clk_get(), which means that user= s have > > > to manually call disable() and unprepare(), or a variation of those, = like > > > disable_unprepare(). > > >=20 > > > b) It allows repeated calls to prepare() or enable(), but it keeps no= track > > > of how often these were called, i.e., it's currently legal to write t= he > > > following: > > >=20 > > > clk.prepare(); > > > clk.prepare(); > > > clk.enable(); > > > clk.enable(); > > >=20 > > > And nothing gets undone on drop(). =20 > >=20 > > IMHO, what we have here is an improvement that has been long overdue. = =20 >=20 > Nothing is absolute. It is indeed an improvement on the refcounting side > of things and general safety of the API for the general case. I don't > think I ever questionned that. >=20 > However, for the use-cases we've been discussing (and dozens of drivers > implementing it), it also comes with a regression in the amount of code > to create and maintain. They used to be able to only deal with the Clk > structure, and now they can't anymore. >=20 > You might find that neglible, you might have a plan to address that in > the future, etc. and that's fine, but if you can't acknowledge that it's > indeed happening, there's no point in me raising the issue and > continuing the discussion. Okay, let's see if I can sum-up the use case you'd like to support. You have some PM hooks, which I'm assuming are (or will be) written in rust. It will probably take the form of some Device{Rpm,Pm} trait to implement for your XxxDeviceData (Xxx being the bus under which is device is) object (since I've only recently joined the R4L effort, I wouldn't be surprised if what I'm describing already exists or is currently being proposed/reviewed somewhere, so please excuse my ignorance if that's the case :-)). The way I see it, rather than having one enum per clk/regulator/xxx where we keep track of each state individually, what we could have is a trait DevicePm { type ResumedState; type SuspendedState; fn resume(&self, state: SuspendedState) -> Result>; fn suspend(&self, state: SuspendedState) -> Result>; }; enum DeviceState { Resumed(T::ResumedState), Suspended(T::SuspendedState), }; and then in your driver: MySuspendedDeviceResources { xxx_clk: Clk, }; MyResumedDeviceResources { xxx_clk: Clk, }; implem DevicePm for MyDevice { type ResumedState =3D MyResumedDeviceResources; type SuspendedState =3D MySuspendedDeviceResources; fn resume(&self, state: SuspendedState) -> Result> { // FIXME: error propagation not handled let enabled_clk =3D state.xxx_clk.clone().prepare()?.enable()?; Ok(ResumedState { xxx_clk: enabled_clk, }); } fn suspend(&self, state: ResumedState) -> Result> { // FIXME: error propagation not handled let unprep_clk =3D state.xxx_clk.clone().disable().unprepare(); Ok(SuspendedState { xxx_clk: unprep_clk, }); } }; With this model, I don't think Daniel's refactor goes in the way of more generalization at the core level, it's just expressed differently than it would be if it was written in C. And I say that as someone who struggles with his C developer bias every time I'm looking at or trying to write rust code. As others have said in this thread (Danilo and Gary), and after having played myself with both approaches in Tyr, I do see this shift from manual prepare/enable to an RAII approach as an improvement, so I hope we can find a middle-ground where every one is happy. Regards, Boris 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 12A40E7E0B7 for ; Mon, 9 Feb 2026 09:51:09 +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:References:In-Reply-To: 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=0fiLaj+9ozGwt41+M/rB7o90Q7L9kVaJjmVVKdRQmOA=; b=ECAvFRKVDA7llS TZ9Brfxtb6V256Jb8Oa/cpwZZIQfEAZeLIKrgSGZ2JV7dT7MKnTnnlldOw9ESnA8V/S9LLgG2oiz4 Tt8lUeTlFnYOXkCEfMSfiaYLzQ+71EiA6ox0ZpvpBZ2po+R/tg6gNCt7uhQZf/JcLmKszz/hpq91y DBrZHwaX6ljDYs84SFU5GwvyMDJH/SwgBdO+7Xs9odOmEqbMKPZR6UqoxSWm8LIwGPMhIWLLW/D29 KEJZCf5UyG6AiOZjScpyL56XMFH+U3BinBWdq+dlz/k/a+SOLpYAc8UGPfdf93XbHyTphOvi8IP4z mvGbvxnaWS9CssHX+vuQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vpNv1-0000000FBQ6-16a1; Mon, 09 Feb 2026 09:50:59 +0000 Received: from bali.collaboradmins.com ([2a01:4f8:201:9162::2]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vpNuy-0000000FBPD-2aVh for linux-riscv@lists.infradead.org; Mon, 09 Feb 2026 09:50:57 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1770630653; bh=lg8CE3wdX+dcJL6yDeqGzT+IDyDi7+zFMbcdS7bHqvY=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=GAl5PSI0gxZCB4fRfIXmb+OCpJY8qNOwXLz9veN8T1muQZoP1SLZuyEN5jFkvF2vC ipEp3b4sMip86VDrIuyv0saU6cadpiIbCjLXvBVVbeZAQqEsKVjT0taFlrKIdQOG5o OZQLZf2qXFX+xYlx0veU9pFtFvMJZFR5drDK3SDbpdlXo4c3lYspdavKG7jiw9NlZW xa/6D7KeI3iQ35tMqN3uTY1pHR6VVhFsLSaG8GVpX+qBCwtkSmIJAVf9ZN5odCFfCe 6XncsOBtXX+6Ns4d6I4xWWAvxrKDHBZuGV6cEunws0xUFhCtHMLYrEcFSnZW8x55/J GOPQBqzU8Vu7A== Received: from fedora (unknown [IPv6:2a01:e0a:2c:6930:d919:a6e:5ea1:8a9f]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by bali.collaboradmins.com (Postfix) with ESMTPSA id F334C17E12C5; Mon, 9 Feb 2026 10:50:51 +0100 (CET) Date: Mon, 9 Feb 2026 10:50:47 +0100 From: Boris Brezillon To: Maxime Ripard Cc: Daniel Almeida , Danilo Krummrich , Alice Ryhl , "Rafael J. Wysocki" , Viresh Kumar , Maarten Lankhorst , Thomas Zimmermann , David Airlie , Simona Vetter , Drew Fustini , Guo Ren , Fu Wei , Uwe =?UTF-8?B?S2xlaW5lLUs=?= =?UTF-8?B?w7ZuaWc=?= , Michael Turquette , Stephen Boyd , Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?B?QmrDtnJu?= Roy Baron , Benno Lossin , Andreas Hindborg , Trevor Gross , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org, linux-pwm@vger.kernel.org, linux-clk@vger.kernel.org, rust-for-linux@vger.kernel.org Subject: Re: [PATCH v3 1/3] rust: clk: use the type-state pattern Message-ID: <20260209105047.693f2515@fedora> In-Reply-To: <20260204-angelic-vermilion-beagle-fd1507@houat> References: <20260119-thundering-tested-robin-4be817@houat> <518D8B09-B9A1-4DB4-85CD-37A2DD3D5FB1@collabora.com> <20260119-weightless-pelican-of-anger-190db0@houat> <20260122-majestic-masterful-jaguarundi-d0abde@houat> <2F3D3A40-6EF9-46FC-A769-E5A3AAF67E65@collabora.com> <20260204-nickel-seal-of-poetry-8fdefb@houat> <91A92D84-1F2E-45F3-82EC-6A97D32E2A78@collabora.com> <20260204-angelic-vermilion-beagle-fd1507@houat> Organization: Collabora X-Mailer: Claws Mail 4.3.1 (GTK 3.24.51; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260209_015056_849889_61337E32 X-CRM114-Status: GOOD ( 43.32 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org SGkgTWF4aW1lLAoKT24gV2VkLCA0IEZlYiAyMDI2IDE1OjM0OjI5ICswMTAwCk1heGltZSBSaXBh cmQgPG1yaXBhcmRAa2VybmVsLm9yZz4gd3JvdGU6Cgo+IE9uIFdlZCwgRmViIDA0LCAyMDI2IGF0 IDA5OjQzOjU1QU0gLTAzMDAsIERhbmllbCBBbG1laWRhIHdyb3RlOgo+ID4gPiBJJ20gcHJvYmFi bHkgbWlzc2luZyBzb21ldGhpbmcgdGhlbiwgYnV0IGxldCdzIGFzc3VtZSB5b3UgaGF2ZSBhIGRy aXZlcgo+ID4gPiB0aGF0IHdhbnRzIGl0cyBjbG9jayBwcmVwYXJlZCBhbmQgZW5hYmxlZCBpbiBh biBoeXBvdGhldGljYWwgZW5hYmxlKCkKPiA+ID4gY2FsbGJhY2ssIGFuZCBkaXNhYmxlZCAvIHVu cHJlcGFyZWQgaW4gYSBkaXNhYmxlKCkgY2FsbGJhY2suCj4gPiA+IAo+ID4gPiBGcm9tIGEgUE0g bWFuYWdlbWVudCBwZXJzcGVjdGl2ZSwgdGhpcyB1c2VjYXNlIG1ha2VzIHRvdGFsIHNlbnNlLCBp cyBhCj4gPiA+IHZhbGlkIHVzZWNhc2UsIGlzIHdpZGVseSB1c2VkIGluIHRoZSBrZXJuZWwsIGFu ZCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkCj4gPiA+IGJ5IGJvdGggdGhlIEMgYW5kIFJ1c3QgY2xr IEFQSXMuCj4gPiA+IAo+ID4gPiBUaGUgb25seSBzb2x1dGlvbiB0byB0aGlzIHlvdSBzdWdnZXN0 ZWQgc28gZmFyIChJIHRoaW5rPykgdG8gaW1wbGVtZW50Cj4gPiA+IHRoaXMgb24gdG9wIG9mIHRo ZSBuZXcgY2xrIEFQSSB5b3UgcHJvcG9zZSBpcyB0byBoYXZlIGEgZHJpdmVyIHNwZWNpZmljCj4g PiA+IGVudW0gdGhhdCB3b3VsZCBzdG9yZSBlYWNoIG9mIHRoZSBwb3NzaWJsZSBzdGF0ZSB0cmFu c2l0aW9uLiAgCj4gPiAKPiA+IFllcywgeW91IG5lZWQgYW4gZW51bSBfaWZfIHlvdSB3YW50IHRv IG1vZGVsIHRyYW5zaXRpb25zIGF0IHJ1bnRpbWUuIElJVUMgeW91Cj4gPiBvbmx5IG5lZWQgdHdv IHZhcmlhbnRzIHRvIGltcGxlbWVudCB0aGUgcGF0dGVybiB5b3UgZGVzY3JpYmVkLiBJIGRvIG5v dAo+ID4gY29uc2lkZXIgdGhpcyAg4oCcYm9pbGVycGxhdGXigJ0sIGJ1dCByYXRoZXIgYSBzbWFs bCBjb3N0IHRvIHBheS4gIAo+IAo+IEEgbWFpbnRlbmFuY2UgY29zdCB0byBwYXkgYnkgZXZlcnkg ZHJpdmVyIGlzIGtpbmQgb2YgdGhlIHRleHRib29rCj4gZGVmaW5pdGlvbiBvZiBib2lsZXJwbGF0 ZSB0byBtZS4KPiAKPiA+IEkgd291bGQgdW5kZXJzdGFuZCBpZiB0aGlzIHdhcyBzb21lIGVsYWJv cmF0ZSBwYXR0ZXJuIHRoYXQgaGFkIHRvIGJlCj4gPiBpbXBsZW1lbnRlZCBieSBhbGwgZHJpdmVy cywgYnV0IGEgdHdvLXZhcmlhbnQgZW51bSBpcyBhcwo+ID4gc3RyYWlnaHRmb3J3YXJkIGFzIGl0 IGdldHMuICAKPiAKPiBBbmQgeWV0LCB0aGF0IGZyYW1ld29yayBoYXMgZG96ZW5zIG9mIGhlbHBl cnMgdGhhdCBkbyBub3QgcmVtb3ZlCj4gYW55dGhpbmcgZnJvbSBkcml2ZXJzIGJ1dCBhIGNvdXBs ZSBvZiBsaW5lcy4gU28gc3VyZWx5IGl0cyB1c2VycyBtdXN0Cj4gZmluZCB2YWx1ZSBpbiByZWR1 Y2luZyB0aGF0IGJvaWxlcnBsYXRlIGFzIG11Y2ggYXMgcG9zc2libGUuIEFuZCB5b3UgZG8KPiBp bXBsZW1lbnQgc29tZSBvZiB0aGVtLCBzbyB5b3UgbXVzdCBmaW5kIHZhbHVlIGluIHRoYXQgdG9v Lgo+IAo+ID4gPiBUaGF0J3MgdGhlIGJvaWxlcnBsYXRlIEknbSB0YWxraW5nIGFib3V0LiBJZiBl dmVyeSBkcml2ZXIgd2FudGluZyB0bwo+ID4gPiBpbXBsZW1lbnQgdGhhdCBwYXR0ZXJuIGhhcyB0 byBtYWtlIHN1Y2ggYW4gZW51bSwgd2l0aCBhbGwgdGhlIHJlbGV2YW50Cj4gPiA+IHRyYWl0cyBp bXBsZW1lbnRhdGlvbiB0aGF0IG1pZ2h0IGNvbWUgd2l0aCBpdCwgd2UgZ28gZnJvbSBhbiBBUEkg d2hlcmUKPiA+ID4gZXZlcnl0aGluZyB3b3JrcyBhdCBuby1jb3N0IGZyb20gYSBjb2RlLXNpemUg cGVyc3BlY3RpdmUgdG8gYSBzaXR1YXRpb24KPiA+ID4gd2hlcmUgZXZlcnkgZHJpdmVyIGhhcyB0 byBkZXZlbG9wIGFuZCBtYWludGFpbiB0aGF0IGVudW0uICAKPiA+Cj4gPiBUaGVyZSBhcmUgbm8g InRyYWl0cyB0aGF0IGNvbWUgd2l0aCBpdCIuIEl0J3MganVzdCBhbiBlbnVtLCB3aXRoIHR3bwo+ ID4gdmFyaWFudHMuCj4gPiAgIAo+ID4gPiBBUEkgd2hlcmUgZXZlcnl0aGluZyB3b3JrcyBhdCBu by1jb3N0ICAKPiA+IAo+ID4gVGhlIHByZXZpb3VzIEFQSSB3YXMgZmFyIGZyb20g4oCcZXZlcnl0 aGluZyB3b3Jrc+KAnS4gSXQgd2FzIGZ1bmRhbWVudGFsbHkKPiA+IGJyb2tlbiBieSBkZXNpZ24g aW4gbXVsdGlwbGUgd2F5cywgaS5lLjogIAo+IAo+IE91dCBvZiBjb250ZXh0IGFuZCBub3Qgd2hh dCBJIG1lYW50LCBidXQgb2suCj4gCj4gPiA+IGEpIEl0IG9ubHkga2VlcHMgdHJhY2sgb2YgYSBj b3VudCB0byBjbGtfZ2V0KCksIHdoaWNoIG1lYW5zIHRoYXQgdXNlcnMgaGF2ZQo+ID4gPiB0byBt YW51YWxseSBjYWxsIGRpc2FibGUoKSBhbmQgdW5wcmVwYXJlKCksIG9yIGEgdmFyaWF0aW9uIG9m IHRob3NlLCBsaWtlCj4gPiA+IGRpc2FibGVfdW5wcmVwYXJlKCkuCj4gPiA+IAo+ID4gPiBiKSBJ dCBhbGxvd3MgcmVwZWF0ZWQgY2FsbHMgdG8gcHJlcGFyZSgpIG9yIGVuYWJsZSgpLCBidXQgaXQg a2VlcHMgbm8gdHJhY2sKPiA+ID4gb2YgaG93IG9mdGVuIHRoZXNlIHdlcmUgY2FsbGVkLCBpLmUu LCBpdCdzIGN1cnJlbnRseSBsZWdhbCB0byB3cml0ZSB0aGUKPiA+ID4gZm9sbG93aW5nOgo+ID4g PiAKPiA+ID4gY2xrLnByZXBhcmUoKTsKPiA+ID4gY2xrLnByZXBhcmUoKTsKPiA+ID4gY2xrLmVu YWJsZSgpOwo+ID4gPiBjbGsuZW5hYmxlKCk7Cj4gPiA+IAo+ID4gPiBBbmQgbm90aGluZyBnZXRz IHVuZG9uZSBvbiBkcm9wKCkuICAKPiA+IAo+ID4gSU1ITywgd2hhdCB3ZSBoYXZlIGhlcmUgaXMg YW4gaW1wcm92ZW1lbnQgdGhhdCBoYXMgYmVlbiBsb25nIG92ZXJkdWUuICAKPiAKPiBOb3RoaW5n IGlzIGFic29sdXRlLiBJdCBpcyBpbmRlZWQgYW4gaW1wcm92ZW1lbnQgb24gdGhlIHJlZmNvdW50 aW5nIHNpZGUKPiBvZiB0aGluZ3MgYW5kIGdlbmVyYWwgc2FmZXR5IG9mIHRoZSBBUEkgZm9yIHRo ZSBnZW5lcmFsIGNhc2UuIEkgZG9uJ3QKPiB0aGluayBJIGV2ZXIgcXVlc3Rpb25uZWQgdGhhdC4K PiAKPiBIb3dldmVyLCBmb3IgdGhlIHVzZS1jYXNlcyB3ZSd2ZSBiZWVuIGRpc2N1c3NpbmcgKGFu ZCBkb3plbnMgb2YgZHJpdmVycwo+IGltcGxlbWVudGluZyBpdCksIGl0IGFsc28gY29tZXMgd2l0 aCBhIHJlZ3Jlc3Npb24gaW4gdGhlIGFtb3VudCBvZiBjb2RlCj4gdG8gY3JlYXRlIGFuZCBtYWlu dGFpbi4gVGhleSB1c2VkIHRvIGJlIGFibGUgdG8gb25seSBkZWFsIHdpdGggdGhlIENsawo+IHN0 cnVjdHVyZSwgYW5kIG5vdyB0aGV5IGNhbid0IGFueW1vcmUuCj4gCj4gWW91IG1pZ2h0IGZpbmQg dGhhdCBuZWdsaWJsZSwgeW91IG1pZ2h0IGhhdmUgYSBwbGFuIHRvIGFkZHJlc3MgdGhhdCBpbgo+ IHRoZSBmdXR1cmUsIGV0Yy4gYW5kIHRoYXQncyBmaW5lLCBidXQgaWYgeW91IGNhbid0IGFja25v d2xlZGdlIHRoYXQgaXQncwo+IGluZGVlZCBoYXBwZW5pbmcsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4g bWUgcmFpc2luZyB0aGUgaXNzdWUgYW5kCj4gY29udGludWluZyB0aGUgZGlzY3Vzc2lvbi4KCgpP a2F5LCBsZXQncyBzZWUgaWYgSSBjYW4gc3VtLXVwIHRoZSB1c2UgY2FzZSB5b3UnZCBsaWtlIHRv IHN1cHBvcnQuIFlvdQpoYXZlIHNvbWUgUE0gaG9va3MsIHdoaWNoIEknbSBhc3N1bWluZyBhcmUg KG9yIHdpbGwgYmUpIHdyaXR0ZW4gaW4KcnVzdC4gSXQgd2lsbCBwcm9iYWJseSB0YWtlIHRoZSBm b3JtIG9mIHNvbWUgRGV2aWNle1JwbSxQbX0gdHJhaXQgdG8KaW1wbGVtZW50IGZvciB5b3VyIFh4 eERldmljZURhdGEgKFh4eCBiZWluZyB0aGUgYnVzIHVuZGVyIHdoaWNoIGlzCmRldmljZSBpcykg b2JqZWN0IChzaW5jZSBJJ3ZlIG9ubHkgcmVjZW50bHkgam9pbmVkIHRoZSBSNEwgZWZmb3J0LCBJ CndvdWxkbid0IGJlIHN1cnByaXNlZCBpZiB3aGF0IEknbSBkZXNjcmliaW5nIGFscmVhZHkgZXhp c3RzIG9yIGlzCmN1cnJlbnRseSBiZWluZyBwcm9wb3NlZC9yZXZpZXdlZCBzb21ld2hlcmUsIHNv IHBsZWFzZSBleGN1c2UgbXkKaWdub3JhbmNlIGlmIHRoYXQncyB0aGUgY2FzZSA6LSkpLgoKVGhl IHdheSBJIHNlZSBpdCwgcmF0aGVyIHRoYW4gaGF2aW5nIG9uZSBlbnVtIHBlciBjbGsvcmVndWxh dG9yL3h4eAp3aGVyZSB3ZSBrZWVwIHRyYWNrIG9mIGVhY2ggc3RhdGUgaW5kaXZpZHVhbGx5LCB3 aGF0IHdlIGNvdWxkIGhhdmUgaXMgYQoKdHJhaXQgRGV2aWNlUG0gewoJdHlwZSBSZXN1bWVkU3Rh dGU7Cgl0eXBlIFN1c3BlbmRlZFN0YXRlOwoKCWZuIHJlc3VtZSgmc2VsZiwgc3RhdGU6IFN1c3Bl bmRlZFN0YXRlKSAtPiBSZXN1bHQ8UmVzdW1lZFN0YXRlLCBFcnJvcjxTdXNwZW5kZWRTdGF0ZT4+ OwoJZm4gc3VzcGVuZCgmc2VsZiwgc3RhdGU6IFN1c3BlbmRlZFN0YXRlKSAtPiBSZXN1bHQ8U3Vz cGVuZGVkU3RhdGUsIEVycm9yPFJlc3VtZWRTdGF0ZT4+Owp9OwoKZW51bSBEZXZpY2VTdGF0ZTxU OiBEZXZpY2VQbT4gewoJUmVzdW1lZChUOjpSZXN1bWVkU3RhdGUpLAoJU3VzcGVuZGVkKFQ6OlN1 c3BlbmRlZFN0YXRlKSwKfTsKCmFuZCB0aGVuIGluIHlvdXIgZHJpdmVyOgoKTXlTdXNwZW5kZWRE ZXZpY2VSZXNvdXJjZXMgewoJeHh4X2NsazogQ2xrPFVucHJlcGFyZWQ+LAp9OwoKTXlSZXN1bWVk RGV2aWNlUmVzb3VyY2VzIHsKCXh4eF9jbGs6IENsazxFbmFibGVkPiwKfTsKCmltcGxlbSBEZXZp Y2VQbSBmb3IgTXlEZXZpY2UgewoJdHlwZSBSZXN1bWVkU3RhdGUgPSBNeVJlc3VtZWREZXZpY2VS ZXNvdXJjZXM7Cgl0eXBlIFN1c3BlbmRlZFN0YXRlID0gTXlTdXNwZW5kZWREZXZpY2VSZXNvdXJj ZXM7CgoJZm4gcmVzdW1lKCZzZWxmLCBzdGF0ZTogU3VzcGVuZGVkU3RhdGUpIC0+IFJlc3VsdDxS ZXN1bWVkU3RhdGUsIEVycm9yPFN1c3BlbmRlZFN0YXRlPj4gewoJCS8vIEZJWE1FOiBlcnJvciBw cm9wYWdhdGlvbiBub3QgaGFuZGxlZAoJCWxldCBlbmFibGVkX2NsayA9IHN0YXRlLnh4eF9jbGsu Y2xvbmUoKS5wcmVwYXJlKCk/LmVuYWJsZSgpPzsKCgkJT2soUmVzdW1lZFN0YXRlIHsKCQkJeHh4 X2NsazogZW5hYmxlZF9jbGssCgkJfSk7Cgl9CgoJZm4gc3VzcGVuZCgmc2VsZiwgc3RhdGU6IFJl c3VtZWRTdGF0ZSkgLT4gUmVzdWx0PFN1c3BlbmRlZFN0YXRlLCBFcnJvcjxSZXN1bWVkU3RhdGU+ PiB7CgkJLy8gRklYTUU6IGVycm9yIHByb3BhZ2F0aW9uIG5vdCBoYW5kbGVkCgkJbGV0IHVucHJl cF9jbGsgPSBzdGF0ZS54eHhfY2xrLmNsb25lKCkuZGlzYWJsZSgpLnVucHJlcGFyZSgpOwoKCQlP ayhTdXNwZW5kZWRTdGF0ZSB7CgkJCXh4eF9jbGs6IHVucHJlcF9jbGssCgkJfSk7Cgl9Cn07CgpX aXRoIHRoaXMgbW9kZWwsIEkgZG9uJ3QgdGhpbmsgRGFuaWVsJ3MgcmVmYWN0b3IgZ29lcyBpbiB0 aGUgd2F5IG9mIG1vcmUKZ2VuZXJhbGl6YXRpb24gYXQgdGhlIGNvcmUgbGV2ZWwsIGl0J3MganVz dCBleHByZXNzZWQgZGlmZmVyZW50bHkgdGhhbgppdCB3b3VsZCBiZSBpZiBpdCB3YXMgd3JpdHRl biBpbiBDLiBBbmQgSSBzYXkgdGhhdCBhcyBzb21lb25lIHdobyBzdHJ1Z2dsZXMKd2l0aCBoaXMg QyBkZXZlbG9wZXIgYmlhcyBldmVyeSB0aW1lIEknbSBsb29raW5nIGF0IG9yIHRyeWluZyB0byB3 cml0ZQpydXN0IGNvZGUuCgpBcyBvdGhlcnMgaGF2ZSBzYWlkIGluIHRoaXMgdGhyZWFkIChEYW5p bG8gYW5kIEdhcnkpLCBhbmQgYWZ0ZXIgaGF2aW5nCnBsYXllZCBteXNlbGYgd2l0aCBib3RoIGFw cHJvYWNoZXMgaW4gVHlyLCBJIGRvIHNlZSB0aGlzIHNoaWZ0IGZyb20gbWFudWFsCnByZXBhcmUv ZW5hYmxlIHRvIGFuIFJBSUkgYXBwcm9hY2ggYXMgYW4gaW1wcm92ZW1lbnQsIHNvIEkgaG9wZSB3 ZSBjYW4KZmluZCBhIG1pZGRsZS1ncm91bmQgd2hlcmUgZXZlcnkgb25lIGlzIGhhcHB5LgoKUmVn YXJkcywKCkJvcmlzCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJp c2N2Cg==