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=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ABA21C636C8 for ; Tue, 20 Jul 2021 10:53:54 +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 750AC6108B for ; Tue, 20 Jul 2021 10:53:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 750AC6108B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E103D89842; Tue, 20 Jul 2021 10:53:52 +0000 (UTC) Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [IPv6:2607:f8b0:4864:20::f2d]) by gabe.freedesktop.org (Postfix) with ESMTPS id 538D989471; Tue, 20 Jul 2021 10:53:50 +0000 (UTC) Received: by mail-qv1-xf2d.google.com with SMTP id o31so4489742qvo.1; Tue, 20 Jul 2021 03:53:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=tBTuc7Iq+lu2XvSD42SCyxBWmZoIbcrFIOYn6sxO2MA=; b=u/sCtSBXopKFzZ7rKpa4aAov0T0h0KP7k6FZ66WuFV/XLTwp2oKbC2tZyAEzdCg1Vf KN6XHFQykKohgCv6KCl+gsWNq3iTGAdFEJh4u0FX+1VR/02JC/Eh5l8yuyI2N49dGqx4 pxiIpGXPvPWLWVokMMdp48MhgOgw3c8AK45EdUp/CZq5WEbrQFSCAvkNxvWqTMlVr+a2 kEUUJVgFzzaxgB9SBlcdBOge8z0ItmfLLVn1iiASxaTCEOaMwe6fUYnIWeyHfTU2pRm6 oUJ6vYLuI4kxtM1+hzB/lEGFK9U59LXpNk+q/ADID3Wzc2EZ566mxrgp1QjZDHmYx4w5 s75g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=tBTuc7Iq+lu2XvSD42SCyxBWmZoIbcrFIOYn6sxO2MA=; b=DzE894s40EQjD+XIKxwVc3mKMDIMck5aFHvkfl8UWoogD9QbPpNQOAW5vV1qyAxs1L bMDQ24gpi52qKpwh/ap0x+ZYAy9zF675dXqJREWqPJfgpHWT9ap8xG7Zi2CYJCPPRTWQ j9ZJTvbtf5vV+SC/d725RFtZno4MFlylwvhlsiPp+EY7cDIe0qUXAPETZIsVp7ZzCwfd kaX1x5RHlDloF9RJ0WD1ai9qG08jZwaTxC22UaXoG34kK/LMTJwucFSEKIz/y3YBWav8 xyksq/P03zdnz4FAAFWo0q1GOirc3ojR9DtEmlSW0KcTTk9rmxsmaDQdwNFJ9jYNmAX5 Sgfw== X-Gm-Message-State: AOAM533fUBmiP5IRufIcU/Ixa8+tihfIZdZHbQdigs+XMdKuCUoBOtPy ZPgWDyRu2AiESR9m0Y5D8cvXDK77fBNcjtrZbws= X-Google-Smtp-Source: ABdhPJxk4noqhD14HYiC9qf+OnA/igIkF3Gys1IvWYFDq+IYVjrCCCIPhf2OR/9S76fKUtxLYaubfL0ZoQH78qsS9Eg= X-Received: by 2002:a0c:e54e:: with SMTP id n14mr29732005qvm.41.1626778429663; Tue, 20 Jul 2021 03:53:49 -0700 (PDT) MIME-Version: 1.0 References: <20210716141426.1904528-1-jason@jlekstrand.net> <20210716141426.1904528-8-jason@jlekstrand.net> In-Reply-To: <20210716141426.1904528-8-jason@jlekstrand.net> From: Matthew Auld Date: Tue, 20 Jul 2021 11:53:23 +0100 Message-ID: Subject: Re: [Intel-gfx] [PATCH 7/7] drm/i915/gem: Migrate to system at dma-buf attach time (v6) To: Jason Ekstrand Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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: =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= , Intel Graphics Development , ML dri-devel Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Fri, 16 Jul 2021 at 15:14, Jason Ekstrand wrote: > > From: Thomas Hellstr=C3=B6m > > Until we support p2p dma or as a complement to that, migrate data > to system memory at dma-buf attach time if possible. > > v2: > - Rebase on dynamic exporter. Update the igt_dmabuf_import_same_driver > selftest to migrate if we are LMEM capable. > v3: > - Migrate also in the pin() callback. > v4: > - Migrate in attach > v5: (jason) > - Lock around the migration > v6: (jason) > - Move the can_migrate check outside the lock > - Rework the selftests to test more migration conditions. In > particular, SMEM, LMEM, and LMEM+SMEM are all checked. > > Signed-off-by: Thomas Hellstr=C3=B6m > Signed-off-by: Michael J. Ruhl > Reported-by: kernel test robot > Signed-off-by: Jason Ekstrand > Reviewed-by: Jason Ekstrand > --- > drivers/gpu/drm/i915/gem/i915_gem_create.c | 2 +- > drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 23 ++++- > drivers/gpu/drm/i915/gem/i915_gem_object.h | 4 + > .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 89 ++++++++++++++++++- > 4 files changed, 112 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_create.c b/drivers/gpu/drm= /i915/gem/i915_gem_create.c > index 039e4f3b39c79..41c4cd3e1ea01 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_create.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_create.c > @@ -82,7 +82,7 @@ static int i915_gem_publish(struct drm_i915_gem_object = *obj, > return 0; > } > > -static struct drm_i915_gem_object * > +struct drm_i915_gem_object * > i915_gem_object_create_user(struct drm_i915_private *i915, u64 size, > struct intel_memory_region **placements, > unsigned int n_placements) > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm= /i915/gem/i915_gem_dmabuf.c > index 9a655f69a0671..5d438b95826b9 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c > @@ -170,8 +170,29 @@ static int i915_gem_dmabuf_attach(struct dma_buf *dm= abuf, > struct dma_buf_attachment *attach) > { > struct drm_i915_gem_object *obj =3D dma_buf_to_obj(dmabuf); > + struct i915_gem_ww_ctx ww; > + int err; > + > + if (!i915_gem_object_can_migrate(obj, INTEL_REGION_SMEM)) > + return -EOPNOTSUPP; > + > + for_i915_gem_ww(&ww, err, true) { > + err =3D i915_gem_object_lock(obj, &ww); > + if (err) > + continue; > + > + err =3D i915_gem_object_migrate(obj, &ww, INTEL_REGION_SM= EM); > + if (err) > + continue; > > - return i915_gem_object_pin_pages_unlocked(obj); > + err =3D i915_gem_object_wait_migration(obj, 0); > + if (err) > + continue; > + > + err =3D i915_gem_object_pin_pages(obj); > + } > + > + return err; > } > > static void i915_gem_dmabuf_detach(struct dma_buf *dmabuf, > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm= /i915/gem/i915_gem_object.h > index 8be4fadeee487..fbae53bd46384 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h > @@ -61,6 +61,10 @@ i915_gem_object_create_shmem(struct drm_i915_private *= i915, > struct drm_i915_gem_object * > i915_gem_object_create_shmem_from_data(struct drm_i915_private *i915, > const void *data, resource_size_t = size); > +struct drm_i915_gem_object * > +i915_gem_object_create_user(struct drm_i915_private *i915, u64 size, > + struct intel_memory_region **placements, > + unsigned int n_placements); > > extern const struct drm_i915_gem_object_ops i915_gem_shmem_ops; > > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drive= rs/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c > index 4451bbb4917e4..7b7647e7e220a 100644 > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c > @@ -85,9 +85,62 @@ static int igt_dmabuf_import_self(void *arg) > return err; > } > > -static int igt_dmabuf_import_same_driver(void *arg) > +static int igt_dmabuf_import_same_driver_lmem(void *arg) > { > struct drm_i915_private *i915 =3D arg; > + struct intel_memory_region *lmem =3D i915->mm.regions[INTEL_REGIO= N_LMEM]; > + struct drm_i915_gem_object *obj; > + struct drm_gem_object *import; > + struct dma_buf *dmabuf; > + int err; > + > + if (!i915->mm.regions[INTEL_REGION_LMEM]) !lmem > + return 0; > + > + force_different_devices =3D true; > + > + obj =3D i915_gem_object_create_user(i915, PAGE_SIZE, &lmem, 1); > + if (IS_ERR(obj)) { > + pr_err("i915_gem_object_create_user failed with err=3D%d\= n", > + (int)PTR_ERR(dmabuf)); PTR_ERR(obj) > + err =3D PTR_ERR(obj); > + goto out_ret; > + } > + > + dmabuf =3D i915_gem_prime_export(&obj->base, 0); > + if (IS_ERR(dmabuf)) { > + pr_err("i915_gem_prime_export failed with err=3D%d\n", > + (int)PTR_ERR(dmabuf)); > + err =3D PTR_ERR(dmabuf); > + goto out; > + } > + > + /* We expect an import of an LMEM-only object to fail with > + * -EOPNOTSUPP because it can't be migrated to SMEM. > + */ /* * We expect... */ > + import =3D i915_gem_prime_import(&i915->drm, dmabuf); > + if (!IS_ERR(import)) { > + drm_gem_object_put(import); > + pr_err("i915_gem_prime_import succeeded when it shouldn't= have\n"); > + err =3D -EINVAL; > + } else if (PTR_ERR(import) !=3D -EOPNOTSUPP) { > + pr_err("i915_gem_prime_import failed with the wrong err= =3D%d\n", > + (int)PTR_ERR(import)); > + err =3D PTR_ERR(import); > + } > + > + dma_buf_put(dmabuf); > +out: > + i915_gem_object_put(obj); > +out_ret: > + force_different_devices =3D false; > + return err; > +} > + > +static int igt_dmabuf_import_same_driver(struct drm_i915_private *i915, > + struct intel_memory_region **reg= ions, > + unsigned int num_regions) > +{ > struct drm_i915_gem_object *obj, *import_obj; > struct drm_gem_object *import; > struct dma_buf *dmabuf; > @@ -97,9 +150,15 @@ static int igt_dmabuf_import_same_driver(void *arg) > int err; > > force_different_devices =3D true; > - obj =3D i915_gem_object_create_shmem(i915, PAGE_SIZE); > - if (IS_ERR(obj)) > + > + obj =3D i915_gem_object_create_user(i915, PAGE_SIZE, > + regions, num_regions); > + if (IS_ERR(obj)) { > + pr_err("i915_gem_object_create_user failed with err=3D%d\= n", > + (int)PTR_ERR(dmabuf)); PTR_ERR(obj) > + err =3D PTR_ERR(obj); > goto out_ret; > + } > > dmabuf =3D i915_gem_prime_export(&obj->base, 0); > if (IS_ERR(dmabuf)) { > @@ -174,6 +233,26 @@ static int igt_dmabuf_import_same_driver(void *arg) > return err; > } > > +static int igt_dmabuf_import_same_driver_smem(void *arg) > +{ > + struct drm_i915_private *i915 =3D arg; > + struct intel_memory_region *smem =3D i915->mm.regions[INTEL_REGIO= N_SMEM]; Newline. > + return igt_dmabuf_import_same_driver(i915, &smem, 1); > +} > + > +static int igt_dmabuf_import_same_driver_lmem_smem(void *arg) > +{ > + struct drm_i915_private *i915 =3D arg; > + struct intel_memory_region *regions[2]; > + > + if (!i915->mm.regions[INTEL_REGION_LMEM]) > + return 0; > + > + regions[0] =3D i915->mm.regions[INTEL_REGION_LMEM]; > + regions[1] =3D i915->mm.regions[INTEL_REGION_SMEM]; > + return igt_dmabuf_import_same_driver(i915, regions, 2); > +} > + > static int igt_dmabuf_import(void *arg) > { > struct drm_i915_private *i915 =3D arg; > @@ -384,7 +463,9 @@ int i915_gem_dmabuf_live_selftests(struct drm_i915_pr= ivate *i915) > { > static const struct i915_subtest tests[] =3D { > SUBTEST(igt_dmabuf_export), > - SUBTEST(igt_dmabuf_import_same_driver), > + SUBTEST(igt_dmabuf_import_same_driver_lmem), > + SUBTEST(igt_dmabuf_import_same_driver_smem), > + SUBTEST(igt_dmabuf_import_same_driver_lmem_smem), > }; > > return i915_subtests(tests, i915); > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx 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=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AB84C07E95 for ; Tue, 20 Jul 2021 10:53:53 +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 A86606108B for ; Tue, 20 Jul 2021 10:53:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A86606108B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5F20789471; Tue, 20 Jul 2021 10:53:52 +0000 (UTC) Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [IPv6:2607:f8b0:4864:20::f2d]) by gabe.freedesktop.org (Postfix) with ESMTPS id 538D989471; Tue, 20 Jul 2021 10:53:50 +0000 (UTC) Received: by mail-qv1-xf2d.google.com with SMTP id o31so4489742qvo.1; Tue, 20 Jul 2021 03:53:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=tBTuc7Iq+lu2XvSD42SCyxBWmZoIbcrFIOYn6sxO2MA=; b=u/sCtSBXopKFzZ7rKpa4aAov0T0h0KP7k6FZ66WuFV/XLTwp2oKbC2tZyAEzdCg1Vf KN6XHFQykKohgCv6KCl+gsWNq3iTGAdFEJh4u0FX+1VR/02JC/Eh5l8yuyI2N49dGqx4 pxiIpGXPvPWLWVokMMdp48MhgOgw3c8AK45EdUp/CZq5WEbrQFSCAvkNxvWqTMlVr+a2 kEUUJVgFzzaxgB9SBlcdBOge8z0ItmfLLVn1iiASxaTCEOaMwe6fUYnIWeyHfTU2pRm6 oUJ6vYLuI4kxtM1+hzB/lEGFK9U59LXpNk+q/ADID3Wzc2EZ566mxrgp1QjZDHmYx4w5 s75g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=tBTuc7Iq+lu2XvSD42SCyxBWmZoIbcrFIOYn6sxO2MA=; b=DzE894s40EQjD+XIKxwVc3mKMDIMck5aFHvkfl8UWoogD9QbPpNQOAW5vV1qyAxs1L bMDQ24gpi52qKpwh/ap0x+ZYAy9zF675dXqJREWqPJfgpHWT9ap8xG7Zi2CYJCPPRTWQ j9ZJTvbtf5vV+SC/d725RFtZno4MFlylwvhlsiPp+EY7cDIe0qUXAPETZIsVp7ZzCwfd kaX1x5RHlDloF9RJ0WD1ai9qG08jZwaTxC22UaXoG34kK/LMTJwucFSEKIz/y3YBWav8 xyksq/P03zdnz4FAAFWo0q1GOirc3ojR9DtEmlSW0KcTTk9rmxsmaDQdwNFJ9jYNmAX5 Sgfw== X-Gm-Message-State: AOAM533fUBmiP5IRufIcU/Ixa8+tihfIZdZHbQdigs+XMdKuCUoBOtPy ZPgWDyRu2AiESR9m0Y5D8cvXDK77fBNcjtrZbws= X-Google-Smtp-Source: ABdhPJxk4noqhD14HYiC9qf+OnA/igIkF3Gys1IvWYFDq+IYVjrCCCIPhf2OR/9S76fKUtxLYaubfL0ZoQH78qsS9Eg= X-Received: by 2002:a0c:e54e:: with SMTP id n14mr29732005qvm.41.1626778429663; Tue, 20 Jul 2021 03:53:49 -0700 (PDT) MIME-Version: 1.0 References: <20210716141426.1904528-1-jason@jlekstrand.net> <20210716141426.1904528-8-jason@jlekstrand.net> In-Reply-To: <20210716141426.1904528-8-jason@jlekstrand.net> From: Matthew Auld Date: Tue, 20 Jul 2021 11:53:23 +0100 Message-ID: To: Jason Ekstrand Subject: Re: [Intel-gfx] [PATCH 7/7] drm/i915/gem: Migrate to system at dma-buf attach time (v6) X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?Q?Thomas_Hellstr=C3=B6m?= , Intel Graphics Development , ML dri-devel Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gRnJpLCAxNiBKdWwgMjAyMSBhdCAxNToxNCwgSmFzb24gRWtzdHJhbmQgPGphc29uQGpsZWtz dHJhbmQubmV0PiB3cm90ZToKPgo+IEZyb206IFRob21hcyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVs bHN0cm9tQGxpbnV4LmludGVsLmNvbT4KPgo+IFVudGlsIHdlIHN1cHBvcnQgcDJwIGRtYSBvciBh cyBhIGNvbXBsZW1lbnQgdG8gdGhhdCwgbWlncmF0ZSBkYXRhCj4gdG8gc3lzdGVtIG1lbW9yeSBh dCBkbWEtYnVmIGF0dGFjaCB0aW1lIGlmIHBvc3NpYmxlLgo+Cj4gdjI6Cj4gLSBSZWJhc2Ugb24g ZHluYW1pYyBleHBvcnRlci4gVXBkYXRlIHRoZSBpZ3RfZG1hYnVmX2ltcG9ydF9zYW1lX2RyaXZl cgo+ICAgc2VsZnRlc3QgdG8gbWlncmF0ZSBpZiB3ZSBhcmUgTE1FTSBjYXBhYmxlLgo+IHYzOgo+ IC0gTWlncmF0ZSBhbHNvIGluIHRoZSBwaW4oKSBjYWxsYmFjay4KPiB2NDoKPiAtIE1pZ3JhdGUg aW4gYXR0YWNoCj4gdjU6IChqYXNvbikKPiAtIExvY2sgYXJvdW5kIHRoZSBtaWdyYXRpb24KPiB2 NjogKGphc29uKQo+IC0gTW92ZSB0aGUgY2FuX21pZ3JhdGUgY2hlY2sgb3V0c2lkZSB0aGUgbG9j awo+IC0gUmV3b3JrIHRoZSBzZWxmdGVzdHMgdG8gdGVzdCBtb3JlIG1pZ3JhdGlvbiBjb25kaXRp b25zLiAgSW4KPiAgIHBhcnRpY3VsYXIsIFNNRU0sIExNRU0sIGFuZCBMTUVNK1NNRU0gYXJlIGFs bCBjaGVja2VkLgo+Cj4gU2lnbmVkLW9mZi1ieTogVGhvbWFzIEhlbGxzdHLDtm0gPHRob21hcy5o ZWxsc3Ryb21AbGludXguaW50ZWwuY29tPgo+IFNpZ25lZC1vZmYtYnk6IE1pY2hhZWwgSi4gUnVo bCA8bWljaGFlbC5qLnJ1aGxAaW50ZWwuY29tPgo+IFJlcG9ydGVkLWJ5OiBrZXJuZWwgdGVzdCBy b2JvdCA8bGtwQGludGVsLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBFa3N0cmFuZCA8amFz b25Aamxla3N0cmFuZC5uZXQ+Cj4gUmV2aWV3ZWQtYnk6IEphc29uIEVrc3RyYW5kIDxqYXNvbkBq bGVrc3RyYW5kLm5ldD4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2Vt X2NyZWF0ZS5jICAgIHwgIDIgKy0KPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2Vt X2RtYWJ1Zi5jICAgIHwgMjMgKysrKy0KPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX29iamVjdC5oICAgIHwgIDQgKwo+ICAuLi4vZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1 X2dlbV9kbWFidWYuYyAgfCA4OSArKysrKysrKysrKysrKysrKystCj4gIDQgZmlsZXMgY2hhbmdl ZCwgMTEyIGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NyZWF0ZS5jIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL2k5MTVfZ2VtX2NyZWF0ZS5jCj4gaW5kZXggMDM5ZTRmM2IzOWM3OS4uNDFjNGNk M2UxZWEwMSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1f Y3JlYXRlLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY3JlYXRl LmMKPiBAQCAtODIsNyArODIsNyBAQCBzdGF0aWMgaW50IGk5MTVfZ2VtX3B1Ymxpc2goc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKPiAgICAgICAgIHJldHVybiAwOwo+ICB9Cj4KPiAt c3RhdGljIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoKPiArc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKgo+ICBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3VzZXIoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUsIHU2NCBzaXplLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqKnBsYWNlbWVudHMsCj4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuX3BsYWNlbWVudHMpCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9kbWFidWYuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2dlbS9pOTE1X2dlbV9kbWFidWYuYwo+IGluZGV4IDlhNjU1ZjY5YTA2NzEuLjVkNDM4 Yjk1ODI2YjkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2Vt X2RtYWJ1Zi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2RtYWJ1 Zi5jCj4gQEAgLTE3MCw4ICsxNzAsMjkgQEAgc3RhdGljIGludCBpOTE1X2dlbV9kbWFidWZfYXR0 YWNoKHN0cnVjdCBkbWFfYnVmICpkbWFidWYsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaCkKPiAgewo+ICAgICAgICAg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGRtYV9idWZfdG9fb2JqKGRtYWJ1Zik7 Cj4gKyAgICAgICBzdHJ1Y3QgaTkxNV9nZW1fd3dfY3R4IHd3Owo+ICsgICAgICAgaW50IGVycjsK PiArCj4gKyAgICAgICBpZiAoIWk5MTVfZ2VtX29iamVjdF9jYW5fbWlncmF0ZShvYmosIElOVEVM X1JFR0lPTl9TTUVNKSkKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsK PiArICAgICAgIGZvcl9pOTE1X2dlbV93dygmd3csIGVyciwgdHJ1ZSkgewo+ICsgICAgICAgICAg ICAgICBlcnIgPSBpOTE1X2dlbV9vYmplY3RfbG9jayhvYmosICZ3dyk7Cj4gKyAgICAgICAgICAg ICAgIGlmIChlcnIpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gKwo+ICsg ICAgICAgICAgICAgICBlcnIgPSBpOTE1X2dlbV9vYmplY3RfbWlncmF0ZShvYmosICZ3dywgSU5U RUxfUkVHSU9OX1NNRU0pOwo+ICsgICAgICAgICAgICAgICBpZiAoZXJyKQo+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNvbnRpbnVlOwo+Cj4gLSAgICAgICByZXR1cm4gaTkxNV9nZW1fb2JqZWN0 X3Bpbl9wYWdlc191bmxvY2tlZChvYmopOwo+ICsgICAgICAgICAgICAgICBlcnIgPSBpOTE1X2dl bV9vYmplY3Rfd2FpdF9taWdyYXRpb24ob2JqLCAwKTsKPiArICAgICAgICAgICAgICAgaWYgKGVy cikKPiArICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiArCj4gKyAgICAgICAgICAg ICAgIGVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKPiArICAgICAgIH0KPiAr Cj4gKyAgICAgICByZXR1cm4gZXJyOwo+ICB9Cj4KPiAgc3RhdGljIHZvaWQgaTkxNV9nZW1fZG1h YnVmX2RldGFjaChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmLAo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9nZW0vaTkxNV9nZW1fb2JqZWN0LmgKPiBpbmRleCA4YmU0ZmFkZWVlNDg3Li5mYmFlNTNiZDQ2 Mzg0IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmpl Y3QuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAo+ IEBAIC02MSw2ICs2MSwxMCBAQCBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3NobWVtKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1LAo+ICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCj4g IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfc2htZW1fZnJvbV9kYXRhKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICppOTE1LAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IHZvaWQgKmRhdGEsIHJlc291cmNlX3NpemVfdCBzaXplKTsKPiArc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKgo+ICtpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3VzZXIoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUsIHU2NCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHJ1Y3QgaW50ZWxfbWVtb3J5X3JlZ2lvbiAqKnBsYWNlbWVudHMsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuX3BsYWNlbWVudHMpOwo+Cj4gIGV4dGVybiBj b25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgaTkxNV9nZW1fc2htZW1fb3BzOwo+ Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9n ZW1fZG1hYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2Vt X2RtYWJ1Zi5jCj4gaW5kZXggNDQ1MWJiYjQ5MTdlNC4uN2I3NjQ3ZTdlMjIwYSAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX2RtYWJ1Zi5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9kbWFi dWYuYwo+IEBAIC04NSw5ICs4NSw2MiBAQCBzdGF0aWMgaW50IGlndF9kbWFidWZfaW1wb3J0X3Nl bGYodm9pZCAqYXJnKQo+ICAgICAgICAgcmV0dXJuIGVycjsKPiAgfQo+Cj4gLXN0YXRpYyBpbnQg aWd0X2RtYWJ1Zl9pbXBvcnRfc2FtZV9kcml2ZXIodm9pZCAqYXJnKQo+ICtzdGF0aWMgaW50IGln dF9kbWFidWZfaW1wb3J0X3NhbWVfZHJpdmVyX2xtZW0odm9pZCAqYXJnKQo+ICB7Cj4gICAgICAg ICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKPiArICAgICAgIHN0cnVjdCBp bnRlbF9tZW1vcnlfcmVnaW9uICpsbWVtID0gaTkxNS0+bW0ucmVnaW9uc1tJTlRFTF9SRUdJT05f TE1FTV07Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwo+ICsgICAg ICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICppbXBvcnQ7Cj4gKyAgICAgICBzdHJ1Y3QgZG1hX2J1 ZiAqZG1hYnVmOwo+ICsgICAgICAgaW50IGVycjsKPiArCj4gKyAgICAgICBpZiAoIWk5MTUtPm1t LnJlZ2lvbnNbSU5URUxfUkVHSU9OX0xNRU1dKQoKIWxtZW0KCj4gKyAgICAgICAgICAgICAgIHJl dHVybiAwOwo+ICsKPiArICAgICAgIGZvcmNlX2RpZmZlcmVudF9kZXZpY2VzID0gdHJ1ZTsKPiAr Cj4gKyAgICAgICBvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3VzZXIoaTkxNSwgUEFHRV9T SVpFLCAmbG1lbSwgMSk7Cj4gKyAgICAgICBpZiAoSVNfRVJSKG9iaikpIHsKPiArICAgICAgICAg ICAgICAgcHJfZXJyKCJpOTE1X2dlbV9vYmplY3RfY3JlYXRlX3VzZXIgZmFpbGVkIHdpdGggZXJy PSVkXG4iLAo+ICsgICAgICAgICAgICAgICAgICAgICAgKGludClQVFJfRVJSKGRtYWJ1ZikpOwoK UFRSX0VSUihvYmopCgo+ICsgICAgICAgICAgICAgICBlcnIgPSBQVFJfRVJSKG9iaik7Cj4gKyAg ICAgICAgICAgICAgIGdvdG8gb3V0X3JldDsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBkbWFi dWYgPSBpOTE1X2dlbV9wcmltZV9leHBvcnQoJm9iai0+YmFzZSwgMCk7Cj4gKyAgICAgICBpZiAo SVNfRVJSKGRtYWJ1ZikpIHsKPiArICAgICAgICAgICAgICAgcHJfZXJyKCJpOTE1X2dlbV9wcmlt ZV9leHBvcnQgZmFpbGVkIHdpdGggZXJyPSVkXG4iLAo+ICsgICAgICAgICAgICAgICAgICAgICAg KGludClQVFJfRVJSKGRtYWJ1ZikpOwo+ICsgICAgICAgICAgICAgICBlcnIgPSBQVFJfRVJSKGRt YWJ1Zik7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ICsgICAgICAgfQo+ICsKPiArICAg ICAgIC8qIFdlIGV4cGVjdCBhbiBpbXBvcnQgb2YgYW4gTE1FTS1vbmx5IG9iamVjdCB0byBmYWls IHdpdGgKPiArICAgICAgICAqIC1FT1BOT1RTVVBQIGJlY2F1c2UgaXQgY2FuJ3QgYmUgbWlncmF0 ZWQgdG8gU01FTS4KPiArICAgICAgICAqLwoKLyoKICogV2UgZXhwZWN0Li4uCiAqLwoKPiArICAg ICAgIGltcG9ydCA9IGk5MTVfZ2VtX3ByaW1lX2ltcG9ydCgmaTkxNS0+ZHJtLCBkbWFidWYpOwo+ ICsgICAgICAgaWYgKCFJU19FUlIoaW1wb3J0KSkgewo+ICsgICAgICAgICAgICAgICBkcm1fZ2Vt X29iamVjdF9wdXQoaW1wb3J0KTsKPiArICAgICAgICAgICAgICAgcHJfZXJyKCJpOTE1X2dlbV9w cmltZV9pbXBvcnQgc3VjY2VlZGVkIHdoZW4gaXQgc2hvdWxkbid0IGhhdmVcbiIpOwo+ICsgICAg ICAgICAgICAgICBlcnIgPSAtRUlOVkFMOwo+ICsgICAgICAgfSBlbHNlIGlmIChQVFJfRVJSKGlt cG9ydCkgIT0gLUVPUE5PVFNVUFApIHsKPiArICAgICAgICAgICAgICAgcHJfZXJyKCJpOTE1X2dl bV9wcmltZV9pbXBvcnQgZmFpbGVkIHdpdGggdGhlIHdyb25nIGVycj0lZFxuIiwKPiArICAgICAg ICAgICAgICAgICAgICAgIChpbnQpUFRSX0VSUihpbXBvcnQpKTsKPiArICAgICAgICAgICAgICAg ZXJyID0gUFRSX0VSUihpbXBvcnQpOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIGRtYV9idWZf cHV0KGRtYWJ1Zik7Cj4gK291dDoKPiArICAgICAgIGk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsK PiArb3V0X3JldDoKPiArICAgICAgIGZvcmNlX2RpZmZlcmVudF9kZXZpY2VzID0gZmFsc2U7Cj4g KyAgICAgICByZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGlndF9kbWFidWZfaW1w b3J0X3NhbWVfZHJpdmVyKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGludGVsX21lbW9yeV9yZWdp b24gKipyZWdpb25zLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgaW50IG51bV9yZWdpb25zKQo+ICt7Cj4gICAgICAgICBzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLCAqaW1wb3J0X29iajsKPiAgICAgICAgIHN0cnVjdCBkcm1fZ2VtX29i amVjdCAqaW1wb3J0Owo+ICAgICAgICAgc3RydWN0IGRtYV9idWYgKmRtYWJ1ZjsKPiBAQCAtOTcs OSArMTUwLDE1IEBAIHN0YXRpYyBpbnQgaWd0X2RtYWJ1Zl9pbXBvcnRfc2FtZV9kcml2ZXIodm9p ZCAqYXJnKQo+ICAgICAgICAgaW50IGVycjsKPgo+ICAgICAgICAgZm9yY2VfZGlmZmVyZW50X2Rl dmljZXMgPSB0cnVlOwo+IC0gICAgICAgb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9zaG1l bShpOTE1LCBQQUdFX1NJWkUpOwo+IC0gICAgICAgaWYgKElTX0VSUihvYmopKQo+ICsKPiArICAg ICAgIG9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfdXNlcihpOTE1LCBQQUdFX1NJWkUsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucywgbnVtX3Jl Z2lvbnMpOwo+ICsgICAgICAgaWYgKElTX0VSUihvYmopKSB7Cj4gKyAgICAgICAgICAgICAgIHBy X2VycigiaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV91c2VyIGZhaWxlZCB3aXRoIGVycj0lZFxuIiwK PiArICAgICAgICAgICAgICAgICAgICAgIChpbnQpUFRSX0VSUihkbWFidWYpKTsKClBUUl9FUlIo b2JqKQoKPiArICAgICAgICAgICAgICAgZXJyID0gUFRSX0VSUihvYmopOwo+ICAgICAgICAgICAg ICAgICBnb3RvIG91dF9yZXQ7Cj4gKyAgICAgICB9Cj4KPiAgICAgICAgIGRtYWJ1ZiA9IGk5MTVf Z2VtX3ByaW1lX2V4cG9ydCgmb2JqLT5iYXNlLCAwKTsKPiAgICAgICAgIGlmIChJU19FUlIoZG1h YnVmKSkgewo+IEBAIC0xNzQsNiArMjMzLDI2IEBAIHN0YXRpYyBpbnQgaWd0X2RtYWJ1Zl9pbXBv cnRfc2FtZV9kcml2ZXIodm9pZCAqYXJnKQo+ICAgICAgICAgcmV0dXJuIGVycjsKPiAgfQo+Cj4g K3N0YXRpYyBpbnQgaWd0X2RtYWJ1Zl9pbXBvcnRfc2FtZV9kcml2ZXJfc21lbSh2b2lkICphcmcp Cj4gK3sKPiArICAgICAgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOwo+ICsg ICAgICAgc3RydWN0IGludGVsX21lbW9yeV9yZWdpb24gKnNtZW0gPSBpOTE1LT5tbS5yZWdpb25z W0lOVEVMX1JFR0lPTl9TTUVNXTsKCk5ld2xpbmUuCgo+ICsgICAgICAgcmV0dXJuIGlndF9kbWFi dWZfaW1wb3J0X3NhbWVfZHJpdmVyKGk5MTUsICZzbWVtLCAxKTsKPiArfQo+ICsKPiArc3RhdGlj IGludCBpZ3RfZG1hYnVmX2ltcG9ydF9zYW1lX2RyaXZlcl9sbWVtX3NtZW0odm9pZCAqYXJnKQo+ ICt7Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKPiArICAg ICAgIHN0cnVjdCBpbnRlbF9tZW1vcnlfcmVnaW9uICpyZWdpb25zWzJdOwo+ICsKPiArICAgICAg IGlmICghaTkxNS0+bW0ucmVnaW9uc1tJTlRFTF9SRUdJT05fTE1FTV0pCj4gKyAgICAgICAgICAg ICAgIHJldHVybiAwOwo+ICsKPiArICAgICAgIHJlZ2lvbnNbMF0gPSBpOTE1LT5tbS5yZWdpb25z W0lOVEVMX1JFR0lPTl9MTUVNXTsKPiArICAgICAgIHJlZ2lvbnNbMV0gPSBpOTE1LT5tbS5yZWdp b25zW0lOVEVMX1JFR0lPTl9TTUVNXTsKPiArICAgICAgIHJldHVybiBpZ3RfZG1hYnVmX2ltcG9y dF9zYW1lX2RyaXZlcihpOTE1LCByZWdpb25zLCAyKTsKPiArfQo+ICsKPiAgc3RhdGljIGludCBp Z3RfZG1hYnVmX2ltcG9ydCh2b2lkICphcmcpCj4gIHsKPiAgICAgICAgIHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICppOTE1ID0gYXJnOwo+IEBAIC0zODQsNyArNDYzLDkgQEAgaW50IGk5MTVfZ2Vt X2RtYWJ1Zl9saXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiAg ewo+ICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsK PiAgICAgICAgICAgICAgICAgU1VCVEVTVChpZ3RfZG1hYnVmX2V4cG9ydCksCj4gLSAgICAgICAg ICAgICAgIFNVQlRFU1QoaWd0X2RtYWJ1Zl9pbXBvcnRfc2FtZV9kcml2ZXIpLAo+ICsgICAgICAg ICAgICAgICBTVUJURVNUKGlndF9kbWFidWZfaW1wb3J0X3NhbWVfZHJpdmVyX2xtZW0pLAo+ICsg ICAgICAgICAgICAgICBTVUJURVNUKGlndF9kbWFidWZfaW1wb3J0X3NhbWVfZHJpdmVyX3NtZW0p LAo+ICsgICAgICAgICAgICAgICBTVUJURVNUKGlndF9kbWFidWZfaW1wb3J0X3NhbWVfZHJpdmVy X2xtZW1fc21lbSksCj4gICAgICAgICB9Owo+Cj4gICAgICAgICByZXR1cm4gaTkxNV9zdWJ0ZXN0 cyh0ZXN0cywgaTkxNSk7Cj4gLS0KPiAyLjMxLjEKPgo+IF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCj4gSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdAo+IEludGVs LWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeApfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK