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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,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 09FAAC4338F for ; Wed, 28 Jul 2021 13:44:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E4CDC60F0F for ; Wed, 28 Jul 2021 13:44:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235413AbhG1NoO (ORCPT ); Wed, 28 Jul 2021 09:44:14 -0400 Received: from vulcan.natalenko.name ([104.207.131.136]:57502 "EHLO vulcan.natalenko.name" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235345AbhG1NoL (ORCPT ); Wed, 28 Jul 2021 09:44:11 -0400 Received: from spock.localnet (unknown [151.237.229.131]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by vulcan.natalenko.name (Postfix) with ESMTPSA id 587BDB5C739; Wed, 28 Jul 2021 15:44:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=natalenko.name; s=dkim-20170712; t=1627479848; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rPOP7/Kz1KvizmI5KULfeOViwk82LgpFRrXprpW0RXs=; b=U8e5fDFVH0PqYOA/hr+7M3hLr56ldBnO9rHfJEZNc/r6o5AHodaA2AYtmCzmSfCbVKMAGi A45p1Qw+clpzQz216kcosuVQmUXWBcZIFuvfQgDMRzBCfoxHmhSLumFFesagggtUlLy+/U G6HC0AfH/qadZLrYUcKkBIu6FlnDtfE= From: Oleksandr Natalenko To: Ming Lei Cc: linux-kernel@vger.kernel.org, Jens Axboe , Christoph Hellwig , Sagi Grimberg , linux-nvme@lists.infradead.org, David Jeffery , Laurence Oberman , Paolo Valente , Jan Kara , Sasha Levin , Greg Kroah-Hartman , Keith Busch Subject: Re: New warning in nvme_setup_discard Date: Wed, 28 Jul 2021 15:44:06 +0200 Message-ID: <3180854.nXyytZ0Y3r@natalenko.name> In-Reply-To: References: <4729812.CpyZKHjjVO@natalenko.name> <17691292.WCMSeNvH9h@natalenko.name> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello. On =C3=BAter=C3=BD 27. =C4=8Dervence 2021 17:58:39 CEST Ming Lei wrote: > BTW, can you test the following patch? which is another approach on the s= ame > issue with other benefits. >=20 > From c853e7ed05a75f631da5b7952b9a989983437819 Mon Sep 17 00:00:00 2001 > From: Ming Lei > Date: Mon, 7 Jun 2021 16:03:51 +0800 > Subject: [PATCH 2/2] block: support bio merge for multi-range discard >=20 > So far multi-range discard treats each bio as one segment(range) of single > discard request. This way becomes not efficient if lots of small sized > discard bios are submitted, and one example is raid456. >=20 > Support bio merge for multi-range discard for improving lots of small > sized discard bios. >=20 > Turns out it is easy to support it: >=20 > 1) always try to merge bio first >=20 > 2) run into multi-range discard only if bio merge can't be done >=20 > 3) add rq_for_each_discard_range() for retrieving each range(segment) > of discard request >=20 > Reported-by: Wang Shanker > Signed-off-by: Ming Lei > --- > block/blk-merge.c | 12 ++++----- > drivers/block/virtio_blk.c | 9 ++++--- > drivers/nvme/host/core.c | 8 +++--- > include/linux/blkdev.h | 51 ++++++++++++++++++++++++++++++++++++++ > 4 files changed, 66 insertions(+), 14 deletions(-) >=20 > diff --git a/block/blk-merge.c b/block/blk-merge.c > index bcdff1879c34..65210e9a8efa 100644 > --- a/block/blk-merge.c > +++ b/block/blk-merge.c > @@ -724,10 +724,10 @@ static inline bool blk_discard_mergable(struct requ= est > *req) static enum elv_merge blk_try_req_merge(struct request *req, > struct request *next) > { > - if (blk_discard_mergable(req)) > - return ELEVATOR_DISCARD_MERGE; > - else if (blk_rq_pos(req) + blk_rq_sectors(req) =3D=3D blk_rq_pos(next)) > + if (blk_rq_pos(req) + blk_rq_sectors(req) =3D=3D blk_rq_pos(next)) > return ELEVATOR_BACK_MERGE; > + else if (blk_discard_mergable(req)) > + return ELEVATOR_DISCARD_MERGE; >=20 > return ELEVATOR_NO_MERGE; > } > @@ -908,12 +908,12 @@ bool blk_rq_merge_ok(struct request *rq, struct bio > *bio) >=20 > enum elv_merge blk_try_merge(struct request *rq, struct bio *bio) > { > - if (blk_discard_mergable(rq)) > - return ELEVATOR_DISCARD_MERGE; > - else if (blk_rq_pos(rq) + blk_rq_sectors(rq) =3D=3D bio->bi_iter.bi_sec= tor) > + if (blk_rq_pos(rq) + blk_rq_sectors(rq) =3D=3D bio->bi_iter.bi_sector) > return ELEVATOR_BACK_MERGE; > else if (blk_rq_pos(rq) - bio_sectors(bio) =3D=3D bio->bi_iter.bi_secto= r) > return ELEVATOR_FRONT_MERGE; > + else if (blk_discard_mergable(rq)) > + return ELEVATOR_DISCARD_MERGE; > return ELEVATOR_NO_MERGE; > } >=20 > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c > index b9fa3ef5b57c..970cb0d8acaa 100644 > --- a/drivers/block/virtio_blk.c > +++ b/drivers/block/virtio_blk.c > @@ -116,7 +116,6 @@ static int virtblk_setup_discard_write_zeroes(struct > request *req, bool unmap) unsigned short segments =3D > blk_rq_nr_discard_segments(req); > unsigned short n =3D 0; > struct virtio_blk_discard_write_zeroes *range; > - struct bio *bio; > u32 flags =3D 0; >=20 > if (unmap) > @@ -138,9 +137,11 @@ static int virtblk_setup_discard_write_zeroes(struct > request *req, bool unmap) range[0].sector =3D cpu_to_le64(blk_rq_pos(req)= ); > n =3D 1; > } else { > - __rq_for_each_bio(bio, req) { > - u64 sector =3D bio->bi_iter.bi_sector; > - u32 num_sectors =3D bio->bi_iter.bi_size >> SECTOR_SHIFT; > + struct req_discard_range r; > + > + rq_for_each_discard_range(r, req) { > + u64 sector =3D r.sector; > + u32 num_sectors =3D r.size >> SECTOR_SHIFT; >=20 > range[n].flags =3D cpu_to_le32(flags); > range[n].num_sectors =3D cpu_to_le32(num_sectors); > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c > index 24bcae88587a..4b0a39360ce9 100644 > --- a/drivers/nvme/host/core.c > +++ b/drivers/nvme/host/core.c > @@ -813,7 +813,7 @@ static blk_status_t nvme_setup_discard(struct nvme_ns > *ns, struct request *req, { > unsigned short segments =3D blk_rq_nr_discard_segments(req), n =3D 0; > struct nvme_dsm_range *range; > - struct bio *bio; > + struct req_discard_range r; >=20 > /* > * Some devices do not consider the DSM 'Number of Ranges' field when > @@ -835,9 +835,9 @@ static blk_status_t nvme_setup_discard(struct nvme_ns > *ns, struct request *req, range =3D page_address(ns->ctrl->discard_page); > } >=20 > - __rq_for_each_bio(bio, req) { > - u64 slba =3D nvme_sect_to_lba(ns, bio->bi_iter.bi_sector); > - u32 nlb =3D bio->bi_iter.bi_size >> ns->lba_shift; > + rq_for_each_discard_range(r, req) { > + u64 slba =3D nvme_sect_to_lba(ns, r.sector); > + u32 nlb =3D r.size >> ns->lba_shift; >=20 > if (n < segments) { > range[n].cattr =3D cpu_to_le32(0); > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index d66d0da72529..bd9d22269a7b 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -1007,6 +1007,57 @@ static inline unsigned int blk_rq_stats_sectors(co= nst > struct request *rq) return rq->stats_sectors; > } >=20 > +struct req_discard_range { > + sector_t sector; > + unsigned int size; > + > + /* > + * internal field: driver don't use it, and it always points to > + * next bio to be processed > + */ > + struct bio *__bio; > +}; > + > +static inline void req_init_discard_range_iter(const struct request *rq, > + struct req_discard_range *range) > +{ > + range->__bio =3D rq->bio; > +} > + > +/* return true if @range stores one valid discard range */ > +static inline bool req_get_discard_range(struct req_discard_range *range) > +{ > + struct bio *bio; > + > + if (!range->__bio) > + return false; > + > + bio =3D range->__bio; > + range->sector =3D bio->bi_iter.bi_sector; > + range->size =3D bio->bi_iter.bi_size; > + range->__bio =3D bio->bi_next; > + > + while (range->__bio) { > + struct bio *bio =3D range->__bio; > + > + if (range->sector + (range->size >> SECTOR_SHIFT) !=3D > + bio->bi_iter.bi_sector) > + break; > + > + /* > + * ->size won't overflow because req->__data_len is defined > + * as 'unsigned int' > + */ > + range->size +=3D bio->bi_iter.bi_size; > + range->__bio =3D bio->bi_next; > + } > + return true; > +} > + > +#define rq_for_each_discard_range(range, rq) \ > + for (req_init_discard_range_iter((rq), &range); \ > + req_get_discard_range(&range);) > + > #ifdef CONFIG_BLK_DEV_ZONED >=20 > /* Helper to convert BLK_ZONE_ZONE_XXX to its string format XXX */ Do I have to revert the previous one and apply this one? If so, with this o= ne the issue is triggered pretty quick: ``` kernel: ------------[ cut here ]------------ kernel: WARNING: CPU: 20 PID: 490 at drivers/nvme/host/core.c:850 nvme_setu= p_discard+0x1b9/0x220 =E2=80=A6 kernel: CPU: 20 PID: 490 Comm: md0_raid10 Not tainted 5.13.0-pf4 #1 kernel: Hardware name: ASUS System Product Name/Pro WS X570-ACE, BIOS 3601 = 05/26/2021 kernel: RIP: 0010:nvme_setup_discard+0x1b9/0x220 kernel: Code: 38 4c 8b 88 40 0b 00 00 4c 2b 0d f2 06 d8 00 49 c1 f9 06 49 c= 1 e1 0c 4c 03 0d f3 06 d8 00 4d 89 c8 48 85 d2 0f 85 9f fe ff ff <0f> 0b b8= 00 00 00 80 4c 01 c8 72 52 48 c7 c2 00 00 00 80 48 2b 15 kernel: RSP: 0018:ffffa3a34152ba10 EFLAGS: 00010202 kernel: RAX: ffff8b78d80db0c0 RBX: 000000000000000f RCX: 0000000000000400 kernel: RDX: 0000000000000000 RSI: 00000000241b5c00 RDI: 000000000000000d kernel: RBP: ffff8b78cbd70380 R08: ffff8b78d80db000 R09: ffff8b78d80db000 kernel: R10: 00000000241b5c00 R11: 0000000000000000 R12: ffff8b78c5a4b800 kernel: R13: ffff8b78cbd704c8 R14: ffff8b78c5bd8000 R15: ffff8b78cabbf000 kernel: FS: 0000000000000000(0000) GS:ffff8b7fcef00000(0000) knlGS:0000000= 000000000 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 kernel: CR2: 00007faaaf746020 CR3: 00000001e0342000 CR4: 0000000000350ee0 kernel: Call Trace: kernel: nvme_setup_cmd+0x2d0/0x670 kernel: nvme_queue_rq+0x79/0xc90 kernel: ? __sbitmap_get_word+0x30/0x80 kernel: ? sbitmap_get+0x85/0x180 kernel: blk_mq_dispatch_rq_list+0x15c/0x810 kernel: __blk_mq_do_dispatch_sched+0xca/0x320 kernel: ? ktime_get+0x38/0xa0 kernel: __blk_mq_sched_dispatch_requests+0x14d/0x190 kernel: blk_mq_sched_dispatch_requests+0x2f/0x60 kernel: __blk_mq_run_hw_queue+0x30/0xa0 kernel: __blk_mq_delay_run_hw_queue+0x142/0x170 kernel: blk_mq_sched_insert_requests+0x6d/0xf0 kernel: blk_mq_flush_plug_list+0x111/0x1c0 kernel: blk_finish_plug+0x21/0x30 kernel: raid10d+0x7c8/0x1960 [raid10] kernel: ? psi_task_switch+0xf2/0x330 kernel: ? __switch_to_asm+0x42/0x70 kernel: ? finish_task_switch.isra.0+0xaa/0x290 kernel: ? md_thread+0xc3/0x190 [md_mod] kernel: md_thread+0xc3/0x190 [md_mod] kernel: ? finish_wait+0x80/0x80 kernel: ? md_rdev_init+0xb0/0xb0 [md_mod] kernel: kthread+0x1b3/0x1e0 kernel: ? __kthread_init_worker+0x50/0x50 kernel: ret_from_fork+0x22/0x30 kernel: ---[ end trace dc148fcea235e799 ]--- kernel: blk_update_request: I/O error, dev nvme0n1, sector 605615104 op 0x3= :(DISCARD) flags 0x0 phys_seg 15 prio class 0 kernel: blk_update_request: I/O error, dev nvme1n1, sector 118159360 op 0x3= :(DISCARD) flags 0x0 phys_seg 15 prio class 0 kernel: blk_update_request: I/O error, dev nvme0n1, sector 118200320 op 0x3= :(DISCARD) flags 0x0 phys_seg 50 prio class 0 kernel: blk_update_request: I/O error, dev nvme1n1, sector 118326272 op 0x3= :(DISCARD) flags 0x0 phys_seg 165 prio class 0 ``` =2D-=20 Oleksandr Natalenko (post-factum) 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.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_ALL,DKIM_SIGNED,DKIM_VALID,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 550EAC4338F for ; Wed, 28 Jul 2021 13:44:40 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 DBC2E60EC0 for ; Wed, 28 Jul 2021 13:44:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org DBC2E60EC0 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=natalenko.name Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MrMJcylyQzD+1/1jbN465bXc7ysAxR21boDi08+tc2Y=; b=rjss2Kq6B3UWEA EaUBmJ6XLP9EYmfU4kwnvx5v1LI1lmr35NnmQIxDmt59dOzRPqrXi8moyJplFT0qUsZj/AlqUbwdr 03+KY5kJxH1CcurbpnGKwOKnt5lenctXOu/1XlPk1GGYRCfPvR9n7q2ZgNcCCc/etssStZeBFto+z v6o5S/cCzip3r97fRvgx9vpskJqjOS6tAyS1+4+n48vjGvb4zIx24G1JGrFtaZ9ZCkAvD443r+lOc L2c0E5NiKfKtBfmWoXs6MvOgGsqPtnr5hCRIsBPEUD8NkswIvygeK4ZFDqYvkSKzMdfYxYUPkYdZ7 IAl5ZwTU1C5Ugn9+T2aA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m8jr7-000p1t-WD; Wed, 28 Jul 2021 13:44:18 +0000 Received: from vulcan.natalenko.name ([104.207.131.136]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m8jr3-000p1P-Bp for linux-nvme@lists.infradead.org; Wed, 28 Jul 2021 13:44:15 +0000 Received: from spock.localnet (unknown [151.237.229.131]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by vulcan.natalenko.name (Postfix) with ESMTPSA id 587BDB5C739; Wed, 28 Jul 2021 15:44:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=natalenko.name; s=dkim-20170712; t=1627479848; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rPOP7/Kz1KvizmI5KULfeOViwk82LgpFRrXprpW0RXs=; b=U8e5fDFVH0PqYOA/hr+7M3hLr56ldBnO9rHfJEZNc/r6o5AHodaA2AYtmCzmSfCbVKMAGi A45p1Qw+clpzQz216kcosuVQmUXWBcZIFuvfQgDMRzBCfoxHmhSLumFFesagggtUlLy+/U G6HC0AfH/qadZLrYUcKkBIu6FlnDtfE= From: Oleksandr Natalenko To: Ming Lei Cc: linux-kernel@vger.kernel.org, Jens Axboe , Christoph Hellwig , Sagi Grimberg , linux-nvme@lists.infradead.org, David Jeffery , Laurence Oberman , Paolo Valente , Jan Kara , Sasha Levin , Greg Kroah-Hartman , Keith Busch Subject: Re: New warning in nvme_setup_discard Date: Wed, 28 Jul 2021 15:44:06 +0200 Message-ID: <3180854.nXyytZ0Y3r@natalenko.name> In-Reply-To: References: <4729812.CpyZKHjjVO@natalenko.name> <17691292.WCMSeNvH9h@natalenko.name> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210728_064413_800067_198E12BB X-CRM114-Status: GOOD ( 30.85 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org SGVsbG8uCgpPbiDDunRlcsO9IDI3LiDEjWVydmVuY2UgMjAyMSAxNzo1ODozOSBDRVNUIE1pbmcg TGVpIHdyb3RlOgo+IEJUVywgY2FuIHlvdSB0ZXN0IHRoZSBmb2xsb3dpbmcgcGF0Y2g/IHdoaWNo IGlzIGFub3RoZXIgYXBwcm9hY2ggb24gdGhlIHNhbWUKPiBpc3N1ZSB3aXRoIG90aGVyIGJlbmVm aXRzLgo+IAo+IEZyb20gYzg1M2U3ZWQwNWE3NWY2MzFkYTViNzk1MmI5YTk4OTk4MzQzNzgxOSBN b24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKPiBGcm9tOiBNaW5nIExlaSA8bWluZy5sZWlAcmVkaGF0 LmNvbT4KPiBEYXRlOiBNb24sIDcgSnVuIDIwMjEgMTY6MDM6NTEgKzA4MDAKPiBTdWJqZWN0OiBb UEFUQ0ggMi8yXSBibG9jazogc3VwcG9ydCBiaW8gbWVyZ2UgZm9yIG11bHRpLXJhbmdlIGRpc2Nh cmQKPiAKPiBTbyBmYXIgbXVsdGktcmFuZ2UgZGlzY2FyZCB0cmVhdHMgZWFjaCBiaW8gYXMgb25l IHNlZ21lbnQocmFuZ2UpIG9mIHNpbmdsZQo+IGRpc2NhcmQgcmVxdWVzdC4gVGhpcyB3YXkgYmVj b21lcyBub3QgZWZmaWNpZW50IGlmIGxvdHMgb2Ygc21hbGwgc2l6ZWQKPiBkaXNjYXJkIGJpb3Mg YXJlIHN1Ym1pdHRlZCwgYW5kIG9uZSBleGFtcGxlIGlzIHJhaWQ0NTYuCj4gCj4gU3VwcG9ydCBi aW8gbWVyZ2UgZm9yIG11bHRpLXJhbmdlIGRpc2NhcmQgZm9yIGltcHJvdmluZyBsb3RzIG9mIHNt YWxsCj4gc2l6ZWQgZGlzY2FyZCBiaW9zLgo+IAo+IFR1cm5zIG91dCBpdCBpcyBlYXN5IHRvIHN1 cHBvcnQgaXQ6Cj4gCj4gMSkgYWx3YXlzIHRyeSB0byBtZXJnZSBiaW8gZmlyc3QKPiAKPiAyKSBy dW4gaW50byBtdWx0aS1yYW5nZSBkaXNjYXJkIG9ubHkgaWYgYmlvIG1lcmdlIGNhbid0IGJlIGRv bmUKPiAKPiAzKSBhZGQgcnFfZm9yX2VhY2hfZGlzY2FyZF9yYW5nZSgpIGZvciByZXRyaWV2aW5n IGVhY2ggcmFuZ2Uoc2VnbWVudCkKPiBvZiBkaXNjYXJkIHJlcXVlc3QKPiAKPiBSZXBvcnRlZC1i eTogV2FuZyBTaGFua2VyIDxzaGFua2Vyd2FuZ21pYW9AZ21haWwuY29tPgo+IFNpZ25lZC1vZmYt Ynk6IE1pbmcgTGVpIDxtaW5nLmxlaUByZWRoYXQuY29tPgo+IC0tLQo+ICBibG9jay9ibGstbWVy Z2UuYyAgICAgICAgICB8IDEyICsrKystLS0tLQo+ICBkcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsu YyB8ICA5ICsrKystLS0KPiAgZHJpdmVycy9udm1lL2hvc3QvY29yZS5jICAgfCAgOCArKystLS0K PiAgaW5jbHVkZS9saW51eC9ibGtkZXYuaCAgICAgfCA1MSArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwo+ICA0IGZpbGVzIGNoYW5nZWQsIDY2IGluc2VydGlvbnMoKyksIDE0 IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9ibG9jay9ibGstbWVyZ2UuYyBiL2Jsb2Nr L2Jsay1tZXJnZS5jCj4gaW5kZXggYmNkZmYxODc5YzM0Li42NTIxMGU5YThlZmEgMTAwNjQ0Cj4g LS0tIGEvYmxvY2svYmxrLW1lcmdlLmMKPiArKysgYi9ibG9jay9ibGstbWVyZ2UuYwo+IEBAIC03 MjQsMTAgKzcyNCwxMCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgYmxrX2Rpc2NhcmRfbWVyZ2FibGUo c3RydWN0IHJlcXVlc3QKPiAqcmVxKSBzdGF0aWMgZW51bSBlbHZfbWVyZ2UgYmxrX3RyeV9yZXFf bWVyZ2Uoc3RydWN0IHJlcXVlc3QgKnJlcSwKPiAgCQkJCQlzdHJ1Y3QgcmVxdWVzdCAqbmV4dCkK PiAgewo+IC0JaWYgKGJsa19kaXNjYXJkX21lcmdhYmxlKHJlcSkpCj4gLQkJcmV0dXJuIEVMRVZB VE9SX0RJU0NBUkRfTUVSR0U7Cj4gLQllbHNlIGlmIChibGtfcnFfcG9zKHJlcSkgKyBibGtfcnFf c2VjdG9ycyhyZXEpID09IGJsa19ycV9wb3MobmV4dCkpCj4gKwlpZiAoYmxrX3JxX3BvcyhyZXEp ICsgYmxrX3JxX3NlY3RvcnMocmVxKSA9PSBibGtfcnFfcG9zKG5leHQpKQo+ICAJCXJldHVybiBF TEVWQVRPUl9CQUNLX01FUkdFOwo+ICsJZWxzZSBpZiAoYmxrX2Rpc2NhcmRfbWVyZ2FibGUocmVx KSkKPiArCQlyZXR1cm4gRUxFVkFUT1JfRElTQ0FSRF9NRVJHRTsKPiAKPiAgCXJldHVybiBFTEVW QVRPUl9OT19NRVJHRTsKPiAgfQo+IEBAIC05MDgsMTIgKzkwOCwxMiBAQCBib29sIGJsa19ycV9t ZXJnZV9vayhzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8KPiAqYmlvKQo+IAo+ICBlbnVt IGVsdl9tZXJnZSBibGtfdHJ5X21lcmdlKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IGJpbyAq YmlvKQo+ICB7Cj4gLQlpZiAoYmxrX2Rpc2NhcmRfbWVyZ2FibGUocnEpKQo+IC0JCXJldHVybiBF TEVWQVRPUl9ESVNDQVJEX01FUkdFOwo+IC0JZWxzZSBpZiAoYmxrX3JxX3BvcyhycSkgKyBibGtf cnFfc2VjdG9ycyhycSkgPT0gYmlvLT5iaV9pdGVyLmJpX3NlY3RvcikKPiArCWlmIChibGtfcnFf cG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKSA9PSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKQo+ ICAJCXJldHVybiBFTEVWQVRPUl9CQUNLX01FUkdFOwo+ICAJZWxzZSBpZiAoYmxrX3JxX3Bvcyhy cSkgLSBiaW9fc2VjdG9ycyhiaW8pID09IGJpby0+YmlfaXRlci5iaV9zZWN0b3IpCj4gIAkJcmV0 dXJuIEVMRVZBVE9SX0ZST05UX01FUkdFOwo+ICsJZWxzZSBpZiAoYmxrX2Rpc2NhcmRfbWVyZ2Fi bGUocnEpKQo+ICsJCXJldHVybiBFTEVWQVRPUl9ESVNDQVJEX01FUkdFOwo+ICAJcmV0dXJuIEVM RVZBVE9SX05PX01FUkdFOwo+ICB9Cj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmly dGlvX2Jsay5jIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKPiBpbmRleCBiOWZhM2VmNWI1 N2MuLjk3MGNiMGQ4YWNhYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsu Ywo+ICsrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCj4gQEAgLTExNiw3ICsxMTYsNiBA QCBzdGF0aWMgaW50IHZpcnRibGtfc2V0dXBfZGlzY2FyZF93cml0ZV96ZXJvZXMoc3RydWN0Cj4g cmVxdWVzdCAqcmVxLCBib29sIHVubWFwKSB1bnNpZ25lZCBzaG9ydCBzZWdtZW50cyA9Cj4gYmxr X3JxX25yX2Rpc2NhcmRfc2VnbWVudHMocmVxKTsKPiAgCXVuc2lnbmVkIHNob3J0IG4gPSAwOwo+ ICAJc3RydWN0IHZpcnRpb19ibGtfZGlzY2FyZF93cml0ZV96ZXJvZXMgKnJhbmdlOwo+IC0Jc3Ry dWN0IGJpbyAqYmlvOwo+ICAJdTMyIGZsYWdzID0gMDsKPiAKPiAgCWlmICh1bm1hcCkKPiBAQCAt MTM4LDkgKzEzNywxMSBAQCBzdGF0aWMgaW50IHZpcnRibGtfc2V0dXBfZGlzY2FyZF93cml0ZV96 ZXJvZXMoc3RydWN0Cj4gcmVxdWVzdCAqcmVxLCBib29sIHVubWFwKSByYW5nZVswXS5zZWN0b3Ig PSBjcHVfdG9fbGU2NChibGtfcnFfcG9zKHJlcSkpOwo+ICAJCW4gPSAxOwo+ICAJfSBlbHNlIHsK PiAtCQlfX3JxX2Zvcl9lYWNoX2JpbyhiaW8sIHJlcSkgewo+IC0JCQl1NjQgc2VjdG9yID0gYmlv LT5iaV9pdGVyLmJpX3NlY3RvcjsKPiAtCQkJdTMyIG51bV9zZWN0b3JzID0gYmlvLT5iaV9pdGVy LmJpX3NpemUgPj4gU0VDVE9SX1NISUZUOwo+ICsJCXN0cnVjdCByZXFfZGlzY2FyZF9yYW5nZSBy Owo+ICsKPiArCQlycV9mb3JfZWFjaF9kaXNjYXJkX3JhbmdlKHIsIHJlcSkgewo+ICsJCQl1NjQg c2VjdG9yID0gci5zZWN0b3I7Cj4gKwkJCXUzMiBudW1fc2VjdG9ycyA9IHIuc2l6ZSA+PiBTRUNU T1JfU0hJRlQ7Cj4gCj4gIAkJCXJhbmdlW25dLmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwo+ ICAJCQlyYW5nZVtuXS5udW1fc2VjdG9ycyA9IGNwdV90b19sZTMyKG51bV9zZWN0b3JzKTsKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jIGIvZHJpdmVycy9udm1lL2hvc3Qv Y29yZS5jCj4gaW5kZXggMjRiY2FlODg1ODdhLi40YjBhMzkzNjBjZTkgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCj4gKysrIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5j Cj4gQEAgLTgxMyw3ICs4MTMsNyBAQCBzdGF0aWMgYmxrX3N0YXR1c190IG52bWVfc2V0dXBfZGlz Y2FyZChzdHJ1Y3QgbnZtZV9ucwo+ICpucywgc3RydWN0IHJlcXVlc3QgKnJlcSwgewo+ICAJdW5z aWduZWQgc2hvcnQgc2VnbWVudHMgPSBibGtfcnFfbnJfZGlzY2FyZF9zZWdtZW50cyhyZXEpLCBu ID0gMDsKPiAgCXN0cnVjdCBudm1lX2RzbV9yYW5nZSAqcmFuZ2U7Cj4gLQlzdHJ1Y3QgYmlvICpi aW87Cj4gKwlzdHJ1Y3QgcmVxX2Rpc2NhcmRfcmFuZ2UgcjsKPiAKPiAgCS8qCj4gIAkgKiBTb21l IGRldmljZXMgZG8gbm90IGNvbnNpZGVyIHRoZSBEU00gJ051bWJlciBvZiBSYW5nZXMnIGZpZWxk IHdoZW4KPiBAQCAtODM1LDkgKzgzNSw5IEBAIHN0YXRpYyBibGtfc3RhdHVzX3QgbnZtZV9zZXR1 cF9kaXNjYXJkKHN0cnVjdCBudm1lX25zCj4gKm5zLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLCByYW5n ZSA9IHBhZ2VfYWRkcmVzcyhucy0+Y3RybC0+ZGlzY2FyZF9wYWdlKTsKPiAgCX0KPiAKPiAtCV9f cnFfZm9yX2VhY2hfYmlvKGJpbywgcmVxKSB7Cj4gLQkJdTY0IHNsYmEgPSBudm1lX3NlY3RfdG9f bGJhKG5zLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKTsKPiAtCQl1MzIgbmxiID0gYmlvLT5iaV9p dGVyLmJpX3NpemUgPj4gbnMtPmxiYV9zaGlmdDsKPiArCXJxX2Zvcl9lYWNoX2Rpc2NhcmRfcmFu Z2UociwgcmVxKSB7Cj4gKwkJdTY0IHNsYmEgPSBudm1lX3NlY3RfdG9fbGJhKG5zLCByLnNlY3Rv cik7Cj4gKwkJdTMyIG5sYiA9IHIuc2l6ZSA+PiBucy0+bGJhX3NoaWZ0Owo+IAo+ICAJCWlmIChu IDwgc2VnbWVudHMpIHsKPiAgCQkJcmFuZ2Vbbl0uY2F0dHIgPSBjcHVfdG9fbGUzMigwKTsKPiBk aWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2 LmgKPiBpbmRleCBkNjZkMGRhNzI1MjkuLmJkOWQyMjI2OWE3YiAxMDA2NDQKPiAtLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAo+IEBAIC0x MDA3LDYgKzEwMDcsNTcgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmxrX3JxX3N0YXRz X3NlY3RvcnMoY29uc3QKPiBzdHJ1Y3QgcmVxdWVzdCAqcnEpIHJldHVybiBycS0+c3RhdHNfc2Vj dG9yczsKPiAgfQo+IAo+ICtzdHJ1Y3QgcmVxX2Rpc2NhcmRfcmFuZ2Ugewo+ICsJc2VjdG9yX3QJ c2VjdG9yOwo+ICsJdW5zaWduZWQgaW50CXNpemU7Cj4gKwo+ICsJLyoKPiArCSAqIGludGVybmFs IGZpZWxkOiBkcml2ZXIgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgYWx3YXlzIHBvaW50cyB0bwo+ICsJ ICogbmV4dCBiaW8gdG8gYmUgcHJvY2Vzc2VkCj4gKwkgKi8KPiArCXN0cnVjdCBiaW8gKl9fYmlv Owo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHJlcV9pbml0X2Rpc2NhcmRfcmFuZ2Vf aXRlcihjb25zdCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCj4gKwkJc3RydWN0IHJlcV9kaXNjYXJkX3Jh bmdlICpyYW5nZSkKPiArewo+ICsJcmFuZ2UtPl9fYmlvID0gcnEtPmJpbzsKPiArfQo+ICsKPiAr LyogcmV0dXJuIHRydWUgaWYgQHJhbmdlIHN0b3JlcyBvbmUgdmFsaWQgZGlzY2FyZCByYW5nZSAq Lwo+ICtzdGF0aWMgaW5saW5lIGJvb2wgcmVxX2dldF9kaXNjYXJkX3JhbmdlKHN0cnVjdCByZXFf ZGlzY2FyZF9yYW5nZSAqcmFuZ2UpCj4gK3sKPiArCXN0cnVjdCBiaW8gKmJpbzsKPiArCj4gKwlp ZiAoIXJhbmdlLT5fX2JpbykKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJYmlvID0gcmFuZ2Ut Pl9fYmlvOwo+ICsJcmFuZ2UtPnNlY3RvciA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7Cj4gKwly YW5nZS0+c2l6ZSA9IGJpby0+YmlfaXRlci5iaV9zaXplOwo+ICsJcmFuZ2UtPl9fYmlvID0gYmlv LT5iaV9uZXh0Owo+ICsKPiArCXdoaWxlIChyYW5nZS0+X19iaW8pIHsKPiArCQlzdHJ1Y3QgYmlv ICpiaW8gPSByYW5nZS0+X19iaW87Cj4gKwo+ICsJCWlmIChyYW5nZS0+c2VjdG9yICsgKHJhbmdl LT5zaXplID4+IFNFQ1RPUl9TSElGVCkgIT0KPiArCQkJCWJpby0+YmlfaXRlci5iaV9zZWN0b3Ip Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQkvKgo+ICsJCSAqIC0+c2l6ZSB3b24ndCBvdmVyZmxvdyBi ZWNhdXNlIHJlcS0+X19kYXRhX2xlbiBpcyBkZWZpbmVkCj4gKwkJICogIGFzICd1bnNpZ25lZCBp bnQnCj4gKwkJICovCj4gKwkJcmFuZ2UtPnNpemUgKz0gYmlvLT5iaV9pdGVyLmJpX3NpemU7Cj4g KwkJcmFuZ2UtPl9fYmlvID0gYmlvLT5iaV9uZXh0Owo+ICsJfQo+ICsJcmV0dXJuIHRydWU7Cj4g K30KPiArCj4gKyNkZWZpbmUgcnFfZm9yX2VhY2hfZGlzY2FyZF9yYW5nZShyYW5nZSwgcnEpIFwK PiArCWZvciAocmVxX2luaXRfZGlzY2FyZF9yYW5nZV9pdGVyKChycSksICZyYW5nZSk7IFwKPiAr CQkJcmVxX2dldF9kaXNjYXJkX3JhbmdlKCZyYW5nZSk7KQo+ICsKPiAgI2lmZGVmIENPTkZJR19C TEtfREVWX1pPTkVECj4gCj4gIC8qIEhlbHBlciB0byBjb252ZXJ0IEJMS19aT05FX1pPTkVfWFhY IHRvIGl0cyBzdHJpbmcgZm9ybWF0IFhYWCAqLwoKRG8gSSBoYXZlIHRvIHJldmVydCB0aGUgcHJl dmlvdXMgb25lIGFuZCBhcHBseSB0aGlzIG9uZT8gSWYgc28sIHdpdGggdGhpcyBvbmUgdGhlIGlz c3VlIGlzIHRyaWdnZXJlZCBwcmV0dHkgcXVpY2s6CgpgYGAKa2VybmVsOiAtLS0tLS0tLS0tLS1b IGN1dCBoZXJlIF0tLS0tLS0tLS0tLS0Ka2VybmVsOiBXQVJOSU5HOiBDUFU6IDIwIFBJRDogNDkw IGF0IGRyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYzo4NTAgbnZtZV9zZXR1cF9kaXNjYXJkKzB4MWI5 LzB4MjIwCuKApgprZXJuZWw6IENQVTogMjAgUElEOiA0OTAgQ29tbTogbWQwX3JhaWQxMCBOb3Qg dGFpbnRlZCA1LjEzLjAtcGY0ICMxCmtlcm5lbDogSGFyZHdhcmUgbmFtZTogQVNVUyBTeXN0ZW0g UHJvZHVjdCBOYW1lL1BybyBXUyBYNTcwLUFDRSwgQklPUyAzNjAxIDA1LzI2LzIwMjEKa2VybmVs OiBSSVA6IDAwMTA6bnZtZV9zZXR1cF9kaXNjYXJkKzB4MWI5LzB4MjIwCmtlcm5lbDogQ29kZTog MzggNGMgOGIgODggNDAgMGIgMDAgMDAgNGMgMmIgMGQgZjIgMDYgZDggMDAgNDkgYzEgZjkgMDYg NDkgYzEgZTEgMGMgNGMgMDMgMGQgZjMgMDYgZDggMDAgNGQgODkgYzggNDggODUgZDIgMGYgODUg OWYgZmUgZmYgZmYgPDBmPiAwYiBiOCAwMCAwMCAwMCA4MCA0YyAwMSBjOCA3MiA1MiA0OCBjNyBj MiAwMCAwMCAwMCA4MCA0OCAyYiAxNQprZXJuZWw6IFJTUDogMDAxODpmZmZmYTNhMzQxNTJiYTEw IEVGTEFHUzogMDAwMTAyMDIKa2VybmVsOiBSQVg6IGZmZmY4Yjc4ZDgwZGIwYzAgUkJYOiAwMDAw MDAwMDAwMDAwMDBmIFJDWDogMDAwMDAwMDAwMDAwMDQwMAprZXJuZWw6IFJEWDogMDAwMDAwMDAw MDAwMDAwMCBSU0k6IDAwMDAwMDAwMjQxYjVjMDAgUkRJOiAwMDAwMDAwMDAwMDAwMDBkCmtlcm5l bDogUkJQOiBmZmZmOGI3OGNiZDcwMzgwIFIwODogZmZmZjhiNzhkODBkYjAwMCBSMDk6IGZmZmY4 Yjc4ZDgwZGIwMDAKa2VybmVsOiBSMTA6IDAwMDAwMDAwMjQxYjVjMDAgUjExOiAwMDAwMDAwMDAw MDAwMDAwIFIxMjogZmZmZjhiNzhjNWE0YjgwMAprZXJuZWw6IFIxMzogZmZmZjhiNzhjYmQ3MDRj OCBSMTQ6IGZmZmY4Yjc4YzViZDgwMDAgUjE1OiBmZmZmOGI3OGNhYmJmMDAwCmtlcm5lbDogRlM6 ICAwMDAwMDAwMDAwMDAwMDAwKDAwMDApIEdTOmZmZmY4YjdmY2VmMDAwMDAoMDAwMCkga25sR1M6 MDAwMDAwMDAwMDAwMDAwMAprZXJuZWw6IENTOiAgMDAxMCBEUzogMDAwMCBFUzogMDAwMCBDUjA6 IDAwMDAwMDAwODAwNTAwMzMKa2VybmVsOiBDUjI6IDAwMDA3ZmFhYWY3NDYwMjAgQ1IzOiAwMDAw MDAwMWUwMzQyMDAwIENSNDogMDAwMDAwMDAwMDM1MGVlMAprZXJuZWw6IENhbGwgVHJhY2U6Cmtl cm5lbDogIG52bWVfc2V0dXBfY21kKzB4MmQwLzB4NjcwCmtlcm5lbDogIG52bWVfcXVldWVfcnEr MHg3OS8weGM5MAprZXJuZWw6ICA/IF9fc2JpdG1hcF9nZXRfd29yZCsweDMwLzB4ODAKa2VybmVs OiAgPyBzYml0bWFwX2dldCsweDg1LzB4MTgwCmtlcm5lbDogIGJsa19tcV9kaXNwYXRjaF9ycV9s aXN0KzB4MTVjLzB4ODEwCmtlcm5lbDogIF9fYmxrX21xX2RvX2Rpc3BhdGNoX3NjaGVkKzB4Y2Ev MHgzMjAKa2VybmVsOiAgPyBrdGltZV9nZXQrMHgzOC8weGEwCmtlcm5lbDogIF9fYmxrX21xX3Nj aGVkX2Rpc3BhdGNoX3JlcXVlc3RzKzB4MTRkLzB4MTkwCmtlcm5lbDogIGJsa19tcV9zY2hlZF9k aXNwYXRjaF9yZXF1ZXN0cysweDJmLzB4NjAKa2VybmVsOiAgX19ibGtfbXFfcnVuX2h3X3F1ZXVl KzB4MzAvMHhhMAprZXJuZWw6ICBfX2Jsa19tcV9kZWxheV9ydW5faHdfcXVldWUrMHgxNDIvMHgx NzAKa2VybmVsOiAgYmxrX21xX3NjaGVkX2luc2VydF9yZXF1ZXN0cysweDZkLzB4ZjAKa2VybmVs OiAgYmxrX21xX2ZsdXNoX3BsdWdfbGlzdCsweDExMS8weDFjMAprZXJuZWw6ICBibGtfZmluaXNo X3BsdWcrMHgyMS8weDMwCmtlcm5lbDogIHJhaWQxMGQrMHg3YzgvMHgxOTYwIFtyYWlkMTBdCmtl cm5lbDogID8gcHNpX3Rhc2tfc3dpdGNoKzB4ZjIvMHgzMzAKa2VybmVsOiAgPyBfX3N3aXRjaF90 b19hc20rMHg0Mi8weDcwCmtlcm5lbDogID8gZmluaXNoX3Rhc2tfc3dpdGNoLmlzcmEuMCsweGFh LzB4MjkwCmtlcm5lbDogID8gbWRfdGhyZWFkKzB4YzMvMHgxOTAgW21kX21vZF0Ka2VybmVsOiAg bWRfdGhyZWFkKzB4YzMvMHgxOTAgW21kX21vZF0Ka2VybmVsOiAgPyBmaW5pc2hfd2FpdCsweDgw LzB4ODAKa2VybmVsOiAgPyBtZF9yZGV2X2luaXQrMHhiMC8weGIwIFttZF9tb2RdCmtlcm5lbDog IGt0aHJlYWQrMHgxYjMvMHgxZTAKa2VybmVsOiAgPyBfX2t0aHJlYWRfaW5pdF93b3JrZXIrMHg1 MC8weDUwCmtlcm5lbDogIHJldF9mcm9tX2ZvcmsrMHgyMi8weDMwCmtlcm5lbDogLS0tWyBlbmQg dHJhY2UgZGMxNDhmY2VhMjM1ZTc5OSBdLS0tCmtlcm5lbDogYmxrX3VwZGF0ZV9yZXF1ZXN0OiBJ L08gZXJyb3IsIGRldiBudm1lMG4xLCBzZWN0b3IgNjA1NjE1MTA0IG9wIDB4MzooRElTQ0FSRCkg ZmxhZ3MgMHgwIHBoeXNfc2VnIDE1IHByaW8gY2xhc3MgMAprZXJuZWw6IGJsa191cGRhdGVfcmVx dWVzdDogSS9PIGVycm9yLCBkZXYgbnZtZTFuMSwgc2VjdG9yIDExODE1OTM2MCBvcCAweDM6KERJ U0NBUkQpIGZsYWdzIDB4MCBwaHlzX3NlZyAxNSBwcmlvIGNsYXNzIDAKa2VybmVsOiBibGtfdXBk YXRlX3JlcXVlc3Q6IEkvTyBlcnJvciwgZGV2IG52bWUwbjEsIHNlY3RvciAxMTgyMDAzMjAgb3Ag MHgzOihESVNDQVJEKSBmbGFncyAweDAgcGh5c19zZWcgNTAgcHJpbyBjbGFzcyAwCmtlcm5lbDog YmxrX3VwZGF0ZV9yZXF1ZXN0OiBJL08gZXJyb3IsIGRldiBudm1lMW4xLCBzZWN0b3IgMTE4MzI2 MjcyIG9wIDB4MzooRElTQ0FSRCkgZmxhZ3MgMHgwIHBoeXNfc2VnIDE2NSBwcmlvIGNsYXNzIDAK YGBgCgotLSAKT2xla3NhbmRyIE5hdGFsZW5rbyAocG9zdC1mYWN0dW0pCgoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52bWUgbWFpbGluZyBs aXN0CkxpbnV4LW52bWVAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52bWUK