From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30046 invoked by alias); 13 Sep 2019 16:29:06 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 30028 invoked by uid 89); 13 Sep 2019 16:29:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-19.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,UNSUBSCRIBE_BODY autolearn=ham version=3.3.1 spammy= X-Spam-Status: No, score=-19.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,UNSUBSCRIBE_BODY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: EUR02-AM5-obe.outbound.protection.outlook.com Received: from mail-eopbgr00084.outbound.protection.outlook.com (HELO EUR02-AM5-obe.outbound.protection.outlook.com) (40.107.0.84) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 13 Sep 2019 16:29:00 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pFUaR3tjlMRPtA2PRayCULow8csW38LOZgV+1MmlDlc=; b=kdIXaHscjnvFGSvJNgmEIlqXUxlElS8UqpgBG72Ckwgr/zI9SKw0510jfSRBBSM96mqQtyfZIgbCHvLmBcK6i9PK3TSPWKDUXgJDHkxUlJeOuihqVQGJJjjZkhZJlVBFc0AuFBS0py1m5NMwLgDiBqDs7niYzGR41gvzZ344WDk= Received: from VI1PR08CA0154.eurprd08.prod.outlook.com (2603:10a6:800:d5::32) by VI1PR08MB4416.eurprd08.prod.outlook.com (2603:10a6:803:fa::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2220.19; Fri, 13 Sep 2019 16:28:54 +0000 Received: from VE1EUR03FT044.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e09::204) by VI1PR08CA0154.outlook.office365.com (2603:10a6:800:d5::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.17 via Frontend Transport; Fri, 13 Sep 2019 16:28:54 +0000 Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; sourceware.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;sourceware.org; dmarc=temperror action=none header.from=arm.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of arm.com: DNS Timeout) Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by VE1EUR03FT044.mail.protection.outlook.com (10.152.19.106) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.14 via Frontend Transport; Fri, 13 Sep 2019 16:28:51 +0000 Received: ("Tessian outbound 55d20e99e8e2:v31"); Fri, 13 Sep 2019 16:28:51 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 16faf5d7191f9d3a X-CR-MTA-TID: 64aa7808 Received: from 068aeac365e8.1 (ip-172-16-0-2.eu-west-1.compute.internal [104.47.8.53]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id 1EDC31E6-E8AC-41CB-8FAE-C9ED1DFDED47.1; Fri, 13 Sep 2019 16:28:46 +0000 Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-am5eur03lp2053.outbound.protection.outlook.com [104.47.8.53]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 068aeac365e8.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384); Fri, 13 Sep 2019 16:28:46 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dQwo52P29cir4nq0NdqqB+CBIvsP1lG6ntYjFFPr1G3Ar9BQTUahY3p7PzfPnY7UppAUPJtmaYZX7AzuZFKr6OeifNhqIQ4+C90SPBel/PYUdFEK+BqFOrZNPbJjDygL/yMUOPLpYQhEfGu4ep48xQl7BrZAu5tIx2y2Qob3dp9u020i9ISpuHH6nRf7p9a4m+d6ynJjsPNZ0Xfx8oFbABq9CF0ic/juiHDY797rLDoze4/CYHlrLUKVUnpT/62tX+S0Vw2o9Q26yPJSHnrx137mWstN174LN3VjZAtw6LjiKZMSFEQvwkm6eCngiZngWT1djv9Bo+WGQEdy2ObX3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pFUaR3tjlMRPtA2PRayCULow8csW38LOZgV+1MmlDlc=; b=Rj43TMtdYw3myOXFJAVpGf+KM4JC61Gd7P56kLLeps4eLH3bBg1PXMBVj6fK7ZC/Ru8YZZ2gH/yrEZ2+iqdy8kJ/WsMcPRmHGRY9tAosKldZKT/83w+MksxzEJrUkOAahmi/njVOuimpM7AB0lei4tElXVvPZQZS05FKVDfdRhnSV8/f1Y26VJ3d3A/8d7AkTvFXCna1nh7WTmw1U03iYBo1vTXWlWsw8koJ+JSPmFnETsWemrKDAoqxWSL+fB5r4yikT4o0XbRsCJpyI4UClkoK6OPLi+CA9kht3EJnWr7nYfH9E0U2TbZ0RTtCOGCM8uNT1YrpwYIobhvHJa3DgA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pFUaR3tjlMRPtA2PRayCULow8csW38LOZgV+1MmlDlc=; b=kdIXaHscjnvFGSvJNgmEIlqXUxlElS8UqpgBG72Ckwgr/zI9SKw0510jfSRBBSM96mqQtyfZIgbCHvLmBcK6i9PK3TSPWKDUXgJDHkxUlJeOuihqVQGJJjjZkhZJlVBFc0AuFBS0py1m5NMwLgDiBqDs7niYzGR41gvzZ344WDk= Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com (10.168.62.22) by VI1PR0801MB2094.eurprd08.prod.outlook.com (10.173.76.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.21; Fri, 13 Sep 2019 16:28:44 +0000 Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::5543:6255:419c:6a7d]) by VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::5543:6255:419c:6a7d%8]) with mapi id 15.20.2263.021; Fri, 13 Sep 2019 16:28:44 +0000 From: Wilco Dijkstra To: "libc-stable@sourceware.org" CC: nd Subject: [2.26 COMMITTED] Backport strstr/memmem performance improvements Thread-Topic: [2.26 COMMITTED] Backport strstr/memmem performance improvements Thread-Index: AQHValApSL7HBE4Y40O/0gF3FBHLww== Date: Tue, 01 Jan 2019 00:00:00 -0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; x-originating-ip: [217.140.106.54] x-ms-publictraffictype: Email X-MS-Office365-Filtering-Correlation-Id: f5764b5c-8f9e-4c26-8aa2-08d7386776a7 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam-Untrusted: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(711020)(4605104)(1401327)(4618075)(2017052603328)(49563074)(7193020);SRVR:VI1PR0801MB2094; X-MS-TrafficTypeDiagnostic: VI1PR0801MB2094:|VI1PR08MB4416: X-MS-Exchange-PUrlCount: 1 X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:5797;OLM:5797; x-forefront-prvs: 0159AC2B97 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4636009)(366004)(39860400002)(346002)(396003)(376002)(136003)(189003)(199004)(81156014)(66946007)(8676002)(81166006)(8936002)(64756008)(76116006)(66446008)(66556008)(66476007)(66616009)(71200400001)(71190400001)(3846002)(6116002)(33656002)(5660300002)(52536014)(2906002)(2351001)(476003)(5640700003)(4326008)(6436002)(316002)(99286004)(6506007)(86362001)(53936002)(102836004)(26005)(186003)(25786009)(66066001)(7696005)(55016002)(9686003)(6306002)(256004)(14444005)(305945005)(74316002)(486006)(99936001)(14454004)(508600001)(6916009)(2501003)(7736002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0801MB2094;H:VI1PR0801MB2127.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info-Original: ewIe1vPFk2d7ocbkxXAojtPh2V5aNBd8kOH1KH+wRB9UW34jDZlPpzg3NGA8j1hcQ168wlbueOjBuPCXUbfW9ZmX+NauNkRSQ9mSMMRFd28XkaAUeGRxaRiy7rtEaG7++IaH5gIdht7ElDVIbDHHpSyqhwn9Rm/GzmoOvgxaocB9xQAN5IdkyZVE9k9wXHpSGOJ6pVU9QHyvdB1wA8SYylTGcLF5GJ1PM5QfuANkEy2vBdJd8Qh/HYnCoU8kaaTyRK+2A3EF6Zu4UKc0GDnzaT3Ag73wLPy9HJp3CJl/IevJNuilaVgjTwu1DIlgv+jUULyH+ObaqqbH+KKpAfutnyK4W9VQ4Cuk/54NNhBSSNJi408Ak9zpNuiEzPoayoOMesERKhgVPQRLai4K5KWgRYrnIxrS02jEdqg/g9gE6yg= x-ms-exchange-transport-forked: True Content-Type: multipart/mixed; boundary="_002_VI1PR0801MB212799191805BC9A89924C3183B30VI1PR0801MB2127_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB2094 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: VE1EUR03FT044.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123;IPV:CAL;SCL:-1;CTRY:IE;EFV:NLI;SFV:NSPM;SFS:(10009020)(4636009)(396003)(39860400002)(346002)(136003)(376002)(199004)(189003)(26826003)(4326008)(86362001)(63350400001)(2351001)(63370400001)(8676002)(9686003)(2476003)(508600001)(356004)(102836004)(26005)(486006)(126002)(99286004)(186003)(6116002)(3846002)(2906002)(6506007)(25786009)(5640700003)(476003)(6306002)(81156014)(22756006)(55016002)(7696005)(99936001)(6916009)(16586007)(76130400001)(70586007)(5660300002)(235185007)(336012)(2501003)(81166006)(70206006)(66616009)(568964002)(52536014)(8936002)(66066001)(305945005)(14444005)(5024004)(33656002)(14454004)(7736002)(74316002)(71190400001)(316002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR08MB4416;H:64aa7808-outbound-1.mta.getcheckrecipient.com;FPR:;SPF:TempError;LANG:en;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;A:1;MX:1; X-MS-Office365-Filtering-Correlation-Id-Prvs: 50aa0d8b-217b-4a9b-d916-08d738677262 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(710020)(711020)(4605104)(1401327)(4618075)(2017052603328)(49563074)(7193020);SRVR:VI1PR08MB4416; NoDisclaimer: True X-Forefront-PRVS: 0159AC2B97 X-Microsoft-Antispam-Message-Info: 8wOL44NRn4SPujrM3T8cXVPGu6pr3rAhxicc8d2gm8O8JBgyyy3VlFlqICqtAqjab1UqAaSzK+/uCGhYuOZykJyzd6Y4m/gUboM5jHNcZuI7UlaxNKmcJWV0Zjndlgwd5K3ZuPIVaxtordB11gER5vRPNONOcCf8B/AJl0UcBaZpsAxIF3ItzVaQColdbSZwCZaUSeHanQh7G5bGGv8PDESBgAMvoHw7kK5WMaD8NhxLqDlDphPjG/M2j16Zn0WuXbFoSOmvSxErR0iclYuUESH0w4mncb8HDbBwm0EBRN/FfPMprZ3welOIN3b4poJOcCjL1ijMVvWvAiaPATwod7/isRW2bBs2IFw/3hUsY83DRR8E41QTP4rZVkwIWZTNubhNj/HjuYz24M2fAkXei1B5Cnnum/3pqQOymLq/X1c= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Sep 2019 16:28:51.7591 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f5764b5c-8f9e-4c26-8aa2-08d7386776a7 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB4416 X-SW-Source: 2019-09/txt/msg00019.txt.bz2 --_002_VI1PR0801MB212799191805BC9A89924C3183B30VI1PR0801MB2127_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-length: 6389 commit 612fba2fe9036732c5ee08f691c52365e5bd32c0 Author: Wilco Dijkstra Date: Wed Jun 12 11:42:34 2019 +0100 Improve performance of memmem =20=20=20=20 This patch significantly improves performance of memmem using a novel modified Horspool algorithm. Needles up to size 256 use a bad-character table indexed by hashed pairs of characters to quickly skip past mismat= ches. Long needles use a self-adapting filtering step to avoid comparing the = whole needle repeatedly. =20=20=20=20 By limiting the needle length to 256, the shift table only requires 8 b= its per entry, lowering preprocessing overhead and minimizing cache effects. This limit also implies worst-case performance is linear. =20=20=20=20 Small needles up to size 2 use a dedicated linear search. Very long ne= edles use the Two-Way algorithm (to avoid increasing stack size or slowing do= wn the common case, inlining is disabled). =20=20=20=20 The performance gain is 6.6 times on English text on AArch64 using rand= om needles with average size 8. =20=20=20=20 Tested against GLIBC testsuite and randomized tests. =20=20=20=20 Reviewed-by: Szabolcs Nagy =20=20=20=20 * string/memmem.c (__memmem): Rewrite to improve performance. =20=20=20=20 (cherry picked from commit 680942b0167715e123d934b609060cd382f8e39f) commit 796c5ee030deac07ed846d9531c1322d57c0a6c7 Author: Wilco Dijkstra Date: Wed Jun 12 11:38:52 2019 +0100 Improve performance of strstr =20=20=20=20 This patch significantly improves performance of strstr using a novel modified Horspool algorithm. Needles up to size 256 use a bad-character table indexed by hashed pairs of characters to quickly skip past mismat= ches. Long needles use a self-adapting filtering step to avoid comparing the = whole needle repeatedly. =20=20=20=20 By limiting the needle length to 256, the shift table only requires 8 b= its per entry, lowering preprocessing overhead and minimizing cache effects. This limit also implies worst-case performance is linear. =20=20=20=20 Small needles up to size 3 use a dedicated linear search. Very long ne= edles use the Two-Way algorithm. =20=20=20=20 The performance gain using the improved bench-strstr on Cortex-A72 is 5= .8 times basic_strstr and 3.7 times twoway_strstr. =20=20=20=20 Tested against GLIBC testsuite, randomized tests and the GNULIB strstr = test (https://git.savannah.gnu.org/cgit/gnulib.git/tree/tests/test-strstr.c). =20=20=20=20 Reviewed-by: Szabolcs Nagy =20=20=20=20 * string/str-two-way.h (two_way_short_needle): Add inline to avoid warning. (two_way_long_needle): Block inlining. * string/strstr.c (strstr2): Add new function. (strstr3): Likewise. (STRSTR): Completely rewrite strstr to improve performance. =20=20=20=20 (cherry picked from commit 5e0a7ecb6629461b28adc1a5aabcc0ede122f201) commit cd3487afa276f817749d3a418e81849130e2dbce Author: Wilco Dijkstra Date: Wed Sep 19 16:50:18 2018 +0100 Fix strstr bug with huge needles (bug 23637) =20=20=20=20 The generic strstr in GLIBC 2.28 fails to match huge needles. The opti= mized AVAILABLE macro reads ahead a large fixed amount to reduce the overhead= of repeatedly checking for the end of the string. However if the needle l= ength is larger than this, two_way_long_needle may confuse this as meaning th= e end of the string and return NULL. This is fixed by adding the needle leng= th to the amount to read ahead. =20=20=20=20 [BZ #23637] * string/test-strstr.c (pr23637): New function. (test_main): Add tests with longer needles. * string/strcasestr.c (AVAILABLE): Fix readahead distance. * string/strstr.c (AVAILABLE): Likewise. =20=20=20=20 (cherry picked from commit 83a552b0bb9fc2a5e80a0ab3723c0a80ce1db9f2) commit ceeba1d73c84f1a551677149ce3b3ed3372fb3ec Author: Rajalakshmi Srinivasaraghavan Date: Tue Aug 28 12:42:19 2018 +0530 Speedup first memmem match =20=20=20=20 As done in commit 284f42bc778e487dfd5dff5c01959f93b9e0c4f5, memcmp can be used after memchr to avoid the initialization overhead of the two-way algorithm for the first match. This has shown improvement >40% for first match. =20=20=20=20 (cherry picked from commit c8dd67e7c958de04c3783cbea7c384431707b5f8) commit c60bf879b21aefedaf632f585b9c39af8532bc71 Author: Wilco Dijkstra Date: Fri Aug 3 17:24:12 2018 +0100 Simplify and speedup strstr/strcasestr first match =20=20=20=20 Looking at the benchtests, both strstr and strcasestr spend a lot of ti= me in a slow initialization loop handling one character per iteration. This can be simplified and use the much faster strlen/strnlen/strchr/me= mcmp. Read ahead a few cachelines to reduce the number of strnlen calls, which improves performance by ~3-4%. This patch improves the time taken for = the full strstr benchtest by >40%. =20=20=20=20 * string/strcasestr.c (STRCASESTR): Simplify and speedup first matc= h. * string/strstr.c (AVAILABLE): Likewise. =20=20=20=20 (cherry picked from commit 284f42bc778e487dfd5dff5c01959f93b9e0c4f5) commit 55a280689e61cb8a7879ebbe0586d031559f1ba4 Author: Wilco Dijkstra Date: Mon Jul 16 17:50:09 2018 +0100 Improve strstr performance =20=20=20=20 Improve strstr performance. Strstr tends to be slow because it uses many calls to memchr and a slow byte loop to scan for the next match. Performance is significantly improved by using strnlen on larger blocks and using strchr to search for the next matching character. strcasestr can also use strnlen to scan ahead, and memmem can use memchr to check for the next match. =20=20=20=20 On the GLIBC bench tests the performance gains on Cortex-A72 are: strstr: +25% strcasestr: +4.3% memmem: +18% =20=20=20=20 On a 256KB dataset strstr performance improves by 67%, strcasestr by 47= %. =20=20=20=20 Reviewd-by: Adhemerval Zanella =20=20=20=20 (cherry picked from commit 3ae725dfb6d7f61447d27d00ed83e573bd5454f4)= --_002_VI1PR0801MB212799191805BC9A89924C3183B30VI1PR0801MB2127_ Content-Type: text/x-patch; name="strstr4.patch" Content-Description: strstr4.patch Content-Disposition: attachment; filename="strstr4.patch"; size=23896; creation-date="Fri, 13 Sep 2019 16:28:38 GMT"; modification-date="Fri, 13 Sep 2019 16:28:38 GMT" Content-Transfer-Encoding: base64 Content-length: 32396 ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAyYTli NmVkLi41ZjNkZjMyIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hh bmdlTG9nCkBAIC0xLDQgKzEsNDcgQEAKLTIwMTktMDEtMDkgIFdpbGNvIERp amtzdHJhICA8d2RpamtzdHJAYXJtLmNvbT4KKzIwMTktMDktMTMgIFdpbGNv IERpamtzdHJhICA8d2RpamtzdHJAYXJtLmNvbT4KKworCSogc3RyaW5nL21l bW1lbS5jIChfX21lbW1lbSk6IFJld3JpdGUgdG8gaW1wcm92ZSBwZXJmb3Jt YW5jZS4KKworMjAxOS0wNi0xMiAgV2lsY28gRGlqa3N0cmEgIDx3ZGlqa3N0 ckBhcm0uY29tPgorCisJKiBzdHJpbmcvc3RyLXR3by13YXkuaCAodHdvX3dh eV9zaG9ydF9uZWVkbGUpOiBBZGQgaW5saW5lIHRvIGF2b2lkCisJd2Fybmlu Zy4KKwkodHdvX3dheV9sb25nX25lZWRsZSk6IEJsb2NrIGlubGluaW5nLgor CSogc3RyaW5nL3N0cnN0ci5jIChzdHJzdHIyKTogQWRkIG5ldyBmdW5jdGlv bi4KKwkoc3Ryc3RyMyk6IExpa2V3aXNlLgorCShTVFJTVFIpOiBDb21wbGV0 ZWx5IHJld3JpdGUgc3Ryc3RyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisK KzIwMTktMDktMTMgIFdpbGNvIERpamtzdHJhICA8d2RpamtzdHJAYXJtLmNv bT4KKworCVtCWiAjMjM2MzddCisJKiBzdHJpbmcvdGVzdC1zdHJzdHIuYyAo cHIyMzYzNyk6IE5ldyBmdW5jdGlvbi4KKwkodGVzdF9tYWluKTogQWRkIHRl c3RzIHdpdGggbG9uZ2VyIG5lZWRsZXMuCisJKiBzdHJpbmcvc3RyY2FzZXN0 ci5jIChBVkFJTEFCTEUpOiBGaXggcmVhZGFoZWFkIGRpc3RhbmNlLgorCSog c3RyaW5nL3N0cnN0ci5jIChBVkFJTEFCTEUpOiBMaWtld2lzZS4KKworMjAx OS0wOS0xMyAgUmFqYWxha3NobWkgU3Jpbml2YXNhcmFnaGF2YW4gIDxyYWpp QGxpbnV4LnZuZXQuaWJtLmNvbT4KKworCSogc3RyaW5nL21lbW1lbS5jOiBV c2UgbWVtY21wIGZvciBmaXJzdCBtYXRjaC4KKworMjAxOS0wOS0xMyAgV2ls Y28gRGlqa3N0cmEgIDx3ZGlqa3N0ckBhcm0uY29tPgorCisJKiBzdHJpbmcv c3RyY2FzZXN0ci5jIChTVFJDQVNFU1RSKTogU2ltcGxpZnkgYW5kIHNwZWVk dXAgZmlyc3QgbWF0Y2guCisJKiBzdHJpbmcvc3Ryc3RyLmMgKEFWQUlMQUJM RSk6IExpa2V3aXNlLgorCisyMDE5LTA5LTEzICBXaWxjbyBEaWprc3RyYSAg PHdkaWprc3RyQGFybS5jb20+CisKKwkqIGJlbmNodGVzdHMvYmVuY2gtc3Ry Y2FzZXN0ci5jOiBSZW5hbWUgX19zdHJubGVuIHRvIHN0cm5sZW4uCisJKiBi ZW5jaHRlc3RzL2JlbmNoLXN0cnN0ci5jOiBMaWtld2lzZS4KKwkqIHN0cmlu Zy9tZW1tZW0uYyAoRkFTVFNFQVJDSCk6IERlZmluZS4KKwkqIHN0cmluZy9z dHItdHdvLXdheS5oICh0d29fd2F5X3Nob3J0X25lZWRsZSk6IE1pbm9yIGNs ZWFudXBzLgorCUFkZCBzdXBwb3J0IGZvciBGQVNUU0VBUkNILgorCSogc3Ry aW5nL3N0cmNhc2VzdHIuYyAoQVZBSUxBQkxFKTogVXNlIHJlYWQtYWhlYWQg X19zdHJubGVuLgorCSogc3RyaW5nL3N0cnN0ci5jIChBVkFJTEFCTEUpOiBV c2UgcmVhZC1haGVhZCBfX3N0cm5sZW4uCisJKEZBU1RTRUFSQ0gpOiBEZWZp bmUuCisJKiBzdHJpbmcvdGVzdC1zdHJjYXNlc3RyLmM6IFJlbmFtZSBfX3N0 cm5sZW4gdG8gc3Rybmxlbi4KKwkqIHN0cmluZy90ZXN0LXN0cnN0ci5jOiBM aWtld2lzZS4KKworMjAxOS0wOS0wNiAgV2lsY28gRGlqa3N0cmEgIDx3ZGlq a3N0ckBhcm0uY29tPgogCiAJKiBtYW51YWwvdHVuYWJsZXMudGV4aSAoZ2xp YmMuY3B1Lm5hbWUpOiBBZGQgYXJlcyB0dW5hYmxlLgogCSogc3lzZGVwcy9h YXJjaDY0L211bHRpYXJjaC9tZW1jcHkuYyAoX19saWJjX21lbWNweSk6IFVz ZQpkaWZmIC0tZ2l0IGEvYmVuY2h0ZXN0cy9iZW5jaC1zdHJjYXNlc3RyLmMg Yi9iZW5jaHRlc3RzL2JlbmNoLXN0cmNhc2VzdHIuYwppbmRleCA0ZTZmNDgw Li45YTAzMWIzIDEwMDY0NAotLS0gYS9iZW5jaHRlc3RzL2JlbmNoLXN0cmNh c2VzdHIuYworKysgYi9iZW5jaHRlc3RzL2JlbmNoLXN0cmNhc2VzdHIuYwpA QCAtMjQsNiArMjQsNyBAQAogI2RlZmluZSBTVFJDQVNFU1RSIHNpbXBsZV9z dHJjYXNlc3RyCiAjZGVmaW5lIE5PX0FMSUFTCiAjZGVmaW5lIF9fc3RybmNh c2VjbXAgc3RybmNhc2VjbXAKKyNkZWZpbmUgX19zdHJubGVuIHN0cm5sZW4K ICNpbmNsdWRlICIuLi9zdHJpbmcvc3RyY2FzZXN0ci5jIgogCiAKZGlmZiAt LWdpdCBhL2JlbmNodGVzdHMvYmVuY2gtc3Ryc3RyLmMgYi9iZW5jaHRlc3Rz L2JlbmNoLXN0cnN0ci5jCmluZGV4IGU2MzY1OWYuLjJmYTY0MTEgMTAwNjQ0 Ci0tLSBhL2JlbmNodGVzdHMvYmVuY2gtc3Ryc3RyLmMKKysrIGIvYmVuY2h0 ZXN0cy9iZW5jaC1zdHJzdHIuYwpAQCAtMjIsNiArMjIsOSBAQAogCiAKICNk ZWZpbmUgU1RSU1RSIHNpbXBsZV9zdHJzdHIKKyN1bmRlZiBsaWJjX2hpZGRl bl9idWlsdGluX2RlZgorI2RlZmluZSBsaWJjX2hpZGRlbl9idWlsdGluX2Rl ZihYKQorI2RlZmluZSBfX3N0cm5sZW4gc3RybmxlbgogI2luY2x1ZGUgIi4u L3N0cmluZy9zdHJzdHIuYyIKIAogCmRpZmYgLS1naXQgYS9zdHJpbmcvbWVt bWVtLmMgYi9zdHJpbmcvbWVtbWVtLmMKaW5kZXggNTRmY2E0OS4uZmJhN2Zl MyAxMDA2NDQKLS0tIGEvc3RyaW5nL21lbW1lbS5jCisrKyBiL3N0cmluZy9t ZW1tZW0uYwpAQCAtMTUsNjcgKzE1LDExNSBAQAogICAgTGljZW5zZSBhbG9u ZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICAgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KIAotLyogVGhpcyBw YXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIGJ5IEVyaWMg Qmxha2UsIDIwMDguICAqLwotCiAjaWZuZGVmIF9MSUJDCiAjIGluY2x1ZGUg PGNvbmZpZy5oPgogI2VuZGlmCiAKLS8qIFNwZWNpZmljYXRpb24gb2YgbWVt bWVtLiAgKi8KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2lmbmRlZiBfTElC QwotIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpICAgKGV4 cHIpCiAjIGRlZmluZSBfX21lbW1lbQltZW1tZW0KICNlbmRpZgogCiAjZGVm aW5lIFJFVFVSTl9UWVBFIHZvaWQgKgogI2RlZmluZSBBVkFJTEFCTEUoaCwg aF9sLCBqLCBuX2wpICgoaikgPD0gKGhfbCkgLSAobl9sKSkKKyNkZWZpbmUg RkFTVFNFQVJDSChTLEMsTikgKHZvaWQqKSBtZW1jaHIgKCh2b2lkICopKFMp LCAoQyksIChOKSkKICNpbmNsdWRlICJzdHItdHdvLXdheS5oIgogCiAjdW5k ZWYgbWVtbWVtCiAKLS8qIFJldHVybiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBv ZiBORUVETEUgaW4gSEFZU1RBQ0suICBSZXR1cm4gSEFZU1RBQ0sKLSAgIGlm IE5FRURMRV9MRU4gaXMgMCwgb3RoZXJ3aXNlIE5VTEwgaWYgTkVFRExFIGlz IG5vdCBmb3VuZCBpbgotICAgSEFZU1RBQ0suICAqLworLyogSGFzaCBjaGFy YWN0ZXIgcGFpcnMgc28gYSBzbWFsbCBzaGlmdCB0YWJsZSBjYW4gYmUgdXNl ZC4gIEFsbCBiaXRzIG9mCisgICBwWzBdIGFyZSBpbmNsdWRlZCwgYnV0IG5v dCBhbGwgYml0cyBmcm9tIHBbLTFdLiAgU28gaWYgdHdvIGVxdWFsIGhhc2hl cworICAgbWF0Y2ggb24gcFstMV0sIHBbMF0gbWF0Y2hlcyB0b28uICBIYXNo IGNvbGxpc2lvbnMgYXJlIGhhcm1sZXNzIGFuZCByZXN1bHQKKyAgIGluIHNt YWxsZXIgc2hpZnRzLiAgKi8KKyNkZWZpbmUgaGFzaDIocCkgKCgoc2l6ZV90 KShwKVswXSAtICgoc2l6ZV90KShwKVstMV0gPDwgMykpICUgc2l6ZW9mIChz aGlmdCkpCisKKy8qIEZhc3QgbWVtbWVtIGFsZ29yaXRobSB3aXRoIGd1YXJh bnRlZWQgbGluZWFyLXRpbWUgcGVyZm9ybWFuY2UuCisgICBTbWFsbCBuZWVk bGVzIHVwIHRvIHNpemUgMiB1c2UgYSBkZWRpY2F0ZWQgbGluZWFyIHNlYXJj aC4gIExvbmdlciBuZWVkbGVzCisgICB1cCB0byBzaXplIDI1NiB1c2UgYSBu b3ZlbCBtb2RpZmllZCBIb3JzcG9vbCBhbGdvcml0aG0uICBJdCBoYXNoZXMg cGFpcnMKKyAgIG9mIGNoYXJhY3RlcnMgdG8gcXVpY2tseSBza2lwIHBhc3Qg bWlzbWF0Y2hlcy4gIFRoZSBtYWluIHNlYXJjaCBsb29wIG9ubHkKKyAgIGV4 aXRzIGlmIHRoZSBsYXN0IDIgY2hhcmFjdGVycyBtYXRjaCwgYXZvaWRpbmcg dW5uZWNlc3NhcnkgY2FsbHMgdG8gbWVtY21wCisgICBhbmQgYWxsb3dpbmcg Zm9yIGEgbGFyZ2VyIHNraXAgaWYgdGhlcmUgaXMgbm8gbWF0Y2guICBBIHNl bGYtYWRhcHRpbmcKKyAgIGZpbHRlcmluZyBjaGVjayBpcyB1c2VkIHRvIHF1 aWNrbHkgZGV0ZWN0IG1pc21hdGNoZXMgaW4gbG9uZyBuZWVkbGVzLgorICAg QnkgbGltaXRpbmcgdGhlIG5lZWRsZSBsZW5ndGggdG8gMjU2LCB0aGUgc2hp ZnQgdGFibGUgY2FuIGJlIHJlZHVjZWQgdG8gOAorICAgYml0cyBwZXIgZW50 cnksIGxvd2VyaW5nIHByZXByb2Nlc3Npbmcgb3ZlcmhlYWQgYW5kIG1pbmlt aXppbmcgY2FjaGUgZWZmZWN0cy4KKyAgIFRoZSBsaW1pdCBhbHNvIGltcGxp ZXMgd29yc3QtY2FzZSBwZXJmb3JtYW5jZSBpcyBsaW5lYXIuCisgICBOZWVk bGVzIGxhcmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzIHVzZSB0aGUgbGluZWFy LXRpbWUgVHdvLVdheSBhbGdvcml0aG0uICAqLwogdm9pZCAqCi1fX21lbW1l bSAoY29uc3Qgdm9pZCAqaGF5c3RhY2tfc3RhcnQsIHNpemVfdCBoYXlzdGFj a19sZW4sCi0JICBjb25zdCB2b2lkICpuZWVkbGVfc3RhcnQsIHNpemVfdCBu ZWVkbGVfbGVuKQorX19tZW1tZW0gKGNvbnN0IHZvaWQgKmhheXN0YWNrLCBz aXplX3QgaHNfbGVuLAorCSAgY29uc3Qgdm9pZCAqbmVlZGxlLCBzaXplX3Qg bmVfbGVuKQogewotICAvKiBBYnN0cmFjdCBtZW1vcnkgaXMgY29uc2lkZXJl ZCB0byBiZSBhbiBhcnJheSBvZiAndW5zaWduZWQgY2hhcicgdmFsdWVzLAot ICAgICBub3QgYW4gYXJyYXkgb2YgJ2NoYXInIHZhbHVlcy4gIFNlZSBJU08g QyA5OSBzZWN0aW9uIDYuMi42LjEuICAqLwotICBjb25zdCB1bnNpZ25lZCBj aGFyICpoYXlzdGFjayA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0 YWNrX3N0YXJ0OwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZWVkbGUgPSAo Y29uc3QgdW5zaWduZWQgY2hhciAqKSBuZWVkbGVfc3RhcnQ7Ci0KLSAgaWYg KG5lZWRsZV9sZW4gPT0gMCkKLSAgICAvKiBUaGUgZmlyc3Qgb2NjdXJyZW5j ZSBvZiB0aGUgZW1wdHkgc3RyaW5nIGlzIGRlZW1lZCB0byBvY2N1ciBhdAot ICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4gICovCi0gICAg cmV0dXJuICh2b2lkICopIGhheXN0YWNrOwotCi0gIC8qIFNhbml0eSBjaGVj aywgb3RoZXJ3aXNlIHRoZSBsb29wIG1pZ2h0IHNlYXJjaCB0aHJvdWdoIHRo ZSB3aG9sZQotICAgICBtZW1vcnkuICAqLwotICBpZiAoX19nbGliY191bmxp a2VseSAoaGF5c3RhY2tfbGVuIDwgbmVlZGxlX2xlbikpCisgIGNvbnN0IHVu c2lnbmVkIGNoYXIgKmhzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaGF5 c3RhY2s7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5lID0gKGNvbnN0IHVu c2lnbmVkIGNoYXIgKikgbmVlZGxlOworCisgIGlmIChuZV9sZW4gPT0gMCkK KyAgICByZXR1cm4gKHZvaWQgKikgaHM7CisgIGlmIChuZV9sZW4gPT0gMSkK KyAgICByZXR1cm4gKHZvaWQgKikgbWVtY2hyIChocywgbmVbMF0sIGhzX2xl bik7CisKKyAgLyogRW5zdXJlIGhheXN0YWNrIGxlbmd0aCBpcyA+PSBuZWVk bGUgbGVuZ3RoLiAgKi8KKyAgaWYgKGhzX2xlbiA8IG5lX2xlbikKICAgICBy ZXR1cm4gTlVMTDsKIAotICAvKiBVc2Ugb3B0aW1pemF0aW9ucyBpbiBtZW1j aHIgd2hlbiBwb3NzaWJsZSwgdG8gcmVkdWNlIHRoZSBzZWFyY2gKLSAgICAg c2l6ZSBvZiBoYXlzdGFjayB1c2luZyBhIGxpbmVhciBhbGdvcml0aG0gd2l0 aCBhIHNtYWxsZXIKLSAgICAgY29lZmZpY2llbnQuICBIb3dldmVyLCBhdm9p ZCBtZW1jaHIgZm9yIGxvbmcgbmVlZGxlcywgc2luY2Ugd2UKLSAgICAgY2Fu IG9mdGVuIGFjaGlldmUgc3VibGluZWFyIHBlcmZvcm1hbmNlLiAgKi8KLSAg aWYgKG5lZWRsZV9sZW4gPCBMT05HX05FRURMRV9USFJFU0hPTEQpCisgIGNv bnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IGhzICsgaHNfbGVuIC0gbmVfbGVu OworCisgIGlmIChuZV9sZW4gPT0gMikKKyAgICB7CisgICAgICB1aW50MzJf dCBudyA9IG5lWzBdIDw8IDE2IHwgbmVbMV0sIGh3ID0gaHNbMF0gPDwgMTYg fCBoc1sxXTsKKyAgICAgIGZvciAoaHMrKzsgaHMgPD0gZW5kICYmIGh3ICE9 IG53OyApCisJaHcgPSBodyA8PCAxNiB8ICorK2hzOworICAgICAgcmV0dXJu IGh3ID09IG53ID8gKHZvaWQgKilocyAtIDEgOiBOVUxMOworICAgIH0KKwor ICAvKiBVc2UgVHdvLVdheSBhbGdvcml0aG0gZm9yIHZlcnkgbG9uZyBuZWVk bGVzLiAgKi8KKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKG5lX2xlbiA+IDI1 NiwgMCkpCisgICAgcmV0dXJuIHR3b193YXlfbG9uZ19uZWVkbGUgKGhzLCBo c19sZW4sIG5lLCBuZV9sZW4pOworCisgIHVpbnQ4X3Qgc2hpZnRbMjU2XTsK KyAgc2l6ZV90IHRtcCwgc2hpZnQxOworICBzaXplX3QgbTEgPSBuZV9sZW4g LSAxOworICBzaXplX3Qgb2Zmc2V0ID0gMDsKKworICBtZW1zZXQgKHNoaWZ0 LCAwLCBzaXplb2YgKHNoaWZ0KSk7CisgIGZvciAoaW50IGkgPSAxOyBpIDwg bTE7IGkrKykKKyAgICBzaGlmdFtoYXNoMiAobmUgKyBpKV0gPSBpOworICAv KiBTaGlmdDEgaXMgdGhlIGFtb3VudCB3ZSBjYW4gc2tpcCBhZnRlciBtYXRj aGluZyB0aGUgaGFzaCBvZiB0aGUKKyAgICAgbmVlZGxlIGVuZCBidXQgbm90 IHRoZSBmdWxsIG5lZWRsZS4gICovCisgIHNoaWZ0MSA9IG0xIC0gc2hpZnRb aGFzaDIgKG5lICsgbTEpXTsKKyAgc2hpZnRbaGFzaDIgKG5lICsgbTEpXSA9 IG0xOworCisgIGZvciAoIDsgaHMgPD0gZW5kOyApCiAgICAgewotICAgICAg aGF5c3RhY2sgPSBtZW1jaHIgKGhheXN0YWNrLCAqbmVlZGxlLCBoYXlzdGFj a19sZW4pOwotICAgICAgaWYgKCFoYXlzdGFjayB8fCBfX2J1aWx0aW5fZXhw ZWN0IChuZWVkbGVfbGVuID09IDEsIDApKQotCXJldHVybiAodm9pZCAqKSBo YXlzdGFjazsKLSAgICAgIGhheXN0YWNrX2xlbiAtPSBoYXlzdGFjayAtIChj b25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0YWNrX3N0YXJ0OwotICAgICAg aWYgKGhheXN0YWNrX2xlbiA8IG5lZWRsZV9sZW4pCi0JcmV0dXJuIE5VTEw7 Ci0gICAgICByZXR1cm4gdHdvX3dheV9zaG9ydF9uZWVkbGUgKGhheXN0YWNr LCBoYXlzdGFja19sZW4sIG5lZWRsZSwgbmVlZGxlX2xlbik7CisgICAgICAv KiBTa2lwIHBhc3QgY2hhcmFjdGVyIHBhaXJzIG5vdCBpbiB0aGUgbmVlZGxl LiAgKi8KKyAgICAgIGRvCisJeworCSAgaHMgKz0gbTE7CisJICB0bXAgPSBz aGlmdFtoYXNoMiAoaHMpXTsKKwl9CisgICAgICB3aGlsZSAodG1wID09IDAg JiYgaHMgPD0gZW5kKTsKKworICAgICAgLyogSWYgdGhlIG1hdGNoIGlzIG5v dCBhdCB0aGUgZW5kIG9mIHRoZSBuZWVkbGUsIHNoaWZ0IHRvIHRoZSBlbmQK KwkgYW5kIGNvbnRpbnVlIHVudGlsIHdlIG1hdGNoIHRoZSBoYXNoIG9mIHRo ZSBuZWVkbGUgZW5kLiAgKi8KKyAgICAgIGhzIC09IHRtcDsKKyAgICAgIGlm ICh0bXAgPCBtMSkKKwljb250aW51ZTsKKworICAgICAgLyogSGFzaCBvZiB0 aGUgbGFzdCAyIGNoYXJhY3RlcnMgbWF0Y2hlcy4gIElmIHRoZSBuZWVkbGUg aXMgbG9uZywKKwkgdHJ5IHRvIHF1aWNrbHkgZmlsdGVyIG91dCBtaXNtYXRj aGVzLiAgKi8KKyAgICAgIGlmIChtMSA8IDE1IHx8IG1lbWNtcCAoaHMgKyBv ZmZzZXQsIG5lICsgb2Zmc2V0LCA4KSA9PSAwKQorCXsKKwkgIGlmIChtZW1j bXAgKGhzLCBuZSwgbTEpID09IDApCisJICAgIHJldHVybiAodm9pZCAqKSBo czsKKworCSAgLyogQWRqdXN0IGZpbHRlciBvZmZzZXQgd2hlbiBpdCBkb2Vz bid0IGZpbmQgdGhlIG1pc21hdGNoLiAgKi8KKwkgIG9mZnNldCA9IChvZmZz ZXQgPj0gOCA/IG9mZnNldCA6IG0xKSAtIDg7CisJfQorCisgICAgICAvKiBT a2lwIGJhc2VkIG9uIG1hdGNoaW5nIHRoZSBoYXNoIG9mIHRoZSBuZWVkbGUg ZW5kLiAgKi8KKyAgICAgIGhzICs9IHNoaWZ0MTsKICAgICB9Ci0gIGVsc2UK LSAgICByZXR1cm4gdHdvX3dheV9sb25nX25lZWRsZSAoaGF5c3RhY2ssIGhh eXN0YWNrX2xlbiwgbmVlZGxlLCBuZWVkbGVfbGVuKTsKKyAgcmV0dXJuIE5V TEw7CiB9CiBsaWJjX2hpZGRlbl9kZWYgKF9fbWVtbWVtKQogd2Vha19hbGlh cyAoX19tZW1tZW0sIG1lbW1lbSkKIGxpYmNfaGlkZGVuX3dlYWsgKG1lbW1l bSkKLQotI3VuZGVmIExPTkdfTkVFRExFX1RIUkVTSE9MRApkaWZmIC0tZ2l0 IGEvc3RyaW5nL3N0ci10d28td2F5LmggYi9zdHJpbmcvc3RyLXR3by13YXku aAppbmRleCA1OTljODY3Li4zMGFjYTMwIDEwMDY0NAotLS0gYS9zdHJpbmcv c3RyLXR3by13YXkuaAorKysgYi9zdHJpbmcvc3RyLXR3by13YXkuaApAQCAt MjIxLDcgKzIyMSw3IEBAIGNyaXRpY2FsX2ZhY3Rvcml6YXRpb24gKGNvbnN0 IHVuc2lnbmVkIGNoYXIgKm5lZWRsZSwgc2l6ZV90IG5lZWRsZV9sZW4sCiAg ICBtb3N0IDIgKiBIQVlTVEFDS19MRU4gLSBORUVETEVfTEVOIGNvbXBhcmlz b25zIG9jY3VyIGluIHNlYXJjaGluZy4KICAgIElmIEFWQUlMQUJMRSBtb2Rp ZmllcyBIQVlTVEFDS19MRU4gKGFzIGluIHN0cnN0ciksIHRoZW4gYXQgbW9z dCAzICoKICAgIEhBWVNUQUNLX0xFTiAtIE5FRURMRV9MRU4gY29tcGFyaXNv bnMgb2NjdXIgaW4gc2VhcmNoaW5nLiAgKi8KLXN0YXRpYyBSRVRVUk5fVFlQ RQorc3RhdGljIGlubGluZSBSRVRVUk5fVFlQRQogdHdvX3dheV9zaG9ydF9u ZWVkbGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhheXN0YWNrLCBzaXplX3Qg aGF5c3RhY2tfbGVuLAogCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpu ZWVkbGUsIHNpemVfdCBuZWVkbGVfbGVuKQogewpAQCAtMjgxLDUwICsyODEs NTAgQEAgdHdvX3dheV9zaG9ydF9uZWVkbGUgKGNvbnN0IHVuc2lnbmVkIGNo YXIgKmhheXN0YWNrLCBzaXplX3QgaGF5c3RhY2tfbGVuLAogICAgIH0KICAg ZWxzZQogICAgIHsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBoYXlz dGFjayA9ICZoYXlzdGFja1tzdWZmaXhdOworICAgICAgY29uc3QgdW5zaWdu ZWQgY2hhciAqcGhheXN0YWNrOwogICAgICAgLyogVGhlIGNvbXBhcmlzb24g YWx3YXlzIHN0YXJ0cyBmcm9tIG5lZWRsZVtzdWZmaXhdLCBzbyBjYWNoZSBp dAogCSBhbmQgdXNlIGFuIG9wdGltaXplZCBmaXJzdC1jaGFyYWN0ZXIgbG9v cC4gICovCiAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZV9zdWZmaXggPSBD QU5PTl9FTEVNRU5UIChuZWVkbGVbc3VmZml4XSk7CiAKLSNpZiBDSEVDS19F T0wKLSAgICAgIC8qIFdlIHN0YXJ0IG1hdGNoaW5nIGZyb20gdGhlIFNVRkZJ WCd0aCBlbGVtZW50LCBzbyBtYWtlIHN1cmUgd2UKLQkgZG9uJ3QgaGl0ICdc MCcgYmVmb3JlIHRoYXQuICAqLwotICAgICAgaWYgKGhheXN0YWNrX2xlbiA8 IHN1ZmZpeCArIDEKLQkgICYmICFBVkFJTEFCTEUgKGhheXN0YWNrLCBoYXlz dGFja19sZW4sIDAsIHN1ZmZpeCArIDEpKQotCXJldHVybiBOVUxMOwotI2Vu ZGlmCi0KICAgICAgIC8qIFRoZSB0d28gaGFsdmVzIG9mIG5lZWRsZSBhcmUg ZGlzdGluY3Q7IG5vIGV4dHJhIG1lbW9yeSBpcwogCSByZXF1aXJlZCwgYW5k IGFueSBtaXNtYXRjaCByZXN1bHRzIGluIGEgbWF4aW1hbCBzaGlmdC4gICov CiAgICAgICBwZXJpb2QgPSBNQVggKHN1ZmZpeCwgbmVlZGxlX2xlbiAtIHN1 ZmZpeCkgKyAxOwogICAgICAgaiA9IDA7Ci0gICAgICB3aGlsZSAoMQotI2lm ICFDSEVDS19FT0wKLQkgICAgICYmIEFWQUlMQUJMRSAoaGF5c3RhY2ssIGhh eXN0YWNrX2xlbiwgaiwgbmVlZGxlX2xlbikKLSNlbmRpZgotCSAgICAgKQor ICAgICAgd2hpbGUgKEFWQUlMQUJMRSAoaGF5c3RhY2ssIGhheXN0YWNrX2xl biwgaiwgbmVlZGxlX2xlbikpCiAJewogCSAgdW5zaWduZWQgY2hhciBoYXlz dGFja19jaGFyOwogCSAgY29uc3QgdW5zaWduZWQgY2hhciAqcG5lZWRsZTsK IAotCSAgLyogVE9ETzogVGhlIGZpcnN0LWNoYXJhY3RlciBsb29wIGNhbiBi ZSBzcGVkIHVwIGJ5IGFkYXB0aW5nCi0JICAgICBsb25nd29yZC1hdC1hLXRp bWUgaW1wbGVtZW50YXRpb24gb2YgbWVtY2hyL3N0cmNoci4gICovCi0JICBp ZiAobmVlZGxlX3N1ZmZpeAorCSAgcGhheXN0YWNrID0gJmhheXN0YWNrW3N1 ZmZpeCArIGpdOworCisjaWZkZWYgRkFTVFNFQVJDSAorCSAgaWYgKCpwaGF5 c3RhY2srKyAhPSBuZWVkbGVfc3VmZml4KQorCSAgICB7CisJICAgICAgcGhh eXN0YWNrID0gRkFTVFNFQVJDSCAocGhheXN0YWNrLCBuZWVkbGVfc3VmZml4 LAorCQkJCSAgICAgIGhheXN0YWNrX2xlbiAtIG5lZWRsZV9sZW4gLSBqKTsK KwkgICAgICBpZiAocGhheXN0YWNrID09IE5VTEwpCisJCWdvdG8gcmV0MDsK KwkgICAgICBqID0gcGhheXN0YWNrIC0gJmhheXN0YWNrW3N1ZmZpeF07CisJ ICAgICAgcGhheXN0YWNrKys7CisJICAgIH0KKyNlbHNlCisJICB3aGlsZSAo bmVlZGxlX3N1ZmZpeAogCSAgICAgICE9IChoYXlzdGFja19jaGFyID0gQ0FO T05fRUxFTUVOVCAoKnBoYXlzdGFjaysrKSkpCiAJICAgIHsKIAkgICAgICBS RVQwX0lGXzAgKGhheXN0YWNrX2NoYXIpOwotI2lmICFDSEVDS19FT0wKKyMg aWYgIUNIRUNLX0VPTAogCSAgICAgICsrajsKLSNlbmRpZgotCSAgICAgIGNv bnRpbnVlOworCSAgICAgIGlmICghQVZBSUxBQkxFIChoYXlzdGFjaywgaGF5 c3RhY2tfbGVuLCBqLCBuZWVkbGVfbGVuKSkKKwkJZ290byByZXQwOworIyBl bmRpZgogCSAgICB9CiAKLSNpZiBDSEVDS19FT0wKKyMgaWYgQ0hFQ0tfRU9M CiAJICAvKiBDYWxjdWxhdGUgSiBpZiBpdCB3YXNuJ3Qga2VwdCB1cC10by1k YXRlIGluIHRoZSBmaXJzdC1jaGFyYWN0ZXIKIAkgICAgIGxvb3AuICAqLwog CSAgaiA9IHBoYXlzdGFjayAtICZoYXlzdGFja1tzdWZmaXhdIC0gMTsKKyMg ZW5kaWYKICNlbmRpZgotCiAJICAvKiBTY2FuIGZvciBtYXRjaGVzIGluIHJp Z2h0IGhhbGYuICAqLwogCSAgaSA9IHN1ZmZpeCArIDE7CiAJICBwbmVlZGxl ID0gJm5lZWRsZVtpXTsKQEAgLTMzOCw2ICszMzgsMTEgQEAgdHdvX3dheV9z aG9ydF9uZWVkbGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhheXN0YWNrLCBz aXplX3QgaGF5c3RhY2tfbGVuLAogCQl9CiAJICAgICAgKytpOwogCSAgICB9 CisjaWYgQ0hFQ0tfRU9MCisJICAvKiBVcGRhdGUgbWluaW1hbCBsZW5ndGgg b2YgaGF5c3RhY2suICAqLworCSAgaWYgKHBoYXlzdGFjayA+IGhheXN0YWNr ICsgaGF5c3RhY2tfbGVuKQorCSAgICBoYXlzdGFja19sZW4gPSBwaGF5c3Rh Y2sgLSBoYXlzdGFjazsKKyNlbmRpZgogCSAgaWYgKG5lZWRsZV9sZW4gPD0g aSkKIAkgICAgewogCSAgICAgIC8qIFNjYW4gZm9yIG1hdGNoZXMgaW4gbGVm dCBoYWxmLiAgKi8KQEAgLTM2MCwxMyArMzY1LDYgQEAgdHdvX3dheV9zaG9y dF9uZWVkbGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhheXN0YWNrLCBzaXpl X3QgaGF5c3RhY2tfbGVuLAogCSAgICB9CiAJICBlbHNlCiAJICAgIGogKz0g aSAtIHN1ZmZpeCArIDE7Ci0KLSNpZiBDSEVDS19FT0wKLQkgIGlmICghQVZB SUxBQkxFIChoYXlzdGFjaywgaGF5c3RhY2tfbGVuLCBqLCBuZWVkbGVfbGVu KSkKLQkgICAgYnJlYWs7Ci0jZW5kaWYKLQotCSAgcGhheXN0YWNrID0gJmhh eXN0YWNrW3N1ZmZpeCArIGpdOwogCX0KICAgICB9CiAgcmV0MDogX19hdHRy aWJ1dGVfXyAoKHVudXNlZCkpCkBAIC0zODQsOCArMzgyLDExIEBAIHR3b193 YXlfc2hvcnRfbmVlZGxlIChjb25zdCB1bnNpZ25lZCBjaGFyICpoYXlzdGFj aywgc2l6ZV90IGhheXN0YWNrX2xlbiwKICAgIGFuZCBzdWJsaW5lYXIgcGVy Zm9ybWFuY2UgTyhIQVlTVEFDS19MRU4gLyBORUVETEVfTEVOKSBpcyBwb3Nz aWJsZS4KICAgIElmIEFWQUlMQUJMRSBtb2RpZmllcyBIQVlTVEFDS19MRU4g KGFzIGluIHN0cnN0ciksIHRoZW4gYXQgbW9zdCAzICoKICAgIEhBWVNUQUNL X0xFTiAtIE5FRURMRV9MRU4gY29tcGFyaXNvbnMgb2NjdXIgaW4gc2VhcmNo aW5nLCBhbmQKLSAgIHN1YmxpbmVhciBwZXJmb3JtYW5jZSBpcyBub3QgcG9z c2libGUuICAqLwotc3RhdGljIFJFVFVSTl9UWVBFCisgICBzdWJsaW5lYXIg cGVyZm9ybWFuY2UgaXMgbm90IHBvc3NpYmxlLgorCisgICBTaW5jZSB0aGlz IGZ1bmN0aW9uIGlzIGxhcmdlIGFuZCBjb21wbGV4LCBibG9jayBpbmxpbmlu ZyB0byBhdm9pZAorICAgc2xvd2luZyBkb3duIHRoZSBjb21tb24gY2FzZSBv ZiBzbWFsbCBuZWVkbGVzLiAgKi8KK19fYXR0cmlidXRlX18oKG5vaW5saW5l KSkgc3RhdGljIFJFVFVSTl9UWVBFCiB0d29fd2F5X2xvbmdfbmVlZGxlIChj b25zdCB1bnNpZ25lZCBjaGFyICpoYXlzdGFjaywgc2l6ZV90IGhheXN0YWNr X2xlbiwKIAkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZWVkbGUsIHNp emVfdCBuZWVkbGVfbGVuKQogewpkaWZmIC0tZ2l0IGEvc3RyaW5nL3N0cmNh c2VzdHIuYyBiL3N0cmluZy9zdHJjYXNlc3RyLmMKaW5kZXggMmFjZjAwMy4u MTllYTFkNCAxMDA2NDQKLS0tIGEvc3RyaW5nL3N0cmNhc2VzdHIuYworKysg Yi9zdHJpbmcvc3RyY2FzZXN0ci5jCkBAIC0zNyw4ICszNyw5IEBACiAvKiBU d28tV2F5IGFsZ29yaXRobS4gICovCiAjZGVmaW5lIFJFVFVSTl9UWVBFIGNo YXIgKgogI2RlZmluZSBBVkFJTEFCTEUoaCwgaF9sLCBqLCBuX2wpCQkJXAot ICAoIW1lbWNociAoKGgpICsgKGhfbCksICdcMCcsIChqKSArIChuX2wpIC0g KGhfbCkpCVwKLSAgICYmICgoaF9sKSA9IChqKSArIChuX2wpKSkKKyAgKCgo aikgKyAobl9sKSA8PSAoaF9sKSkgXAorICAgfHwgKChoX2wpICs9IF9fc3Ry bmxlbiAoKHZvaWQqKSgoaCkgKyAoaF9sKSksIChuX2wpICsgNTEyKSwgXAor ICAgICAgIChqKSArIChuX2wpIDw9IChoX2wpKSkKICNkZWZpbmUgQ0hFQ0tf RU9MICgxKQogI2RlZmluZSBSRVQwX0lGXzAoYSkgaWYgKCFhKSBnb3RvIHJl dDAKICNkZWZpbmUgQ0FOT05fRUxFTUVOVChjKSBUT0xPV0VSIChjKQpAQCAt NTgsMzEgKzU5LDIyIEBACiAgICBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlz b24uICBUaGlzIGZ1bmN0aW9uIGdpdmVzIHVuc3BlY2lmaWVkCiAgICByZXN1 bHRzIGluIG11bHRpYnl0ZSBsb2NhbGVzLiAgKi8KIGNoYXIgKgotU1RSQ0FT RVNUUiAoY29uc3QgY2hhciAqaGF5c3RhY2tfc3RhcnQsIGNvbnN0IGNoYXIg Km5lZWRsZV9zdGFydCkKK1NUUkNBU0VTVFIgKGNvbnN0IGNoYXIgKmhheXN0 YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCiB7Ci0gIGNvbnN0IGNoYXIgKmhh eXN0YWNrID0gaGF5c3RhY2tfc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKm5lZWRs ZSA9IG5lZWRsZV9zdGFydDsKICAgc2l6ZV90IG5lZWRsZV9sZW47IC8qIExl bmd0aCBvZiBORUVETEUuICAqLwogICBzaXplX3QgaGF5c3RhY2tfbGVuOyAv KiBLbm93biBtaW5pbXVtIGxlbmd0aCBvZiBIQVlTVEFDSy4gICovCi0gIGJv b2wgb2sgPSB0cnVlOyAvKiBUcnVlIGlmIE5FRURMRSBpcyBwcmVmaXggb2Yg SEFZU1RBQ0suICAqLwotCi0gIC8qIERldGVybWluZSBsZW5ndGggb2YgTkVF RExFLCBhbmQgaW4gdGhlIHByb2Nlc3MsIG1ha2Ugc3VyZQotICAgICBIQVlT VEFDSyBpcyBhdCBsZWFzdCBhcyBsb25nIChubyBwb2ludCBwcm9jZXNzaW5n IGFsbCBvZiBhIGxvbmcKLSAgICAgTkVFRExFIGlmIEhBWVNUQUNLIGlzIHRv byBzaG9ydCkuICAqLwotICB3aGlsZSAoKmhheXN0YWNrICYmICpuZWVkbGUp Ci0gICAgewotICAgICAgb2sgJj0gKFRPTE9XRVIgKCh1bnNpZ25lZCBjaGFy KSAqaGF5c3RhY2spCi0JICAgICA9PSBUT0xPV0VSICgodW5zaWduZWQgY2hh cikgKm5lZWRsZSkpOwotICAgICAgaGF5c3RhY2srKzsKLSAgICAgIG5lZWRs ZSsrOwotICAgIH0KLSAgaWYgKCpuZWVkbGUpCisKKyAgLyogSGFuZGxlIGVt cHR5IE5FRURMRSBzcGVjaWFsIGNhc2UuICAqLworICBpZiAobmVlZGxlWzBd ID09ICdcMCcpCisgICAgcmV0dXJuIChjaGFyICopIGhheXN0YWNrOworCisg IC8qIEVuc3VyZSBIQVlTVEFDSyBsZW5ndGggaXMgYXQgbGVhc3QgYXMgbG9u ZyBhcyBORUVETEUgbGVuZ3RoLgorICAgICBTaW5jZSBhIG1hdGNoIG1heSBv Y2N1ciBlYXJseSBvbiBpbiBhIGh1Z2UgSEFZU1RBQ0ssIHVzZSBzdHJubGVu CisgICAgIGFuZCByZWFkIGFoZWFkIGEgZmV3IGNhY2hlbGluZXMgZm9yIGlt cHJvdmVkIHBlcmZvcm1hbmNlLiAgKi8KKyAgbmVlZGxlX2xlbiA9IHN0cmxl biAobmVlZGxlKTsKKyAgaGF5c3RhY2tfbGVuID0gX19zdHJubGVuIChoYXlz dGFjaywgbmVlZGxlX2xlbiArIDI1Nik7CisgIGlmIChoYXlzdGFja19sZW4g PCBuZWVkbGVfbGVuKQogICAgIHJldHVybiBOVUxMOwotICBpZiAob2spCi0g ICAgcmV0dXJuIChjaGFyICopIGhheXN0YWNrX3N0YXJ0OwotICBuZWVkbGVf bGVuID0gbmVlZGxlIC0gbmVlZGxlX3N0YXJ0OwotICBoYXlzdGFjayA9IGhh eXN0YWNrX3N0YXJ0ICsgMTsKLSAgaGF5c3RhY2tfbGVuID0gbmVlZGxlX2xl biAtIDE7CiAKICAgLyogUGVyZm9ybSB0aGUgc2VhcmNoLiAgQWJzdHJhY3Qg bWVtb3J5IGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gYXJyYXkKICAgICAgb2Yg J3Vuc2lnbmVkIGNoYXInIHZhbHVlcywgbm90IGFuIGFycmF5IG9mICdjaGFy JyB2YWx1ZXMuICBTZWUKQEAgLTkwLDEwICs4MiwxMCBAQCBTVFJDQVNFU1RS IChjb25zdCBjaGFyICpoYXlzdGFja19zdGFydCwgY29uc3QgY2hhciAqbmVl ZGxlX3N0YXJ0KQogICBpZiAobmVlZGxlX2xlbiA8IExPTkdfTkVFRExFX1RI UkVTSE9MRCkKICAgICByZXR1cm4gdHdvX3dheV9zaG9ydF9uZWVkbGUgKChj b25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0YWNrLAogCQkJCSBoYXlzdGFj a19sZW4sCi0JCQkJIChjb25zdCB1bnNpZ25lZCBjaGFyICopIG5lZWRsZV9z dGFydCwKKwkJCQkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmVlZGxlLAog CQkJCSBuZWVkbGVfbGVuKTsKICAgcmV0dXJuIHR3b193YXlfbG9uZ19uZWVk bGUgKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0YWNrLCBoYXlzdGFj a19sZW4sCi0JCQkgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuZWVk bGVfc3RhcnQsCisJCQkgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBu ZWVkbGUsCiAJCQkgICAgICBuZWVkbGVfbGVuKTsKIH0KIApkaWZmIC0tZ2l0 IGEvc3RyaW5nL3N0cnN0ci5jIGIvc3RyaW5nL3N0cnN0ci5jCmluZGV4IDg4 ZjFkNWQuLjRkNzJmZmIgMTAwNjQ0Ci0tLSBhL3N0cmluZy9zdHJzdHIuYwor KysgYi9zdHJpbmcvc3Ryc3RyLmMKQEAgLTE2LDI3ICsxNiwxNyBAQAogICAg TGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3Qs IHNlZQogICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8K IAotLyogVGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHdhcyB3cml0 dGVuIGJ5IEVyaWMgQmxha2UsIDIwMDguICAqLwotCiAjaWZuZGVmIF9MSUJD CiAjIGluY2x1ZGUgPGNvbmZpZy5oPgogI2VuZGlmCiAKLS8qIFNwZWNpZmlj YXRpb24gb2Ygc3Ryc3RyLiAgKi8KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAot I2luY2x1ZGUgPHN0ZGJvb2wuaD4KLQotI2lmbmRlZiBfTElCQwotIyBkZWZp bmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpICAgKGV4cHIpCi0jZW5k aWYKLQogI2RlZmluZSBSRVRVUk5fVFlQRSBjaGFyICoKICNkZWZpbmUgQVZB SUxBQkxFKGgsIGhfbCwgaiwgbl9sKQkJCVwKLSAgKCFtZW1jaHIgKChoKSAr IChoX2wpLCAnXDAnLCAoaikgKyAobl9sKSAtIChoX2wpKQlcCi0gICAmJiAo KGhfbCkgPSAoaikgKyAobl9sKSkpCi0jZGVmaW5lIENIRUNLX0VPTCAoMSkK LSNkZWZpbmUgUkVUMF9JRl8wKGEpIGlmICghYSkgZ290byByZXQwCisgICgo KGopICsgKG5fbCkgPD0gKGhfbCkpIFwKKyAgIHx8ICgoaF9sKSArPSBfX3N0 cm5sZW4gKCh2b2lkKikoKGgpICsgKGhfbCkpLCAobl9sKSArIDUxMiksIFwK KyAgICAgICAoaikgKyAobl9sKSA8PSAoaF9sKSkpCiAjaW5jbHVkZSAic3Ry LXR3by13YXkuaCIKIAogI3VuZGVmIHN0cnN0cgpAQCAtNDUsNDggKzM1LDEy OCBAQAogI2RlZmluZSBTVFJTVFIgc3Ryc3RyCiAjZW5kaWYKIAotLyogUmV0 dXJuIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIE5FRURMRSBpbiBIQVlTVEFD Sy4gIFJldHVybiBIQVlTVEFDSwotICAgaWYgTkVFRExFIGlzIGVtcHR5LCBv dGhlcndpc2UgTlVMTCBpZiBORUVETEUgaXMgbm90IGZvdW5kIGluCi0gICBI QVlTVEFDSy4gICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Ryc3RyMiAo Y29uc3QgdW5zaWduZWQgY2hhciAqaHMsIGNvbnN0IHVuc2lnbmVkIGNoYXIg Km5lKQoreworICB1aW50MzJfdCBoMSA9IChuZVswXSA8PCAxNikgfCBuZVsx XTsKKyAgdWludDMyX3QgaDIgPSAwOworICBmb3IgKGludCBjID0gaHNbMF07 IGgxICE9IGgyICYmIGMgIT0gMDsgYyA9ICorK2hzKQorICAgICAgaDIgPSAo aDIgPDwgMTYpIHwgYzsKKyAgcmV0dXJuIGgxID09IGgyID8gKGNoYXIgKilo cyAtIDIgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Ry c3RyMyAoY29uc3QgdW5zaWduZWQgY2hhciAqaHMsIGNvbnN0IHVuc2lnbmVk IGNoYXIgKm5lKQoreworICB1aW50MzJfdCBoMSA9ICgodWludDMyX3QpbmVb MF0gPDwgMjQpIHwgKG5lWzFdIDw8IDE2KSB8IChuZVsyXSA8PCA4KTsKKyAg dWludDMyX3QgaDIgPSAwOworICBmb3IgKGludCBjID0gaHNbMF07IGgxICE9 IGgyICYmIGMgIT0gMDsgYyA9ICorK2hzKQorICAgICAgaDIgPSAoaDIgfCBj KSA8PCA4OworICByZXR1cm4gaDEgPT0gaDIgPyAoY2hhciAqKWhzIC0gMyA6 IE5VTEw7Cit9CisKKy8qIEhhc2ggY2hhcmFjdGVyIHBhaXJzIHNvIGEgc21h bGwgc2hpZnQgdGFibGUgY2FuIGJlIHVzZWQuICBBbGwgYml0cyBvZgorICAg cFswXSBhcmUgaW5jbHVkZWQsIGJ1dCBub3QgYWxsIGJpdHMgZnJvbSBwWy0x XS4gIFNvIGlmIHR3byBlcXVhbCBoYXNoZXMKKyAgIG1hdGNoIG9uIHBbLTFd LCBwWzBdIG1hdGNoZXMgdG9vLiAgSGFzaCBjb2xsaXNpb25zIGFyZSBoYXJt bGVzcyBhbmQgcmVzdWx0CisgICBpbiBzbWFsbGVyIHNoaWZ0cy4gICovCisj ZGVmaW5lIGhhc2gyKHApICgoKHNpemVfdCkocClbMF0gLSAoKHNpemVfdCko cClbLTFdIDw8IDMpKSAlIHNpemVvZiAoc2hpZnQpKQorCisvKiBGYXN0IHN0 cnN0ciBhbGdvcml0aG0gd2l0aCBndWFyYW50ZWVkIGxpbmVhci10aW1lIHBl cmZvcm1hbmNlLgorICAgU21hbGwgbmVlZGxlcyB1cCB0byBzaXplIDMgdXNl IGEgZGVkaWNhdGVkIGxpbmVhciBzZWFyY2guICBMb25nZXIgbmVlZGxlcwor ICAgdXAgdG8gc2l6ZSAyNTYgdXNlIGEgbm92ZWwgbW9kaWZpZWQgSG9yc3Bv b2wgYWxnb3JpdGhtLiAgSXQgaGFzaGVzIHBhaXJzCisgICBvZiBjaGFyYWN0 ZXJzIHRvIHF1aWNrbHkgc2tpcCBwYXN0IG1pc21hdGNoZXMuICBUaGUgbWFp biBzZWFyY2ggbG9vcCBvbmx5CisgICBleGl0cyBpZiB0aGUgbGFzdCAyIGNo YXJhY3RlcnMgbWF0Y2gsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNhbGxzIHRv IG1lbWNtcAorICAgYW5kIGFsbG93aW5nIGZvciBhIGxhcmdlciBza2lwIGlm IHRoZXJlIGlzIG5vIG1hdGNoLiAgQSBzZWxmLWFkYXB0aW5nCisgICBmaWx0 ZXJpbmcgY2hlY2sgaXMgdXNlZCB0byBxdWlja2x5IGRldGVjdCBtaXNtYXRj aGVzIGluIGxvbmcgbmVlZGxlcy4KKyAgIEJ5IGxpbWl0aW5nIHRoZSBuZWVk bGUgbGVuZ3RoIHRvIDI1NiwgdGhlIHNoaWZ0IHRhYmxlIGNhbiBiZSByZWR1 Y2VkIHRvIDgKKyAgIGJpdHMgcGVyIGVudHJ5LCBsb3dlcmluZyBwcmVwcm9j ZXNzaW5nIG92ZXJoZWFkIGFuZCBtaW5pbWl6aW5nIGNhY2hlIGVmZmVjdHMu CisgICBUaGUgbGltaXQgYWxzbyBpbXBsaWVzIHdvcnN0LWNhc2UgcGVyZm9y bWFuY2UgaXMgbGluZWFyLgorICAgTmVlZGxlcyBsYXJnZXIgdGhhbiAyNTYg Y2hhcmFjdGVycyB1c2UgdGhlIGxpbmVhci10aW1lIFR3by1XYXkgYWxnb3Jp dGhtLiAgKi8KIGNoYXIgKgotU1RSU1RSIChjb25zdCBjaGFyICpoYXlzdGFj a19zdGFydCwgY29uc3QgY2hhciAqbmVlZGxlX3N0YXJ0KQorU1RSU1RSIChj b25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQogewot ICBjb25zdCBjaGFyICpoYXlzdGFjayA9IGhheXN0YWNrX3N0YXJ0OwotICBj b25zdCBjaGFyICpuZWVkbGUgPSBuZWVkbGVfc3RhcnQ7Ci0gIHNpemVfdCBu ZWVkbGVfbGVuOyAvKiBMZW5ndGggb2YgTkVFRExFLiAgKi8KLSAgc2l6ZV90 IGhheXN0YWNrX2xlbjsgLyogS25vd24gbWluaW11bSBsZW5ndGggb2YgSEFZ U1RBQ0suICAqLwotICBib29sIG9rID0gdHJ1ZTsgLyogVHJ1ZSBpZiBORUVE TEUgaXMgcHJlZml4IG9mIEhBWVNUQUNLLiAgKi8KLQotICAvKiBEZXRlcm1p bmUgbGVuZ3RoIG9mIE5FRURMRSwgYW5kIGluIHRoZSBwcm9jZXNzLCBtYWtl IHN1cmUKLSAgICAgSEFZU1RBQ0sgaXMgYXQgbGVhc3QgYXMgbG9uZyAobm8g cG9pbnQgcHJvY2Vzc2luZyBhbGwgb2YgYSBsb25nCi0gICAgIE5FRURMRSBp ZiBIQVlTVEFDSyBpcyB0b28gc2hvcnQpLiAgKi8KLSAgd2hpbGUgKCpoYXlz dGFjayAmJiAqbmVlZGxlKQotICAgIG9rICY9ICpoYXlzdGFjaysrID09ICpu ZWVkbGUrKzsKLSAgaWYgKCpuZWVkbGUpCisgIGNvbnN0IHVuc2lnbmVkIGNo YXIgKmhzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaGF5c3RhY2s7Cisg IGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5lID0gKGNvbnN0IHVuc2lnbmVkIGNo YXIgKikgbmVlZGxlOworCisgIC8qIEhhbmRsZSBzaG9ydCBuZWVkbGUgc3Bl Y2lhbCBjYXNlcyBmaXJzdC4gICovCisgIGlmIChuZVswXSA9PSAnXDAnKQor ICAgIHJldHVybiAoY2hhciAqKWhzOworICBocyA9IChjb25zdCB1bnNpZ25l ZCBjaGFyICopc3RyY2hyICgoY29uc3QgY2hhciopaHMsIG5lWzBdKTsKKyAg aWYgKGhzID09IE5VTEwgfHwgbmVbMV0gPT0gJ1wwJykKKyAgICByZXR1cm4g KGNoYXIqKWhzOworICBpZiAobmVbMl0gPT0gJ1wwJykKKyAgICByZXR1cm4g c3Ryc3RyMiAoaHMsIG5lKTsKKyAgaWYgKG5lWzNdID09ICdcMCcpCisgICAg cmV0dXJuIHN0cnN0cjMgKGhzLCBuZSk7CisKKyAgLyogRW5zdXJlIGhheXN0 YWNrIGxlbmd0aCBpcyBhdCBsZWFzdCBhcyBsb25nIGFzIG5lZWRsZSBsZW5n dGguCisgICAgIFNpbmNlIGEgbWF0Y2ggbWF5IG9jY3VyIGVhcmx5IG9uIGlu IGEgaHVnZSBoYXlzdGFjaywgdXNlIHN0cm5sZW4KKyAgICAgYW5kIHJlYWQg YWhlYWQgYSBmZXcgY2FjaGVsaW5lcyBmb3IgaW1wcm92ZWQgcGVyZm9ybWFu Y2UuICAqLworICBzaXplX3QgbmVfbGVuID0gc3RybGVuICgoY29uc3QgY2hh ciopbmUpOworICBzaXplX3QgaHNfbGVuID0gX19zdHJubGVuICgoY29uc3Qg Y2hhciopaHMsIG5lX2xlbiB8IDUxMik7CisgIGlmIChoc19sZW4gPCBuZV9s ZW4pCiAgICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChvaykKLSAgICByZXR1cm4g KGNoYXIgKikgaGF5c3RhY2tfc3RhcnQ7Ci0KLSAgLyogUmVkdWNlIHRoZSBz aXplIG9mIGhheXN0YWNrIHVzaW5nIHN0cmNociwgc2luY2UgaXQgaGFzIGEg c21hbGxlcgotICAgICBsaW5lYXIgY29lZmZpY2llbnQgdGhhbiB0aGUgVHdv LVdheSBhbGdvcml0aG0uICAqLwotICBuZWVkbGVfbGVuID0gbmVlZGxlIC0g bmVlZGxlX3N0YXJ0OwotICBoYXlzdGFjayA9IHN0cmNociAoaGF5c3RhY2tf c3RhcnQgKyAxLCAqbmVlZGxlX3N0YXJ0KTsKLSAgaWYgKCFoYXlzdGFjayB8 fCBfX2J1aWx0aW5fZXhwZWN0IChuZWVkbGVfbGVuID09IDEsIDApKQotICAg IHJldHVybiAoY2hhciAqKSBoYXlzdGFjazsKLSAgbmVlZGxlIC09IG5lZWRs ZV9sZW47Ci0gIGhheXN0YWNrX2xlbiA9IChoYXlzdGFjayA+IGhheXN0YWNr X3N0YXJ0ICsgbmVlZGxlX2xlbiA/IDEKLQkJICA6IG5lZWRsZV9sZW4gKyBo YXlzdGFja19zdGFydCAtIGhheXN0YWNrKTsKLQotICAvKiBQZXJmb3JtIHRo ZSBzZWFyY2guICBBYnN0cmFjdCBtZW1vcnkgaXMgY29uc2lkZXJlZCB0byBi ZSBhbiBhcnJheQotICAgICBvZiAndW5zaWduZWQgY2hhcicgdmFsdWVzLCBu b3QgYW4gYXJyYXkgb2YgJ2NoYXInIHZhbHVlcy4gIFNlZQotICAgICBJU08g QyA5OSBzZWN0aW9uIDYuMi42LjEuICAqLwotICBpZiAobmVlZGxlX2xlbiA8 IExPTkdfTkVFRExFX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gdHdvX3dheV9z aG9ydF9uZWVkbGUgKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0YWNr LAotCQkJCSBoYXlzdGFja19sZW4sCi0JCQkJIChjb25zdCB1bnNpZ25lZCBj aGFyICopIG5lZWRsZSwgbmVlZGxlX2xlbik7Ci0gIHJldHVybiB0d29fd2F5 X2xvbmdfbmVlZGxlICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBoYXlzdGFj aywgaGF5c3RhY2tfbGVuLAotCQkJICAgICAgKGNvbnN0IHVuc2lnbmVkIGNo YXIgKikgbmVlZGxlLCBuZWVkbGVfbGVuKTsKKworICAvKiBDaGVjayB3aGV0 aGVyIHdlIGhhdmUgYSBtYXRjaC4gIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFu Y2Ugc2luY2Ugd2UKKyAgICAgYXZvaWQgaW5pdGlhbGl6YXRpb24gb3Zlcmhl YWRzLiAgKi8KKyAgaWYgKG1lbWNtcCAoaHMsIG5lLCBuZV9sZW4pID09IDAp CisgICAgcmV0dXJuIChjaGFyICopIGhzOworCisgIC8qIFVzZSBUd28tV2F5 IGFsZ29yaXRobSBmb3IgdmVyeSBsb25nIG5lZWRsZXMuICAqLworICBpZiAo X19nbGliY191bmxpa2VseSAobmVfbGVuID4gMjU2KSkKKyAgICByZXR1cm4g dHdvX3dheV9sb25nX25lZWRsZSAoaHMsIGhzX2xlbiwgbmUsIG5lX2xlbik7 CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gaHMgKyBoc19sZW4g LSBuZV9sZW47CisgIHVpbnQ4X3Qgc2hpZnRbMjU2XTsKKyAgc2l6ZV90IHRt cCwgc2hpZnQxOworICBzaXplX3QgbTEgPSBuZV9sZW4gLSAxOworICBzaXpl X3Qgb2Zmc2V0ID0gMDsKKworICAvKiBJbml0aWFsaXplIGJhZCBjaGFyYWN0 ZXIgc2hpZnQgaGFzaCB0YWJsZS4gICovCisgIG1lbXNldCAoc2hpZnQsIDAs IHNpemVvZiAoc2hpZnQpKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBtMTsg aSsrKQorICAgIHNoaWZ0W2hhc2gyIChuZSArIGkpXSA9IGk7CisgIC8qIFNo aWZ0MSBpcyB0aGUgYW1vdW50IHdlIGNhbiBza2lwIGFmdGVyIG1hdGNoaW5n IHRoZSBoYXNoIG9mIHRoZQorICAgICBuZWVkbGUgZW5kIGJ1dCBub3QgdGhl IGZ1bGwgbmVlZGxlLiAgKi8KKyAgc2hpZnQxID0gbTEgLSBzaGlmdFtoYXNo MiAobmUgKyBtMSldOworICBzaGlmdFtoYXNoMiAobmUgKyBtMSldID0gbTE7 CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKF9fZ2xpYmNfdW5s aWtlbHkgKGhzID4gZW5kKSkKKwl7CisJICBlbmQgKz0gX19zdHJubGVuICgo Y29uc3QgY2hhciopZW5kICsgbTEgKyAxLCAyMDQ4KTsKKwkgIGlmIChocyA+ IGVuZCkKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAvKiBTa2lw IHBhc3QgY2hhcmFjdGVyIHBhaXJzIG5vdCBpbiB0aGUgbmVlZGxlLiAgKi8K KyAgICAgIGRvCisJeworCSAgaHMgKz0gbTE7CisJICB0bXAgPSBzaGlmdFto YXNoMiAoaHMpXTsKKwl9CisgICAgICB3aGlsZSAodG1wID09IDAgJiYgaHMg PD0gZW5kKTsKKworICAgICAgLyogSWYgdGhlIG1hdGNoIGlzIG5vdCBhdCB0 aGUgZW5kIG9mIHRoZSBuZWVkbGUsIHNoaWZ0IHRvIHRoZSBlbmQKKwkgYW5k IGNvbnRpbnVlIHVudGlsIHdlIG1hdGNoIHRoZSBoYXNoIG9mIHRoZSBuZWVk bGUgZW5kLiAgKi8KKyAgICAgIGhzIC09IHRtcDsKKyAgICAgIGlmICh0bXAg PCBtMSkKKwljb250aW51ZTsKKworICAgICAgLyogSGFzaCBvZiB0aGUgbGFz dCAyIGNoYXJhY3RlcnMgbWF0Y2hlcy4gIElmIHRoZSBuZWVkbGUgaXMgbG9u ZywKKwkgdHJ5IHRvIHF1aWNrbHkgZmlsdGVyIG91dCBtaXNtYXRjaGVzLiAg Ki8KKyAgICAgIGlmIChtMSA8IDE1IHx8IG1lbWNtcCAoaHMgKyBvZmZzZXQs IG5lICsgb2Zmc2V0LCA4KSA9PSAwKQorCXsKKwkgIGlmIChtZW1jbXAgKGhz LCBuZSwgbTEpID09IDApCisJICAgIHJldHVybiAodm9pZCAqKSBoczsKKwor CSAgLyogQWRqdXN0IGZpbHRlciBvZmZzZXQgd2hlbiBpdCBkb2Vzbid0IGZp bmQgdGhlIG1pc21hdGNoLiAgKi8KKwkgIG9mZnNldCA9IChvZmZzZXQgPj0g OCA/IG9mZnNldCA6IG0xKSAtIDg7CisJfQorCisgICAgICAvKiBTa2lwIGJh c2VkIG9uIG1hdGNoaW5nIHRoZSBoYXNoIG9mIHRoZSBuZWVkbGUgZW5kLiAg Ki8KKyAgICAgIGhzICs9IHNoaWZ0MTsKKyAgICB9CiB9CiBsaWJjX2hpZGRl bl9idWlsdGluX2RlZiAoc3Ryc3RyKQotCi0jdW5kZWYgTE9OR19ORUVETEVf VEhSRVNIT0xECmRpZmYgLS1naXQgYS9zdHJpbmcvdGVzdC1zdHJjYXNlc3Ry LmMgYi9zdHJpbmcvdGVzdC1zdHJjYXNlc3RyLmMKaW5kZXggYWJiMzkxNi4u NzhlMDNkYSAxMDA2NDQKLS0tIGEvc3RyaW5nL3Rlc3Qtc3RyY2FzZXN0ci5j CisrKyBiL3N0cmluZy90ZXN0LXN0cmNhc2VzdHIuYwpAQCAtMjUsNiArMjUs NyBAQAogI2RlZmluZSBTVFJDQVNFU1RSIHNpbXBsZV9zdHJjYXNlc3RyCiAj ZGVmaW5lIE5PX0FMSUFTCiAjZGVmaW5lIF9fc3RybmNhc2VjbXAgc3RybmNh c2VjbXAKKyNkZWZpbmUgX19zdHJubGVuIHN0cm5sZW4KICNpbmNsdWRlICJz dHJjYXNlc3RyLmMiCiAKIApkaWZmIC0tZ2l0IGEvc3RyaW5nL3Rlc3Qtc3Ry c3RyLmMgYi9zdHJpbmcvdGVzdC1zdHJzdHIuYwppbmRleCAzM2YyMjExLi41 YmNlNzNiIDEwMDY0NAotLS0gYS9zdHJpbmcvdGVzdC1zdHJzdHIuYworKysg Yi9zdHJpbmcvdGVzdC1zdHJzdHIuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAj ZGVmaW5lIFNUUlNUUiBzaW1wbGVfc3Ryc3RyCiAjZGVmaW5lIGxpYmNfaGlk ZGVuX2J1aWx0aW5fZGVmKGFyZykgLyogbm90aGluZyAqLworI2RlZmluZSBf X3N0cm5sZW4gc3RybmxlbgogI2luY2x1ZGUgInN0cnN0ci5jIgogCiAKQEAg LTE1MCw2ICsxNTEsMzIgQEAgY2hlY2syICh2b2lkKQogICAgIH0KIH0KIAor I2RlZmluZSBOIDEwMjQKKworc3RhdGljIHZvaWQKK3ByMjM2MzcgKHZvaWQp Cit7CisgIGNoYXIgKmggPSAoY2hhciopIGJ1ZjE7CisgIGNoYXIgKm4gPSAo Y2hhciopIGJ1ZjI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKysp CisgICAgeworICAgICAgbltpXSA9ICd4JzsKKyAgICAgIGhbaV0gPSAnICc7 CisgICAgICBoW2kgKyBOXSA9ICd4JzsKKyAgICB9CisKKyAgbltOXSA9ICdc MCc7CisgIGhbTiAqIDJdID0gJ1wwJzsKKworICAvKiBFbnN1cmUgd2UgZG9u J3QgbWF0Y2ggYXQgdGhlIGZpcnN0ICd4Jy4gICovCisgIGhbMF0gPSAneCc7 CisKKyAgY2hhciAqZXhwX3Jlc3VsdCA9IHN0dXBpZF9zdHJzdHIgKGgsIG4p OworICBGT1JfRUFDSF9JTVBMIChpbXBsLCAwKQorICAgIGNoZWNrX3Jlc3Vs dCAoaW1wbCwgaCwgbiwgZXhwX3Jlc3VsdCk7Cit9CisKIHN0YXRpYyBpbnQK IHRlc3RfbWFpbiAodm9pZCkKIHsKQEAgLTE1Nyw2ICsxODQsNyBAQCB0ZXN0 X21haW4gKHZvaWQpCiAKICAgY2hlY2sxICgpOwogICBjaGVjazIgKCk7Cisg IHByMjM2MzcgKCk7CiAKICAgcHJpbnRmICgiJTIzcyIsICIiKTsKICAgRk9S X0VBQ0hfSU1QTCAoaW1wbCwgMCkKQEAgLTIwMSw2ICsyMjksOSBAQCB0ZXN0 X21haW4gKHZvaWQpCiAJZG9fdGVzdCAoMTUsIDksIGhsZW4sIGtsZW4sIDEp OwogCWRvX3Rlc3QgKDE1LCAxNSwgaGxlbiwga2xlbiwgMCk7CiAJZG9fdGVz dCAoMTUsIDE1LCBobGVuLCBrbGVuLCAxKTsKKworCWRvX3Rlc3QgKDE1LCAx NSwgaGxlbiArIGtsZW4gKiA0LCBrbGVuICogNCwgMCk7CisJZG9fdGVzdCAo MTUsIDE1LCBobGVuICsga2xlbiAqIDQsIGtsZW4gKiA0LCAxKTsKICAgICAg IH0KIAogICBkb190ZXN0ICgwLCAwLCBwYWdlX3NpemUgLSAxLCAxNiwgMCk7 Cg== --_002_VI1PR0801MB212799191805BC9A89924C3183B30VI1PR0801MB2127_--