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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 1AEC5C433ED for ; Wed, 14 Apr 2021 17:36:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DC25661168 for ; Wed, 14 Apr 2021 17:36:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350684AbhDNRgn convert rfc822-to-8bit (ORCPT ); Wed, 14 Apr 2021 13:36:43 -0400 Received: from aposti.net ([89.234.176.197]:35430 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230221AbhDNRgf (ORCPT ); Wed, 14 Apr 2021 13:36:35 -0400 Date: Wed, 14 Apr 2021 18:35:56 +0100 From: Paul Cercueil Subject: Re: [PATCH v3 2/3] drm: bridge: add it66121 driver To: Neil Armstrong Cc: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, robert.foss@linaro.org, jonas@kwiboo.se, jernej.skrabec@siol.net, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Phong LE Message-Id: In-Reply-To: <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> References: <20210412154648.3719153-1-narmstrong@baylibre.com> <20210412154648.3719153-3-narmstrong@baylibre.com> <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Neil, Le mer. 14 avril 2021 à 8:17, Neil Armstrong a écrit : > Hi, > > Le 13/04/2021 à 22:56, Paul Cercueil a écrit : >> Hi Neil, >> >> I get build failures locally: >> >> drivers/gpu/drm/bridge/ite-it66121.c: In function >> ‘it66121_hw_reset’: >> drivers/gpu/drm/bridge/ite-it66121.c:242:2: error: implicit >> declaration of function ‘gpiod_set_value’ >> [-Werror=implicit-function-declaration] >> 242 | gpiod_set_value(ctx->gpio_reset, 1); >> | ^~~~~~~~~~~~~~~ >> drivers/gpu/drm/bridge/ite-it66121.c: In function >> ‘it66121_probe’: >> drivers/gpu/drm/bridge/ite-it66121.c:1016:16: error: implicit >> declaration of function ‘FIELD_GET’; did you mean >> ‘FOLL_GET’? [-Werror=implicit-function-declaration] >> 1016 | revision_id = FIELD_GET(IT66121_REVISION_MASK, >> device_ids[1]); >> | ^~~~~~~~~ >> | FOLL_GET >> >> Nothing difficult to fix, but the includes should be added >> nonetheless. > > Exact, I got the CI build failures, I'll fix these for v4. > > Were you able to test on your setup ? > The v2 always forced DDR mode, with this v3, I also switch to normal > 24input mode, but totally untested. It triggers a warning: [ 277.870247] WARNING: CPU: 0 PID: 310 at drivers/gpu/drm/drm_bridge.c:892 drm_atomic_bridge_chain_check+0x304/0x324 [ 277.870290] Modules linked in: [ 277.870306] CPU: 0 PID: 310 Comm: modetest Tainted: G W 5.12.0-rc7-opendingux-00121-g828a3020b5d3 #371 [ 277.870322] Stack : 83f62580 80163b58 00000000 00000004 00000000 b1f39d7e 83581a9c 80ab42b0 [ 277.870367] 808a0000 808a0000 835c82f0 808a0dab 80ab42b0 00000001 83581a48 b1f39d7e [ 277.870412] 00000000 00000000 807e9030 00000000 000000b8 835818fc 00000000 7875676e [ 277.870456] 3130302d 80abaa43 80abaa9f 672d3132 808a0000 80000000 00000009 0000037c [ 277.870500] 00000000 00000000 82a2d0f8 83043b80 00000000 fffffffc 00002098 80ab0000 [ 277.870544] ... [ 277.870556] Call Trace: [ 277.870560] [<80109010>] show_stack+0x40/0x128 [ 277.870588] [<80123350>] __warn+0xe0/0x154 [ 277.870608] [<80123428>] warn_slowpath_fmt+0x64/0xb8 [ 277.870625] [<80504e70>] drm_atomic_bridge_chain_check+0x304/0x324 [ 277.870642] [<804e3244>] drm_atomic_helper_check_modeset+0x9f4/0xc58 [ 277.870667] [<804e4338>] drm_atomic_helper_check+0x20/0xa8 [ 277.870685] [<80503644>] drm_atomic_check_only+0x538/0x98c [ 277.870700] [<80503ab4>] drm_atomic_commit+0x1c/0x70 [ 277.870716] [<8051c3e4>] drm_mode_atomic_ioctl+0x920/0xb44 [ 277.870736] [<804f033c>] drm_ioctl+0x20c/0x3d8 [ 277.870754] [<80283658>] sys_ioctl+0x358/0x860 [ 277.870772] [<801107ec>] syscall_common+0x34/0x58 [ 277.870795] ---[ end trace e973f3b21c63aa1d ]--- That causes my atomic commit to fail, so I can't test it further. Cheers, -Paul > Thanks, > Neil > >> >> Cheers, >> -Paul >> >> >> Le lun. 12 avril 2021 à 17:46, Neil Armstrong >> a écrit : >>> From: Phong LE >>> >>> This commit is a simple driver for bridge HMDI it66121. >>> The input format is RBG and there is no color conversion. >>> Audio, HDCP and CEC are not supported yet. >>> >>> Signed-off-by: Phong LE >>> Signed-off-by: Neil Armstrong >>> --- >>> drivers/gpu/drm/bridge/Kconfig | 8 + >>> drivers/gpu/drm/bridge/Makefile | 1 + >>> drivers/gpu/drm/bridge/ite-it66121.c | 1081 >>> ++++++++++++++++++++++++++ >>> 3 files changed, 1090 insertions(+) >>> create mode 100644 drivers/gpu/drm/bridge/ite-it66121.c >>> >>> diff --git a/drivers/gpu/drm/bridge/Kconfig >>> b/drivers/gpu/drm/bridge/Kconfig >>> index e4110d6ca7b3..6915c38fa459 100644 >>> --- a/drivers/gpu/drm/bridge/Kconfig >>> +++ b/drivers/gpu/drm/bridge/Kconfig >>> @@ -74,6 +74,14 @@ config DRM_LONTIUM_LT9611UXC >>> HDMI signals >>> Please say Y if you have such hardware. >>> >>> +config DRM_ITE_IT66121 >>> + tristate "ITE IT66121 HDMI bridge" >>> + depends on OF >>> + select DRM_KMS_HELPER >>> + select REGMAP_I2C >>> + help >>> + Support for ITE IT66121 HDMI bridge. >>> + >>> config DRM_LVDS_CODEC >>> tristate "Transparent LVDS encoders and decoders support" >>> depends on OF >>> diff --git a/drivers/gpu/drm/bridge/Makefile >>> b/drivers/gpu/drm/bridge/Makefile >>> index 86e7acc76f8d..4f725753117c 100644 >>> --- a/drivers/gpu/drm/bridge/Makefile >>> +++ b/drivers/gpu/drm/bridge/Makefile >>> @@ -24,6 +24,7 @@ obj-$(CONFIG_DRM_TI_SN65DSI86) += ti-sn65dsi86.o >>> obj-$(CONFIG_DRM_TI_TFP410) += ti-tfp410.o >>> obj-$(CONFIG_DRM_TI_TPD12S015) += ti-tpd12s015.o >>> obj-$(CONFIG_DRM_NWL_MIPI_DSI) += nwl-dsi.o >>> +obj-$(CONFIG_DRM_ITE_IT66121) += ite-it66121.o >>> >>> obj-y += analogix/ >>> obj-y += cadence/ >>> diff --git a/drivers/gpu/drm/bridge/ite-it66121.c >>> b/drivers/gpu/drm/bridge/ite-it66121.c >>> new file mode 100644 >>> index 000000000000..73af49b29dfa >>> --- /dev/null >>> +++ b/drivers/gpu/drm/bridge/ite-it66121.c >>> @@ -0,0 +1,1081 @@ >>> +// SPDX-License-Identifier: GPL-2.0-only >>> +/* >>> + * Copyright (C) 2020 BayLibre, SAS >>> + * Author: Phong LE >>> + * Copyright (C) 2018-2019, Artem Mygaiev >>> + * Copyright (C) 2017, Fresco Logic, Incorporated. >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#define IT66121_VENDOR_ID0_REG 0x00 >>> +#define IT66121_VENDOR_ID1_REG 0x01 >>> +#define IT66121_DEVICE_ID0_REG 0x02 >>> +#define IT66121_DEVICE_ID1_REG 0x03 >>> + >>> +#define IT66121_VENDOR_ID0 0x54 >>> +#define IT66121_VENDOR_ID1 0x49 >>> +#define IT66121_DEVICE_ID0 0x12 >>> +#define IT66121_DEVICE_ID1 0x06 >>> +#define IT66121_REVISION_MASK GENMASK(7, 4) >>> +#define IT66121_DEVICE_ID1_MASK GENMASK(3, 0) >>> + >>> +#define IT66121_MASTER_SEL_REG 0x10 >>> +#define IT66121_MASTER_SEL_HOST BIT(0) >>> + >>> +#define IT66121_AFE_DRV_REG 0x61 >>> +#define IT66121_AFE_DRV_RST BIT(4) >>> +#define IT66121_AFE_DRV_PWD BIT(5) >>> + >>> +#define IT66121_INPUT_MODE_REG 0x70 >>> +#define IT66121_INPUT_MODE_RGB (0 << 6) >>> +#define IT66121_INPUT_MODE_YUV422 BIT(6) >>> +#define IT66121_INPUT_MODE_YUV444 (2 << 6) >>> +#define IT66121_INPUT_MODE_CCIR656 BIT(4) >>> +#define IT66121_INPUT_MODE_SYNCEMB BIT(3) >>> +#define IT66121_INPUT_MODE_DDR BIT(2) >>> + >>> +#define IT66121_INPUT_CSC_REG 0x72 >>> +#define IT66121_INPUT_CSC_ENDITHER BIT(7) >>> +#define IT66121_INPUT_CSC_ENUDFILTER BIT(6) >>> +#define IT66121_INPUT_CSC_DNFREE_GO BIT(5) >>> +#define IT66121_INPUT_CSC_RGB_TO_YUV 0x02 >>> +#define IT66121_INPUT_CSC_YUV_TO_RGB 0x03 >>> +#define IT66121_INPUT_CSC_NO_CONV 0x00 >>> + >>> +#define IT66121_AFE_XP_REG 0x62 >>> +#define IT66121_AFE_XP_GAINBIT BIT(7) >>> +#define IT66121_AFE_XP_PWDPLL BIT(6) >>> +#define IT66121_AFE_XP_ENI BIT(5) >>> +#define IT66121_AFE_XP_ENO BIT(4) >>> +#define IT66121_AFE_XP_RESETB BIT(3) >>> +#define IT66121_AFE_XP_PWDI BIT(2) >>> + >>> +#define IT66121_AFE_IP_REG 0x64 >>> +#define IT66121_AFE_IP_GAINBIT BIT(7) >>> +#define IT66121_AFE_IP_PWDPLL BIT(6) >>> +#define IT66121_AFE_IP_CKSEL_05 (0 << 4) >>> +#define IT66121_AFE_IP_CKSEL_1 BIT(4) >>> +#define IT66121_AFE_IP_CKSEL_2 (2 << 4) >>> +#define IT66121_AFE_IP_CKSEL_2OR4 (3 << 4) >>> +#define IT66121_AFE_IP_ER0 BIT(3) >>> +#define IT66121_AFE_IP_RESETB BIT(2) >>> +#define IT66121_AFE_IP_ENC BIT(1) >>> +#define IT66121_AFE_IP_EC1 BIT(0) >>> + >>> +#define IT66121_AFE_XP_EC1_REG 0x68 >>> +#define IT66121_AFE_XP_EC1_LOWCLK BIT(4) >>> + >>> +#define IT66121_SW_RST_REG 0x04 >>> +#define IT66121_SW_RST_REF BIT(5) >>> +#define IT66121_SW_RST_AREF BIT(4) >>> +#define IT66121_SW_RST_VID BIT(3) >>> +#define IT66121_SW_RST_AUD BIT(2) >>> +#define IT66121_SW_RST_HDCP BIT(0) >>> + >>> +#define IT66121_DDC_COMMAND_REG 0x15 >>> +#define IT66121_DDC_COMMAND_BURST_READ 0x0 >>> +#define IT66121_DDC_COMMAND_EDID_READ 0x3 >>> +#define IT66121_DDC_COMMAND_FIFO_CLR 0x9 >>> +#define IT66121_DDC_COMMAND_SCL_PULSE 0xA >>> +#define IT66121_DDC_COMMAND_ABORT 0xF >>> + >>> +#define IT66121_HDCP_REG 0x20 >>> +#define IT66121_HDCP_CPDESIRED BIT(0) >>> +#define IT66121_HDCP_EN1P1FEAT BIT(1) >>> + >>> +#define IT66121_INT_STATUS1_REG 0x06 >>> +#define IT66121_INT_STATUS1_AUD_OVF BIT(7) >>> +#define IT66121_INT_STATUS1_DDC_NOACK BIT(5) >>> +#define IT66121_INT_STATUS1_DDC_FIFOERR BIT(4) >>> +#define IT66121_INT_STATUS1_DDC_BUSHANG BIT(2) >>> +#define IT66121_INT_STATUS1_RX_SENS_STATUS BIT(1) >>> +#define IT66121_INT_STATUS1_HPD_STATUS BIT(0) >>> + >>> +#define IT66121_DDC_HEADER_REG 0x11 >>> +#define IT66121_DDC_HEADER_HDCP 0x74 >>> +#define IT66121_DDC_HEADER_EDID 0xA0 >>> + >>> +#define IT66121_DDC_OFFSET_REG 0x12 >>> +#define IT66121_DDC_BYTE_REG 0x13 >>> +#define IT66121_DDC_SEGMENT_REG 0x14 >>> +#define IT66121_DDC_RD_FIFO_REG 0x17 >>> + >>> +#define IT66121_CLK_BANK_REG 0x0F >>> +#define IT66121_CLK_BANK_PWROFF_RCLK BIT(6) >>> +#define IT66121_CLK_BANK_PWROFF_ACLK BIT(5) >>> +#define IT66121_CLK_BANK_PWROFF_TXCLK BIT(4) >>> +#define IT66121_CLK_BANK_PWROFF_CRCLK BIT(3) >>> +#define IT66121_CLK_BANK_0 0 >>> +#define IT66121_CLK_BANK_1 1 >>> + >>> +#define IT66121_INT_REG 0x05 >>> +#define IT66121_INT_ACTIVE_HIGH BIT(7) >>> +#define IT66121_INT_OPEN_DRAIN BIT(6) >>> +#define IT66121_INT_TX_CLK_OFF BIT(0) >>> + >>> +#define IT66121_INT_MASK1_REG 0x09 >>> +#define IT66121_INT_MASK1_AUD_OVF BIT(7) >>> +#define IT66121_INT_MASK1_DDC_NOACK BIT(5) >>> +#define IT66121_INT_MASK1_DDC_FIFOERR BIT(4) >>> +#define IT66121_INT_MASK1_DDC_BUSHANG BIT(2) >>> +#define IT66121_INT_MASK1_RX_SENS BIT(1) >>> +#define IT66121_INT_MASK1_HPD BIT(0) >>> + >>> +#define IT66121_INT_CLR1_REG 0x0C >>> +#define IT66121_INT_CLR1_PKTACP BIT(7) >>> +#define IT66121_INT_CLR1_PKTNULL BIT(6) >>> +#define IT66121_INT_CLR1_PKTGEN BIT(5) >>> +#define IT66121_INT_CLR1_KSVLISTCHK BIT(4) >>> +#define IT66121_INT_CLR1_AUTHDONE BIT(3) >>> +#define IT66121_INT_CLR1_AUTHFAIL BIT(2) >>> +#define IT66121_INT_CLR1_RX_SENS BIT(1) >>> +#define IT66121_INT_CLR1_HPD BIT(0) >>> + >>> +#define IT66121_AV_MUTE_REG 0xC1 >>> +#define IT66121_AV_MUTE_ON BIT(0) >>> +#define IT66121_AV_MUTE_BLUESCR BIT(1) >>> + >>> +#define IT66121_PKT_GEN_CTRL_REG 0xC6 >>> +#define IT66121_PKT_GEN_CTRL_ON BIT(0) >>> +#define IT66121_PKT_GEN_CTRL_RPT BIT(1) >>> + >>> +#define IT66121_AVIINFO_DB1_REG 0x158 >>> +#define IT66121_AVIINFO_DB2_REG 0x159 >>> +#define IT66121_AVIINFO_DB3_REG 0x15A >>> +#define IT66121_AVIINFO_DB4_REG 0x15B >>> +#define IT66121_AVIINFO_DB5_REG 0x15C >>> +#define IT66121_AVIINFO_CSUM_REG 0x15D >>> +#define IT66121_AVIINFO_DB6_REG 0x15E >>> +#define IT66121_AVIINFO_DB7_REG 0x15F >>> +#define IT66121_AVIINFO_DB8_REG 0x160 >>> +#define IT66121_AVIINFO_DB9_REG 0x161 >>> +#define IT66121_AVIINFO_DB10_REG 0x162 >>> +#define IT66121_AVIINFO_DB11_REG 0x163 >>> +#define IT66121_AVIINFO_DB12_REG 0x164 >>> +#define IT66121_AVIINFO_DB13_REG 0x165 >>> + >>> +#define IT66121_AVI_INFO_PKT_REG 0xCD >>> +#define IT66121_AVI_INFO_PKT_ON BIT(0) >>> +#define IT66121_AVI_INFO_PKT_RPT BIT(1) >>> + >>> +#define IT66121_HDMI_MODE_REG 0xC0 >>> +#define IT66121_HDMI_MODE_HDMI BIT(0) >>> + >>> +#define IT66121_SYS_STATUS_REG 0x0E >>> +#define IT66121_SYS_STATUS_ACTIVE_IRQ BIT(7) >>> +#define IT66121_SYS_STATUS_HPDETECT BIT(6) >>> +#define IT66121_SYS_STATUS_SENDECTECT BIT(5) >>> +#define IT66121_SYS_STATUS_VID_STABLE BIT(4) >>> +#define IT66121_SYS_STATUS_AUD_CTS_CLR BIT(1) >>> +#define IT66121_SYS_STATUS_CLEAR_IRQ BIT(0) >>> + >>> +#define IT66121_DDC_STATUS_REG 0x16 >>> +#define IT66121_DDC_STATUS_TX_DONE BIT(7) >>> +#define IT66121_DDC_STATUS_ACTIVE BIT(6) >>> +#define IT66121_DDC_STATUS_NOACK BIT(5) >>> +#define IT66121_DDC_STATUS_WAIT_BUS BIT(4) >>> +#define IT66121_DDC_STATUS_ARBI_LOSE BIT(3) >>> +#define IT66121_DDC_STATUS_FIFO_FULL BIT(2) >>> +#define IT66121_DDC_STATUS_FIFO_EMPTY BIT(1) >>> +#define IT66121_DDC_STATUS_FIFO_VALID BIT(0) >>> + >>> +#define IT66121_EDID_SLEEP_US 20000 >>> +#define IT66121_EDID_TIMEOUT_US 200000 >>> +#define IT66121_EDID_FIFO_SIZE 32 >>> +#define IT66121_AFE_CLK_HIGH 80000 /* Khz */ >>> + >>> +struct it66121_ctx { >>> + struct regmap *regmap; >>> + struct drm_bridge bridge; >>> + struct drm_connector connector; >>> + struct device *dev; >>> + struct gpio_desc *gpio_reset; >>> + struct i2c_client *client; >>> + struct regulator_bulk_data supplies[3]; >>> + u32 bus_width; >>> + struct mutex lock; /* Protects fields below and device >>> registers */ >>> + struct edid *edid; >>> + struct hdmi_avi_infoframe hdmi_avi_infoframe; >>> +}; >>> + >>> +static const struct regmap_range_cfg it66121_regmap_banks[] = { >>> + { >>> + .name = "it66121", >>> + .range_min = 0x00, >>> + .range_max = 0x1FF, >>> + .selector_reg = IT66121_CLK_BANK_REG, >>> + .selector_mask = 0x1, >>> + .selector_shift = 0, >>> + .window_start = 0x00, >>> + .window_len = 0x130, >>> + }, >>> +}; >>> + >>> +static const struct regmap_config it66121_regmap_config = { >>> + .val_bits = 8, >>> + .reg_bits = 8, >>> + .max_register = 0x1FF, >>> + .ranges = it66121_regmap_banks, >>> + .num_ranges = ARRAY_SIZE(it66121_regmap_banks), >>> +}; >>> + >>> +static void it66121_hw_reset(struct it66121_ctx *ctx) >>> +{ >>> + gpiod_set_value(ctx->gpio_reset, 1); >>> + msleep(20); >>> + gpiod_set_value(ctx->gpio_reset, 0); >>> +} >>> + >>> +static int ite66121_power_on(struct it66121_ctx *ctx) >>> +{ >>> + return regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), >>> ctx->supplies); >>> +} >>> + >>> +static int ite66121_power_off(struct it66121_ctx *ctx) >>> +{ >>> + return regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), >>> ctx->supplies); >>> +} >>> + >>> +static int it66121_preamble_ddc(struct it66121_ctx *ctx) >>> +{ >>> + return regmap_write(ctx->regmap, IT66121_MASTER_SEL_REG, >>> + IT66121_MASTER_SEL_HOST); >>> +} >>> + >>> +static int it66121_fire_afe(struct it66121_ctx *ctx) >>> +{ >>> + return regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, 0); >>> +} >>> + >>> +/* TOFIX: Handle YCbCr Input & Output */ >>> +static int it66121_configure_input(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + u8 mode = IT66121_INPUT_MODE_RGB; >>> + >>> + if (ctx->bus_width == 12) >>> + mode |= IT66121_INPUT_MODE_DDR; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_INPUT_MODE_REG, mode); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_INPUT_CSC_REG, >>> IT66121_INPUT_CSC_NO_CONV); >>> +} >>> + >>> +/** >>> + * it66121_configure_afe() - Configure the analog front end >>> + * @ctx: it66121_ctx object >>> + * @mode: mode to configure >>> + * >>> + * RETURNS: >>> + * zero if success, a negative error code otherwise. >>> + */ >>> +static int it66121_configure_afe(struct it66121_ctx *ctx, >>> + const struct drm_display_mode *mode) >>> +{ >>> + int ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_RST); >>> + if (ret) >>> + return ret; >>> + >>> + if (mode->clock > IT66121_AFE_CLK_HIGH) { >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_GAINBIT | >>> + IT66121_AFE_XP_ENO, >>> + IT66121_AFE_XP_GAINBIT); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_GAINBIT | >>> + IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1, >>> + IT66121_AFE_IP_GAINBIT); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, >>> IT66121_AFE_XP_EC1_REG, >>> + IT66121_AFE_XP_EC1_LOWCLK, 0x80); >>> + if (ret) >>> + return ret; >>> + } else { >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_GAINBIT | >>> + IT66121_AFE_XP_ENO, >>> + IT66121_AFE_XP_ENO); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_GAINBIT | >>> + IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1, IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, >>> IT66121_AFE_XP_EC1_REG, >>> + IT66121_AFE_XP_EC1_LOWCLK, >>> + IT66121_AFE_XP_EC1_LOWCLK); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + /* Clear reset flags */ >>> + ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, >>> + IT66121_SW_RST_REF | IT66121_SW_RST_VID, >>> + ~(IT66121_SW_RST_REF | IT66121_SW_RST_VID) & >>> + 0xFF); >>> + if (ret) >>> + return ret; >>> + >>> + return it66121_fire_afe(ctx); >>> +} >>> + >>> +static inline int it66121_wait_ddc_ready(struct it66121_ctx *ctx) >>> +{ >>> + int ret, val; >>> + u32 busy = IT66121_DDC_STATUS_NOACK | >>> IT66121_DDC_STATUS_WAIT_BUS | >>> + IT66121_DDC_STATUS_ARBI_LOSE; >>> + >>> + ret = regmap_read_poll_timeout(ctx->regmap, >>> IT66121_DDC_STATUS_REG, val, true, >>> + IT66121_EDID_SLEEP_US, >>> IT66121_EDID_TIMEOUT_US); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & busy) >>> + return -EAGAIN; >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_clear_ddc_fifo(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_FIFO_CLR); >>> +} >>> + >>> +static int it66121_abort_ddc_ops(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + unsigned int swreset, cpdesire; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_SW_RST_REG, &swreset); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_HDCP_REG, &cpdesire); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_HDCP_REG, >>> + cpdesire & (~IT66121_HDCP_CPDESIRED & 0xFF)); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_SW_RST_REG, >>> + (swreset | IT66121_SW_RST_HDCP)); >>> + if (ret) >>> + return ret; >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_ABORT); >>> + if (ret) >>> + return ret; >>> + >>> + return it66121_wait_ddc_ready(ctx); >>> +} >>> + >>> +static int it66121_get_edid_block(void *context, u8 *buf, >>> + unsigned int block, size_t len) >>> +{ >>> + struct it66121_ctx *ctx = context; >>> + unsigned int val; >>> + int remain = len; >>> + int offset = 0; >>> + int ret, cnt; >>> + >>> + offset = (block % 2) * len; >>> + block = block / 2; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, &val); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & IT66121_INT_STATUS1_DDC_BUSHANG) { >>> + ret = it66121_abort_ddc_ops(ctx); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + ret = it66121_clear_ddc_fifo(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + while (remain > 0) { >>> + cnt = (remain > IT66121_EDID_FIFO_SIZE) ? >>> + IT66121_EDID_FIFO_SIZE : remain; >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_FIFO_CLR); >>> + if (ret) >>> + return ret; >>> + >>> + ret = it66121_wait_ddc_ready(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, >>> &val); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & IT66121_INT_STATUS1_DDC_BUSHANG) { >>> + ret = it66121_abort_ddc_ops(ctx); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_HEADER_REG, >>> + IT66121_DDC_HEADER_EDID); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_OFFSET_REG, >>> offset); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_BYTE_REG, >>> cnt); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_SEGMENT_REG, >>> block); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_EDID_READ); >>> + if (ret) >>> + return ret; >>> + >>> + offset += cnt; >>> + remain -= cnt; >>> + >>> + /* Per programming manual, sleep here before emptying the >>> FIFO */ >>> + msleep(20); >>> + >>> + ret = it66121_wait_ddc_ready(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + do { >>> + ret = regmap_read(ctx->regmap, >>> IT66121_DDC_RD_FIFO_REG, &val); >>> + if (ret) >>> + return ret; >>> + *(buf++) = val; >>> + cnt--; >>> + } while (cnt > 0); >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_connector_get_modes(struct drm_connector >>> *connector) >>> +{ >>> + int ret, num_modes = 0; >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + if (ctx->edid) >>> + return drm_add_edid_modes(connector, ctx->edid); >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + ctx->edid = drm_do_get_edid(connector, >>> it66121_get_edid_block, ctx); >>> + if (!ctx->edid) { >>> + DRM_ERROR("Failed to read EDID\n"); >>> + goto unlock; >>> + } >>> + >>> + ret = drm_connector_update_edid_property(connector, >>> ctx->edid); >>> + if (ret) { >>> + DRM_ERROR("Failed to update EDID property: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + num_modes = drm_add_edid_modes(connector, ctx->edid); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> + >>> + return num_modes; >>> +} >>> + >>> +static bool it66121_is_hpd_detect(struct it66121_ctx *ctx) >>> +{ >>> + int val; >>> + >>> + if (regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val)) >>> + return false; >>> + >>> + return val & IT66121_SYS_STATUS_HPDETECT; >>> +} >>> + >>> +static int it66121_connector_detect_ctx(struct drm_connector >>> *connector, >>> + struct drm_modeset_acquire_ctx *c, >>> + bool force) >>> +{ >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + return it66121_is_hpd_detect(ctx) ? connector_status_connected >>> + : connector_status_disconnected; >>> +} >>> + >>> +static enum drm_mode_status it66121_mode_valid(struct it66121_ctx >>> *ctx, >>> + const struct drm_display_mode *mode) >>> +{ >>> + unsigned long max_clock; >>> + >>> + max_clock = (ctx->bus_width == 12) ? 74250 : 148500; >>> + >>> + if (mode->clock > max_clock) >>> + return MODE_CLOCK_HIGH; >>> + >>> + if (mode->clock < 25000) >>> + return MODE_CLOCK_LOW; >>> + >>> + return MODE_OK; >>> +} >>> + >>> +static enum drm_mode_status it66121_connector_mode_valid(struct >>> drm_connector *connector, >>> + struct drm_display_mode *mode) >>> +{ >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + return it66121_mode_valid(ctx, mode); >>> +} >>> + >>> +static struct drm_connector_helper_funcs >>> it66121_connector_helper_funcs = { >>> + .get_modes = it66121_connector_get_modes, >>> + .detect_ctx = it66121_connector_detect_ctx, >>> + .mode_valid = it66121_connector_mode_valid, >>> +}; >>> + >>> +static const struct drm_connector_funcs it66121_connector_funcs = >>> { >>> + .reset = drm_atomic_helper_connector_reset, >>> + .fill_modes = drm_helper_probe_single_connector_modes, >>> + .destroy = drm_connector_cleanup, >>> + .atomic_duplicate_state = >>> drm_atomic_helper_connector_duplicate_state, >>> + .atomic_destroy_state = >>> drm_atomic_helper_connector_destroy_state, >>> +}; >>> + >>> +static int it66121_bridge_attach(struct drm_bridge *bridge, >>> + enum drm_bridge_attach_flags flags) >>> +{ >>> + int ret; >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, >>> + bridge); >>> + >>> + if (!bridge->encoder) { >>> + DRM_ERROR("Parent encoder object not found"); >>> + return -ENODEV; >>> + } >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> + IT66121_CLK_BANK_PWROFF_RCLK, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_INT_REG, >>> + IT66121_INT_TX_CLK_OFF, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_PWD, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_PWDI | IT66121_AFE_XP_PWDPLL, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_PWDPLL, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_RST, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_RESETB, IT66121_AFE_XP_RESETB); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_RESETB, IT66121_AFE_IP_RESETB); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, >>> + IT66121_SW_RST_REF, >>> + IT66121_SW_RST_REF); >>> + if (ret) >>> + return ret; >>> + >>> + /* Per programming manual, sleep here for bridge to settle */ >>> + msleep(50); >>> + >>> + /* Start interrupts */ >>> + ret = regmap_write_bits(ctx->regmap, IT66121_INT_MASK1_REG, >>> + IT66121_INT_MASK1_DDC_NOACK | >>> + IT66121_INT_MASK1_HPD | >>> + IT66121_INT_MASK1_DDC_FIFOERR | >>> + IT66121_INT_MASK1_DDC_BUSHANG, >>> + ~(IT66121_INT_MASK1_DDC_NOACK | >>> + IT66121_INT_MASK1_HPD | >>> + IT66121_INT_MASK1_DDC_FIFOERR | >>> + IT66121_INT_MASK1_DDC_BUSHANG) & 0xFF); >>> + if (ret) >>> + return ret; >>> + >>> + if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) >>> + return 0; >>> + >>> + ret = drm_connector_init(bridge->dev, &ctx->connector, >>> + &it66121_connector_funcs, >>> + DRM_MODE_CONNECTOR_HDMIA); >>> + if (ret) >>> + return ret; >>> + >>> + ctx->connector.polled = DRM_CONNECTOR_POLL_HPD; >>> + drm_connector_helper_add(&ctx->connector, >>> + &it66121_connector_helper_funcs); >>> + >>> + ret = drm_connector_attach_encoder(&ctx->connector, >>> bridge->encoder); >>> + if (ret) >>> + return ret; >>> + >>> + return drm_connector_register(&ctx->connector); >>> +} >>> + >>> +static int it66121_set_mute(struct it66121_ctx *ctx, bool mute) >>> +{ >>> + int ret; >>> + unsigned int val = 0; >>> + >>> + if (mute) >>> + val = IT66121_AV_MUTE_ON; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AV_MUTE_REG, >>> IT66121_AV_MUTE_ON, val); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_PKT_GEN_CTRL_REG, >>> + IT66121_PKT_GEN_CTRL_ON | >>> IT66121_PKT_GEN_CTRL_RPT); >>> +} >>> + >>> +#define MAX_OUTPUT_SEL_FORMATS 1 >>> + >>> +static u32 *it66121_bridge_atomic_get_output_bus_fmts(struct >>> drm_bridge *bridge, >>> + struct drm_bridge_state >>> *bridge_state, >>> + struct drm_crtc_state *crtc_state, >>> + struct drm_connector_state >>> *conn_state, >>> + unsigned int *num_output_fmts) >>> +{ >>> + u32 *output_fmts; >>> + >>> + output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, >>> sizeof(*output_fmts), >>> + GFP_KERNEL); >>> + if (!output_fmts) >>> + return NULL; >>> + >>> + /* TOFIX handle more than MEDIA_BUS_FMT_RGB888_1X24 as output >>> format */ >>> + output_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; >>> + *num_output_fmts = 1; >>> + >>> + return output_fmts; >>> +} >>> + >>> +#define MAX_INPUT_SEL_FORMATS 1 >>> + >>> +static u32 *it66121_bridge_atomic_get_input_bus_fmts(struct >>> drm_bridge *bridge, >>> + struct drm_bridge_state >>> *bridge_state, >>> + struct drm_crtc_state *crtc_state, >>> + struct drm_connector_state >>> *conn_state, >>> + u32 output_fmt, >>> + unsigned int *num_input_fmts) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + u32 *input_fmts; >>> + >>> + *num_input_fmts = 0; >>> + >>> + input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, >>> sizeof(*input_fmts), >>> + GFP_KERNEL); >>> + if (!input_fmts) >>> + return NULL; >>> + >>> + if (ctx->bus_width == 12) >>> + /* IT66121FN Datasheet specifies Little-Endian ordering */ >>> + input_fmts[0] = MEDIA_BUS_FMT_RGB888_2X12_LE; >>> + else >>> + /* TOFIX support more input bus formats in 24bit width */ >>> + input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; >>> + *num_input_fmts = 1; >>> + >>> + return input_fmts; >>> +} >>> + >>> +static void it66121_bridge_enable(struct drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + it66121_set_mute(ctx, false); >>> +} >>> + >>> +static void it66121_bridge_disable(struct drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + it66121_set_mute(ctx, true); >>> +} >>> + >>> +static >>> +void it66121_bridge_mode_set(struct drm_bridge *bridge, >>> + const struct drm_display_mode *mode, >>> + const struct drm_display_mode *adjusted_mode) >>> +{ >>> + int ret, i; >>> + u8 buf[HDMI_INFOFRAME_SIZE(AVI)]; >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + const u16 aviinfo_reg[HDMI_AVI_INFOFRAME_SIZE] = { >>> + IT66121_AVIINFO_DB1_REG, >>> + IT66121_AVIINFO_DB2_REG, >>> + IT66121_AVIINFO_DB3_REG, >>> + IT66121_AVIINFO_DB4_REG, >>> + IT66121_AVIINFO_DB5_REG, >>> + IT66121_AVIINFO_DB6_REG, >>> + IT66121_AVIINFO_DB7_REG, >>> + IT66121_AVIINFO_DB8_REG, >>> + IT66121_AVIINFO_DB9_REG, >>> + IT66121_AVIINFO_DB10_REG, >>> + IT66121_AVIINFO_DB11_REG, >>> + IT66121_AVIINFO_DB12_REG, >>> + IT66121_AVIINFO_DB13_REG >>> + }; >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + hdmi_avi_infoframe_init(&ctx->hdmi_avi_infoframe); >>> + >>> + ret = >>> drm_hdmi_avi_infoframe_from_display_mode(&ctx->hdmi_avi_infoframe, >>> &ctx->connector, >>> + adjusted_mode); >>> + if (ret) { >>> + DRM_ERROR("Failed to setup AVI infoframe: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + ret = hdmi_avi_infoframe_pack(&ctx->hdmi_avi_infoframe, buf, >>> sizeof(buf)); >>> + if (ret < 0) { >>> + DRM_ERROR("Failed to pack infoframe: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + /* Write new AVI infoframe packet */ >>> + for (i = 0; i < HDMI_AVI_INFOFRAME_SIZE; i++) { >>> + if (regmap_write(ctx->regmap, aviinfo_reg[i], buf[i + >>> HDMI_INFOFRAME_HEADER_SIZE])) >>> + goto unlock; >>> + } >>> + if (regmap_write(ctx->regmap, IT66121_AVIINFO_CSUM_REG, >>> buf[3])) >>> + goto unlock; >>> + >>> + /* Enable AVI infoframe */ >>> + if (regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, >>> + IT66121_AVI_INFO_PKT_ON | IT66121_AVI_INFO_PKT_RPT)) >>> + goto unlock; >>> + >>> + /* Set TX mode to HDMI */ >>> + if (regmap_write(ctx->regmap, IT66121_HDMI_MODE_REG, >>> IT66121_HDMI_MODE_HDMI)) >>> + goto unlock; >>> + >>> + if (regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> + IT66121_CLK_BANK_PWROFF_TXCLK, >>> IT66121_CLK_BANK_PWROFF_TXCLK)) >>> + goto unlock; >>> + >>> + if (it66121_configure_input(ctx)) >>> + goto unlock; >>> + >>> + if (it66121_configure_afe(ctx, adjusted_mode)) >>> + goto unlock; >>> + >>> + regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> IT66121_CLK_BANK_PWROFF_TXCLK, 0); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> +} >>> + >>> +static enum drm_mode_status it66121_bridge_mode_valid(struct >>> drm_bridge *bridge, >>> + const struct drm_display_info *info, >>> + const struct drm_display_mode *mode) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + return it66121_mode_valid(ctx, mode); >>> +} >>> + >>> +static enum drm_connector_status it66121_bridge_detect(struct >>> drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + return it66121_is_hpd_detect(ctx) ? connector_status_connected >>> + : connector_status_disconnected; >>> +} >>> + >>> +static struct edid *it66121_bridge_get_edid(struct drm_bridge >>> *bridge, >>> + struct drm_connector *connector) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + struct edid *edid; >>> + >>> + mutex_lock(&ctx->lock); >>> + edid = drm_do_get_edid(connector, it66121_get_edid_block, >>> ctx); >>> + mutex_unlock(&ctx->lock); >>> + >>> + return edid; >>> +} >>> + >>> +static const struct drm_bridge_funcs it66121_bridge_funcs = { >>> + .attach = it66121_bridge_attach, >>> + .enable = it66121_bridge_enable, >>> + .disable = it66121_bridge_disable, >>> + .mode_set = it66121_bridge_mode_set, >>> + .mode_valid = it66121_bridge_mode_valid, >>> + .detect = it66121_bridge_detect, >>> + .get_edid = it66121_bridge_get_edid, >>> + .atomic_get_output_bus_fmts = >>> it66121_bridge_atomic_get_output_bus_fmts, >>> + .atomic_get_input_bus_fmts = >>> it66121_bridge_atomic_get_input_bus_fmts, >>> +}; >>> + >>> +static irqreturn_t it66121_irq_threaded_handler(int irq, void >>> *dev_id) >>> +{ >>> + int ret; >>> + unsigned int val; >>> + struct it66121_ctx *ctx = dev_id; >>> + struct device *dev = ctx->dev; >>> + bool event = false; >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val); >>> + if (ret) >>> + goto unlock; >>> + >>> + if (!(val & IT66121_SYS_STATUS_ACTIVE_IRQ)) >>> + goto unlock; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, &val); >>> + if (ret) { >>> + dev_err(dev, "Cannot read STATUS1_REG %d\n", ret); >>> + } else { >>> + if (val & IT66121_INT_STATUS1_DDC_FIFOERR) >>> + it66121_clear_ddc_fifo(ctx); >>> + if (val & (IT66121_INT_STATUS1_DDC_BUSHANG | >>> + IT66121_INT_STATUS1_DDC_NOACK)) >>> + it66121_abort_ddc_ops(ctx); >>> + if (val & IT66121_INT_STATUS1_HPD_STATUS) { >>> + regmap_write_bits(ctx->regmap, IT66121_INT_CLR1_REG, >>> + IT66121_INT_CLR1_HPD, IT66121_INT_CLR1_HPD); >>> + >>> + if (!it66121_is_hpd_detect(ctx)) { >>> + kfree(ctx->edid); >>> + ctx->edid = NULL; >>> + } >>> + >>> + event = true; >>> + } >>> + } >>> + >>> + regmap_write_bits(ctx->regmap, IT66121_SYS_STATUS_REG, >>> + IT66121_SYS_STATUS_CLEAR_IRQ, >>> + IT66121_SYS_STATUS_CLEAR_IRQ); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> + >>> + if (event) >>> + drm_helper_hpd_irq_event(ctx->bridge.dev); >>> + >>> + return IRQ_HANDLED; >>> +} >>> + >>> +static int it66121_probe(struct i2c_client *client, >>> + const struct i2c_device_id *id) >>> +{ >>> + u32 vendor_ids[2], device_ids[2], revision_id; >>> + struct device_node *ep; >>> + int ret; >>> + struct it66121_ctx *ctx; >>> + struct device *dev = &client->dev; >>> + >>> + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { >>> + dev_err(dev, "I2C check functionality failed.\n"); >>> + return -ENXIO; >>> + } >>> + >>> + ep = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0); >>> + if (!ep) >>> + return -EINVAL; >>> + >>> + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); >>> + if (!ctx) >>> + return -ENOMEM; >>> + >>> + ctx->dev = dev; >>> + ctx->client = client; >>> + >>> + of_property_read_u32(ep, "bus-width", &ctx->bus_width); >>> + of_node_put(ep); >>> + >>> + if (ctx->bus_width != 12 && ctx->bus_width != 24) >>> + return -EINVAL; >>> + >>> + i2c_set_clientdata(client, ctx); >>> + mutex_init(&ctx->lock); >>> + >>> + ctx->supplies[0].supply = "vcn33"; >>> + ctx->supplies[1].supply = "vcn18"; >>> + ctx->supplies[2].supply = "vrf12"; >>> + ret = devm_regulator_bulk_get(ctx->dev, 3, ctx->supplies); >>> + if (ret) { >>> + dev_err(ctx->dev, "regulator_bulk failed\n"); >>> + return ret; >>> + } >>> + >>> + ret = ite66121_power_on(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + it66121_hw_reset(ctx); >>> + >>> + ctx->regmap = devm_regmap_init_i2c(client, >>> &it66121_regmap_config); >>> + if (IS_ERR(ctx->regmap)) { >>> + ite66121_power_off(ctx); >>> + return PTR_ERR(ctx); >>> + } >>> + >>> + regmap_read(ctx->regmap, IT66121_VENDOR_ID0_REG, >>> &vendor_ids[0]); >>> + regmap_read(ctx->regmap, IT66121_VENDOR_ID1_REG, >>> &vendor_ids[1]); >>> + regmap_read(ctx->regmap, IT66121_DEVICE_ID0_REG, >>> &device_ids[0]); >>> + regmap_read(ctx->regmap, IT66121_DEVICE_ID1_REG, >>> &device_ids[1]); >>> + >>> + /* Revision is shared with DEVICE_ID1 */ >>> + revision_id = FIELD_GET(IT66121_REVISION_MASK, device_ids[1]); >>> + device_ids[1] &= IT66121_DEVICE_ID1_MASK; >>> + >>> + if (vendor_ids[0] != IT66121_VENDOR_ID0 || vendor_ids[1] != >>> IT66121_VENDOR_ID1 || >>> + device_ids[0] != IT66121_DEVICE_ID0 || device_ids[1] != >>> IT66121_DEVICE_ID1) { >>> + ite66121_power_off(ctx); >>> + return -ENODEV; >>> + } >>> + >>> + ctx->bridge.funcs = &it66121_bridge_funcs; >>> + ctx->bridge.of_node = dev->of_node; >>> + >>> + ret = devm_request_threaded_irq(dev, client->irq, NULL, >>> it66121_irq_threaded_handler, >>> + IRQF_SHARED | IRQF_ONESHOT, dev_name(dev), >>> ctx); >>> + if (ret < 0) { >>> + dev_err(dev, "Failed to request irq %d:%d\n", >>> client->irq, ret); >>> + ite66121_power_off(ctx); >>> + return ret; >>> + } >>> + >>> + drm_bridge_add(&ctx->bridge); >>> + >>> + dev_info(ctx->dev, "IT66121 revision %d probed\n", >>> revision_id); >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_remove(struct i2c_client *client) >>> +{ >>> + struct it66121_ctx *ctx = i2c_get_clientdata(client); >>> + >>> + ite66121_power_off(ctx); >>> + drm_bridge_remove(&ctx->bridge); >>> + kfree(ctx->edid); >>> + mutex_destroy(&ctx->lock); >>> + >>> + return 0; >>> +} >>> + >>> +static const struct of_device_id it66121_dt_match[] = { >>> + { .compatible = "ite,it66121" }, >>> + { } >>> +}; >>> +MODULE_DEVICE_TABLE(of, it66121_dt_match); >>> + >>> +static const struct i2c_device_id it66121_id[] = { >>> + { "it66121", 0 }, >>> + { } >>> +}; >>> +MODULE_DEVICE_TABLE(i2c, it66121_id); >>> + >>> +static struct i2c_driver it66121_driver = { >>> + .driver = { >>> + .name = "it66121", >>> + .of_match_table = it66121_dt_match, >>> + }, >>> + .probe = it66121_probe, >>> + .remove = it66121_remove, >>> + .id_table = it66121_id, >>> +}; >>> + >>> +module_i2c_driver(it66121_driver); >>> + >>> +MODULE_AUTHOR("Phong LE"); >>> +MODULE_DESCRIPTION("IT66121 HDMI transmitter driver"); >>> +MODULE_LICENSE("GPL v2"); >>> -- >>> 2.25.1 >>> >> >> 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=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 E96A8C433B4 for ; Wed, 14 Apr 2021 17:36:15 +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 9418261166 for ; Wed, 14 Apr 2021 17:36:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9418261166 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=crapouillou.net 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 EDBF66E4F4; Wed, 14 Apr 2021 17:36:14 +0000 (UTC) Received: from aposti.net (aposti.net [89.234.176.197]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0F94F6E4CF for ; Wed, 14 Apr 2021 17:36:12 +0000 (UTC) Date: Wed, 14 Apr 2021 18:35:56 +0100 From: Paul Cercueil Subject: Re: [PATCH v3 2/3] drm: bridge: add it66121 driver To: Neil Armstrong Message-Id: In-Reply-To: <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> References: <20210412154648.3719153-1-narmstrong@baylibre.com> <20210412154648.3719153-3-narmstrong@baylibre.com> <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> MIME-Version: 1.0 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: jernej.skrabec@siol.net, jonas@kwiboo.se, robert.foss@linaro.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Phong LE , a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgTmVpbCwKCkxlIG1lci4gMTQgYXZyaWwgMjAyMSDDoCA4OjE3LCBOZWlsIEFybXN0cm9uZyA8 bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+IAphIMOpY3JpdCA6Cj4gSGksCj4gCj4gTGUgMTMvMDQv MjAyMSDDoCAyMjo1NiwgUGF1bCBDZXJjdWVpbCBhIMOpY3JpdCA6Cj4+ICBIaSBOZWlsLAo+PiAK Pj4gIEkgZ2V0IGJ1aWxkIGZhaWx1cmVzIGxvY2FsbHk6Cj4+IAo+PiAgZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9pdGUtaXQ2NjEyMS5jOiBJbiBmdW5jdGlvbiAKPj4g4oCYaXQ2NjEyMV9od19yZXNl dOKAmToKPj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0NjYxMjEuYzoyNDI6MjogZXJy b3I6IGltcGxpY2l0IAo+PiBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiDigJhncGlvZF9zZXRfdmFs dWXigJkgCj4+IFstV2Vycm9yPWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQo+PiAgMjQy IHwgZ3Bpb2Rfc2V0X3ZhbHVlKGN0eC0+Z3Bpb19yZXNldCwgMSk7Cj4+ICAgICAgfCBefn5+fn5+ fn5+fn5+fn4KPj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0NjYxMjEuYzogSW4gZnVu Y3Rpb24gCj4+IOKAmGl0NjYxMjFfcHJvYmXigJk6Cj4+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdl L2l0ZS1pdDY2MTIxLmM6MTAxNjoxNjogZXJyb3I6IGltcGxpY2l0IAo+PiBkZWNsYXJhdGlvbiBv ZiBmdW5jdGlvbiDigJhGSUVMRF9HRVTigJk7IGRpZCB5b3UgbWVhbiAKPj4g4oCYRk9MTF9HRVTi gJk/IFstV2Vycm9yPWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uXQo+PiAgMTAxNiB8IHJl dmlzaW9uX2lkID0gRklFTERfR0VUKElUNjYxMjFfUkVWSVNJT05fTUFTSywgCj4+IGRldmljZV9p ZHNbMV0pOwo+PiAgICAgIHwgXn5+fn5+fn5+Cj4+ICAgICAgfCBGT0xMX0dFVAo+PiAKPj4gIE5v dGhpbmcgZGlmZmljdWx0IHRvIGZpeCwgYnV0IHRoZSBpbmNsdWRlcyBzaG91bGQgYmUgYWRkZWQg Cj4+IG5vbmV0aGVsZXNzLgo+IAo+IEV4YWN0LCBJIGdvdCB0aGUgQ0kgYnVpbGQgZmFpbHVyZXMs IEknbGwgZml4IHRoZXNlIGZvciB2NC4KPiAKPiBXZXJlIHlvdSBhYmxlIHRvIHRlc3Qgb24geW91 ciBzZXR1cCA/Cj4gVGhlIHYyIGFsd2F5cyBmb3JjZWQgRERSIG1vZGUsIHdpdGggdGhpcyB2Mywg SSBhbHNvIHN3aXRjaCB0byBub3JtYWwgCj4gMjRpbnB1dCBtb2RlLCBidXQgdG90YWxseSB1bnRl c3RlZC4KCkl0IHRyaWdnZXJzIGEgd2FybmluZzoKClsgIDI3Ny44NzAyNDddIFdBUk5JTkc6IENQ VTogMCBQSUQ6IDMxMCBhdCAKZHJpdmVycy9ncHUvZHJtL2RybV9icmlkZ2UuYzo4OTIgCmRybV9h dG9taWNfYnJpZGdlX2NoYWluX2NoZWNrKzB4MzA0LzB4MzI0ClsgIDI3Ny44NzAyOTBdIE1vZHVs ZXMgbGlua2VkIGluOgpbICAyNzcuODcwMzA2XSBDUFU6IDAgUElEOiAzMTAgQ29tbTogbW9kZXRl c3QgVGFpbnRlZDogRyAgICAgICAgVyAgICAgICAKICA1LjEyLjAtcmM3LW9wZW5kaW5ndXgtMDAx MjEtZzgyOGEzMDIwYjVkMyAjMzcxClsgIDI3Ny44NzAzMjJdIFN0YWNrIDogODNmNjI1ODAgODAx NjNiNTggMDAwMDAwMDAgMDAwMDAwMDQgMDAwMDAwMDAgCmIxZjM5ZDdlIDgzNTgxYTljIDgwYWI0 MmIwClsgIDI3Ny44NzAzNjddICAgICAgICAgODA4YTAwMDAgODA4YTAwMDAgODM1YzgyZjAgODA4 YTBkYWIgODBhYjQyYjAgCjAwMDAwMDAxIDgzNTgxYTQ4IGIxZjM5ZDdlClsgIDI3Ny44NzA0MTJd ICAgICAgICAgMDAwMDAwMDAgMDAwMDAwMDAgODA3ZTkwMzAgMDAwMDAwMDAgMDAwMDAwYjggCjgz NTgxOGZjIDAwMDAwMDAwIDc4NzU2NzZlClsgIDI3Ny44NzA0NTZdICAgICAgICAgMzEzMDMwMmQg ODBhYmFhNDMgODBhYmFhOWYgNjcyZDMxMzIgODA4YTAwMDAgCjgwMDAwMDAwIDAwMDAwMDA5IDAw MDAwMzdjClsgIDI3Ny44NzA1MDBdICAgICAgICAgMDAwMDAwMDAgMDAwMDAwMDAgODJhMmQwZjgg ODMwNDNiODAgMDAwMDAwMDAgCmZmZmZmZmZjIDAwMDAyMDk4IDgwYWIwMDAwClsgIDI3Ny44NzA1 NDRdICAgICAgICAgLi4uClsgIDI3Ny44NzA1NTZdIENhbGwgVHJhY2U6ClsgIDI3Ny44NzA1NjBd IFs8ODAxMDkwMTA+XSBzaG93X3N0YWNrKzB4NDAvMHgxMjgKWyAgMjc3Ljg3MDU4OF0gWzw4MDEy MzM1MD5dIF9fd2FybisweGUwLzB4MTU0ClsgIDI3Ny44NzA2MDhdIFs8ODAxMjM0Mjg+XSB3YXJu X3Nsb3dwYXRoX2ZtdCsweDY0LzB4YjgKWyAgMjc3Ljg3MDYyNV0gWzw4MDUwNGU3MD5dIGRybV9h dG9taWNfYnJpZGdlX2NoYWluX2NoZWNrKzB4MzA0LzB4MzI0ClsgIDI3Ny44NzA2NDJdIFs8ODA0 ZTMyNDQ+XSBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0KzB4OWY0LzB4YzU4ClsgIDI3 Ny44NzA2NjddIFs8ODA0ZTQzMzg+XSBkcm1fYXRvbWljX2hlbHBlcl9jaGVjaysweDIwLzB4YTgK WyAgMjc3Ljg3MDY4NV0gWzw4MDUwMzY0ND5dIGRybV9hdG9taWNfY2hlY2tfb25seSsweDUzOC8w eDk4YwpbICAyNzcuODcwNzAwXSBbPDgwNTAzYWI0Pl0gZHJtX2F0b21pY19jb21taXQrMHgxYy8w eDcwClsgIDI3Ny44NzA3MTZdIFs8ODA1MWMzZTQ+XSBkcm1fbW9kZV9hdG9taWNfaW9jdGwrMHg5 MjAvMHhiNDQKWyAgMjc3Ljg3MDczNl0gWzw4MDRmMDMzYz5dIGRybV9pb2N0bCsweDIwYy8weDNk OApbICAyNzcuODcwNzU0XSBbPDgwMjgzNjU4Pl0gc3lzX2lvY3RsKzB4MzU4LzB4ODYwClsgIDI3 Ny44NzA3NzJdIFs8ODAxMTA3ZWM+XSBzeXNjYWxsX2NvbW1vbisweDM0LzB4NTgKClsgIDI3Ny44 NzA3OTVdIC0tLVsgZW5kIHRyYWNlIGU5NzNmM2IyMWM2M2FhMWQgXS0tLQoKVGhhdCBjYXVzZXMg bXkgYXRvbWljIGNvbW1pdCB0byBmYWlsLCBzbyBJIGNhbid0IHRlc3QgaXQgZnVydGhlci4KCkNo ZWVycywKLVBhdWwKCj4gVGhhbmtzLAo+IE5laWwKPiAKPj4gCj4+ICBDaGVlcnMsCj4+ICAtUGF1 bAo+PiAKPj4gCj4+ICBMZSBsdW4uIDEyIGF2cmlsIDIwMjEgw6AgMTc6NDYsIE5laWwgQXJtc3Ry b25nIAo+PiA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+IGEgw6ljcml0IDoKPj4+ICBGcm9tOiBQ aG9uZyBMRSA8cGxlQGJheWxpYnJlLmNvbT4KPj4+IAo+Pj4gIFRoaXMgY29tbWl0IGlzIGEgc2lt cGxlIGRyaXZlciBmb3IgYnJpZGdlIEhNREkgaXQ2NjEyMS4KPj4+ICBUaGUgaW5wdXQgZm9ybWF0 IGlzIFJCRyBhbmQgdGhlcmUgaXMgbm8gY29sb3IgY29udmVyc2lvbi4KPj4+ICBBdWRpbywgSERD UCBhbmQgQ0VDIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KPj4+IAo+Pj4gIFNpZ25lZC1vZmYtYnk6 IFBob25nIExFIDxwbGVAYmF5bGlicmUuY29tPgo+Pj4gIFNpZ25lZC1vZmYtYnk6IE5laWwgQXJt c3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KPj4+ICAtLS0KPj4+ICAgZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9LY29uZmlnICAgICAgIHwgICAgOCArCj4+PiAgIGRyaXZlcnMvZ3B1L2Ry bS9icmlkZ2UvTWFrZWZpbGUgICAgICB8ICAgIDEgKwo+Pj4gICBkcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL2l0ZS1pdDY2MTIxLmMgfCAxMDgxIAo+Pj4gKysrKysrKysrKysrKysrKysrKysrKysrKysK Pj4+ICAgMyBmaWxlcyBjaGFuZ2VkLCAxMDkwIGluc2VydGlvbnMoKykKPj4+ICAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0NjYxMjEuYwo+Pj4gCj4+PiAg ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvS2NvbmZpZyAKPj4+IGIvZHJpdmVy cy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4+PiAgaW5kZXggZTQxMTBkNmNhN2IzLi42OTE1YzM4 ZmE0NTkgMTAwNjQ0Cj4+PiAgLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4+ PiAgKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnCj4+PiAgQEAgLTc0LDYgKzc0 LDE0IEBAIGNvbmZpZyBEUk1fTE9OVElVTV9MVDk2MTFVWEMKPj4+ICAgICAgICAgSERNSSBzaWdu YWxzCj4+PiAgICAgICAgIFBsZWFzZSBzYXkgWSBpZiB5b3UgaGF2ZSBzdWNoIGhhcmR3YXJlLgo+ Pj4gCj4+PiAgK2NvbmZpZyBEUk1fSVRFX0lUNjYxMjEKPj4+ICArICAgIHRyaXN0YXRlICJJVEUg SVQ2NjEyMSBIRE1JIGJyaWRnZSIKPj4+ICArICAgIGRlcGVuZHMgb24gT0YKPj4+ICArICAgIHNl bGVjdCBEUk1fS01TX0hFTFBFUgo+Pj4gICsgICAgc2VsZWN0IFJFR01BUF9JMkMKPj4+ICArICAg IGhlbHAKPj4+ICArICAgICAgU3VwcG9ydCBmb3IgSVRFIElUNjYxMjEgSERNSSBicmlkZ2UuCj4+ PiAgKwo+Pj4gICBjb25maWcgRFJNX0xWRFNfQ09ERUMKPj4+ICAgICAgIHRyaXN0YXRlICJUcmFu c3BhcmVudCBMVkRTIGVuY29kZXJzIGFuZCBkZWNvZGVycyBzdXBwb3J0Igo+Pj4gICAgICAgZGVw ZW5kcyBvbiBPRgo+Pj4gIGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2Vm aWxlIAo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlCj4+PiAgaW5kZXggODZl N2FjYzc2ZjhkLi40ZjcyNTc1MzExN2MgMTAwNjQ0Cj4+PiAgLS0tIGEvZHJpdmVycy9ncHUvZHJt L2JyaWRnZS9NYWtlZmlsZQo+Pj4gICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZp bGUKPj4+ICBAQCAtMjQsNiArMjQsNyBAQCBvYmotJChDT05GSUdfRFJNX1RJX1NONjVEU0k4Nikg Kz0gdGktc242NWRzaTg2Lm8KPj4+ICAgb2JqLSQoQ09ORklHX0RSTV9USV9URlA0MTApICs9IHRp LXRmcDQxMC5vCj4+PiAgIG9iai0kKENPTkZJR19EUk1fVElfVFBEMTJTMDE1KSArPSB0aS10cGQx MnMwMTUubwo+Pj4gICBvYmotJChDT05GSUdfRFJNX05XTF9NSVBJX0RTSSkgKz0gbndsLWRzaS5v Cj4+PiAgK29iai0kKENPTkZJR19EUk1fSVRFX0lUNjYxMjEpICs9IGl0ZS1pdDY2MTIxLm8KPj4+ IAo+Pj4gICBvYmoteSArPSBhbmFsb2dpeC8KPj4+ICAgb2JqLXkgKz0gY2FkZW5jZS8KPj4+ICBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pdGUtaXQ2NjEyMS5jIAo+Pj4gYi9k cml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY2MTIxLmMKPj4+ICBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+Pj4gIGluZGV4IDAwMDAwMDAwMDAwMC4uNzNhZjQ5YjI5ZGZhCj4+PiAgLS0tIC9kZXYv bnVsbAo+Pj4gICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRlLWl0NjYxMjEuYwo+Pj4g IEBAIC0wLDAgKzEsMTA4MSBAQAo+Pj4gICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMC1vbmx5Cj4+PiAgKy8qCj4+PiAgKyAqIENvcHlyaWdodCAoQykgMjAyMCBCYXlMaWJyZSwg U0FTCj4+PiAgKyAqIEF1dGhvcjogUGhvbmcgTEUgPHBsZUBiYXlsaWJyZS5jb20+Cj4+PiAgKyAq IENvcHlyaWdodCAoQykgMjAxOC0yMDE5LCBBcnRlbSBNeWdhaWV2Cj4+PiAgKyAqIENvcHlyaWdo dCAoQykgMjAxNywgRnJlc2NvIExvZ2ljLCBJbmNvcnBvcmF0ZWQuCj4+PiAgKyAqCj4+PiAgKyAq Lwo+Pj4gICsKPj4+ICArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+Pj4gICsjaW5jbHVkZSA8 bGludXgvaTJjLmg+Cj4+PiAgKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPj4+ICArI2lu Y2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4gICsjaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4K Pj4+ICArI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+Cj4+PiAgKyNpbmNsdWRlIDxsaW51eC9w aW5jdHJsL2NvbnN1bWVyLmg+Cj4+PiAgKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KPj4+ICAr I2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgo+Pj4gICsKPj4+ICArI2luY2x1 ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgo+Pj4gICsjaW5jbHVkZSA8ZHJtL2RybV9icmlk Z2UuaD4KPj4+ICArI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KPj4+ICArI2luY2x1 ZGUgPGRybS9kcm1fZWRpZC5oPgo+Pj4gICsjaW5jbHVkZSA8ZHJtL2RybV9tb2Rlcy5oPgo+Pj4g ICsjaW5jbHVkZSA8ZHJtL2RybV9wcmludC5oPgo+Pj4gICsjaW5jbHVkZSA8ZHJtL2RybV9wcm9i ZV9oZWxwZXIuaD4KPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9WRU5ET1JfSUQwX1JFRyAg ICAgICAgICAgIDB4MDAKPj4+ICArI2RlZmluZSBJVDY2MTIxX1ZFTkRPUl9JRDFfUkVHICAgICAg ICAgICAgMHgwMQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfREVWSUNFX0lEMF9SRUcgICAgICAgICAg ICAweDAyCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9ERVZJQ0VfSUQxX1JFRyAgICAgICAgICAgIDB4 MDMKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9WRU5ET1JfSUQwICAgICAgICAgICAgMHg1 NAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfVkVORE9SX0lEMSAgICAgICAgICAgIDB4NDkKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0RFVklDRV9JRDAgICAgICAgICAgICAweDEyCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9ERVZJQ0VfSUQxICAgICAgICAgICAgMHgwNgo+Pj4gICsjZGVmaW5lIElUNjYxMjFf UkVWSVNJT05fTUFTSyAgICAgICAgICAgIEdFTk1BU0soNywgNCkKPj4+ICArI2RlZmluZSBJVDY2 MTIxX0RFVklDRV9JRDFfTUFTSyAgICAgICAgICAgIEdFTk1BU0soMywgMCkKPj4+ICArCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9NQVNURVJfU0VMX1JFRyAgICAgICAgICAgIDB4MTAKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX01BU1RFUl9TRUxfSE9TVCAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsKPj4+ ICArI2RlZmluZSBJVDY2MTIxX0FGRV9EUlZfUkVHICAgICAgICAgICAgMHg2MQo+Pj4gICsjZGVm aW5lIElUNjYxMjFfQUZFX0RSVl9SU1QgICAgICAgICAgICBCSVQoNCkKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0FGRV9EUlZfUFdEICAgICAgICAgICAgQklUKDUpCj4+PiAgKwo+Pj4gICsjZGVmaW5l IElUNjYxMjFfSU5QVVRfTU9ERV9SRUcgICAgICAgICAgICAweDcwCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9JTlBVVF9NT0RFX1JHQiAgICAgICAgICAgICgwIDw8IDYpCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9JTlBVVF9NT0RFX1lVVjQyMiAgICAgICAgQklUKDYpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9JTlBVVF9NT0RFX1lVVjQ0NCAgICAgICAgKDIgPDwgNikKPj4+ICArI2RlZmluZSBJVDY2MTIx X0lOUFVUX01PREVfQ0NJUjY1NiAgICAgICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9J TlBVVF9NT0RFX1NZTkNFTUIgICAgICAgIEJJVCgzKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5Q VVRfTU9ERV9ERFIgICAgICAgICAgICBCSVQoMikKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9JTlBVVF9DU0NfUkVHICAgICAgICAgICAgMHg3Mgo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5Q VVRfQ1NDX0VORElUSEVSICAgICAgICBCSVQoNykKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVU X0NTQ19FTlVERklMVEVSICAgICAgICBCSVQoNikKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVU X0NTQ19ETkZSRUVfR08gICAgICAgIEJJVCg1KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5QVVRf Q1NDX1JHQl9UT19ZVVYgICAgICAgIDB4MDIKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVUX0NT Q19ZVVZfVE9fUkdCICAgICAgICAweDAzCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlBVVF9DU0Nf Tk9fQ09OViAgICAgICAgMHgwMAo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9YUF9S RUcgICAgICAgICAgICAweDYyCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfR0FJTkJJVCAg ICAgICAgICAgIEJJVCg3KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX1BXRFBMTCAgICAg ICAgICAgIEJJVCg2KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX0VOSSAgICAgICAgICAg IEJJVCg1KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX0VOTyAgICAgICAgICAgIEJJVCg0 KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX1JFU0VUQiAgICAgICAgICAgIEJJVCgzKQo+ Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX1BXREkgICAgICAgICAgICBCSVQoMikKPj4+ICAr Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfSVBfUkVHICAgICAgICAgICAgMHg2NAo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfQUZFX0lQX0dBSU5CSVQgICAgICAgICAgICBCSVQoNykKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0FGRV9JUF9QV0RQTEwgICAgICAgICAgICBCSVQoNikKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX0FGRV9JUF9DS1NFTF8wNSAgICAgICAgICAgICgwIDw8IDQpCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9BRkVfSVBfQ0tTRUxfMSAgICAgICAgICAgIEJJVCg0KQo+Pj4gICsjZGVmaW5l IElUNjYxMjFfQUZFX0lQX0NLU0VMXzIgICAgICAgICAgICAoMiA8PCA0KQo+Pj4gICsjZGVmaW5l IElUNjYxMjFfQUZFX0lQX0NLU0VMXzJPUjQgICAgICAgICgzIDw8IDQpCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9BRkVfSVBfRVIwICAgICAgICAgICAgQklUKDMpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9BRkVfSVBfUkVTRVRCICAgICAgICAgICAgQklUKDIpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9B RkVfSVBfRU5DICAgICAgICAgICAgQklUKDEpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfSVBf RUMxICAgICAgICAgICAgQklUKDApCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQ X0VDMV9SRUcgICAgICAgICAgICAweDY4Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfRUMx X0xPV0NMSyAgICAgICAgQklUKDQpCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfU1dfUlNU X1JFRyAgICAgICAgICAgIDB4MDQKPj4+ICArI2RlZmluZSBJVDY2MTIxX1NXX1JTVF9SRUYgICAg ICAgICAgICBCSVQoNSkKPj4+ICArI2RlZmluZSBJVDY2MTIxX1NXX1JTVF9BUkVGICAgICAgICAg ICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9TV19SU1RfVklEICAgICAgICAgICAgQklU KDMpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9TV19SU1RfQVVEICAgICAgICAgICAgQklUKDIpCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9TV19SU1RfSERDUCAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsK Pj4+ICArI2RlZmluZSBJVDY2MTIxX0REQ19DT01NQU5EX1JFRyAgICAgICAgICAgIDB4MTUKPj4+ ICArI2RlZmluZSBJVDY2MTIxX0REQ19DT01NQU5EX0JVUlNUX1JFQUQgICAgICAgIDB4MAo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfRERDX0NPTU1BTkRfRURJRF9SRUFEICAgICAgICAweDMKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0REQ19DT01NQU5EX0ZJRk9fQ0xSICAgICAgICAweDkKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0REQ19DT01NQU5EX1NDTF9QVUxTRSAgICAgICAgMHhBCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9ERENfQ09NTUFORF9BQk9SVCAgICAgICAgMHhGCj4+PiAgKwo+Pj4gICsjZGVm aW5lIElUNjYxMjFfSERDUF9SRUcgICAgICAgICAgICAweDIwCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9IRENQX0NQREVTSVJFRCAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFf SERDUF9FTjFQMUZFQVQgICAgICAgICAgICBCSVQoMSkKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9JTlRfU1RBVFVTMV9SRUcgICAgICAgICAgICAweDA2Cj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9JTlRfU1RBVFVTMV9BVURfT1ZGICAgICAgICBCSVQoNykKPj4+ICArI2RlZmluZSBJVDY2MTIx X0lOVF9TVEFUVVMxX0REQ19OT0FDSyAgICAgICAgQklUKDUpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9JTlRfU1RBVFVTMV9ERENfRklGT0VSUiAgICAgICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9JTlRfU1RBVFVTMV9ERENfQlVTSEFORyAgICAgICAgQklUKDIpCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9JTlRfU1RBVFVTMV9SWF9TRU5TX1NUQVRVUyAgICBCSVQoMSkKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX0lOVF9TVEFUVVMxX0hQRF9TVEFUVVMgICAgICAgIEJJVCgwKQo+Pj4gICsKPj4+ ICArI2RlZmluZSBJVDY2MTIxX0REQ19IRUFERVJfUkVHICAgICAgICAgICAgMHgxMQo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfRERDX0hFQURFUl9IRENQICAgICAgICAgICAgMHg3NAo+Pj4gICsjZGVm aW5lIElUNjYxMjFfRERDX0hFQURFUl9FRElEICAgICAgICAgICAgMHhBMAo+Pj4gICsKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0REQ19PRkZTRVRfUkVHICAgICAgICAgICAgMHgxMgo+Pj4gICsjZGVm aW5lIElUNjYxMjFfRERDX0JZVEVfUkVHICAgICAgICAgICAgMHgxMwo+Pj4gICsjZGVmaW5lIElU NjYxMjFfRERDX1NFR01FTlRfUkVHICAgICAgICAgICAgMHgxNAo+Pj4gICsjZGVmaW5lIElUNjYx MjFfRERDX1JEX0ZJRk9fUkVHICAgICAgICAgICAgMHgxNwo+Pj4gICsKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0NMS19CQU5LX1JFRyAgICAgICAgICAgIDB4MEYKPj4+ICArI2RlZmluZSBJVDY2MTIx X0NMS19CQU5LX1BXUk9GRl9SQ0xLICAgICAgICBCSVQoNikKPj4+ICArI2RlZmluZSBJVDY2MTIx X0NMS19CQU5LX1BXUk9GRl9BQ0xLICAgICAgICBCSVQoNSkKPj4+ICArI2RlZmluZSBJVDY2MTIx X0NMS19CQU5LX1BXUk9GRl9UWENMSyAgICAgICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9DTEtfQkFOS19QV1JPRkZfQ1JDTEsgICAgICAgIEJJVCgzKQo+Pj4gICsjZGVmaW5lIElUNjYx MjFfQ0xLX0JBTktfMCAgICAgICAgICAgIDAKPj4+ICArI2RlZmluZSBJVDY2MTIxX0NMS19CQU5L XzEgICAgICAgICAgICAxCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX1JFRyAgICAg ICAgICAgICAgICAweDA1Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfQUNUSVZFX0hJR0ggICAg ICAgICAgICBCSVQoNykKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9PUEVOX0RSQUlOICAgICAg ICAgICAgQklUKDYpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfVFhfQ0xLX09GRiAgICAgICAg ICAgIEJJVCgwKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9NQVNLMV9SRUcgICAg ICAgICAgICAweDA5Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfTUFTSzFfQVVEX09WRiAgICAg ICAgQklUKDcpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfTUFTSzFfRERDX05PQUNLICAgICAg ICBCSVQoNSkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9NQVNLMV9ERENfRklGT0VSUiAgICAg ICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfTUFTSzFfRERDX0JVU0hBTkcgICAg ICAgIEJJVCgyKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX01BU0sxX1JYX1NFTlMgICAgICAg IEJJVCgxKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX01BU0sxX0hQRCAgICAgICAgICAgIEJJ VCgwKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9DTFIxX1JFRyAgICAgICAgICAg IDB4MEMKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9DTFIxX1BLVEFDUCAgICAgICAgICAgIEJJ VCg3KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfUEtUTlVMTCAgICAgICAgQklUKDYp Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfQ0xSMV9QS1RHRU4gICAgICAgICAgICBCSVQoNSkK Pj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9DTFIxX0tTVkxJU1RDSEsgICAgICAgIEJJVCg0KQo+ Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfQVVUSERPTkUgICAgICAgIEJJVCgzKQo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfQVVUSEZBSUwgICAgICAgIEJJVCgyKQo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfUlhfU0VOUyAgICAgICAgQklUKDEpCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9JTlRfQ0xSMV9IUEQgICAgICAgICAgICBCSVQoMCkKPj4+ICArCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9BVl9NVVRFX1JFRyAgICAgICAgICAgIDB4QzEKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0FWX01VVEVfT04gICAgICAgICAgICBCSVQoMCkKPj4+ICArI2RlZmluZSBJVDY2MTIx X0FWX01VVEVfQkxVRVNDUiAgICAgICAgICAgIEJJVCgxKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJ VDY2MTIxX1BLVF9HRU5fQ1RSTF9SRUcgICAgICAgIDB4QzYKPj4+ICArI2RlZmluZSBJVDY2MTIx X1BLVF9HRU5fQ1RSTF9PTiAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFf UEtUX0dFTl9DVFJMX1JQVCAgICAgICAgQklUKDEpCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYx MjFfQVZJSU5GT19EQjFfUkVHICAgICAgICAgICAgMHgxNTgKPj4+ICArI2RlZmluZSBJVDY2MTIx X0FWSUlORk9fREIyX1JFRyAgICAgICAgICAgIDB4MTU5Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9B VklJTkZPX0RCM19SRUcgICAgICAgICAgICAweDE1QQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJ SU5GT19EQjRfUkVHICAgICAgICAgICAgMHgxNUIKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlO Rk9fREI1X1JFRyAgICAgICAgICAgIDB4MTVDCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZP X0NTVU1fUkVHICAgICAgICAweDE1RAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjZf UkVHICAgICAgICAgICAgMHgxNUUKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fREI3X1JF RyAgICAgICAgICAgIDB4MTVGCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RCOF9SRUcg ICAgICAgICAgICAweDE2MAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjlfUkVHICAg ICAgICAgICAgMHgxNjEKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fREIxMF9SRUcgICAg ICAgIDB4MTYyCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RCMTFfUkVHICAgICAgICAw eDE2Mwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjEyX1JFRyAgICAgICAgMHgxNjQK Pj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fREIxM19SRUcgICAgICAgIDB4MTY1Cj4+PiAg Kwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJX0lORk9fUEtUX1JFRyAgICAgICAgMHhDRAo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfQVZJX0lORk9fUEtUX09OICAgICAgICAgICAgQklUKDApCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9BVklfSU5GT19QS1RfUlBUICAgICAgICBCSVQoMSkKPj4+ICArCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9IRE1JX01PREVfUkVHICAgICAgICAgICAgMHhDMAo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfSERNSV9NT0RFX0hETUkgICAgICAgICAgICBCSVQoMCkKPj4+ICArCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9TWVNfU1RBVFVTX1JFRyAgICAgICAgICAgIDB4MEUKPj4+ICAr I2RlZmluZSBJVDY2MTIxX1NZU19TVEFUVVNfQUNUSVZFX0lSUSAgICAgICAgQklUKDcpCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9TWVNfU1RBVFVTX0hQREVURUNUICAgICAgICBCSVQoNikKPj4+ICAr I2RlZmluZSBJVDY2MTIxX1NZU19TVEFUVVNfU0VOREVDVEVDVCAgICAgICAgQklUKDUpCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9TWVNfU1RBVFVTX1ZJRF9TVEFCTEUgICAgICAgIEJJVCg0KQo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfU1lTX1NUQVRVU19BVURfQ1RTX0NMUiAgICAgICAgQklUKDEpCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9TWVNfU1RBVFVTX0NMRUFSX0lSUSAgICAgICAgQklUKDApCj4+ PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfRERDX1NUQVRVU19SRUcgICAgICAgICAgICAweDE2 Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9ERENfU1RBVFVTX1RYX0RPTkUgICAgICAgIEJJVCg3KQo+ Pj4gICsjZGVmaW5lIElUNjYxMjFfRERDX1NUQVRVU19BQ1RJVkUgICAgICAgIEJJVCg2KQo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfRERDX1NUQVRVU19OT0FDSyAgICAgICAgQklUKDUpCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9ERENfU1RBVFVTX1dBSVRfQlVTICAgICAgICBCSVQoNCkKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0REQ19TVEFUVVNfQVJCSV9MT1NFICAgICAgICBCSVQoMykKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0REQ19TVEFUVVNfRklGT19GVUxMICAgICAgICBCSVQoMikKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0REQ19TVEFUVVNfRklGT19FTVBUWSAgICAgICAgQklUKDEpCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9ERENfU1RBVFVTX0ZJRk9fVkFMSUQgICAgICAgIEJJVCgwKQo+Pj4gICsK Pj4+ICArI2RlZmluZSBJVDY2MTIxX0VESURfU0xFRVBfVVMgICAgICAgICAgICAyMDAwMAo+Pj4g ICsjZGVmaW5lIElUNjYxMjFfRURJRF9USU1FT1VUX1VTICAgICAgICAgICAgMjAwMDAwCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9FRElEX0ZJRk9fU0laRSAgICAgICAgICAgIDMyCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9BRkVfQ0xLX0hJR0ggICAgICAgICAgICA4MDAwMCAvKiBLaHogKi8KPj4+ICAr Cj4+PiAgK3N0cnVjdCBpdDY2MTIxX2N0eCB7Cj4+PiAgKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdt YXA7Cj4+PiAgKyAgICBzdHJ1Y3QgZHJtX2JyaWRnZSBicmlkZ2U7Cj4+PiAgKyAgICBzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Cj4+PiAgKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4+ PiAgKyAgICBzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvX3Jlc2V0Owo+Pj4gICsgICAgc3RydWN0IGky Y19jbGllbnQgKmNsaWVudDsKPj4+ICArICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1 cHBsaWVzWzNdOwo+Pj4gICsgICAgdTMyIGJ1c193aWR0aDsKPj4+ICArICAgIHN0cnVjdCBtdXRl eCBsb2NrOyAvKiBQcm90ZWN0cyBmaWVsZHMgYmVsb3cgYW5kIGRldmljZSAKPj4+IHJlZ2lzdGVy cyAqLwo+Pj4gICsgICAgc3RydWN0IGVkaWQgKmVkaWQ7Cj4+PiAgKyAgICBzdHJ1Y3QgaGRtaV9h dmlfaW5mb2ZyYW1lIGhkbWlfYXZpX2luZm9mcmFtZTsKPj4+ICArfTsKPj4+ICArCj4+PiAgK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBpdDY2MTIxX3JlZ21hcF9iYW5rc1td ID0gewo+Pj4gICsgICAgewo+Pj4gICsgICAgICAgIC5uYW1lID0gIml0NjYxMjEiLAo+Pj4gICsg ICAgICAgIC5yYW5nZV9taW4gPSAweDAwLAo+Pj4gICsgICAgICAgIC5yYW5nZV9tYXggPSAweDFG RiwKPj4+ICArICAgICAgICAuc2VsZWN0b3JfcmVnID0gSVQ2NjEyMV9DTEtfQkFOS19SRUcsCj4+ PiAgKyAgICAgICAgLnNlbGVjdG9yX21hc2sgPSAweDEsCj4+PiAgKyAgICAgICAgLnNlbGVjdG9y X3NoaWZ0ID0gMCwKPj4+ICArICAgICAgICAud2luZG93X3N0YXJ0ID0gMHgwMCwKPj4+ICArICAg ICAgICAud2luZG93X2xlbiA9IDB4MTMwLAo+Pj4gICsgICAgfSwKPj4+ICArfTsKPj4+ICArCj4+ PiAgK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBpdDY2MTIxX3JlZ21hcF9jb25m aWcgPSB7Cj4+PiAgKyAgICAudmFsX2JpdHMgPSA4LAo+Pj4gICsgICAgLnJlZ19iaXRzID0gOCwK Pj4+ICArICAgIC5tYXhfcmVnaXN0ZXIgPSAweDFGRiwKPj4+ICArICAgIC5yYW5nZXMgPSBpdDY2 MTIxX3JlZ21hcF9iYW5rcywKPj4+ICArICAgIC5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShpdDY2 MTIxX3JlZ21hcF9iYW5rcyksCj4+PiAgK307Cj4+PiAgKwo+Pj4gICtzdGF0aWMgdm9pZCBpdDY2 MTIxX2h3X3Jlc2V0KHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4KQo+Pj4gICt7Cj4+PiAgKyAgICBn cGlvZF9zZXRfdmFsdWUoY3R4LT5ncGlvX3Jlc2V0LCAxKTsKPj4+ICArICAgIG1zbGVlcCgyMCk7 Cj4+PiAgKyAgICBncGlvZF9zZXRfdmFsdWUoY3R4LT5ncGlvX3Jlc2V0LCAwKTsKPj4+ICArfQo+ Pj4gICsKPj4+ICArc3RhdGljIGludCBpdGU2NjEyMV9wb3dlcl9vbihzdHJ1Y3QgaXQ2NjEyMV9j dHggKmN0eCkKPj4+ICArewo+Pj4gICsgICAgcmV0dXJuIHJlZ3VsYXRvcl9idWxrX2VuYWJsZShB UlJBWV9TSVpFKGN0eC0+c3VwcGxpZXMpLCAKPj4+IGN0eC0+c3VwcGxpZXMpOwo+Pj4gICt9Cj4+ PiAgKwo+Pj4gICtzdGF0aWMgaW50IGl0ZTY2MTIxX3Bvd2VyX29mZihzdHJ1Y3QgaXQ2NjEyMV9j dHggKmN0eCkKPj4+ICArewo+Pj4gICsgICAgcmV0dXJuIHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUo QVJSQVlfU0laRShjdHgtPnN1cHBsaWVzKSwgCj4+PiBjdHgtPnN1cHBsaWVzKTsKPj4+ICArfQo+ Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2MTIxX3ByZWFtYmxlX2RkYyhzdHJ1Y3QgaXQ2NjEy MV9jdHggKmN0eCkKPj4+ICArewo+Pj4gICsgICAgcmV0dXJuIHJlZ21hcF93cml0ZShjdHgtPnJl Z21hcCwgSVQ2NjEyMV9NQVNURVJfU0VMX1JFRywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYx MjFfTUFTVEVSX1NFTF9IT1NUKTsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2 MTIxX2ZpcmVfYWZlKHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4KQo+Pj4gICt7Cj4+PiAgKyAgICBy ZXR1cm4gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FGRV9EUlZfUkVHLCAwKTsK Pj4+ICArfQo+Pj4gICsKPj4+ICArLyogVE9GSVg6IEhhbmRsZSBZQ2JDciBJbnB1dCAmIE91dHB1 dCAqLwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfY29uZmlndXJlX2lucHV0KHN0cnVjdCBpdDY2 MTIxX2N0eCAqY3R4KQo+Pj4gICt7Cj4+PiAgKyAgICBpbnQgcmV0Owo+Pj4gICsgICAgdTggbW9k ZSA9IElUNjYxMjFfSU5QVVRfTU9ERV9SR0I7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKGN0eC0+YnVz X3dpZHRoID09IDEyKQo+Pj4gICsgICAgICAgIG1vZGUgfD0gSVQ2NjEyMV9JTlBVVF9NT0RFX0RE UjsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYx MjFfSU5QVVRfTU9ERV9SRUcsIG1vZGUpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAg ICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHJldHVybiByZWdtYXBfd3JpdGUoY3R4LT5y ZWdtYXAsIElUNjYxMjFfSU5QVVRfQ1NDX1JFRywgCj4+PiBJVDY2MTIxX0lOUFVUX0NTQ19OT19D T05WKTsKPj4+ICArfQo+Pj4gICsKPj4+ICArLyoqCj4+PiAgKyAqIGl0NjYxMjFfY29uZmlndXJl X2FmZSgpIC0gQ29uZmlndXJlIHRoZSBhbmFsb2cgZnJvbnQgZW5kCj4+PiAgKyAqIEBjdHg6IGl0 NjYxMjFfY3R4IG9iamVjdAo+Pj4gICsgKiBAbW9kZTogbW9kZSB0byBjb25maWd1cmUKPj4+ICAr ICoKPj4+ICArICogUkVUVVJOUzoKPj4+ICArICogemVybyBpZiBzdWNjZXNzLCBhIG5lZ2F0aXZl IGVycm9yIGNvZGUgb3RoZXJ3aXNlLgo+Pj4gICsgKi8KPj4+ICArc3RhdGljIGludCBpdDY2MTIx X2NvbmZpZ3VyZV9hZmUoc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgsCj4+PiAgKyAgICAgICAgICAg ICAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4+PiAgK3sKPj4+ICAr ICAgIGludCByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVn bWFwLCBJVDY2MTIxX0FGRV9EUlZfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICBJVDY2MTIxX0FG RV9EUlZfUlNUKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsK Pj4+ICArCj4+PiAgKyAgICBpZiAobW9kZS0+Y2xvY2sgPiBJVDY2MTIxX0FGRV9DTEtfSElHSCkg ewo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2 MTIxX0FGRV9YUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfWFBf R0FJTkJJVCB8Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfWFBfRU5PLAo+ Pj4gICsgICAgICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX1hQX0dBSU5CSVQpOwo+Pj4gICsg ICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4g ICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FG RV9JUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfSVBfR0FJTkJJ VCB8Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfSVBfRVIwIHwKPj4+ICAr ICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9FQzEsCj4+PiAgKyAgICAgICAgICAg ICAgICAgICAgSVQ2NjEyMV9BRkVfSVBfR0FJTkJJVCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkK Pj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0g cmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIAo+Pj4gSVQ2NjEyMV9BRkVfWFBfRUMxX1JF RywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9YUF9FQzFfTE9XQ0xLLCAw eDgwKTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0 Owo+Pj4gICsgICAgfSBlbHNlIHsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0 cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9BRkVfWFBfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAg ICAgIElUNjYxMjFfQUZFX1hQX0dBSU5CSVQgfAo+Pj4gICsgICAgICAgICAgICAgICAgICAgIElU NjYxMjFfQUZFX1hQX0VOTywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9Y UF9FTk8pOwo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiAgKwo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVn bWFwLCBJVDY2MTIxX0FGRV9JUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEy MV9BRkVfSVBfR0FJTkJJVCB8Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVf SVBfRVIwIHwKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9FQzEsIElU NjYxMjFfQUZFX0lQX0VSMCB8Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVf SVBfRUMxKTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4g cmV0Owo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJl Z21hcCwgCj4+PiBJVDY2MTIxX0FGRV9YUF9FQzFfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAg ICAgIElUNjYxMjFfQUZFX1hQX0VDMV9MT1dDTEssCj4+PiAgKyAgICAgICAgICAgICAgICAgICAg SVQ2NjEyMV9BRkVfWFBfRUMxX0xPV0NMSyk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICAr ICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICAvKiBD bGVhciByZXNldCBmbGFncyAqLwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4 LT5yZWdtYXAsIElUNjYxMjFfU1dfUlNUX1JFRywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYx MjFfU1dfUlNUX1JFRiB8IElUNjYxMjFfU1dfUlNUX1ZJRCwKPj4+ICArICAgICAgICAgICAgICAg IH4oSVQ2NjEyMV9TV19SU1RfUkVGIHwgSVQ2NjEyMV9TV19SU1RfVklEKSAmCj4+PiAgKyAgICAg ICAgICAgICAgICAweEZGKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJu IHJldDsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gaXQ2NjEyMV9maXJlX2FmZShjdHgpOwo+Pj4g ICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW5saW5lIGludCBpdDY2MTIxX3dhaXRfZGRjX3JlYWR5 KHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4KQo+Pj4gICt7Cj4+PiAgKyAgICBpbnQgcmV0LCB2YWw7 Cj4+PiAgKyAgICB1MzIgYnVzeSA9IElUNjYxMjFfRERDX1NUQVRVU19OT0FDSyB8IAo+Pj4gSVQ2 NjEyMV9ERENfU1RBVFVTX1dBSVRfQlVTIHwKPj4+ICArICAgICAgICAgICBJVDY2MTIxX0REQ19T VEFUVVNfQVJCSV9MT1NFOwo+Pj4gICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF9yZWFkX3BvbGxf dGltZW91dChjdHgtPnJlZ21hcCwgCj4+PiBJVDY2MTIxX0REQ19TVEFUVVNfUkVHLCB2YWwsIHRy dWUsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9FRElEX1NMRUVQX1VTLCAK Pj4+IElUNjYxMjFfRURJRF9USU1FT1VUX1VTKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAg ICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICBpZiAodmFsICYgYnVzeSkKPj4+ICAr ICAgICAgICByZXR1cm4gLUVBR0FJTjsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gMDsKPj4+ICAr fQo+Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2MTIxX2NsZWFyX2RkY19maWZvKHN0cnVjdCBp dDY2MTIxX2N0eCAqY3R4KQo+Pj4gICt7Cj4+PiAgKyAgICBpbnQgcmV0Owo+Pj4gICsKPj4+ICAr ICAgIHJldCA9IGl0NjYxMjFfcHJlYW1ibGVfZGRjKGN0eCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+ Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIHJlZ21hcF93 cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9ERENfQ09NTUFORF9SRUcsCj4+PiAgKyAgICAgICAg ICAgICAgICBJVDY2MTIxX0REQ19DT01NQU5EX0ZJRk9fQ0xSKTsKPj4+ICArfQo+Pj4gICsKPj4+ ICArc3RhdGljIGludCBpdDY2MTIxX2Fib3J0X2RkY19vcHMoc3RydWN0IGl0NjYxMjFfY3R4ICpj dHgpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQ7Cj4+PiAgKyAgICB1bnNpZ25lZCBpbnQgc3dy ZXNldCwgY3BkZXNpcmU7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3JlYWQoY3R4LT5y ZWdtYXAsIElUNjYxMjFfU1dfUlNUX1JFRywgJnN3cmVzZXQpOwo+Pj4gICsgICAgaWYgKHJldCkK Pj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF9y ZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0hEQ1BfUkVHLCAmY3BkZXNpcmUpOwo+Pj4gICsgICAg aWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHJldCA9 IHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9IRENQX1JFRywKPj4+ICArICAgICAg ICAgICAgICAgY3BkZXNpcmUgJiAofklUNjYxMjFfSERDUF9DUERFU0lSRUQgJiAweEZGKSk7Cj4+ PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsg ICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX1NXX1JTVF9SRUcsCj4+ PiAgKyAgICAgICAgICAgICAgIChzd3Jlc2V0IHwgSVQ2NjEyMV9TV19SU1RfSERDUCkpOwo+Pj4g ICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAg IHJldCA9IGl0NjYxMjFfcHJlYW1ibGVfZGRjKGN0eCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4g ICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRl KGN0eC0+cmVnbWFwLCBJVDY2MTIxX0REQ19DT01NQU5EX1JFRywKPj4+ICArICAgICAgICAgICAg ICAgSVQ2NjEyMV9ERENfQ09NTUFORF9BQk9SVCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsg ICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIGl0NjYxMjFfd2FpdF9k ZGNfcmVhZHkoY3R4KTsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2MTIxX2dl dF9lZGlkX2Jsb2NrKHZvaWQgKmNvbnRleHQsIHU4ICpidWYsCj4+PiAgKyAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGludCBibG9jaywgc2l6ZV90IGxlbikKPj4+ICArewo+Pj4gICsgICAgc3Ry dWN0IGl0NjYxMjFfY3R4ICpjdHggPSBjb250ZXh0Owo+Pj4gICsgICAgdW5zaWduZWQgaW50IHZh bDsKPj4+ICArICAgIGludCByZW1haW4gPSBsZW47Cj4+PiAgKyAgICBpbnQgb2Zmc2V0ID0gMDsK Pj4+ICArICAgIGludCByZXQsIGNudDsKPj4+ICArCj4+PiAgKyAgICBvZmZzZXQgPSAoYmxvY2sg JSAyKSAqIGxlbjsKPj4+ICArICAgIGJsb2NrID0gYmxvY2sgLyAyOwo+Pj4gICsKPj4+ICArICAg IHJldCA9IHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0lOVF9TVEFUVVMxX1JFRywg JnZhbCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAg Kwo+Pj4gICsgICAgaWYgKHZhbCAmIElUNjYxMjFfSU5UX1NUQVRVUzFfRERDX0JVU0hBTkcpIHsK Pj4+ICArICAgICAgICByZXQgPSBpdDY2MTIxX2Fib3J0X2RkY19vcHMoY3R4KTsKPj4+ICArICAg ICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsgICAgfQo+ Pj4gICsKPj4+ICArICAgIHJldCA9IGl0NjYxMjFfY2xlYXJfZGRjX2ZpZm8oY3R4KTsKPj4+ICAr ICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICB3 aGlsZSAocmVtYWluID4gMCkgewo+Pj4gICsgICAgICAgIGNudCA9IChyZW1haW4gPiBJVDY2MTIx X0VESURfRklGT19TSVpFKSA/Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0VESURfRklG T19TSVpFIDogcmVtYWluOwo+Pj4gICsgICAgICAgIHJldCA9IGl0NjYxMjFfcHJlYW1ibGVfZGRj KGN0eCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJl dDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJ VDY2MTIxX0REQ19DT01NQU5EX1JFRywKPj4+ICArICAgICAgICAgICAgICAgICAgIElUNjYxMjFf RERDX0NPTU1BTkRfRklGT19DTFIpOwo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAg ICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgICAgIHJldCA9IGl0NjYxMjFfd2Fp dF9kZGNfcmVhZHkoY3R4KTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAg ICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfcmVhZChjdHgt PnJlZ21hcCwgSVQ2NjEyMV9JTlRfU1RBVFVTMV9SRUcsIAo+Pj4gJnZhbCk7Cj4+PiAgKyAgICAg ICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAg ICAgICAgaWYgKHZhbCAmIElUNjYxMjFfSU5UX1NUQVRVUzFfRERDX0JVU0hBTkcpIHsKPj4+ICAr ICAgICAgICAgICAgcmV0ID0gaXQ2NjEyMV9hYm9ydF9kZGNfb3BzKGN0eCk7Cj4+PiAgKyAgICAg ICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsg ICAgICAgIH0KPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gaXQ2NjEyMV9wcmVhbWJsZV9kZGMo Y3R4KTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0 Owo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElU NjYxMjFfRERDX0hFQURFUl9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0RE Q19IRUFERVJfRURJRCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAg cmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+ cmVnbWFwLCBJVDY2MTIxX0REQ19PRkZTRVRfUkVHLCAKPj4+IG9mZnNldCk7Cj4+PiAgKyAgICAg ICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAg ICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0REQ19CWVRFX1JF RywgCj4+PiBjbnQpOwo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZShjdHgtPnJl Z21hcCwgSVQ2NjEyMV9ERENfU0VHTUVOVF9SRUcsIAo+Pj4gYmxvY2spOwo+Pj4gICsgICAgICAg IGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAg ICAgIHJldCA9IHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9ERENfQ09NTUFORF9S RUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0REQ19DT01NQU5EX0VESURfUkVB RCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsK Pj4+ICArCj4+PiAgKyAgICAgICAgb2Zmc2V0ICs9IGNudDsKPj4+ICArICAgICAgICByZW1haW4g LT0gY250Owo+Pj4gICsKPj4+ICArICAgICAgICAvKiBQZXIgcHJvZ3JhbW1pbmcgbWFudWFsLCBz bGVlcCBoZXJlIGJlZm9yZSBlbXB0eWluZyB0aGUgCj4+PiBGSUZPICovCj4+PiAgKyAgICAgICAg bXNsZWVwKDIwKTsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gaXQ2NjEyMV93YWl0X2RkY19y ZWFkeShjdHgpOwo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVy biByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgICAgIGRvIHsKPj4+ICArICAgICAgICAgICAgcmV0ID0g cmVnbWFwX3JlYWQoY3R4LT5yZWdtYXAsIAo+Pj4gSVQ2NjEyMV9ERENfUkRfRklGT19SRUcsICZ2 YWwpOwo+Pj4gICsgICAgICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICAgICAgcmV0 dXJuIHJldDsKPj4+ICArICAgICAgICAgICAgKihidWYrKykgPSB2YWw7Cj4+PiAgKyAgICAgICAg ICAgIGNudC0tOwo+Pj4gICsgICAgICAgIH0gd2hpbGUgKGNudCA+IDApOwo+Pj4gICsgICAgfQo+ Pj4gICsKPj4+ICArICAgIHJldHVybiAwOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW50 IGl0NjYxMjFfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAKPj4+ICpj b25uZWN0b3IpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQsIG51bV9tb2RlcyA9IDA7Cj4+PiAg KyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0 cnVjdCAKPj4+IGl0NjYxMjFfY3R4LAo+Pj4gICsgICAgICAgICAgICBjb25uZWN0b3IpOwo+Pj4g ICsKPj4+ICArICAgIGlmIChjdHgtPmVkaWQpCj4+PiAgKyAgICAgICAgcmV0dXJuIGRybV9hZGRf ZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGN0eC0+ZWRpZCk7Cj4+PiAgKwo+Pj4gICsgICAgbXV0ZXhf bG9jaygmY3R4LT5sb2NrKTsKPj4+ICArCj4+PiAgKyAgICBjdHgtPmVkaWQgPSBkcm1fZG9fZ2V0 X2VkaWQoY29ubmVjdG9yLCAKPj4+IGl0NjYxMjFfZ2V0X2VkaWRfYmxvY2ssIGN0eCk7Cj4+PiAg KyAgICBpZiAoIWN0eC0+ZWRpZCkgewo+Pj4gICsgICAgICAgIERSTV9FUlJPUigiRmFpbGVkIHRv IHJlYWQgRURJRFxuIik7Cj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKyAgICB9Cj4+ PiAgKwo+Pj4gICsgICAgcmV0ID0gZHJtX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShj b25uZWN0b3IsIAo+Pj4gY3R4LT5lZGlkKTsKPj4+ICArICAgIGlmIChyZXQpIHsKPj4+ICArICAg ICAgICBEUk1fRVJST1IoIkZhaWxlZCB0byB1cGRhdGUgRURJRCBwcm9wZXJ0eTogJWRcbiIsIHJl dCk7Cj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKyAgICB9Cj4+PiAgKwo+Pj4gICsg ICAgbnVtX21vZGVzID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgY3R4LT5lZGlkKTsK Pj4+ICArCj4+PiAgK3VubG9jazoKPj4+ICArICAgIG11dGV4X3VubG9jaygmY3R4LT5sb2NrKTsK Pj4+ICArCj4+PiAgKyAgICByZXR1cm4gbnVtX21vZGVzOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtz dGF0aWMgYm9vbCBpdDY2MTIxX2lzX2hwZF9kZXRlY3Qoc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgp Cj4+PiAgK3sKPj4+ICArICAgIGludCB2YWw7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKHJlZ21hcF9y ZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX1NZU19TVEFUVVNfUkVHLCAmdmFsKSkKPj4+ICArICAg ICAgICByZXR1cm4gZmFsc2U7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIHZhbCAmIElUNjYxMjFf U1lTX1NUQVRVU19IUERFVEVDVDsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2 MTIxX2Nvbm5lY3Rvcl9kZXRlY3RfY3R4KHN0cnVjdCBkcm1fY29ubmVjdG9yIAo+Pj4gKmNvbm5l Y3RvciwKPj4+ICArICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWly ZV9jdHggKmMsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKPj4+ICArewo+ Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpjdHggPSBjb250YWluZXJfb2YoY29ubmVjdG9y LCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwKPj4+ICArICAgICAgICAgICAgY29ubmVjdG9yKTsK Pj4+ICArCj4+PiAgKyAgICByZXR1cm4gaXQ2NjEyMV9pc19ocGRfZGV0ZWN0KGN0eCkgPyBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgOiBjb25u ZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGVu dW0gZHJtX21vZGVfc3RhdHVzIGl0NjYxMjFfbW9kZV92YWxpZChzdHJ1Y3QgaXQ2NjEyMV9jdHgg Cj4+PiAqY3R4LAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qg ZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPj4+ICArewo+Pj4gICsgICAgdW5zaWduZWQgbG9uZyBt YXhfY2xvY2s7Cj4+PiAgKwo+Pj4gICsgICAgbWF4X2Nsb2NrID0gKGN0eC0+YnVzX3dpZHRoID09 IDEyKSA/IDc0MjUwIDogMTQ4NTAwOwo+Pj4gICsKPj4+ICArICAgIGlmIChtb2RlLT5jbG9jayA+ IG1heF9jbG9jaykKPj4+ICArICAgICAgICByZXR1cm4gTU9ERV9DTE9DS19ISUdIOwo+Pj4gICsK Pj4+ICArICAgIGlmIChtb2RlLT5jbG9jayA8IDI1MDAwKQo+Pj4gICsgICAgICAgIHJldHVybiBN T0RFX0NMT0NLX0xPVzsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gTU9ERV9PSzsKPj4+ICArfQo+ Pj4gICsKPj4+ICArc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIGl0NjYxMjFfY29ubmVjdG9y X21vZGVfdmFsaWQoc3RydWN0IAo+Pj4gZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+Pj4gICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl KQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9v Zihjb25uZWN0b3IsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LAo+Pj4gICsgICAgICAgICAgICBj b25uZWN0b3IpOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiBpdDY2MTIxX21vZGVfdmFsaWQoY3R4 LCBtb2RlKTsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9y X2hlbHBlcl9mdW5jcyAKPj4+IGl0NjYxMjFfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKPj4+ ICArICAgIC5nZXRfbW9kZXMgPSBpdDY2MTIxX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCj4+PiAgKyAg ICAuZGV0ZWN0X2N0eCA9IGl0NjYxMjFfY29ubmVjdG9yX2RldGVjdF9jdHgsCj4+PiAgKyAgICAu bW9kZV92YWxpZCA9IGl0NjYxMjFfY29ubmVjdG9yX21vZGVfdmFsaWQsCj4+PiAgK307Cj4+PiAg Kwo+Pj4gICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaXQ2NjEyMV9j b25uZWN0b3JfZnVuY3MgPSAKPj4+IHsKPj4+ICArICAgIC5yZXNldCA9IGRybV9hdG9taWNfaGVs cGVyX2Nvbm5lY3Rvcl9yZXNldCwKPj4+ICArICAgIC5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9w cm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAo+Pj4gICsgICAgLmRlc3Ryb3kgPSBkcm1fY29u bmVjdG9yX2NsZWFudXAsCj4+PiAgKyAgICAuYXRvbWljX2R1cGxpY2F0ZV9zdGF0ZSA9IAo+Pj4g ZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwKPj4+ICArICAgIC5h dG9taWNfZGVzdHJveV9zdGF0ZSA9IAo+Pj4gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2Rl c3Ryb3lfc3RhdGUsCj4+PiAgK307Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfYnJp ZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+Pj4gICsgICAgICAgICAgICAg ICAgIGVudW0gZHJtX2JyaWRnZV9hdHRhY2hfZmxhZ3MgZmxhZ3MpCj4+PiAgK3sKPj4+ICArICAg IGludCByZXQ7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9v ZihicmlkZ2UsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LAo+Pj4gICsgICAgICAgICAgICBicmlk Z2UpOwo+Pj4gICsKPj4+ICArICAgIGlmICghYnJpZGdlLT5lbmNvZGVyKSB7Cj4+PiAgKyAgICAg ICAgRFJNX0VSUk9SKCJQYXJlbnQgZW5jb2RlciBvYmplY3Qgbm90IGZvdW5kIik7Cj4+PiAgKyAg ICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4+PiAgKyAgICB9Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0g cmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQ0xLX0JBTktfUkVHLAo+Pj4g ICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9DTEtfQkFOS19QV1JPRkZfUkNMSywgMCk7Cj4+PiAg KyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAg cmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfSU5UX1JFRywKPj4+ ICArICAgICAgICAgICAgICAgIElUNjYxMjFfSU5UX1RYX0NMS19PRkYsIDApOwo+Pj4gICsgICAg aWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHJldCA9 IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FGRV9EUlZfUkVHLAo+Pj4g ICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfRFJWX1BXRCwgMCk7Cj4+PiAgKyAgICBpZiAo cmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVn bWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX1hQX1JFRywKPj4+ICArICAg ICAgICAgICAgICAgIElUNjYxMjFfQUZFX1hQX1BXREkgfCBJVDY2MTIxX0FGRV9YUF9QV0RQTEws IDApOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsK Pj4+ICArICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FG RV9JUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9QV0RQTEwsIDAp Owo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ ICArICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FGRV9E UlZfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfRFJWX1JTVCwgMCk7Cj4+ PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsg ICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX1hQX1JF RywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX1hQX1JFU0VUQiwgSVQ2NjEyMV9B RkVfWFBfUkVTRVRCKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJl dDsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJlZ21hcCwg SVQ2NjEyMV9BRkVfSVBfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfSVBf UkVTRVRCLCBJVDY2MTIxX0FGRV9JUF9SRVNFVEIpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICAr ICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF93cml0ZV9i aXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX1NXX1JTVF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAg ICBJVDY2MTIxX1NXX1JTVF9SRUYsCj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX1NXX1JT VF9SRUYpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4g ICsKPj4+ICArICAgIC8qIFBlciBwcm9ncmFtbWluZyBtYW51YWwsIHNsZWVwIGhlcmUgZm9yIGJy aWRnZSB0byBzZXR0bGUgKi8KPj4+ICArICAgIG1zbGVlcCg1MCk7Cj4+PiAgKwo+Pj4gICsgICAg LyogU3RhcnQgaW50ZXJydXB0cyAqLwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMo Y3R4LT5yZWdtYXAsIElUNjYxMjFfSU5UX01BU0sxX1JFRywKPj4+ICArICAgICAgICAgICAgICAg IElUNjYxMjFfSU5UX01BU0sxX0REQ19OT0FDSyB8Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2 MTIxX0lOVF9NQVNLMV9IUEQgfAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfTUFT SzFfRERDX0ZJRk9FUlIgfAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfTUFTSzFf RERDX0JVU0hBTkcsCj4+PiAgKyAgICAgICAgICAgICAgICB+KElUNjYxMjFfSU5UX01BU0sxX0RE Q19OT0FDSyB8Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0lOVF9NQVNLMV9IUEQgfAo+ Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfTUFTSzFfRERDX0ZJRk9FUlIgfAo+Pj4g ICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfTUFTSzFfRERDX0JVU0hBTkcpICYgMHhGRik7 Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4g ICsgICAgaWYgKGZsYWdzICYgRFJNX0JSSURHRV9BVFRBQ0hfTk9fQ09OTkVDVE9SKQo+Pj4gICsg ICAgICAgIHJldHVybiAwOwo+Pj4gICsKPj4+ICArICAgIHJldCA9IGRybV9jb25uZWN0b3JfaW5p dChicmlkZ2UtPmRldiwgJmN0eC0+Y29ubmVjdG9yLAo+Pj4gICsgICAgICAgICAgICAgICAgICZp dDY2MTIxX2Nvbm5lY3Rvcl9mdW5jcywKPj4+ICArICAgICAgICAgICAgICAgICBEUk1fTU9ERV9D T05ORUNUT1JfSERNSUEpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4g cmV0Owo+Pj4gICsKPj4+ICArICAgIGN0eC0+Y29ubmVjdG9yLnBvbGxlZCA9IERSTV9DT05ORUNU T1JfUE9MTF9IUEQ7Cj4+PiAgKyAgICBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoJmN0eC0+Y29u bmVjdG9yLAo+Pj4gICsgICAgICAgICAgICAgICAgICZpdDY2MTIxX2Nvbm5lY3Rvcl9oZWxwZXJf ZnVuY3MpOwo+Pj4gICsKPj4+ICArICAgIHJldCA9IGRybV9jb25uZWN0b3JfYXR0YWNoX2VuY29k ZXIoJmN0eC0+Y29ubmVjdG9yLCAKPj4+IGJyaWRnZS0+ZW5jb2Rlcik7Cj4+PiAgKyAgICBpZiAo cmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIGRy bV9jb25uZWN0b3JfcmVnaXN0ZXIoJmN0eC0+Y29ubmVjdG9yKTsKPj4+ICArfQo+Pj4gICsKPj4+ ICArc3RhdGljIGludCBpdDY2MTIxX3NldF9tdXRlKHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4LCBi b29sIG11dGUpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQ7Cj4+PiAgKyAgICB1bnNpZ25lZCBp bnQgdmFsID0gMDsKPj4+ICArCj4+PiAgKyAgICBpZiAobXV0ZSkKPj4+ICArICAgICAgICB2YWwg PSBJVDY2MTIxX0FWX01VVEVfT047Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRl X2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQVZfTVVURV9SRUcsIAo+Pj4gSVQ2NjEyMV9BVl9N VVRFX09OLCB2YWwpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0 Owo+Pj4gICsKPj4+ICArICAgIHJldHVybiByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYx MjFfUEtUX0dFTl9DVFJMX1JFRywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfUEtUX0dF Tl9DVFJMX09OIHwgCj4+PiBJVDY2MTIxX1BLVF9HRU5fQ1RSTF9SUFQpOwo+Pj4gICt9Cj4+PiAg Kwo+Pj4gICsjZGVmaW5lIE1BWF9PVVRQVVRfU0VMX0ZPUk1BVFMgICAgMQo+Pj4gICsKPj4+ICAr c3RhdGljIHUzMiAqaXQ2NjEyMV9icmlkZ2VfYXRvbWljX2dldF9vdXRwdXRfYnVzX2ZtdHMoc3Ry dWN0IAo+Pj4gZHJtX2JyaWRnZSAqYnJpZGdlLAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgZHJtX2JyaWRnZV9zdGF0ZSAKPj4+ICpicmlkZ2Vfc3RhdGUsCj4+PiAg KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0 Y19zdGF0ZSwKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9j b25uZWN0b3Jfc3RhdGUgCj4+PiAqY29ubl9zdGF0ZSwKPj4+ICArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fb3V0cHV0X2ZtdHMpCj4+PiAgK3sKPj4+ICAr ICAgIHUzMiAqb3V0cHV0X2ZtdHM7Cj4+PiAgKwo+Pj4gICsgICAgb3V0cHV0X2ZtdHMgPSBrY2Fs bG9jKE1BWF9PVVRQVVRfU0VMX0ZPUk1BVFMsIAo+Pj4gc2l6ZW9mKCpvdXRwdXRfZm10cyksCj4+ PiAgKyAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwo+Pj4gICsgICAgaWYgKCFvdXRwdXRf Zm10cykKPj4+ICArICAgICAgICByZXR1cm4gTlVMTDsKPj4+ICArCj4+PiAgKyAgICAvKiBUT0ZJ WCBoYW5kbGUgbW9yZSB0aGFuIE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQgYXMgb3V0cHV0IAo+ Pj4gZm9ybWF0ICovCj4+PiAgKyAgICBvdXRwdXRfZm10c1swXSA9ICBNRURJQV9CVVNfRk1UX1JH Qjg4OF8xWDI0Owo+Pj4gICsgICAgKm51bV9vdXRwdXRfZm10cyA9IDE7Cj4+PiAgKwo+Pj4gICsg ICAgcmV0dXJuIG91dHB1dF9mbXRzOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICsjZGVmaW5lIE1BWF9J TlBVVF9TRUxfRk9STUFUUyAgICAxCj4+PiAgKwo+Pj4gICtzdGF0aWMgdTMyICppdDY2MTIxX2Jy aWRnZV9hdG9taWNfZ2V0X2lucHV0X2J1c19mbXRzKHN0cnVjdCAKPj4+IGRybV9icmlkZ2UgKmJy aWRnZSwKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2JyaWRn ZV9zdGF0ZSAKPj4+ICpicmlkZ2Vfc3RhdGUsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlLAo+Pj4gICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlIAo+Pj4gKmNvbm5f c3RhdGUsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIG91dHB1dF9mbXQs Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1faW5w dXRfZm10cykKPj4+ICArewo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpjdHggPSBjb250 YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwgYnJpZGdlKTsKPj4+ICAr ICAgIHUzMiAqaW5wdXRfZm10czsKPj4+ICArCj4+PiAgKyAgICAqbnVtX2lucHV0X2ZtdHMgPSAw Owo+Pj4gICsKPj4+ICArICAgIGlucHV0X2ZtdHMgPSBrY2FsbG9jKE1BWF9JTlBVVF9TRUxfRk9S TUFUUywgCj4+PiBzaXplb2YoKmlucHV0X2ZtdHMpLAo+Pj4gICsgICAgICAgICAgICAgICAgIEdG UF9LRVJORUwpOwo+Pj4gICsgICAgaWYgKCFpbnB1dF9mbXRzKQo+Pj4gICsgICAgICAgIHJldHVy biBOVUxMOwo+Pj4gICsKPj4+ICArICAgIGlmIChjdHgtPmJ1c193aWR0aCA9PSAxMikKPj4+ICAr ICAgICAgICAvKiBJVDY2MTIxRk4gRGF0YXNoZWV0IHNwZWNpZmllcyBMaXR0bGUtRW5kaWFuIG9y ZGVyaW5nICovCj4+PiAgKyAgICAgICAgaW5wdXRfZm10c1swXSA9IE1FRElBX0JVU19GTVRfUkdC ODg4XzJYMTJfTEU7Cj4+PiAgKyAgICBlbHNlCj4+PiAgKyAgICAgICAgLyogVE9GSVggc3VwcG9y dCBtb3JlIGlucHV0IGJ1cyBmb3JtYXRzIGluIDI0Yml0IHdpZHRoICovCj4+PiAgKyAgICAgICAg aW5wdXRfZm10c1swXSA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4+PiAgKyAgICAqbnVt X2lucHV0X2ZtdHMgPSAxOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiBpbnB1dF9mbXRzOwo+Pj4g ICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgdm9pZCBpdDY2MTIxX2JyaWRnZV9lbmFibGUoc3RydWN0 IGRybV9icmlkZ2UgKmJyaWRnZSkKPj4+ICArewo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4 ICpjdHggPSBjb250YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwgYnJp ZGdlKTsKPj4+ICArCj4+PiAgKyAgICBpdDY2MTIxX3NldF9tdXRlKGN0eCwgZmFsc2UpOwo+Pj4g ICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgdm9pZCBpdDY2MTIxX2JyaWRnZV9kaXNhYmxlKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UpCj4+PiAgK3sKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0 eCAqY3R4ID0gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IAo+Pj4gaXQ2NjEyMV9jdHgsIGJy aWRnZSk7Cj4+PiAgKwo+Pj4gICsgICAgaXQ2NjEyMV9zZXRfbXV0ZShjdHgsIHRydWUpOwo+Pj4g ICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMKPj4+ICArdm9pZCBpdDY2MTIxX2JyaWRnZV9tb2RlX3Nl dChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+Pj4gICsgICAgICAgICAgICAgICAgIGNvbnN0 IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAo+Pj4gICsgICAgICAgICAgICAgICAgIGNv bnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQo+Pj4gICt7Cj4+PiAg KyAgICBpbnQgcmV0LCBpOwo+Pj4gICsgICAgdTggYnVmW0hETUlfSU5GT0ZSQU1FX1NJWkUoQVZJ KV07Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihicmlk Z2UsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LCBicmlkZ2UpOwo+Pj4gICsgICAgY29uc3QgdTE2 IGF2aWluZm9fcmVnW0hETUlfQVZJX0lORk9GUkFNRV9TSVpFXSA9IHsKPj4+ICArICAgICAgICBJ VDY2MTIxX0FWSUlORk9fREIxX1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9fREIy X1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9fREIzX1JFRywKPj4+ICArICAgICAg ICBJVDY2MTIxX0FWSUlORk9fREI0X1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9f REI1X1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9fREI2X1JFRywKPj4+ICArICAg ICAgICBJVDY2MTIxX0FWSUlORk9fREI3X1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlO Rk9fREI4X1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9fREI5X1JFRywKPj4+ICAr ICAgICAgICBJVDY2MTIxX0FWSUlORk9fREIxMF9SRUcsCj4+PiAgKyAgICAgICAgSVQ2NjEyMV9B VklJTkZPX0RCMTFfUkVHLAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjEyX1JFRywK Pj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9fREIxM19SRUcKPj4+ICArICAgIH07Cj4+PiAg Kwo+Pj4gICsgICAgbXV0ZXhfbG9jaygmY3R4LT5sb2NrKTsKPj4+ICArCj4+PiAgKyAgICBoZG1p X2F2aV9pbmZvZnJhbWVfaW5pdCgmY3R4LT5oZG1pX2F2aV9pbmZvZnJhbWUpOwo+Pj4gICsKPj4+ ICArICAgIHJldCA9IAo+Pj4gZHJtX2hkbWlfYXZpX2luZm9mcmFtZV9mcm9tX2Rpc3BsYXlfbW9k ZSgmY3R4LT5oZG1pX2F2aV9pbmZvZnJhbWUsIAo+Pj4gJmN0eC0+Y29ubmVjdG9yLAo+Pj4gICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRfbW9kZSk7Cj4+PiAgKyAgICBp ZiAocmV0KSB7Cj4+PiAgKyAgICAgICAgRFJNX0VSUk9SKCJGYWlsZWQgdG8gc2V0dXAgQVZJIGlu Zm9mcmFtZTogJWRcbiIsIHJldCk7Cj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKyAg ICB9Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gaGRtaV9hdmlfaW5mb2ZyYW1lX3BhY2soJmN0eC0+ aGRtaV9hdmlfaW5mb2ZyYW1lLCBidWYsIAo+Pj4gc2l6ZW9mKGJ1ZikpOwo+Pj4gICsgICAgaWYg KHJldCA8IDApIHsKPj4+ICArICAgICAgICBEUk1fRVJST1IoIkZhaWxlZCB0byBwYWNrIGluZm9m cmFtZTogJWRcbiIsIHJldCk7Cj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKyAgICB9 Cj4+PiAgKwo+Pj4gICsgICAgLyogV3JpdGUgbmV3IEFWSSBpbmZvZnJhbWUgcGFja2V0ICovCj4+ PiAgKyAgICBmb3IgKGkgPSAwOyBpIDwgSERNSV9BVklfSU5GT0ZSQU1FX1NJWkU7IGkrKykgewo+ Pj4gICsgICAgICAgIGlmIChyZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIGF2aWluZm9fcmVnW2ld LCBidWZbaSArIAo+Pj4gSERNSV9JTkZPRlJBTUVfSEVBREVSX1NJWkVdKSkKPj4+ICArICAgICAg ICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKyAgICB9Cj4+PiAgKyAgICBpZiAocmVnbWFwX3dyaXRl KGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FWSUlORk9fQ1NVTV9SRUcsIAo+Pj4gYnVmWzNdKSkKPj4+ ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArCj4+PiAgKyAgICAvKiBFbmFibGUgQVZJIGlu Zm9mcmFtZSAqLwo+Pj4gICsgICAgaWYgKHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEy MV9BVklfSU5GT19QS1RfUkVHLAo+Pj4gICsgICAgICAgICAgICAgSVQ2NjEyMV9BVklfSU5GT19Q S1RfT04gfCBJVDY2MTIxX0FWSV9JTkZPX1BLVF9SUFQpKQo+Pj4gICsgICAgICAgIGdvdG8gdW5s b2NrOwo+Pj4gICsKPj4+ICArICAgIC8qIFNldCBUWCBtb2RlIHRvIEhETUkgKi8KPj4+ICArICAg IGlmIChyZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYxMjFfSERNSV9NT0RFX1JFRywgCj4+ PiBJVDY2MTIxX0hETUlfTU9ERV9IRE1JKSkKPj4+ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ ICArCj4+PiAgKyAgICBpZiAocmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFf Q0xLX0JBTktfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgICBJVDY2MTIxX0NMS19CQU5LX1BX Uk9GRl9UWENMSywgCj4+PiBJVDY2MTIxX0NMS19CQU5LX1BXUk9GRl9UWENMSykpCj4+PiAgKyAg ICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKGl0NjYxMjFfY29uZmlndXJl X2lucHV0KGN0eCkpCj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKwo+Pj4gICsgICAg aWYgKGl0NjYxMjFfY29uZmlndXJlX2FmZShjdHgsIGFkanVzdGVkX21vZGUpKQo+Pj4gICsgICAg ICAgIGdvdG8gdW5sb2NrOwo+Pj4gICsKPj4+ICArICAgIHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+ cmVnbWFwLCBJVDY2MTIxX0NMS19CQU5LX1JFRywgCj4+PiBJVDY2MTIxX0NMS19CQU5LX1BXUk9G Rl9UWENMSywgMCk7Cj4+PiAgKwo+Pj4gICt1bmxvY2s6Cj4+PiAgKyAgICBtdXRleF91bmxvY2so JmN0eC0+bG9jayk7Cj4+PiAgK30KPj4+ICArCj4+PiAgK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0 YXR1cyBpdDY2MTIxX2JyaWRnZV9tb2RlX3ZhbGlkKHN0cnVjdCAKPj4+IGRybV9icmlkZ2UgKmJy aWRnZSwKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRy bV9kaXNwbGF5X2luZm8gKmluZm8sCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+Pj4gICt7Cj4+PiAgKyAgICBz dHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihicmlkZ2UsIHN0cnVjdCAKPj4+ IGl0NjYxMjFfY3R4LCBicmlkZ2UpOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiBpdDY2MTIxX21v ZGVfdmFsaWQoY3R4LCBtb2RlKTsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGVudW0gZHJt X2Nvbm5lY3Rvcl9zdGF0dXMgaXQ2NjEyMV9icmlkZ2VfZGV0ZWN0KHN0cnVjdCAKPj4+IGRybV9i cmlkZ2UgKmJyaWRnZSkKPj4+ICArewo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgg PSBjb250YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwgYnJpZGdlKTsK Pj4+ICArCj4+PiAgKyAgICByZXR1cm4gaXQ2NjEyMV9pc19ocGRfZGV0ZWN0KGN0eCkgPyBjb25u ZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgOiBjb25u ZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIHN0 cnVjdCBlZGlkICppdDY2MTIxX2JyaWRnZV9nZXRfZWRpZChzdHJ1Y3QgZHJtX2JyaWRnZSAKPj4+ ICpicmlkZ2UsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY29ubmVj dG9yICpjb25uZWN0b3IpCj4+PiAgK3sKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4 ID0gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IAo+Pj4gaXQ2NjEyMV9jdHgsIGJyaWRnZSk7 Cj4+PiAgKyAgICBzdHJ1Y3QgZWRpZCAqZWRpZDsKPj4+ICArCj4+PiAgKyAgICBtdXRleF9sb2Nr KCZjdHgtPmxvY2spOwo+Pj4gICsgICAgZWRpZCA9IGRybV9kb19nZXRfZWRpZChjb25uZWN0b3Is IGl0NjYxMjFfZ2V0X2VkaWRfYmxvY2ssIAo+Pj4gY3R4KTsKPj4+ICArICAgIG11dGV4X3VubG9j aygmY3R4LT5sb2NrKTsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gZWRpZDsKPj4+ICArfQo+Pj4g ICsKPj4+ICArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIGl0NjYxMjFfYnJp ZGdlX2Z1bmNzID0gewo+Pj4gICsgICAgLmF0dGFjaCA9IGl0NjYxMjFfYnJpZGdlX2F0dGFjaCwK Pj4+ICArICAgIC5lbmFibGUgPSBpdDY2MTIxX2JyaWRnZV9lbmFibGUsCj4+PiAgKyAgICAuZGlz YWJsZSA9IGl0NjYxMjFfYnJpZGdlX2Rpc2FibGUsCj4+PiAgKyAgICAubW9kZV9zZXQgPSBpdDY2 MTIxX2JyaWRnZV9tb2RlX3NldCwKPj4+ICArICAgIC5tb2RlX3ZhbGlkID0gaXQ2NjEyMV9icmlk Z2VfbW9kZV92YWxpZCwKPj4+ICArICAgIC5kZXRlY3QgPSBpdDY2MTIxX2JyaWRnZV9kZXRlY3Qs Cj4+PiAgKyAgICAuZ2V0X2VkaWQgPSBpdDY2MTIxX2JyaWRnZV9nZXRfZWRpZCwKPj4+ICArICAg IC5hdG9taWNfZ2V0X291dHB1dF9idXNfZm10cyA9IAo+Pj4gaXQ2NjEyMV9icmlkZ2VfYXRvbWlj X2dldF9vdXRwdXRfYnVzX2ZtdHMsCj4+PiAgKyAgICAuYXRvbWljX2dldF9pbnB1dF9idXNfZm10 cyA9IAo+Pj4gaXQ2NjEyMV9icmlkZ2VfYXRvbWljX2dldF9pbnB1dF9idXNfZm10cywKPj4+ICAr fTsKPj4+ICArCj4+PiAgK3N0YXRpYyBpcnFyZXR1cm5fdCBpdDY2MTIxX2lycV90aHJlYWRlZF9o YW5kbGVyKGludCBpcnEsIHZvaWQgCj4+PiAqZGV2X2lkKQo+Pj4gICt7Cj4+PiAgKyAgICBpbnQg cmV0Owo+Pj4gICsgICAgdW5zaWduZWQgaW50IHZhbDsKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIx X2N0eCAqY3R4ID0gZGV2X2lkOwo+Pj4gICsgICAgc3RydWN0IGRldmljZSAqZGV2ID0gY3R4LT5k ZXY7Cj4+PiAgKyAgICBib29sIGV2ZW50ID0gZmFsc2U7Cj4+PiAgKwo+Pj4gICsgICAgbXV0ZXhf bG9jaygmY3R4LT5sb2NrKTsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfcmVhZChjdHgt PnJlZ21hcCwgSVQ2NjEyMV9TWVNfU1RBVFVTX1JFRywgJnZhbCk7Cj4+PiAgKyAgICBpZiAocmV0 KQo+Pj4gICsgICAgICAgIGdvdG8gdW5sb2NrOwo+Pj4gICsKPj4+ICArICAgIGlmICghKHZhbCAm IElUNjYxMjFfU1lTX1NUQVRVU19BQ1RJVkVfSVJRKSkKPj4+ICArICAgICAgICBnb3RvIHVubG9j azsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfcmVhZChjdHgtPnJlZ21hcCwgSVQ2NjEy MV9JTlRfU1RBVFVTMV9SRUcsICZ2YWwpOwo+Pj4gICsgICAgaWYgKHJldCkgewo+Pj4gICsgICAg ICAgIGRldl9lcnIoZGV2LCAiQ2Fubm90IHJlYWQgU1RBVFVTMV9SRUcgJWRcbiIsIHJldCk7Cj4+ PiAgKyAgICB9IGVsc2Ugewo+Pj4gICsgICAgICAgIGlmICh2YWwgJiBJVDY2MTIxX0lOVF9TVEFU VVMxX0REQ19GSUZPRVJSKQo+Pj4gICsgICAgICAgICAgICBpdDY2MTIxX2NsZWFyX2RkY19maWZv KGN0eCk7Cj4+PiAgKyAgICAgICAgaWYgKHZhbCAmIChJVDY2MTIxX0lOVF9TVEFUVVMxX0REQ19C VVNIQU5HIHwKPj4+ICArICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfU1RBVFVTMV9ERENfTk9B Q0spKQo+Pj4gICsgICAgICAgICAgICBpdDY2MTIxX2Fib3J0X2RkY19vcHMoY3R4KTsKPj4+ICAr ICAgICAgICBpZiAodmFsICYgSVQ2NjEyMV9JTlRfU1RBVFVTMV9IUERfU1RBVFVTKSB7Cj4+PiAg KyAgICAgICAgICAgIHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0lOVF9D TFIxX1JFRywKPj4+ICArICAgICAgICAgICAgICAgICAgICAgIElUNjYxMjFfSU5UX0NMUjFfSFBE LCBJVDY2MTIxX0lOVF9DTFIxX0hQRCk7Cj4+PiAgKwo+Pj4gICsgICAgICAgICAgICBpZiAoIWl0 NjYxMjFfaXNfaHBkX2RldGVjdChjdHgpKSB7Cj4+PiAgKyAgICAgICAgICAgICAgICBrZnJlZShj dHgtPmVkaWQpOwo+Pj4gICsgICAgICAgICAgICAgICAgY3R4LT5lZGlkID0gTlVMTDsKPj4+ICAr ICAgICAgICAgICAgfQo+Pj4gICsKPj4+ICArICAgICAgICAgICAgZXZlbnQgPSB0cnVlOwo+Pj4g ICsgICAgICAgIH0KPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICByZWdtYXBfd3JpdGVfYml0 cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9TWVNfU1RBVFVTX1JFRywKPj4+ICArICAgICAgICAgICAg ICBJVDY2MTIxX1NZU19TVEFUVVNfQ0xFQVJfSVJRLAo+Pj4gICsgICAgICAgICAgICAgIElUNjYx MjFfU1lTX1NUQVRVU19DTEVBUl9JUlEpOwo+Pj4gICsKPj4+ICArdW5sb2NrOgo+Pj4gICsgICAg bXV0ZXhfdW5sb2NrKCZjdHgtPmxvY2spOwo+Pj4gICsKPj4+ICArICAgIGlmIChldmVudCkKPj4+ ICArICAgICAgICBkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoY3R4LT5icmlkZ2UuZGV2KTsKPj4+ ICArCj4+PiAgKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+PiAgK30KPj4+ICArCj4+PiAgK3N0 YXRpYyBpbnQgaXQ2NjEyMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+Pj4gICsg ICAgICAgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQo+Pj4gICt7Cj4+PiAg KyAgICB1MzIgdmVuZG9yX2lkc1syXSwgZGV2aWNlX2lkc1syXSwgcmV2aXNpb25faWQ7Cj4+PiAg KyAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmVwOwo+Pj4gICsgICAgaW50IHJldDsKPj4+ICArICAg IHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4Owo+Pj4gICsgICAgc3RydWN0IGRldmljZSAqZGV2ID0g JmNsaWVudC0+ZGV2Owo+Pj4gICsKPj4+ICArICAgIGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxp dHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Cj4+PiAgKyAgICAgICAgZGV2X2Vy cihkZXYsICJJMkMgY2hlY2sgZnVuY3Rpb25hbGl0eSBmYWlsZWQuXG4iKTsKPj4+ICArICAgICAg ICByZXR1cm4gLUVOWElPOwo+Pj4gICsgICAgfQo+Pj4gICsKPj4+ICArICAgIGVwID0gb2ZfZ3Jh cGhfZ2V0X2VuZHBvaW50X2J5X3JlZ3MoZGV2LT5vZl9ub2RlLCAwLCAwKTsKPj4+ICArICAgIGlm ICghZXApCj4+PiAgKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+PiAgKwo+Pj4gICsgICAgY3R4 ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKPj4+ICArICAg IGlmICghY3R4KQo+Pj4gICsgICAgICAgIHJldHVybiAtRU5PTUVNOwo+Pj4gICsKPj4+ICArICAg IGN0eC0+ZGV2ID0gZGV2Owo+Pj4gICsgICAgY3R4LT5jbGllbnQgPSBjbGllbnQ7Cj4+PiAgKwo+ Pj4gICsgICAgb2ZfcHJvcGVydHlfcmVhZF91MzIoZXAsICJidXMtd2lkdGgiLCAmY3R4LT5idXNf d2lkdGgpOwo+Pj4gICsgICAgb2Zfbm9kZV9wdXQoZXApOwo+Pj4gICsKPj4+ICArICAgIGlmIChj dHgtPmJ1c193aWR0aCAhPSAxMiAmJiBjdHgtPmJ1c193aWR0aCAhPSAyNCkKPj4+ICArICAgICAg ICByZXR1cm4gLUVJTlZBTDsKPj4+ICArCj4+PiAgKyAgICBpMmNfc2V0X2NsaWVudGRhdGEoY2xp ZW50LCBjdHgpOwo+Pj4gICsgICAgbXV0ZXhfaW5pdCgmY3R4LT5sb2NrKTsKPj4+ICArCj4+PiAg KyAgICBjdHgtPnN1cHBsaWVzWzBdLnN1cHBseSA9ICJ2Y24zMyI7Cj4+PiAgKyAgICBjdHgtPnN1 cHBsaWVzWzFdLnN1cHBseSA9ICJ2Y24xOCI7Cj4+PiAgKyAgICBjdHgtPnN1cHBsaWVzWzJdLnN1 cHBseSA9ICJ2cmYxMiI7Cj4+PiAgKyAgICByZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChj dHgtPmRldiwgMywgY3R4LT5zdXBwbGllcyk7Cj4+PiAgKyAgICBpZiAocmV0KSB7Cj4+PiAgKyAg ICAgICAgZGV2X2VycihjdHgtPmRldiwgInJlZ3VsYXRvcl9idWxrIGZhaWxlZFxuIik7Cj4+PiAg KyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICByZXQgPSBp dGU2NjEyMV9wb3dlcl9vbihjdHgpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICBy ZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIGl0NjYxMjFfaHdfcmVzZXQoY3R4KTsKPj4+ICAr Cj4+PiAgKyAgICBjdHgtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgCj4+ PiAmaXQ2NjEyMV9yZWdtYXBfY29uZmlnKTsKPj4+ICArICAgIGlmIChJU19FUlIoY3R4LT5yZWdt YXApKSB7Cj4+PiAgKyAgICAgICAgaXRlNjYxMjFfcG93ZXJfb2ZmKGN0eCk7Cj4+PiAgKyAgICAg ICAgcmV0dXJuIFBUUl9FUlIoY3R4KTsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICByZWdt YXBfcmVhZChjdHgtPnJlZ21hcCwgSVQ2NjEyMV9WRU5ET1JfSUQwX1JFRywgCj4+PiAmdmVuZG9y X2lkc1swXSk7Cj4+PiAgKyAgICByZWdtYXBfcmVhZChjdHgtPnJlZ21hcCwgSVQ2NjEyMV9WRU5E T1JfSUQxX1JFRywgCj4+PiAmdmVuZG9yX2lkc1sxXSk7Cj4+PiAgKyAgICByZWdtYXBfcmVhZChj dHgtPnJlZ21hcCwgSVQ2NjEyMV9ERVZJQ0VfSUQwX1JFRywgCj4+PiAmZGV2aWNlX2lkc1swXSk7 Cj4+PiAgKyAgICByZWdtYXBfcmVhZChjdHgtPnJlZ21hcCwgSVQ2NjEyMV9ERVZJQ0VfSUQxX1JF RywgCj4+PiAmZGV2aWNlX2lkc1sxXSk7Cj4+PiAgKwo+Pj4gICsgICAgLyogUmV2aXNpb24gaXMg c2hhcmVkIHdpdGggREVWSUNFX0lEMSAqLwo+Pj4gICsgICAgcmV2aXNpb25faWQgPSBGSUVMRF9H RVQoSVQ2NjEyMV9SRVZJU0lPTl9NQVNLLCBkZXZpY2VfaWRzWzFdKTsKPj4+ICArICAgIGRldmlj ZV9pZHNbMV0gJj0gSVQ2NjEyMV9ERVZJQ0VfSUQxX01BU0s7Cj4+PiAgKwo+Pj4gICsgICAgaWYg KHZlbmRvcl9pZHNbMF0gIT0gSVQ2NjEyMV9WRU5ET1JfSUQwIHx8IHZlbmRvcl9pZHNbMV0gIT0g Cj4+PiBJVDY2MTIxX1ZFTkRPUl9JRDEgfHwKPj4+ICArICAgICAgICBkZXZpY2VfaWRzWzBdICE9 IElUNjYxMjFfREVWSUNFX0lEMCB8fCBkZXZpY2VfaWRzWzFdICE9IAo+Pj4gSVQ2NjEyMV9ERVZJ Q0VfSUQxKSB7Cj4+PiAgKyAgICAgICAgaXRlNjYxMjFfcG93ZXJfb2ZmKGN0eCk7Cj4+PiAgKyAg ICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4+PiAgKyAgICB9Cj4+PiAgKwo+Pj4gICsgICAgY3R4LT5i cmlkZ2UuZnVuY3MgPSAmaXQ2NjEyMV9icmlkZ2VfZnVuY3M7Cj4+PiAgKyAgICBjdHgtPmJyaWRn ZS5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwo+Pj4gICsKPj4+ICArICAgIHJldCA9IGRldm1fcmVx dWVzdF90aHJlYWRlZF9pcnEoZGV2LCBjbGllbnQtPmlycSwgTlVMTCwgICAgCj4+PiBpdDY2MTIx X2lycV90aHJlYWRlZF9oYW5kbGVyLAo+Pj4gICsgICAgICAgICAgICAgICAgICAgIElSUUZfU0hB UkVEIHwgSVJRRl9PTkVTSE9ULCBkZXZfbmFtZShkZXYpLCAKPj4+IGN0eCk7Cj4+PiAgKyAgICBp ZiAocmV0IDwgMCkgewo+Pj4gICsgICAgICAgIGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVl c3QgaXJxICVkOiVkXG4iLCAKPj4+IGNsaWVudC0+aXJxLCByZXQpOwo+Pj4gICsgICAgICAgIGl0 ZTY2MTIxX3Bvd2VyX29mZihjdHgpOwo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKyAg ICB9Cj4+PiAgKwo+Pj4gICsgICAgZHJtX2JyaWRnZV9hZGQoJmN0eC0+YnJpZGdlKTsKPj4+ICAr Cj4+PiAgKyAgICBkZXZfaW5mbyhjdHgtPmRldiwgIklUNjYxMjEgcmV2aXNpb24gJWQgcHJvYmVk XG4iLCAKPj4+IHJldmlzaW9uX2lkKTsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gMDsKPj4+ICAr fQo+Pj4gICsKPj4+ICArc3RhdGljIGludCBpdDY2MTIxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVu dCAqY2xpZW50KQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGky Y19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwo+Pj4gICsKPj4+ICArICAgIGl0ZTY2MTIxX3Bvd2Vy X29mZihjdHgpOwo+Pj4gICsgICAgZHJtX2JyaWRnZV9yZW1vdmUoJmN0eC0+YnJpZGdlKTsKPj4+ ICArICAgIGtmcmVlKGN0eC0+ZWRpZCk7Cj4+PiAgKyAgICBtdXRleF9kZXN0cm95KCZjdHgtPmxv Y2spOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiAwOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpdDY2MTIxX2R0X21hdGNoW10gPSB7Cj4+PiAg KyAgICB7IC5jb21wYXRpYmxlID0gIml0ZSxpdDY2MTIxIiB9LAo+Pj4gICsgICAgeyB9Cj4+PiAg K307Cj4+PiAgK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGl0NjYxMjFfZHRfbWF0Y2gpOwo+Pj4g ICsKPj4+ICArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGl0NjYxMjFfaWRbXSA9 IHsKPj4+ICArICAgIHsgIml0NjYxMjEiLCAwIH0sCj4+PiAgKyAgICB7IH0KPj4+ICArfTsKPj4+ ICArTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGl0NjYxMjFfaWQpOwo+Pj4gICsKPj4+ICArc3Rh dGljIHN0cnVjdCBpMmNfZHJpdmVyIGl0NjYxMjFfZHJpdmVyID0gewo+Pj4gICsgICAgLmRyaXZl ciA9IHsKPj4+ICArICAgICAgICAubmFtZSAgICA9ICJpdDY2MTIxIiwKPj4+ICArICAgICAgICAu b2ZfbWF0Y2hfdGFibGUgPSBpdDY2MTIxX2R0X21hdGNoLAo+Pj4gICsgICAgfSwKPj4+ICArICAg IC5wcm9iZSA9IGl0NjYxMjFfcHJvYmUsCj4+PiAgKyAgICAucmVtb3ZlID0gaXQ2NjEyMV9yZW1v dmUsCj4+PiAgKyAgICAuaWRfdGFibGUgPSBpdDY2MTIxX2lkLAo+Pj4gICt9Owo+Pj4gICsKPj4+ ICArbW9kdWxlX2kyY19kcml2ZXIoaXQ2NjEyMV9kcml2ZXIpOwo+Pj4gICsKPj4+ICArTU9EVUxF X0FVVEhPUigiUGhvbmcgTEUiKTsKPj4+ICArTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDY2MTIxIEhE TUkgdHJhbnNtaXR0ZXIgZHJpdmVyIik7Cj4+PiAgK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK Pj4+ICAtLQo+Pj4gIDIuMjUuMQo+Pj4gCj4+IAo+PiAKCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK