From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Mon, 14 Nov 2016 12:08:35 -0500 Subject: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE In-Reply-To: <5826A498.4000002@huawei.com> References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-5-git-send-email-zourongrong@gmail.com> <5826A498.4000002@huawei.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Sat, Nov 12, 2016 at 12:11 AM, Rongrong Zou wrote: > ? 2016/11/11 5:53, Sean Paul ??: >> >> On Fri, Oct 28, 2016 at 3:27 AM, Rongrong Zou >> wrote: >>> >>> Add plane funcs and helper funcs for DE. >>> >>> Signed-off-by: Rongrong Zou >>> --- >>> drivers/gpu/drm/hisilicon/hibmc/Kconfig | 1 + >>> drivers/gpu/drm/hisilicon/hibmc/Makefile | 2 +- >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 170 >>> ++++++++++++++++++++++++ >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h | 29 ++++ >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 51 ++++++- >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 5 + >>> drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c | 6 + >>> 7 files changed, 261 insertions(+), 3 deletions(-) >>> create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c >>> create mode 100644 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h >>> >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/Kconfig >>> b/drivers/gpu/drm/hisilicon/hibmc/Kconfig >>> index bcb8c18..380622a 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/Kconfig >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/Kconfig >>> @@ -1,6 +1,7 @@ >>> config DRM_HISI_HIBMC >>> tristate "DRM Support for Hisilicon Hibmc" >>> depends on DRM && PCI >>> + select DRM_KMS_HELPER >>> select DRM_TTM >>> >>> help >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> b/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> index 810a37e..72e107e 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/Makefile >>> @@ -1,5 +1,5 @@ >>> ccflags-y := -Iinclude/drm >>> -hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_fbdev.o hibmc_drm_power.o >>> hibmc_ttm.o >>> +hibmc-drm-y := hibmc_drm_drv.o hibmc_drm_de.o hibmc_drm_fbdev.o >>> hibmc_drm_power.o hibmc_ttm.o >>> >>> obj-$(CONFIG_DRM_HISI_HIBMC) +=hibmc-drm.o >>> #obj-y += hibmc-drm.o >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c >>> new file mode 100644 >>> index 0000000..9c1a68c >>> --- /dev/null >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c >>> @@ -0,0 +1,170 @@ >>> +/* Hisilicon Hibmc SoC drm driver >>> + * >>> + * Based on the bochs drm driver. >>> + * >>> + * Copyright (c) 2016 Huawei Limited. >>> + * >>> + * Author: >>> + * Rongrong Zou >>> + * Rongrong Zou >>> + * Jianhua Li >>> + * >>> + * This program is free software; you can redistribute it and/or modify >>> + * it under the terms of the GNU General Public License as published by >>> + * the Free Software Foundation; either version 2 of the License, or >>> + * (at your option) any later version. >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include "hibmc_drm_drv.h" >>> +#include "hibmc_drm_regs.h" >>> +#include "hibmc_drm_power.h" >>> + >>> +/* >>> ---------------------------------------------------------------------- */ >> >> >> Remove > > > ok, will do, thanks. > >> >>> + >>> +static int hibmc_plane_atomic_check(struct drm_plane *plane, >>> + struct drm_plane_state *state) >>> +{ >>> + struct drm_framebuffer *fb = state->fb; >>> + struct drm_crtc *crtc = state->crtc; >>> + struct drm_crtc_state *crtc_state; >>> + u32 src_x = state->src_x >> 16; >>> + u32 src_y = state->src_y >> 16; >>> + u32 src_w = state->src_w >> 16; >>> + u32 src_h = state->src_h >> 16; >>> + int crtc_x = state->crtc_x; >>> + int crtc_y = state->crtc_y; >>> + u32 crtc_w = state->crtc_w; >>> + u32 crtc_h = state->crtc_h; >> >> >> I don't think you gain anything with the crtc_* vars > > > It would work well, but looks redundant and not simple enough, > will delete them, thanks. > >> >>> + >>> + if (!crtc || !fb) >>> + return 0; >>> + >>> + crtc_state = drm_atomic_get_crtc_state(state->state, crtc); >>> + if (IS_ERR(crtc_state)) >>> + return PTR_ERR(crtc_state); >>> + >>> + if (src_w != crtc_w || src_h != crtc_h) { >>> + DRM_ERROR("Scale not support!!!\n"); >> >> >> I like the enthusiasm, but I think DRM_DEBUG_ATOMIC would be better > > > I'm sorry, can you explain why here should be an DRM_DEBUG_ATOMIC, > when this condition is hit, it is really an error and atomic_commit will > abort with failure. > I don't have strong opinions, but this class of failure isn't a driver error, so much as invalid input from userspace. As such, I'd tend to classify it as debug level. At any rate, keep it ERROR if you really want. Sean >> >>> + return -EINVAL; >>> + } >>> + >>> + if (src_x + src_w > fb->width || >>> + src_y + src_h > fb->height) >> >> >> These should be already covered in drm_atomic_plane_check > > > understood, thanks. > >> >>> + return -EINVAL; >>> + >>> + if (crtc_x < 0 || crtc_y < 0) >> >> >> Print DRM_DEBUG_ATOMIC message here > > > agreed. thanks. > >> >>> + return -EINVAL; >>> + >>> + if (crtc_x + crtc_w > crtc_state->adjusted_mode.hdisplay || >>> + crtc_y + crtc_h > crtc_state->adjusted_mode.vdisplay) >> >> >> DRM_DEBUG_ATOMIC here too > > > ditto. > >> >>> + return -EINVAL; >>> + >>> + return 0; >>> +} >>> + >>> +static void hibmc_plane_atomic_update(struct drm_plane *plane, >>> + struct drm_plane_state *old_state) >>> +{ >>> + struct drm_plane_state *state = plane->state; >>> + u32 reg; >>> + int ret; >>> + u64 gpu_addr = 0; >>> + unsigned int line_l; >>> + struct hibmc_drm_device *hidev = >>> + (struct hibmc_drm_device *)plane->dev->dev_private; >>> + >> >> >> nit: extra line > > > will delete, thanks. > >>> + struct hibmc_framebuffer *hibmc_fb; >>> + struct hibmc_bo *bo; >>> + >>> + hibmc_fb = to_hibmc_framebuffer(state->fb); >>> + bo = gem_to_hibmc_bo(hibmc_fb->obj); >>> + ret = ttm_bo_reserve(&bo->bo, true, false, NULL); >>> + if (ret) >> >> >> Print error > > > agreed, thanks. > >> >>> + return; >>> + >>> + hibmc_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr); >> >> >> Check return value > > > ok, thanks. > >> >>> + if (ret) { >>> + ttm_bo_unreserve(&bo->bo); >>> + return; >>> + } >>> + >>> + ttm_bo_unreserve(&bo->bo); >> >> >> Move this up before the conditional so you don't have to call it in >> both branches > > > understood, thanks. > >> >>> + >>> + writel(gpu_addr, hidev->mmio + HIBMC_CRT_FB_ADDRESS); >>> + >>> + reg = state->fb->width * (state->fb->bits_per_pixel >> 3); >>> + /* now line_pad is 16 */ >>> + reg = PADDING(16, reg); >>> + >>> + line_l = state->fb->width * state->fb->bits_per_pixel / 8; >> >> >> above, you >> 3. here you / 8, pick one? > > > i prefer /8 because it is more readable to human, although it is less > effective > in executing. > I think the compiler will optimize it, regardless. Sean >> >>> + line_l = PADDING(16, line_l); >>> + writel((HIBMC_CRT_FB_WIDTH_WIDTH(reg) & >>> HIBMC_CRT_FB_WIDTH_WIDTH_MASK) | >>> + (HIBMC_CRT_FB_WIDTH_OFFS(line_l) & >>> HIBMC_CRT_FB_WIDTH_OFFS_MASK), >>> + hidev->mmio + HIBMC_CRT_FB_WIDTH); >>> + >>> + /* SET PIXEL FORMAT */ >>> + reg = readl(hidev->mmio + HIBMC_CRT_DISP_CTL); >>> + reg = reg & ~HIBMC_CRT_DISP_CTL_FORMAT_MASK; >>> + reg = reg | (HIBMC_CRT_DISP_CTL_FORMAT(state->fb->bits_per_pixel >>> >> 4) & >>> + HIBMC_CRT_DISP_CTL_FORMAT_MASK); >>> + writel(reg, hidev->mmio + HIBMC_CRT_DISP_CTL); >>> +} >>> + >>> +static void hibmc_plane_atomic_disable(struct drm_plane *plane, >>> + struct drm_plane_state *old_state) >>> +{ >>> +} >> >> >> The caller checks for NULL, no need to stub > > > thanks for pointing it out, > will remove. > > Regards, > Rongrong. > >> >>> + >>> +static const u32 channel_formats1[] = { >>> + DRM_FORMAT_RGB565, DRM_FORMAT_BGR565, DRM_FORMAT_RGB888, >>> + DRM_FORMAT_BGR888, DRM_FORMAT_XRGB8888, DRM_FORMAT_XBGR8888, >>> + DRM_FORMAT_RGBA8888, DRM_FORMAT_BGRA8888, DRM_FORMAT_ARGB8888, >>> + DRM_FORMAT_ABGR8888 >>> +}; >>> + >>> +static struct drm_plane_funcs hibmc_plane_funcs = { >>> + .update_plane = drm_atomic_helper_update_plane, >>> + .disable_plane = drm_atomic_helper_disable_plane, >>> + .set_property = drm_atomic_helper_plane_set_property, >>> + .destroy = drm_plane_cleanup, >>> + .reset = drm_atomic_helper_plane_reset, >>> + .atomic_duplicate_state = >>> drm_atomic_helper_plane_duplicate_state, >>> + .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, >>> +}; >>> + >>> +static const struct drm_plane_helper_funcs hibmc_plane_helper_funcs = { >>> + .atomic_check = hibmc_plane_atomic_check, >>> + .atomic_update = hibmc_plane_atomic_update, >>> + .atomic_disable = hibmc_plane_atomic_disable, >>> +}; >>> + >>> +int hibmc_plane_init(struct hibmc_drm_device *hidev) >>> +{ >>> + struct drm_device *dev = hidev->dev; >>> + struct drm_plane *plane = &hidev->plane; >>> + int ret = 0; >>> + >>> + /* >>> + * plane init >>> + * TODO: Now only support primary plane, overlay planes >>> + * need to do. >>> + */ >>> + ret = drm_universal_plane_init(dev, plane, 1, &hibmc_plane_funcs, >>> + channel_formats1, >>> + ARRAY_SIZE(channel_formats1), >>> + DRM_PLANE_TYPE_PRIMARY, >>> + NULL); >>> + if (ret) { >>> + DRM_ERROR("fail to init plane!!!\n"); >>> + return ret; >>> + } >>> + >>> + drm_plane_helper_add(plane, &hibmc_plane_helper_funcs); >>> + return 0; >>> +} >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h >>> new file mode 100644 >>> index 0000000..4ce0d7b >>> --- /dev/null >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.h >>> @@ -0,0 +1,29 @@ >>> +/* Hisilicon Hibmc SoC drm driver >>> + * >>> + * Based on the bochs drm driver. >>> + * >>> + * Copyright (c) 2016 Huawei Limited. >>> + * >>> + * Author: >>> + * Rongrong Zou >>> + * Rongrong Zou >>> + * Jianhua Li >>> + * >>> + * This program is free software; you can redistribute it and/or modify >>> + * it under the terms of the GNU General Public License as published by >>> + * the Free Software Foundation; either version 2 of the License, or >>> + * (at your option) any later version. >>> + * >>> + */ >>> + >>> +#ifndef HIBMC_DRM_DE_H >>> +#define HIBMC_DRM_DE_H >>> + >>> +struct panel_pll { >>> + unsigned long M; >>> + unsigned long N; >>> + unsigned long OD; >>> + unsigned long POD; >>> +}; >>> + >>> +#endif >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> index 5ac7a7e..7d96583 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c >>> @@ -18,6 +18,7 @@ >>> >>> #include >>> #include >>> +#include >>> >>> #include "hibmc_drm_drv.h" >>> #include "hibmc_drm_regs.h" >>> @@ -47,8 +48,8 @@ static void hibmc_disable_vblank(struct drm_device >>> *dev, unsigned int pipe) >>> } >>> >>> static struct drm_driver hibmc_driver = { >>> - .driver_features = DRIVER_GEM, >>> - >>> + .driver_features = DRIVER_GEM | DRIVER_MODESET | >>> + DRIVER_ATOMIC, >>> .fops = &hibmc_fops, >>> .name = "hibmc", >>> .date = "20160828", >>> @@ -70,6 +71,7 @@ static int hibmc_pm_suspend(struct device *dev) >>> struct drm_device *drm_dev = pci_get_drvdata(pdev); >>> struct hibmc_drm_device *hidev = drm_dev->dev_private; >>> >>> + drm_kms_helper_poll_disable(drm_dev); >>> drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 1); >>> >>> return 0; >>> @@ -81,7 +83,9 @@ static int hibmc_pm_resume(struct device *dev) >>> struct drm_device *drm_dev = pci_get_drvdata(pdev); >>> struct hibmc_drm_device *hidev = drm_dev->dev_private; >>> >>> + drm_helper_resume_force_mode(drm_dev); >>> drm_fb_helper_set_suspend_unlocked(&hidev->fbdev->helper, 0); >>> + drm_kms_helper_poll_enable(drm_dev); >>> >>> return 0; >>> } >>> @@ -91,6 +95,41 @@ static int hibmc_pm_resume(struct device *dev) >>> hibmc_pm_resume) >>> }; >>> >>> +static int hibmc_kms_init(struct hibmc_drm_device *hidev) >>> +{ >>> + int ret; >>> + >>> + drm_mode_config_init(hidev->dev); >>> + hidev->mode_config_initialized = true; >>> + >>> + hidev->dev->mode_config.min_width = 0; >>> + hidev->dev->mode_config.min_height = 0; >>> + hidev->dev->mode_config.max_width = 1920; >>> + hidev->dev->mode_config.max_height = 1440; >>> + >>> + hidev->dev->mode_config.fb_base = hidev->fb_base; >>> + hidev->dev->mode_config.preferred_depth = 24; >>> + hidev->dev->mode_config.prefer_shadow = 0; >>> + >>> + hidev->dev->mode_config.funcs = (void *)&hibmc_mode_funcs; >>> + >>> + ret = hibmc_plane_init(hidev); >>> + if (ret) { >>> + DRM_ERROR("fail to init plane!!!\n"); >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static void hibmc_kms_fini(struct hibmc_drm_device *hidev) >>> +{ >>> + if (hidev->mode_config_initialized) { >>> + drm_mode_config_cleanup(hidev->dev); >>> + hidev->mode_config_initialized = false; >>> + } >>> +} >>> + >>> static int hibmc_hw_config(struct hibmc_drm_device *hidev) >>> { >>> unsigned int reg; >>> @@ -183,6 +222,7 @@ static int hibmc_unload(struct drm_device *dev) >>> struct hibmc_drm_device *hidev = dev->dev_private; >>> >>> hibmc_fbdev_fini(hidev); >>> + hibmc_kms_fini(hidev); >>> hibmc_mm_fini(hidev); >>> hibmc_hw_fini(hidev); >>> dev->dev_private = NULL; >>> @@ -208,6 +248,13 @@ static int hibmc_load(struct drm_device *dev, >>> unsigned long flags) >>> if (ret) >>> goto err; >>> >>> + ret = hibmc_kms_init(hidev); >>> + if (ret) >>> + goto err; >>> + >>> + /* reset all the states of crtc/plane/encoder/connector */ >>> + drm_mode_config_reset(dev); >>> + >>> ret = hibmc_fbdev_init(hidev); >>> if (ret) >>> goto err; >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> index a40e9a7..49e39d2 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h >>> @@ -45,6 +45,8 @@ struct hibmc_drm_device { >>> >>> /* drm */ >>> struct drm_device *dev; >>> + struct drm_plane plane; >>> + bool mode_config_initialized; >>> >>> /* ttm */ >>> struct { >>> @@ -82,6 +84,7 @@ static inline struct hibmc_bo *gem_to_hibmc_bo(struct >>> drm_gem_object *gem) >>> >>> #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT) >>> >>> +int hibmc_plane_init(struct hibmc_drm_device *hidev); >>> int hibmc_fbdev_init(struct hibmc_drm_device *hidev); >>> void hibmc_fbdev_fini(struct hibmc_drm_device *hidev); >>> >>> @@ -102,4 +105,6 @@ int hibmc_dumb_mmap_offset(struct drm_file *file, >>> struct drm_device *dev, >>> u32 handle, u64 *offset); >>> int hibmc_mmap(struct file *filp, struct vm_area_struct *vma); >>> >>> +extern const struct drm_mode_config_funcs hibmc_mode_funcs; >>> + >>> #endif >>> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> index 9822f62..beb4d76 100644 >>> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c >>> @@ -554,3 +554,9 @@ struct hibmc_framebuffer * >>> } >>> return &hibmc_fb->fb; >>> } >>> + >>> +const struct drm_mode_config_funcs hibmc_mode_funcs = { >>> + .atomic_check = drm_atomic_helper_check, >>> + .atomic_commit = drm_atomic_helper_commit, >>> + .fb_create = hibmc_user_framebuffer_create, >>> +}; >>> -- >>> 1.9.1 >>> >>> >>> _______________________________________________ >>> linux-arm-kernel mailing list >>> linux-arm-kernel at lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> >> _______________________________________________ >> linuxarm mailing list >> linuxarm at huawei.com >> http://rnd-openeuler.huawei.com/mailman/listinfo/linuxarm >> >> . >> > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v6 4/9] drm/hisilicon/hibmc: Add plane for DE Date: Mon, 14 Nov 2016 12:08:35 -0500 Message-ID: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-5-git-send-email-zourongrong@gmail.com> <5826A498.4000002@huawei.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yw0-x233.google.com (mail-yw0-x233.google.com [IPv6:2607:f8b0:4002:c05::233]) by gabe.freedesktop.org (Postfix) with ESMTPS id 957A26E441 for ; Mon, 14 Nov 2016 17:09:00 +0000 (UTC) Received: by mail-yw0-x233.google.com with SMTP id r204so68137164ywb.0 for ; Mon, 14 Nov 2016 09:09:00 -0800 (PST) Received: from mail-yw0-f180.google.com (mail-yw0-f180.google.com. [209.85.161.180]) by smtp.gmail.com with ESMTPSA id x131sm4793645ywg.49.2016.11.14.09.08.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 14 Nov 2016 09:08:57 -0800 (PST) Received: by mail-yw0-f180.google.com with SMTP id i145so68377735ywg.2 for ; Mon, 14 Nov 2016 09:08:57 -0800 (PST) In-Reply-To: <5826A498.4000002@huawei.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rongrong Zou Cc: Mark Rutland , lijianhua@huawei.com, Will Deacon , Tomeu Vizoso , Jonathan Corbet , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , james.xiong@huawei.com, shenhui@huawei.com, Rongrong Zou , Linux ARM Kernel List-Id: dri-devel@lists.freedesktop.org T24gU2F0LCBOb3YgMTIsIDIwMTYgYXQgMTI6MTEgQU0sIFJvbmdyb25nIFpvdSA8em91cm9uZ3Jv bmdAaHVhd2VpLmNvbT4gd3JvdGU6Cj4g5ZyoIDIwMTYvMTEvMTEgNTo1MywgU2VhbiBQYXVsIOWG memBkzoKPj4KPj4gT24gRnJpLCBPY3QgMjgsIDIwMTYgYXQgMzoyNyBBTSwgUm9uZ3JvbmcgWm91 IDx6b3Vyb25ncm9uZ0BnbWFpbC5jb20+Cj4+IHdyb3RlOgo+Pj4KPj4+IEFkZCBwbGFuZSBmdW5j cyBhbmQgaGVscGVyIGZ1bmNzIGZvciBERS4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBSb25ncm9u ZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPj4+IC0tLQo+Pj4gICBkcml2ZXJzL2dwdS9k cm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcgICAgICAgICB8ICAgMSArCj4+PiAgIGRyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvTWFrZWZpbGUgICAgICAgIHwgICAyICstCj4+PiAgIGRy aXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmMgIHwgMTcwCj4+PiAr KysrKysrKysrKysrKysrKysrKysrKysKPj4+ICAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9o aWJtYy9oaWJtY19kcm1fZGUuaCAgfCAgMjkgKysrKwo+Pj4gICBkcml2ZXJzL2dwdS9kcm0vaGlz aWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYyB8ICA1MSArKysrKystCj4+PiAgIGRyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5oIHwgICA1ICsKPj4+ICAgZHJp dmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY190dG0uYyAgICAgfCAgIDYgKwo+Pj4g ICA3IGZpbGVzIGNoYW5nZWQsIDI2MSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQo+Pj4g ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJt Y19kcm1fZGUuYwo+Pj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2hpc2ls aWNvbi9oaWJtYy9oaWJtY19kcm1fZGUuaAo+Pj4KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2hpc2ls aWNvbi9oaWJtYy9LY29uZmlnCj4+PiBpbmRleCBiY2I4YzE4Li4zODA2MjJhIDEwMDY0NAo+Pj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9LY29uZmlnCj4+PiArKysgYi9k cml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL0tjb25maWcKPj4+IEBAIC0xLDYgKzEsNyBA QAo+Pj4gICBjb25maWcgRFJNX0hJU0lfSElCTUMKPj4+ICAgICAgICAgIHRyaXN0YXRlICJEUk0g U3VwcG9ydCBmb3IgSGlzaWxpY29uIEhpYm1jIgo+Pj4gICAgICAgICAgZGVwZW5kcyBvbiBEUk0g JiYgUENJCj4+PiArICAgICAgIHNlbGVjdCBEUk1fS01TX0hFTFBFUgo+Pj4gICAgICAgICAgc2Vs ZWN0IERSTV9UVE0KPj4+Cj4+PiAgICAgICAgICBoZWxwCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0v aGlzaWxpY29uL2hpYm1jL01ha2VmaWxlCj4+PiBpbmRleCA4MTBhMzdlLi43MmUxMDdlIDEwMDY0 NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+Pj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9NYWtlZmlsZQo+Pj4gQEAgLTEs NSArMSw1IEBACj4+PiAgIGNjZmxhZ3MteSA6PSAtSWluY2x1ZGUvZHJtCj4+PiAtaGlibWMtZHJt LXkgOj0gaGlibWNfZHJtX2Rydi5vIGhpYm1jX2RybV9mYmRldi5vIGhpYm1jX2RybV9wb3dlci5v Cj4+PiBoaWJtY190dG0ubwo+Pj4gK2hpYm1jLWRybS15IDo9IGhpYm1jX2RybV9kcnYubyBoaWJt Y19kcm1fZGUubyBoaWJtY19kcm1fZmJkZXYubwo+Pj4gaGlibWNfZHJtX3Bvd2VyLm8gaGlibWNf dHRtLm8KPj4+Cj4+PiAgIG9iai0kKENPTkZJR19EUk1fSElTSV9ISUJNQykgICArPWhpYm1jLWRy bS5vCj4+PiAgICNvYmoteSArPSBoaWJtYy1kcm0ubwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmMKPj4+IGIvZHJpdmVycy9ncHUv ZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZGUuYwo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPj4+IGluZGV4IDAwMDAwMDAuLjljMWE2OGMKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2RlLmMKPj4+IEBAIC0w LDAgKzEsMTcwIEBACj4+PiArLyogSGlzaWxpY29uIEhpYm1jIFNvQyBkcm0gZHJpdmVyCj4+PiAr ICoKPj4+ICsgKiBCYXNlZCBvbiB0aGUgYm9jaHMgZHJtIGRyaXZlci4KPj4+ICsgKgo+Pj4gKyAq IENvcHlyaWdodCAoYykgMjAxNiBIdWF3ZWkgTGltaXRlZC4KPj4+ICsgKgo+Pj4gKyAqIEF1dGhv cjoKPj4+ICsgKiAgICAgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BodWF3ZWkuY29tPgo+Pj4g KyAqICAgICBSb25ncm9uZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4KPj4+ICsgKiAgICAg Smlhbmh1YSBMaSA8bGlqaWFuaHVhQGh1YXdlaS5jb20+Cj4+PiArICoKPj4+ICsgKiBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQo+Pj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cj4+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4+ICsgKiAoYXQgeW91 ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+Pj4gKyAqCj4+PiArICovCj4+PiArCj4+PiAr I2luY2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+Cj4+PiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWlj X2hlbHBlci5oPgo+Pj4gKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Cj4+PiArI2lu Y2x1ZGUgPGRybS9kcm1fcGxhbmVfaGVscGVyLmg+Cj4+PiArCj4+PiArI2luY2x1ZGUgImhpYm1j X2RybV9kcnYuaCIKPj4+ICsjaW5jbHVkZSAiaGlibWNfZHJtX3JlZ3MuaCIKPj4+ICsjaW5jbHVk ZSAiaGlibWNfZHJtX3Bvd2VyLmgiCj4+PiArCj4+PiArLyoKPj4+IC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K Pj4KPj4KPj4gUmVtb3ZlCj4KPgo+IG9rLCB3aWxsIGRvLCB0aGFua3MuCj4KPj4KPj4+ICsKPj4+ ICtzdGF0aWMgaW50IGhpYm1jX3BsYW5lX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX3BsYW5lICpw bGFuZSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1f cGxhbmVfc3RhdGUgKnN0YXRlKQo+Pj4gK3sKPj4+ICsgICAgICAgc3RydWN0IGRybV9mcmFtZWJ1 ZmZlciAqZmIgPSBzdGF0ZS0+ZmI7Cj4+PiArICAgICAgIHN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9 IHN0YXRlLT5jcnRjOwo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3Rh dGU7Cj4+PiArICAgICAgIHUzMiBzcmNfeCA9IHN0YXRlLT5zcmNfeCA+PiAxNjsKPj4+ICsgICAg ICAgdTMyIHNyY195ID0gc3RhdGUtPnNyY195ID4+IDE2Owo+Pj4gKyAgICAgICB1MzIgc3JjX3cg PSBzdGF0ZS0+c3JjX3cgPj4gMTY7Cj4+PiArICAgICAgIHUzMiBzcmNfaCA9IHN0YXRlLT5zcmNf aCA+PiAxNjsKPj4+ICsgICAgICAgaW50IGNydGNfeCA9IHN0YXRlLT5jcnRjX3g7Cj4+PiArICAg ICAgIGludCBjcnRjX3kgPSBzdGF0ZS0+Y3J0Y195Owo+Pj4gKyAgICAgICB1MzIgY3J0Y193ID0g c3RhdGUtPmNydGNfdzsKPj4+ICsgICAgICAgdTMyIGNydGNfaCA9IHN0YXRlLT5jcnRjX2g7Cj4+ Cj4+Cj4+IEkgZG9uJ3QgdGhpbmsgeW91IGdhaW4gYW55dGhpbmcgd2l0aCB0aGUgY3J0Y18qIHZh cnMKPgo+Cj4gSXQgd291bGQgd29yayB3ZWxsLCBidXQgbG9va3MgcmVkdW5kYW50IGFuZCBub3Qg c2ltcGxlIGVub3VnaCwKPiB3aWxsIGRlbGV0ZSB0aGVtLCB0aGFua3MuCj4KPj4KPj4+ICsKPj4+ ICsgICAgICAgaWYgKCFjcnRjIHx8ICFmYikKPj4+ICsgICAgICAgICAgICAgICByZXR1cm4gMDsK Pj4+ICsKPj4+ICsgICAgICAgY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X2NydGNfc3RhdGUo c3RhdGUtPnN0YXRlLCBjcnRjKTsKPj4+ICsgICAgICAgaWYgKElTX0VSUihjcnRjX3N0YXRlKSkK Pj4+ICsgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsKPj4+ICsKPj4+ ICsgICAgICAgaWYgKHNyY193ICE9IGNydGNfdyB8fCBzcmNfaCAhPSBjcnRjX2gpIHsKPj4+ICsg ICAgICAgICAgICAgICBEUk1fRVJST1IoIlNjYWxlIG5vdCBzdXBwb3J0ISEhXG4iKTsKPj4KPj4K Pj4gSSBsaWtlIHRoZSBlbnRodXNpYXNtLCBidXQgSSB0aGluayBEUk1fREVCVUdfQVRPTUlDIHdv dWxkIGJlIGJldHRlcgo+Cj4KPiBJJ20gc29ycnksIGNhbiB5b3UgZXhwbGFpbiB3aHkgaGVyZSBz aG91bGQgYmUgYW4gRFJNX0RFQlVHX0FUT01JQywKPiB3aGVuIHRoaXMgY29uZGl0aW9uIGlzIGhp dCwgaXQgaXMgcmVhbGx5IGFuIGVycm9yIGFuZCBhdG9taWNfY29tbWl0IHdpbGwKPiBhYm9ydCB3 aXRoIGZhaWx1cmUuCj4KCkkgZG9uJ3QgaGF2ZSBzdHJvbmcgb3BpbmlvbnMsIGJ1dCB0aGlzIGNs YXNzIG9mIGZhaWx1cmUgaXNuJ3QgYSBkcml2ZXIKZXJyb3IsIHNvIG11Y2ggYXMgaW52YWxpZCBp bnB1dCBmcm9tIHVzZXJzcGFjZS4gQXMgc3VjaCwgSSdkIHRlbmQgdG8KY2xhc3NpZnkgaXQgYXMg ZGVidWcgbGV2ZWwuCgpBdCBhbnkgcmF0ZSwga2VlcCBpdCBFUlJPUiBpZiB5b3UgcmVhbGx5IHdh bnQuCgpTZWFuCgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKyAg ICAgICB9Cj4+PiArCj4+PiArICAgICAgIGlmIChzcmNfeCArIHNyY193ID4gZmItPndpZHRoIHx8 Cj4+PiArICAgICAgICAgICBzcmNfeSArIHNyY19oID4gZmItPmhlaWdodCkKPj4KPj4KPj4gVGhl c2Ugc2hvdWxkIGJlIGFscmVhZHkgY292ZXJlZCBpbiBkcm1fYXRvbWljX3BsYW5lX2NoZWNrCj4K Pgo+IHVuZGVyc3Rvb2QsIHRoYW5rcy4KPgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgICBpZiAoY3J0Y194IDwgMCB8fCBjcnRjX3kgPCAwKQo+ Pgo+Pgo+PiBQcmludCBEUk1fREVCVUdfQVRPTUlDIG1lc3NhZ2UgaGVyZQo+Cj4KPiBhZ3JlZWQu IHRoYW5rcy4KPgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+ Pj4gKyAgICAgICBpZiAoY3J0Y194ICsgY3J0Y193ID4gY3J0Y19zdGF0ZS0+YWRqdXN0ZWRfbW9k ZS5oZGlzcGxheSB8fAo+Pj4gKyAgICAgICAgICAgY3J0Y195ICsgY3J0Y19oID4gY3J0Y19zdGF0 ZS0+YWRqdXN0ZWRfbW9kZS52ZGlzcGxheSkKPj4KPj4KPj4gRFJNX0RFQlVHX0FUT01JQyBoZXJl IHRvbwo+Cj4KPiBkaXR0by4KPgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM Owo+Pj4gKwo+Pj4gKyAgICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZv aWQgaGlibWNfcGxhbmVfYXRvbWljX3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9wbGFuZV9z dGF0ZSAqb2xkX3N0YXRlKQo+Pj4gK3sKPj4+ICsgICAgICAgc3RydWN0IGRybV9wbGFuZV9zdGF0 ZSAgKnN0YXRlICA9IHBsYW5lLT5zdGF0ZTsKPj4+ICsgICAgICAgdTMyIHJlZzsKPj4+ICsgICAg ICAgaW50IHJldDsKPj4+ICsgICAgICAgdTY0IGdwdV9hZGRyID0gMDsKPj4+ICsgICAgICAgdW5z aWduZWQgaW50IGxpbmVfbDsKPj4+ICsgICAgICAgc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhp ZGV2ID0KPj4+ICsgICAgICAgICAgICAgICAoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKilwbGFu ZS0+ZGV2LT5kZXZfcHJpdmF0ZTsKPj4+ICsKPj4KPj4KPj4gbml0OiBleHRyYSBsaW5lCj4KPgo+ IHdpbGwgZGVsZXRlLCB0aGFua3MuCj4KPj4+ICsgICAgICAgc3RydWN0IGhpYm1jX2ZyYW1lYnVm ZmVyICpoaWJtY19mYjsKPj4+ICsgICAgICAgc3RydWN0IGhpYm1jX2JvICpibzsKPj4+ICsKPj4+ ICsgICAgICAgaGlibWNfZmIgPSB0b19oaWJtY19mcmFtZWJ1ZmZlcihzdGF0ZS0+ZmIpOwo+Pj4g KyAgICAgICBibyA9IGdlbV90b19oaWJtY19ibyhoaWJtY19mYi0+b2JqKTsKPj4+ICsgICAgICAg cmV0ID0gdHRtX2JvX3Jlc2VydmUoJmJvLT5ibywgdHJ1ZSwgZmFsc2UsIE5VTEwpOwo+Pj4gKyAg ICAgICBpZiAocmV0KQo+Pgo+Pgo+PiBQcmludCBlcnJvcgo+Cj4KPiBhZ3JlZWQsIHRoYW5rcy4K Pgo+Pgo+Pj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPj4+ICsKPj4+ICsgICAgICAgaGlibWNf Ym9fcGluKGJvLCBUVE1fUExfRkxBR19WUkFNLCAmZ3B1X2FkZHIpOwo+Pgo+Pgo+PiBDaGVjayBy ZXR1cm4gdmFsdWUKPgo+Cj4gb2ssIHRoYW5rcy4KPgo+Pgo+Pj4gKyAgICAgICBpZiAocmV0KSB7 Cj4+PiArICAgICAgICAgICAgICAgdHRtX2JvX3VucmVzZXJ2ZSgmYm8tPmJvKTsKPj4+ICsgICAg ICAgICAgICAgICByZXR1cm47Cj4+PiArICAgICAgIH0KPj4+ICsKPj4+ICsgICAgICAgdHRtX2Jv X3VucmVzZXJ2ZSgmYm8tPmJvKTsKPj4KPj4KPj4gTW92ZSB0aGlzIHVwIGJlZm9yZSB0aGUgY29u ZGl0aW9uYWwgc28geW91IGRvbid0IGhhdmUgdG8gY2FsbCBpdCBpbgo+PiBib3RoIGJyYW5jaGVz Cj4KPgo+IHVuZGVyc3Rvb2QsIHRoYW5rcy4KPgo+Pgo+Pj4gKwo+Pj4gKyAgICAgICB3cml0ZWwo Z3B1X2FkZHIsIGhpZGV2LT5tbWlvICsgSElCTUNfQ1JUX0ZCX0FERFJFU1MpOwo+Pj4gKwo+Pj4g KyAgICAgICByZWcgPSBzdGF0ZS0+ZmItPndpZHRoICogKHN0YXRlLT5mYi0+Yml0c19wZXJfcGl4 ZWwgPj4gMyk7Cj4+PiArICAgICAgIC8qIG5vdyBsaW5lX3BhZCBpcyAxNiAqLwo+Pj4gKyAgICAg ICByZWcgPSBQQURESU5HKDE2LCByZWcpOwo+Pj4gKwo+Pj4gKyAgICAgICBsaW5lX2wgPSBzdGF0 ZS0+ZmItPndpZHRoICogc3RhdGUtPmZiLT5iaXRzX3Blcl9waXhlbCAvIDg7Cj4+Cj4+Cj4+IGFi b3ZlLCB5b3UgPj4gMy4gaGVyZSB5b3UgLyA4LCBwaWNrIG9uZT8KPgo+Cj4gaSBwcmVmZXIgLzgg YmVjYXVzZSBpdCBpcyBtb3JlIHJlYWRhYmxlIHRvIGh1bWFuLCBhbHRob3VnaCBpdCBpcyBsZXNz Cj4gZWZmZWN0aXZlCj4gaW4gZXhlY3V0aW5nLgo+CgpJIHRoaW5rIHRoZSBjb21waWxlciB3aWxs IG9wdGltaXplIGl0LCByZWdhcmRsZXNzLgoKU2VhbgoKPj4KPj4+ICsgICAgICAgbGluZV9sID0g UEFERElORygxNiwgbGluZV9sKTsKPj4+ICsgICAgICAgd3JpdGVsKChISUJNQ19DUlRfRkJfV0lE VEhfV0lEVEgocmVnKSAmCj4+PiBISUJNQ19DUlRfRkJfV0lEVEhfV0lEVEhfTUFTSykgfAo+Pj4g KyAgICAgICAgICAgICAgKEhJQk1DX0NSVF9GQl9XSURUSF9PRkZTKGxpbmVfbCkgJgo+Pj4gSElC TUNfQ1JUX0ZCX1dJRFRIX09GRlNfTUFTSyksCj4+PiArICAgICAgICAgICAgICBoaWRldi0+bW1p byArIEhJQk1DX0NSVF9GQl9XSURUSCk7Cj4+PiArCj4+PiArICAgICAgIC8qIFNFVCBQSVhFTCBG T1JNQVQgKi8KPj4+ICsgICAgICAgcmVnID0gcmVhZGwoaGlkZXYtPm1taW8gKyBISUJNQ19DUlRf RElTUF9DVEwpOwo+Pj4gKyAgICAgICByZWcgPSByZWcgJiB+SElCTUNfQ1JUX0RJU1BfQ1RMX0ZP Uk1BVF9NQVNLOwo+Pj4gKyAgICAgICByZWcgPSByZWcgfCAoSElCTUNfQ1JUX0RJU1BfQ1RMX0ZP Uk1BVChzdGF0ZS0+ZmItPmJpdHNfcGVyX3BpeGVsCj4+PiA+PiA0KSAmCj4+PiArICAgICAgICAg ICAgICAgICAgICBISUJNQ19DUlRfRElTUF9DVExfRk9STUFUX01BU0spOwo+Pj4gKyAgICAgICB3 cml0ZWwocmVnLCBoaWRldi0+bW1pbyArIEhJQk1DX0NSVF9ESVNQX0NUTCk7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyB2b2lkIGhpYm1jX3BsYW5lX2F0b21pY19kaXNhYmxlKHN0cnVjdCBkcm1f cGxhbmUgKnBsYW5lLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqb2xkX3N0YXRlKQo+Pj4gK3sKPj4+ICt9Cj4+Cj4+Cj4+ IFRoZSBjYWxsZXIgY2hlY2tzIGZvciBOVUxMLCBubyBuZWVkIHRvIHN0dWIKPgo+Cj4gdGhhbmtz IGZvciBwb2ludGluZyBpdCBvdXQsCj4gd2lsbCByZW1vdmUuCj4KPiBSZWdhcmRzLAo+IFJvbmdy b25nLgo+Cj4+Cj4+PiArCj4+PiArc3RhdGljIGNvbnN0IHUzMiBjaGFubmVsX2Zvcm1hdHMxW10g PSB7Cj4+PiArICAgICAgIERSTV9GT1JNQVRfUkdCNTY1LCBEUk1fRk9STUFUX0JHUjU2NSwgRFJN X0ZPUk1BVF9SR0I4ODgsCj4+PiArICAgICAgIERSTV9GT1JNQVRfQkdSODg4LCBEUk1fRk9STUFU X1hSR0I4ODg4LCBEUk1fRk9STUFUX1hCR1I4ODg4LAo+Pj4gKyAgICAgICBEUk1fRk9STUFUX1JH QkE4ODg4LCBEUk1fRk9STUFUX0JHUkE4ODg4LCBEUk1fRk9STUFUX0FSR0I4ODg4LAo+Pj4gKyAg ICAgICBEUk1fRk9STUFUX0FCR1I4ODg4Cj4+PiArfTsKPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0 IGRybV9wbGFuZV9mdW5jcyBoaWJtY19wbGFuZV9mdW5jcyA9IHsKPj4+ICsgICAgICAgLnVwZGF0 ZV9wbGFuZSAgID0gZHJtX2F0b21pY19oZWxwZXJfdXBkYXRlX3BsYW5lLAo+Pj4gKyAgICAgICAu ZGlzYWJsZV9wbGFuZSAgPSBkcm1fYXRvbWljX2hlbHBlcl9kaXNhYmxlX3BsYW5lLAo+Pj4gKyAg ICAgICAuc2V0X3Byb3BlcnR5ID0gZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfc2V0X3Byb3BlcnR5 LAo+Pj4gKyAgICAgICAuZGVzdHJveSA9IGRybV9wbGFuZV9jbGVhbnVwLAo+Pj4gKyAgICAgICAu cmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9yZXNldCwKPj4+ICsgICAgICAgLmF0b21p Y19kdXBsaWNhdGVfc3RhdGUgPQo+Pj4gZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfZHVwbGljYXRl X3N0YXRlLAo+Pj4gKyAgICAgICAuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hl bHBlcl9wbGFuZV9kZXN0cm95X3N0YXRlLAo+Pj4gK307Cj4+PiArCj4+PiArc3RhdGljIGNvbnN0 IHN0cnVjdCBkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIGhpYm1jX3BsYW5lX2hlbHBlcl9mdW5jcyA9 IHsKPj4+ICsgICAgICAgLmF0b21pY19jaGVjayA9IGhpYm1jX3BsYW5lX2F0b21pY19jaGVjaywK Pj4+ICsgICAgICAgLmF0b21pY191cGRhdGUgPSBoaWJtY19wbGFuZV9hdG9taWNfdXBkYXRlLAo+ Pj4gKyAgICAgICAuYXRvbWljX2Rpc2FibGUgPSBoaWJtY19wbGFuZV9hdG9taWNfZGlzYWJsZSwK Pj4+ICt9Owo+Pj4gKwo+Pj4gK2ludCBoaWJtY19wbGFuZV9pbml0KHN0cnVjdCBoaWJtY19kcm1f ZGV2aWNlICpoaWRldikKPj4+ICt7Cj4+PiArICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBoaWRldi0+ZGV2Owo+Pj4gKyAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSA9ICZoaWRl di0+cGxhbmU7Cj4+PiArICAgICAgIGludCByZXQgPSAwOwo+Pj4gKwo+Pj4gKyAgICAgICAvKgo+ Pj4gKyAgICAgICAgKiBwbGFuZSBpbml0Cj4+PiArICAgICAgICAqIFRPRE86IE5vdyBvbmx5IHN1 cHBvcnQgcHJpbWFyeSBwbGFuZSwgb3ZlcmxheSBwbGFuZXMKPj4+ICsgICAgICAgICogbmVlZCB0 byBkby4KPj4+ICsgICAgICAgICovCj4+PiArICAgICAgIHJldCA9IGRybV91bml2ZXJzYWxfcGxh bmVfaW5pdChkZXYsIHBsYW5lLCAxLCAmaGlibWNfcGxhbmVfZnVuY3MsCj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2Zvcm1hdHMxLAo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShjaGFubmVsX2Zvcm1h dHMxKSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9QTEFO RV9UWVBFX1BSSU1BUlksCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBOVUxMKTsKPj4+ICsgICAgICAgaWYgKHJldCkgewo+Pj4gKyAgICAgICAgICAgICAgIERSTV9F UlJPUigiZmFpbCB0byBpbml0IHBsYW5lISEhXG4iKTsKPj4+ICsgICAgICAgICAgICAgICByZXR1 cm4gcmV0Owo+Pj4gKyAgICAgICB9Cj4+PiArCj4+PiArICAgICAgIGRybV9wbGFuZV9oZWxwZXJf YWRkKHBsYW5lLCAmaGlibWNfcGxhbmVfaGVscGVyX2Z1bmNzKTsKPj4+ICsgICAgICAgcmV0dXJu IDA7Cj4+PiArfQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGli bWMvaGlibWNfZHJtX2RlLmgKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9o aWJtY19kcm1fZGUuaAo+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4+IGluZGV4IDAwMDAwMDAu LjRjZTBkN2IKPj4+IC0tLSAvZGV2L251bGwKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNp bGljb24vaGlibWMvaGlibWNfZHJtX2RlLmgKPj4+IEBAIC0wLDAgKzEsMjkgQEAKPj4+ICsvKiBI aXNpbGljb24gSGlibWMgU29DIGRybSBkcml2ZXIKPj4+ICsgKgo+Pj4gKyAqIEJhc2VkIG9uIHRo ZSBib2NocyBkcm0gZHJpdmVyLgo+Pj4gKyAqCj4+PiArICogQ29weXJpZ2h0IChjKSAyMDE2IEh1 YXdlaSBMaW1pdGVkLgo+Pj4gKyAqCj4+PiArICogQXV0aG9yOgo+Pj4gKyAqICAgICBSb25ncm9u ZyBab3UgPHpvdXJvbmdyb25nQGh1YXdlaS5jb20+Cj4+PiArICogICAgIFJvbmdyb25nIFpvdSA8 em91cm9uZ3JvbmdAZ21haWwuY29tPgo+Pj4gKyAqICAgICBKaWFuaHVhIExpIDxsaWppYW5odWFA aHVhd2VpLmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+PiArICogaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg YnkKPj4+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLCBvcgo+Pj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCj4+PiArICoKPj4+ICsgKi8KPj4+ICsKPj4+ICsjaWZuZGVmIEhJQk1DX0RSTV9ERV9I Cj4+PiArI2RlZmluZSBISUJNQ19EUk1fREVfSAo+Pj4gKwo+Pj4gK3N0cnVjdCBwYW5lbF9wbGwg ewo+Pj4gKyAgICAgICB1bnNpZ25lZCBsb25nIE07Cj4+PiArICAgICAgIHVuc2lnbmVkIGxvbmcg TjsKPj4+ICsgICAgICAgdW5zaWduZWQgbG9uZyBPRDsKPj4+ICsgICAgICAgdW5zaWduZWQgbG9u ZyBQT0Q7Cj4+PiArfTsKPj4+ICsKPj4+ICsjZW5kaWYKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYwo+Pj4gYi9kcml2ZXJzL2dw dS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYwo+Pj4gaW5kZXggNWFjN2E3ZS4u N2Q5NjU4MyAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMv aGlibWNfZHJtX2Rydi5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kcnYuYwo+Pj4gQEAgLTE4LDYgKzE4LDcgQEAKPj4+Cj4+PiAgICNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KPj4+ICAgI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KPj4+ICsj aW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+Pj4KPj4+ICAgI2luY2x1ZGUgImhpYm1j X2RybV9kcnYuaCIKPj4+ICAgI2luY2x1ZGUgImhpYm1jX2RybV9yZWdzLmgiCj4+PiBAQCAtNDcs OCArNDgsOCBAQCBzdGF0aWMgdm9pZCBoaWJtY19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2Rl dmljZQo+Pj4gKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCj4+PiAgIH0KPj4+Cj4+PiAgIHN0YXRp YyBzdHJ1Y3QgZHJtX2RyaXZlciBoaWJtY19kcml2ZXIgPSB7Cj4+PiAtICAgICAgIC5kcml2ZXJf ZmVhdHVyZXMgICAgICAgID0gRFJJVkVSX0dFTSwKPj4+IC0KPj4+ICsgICAgICAgLmRyaXZlcl9m ZWF0dXJlcyAgICAgICAgPSBEUklWRVJfR0VNIHwgRFJJVkVSX01PREVTRVQgfAo+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSSVZFUl9BVE9NSUMsCj4+PiAgICAgICAgICAu Zm9wcyAgICAgICAgICAgICAgICAgICA9ICZoaWJtY19mb3BzLAo+Pj4gICAgICAgICAgLm5hbWUg ICAgICAgICAgICAgICAgICAgPSAiaGlibWMiLAo+Pj4gICAgICAgICAgLmRhdGUgICAgICAgICAg ICAgICAgICAgPSAiMjAxNjA4MjgiLAo+Pj4gQEAgLTcwLDYgKzcxLDcgQEAgc3RhdGljIGludCBo aWJtY19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICAgICAgICAgIHN0cnVjdCBk cm1fZGV2aWNlICpkcm1fZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwo+Pj4gICAgICAgICAg c3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2ID0gZHJtX2Rldi0+ZGV2X3ByaXZhdGU7Cj4+ Pgo+Pj4gKyAgICAgICBkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZHJtX2Rldik7Cj4+PiAg ICAgICAgICBkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kX3VubG9ja2VkKCZoaWRldi0+ZmJkZXYt PmhlbHBlciwgMSk7Cj4+Pgo+Pj4gICAgICAgICAgcmV0dXJuIDA7Cj4+PiBAQCAtODEsNyArODMs OSBAQCBzdGF0aWMgaW50IGhpYm1jX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+PiAg ICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2 KTsKPj4+ICAgICAgICAgIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRldiA9IGRybV9kZXYt PmRldl9wcml2YXRlOwo+Pj4KPj4+ICsgICAgICAgZHJtX2hlbHBlcl9yZXN1bWVfZm9yY2VfbW9k ZShkcm1fZGV2KTsKPj4+ICAgICAgICAgIGRybV9mYl9oZWxwZXJfc2V0X3N1c3BlbmRfdW5sb2Nr ZWQoJmhpZGV2LT5mYmRldi0+aGVscGVyLCAwKTsKPj4+ICsgICAgICAgZHJtX2ttc19oZWxwZXJf cG9sbF9lbmFibGUoZHJtX2Rldik7Cj4+Pgo+Pj4gICAgICAgICAgcmV0dXJuIDA7Cj4+PiAgIH0K Pj4+IEBAIC05MSw2ICs5NSw0MSBAQCBzdGF0aWMgaW50IGhpYm1jX3BtX3Jlc3VtZShzdHJ1Y3Qg ZGV2aWNlICpkZXYpCj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWJtY19w bV9yZXN1bWUpCj4+PiAgIH07Cj4+Pgo+Pj4gK3N0YXRpYyBpbnQgaGlibWNfa21zX2luaXQoc3Ry dWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2KQo+Pj4gK3sKPj4+ICsgICAgICAgaW50IHJldDsK Pj4+ICsKPj4+ICsgICAgICAgZHJtX21vZGVfY29uZmlnX2luaXQoaGlkZXYtPmRldik7Cj4+PiAr ICAgICAgIGhpZGV2LT5tb2RlX2NvbmZpZ19pbml0aWFsaXplZCA9IHRydWU7Cj4+PiArCj4+PiAr ICAgICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLm1pbl93aWR0aCA9IDA7Cj4+PiArICAgICAg IGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSAwOwo+Pj4gKyAgICAgICBoaWRl di0+ZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSAxOTIwOwo+Pj4gKyAgICAgICBoaWRldi0+ ZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gMTQ0MDsKPj4+ICsKPj4+ICsgICAgICAgaGlk ZXYtPmRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGhpZGV2LT5mYl9iYXNlOwo+Pj4gKyAgICAg ICBoaWRldi0+ZGV2LT5tb2RlX2NvbmZpZy5wcmVmZXJyZWRfZGVwdGggPSAyNDsKPj4+ICsgICAg ICAgaGlkZXYtPmRldi0+bW9kZV9jb25maWcucHJlZmVyX3NoYWRvdyA9IDA7Cj4+PiArCj4+PiAr ICAgICAgIGhpZGV2LT5kZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmaGlibWNfbW9k ZV9mdW5jczsKPj4+ICsKPj4+ICsgICAgICAgcmV0ID0gaGlibWNfcGxhbmVfaW5pdChoaWRldik7 Cj4+PiArICAgICAgIGlmIChyZXQpIHsKPj4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZh aWwgdG8gaW5pdCBwbGFuZSEhIVxuIik7Cj4+PiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsK Pj4+ICsgICAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgICByZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+ PiArc3RhdGljIHZvaWQgaGlibWNfa21zX2Zpbmkoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhp ZGV2KQo+Pj4gK3sKPj4+ICsgICAgICAgaWYgKGhpZGV2LT5tb2RlX2NvbmZpZ19pbml0aWFsaXpl ZCkgewo+Pj4gKyAgICAgICAgICAgICAgIGRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGhpZGV2LT5k ZXYpOwo+Pj4gKyAgICAgICAgICAgICAgIGhpZGV2LT5tb2RlX2NvbmZpZ19pbml0aWFsaXplZCA9 IGZhbHNlOwo+Pj4gKyAgICAgICB9Cj4+PiArfQo+Pj4gKwo+Pj4gICBzdGF0aWMgaW50IGhpYm1j X2h3X2NvbmZpZyhzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4+PiAgIHsKPj4+ICAg ICAgICAgIHVuc2lnbmVkIGludCByZWc7Cj4+PiBAQCAtMTgzLDYgKzIyMiw3IEBAIHN0YXRpYyBp bnQgaGlibWNfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4+PiAgICAgICAgICBzdHJ1 Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYgPSBkZXYtPmRldl9wcml2YXRlOwo+Pj4KPj4+ICAg ICAgICAgIGhpYm1jX2ZiZGV2X2ZpbmkoaGlkZXYpOwo+Pj4gKyAgICAgICBoaWJtY19rbXNfZmlu aShoaWRldik7Cj4+PiAgICAgICAgICBoaWJtY19tbV9maW5pKGhpZGV2KTsKPj4+ICAgICAgICAg IGhpYm1jX2h3X2ZpbmkoaGlkZXYpOwo+Pj4gICAgICAgICAgZGV2LT5kZXZfcHJpdmF0ZSA9IE5V TEw7Cj4+PiBAQCAtMjA4LDYgKzI0OCwxMyBAQCBzdGF0aWMgaW50IGhpYm1jX2xvYWQoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwKPj4+IHVuc2lnbmVkIGxvbmcgZmxhZ3MpCj4+PiAgICAgICAgICBp ZiAocmV0KQo+Pj4gICAgICAgICAgICAgICAgICBnb3RvIGVycjsKPj4+Cj4+PiArICAgICAgIHJl dCA9IGhpYm1jX2ttc19pbml0KGhpZGV2KTsKPj4+ICsgICAgICAgaWYgKHJldCkKPj4+ICsgICAg ICAgICAgICAgICBnb3RvIGVycjsKPj4+ICsKPj4+ICsgICAgICAgLyogcmVzZXQgYWxsIHRoZSBz dGF0ZXMgb2YgY3J0Yy9wbGFuZS9lbmNvZGVyL2Nvbm5lY3RvciAqLwo+Pj4gKyAgICAgICBkcm1f bW9kZV9jb25maWdfcmVzZXQoZGV2KTsKPj4+ICsKPj4+ICAgICAgICAgIHJldCA9IGhpYm1jX2Zi ZGV2X2luaXQoaGlkZXYpOwo+Pj4gICAgICAgICAgaWYgKHJldCkKPj4+ICAgICAgICAgICAgICAg ICAgZ290byBlcnI7Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9o aWJtYy9oaWJtY19kcm1fZHJ2LmgKPj4+IGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJt Yy9oaWJtY19kcm1fZHJ2LmgKPj4+IGluZGV4IGE0MGU5YTcuLjQ5ZTM5ZDIgMTAwNjQ0Cj4+PiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuaAo+Pj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmgKPj4+ IEBAIC00NSw2ICs0NSw4IEBAIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlIHsKPj4+Cj4+PiAgICAg ICAgICAvKiBkcm0gKi8KPj4+ICAgICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICAqZGV2Owo+Pj4g KyAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lIHBsYW5lOwo+Pj4gKyAgICAgICBib29sIG1vZGVfY29u ZmlnX2luaXRpYWxpemVkOwo+Pj4KPj4+ICAgICAgICAgIC8qIHR0bSAqLwo+Pj4gICAgICAgICAg c3RydWN0IHsKPj4+IEBAIC04Miw2ICs4NCw3IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhpYm1j X2JvICpnZW1fdG9faGlibWNfYm8oc3RydWN0Cj4+PiBkcm1fZ2VtX29iamVjdCAqZ2VtKQo+Pj4K Pj4+ICAgI2RlZmluZSBEUk1fRklMRV9QQUdFX09GRlNFVCAoMHgxMDAwMDAwMDBVTEwgPj4gUEFH RV9TSElGVCkKPj4+Cj4+PiAraW50IGhpYm1jX3BsYW5lX2luaXQoc3RydWN0IGhpYm1jX2RybV9k ZXZpY2UgKmhpZGV2KTsKPj4+ICAgaW50IGhpYm1jX2ZiZGV2X2luaXQoc3RydWN0IGhpYm1jX2Ry bV9kZXZpY2UgKmhpZGV2KTsKPj4+ICAgdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJt Y19kcm1fZGV2aWNlICpoaWRldik7Cj4+Pgo+Pj4gQEAgLTEwMiw0ICsxMDUsNiBAQCBpbnQgaGli bWNfZHVtYl9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCj4+PiBzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LAo+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBoYW5kbGUs IHU2NCAqb2Zmc2V0KTsKPj4+ICAgaW50IGhpYm1jX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0 cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKPj4+Cj4+PiArZXh0ZXJuIGNvbnN0IHN0cnVjdCBk cm1fbW9kZV9jb25maWdfZnVuY3MgaGlibWNfbW9kZV9mdW5jczsKPj4+ICsKPj4+ICAgI2VuZGlm Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY190 dG0uYwo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX3R0bS5jCj4+ PiBpbmRleCA5ODIyZjYyLi5iZWI0ZDc2IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2hpc2lsaWNvbi9oaWJtYy9oaWJtY190dG0uYwo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2hp c2lsaWNvbi9oaWJtYy9oaWJtY190dG0uYwo+Pj4gQEAgLTU1NCwzICs1NTQsOSBAQCBzdHJ1Y3Qg aGlibWNfZnJhbWVidWZmZXIgKgo+Pj4gICAgICAgICAgfQo+Pj4gICAgICAgICAgcmV0dXJuICZo aWJtY19mYi0+ZmI7Cj4+PiAgIH0KPj4+ICsKPj4+ICtjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29u ZmlnX2Z1bmNzIGhpYm1jX21vZGVfZnVuY3MgPSB7Cj4+PiArICAgICAgIC5hdG9taWNfY2hlY2sg PSBkcm1fYXRvbWljX2hlbHBlcl9jaGVjaywKPj4+ICsgICAgICAgLmF0b21pY19jb21taXQgPSBk cm1fYXRvbWljX2hlbHBlcl9jb21taXQsCj4+PiArICAgICAgIC5mYl9jcmVhdGUgPSBoaWJtY191 c2VyX2ZyYW1lYnVmZmVyX2NyZWF0ZSwKPj4+ICt9Owo+Pj4gLS0KPj4+IDEuOS4xCj4+Pgo+Pj4K Pj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4+PiBs aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+Pj4gbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCj4+PiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwKPj4KPj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KPj4gbGludXhhcm0gbWFpbGluZyBsaXN0Cj4+IGxpbnV4YXJtQGh1 YXdlaS5jb20KPj4gaHR0cDovL3JuZC1vcGVuZXVsZXIuaHVhd2VpLmNvbS9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4YXJtCj4+Cj4+IC4KPj4KPgo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCj4gbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKPiBsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmkt ZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==