From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D1086608ED; Wed, 3 Apr 2024 08:06:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712131593; cv=none; b=tY5128GtP0ieKlJp37liFR1AS5wHlng9Dso4Xt8FmPT2bWtqT9oSGwLfUy28fHD6ZSDuRmybA/p7785sAVQtUNVGvjOIEQq+u0snkfe/oTBkpjyGTTVg4y54WDkgnKVrVO3zHZtoMUnFvUdRK6GFPfp6W+c7t8CrGmwCFnfYIRc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712131593; c=relaxed/simple; bh=W0e7wyqop8fzI3z7HiFx+xaKAWPfpCQnW4nvx6iiaXE=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=dD07EYYPyj7+QauvMmJpF3m+wgpsx6+EkKCEizOpW18mbpzQaisB6+snPaFq2yLs/NhDHDUF596fkqUqJVANFh957qJc1XN9Cyc46gm+7zntDEgKli73gC130OuYbZjsgYrI69sR1AznyvS2rr1lS/xnCsDvQJdBowKeHa6G05Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6AECC1007; Wed, 3 Apr 2024 01:07:02 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5A9B03F7B4; Wed, 3 Apr 2024 01:06:29 -0700 (PDT) Date: Wed, 3 Apr 2024 09:06:26 +0100 From: Cristian Marussi To: Andy Shevchenko Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support Message-ID: References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> Precedence: bulk X-Mailing-List: linux-gpio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Tue, Apr 02, 2024 at 07:39:44PM +0300, Andy Shevchenko wrote: > On Tue, Apr 2, 2024 at 6:58 PM Cristian Marussi > wrote: > > On Tue, Apr 02, 2024 at 04:06:06PM +0300, Andy Shevchenko wrote: > > > On Tue, Apr 2, 2024 at 10:48 AM Cristian Marussi > > > wrote: > > > > On Sun, Mar 31, 2024 at 01:44:28PM +0000, Peng Fan wrote: > > > > > > Sat, Mar 23, 2024 at 08:15:16PM +0800, Peng Fan (OSS) kirjoitti: > > ... > > > > > > > > +#include > > > > > > > +#include > > > > > > > +#include > > > > > > > > > > > > This is semi-random list of headers. Please, follow IWYU principle (include > > > > > > what you use). There are a lot of inclusions I see missing (just in the context of > > > > > > this page I see bits.h, types.h, and asm/byteorder.h). > > > > > > > > > > Is there any documentation about this requirement? > > > > > Some headers are already included by others. > > > > > > The documentation here is called "a common sense". > > > The C language is built like this and we expect that nobody will > > > invest into the dependency hell that we have already, that's why IWYU > > > principle, please follow it. > > > > Yes, but given that we have a growing number of SCMI protocols there is a > > common local protocols.h header to group all includes needed by any > > protocols: the idea behind this (and the devm_ saga down below) was to ease > > development of protocols, since there are lots of them and growing, given > > the SCMI spec is extensible. > > Yes, and what you are effectively suggesting is: "Technical debt? Oh, > fine, we do not care!" This is not good. I'm in a long term of > cleaning up the dependency hell in the kernel (my main focus is > kernel.h for now) and I am talking from my experience. I do not like > what people are doing in 95% of the code, that's why I really want to > stop the bad practices as soon as possible. > Not at all, the aim was exactly the opposite, avoiding that some protocol could have been written without all the needed includes: since a basic set of headers is definitely common to any protocol you may think to write, grouping all there was meant to avoid this...I thought that by moving the problem away in one single internal common header was easier to monitor. I certainly maybe wrong, but I dont see how you can deduce I dont care... ...and maybe, only maybe, what that 95% of people is trying to do in their horrible code is to deliver the best reasonably possible thing within their timeline while you are barking at them in chase of never to be released utter perfection. > Last to add, but not least is that your code may be used as an example > for others, hence we really have to do our best in order to avoid bad > design, practices, and cargo cults. If this requires more refactoring > of the existing code, then do it sooner than later. > > ... > > > > > Andy made (mostly) the same remarks on this same patch ~1-year ago on > > > > this same patch while it was posted by Oleksii. > > > > > > > > And I told that time that most of the remarks around devm_ usage were > > > > wrong due to how the SCMI core handles protocol initialization (using a > > > > devres group transparently). > > > > > > > > This is what I answered that time. > > > > > > > > https://lore.kernel.org/linux-arm-kernel/ZJ78hBcjAhiU+ZBO@e120937-lin/#t > > > > > > > > I wont repeat myself, but, in a nutshell the memory allocation like it > > > > is now is fine: a bit happens via devm_ at protocol initialization, the > > > > other is doe via explicit kmalloc at runtime and freed via kfree at > > > > remove time (if needed...i.e. checking the present flag of some structs) > > > > > > This sounds like a mess. devm_ is expected to be used only for the > > > ->probe() stage, otherwise you may consider cleanup.h (__free() macro) > > > to have automatic free at the paths where memory is not needed. > > > > Indeed, this protocol_init code is called by the SCMI core once for all when > > an SCMI driver tries at first to use this specific protocol by 'getting' its > > protocol_ops, so it is indeed called inside the probe chain of the driver: > > at this point you *can* decide to use devres to allocate memory and be assured > > that if the init fails, or when the driver cease to use this protocol (calling > > its remove()) and no other driver is using it, all the stuff that have been > > allocated related to this protocol will be released by the core for you. > > (using an internal devres group) > > > > Without this you should handle manually all the deallocation manually on > > the init error-paths AND also provide all the cleanup explicitly when > > the protocol is no more used by any driver (multiple users of the same > > protocol instance are possible)...for all protocols. > > Yes. Is it a problem? > Well, no, but is it not a repetitive and error-prone process ? Is it not the exact reason why devres management exist in first place, to avoid repetitive manual alloc/free of resources and related pitfalls ? (even though certainly it is normally used in a more conventional and straightforward way) The idea was to give some sort of aid in the SCMI stack for writing protocols, so regarding mem_mgmt, I just built on top of devres facilities, not invented anything, to try to avoid repetitions and let the core handle mem allocs/free during the probe phases as much as possible: in pinctrl case would be particularly trivial to instead manually allocate stuff at init (due to many lazy delayed allocations) but other protocols need a lot more to be done at init, frequently in a loop to allocate multiple resources descriptors, and manually undoing all of that on each error-path and on cleanup is definitely error-prone and a pain. Last but not least, this whole thing was designed to address the needs of the protocols that existed at that time....it is only now with pinctrl lazy-allocations at runtime that the ugly cohexistence of devm_ and non-devm allocations became a thing....so clearly the thing needs to be improved/rethinked...even dropped if no more fitting... ... or alternatively since devres allocations are anyway optional, you could just use regular kmalloc/kfree for this protocol and avoid this dual handling... ...this was just to put things in context...and I'll happily let Sudeep decide what he prefers in the immediate for pinctrl or more in general about all the scmi devres, that I've got enough of these pleasant interactions for now... Thanks, Cristian 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 CB40FCD1288 for ; Wed, 3 Apr 2024 08:07:13 +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=Svz5EYn2usEjaUTyme9dTqYLqWRH8vX8xJyz4LPF4d8=; b=odpTcH2KdUuNXb 9O3bhp/GnBuYK6eTdN5VHjRntGviNmuzxEsoP5JmUODBockWye58Nu1y5LfgTHmpUl7TeMt/Soe6t w+2X8ajTl3tFN2dB5hWOr0FBsUatQP8AlkTxVwpWqEM4gRCunv4vz0UNlk+V9NqDoHsEJ1fDuugZ+ Ui6yUFmvh2pFaZT4rSaPZoT768g7H5tPBanYgpLKf8jcvEwVudbLQNZOJnFxuADG4w/BhCEgbDu2R Eu7yU5q6ATFGNTnWvowoOjacCsOoTMy+1Cy00/NwXr4tsXXSDvJf5XAbHtlLdkCCw9m2Z0WdSGMdg 4UgksUAzfRMsnftUplwA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrve5-0000000Ejum-02Hx; Wed, 03 Apr 2024 08:06:57 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrvdi-0000000EjZk-210p for linux-arm-kernel@lists.infradead.org; Wed, 03 Apr 2024 08:06:51 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6AECC1007; Wed, 3 Apr 2024 01:07:02 -0700 (PDT) Received: from pluto (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5A9B03F7B4; Wed, 3 Apr 2024 01:06:29 -0700 (PDT) Date: Wed, 3 Apr 2024 09:06:26 +0100 From: Cristian Marussi To: Andy Shevchenko Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support Message-ID: References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240403_010635_656184_74072A6E X-CRM114-Status: GOOD ( 50.33 ) 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 T24gVHVlLCBBcHIgMDIsIDIwMjQgYXQgMDc6Mzk6NDRQTSArMDMwMCwgQW5keSBTaGV2Y2hlbmtv IHdyb3RlOgo+IE9uIFR1ZSwgQXByIDIsIDIwMjQgYXQgNjo1OOKAr1BNIENyaXN0aWFuIE1hcnVz c2kKPiA8Y3Jpc3RpYW4ubWFydXNzaUBhcm0uY29tPiB3cm90ZToKPiA+IE9uIFR1ZSwgQXByIDAy LCAyMDI0IGF0IDA0OjA2OjA2UE0gKzAzMDAsIEFuZHkgU2hldmNoZW5rbyB3cm90ZToKPiA+ID4g T24gVHVlLCBBcHIgMiwgMjAyNCBhdCAxMDo0OOKAr0FNIENyaXN0aWFuIE1hcnVzc2kKPiA+ID4g PGNyaXN0aWFuLm1hcnVzc2lAYXJtLmNvbT4gd3JvdGU6Cj4gPiA+ID4gT24gU3VuLCBNYXIgMzEs IDIwMjQgYXQgMDE6NDQ6MjhQTSArMDAwMCwgUGVuZyBGYW4gd3JvdGU6Cj4gPiA+ID4gPiA+IFNh dCwgTWFyIDIzLCAyMDI0IGF0IDA4OjE1OjE2UE0gKzA4MDAsIFBlbmcgRmFuIChPU1MpIGtpcmpv aXR0aToKPiAKPiAuLi4KPiAKPiA+ID4gPiA+ID4gPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o Pgo+ID4gPiA+ID4gPiA+ICsjaW5jbHVkZSA8bGludXgvc2NtaV9wcm90b2NvbC5oPgo+ID4gPiA+ ID4gPiA+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBU aGlzIGlzIHNlbWktcmFuZG9tIGxpc3Qgb2YgaGVhZGVycy4gUGxlYXNlLCBmb2xsb3cgSVdZVSBw cmluY2lwbGUgKGluY2x1ZGUKPiA+ID4gPiA+ID4gd2hhdCB5b3UgdXNlKS4gVGhlcmUgYXJlIGEg bG90IG9mIGluY2x1c2lvbnMgSSBzZWUgbWlzc2luZyAoanVzdCBpbiB0aGUgY29udGV4dCBvZgo+ ID4gPiA+ID4gPiB0aGlzIHBhZ2UgSSBzZWUgYml0cy5oLCB0eXBlcy5oLCBhbmQgIGFzbS9ieXRl b3JkZXIuaCkuCj4gPiA+ID4gPgo+ID4gPiA+ID4gSXMgdGhlcmUgYW55IGRvY3VtZW50YXRpb24g YWJvdXQgdGhpcyByZXF1aXJlbWVudD8KPiA+ID4gPiA+IFNvbWUgaGVhZGVycyBhcmUgYWxyZWFk eSBpbmNsdWRlZCBieSBvdGhlcnMuCj4gPiA+Cj4gPiA+IFRoZSBkb2N1bWVudGF0aW9uIGhlcmUg aXMgY2FsbGVkICJhIGNvbW1vbiBzZW5zZSIuCj4gPiA+IFRoZSBDIGxhbmd1YWdlIGlzIGJ1aWx0 IGxpa2UgdGhpcyBhbmQgd2UgZXhwZWN0IHRoYXQgbm9ib2R5IHdpbGwKPiA+ID4gaW52ZXN0IGlu dG8gdGhlIGRlcGVuZGVuY3kgaGVsbCB0aGF0IHdlIGhhdmUgYWxyZWFkeSwgdGhhdCdzIHdoeSBJ V1lVCj4gPiA+IHByaW5jaXBsZSwgcGxlYXNlIGZvbGxvdyBpdC4KPiA+Cj4gPiBZZXMsIGJ1dCBn aXZlbiB0aGF0IHdlIGhhdmUgYSBncm93aW5nIG51bWJlciBvZiBTQ01JIHByb3RvY29scyB0aGVy ZSBpcyBhCj4gPiBjb21tb24gbG9jYWwgcHJvdG9jb2xzLmggaGVhZGVyIHRvIGdyb3VwIGFsbCBp bmNsdWRlcyBuZWVkZWQgYnkgYW55Cj4gPiBwcm90b2NvbHM6IHRoZSBpZGVhIGJlaGluZCB0aGlz IChhbmQgdGhlIGRldm1fIHNhZ2EgZG93biBiZWxvdykgd2FzIHRvIGVhc2UKPiA+IGRldmVsb3Bt ZW50IG9mIHByb3RvY29scywgc2luY2UgdGhlcmUgYXJlIGxvdHMgb2YgdGhlbSBhbmQgZ3Jvd2lu ZywgZ2l2ZW4KPiA+IHRoZSBTQ01JIHNwZWMgaXMgZXh0ZW5zaWJsZS4KPiAKPiBZZXMsIGFuZCB3 aGF0IHlvdSBhcmUgZWZmZWN0aXZlbHkgc3VnZ2VzdGluZyBpczogIlRlY2huaWNhbCBkZWJ0PyBP aCwKPiBmaW5lLCB3ZSBkbyBub3QgY2FyZSEiIFRoaXMgaXMgbm90IGdvb2QuIEknbSBpbiBhIGxv bmcgdGVybSBvZgo+IGNsZWFuaW5nIHVwIHRoZSBkZXBlbmRlbmN5IGhlbGwgaW4gdGhlIGtlcm5l bCAobXkgbWFpbiBmb2N1cyBpcwo+IGtlcm5lbC5oIGZvciBub3cpIGFuZCBJIGFtIHRhbGtpbmcg ZnJvbSBteSBleHBlcmllbmNlLiBJIGRvIG5vdCBsaWtlCj4gd2hhdCBwZW9wbGUgYXJlIGRvaW5n IGluIDk1JSBvZiB0aGUgY29kZSwgdGhhdCdzIHdoeSBJIHJlYWxseSB3YW50IHRvCj4gc3RvcCB0 aGUgYmFkIHByYWN0aWNlcyBhcyBzb29uIGFzIHBvc3NpYmxlLgo+IAoKTm90IGF0IGFsbCwgdGhl IGFpbSB3YXMgZXhhY3RseSB0aGUgb3Bwb3NpdGUsIGF2b2lkaW5nIHRoYXQgc29tZSBwcm90b2Nv bApjb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiB3aXRob3V0IGFsbCB0aGUgbmVlZGVkIGluY2x1ZGVz OiBzaW5jZSBhIGJhc2ljIHNldApvZiBoZWFkZXJzIGlzIGRlZmluaXRlbHkgY29tbW9uIHRvIGFu eSBwcm90b2NvbCB5b3UgbWF5IHRoaW5rIHRvIHdyaXRlLApncm91cGluZyBhbGwgdGhlcmUgd2Fz IG1lYW50IHRvIGF2b2lkIHRoaXMuLi5JIHRob3VnaHQgdGhhdCBieSBtb3ZpbmcgdGhlCnByb2Js ZW0gYXdheSBpbiBvbmUgc2luZ2xlIGludGVybmFsIGNvbW1vbiBoZWFkZXIgd2FzIGVhc2llciB0 byBtb25pdG9yLgoKSSBjZXJ0YWlubHkgbWF5YmUgd3JvbmcsIGJ1dCBJIGRvbnQgc2VlIGhvdyB5 b3UgY2FuIGRlZHVjZSBJIGRvbnQgY2FyZS4uLgoKLi4uYW5kIG1heWJlLCBvbmx5IG1heWJlLCB3 aGF0IHRoYXQgOTUlIG9mIHBlb3BsZSBpcyB0cnlpbmcgdG8gZG8gaW4gdGhlaXIKaG9ycmlibGUg Y29kZSBpcyB0byBkZWxpdmVyIHRoZSBiZXN0IHJlYXNvbmFibHkgcG9zc2libGUgdGhpbmcgd2l0 aGluIHRoZWlyCnRpbWVsaW5lIHdoaWxlIHlvdSBhcmUgYmFya2luZyBhdCB0aGVtIGluIGNoYXNl IG9mIG5ldmVyIHRvIGJlIHJlbGVhc2VkIHV0dGVyCnBlcmZlY3Rpb24uCgo+IExhc3QgdG8gYWRk LCBidXQgbm90IGxlYXN0IGlzIHRoYXQgeW91ciBjb2RlIG1heSBiZSB1c2VkIGFzIGFuIGV4YW1w bGUKPiBmb3Igb3RoZXJzLCBoZW5jZSB3ZSByZWFsbHkgaGF2ZSB0byBkbyBvdXIgYmVzdCBpbiBv cmRlciB0byBhdm9pZCBiYWQKPiBkZXNpZ24sIHByYWN0aWNlcywgYW5kIGNhcmdvIGN1bHRzLiBJ ZiB0aGlzIHJlcXVpcmVzIG1vcmUgcmVmYWN0b3JpbmcKPiBvZiB0aGUgZXhpc3RpbmcgY29kZSwg dGhlbiBkbyBpdCBzb29uZXIgdGhhbiBsYXRlci4KPiAKPiAuLi4KPiAKPiA+ID4gPiBBbmR5IG1h ZGUgKG1vc3RseSkgdGhlIHNhbWUgcmVtYXJrcyBvbiB0aGlzIHNhbWUgcGF0Y2ggfjEteWVhciBh Z28gb24KPiA+ID4gPiB0aGlzIHNhbWUgcGF0Y2ggd2hpbGUgaXQgd2FzIHBvc3RlZCBieSBPbGVr c2lpLgo+ID4gPiA+Cj4gPiA+ID4gQW5kIEkgdG9sZCB0aGF0IHRpbWUgdGhhdCBtb3N0IG9mIHRo ZSByZW1hcmtzIGFyb3VuZCBkZXZtXyB1c2FnZSB3ZXJlCj4gPiA+ID4gd3JvbmcgZHVlIHRvIGhv dyB0aGUgU0NNSSBjb3JlIGhhbmRsZXMgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gKHVzaW5nIGEK PiA+ID4gPiBkZXZyZXMgZ3JvdXAgdHJhbnNwYXJlbnRseSkuCj4gPiA+ID4KPiA+ID4gPiBUaGlz IGlzIHdoYXQgSSBhbnN3ZXJlZCB0aGF0IHRpbWUuCj4gPiA+ID4KPiA+ID4gPiBodHRwczovL2xv cmUua2VybmVsLm9yZy9saW51eC1hcm0ta2VybmVsL1pKNzhoQmNqQWhpVStaQk9AZTEyMDkzNy1s aW4vI3QKPiA+ID4gPgo+ID4gPiA+IEkgd29udCByZXBlYXQgbXlzZWxmLCBidXQsIGluIGEgbnV0 c2hlbGwgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGxpa2UgaXQKPiA+ID4gPiBpcyBub3cgaXMgZmlu ZTogYSBiaXQgaGFwcGVucyB2aWEgZGV2bV8gYXQgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24sIHRo ZQo+ID4gPiA+IG90aGVyIGlzIGRvZSB2aWEgZXhwbGljaXQga21hbGxvYyBhdCBydW50aW1lIGFu ZCBmcmVlZCB2aWEga2ZyZWUgYXQKPiA+ID4gPiByZW1vdmUgdGltZSAoaWYgbmVlZGVkLi4uaS5l LiBjaGVja2luZyB0aGUgcHJlc2VudCBmbGFnIG9mIHNvbWUgc3RydWN0cykKPiA+ID4KPiA+ID4g VGhpcyBzb3VuZHMgbGlrZSBhIG1lc3MuIGRldm1fIGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgb25s eSBmb3IgdGhlCj4gPiA+IC0+cHJvYmUoKSBzdGFnZSwgb3RoZXJ3aXNlIHlvdSBtYXkgY29uc2lk ZXIgY2xlYW51cC5oIChfX2ZyZWUoKSBtYWNybykKPiA+ID4gdG8gaGF2ZSBhdXRvbWF0aWMgZnJl ZSBhdCB0aGUgcGF0aHMgd2hlcmUgbWVtb3J5IGlzIG5vdCBuZWVkZWQuCj4gPgo+ID4gSW5kZWVk LCB0aGlzIHByb3RvY29sX2luaXQgY29kZSBpcyBjYWxsZWQgYnkgdGhlIFNDTUkgY29yZSBvbmNl IGZvciBhbGwgd2hlbgo+ID4gYW4gU0NNSSBkcml2ZXIgdHJpZXMgYXQgZmlyc3QgdG8gdXNlIHRo aXMgc3BlY2lmaWMgcHJvdG9jb2wgYnkgJ2dldHRpbmcnIGl0cwo+ID4gcHJvdG9jb2xfb3BzLCBz byBpdCBpcyBpbmRlZWQgY2FsbGVkIGluc2lkZSB0aGUgcHJvYmUgY2hhaW4gb2YgdGhlIGRyaXZl cjoKPiA+IGF0IHRoaXMgcG9pbnQgeW91ICpjYW4qIGRlY2lkZSB0byB1c2UgZGV2cmVzIHRvIGFs bG9jYXRlIG1lbW9yeSBhbmQgYmUgYXNzdXJlZAo+ID4gdGhhdCBpZiB0aGUgaW5pdCBmYWlscywg b3Igd2hlbiB0aGUgZHJpdmVyIGNlYXNlIHRvIHVzZSB0aGlzIHByb3RvY29sIChjYWxsaW5nCj4g PiBpdHMgcmVtb3ZlKCkpIGFuZCBubyBvdGhlciBkcml2ZXIgaXMgdXNpbmcgaXQsIGFsbCB0aGUg c3R1ZmYgdGhhdCBoYXZlIGJlZW4KPiA+IGFsbG9jYXRlZCByZWxhdGVkIHRvIHRoaXMgcHJvdG9j b2wgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgY29yZSBmb3IgeW91Lgo+ID4gKHVzaW5nIGFuIGlu dGVybmFsIGRldnJlcyBncm91cCkKPiA+Cj4gPiBXaXRob3V0IHRoaXMgeW91IHNob3VsZCBoYW5k bGUgbWFudWFsbHkgYWxsIHRoZSBkZWFsbG9jYXRpb24gbWFudWFsbHkgb24KPiA+IHRoZSBpbml0 IGVycm9yLXBhdGhzIEFORCBhbHNvIHByb3ZpZGUgYWxsIHRoZSBjbGVhbnVwIGV4cGxpY2l0bHkg d2hlbgo+ID4gdGhlIHByb3RvY29sIGlzIG5vIG1vcmUgdXNlZCBieSBhbnkgZHJpdmVyIChtdWx0 aXBsZSB1c2VycyBvZiB0aGUgc2FtZQo+ID4gcHJvdG9jb2wgaW5zdGFuY2UgYXJlIHBvc3NpYmxl KS4uLmZvciBhbGwgcHJvdG9jb2xzLgo+IAo+IFllcy4gSXMgaXQgYSBwcm9ibGVtPwo+IAoKV2Vs bCwgbm8sIGJ1dCBpcyBpdCBub3QgYSByZXBldGl0aXZlIGFuZCBlcnJvci1wcm9uZSBwcm9jZXNz ID8KSXMgaXQgbm90IHRoZSBleGFjdCByZWFzb24gd2h5IGRldnJlcyBtYW5hZ2VtZW50IGV4aXN0 IGluIGZpcnN0IHBsYWNlLCB0byBhdm9pZApyZXBldGl0aXZlIG1hbnVhbCBhbGxvYy9mcmVlIG9m IHJlc291cmNlcyBhbmQgcmVsYXRlZCBwaXRmYWxscyA/IChldmVuIHRob3VnaApjZXJ0YWlubHkg aXQgaXMgbm9ybWFsbHkgdXNlZCBpbiBhIG1vcmUgY29udmVudGlvbmFsIGFuZCBzdHJhaWdodGZv cndhcmQgd2F5KQoKVGhlIGlkZWEgd2FzIHRvIGdpdmUgc29tZSBzb3J0IG9mIGFpZCBpbiB0aGUg U0NNSSBzdGFjayBmb3Igd3JpdGluZyBwcm90b2NvbHMsCnNvIHJlZ2FyZGluZyBtZW1fbWdtdCwg SSBqdXN0IGJ1aWx0IG9uIHRvcCBvZiBkZXZyZXMgZmFjaWxpdGllcywgbm90IGludmVudGVkCmFu eXRoaW5nLCB0byB0cnkgdG8gYXZvaWQgcmVwZXRpdGlvbnMgYW5kIGxldCB0aGUgY29yZSBoYW5k bGUgbWVtIGFsbG9jcy9mcmVlCmR1cmluZyB0aGUgcHJvYmUgcGhhc2VzIGFzIG11Y2ggYXMgcG9z c2libGU6IGluIHBpbmN0cmwgY2FzZSB3b3VsZCBiZQpwYXJ0aWN1bGFybHkgdHJpdmlhbCB0byBp bnN0ZWFkIG1hbnVhbGx5IGFsbG9jYXRlIHN0dWZmIGF0IGluaXQgKGR1ZSB0byBtYW55Cmxhenkg ZGVsYXllZCBhbGxvY2F0aW9ucykgYnV0IG90aGVyIHByb3RvY29scyBuZWVkIGEgbG90IG1vcmUg dG8gYmUgZG9uZSBhdCBpbml0LApmcmVxdWVudGx5IGluIGEgbG9vcCB0byBhbGxvY2F0ZSBtdWx0 aXBsZSByZXNvdXJjZXMgZGVzY3JpcHRvcnMsIGFuZCBtYW51YWxseQp1bmRvaW5nIGFsbCBvZiB0 aGF0IG9uIGVhY2ggZXJyb3ItcGF0aCBhbmQgb24gY2xlYW51cCBpcyBkZWZpbml0ZWx5IGVycm9y LXByb25lCmFuZCBhIHBhaW4uCgpMYXN0IGJ1dCBub3QgbGVhc3QsIHRoaXMgd2hvbGUgdGhpbmcg d2FzIGRlc2lnbmVkIHRvIGFkZHJlc3MgdGhlIG5lZWRzIG9mIHRoZQpwcm90b2NvbHMgdGhhdCBl eGlzdGVkIGF0IHRoYXQgdGltZS4uLi5pdCBpcyBvbmx5IG5vdyB3aXRoIHBpbmN0cmwgbGF6eS1h bGxvY2F0aW9ucwphdCBydW50aW1lIHRoYXQgdGhlIHVnbHkgY29oZXhpc3RlbmNlIG9mIGRldm1f IGFuZCBub24tZGV2bSBhbGxvY2F0aW9ucyBiZWNhbWUgYQp0aGluZy4uLi5zbyBjbGVhcmx5IHRo ZSB0aGluZyBuZWVkcyB0byBiZSBpbXByb3ZlZC9yZXRoaW5rZWQuLi5ldmVuIGRyb3BwZWQgaWYg bm8KbW9yZSBmaXR0aW5nLi4uCgouLi4gb3IgYWx0ZXJuYXRpdmVseSBzaW5jZSBkZXZyZXMgYWxs b2NhdGlvbnMgYXJlIGFueXdheSBvcHRpb25hbCwgeW91IGNvdWxkIGp1c3QKdXNlIHJlZ3VsYXIg a21hbGxvYy9rZnJlZSBmb3IgdGhpcyBwcm90b2NvbCBhbmQgYXZvaWQgdGhpcyBkdWFsIGhhbmRs aW5nLi4uCgouLi50aGlzIHdhcyBqdXN0IHRvIHB1dCB0aGluZ3MgaW4gY29udGV4dC4uLmFuZCBJ J2xsIGhhcHBpbHkgbGV0IFN1ZGVlcCBkZWNpZGUKd2hhdCBoZSBwcmVmZXJzIGluIHRoZSBpbW1l ZGlhdGUgZm9yIHBpbmN0cmwgb3IgbW9yZSBpbiBnZW5lcmFsIGFib3V0IGFsbCB0aGUKc2NtaSBk ZXZyZXMsIHRoYXQgSSd2ZSBnb3QgZW5vdWdoIG9mIHRoZXNlIHBsZWFzYW50IGludGVyYWN0aW9u cyBmb3Igbm93Li4uCgpUaGFua3MsCkNyaXN0aWFuCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==