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 X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39DACC7618B for ; Sat, 27 Jul 2019 08:53:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F2AE720869 for ; Sat, 27 Jul 2019 08:53:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728246AbfG0Ixg convert rfc822-to-8bit (ORCPT ); Sat, 27 Jul 2019 04:53:36 -0400 Received: from relay6-d.mail.gandi.net ([217.70.183.198]:33223 "EHLO relay6-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727885AbfG0Ixf (ORCPT ); Sat, 27 Jul 2019 04:53:35 -0400 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id BE92DC0005; Sat, 27 Jul 2019 08:53:31 +0000 (UTC) Date: Sat, 27 Jul 2019 10:53:30 +0200 From: Miquel Raynal To: Stephen Boyd Cc: Michael Turquette , Russell King , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , Antoine Tenart , Maxime Chevallier , Gregory Clement , Nadav Haklai Subject: Re: [PATCH v4 0/4] Add device links to clocks Message-ID: <20190727105330.44cc7f2f@xps13> In-Reply-To: <20190617115703.642d9967@xps13> References: <20190108161940.4814-1-miquel.raynal@bootlin.com> <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> <20190521114644.7000a751@xps13> <20190617115703.642d9967@xps13> Organization: Bootlin X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hi Stephen, Miquel Raynal wrote on Mon, 17 Jun 2019 11:57:03 +0200: > Hi Stephen, > > Miquel Raynal wrote on Tue, 21 May 2019 > 11:46:44 +0200: > > > Hi Stephen, > > > > Stephen Boyd wrote on Thu, 11 Apr 2019 16:34:16 > > -0700: > > > > > Quoting Miquel Raynal (2019-01-08 08:19:36) > > > > Hello, > > > > > > > > While working on suspend to RAM feature, I ran into troubles multiple > > > > times when clocks where not suspending/resuming at the desired time. I > > > > had a look at the core and I think the same logic as in the > > > > regulator's core may be applied here to (very easily) fix this issue: > > > > using device links. > > > > > > > > The only additional change I had to do was to always (when available) > > > > populate the device entry of the core clock structure so that it could > > > > be used later. This is the purpose of patch 1. Patch 2 actually adds > > > > support for device links. > > > > > > > > Here is a step-by-step explanation of how links are managed, following > > > > Maxime Ripard's suggestion. > > > > > > > > > > > > The order of probe has no importance because the framework already > > > > handles orphaned clocks so let's be simple and say there are two root > > > > clocks, not depending on anything, that are probed first: xtal0 and > > > > xtal1. None of these clocks have a parent, there is no device link in > > > > the game, yet. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +----------------+ +----------------+ > > > > > > > > Then, a peripheral clock periph0 is probed. His parent is xtal1. The > > > > clock_register_*() call will run __clk_init_parent() and a link between > > > > periph0's core and xtal1's core will be created and stored in > > > > periph0's core->parent_clk_link entry. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +----------------+ +-------^--------+ > > > > | > > > > | > > > > +--------------+ > > > > | ->parent_clk_link > > > > | > > > > +----------------+ > > > > | | > > > > | | > > > > | periph0 core | > > > > | | > > > > | | > > > > +-------^^-------+ > > > > || > > > > || > > > > +----------------+ > > > > | | > > > > | periph0 clk 0 | > > > > | | > > > > +----------------+ > > > > > > > > Then, device0 is probed and "get" the periph0 clock. clk_get() will be > > > > called and a struct clk will be instantiated for device0 (called in > > > > the figure clk 1). A link between device0 and the new clk 1 instance of > > > > periph0 will be created and stored in the clk->consumer_link entry. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +----------------+ +-------^--------+ > > > > | > > > > | > > > > +--------------+ > > > > | ->parent_clk_link > > > > | > > > > +----------------+ > > > > | | > > > > | | > > > > | periph0 core | > > > > | <-------------+ > > > > | <-------------| > > > > +-------^^-------+ || > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | periph0 clk 0 | | periph0 clk 1 | > > > > | | | | > > > > +----------------+ +----------------+ > > > > | > > > > | ->consumer_link > > > > | > > > > | > > > > | > > > > +-------v--------+ > > > > | device0 | > > > > +----------------+ > > > > > > > > Right now, device0 is linked to periph0, itself linked to xtal1 so > > > > everything is fine. > > > > > > > > Now let's get some fun: the new parent of periph0 is xtal1. The process > > > > will call clk_reparent(), periph0's core->parent_clk_link will be > > > > destroyed and a new link to xtal1 will be setup and stored. The > > > > situation is now that device0 is linked to periph0 and periph0 is > > > > linked to xtal1, so the dependency between device0 and xtal1 is still > > > > clear. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +-------^--------+ +----------------+ > > > > | > > > > | \ / > > > > +----------------------------x > > > > ->parent_clk_link | / \ > > > > | > > > > +----------------+ > > > > | | > > > > | | > > > > | periph0 core | > > > > | <-------------+ > > > > | <-------------| > > > > +-------^^-------+ || > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | periph0 clk 0 | | periph0 clk 1 | > > > > | | | | > > > > +----------------+ +----------------+ > > > > | > > > > | ->consumer_link > > > > | > > > > | > > > > | > > > > +-------v--------+ > > > > | device0 | > > > > +----------------+ > > > > > > > > I assume periph0 cannot be removed while there are devices using it, > > > > same for xtal0. > > > > > > > > What can happen is that device0 'put' the clock periph0. The relevant > > > > link is deleted and the clk instance dropped. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +-------^--------+ +----------------+ > > > > | > > > > | \ / > > > > +----------------------------x > > > > ->parent_clk_link | / \ > > > > | > > > > +----------------+ > > > > | | > > > > | | > > > > | periph0 core | > > > > | | > > > > | | > > > > +-------^^-------+ > > > > || > > > > || > > > > +----------------+ > > > > | | > > > > | periph0 clk 0 | > > > > | | > > > > +----------------+ > > > > > > > > Now we can unregister periph0: link with the parent will be destroyed > > > > and the clock may be safely removed. > > > > > > > > +----------------+ +----------------+ > > > > | | | | > > > > | | | | > > > > | xtal0 core | | xtal1 core | > > > > | | | | > > > > | | | | > > > > +-------^^-------+ +-------^^-------+ > > > > || || > > > > || || > > > > +----------------+ +----------------+ > > > > | | | | > > > > | xtal0 clk | | xtal1 clk | > > > > | | | | > > > > +----------------+ +----------------+ > > > > > > > > > > > > This is my understanding of the common clock framework and how links > > > > can be added to it. > > > > > > > > As a result, here are the links created during the boot of an > > > > ESPRESSObin: > > > > > > > > > > Sorry this patch series is taking way too long to get merged. It's > > > already mid-April! > > > > > > So I still have some of the original questions I had from before, mostly > > > around circular parent chains between clk providers. For example, there > > > are clk providers that both provide clks to other providers and consume > > > clks from those providers. Does device links work gracefully here? > > > > > > Just speaking from my own qcom experience, I can point to the PCIe PHY > > > that's a provider of a clk to GCC and a consumer of a clk in GCC. In > > > block diagram form this is: > > > > > > > > > PCIE PHY GCC > > > +--------------+ +-------------------------+ > > > | | | | > > > | PHY clk ->----------+---- gcc_pipe_clk ---+ | > > > | | | | | > > > | | | | | > > > | pci_pipe_clk <----------|---------------------+ | > > > | | | | > > > +--------------+ +-------------------------+ > > > > > > The end result is that the PCIe PHY is a clk controller that provides > > > the PHY clk to GCC's gcc_pipe_clk and then it gets the same clk signal > > > back from GCC and uses it on the PCIe PHY's pci_pipe_clk input. > > > > > > So is this is a problem? > > > > > > > It's now my turn to get back on this topic. > > > > I just put my noise back into this and for what I understand of the > > clk subsystem, I think the situation you describe could be pictured > > like this: > > > > > > +---------------+ > > | | > > | | > > | PCIe PHY | > > | | > > | | > > +-----^^--------+ > > || > > || > > +---------------+ > > | | > > | pcie_pipe_clk | > > | | > > +------^--------+ > > | > > | ->parent_clk_link > > | > > | > > +---------------+ > > | | > > | | > > | GCC | > > | | > > | | > > +------^^-------+ > > || > > || > > +---------------+ > > | | > > | gcc_pipe_clk | > > | | > > +------^--------+ > > | > > | ->parent_clk_link > > | > > | > > +---------------+ > > | | > > | | > > | PCIe PHY | > > | | > > | | > > +------^^-------+ > > || > > || > > +---------------+ > > | | > > | phy_clk | > > | | > > +---------------+ > > > > > > IMHO the fact that the first and third blocks are the same does not > > interfere with device links. > > > > Honestly, I cannot be 100% sure it won't break on qcom designs, maybe > > the best would be to have someone to test. I don't have the relevant > > hardware. Do you? It would be really helpful! > > > > There is an entire PCIe series blocked, waiting for these device links > > to be merged so it would help a lot if someone could test. > > > > Could you share the status of this series? Will it be applied for the > next merge window? I would really like to see this moving forward. I know this series might have side effects despite the consequent amount of time spent to write and test it, but I also think the clk subsystem would really benefit from such change and handling suspend to RAM support would be greatly enhanced. You seemed interested at first and now not anymore, could I know why? I got inspired by the regulators subsystem. It is not an idea of mine that device links should be bring to clocks. Regulators are almost as used as clocks so I really understand your fears but why not applying this to -next very early during the -rc cycles and see what happens? You'll have plenty of time to ask me to fix things or even drop it off. Kind regards, Miquèl 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 X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7A29C7618B for ; Sat, 27 Jul 2019 08:53:53 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 960D32085A for ; Sat, 27 Jul 2019 08:53:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="slC1b3/A" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 960D32085A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject: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=E4cvlBKjT0yYd5vqzoT96fcNDUznLBAM2ujJm2TqXjM=; b=slC1b3/AncVTFo JmDWUi6G0R1keyYPAaQuHVGGoBxRQFB/GqfClV89oFAHkkdbROJPdDqYT4A3ynES8EniYU4sd4XU1 zeIXPgCfeC2/M6pbUn3FLppxUUeJ1F29N/EDDYWWEf8Xjmfs/S0Dluo/EO6f3FrLblCo/w1WUuCZb nZa+Xngj0l4XFzSCCJHhI/UDN+MApB7uIFeSHZOndz3p8uGkwQxyOItWEno2gNygS+wpvJ1yoYFKg ixgWxjU8VC0bh4XBo9KQL2EJtJVo9naKzJkkR3EkA7Bx/+YOzuV2u3XgwWk8a2KQvJvmg7HjCJwXB Oe5S0O4PJNqASOvn0kmw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hrISd-0005ge-GI; Sat, 27 Jul 2019 08:53:51 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hrISY-0005gB-HV for linux-arm-kernel@lists.infradead.org; Sat, 27 Jul 2019 08:53:49 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id BE92DC0005; Sat, 27 Jul 2019 08:53:31 +0000 (UTC) Date: Sat, 27 Jul 2019 10:53:30 +0200 From: Miquel Raynal To: Stephen Boyd Subject: Re: [PATCH v4 0/4] Add device links to clocks Message-ID: <20190727105330.44cc7f2f@xps13> In-Reply-To: <20190617115703.642d9967@xps13> References: <20190108161940.4814-1-miquel.raynal@bootlin.com> <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> <20190521114644.7000a751@xps13> <20190617115703.642d9967@xps13> Organization: Bootlin X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190727_015346_893430_C53A0F11 X-CRM114-Status: GOOD ( 29.44 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gregory Clement , Antoine Tenart , Michael Turquette , linux-kernel@vger.kernel.org, Russell King , Nadav Haklai , Thomas Petazzoni , Maxime Chevallier , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgU3RlcGhlbiwKCk1pcXVlbCBSYXluYWwgPG1pcXVlbC5yYXluYWxAYm9vdGxpbi5jb20+IHdy b3RlIG9uIE1vbiwgMTcgSnVuIDIwMTkKMTE6NTc6MDMgKzAyMDA6Cgo+IEhpIFN0ZXBoZW4sCj4g Cj4gTWlxdWVsIFJheW5hbCA8bWlxdWVsLnJheW5hbEBib290bGluLmNvbT4gd3JvdGUgb24gVHVl LCAyMSBNYXkgMjAxOQo+IDExOjQ2OjQ0ICswMjAwOgo+IAo+ID4gSGkgU3RlcGhlbiwKPiA+IAo+ ID4gU3RlcGhlbiBCb3lkIDxzYm95ZEBrZXJuZWwub3JnPiB3cm90ZSBvbiBUaHUsIDExIEFwciAy MDE5IDE2OjM0OjE2Cj4gPiAtMDcwMDoKPiA+ICAgCj4gPiA+IFF1b3RpbmcgTWlxdWVsIFJheW5h bCAoMjAxOS0wMS0wOCAwODoxOTozNikgICAgCj4gPiA+ID4gSGVsbG8sCj4gPiA+ID4gCj4gPiA+ ID4gV2hpbGUgd29ya2luZyBvbiBzdXNwZW5kIHRvIFJBTSBmZWF0dXJlLCBJIHJhbiBpbnRvIHRy b3VibGVzIG11bHRpcGxlCj4gPiA+ID4gdGltZXMgd2hlbiBjbG9ja3Mgd2hlcmUgbm90IHN1c3Bl bmRpbmcvcmVzdW1pbmcgYXQgdGhlIGRlc2lyZWQgdGltZS4gSQo+ID4gPiA+IGhhZCBhIGxvb2sg YXQgdGhlIGNvcmUgYW5kIEkgdGhpbmsgdGhlIHNhbWUgbG9naWMgYXMgaW4gdGhlCj4gPiA+ID4g cmVndWxhdG9yJ3MgY29yZSBtYXkgYmUgYXBwbGllZCBoZXJlIHRvICh2ZXJ5IGVhc2lseSkgZml4 IHRoaXMgaXNzdWU6Cj4gPiA+ID4gdXNpbmcgZGV2aWNlIGxpbmtzLgo+ID4gPiA+IAo+ID4gPiA+ IFRoZSBvbmx5IGFkZGl0aW9uYWwgY2hhbmdlIEkgaGFkIHRvIGRvIHdhcyB0byBhbHdheXMgKHdo ZW4gYXZhaWxhYmxlKQo+ID4gPiA+IHBvcHVsYXRlIHRoZSBkZXZpY2UgZW50cnkgb2YgdGhlIGNv cmUgY2xvY2sgc3RydWN0dXJlIHNvIHRoYXQgaXQgY291bGQKPiA+ID4gPiBiZSB1c2VkIGxhdGVy LiBUaGlzIGlzIHRoZSBwdXJwb3NlIG9mIHBhdGNoIDEuIFBhdGNoIDIgYWN0dWFsbHkgYWRkcwo+ ID4gPiA+IHN1cHBvcnQgZm9yIGRldmljZSBsaW5rcy4KPiA+ID4gPiAKPiA+ID4gPiBIZXJlIGlz IGEgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9uIG9mIGhvdyBsaW5rcyBhcmUgbWFuYWdlZCwgZm9s bG93aW5nCj4gPiA+ID4gTWF4aW1lIFJpcGFyZCdzIHN1Z2dlc3Rpb24uCj4gPiA+ID4gCj4gPiA+ ID4gCj4gPiA+ID4gVGhlIG9yZGVyIG9mIHByb2JlIGhhcyBubyBpbXBvcnRhbmNlIGJlY2F1c2Ug dGhlIGZyYW1ld29yayBhbHJlYWR5Cj4gPiA+ID4gaGFuZGxlcyBvcnBoYW5lZCBjbG9ja3Mgc28g bGV0J3MgYmUgc2ltcGxlIGFuZCBzYXkgdGhlcmUgYXJlIHR3byByb290Cj4gPiA+ID4gY2xvY2tz LCBub3QgZGVwZW5kaW5nIG9uIGFueXRoaW5nLCB0aGF0IGFyZSBwcm9iZWQgZmlyc3Q6IHh0YWww IGFuZAo+ID4gPiA+IHh0YWwxLiBOb25lIG9mIHRoZXNlIGNsb2NrcyBoYXZlIGEgcGFyZW50LCB0 aGVyZSBpcyBubyBkZXZpY2UgbGluayBpbgo+ID4gPiA+IHRoZSBnYW1lLCB5ZXQuCj4gPiA+ID4g Cj4gPiA+ID4gICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0t LS0rCj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICB8Cj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICB8Cj4gPiA+ID4gICAgfCAgIHh0YWwwIGNvcmUgICB8ICAgICAgICAgICAgfCAgIHh0 YWwxIGNvcmUgICB8Cj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgKy0tLS0tLS1eXi0tLS0tLS0rICAgICAgICAg ICAgKy0tLS0tLS1eXi0tLS0tLS0rCj4gPiA+ID4gICAgICAgICAgICB8fCAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8fAo+ID4gPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfHwKPiA+ID4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAgICB8ICAgeHRhbDAgY2xrICAgIHwgICAgICAgICAg ICB8ICAgeHRhbDEgY2xrICAgIHwKPiA+ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAg ICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAg ICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAKPiA+ID4gPiBUaGVuLCBhIHBlcmlw aGVyYWwgY2xvY2sgcGVyaXBoMCBpcyBwcm9iZWQuIEhpcyBwYXJlbnQgaXMgeHRhbDEuIFRoZQo+ ID4gPiA+IGNsb2NrX3JlZ2lzdGVyXyooKSBjYWxsIHdpbGwgcnVuIF9fY2xrX2luaXRfcGFyZW50 KCkgYW5kIGEgbGluayBiZXR3ZWVuCj4gPiA+ID4gcGVyaXBoMCdzIGNvcmUgYW5kIHh0YWwxJ3Mg Y29yZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHN0b3JlZCBpbgo+ID4gPiA+IHBlcmlwaDAncyBjb3Jl LT5wYXJlbnRfY2xrX2xpbmsgZW50cnkuCj4gPiA+ID4gCj4gPiA+ID4gICAgKy0tLS0tLS0tLS0t LS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gICAgfCAgICAgICAg ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgfCAgICAg ICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgfCAg IHh0YWwwIGNvcmUgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNvcmUgICB8Cj4gPiA+ID4gICAg fCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4g ICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ ID4gICAgKy0tLS0tLS1eXi0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS1eXi0tLS0tLS0rCj4g PiA+ID4gICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ID4gPiA+ ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKPiA+ID4gPiAgICAr LS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAg ICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4g PiAgICB8ICAgeHRhbDAgY2xrICAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY2xrICAgIHwKPiA+ ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwK PiA+ID4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLV4tLS0tLS0t LSsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAtPnBhcmVudF9jbGtfbGluawo+ID4gPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0t LS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4g PiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAg ICAgICAgICAgIHwgIHBlcmlwaDAgY29yZSAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKwo+ID4gPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgIHx8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4g PiA+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAg ICAgICAgICAgICAgfCAgcGVyaXBoMCBjbGsgMCB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0t LS0tLS0rCj4gPiA+ID4gCj4gPiA+ID4gVGhlbiwgZGV2aWNlMCBpcyBwcm9iZWQgYW5kICJnZXQi IHRoZSBwZXJpcGgwIGNsb2NrLiBjbGtfZ2V0KCkgd2lsbCBiZQo+ID4gPiA+IGNhbGxlZCBhbmQg YSBzdHJ1Y3QgY2xrIHdpbGwgYmUgaW5zdGFudGlhdGVkIGZvciBkZXZpY2UwIChjYWxsZWQgaW4K PiA+ID4gPiB0aGUgZmlndXJlIGNsayAxKS4gQSBsaW5rIGJldHdlZW4gZGV2aWNlMCBhbmQgdGhl IG5ldyBjbGsgMSBpbnN0YW5jZSBvZgo+ID4gPiA+IHBlcmlwaDAgd2lsbCBiZSBjcmVhdGVkIGFu ZCBzdG9yZWQgaW4gdGhlIGNsay0+Y29uc3VtZXJfbGluayBlbnRyeS4KPiA+ID4gPiAKPiA+ID4g PiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwK PiA+ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAg IHwKPiA+ID4gPiAgICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY29y ZSAgIHwKPiA+ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAg ICAgICAgIHwKPiA+ID4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIHwKPiA+ID4gPiAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICArLS0t LS0tLV5eLS0tLS0tLSsKPiA+ID4gPiAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHx8Cj4gPiA+ID4gICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8fAo+ID4gPiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0t LS0tLS0tKwo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAg ICAgICAgICAgfAo+ID4gPiA+ICAgIHwgICB4dGFsMCBjbGsgICAgfCAgICAgICAgICAgIHwgICB4 dGFsMSBjbGsgICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAg ICstLS0tLS0tXi0tLS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0t Kwo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC0+cGFyZW50X2Nsa19saW5r Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAg ICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gICAgICAgICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8 Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgfCAgcGVyaXBoMCBjb3JlICB8Cj4gPiA+ID4gICAg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICA8LS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tfAo+ID4gPiA+ ICAgICAgICAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgIHx8Cj4gPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgfHwKPiA+ ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAo+ ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0t LS0tLS0tLSsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgfCAgcGVyaXBoMCBj bGsgMCB8ICAgIHwgIHBlcmlwaDAgY2xrIDEgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAg ICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLT5jb25z dW1lcl9saW5rCj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICstLS0tLS0tdi0tLS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIGRldmljZTAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gCj4gPiA+ ID4gUmlnaHQgbm93LCBkZXZpY2UwIGlzIGxpbmtlZCB0byBwZXJpcGgwLCBpdHNlbGYgbGlua2Vk IHRvIHh0YWwxIHNvCj4gPiA+ID4gZXZlcnl0aGluZyBpcyBmaW5lLgo+ID4gPiA+IAo+ID4gPiA+ IE5vdyBsZXQncyBnZXQgc29tZSBmdW46IHRoZSBuZXcgcGFyZW50IG9mIHBlcmlwaDAgaXMgeHRh bDEuIFRoZSBwcm9jZXNzCj4gPiA+ID4gd2lsbCBjYWxsIGNsa19yZXBhcmVudCgpLCBwZXJpcGgw J3MgY29yZS0+cGFyZW50X2Nsa19saW5rIHdpbGwgYmUKPiA+ID4gPiBkZXN0cm95ZWQgYW5kIGEg bmV3IGxpbmsgdG8geHRhbDEgd2lsbCBiZSBzZXR1cCBhbmQgc3RvcmVkLiBUaGUKPiA+ID4gPiBz aXR1YXRpb24gaXMgbm93IHRoYXQgZGV2aWNlMCBpcyBsaW5rZWQgdG8gcGVyaXBoMCBhbmQgcGVy aXBoMCBpcwo+ID4gPiA+IGxpbmtlZCB0byB4dGFsMSwgc28gdGhlIGRlcGVuZGVuY3kgYmV0d2Vl biBkZXZpY2UwIGFuZCB4dGFsMSBpcyBzdGlsbAo+ID4gPiA+IGNsZWFyLgo+ID4gPiA+IAo+ID4g PiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAg fAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgfAo+ID4gPiA+ICAgIHwgICB4dGFsMCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBj b3JlICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAg ICAgICAgICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgfAo+ID4gPiA+ICAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICst LS0tLS0tXl4tLS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfHwKPiA+ID4gPiAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHx8Cj4gPiA+ID4gICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0t LS0tLS0tLS0rCj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICB8Cj4gPiA+ID4gICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAg IHh0YWwxIGNsayAgICB8Cj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgKy0tLS0tLS1eLS0tLS0tLS0rICAgICAgICAg ICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAg ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAvCj4gPiA+ID4gICAgICAgICAgICAr LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXggICAgICAKPiA+ID4gPiAgICAgICAtPnBhcmVu dF9jbGtfbGluayAgIHwgICAgICAgICAgICAvIFwgICAgICAKPiA+ID4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0t LSsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAg ICAgICB8ICBwZXJpcGgwIGNvcmUgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIDwtLS0tLS0tLS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS18Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgKy0t LS0tLS1eXi0tLS0tLS0rICAgICAgICAgICAgfHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAo+ID4gPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiA+ID4gICAgICAgICAgICAgICAg ICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gPiA+ICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ ID4gPiAgICAgICAgICAgICAgICAgICB8ICBwZXJpcGgwIGNsayAwIHwgICAgfCAgcGVyaXBoMCBj bGsgMSB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgIHwg ICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0t LS0tKyAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtPmNvbnN1bWVyX2xpbmsKPiA+ID4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS12LS0tLS0tLS0r Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgZGV2 aWNlMCAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ID4gPiAKPiA+ID4gPiBJIGFzc3VtZSBwZXJpcGgwIGNh bm5vdCBiZSByZW1vdmVkIHdoaWxlIHRoZXJlIGFyZSBkZXZpY2VzIHVzaW5nIGl0LAo+ID4gPiA+ IHNhbWUgZm9yIHh0YWwwLgo+ID4gPiA+IAo+ID4gPiA+IFdoYXQgY2FuIGhhcHBlbiBpcyB0aGF0 IGRldmljZTAgJ3B1dCcgdGhlIGNsb2NrIHBlcmlwaDAuIFRoZSByZWxldmFudAo+ID4gPiA+IGxp bmsgaXMgZGVsZXRlZCBhbmQgdGhlIGNsayBpbnN0YW5jZSBkcm9wcGVkLgo+ID4gPiA+IAo+ID4g PiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAg fAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgfAo+ID4gPiA+ICAgIHwgICB4dGFsMCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBj b3JlICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAg ICAgICAgICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgfAo+ID4gPiA+ICAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICst LS0tLS0tXl4tLS0tLS0tKwo+ID4gPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfHwKPiA+ID4gPiAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHx8Cj4gPiA+ID4gICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0t LS0tLS0tLS0rCj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICB8Cj4gPiA+ID4gICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAg IHh0YWwxIGNsayAgICB8Cj4gPiA+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAgKy0tLS0tLS1eLS0tLS0tLS0rICAgICAgICAg ICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gICAgICAgICAgICB8Cj4gPiA+ID4gICAgICAg ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAvCj4gPiA+ID4gICAgICAgICAgICAr LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXggICAgICAKPiA+ID4gPiAgICAgICAtPnBhcmVu dF9jbGtfbGluayAgIHwgICAgICAgICAgICAvIFwgICAgICAKPiA+ID4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0t LSsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAg ICAgICB8ICBwZXJpcGgwIGNvcmUgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIHwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwK PiA+ID4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsKPiA+ID4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAg ICB8fAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gPiA+ ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAg ICAgICAgIHwgIHBlcmlwaDAgY2xrIDAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgfAo+ID4gPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0t Kwo+ID4gPiA+IAo+ID4gPiA+IE5vdyB3ZSBjYW4gdW5yZWdpc3RlciBwZXJpcGgwOiBsaW5rIHdp dGggdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZAo+ID4gPiA+IGFuZCB0aGUgY2xvY2sgbWF5 IGJlIHNhZmVseSByZW1vdmVkLgo+ID4gPiA+IAo+ID4gPiA+ICAgICstLS0tLS0tLS0tLS0tLS0t KyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gPiA+ICAgIHwgICAgICAgICAgICAg ICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgIHwgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgIHwgICB4dGFs MCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBjb3JlICAgfAo+ID4gPiA+ICAgIHwgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAgIHwg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gPiA+ICAg ICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKwo+ID4gPiA+ ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKPiA+ID4gPiAgICAg ICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiA+ID4gICAgKy0tLS0t LS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiA+ID4gICAgfCAg ICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ID4gICAg fCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNsayAgICB8Cj4gPiA+ID4g ICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiA+ ID4gICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4g PiA+ID4gCj4gPiA+ID4gCj4gPiA+ID4gVGhpcyBpcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBj b21tb24gY2xvY2sgZnJhbWV3b3JrIGFuZCBob3cgbGlua3MKPiA+ID4gPiBjYW4gYmUgYWRkZWQg dG8gaXQuCj4gPiA+ID4gCj4gPiA+ID4gQXMgYSByZXN1bHQsIGhlcmUgYXJlIHRoZSBsaW5rcyBj cmVhdGVkIGR1cmluZyB0aGUgYm9vdCBvZiBhbgo+ID4gPiA+IEVTUFJFU1NPYmluOgo+ID4gPiA+ ICAgICAgIAo+ID4gPiAKPiA+ID4gU29ycnkgdGhpcyBwYXRjaCBzZXJpZXMgaXMgdGFraW5nIHdh eSB0b28gbG9uZyB0byBnZXQgbWVyZ2VkLiBJdCdzCj4gPiA+IGFscmVhZHkgbWlkLUFwcmlsIQo+ ID4gPiAKPiA+ID4gU28gSSBzdGlsbCBoYXZlIHNvbWUgb2YgdGhlIG9yaWdpbmFsIHF1ZXN0aW9u cyBJIGhhZCBmcm9tIGJlZm9yZSwgbW9zdGx5Cj4gPiA+IGFyb3VuZCBjaXJjdWxhciBwYXJlbnQg Y2hhaW5zIGJldHdlZW4gY2xrIHByb3ZpZGVycy4gRm9yIGV4YW1wbGUsIHRoZXJlCj4gPiA+IGFy ZSBjbGsgcHJvdmlkZXJzIHRoYXQgYm90aCBwcm92aWRlIGNsa3MgdG8gb3RoZXIgcHJvdmlkZXJz IGFuZCBjb25zdW1lCj4gPiA+IGNsa3MgZnJvbSB0aG9zZSBwcm92aWRlcnMuIERvZXMgZGV2aWNl IGxpbmtzIHdvcmsgZ3JhY2VmdWxseSBoZXJlPwo+ID4gPiAKPiA+ID4gSnVzdCBzcGVha2luZyBm cm9tIG15IG93biBxY29tIGV4cGVyaWVuY2UsIEkgY2FuIHBvaW50IHRvIHRoZSBQQ0llIFBIWQo+ ID4gPiB0aGF0J3MgYSBwcm92aWRlciBvZiBhIGNsayB0byBHQ0MgYW5kIGEgY29uc3VtZXIgb2Yg YSBjbGsgaW4gR0NDLiBJbgo+ID4gPiBibG9jayBkaWFncmFtIGZvcm0gdGhpcyBpczoKPiA+ID4g Cj4gPiA+IAo+ID4gPiAgICAgICBQQ0lFIFBIWSAgICAgICAgICAgICAgICAgICAgICAgIEdDQwo+ ID4gPiAgICArLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKwo+ID4gPiAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAg ICAgICAgICAgfAo+ID4gPiAgICB8ICAgICBQSFkgY2xrIC0+LS0tLS0tLS0tLSstLS0tIGdjY19w aXBlX2NsayAtLS0rICAgfAo+ID4gPiAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICB8ICAgfAo+ID4gPiAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAg IHwgICAgICAgICAgICAgICAgICAgICB8ICAgfAo+ID4gPiAgICB8IHBjaV9waXBlX2NsayA8LS0t LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgfAo+ID4gPiAgICB8ICAgICAgICAgICAg ICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gPiAgICArLS0tLS0t LS0tLS0tLS0rICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ID4gPiAKPiA+ ID4gVGhlIGVuZCByZXN1bHQgaXMgdGhhdCB0aGUgUENJZSBQSFkgaXMgYSBjbGsgY29udHJvbGxl ciB0aGF0IHByb3ZpZGVzCj4gPiA+IHRoZSBQSFkgY2xrIHRvIEdDQydzIGdjY19waXBlX2NsayBh bmQgdGhlbiBpdCBnZXRzIHRoZSBzYW1lIGNsayBzaWduYWwKPiA+ID4gYmFjayBmcm9tIEdDQyBh bmQgdXNlcyBpdCBvbiB0aGUgUENJZSBQSFkncyBwY2lfcGlwZV9jbGsgaW5wdXQuCj4gPiA+IAo+ ID4gPiBTbyBpcyB0aGlzIGlzIGEgcHJvYmxlbT8KPiA+ID4gICAgIAo+ID4gCj4gPiBJdCdzIG5v dyBteSB0dXJuIHRvIGdldCBiYWNrIG9uIHRoaXMgdG9waWMuCj4gPiAKPiA+IEkganVzdCBwdXQg bXkgbm9pc2UgYmFjayBpbnRvIHRoaXMgYW5kIGZvciB3aGF0IEkgdW5kZXJzdGFuZCBvZiB0aGUK PiA+IGNsayBzdWJzeXN0ZW0sIEkgdGhpbmsgdGhlIHNpdHVhdGlvbiB5b3UgZGVzY3JpYmUgY291 bGQgYmUgcGljdHVyZWQKPiA+IGxpa2UgdGhpczoKPiA+IAo+ID4gCj4gPiAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tKwo+ID4gICAgICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAg IHwgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICB8IFBDSWUgUEhZICAgICAgfAo+ID4gICAg ICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgIHwgICAgICAgICAgICAgICB8Cj4g PiAgICAgICAgICArLS0tLS1eXi0tLS0tLS0tKwo+ID4gICAgICAgICAgICAgICAgfHwKPiA+ICAg ICAgICAgICAgICAgIHx8Cj4gPiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwo+ID4gICAgICAg ICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgIHwgcGNpZV9waXBlX2NsayB8Cj4gPiAg ICAgICAgICB8ICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgKy0tLS0tLV4tLS0tLS0tLSsK PiA+ICAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgfCAtPnBhcmVudF9jbGtf bGluawo+ID4gICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICB8Cj4gPiAgICAg ICAgICArLS0tLS0tLS0tLS0tLS0tKwo+ID4gICAgICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ ICAgICAgICAgIHwgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICB8IEdDQyAgICAgICAgICAg fAo+ID4gICAgICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgIHwgICAgICAgICAg ICAgICB8Cj4gPiAgICAgICAgICArLS0tLS0tXl4tLS0tLS0tKwo+ID4gICAgICAgICAgICAgICAg IHx8Cj4gPiAgICAgICAgICAgICAgICAgfHwKPiA+ICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0r Cj4gPiAgICAgICAgICB8ICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgfCBnY2NfcGlwZV9j bGsgIHwKPiA+ICAgICAgICAgIHwgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICArLS0tLS0t Xi0tLS0tLS0tKwo+ID4gICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICB8IC0+ cGFyZW50X2Nsa19saW5rCj4gPiAgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAg IHwKPiA+ICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCj4gPiAgICAgICAgICB8ICAgICAgICAg ICAgICAgfAo+ID4gICAgICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgIHwgUENJ ZSBQSFkgICAgICB8Cj4gPiAgICAgICAgICB8ICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAg fCAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICstLS0tLS1eXi0tLS0tLS0rCj4gPiAgICAg ICAgICAgICAgICAgfHwKPiA+ICAgICAgICAgICAgICAgICB8fAo+ID4gICAgICAgICAgKy0tLS0t LS0tLS0tLS0tLSsKPiA+ICAgICAgICAgIHwgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICB8 IHBoeV9jbGsgICAgICAgfAo+ID4gICAgICAgICAgfCAgICAgICAgICAgICAgIHwKPiA+ICAgICAg ICAgICstLS0tLS0tLS0tLS0tLS0rCj4gPiAKPiA+IAo+ID4gSU1ITyB0aGUgZmFjdCB0aGF0IHRo ZSBmaXJzdCBhbmQgdGhpcmQgYmxvY2tzIGFyZSB0aGUgc2FtZSBkb2VzIG5vdAo+ID4gaW50ZXJm ZXJlIHdpdGggZGV2aWNlIGxpbmtzLgo+ID4gCj4gPiBIb25lc3RseSwgSSBjYW5ub3QgYmUgMTAw JSBzdXJlIGl0IHdvbid0IGJyZWFrIG9uIHFjb20gZGVzaWducywgbWF5YmUKPiA+IHRoZSBiZXN0 IHdvdWxkIGJlIHRvIGhhdmUgc29tZW9uZSB0byB0ZXN0LiBJIGRvbid0IGhhdmUgdGhlIHJlbGV2 YW50Cj4gPiBoYXJkd2FyZS4gRG8geW91PyBJdCB3b3VsZCBiZSByZWFsbHkgaGVscGZ1bCEKPiA+ IAo+ID4gVGhlcmUgaXMgYW4gZW50aXJlIFBDSWUgc2VyaWVzIGJsb2NrZWQsIHdhaXRpbmcgZm9y IHRoZXNlIGRldmljZSBsaW5rcwo+ID4gdG8gYmUgbWVyZ2VkIHNvIGl0IHdvdWxkIGhlbHAgYSBs b3QgaWYgc29tZW9uZSBjb3VsZCB0ZXN0Lgo+ID4gICAKPiAKPiBDb3VsZCB5b3Ugc2hhcmUgdGhl IHN0YXR1cyBvZiB0aGlzIHNlcmllcz8gV2lsbCBpdCBiZSBhcHBsaWVkIGZvciB0aGUKPiBuZXh0 IG1lcmdlIHdpbmRvdz8gSSB3b3VsZCByZWFsbHkgbGlrZSB0byBzZWUgdGhpcyBtb3ZpbmcgZm9y d2FyZC4KCkkga25vdyB0aGlzIHNlcmllcyBtaWdodCBoYXZlIHNpZGUgZWZmZWN0cyBkZXNwaXRl IHRoZSBjb25zZXF1ZW50CmFtb3VudCBvZiB0aW1lIHNwZW50IHRvIHdyaXRlIGFuZCB0ZXN0IGl0 LCBidXQgSSBhbHNvIHRoaW5rIHRoZQpjbGsgc3Vic3lzdGVtIHdvdWxkIHJlYWxseSBiZW5lZml0 IGZyb20gc3VjaCBjaGFuZ2UgYW5kIGhhbmRsaW5nCnN1c3BlbmQgdG8gUkFNIHN1cHBvcnQgd291 bGQgYmUgZ3JlYXRseSBlbmhhbmNlZC4gWW91IHNlZW1lZAppbnRlcmVzdGVkIGF0IGZpcnN0IGFu ZCBub3cgbm90IGFueW1vcmUsIGNvdWxkIEkga25vdyB3aHk/IEkgZ290Cmluc3BpcmVkIGJ5IHRo ZSByZWd1bGF0b3JzIHN1YnN5c3RlbS4gSXQgaXMgbm90IGFuIGlkZWEgb2YgbWluZQp0aGF0IGRl dmljZSBsaW5rcyBzaG91bGQgYmUgYnJpbmcgdG8gY2xvY2tzLiBSZWd1bGF0b3JzIGFyZSBhbG1v c3QKYXMgdXNlZCBhcyBjbG9ja3Mgc28gSSByZWFsbHkgdW5kZXJzdGFuZCB5b3VyIGZlYXJzIGJ1 dCB3aHkgbm90CmFwcGx5aW5nIHRoaXMgdG8gLW5leHQgdmVyeSBlYXJseSBkdXJpbmcgdGhlIC1y YyBjeWNsZXMgYW5kIHNlZQp3aGF0IGhhcHBlbnM/IFlvdSdsbCBoYXZlIHBsZW50eSBvZiB0aW1l IHRvIGFzayBtZSB0byBmaXggdGhpbmdzCm9yIGV2ZW4gZHJvcCBpdCBvZmYuCgpLaW5kIHJlZ2Fy ZHMsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK