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=-5.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FSL_HELO_FAKE,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 446BDC433EF for ; Thu, 23 Sep 2021 13:41:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 220EA60E76 for ; Thu, 23 Sep 2021 13:41:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241407AbhIWNnC (ORCPT ); Thu, 23 Sep 2021 09:43:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241253AbhIWNmv (ORCPT ); Thu, 23 Sep 2021 09:42:51 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 21EBCC061574 for ; Thu, 23 Sep 2021 06:41:20 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id u15so17325515wru.6 for ; Thu, 23 Sep 2021 06:41:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=n97jpOwzjyhCoVd9vlltvxz5/0o39tZOmH5FNWRSBJA=; b=ZjHBaTJuf7gbFODWJS2c/ERmfonZHKL4RfRXUpmt8NBJ65B7qDMuRvqLAiKbTnNqM7 UrJ7cktyoA+BPLAYVY+Yjvs2Hp9aqMxT/zX5lTofiqmrK874ro0T9pLu/+m06irUWk+p I4rGovrBxoQdIrkdsQZH9AVOFBC2EdhrqcQvBXSmAvkk1Oei2P9IVkTeoHHADplDd9/M BWOHIejmqvmbkOsIYz/9busjx2sj1Y57ERVuA50pwROMMEhbcwvdlO0lmT7CATfXB2Rv 2HLIzEbt97SzVsJFdqpGRvm6Ttzb6RKdE+npeRHfK5PWVELHXV4jEuk3JSpdlmvYI1+k a3bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=n97jpOwzjyhCoVd9vlltvxz5/0o39tZOmH5FNWRSBJA=; b=KFMian3ru/L8yHoyIZKRvUIRPQICph7mCL7KeBXz0Llv93bplL4qbfP+bYleMJHemH SSZobqabKnaH4uYoH5bZOcHevMmko+iPPC6LLBw1JfxMwdtpDPxu1yTsLu2y/TJJDkM2 0F51VtqarMqyBGg24x/YiiaKgPnsU8hK6iKWp5tZu+llJWu08wfyH1L47AvV3TB6Sj5f 5qx17HMWPirrMEZ408uDdMhMrR/6P5OE1YxCQMwI448BqwpawN1A84qDV/WSPbvqC9pp 5f4dSWeSKcWK3HvKOuWU8ZTIn2thSajeFMgT4ksrSQ2fy6/yWx9Z2unb47nR8qP0gKv6 5o0g== X-Gm-Message-State: AOAM531PGMe+7KneDSR7ha9E1uKA7OuvwimL98Gb069egZzD45JUuidC bkZYDXhaRza1qqtMit7EAQ+XJA== X-Google-Smtp-Source: ABdhPJx54k5rpYcwfEIU6k1OIBDHGX2hwSJH+SOIv2BKzor88w1+CXllOr7IYfNuaqMe41u/KvK3Dg== X-Received: by 2002:a1c:4c13:: with SMTP id z19mr4644942wmf.154.1632404478608; Thu, 23 Sep 2021 06:41:18 -0700 (PDT) Received: from google.com ([95.148.6.233]) by smtp.gmail.com with ESMTPSA id y18sm5278650wrq.6.2021.09.23.06.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Sep 2021 06:41:18 -0700 (PDT) Date: Thu, 23 Sep 2021 14:41:16 +0100 From: Lee Jones To: Krzysztof Kozlowski Cc: Will McVicker , Catalin Marinas , Will Deacon , "Cc: Android Kernel" , linux-arm-kernel@lists.infradead.org, Linux Kernel Mailing List , linux-samsung-soc@vger.kernel.org Subject: Re: [PATCH v1 2/4] soc: samsung: change SOC_SAMSUNG default config logic Message-ID: References: <20210920190350.3860821-1-willmcvicker@google.com> <20210920190350.3860821-3-willmcvicker@google.com> <2b48a41a-9130-b4cc-40d3-0bc7930ac76a@canonical.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 23 Sep 2021, Krzysztof Kozlowski wrote: > On 23/09/2021 14:39, Lee Jones wrote: > > On Tue, 21 Sep 2021, Krzysztof Kozlowski wrote: > > > >> On 21/09/2021 19:45, Will McVicker wrote: > >>> On Tue, Sep 21, 2021 at 1:19 AM Lee Jones wrote: > >>>> > >>>> On Tue, 21 Sep 2021, Krzysztof Kozlowski wrote: > >>>> > >>>>> On 20/09/2021 21:03, Will McVicker wrote: > >>>>>> Switch the default logic to enable SOC_SAMSUNG and it's sub-configs to > >>>>>> be enabled by default via "default y if ARCH_EXYNOS" versus being > >>>>>> selected by the ARCH_EXYNOS config directly. This allows vendors to > >>>>>> disable these configs if they wish and provides additional flexibility > >>>>>> to modularize them in the presence of a generic kernel. > >>>>> > >>>>> This is not true. Vendors cannot disable these options as they are not > >>>>> visible. > >>>> > >>>> Good point, well made. > >>>> > >>>>> Although I understand that Arnd prefers this way and I do not > >>>>> object it, but your explanation is incorrect. > >>> > >>> Thanks Krzysztof for the reviews! I'm sorry I missed the whole "hidden > >>> configs" part. I'll upload the series to include the fix that refactos > >>> the Samsung SoC drivers menuconfig which will address that and allow > >>> one to enable/disable those configs. I'm going to hold off though > >>> until we hash out the rest of the discussion in the cover letter > >>> email. > >> > >> No, please first read our discussions, including Lee's and Geert's > >> comments. The drivers should not be converted to modules or made visible > >> if such configuration does not work. If it works, please describe your > >> testing setup. > > > > Modules *should* work. William is going to try it out. > > > > Might need to lean-on for some testing on different H/W though. > > I can help, few other folks from Samsung can help as well. Thanks. I'd really appreciate it. > >> All these drivers are *necessary* for a multiplatform kernel supporting > >> Exynos platforms, therefore disabling them does not make any sense (if > >> you support Exynos platform). If your kernel does not support Exynos > >> platform, just do not select ARCH_EXYNOS and problem disappears because > >> none of these drivers will be visible and selected. > >> > >> Unless you describe here some out-of-tree kernel which wants > >> ARCH_EXYNOS, because vendor did not upstream it's code, but you do not > >> want existing Exynos upstream drivers. We do not support such > >> configuration. Please push your lovely vendor to work with upstream. > >> That's the only solution. > >> > >> It's the third time this abuse re-usage of ARCH_EXYNOS appears and the > >> same as before - the vendor does not like to upstream stuff. There are > >> few guys trying to upstream recent Samsung SoC support by themself (ping > >> me for contacts if you would like to participate) but the one party > >> which should be doing it - the lovely vendor - does not actually > >> participate and instead sends ridiculous patches like this one here... > >> or like this [1] [2]. > >> > >> Nope, please work with upstreaming SoC support, instead of abusing > >> ARCH_EXYNOS for out of tree code from the vendor. > > > > One of the on-going issues that GKI aims to solve pertains to the > > disparity between what upstream engineers would like to be upstreamed > > (i.e. everything) and what vendors can upstream (i.e. most things). > > > > The old Open Source vs Business (i.e. products/real-life) struggle! > > > > Vendors are not able to upstream all functionality right away, as it > > would give away their perceived edge on the competition (i.e. other > > vendors). This is something we just have to accept as it will *never* > > change. > > Sure, I understand. Balance, compromise, not perfectness. > > However now it is heavily in-balanced since vendor did upstream only one > change - UFS drivers for new SoC - since 2017. One change. Nothing else, > nothing for older SoC, nothing for newer. > > All other work is done by the community, not by the vendor. > > Not sure how to qualify Sam's Exynos850 work, but even if counting it, > there will be just two changes from vendor. > > This is not acceptable, this is not a balanced approach. Completely understand. Been there, got frustrated by that! However, GKI is your friend here, since it operates an upstream-first philosophy. Samsung would not be able to utilise GKI if its platform wasn't supported by upstream. Regardless of who did the work, (not my concern at this point) the platform is supported in Mainline. Volunteers (including Linaro) do a bunch of upstreaming on behalf of vendors, including some of the very largest/most successful. Sometimes that just the way it goes - try not to take it too personally. > > GKI attempts to solve this issue by providing a generic core > > containing all of the elements required to get every supported > > platform bootstrapped to a point where modules can be loaded and > > additional functionality can be brought in. GKI provides all of the > > modules available from the upstream kernel BUT allows them to be > > overwritten/swapped-out by modules containing code (new/shiny > > unreleased value-add) that the vendors do not wish to share (yet). > > > > Clever, eh! > > > > As I've explained before, the trigger for all of this was > > SERIAL_SAMSUNG which is required for early console on supported > > Samsung platforms i.e. this symbol *has* to be built-in. > > Actually SERIAL_SAMSUNG does not have to be built-in. It is necessary > for built-in only for debugging or development, not for real products. Right. And in the early stages, GKI is used for early (non-released) H/W (this is also the part of the reason these differences can't be upstreamed early/now/yet) and sometimes changes break things requiring low-level debugging techniques to solve (inc. early console). > Unlike other drivers which have to be built-in, e.g. clocks or pinctrl, > or heavily tested whether setup from initrd works. Plus not breaking > distros who like to have everything as module (solution from Geert?)... We don't know which drivers *need* to be built-in yet. Clocks is probably not a good example even, since the power-on default is most likely all-on, which is fine. Pinctrl remains to be seen. > > In order for > > this to built-in ARCH_EXYNOS has to be enabled due to the listed > > dependencies in Kconfig. And since ARCH_EXYNOS 'selects' all of these > > different extra symbols, it means they too will be built-in, meaning > > that a) the core binary will be unnecessarily bloated and b) vendors > > who wish to overwrite/replace this functionality with their > > non-shareable value-add, are not able to do so. > > I am sorry, but this is not reflecting status we want to have in > usptream. Everything selected by ARCH_EXYNOS *has to be selected* for > supported platforms. Since vendor does not contribute anything new > (except mentioned one work for UFS), we are not going to sacrifice > supported mainline platforms for a non-cooperative out-of-tree unknown > platforms. The is the part of the discussion that is the most contentious. Ideally we wouldn't have to enable any ARCH_* explicitly. Greg has mentioned this publicly on a number of discussions. However, removing the dependencies (from Kconfig in this case) is in contention with other user's use-cases. No one wants to be asked seemingly irrelevant configuration questions during the config stages of a kernel build. So we are forced to enable ARCH_* to have our requirements built-in (ARCH_EXYNOS for SAMSUNG_SERIAL [early console] in this case). Unfortunately, this comes with additional cruft that we *might* not want (resulting in bloat) or that we wish to overwrite with more featureful driver modules. We can't do that if these features are built-in. Please don't make this discussion about particular vendors. Bringing in emotional feelings pertaining to specific companies or individuals does not make for a quality level-headed technical discussion. The principles I'm discussing here are vendor agnostic. > > Going forward, it sounds like the best approach that will make > > everyone happy, providing it's technically feasible, is to enable > > these added (sometimes required, other times superfluous) symbols as > > loadable modules. > > Not entirely. What actually would make everyone happy and it is still > technically feasible is for a multi-billion company with thousands of > engineers to contribute something. Let's start with a little bit. From > billions of dollars and thousands of engineers we won't expect too much, > right? I understand your frustration, but it's orthogonal to this discussion. -- Lee Jones [李琼斯] Senior Technical Lead - Developer Services Linaro.org │ Open source software for Arm SoCs Follow Linaro: Facebook | Twitter | Blog 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=-5.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,FSL_HELO_FAKE,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 C4CC1C433F5 for ; Thu, 23 Sep 2021 13:43:44 +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 89C0F60F24 for ; Thu, 23 Sep 2021 13:43:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 89C0F60F24 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org 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=bAjZ2Vzz9Y24ysXagEkHVi0InhiWidCQPayBb8o8gQk=; b=r5rYpWxp4zIWs+ m00JyeLG9d61I0TWR5DkuLWqkq1kuggJHFyoKSL7UiwwymhEcIj2Gr2lWZNcAIB1+ajNphSj+yyZc OMuer0jmaIIg3Z8HDtEoFB7H7nXQ4hfxSCini9AC1z4AIF4gv9SMHOeVqgWIOTfsQm18LnjgNguKC BDW6SMRMIXcGG2tRccJbQ4yN/N5+OMLAW3xwED7FSkBozuVu1kmFy5Z0Lw4ghBZ+U1hUz3TNWwxiG cQEVvI/+XHG+an3uwTkIWvcxyMW3vcEw1v1JE81sBAZiCDO7RjK30Hkx+rCidwzUlQ5JFCyLNQdYI +l0V6sV5zt1tHZ3MkOGA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mTOzH-00BhzK-1k; Thu, 23 Sep 2021 13:42:08 +0000 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mTOyW-00BhhK-K0 for linux-arm-kernel@lists.infradead.org; Thu, 23 Sep 2021 13:41:23 +0000 Received: by mail-wr1-x434.google.com with SMTP id i23so17432041wrb.2 for ; Thu, 23 Sep 2021 06:41:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=n97jpOwzjyhCoVd9vlltvxz5/0o39tZOmH5FNWRSBJA=; b=ZjHBaTJuf7gbFODWJS2c/ERmfonZHKL4RfRXUpmt8NBJ65B7qDMuRvqLAiKbTnNqM7 UrJ7cktyoA+BPLAYVY+Yjvs2Hp9aqMxT/zX5lTofiqmrK874ro0T9pLu/+m06irUWk+p I4rGovrBxoQdIrkdsQZH9AVOFBC2EdhrqcQvBXSmAvkk1Oei2P9IVkTeoHHADplDd9/M BWOHIejmqvmbkOsIYz/9busjx2sj1Y57ERVuA50pwROMMEhbcwvdlO0lmT7CATfXB2Rv 2HLIzEbt97SzVsJFdqpGRvm6Ttzb6RKdE+npeRHfK5PWVELHXV4jEuk3JSpdlmvYI1+k a3bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=n97jpOwzjyhCoVd9vlltvxz5/0o39tZOmH5FNWRSBJA=; b=DfdfPm1TV+/bRRlIewxl8oRwz09a7Wzc9mRsYOlrpT/ZBxgze97/3nqTOiHT8MQee0 FHvII5IA5BsUCQGKlrlWHSdHlWlbzEl6i4FyYuMBqDLMgRV+ndycKE+f+SGCL3P6RC3h hytXsz7+tplLRTHI6ueZ/tYjKYtymRtlKXEV7XoGqm3Q1+BeVl9VB/7ddWl8EHRZ5lK4 1JBX4JxH0CmPXDFCueb4EnuzetAj2bGXAjq7i7DzUT+Nsrvf1Aw8dwhx9FN8Kyql1SAt NQfwuKRqDxo4CD1k+klb50JKoegUeAz2TuNyB4BinmY88MMwE96vPTbTCxAaTdms9wny +1Ag== X-Gm-Message-State: AOAM532l8yyX6UOiiBL9jkZ3OoPE6K4np0CUPpC20++ySUTU0R4ezxyL 7Fpf2DVhuICbKmy21ZmttoySMw== X-Google-Smtp-Source: ABdhPJx54k5rpYcwfEIU6k1OIBDHGX2hwSJH+SOIv2BKzor88w1+CXllOr7IYfNuaqMe41u/KvK3Dg== X-Received: by 2002:a1c:4c13:: with SMTP id z19mr4644942wmf.154.1632404478608; Thu, 23 Sep 2021 06:41:18 -0700 (PDT) Received: from google.com ([95.148.6.233]) by smtp.gmail.com with ESMTPSA id y18sm5278650wrq.6.2021.09.23.06.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Sep 2021 06:41:18 -0700 (PDT) Date: Thu, 23 Sep 2021 14:41:16 +0100 From: Lee Jones To: Krzysztof Kozlowski Cc: Will McVicker , Catalin Marinas , Will Deacon , "Cc: Android Kernel" , linux-arm-kernel@lists.infradead.org, Linux Kernel Mailing List , linux-samsung-soc@vger.kernel.org Subject: Re: [PATCH v1 2/4] soc: samsung: change SOC_SAMSUNG default config logic Message-ID: References: <20210920190350.3860821-1-willmcvicker@google.com> <20210920190350.3860821-3-willmcvicker@google.com> <2b48a41a-9130-b4cc-40d3-0bc7930ac76a@canonical.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-20210923_064120_763706_358FFE50 X-CRM114-Status: GOOD ( 58.83 ) 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 T24gVGh1LCAyMyBTZXAgMjAyMSwgS3J6eXN6dG9mIEtvemxvd3NraSB3cm90ZToKCj4gT24gMjMv MDkvMjAyMSAxNDozOSwgTGVlIEpvbmVzIHdyb3RlOgo+ID4gT24gVHVlLCAyMSBTZXAgMjAyMSwg S3J6eXN6dG9mIEtvemxvd3NraSB3cm90ZToKPiA+IAo+ID4+IE9uIDIxLzA5LzIwMjEgMTk6NDUs IFdpbGwgTWNWaWNrZXIgd3JvdGU6Cj4gPj4+IE9uIFR1ZSwgU2VwIDIxLCAyMDIxIGF0IDE6MTkg QU0gTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4gd3JvdGU6Cj4gPj4+Pgo+ID4+Pj4g T24gVHVlLCAyMSBTZXAgMjAyMSwgS3J6eXN6dG9mIEtvemxvd3NraSB3cm90ZToKPiA+Pj4+Cj4g Pj4+Pj4gT24gMjAvMDkvMjAyMSAyMTowMywgV2lsbCBNY1ZpY2tlciB3cm90ZToKPiA+Pj4+Pj4g U3dpdGNoIHRoZSBkZWZhdWx0IGxvZ2ljIHRvIGVuYWJsZSBTT0NfU0FNU1VORyBhbmQgaXQncyBz dWItY29uZmlncyB0bwo+ID4+Pj4+PiBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgdmlhICJkZWZhdWx0 IHkgaWYgQVJDSF9FWFlOT1MiIHZlcnN1cyBiZWluZwo+ID4+Pj4+PiBzZWxlY3RlZCBieSB0aGUg QVJDSF9FWFlOT1MgY29uZmlnIGRpcmVjdGx5LiBUaGlzIGFsbG93cyB2ZW5kb3JzIHRvCj4gPj4+ Pj4+IGRpc2FibGUgdGhlc2UgY29uZmlncyBpZiB0aGV5IHdpc2ggYW5kIHByb3ZpZGVzIGFkZGl0 aW9uYWwgZmxleGliaWxpdHkKPiA+Pj4+Pj4gdG8gbW9kdWxhcml6ZSB0aGVtIGluIHRoZSBwcmVz ZW5jZSBvZiBhIGdlbmVyaWMga2VybmVsLgo+ID4+Pj4+Cj4gPj4+Pj4gVGhpcyBpcyBub3QgdHJ1 ZS4gVmVuZG9ycyBjYW5ub3QgZGlzYWJsZSB0aGVzZSBvcHRpb25zIGFzIHRoZXkgYXJlIG5vdAo+ ID4+Pj4+IHZpc2libGUuCj4gPj4+Pgo+ID4+Pj4gR29vZCBwb2ludCwgd2VsbCBtYWRlLgo+ID4+ Pj4KPiA+Pj4+PiBBbHRob3VnaCBJIHVuZGVyc3RhbmQgdGhhdCBBcm5kIHByZWZlcnMgdGhpcyB3 YXkgYW5kIEkgZG8gbm90Cj4gPj4+Pj4gb2JqZWN0IGl0LCBidXQgeW91ciBleHBsYW5hdGlvbiBp cyBpbmNvcnJlY3QuCj4gPj4+Cj4gPj4+IFRoYW5rcyBLcnp5c3p0b2YgZm9yIHRoZSByZXZpZXdz ISBJJ20gc29ycnkgSSBtaXNzZWQgdGhlIHdob2xlICJoaWRkZW4KPiA+Pj4gY29uZmlncyIgcGFy dC4gSSdsbCB1cGxvYWQgdGhlIHNlcmllcyB0byBpbmNsdWRlIHRoZSBmaXggdGhhdCByZWZhY3Rv cwo+ID4+PiB0aGUgU2Ftc3VuZyBTb0MgZHJpdmVycyBtZW51Y29uZmlnIHdoaWNoIHdpbGwgYWRk cmVzcyB0aGF0IGFuZCBhbGxvdwo+ID4+PiBvbmUgdG8gZW5hYmxlL2Rpc2FibGUgdGhvc2UgY29u Zmlncy4gSSdtIGdvaW5nIHRvIGhvbGQgb2ZmIHRob3VnaAo+ID4+PiB1bnRpbCB3ZSBoYXNoIG91 dCB0aGUgcmVzdCBvZiB0aGUgZGlzY3Vzc2lvbiBpbiB0aGUgY292ZXIgbGV0dGVyCj4gPj4+IGVt YWlsLgo+ID4+Cj4gPj4gTm8sIHBsZWFzZSBmaXJzdCByZWFkIG91ciBkaXNjdXNzaW9ucywgaW5j bHVkaW5nIExlZSdzIGFuZCBHZWVydCdzCj4gPj4gY29tbWVudHMuIFRoZSBkcml2ZXJzIHNob3Vs ZCBub3QgYmUgY29udmVydGVkIHRvIG1vZHVsZXMgb3IgbWFkZSB2aXNpYmxlCj4gPj4gaWYgc3Vj aCBjb25maWd1cmF0aW9uIGRvZXMgbm90IHdvcmsuIElmIGl0IHdvcmtzLCBwbGVhc2UgZGVzY3Jp YmUgeW91cgo+ID4+IHRlc3Rpbmcgc2V0dXAuCj4gPiAKPiA+IE1vZHVsZXMgKnNob3VsZCogd29y ay4gIFdpbGxpYW0gaXMgZ29pbmcgdG8gdHJ5IGl0IG91dC4KPiA+IAo+ID4gTWlnaHQgbmVlZCB0 byBsZWFuLW9uIGZvciBzb21lIHRlc3Rpbmcgb24gZGlmZmVyZW50IEgvVyB0aG91Z2guCj4gCj4g SSBjYW4gaGVscCwgZmV3IG90aGVyIGZvbGtzIGZyb20gU2Ftc3VuZyBjYW4gaGVscCBhcyB3ZWxs LgoKVGhhbmtzLiAgSSdkIHJlYWxseSBhcHByZWNpYXRlIGl0LgoKPiA+PiBBbGwgdGhlc2UgZHJp dmVycyBhcmUgKm5lY2Vzc2FyeSogZm9yIGEgbXVsdGlwbGF0Zm9ybSBrZXJuZWwgc3VwcG9ydGlu Zwo+ID4+IEV4eW5vcyBwbGF0Zm9ybXMsIHRoZXJlZm9yZSBkaXNhYmxpbmcgdGhlbSBkb2VzIG5v dCBtYWtlIGFueSBzZW5zZSAoaWYKPiA+PiB5b3Ugc3VwcG9ydCBFeHlub3MgcGxhdGZvcm0pLiBJ ZiB5b3VyIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IEV4eW5vcwo+ID4+IHBsYXRmb3JtLCBqdXN0 IGRvIG5vdCBzZWxlY3QgQVJDSF9FWFlOT1MgYW5kIHByb2JsZW0gZGlzYXBwZWFycyBiZWNhdXNl Cj4gPj4gbm9uZSBvZiB0aGVzZSBkcml2ZXJzIHdpbGwgYmUgdmlzaWJsZSBhbmQgc2VsZWN0ZWQu Cj4gPj4KPiA+PiBVbmxlc3MgeW91IGRlc2NyaWJlIGhlcmUgc29tZSBvdXQtb2YtdHJlZSBrZXJu ZWwgd2hpY2ggd2FudHMKPiA+PiBBUkNIX0VYWU5PUywgYmVjYXVzZSB2ZW5kb3IgZGlkIG5vdCB1 cHN0cmVhbSBpdCdzIGNvZGUsIGJ1dCB5b3UgZG8gbm90Cj4gPj4gd2FudCBleGlzdGluZyBFeHlu b3MgdXBzdHJlYW0gZHJpdmVycy4gV2UgZG8gbm90IHN1cHBvcnQgc3VjaAo+ID4+IGNvbmZpZ3Vy YXRpb24uIFBsZWFzZSBwdXNoIHlvdXIgbG92ZWx5IHZlbmRvciB0byB3b3JrIHdpdGggdXBzdHJl YW0uCj4gPj4gVGhhdCdzIHRoZSBvbmx5IHNvbHV0aW9uLgo+ID4+Cj4gPj4gSXQncyB0aGUgdGhp cmQgdGltZSB0aGlzIGFidXNlIHJlLXVzYWdlIG9mIEFSQ0hfRVhZTk9TIGFwcGVhcnMgYW5kIHRo ZQo+ID4+IHNhbWUgYXMgYmVmb3JlIC0gdGhlIHZlbmRvciBkb2VzIG5vdCBsaWtlIHRvIHVwc3Ry ZWFtIHN0dWZmLiBUaGVyZSBhcmUKPiA+PiBmZXcgZ3V5cyB0cnlpbmcgdG8gdXBzdHJlYW0gcmVj ZW50IFNhbXN1bmcgU29DIHN1cHBvcnQgYnkgdGhlbXNlbGYgKHBpbmcKPiA+PiBtZSBmb3IgY29u dGFjdHMgaWYgeW91IHdvdWxkIGxpa2UgdG8gcGFydGljaXBhdGUpIGJ1dCB0aGUgb25lIHBhcnR5 Cj4gPj4gd2hpY2ggc2hvdWxkIGJlIGRvaW5nIGl0IC0gdGhlIGxvdmVseSB2ZW5kb3IgLSBkb2Vz IG5vdCBhY3R1YWxseQo+ID4+IHBhcnRpY2lwYXRlIGFuZCBpbnN0ZWFkIHNlbmRzIHJpZGljdWxv dXMgcGF0Y2hlcyBsaWtlIHRoaXMgb25lIGhlcmUuLi4KPiA+PiBvciBsaWtlIHRoaXMgWzFdIFsy XS4KPiA+Pgo+ID4+IE5vcGUsIHBsZWFzZSB3b3JrIHdpdGggdXBzdHJlYW1pbmcgU29DIHN1cHBv cnQsIGluc3RlYWQgb2YgYWJ1c2luZwo+ID4+IEFSQ0hfRVhZTk9TIGZvciBvdXQgb2YgdHJlZSBj b2RlIGZyb20gdGhlIHZlbmRvci4KPiA+IAo+ID4gT25lIG9mIHRoZSBvbi1nb2luZyBpc3N1ZXMg dGhhdCBHS0kgYWltcyB0byBzb2x2ZSBwZXJ0YWlucyB0byB0aGUKPiA+IGRpc3Bhcml0eSBiZXR3 ZWVuIHdoYXQgdXBzdHJlYW0gZW5naW5lZXJzIHdvdWxkIGxpa2UgdG8gYmUgdXBzdHJlYW1lZAo+ ID4gKGkuZS4gZXZlcnl0aGluZykgYW5kIHdoYXQgdmVuZG9ycyBjYW4gdXBzdHJlYW0gKGkuZS4g bW9zdCB0aGluZ3MpLgo+ID4gCj4gPiBUaGUgb2xkIE9wZW4gU291cmNlIHZzIEJ1c2luZXNzIChp LmUuIHByb2R1Y3RzL3JlYWwtbGlmZSkgc3RydWdnbGUhCj4gPiAKPiA+IFZlbmRvcnMgYXJlIG5v dCBhYmxlIHRvIHVwc3RyZWFtIGFsbCBmdW5jdGlvbmFsaXR5IHJpZ2h0IGF3YXksIGFzIGl0Cj4g PiB3b3VsZCBnaXZlIGF3YXkgdGhlaXIgcGVyY2VpdmVkIGVkZ2Ugb24gdGhlIGNvbXBldGl0aW9u IChpLmUuIG90aGVyCj4gPiB2ZW5kb3JzKS4gIFRoaXMgaXMgc29tZXRoaW5nIHdlIGp1c3QgaGF2 ZSB0byBhY2NlcHQgYXMgaXQgd2lsbCAqbmV2ZXIqCj4gPiBjaGFuZ2UuCj4gCj4gU3VyZSwgSSB1 bmRlcnN0YW5kLiBCYWxhbmNlLCBjb21wcm9taXNlLCBub3QgcGVyZmVjdG5lc3MuCj4gCj4gSG93 ZXZlciBub3cgaXQgaXMgaGVhdmlseSBpbi1iYWxhbmNlZCBzaW5jZSB2ZW5kb3IgZGlkIHVwc3Ry ZWFtIG9ubHkgb25lCj4gY2hhbmdlIC0gVUZTIGRyaXZlcnMgZm9yIG5ldyBTb0MgLSBzaW5jZSAy MDE3LiBPbmUgY2hhbmdlLiBOb3RoaW5nIGVsc2UsCj4gbm90aGluZyBmb3Igb2xkZXIgU29DLCBu b3RoaW5nIGZvciBuZXdlci4KPiAKPiBBbGwgb3RoZXIgd29yayBpcyBkb25lIGJ5IHRoZSBjb21t dW5pdHksIG5vdCBieSB0aGUgdmVuZG9yLgo+IAo+IE5vdCBzdXJlIGhvdyB0byBxdWFsaWZ5IFNh bSdzIEV4eW5vczg1MCB3b3JrLCBidXQgZXZlbiBpZiBjb3VudGluZyBpdCwKPiB0aGVyZSB3aWxs IGJlIGp1c3QgdHdvIGNoYW5nZXMgZnJvbSB2ZW5kb3IuCj4gCj4gVGhpcyBpcyBub3QgYWNjZXB0 YWJsZSwgdGhpcyBpcyBub3QgYSBiYWxhbmNlZCBhcHByb2FjaC4KCkNvbXBsZXRlbHkgdW5kZXJz dGFuZC4gIEJlZW4gdGhlcmUsIGdvdCBmcnVzdHJhdGVkIGJ5IHRoYXQhCgpIb3dldmVyLCBHS0kg aXMgeW91ciBmcmllbmQgaGVyZSwgc2luY2UgaXQgb3BlcmF0ZXMgYW4gdXBzdHJlYW0tZmlyc3QK cGhpbG9zb3BoeS4gIFNhbXN1bmcgd291bGQgbm90IGJlIGFibGUgdG8gdXRpbGlzZSBHS0kgaWYg aXRzIHBsYXRmb3JtCndhc24ndCBzdXBwb3J0ZWQgYnkgdXBzdHJlYW0uICBSZWdhcmRsZXNzIG9m IHdobyBkaWQgdGhlIHdvcmssIChub3QgbXkKY29uY2VybiBhdCB0aGlzIHBvaW50KSB0aGUgcGxh dGZvcm0gaXMgc3VwcG9ydGVkIGluIE1haW5saW5lLgoKVm9sdW50ZWVycyAoaW5jbHVkaW5nIExp bmFybykgZG8gYSBidW5jaCBvZiB1cHN0cmVhbWluZyBvbiBiZWhhbGYgb2YKdmVuZG9ycywgaW5j bHVkaW5nIHNvbWUgb2YgdGhlIHZlcnkgbGFyZ2VzdC9tb3N0IHN1Y2Nlc3NmdWwuClNvbWV0aW1l cyB0aGF0IGp1c3QgdGhlIHdheSBpdCBnb2VzIC0gdHJ5IG5vdCB0byB0YWtlIGl0IHRvbwpwZXJz b25hbGx5LgoKPiA+IEdLSSBhdHRlbXB0cyB0byBzb2x2ZSB0aGlzIGlzc3VlIGJ5IHByb3ZpZGlu ZyBhIGdlbmVyaWMgY29yZQo+ID4gY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIHJlcXVp cmVkIHRvIGdldCBldmVyeSBzdXBwb3J0ZWQKPiA+IHBsYXRmb3JtIGJvb3RzdHJhcHBlZCB0byBh IHBvaW50IHdoZXJlIG1vZHVsZXMgY2FuIGJlIGxvYWRlZCBhbmQKPiA+IGFkZGl0aW9uYWwgZnVu Y3Rpb25hbGl0eSBjYW4gYmUgYnJvdWdodCBpbi4gIEdLSSBwcm92aWRlcyBhbGwgb2YgdGhlCj4g PiBtb2R1bGVzIGF2YWlsYWJsZSBmcm9tIHRoZSB1cHN0cmVhbSBrZXJuZWwgQlVUIGFsbG93cyB0 aGVtIHRvIGJlCj4gPiBvdmVyd3JpdHRlbi9zd2FwcGVkLW91dCBieSBtb2R1bGVzIGNvbnRhaW5p bmcgY29kZSAobmV3L3NoaW55Cj4gPiB1bnJlbGVhc2VkIHZhbHVlLWFkZCkgdGhhdCB0aGUgdmVu ZG9ycyBkbyBub3Qgd2lzaCB0byBzaGFyZSAoeWV0KS4KPiA+IAo+ID4gQ2xldmVyLCBlaCEKPiA+ IAo+ID4gQXMgSSd2ZSBleHBsYWluZWQgYmVmb3JlLCB0aGUgdHJpZ2dlciBmb3IgYWxsIG9mIHRo aXMgd2FzCj4gPiBTRVJJQUxfU0FNU1VORyB3aGljaCBpcyByZXF1aXJlZCBmb3IgZWFybHkgY29u c29sZSBvbiBzdXBwb3J0ZWQKPiA+IFNhbXN1bmcgcGxhdGZvcm1zIGkuZS4gdGhpcyBzeW1ib2wg KmhhcyogdG8gYmUgYnVpbHQtaW4uICAKPiAKPiBBY3R1YWxseSBTRVJJQUxfU0FNU1VORyBkb2Vz IG5vdCBoYXZlIHRvIGJlIGJ1aWx0LWluLiBJdCBpcyBuZWNlc3NhcnkKPiBmb3IgYnVpbHQtaW4g b25seSBmb3IgZGVidWdnaW5nIG9yIGRldmVsb3BtZW50LCBub3QgZm9yIHJlYWwgcHJvZHVjdHMu CgpSaWdodC4gIEFuZCBpbiB0aGUgZWFybHkgc3RhZ2VzLCBHS0kgaXMgdXNlZCBmb3IgZWFybHkg KG5vbi1yZWxlYXNlZCkKSC9XICh0aGlzIGlzIGFsc28gdGhlIHBhcnQgb2YgdGhlIHJlYXNvbiB0 aGVzZSBkaWZmZXJlbmNlcyBjYW4ndCBiZQp1cHN0cmVhbWVkIGVhcmx5L25vdy95ZXQpIGFuZCBz b21ldGltZXMgY2hhbmdlcyBicmVhayB0aGluZ3MgcmVxdWlyaW5nCmxvdy1sZXZlbCBkZWJ1Z2dp bmcgdGVjaG5pcXVlcyB0byBzb2x2ZSAoaW5jLiBlYXJseSBjb25zb2xlKS4KCj4gVW5saWtlIG90 aGVyIGRyaXZlcnMgd2hpY2ggaGF2ZSB0byBiZSBidWlsdC1pbiwgZS5nLiBjbG9ja3Mgb3IgcGlu Y3RybCwKPiBvciBoZWF2aWx5IHRlc3RlZCB3aGV0aGVyIHNldHVwIGZyb20gaW5pdHJkIHdvcmtz LiBQbHVzIG5vdCBicmVha2luZwo+IGRpc3Ryb3Mgd2hvIGxpa2UgdG8gaGF2ZSBldmVyeXRoaW5n IGFzIG1vZHVsZSAoc29sdXRpb24gZnJvbSBHZWVydD8pLi4uCgpXZSBkb24ndCBrbm93IHdoaWNo IGRyaXZlcnMgKm5lZWQqIHRvIGJlIGJ1aWx0LWluIHlldC4KCkNsb2NrcyBpcyBwcm9iYWJseSBu b3QgYSBnb29kIGV4YW1wbGUgZXZlbiwgc2luY2UgdGhlIHBvd2VyLW9uIGRlZmF1bHQKaXMgbW9z dCBsaWtlbHkgYWxsLW9uLCB3aGljaCBpcyBmaW5lLiAgUGluY3RybCByZW1haW5zIHRvIGJlIHNl ZW4uCgo+ID4gSW4gb3JkZXIgZm9yCj4gPiB0aGlzIHRvIGJ1aWx0LWluIEFSQ0hfRVhZTk9TIGhh cyB0byBiZSBlbmFibGVkIGR1ZSB0byB0aGUgbGlzdGVkCj4gPiBkZXBlbmRlbmNpZXMgaW4gS2Nv bmZpZy4gIEFuZCBzaW5jZSBBUkNIX0VYWU5PUyAnc2VsZWN0cycgYWxsIG9mIHRoZXNlCj4gPiBk aWZmZXJlbnQgZXh0cmEgc3ltYm9scywgaXQgbWVhbnMgdGhleSB0b28gd2lsbCBiZSBidWlsdC1p biwgbWVhbmluZwo+ID4gdGhhdCBhKSB0aGUgY29yZSBiaW5hcnkgd2lsbCBiZSB1bm5lY2Vzc2Fy aWx5IGJsb2F0ZWQgYW5kIGIpIHZlbmRvcnMKPiA+IHdobyB3aXNoIHRvIG92ZXJ3cml0ZS9yZXBs YWNlIHRoaXMgZnVuY3Rpb25hbGl0eSB3aXRoIHRoZWlyCj4gPiBub24tc2hhcmVhYmxlIHZhbHVl LWFkZCwgYXJlIG5vdCBhYmxlIHRvIGRvIHNvLgo+IAo+IEkgYW0gc29ycnksIGJ1dCB0aGlzIGlz IG5vdCByZWZsZWN0aW5nIHN0YXR1cyB3ZSB3YW50IHRvIGhhdmUgaW4KPiB1c3B0cmVhbS4gRXZl cnl0aGluZyBzZWxlY3RlZCBieSBBUkNIX0VYWU5PUyAqaGFzIHRvIGJlIHNlbGVjdGVkKiBmb3IK PiBzdXBwb3J0ZWQgcGxhdGZvcm1zLiBTaW5jZSB2ZW5kb3IgZG9lcyBub3QgY29udHJpYnV0ZSBh bnl0aGluZyBuZXcKPiAoZXhjZXB0IG1lbnRpb25lZCBvbmUgd29yayBmb3IgVUZTKSwgd2UgYXJl IG5vdCBnb2luZyB0byBzYWNyaWZpY2UKPiBzdXBwb3J0ZWQgbWFpbmxpbmUgcGxhdGZvcm1zIGZv ciBhIG5vbi1jb29wZXJhdGl2ZSBvdXQtb2YtdHJlZSB1bmtub3duCj4gcGxhdGZvcm1zLgoKVGhl IGlzIHRoZSBwYXJ0IG9mIHRoZSBkaXNjdXNzaW9uIHRoYXQgaXMgdGhlIG1vc3QgY29udGVudGlv dXMuCgpJZGVhbGx5IHdlIHdvdWxkbid0IGhhdmUgdG8gZW5hYmxlIGFueSBBUkNIXyogZXhwbGlj aXRseS4gIEdyZWcgaGFzCm1lbnRpb25lZCB0aGlzIHB1YmxpY2x5IG9uIGEgbnVtYmVyIG9mIGRp c2N1c3Npb25zLiAgSG93ZXZlciwgcmVtb3ZpbmcKdGhlIGRlcGVuZGVuY2llcyAoZnJvbSBLY29u ZmlnIGluIHRoaXMgY2FzZSkgaXMgaW4gY29udGVudGlvbiB3aXRoCm90aGVyIHVzZXIncyB1c2Ut Y2FzZXMuICBObyBvbmUgd2FudHMgdG8gYmUgYXNrZWQgc2VlbWluZ2x5IGlycmVsZXZhbnQKY29u ZmlndXJhdGlvbiBxdWVzdGlvbnMgZHVyaW5nIHRoZSBjb25maWcgc3RhZ2VzIG9mIGEga2VybmVs IGJ1aWxkLgoKU28gd2UgYXJlIGZvcmNlZCB0byBlbmFibGUgQVJDSF8qIHRvIGhhdmUgb3VyIHJl cXVpcmVtZW50cyBidWlsdC1pbgooQVJDSF9FWFlOT1MgZm9yIFNBTVNVTkdfU0VSSUFMIFtlYXJs eSBjb25zb2xlXSBpbiB0aGlzIGNhc2UpLgpVbmZvcnR1bmF0ZWx5LCB0aGlzIGNvbWVzIHdpdGgg YWRkaXRpb25hbCBjcnVmdCB0aGF0IHdlICptaWdodCogbm90CndhbnQgKHJlc3VsdGluZyBpbiBi bG9hdCkgb3IgdGhhdCB3ZSB3aXNoIHRvIG92ZXJ3cml0ZSB3aXRoIG1vcmUKZmVhdHVyZWZ1bCBk cml2ZXIgbW9kdWxlcy4gIFdlIGNhbid0IGRvIHRoYXQgaWYgdGhlc2UgZmVhdHVyZXMgYXJlCmJ1 aWx0LWluLgoKUGxlYXNlIGRvbid0IG1ha2UgdGhpcyBkaXNjdXNzaW9uIGFib3V0IHBhcnRpY3Vs YXIgdmVuZG9ycy4gIEJyaW5naW5nCmluIGVtb3Rpb25hbCBmZWVsaW5ncyBwZXJ0YWluaW5nIHRv IHNwZWNpZmljIGNvbXBhbmllcyBvciBpbmRpdmlkdWFscwpkb2VzIG5vdCBtYWtlIGZvciBhIHF1 YWxpdHkgbGV2ZWwtaGVhZGVkIHRlY2huaWNhbCBkaXNjdXNzaW9uLgoKVGhlIHByaW5jaXBsZXMg SSdtIGRpc2N1c3NpbmcgaGVyZSBhcmUgdmVuZG9yIGFnbm9zdGljLgoKPiA+IEdvaW5nIGZvcndh cmQsIGl0IHNvdW5kcyBsaWtlIHRoZSBiZXN0IGFwcHJvYWNoIHRoYXQgd2lsbCBtYWtlCj4gPiBl dmVyeW9uZSBoYXBweSwgcHJvdmlkaW5nIGl0J3MgdGVjaG5pY2FsbHkgZmVhc2libGUsIGlzIHRv IGVuYWJsZQo+ID4gdGhlc2UgYWRkZWQgKHNvbWV0aW1lcyByZXF1aXJlZCwgb3RoZXIgdGltZXMg c3VwZXJmbHVvdXMpIHN5bWJvbHMgYXMKPiA+IGxvYWRhYmxlIG1vZHVsZXMuCj4gCj4gTm90IGVu dGlyZWx5LiBXaGF0IGFjdHVhbGx5IHdvdWxkIG1ha2UgZXZlcnlvbmUgaGFwcHkgYW5kIGl0IGlz IHN0aWxsCj4gdGVjaG5pY2FsbHkgZmVhc2libGUgaXMgZm9yIGEgbXVsdGktYmlsbGlvbiBjb21w YW55IHdpdGggdGhvdXNhbmRzIG9mCj4gZW5naW5lZXJzIHRvIGNvbnRyaWJ1dGUgc29tZXRoaW5n LiBMZXQncyBzdGFydCB3aXRoIGEgbGl0dGxlIGJpdC4gRnJvbQo+IGJpbGxpb25zIG9mIGRvbGxh cnMgYW5kIHRob3VzYW5kcyBvZiBlbmdpbmVlcnMgd2Ugd29uJ3QgZXhwZWN0IHRvbyBtdWNoLAo+ IHJpZ2h0PwoKSSB1bmRlcnN0YW5kIHlvdXIgZnJ1c3RyYXRpb24sIGJ1dCBpdCdzIG9ydGhvZ29u YWwgdG8gdGhpcyBkaXNjdXNzaW9uLgoKLS0gCkxlZSBKb25lcyBb5p2O55C85pavXQpTZW5pb3Ig VGVjaG5pY2FsIExlYWQgLSBEZXZlbG9wZXIgU2VydmljZXMKTGluYXJvLm9yZyDilIIgT3BlbiBz b3VyY2Ugc29mdHdhcmUgZm9yIEFybSBTb0NzCkZvbGxvdyBMaW5hcm86IEZhY2Vib29rIHwgVHdp dHRlciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK