From mboxrd@z Thu Jan 1 00:00:00 1970 From: vnkgutta@codeaurora.org Subject: Re: [PATCH v2 3/4] drivers: edac: Add EDAC driver support for QCOM SoCs Date: Fri, 24 Aug 2018 14:05:19 -0700 Message-ID: <93f11f3728ef658f903509ae0bc00d03@codeaurora.org> References: <1534550915-18230-1-git-send-email-vnkgutta@codeaurora.org> <1534550915-18230-4-git-send-email-vnkgutta@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Evan Green Cc: robh@kernel.org, mchehab@kernel.org, linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Gross , David Brown , linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, tsoni@codeaurora.org, ckadabi@codeaurora.org, rishabhb@codeaurora.org, bp@alien8.de List-Id: linux-arm-msm@vger.kernel.org On 2018-08-24 13:18, Evan Green wrote: > On Fri, Aug 24, 2018 at 11:32 AM wrote: >> >> On 2018-08-23 16:04, Evan Green wrote: >> > On Fri, Aug 17, 2018 at 5:08 PM Venkata Narendra Kumar Gutta >> > wrote: >> >> >> >> From: Channagoud Kadabi >> >> >> >> Add error reporting driver for Single Bit Errors (SBEs) and Double Bit >> >> Errors (DBEs). As of now, this driver supports erp for Last Level >> >> Cache >> >> Controller (LLCC). This driver takes care of dumping registers and >> >> adding >> >> config options to enable and disable panic when the errors happen in >> >> cache. >> >> >> >> Signed-off-by: Channagoud Kadabi >> >> Signed-off-by: Venkata Narendra Kumar Gutta >> >> Co-developed-by: Venkata Narendra Kumar Gutta >> >> >> >> --- >> >> MAINTAINERS | 8 + >> >> drivers/edac/Kconfig | 28 +++ >> >> drivers/edac/Makefile | 1 + >> >> drivers/edac/qcom_edac.c | 446 >> >> +++++++++++++++++++++++++++++++++++++ >> >> include/linux/soc/qcom/llcc-qcom.h | 25 +++ >> >> 5 files changed, 508 insertions(+) >> >> create mode 100644 drivers/edac/qcom_edac.c >> >> >> >> diff --git a/MAINTAINERS b/MAINTAINERS >> >> index 0a23427..0bff713 100644 >> >> --- a/MAINTAINERS >> >> +++ b/MAINTAINERS >> >> @@ -5227,6 +5227,14 @@ L: linux-edac@vger.kernel.org >> >> S: Maintained >> >> F: drivers/edac/ti_edac.c >> >> >> >> +EDAC-QUALCOMM >> >> +M: Channagoud Kadabi >> >> +M: Venkata Narendra Kumar Gutta >> >> +L: linux-arm-msm@vger.kernel.org >> >> +L: linux-edac@vger.kernel.org >> >> +S: Maintained >> >> +F: drivers/edac/qcom_edac.c >> >> + >> >> EDIROL UA-101/UA-1000 DRIVER >> >> M: Clemens Ladisch >> >> L: alsa-devel@alsa-project.org (moderated for non-subscribers) >> >> diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig >> >> index 57304b2..da8f150 100644 >> >> --- a/drivers/edac/Kconfig >> >> +++ b/drivers/edac/Kconfig >> >> @@ -460,4 +460,32 @@ config EDAC_TI >> >> Support for error detection and correction on the >> >> TI SoCs. >> >> >> >> +config EDAC_QCOM >> >> + tristate "QCOM EDAC Controller" >> >> + depends on EDAC >> >> + help >> >> + Support for error detection and correction on the >> >> + QCOM SoCs. >> >> + >> >> +config EDAC_QCOM_LLCC >> >> + tristate "QCOM EDAC Controller for LLCC Cache" >> >> + depends on EDAC_QCOM && QCOM_LLCC >> >> + help >> >> + Support for error detection and correction on the >> >> + QCOM LLCC cache. Report errors caught by LLCC ECC >> >> + mechanism. >> >> + >> >> + For debugging issues having to do with stability and overall >> >> system >> >> + health, you should probably say 'Y' here. >> >> + >> >> +config EDAC_QCOM_LLCC_PANIC_ON_UE >> >> + bool "Panic on uncorrectable errors - qcom llcc" >> >> + depends on EDAC_QCOM_LLCC >> >> + help >> >> + Forcibly cause a kernel panic if an uncorrectable error (UE) >> >> is >> >> + detected. This can reduce debugging times on hardware which >> >> may be >> >> + operating at voltages or frequencies outside normal >> >> specification. >> >> + >> >> + For production builds, you should probably say 'N' here. >> >> + >> >> endif # EDAC >> >> diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile >> >> index 02b43a7..716096d 100644 >> >> --- a/drivers/edac/Makefile >> >> +++ b/drivers/edac/Makefile >> >> @@ -77,3 +77,4 @@ obj-$(CONFIG_EDAC_ALTERA) += >> >> altera_edac.o >> >> obj-$(CONFIG_EDAC_SYNOPSYS) += synopsys_edac.o >> >> obj-$(CONFIG_EDAC_XGENE) += xgene_edac.o >> >> obj-$(CONFIG_EDAC_TI) += ti_edac.o >> >> +obj-$(CONFIG_EDAC_QCOM) += qcom_edac.o >> >> diff --git a/drivers/edac/qcom_edac.c b/drivers/edac/qcom_edac.c >> >> new file mode 100644 >> >> index 0000000..9a8c670 >> >> --- /dev/null >> >> +++ b/drivers/edac/qcom_edac.c >> >> @@ -0,0 +1,446 @@ >> >> +// SPDX-License-Identifier: GPL-2.0 >> >> +/* >> >> + * Copyright (c) 2018, The Linux Foundation. All rights reserved. >> >> + */ >> >> + >> >> +#include >> >> +#include >> >> +#include >> >> +#include >> >> +#include >> >> +#include >> >> +#include >> >> +#include >> >> + >> >> +#include "edac_mc.h" >> >> +#include "edac_device.h" >> >> + >> >> +#ifdef CONFIG_EDAC_QCOM_LLCC_PANIC_ON_UE >> >> +#define LLCC_ERP_PANIC_ON_UE 1 >> >> +#else >> >> +#define LLCC_ERP_PANIC_ON_UE 0 >> >> +#endif >> >> + >> >> +#define EDAC_LLCC "qcom_llcc" >> >> + >> >> +#define TRP_SYN_REG_CNT 6 >> >> + >> >> +#define DRP_SYN_REG_CNT 8 >> >> + >> >> +#define LLCC_COMMON_STATUS0 0x0003000C >> >> +#define LLCC_LB_CNT_MASK GENMASK(31, 28) >> >> +#define LLCC_LB_CNT_SHIFT 28 >> >> + >> >> +/* single & Double Bit syndrome register offsets */ >> > >> > Strange capitalization going on here. >> I'll fix this. >> >> > >> >> +#define TRP_ECC_SB_ERR_SYN0 0x0002304C >> >> +#define TRP_ECC_DB_ERR_SYN0 0x00020370 >> >> +#define DRP_ECC_SB_ERR_SYN0 0x0004204C >> >> +#define DRP_ECC_DB_ERR_SYN0 0x00042070 >> > >> > I think the convention is to use lowercase hex everywhere. >> >> I didn't get you. Do you mean, the Macros should be in lower case or >> the >> comments? > > I mean 0x0002304C should be 0x0002304c. Oh, I see. I'll update it, Thanks. > >> >> > >> >> + >> >> +/* Error register offsets */ >> >> +#define TRP_ECC_ERROR_STATUS1 0x00020348 >> >> +#define TRP_ECC_ERROR_STATUS0 0x00020344 >> >> +#define DRP_ECC_ERROR_STATUS1 0x00042048 >> >> +#define DRP_ECC_ERROR_STATUS0 0x00042044 >> >> + >> >> +/* TRP, DRP interrupt register offsets */ >> >> +#define DRP_INTERRUPT_STATUS 0x00041000 >> >> +#define TRP_INTERRUPT_0_STATUS 0x00020480 >> >> +#define DRP_INTERRUPT_CLEAR 0x00041008 >> >> +#define DRP_ECC_ERROR_CNTR_CLEAR 0x00040004 >> >> +#define TRP_INTERRUPT_0_CLEAR 0x00020484 >> >> +#define TRP_ECC_ERROR_CNTR_CLEAR 0x00020440 >> >> + >> >> +/* Mask and shift macros */ >> >> +#define ECC_DB_ERR_COUNT_MASK GENMASK(4, 0) >> >> +#define ECC_DB_ERR_WAYS_MASK GENMASK(31, 16) >> >> +#define ECC_DB_ERR_WAYS_SHIFT BIT(4) >> >> + >> >> +#define ECC_SB_ERR_COUNT_MASK GENMASK(23, 16) >> >> +#define ECC_SB_ERR_COUNT_SHIFT BIT(4) >> >> +#define ECC_SB_ERR_WAYS_MASK GENMASK(15, 0) >> >> + >> >> +#define SB_ECC_ERROR BIT(0) >> >> +#define DB_ECC_ERROR BIT(1) >> >> + >> >> +#define DRP_TRP_INT_CLEAR GENMASK(1, 0) >> >> +#define DRP_TRP_CNT_CLEAR GENMASK(1, 0) >> >> + >> >> +/* Config registers offsets*/ >> >> +#define DRP_ECC_ERROR_CFG 0x00040000 >> >> + >> >> +/* TRP, DRP interrupt register offsets */ >> >> +#define CMN_INTERRUPT_0_ENABLE 0x0003001C >> >> +#define CMN_INTERRUPT_2_ENABLE 0x0003003C >> >> +#define TRP_INTERRUPT_0_ENABLE 0x00020488 >> >> +#define DRP_INTERRUPT_ENABLE 0x0004100C >> >> + >> >> +#define SB_ERROR_THRESHOLD 0x1 >> >> +#define SB_ERROR_THRESHOLD_SHIFT 24 >> >> +#define SB_DB_TRP_INTERRUPT_ENABLE 0x3 >> >> +#define TRP0_INTERRUPT_ENABLE 0x1 >> >> +#define DRP0_INTERRUPT_ENABLE BIT(6) >> >> +#define SB_DB_DRP_INTERRUPT_ENABLE 0x3 >> >> + >> >> +enum { >> >> + LLCC_DRAM_CE = 0, >> >> + LLCC_DRAM_UE, >> >> + LLCC_TRAM_CE, >> >> + LLCC_TRAM_UE, >> >> + LLCC_ERR_TYPE_MAX = LLCC_TRAM_UE + 1, >> > >> > This is a nit, or perhaps personal preference, but I prefer to not >> > have initializers for sentinel values, since it's one more thing >> > someone could forget to update when adding new values. >> >> I'll get rid of this, I was using this one to allocate the memory for >> llcc_driv_data->edac_reg, (struct llcc_edac_reg_data). >> But the suggestion was to initialize that one statically. > > Sounds good. > >> >> >> > >> >> +}; >> >> + >> >> +static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap) >> >> +{ >> >> + u32 sb_err_threshold; >> >> + int ret; >> >> + >> >> + /* Enable TRP in instance 2 of common interrupt enable >> >> register */ >> > >> > Can we get a comment explaining what's so special about instance 2? >> > Instances 1 and 3 get no love? >> >> I'll try to elaborate on this. >> >> > >> >> + ret = regmap_update_bits(llcc_bcast_regmap, >> >> CMN_INTERRUPT_2_ENABLE, >> >> + TRP0_INTERRUPT_ENABLE, >> >> + TRP0_INTERRUPT_ENABLE); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Enable ECC interrupts on Tag Ram */ >> >> + ret = regmap_update_bits(llcc_bcast_regmap, >> >> TRP_INTERRUPT_0_ENABLE, >> >> + SB_DB_TRP_INTERRUPT_ENABLE, >> >> + SB_DB_TRP_INTERRUPT_ENABLE); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Enable SB error for Data RAM */ >> >> + sb_err_threshold = (SB_ERROR_THRESHOLD << >> >> SB_ERROR_THRESHOLD_SHIFT); >> >> + ret = regmap_write(llcc_bcast_regmap, DRP_ECC_ERROR_CFG, >> >> + sb_err_threshold); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Enable DRP in instance 2 of common interrupt enable >> >> register */ >> >> + ret = regmap_update_bits(llcc_bcast_regmap, >> >> CMN_INTERRUPT_2_ENABLE, >> >> + DRP0_INTERRUPT_ENABLE, >> >> + DRP0_INTERRUPT_ENABLE); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Enable ECC interrupts on Data Ram */ >> >> + ret = regmap_write(llcc_bcast_regmap, DRP_INTERRUPT_ENABLE, >> >> + SB_DB_DRP_INTERRUPT_ENABLE); >> >> + return ret; >> >> +} >> >> + >> >> +/* Clear the error interrupt and counter registers */ >> >> +static int >> >> +qcom_llcc_clear_errors_status(int err_type, struct llcc_drv_data >> >> *drv) >> > >> > Another nit: errors_status is kind of weird. Maybe >> > qcom_llcc_clear_errors or qcom_llcc_clear_error_status? >> >> I'll update the name. >> >> > >> >> +{ >> >> + int ret = 0; >> >> + >> >> + switch (err_type) { >> >> + case LLCC_DRAM_CE: >> >> + case LLCC_DRAM_UE: >> >> + /* Clear the interrupt */ >> >> + ret = regmap_write(drv->bcast_regmap, >> >> DRP_INTERRUPT_CLEAR, >> >> + DRP_TRP_INT_CLEAR); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + /* Clear the counters */ >> >> + ret = regmap_write(drv->bcast_regmap, >> >> DRP_ECC_ERROR_CNTR_CLEAR, >> >> + DRP_TRP_CNT_CLEAR); >> >> + if (ret) >> >> + return ret; >> >> + break; >> >> + case LLCC_TRAM_CE: >> >> + case LLCC_TRAM_UE: >> >> + ret = regmap_write(drv->bcast_regmap, >> >> TRP_INTERRUPT_0_CLEAR, >> >> + DRP_TRP_INT_CLEAR); >> >> + if (ret) >> >> + return ret; >> >> + >> >> + ret = regmap_write(drv->bcast_regmap, >> >> TRP_ECC_ERROR_CNTR_CLEAR, >> >> + DRP_TRP_CNT_CLEAR); >> >> + if (ret) >> >> + return ret; >> >> + break; >> > >> > A default case that errors or complains or both would be nice. >> >> Ok, I had this thought too, but we never run into that scenario, >> that's we don't ever call this function with any other types, >> Had it been an API it makes sense to have a default case. >> The internal functions require them too! I don't know!! >> What do you think? >> As we say, if it's good to have it, I'll add it. > > I personally like the default case, I find it to be defensive against > someone adding code later who passes the wrong value or type down. > Others might disagree. It's up to you. It makes sense to have a defensive code against someone adding the code later, I'll add it. From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2,3/4] drivers: edac: Add EDAC driver support for QCOM SoCs From: Venkata Narendra Kumar Gutta Message-Id: <93f11f3728ef658f903509ae0bc00d03@codeaurora.org> Date: Fri, 24 Aug 2018 14:05:19 -0700 To: Evan Green Cc: robh@kernel.org, mchehab@kernel.org, linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Gross , David Brown , linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, tsoni@codeaurora.org, ckadabi@codeaurora.org, rishabhb@codeaurora.org, bp@alien8.de List-ID: T24gMjAxOC0wOC0yNCAxMzoxOCwgRXZhbiBHcmVlbiB3cm90ZToKPiBPbiBGcmksIEF1ZyAyNCwg MjAxOCBhdCAxMTozMiBBTSA8dm5rZ3V0dGFAY29kZWF1cm9yYS5vcmc+IHdyb3RlOgo+PiAKPj4g T24gMjAxOC0wOC0yMyAxNjowNCwgRXZhbiBHcmVlbiB3cm90ZToKPj4gPiBPbiBGcmksIEF1ZyAx NywgMjAxOCBhdCA1OjA4IFBNIFZlbmthdGEgTmFyZW5kcmEgS3VtYXIgR3V0dGEKPj4gPiA8dm5r Z3V0dGFAY29kZWF1cm9yYS5vcmc+IHdyb3RlOgo+PiA+Pgo+PiA+PiBGcm9tOiBDaGFubmFnb3Vk IEthZGFiaSA8Y2thZGFiaUBjb2RlYXVyb3JhLm9yZz4KPj4gPj4KPj4gPj4gQWRkIGVycm9yIHJl cG9ydGluZyBkcml2ZXIgZm9yIFNpbmdsZSBCaXQgRXJyb3JzIChTQkVzKSBhbmQgRG91YmxlIEJp dAo+PiA+PiBFcnJvcnMgKERCRXMpLiBBcyBvZiBub3csIHRoaXMgZHJpdmVyIHN1cHBvcnRzIGVy cCBmb3IgTGFzdCBMZXZlbAo+PiA+PiBDYWNoZQo+PiA+PiBDb250cm9sbGVyIChMTENDKS4gVGhp cyBkcml2ZXIgdGFrZXMgY2FyZSBvZiBkdW1waW5nIHJlZ2lzdGVycyBhbmQKPj4gPj4gYWRkaW5n Cj4+ID4+IGNvbmZpZyBvcHRpb25zIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBwYW5pYyB3aGVuIHRo ZSBlcnJvcnMgaGFwcGVuIGluCj4+ID4+IGNhY2hlLgo+PiA+Pgo+PiA+PiBTaWduZWQtb2ZmLWJ5 OiBDaGFubmFnb3VkIEthZGFiaSA8Y2thZGFiaUBjb2RlYXVyb3JhLm9yZz4KPj4gPj4gU2lnbmVk LW9mZi1ieTogVmVua2F0YSBOYXJlbmRyYSBLdW1hciBHdXR0YSA8dm5rZ3V0dGFAY29kZWF1cm9y YS5vcmc+Cj4+ID4+IENvLWRldmVsb3BlZC1ieTogVmVua2F0YSBOYXJlbmRyYSBLdW1hciBHdXR0 YQo+PiA+PiA8dm5rZ3V0dGFAY29kZWF1cm9yYS5vcmc+Cj4+ID4+IC0tLQo+PiA+PiAgTUFJTlRB SU5FUlMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgOCArCj4+ID4+ICBkcml2ZXJzL2VkYWMv S2NvbmZpZyAgICAgICAgICAgICAgIHwgIDI4ICsrKwo+PiA+PiAgZHJpdmVycy9lZGFjL01ha2Vm aWxlICAgICAgICAgICAgICB8ICAgMSArCj4+ID4+ICBkcml2ZXJzL2VkYWMvcWNvbV9lZGFjLmMg ICAgICAgICAgIHwgNDQ2Cj4+ID4+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKPj4gPj4gIGluY2x1ZGUvbGludXgvc29jL3Fjb20vbGxjYy1xY29tLmggfCAgMjUgKysrCj4+ ID4+ICA1IGZpbGVzIGNoYW5nZWQsIDUwOCBpbnNlcnRpb25zKCspCj4+ID4+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9lZGFjL3Fjb21fZWRhYy5jCj4+ID4+Cj4+ID4+IGRpZmYgLS1naXQg YS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCj4+ID4+IGluZGV4IDBhMjM0MjcuLjBiZmY3MTMg MTAwNjQ0Cj4+ID4+IC0tLSBhL01BSU5UQUlORVJTCj4+ID4+ICsrKyBiL01BSU5UQUlORVJTCj4+ ID4+IEBAIC01MjI3LDYgKzUyMjcsMTQgQEAgTDogICAgICAgbGludXgtZWRhY0B2Z2VyLmtlcm5l bC5vcmcKPj4gPj4gIFM6ICAgICBNYWludGFpbmVkCj4+ID4+ICBGOiAgICAgZHJpdmVycy9lZGFj L3RpX2VkYWMuYwo+PiA+Pgo+PiA+PiArRURBQy1RVUFMQ09NTQo+PiA+PiArTTogICAgIENoYW5u YWdvdWQgS2FkYWJpIDxja2FkYWJpQGNvZGVhdXJvcmEub3JnPgo+PiA+PiArTTogICAgIFZlbmth dGEgTmFyZW5kcmEgS3VtYXIgR3V0dGEgPHZua2d1dHRhQGNvZGVhdXJvcmEub3JnPgo+PiA+PiAr TDogICAgIGxpbnV4LWFybS1tc21Admdlci5rZXJuZWwub3JnCj4+ID4+ICtMOiAgICAgbGludXgt ZWRhY0B2Z2VyLmtlcm5lbC5vcmcKPj4gPj4gK1M6ICAgICBNYWludGFpbmVkCj4+ID4+ICtGOiAg ICAgZHJpdmVycy9lZGFjL3Fjb21fZWRhYy5jCj4+ID4+ICsKPj4gPj4gIEVESVJPTCBVQS0xMDEv VUEtMTAwMCBEUklWRVIKPj4gPj4gIE06ICAgICBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFk aXNjaC5kZT4KPj4gPj4gIEw6ICAgICBhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVy YXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQo+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFj L0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwo+PiA+PiBpbmRleCA1NzMwNGIyLi5kYThm MTUwIDEwMDY0NAo+PiA+PiAtLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZwo+PiA+PiArKysgYi9k cml2ZXJzL2VkYWMvS2NvbmZpZwo+PiA+PiBAQCAtNDYwLDQgKzQ2MCwzMiBAQCBjb25maWcgRURB Q19USQo+PiA+PiAgICAgICAgICAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3Jy ZWN0aW9uIG9uIHRoZQo+PiA+PiAgICAgICAgICAgIFRJIFNvQ3MuCj4+ID4+Cj4+ID4+ICtjb25m aWcgRURBQ19RQ09NCj4+ID4+ICsgICAgICAgdHJpc3RhdGUgIlFDT00gRURBQyBDb250cm9sbGVy Igo+PiA+PiArICAgICAgIGRlcGVuZHMgb24gRURBQwo+PiA+PiArICAgICAgIGhlbHAKPj4gPj4g KyAgICAgICAgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0 aGUKPj4gPj4gKyAgICAgICAgIFFDT00gU29Dcy4KPj4gPj4gKwo+PiA+PiArY29uZmlnIEVEQUNf UUNPTV9MTENDCj4+ID4+ICsgICAgICAgdHJpc3RhdGUgIlFDT00gRURBQyBDb250cm9sbGVyIGZv ciBMTENDIENhY2hlIgo+PiA+PiArICAgICAgIGRlcGVuZHMgb24gRURBQ19RQ09NICYmIFFDT01f TExDQwo+PiA+PiArICAgICAgIGhlbHAKPj4gPj4gKyAgICAgICAgIFN1cHBvcnQgZm9yIGVycm9y IGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKPj4gPj4gKyAgICAgICAgIFFDT00gTExD QyBjYWNoZS4gUmVwb3J0IGVycm9ycyBjYXVnaHQgYnkgTExDQyBFQ0MKPj4gPj4gKyAgICAgICAg IG1lY2hhbmlzbS4KPj4gPj4gKwo+PiA+PiArICAgICAgICAgRm9yIGRlYnVnZ2luZyBpc3N1ZXMg aGF2aW5nIHRvIGRvIHdpdGggc3RhYmlsaXR5IGFuZCBvdmVyYWxsCj4+ID4+IHN5c3RlbQo+PiA+ PiArICAgICAgICAgIGhlYWx0aCwgeW91IHNob3VsZCBwcm9iYWJseSBzYXkgJ1knIGhlcmUuCj4+ ID4+ICsKPj4gPj4gK2NvbmZpZyBFREFDX1FDT01fTExDQ19QQU5JQ19PTl9VRQo+PiA+PiArICAg ICAgIGJvb2wgIlBhbmljIG9uIHVuY29ycmVjdGFibGUgZXJyb3JzIC0gcWNvbSBsbGNjIgo+PiA+ PiArICAgICAgIGRlcGVuZHMgb24gRURBQ19RQ09NX0xMQ0MKPj4gPj4gKyAgICAgICBoZWxwCj4+ ID4+ICsgICAgICAgICBGb3JjaWJseSBjYXVzZSBhIGtlcm5lbCBwYW5pYyBpZiBhbiB1bmNvcnJl Y3RhYmxlIGVycm9yIChVRSkKPj4gPj4gaXMKPj4gPj4gKyAgICAgICAgIGRldGVjdGVkLiBUaGlz IGNhbiByZWR1Y2UgZGVidWdnaW5nIHRpbWVzIG9uIGhhcmR3YXJlIHdoaWNoCj4+ID4+IG1heSBi ZQo+PiA+PiArICAgICAgICAgb3BlcmF0aW5nIGF0IHZvbHRhZ2VzIG9yIGZyZXF1ZW5jaWVzIG91 dHNpZGUgbm9ybWFsCj4+ID4+IHNwZWNpZmljYXRpb24uCj4+ID4+ICsKPj4gPj4gKyAgICAgICAg IEZvciBwcm9kdWN0aW9uIGJ1aWxkcywgeW91IHNob3VsZCBwcm9iYWJseSBzYXkgJ04nIGhlcmUu Cj4+ID4+ICsKPj4gPj4gIGVuZGlmICMgRURBQwo+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9l ZGFjL01ha2VmaWxlIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCj4+ID4+IGluZGV4IDAyYjQzYTcu LjcxNjA5NmQgMTAwNjQ0Cj4+ID4+IC0tLSBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQo+PiA+PiAr KysgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKPj4gPj4gQEAgLTc3LDMgKzc3LDQgQEAgb2JqLSQo Q09ORklHX0VEQUNfQUxURVJBKSAgICAgICAgICAgICArPQo+PiA+PiBhbHRlcmFfZWRhYy5vCj4+ ID4+ICBvYmotJChDT05GSUdfRURBQ19TWU5PUFNZUykgICAgICAgICAgICArPSBzeW5vcHN5c19l ZGFjLm8KPj4gPj4gIG9iai0kKENPTkZJR19FREFDX1hHRU5FKSAgICAgICAgICAgICAgICs9IHhn ZW5lX2VkYWMubwo+PiA+PiAgb2JqLSQoQ09ORklHX0VEQUNfVEkpICAgICAgICAgICAgICAgICAg Kz0gdGlfZWRhYy5vCj4+ID4+ICtvYmotJChDT05GSUdfRURBQ19RQ09NKSAgICAgICAgICAgICAg ICAgICAgICAgICs9IHFjb21fZWRhYy5vCj4+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMv cWNvbV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvcWNvbV9lZGFjLmMKPj4gPj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPj4gPj4gaW5kZXggMDAwMDAwMC4uOWE4YzY3MAo+PiA+PiAtLS0gL2Rldi9udWxs Cj4+ID4+ICsrKyBiL2RyaXZlcnMvZWRhYy9xY29tX2VkYWMuYwo+PiA+PiBAQCAtMCwwICsxLDQ0 NiBAQAo+PiA+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4gPj4gKy8q Cj4+ID4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwg cmlnaHRzIHJlc2VydmVkLgo+PiA+PiArICovCj4+ID4+ICsKPj4gPj4gKyNpbmNsdWRlIDxsaW51 eC9lZGFjLmg+Cj4+ID4+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4+ID4+ICsjaW5j bHVkZSA8bGludXgva2VybmVsLmg+Cj4+ID4+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+ Cj4+ID4+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4+ID4+ICsjaW5jbHVk ZSA8bGludXgvcmVnbWFwLmg+Cj4+ID4+ICsjaW5jbHVkZSA8bGludXgvc21wLmg+Cj4+ID4+ICsj aW5jbHVkZSA8bGludXgvc29jL3Fjb20vbGxjYy1xY29tLmg+Cj4+ID4+ICsKPj4gPj4gKyNpbmNs dWRlICJlZGFjX21jLmgiCj4+ID4+ICsjaW5jbHVkZSAiZWRhY19kZXZpY2UuaCIKPj4gPj4gKwo+ PiA+PiArI2lmZGVmIENPTkZJR19FREFDX1FDT01fTExDQ19QQU5JQ19PTl9VRQo+PiA+PiArI2Rl ZmluZSBMTENDX0VSUF9QQU5JQ19PTl9VRSAgICAgICAgICAgIDEKPj4gPj4gKyNlbHNlCj4+ID4+ ICsjZGVmaW5lIExMQ0NfRVJQX1BBTklDX09OX1VFICAgICAgICAgICAgMAo+PiA+PiArI2VuZGlm Cj4+ID4+ICsKPj4gPj4gKyNkZWZpbmUgRURBQ19MTENDICAgICAgICAgICAgICAgICAgICAgICAi cWNvbV9sbGNjIgo+PiA+PiArCj4+ID4+ICsjZGVmaW5lIFRSUF9TWU5fUkVHX0NOVCAgICAgICAg ICAgICAgICAgNgo+PiA+PiArCj4+ID4+ICsjZGVmaW5lIERSUF9TWU5fUkVHX0NOVCAgICAgICAg ICAgICAgICAgOAo+PiA+PiArCj4+ID4+ICsjZGVmaW5lIExMQ0NfQ09NTU9OX1NUQVRVUzAgICAg ICAgICAgICAgMHgwMDAzMDAwQwo+PiA+PiArI2RlZmluZSBMTENDX0xCX0NOVF9NQVNLICAgICAg ICAgICAgICAgIEdFTk1BU0soMzEsIDI4KQo+PiA+PiArI2RlZmluZSBMTENDX0xCX0NOVF9TSElG VCAgICAgICAgICAgICAgIDI4Cj4+ID4+ICsKPj4gPj4gKy8qIHNpbmdsZSAmIERvdWJsZSBCaXQg c3luZHJvbWUgcmVnaXN0ZXIgb2Zmc2V0cyAqLwo+PiA+Cj4+ID4gU3RyYW5nZSBjYXBpdGFsaXph dGlvbiBnb2luZyBvbiBoZXJlLgo+PiBJJ2xsIGZpeCB0aGlzLgo+PiAKPj4gPgo+PiA+PiArI2Rl ZmluZSBUUlBfRUNDX1NCX0VSUl9TWU4wICAgICAgICAgICAgIDB4MDAwMjMwNEMKPj4gPj4gKyNk ZWZpbmUgVFJQX0VDQ19EQl9FUlJfU1lOMCAgICAgICAgICAgICAweDAwMDIwMzcwCj4+ID4+ICsj ZGVmaW5lIERSUF9FQ0NfU0JfRVJSX1NZTjAgICAgICAgICAgICAgMHgwMDA0MjA0Qwo+PiA+PiAr I2RlZmluZSBEUlBfRUNDX0RCX0VSUl9TWU4wICAgICAgICAgICAgIDB4MDAwNDIwNzAKPj4gPgo+ PiA+IEkgdGhpbmsgdGhlIGNvbnZlbnRpb24gaXMgdG8gdXNlIGxvd2VyY2FzZSBoZXggZXZlcnl3 aGVyZS4KPj4gCj4+IEkgZGlkbid0IGdldCB5b3UuIERvIHlvdSBtZWFuLCB0aGUgTWFjcm9zIHNo b3VsZCBiZSBpbiBsb3dlciBjYXNlIG9yIAo+PiB0aGUKPj4gY29tbWVudHM/Cj4gCj4gSSBtZWFu IDB4MDAwMjMwNEMgc2hvdWxkIGJlIDB4MDAwMjMwNGMuCgpPaCwgSSBzZWUuIEknbGwgdXBkYXRl IGl0LCBUaGFua3MuCgo+IAo+PiAKPj4gPgo+PiA+PiArCj4+ID4+ICsvKiBFcnJvciByZWdpc3Rl ciBvZmZzZXRzICovCj4+ID4+ICsjZGVmaW5lIFRSUF9FQ0NfRVJST1JfU1RBVFVTMSAgICAgICAg ICAgMHgwMDAyMDM0OAo+PiA+PiArI2RlZmluZSBUUlBfRUNDX0VSUk9SX1NUQVRVUzAgICAgICAg ICAgIDB4MDAwMjAzNDQKPj4gPj4gKyNkZWZpbmUgRFJQX0VDQ19FUlJPUl9TVEFUVVMxICAgICAg ICAgICAweDAwMDQyMDQ4Cj4+ID4+ICsjZGVmaW5lIERSUF9FQ0NfRVJST1JfU1RBVFVTMCAgICAg ICAgICAgMHgwMDA0MjA0NAo+PiA+PiArCj4+ID4+ICsvKiBUUlAsIERSUCBpbnRlcnJ1cHQgcmVn aXN0ZXIgb2Zmc2V0cyAqLwo+PiA+PiArI2RlZmluZSBEUlBfSU5URVJSVVBUX1NUQVRVUyAgICAg ICAgICAgIDB4MDAwNDEwMDAKPj4gPj4gKyNkZWZpbmUgVFJQX0lOVEVSUlVQVF8wX1NUQVRVUyAg ICAgICAgICAweDAwMDIwNDgwCj4+ID4+ICsjZGVmaW5lIERSUF9JTlRFUlJVUFRfQ0xFQVIgICAg ICAgICAgICAgMHgwMDA0MTAwOAo+PiA+PiArI2RlZmluZSBEUlBfRUNDX0VSUk9SX0NOVFJfQ0xF QVIgICAgICAgIDB4MDAwNDAwMDQKPj4gPj4gKyNkZWZpbmUgVFJQX0lOVEVSUlVQVF8wX0NMRUFS ICAgICAgICAgICAweDAwMDIwNDg0Cj4+ID4+ICsjZGVmaW5lIFRSUF9FQ0NfRVJST1JfQ05UUl9D TEVBUiAgICAgICAgMHgwMDAyMDQ0MAo+PiA+PiArCj4+ID4+ICsvKiBNYXNrIGFuZCBzaGlmdCBt YWNyb3MgKi8KPj4gPj4gKyNkZWZpbmUgRUNDX0RCX0VSUl9DT1VOVF9NQVNLICAgICAgICAgICBH RU5NQVNLKDQsIDApCj4+ID4+ICsjZGVmaW5lIEVDQ19EQl9FUlJfV0FZU19NQVNLICAgICAgICAg ICAgR0VOTUFTSygzMSwgMTYpCj4+ID4+ICsjZGVmaW5lIEVDQ19EQl9FUlJfV0FZU19TSElGVCAg ICAgICAgICAgQklUKDQpCj4+ID4+ICsKPj4gPj4gKyNkZWZpbmUgRUNDX1NCX0VSUl9DT1VOVF9N QVNLICAgICAgICAgICBHRU5NQVNLKDIzLCAxNikKPj4gPj4gKyNkZWZpbmUgRUNDX1NCX0VSUl9D T1VOVF9TSElGVCAgICAgICAgICBCSVQoNCkKPj4gPj4gKyNkZWZpbmUgRUNDX1NCX0VSUl9XQVlT X01BU0sgICAgICAgICAgICBHRU5NQVNLKDE1LCAwKQo+PiA+PiArCj4+ID4+ICsjZGVmaW5lIFNC X0VDQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgQklUKDApCj4+ID4+ICsjZGVmaW5lIERCX0VD Q19FUlJPUiAgICAgICAgICAgICAgICAgICAgQklUKDEpCj4+ID4+ICsKPj4gPj4gKyNkZWZpbmUg RFJQX1RSUF9JTlRfQ0xFQVIgICAgICAgICAgICAgICBHRU5NQVNLKDEsIDApCj4+ID4+ICsjZGVm aW5lIERSUF9UUlBfQ05UX0NMRUFSICAgICAgICAgICAgICAgR0VOTUFTSygxLCAwKQo+PiA+PiAr Cj4+ID4+ICsvKiBDb25maWcgcmVnaXN0ZXJzIG9mZnNldHMqLwo+PiA+PiArI2RlZmluZSBEUlBf RUNDX0VSUk9SX0NGRyAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKPj4gPj4gKwo+PiA+PiArLyog VFJQLCBEUlAgaW50ZXJydXB0IHJlZ2lzdGVyIG9mZnNldHMgKi8KPj4gPj4gKyNkZWZpbmUgQ01O X0lOVEVSUlVQVF8wX0VOQUJMRSAgICAgICAgICAweDAwMDMwMDFDCj4+ID4+ICsjZGVmaW5lIENN Tl9JTlRFUlJVUFRfMl9FTkFCTEUgICAgICAgICAgMHgwMDAzMDAzQwo+PiA+PiArI2RlZmluZSBU UlBfSU5URVJSVVBUXzBfRU5BQkxFICAgICAgICAgIDB4MDAwMjA0ODgKPj4gPj4gKyNkZWZpbmUg RFJQX0lOVEVSUlVQVF9FTkFCTEUgICAgICAgICAgICAweDAwMDQxMDBDCj4+ID4+ICsKPj4gPj4g KyNkZWZpbmUgU0JfRVJST1JfVEhSRVNIT0xEICAgICAgICAgICAgICAweDEKPj4gPj4gKyNkZWZp bmUgU0JfRVJST1JfVEhSRVNIT0xEX1NISUZUICAgICAgICAyNAo+PiA+PiArI2RlZmluZSBTQl9E Ql9UUlBfSU5URVJSVVBUX0VOQUJMRSAgICAgIDB4Mwo+PiA+PiArI2RlZmluZSBUUlAwX0lOVEVS UlVQVF9FTkFCTEUgICAgICAgICAgIDB4MQo+PiA+PiArI2RlZmluZSBEUlAwX0lOVEVSUlVQVF9F TkFCTEUgICAgICAgICAgIEJJVCg2KQo+PiA+PiArI2RlZmluZSBTQl9EQl9EUlBfSU5URVJSVVBU X0VOQUJMRSAgICAgIDB4Mwo+PiA+PiArCj4+ID4+ICtlbnVtIHsKPj4gPj4gKyAgICAgICBMTEND X0RSQU1fQ0UgPSAwLAo+PiA+PiArICAgICAgIExMQ0NfRFJBTV9VRSwKPj4gPj4gKyAgICAgICBM TENDX1RSQU1fQ0UsCj4+ID4+ICsgICAgICAgTExDQ19UUkFNX1VFLAo+PiA+PiArICAgICAgIExM Q0NfRVJSX1RZUEVfTUFYID0gTExDQ19UUkFNX1VFICsgMSwKPj4gPgo+PiA+IFRoaXMgaXMgYSBu aXQsIG9yIHBlcmhhcHMgcGVyc29uYWwgcHJlZmVyZW5jZSwgYnV0IEkgcHJlZmVyIHRvIG5vdAo+ PiA+IGhhdmUgaW5pdGlhbGl6ZXJzIGZvciBzZW50aW5lbCB2YWx1ZXMsIHNpbmNlIGl0J3Mgb25l IG1vcmUgdGhpbmcKPj4gPiBzb21lb25lIGNvdWxkIGZvcmdldCB0byB1cGRhdGUgd2hlbiBhZGRp bmcgbmV3IHZhbHVlcy4KPj4gCj4+IEknbGwgZ2V0IHJpZCBvZiB0aGlzLCBJIHdhcyB1c2luZyB0 aGlzIG9uZSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvcgo+PiBsbGNjX2RyaXZfZGF0YS0+ZWRh Y19yZWcsIChzdHJ1Y3QgbGxjY19lZGFjX3JlZ19kYXRhKS4KPj4gQnV0IHRoZSBzdWdnZXN0aW9u IHdhcyB0byBpbml0aWFsaXplIHRoYXQgb25lIHN0YXRpY2FsbHkuCj4gCj4gU291bmRzIGdvb2Qu Cj4gCj4+IAo+PiAKPj4gPgo+PiA+PiArfTsKPj4gPj4gKwo+PiA+PiArc3RhdGljIGludCBxY29t X2xsY2NfY29yZV9zZXR1cChzdHJ1Y3QgcmVnbWFwICpsbGNjX2JjYXN0X3JlZ21hcCkKPj4gPj4g K3sKPj4gPj4gKyAgICAgICB1MzIgc2JfZXJyX3RocmVzaG9sZDsKPj4gPj4gKyAgICAgICBpbnQg cmV0Owo+PiA+PiArCj4+ID4+ICsgICAgICAgLyogRW5hYmxlIFRSUCBpbiBpbnN0YW5jZSAyIG9m IGNvbW1vbiBpbnRlcnJ1cHQgZW5hYmxlCj4+ID4+IHJlZ2lzdGVyICovCj4+ID4KPj4gPiBDYW4g d2UgZ2V0IGEgY29tbWVudCBleHBsYWluaW5nIHdoYXQncyBzbyBzcGVjaWFsIGFib3V0IGluc3Rh bmNlIDI/Cj4+ID4gSW5zdGFuY2VzIDEgYW5kIDMgZ2V0IG5vIGxvdmU/Cj4+IAo+PiBJJ2xsIHRy eSB0byBlbGFib3JhdGUgb24gdGhpcy4KPj4gCj4+ID4KPj4gPj4gKyAgICAgICByZXQgPSByZWdt YXBfdXBkYXRlX2JpdHMobGxjY19iY2FzdF9yZWdtYXAsCj4+ID4+IENNTl9JTlRFUlJVUFRfMl9F TkFCTEUsCj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSUDBfSU5URVJS VVBUX0VOQUJMRSwKPj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJQMF9J TlRFUlJVUFRfRU5BQkxFKTsKPj4gPj4gKyAgICAgICBpZiAocmV0KQo+PiA+PiArICAgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPj4gPj4gKwo+PiA+PiArICAgICAgIC8qIEVuYWJsZSBFQ0MgaW50 ZXJydXB0cyBvbiBUYWcgUmFtICovCj4+ID4+ICsgICAgICAgcmV0ID0gcmVnbWFwX3VwZGF0ZV9i aXRzKGxsY2NfYmNhc3RfcmVnbWFwLAo+PiA+PiBUUlBfSU5URVJSVVBUXzBfRU5BQkxFLAo+PiA+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9EQl9UUlBfSU5URVJSVVBUX0VO QUJMRSwKPj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfREJfVFJQX0lO VEVSUlVQVF9FTkFCTEUpOwo+PiA+PiArICAgICAgIGlmIChyZXQpCj4+ID4+ICsgICAgICAgICAg ICAgICByZXR1cm4gcmV0Owo+PiA+PiArCj4+ID4+ICsgICAgICAgLyogRW5hYmxlIFNCIGVycm9y IGZvciBEYXRhIFJBTSAqLwo+PiA+PiArICAgICAgIHNiX2Vycl90aHJlc2hvbGQgPSAoU0JfRVJS T1JfVEhSRVNIT0xEIDw8Cj4+ID4+IFNCX0VSUk9SX1RIUkVTSE9MRF9TSElGVCk7Cj4+ID4+ICsg ICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGxsY2NfYmNhc3RfcmVnbWFwLCBEUlBfRUNDX0VSUk9S X0NGRywKPj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2JfZXJyX3RocmVzaG9sZCk7 Cj4+ID4+ICsgICAgICAgaWYgKHJldCkKPj4gPj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7 Cj4+ID4+ICsKPj4gPj4gKyAgICAgICAvKiBFbmFibGUgRFJQIGluIGluc3RhbmNlIDIgb2YgY29t bW9uIGludGVycnVwdCBlbmFibGUKPj4gPj4gcmVnaXN0ZXIgKi8KPj4gPj4gKyAgICAgICByZXQg PSByZWdtYXBfdXBkYXRlX2JpdHMobGxjY19iY2FzdF9yZWdtYXAsCj4+ID4+IENNTl9JTlRFUlJV UFRfMl9FTkFCTEUsCj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSUDBf SU5URVJSVVBUX0VOQUJMRSwKPj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg RFJQMF9JTlRFUlJVUFRfRU5BQkxFKTsKPj4gPj4gKyAgICAgICBpZiAocmV0KQo+PiA+PiArICAg ICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4gPj4gKwo+PiA+PiArICAgICAgIC8qIEVuYWJsZSBF Q0MgaW50ZXJydXB0cyBvbiBEYXRhIFJhbSAqLwo+PiA+PiArICAgICAgIHJldCA9IHJlZ21hcF93 cml0ZShsbGNjX2JjYXN0X3JlZ21hcCwgRFJQX0lOVEVSUlVQVF9FTkFCTEUsCj4+ID4+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgIFNCX0RCX0RSUF9JTlRFUlJVUFRfRU5BQkxFKTsKPj4gPj4g KyAgICAgICByZXR1cm4gcmV0Owo+PiA+PiArfQo+PiA+PiArCj4+ID4+ICsvKiBDbGVhciB0aGUg ZXJyb3IgaW50ZXJydXB0IGFuZCBjb3VudGVyIHJlZ2lzdGVycyAqLwo+PiA+PiArc3RhdGljIGlu dAo+PiA+PiArcWNvbV9sbGNjX2NsZWFyX2Vycm9yc19zdGF0dXMoaW50IGVycl90eXBlLCBzdHJ1 Y3QgbGxjY19kcnZfZGF0YQo+PiA+PiAqZHJ2KQo+PiA+Cj4+ID4gQW5vdGhlciBuaXQ6IGVycm9y c19zdGF0dXMgaXMga2luZCBvZiB3ZWlyZC4gTWF5YmUKPj4gPiBxY29tX2xsY2NfY2xlYXJfZXJy b3JzIG9yIHFjb21fbGxjY19jbGVhcl9lcnJvcl9zdGF0dXM/Cj4+IAo+PiBJJ2xsIHVwZGF0ZSB0 aGUgbmFtZS4KPj4gCj4+ID4KPj4gPj4gK3sKPj4gPj4gKyAgICAgICBpbnQgcmV0ID0gMDsKPj4g Pj4gKwo+PiA+PiArICAgICAgIHN3aXRjaCAoZXJyX3R5cGUpIHsKPj4gPj4gKyAgICAgICBjYXNl IExMQ0NfRFJBTV9DRToKPj4gPj4gKyAgICAgICBjYXNlIExMQ0NfRFJBTV9VRToKPj4gPj4gKyAg ICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KPj4gPj4gKyAgICAgICAgICAg ICAgIHJldCA9IHJlZ21hcF93cml0ZShkcnYtPmJjYXN0X3JlZ21hcCwKPj4gPj4gRFJQX0lOVEVS UlVQVF9DTEVBUiwKPj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUlBf VFJQX0lOVF9DTEVBUik7Cj4+ID4+ICsgICAgICAgICAgICAgICBpZiAocmV0KQo+PiA+PiArICAg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+PiA+PiArCj4+ID4+ICsgICAgICAgICAg ICAgICAvKiBDbGVhciB0aGUgY291bnRlcnMgKi8KPj4gPj4gKyAgICAgICAgICAgICAgIHJldCA9 IHJlZ21hcF93cml0ZShkcnYtPmJjYXN0X3JlZ21hcCwKPj4gPj4gRFJQX0VDQ19FUlJPUl9DTlRS X0NMRUFSLAo+PiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSUF9UUlBf Q05UX0NMRUFSKTsKPj4gPj4gKyAgICAgICAgICAgICAgIGlmIChyZXQpCj4+ID4+ICsgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+ID4+ICsgICAgICAgICAgICAgICBicmVhazsK Pj4gPj4gKyAgICAgICBjYXNlIExMQ0NfVFJBTV9DRToKPj4gPj4gKyAgICAgICBjYXNlIExMQ0Nf VFJBTV9VRToKPj4gPj4gKyAgICAgICAgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZShkcnYtPmJj YXN0X3JlZ21hcCwKPj4gPj4gVFJQX0lOVEVSUlVQVF8wX0NMRUFSLAo+PiA+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERSUF9UUlBfSU5UX0NMRUFSKTsKPj4gPj4gKyAgICAg ICAgICAgICAgIGlmIChyZXQpCj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+ID4+ICsKPj4gPj4gKyAgICAgICAgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZShkcnYt PmJjYXN0X3JlZ21hcCwKPj4gPj4gVFJQX0VDQ19FUlJPUl9DTlRSX0NMRUFSLAo+PiA+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSUF9UUlBfQ05UX0NMRUFSKTsKPj4gPj4g KyAgICAgICAgICAgICAgIGlmIChyZXQpCj4+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4+ID4+ICsgICAgICAgICAgICAgICBicmVhazsKPj4gPgo+PiA+IEEgZGVmYXVs dCBjYXNlIHRoYXQgZXJyb3JzIG9yIGNvbXBsYWlucyBvciBib3RoIHdvdWxkIGJlIG5pY2UuCj4+ IAo+PiBPaywgSSBoYWQgdGhpcyB0aG91Z2h0IHRvbywgYnV0IHdlIG5ldmVyIHJ1biBpbnRvIHRo YXQgc2NlbmFyaW8sCj4+IHRoYXQncyB3ZSBkb24ndCBldmVyIGNhbGwgdGhpcyBmdW5jdGlvbiB3 aXRoIGFueSBvdGhlciB0eXBlcywKPj4gSGFkIGl0IGJlZW4gYW4gQVBJIGl0IG1ha2VzIHNlbnNl IHRvIGhhdmUgYSBkZWZhdWx0IGNhc2UuCj4+IFRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgcmVxdWly ZSB0aGVtIHRvbyEgSSBkb24ndCBrbm93ISEKPj4gV2hhdCBkbyB5b3UgdGhpbms/Cj4+IEFzIHdl IHNheSwgaWYgaXQncyBnb29kIHRvIGhhdmUgaXQsIEknbGwgYWRkIGl0Lgo+IAo+IEkgcGVyc29u YWxseSBsaWtlIHRoZSBkZWZhdWx0IGNhc2UsIEkgZmluZCBpdCB0byBiZSBkZWZlbnNpdmUgYWdh aW5zdAo+IHNvbWVvbmUgYWRkaW5nIGNvZGUgbGF0ZXIgd2hvIHBhc3NlcyB0aGUgd3JvbmcgdmFs dWUgb3IgdHlwZSBkb3duLgo+IE90aGVycyBtaWdodCBkaXNhZ3JlZS4gSXQncyB1cCB0byB5b3Uu CgpJdCBtYWtlcyBzZW5zZSB0byBoYXZlIGEgZGVmZW5zaXZlIGNvZGUgYWdhaW5zdCBzb21lb25l IGFkZGluZyB0aGUgY29kZSAKbGF0ZXIsCkknbGwgYWRkIGl0Lgo=