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=-11.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham 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 E2C1AC2D0E2 for ; Tue, 22 Sep 2020 21:30:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 956AF20757 for ; Tue, 22 Sep 2020 21:30:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Pj5qOVxM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726706AbgIVVax (ORCPT ); Tue, 22 Sep 2020 17:30:53 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:31474 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726179AbgIVVaw (ORCPT ); Tue, 22 Sep 2020 17:30:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600810248; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=Pj5qOVxMfuBr76rBPOC3afb9Wz/9yz2SKmu99diIEuxlqqA+4hozTUouJ8OXO7ZEi49x3P utW87vYdOcYDjJamz2m+bOw2QI3AxLld5a9pev9SC7gz6zt0oS80L/ddEja8cvodK/AJ7I UMaFCug1uAQm8pQBpwhqD6FoYo0L0O0= Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-263-1PoqiBb_PiuwDQUu6li0Kw-1; Tue, 22 Sep 2020 17:30:42 -0400 X-MC-Unique: 1PoqiBb_PiuwDQUu6li0Kw-1 Received: by mail-qt1-f198.google.com with SMTP id a16so17314029qtj.7 for ; Tue, 22 Sep 2020 14:30:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=RbDeKMFRVIxcBDMeQ48mjuk//n1n5daf7SSXYPkOyS44vinZREWPsM10e9CB03/vBj Hhu416x8ySpqEZT62g2dTSGzvxttTBOWyl9bWLQP9CD6+I78oQPgwP1w2p49vyehC/FM 93rzbIFQxlfe15dnmv5brXFoh8K2EiAKrizPiHCisHAIY+ItJ6IZi7rAfQVxGmwA5TC6 YISzyS0g1us7gPkAaqC3cfAHG2+v869mMR/Uvs+niUg8/x2E2G8iLBIkOXFbYpSZnyLl t8bY37bRwNqJgXDKQ8EaIm7vN/BX0R8OKupRd+H612HFjxxbRwUZxFmkDumOIsfxgJ9+ TEXw== X-Gm-Message-State: AOAM532Pzl5Cn9VRgadNcNM3+vB6GIJcFN+0aRVi1c7Qi//VOI663ZHJ V9qEHDy7qXyF5xhfNp2gK+vR+/fotKnWzHb3yXAfPFMb7H8SsFHuS2cLwTt3N6cRulam8dHOO/6 Qi8DUERIjTD+CuSQKILoNZe2S X-Received: by 2002:a37:6610:: with SMTP id a16mr6662248qkc.134.1600810241136; Tue, 22 Sep 2020 14:30:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxadCWQymNw7jDGAAG/XN93DJ3APDI9Zl3oX2US1BhpCsSEN+8GYZy3nYMIjQkNybAU65+0dA== X-Received: by 2002:a37:6610:: with SMTP id a16mr6662199qkc.134.1600810240530; Tue, 22 Sep 2020 14:30:40 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id k22sm12228360qkk.13.2020.09.22.14.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Sep 2020 14:30:38 -0700 (PDT) Message-ID: Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. From: Lyude Paul To: Puthikorn Voravootivat , Kevin Chowski Cc: Ville =?ISO-8859-1?Q?Syrj=E4l=E4?= , David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Wambui Karuga Date: Tue, 22 Sep 2020 17:30:36 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi! Since I got dropped from the thread, many responses inline On Tue, 2020-09-22 at 12:58 -0700, Puthikorn Voravootivat wrote: > +Lyude > I notice that Lyude email was somehow dropped from the thread. > Lyude was the person who submitted the patch for Thinkpad and should > know the OUI of the panel. no need - currently because of some confusion that got caused by the Intel HDR backlight interface being the only backlight interface that works properly on a lot of panels (many panels will advertise both interfaces, but might only work with the Intel one), we actually rely on a small allowlist of "approved" panels for enabling DPCD backlight control. …however, many of these panels are annoying and don't actually provide a reliable enough OUID to use for quirk detection, which is why we had to add EDID quirk detection as a temporary workaround for this. The current list of panels lives in drm_dp_helper.c: /* * Some devices have unreliable OUIDs where they don't set the device ID * correctly, and as a result we need to use the EDID for finding additional * DP quirks in such cases. */ static const struct edid_quirk edid_quirk_list[] = { /* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd Generation * only supports DPCD backlight controls */ { MFG(0x4c, 0x83), PROD_ID(0x41, 0x41), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, /* * Some Dell CML 2020 systems have panels support both AUX and PWM * backlight control, and some only support AUX backlight control. All * said panels start up in AUX mode by default, and we don't have any * support for disabling HDR mode on these panels which would be * required to switch to PWM backlight control mode (plus, I'm not * even sure we want PWM backlight controls over DPCD backlight * controls anyway...). Until we have a better way of detecting these, * force DPCD backlight mode on all of them. */ { MFG(0x06, 0xaf), PROD_ID(0x9b, 0x32), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, { MFG(0x06, 0xaf), PROD_ID(0xeb, 0x41), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, { MFG(0x4d, 0x10), PROD_ID(0xc7, 0x14), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, { MFG(0x4d, 0x10), PROD_ID(0xe6, 0x14), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, { MFG(0x4c, 0x83), PROD_ID(0x47, 0x41), BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, }; Also note that I think just about every panel on that list supports the Intel HDR backlight interface, so it's -possible- that the VESA interface could be broken on these panels. But, that would be a lot of different panels from different vendors to all be broken in the same way. > > On Tue, Sep 22, 2020 at 11:47 AM Kevin Chowski wrote: > > Alrighty, I'll take everyone else's silence as tacit approval of > > Ville's opinions. (I didn't receive any email bounces this time, so I > > think my issue was transient.) I will start on inverting the quirk and > > making the most-significant-alignment matter for these registers by > > default. > > > > Who can help me gather a list of OUIs that we need to add to the > > quirk? I can follow up with Puthikorn about the relevant Chromebooks, > > but I don't know what other types of laptops are using this driver. > > > > Thanks for your time, > > Kevin Chowski > > > > > > On Fri, Sep 18, 2020 at 12:16 PM Puthikorn Voravootivat > > wrote: > > > I'll defer to Ville & Lyude. > > > > > > I dug up more on the bug report and found that both Thinkpad and > > > Galaxy Chromebook use the same Samsung OLED. > > > So my 2 vs 1 argument is actually not valid. > > > > > > On Fri, Sep 18, 2020 at 10:59 AM Kevin Chowski > > > wrote: > > > > Apologies once again, some of my emails were bouncing for some > > > > addresses yesterday. Hopefully it was a temporary condition; I'll > > > > continue trying to dig into it on my end if it happens again for this > > > > email. > > > > > > > > Since there's evidence that some models want lsb and some (well, at > > > > least one) want msb, my understanding is that we'll need a quirk one > > > > way or the other (please correct if I'm mistaken). I unfortunately > > > > don't have the ability to test anything other than the Pixelbook, so > > > > if we decide the msb is the "right" way, then I will have to rely on > > > > others to test (and find the OUI of) other models which require lsb. > > > > > > > > I am happy to make any changes requested, but I do not at all have > > > > enough background here to make the decision on whether the msb > > > > functionality deserves the quirk or if the lsb one does. How can I > > > > help you all come to an agreement here? > > > > > > > > * It seems like Ville feels strongly about the msb being the correct > > > > interpretation of the spec. > > > > * It's unclear to me on which side of the fence Lyude falls, I > > > > couldn't pick up a strong opinion in her clarifying question. > > > > * Puthikorn seems to be on the side of lsb being correct, but maybe > > > > was swayed by Ville's argument. Honestly I'm not hard to convince :P, if it looks like we got the bit shift wrong for the majority of devices and everyone else agrees then I'm fine with assuming that's the case. I'm just quite surprised, seeing as we've tested many different panels from a few vendors and haven't run into any issues with this before. Honestly - if there's this much uncertainty about it, maybe we should just ask VESA directly what the correct interpretation of this is? Note I'm not on the VESA board (I get access to DP/eDP specs through X.org) so unless the contacts I've got from VESA would work (Bill Lempesis bill at vesa dot org) for that it might be a better idea for someone from Google or Intel to ask. > > > > > > > > If no one feels that Ville's argument is not strong in some way, and > > > > we go with that, I will get to work on the requested changes. I am > > > > concerned, though, about changing the default functionality without > > > > testing it widely to find the set of laptops which require the lsb > > > > quirk. I'd appreciate any advice people might have about making this > > > > change safely. Usually, I just try to stick with what the majority of machines need to do. I still think it'd be a good idea for us to verify this with VESA if there's that much confusion though > > > > > > > > Thank you for your time, > > > > Kevin > > > > > > > > On Thu, Sep 17, 2020 at 2:11 PM Ville Syrjälä > > > > wrote: > > > > > On Thu, Sep 17, 2020 at 09:25:35PM +0300, Ville Syrjälä wrote: > > > > > > On Thu, Sep 17, 2020 at 11:14:43AM -0700, Puthikorn Voravootivat > > > > > > wrote: > > > > > > > The Lyude fde7266fb2f6 change is actually based on Chromium > > > > > > > change > > > > > > > (https://crrev.com/c/1650325) that fixes the brightness for > > > > > > > Samsung > > > > > > > Galaxy Chromebook. So currently we have 2 examples that use LSB > > > > > > > interpretation and 1 that use MSB. > > > > > > > > > > > > "If field 4:0 of the EDP_PWMGEN_BIT_COUNT register represents a > > > > > > value > > > > > > of greater than 8 and the BACKLIGHT_BRIGHTNESS_BYTE_COUNT bit > > > > > > is cleared to 0, only the 8 MSB of the brightness control value > > > > > > can be > > > > > > controlled. > > > > > > (See Note below.) > > > > > > Assigned bits are allocated to the MSB of the enabled register > > > > > > combination." > > > > > > > > > > > > I think that's pretty clear the assigned bits are supposed to be > > > > > > msb aligned. > > > > > > > > > > I guess there's some email issues happening, but just to clarify: > > > > > > > > > > When the spec says MSB in caps here it clearly means > > > > > "most significant-bit(s)" since otherwise "8 MSB" would not make > > > > > any sense in the context of a 2 byte value. > > > > > > > > > > Granted the spec is crap here since "Table 1-1: Acronyms and > > > > > Initialism" does claim "MSB" should be byte(s) and "msb" bit(s). > > > > > > > > > > Also I can't imagine anyone would allocate the bits starting > > > > > from the lsb when the whole thing is clearly supposed to be a > > > > > 16bit big endian integer. So with >8 assigned bits you'd end > > > > > up with crazy stuff like this: > > > > > > > > > > [ 7 ... 0 ][7 ... 0] > > > > > [ 8 MSB ][XXXX][N LSB] > > > > > > > > > > so you couldn't even treat the value as a regular big endian > > > > > thing. Instead, if you squint a bit, it now looks like a funky > > > > > little endian value. So we're deep into some mixed endian land > > > > > where nothing makes sense anymore. > > > > > > > > > > Anyways I think the code should simply do this to match the spec: > > > > > u16 value = brightness << (16 - num_assigned_bits); > > > > > val[0] = value >> 8; > > > > > val[1] = value & 0xff; > > > > > > > > > > > > > > > > > > > > > > > > On Thu, Sep 17, 2020 at 10:55 AM Kevin Chowski < > > > > > > > chowski@chromium.org> wrote: > > > > > > > > Apologies for being too vague. To be as precise I can be, here > > > > > > > > is the > > > > > > > > specific code delta I tested: https://crrev.com/c/2406616 . To > > > > > > > > answer > > > > > > > > your other question, the code I tested against is indeed > > > > > > > > including the > > > > > > > > fde7266fb2f6 (despite ostensibly being called 5.4 in my commit > > > > > > > > message): our current top-of-tree for our 5.4 branch includes > > > > > > > > the > > > > > > > > intel_dp_aux_calc_max_backlight logic. Further, I'll note that > > > > > > > > change > > > > > > > > is exactly the change which breaks my Pixelbook model: prior > > > > > > > > to the > > > > > > > > change, the max_brightness was hard-coded to 0xFFFF and the > > > > > > > > math > > > > > > > > worked out that it didn't matter that the hardware cared about > > > > > > > > the MSB > > > > > > > > despite the driver code caring about the LSB. > > > > > > > > > > > > > > > > To answer Ville's question: the fde7266fb2f6 change which > > > > > > > > fixes one > > > > > > > > laptop (I believe Thinkpad X1 extreme Gen 2, from some bug > > > > > > > > reports I > > > > > > > > dug up) and breaks another (Pixelbook); so unfortunately I > > > > > > > > believe we > > > > > > > > need a quirk at least for some laptop. Reading through the > > > > > > > > copy of the > > > > > > > > datasheet I have, it wasn't clear to me which was the correct > > > > > > > > interpretation. I'm cc'ing puthik@, who was leaning toward the > > > > > > > > current > > > > > > > > kernel code (caring about LSB) being the correct > > > > > > > > interpretation. I > > > > > > > > believe we have other chromebooks which do rely on LSB > > > > > > > > functionality, > > > > > > > > so unless we can find more examples of laptops wanting MSB it > > > > > > > > currently looks like Pixelbook is the outlier. > > > > > > > > > > > > > > > > On Thu, Sep 17, 2020 at 11:28 AM Jani Nikula > > > > > > > > wrote: > > > > > > > > > On Thu, 17 Sep 2020, Kevin Chowski > > > > > > > > > wrote: > > > > > > > > > > We have observed that Google Pixelbook's backlight > > > > > > > > > > hardware is > > > > > > > > > > interpretting these backlight bits from the most- > > > > > > > > > > significant side of the > > > > > > > > > > 16 bit word (if DP_EDP_PWMGEN_BIT_COUNT < 16), whereas the > > > > > > > > > > driver code > > > > > > > > > > assumes the peripheral cares about the least-significant > > > > > > > > > > bits. > > > > > > > > > > > > > > > > > > > > Testing was done from within Chrome OS's build environment > > > > > > > > > > when the > > > > > > > > > > patch is backported to 5.4 (the version we are newly > > > > > > > > > > targeting for the > > > > > > > > > > Pixelbook); for the record: > > > > > > > > > > $ emerge-eve-kernelnext sys-kernel/chromeos-kernel-5_4 > > > > > > > > > > && \ > > > > > > > > > > ./update_kernel.sh --remote=$IP > > > > > > > > > > > > > > > > > > > > I used `/sys/kernel/debug/dri/0/eDP-1/i915_dpcd` on my > > > > > > > > > > laptop to verify > > > > > > > > > > that the registers were being set according to what the > > > > > > > > > > actual hardware > > > > > > > > > > expects; I also observe that the backlight is noticeably > > > > > > > > > > brighter with > > > > > > > > > > this patch. > > > > > > > > > > > > > > > > > > It's unclear to me what kernel version this is against, and > > > > > > > > > what you've > > > > > > > > > actually tested. > > > > > > > > > > > > > > > > > > Have you tried v5.7 kernel with Lyude's fde7266fb2f6 > > > > > > > > > ("drm/i915: Fix eDP > > > > > > > > > DPCD aux max backlight calculations")? > > > > > > > > > > > > > > > > > > I just want to make sure you've tested with all the relevant > > > > > > > > > fixes > > > > > > > > > before adding quirks. > > > > > > > > > > > > > > > > > > BR, > > > > > > > > > Jani. > > > > > > > > > > > > > > > > > > > Signed-off-by: Kevin Chowski > > > > > > > > > > --- > > > > > > > > > > > > > > > > > > > > .../drm/i915/display/intel_dp_aux_backlight.c | 34 > > > > > > > > > > +++++++++++++++++++ > > > > > > > > > > drivers/gpu/drm/i915/display/intel_quirks.c | 13 > > > > > > > > > > +++++++ > > > > > > > > > > drivers/gpu/drm/i915/i915_drv.h | 1 + > > > > > > > > > > 3 files changed, 48 insertions(+) > > > > > > > > > > > > > > > > > > > > diff --git > > > > > > > > > > a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > > > > > > > > index acbd7eb66cbe3..99c98f217356d 100644 > > > > > > > > > > --- > > > > > > > > > > a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > > > > > > > > +++ > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > > > > > > > > > > @@ -91,6 +91,23 @@ static u32 > > > > > > > > > > intel_dp_aux_get_backlight(struct intel_connector > > > > > > > > > > *connector) > > > > > > > > > > if (intel_dp->edp_dpcd[2] & > > > > > > > > > > DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) > > > > > > > > > > level = (read_val[0] << 8 | read_val[1]); > > > > > > > > > > > > > > > > > > > > + if (i915->quirks & > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS) { > > > > > > > > > > + if (!drm_dp_dpcd_readb(&intel_dp->aux, > > > > > > > > > > DP_EDP_PWMGEN_BIT_COUNT, > > > > > > > > > > + &read_val[0] > > > > > > > > > > )) { > > > > > > > > > > + DRM_DEBUG_KMS("Failed to read DPCD > > > > > > > > > > register 0x%x\n", > > > > > > > > > > + DP_EDP_PWMGEN_BIT_CO > > > > > > > > > > UNT); > > > > > > > > > > + return 0; > > > > > > > > > > + } > > > > > > > > > > + // Only bits 4:0 are used, 7:5 are reserved. > > > > > > > > > > + read_val[0] = read_val[0] & 0x1F; > > > > > > > > > > + if (read_val[0] > 16) { > > > > > > > > > > + DRM_DEBUG_KMS("Invalid > > > > > > > > > > DP_EDP_PWNGEN_BIT_COUNT 0x%X, expected at most 16\n", > > > > > > > > > > + read_val[0]) > > > > > > > > > > ; > > > > > > > > > > + return 0; > > > > > > > > > > + } > > > > > > > > > > + level >>= 16 - read_val[0]; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > return level; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > @@ -106,6 +123,23 @@ intel_dp_aux_set_backlight(const > > > > > > > > > > struct drm_connector_state *conn_state, u32 lev > > > > > > > > > > struct drm_i915_private *i915 = > > > > > > > > > > dp_to_i915(intel_dp); > > > > > > > > > > u8 vals[2] = { 0x0 }; > > > > > > > > > > > > > > > > > > > > + if (i915->quirks & > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS) { > > > > > > > > > > + if (!drm_dp_dpcd_readb(&intel_dp->aux, > > > > > > > > > > DP_EDP_PWMGEN_BIT_COUNT, > > > > > > > > > > + &vals[0])) { > > > > > > > > > > + DRM_DEBUG_KMS("Failed to write aux > > > > > > > > > > backlight level: Failed to read DPCD register 0x%x\n", > > > > > > > > > > + DP_EDP_PWMGEN_BIT_ > > > > > > > > > > COUNT); > > > > > > > > > > + return; > > > > > > > > > > + } > > > > > > > > > > + // Only bits 4:0 are used, 7:5 are reserved. > > > > > > > > > > + vals[0] = vals[0] & 0x1F; > > > > > > > > > > + if (vals[0] > 16) { > > > > > > > > > > + DRM_DEBUG_KMS("Failed to write aux > > > > > > > > > > backlight level: Invalid DP_EDP_PWNGEN_BIT_COUNT 0x%X, > > > > > > > > > > expected at most 16\n", > > > > > > > > > > + vals[0]); > > > > > > > > > > + return; > > > > > > > > > > + } > > > > > > > > > > + level <<= (16 - vals[0]) & 0xFFFF; > > > > > > > > > > + } > > > > > > > > > > + > > > > > > > > > > vals[0] = level; > > > > > > > > > > > > > > > > > > > > /* Write the MSB and/or LSB */ > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > index 46beb155d835f..63b27d49b2864 100644 > > > > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > @@ -53,6 +53,16 @@ static void > > > > > > > > > > quirk_increase_ddi_disabled_time(struct drm_i915_private > > > > > > > > > > *i915) > > > > > > > > > > drm_info(&i915->drm, "Applying Increase DDI Disabled > > > > > > > > > > quirk\n"); > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > +/* > > > > > > > > > > + * Some eDP backlight hardware uses the most-significant > > > > > > > > > > bits of the brightness > > > > > > > > > > + * register, so brightness values must be shifted first. > > > > > > > > > > + */ > > > > > > > > > > +static void quirk_shift_edp_backlight_brightness(struct > > > > > > > > > > drm_i915_private *i915) > > > > > > > > > > +{ > > > > > > > > > > + i915->quirks |= > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS; > > > > > > > > > > + DRM_INFO("Applying shift eDP backlight brightness > > > > > > > > > > quirk\n"); > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > struct intel_quirk { > > > > > > > > > > int device; > > > > > > > > > > int subsystem_vendor; > > > > > > > > > > @@ -156,6 +166,9 @@ static struct intel_quirk > > > > > > > > > > intel_quirks[] = { > > > > > > > > > > /* ASRock ITX*/ > > > > > > > > > > { 0x3185, 0x1849, 0x2212, > > > > > > > > > > quirk_increase_ddi_disabled_time }, > > > > > > > > > > { 0x3184, 0x1849, 0x2212, > > > > > > > > > > quirk_increase_ddi_disabled_time }, > > > > > > > > > > + > > > > > > > > > > + /* Google Pixelbook */ > > > > > > > > > > + { 0x591E, 0x8086, 0x2212, > > > > > > > > > > quirk_shift_edp_backlight_brightness }, > > > > > > > > > > }; > > > > > > > > > > > > > > > > > > > > void intel_init_quirks(struct drm_i915_private *i915) > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > b/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > index e4f7f6518945b..cc93bede4fab8 100644 > > > > > > > > > > --- a/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > @@ -525,6 +525,7 @@ struct i915_psr { > > > > > > > > > > #define QUIRK_PIN_SWIZZLED_PAGES (1<<5) > > > > > > > > > > #define QUIRK_INCREASE_T12_DELAY (1<<6) > > > > > > > > > > #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7) > > > > > > > > > > +#define QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS (1<<8) > > > > > > > > > > > > > > > > > > > > struct intel_fbdev; > > > > > > > > > > struct intel_fbc_work; > > > > > > > > > > > > > > > > > > -- > > > > > > > > > Jani Nikula, Intel Open Source Graphics Center > > > > > > > > > > > > -- > > > > > > Ville Syrjälä > > > > > > Intel > > > > > > _______________________________________________ > > > > > > Intel-gfx mailing list > > > > > > Intel-gfx@lists.freedesktop.org > > > > > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > > > > > > > > > > -- > > > > > Ville Syrjälä > > > > > Intel -- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat 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=-9.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham 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 2BB56C4727E for ; Tue, 22 Sep 2020 21:30:59 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C241420738 for ; Tue, 22 Sep 2020 21:30:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Pj5qOVxM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C241420738 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5820E6E342; Tue, 22 Sep 2020 21:30:57 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 604B36E342 for ; Tue, 22 Sep 2020 21:30:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600810248; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=Pj5qOVxMfuBr76rBPOC3afb9Wz/9yz2SKmu99diIEuxlqqA+4hozTUouJ8OXO7ZEi49x3P utW87vYdOcYDjJamz2m+bOw2QI3AxLld5a9pev9SC7gz6zt0oS80L/ddEja8cvodK/AJ7I UMaFCug1uAQm8pQBpwhqD6FoYo0L0O0= Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-95-3BR7m185PSaXDyhUhu8a8A-1; Tue, 22 Sep 2020 17:30:42 -0400 X-MC-Unique: 3BR7m185PSaXDyhUhu8a8A-1 Received: by mail-qk1-f200.google.com with SMTP id a2so14912946qkg.19 for ; Tue, 22 Sep 2020 14:30:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=RNmNNYZZcjgZhYRt6jTNSkt+REI60XUu9Apk2bxdalUO0sI9SyEYtrjzztvNQYFtAB xe2flEPaqKgmWin3l/7SiprnrI2Rt2yPGwFgBfqi11J9MgEXMYEksV5YJ2ld1WwN0shD 00B7SpszLrVH/ysNLMQrKFvZajjtOIQKTERlEEjvpBfaOzsQ2ZA9Y+2KEIyz4UZsw8Kn iyO7p5cG3PkysJzOD74SvHS8FT7U5oVUOxAQqKPcUjCNR0tBg616ZuaT9d/gSb1YjWf2 0yvs5jWsUKVsAjAxWq9nX6bdeAwgpcbETlOJTPddkVMmMiCgNrUChEryAl09wGPDLmIu yxiA== X-Gm-Message-State: AOAM530PBOKhl/ntdjIyBv2W9n8xVJuN9JQKkb/XxKDQGQANvMPJFROJ ObSBGR6j0V0jmhmxpX8GipIIWP9IpqqcjTZhbLQoUaLj4A9w8lm4u14Spau8yhDS0Ctw6LUUURp PYxccYxiu4dFRKN0yCS0czjZJwF3t X-Received: by 2002:a37:6610:: with SMTP id a16mr6662247qkc.134.1600810241136; Tue, 22 Sep 2020 14:30:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxadCWQymNw7jDGAAG/XN93DJ3APDI9Zl3oX2US1BhpCsSEN+8GYZy3nYMIjQkNybAU65+0dA== X-Received: by 2002:a37:6610:: with SMTP id a16mr6662199qkc.134.1600810240530; Tue, 22 Sep 2020 14:30:40 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id k22sm12228360qkk.13.2020.09.22.14.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Sep 2020 14:30:38 -0700 (PDT) Message-ID: Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. From: Lyude Paul To: Puthikorn Voravootivat , Kevin Chowski Date: Tue, 22 Sep 2020 17:30:36 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkhIFNpbmNlIEkgZ290IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLCBtYW55IHJlc3BvbnNlcyBp bmxpbmUKCk9uIFR1ZSwgMjAyMC0wOS0yMiBhdCAxMjo1OCAtMDcwMCwgUHV0aGlrb3JuIFZvcmF2 b290aXZhdCB3cm90ZToKPiArTHl1ZGUKPiBJIG5vdGljZSB0aGF0IEx5dWRlIGVtYWlsIHdhcyBz b21laG93IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLgo+IEx5dWRlIHdhcyB0aGUgcGVyc29uIHdo byBzdWJtaXR0ZWQgdGhlIHBhdGNoIGZvciBUaGlua3BhZCBhbmQgc2hvdWxkCj4ga25vdyB0aGUg T1VJIG9mIHRoZSBwYW5lbC4KCm5vIG5lZWQgLSBjdXJyZW50bHkgYmVjYXVzZSBvZiBzb21lIGNv bmZ1c2lvbiB0aGF0IGdvdCBjYXVzZWQgYnkgdGhlIEludGVsIEhEUgpiYWNrbGlnaHQgaW50ZXJm YWNlIGJlaW5nIHRoZSBvbmx5IGJhY2tsaWdodCBpbnRlcmZhY2UgdGhhdCB3b3JrcyBwcm9wZXJs eSBvbgphIGxvdCBvZiBwYW5lbHMgKG1hbnkgcGFuZWxzIHdpbGwgYWR2ZXJ0aXNlIGJvdGggaW50 ZXJmYWNlcywgYnV0IG1pZ2h0IG9ubHkKd29yayB3aXRoIHRoZSBJbnRlbCBvbmUpLCB3ZSBhY3R1 YWxseSByZWx5IG9uIGEgc21hbGwgYWxsb3dsaXN0IG9mICJhcHByb3ZlZCIKcGFuZWxzIGZvciBl bmFibGluZyBEUENEIGJhY2tsaWdodCBjb250cm9sLgoK4oCmaG93ZXZlciwgbWFueSBvZiB0aGVz ZSBwYW5lbHMgYXJlIGFubm95aW5nIGFuZCBkb24ndCBhY3R1YWxseSBwcm92aWRlIGEKcmVsaWFi bGUgZW5vdWdoIE9VSUQgdG8gdXNlIGZvciBxdWlyayBkZXRlY3Rpb24sIHdoaWNoIGlzIHdoeSB3 ZSBoYWQgdG8gYWRkCkVESUQgcXVpcmsgZGV0ZWN0aW9uIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91 bmQgZm9yIHRoaXMuIFRoZSBjdXJyZW50IGxpc3Qgb2YKcGFuZWxzIGxpdmVzIGluIGRybV9kcF9o ZWxwZXIuYzoKCi8qCiAqIFNvbWUgZGV2aWNlcyBoYXZlIHVucmVsaWFibGUgT1VJRHMgd2hlcmUg dGhleSBkb24ndCBzZXQgdGhlIGRldmljZSBJRAogKiBjb3JyZWN0bHksIGFuZCBhcyBhIHJlc3Vs dCB3ZSBuZWVkIHRvIHVzZSB0aGUgRURJRCBmb3IgZmluZGluZyBhZGRpdGlvbmFsCiAqIERQIHF1 aXJrcyBpbiBzdWNoIGNhc2VzLgogKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBlZGlkX3F1aXJrIGVk aWRfcXVpcmtfbGlzdFtdID0gewoJLyogT3B0aW9uYWwgNEsgQU1PTEVEIHBhbmVsIGluIHRoZSBU aGlua1BhZCBYMSBFeHRyZW1lIDJuZCBHZW5lcmF0aW9uCgkgKiBvbmx5IHN1cHBvcnRzIERQQ0Qg YmFja2xpZ2h0IGNvbnRyb2xzCgkgKi8KCXsgTUZHKDB4NGMsIDB4ODMpLCBQUk9EX0lEKDB4NDEs IDB4NDEpLCBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCgkvKgoJICogU29t ZSBEZWxsIENNTCAyMDIwIHN5c3RlbXMgaGF2ZSBwYW5lbHMgc3VwcG9ydCBib3RoIEFVWCBhbmQg UFdNCgkgKiBiYWNrbGlnaHQgY29udHJvbCwgYW5kIHNvbWUgb25seSBzdXBwb3J0IEFVWCBiYWNr bGlnaHQgY29udHJvbC4gQWxsCgkgKiBzYWlkIHBhbmVscyBzdGFydCB1cCBpbiBBVVggbW9kZSBi eSBkZWZhdWx0LCBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkKCSAqIHN1cHBvcnQgZm9yIGRpc2FibGlu ZyBIRFIgbW9kZSBvbiB0aGVzZSBwYW5lbHMgd2hpY2ggd291bGQgYmUKCSAqIHJlcXVpcmVkIHRv IHN3aXRjaCB0byBQV00gYmFja2xpZ2h0IGNvbnRyb2wgbW9kZSAocGx1cywgSSdtIG5vdAoJICog ZXZlbiBzdXJlIHdlIHdhbnQgUFdNIGJhY2tsaWdodCBjb250cm9scyBvdmVyIERQQ0QgYmFja2xp Z2h0CgkgKiBjb250cm9scyBhbnl3YXkuLi4pLiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHdheSBv ZiBkZXRlY3RpbmcgdGhlc2UsCgkgKiBmb3JjZSBEUENEIGJhY2tsaWdodCBtb2RlIG9uIGFsbCBv ZiB0aGVtLgoJICovCgl7IE1GRygweDA2LCAweGFmKSwgUFJPRF9JRCgweDliLCAweDMyKSwgQklU KERQX1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAoJeyBNRkcoMHgwNiwgMHhhZiksIFBS T0RfSUQoMHhlYiwgMHg0MSksIEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tMSUdIVCkgfSwK CXsgTUZHKDB4NGQsIDB4MTApLCBQUk9EX0lEKDB4YzcsIDB4MTQpLCBCSVQoRFBfUVVJUktfRk9S Q0VfRFBDRF9CQUNLTElHSFQpIH0sCgl7IE1GRygweDRkLCAweDEwKSwgUFJPRF9JRCgweGU2LCAw eDE0KSwgQklUKERQX1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAoJeyBNRkcoMHg0Yywg MHg4MyksIFBST0RfSUQoMHg0NywgMHg0MSksIEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tM SUdIVCkgfSwKfTsKCkFsc28gbm90ZSB0aGF0IEkgdGhpbmsganVzdCBhYm91dCBldmVyeSBwYW5l bCBvbiB0aGF0IGxpc3Qgc3VwcG9ydHMgdGhlIEludGVsCkhEUiBiYWNrbGlnaHQgaW50ZXJmYWNl LCBzbyBpdCdzIC1wb3NzaWJsZS0gdGhhdCB0aGUgVkVTQSBpbnRlcmZhY2UgY291bGQgYmUKYnJv a2VuIG9uIHRoZXNlIHBhbmVscy4gQnV0LCB0aGF0IHdvdWxkIGJlIGEgbG90IG9mIGRpZmZlcmVu dCBwYW5lbHMgZnJvbQpkaWZmZXJlbnQgdmVuZG9ycyB0byBhbGwgYmUgYnJva2VuIGluIHRoZSBz YW1lIHdheS4KCj4gCj4gT24gVHVlLCBTZXAgMjIsIDIwMjAgYXQgMTE6NDcgQU0gS2V2aW4gQ2hv d3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gQWxyaWdodHksIEknbGwgdGFr ZSBldmVyeW9uZSBlbHNlJ3Mgc2lsZW5jZSBhcyB0YWNpdCBhcHByb3ZhbCBvZgo+ID4gVmlsbGUn cyBvcGluaW9ucy4gKEkgZGlkbid0IHJlY2VpdmUgYW55IGVtYWlsIGJvdW5jZXMgdGhpcyB0aW1l LCBzbyBJCj4gPiB0aGluayBteSBpc3N1ZSB3YXMgdHJhbnNpZW50LikgSSB3aWxsIHN0YXJ0IG9u IGludmVydGluZyB0aGUgcXVpcmsgYW5kCj4gPiBtYWtpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQt YWxpZ25tZW50IG1hdHRlciBmb3IgdGhlc2UgcmVnaXN0ZXJzIGJ5Cj4gPiBkZWZhdWx0Lgo+ID4g Cj4gPiBXaG8gY2FuIGhlbHAgbWUgZ2F0aGVyIGEgbGlzdCBvZiBPVUlzIHRoYXQgd2UgbmVlZCB0 byBhZGQgdG8gdGhlCj4gPiBxdWlyaz8gSSBjYW4gZm9sbG93IHVwIHdpdGggUHV0aGlrb3JuIGFi b3V0IHRoZSByZWxldmFudCBDaHJvbWVib29rcywKPiA+IGJ1dCBJIGRvbid0IGtub3cgd2hhdCBv dGhlciB0eXBlcyBvZiBsYXB0b3BzIGFyZSB1c2luZyB0aGlzIGRyaXZlci4KPiA+IAo+ID4gVGhh bmtzIGZvciB5b3VyIHRpbWUsCj4gPiBLZXZpbiBDaG93c2tpCj4gPiAKPiA+IAo+ID4gT24gRnJp LCBTZXAgMTgsIDIwMjAgYXQgMTI6MTYgUE0gUHV0aGlrb3JuIFZvcmF2b290aXZhdAo+ID4gPHB1 dGhpa0BjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gPiBJJ2xsIGRlZmVyIHRvIFZpbGxlICYgTHl1 ZGUuCj4gPiA+IAo+ID4gPiBJIGR1ZyB1cCBtb3JlIG9uIHRoZSBidWcgcmVwb3J0IGFuZCBmb3Vu ZCB0aGF0IGJvdGggVGhpbmtwYWQgYW5kCj4gPiA+IEdhbGF4eSBDaHJvbWVib29rIHVzZSB0aGUg c2FtZSBTYW1zdW5nIE9MRUQuCj4gPiA+IFNvIG15IDIgdnMgMSBhcmd1bWVudCBpcyBhY3R1YWxs eSBub3QgdmFsaWQuCj4gPiA+IAo+ID4gPiBPbiBGcmksIFNlcCAxOCwgMjAyMCBhdCAxMDo1OSBB TSBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gd3JvdGU6Cj4gPiA+ ID4gQXBvbG9naWVzIG9uY2UgYWdhaW4sIHNvbWUgb2YgbXkgZW1haWxzIHdlcmUgYm91bmNpbmcg Zm9yIHNvbWUKPiA+ID4gPiBhZGRyZXNzZXMgeWVzdGVyZGF5LiBIb3BlZnVsbHkgaXQgd2FzIGEg dGVtcG9yYXJ5IGNvbmRpdGlvbjsgSSdsbAo+ID4gPiA+IGNvbnRpbnVlIHRyeWluZyB0byBkaWcg aW50byBpdCBvbiBteSBlbmQgaWYgaXQgaGFwcGVucyBhZ2FpbiBmb3IgdGhpcwo+ID4gPiA+IGVt YWlsLgo+ID4gPiA+IAo+ID4gPiA+IFNpbmNlIHRoZXJlJ3MgZXZpZGVuY2UgdGhhdCBzb21lIG1v ZGVscyB3YW50IGxzYiBhbmQgc29tZSAod2VsbCwgYXQKPiA+ID4gPiBsZWFzdCBvbmUpIHdhbnQg bXNiLCBteSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgd2UnbGwgbmVlZCBhIHF1aXJrIG9uZQo+ID4g PiA+IHdheSBvciB0aGUgb3RoZXIgKHBsZWFzZSBjb3JyZWN0IGlmIEknbSBtaXN0YWtlbikuIEkg dW5mb3J0dW5hdGVseQo+ID4gPiA+IGRvbid0IGhhdmUgdGhlIGFiaWxpdHkgdG8gdGVzdCBhbnl0 aGluZyBvdGhlciB0aGFuIHRoZSBQaXhlbGJvb2ssIHNvCj4gPiA+ID4gaWYgd2UgZGVjaWRlIHRo ZSBtc2IgaXMgdGhlICJyaWdodCIgd2F5LCB0aGVuIEkgd2lsbCBoYXZlIHRvIHJlbHkgb24KPiA+ ID4gPiBvdGhlcnMgdG8gdGVzdCAoYW5kIGZpbmQgdGhlIE9VSSBvZikgb3RoZXIgbW9kZWxzIHdo aWNoIHJlcXVpcmUgbHNiLgo+ID4gPiA+IAo+ID4gPiA+IEkgYW0gaGFwcHkgdG8gbWFrZSBhbnkg Y2hhbmdlcyByZXF1ZXN0ZWQsIGJ1dCBJIGRvIG5vdCBhdCBhbGwgaGF2ZQo+ID4gPiA+IGVub3Vn aCBiYWNrZ3JvdW5kIGhlcmUgdG8gbWFrZSB0aGUgZGVjaXNpb24gb24gd2hldGhlciB0aGUgbXNi Cj4gPiA+ID4gZnVuY3Rpb25hbGl0eSBkZXNlcnZlcyB0aGUgcXVpcmsgb3IgaWYgdGhlIGxzYiBv bmUgZG9lcy4gSG93IGNhbiBJCj4gPiA+ID4gaGVscCB5b3UgYWxsIGNvbWUgdG8gYW4gYWdyZWVt ZW50IGhlcmU/Cj4gPiA+ID4gCj4gPiA+ID4gKiBJdCBzZWVtcyBsaWtlIFZpbGxlIGZlZWxzIHN0 cm9uZ2x5IGFib3V0IHRoZSBtc2IgYmVpbmcgdGhlIGNvcnJlY3QKPiA+ID4gPiBpbnRlcnByZXRh dGlvbiBvZiB0aGUgc3BlYy4KPiA+ID4gPiAqIEl0J3MgdW5jbGVhciB0byBtZSBvbiB3aGljaCBz aWRlIG9mIHRoZSBmZW5jZSBMeXVkZSBmYWxscywgSQo+ID4gPiA+IGNvdWxkbid0IHBpY2sgdXAg YSBzdHJvbmcgb3BpbmlvbiBpbiBoZXIgY2xhcmlmeWluZyBxdWVzdGlvbi4KPiA+ID4gPiAqIFB1 dGhpa29ybiBzZWVtcyB0byBiZSBvbiB0aGUgc2lkZSBvZiBsc2IgYmVpbmcgY29ycmVjdCwgYnV0 IG1heWJlCj4gPiA+ID4gd2FzIHN3YXllZCBieSBWaWxsZSdzIGFyZ3VtZW50LgoKSG9uZXN0bHkg SSdtIG5vdCBoYXJkIHRvIGNvbnZpbmNlIDpQLCBpZiBpdCBsb29rcyBsaWtlIHdlIGdvdCB0aGUg Yml0IHNoaWZ0Cndyb25nIGZvciB0aGUgbWFqb3JpdHkgb2YgZGV2aWNlcyBhbmQgZXZlcnlvbmUg ZWxzZSBhZ3JlZXMgdGhlbiBJJ20gZmluZSB3aXRoCmFzc3VtaW5nIHRoYXQncyB0aGUgY2FzZS4g SSdtIGp1c3QgcXVpdGUgc3VycHJpc2VkLCBzZWVpbmcgYXMgd2UndmUgdGVzdGVkCm1hbnkgZGlm ZmVyZW50IHBhbmVscyBmcm9tIGEgZmV3IHZlbmRvcnMgYW5kIGhhdmVuJ3QgcnVuIGludG8gYW55 IGlzc3VlcyB3aXRoCnRoaXMgYmVmb3JlLgoKSG9uZXN0bHkgLSBpZiB0aGVyZSdzIHRoaXMgbXVj aCB1bmNlcnRhaW50eSBhYm91dCBpdCwgbWF5YmUgd2Ugc2hvdWxkIGp1c3QgYXNrClZFU0EgZGly ZWN0bHkgd2hhdCB0aGUgY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGlzPyBOb3RlIEkn bSBub3Qgb24gdGhlClZFU0EgYm9hcmQgKEkgZ2V0IGFjY2VzcyB0byBEUC9lRFAgc3BlY3MgdGhy b3VnaCBYLm9yZykgc28gdW5sZXNzIHRoZSBjb250YWN0cwpJJ3ZlIGdvdCBmcm9tIFZFU0Egd291 bGQgd29yayAoQmlsbCBMZW1wZXNpcyBiaWxsIGF0IHZlc2EgZG90IG9yZykgZm9yIHRoYXQgaXQK bWlnaHQgYmUgYSBiZXR0ZXIgaWRlYSBmb3Igc29tZW9uZSBmcm9tIEdvb2dsZSBvciBJbnRlbCB0 byBhc2suCgo+ID4gPiA+IAo+ID4gPiA+IElmIG5vIG9uZSBmZWVscyB0aGF0IFZpbGxlJ3MgYXJn dW1lbnQgaXMgbm90IHN0cm9uZyBpbiBzb21lIHdheSwgYW5kCj4gPiA+ID4gd2UgZ28gd2l0aCB0 aGF0LCBJIHdpbGwgZ2V0IHRvIHdvcmsgb24gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzLiBJIGFtCj4g PiA+ID4gY29uY2VybmVkLCB0aG91Z2gsIGFib3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0IGZ1bmN0 aW9uYWxpdHkgd2l0aG91dAo+ID4gPiA+IHRlc3RpbmcgaXQgd2lkZWx5IHRvIGZpbmQgdGhlIHNl dCBvZiBsYXB0b3BzIHdoaWNoIHJlcXVpcmUgdGhlIGxzYgo+ID4gPiA+IHF1aXJrLiBJJ2QgYXBw cmVjaWF0ZSBhbnkgYWR2aWNlIHBlb3BsZSBtaWdodCBoYXZlIGFib3V0IG1ha2luZyB0aGlzCj4g PiA+ID4gY2hhbmdlIHNhZmVseS4KClVzdWFsbHksIEkganVzdCB0cnkgdG8gc3RpY2sgd2l0aCB3 aGF0IHRoZSBtYWpvcml0eSBvZiBtYWNoaW5lcyBuZWVkIHRvIGRvLiBJCnN0aWxsIHRoaW5rIGl0 J2QgYmUgYSBnb29kIGlkZWEgZm9yIHVzIHRvIHZlcmlmeSB0aGlzIHdpdGggVkVTQSBpZiB0aGVy ZSdzCnRoYXQgbXVjaCBjb25mdXNpb24gdGhvdWdoCgo+ID4gPiA+IAo+ID4gPiA+IFRoYW5rIHlv dSBmb3IgeW91ciB0aW1lLAo+ID4gPiA+IEtldmluCj4gPiA+ID4gCj4gPiA+ID4gT24gVGh1LCBT ZXAgMTcsIDIwMjAgYXQgMjoxMSBQTSBWaWxsZSBTeXJqw6Rsw6QKPiA+ID4gPiA8dmlsbGUuc3ly amFsYUBsaW51eC5pbnRlbC5jb20+IHdyb3RlOgo+ID4gPiA+ID4gT24gVGh1LCBTZXAgMTcsIDIw MjAgYXQgMDk6MjU6MzVQTSArMDMwMCwgVmlsbGUgU3lyasOkbMOkIHdyb3RlOgo+ID4gPiA+ID4g PiBPbiBUaHUsIFNlcCAxNywgMjAyMCBhdCAxMToxNDo0M0FNIC0wNzAwLCBQdXRoaWtvcm4gVm9y YXZvb3RpdmF0Cj4gPiA+ID4gPiA+IHdyb3RlOgo+ID4gPiA+ID4gPiA+IFRoZSBMeXVkZSBmZGU3 MjY2ZmIyZjYgY2hhbmdlIGlzIGFjdHVhbGx5IGJhc2VkIG9uIENocm9taXVtCj4gPiA+ID4gPiA+ ID4gY2hhbmdlCj4gPiA+ID4gPiA+ID4gKGh0dHBzOi8vY3JyZXYuY29tL2MvMTY1MDMyNSkgdGhh dCBmaXhlcyB0aGUgYnJpZ2h0bmVzcyBmb3IKPiA+ID4gPiA+ID4gPiBTYW1zdW5nCj4gPiA+ID4g PiA+ID4gR2FsYXh5IENocm9tZWJvb2suIFNvIGN1cnJlbnRseSB3ZSBoYXZlIDIgZXhhbXBsZXMg dGhhdCB1c2UgTFNCCj4gPiA+ID4gPiA+ID4gaW50ZXJwcmV0YXRpb24gYW5kIDEgdGhhdCB1c2Ug TVNCLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gIklmIGZpZWxkIDQ6MCBvZiB0aGUgRURQX1BX TUdFTl9CSVRfQ09VTlQgcmVnaXN0ZXIgcmVwcmVzZW50cyBhCj4gPiA+ID4gPiA+IHZhbHVlCj4g PiA+ID4gPiA+IG9mIGdyZWF0ZXIgdGhhbiA4IGFuZCB0aGUgQkFDS0xJR0hUX0JSSUdIVE5FU1Nf QllURV9DT1VOVCBiaXQKPiA+ID4gPiA+ID4gaXMgY2xlYXJlZCB0byAwLCBvbmx5IHRoZSA4IE1T QiBvZiB0aGUgYnJpZ2h0bmVzcyBjb250cm9sIHZhbHVlCj4gPiA+ID4gPiA+IGNhbiBiZQo+ID4g PiA+ID4gPiBjb250cm9sbGVkLgo+ID4gPiA+ID4gPiAoU2VlIE5vdGUgYmVsb3cuKQo+ID4gPiA+ ID4gPiBBc3NpZ25lZCBiaXRzIGFyZSBhbGxvY2F0ZWQgdG8gdGhlIE1TQiBvZiB0aGUgZW5hYmxl ZCByZWdpc3Rlcgo+ID4gPiA+ID4gPiBjb21iaW5hdGlvbi4iCj4gPiA+ID4gPiA+IAo+ID4gPiA+ ID4gPiBJIHRoaW5rIHRoYXQncyBwcmV0dHkgY2xlYXIgdGhlIGFzc2lnbmVkIGJpdHMgYXJlIHN1 cHBvc2VkIHRvIGJlCj4gPiA+ID4gPiA+IG1zYiBhbGlnbmVkLgo+ID4gPiA+ID4gCj4gPiA+ID4g PiBJIGd1ZXNzIHRoZXJlJ3Mgc29tZSBlbWFpbCBpc3N1ZXMgaGFwcGVuaW5nLCBidXQganVzdCB0 byBjbGFyaWZ5Ogo+ID4gPiA+ID4gCj4gPiA+ID4gPiBXaGVuIHRoZSBzcGVjIHNheXMgTVNCIGlu IGNhcHMgaGVyZSBpdCBjbGVhcmx5IG1lYW5zCj4gPiA+ID4gPiAibW9zdCBzaWduaWZpY2FudC1i aXQocykiIHNpbmNlIG90aGVyd2lzZSAiOCBNU0IiIHdvdWxkIG5vdCBtYWtlCj4gPiA+ID4gPiBh bnkgc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSAyIGJ5dGUgdmFsdWUuCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IEdyYW50ZWQgdGhlIHNwZWMgaXMgY3JhcCBoZXJlIHNpbmNlICJUYWJsZSAxLTE6IEFj cm9ueW1zIGFuZAo+ID4gPiA+ID4gSW5pdGlhbGlzbSIgZG9lcyBjbGFpbSAiTVNCIiBzaG91bGQg YmUgYnl0ZShzKSBhbmQgIm1zYiIgYml0KHMpLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBBbHNvIEkg Y2FuJ3QgaW1hZ2luZSBhbnlvbmUgd291bGQgYWxsb2NhdGUgdGhlIGJpdHMgc3RhcnRpbmcKPiA+ ID4gPiA+IGZyb20gdGhlIGxzYiB3aGVuIHRoZSB3aG9sZSB0aGluZyBpcyBjbGVhcmx5IHN1cHBv c2VkIHRvIGJlIGEKPiA+ID4gPiA+IDE2Yml0IGJpZyBlbmRpYW4gaW50ZWdlci4gU28gd2l0aCA+ OCBhc3NpZ25lZCBiaXRzIHlvdSdkIGVuZAo+ID4gPiA+ID4gdXAgd2l0aCBjcmF6eSBzdHVmZiBs aWtlIHRoaXM6Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IFsgNyAuLi4gMCBdWzcgICAuLi4gICAwXQo+ ID4gPiA+ID4gWyA4IE1TQiAgIF1bWFhYWF1bTiBMU0JdCj4gPiA+ID4gPiAKPiA+ID4gPiA+IHNv IHlvdSBjb3VsZG4ndCBldmVuIHRyZWF0IHRoZSB2YWx1ZSBhcyBhIHJlZ3VsYXIgYmlnIGVuZGlh bgo+ID4gPiA+ID4gdGhpbmcuIEluc3RlYWQsIGlmIHlvdSBzcXVpbnQgYSBiaXQsIGl0IG5vdyBs b29rcyBsaWtlIGEgZnVua3kKPiA+ID4gPiA+IGxpdHRsZSBlbmRpYW4gdmFsdWUuIFNvIHdlJ3Jl IGRlZXAgaW50byBzb21lIG1peGVkIGVuZGlhbiBsYW5kCj4gPiA+ID4gPiB3aGVyZSBub3RoaW5n IG1ha2VzIHNlbnNlIGFueW1vcmUuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEFueXdheXMgSSB0aGlu ayB0aGUgY29kZSBzaG91bGQgc2ltcGx5IGRvIHRoaXMgdG8gbWF0Y2ggdGhlIHNwZWM6Cj4gPiA+ ID4gPiB1MTYgdmFsdWUgPSBicmlnaHRuZXNzIDw8ICgxNiAtIG51bV9hc3NpZ25lZF9iaXRzKTsK PiA+ID4gPiA+IHZhbFswXSA9IHZhbHVlID4+IDg7Cj4gPiA+ID4gPiB2YWxbMV0gPSB2YWx1ZSAm IDB4ZmY7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ IE9uIFRodSwgU2VwIDE3LCAyMDIwIGF0IDEwOjU1IEFNIEtldmluIENob3dza2kgPAo+ID4gPiA+ ID4gPiA+IGNob3dza2lAY2hyb21pdW0ub3JnPiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+IEFwb2xv Z2llcyBmb3IgYmVpbmcgdG9vIHZhZ3VlLiBUbyBiZSBhcyBwcmVjaXNlIEkgY2FuIGJlLCBoZXJl Cj4gPiA+ID4gPiA+ID4gPiBpcyB0aGUKPiA+ID4gPiA+ID4gPiA+IHNwZWNpZmljIGNvZGUgZGVs dGEgSSB0ZXN0ZWQ6IGh0dHBzOi8vY3JyZXYuY29tL2MvMjQwNjYxNiAuIFRvCj4gPiA+ID4gPiA+ ID4gPiBhbnN3ZXIKPiA+ID4gPiA+ID4gPiA+IHlvdXIgb3RoZXIgcXVlc3Rpb24sIHRoZSBjb2Rl IEkgdGVzdGVkIGFnYWluc3QgaXMgaW5kZWVkCj4gPiA+ID4gPiA+ID4gPiBpbmNsdWRpbmcgdGhl Cj4gPiA+ID4gPiA+ID4gPiBmZGU3MjY2ZmIyZjYgKGRlc3BpdGUgb3N0ZW5zaWJseSBiZWluZyBj YWxsZWQgNS40IGluIG15IGNvbW1pdAo+ID4gPiA+ID4gPiA+ID4gbWVzc2FnZSk6IG91ciBjdXJy ZW50IHRvcC1vZi10cmVlIGZvciBvdXIgNS40IGJyYW5jaCBpbmNsdWRlcwo+ID4gPiA+ID4gPiA+ ID4gdGhlCj4gPiA+ID4gPiA+ID4gPiBpbnRlbF9kcF9hdXhfY2FsY19tYXhfYmFja2xpZ2h0IGxv Z2ljLiBGdXJ0aGVyLCBJJ2xsIG5vdGUgdGhhdAo+ID4gPiA+ID4gPiA+ID4gY2hhbmdlCj4gPiA+ ID4gPiA+ID4gPiBpcyBleGFjdGx5IHRoZSBjaGFuZ2Ugd2hpY2ggYnJlYWtzIG15IFBpeGVsYm9v ayBtb2RlbDogcHJpb3IKPiA+ID4gPiA+ID4gPiA+IHRvIHRoZQo+ID4gPiA+ID4gPiA+ID4gY2hh bmdlLCB0aGUgbWF4X2JyaWdodG5lc3Mgd2FzIGhhcmQtY29kZWQgdG8gMHhGRkZGIGFuZCB0aGUK PiA+ID4gPiA+ID4gPiA+IG1hdGgKPiA+ID4gPiA+ID4gPiA+IHdvcmtlZCBvdXQgdGhhdCBpdCBk aWRuJ3QgbWF0dGVyIHRoYXQgdGhlIGhhcmR3YXJlIGNhcmVkIGFib3V0Cj4gPiA+ID4gPiA+ID4g PiB0aGUgTVNCCj4gPiA+ID4gPiA+ID4gPiBkZXNwaXRlIHRoZSBkcml2ZXIgY29kZSBjYXJpbmcg YWJvdXQgdGhlIExTQi4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gVG8gYW5zd2Vy IFZpbGxlJ3MgcXVlc3Rpb246IHRoZSBmZGU3MjY2ZmIyZjYgY2hhbmdlIHdoaWNoCj4gPiA+ID4g PiA+ID4gPiBmaXhlcyBvbmUKPiA+ID4gPiA+ID4gPiA+IGxhcHRvcCAoSSBiZWxpZXZlIFRoaW5r cGFkIFgxIGV4dHJlbWUgR2VuIDIsIGZyb20gc29tZSBidWcKPiA+ID4gPiA+ID4gPiA+IHJlcG9y dHMgSQo+ID4gPiA+ID4gPiA+ID4gZHVnIHVwKSBhbmQgYnJlYWtzIGFub3RoZXIgKFBpeGVsYm9v ayk7IHNvIHVuZm9ydHVuYXRlbHkgSQo+ID4gPiA+ID4gPiA+ID4gYmVsaWV2ZSB3ZQo+ID4gPiA+ ID4gPiA+ID4gbmVlZCBhIHF1aXJrIGF0IGxlYXN0IGZvciBzb21lIGxhcHRvcC4gUmVhZGluZyB0 aHJvdWdoIHRoZQo+ID4gPiA+ID4gPiA+ID4gY29weSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+IGRh dGFzaGVldCBJIGhhdmUsIGl0IHdhc24ndCBjbGVhciB0byBtZSB3aGljaCB3YXMgdGhlIGNvcnJl Y3QKPiA+ID4gPiA+ID4gPiA+IGludGVycHJldGF0aW9uLiBJJ20gY2MnaW5nIHB1dGhpa0AsIHdo byB3YXMgbGVhbmluZyB0b3dhcmQgdGhlCj4gPiA+ID4gPiA+ID4gPiBjdXJyZW50Cj4gPiA+ID4g PiA+ID4gPiBrZXJuZWwgY29kZSAoY2FyaW5nIGFib3V0IExTQikgYmVpbmcgdGhlIGNvcnJlY3QK PiA+ID4gPiA+ID4gPiA+IGludGVycHJldGF0aW9uLiBJCj4gPiA+ID4gPiA+ID4gPiBiZWxpZXZl IHdlIGhhdmUgb3RoZXIgY2hyb21lYm9va3Mgd2hpY2ggZG8gcmVseSBvbiBMU0IKPiA+ID4gPiA+ ID4gPiA+IGZ1bmN0aW9uYWxpdHksCj4gPiA+ID4gPiA+ID4gPiBzbyB1bmxlc3Mgd2UgY2FuIGZp bmQgbW9yZSBleGFtcGxlcyBvZiBsYXB0b3BzIHdhbnRpbmcgTVNCIGl0Cj4gPiA+ID4gPiA+ID4g PiBjdXJyZW50bHkgbG9va3MgbGlrZSBQaXhlbGJvb2sgaXMgdGhlIG91dGxpZXIuCj4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IE9uIFRodSwgU2VwIDE3LCAyMDIwIGF0IDExOjI4IEFN IEphbmkgTmlrdWxhCj4gPiA+ID4gPiA+ID4gPiA8amFuaS5uaWt1bGFAbGludXguaW50ZWwuY29t PiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gT24gVGh1LCAxNyBTZXAgMjAyMCwgS2V2aW4gQ2hv d3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmc+Cj4gPiA+ID4gPiA+ID4gPiA+IHdyb3RlOgo+ID4g PiA+ID4gPiA+ID4gPiA+IFdlIGhhdmUgb2JzZXJ2ZWQgdGhhdCBHb29nbGUgUGl4ZWxib29rJ3Mg YmFja2xpZ2h0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gaGFyZHdhcmUgaXMKPiA+ID4gPiA+ID4gPiA+ ID4gPiBpbnRlcnByZXR0aW5nIHRoZXNlIGJhY2tsaWdodCBiaXRzIGZyb20gdGhlIG1vc3QtCj4g PiA+ID4gPiA+ID4gPiA+ID4gc2lnbmlmaWNhbnQgc2lkZSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+ ID4gPiAxNiBiaXQgd29yZCAoaWYgRFBfRURQX1BXTUdFTl9CSVRfQ09VTlQgPCAxNiksIHdoZXJl YXMgdGhlCj4gPiA+ID4gPiA+ID4gPiA+ID4gZHJpdmVyIGNvZGUKPiA+ID4gPiA+ID4gPiA+ID4g PiBhc3N1bWVzIHRoZSBwZXJpcGhlcmFsIGNhcmVzIGFib3V0IHRoZSBsZWFzdC1zaWduaWZpY2Fu dAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJpdHMuCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gPiA+ID4gVGVzdGluZyB3YXMgZG9uZSBmcm9tIHdpdGhpbiBDaHJvbWUgT1MncyBidWls ZCBlbnZpcm9ubWVudAo+ID4gPiA+ID4gPiA+ID4gPiA+IHdoZW4gdGhlCj4gPiA+ID4gPiA+ID4g PiA+ID4gcGF0Y2ggaXMgYmFja3BvcnRlZCB0byA1LjQgKHRoZSB2ZXJzaW9uIHdlIGFyZSBuZXds eQo+ID4gPiA+ID4gPiA+ID4gPiA+IHRhcmdldGluZyBmb3IgdGhlCj4gPiA+ID4gPiA+ID4gPiA+ ID4gUGl4ZWxib29rKTsgZm9yIHRoZSByZWNvcmQ6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgJCBl bWVyZ2UtZXZlLWtlcm5lbG5leHQgc3lzLWtlcm5lbC9jaHJvbWVvcy1rZXJuZWwtNV80Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gJiYgXAo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIC4vdXBkYXRlX2tl cm5lbC5zaCAtLXJlbW90ZT0kSVAKPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ ID4gPiBJIHVzZWQgYC9zeXMva2VybmVsL2RlYnVnL2RyaS8wL2VEUC0xL2k5MTVfZHBjZGAgb24g bXkKPiA+ID4gPiA+ID4gPiA+ID4gPiBsYXB0b3AgdG8gdmVyaWZ5Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gdGhhdCB0aGUgcmVnaXN0ZXJzIHdlcmUgYmVpbmcgc2V0IGFjY29yZGluZyB0byB3aGF0IHRo ZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGFjdHVhbCBoYXJkd2FyZQo+ID4gPiA+ID4gPiA+ID4gPiA+ IGV4cGVjdHM7IEkgYWxzbyBvYnNlcnZlIHRoYXQgdGhlIGJhY2tsaWdodCBpcyBub3RpY2VhYmx5 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0ZXIgd2l0aAo+ID4gPiA+ID4gPiA+ID4gPiA+IHRo aXMgcGF0Y2guCj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBJdCdzIHVuY2xl YXIgdG8gbWUgd2hhdCBrZXJuZWwgdmVyc2lvbiB0aGlzIGlzIGFnYWluc3QsIGFuZAo+ID4gPiA+ ID4gPiA+ID4gPiB3aGF0IHlvdSd2ZQo+ID4gPiA+ID4gPiA+ID4gPiBhY3R1YWxseSB0ZXN0ZWQu Cj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBIYXZlIHlvdSB0cmllZCB2NS43 IGtlcm5lbCB3aXRoIEx5dWRlJ3MgZmRlNzI2NmZiMmY2Cj4gPiA+ID4gPiA+ID4gPiA+ICgiZHJt L2k5MTU6IEZpeCBlRFAKPiA+ID4gPiA+ID4gPiA+ID4gRFBDRCBhdXggbWF4IGJhY2tsaWdodCBj YWxjdWxhdGlvbnMiKT8KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IEkganVz dCB3YW50IHRvIG1ha2Ugc3VyZSB5b3UndmUgdGVzdGVkIHdpdGggYWxsIHRoZSByZWxldmFudAo+ ID4gPiA+ID4gPiA+ID4gPiBmaXhlcwo+ID4gPiA+ID4gPiA+ID4gPiBiZWZvcmUgYWRkaW5nIHF1 aXJrcy4KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IEJSLAo+ID4gPiA+ID4g PiA+ID4gPiBKYW5pLgo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBTaWdu ZWQtb2ZmLWJ5OiBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gPiA+ ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiAg Li4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jIHwgMzQKPiA+ID4g PiA+ID4gPiA+ID4gPiArKysrKysrKysrKysrKysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfcXVpcmtzLmMgICB8IDEzCj4gPiA+ID4g PiA+ID4gPiA+ID4gKysrKysrKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2Rydi5oICAgICAgICAgICAgICAgfCAgMSArCj4gPiA+ID4gPiA+ID4gPiA+ID4g IDMgZmlsZXMgY2hhbmdlZCwgNDggaW5zZXJ0aW9ucygrKQo+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiA+ID4g PiA+ID4gPiA+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9i YWNrbGlnaHQuYwo+ID4gPiA+ID4gPiA+ID4gPiA+IGluZGV4IGFjYmQ3ZWI2NmNiZTMuLjk5Yzk4 ZjIxNzM1NmQgMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiA+ID4gPiA+ ID4gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQu Ywo+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKwo+ID4gPiA+ID4gPiA+ID4gPiA+IGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcF9hdXhfYmFja2xpZ2h0LmMKPiA+ID4gPiA+ID4g PiA+ID4gPiBAQCAtOTEsNiArOTEsMjMgQEAgc3RhdGljIHUzMgo+ID4gPiA+ID4gPiA+ID4gPiA+ IGludGVsX2RwX2F1eF9nZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IKPiA+ID4g PiA+ID4gPiA+ID4gPiAqY29ubmVjdG9yKQo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGlmIChp bnRlbF9kcC0+ZWRwX2RwY2RbMl0gJgo+ID4gPiA+ID4gPiA+ID4gPiA+IERQX0VEUF9CQUNLTElH SFRfQlJJR0hUTkVTU19CWVRFX0NPVU5UKQo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAg ICAgbGV2ZWwgPSAocmVhZF92YWxbMF0gPDwgOCB8IHJlYWRfdmFsWzFdKTsKPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICBpZiAoaTkxNS0+cXVpcmtzICYKPiA+ ID4gPiA+ID4gPiA+ID4gPiBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1MpIHsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIGlmICghZHJtX2RwX2RwY2RfcmVhZGIo JmludGVsX2RwLT5hdXgsCj4gPiA+ID4gPiA+ID4gPiA+ID4gRFBfRURQX1BXTUdFTl9CSVRfQ09V TlQsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZyZWFkX3ZhbFswXQo+ID4gPiA+ID4gPiA+ID4gPiA+ICkpIHsKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVk IHRvIHJlYWQgRFBDRAo+ID4gPiA+ID4gPiA+ID4gPiA+IHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9F RFBfUFdNR0VOX0JJVF9DTwo+ID4gPiA+ID4gPiA+ID4gPiA+IFVOVCk7Cj4gPiA+ID4gPiA+ID4g PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgLy8gT25s eSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZSByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgICAgICAgIHJlYWRfdmFsWzBdID0gcmVhZF92YWxbMF0gJiAweDFGOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgaWYgKHJlYWRfdmFsWzBdID4gMTYpIHsKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiSW52YWxp ZAo+ID4gPiA+ID4gPiA+ID4gPiA+IERQX0VEUF9QV05HRU5fQklUX0NPVU5UIDB4JVgsIGV4cGVj dGVkIGF0IG1vc3QgMTZcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdmFsWzBdKQo+ID4gPiA+ID4gPiA+ID4g PiA+IDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g KyAgICAgICAgICAgICBsZXZlbCA+Pj0gMTYgLSByZWFkX3ZhbFswXTsKPiA+ID4gPiA+ID4gPiA+ ID4gPiArICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICAg ICAgIHJldHVybiBsZXZlbDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfQo+ID4gPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC0xMDYsNiArMTIzLDIzIEBAIGludGVsX2RwX2F1 eF9zZXRfYmFja2xpZ2h0KGNvbnN0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUsIHUzMiBsZXYKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gZHBf dG9faTkxNShpbnRlbF9kcCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgdTggdmFsc1syXSA9 IHsgMHgwIH07Cj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAg aWYgKGk5MTUtPnF1aXJrcyAmCj4gPiA+ID4gPiA+ID4gPiA+ID4gUVVJUktfU0hJRlRfRURQX0JB Q0tMSUdIVF9CUklHSFRORVNTKSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBp ZiAoIWRybV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gPiA+ID4gPiA+ID4gPiA+ IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsc1swXSkpIHsKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRv IHdyaXRlIGF1eAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJhY2tsaWdodCBsZXZlbDogRmFpbGVkIHRv IHJlYWQgRFBDRCByZWdpc3RlciAweCV4XG4iLAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9FRFBfUFdNR0VOX0JJVF8KPiA+ID4g PiA+ID4gPiA+ID4gPiBDT1VOVCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIH0KPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIC8vIE9ubHkgYml0cyA0OjAgYXJlIHVzZWQsIDc6 NSBhcmUgcmVzZXJ2ZWQuCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB2YWxzWzBd ID0gdmFsc1swXSAmIDB4MUY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAo dmFsc1swXSA+IDE2KSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg IERSTV9ERUJVR19LTVMoIkZhaWxlZCB0byB3cml0ZSBhdXgKPiA+ID4gPiA+ID4gPiA+ID4gPiBi YWNrbGlnaHQgbGV2ZWw6IEludmFsaWQgRFBfRURQX1BXTkdFTl9CSVRfQ09VTlQgMHglWCwKPiA+ ID4gPiA+ID4gPiA+ID4gPiBleHBlY3RlZCBhdCBtb3N0IDE2XG4iLAo+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzWzBd KTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4g PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgbGV2ZWwgPDw9ICgxNiAtIHZhbHNbMF0pICYgMHhGRkZGOwo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsgICAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgICAgdmFsc1swXSA9IGxldmVsOwo+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICAgIC8qIFdyaXRlIHRoZSBNU0IgYW5kL29yIExTQiAqLwo+ID4gPiA+ID4gPiA+ ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1 aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5 L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gaW5kZXggNDZiZWIxNTVkODM1Zi4u NjNiMjdkNDliMjg2NCAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9xdWlya3MuYwo+ID4gPiA+ID4g PiA+ID4gPiA+IEBAIC01Myw2ICs1MywxNiBAQCBzdGF0aWMgdm9pZAo+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlCj4gPiA+ID4gPiA+ID4gPiA+ID4gKmk5MTUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAg ZHJtX2luZm8oJmk5MTUtPmRybSwgIkFwcGx5aW5nIEluY3JlYXNlIERESSBEaXNhYmxlZAo+ID4g PiA+ID4gPiA+ID4gPiA+IHF1aXJrXG4iKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfQo+ID4gPiA+ ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsvKgo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgKiBTb21lIGVEUCBiYWNrbGlnaHQgaGFyZHdhcmUgdXNlcyB0aGUgbW9zdC1zaWduaWZpY2Fu dAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJpdHMgb2YgdGhlIGJyaWdodG5lc3MKPiA+ID4gPiA+ID4g PiA+ID4gPiArICogcmVnaXN0ZXIsIHNvIGJyaWdodG5lc3MgdmFsdWVzIG11c3QgYmUgc2hpZnRl ZCBmaXJzdC4KPiA+ID4gPiA+ID4gPiA+ID4gPiArICovCj4gPiA+ID4gPiA+ID4gPiA+ID4gK3N0 YXRpYyB2b2lkIHF1aXJrX3NoaWZ0X2VkcF9iYWNrbGlnaHRfYnJpZ2h0bmVzcyhzdHJ1Y3QKPiA+ ID4gPiA+ID4gPiA+ID4gPiBkcm1faTkxNV9wcml2YXRlICppOTE1KQo+ID4gPiA+ID4gPiA+ID4g PiA+ICt7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaTkxNS0+cXVpcmtzIHw9Cj4gPiA+ID4g PiA+ID4gPiA+ID4gUVVJUktfU0hJRlRfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgIERSTV9JTkZPKCJBcHBseWluZyBzaGlmdCBlRFAgYmFja2xpZ2h0 IGJyaWdodG5lc3MKPiA+ID4gPiA+ID4gPiA+ID4gPiBxdWlya1xuIik7Cj4gPiA+ID4gPiA+ID4g PiA+ID4gK30KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gIHN0cnVj dCBpbnRlbF9xdWlyayB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgaW50IGRldmljZTsKPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgICBpbnQgc3Vic3lzdGVtX3ZlbmRvcjsKPiA+ID4gPiA+ID4g PiA+ID4gPiBAQCAtMTU2LDYgKzE2Niw5IEBAIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfcXVpcmsKPiA+ ID4gPiA+ID4gPiA+ID4gPiBpbnRlbF9xdWlya3NbXSA9IHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAg ICAgICAvKiBBU1JvY2sgSVRYKi8KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICB7IDB4MzE4NSwg MHgxODQ5LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rp c2FibGVkX3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICB7IDB4MzE4NCwgMHgxODQ5 LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rpc2FibGVk X3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAg LyogR29vZ2xlIFBpeGVsYm9vayAqLwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHsgMHg1OTFF LCAweDgwODYsIDB4MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4gPiBxdWlya19zaGlmdF9lZHBfYmFj a2xpZ2h0X2JyaWdodG5lc3MgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfTsKPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiAgdm9pZCBpbnRlbF9pbml0X3F1aXJrcyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+IGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+IGluZGV4 IGU0ZjdmNjUxODk0NWIuLmNjOTNiZWRlNGZhYjggMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPiA+ID4gPiA+ID4gPiA+ID4g PiBAQCAtNTI1LDYgKzUyNSw3IEBAIHN0cnVjdCBpOTE1X3BzciB7Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gICNkZWZpbmUgUVVJUktfUElOX1NXSVpaTEVEX1BBR0VTICgxPDw1KQo+ID4gPiA+ID4gPiA+ ID4gPiA+ICAjZGVmaW5lIFFVSVJLX0lOQ1JFQVNFX1QxMl9ERUxBWSAoMTw8NikKPiA+ID4gPiA+ ID4gPiA+ID4gPiAgI2RlZmluZSBRVUlSS19JTkNSRUFTRV9ERElfRElTQUJMRURfVElNRSAoMTw8 NykKPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hU X0JSSUdIVE5FU1MgKDE8PDgpCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ ID4gIHN0cnVjdCBpbnRlbF9mYmRldjsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgc3RydWN0IGludGVs X2ZiY193b3JrOwo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gLS0KPiA+ID4g PiA+ID4gPiA+ID4gSmFuaSBOaWt1bGEsIEludGVsIE9wZW4gU291cmNlIEdyYXBoaWNzIENlbnRl cgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gLS0KPiA+ID4gPiA+ID4gVmlsbGUgU3lyasOkbMOk Cj4gPiA+ID4gPiA+IEludGVsCj4gPiA+ID4gPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCj4gPiA+ID4gPiA+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QK PiA+ID4gPiA+ID4gSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+ID4gPiBo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+ ID4gPiA+ID4gCj4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gVmlsbGUgU3lyasOkbMOkCj4gPiA+ID4g PiBJbnRlbAotLSAKQ2hlZXJzLAoJTHl1ZGUgUGF1bCAoc2hlL2hlcikKCVNvZnR3YXJlIEVuZ2lu ZWVyIGF0IFJlZCBIYXQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1k ZXZlbAo= 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=-9.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable 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 97A09C2D0E2 for ; Tue, 22 Sep 2020 21:31:02 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 439DC20757 for ; Tue, 22 Sep 2020 21:31:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="M/1EdI+L" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 439DC20757 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 806766E364; Tue, 22 Sep 2020 21:30:57 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 658286E364 for ; Tue, 22 Sep 2020 21:30:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1600810251; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=M/1EdI+Liibe8ax1XBbR8dGNZdr0fWsCkXk7dTiI0UTpyNwKTJNK7jJfYXwNzmCUrf2IG1 XBBSf7iiAOHCmeRc6M+27h0s+YCdf5LNNRLjgD6yZt0MaX1UwAedO45qb6xUENTz7mNbkc OSdRJgVxMoAUD+RBq0wDaZmGpgbH30g= Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-451-nZSEolbJP2yfMJ4REev8LA-1; Tue, 22 Sep 2020 17:30:42 -0400 X-MC-Unique: nZSEolbJP2yfMJ4REev8LA-1 Received: by mail-qt1-f198.google.com with SMTP id f12so17394993qtq.5 for ; Tue, 22 Sep 2020 14:30:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=wMcbdg3OL7L4nWZgtpOymh/0pK9VUsln15fyBfQ/GWI=; b=pp9GKSjnSDm3qSIVMdBAdJImnXgPna6zifaviw0W2RmpqQqSkEIWHq2LviPzPg5+zk h/Mi58nAPtz5eW9EB3Am+SJRZsmdoFQaqf0CfL1zzhwKFScQYHsT2r7AmAgI4TlvY1pK Wd/4Z61IP7tqOI1EvwV48F/AdVGrLGmYDmEg5i0s0zpTrFg4hSzyZjTpZEfW2YIV3XOs IGhbJBSeDasoyms1lkkQwi2t78PC8pyUD07fAVEjND9yQR8ZbNjXFGsYvPziMuyJ8DQD sSGcUUh2VGq+5c+4L+ESe51lPkqgi+dtilWNl/Hi4GtEmAOzpwd93o9o7QXk7nKb2YyB D2Xw== X-Gm-Message-State: AOAM532GT1DzUWwbv5sJB689pHf0juwTM3PPWw8ZOOAM8qD6d+/n1iTN 26tlehNEUr7SjzwWGdQyTE4k750LCTbabET25WNlAc/cUXSQNEj4Hrg8cnbNizV+1nXRVBS1R2z MgP7wjXPhH6psyAvfoXgPgVI2UDRN X-Received: by 2002:a37:6610:: with SMTP id a16mr6662242qkc.134.1600810241135; Tue, 22 Sep 2020 14:30:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxadCWQymNw7jDGAAG/XN93DJ3APDI9Zl3oX2US1BhpCsSEN+8GYZy3nYMIjQkNybAU65+0dA== X-Received: by 2002:a37:6610:: with SMTP id a16mr6662199qkc.134.1600810240530; Tue, 22 Sep 2020 14:30:40 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id k22sm12228360qkk.13.2020.09.22.14.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Sep 2020 14:30:38 -0700 (PDT) Message-ID: From: Lyude Paul To: Puthikorn Voravootivat , Kevin Chowski Date: Tue, 22 Sep 2020 17:30:36 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" SGkhIFNpbmNlIEkgZ290IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLCBtYW55IHJlc3BvbnNlcyBp bmxpbmUKCk9uIFR1ZSwgMjAyMC0wOS0yMiBhdCAxMjo1OCAtMDcwMCwgUHV0aGlrb3JuIFZvcmF2 b290aXZhdCB3cm90ZToKPiArTHl1ZGUKPiBJIG5vdGljZSB0aGF0IEx5dWRlIGVtYWlsIHdhcyBz b21laG93IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLgo+IEx5dWRlIHdhcyB0aGUgcGVyc29uIHdo byBzdWJtaXR0ZWQgdGhlIHBhdGNoIGZvciBUaGlua3BhZCBhbmQgc2hvdWxkCj4ga25vdyB0aGUg T1VJIG9mIHRoZSBwYW5lbC4KCm5vIG5lZWQgLSBjdXJyZW50bHkgYmVjYXVzZSBvZiBzb21lIGNv bmZ1c2lvbiB0aGF0IGdvdCBjYXVzZWQgYnkgdGhlIEludGVsIEhEUgpiYWNrbGlnaHQgaW50ZXJm YWNlIGJlaW5nIHRoZSBvbmx5IGJhY2tsaWdodCBpbnRlcmZhY2UgdGhhdCB3b3JrcyBwcm9wZXJs eSBvbgphIGxvdCBvZiBwYW5lbHMgKG1hbnkgcGFuZWxzIHdpbGwgYWR2ZXJ0aXNlIGJvdGggaW50 ZXJmYWNlcywgYnV0IG1pZ2h0IG9ubHkKd29yayB3aXRoIHRoZSBJbnRlbCBvbmUpLCB3ZSBhY3R1 YWxseSByZWx5IG9uIGEgc21hbGwgYWxsb3dsaXN0IG9mICJhcHByb3ZlZCIKcGFuZWxzIGZvciBl bmFibGluZyBEUENEIGJhY2tsaWdodCBjb250cm9sLgoK4oCmaG93ZXZlciwgbWFueSBvZiB0aGVz ZSBwYW5lbHMgYXJlIGFubm95aW5nIGFuZCBkb24ndCBhY3R1YWxseSBwcm92aWRlIGEKcmVsaWFi bGUgZW5vdWdoIE9VSUQgdG8gdXNlIGZvciBxdWlyayBkZXRlY3Rpb24sIHdoaWNoIGlzIHdoeSB3 ZSBoYWQgdG8gYWRkCkVESUQgcXVpcmsgZGV0ZWN0aW9uIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91 bmQgZm9yIHRoaXMuIFRoZSBjdXJyZW50IGxpc3Qgb2YKcGFuZWxzIGxpdmVzIGluIGRybV9kcF9o ZWxwZXIuYzoKCi8qCiAqIFNvbWUgZGV2aWNlcyBoYXZlIHVucmVsaWFibGUgT1VJRHMgd2hlcmUg dGhleSBkb24ndCBzZXQgdGhlIGRldmljZSBJRAogKiBjb3JyZWN0bHksIGFuZCBhcyBhIHJlc3Vs dCB3ZSBuZWVkIHRvIHVzZSB0aGUgRURJRCBmb3IgZmluZGluZyBhZGRpdGlvbmFsCiAqIERQIHF1 aXJrcyBpbiBzdWNoIGNhc2VzLgogKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBlZGlkX3F1aXJrIGVk aWRfcXVpcmtfbGlzdFtdID0gewoJLyogT3B0aW9uYWwgNEsgQU1PTEVEIHBhbmVsIGluIHRoZSBU aGlua1BhZCBYMSBFeHRyZW1lIDJuZCBHZW5lcmF0aW9uCgkgKiBvbmx5IHN1cHBvcnRzIERQQ0Qg YmFja2xpZ2h0IGNvbnRyb2xzCgkgKi8KCXsgTUZHKDB4NGMsIDB4ODMpLCBQUk9EX0lEKDB4NDEs IDB4NDEpLCBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCgkvKgoJICogU29t ZSBEZWxsIENNTCAyMDIwIHN5c3RlbXMgaGF2ZSBwYW5lbHMgc3VwcG9ydCBib3RoIEFVWCBhbmQg UFdNCgkgKiBiYWNrbGlnaHQgY29udHJvbCwgYW5kIHNvbWUgb25seSBzdXBwb3J0IEFVWCBiYWNr bGlnaHQgY29udHJvbC4gQWxsCgkgKiBzYWlkIHBhbmVscyBzdGFydCB1cCBpbiBBVVggbW9kZSBi eSBkZWZhdWx0LCBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkKCSAqIHN1cHBvcnQgZm9yIGRpc2FibGlu ZyBIRFIgbW9kZSBvbiB0aGVzZSBwYW5lbHMgd2hpY2ggd291bGQgYmUKCSAqIHJlcXVpcmVkIHRv IHN3aXRjaCB0byBQV00gYmFja2xpZ2h0IGNvbnRyb2wgbW9kZSAocGx1cywgSSdtIG5vdAoJICog ZXZlbiBzdXJlIHdlIHdhbnQgUFdNIGJhY2tsaWdodCBjb250cm9scyBvdmVyIERQQ0QgYmFja2xp Z2h0CgkgKiBjb250cm9scyBhbnl3YXkuLi4pLiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHdheSBv ZiBkZXRlY3RpbmcgdGhlc2UsCgkgKiBmb3JjZSBEUENEIGJhY2tsaWdodCBtb2RlIG9uIGFsbCBv ZiB0aGVtLgoJICovCgl7IE1GRygweDA2LCAweGFmKSwgUFJPRF9JRCgweDliLCAweDMyKSwgQklU KERQX1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAoJeyBNRkcoMHgwNiwgMHhhZiksIFBS T0RfSUQoMHhlYiwgMHg0MSksIEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tMSUdIVCkgfSwK CXsgTUZHKDB4NGQsIDB4MTApLCBQUk9EX0lEKDB4YzcsIDB4MTQpLCBCSVQoRFBfUVVJUktfRk9S Q0VfRFBDRF9CQUNLTElHSFQpIH0sCgl7IE1GRygweDRkLCAweDEwKSwgUFJPRF9JRCgweGU2LCAw eDE0KSwgQklUKERQX1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAoJeyBNRkcoMHg0Yywg MHg4MyksIFBST0RfSUQoMHg0NywgMHg0MSksIEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tM SUdIVCkgfSwKfTsKCkFsc28gbm90ZSB0aGF0IEkgdGhpbmsganVzdCBhYm91dCBldmVyeSBwYW5l bCBvbiB0aGF0IGxpc3Qgc3VwcG9ydHMgdGhlIEludGVsCkhEUiBiYWNrbGlnaHQgaW50ZXJmYWNl LCBzbyBpdCdzIC1wb3NzaWJsZS0gdGhhdCB0aGUgVkVTQSBpbnRlcmZhY2UgY291bGQgYmUKYnJv a2VuIG9uIHRoZXNlIHBhbmVscy4gQnV0LCB0aGF0IHdvdWxkIGJlIGEgbG90IG9mIGRpZmZlcmVu dCBwYW5lbHMgZnJvbQpkaWZmZXJlbnQgdmVuZG9ycyB0byBhbGwgYmUgYnJva2VuIGluIHRoZSBz YW1lIHdheS4KCj4gCj4gT24gVHVlLCBTZXAgMjIsIDIwMjAgYXQgMTE6NDcgQU0gS2V2aW4gQ2hv d3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gQWxyaWdodHksIEknbGwgdGFr ZSBldmVyeW9uZSBlbHNlJ3Mgc2lsZW5jZSBhcyB0YWNpdCBhcHByb3ZhbCBvZgo+ID4gVmlsbGUn cyBvcGluaW9ucy4gKEkgZGlkbid0IHJlY2VpdmUgYW55IGVtYWlsIGJvdW5jZXMgdGhpcyB0aW1l LCBzbyBJCj4gPiB0aGluayBteSBpc3N1ZSB3YXMgdHJhbnNpZW50LikgSSB3aWxsIHN0YXJ0IG9u IGludmVydGluZyB0aGUgcXVpcmsgYW5kCj4gPiBtYWtpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQt YWxpZ25tZW50IG1hdHRlciBmb3IgdGhlc2UgcmVnaXN0ZXJzIGJ5Cj4gPiBkZWZhdWx0Lgo+ID4g Cj4gPiBXaG8gY2FuIGhlbHAgbWUgZ2F0aGVyIGEgbGlzdCBvZiBPVUlzIHRoYXQgd2UgbmVlZCB0 byBhZGQgdG8gdGhlCj4gPiBxdWlyaz8gSSBjYW4gZm9sbG93IHVwIHdpdGggUHV0aGlrb3JuIGFi b3V0IHRoZSByZWxldmFudCBDaHJvbWVib29rcywKPiA+IGJ1dCBJIGRvbid0IGtub3cgd2hhdCBv dGhlciB0eXBlcyBvZiBsYXB0b3BzIGFyZSB1c2luZyB0aGlzIGRyaXZlci4KPiA+IAo+ID4gVGhh bmtzIGZvciB5b3VyIHRpbWUsCj4gPiBLZXZpbiBDaG93c2tpCj4gPiAKPiA+IAo+ID4gT24gRnJp LCBTZXAgMTgsIDIwMjAgYXQgMTI6MTYgUE0gUHV0aGlrb3JuIFZvcmF2b290aXZhdAo+ID4gPHB1 dGhpa0BjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gPiBJJ2xsIGRlZmVyIHRvIFZpbGxlICYgTHl1 ZGUuCj4gPiA+IAo+ID4gPiBJIGR1ZyB1cCBtb3JlIG9uIHRoZSBidWcgcmVwb3J0IGFuZCBmb3Vu ZCB0aGF0IGJvdGggVGhpbmtwYWQgYW5kCj4gPiA+IEdhbGF4eSBDaHJvbWVib29rIHVzZSB0aGUg c2FtZSBTYW1zdW5nIE9MRUQuCj4gPiA+IFNvIG15IDIgdnMgMSBhcmd1bWVudCBpcyBhY3R1YWxs eSBub3QgdmFsaWQuCj4gPiA+IAo+ID4gPiBPbiBGcmksIFNlcCAxOCwgMjAyMCBhdCAxMDo1OSBB TSBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gd3JvdGU6Cj4gPiA+ ID4gQXBvbG9naWVzIG9uY2UgYWdhaW4sIHNvbWUgb2YgbXkgZW1haWxzIHdlcmUgYm91bmNpbmcg Zm9yIHNvbWUKPiA+ID4gPiBhZGRyZXNzZXMgeWVzdGVyZGF5LiBIb3BlZnVsbHkgaXQgd2FzIGEg dGVtcG9yYXJ5IGNvbmRpdGlvbjsgSSdsbAo+ID4gPiA+IGNvbnRpbnVlIHRyeWluZyB0byBkaWcg aW50byBpdCBvbiBteSBlbmQgaWYgaXQgaGFwcGVucyBhZ2FpbiBmb3IgdGhpcwo+ID4gPiA+IGVt YWlsLgo+ID4gPiA+IAo+ID4gPiA+IFNpbmNlIHRoZXJlJ3MgZXZpZGVuY2UgdGhhdCBzb21lIG1v ZGVscyB3YW50IGxzYiBhbmQgc29tZSAod2VsbCwgYXQKPiA+ID4gPiBsZWFzdCBvbmUpIHdhbnQg bXNiLCBteSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgd2UnbGwgbmVlZCBhIHF1aXJrIG9uZQo+ID4g PiA+IHdheSBvciB0aGUgb3RoZXIgKHBsZWFzZSBjb3JyZWN0IGlmIEknbSBtaXN0YWtlbikuIEkg dW5mb3J0dW5hdGVseQo+ID4gPiA+IGRvbid0IGhhdmUgdGhlIGFiaWxpdHkgdG8gdGVzdCBhbnl0 aGluZyBvdGhlciB0aGFuIHRoZSBQaXhlbGJvb2ssIHNvCj4gPiA+ID4gaWYgd2UgZGVjaWRlIHRo ZSBtc2IgaXMgdGhlICJyaWdodCIgd2F5LCB0aGVuIEkgd2lsbCBoYXZlIHRvIHJlbHkgb24KPiA+ ID4gPiBvdGhlcnMgdG8gdGVzdCAoYW5kIGZpbmQgdGhlIE9VSSBvZikgb3RoZXIgbW9kZWxzIHdo aWNoIHJlcXVpcmUgbHNiLgo+ID4gPiA+IAo+ID4gPiA+IEkgYW0gaGFwcHkgdG8gbWFrZSBhbnkg Y2hhbmdlcyByZXF1ZXN0ZWQsIGJ1dCBJIGRvIG5vdCBhdCBhbGwgaGF2ZQo+ID4gPiA+IGVub3Vn aCBiYWNrZ3JvdW5kIGhlcmUgdG8gbWFrZSB0aGUgZGVjaXNpb24gb24gd2hldGhlciB0aGUgbXNi Cj4gPiA+ID4gZnVuY3Rpb25hbGl0eSBkZXNlcnZlcyB0aGUgcXVpcmsgb3IgaWYgdGhlIGxzYiBv bmUgZG9lcy4gSG93IGNhbiBJCj4gPiA+ID4gaGVscCB5b3UgYWxsIGNvbWUgdG8gYW4gYWdyZWVt ZW50IGhlcmU/Cj4gPiA+ID4gCj4gPiA+ID4gKiBJdCBzZWVtcyBsaWtlIFZpbGxlIGZlZWxzIHN0 cm9uZ2x5IGFib3V0IHRoZSBtc2IgYmVpbmcgdGhlIGNvcnJlY3QKPiA+ID4gPiBpbnRlcnByZXRh dGlvbiBvZiB0aGUgc3BlYy4KPiA+ID4gPiAqIEl0J3MgdW5jbGVhciB0byBtZSBvbiB3aGljaCBz aWRlIG9mIHRoZSBmZW5jZSBMeXVkZSBmYWxscywgSQo+ID4gPiA+IGNvdWxkbid0IHBpY2sgdXAg YSBzdHJvbmcgb3BpbmlvbiBpbiBoZXIgY2xhcmlmeWluZyBxdWVzdGlvbi4KPiA+ID4gPiAqIFB1 dGhpa29ybiBzZWVtcyB0byBiZSBvbiB0aGUgc2lkZSBvZiBsc2IgYmVpbmcgY29ycmVjdCwgYnV0 IG1heWJlCj4gPiA+ID4gd2FzIHN3YXllZCBieSBWaWxsZSdzIGFyZ3VtZW50LgoKSG9uZXN0bHkg SSdtIG5vdCBoYXJkIHRvIGNvbnZpbmNlIDpQLCBpZiBpdCBsb29rcyBsaWtlIHdlIGdvdCB0aGUg Yml0IHNoaWZ0Cndyb25nIGZvciB0aGUgbWFqb3JpdHkgb2YgZGV2aWNlcyBhbmQgZXZlcnlvbmUg ZWxzZSBhZ3JlZXMgdGhlbiBJJ20gZmluZSB3aXRoCmFzc3VtaW5nIHRoYXQncyB0aGUgY2FzZS4g SSdtIGp1c3QgcXVpdGUgc3VycHJpc2VkLCBzZWVpbmcgYXMgd2UndmUgdGVzdGVkCm1hbnkgZGlm ZmVyZW50IHBhbmVscyBmcm9tIGEgZmV3IHZlbmRvcnMgYW5kIGhhdmVuJ3QgcnVuIGludG8gYW55 IGlzc3VlcyB3aXRoCnRoaXMgYmVmb3JlLgoKSG9uZXN0bHkgLSBpZiB0aGVyZSdzIHRoaXMgbXVj aCB1bmNlcnRhaW50eSBhYm91dCBpdCwgbWF5YmUgd2Ugc2hvdWxkIGp1c3QgYXNrClZFU0EgZGly ZWN0bHkgd2hhdCB0aGUgY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGlzPyBOb3RlIEkn bSBub3Qgb24gdGhlClZFU0EgYm9hcmQgKEkgZ2V0IGFjY2VzcyB0byBEUC9lRFAgc3BlY3MgdGhy b3VnaCBYLm9yZykgc28gdW5sZXNzIHRoZSBjb250YWN0cwpJJ3ZlIGdvdCBmcm9tIFZFU0Egd291 bGQgd29yayAoQmlsbCBMZW1wZXNpcyBiaWxsIGF0IHZlc2EgZG90IG9yZykgZm9yIHRoYXQgaXQK bWlnaHQgYmUgYSBiZXR0ZXIgaWRlYSBmb3Igc29tZW9uZSBmcm9tIEdvb2dsZSBvciBJbnRlbCB0 byBhc2suCgo+ID4gPiA+IAo+ID4gPiA+IElmIG5vIG9uZSBmZWVscyB0aGF0IFZpbGxlJ3MgYXJn dW1lbnQgaXMgbm90IHN0cm9uZyBpbiBzb21lIHdheSwgYW5kCj4gPiA+ID4gd2UgZ28gd2l0aCB0 aGF0LCBJIHdpbGwgZ2V0IHRvIHdvcmsgb24gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzLiBJIGFtCj4g PiA+ID4gY29uY2VybmVkLCB0aG91Z2gsIGFib3V0IGNoYW5naW5nIHRoZSBkZWZhdWx0IGZ1bmN0 aW9uYWxpdHkgd2l0aG91dAo+ID4gPiA+IHRlc3RpbmcgaXQgd2lkZWx5IHRvIGZpbmQgdGhlIHNl dCBvZiBsYXB0b3BzIHdoaWNoIHJlcXVpcmUgdGhlIGxzYgo+ID4gPiA+IHF1aXJrLiBJJ2QgYXBw cmVjaWF0ZSBhbnkgYWR2aWNlIHBlb3BsZSBtaWdodCBoYXZlIGFib3V0IG1ha2luZyB0aGlzCj4g PiA+ID4gY2hhbmdlIHNhZmVseS4KClVzdWFsbHksIEkganVzdCB0cnkgdG8gc3RpY2sgd2l0aCB3 aGF0IHRoZSBtYWpvcml0eSBvZiBtYWNoaW5lcyBuZWVkIHRvIGRvLiBJCnN0aWxsIHRoaW5rIGl0 J2QgYmUgYSBnb29kIGlkZWEgZm9yIHVzIHRvIHZlcmlmeSB0aGlzIHdpdGggVkVTQSBpZiB0aGVy ZSdzCnRoYXQgbXVjaCBjb25mdXNpb24gdGhvdWdoCgo+ID4gPiA+IAo+ID4gPiA+IFRoYW5rIHlv dSBmb3IgeW91ciB0aW1lLAo+ID4gPiA+IEtldmluCj4gPiA+ID4gCj4gPiA+ID4gT24gVGh1LCBT ZXAgMTcsIDIwMjAgYXQgMjoxMSBQTSBWaWxsZSBTeXJqw6Rsw6QKPiA+ID4gPiA8dmlsbGUuc3ly amFsYUBsaW51eC5pbnRlbC5jb20+IHdyb3RlOgo+ID4gPiA+ID4gT24gVGh1LCBTZXAgMTcsIDIw MjAgYXQgMDk6MjU6MzVQTSArMDMwMCwgVmlsbGUgU3lyasOkbMOkIHdyb3RlOgo+ID4gPiA+ID4g PiBPbiBUaHUsIFNlcCAxNywgMjAyMCBhdCAxMToxNDo0M0FNIC0wNzAwLCBQdXRoaWtvcm4gVm9y YXZvb3RpdmF0Cj4gPiA+ID4gPiA+IHdyb3RlOgo+ID4gPiA+ID4gPiA+IFRoZSBMeXVkZSBmZGU3 MjY2ZmIyZjYgY2hhbmdlIGlzIGFjdHVhbGx5IGJhc2VkIG9uIENocm9taXVtCj4gPiA+ID4gPiA+ ID4gY2hhbmdlCj4gPiA+ID4gPiA+ID4gKGh0dHBzOi8vY3JyZXYuY29tL2MvMTY1MDMyNSkgdGhh dCBmaXhlcyB0aGUgYnJpZ2h0bmVzcyBmb3IKPiA+ID4gPiA+ID4gPiBTYW1zdW5nCj4gPiA+ID4g PiA+ID4gR2FsYXh5IENocm9tZWJvb2suIFNvIGN1cnJlbnRseSB3ZSBoYXZlIDIgZXhhbXBsZXMg dGhhdCB1c2UgTFNCCj4gPiA+ID4gPiA+ID4gaW50ZXJwcmV0YXRpb24gYW5kIDEgdGhhdCB1c2Ug TVNCLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gIklmIGZpZWxkIDQ6MCBvZiB0aGUgRURQX1BX TUdFTl9CSVRfQ09VTlQgcmVnaXN0ZXIgcmVwcmVzZW50cyBhCj4gPiA+ID4gPiA+IHZhbHVlCj4g PiA+ID4gPiA+IG9mIGdyZWF0ZXIgdGhhbiA4IGFuZCB0aGUgQkFDS0xJR0hUX0JSSUdIVE5FU1Nf QllURV9DT1VOVCBiaXQKPiA+ID4gPiA+ID4gaXMgY2xlYXJlZCB0byAwLCBvbmx5IHRoZSA4IE1T QiBvZiB0aGUgYnJpZ2h0bmVzcyBjb250cm9sIHZhbHVlCj4gPiA+ID4gPiA+IGNhbiBiZQo+ID4g PiA+ID4gPiBjb250cm9sbGVkLgo+ID4gPiA+ID4gPiAoU2VlIE5vdGUgYmVsb3cuKQo+ID4gPiA+ ID4gPiBBc3NpZ25lZCBiaXRzIGFyZSBhbGxvY2F0ZWQgdG8gdGhlIE1TQiBvZiB0aGUgZW5hYmxl ZCByZWdpc3Rlcgo+ID4gPiA+ID4gPiBjb21iaW5hdGlvbi4iCj4gPiA+ID4gPiA+IAo+ID4gPiA+ ID4gPiBJIHRoaW5rIHRoYXQncyBwcmV0dHkgY2xlYXIgdGhlIGFzc2lnbmVkIGJpdHMgYXJlIHN1 cHBvc2VkIHRvIGJlCj4gPiA+ID4gPiA+IG1zYiBhbGlnbmVkLgo+ID4gPiA+ID4gCj4gPiA+ID4g PiBJIGd1ZXNzIHRoZXJlJ3Mgc29tZSBlbWFpbCBpc3N1ZXMgaGFwcGVuaW5nLCBidXQganVzdCB0 byBjbGFyaWZ5Ogo+ID4gPiA+ID4gCj4gPiA+ID4gPiBXaGVuIHRoZSBzcGVjIHNheXMgTVNCIGlu IGNhcHMgaGVyZSBpdCBjbGVhcmx5IG1lYW5zCj4gPiA+ID4gPiAibW9zdCBzaWduaWZpY2FudC1i aXQocykiIHNpbmNlIG90aGVyd2lzZSAiOCBNU0IiIHdvdWxkIG5vdCBtYWtlCj4gPiA+ID4gPiBh bnkgc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSAyIGJ5dGUgdmFsdWUuCj4gPiA+ID4gPiAKPiA+ ID4gPiA+IEdyYW50ZWQgdGhlIHNwZWMgaXMgY3JhcCBoZXJlIHNpbmNlICJUYWJsZSAxLTE6IEFj cm9ueW1zIGFuZAo+ID4gPiA+ID4gSW5pdGlhbGlzbSIgZG9lcyBjbGFpbSAiTVNCIiBzaG91bGQg YmUgYnl0ZShzKSBhbmQgIm1zYiIgYml0KHMpLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBBbHNvIEkg Y2FuJ3QgaW1hZ2luZSBhbnlvbmUgd291bGQgYWxsb2NhdGUgdGhlIGJpdHMgc3RhcnRpbmcKPiA+ ID4gPiA+IGZyb20gdGhlIGxzYiB3aGVuIHRoZSB3aG9sZSB0aGluZyBpcyBjbGVhcmx5IHN1cHBv c2VkIHRvIGJlIGEKPiA+ID4gPiA+IDE2Yml0IGJpZyBlbmRpYW4gaW50ZWdlci4gU28gd2l0aCA+ OCBhc3NpZ25lZCBiaXRzIHlvdSdkIGVuZAo+ID4gPiA+ID4gdXAgd2l0aCBjcmF6eSBzdHVmZiBs aWtlIHRoaXM6Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IFsgNyAuLi4gMCBdWzcgICAuLi4gICAwXQo+ ID4gPiA+ID4gWyA4IE1TQiAgIF1bWFhYWF1bTiBMU0JdCj4gPiA+ID4gPiAKPiA+ID4gPiA+IHNv IHlvdSBjb3VsZG4ndCBldmVuIHRyZWF0IHRoZSB2YWx1ZSBhcyBhIHJlZ3VsYXIgYmlnIGVuZGlh bgo+ID4gPiA+ID4gdGhpbmcuIEluc3RlYWQsIGlmIHlvdSBzcXVpbnQgYSBiaXQsIGl0IG5vdyBs b29rcyBsaWtlIGEgZnVua3kKPiA+ID4gPiA+IGxpdHRsZSBlbmRpYW4gdmFsdWUuIFNvIHdlJ3Jl IGRlZXAgaW50byBzb21lIG1peGVkIGVuZGlhbiBsYW5kCj4gPiA+ID4gPiB3aGVyZSBub3RoaW5n IG1ha2VzIHNlbnNlIGFueW1vcmUuCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEFueXdheXMgSSB0aGlu ayB0aGUgY29kZSBzaG91bGQgc2ltcGx5IGRvIHRoaXMgdG8gbWF0Y2ggdGhlIHNwZWM6Cj4gPiA+ ID4gPiB1MTYgdmFsdWUgPSBicmlnaHRuZXNzIDw8ICgxNiAtIG51bV9hc3NpZ25lZF9iaXRzKTsK PiA+ID4gPiA+IHZhbFswXSA9IHZhbHVlID4+IDg7Cj4gPiA+ID4gPiB2YWxbMV0gPSB2YWx1ZSAm IDB4ZmY7Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ IE9uIFRodSwgU2VwIDE3LCAyMDIwIGF0IDEwOjU1IEFNIEtldmluIENob3dza2kgPAo+ID4gPiA+ ID4gPiA+IGNob3dza2lAY2hyb21pdW0ub3JnPiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+IEFwb2xv Z2llcyBmb3IgYmVpbmcgdG9vIHZhZ3VlLiBUbyBiZSBhcyBwcmVjaXNlIEkgY2FuIGJlLCBoZXJl Cj4gPiA+ID4gPiA+ID4gPiBpcyB0aGUKPiA+ID4gPiA+ID4gPiA+IHNwZWNpZmljIGNvZGUgZGVs dGEgSSB0ZXN0ZWQ6IGh0dHBzOi8vY3JyZXYuY29tL2MvMjQwNjYxNiAuIFRvCj4gPiA+ID4gPiA+ ID4gPiBhbnN3ZXIKPiA+ID4gPiA+ID4gPiA+IHlvdXIgb3RoZXIgcXVlc3Rpb24sIHRoZSBjb2Rl IEkgdGVzdGVkIGFnYWluc3QgaXMgaW5kZWVkCj4gPiA+ID4gPiA+ID4gPiBpbmNsdWRpbmcgdGhl Cj4gPiA+ID4gPiA+ID4gPiBmZGU3MjY2ZmIyZjYgKGRlc3BpdGUgb3N0ZW5zaWJseSBiZWluZyBj YWxsZWQgNS40IGluIG15IGNvbW1pdAo+ID4gPiA+ID4gPiA+ID4gbWVzc2FnZSk6IG91ciBjdXJy ZW50IHRvcC1vZi10cmVlIGZvciBvdXIgNS40IGJyYW5jaCBpbmNsdWRlcwo+ID4gPiA+ID4gPiA+ ID4gdGhlCj4gPiA+ID4gPiA+ID4gPiBpbnRlbF9kcF9hdXhfY2FsY19tYXhfYmFja2xpZ2h0IGxv Z2ljLiBGdXJ0aGVyLCBJJ2xsIG5vdGUgdGhhdAo+ID4gPiA+ID4gPiA+ID4gY2hhbmdlCj4gPiA+ ID4gPiA+ID4gPiBpcyBleGFjdGx5IHRoZSBjaGFuZ2Ugd2hpY2ggYnJlYWtzIG15IFBpeGVsYm9v ayBtb2RlbDogcHJpb3IKPiA+ID4gPiA+ID4gPiA+IHRvIHRoZQo+ID4gPiA+ID4gPiA+ID4gY2hh bmdlLCB0aGUgbWF4X2JyaWdodG5lc3Mgd2FzIGhhcmQtY29kZWQgdG8gMHhGRkZGIGFuZCB0aGUK PiA+ID4gPiA+ID4gPiA+IG1hdGgKPiA+ID4gPiA+ID4gPiA+IHdvcmtlZCBvdXQgdGhhdCBpdCBk aWRuJ3QgbWF0dGVyIHRoYXQgdGhlIGhhcmR3YXJlIGNhcmVkIGFib3V0Cj4gPiA+ID4gPiA+ID4g PiB0aGUgTVNCCj4gPiA+ID4gPiA+ID4gPiBkZXNwaXRlIHRoZSBkcml2ZXIgY29kZSBjYXJpbmcg YWJvdXQgdGhlIExTQi4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gVG8gYW5zd2Vy IFZpbGxlJ3MgcXVlc3Rpb246IHRoZSBmZGU3MjY2ZmIyZjYgY2hhbmdlIHdoaWNoCj4gPiA+ID4g PiA+ID4gPiBmaXhlcyBvbmUKPiA+ID4gPiA+ID4gPiA+IGxhcHRvcCAoSSBiZWxpZXZlIFRoaW5r cGFkIFgxIGV4dHJlbWUgR2VuIDIsIGZyb20gc29tZSBidWcKPiA+ID4gPiA+ID4gPiA+IHJlcG9y dHMgSQo+ID4gPiA+ID4gPiA+ID4gZHVnIHVwKSBhbmQgYnJlYWtzIGFub3RoZXIgKFBpeGVsYm9v ayk7IHNvIHVuZm9ydHVuYXRlbHkgSQo+ID4gPiA+ID4gPiA+ID4gYmVsaWV2ZSB3ZQo+ID4gPiA+ ID4gPiA+ID4gbmVlZCBhIHF1aXJrIGF0IGxlYXN0IGZvciBzb21lIGxhcHRvcC4gUmVhZGluZyB0 aHJvdWdoIHRoZQo+ID4gPiA+ID4gPiA+ID4gY29weSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+IGRh dGFzaGVldCBJIGhhdmUsIGl0IHdhc24ndCBjbGVhciB0byBtZSB3aGljaCB3YXMgdGhlIGNvcnJl Y3QKPiA+ID4gPiA+ID4gPiA+IGludGVycHJldGF0aW9uLiBJJ20gY2MnaW5nIHB1dGhpa0AsIHdo byB3YXMgbGVhbmluZyB0b3dhcmQgdGhlCj4gPiA+ID4gPiA+ID4gPiBjdXJyZW50Cj4gPiA+ID4g PiA+ID4gPiBrZXJuZWwgY29kZSAoY2FyaW5nIGFib3V0IExTQikgYmVpbmcgdGhlIGNvcnJlY3QK PiA+ID4gPiA+ID4gPiA+IGludGVycHJldGF0aW9uLiBJCj4gPiA+ID4gPiA+ID4gPiBiZWxpZXZl IHdlIGhhdmUgb3RoZXIgY2hyb21lYm9va3Mgd2hpY2ggZG8gcmVseSBvbiBMU0IKPiA+ID4gPiA+ ID4gPiA+IGZ1bmN0aW9uYWxpdHksCj4gPiA+ID4gPiA+ID4gPiBzbyB1bmxlc3Mgd2UgY2FuIGZp bmQgbW9yZSBleGFtcGxlcyBvZiBsYXB0b3BzIHdhbnRpbmcgTVNCIGl0Cj4gPiA+ID4gPiA+ID4g PiBjdXJyZW50bHkgbG9va3MgbGlrZSBQaXhlbGJvb2sgaXMgdGhlIG91dGxpZXIuCj4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IE9uIFRodSwgU2VwIDE3LCAyMDIwIGF0IDExOjI4IEFN IEphbmkgTmlrdWxhCj4gPiA+ID4gPiA+ID4gPiA8amFuaS5uaWt1bGFAbGludXguaW50ZWwuY29t PiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gT24gVGh1LCAxNyBTZXAgMjAyMCwgS2V2aW4gQ2hv d3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmc+Cj4gPiA+ID4gPiA+ID4gPiA+IHdyb3RlOgo+ID4g PiA+ID4gPiA+ID4gPiA+IFdlIGhhdmUgb2JzZXJ2ZWQgdGhhdCBHb29nbGUgUGl4ZWxib29rJ3Mg YmFja2xpZ2h0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gaGFyZHdhcmUgaXMKPiA+ID4gPiA+ID4gPiA+ ID4gPiBpbnRlcnByZXR0aW5nIHRoZXNlIGJhY2tsaWdodCBiaXRzIGZyb20gdGhlIG1vc3QtCj4g PiA+ID4gPiA+ID4gPiA+ID4gc2lnbmlmaWNhbnQgc2lkZSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+ ID4gPiAxNiBiaXQgd29yZCAoaWYgRFBfRURQX1BXTUdFTl9CSVRfQ09VTlQgPCAxNiksIHdoZXJl YXMgdGhlCj4gPiA+ID4gPiA+ID4gPiA+ID4gZHJpdmVyIGNvZGUKPiA+ID4gPiA+ID4gPiA+ID4g PiBhc3N1bWVzIHRoZSBwZXJpcGhlcmFsIGNhcmVzIGFib3V0IHRoZSBsZWFzdC1zaWduaWZpY2Fu dAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJpdHMuCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gPiA+ID4gVGVzdGluZyB3YXMgZG9uZSBmcm9tIHdpdGhpbiBDaHJvbWUgT1MncyBidWls ZCBlbnZpcm9ubWVudAo+ID4gPiA+ID4gPiA+ID4gPiA+IHdoZW4gdGhlCj4gPiA+ID4gPiA+ID4g PiA+ID4gcGF0Y2ggaXMgYmFja3BvcnRlZCB0byA1LjQgKHRoZSB2ZXJzaW9uIHdlIGFyZSBuZXds eQo+ID4gPiA+ID4gPiA+ID4gPiA+IHRhcmdldGluZyBmb3IgdGhlCj4gPiA+ID4gPiA+ID4gPiA+ ID4gUGl4ZWxib29rKTsgZm9yIHRoZSByZWNvcmQ6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgJCBl bWVyZ2UtZXZlLWtlcm5lbG5leHQgc3lzLWtlcm5lbC9jaHJvbWVvcy1rZXJuZWwtNV80Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gJiYgXAo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIC4vdXBkYXRlX2tl cm5lbC5zaCAtLXJlbW90ZT0kSVAKPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ ID4gPiBJIHVzZWQgYC9zeXMva2VybmVsL2RlYnVnL2RyaS8wL2VEUC0xL2k5MTVfZHBjZGAgb24g bXkKPiA+ID4gPiA+ID4gPiA+ID4gPiBsYXB0b3AgdG8gdmVyaWZ5Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gdGhhdCB0aGUgcmVnaXN0ZXJzIHdlcmUgYmVpbmcgc2V0IGFjY29yZGluZyB0byB3aGF0IHRo ZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGFjdHVhbCBoYXJkd2FyZQo+ID4gPiA+ID4gPiA+ID4gPiA+ IGV4cGVjdHM7IEkgYWxzbyBvYnNlcnZlIHRoYXQgdGhlIGJhY2tsaWdodCBpcyBub3RpY2VhYmx5 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0ZXIgd2l0aAo+ID4gPiA+ID4gPiA+ID4gPiA+IHRo aXMgcGF0Y2guCj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBJdCdzIHVuY2xl YXIgdG8gbWUgd2hhdCBrZXJuZWwgdmVyc2lvbiB0aGlzIGlzIGFnYWluc3QsIGFuZAo+ID4gPiA+ ID4gPiA+ID4gPiB3aGF0IHlvdSd2ZQo+ID4gPiA+ID4gPiA+ID4gPiBhY3R1YWxseSB0ZXN0ZWQu Cj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBIYXZlIHlvdSB0cmllZCB2NS43 IGtlcm5lbCB3aXRoIEx5dWRlJ3MgZmRlNzI2NmZiMmY2Cj4gPiA+ID4gPiA+ID4gPiA+ICgiZHJt L2k5MTU6IEZpeCBlRFAKPiA+ID4gPiA+ID4gPiA+ID4gRFBDRCBhdXggbWF4IGJhY2tsaWdodCBj YWxjdWxhdGlvbnMiKT8KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IEkganVz dCB3YW50IHRvIG1ha2Ugc3VyZSB5b3UndmUgdGVzdGVkIHdpdGggYWxsIHRoZSByZWxldmFudAo+ ID4gPiA+ID4gPiA+ID4gPiBmaXhlcwo+ID4gPiA+ID4gPiA+ID4gPiBiZWZvcmUgYWRkaW5nIHF1 aXJrcy4KPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IEJSLAo+ID4gPiA+ID4g PiA+ID4gPiBKYW5pLgo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBTaWdu ZWQtb2ZmLWJ5OiBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gPiA+ ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiAg Li4uL2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jIHwgMzQKPiA+ID4g PiA+ID4gPiA+ID4gPiArKysrKysrKysrKysrKysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfcXVpcmtzLmMgICB8IDEzCj4gPiA+ID4g PiA+ID4gPiA+ID4gKysrKysrKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2Rydi5oICAgICAgICAgICAgICAgfCAgMSArCj4gPiA+ID4gPiA+ID4gPiA+ID4g IDMgZmlsZXMgY2hhbmdlZCwgNDggaW5zZXJ0aW9ucygrKQo+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC5jCj4gPiA+ID4g PiA+ID4gPiA+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9i YWNrbGlnaHQuYwo+ID4gPiA+ID4gPiA+ID4gPiA+IGluZGV4IGFjYmQ3ZWI2NmNiZTMuLjk5Yzk4 ZjIxNzM1NmQgMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiA+ID4gPiA+ ID4gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQu Ywo+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKwo+ID4gPiA+ID4gPiA+ID4gPiA+IGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9kcF9hdXhfYmFja2xpZ2h0LmMKPiA+ID4gPiA+ID4g PiA+ID4gPiBAQCAtOTEsNiArOTEsMjMgQEAgc3RhdGljIHUzMgo+ID4gPiA+ID4gPiA+ID4gPiA+ IGludGVsX2RwX2F1eF9nZXRfYmFja2xpZ2h0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IKPiA+ID4g PiA+ID4gPiA+ID4gPiAqY29ubmVjdG9yKQo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGlmIChp bnRlbF9kcC0+ZWRwX2RwY2RbMl0gJgo+ID4gPiA+ID4gPiA+ID4gPiA+IERQX0VEUF9CQUNLTElH SFRfQlJJR0hUTkVTU19CWVRFX0NPVU5UKQo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAg ICAgbGV2ZWwgPSAocmVhZF92YWxbMF0gPDwgOCB8IHJlYWRfdmFsWzFdKTsKPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICBpZiAoaTkxNS0+cXVpcmtzICYKPiA+ ID4gPiA+ID4gPiA+ID4gPiBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1MpIHsK PiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIGlmICghZHJtX2RwX2RwY2RfcmVhZGIo JmludGVsX2RwLT5hdXgsCj4gPiA+ID4gPiA+ID4gPiA+ID4gRFBfRURQX1BXTUdFTl9CSVRfQ09V TlQsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZyZWFkX3ZhbFswXQo+ID4gPiA+ID4gPiA+ID4gPiA+ICkpIHsKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVk IHRvIHJlYWQgRFBDRAo+ID4gPiA+ID4gPiA+ID4gPiA+IHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9F RFBfUFdNR0VOX0JJVF9DTwo+ID4gPiA+ID4gPiA+ID4gPiA+IFVOVCk7Cj4gPiA+ID4gPiA+ID4g PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgLy8gT25s eSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZSByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgICAgICAgIHJlYWRfdmFsWzBdID0gcmVhZF92YWxbMF0gJiAweDFGOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgaWYgKHJlYWRfdmFsWzBdID4gMTYpIHsKPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiSW52YWxp ZAo+ID4gPiA+ID4gPiA+ID4gPiA+IERQX0VEUF9QV05HRU5fQklUX0NPVU5UIDB4JVgsIGV4cGVj dGVkIGF0IG1vc3QgMTZcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdmFsWzBdKQo+ID4gPiA+ID4gPiA+ID4g PiA+IDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g KyAgICAgICAgICAgICBsZXZlbCA+Pj0gMTYgLSByZWFkX3ZhbFswXTsKPiA+ID4gPiA+ID4gPiA+ ID4gPiArICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ICAg ICAgIHJldHVybiBsZXZlbDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfQo+ID4gPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+IEBAIC0xMDYsNiArMTIzLDIzIEBAIGludGVsX2RwX2F1 eF9zZXRfYmFja2xpZ2h0KGNvbnN0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUsIHUzMiBsZXYKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gZHBf dG9faTkxNShpbnRlbF9kcCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgdTggdmFsc1syXSA9 IHsgMHgwIH07Cj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAg aWYgKGk5MTUtPnF1aXJrcyAmCj4gPiA+ID4gPiA+ID4gPiA+ID4gUVVJUktfU0hJRlRfRURQX0JB Q0tMSUdIVF9CUklHSFRORVNTKSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBp ZiAoIWRybV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gPiA+ID4gPiA+ID4gPiA+ IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsc1swXSkpIHsKPiA+ID4gPiA+ ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRv IHdyaXRlIGF1eAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJhY2tsaWdodCBsZXZlbDogRmFpbGVkIHRv IHJlYWQgRFBDRCByZWdpc3RlciAweCV4XG4iLAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9FRFBfUFdNR0VOX0JJVF8KPiA+ID4g PiA+ID4gPiA+ID4gPiBDT1VOVCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIH0KPiA+ID4g PiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIC8vIE9ubHkgYml0cyA0OjAgYXJlIHVzZWQsIDc6 NSBhcmUgcmVzZXJ2ZWQuCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB2YWxzWzBd ID0gdmFsc1swXSAmIDB4MUY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAo dmFsc1swXSA+IDE2KSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg IERSTV9ERUJVR19LTVMoIkZhaWxlZCB0byB3cml0ZSBhdXgKPiA+ID4gPiA+ID4gPiA+ID4gPiBi YWNrbGlnaHQgbGV2ZWw6IEludmFsaWQgRFBfRURQX1BXTkdFTl9CSVRfQ09VTlQgMHglWCwKPiA+ ID4gPiA+ID4gPiA+ID4gPiBleHBlY3RlZCBhdCBtb3N0IDE2XG4iLAo+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzWzBd KTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4g PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgfQo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgbGV2ZWwgPDw9ICgxNiAtIHZhbHNbMF0pICYgMHhGRkZGOwo+ID4gPiA+ID4gPiA+ ID4gPiA+ICsgICAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgICAgdmFsc1swXSA9IGxldmVsOwo+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICAgIC8qIFdyaXRlIHRoZSBNU0IgYW5kL29yIExTQiAqLwo+ID4gPiA+ID4gPiA+ ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1 aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5 L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gaW5kZXggNDZiZWIxNTVkODM1Zi4u NjNiMjdkNDliMjg2NCAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9xdWlya3MuYwo+ID4gPiA+ID4g PiA+ID4gPiA+IEBAIC01Myw2ICs1MywxNiBAQCBzdGF0aWMgdm9pZAo+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlCj4gPiA+ID4gPiA+ID4gPiA+ID4gKmk5MTUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAg ZHJtX2luZm8oJmk5MTUtPmRybSwgIkFwcGx5aW5nIEluY3JlYXNlIERESSBEaXNhYmxlZAo+ID4g PiA+ID4gPiA+ID4gPiA+IHF1aXJrXG4iKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfQo+ID4gPiA+ ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsvKgo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsgKiBTb21lIGVEUCBiYWNrbGlnaHQgaGFyZHdhcmUgdXNlcyB0aGUgbW9zdC1zaWduaWZpY2Fu dAo+ID4gPiA+ID4gPiA+ID4gPiA+IGJpdHMgb2YgdGhlIGJyaWdodG5lc3MKPiA+ID4gPiA+ID4g PiA+ID4gPiArICogcmVnaXN0ZXIsIHNvIGJyaWdodG5lc3MgdmFsdWVzIG11c3QgYmUgc2hpZnRl ZCBmaXJzdC4KPiA+ID4gPiA+ID4gPiA+ID4gPiArICovCj4gPiA+ID4gPiA+ID4gPiA+ID4gK3N0 YXRpYyB2b2lkIHF1aXJrX3NoaWZ0X2VkcF9iYWNrbGlnaHRfYnJpZ2h0bmVzcyhzdHJ1Y3QKPiA+ ID4gPiA+ID4gPiA+ID4gPiBkcm1faTkxNV9wcml2YXRlICppOTE1KQo+ID4gPiA+ID4gPiA+ID4g PiA+ICt7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaTkxNS0+cXVpcmtzIHw9Cj4gPiA+ID4g PiA+ID4gPiA+ID4gUVVJUktfU0hJRlRfRURQX0JBQ0tMSUdIVF9CUklHSFRORVNTOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgIERSTV9JTkZPKCJBcHBseWluZyBzaGlmdCBlRFAgYmFja2xpZ2h0 IGJyaWdodG5lc3MKPiA+ID4gPiA+ID4gPiA+ID4gPiBxdWlya1xuIik7Cj4gPiA+ID4gPiA+ID4g PiA+ID4gK30KPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gIHN0cnVj dCBpbnRlbF9xdWlyayB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgaW50IGRldmljZTsKPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgICBpbnQgc3Vic3lzdGVtX3ZlbmRvcjsKPiA+ID4gPiA+ID4g PiA+ID4gPiBAQCAtMTU2LDYgKzE2Niw5IEBAIHN0YXRpYyBzdHJ1Y3QgaW50ZWxfcXVpcmsKPiA+ ID4gPiA+ID4gPiA+ID4gPiBpbnRlbF9xdWlya3NbXSA9IHsKPiA+ID4gPiA+ID4gPiA+ID4gPiAg ICAgICAvKiBBU1JvY2sgSVRYKi8KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICB7IDB4MzE4NSwg MHgxODQ5LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rp c2FibGVkX3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICB7IDB4MzE4NCwgMHgxODQ5 LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rpc2FibGVk X3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAg LyogR29vZ2xlIFBpeGVsYm9vayAqLwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHsgMHg1OTFF LCAweDgwODYsIDB4MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4gPiBxdWlya19zaGlmdF9lZHBfYmFj a2xpZ2h0X2JyaWdodG5lc3MgfSwKPiA+ID4gPiA+ID4gPiA+ID4gPiAgfTsKPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiAgdm9pZCBpbnRlbF9pbml0X3F1aXJrcyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+IGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+IGluZGV4 IGU0ZjdmNjUxODk0NWIuLmNjOTNiZWRlNGZhYjggMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPiA+ID4gPiA+ID4gPiA+ID4g PiBAQCAtNTI1LDYgKzUyNSw3IEBAIHN0cnVjdCBpOTE1X3BzciB7Cj4gPiA+ID4gPiA+ID4gPiA+ ID4gICNkZWZpbmUgUVVJUktfUElOX1NXSVpaTEVEX1BBR0VTICgxPDw1KQo+ID4gPiA+ID4gPiA+ ID4gPiA+ICAjZGVmaW5lIFFVSVJLX0lOQ1JFQVNFX1QxMl9ERUxBWSAoMTw8NikKPiA+ID4gPiA+ ID4gPiA+ID4gPiAgI2RlZmluZSBRVUlSS19JTkNSRUFTRV9ERElfRElTQUJMRURfVElNRSAoMTw8 NykKPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hU X0JSSUdIVE5FU1MgKDE8PDgpCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ ID4gIHN0cnVjdCBpbnRlbF9mYmRldjsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgc3RydWN0IGludGVs X2ZiY193b3JrOwo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gLS0KPiA+ID4g PiA+ID4gPiA+ID4gSmFuaSBOaWt1bGEsIEludGVsIE9wZW4gU291cmNlIEdyYXBoaWNzIENlbnRl cgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gLS0KPiA+ID4gPiA+ID4gVmlsbGUgU3lyasOkbMOk Cj4gPiA+ID4gPiA+IEludGVsCj4gPiA+ID4gPiA+IF9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCj4gPiA+ID4gPiA+IEludGVsLWdmeCBtYWlsaW5nIGxpc3QK PiA+ID4gPiA+ID4gSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+ID4gPiBo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+ ID4gPiA+ID4gCj4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gVmlsbGUgU3lyasOkbMOkCj4gPiA+ID4g PiBJbnRlbAotLSAKQ2hlZXJzLAoJTHl1ZGUgUGF1bCAoc2hlL2hlcikKCVNvZnR3YXJlIEVuZ2lu ZWVyIGF0IFJlZCBIYXQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVs LWdmeAo=