From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on2059.outbound.protection.outlook.com [40.107.6.59]) by sourceware.org (Postfix) with ESMTPS id 1FE553858415 for ; Fri, 10 Nov 2023 12:42:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1FE553858415 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1FE553858415 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=40.107.6.59 ARC-Seal: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1699620131; cv=pass; b=Vvw3gYUQSSqYVeekc/tBjgl8UO8aqY8ZMzuO4BCsRyJjuy1euIgw2CLysc9RnSTgxWdlGwKJPVe4XAzCHWPsVn4QfCNxGM3eFx+y3oet23DTXU/ucjXe9g0Dsfnc9Qd6yVtCplpifUKG9iB5fidWuoTFnO9/wRlVBKp8JT/eM4I= ARC-Message-Signature: i=3; a=rsa-sha256; d=sourceware.org; s=key; t=1699620131; c=relaxed/simple; bh=32Sv2/UHjn9oMnd/J/9vX0fXy+ENAMu3fzDK52F61JE=; h=DKIM-Signature:DKIM-Signature:Message-ID:Date:Subject:From:To: MIME-Version; b=VwMxqdmD9JYg7zlrahDpQaANyplFYndmkFtlHnQrd7NJeg/rxbnVQl3qtKzBQ5bVjjbzk1F4zJ/msuzOy1pl3U1WKrTOU7vdbH/Jsd2La/gGMu0lw2PTlkxGzM4OrsgIma+jHqupD6lroyJqTkQZ/8skzMZRwc0hH9Lfqqpf11E= ARC-Authentication-Results: i=3; server2.sourceware.org ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=Miivykfd1QY/J1xX3ooRNi/W/KjEnnpkQm9BMN0DWrKonRPHtOZv7mq/8B0fSZP+r3EFKWlHEuCy2N5gHC6ovEJICCRZ0Gp8sXAQgzOhHzk6YCG7PMuk16EQpgcpoDx0cTM0DOnpI6vkq/HNDDO+UwVxZvkwjl8rTuKjOmw1Kqu5tza7ci5tQjFvNYBRnz/wcpC68igIE6Cz8pw8i55YERffOj7vdxuf7ZkjLAaFjq7w1jT5TBCU+SrLIrz6t+XiyvUJxCWddvECyl21FR8q8MQY615n9emU0VLXADp9Xe8WSuerTH/eErkYhJ3jOPWEdLwXuQ3kFuE1Js96unv5GQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QVEiN3BNPang+FddC0sFKk+8URVMn1fruazoAvgJcK8=; b=goECml9R1nHlSXdaAW1znw4ThVKF8tsFwq8o+R7VehUmQPfjqZriavG65n2vRjDD4DXF6KpWGv80Xj9vwfHQ4VcViUykeYxMqG9GrT8gSXBHV+XdOqt4q2lxFo/KKrr+u75gL1Ie49w2P5fV4d+RcQolOV2FrRUZFiAC2WL3SIHU+Be06CD8yjQKVGBMOsVOC2bcWXu76cDdw5vmoa6djq+dDmBIrJzZ2JNj4hA+Q1Gnw/dR/4u4Pq6WpGgnhit/fwS800MIwTzgW+HCU24fVfAw2XJkRgJmCGtfRC9Z/XSYIneOxp/DAPyNqIMphS/SZpAFuhhjeWGCS3eQq5XcNg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) 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=QVEiN3BNPang+FddC0sFKk+8URVMn1fruazoAvgJcK8=; b=YrMt++nDcfWqxt5SwHuuAbDX1sxpIxsMCZp+yHREKhmT2W/NMIwUKfpKouuLBY+pEXH/NWDGdWAPO+3qeyk08BuHErlkwHrAGQgZp9R0TQBfk6Z83ywMhpmTukG1my3Y6V8VSJwOyZv+A2ugQMhrB7qYnf2uf5KhsP3LZ9/f3wk= Received: from AS8PR04CA0204.eurprd04.prod.outlook.com (2603:10a6:20b:2f3::29) by GVXPR08MB10668.eurprd08.prod.outlook.com (2603:10a6:150:14a::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.19; Fri, 10 Nov 2023 12:41:58 +0000 Received: from AMS0EPF000001AD.eurprd05.prod.outlook.com (2603:10a6:20b:2f3:cafe::9f) by AS8PR04CA0204.outlook.office365.com (2603:10a6:20b:2f3::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.19 via Frontend Transport; Fri, 10 Nov 2023 12:41:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AMS0EPF000001AD.mail.protection.outlook.com (10.167.16.153) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.17 via Frontend Transport; Fri, 10 Nov 2023 12:41:57 +0000 Received: ("Tessian outbound 5d213238733f:v228"); Fri, 10 Nov 2023 12:41:57 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 0c3211d8758099e1 X-CR-MTA-TID: 64aa7808 Received: from 6ae161edee59.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 2554C7CE-8F9D-4CEB-A4DA-90D91B137C76.1; Fri, 10 Nov 2023 12:41:50 +0000 Received: from EUR02-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 6ae161edee59.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 10 Nov 2023 12:41:50 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=X5L/1zbo+WfYALiOZ97Hzs2uq4Zt25llOfndKr4uzUw5F/FsR6tXqrWkMW5ihmr6Pb1G4HcYm6tPeVc5X01hVXeHbuITsYFnPbBVIYyA3Zt60UOcl0oNDjXAOXtQSWSJU/XyMjmp2Bg66S2Zmiv6no1wkrVZDxkjwPR8Xfs1+JE00zNuf9bqUlUOzcyW2C+ZsfHMH5eOsUGU9aQ8RPK/q99YB6u+sR8Qlxr04wZAWt+Ro9e1VP1hf9ay53MBd3MRBmmqkzZyEAxz5/lVHnT+UizMXHXpCP439m0Czz7/pKKJiaoPJw/fAIED6llm5WRhg8LcYYzzWXpf0PgMDYZOZA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QVEiN3BNPang+FddC0sFKk+8URVMn1fruazoAvgJcK8=; b=Jk+RGKOTmAsrxZtq15+fvYtUWc16zptnOYZbwteQJxrmllgQ36RgjzBZ5SHfLzIClvvvUpov6qGsExUU2UD8jPNwv31UooSehHTjn6hMA77t3YfddUie3Nq5IoJKvuUI+5jWMuMoAH5v0fQkS5kEvMXmil+b5WzL2ABUOiYrmj+7Tu9r83OYthN5VrWC6TWqh+HstAdb2esc3PsB2qGt/OemPb/HiuT9KSjx3hvwXgzY/V6qLs2zU0gA+PpA2GwJPrxWej6anKp1u5dDbE8m9A1JsLVhXUJtEEz6zfuVINRf/OP2/BLF5Y1AOHjDNVxDT9Ca8p8dRrWgkIWIzGbbVA== 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=QVEiN3BNPang+FddC0sFKk+8URVMn1fruazoAvgJcK8=; b=YrMt++nDcfWqxt5SwHuuAbDX1sxpIxsMCZp+yHREKhmT2W/NMIwUKfpKouuLBY+pEXH/NWDGdWAPO+3qeyk08BuHErlkwHrAGQgZp9R0TQBfk6Z83ywMhpmTukG1my3Y6V8VSJwOyZv+A2ugQMhrB7qYnf2uf5KhsP3LZ9/f3wk= Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) by PA6PR08MB10829.eurprd08.prod.outlook.com (2603:10a6:102:3d6::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6977.18; Fri, 10 Nov 2023 12:41:47 +0000 Received: from DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::6118:948d:f205:3182]) by DB9PR08MB6507.eurprd08.prod.outlook.com ([fe80::6118:948d:f205:3182%4]) with mapi id 15.20.6954.028; Fri, 10 Nov 2023 12:41:47 +0000 Content-Type: multipart/mixed; boundary="------------Z9WW62ku0Uj0U0smP9DoFyW0" Message-ID: <05ab69cf-dea0-44d2-875c-983985a26b99@arm.com> Date: Fri, 10 Nov 2023 12:41:43 +0000 User-Agent: Mozilla Thunderbird Subject: Re: [PING][PATCH 2/2] arm: Add support for MVE Tail-Predicated Low Overhead Loops From: Stamatis Markianos-Wright To: Stamatis Markianos-Wright via Gcc-patches , Richard Earnshaw , richard.sandiford@arm.com, Kyrylo Tkachov References: <949f5dd0-cdf0-715a-f04c-3de80c9b974f@arm.com> <32452185-e459-4521-9b77-e80d06573ee2@arm.com> <5793c5af-9c01-48a8-9bf3-f289e7f32640@arm.com> Content-Language: en-US In-Reply-To: <5793c5af-9c01-48a8-9bf3-f289e7f32640@arm.com> X-ClientProxiedBy: LO4P123CA0223.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1a6::12) To DB9PR08MB6507.eurprd08.prod.outlook.com (2603:10a6:10:25a::6) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: DB9PR08MB6507:EE_|PA6PR08MB10829:EE_|AMS0EPF000001AD:EE_|GVXPR08MB10668:EE_ X-MS-Office365-Filtering-Correlation-Id: 2f11eca9-e807-4052-f3a2-08dbe1ea6d58 x-checkrecipientrouted: true NoDisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: vj6zbGQ+dq+MCr6e89fO02h7Sii6U7LDAxw/zk95P7kVGwga2Z+A9gWcOyaTeWa3VIztW3uv75AJBFzYbFzxjgAGIc6QxH3s8fjTMlyQmoa49HRjiIdMuYxbTb6DKA6kDWhuBJFKvKjl5qbymPbKKCXMdn1fWFrfpPA67Ie0c+4DCK2BrcTro83GXGRDx2xBewi+T+Sug8jEa2+gUDyXysUg46aAZr2mTu556ZUF4zIR4i1uFzzvJRCFO6cWR1BOuYVdHQ3aKD06W6AYnOaspJKky9dqmmhVl3sxGWRQ4ZzcMXPIcfvGfUQlu866jcDGY/IjiVS/5PJhbdh7gwxwSaSncZDaO9N/AYojHwDAZvpXC2O6PieW9iIaQ2toti4iYHWO9+40yflm4LRmhvFON7w0NvJSps9eTM/8iu+Fc2leGoKoOZd2WkXO46quITTbOf+2ib7FprBEJgJYFobbLYMmsXDwPjmqFPcuZ1syzE4pzqXKTBIdx2zSPBaDDBksLuaUvFfHEl/qR82VydTztp6Z10fK73+YtSYL/SJp5cEMzQidQGrC35soX/TYI+BPti5RsYBIIl5EoOdznX+Od++eKfrr+utoF1xGgPsM2pl0MZgGEwgfZgVcjJ7SNDvB3hRWYAKlfahRpVq5JUkALg== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB9PR08MB6507.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(376002)(39860400002)(346002)(396003)(136003)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(2906002)(8676002)(8936002)(5660300002)(36756003)(235185007)(86362001)(31696002)(41300700001)(2616005)(33964004)(6506007)(6512007)(6666004)(478600001)(6486002)(31686004)(53546011)(83380400001)(6636002)(316002)(26005)(66946007)(66476007)(66556008)(110136005)(38100700002)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA6PR08MB10829 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF000001AD.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: f849055f-ffc3-4864-8255-08dbe1ea6700 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: J/dY3QC/q0JJvd0DkbFigjuA0xXgsv1JuAZv4KLHqjC0o1HFyAsnpboFC/2cBkvW7C8Z27+cZYXBWmbyGqHFHdZEuO8FfVBoauBb9TC38LIA9qejLg7IgoxqVGvHLCxJIiiRloTkpl8zu9UEulpyUH9DKA5cyJXNvxyJTdUqZeLSuOzRscgUac/3ogBWl0+CgfQu4pw+eAL+cttc6MOnvXH6gnazZw/+up5rnKpBh9LKfWp7GpEgIikCObCpoQ26lHjrHh8NrAFQW6mqySdYQhJ2gWSXN03aF3Tco4HD2ovpsOSvg6YmdD5IafufcHUqcyRFDZHzqCXE1/eGTBl+FX2L86Q7X7En2jv7P26wpFyxsdwS94GZEuUi2dlAZjmpRGilOrQRZ27/JysTafi2oKLNldsYX+oIGqeGqPg7WYaKehxEc/Sy07rldQNlm4vGVOidW93rvsIAHFfrd5Up+8N3qPGIYH49qgnaNDjfB1gktbT4Q60WyDd8PwxHLBd+PorWxG9y4jePVYTMfnXasUAU8GJ0iWEfzulGq7LMLvmGWjOwuQpNFKH4qyfahn5tWkvzOdl425zpSqagpbBJmD5RO5Ylt30IBHUX9V7FDLKmz/FRb57g2BAPBH3eTQAoVwdRK+FyWS5zR4BZ3TTwtt624c8dfSW2m8IQwQ2i1ytcRwJbr8hZp90NtuuX6mpXPTlDi+Y1JxV70bPfs8xiflipaLVSBjXWQepEN7EGEA5IEA7vro1NZEAkEqZapo/sby2cydhNBjQ06ZiYCNUXTA== X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230031)(4636009)(396003)(376002)(136003)(39860400002)(346002)(230922051799003)(82310400011)(451199024)(1800799009)(64100799003)(186009)(36840700001)(46966006)(40470700004)(235185007)(5660300002)(82740400003)(81166007)(356005)(8936002)(8676002)(86362001)(31696002)(2906002)(41300700001)(40460700003)(47076005)(36860700001)(6512007)(36756003)(6666004)(6506007)(33964004)(53546011)(83380400001)(26005)(336012)(31686004)(2616005)(316002)(6636002)(70206006)(478600001)(6486002)(70586007)(40480700001)(110136005)(43740500002);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Nov 2023 12:41:57.5418 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2f11eca9-e807-4052-f3a2-08dbe1ea6d58 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-AuthSource: AMS0EPF000001AD.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GVXPR08MB10668 X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------Z9WW62ku0Uj0U0smP9DoFyW0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 06/11/2023 17:29, Stamatis Markianos-Wright wrote: > > On 06/11/2023 11:24, Richard Sandiford wrote: >> Stamatis Markianos-Wright writes: >>>> One of the main reasons for reading the arm bits was to try to answer >>>> the question: if we switch to a downcounting loop with a GE condition, >>>> how do we make sure that the start value is not a large unsigned >>>> number that is interpreted as negative by GE?  E.g. if the loop >>>> originally counted up in steps of N and used an LTU condition, >>>> it could stop at a value in the range [INT_MAX + 1, UINT_MAX]. >>>> But the loop might never iterate if we start counting down from >>>> most values in that range. >>>> >>>> Does the patch handle that? >>> So AFAICT this is actually handled in the generic code in >>> `doloop_valid_p`: >>> >>> This kind of loops fail because of they are "desc->infinite", then no >>> loop-doloop conversion is attempted at all (even for standard dls/le >>> loops) >>> >>> Thanks to that check I haven't been able to trigger anything like the >>> behaviour you describe, do you think the doloop_valid_p checks are >>> robust enough? >> The loops I was thinking of are provably not infinite though. E.g.: >> >>    for (unsigned int i = 0; i < UINT_MAX - 100; ++i) >>      ... >> >> is known to terminate.  And doloop conversion is safe with the normal >> count-down-by-1 approach, so I don't think current code would need >> to reject it.  I.e. a conversion to: >> >>    unsigned int i = UINT_MAX - 101; >>    do >>      ... >>    while (--i != ~0U); >> >> would be safe, but a conversion to: >> >>    int i = UINT_MAX - 101; >>    do >>      ... >>    while ((i -= step, i > 0)); >> >> wouldn't, because the loop body would only be executed once. >> >> I'm only going off the name "infinite" though :)  It's possible that >> it has more connotations than that. >> >> Thanks, >> Richard > > Ack, yep, I see what you mean now, and yep, that kind of loop does > indeed pass through doloop_valid_p > > Interestingly , in the v8-M Arm ARM this is done with: > > ``` > > boolean IsLastLowOverheadLoop(INSTR_EXEC_STATE_Type state) > // This does not check whether a loop is currently active. > // If the PE were in a loop, would this be the last one? > return UInt(state.LoopCount) <= (1 << (4 - LTPSIZE)); > > ``` > > So architecturally the asm we output would be ok (except maybe the > "branch too far subs;bgt;lctp" fallback at > `predicated_doloop_end_internal` (maybe that should be `bhi`))... But > now GE: isn't looking like an accurate representation of this > operation in the compiler. > > I'm wondering if I should try to make `predicated_doloop_end_internal` > contain a comparison along the lines of: > (gtu: (plus: (LR) (const_int -num_lanes)) (const_int num_lanes_minus_1)) > > I'll give that a try :) > > The only reason I'd chosen to go with GE earlier, tbh, was because of > the existing handling of GE in loop-doloop.cc > > Let me know if any other ideas come to your mind! > > > Cheers, > > Stam It looks like I've had success with the below (diff to previous patch), trimmed a bit to only the functionally interesting things:: diff --git a/gcc/config/arm/thumb2.md b/gcc/config/arm/thumb2.md index 368d5138ca1..54dd4ee564b 100644 --- a/gcc/config/arm/thumb2.md +++ b/gcc/config/arm/thumb2.md @@ -1649,16 +1649,28 @@            && (decrement_num = arm_attempt_dlstp_transform (operands[1]))            && (INTVAL (decrement_num) != 1))          { -          insn = emit_insn -              (gen_thumb2_addsi3_compare0 -              (s0, s0, GEN_INT ((-1) * (INTVAL (decrement_num))))); -          cmp = XVECEXP (PATTERN (insn), 0, 0); -          cc_reg = SET_DEST (cmp); -          bcomp = gen_rtx_GE (VOIDmode, cc_reg, const0_rtx);            loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands[1]); -          emit_jump_insn (gen_rtx_SET (pc_rtx, -                       gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, -                                 loc_ref, pc_rtx))); +          switch (INTVAL (decrement_num)) +        { +          case 2: +            insn = emit_jump_insn (gen_predicated_doloop_end_internal2 +                        (s0, loc_ref)); +            break; +          case 4: +            insn = emit_jump_insn (gen_predicated_doloop_end_internal4 +                        (s0, loc_ref)); +            break; +          case 8: +            insn = emit_jump_insn (gen_predicated_doloop_end_internal8 +                        (s0, loc_ref)); +            break; +          case 16: +            insn = emit_jump_insn (gen_predicated_doloop_end_internal16 +                        (s0, loc_ref)); +            break; +          default: +            gcc_unreachable (); +        }            DONE;          }      } diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index 93905583b18..c083f965fa9 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -6922,23 +6922,24 @@  ;; Originally expanded by 'predicated_doloop_end'.  ;; In the rare situation where the branch is too far, we do also need to  ;; revert FPSCR.LTPSIZE back to 0x100 after the last iteration. -(define_insn "*predicated_doloop_end_internal" +(define_insn "predicated_doloop_end_internal"    [(set (pc)      (if_then_else -       (ge (plus:SI (reg:SI LR_REGNUM) -            (match_operand:SI 0 "const_int_operand" "")) -        (const_int 0)) -     (label_ref (match_operand 1 "" "")) +       (gtu (unspec:SI [(plus:SI (match_operand:SI 0 "s_register_operand" "=r") +                     (const_int ))] +        LETP) +        (const_int )) +     (match_operand 1 "" "")       (pc))) -   (set (reg:SI LR_REGNUM) -    (plus:SI (reg:SI LR_REGNUM) (match_dup 0))) +   (set (match_dup 0) +    (plus:SI (match_dup 0) (const_int )))     (clobber (reg:CC CC_REGNUM))]    "TARGET_HAVE_MVE"    {      if (get_attr_length (insn) == 4)        return "letp\t%|lr, %l1";      else -      return "subs\t%|lr, #%n0\n\tbgt\t%l1\n\tlctp"; +      return "subs\t%|lr, #\n\tbhi\t%l1\n\tlctp";    }    [(set (attr "length")      (if_then_else @@ -6947,11 +6948,11 @@          (const_int 6)))     (set_attr "type" "branch")]) -(define_insn "dlstp_insn" +(define_insn "dlstp_insn"    [      (set (reg:SI LR_REGNUM)       (unspec:SI [(match_operand:SI 0 "s_register_operand" "r")]        DLSTP))    ]    "TARGET_HAVE_MVE" -  "dlstp.\t%|lr, %0") +  "dlstp.\t%|lr, %0") diff --git a/gcc/loop-doloop.cc b/gcc/loop-doloop.cc index 6a72700a127..47fdef989b4 100644 --- a/gcc/loop-doloop.cc +++ b/gcc/loop-doloop.cc @@ -185,6 +185,7 @@ doloop_condition_get (rtx_insn *doloop_pat)        || XEXP (inc_src, 0) != reg        || !CONST_INT_P (XEXP (inc_src, 1)))      return 0; +  int dec_num = abs (INTVAL (XEXP (inc_src, 1)));    /* Check for (set (pc) (if_then_else (condition)                                         (label_ref (label)) @@ -199,21 +200,32 @@ doloop_condition_get (rtx_insn *doloop_pat)    /* Extract loop termination condition.  */    condition = XEXP (SET_SRC (cmp), 0); -  /* We expect a GE or NE comparison with 0 or 1.  */ -  if ((GET_CODE (condition) != GE -       && GET_CODE (condition) != NE) -      || (XEXP (condition, 1) != const0_rtx -          && XEXP (condition, 1) != const1_rtx)) +  /* We expect a GE or NE comparison with 0 or 1, or a GTU comparison with +     dec_num - 1.  */ +  if (!((GET_CODE (condition) == GE +     || GET_CODE (condition) == NE) +    && (XEXP (condition, 1) == const0_rtx +        || XEXP (condition, 1) == const1_rtx )) +      &&!(GET_CODE (condition) == GTU +      && ((INTVAL (XEXP (condition, 1))) == (dec_num - 1))))      return 0; -  if ((XEXP (condition, 0) == reg) +  /* For the ARM special case of having a GTU: re-form the condition without +     the unspec for the benefit of the middle-end.  */ +  if (GET_CODE (condition) == GTU) +    { +      condition = gen_rtx_fmt_ee (GTU, VOIDmode, inc_src, GEN_INT (dec_num - 1)); +      return condition; +    } +  else if ((XEXP (condition, 0) == reg)        /* For the third case:  */        || ((cc_reg != NULL_RTX)        && (XEXP (condition, 0) == cc_reg)        && (reg_orig == reg)) @@ -245,20 +257,11 @@ doloop_condition_get (rtx_insn *doloop_pat)                         (label_ref (label))                         (pc))))]) -    So we return the second form instead for the two cases when n == 1. - -    For n > 1, the final value may be exceeded, so use GE instead of NE. +    So we return the second form instead for the two cases.       */ -     if (GET_CODE (pattern) != PARALLEL) -       { -    if (INTVAL (XEXP (inc_src, 1)) != -1) -      condition = gen_rtx_fmt_ee (GE, VOIDmode, inc_src, const0_rtx); -    else -      condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);; -       } - +    condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx);      return condition; -   } +    }    /* ??? If a machine uses a funny comparison, we could return a       canonicalized form here.  */ @@ -501,7 +504,8 @@ doloop_modify (class loop *loop, class niter_desc *desc,      case GE:        /* Currently only GE tests against zero are supported.  */        gcc_assert (XEXP (condition, 1) == const0_rtx); - +      /* FALLTHRU */ +    case GTU:        noloop = constm1_rtx; diff --git a/gcc/config/arm/iterators.md b/gcc/config/arm/iterators.md index a6a7ff507a5..9398702cddd 100644 --- a/gcc/config/arm/iterators.md +++ b/gcc/config/arm/iterators.md @@ -2673,8 +2673,16 @@  (define_int_attr mrrc [(VUNSPEC_MRRC "mrrc") (VUNSPEC_MRRC2 "mrrc2")])  (define_int_attr MRRC [(VUNSPEC_MRRC "MRRC") (VUNSPEC_MRRC2 "MRRC2")]) -(define_int_attr mode1 [(DLSTP8 "8") (DLSTP16 "16") (DLSTP32 "32") -            (DLSTP64 "64")]) +(define_int_attr dlstp_elemsize [(DLSTP8 "8") (DLSTP16 "16") (DLSTP32 "32") +                 (DLSTP64 "64")]) + +(define_int_attr letp_num_lanes [(LETP8 "16") (LETP16 "8") (LETP32 "4") +                 (LETP64 "2")]) +(define_int_attr letp_num_lanes_neg [(LETP8 "-16") (LETP16 "-8") (LETP32 "-4") +                     (LETP64 "-2")]) + +(define_int_attr letp_num_lanes_minus_1 [(LETP8 "15") (LETP16 "7") (LETP32 "3") +                     (LETP64 "1")])  (define_int_attr opsuffix [(UNSPEC_DOT_S "s8")                 (UNSPEC_DOT_U "u8") @@ -2921,6 +2929,8 @@  (define_int_iterator VQSHLUQ_N [VQSHLUQ_N_S])  (define_int_iterator DLSTP [DLSTP8 DLSTP16 DLSTP32                     DLSTP64]) +(define_int_iterator LETP [LETP8 LETP16 LETP32 +               LETP64])  ;; Define iterators for VCMLA operations  (define_int_iterator VCMLA_OP [UNSPEC_VCMLA        /* The iteration count does not need incrementing for a GE test.  */ diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md index 12ae4c4f820..2d6f27c14f4 100644 --- a/gcc/config/arm/unspecs.md +++ b/gcc/config/arm/unspecs.md @@ -587,6 +587,10 @@    DLSTP16    DLSTP32    DLSTP64 +  LETP8 +  LETP16 +  LETP32 +  LETP64    VPNOT    VCREATEQ_F    VCVTQ_N_TO_F_S I've attached the whole [2/2] patch diff with this change and the required comment changes in doloop_condition_get. WDYT? Thanks, Stam > > --------------Z9WW62ku0Uj0U0smP9DoFyW0 Content-Type: text/x-patch; charset=UTF-8; name="2.patch" Content-Disposition: attachment; filename="2.patch" Content-Transfer-Encoding: base64 Y29tbWl0IDQ1Yzg3YjI0YWJiMGViMzVjYmYyZDgxODRkMzUyMDczMzliZDZiZTYKQXV0aG9yOiBT dGFtIE1hcmtpYW5vcy1XcmlnaHQgPHN0YW0ubWFya2lhbm9zLXdyaWdodEBhcm0uY29tPgpEYXRl OiAgIFR1ZSBPY3QgMTggMTc6NDI6NTYgMjAyMiArMDEwMAoKICAgIGFybTogQWRkIHN1cHBvcnQg Zm9yIE1WRSBUYWlsLVByZWRpY2F0ZWQgTG93IE92ZXJoZWFkIExvb3BzCiAgICAKICAgIFRoaXMg aXMgdGhlIDIvMiBwYXRjaCB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgbmVl ZGVkCiAgICBmb3IgTVZFIFRhaWwgUHJlZGljYXRlZCBMb3cgT3ZlcmhlYWQgTG9vcHMuICBTZWUg bXkgcHJldmlvdXMgZW1haWwKICAgIGZvciBhIGdlbmVyYWwgaW50cm9kdWN0aW9uIG9mIE1WRSBM T0xzLgogICAgCiAgICBUaGlzIHN1cHBvcnQgaXMgYWRkZWQgdGhyb3VnaCB0aGUgYWxyZWFkeSBl eGlzdGluZyBsb29wLWRvbG9vcAogICAgbWVjaGFuaXNtcyB0aGF0IGFyZSB1c2VkIGZvciBub24t TVZFIGRscy9sZSBsb29waW5nLgogICAgCiAgICBNaWQtZW5kIGNoYW5nZXMgYXJlOgogICAgCiAg ICAxKSBSZWxheCB0aGUgbG9vcC1kb2xvb3AgbWVjaGFuaXNtIGluIHRoZSBtaWQtZW5kIHRvIGFs bG93IGZvcgogICAgICAgZGVjcmVtZW50IG51bWJlcnMgb3RoZXIgdGhhdCAtMSBhbmQgZm9yIGBj b3VudGAgdG8gYmUgYW4KICAgICAgIHJ0eCBjb250YWluaW5nIGEgc2ltcGxlIFJFRyAod2hpY2gg aW4gdGhpcyBjYXNlIHdpbGwgY29udGFpbgogICAgICAgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0 byBiZSBwcm9jZXNzZWQpLCByYXRoZXIKICAgICAgIHRoYW4gYW4gZXhwcmVzc2lvbiBmb3IgY2Fs Y3VsYXRpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLgogICAgMikgQWRkZWQgYSBuZXcgZGYg dXRpbGl0eSBmdW5jdGlvbjogYGRmX2JiX3JlZ25vX29ubHlfZGVmX2ZpbmRgIHRoYXQKICAgICAg IHdpbGwgcmV0dXJuIHRoZSBERUYgb2YgYSBSRUcgaWYgaXQgaXMgREVGLWVkIG9ubHkgb25jZSB3 aXRoaW4gdGhlCiAgICAgICBiYXNpYyBibG9jay4KICAgIAogICAgQW5kIG1hbnkgdGhpbmdzIGlu IHRoZSBiYWNrZW5kIHRvIGltcGxlbWVudCB0aGUgYWJvdmUgb3B0aW1pc2F0aW9uOgogICAgCiAg ICAzKSAgSW1wbGVtZW50IHRoZSBgYXJtX3ByZWRpY3RfZG9sb29wX3BgIHRhcmdldCBob29rIHRv IGluc3RydWN0IHRoZQogICAgICAgIG1pZC1lbmQgYWJvdXQgTG93IE92ZXJoZWFkIExvb3BzIChN VkUgb3Igbm90KSwgYXMgd2VsbCBhcwogICAgICAgIGBhcm1fbG9vcF91bnJvbGxfYWRqdXN0YCB3 aGljaCB3aWxsIHByZXZlbnQgdW5yb2xsaW5nIG9mIGFueSBsb29wcwogICAgICAgIHRoYXQgYXJl IHZhbGlkIGZvciBiZWNvbWluZyBNVkUgVGFpbF9QcmVkaWNhdGVkIExvdyBPdmVyaGVhZCBMb29w cwogICAgICAgICh1bnJvbGxpbmcgY2FuIHRyYW5zZm9ybSBhIGxvb3AgaW4gd2F5cyB0aGF0IGlu dmFsaWRhdGUgdGhlIGRsc3RwLwogICAgICAgIGxldHAgdHJhbmZvcm1hdGlvbiBsb2dpYyBhbmQg dGhlIGJlbmVmaXQgb2YgdGhlIGRsc3RwL2xldHAgbG9vcAogICAgICAgIHdvdWxkIGJlIGNvbnNp ZGVyYWJseSBoaWdoZXIgdGhhbiB0aGF0IG9mIHVucm9sbGluZykKICAgIDQpICBBcHByb3ByaWF0 ZSBjaGFuZ2VzIHRvIHRoZSBkZWZpbmVfZXhwYW5kIG9mIGRvbG9vcF9lbmQsIG5ldwogICAgICAg IHBhdHRlcm5zIGZvciBkbHN0cCBhbmQgbGV0cCwgbmV3IGl0ZXJhdG9ycywgIHVuc3BlY3MsIGV0 Yy4KICAgIDUpIGBhcm1fbXZlX2xvb3BfdmFsaWRfZm9yX2Rsc3RwYCBhbmQgYSBudW1iZXIgb2Yg Y2hlY2tpbmcgZnVuY3Rpb25zOgogICAgICAgKiBgYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291 bnRlcmAKICAgICAgICogYGFybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2NvdW50ZXJgCiAgICAgICAq IGBhcm1fbXZlX2NoZWNrX3JlZ19vcmlnaW5faXNfbnVtX2VsZW1zYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9iYWNrX2Zvcl9pbXBsaWNfcHJlZGljYAogICAgICAgKiBgYXJtX212 ZV9jaGVja19kZl9jaGFpbl9md2RfZm9yX2ltcGxpY19wcmVkaWNfaW1wYWN0YAogICAgICAgVGhp cyBhbGwsIGluIHNtb2Ugd2F5IG9yIGFub3RoZXIsIGFyZSBydW5uaW5nIGNoZWNrcyBvbiB0aGUg bG9vcAogICAgICAgc3RydWN0dXJlIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB0aGUgbG9vcCBp cyB2YWxpZCBmb3IgZGxzdHAvbGV0cAogICAgICAgdHJhbnNmb3JtYXRpb24uCiAgICA2KSBgYXJt X2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtYDogKGNhbGxlZCBmcm9tIHRoZSBkZWZpbmVfZXhwYW5k IG9mCiAgICAgICAgZG9sb29wX2VuZCkgdGhpcyBmdW5jdGlvbiByZS1jaGVja3MgZm9yIHRoZSBs b29wJ3Mgc3VpdGFiaWxpdHkgZm9yCiAgICAgICAgZGxzdHAvbGV0cCB0cmFuc2Zvcm1hdGlvbiBh bmQgdGhlbiBpbXBsZW1lbnRzIGl0LCBpZiBwb3NzaWJsZS4KICAgIDcpIFZhcmlvdXMgdXRpbGl0 eSBmdW5jdGlvbnM6CiAgICAgICAqYGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXNgIHRvIG1hcAogICAg ICAgZnJvbSB2Y3RwIHVuc3BlY3MgdG8gbnVtYmVyIG9mIGxhbmVzLCBhbmQgYGFybV9nZXRfcmVx dWlyZWRfdnByX3JlZ2AKICAgICAgIHRvIGNoZWNrIGFuIGluc24gdG8gc2VlIGlmIGl0IHJlcXVp cmVzIHRoZSBWUFIgb3Igbm90LgogICAgICAgKiBgYXJtX212ZV9nZXRfbG9vcF92Y3RwYAogICAg ICAgKiBgYXJtX212ZV9nZXRfdmN0cF9sYW5lc2AKICAgICAgICogYGFybV9lbWl0X212ZV91bnBy ZWRpY2F0ZWRfaW5zbl90b19zZXFgCiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdg CiAgICAgICAqIGBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9yZWdfcGFyYW1gCiAgICAgICAqIGBhcm1f Z2V0X3JlcXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbGAKICAgICAgICogYGFybV9tdmVfaXNfYWNyb3Nz X3ZlY3Rvcl9pbnNuYAogICAgICAgKiBgYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc25gCiAgICAg ICAqIGBhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZWAK ICAgICAgICogYGFybV9tdmVfdmVjX2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJf cHJlZGljYXRlYAogICAgCiAgICBObyByZWdyZXNzaW9ucyBvbiBhcm0tbm9uZS1lYWJpIHdpdGgg dmFyaW91cyB0YXJnZXRzIGFuZCBvbgogICAgYWFyY2g2NC1ub25lLWVsZi4gVGhvdWdodHMgb24g Z2V0dGluZyB0aGlzIGludG8gdHJ1bms/CiAgICAKICAgIFRoYW5rIHlvdSwKICAgIFN0YW0gTWFy a2lhbm9zLVdyaWdodAogICAgCiAgICBnY2MvQ2hhbmdlTG9nOgogICAgCiAgICAgICAgICAgICog Y29uZmlnL2FybS9hcm0tcHJvdG9zLmggKGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iKTogUmVu YW1lIHRvLi4uCiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IpOiAuLi50aGlz CiAgICAgICAgICAgIChhcm1fYXR0ZW1wdF9kbHN0cF90cmFuc2Zvcm0pOiBOZXcuCiAgICAgICAg ICAgICogY29uZmlnL2FybS9hcm0uY2MgKFRBUkdFVF9MT09QX1VOUk9MTF9BREpVU1QpOiBOZXcu CiAgICAgICAgICAgIChUQVJHRVRfUFJFRElDVF9ET0xPT1BfUCk6IE5ldy4KICAgICAgICAgICAg KGFybV9ibG9ja19zZXRfdmVjdCk6CiAgICAgICAgICAgIChhcm1fdGFyZ2V0X2luc25fb2tfZm9y X2xvYik6IFJlbmFtZSBmcm9tIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9iLgogICAgICAgICAg ICAoYXJtX3RhcmdldF9iYl9va19mb3JfbG9iKTogTmV3LgogICAgICAgICAgICAoYXJtX212ZV9n ZXRfdmN0cF9sYW5lcyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3Jl Zyk6IE5ldy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19wYXJhbSk6IE5l dy4KICAgICAgICAgICAgKGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZ19yZXRfdmFsKTogTmV3Lgog ICAgICAgICAgICAoYXJtX212ZV9nZXRfbG9vcF92Y3RwKTogTmV3LgogICAgICAgICAgICAoYXJt X212ZV92ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19vdGhlcl9wcmVkaWNhdGUpOiBO ZXcuCiAgICAgICAgICAgIChhcm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlz X3ByZWRpY2F0ZSk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fYmFj a19mb3JfaW1wbGljX3ByZWRpYyk6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfY2hlY2tfZGZf Y2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdCk6IE5ldy4KICAgICAgICAgICAgKGFy bV9tdmVfY2hlY2tfcmVnX29yaWdpbl9pc19udW1fZWxlbXMpOiBOZXcuCiAgICAgICAgICAgIChh cm1fbXZlX2Rsc3RwX2NoZWNrX2luY19jb3VudGVyKTogTmV3LgogICAgICAgICAgICAoYXJtX212 ZV9kbHN0cF9jaGVja19kZWNfY291bnRlcik6IE5ldy4KICAgICAgICAgICAgKGFybV9tdmVfbG9v cF92YWxpZF9mb3JfZGxzdHApOiBOZXcuCiAgICAgICAgICAgIChhcm1fbXZlX2lzX2Fjcm9zc192 ZWN0b3JfaW5zbik6IE5ldy4KICAgICAgICAgICAgKGFybV9pc19tdmVfbG9hZF9zdG9yZV9pbnNu KTogTmV3LgogICAgICAgICAgICAoYXJtX3ByZWRpY3RfZG9sb29wX3ApOiBOZXcuCiAgICAgICAg ICAgIChhcm1fbG9vcF91bnJvbGxfYWRqdXN0KTogTmV3LgogICAgICAgICAgICAoYXJtX2VtaXRf bXZlX3VucHJlZGljYXRlZF9pbnNuX3RvX3NlcSk6IE5ldy4KICAgICAgICAgICAgKGFybV9hdHRl bXB0X2Rsc3RwX3RyYW5zZm9ybSk6IE5ldy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL2l0ZXJh dG9ycy5tZCAoRExTVFApOiBOZXcuCiAgICAgICAgICAgIChtb2RlMSk6IEFkZCBETFNUUCBtYXBw aW5ncy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL212ZS5tZCAoKnByZWRpY2F0ZWRfZG9sb29w X2VuZF9pbnRlcm5hbCk6IE5ldy4KICAgICAgICAgICAgKGRsc3RwPG1vZGUxPl9pbnNuKTogTmV3 LgogICAgICAgICAgICAqIGNvbmZpZy9hcm0vdGh1bWIyLm1kIChkb2xvb3BfZW5kKTogVXBkYXRl IGZvciBNVkUgTE9Mcy4KICAgICAgICAgICAgKiBjb25maWcvYXJtL3Vuc3BlY3MubWQ6IE5ldyB1 bnNwZWNzLgogICAgICAgICAgICAqIGRmLWNvcmUuY2MgKGRmX2JiX3JlZ25vX29ubHlfZGVmX2Zp bmQpOiBOZXcuCiAgICAgICAgICAgICogZGYuaCAoZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCk6 IE5ldy4KICAgICAgICAgICAgKiBsb29wLWRvbG9vcC5jYyAoZG9sb29wX2NvbmRpdGlvbl9nZXQp OiBSZWxheCBjb25kaXRpb25zLgogICAgICAgICAgICAoZG9sb29wX29wdGltaXplKTogQWRkIHN1 cHBvcnQgZm9yIGVsZW1lbnR3aXNlIExvTHMuCiAgICAKICAgIGdjYy90ZXN0c3VpdGUvQ2hhbmdl TG9nOgogICAgCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iLmg6IFVwZGF0ZSBmcmFt ZXdvcmsuCiAgICAgICAgICAgICogZ2NjLnRhcmdldC9hcm0vbG9iMS5jOiBMaWtld2lzZS4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9sb2I2LmM6IExpa2V3aXNlLgogICAgICAgICAgICAq IGdjYy50YXJnZXQvYXJtL212ZS9kbHN0cC1jb21waWxlLWFzbS5jOiBOZXcgdGVzdC4KICAgICAg ICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jOiBOZXcgdGVzdC4KICAg ICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50MzJ4NC5jOiBOZXcgdGVzdC4K ICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50NjR4Mi5jOiBOZXcgdGVz dC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50OHgxNi5jOiBOZXcg dGVzdC4KICAgICAgICAgICAgKiBnY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW52YWxpZC1hc20u YzogTmV3IHRlc3QuCgpkaWZmIC0tZ2l0IGEvZ2NjLy52c2NvZGUvc2V0dGluZ3MuanNvbiBiL2dj Yy8udnNjb2RlL3NldHRpbmdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLjQ5OTVjNzkyYjhkCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjLy52c2NvZGUvc2V0dGlu Z3MuanNvbgpAQCAtMCwwICsxLDYgQEAKK3sKKwkiZmlsZXMuYXNzb2NpYXRpb25zIjogeworCQki Ki5jYyI6ICJjcHAiLAorCQkiKi5kZWYiOiAiY3BwIgorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVu ZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9hcm0tcHJvdG9zLmggYi9nY2Mv Y29uZmlnL2FybS9hcm0tcHJvdG9zLmgKaW5kZXggMmY1Y2E3OWVkOGQuLjRmMTY0YzU0NzQwIDEw MDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS9hcm0tcHJvdG9zLmgKKysrIGIvZ2NjL2NvbmZpZy9h cm0vYXJtLXByb3Rvcy5oCkBAIC02NSw4ICs2NSw4IEBAIGV4dGVybiB2b2lkIGFybV9lbWl0X3Nw ZWN1bGF0aW9uX2JhcnJpZXJfZnVuY3Rpb24gKHZvaWQpOwogZXh0ZXJuIHZvaWQgYXJtX2RlY29t cG9zZV9kaV9iaW5vcCAocnR4LCBydHgsIHJ0eCAqLCBydHggKiwgcnR4ICosIHJ0eCAqKTsKIGV4 dGVybiBib29sIGFybV9xX2JpdF9hY2Nlc3MgKHZvaWQpOwogZXh0ZXJuIGJvb2wgYXJtX2dlX2Jp dHNfYWNjZXNzICh2b2lkKTsKLWV4dGVybiBib29sIGFybV90YXJnZXRfaW5zbl9va19mb3JfbG9i IChydHgpOwotCitleHRlcm4gYm9vbCBhcm1fdGFyZ2V0X2JiX29rX2Zvcl9sb2IgKGJhc2ljX2Js b2NrKTsKK2V4dGVybiBydHggYXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChydHgpOwogI2lm ZGVmIFJUWF9DT0RFCiBlbnVtIHJlZ19jbGFzcwogYXJtX21vZGVfYmFzZV9yZWdfY2xhc3MgKG1h Y2hpbmVfbW9kZSk7CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9hcm0uY2MgYi9nY2MvY29u ZmlnL2FybS9hcm0uY2MKaW5kZXggNjIwZWY3YmZiMmYuLjBlNDZhMjcyOGI2IDEwMDY0NAotLS0g YS9nY2MvY29uZmlnL2FybS9hcm0uY2MKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtLmNjCkBAIC02 NTksNiArNjU5LDEyIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX3NwZWMgYXJtX2F0 dHJpYnV0ZV90YWJsZVtdID0KICN1bmRlZiBUQVJHRVRfSEFWRV9DT05ESVRJT05BTF9FWEVDVVRJ T04KICNkZWZpbmUgVEFSR0VUX0hBVkVfQ09ORElUSU9OQUxfRVhFQ1VUSU9OIGFybV9oYXZlX2Nv bmRpdGlvbmFsX2V4ZWN1dGlvbgogCisjdW5kZWYgVEFSR0VUX0xPT1BfVU5ST0xMX0FESlVTVAor I2RlZmluZSBUQVJHRVRfTE9PUF9VTlJPTExfQURKVVNUIGFybV9sb29wX3Vucm9sbF9hZGp1c3QK KworI3VuZGVmIFRBUkdFVF9QUkVESUNUX0RPTE9PUF9QCisjZGVmaW5lIFRBUkdFVF9QUkVESUNU X0RPTE9PUF9QIGFybV9wcmVkaWN0X2RvbG9vcF9wCisKICN1bmRlZiBUQVJHRVRfTEVHSVRJTUFU RV9DT05TVEFOVF9QCiAjZGVmaW5lIFRBUkdFVF9MRUdJVElNQVRFX0NPTlNUQU5UX1AgYXJtX2xl Z2l0aW1hdGVfY29uc3RhbnRfcAogCkBAIC0zNDQ3MiwxOSArMzQ0NzgsMTEwMyBAQCBhcm1faW52 YWxpZF93aXRoaW5fZG9sb29wIChjb25zdCBydHhfaW5zbiAqaW5zbikKIH0KIAogYm9vbAotYXJt X3RhcmdldF9pbnNuX29rX2Zvcl9sb2IgKHJ0eCBpbnNuKQorYXJtX3RhcmdldF9iYl9va19mb3Jf bG9iIChiYXNpY19ibG9jayBiYikKIHsKLSAgYmFzaWNfYmxvY2sgYmIgPSBCTE9DS19GT1JfSU5T TiAoaW5zbik7CiAgIC8qIE1ha2Ugc3VyZSB0aGUgYmFzaWMgYmxvY2sgb2YgdGhlIHRhcmdldCBp bnNuIGlzIGEgc2ltcGxlIGxhdGNoCiAgICAgIGhhdmluZyBhcyBzaW5nbGUgcHJlZGVjZXNzb3Ig YW5kIHN1Y2Nlc3NvciB0aGUgYm9keSBvZiB0aGUgbG9vcAogICAgICBpdHNlbGYuICBPbmx5IHNp bXBsZSBsb29wcyB3aXRoIGEgc2luZ2xlIGJhc2ljIGJsb2NrIGFzIGJvZHkgYXJlCiAgICAgIHN1 cHBvcnRlZCBmb3IgJ2xvdyBvdmVyIGhlYWQgbG9vcCcgbWFraW5nIHN1cmUgdGhhdCBMRSB0YXJn ZXQgaXMKICAgICAgYWJvdmUgTEUgaXRzZWxmIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gICovCi0K ICAgcmV0dXJuIHNpbmdsZV9zdWNjX3AgKGJiKQotICAgICYmIHNpbmdsZV9wcmVkX3AgKGJiKQot ICAgICYmIHNpbmdsZV9zdWNjX2VkZ2UgKGJiKS0+ZGVzdCA9PSBzaW5nbGVfcHJlZF9lZGdlIChi YiktPnNyYwotICAgICYmIGNvbnRhaW5zX25vX2FjdGl2ZV9pbnNuX3AgKGJiKTsKKwkgJiYgc2lu Z2xlX3ByZWRfcCAoYmIpCisJICYmIHNpbmdsZV9zdWNjX2VkZ2UgKGJiKS0+ZGVzdCA9PSBzaW5n bGVfcHJlZF9lZGdlIChiYiktPnNyYzsKK30KKworLyogVXRpbGl0eSBmdWN0aW9uOiBHaXZlbiBh IFZDVFAgb3IgYSBWQ1RQX00gaW5zbiwgcmV0dXJuIHRoZSBudW1iZXIgb2YgTVZFCisgICBsYW5l cyBiYXNlZCBvbiB0aGUgbWFjaGluZSBtb2RlIGJlaW5nIHVzZWQuICAqLworCitzdGF0aWMgaW50 Cithcm1fbXZlX2dldF92Y3RwX2xhbmVzIChydHggeCkKK3sKKyAgaWYgKEdFVF9DT0RFICh4KSA9 PSBTRVQgJiYgR0VUX0NPREUgKFhFWFAgKHgsIDEpKSA9PSBVTlNQRUMKKyAgICAgICYmIChYSU5U IChYRVhQICh4LCAxKSwgMSkgPT0gVkNUUCB8fCBYSU5UIChYRVhQICh4LCAxKSwgMSkgPT0gVkNU UF9NKSkKKyAgICB7CisgICAgICBtYWNoaW5lX21vZGUgbW9kZSA9IEdFVF9NT0RFIChYRVhQICh4 LCAxKSk7CisgICAgICByZXR1cm4gKFZFQ1RPUl9NT0RFX1AgKG1vZGUpICYmIFZBTElEX01WRV9Q UkVEX01PREUgKG1vZGUpKQorCSAgICAgPyBHRVRfTU9ERV9OVU5JVFMgKG1vZGUpIDogMDsKKyAg ICB9CisgIHJldHVybiAwOworfQorCisvKiBDaGVjayBpZiBJTlNOIHJlcXVpcmVzIHRoZSB1c2Ug b2YgdGhlIFZQUiByZWcsIGlmIGl0IGRvZXMsIHJldHVybiB0aGUKKyAgIHN1Yi1ydHggb2YgdGhl IFZQUiByZWcuICBUaGUgVFlQRSBhcmd1bWVudCBjb250cm9scyB3aGV0aGVyCisgICB0aGlzIGZ1 bmN0aW9uIHNob3VsZDoKKyAgICogRm9yIFRZUEUgPT0gMCwgY2hlY2sgYWxsIG9wZXJhbmRzLCBp bmNsdWRpbmcgdGhlIE9VVCBvcGVyYW5kcywKKyAgICAgYW5kIHJldHVybiB0aGUgZmlyc3Qgb2Nj dXJyZW5jZSBvZiB0aGUgVlBSIHJlZy4KKyAgICogRm9yIFRZUEUgPT0gMSwgb25seSBjaGVjayB0 aGUgaW5wdXQgb3BlcmFuZHMuCisgICAqIEZvciBUWVBFID09IDIsIG9ubHkgY2hlY2sgdGhlIG91 dHB1dCBvcGVyYW5kcy4KKyAgIChJTk9VVCBvcGVyYW5kcyBhcmUgY29uc2lkZXJlZCBib3RoIGFz IGlucHV0IGFuZCBvdXRwdXQgb3BlcmFuZHMpCisqLworc3RhdGljIHJ0eAorYXJtX2dldF9yZXF1 aXJlZF92cHJfcmVnIChydHhfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50IHR5cGUgPSAwKQorewor ICBnY2NfYXNzZXJ0ICh0eXBlIDwgMyk7CisgIGlmICghTk9OSlVNUF9JTlNOX1AgKGluc24pKQor ICAgIHJldHVybiBOVUxMX1JUWDsKKworICBib29sIHJlcXVpcmVzX3ZwcjsKKyAgZXh0cmFjdF9j b25zdHJhaW5faW5zbiAoaW5zbik7CisgIGludCBuX29wZXJhbmRzID0gcmVjb2dfZGF0YS5uX29w ZXJhbmRzOworICBpZiAocmVjb2dfZGF0YS5uX2FsdGVybmF0aXZlcyA9PSAwKQorICAgIHJldHVy biBOVUxMX1JUWDsKKworICAvKiBGaWxsIGluIHJlY29nX29wX2FsdCB3aXRoIGluZm9ybWF0aW9u IGFib3V0IHRoZSBjb25zdHJhaW50cyBvZgorICAgICB0aGlzIGluc24uICAqLworICBwcmVwcm9j ZXNzX2NvbnN0cmFpbnRzIChpbnNuKTsKKworICBmb3IgKGludCBvcCA9IDA7IG9wIDwgbl9vcGVy YW5kczsgb3ArKykKKyAgICB7CisgICAgICByZXF1aXJlc192cHIgPSB0cnVlOworICAgICAgaWYg KHR5cGUgPT0gMSAmJiByZWNvZ19kYXRhLm9wZXJhbmRfdHlwZVtvcF0gPT0gT1BfT1VUKQorCWNv bnRpbnVlOworICAgICAgZWxzZSBpZiAodHlwZSA9PSAyICYmIHJlY29nX2RhdGEub3BlcmFuZF90 eXBlW29wXSA9PSBPUF9JTikKKwljb250aW51ZTsKKworICAgICAgLyogSXRlcmF0ZSB0aHJvdWdo IGFsdGVybmF0aXZlcyBvZiBvcGVyYW5kICJvcCIgaW4gcmVjb2dfb3BfYWx0IGFuZAorCSBpZGVu dGlmeSBpZiB0aGUgb3BlcmFuZCBpcyByZXF1aXJlZCB0byBiZSB0aGUgVlBSLiAgKi8KKyAgICAg IGZvciAoaW50IGFsdCA9IDA7IGFsdCA8IHJlY29nX2RhdGEubl9hbHRlcm5hdGl2ZXM7IGFsdCsr KQorCXsKKwkgIGNvbnN0IG9wZXJhbmRfYWx0ZXJuYXRpdmUgKm9wX2FsdAorCSAgICAgID0gJnJl Y29nX29wX2FsdFthbHQgKiBuX29wZXJhbmRzXTsKKwkgIC8qIEZldGNoIHRoZSByZWdfY2xhc3Mg Zm9yIGVhY2ggZW50cnkgYW5kIGNoZWNrIGl0IGFnYWluc3QgdGhlCisJICAgICBWUFJfUkVHIHJl Z19jbGFzcy4gICovCisJICBpZiAoYWx0ZXJuYXRpdmVfY2xhc3MgKG9wX2FsdCwgb3ApICE9IFZQ Ul9SRUcpCisJICAgIHJlcXVpcmVzX3ZwciA9IGZhbHNlOworCX0KKyAgICAgIC8qIElmIGFsbCBh bHRlcm5hdGl2ZXMgb2YgdGhlIGluc24gcmVxdWlyZSB0aGUgVlBSIHJlZyBmb3IgdGhpcyBvcGVy YW5kLAorCSBpdCBtZWFucyB0aGF0IGVpdGhlciB0aGlzIGlzIFZQUi1nZW5lcmF0aW5nIGluc3Ry dWN0aW9uLCBsaWtlIGEgdmN0cCwKKwkgdmNtcCwgZXRjLiwgb3IgaXQgaXMgYSBWUFQtcHJlZGlj YXRlZCBpbnNydWN0aW9uLiAgUmV0dXJuIHRoZSBzdWJydHgKKwkgb2YgdGhlIFZQUiByZWcgb3Bl cmFuZC4gICovCisgICAgICBpZiAocmVxdWlyZXNfdnByKQorCXJldHVybiByZWNvZ19kYXRhLm9w ZXJhbmRbb3BdOworICAgIH0KKyAgcmV0dXJuIE5VTExfUlRYOworfQorCisvKiBXcmFwcGVyIGZ1 bmN0aW9uIG9mIGFybV9nZXRfcmVxdWlyZWRfdnByX3JlZyB3aXRoIFRZUEUgPT0gMSwgc28gcmV0 dXJuCisgICBzb21ldGhpbmcgb25seSBpZiB0aGUgVlBSIHJlZyBpcyBhbiBpbnB1dCBvcGVyYW5k IHRvIHRoZSBpbnNuLiAgKi8KKworc3RhdGljIHJ0eAorYXJtX2dldF9yZXF1aXJlZF92cHJfcmVn X3BhcmFtIChydHhfaW5zbiAqaW5zbikKK3sKKyAgcmV0dXJuIGFybV9nZXRfcmVxdWlyZWRfdnBy X3JlZyAoaW5zbiwgMSk7Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rpb24gb2YgYXJtX2dldF9yZXF1 aXJlZF92cHJfcmVnIHdpdGggVFlQRSA9PSAyLCBzbyByZXR1cm4KKyAgIHNvbWV0aGluZyBvbmx5 IGlmIHRoZSBWUFIgcmVnIGlzIHRoZSByZXR1cm4gdmFsdWUsIGFuIG91dHB1dCBvZiwgb3IgaXMK KyAgIGNsb2JiZXJlZCBieSB0aGUgaW5zbi4gICovCisKK3N0YXRpYyBydHgKK2FybV9nZXRfcmVx dWlyZWRfdnByX3JlZ19yZXRfdmFsIChydHhfaW5zbiAqaW5zbikKK3sKKyAgcmV0dXJuIGFybV9n ZXRfcmVxdWlyZWRfdnByX3JlZyAoaW5zbiwgMik7Cit9CisKKy8qIFNjYW4gdGhlIGJhc2ljIGJs b2NrIG9mIGEgbG9vcCBib2R5IGZvciBhIHZjdHAgaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBpcwor ICAgYXQgbGVhc3QgdmN0cCBpbnN0cnVjdGlvbiwgcmV0dXJuIHRoZSBmaXJzdCBydHhfaW5zbiAq LiAgKi8KKworc3RhdGljIHJ0eF9pbnNuICoKK2FybV9tdmVfZ2V0X2xvb3BfdmN0cCAoYmFzaWNf YmxvY2sgYmIpCit7CisgIHJ0eF9pbnNuICppbnNuID0gQkJfSEVBRCAoYmIpOworCisgIC8qIE5v dyBzY2FuIHRocm91Z2ggYWxsIHRoZSBpbnN0cnVjdGlvbiBwYXR0ZXJucyBhbmQgcGljayBvdXQg dGhlIFZDVFAKKyAgICAgaW5zdHJ1Y3Rpb24uICBXZSByZXF1aXJlIGFybV9nZXRfcmVxdWlyZWRf dnByX3JlZ19wYXJhbSB0byBiZSBmYWxzZQorICAgICB0byBtYWtlIHN1cmUgd2UgcGljayB1cCBh IFZDVFAsIHJhdGhlciB0aGFuIGEgVkNUUF9NLiAgKi8KKyAgRk9SX0JCX0lOU05TIChiYiwgaW5z bikKKyAgICBpZiAoTk9OREVCVUdfSU5TTl9QIChpbnNuKSkKKyAgICAgIGlmIChhcm1fZ2V0X3Jl cXVpcmVkX3Zwcl9yZWdfcmV0X3ZhbCAoaW5zbikKKwkgICYmIChhcm1fbXZlX2dldF92Y3RwX2xh bmVzIChQQVRURVJOIChpbnNuKSkgIT0gMCkKKwkgICYmICFhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9y ZWdfcGFyYW0gKGluc24pKQorCXJldHVybiBpbnNuOworICByZXR1cm4gTlVMTDsKK30KKworLyog UmV0dXJuIHRydWUgaWYgSU5TTiBpcyBhIE1WRSBpbnN0cnVjdGlvbiB0aGF0IGlzIFZQVC1wcmVk aWNhYmxlLCBidXQgaW4KKyAgIGl0cyB1bnByZWRpY2F0ZWQgZm9ybSwgb3IgaWYgaXQgaXMgcHJl ZGljYXRlZCwgYnV0IG9uIGEgcHJlZGljYXRlIG90aGVyCisgICB0aGFuIFZQUl9SRUcuICAqLwor CitzdGF0aWMgYm9vbAorYXJtX212ZV92ZWNfaW5zbl9pc191bnByZWRpY2F0ZWRfb3JfdXNlc19v dGhlcl9wcmVkaWNhdGUgKHJ0eF9pbnNuICppbnNuLAorCQkJCQkJCSAgcnR4IHZwcl9yZWcpCit7 CisgIHJ0eCBpbnNuX3Zwcl9yZWdfb3BlcmFuZDsKKyAgaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVE X0lOU05fUCAoaW5zbikKKyAgICAgIHx8IChNVkVfVlBUX1BSRURJQ0FURURfSU5TTl9QIChpbnNu KQorCSAgJiYgKGluc25fdnByX3JlZ19vcGVyYW5kID0gYXJtX2dldF9yZXF1aXJlZF92cHJfcmVn X3BhcmFtIChpbnNuKSkKKwkgICYmICFydHhfZXF1YWxfcCAodnByX3JlZywgaW5zbl92cHJfcmVn X29wZXJhbmQpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsK K30KKworLyogUmV0dXJuIHRydWUgaWYgSU5TTiBpcyBhIE1WRSBpbnN0cnVjdGlvbiB0aGF0IGlz IFZQVC1wcmVkaWNhYmxlIGFuZCBpcworICAgcHJlZGljYXRlZCBvbiBWUFJfUkVHLiAgKi8KKwor c3RhdGljIGJvb2wKK2FybV9tdmVfdmVjX2luc25faXNfcHJlZGljYXRlZF93aXRoX3RoaXNfcHJl ZGljYXRlIChydHhfaW5zbiAqaW5zbiwKKwkJCQkJCSAgICBydHggdnByX3JlZykKK3sKKyAgcnR4 IGluc25fdnByX3JlZ19vcGVyYW5kOworICBpZiAoTVZFX1ZQVF9QUkVESUNBVEVEX0lOU05fUCAo aW5zbikKKyAgICAgICYmIChpbnNuX3Zwcl9yZWdfb3BlcmFuZCA9IGFybV9nZXRfcmVxdWlyZWRf dnByX3JlZ19wYXJhbSAoaW5zbikpCisgICAgICAmJiBydHhfZXF1YWxfcCAodnByX3JlZywgaW5z bl92cHJfcmVnX29wZXJhbmQpKQorICAgIHJldHVybiB0cnVlOworICBlbHNlCisgICAgcmV0dXJu IGZhbHNlOworfQorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGlkZW50aWZ5IGlmIElOU04gaXMg YW4gTVZFIGluc3RydWN0aW9uIHRoYXQgcGVyZm9ybXMKKyAgIHNvbWUgYWNyb3NzLXZlY3RvciBv cGVyYXRpb24gKGFuZCBhcyBhIHJlc3VsdCBkb2VzIG5vdCBhbGlnbiB3aXRoIG5vcm1hbAorICAg bGFuZSBwcmVkaWNhdGlvbiBydWxlcykuICBBbGwgc3VjaCBpbnN0cnVjdGlvbnMgZ2l2ZSBvbmUg b25seSBzY2FsYXIKKyAgIG91dHB1dCwgZXhjZXB0IGZvciB2c2hsY3Egd2hpY2ggZ2l2ZXMgYSBQ QVJBTExFTCBvZiBhIHZlY3RvciBhbmQgYSBzY2FsYXIKKyAgIChvbmUgdmVjdG9yIHJlc3VsdCBh bmQgb25lIGNhcnJ5IG91dHB1dCkuICAqLworCitzdGF0aWMgYm9vbAorYXJtX2lzX212ZV9hY3Jv c3NfdmVjdG9yX2luc24gKHJ0eF9pbnNuKiBpbnNuKQoreworICBkZl9yZWYgaW5zbl9kZWZzID0g TlVMTDsKKyAgaWYgKCFNVkVfVlBUX1BSRURJQ0FCTEVfSU5TTl9QIChpbnNuKSkKKyAgICByZXR1 cm4gZmFsc2U7CisKKyAgYm9vbCBpc19hY3Jvc3NfdmVjdG9yID0gZmFsc2U7CisgIEZPUl9FQUNI X0lOU05fREVGIChpbnNuX2RlZnMsIGluc24pCisgICAgaWYgKCFWQUxJRF9NVkVfTU9ERSAoR0VU X01PREUgKERGX1JFRl9SRUcgKGluc25fZGVmcykpKQorCSYmICFhcm1fZ2V0X3JlcXVpcmVkX3Zw cl9yZWdfcmV0X3ZhbCAoaW5zbikpCisgICAgICBpc19hY3Jvc3NfdmVjdG9yID0gdHJ1ZTsKKwor ICByZXR1cm4gaXNfYWNyb3NzX3ZlY3RvcjsKK30KKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBp ZGVudGlmeSBpZiBJTlNOIGlzIGFuIE1WRSBsb2FkIG9yIHN0b3JlIGluc3RydWN0aW9uLgorICAg KiBGb3IgVFlQRSA9PSAwLCBjaGVjayBhbGwgb3BlcmFuZHMuICBJZiB0aGUgZnVuY3Rpb24gcmV0 dXJucyB0cnVlLAorICAgICBJTlNOIGlzIGEgbG9hZCBvciBhIHN0b3JlIGluc24uCisgICAqIEZv ciBUWVBFID09IDEsIG9ubHkgY2hlY2sgdGhlIGlucHV0IG9wZXJhbmRzLiAgSWYgdGhlIGZ1bmN0 aW9uIHJldHVybnMKKyAgICAgdHJ1ZSwgSU5TTiBpcyBhIGxvYWQgaW5zbi4KKyAgICogRm9yIFRZ UEUgPT0gMiwgb25seSBjaGVjayB0aGUgb3V0cHV0IG9wZXJhbmRzLiAgSWYgdGhlIGZ1bmN0aW9u IHJldHVybnMKKyAgICAgdHJ1ZSwgSU5TTiBpcyBhIHN0b3JlIGluc24uICAqLworCitzdGF0aWMg Ym9vbAorYXJtX2lzX212ZV9sb2FkX3N0b3JlX2luc24gKHJ0eF9pbnNuKiBpbnNuLCBpbnQgdHlw ZSA9IDApCit7CisgIGludCBuX29wZXJhbmRzID0gcmVjb2dfZGF0YS5uX29wZXJhbmRzOworICBl eHRyYWN0X2luc24gKGluc24pOworCisgIGZvciAoaW50IG9wID0gMDsgb3AgPCBuX29wZXJhbmRz OyBvcCsrKQorICAgIHsKKyAgICAgIGlmICh0eXBlID09IDEgJiYgcmVjb2dfZGF0YS5vcGVyYW5k X3R5cGVbb3BdID09IE9QX09VVCkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0g MiAmJiByZWNvZ19kYXRhLm9wZXJhbmRfdHlwZVtvcF0gPT0gT1BfSU4pCisJY29udGludWU7Cisg ICAgICBpZiAobXZlX21lbW9yeV9vcGVyYW5kIChyZWNvZ19kYXRhLm9wZXJhbmRbb3BdLAorCQkJ ICAgICAgR0VUX01PREUgKHJlY29nX2RhdGEub3BlcmFuZFtvcF0pKSkKKyAgICAgIHJldHVybiB0 cnVlOworICAgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBXaGVuIHRyYW5zZm9ybWluZyBh biBNVkUgaW50cmluc2ljIGxvb3AgaW50byBhbiBNVkUgVGFpbCBQcmVkaWNhdGVkIExvdworICAg T3ZlcmhlYWQgTG9vcCwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0LCBp ZiBpbiB0aGVpcgorICAgdW5wcmVkaWNhdGVkIGZvcm0sIGFjdCBhY3Jvc3MgdmVjdG9yIGxhbmVz LCBidXQgYXJlIHN0aWxsIHNhZmUgdG8gaW5jbHVkZQorICAgd2l0aGluIHRoZSBsb29wLCBkZXNw aXRlIHRoZSBpbXBsaWNpdCBwcmVkaWNhdGlvbiBhZGRlZCB0byB0aGUgdmVjdG9yIGxhbmVzLgor ICAgVGhpcyBsaXN0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IGNhcmVmdWxseSBhbmFseXppbmcgdGhl IGluc3RydWN0aW9uCisgICBwc2V1ZG9jb2RlIGluIHRoZSBBcm0tQVJNLgorICAgQWxsIG90aGVy IGFjcm9zcy12ZWN0b3IgaW5zdHJ1Y3Rpb25zIGFyZW4ndCBhbGxvd2VkLCBiZWNhdXNlIHRoZSBh ZGRpdGlvbgorICAgb2YgaW1wbGljaXQgcHJlZGljYXRpb24gY291bGQgaW5mbHVuY2UgdGhlIHJl c3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgQW55IG5ldyBhY3Jvc3MtdmVjdG9yIGluc3RydWN0 aW9ucyB0byB0aGUgTVZFIElTQSB3aWxsIGhhdmUgdG8gYXNzZXNzZWQgZm9yCisgICBpbmNsdXNp b24gdG8gdGhpcyBsaXN0LiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfaXNfYWxsb3dlZF91 bnByZWRpY19hY3Jvc3NfdmVjdG9yX2luc24gKHJ0eF9pbnNuKiBpbnNuKQoreworICBnY2NfYXNz ZXJ0IChNVkVfVlBUX1VOUFJFRElDQVRFRF9JTlNOX1AgKGluc24pCisJICAgICAgJiYgYXJtX2lz X212ZV9hY3Jvc3NfdmVjdG9yX2luc24gKGluc24pKTsKKyAgcnR4IGluc25fcGF0dGVybiA9IFBB VFRFUk4gKGluc24pOworICBpZiAoR0VUX0NPREUgKGluc25fcGF0dGVybikgPT0gU0VUCisgICAg ICAmJiBHRVRfQ09ERSAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSkgPT0gVU5TUEVDCisgICAgICAm JiAoWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERFZRX1UKKwkgIHx8IFhJ TlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERWUV9TCisJICB8fCBYSU5UIChY RVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQUREVkFRX1UKKwkgIHx8IFhJTlQgKFhFWFAg KGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5z bl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MQURBVlFfVQorCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9w YXR0ZXJuLCAxKSwgMSkgPT0gVk1MQURBVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0 ZXJuLCAxKSwgMSkgPT0gVk1MQURBVlhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVy biwgMSksIDEpID09IFZNTEFEQVZBUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4s IDEpLCAxKSA9PSBWTUxBREFWQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAx KSwgMSkgPT0gVk1MQURBVkFYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEp LCAxKSA9PSBWQUJBVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkg PT0gVkFCQVZRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZB RERMVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVkFERExW UV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQURETFZBUV9T CisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQURETFZBUV9VCisJ ICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAxKSA9PSBWQUREVkFRX1MKKwkgIHx8 IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZBRERWQVFfVQorCSAgfHwgWElO VCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1BWFZRX1UKKwkgIHx8IFhJTlQgKFhF WFAgKGluc25fcGF0dGVybiwgMSksIDEpID09IFZNQVhBVlFfUworCSAgfHwgWElOVCAoWEVYUCAo aW5zbl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MQUxEQVZRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGlu c25fcGF0dGVybiwgMSksIDEpID09IFZNTEFMREFWWFFfVQorCSAgfHwgWElOVCAoWEVYUCAoaW5z bl9wYXR0ZXJuLCAxKSwgMSkgPT0gVk1MQUxEQVZYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNu X3BhdHRlcm4sIDEpLCAxKSA9PSBWTUxBTERBVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9w YXR0ZXJuLCAxKSwgMSkgPT0gVk1MQUxEQVZBUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3Bh dHRlcm4sIDEpLCAxKSA9PSBWTUxBTERBVkFRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0 dGVybiwgMSksIDEpID09IFZNTEFMREFWQVhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0 dGVybiwgMSksIDEpID09IFZNTEFMREFWQVhRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0 dGVybiwgMSksIDEpID09IFZNTFNEQVZRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVy biwgMSksIDEpID09IFZNTFNEQVZYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4s IDEpLCAxKSA9PSBWTUxTREFWQVhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwg MSksIDEpID09IFZNTFNEQVZBUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEp LCAxKSA9PSBWTUxTTERBVlFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwg MSkgPT0gVk1MU0xEQVZYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWTUxTTERBVkFRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEp ID09IFZNTFNMREFWQVhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSksIDEp ID09IFZSTUxBTERBVkhYUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWUk1MQUxEQVZIUV9VCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWUk1MQUxEQVZIUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4sIDEpLCAx KSA9PSBWUk1MQUxEQVZIQVFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAxKSwg MSkgPT0gVlJNTEFMREFWSEFRX1UKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwgMSks IDEpID09IFZSTUxBTERBVkhBWFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAx KSwgMSkgPT0gVlJNTFNMREFWSFFfUworCSAgfHwgWElOVCAoWEVYUCAoaW5zbl9wYXR0ZXJuLCAx KSwgMSkgPT0gVlJNTFNMREFWSFhRX1MKKwkgIHx8IFhJTlQgKFhFWFAgKGluc25fcGF0dGVybiwg MSksIDEpID09IFZSTUxTTERBVkhBUV9TCisJICB8fCBYSU5UIChYRVhQIChpbnNuX3BhdHRlcm4s IDEpLCAxKSA9PSBWUk1MU0xEQVZIQVhRX1MpKQorICAgIHJldHVybiB0cnVlOworICByZXR1cm4g ZmFsc2U7Cit9CisKKy8qIFJlY3Vyc2l2ZWx5IHNjYW4gdGhyb3VnaCB0aGUgREYgY2hhaW4gYmFj a3dhcmRzIHdpdGhpbiB0aGUgYmFzaWMgYmxvY2sgYW5kCisgICBkZXRlcm1pbmUgaWYgYW55IG9m IHRoZSBVU0VzIG9mIHRoZSBvcmlnaW5hbCBpbnNuIChvciB0aGUgVVNFcyBvZiB0aGUgaW5zbnMK KyAgIHdoZXJlIHRoeSB3ZXJlIERFRi1lZCwgZXRjLiwgcmVjdXJzaXZlbHkpIHdlcmUgYWZmZWN0 ZWQgYnkgaW1wbGljaXQgVlBUCisgICBwcmVkaWNhdGlvbiBvZiBhbiBNVkVfVlBUX1VOUFJFRElD QVRFRF9JTlNOX1AgaW4gYSBkbHN0cC9sZXRwIGxvb3AuCisgICBUaGlzIGZ1bmN0aW9uIHJldHVy bnMgdHJ1ZSBpZiB0aGUgaW5zbiBpcyBhZmZlY3RlZCBpbXBsaWNpdCBwcmVkaWNhdGlvbgorICAg YW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgIEhhdmluZyBzdWNoIGltcGxpY2l0IHByZWRpY2F0aW9u IG9uIGFuIHVucHJlZGljYXRlZCBpbnNuIHdvdWxkbid0IGluIGl0c2VsZgorICAgYmxvY2sgdGFp bCBwcmVkaWNhdGlvbiwgYmVjYXVzZSB0aGUgb3V0cHV0IG9mIHRoYXQgaW5zbiBtaWdodCB0aGVu IGJlIHVzZWQKKyAgIGluIGEgY29ycmVjdGx5IHByZWRpY2F0ZWQgc3RvcmUgaW5zbiwgd2hlcmUg dGhlIGRpc2FibGVkIGxhbmVzIHdpbGwgYmUKKyAgIGlnbm9yZWQuICBUbyB2ZXJpZnkgdGhpcyB3 ZSBsYXRlciBjYWxsOgorICAgYGFybV9tdmVfY2hlY2tfZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNf cHJlZGljX2ltcGFjdGAsIHdoaWNoIHdpbGwgY2hlY2sgdGhlCisgICBERiBjaGFpbnMgZm9yd2Fy ZCB0byBzZWUgaWYgYW55IGltcGxpY2l0bHktcHJlZGljYXRlZCBvcGVyYW5kIGdldHMgdXNlZCBp bgorICAgYW4gaW1wcm9wZXIgd2F5LiAgKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tf ZGZfY2hhaW5fYmFja19mb3JfaW1wbGljX3ByZWRpYworICAoaGFzaF9tYXAgPHJ0eF9pbnNuICos IGJvb2w+ICpzYWZlX2luc25fbWFwLCBydHhfaW5zbiAqaW5zbl9pbiwKKyAgIHJ0eCB2Y3RwX3Zw cl9nZW5lcmF0ZWQpCit7CisKKyAgYXV0b192ZWM8cnR4X2luc24gKj4gd29ya2xpc3Q7CisgIHdv cmtsaXN0LnNhZmVfcHVzaCAoaW5zbl9pbik7CisKKyAgYm9vbCAqdGVtcCA9IE5VTEw7CisKKyAg d2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCAoKSA+IDApCisgICAgeworICAgICAgcnR4X2luc24gKmlu c24gPSB3b3JrbGlzdC5wb3AgKCk7CisKKyAgICAgIGlmICgodGVtcCA9IHNhZmVfaW5zbl9tYXAt PmdldCAoaW5zbikpKQorCXJldHVybiAqdGVtcDsKKworICAgICAgYmFzaWNfYmxvY2sgYm9keSA9 IEJMT0NLX0ZPUl9JTlNOIChpbnNuKTsKKworICAgICAgLyogVGhlIGNpcmN1bXN0YW5jZXMgdW5k ZXIgd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gaXMgYWZmZWN0ZWQgYnkgImltcGxpY2l0CisJIHByZWRp Y2F0aW9uIiBhcmUgYXMgZm9sbG93czoKKwkgICogSXQgaXMgYW4gVU5QUkVESUNBVEVEX0lOU05f UDoKKwkgICAgKiBUaGF0IGxvYWRzL3N0b3JlcyBmcm9tL3RvIG1lbW9yeS4KKwkgICAgKiBXaGVy ZSBhbnkgb25lIG9mIGl0cyBvcGVyYW5kcyBpcyBhbiBNVkUgdmVjdG9yIGZyb20gb3V0c2lkZSB0 aGUKKwkgICAgICBsb29wIGJvZHkgYmIuCisJIE9yOgorCSAgKiBBbnkgb2YgaXQncyBvcGVyYW5k cywgcmVjdXJzaXZlbHkgYmFja3dhcmRzLCBhcmUgYWZmZWN0ZWQuICAqLworICAgICAgaWYgKE1W RV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKwkgICYmIChhcm1faXNfbXZlX2xvYWRf c3RvcmVfaW5zbiAoaW5zbikKKwkgICAgICB8fCAoYXJtX2lzX212ZV9hY3Jvc3NfdmVjdG9yX2lu c24gKGluc24pCisJCSAgJiYgIWFybV9tdmVfaXNfYWxsb3dlZF91bnByZWRpY19hY3Jvc3NfdmVj dG9yX2luc24gKGluc24pKSkpCisJeworCSAgc2FmZV9pbnNuX21hcC0+cHV0IChpbnNuLCB0cnVl KTsKKwkgIHJldHVybiB0cnVlOworCX0KKworICAgICAgZGZfcmVmIGluc25fdXNlcyA9IE5VTEw7 CisgICAgICBGT1JfRUFDSF9JTlNOX1VTRSAoaW5zbl91c2VzLCBpbnNuKQorICAgICAgeworCS8q IElmIHRoZSBvcGVyYW5kIGlzIGluIHRoZSBpbnB1dCByZWcgc2V0IHRvIHRoZSB0aGUgYmFzaWMg YmxvY2ssCisJICAgKGkuZS4gaXQgaGFzIGNvbWUgZnJvbSBvdXRzaWRlIHRoZSBsb29wISksIGNv bnNpZGVyIGl0IHVuc2FmZSBpZjoKKwkgICAgICogSXQncyBiZWluZyB1c2VkIGluIGFuIHVucHJl ZGljYXRlZCBpbnNuLgorCSAgICAgKiBJdCBpcyBhIHByZWRpY2FibGUgTVZFIHZlY3Rvci4gICov CisJaWYgKE1WRV9WUFRfVU5QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKwkgICAgJiYgVkFMSURf TVZFX01PREUgKEdFVF9NT0RFIChERl9SRUZfUkVHIChpbnNuX3VzZXMpKSkKKwkgICAgJiYgUkVH Tk9fUkVHX1NFVF9QIChERl9MUl9JTiAoYm9keSksIERGX1JFRl9SRUdOTyAoaW5zbl91c2VzKSkp CisJICB7CisJICAgIHNhZmVfaW5zbl9tYXAtPnB1dCAoaW5zbiwgdHJ1ZSk7CisJICAgIHJldHVy biB0cnVlOworCSAgfQorCisJLyogU2NhbiBiYWNrd2FyZHMgZnJvbSB0aGUgY3VycmVudCBJTlNO IHRocm91Z2ggdGhlIGluc3RydWN0aW9uIGNoYWluCisJICAgdW50aWwgdGhlIHN0YXJ0IG9mIHRo ZSBiYXNpYyBibG9jay4gICovCisJZm9yIChydHhfaW5zbiAqcHJldl9pbnNuID0gUFJFVl9JTlNO IChpbnNuKTsKKwkgICAgIHByZXZfaW5zbiAmJiBwcmV2X2luc24gIT0gUFJFVl9JTlNOIChCQl9I RUFEIChib2R5KSk7CisJICAgICBwcmV2X2luc24gPSBQUkVWX0lOU04gKHByZXZfaW5zbikpCisJ ICB7CisJICAgIC8qIElmIGEgcHJldmlvdXMgaW5zbiBkZWZpbmVzIGEgcmVnaXN0ZXIgdGhhdCBJ TlNOIHVzZXMsIHRoZW4KKwkgICAgICAgcmVjdXJzZSBpbiBvcmRlciB0byBjaGVjayB0aGF0IGlu c24ncyBVU0VzLiBJZiBhbnkgb2YgdGhlc2UKKwkgICAgICAgaW5zbnMgcmV0dXJuIHRydWUgYXMg TVZFX1ZQVF9VTlBSRURJQ0FURURfSU5TTl9QcywgdGhlbiB0aGUKKwkgICAgICAgd2hvbGUgY2hh aW4gaXMgYWZmZWN0ZWQgYnkgdGhlIGNoYW5nZSBpbiBiZWhhdmlvdXIgZnJvbSBiZWluZworCSAg ICAgICBwbGFjZWQgaW4gZGxzdHAvbGV0cCBsb29wLiAgKi8KKwkgICAgZGZfcmVmIHByZXZfaW5z bl9kZWZzID0gTlVMTDsKKwkgICAgRk9SX0VBQ0hfSU5TTl9ERUYgKHByZXZfaW5zbl9kZWZzLCBw cmV2X2luc24pCisJICAgIHsKKwkgICAgICBpZiAoREZfUkVGX1JFR05PIChpbnNuX3VzZXMpID09 IERGX1JFRl9SRUdOTyAocHJldl9pbnNuX2RlZnMpCisJCSAgJiYgIWFybV9tdmVfdmVjX2luc25f aXNfcHJlZGljYXRlZF93aXRoX3RoaXNfcHJlZGljYXRlCisJCSAgICAgICAoaW5zbiwgdmN0cF92 cHJfZ2VuZXJhdGVkKSkKKwkJd29ya2xpc3Quc2FmZV9wdXNoIChwcmV2X2luc24pOworCSAgICB9 CisJICB9CisgICAgICB9CisgICAgfQorICBzYWZlX2luc25fbWFwLT5wdXQgKGluc25faW4sIGZh bHNlKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKiBJZiB3ZSBoYXZlIGlkZW50aWZpZWQgdGhh dCB0aGUgY3VycmVudCBERUYgd2lsbCBiZSBtb2RpZmllZAorICAgYnkgc3VjaCBpbXBsaWNpdCBw cmVkaWNhdGlvbiwgc2NhbiB0aHJvdWdoIGFsbCB0aGUKKyAgIGluc25zIHRoYXQgVVNFIGl0IGFu ZCBiYWlsIG91dCBpZiBhbnkgb25lIGlzIG91dHNpZGUgdGhlCisgICBjdXJyZW50IGJhc2ljIGJs b2NrIChpLmUuIHRoZSByZWcgaXMgbGl2ZSBhZnRlciB0aGUgbG9vcCkKKyAgIG9yIGlmIGFueSBh cmUgc3RvcmUgaW5zbnMgdGhhdCBhcmUgdW5wcmVkaWNhdGVkIG9yIHVzaW5nIGEKKyAgIHByZWRp Y2F0ZSBvdGhlciB0aGFuIHRoZSBsb29wIFZQUi4KKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0 cnVlIGlmIHRoZSBpbnNuIGlzIG5vdCBzdWl0YWJsZSBmb3IKKyAgIGltcGxpY2l0IHByZWRpY2F0 aW9uIGFuZCBmYWxzZSBvdGhlcndpc2UuKi8KKworc3RhdGljIGJvb2wKK2FybV9tdmVfY2hlY2tf ZGZfY2hhaW5fZndkX2Zvcl9pbXBsaWNfcHJlZGljX2ltcGFjdCAocnR4X2luc24gKmluc24sCisJ CQkJCQkgICAgIHJ0eCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpCit7CisKKyAgLyogSWYgdGhpcyBpbnNu IGlzIGluZGVlZCBhbiB1bnByZWRpY2F0ZWQgc3RvcmUgdG8gbWVtb3J5LCBiYWlsIG91dC4gICov CisgIGlmIChhcm1fbXZlX3ZlY19pbnNuX2lzX3VucHJlZGljYXRlZF9vcl91c2VzX290aGVyX3By ZWRpY2F0ZQorCShpbnNuLCB2Y3RwX3Zwcl9nZW5lcmF0ZWQpCisgICAgICAmJiAoYXJtX2lzX212 ZV9sb2FkX3N0b3JlX2luc24gKGluc24sIDIpCisJICB8fCBhcm1faXNfbXZlX2Fjcm9zc192ZWN0 b3JfaW5zbiAoaW5zbikpKQorICAgIHJldHVybiB0cnVlOworCisgIC8qIE5leHQsIHNjYW4gZm9y d2FyZCB0byB0aGUgdmFyaW91cyBVU0VzIG9mIHRoZSBERUZzIGluIHRoaXMgaW5zbi4gICovCisg IGRmX3JlZiBpbnNuX2RlZiA9IE5VTEw7CisgIEZPUl9FQUNIX0lOU05fREVGIChpbnNuX2RlZiwg aW5zbikKKyAgICB7CisgICAgICBmb3IgKGRmX3JlZiB1c2UgPSBERl9SRUdfVVNFX0NIQUlOIChE Rl9SRUZfUkVHTk8gKGluc25fZGVmKSk7IHVzZTsKKwkgICB1c2UgPSBERl9SRUZfTkVYVF9SRUcg KHVzZSkpCisJeworCSAgcnR4X2luc24gKm5leHRfdXNlX2luc24gPSBERl9SRUZfSU5TTiAodXNl KTsKKwkgIGlmIChuZXh0X3VzZV9pbnNuICE9IGluc24KKwkgICAgICAmJiBOT05ERUJVR19JTlNO X1AgKG5leHRfdXNlX2luc24pKQorCSAgICB7CisJICAgICAgLyogSWYgdGhlIFVTRSBpcyBvdXRz aWRlIHRoZSBsb29wIGJvZHkgYmIsIG9yIGl0IGlzIGluc2lkZSwgYnV0CisJCSBpcyBhbiBkaWZm ZXJlbnRseS1wcmVkaWNhdGVkIHN0b3JlIHRvIG1lbW9yeSBvciBpdCBpcyBhbnkKKwkJIGFjcm9z cy12ZWN0b3IgaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlmIChCTE9DS19GT1JfSU5TTiAoaW5z bikgIT0gQkxPQ0tfRk9SX0lOU04gKG5leHRfdXNlX2luc24pCisJCSAgfHwgKGFybV9tdmVfdmVj X2luc25faXNfdW5wcmVkaWNhdGVkX29yX3VzZXNfb3RoZXJfcHJlZGljYXRlCisJCSAgICAgICAo bmV4dF91c2VfaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVkKQorCQkgICAgICYmIChhcm1faXNfbXZl X2xvYWRfc3RvcmVfaW5zbiAobmV4dF91c2VfaW5zbiwgMikKKwkJCSB8fCBhcm1faXNfbXZlX2Fj cm9zc192ZWN0b3JfaW5zbiAobmV4dF91c2VfaW5zbikpKSkKKwkJcmV0dXJuIHRydWU7CisJICAg IH0KKwl9CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0 byBgYXJtX212ZV9kbHN0cF9jaGVja19pbmNfY291bnRlcmAgYW5kIHRvCisgICBgYXJtX212ZV9k bHN0cF9jaGVja19kZWNfY291bnRlcmAuICBJbiB0aGUgc2l0dWF0aW9ucyB3aGVyZSB0aGUgbG9v cCBjb3VudGVyCisgICBpcyBpbmNyZW1lbnRpbmcgYnkgMSBvciBkZWNyZW1lbnRpbmcgYnkgMSBp biBlYWNoIGl0ZXJhdGlvbiwgZW5zdXJlIHRoYXQgdGhlCisgICB0YXJnZXQgdmFsdWUgb3IgdGhl IGluaXRpYWxpc2F0aW9uIHZhbHVlLCByZXNwZWN0aXZlbHksIHdhcyBhIGNhbGN1bGF0aW9uCisg ICBvZiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3AsIHdoaWNoIGlzIGV4cGVj dGVkIHRvIGJlIGFuIEFTSElGVFJUCisgICBieSBWQ1RQX1NURVAuICAqLworCitzdGF0aWMgYm9v bAorYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVtcyAoYmFzaWNfYmxvY2sgYm9k eSwgcnR4IHJlZywgcnR4IHZjdHBfc3RlcCkKK3sKKyAgLyogT2ssIHdlIG5vdyBrbm93IHRoZSBs b29wIHN0YXJ0cyBmcm9tIHplcm8gYW5kIGluY3JlbWVudHMgYnkgb25lLgorICAgICBOb3cganVz dCBzaG93IHRoYXQgdGhlIG1heCB2YWx1ZSBvZiB0aGUgY291bnRlciBjYW1lIGZyb20gYW4KKyAg ICAgYXBwcm9wcmlhdGUgQVNISUZSVCBleHByIG9mIHRoZSBjb3JyZWN0IGFtb3VudC4gICovCisg IGJhc2ljX2Jsb2NrIHByZV9sb29wX2JiID0gYm9keS0+cHJldl9iYjsKKyAgd2hpbGUgKHByZV9s b29wX2JiICYmIEJCX0VORCAocHJlX2xvb3BfYmIpCisJICYmICFkZl9iYl9yZWdub19vbmx5X2Rl Zl9maW5kIChwcmVfbG9vcF9iYiwgUkVHTk8gKHJlZykpKQorICAgIHByZV9sb29wX2JiID0gcHJl X2xvb3BfYmItPnByZXZfYmI7CisKKyAgZGZfcmVmIGNvdW50ZXJfbWF4X2xhc3RfZGVmID0gZGZf YmJfcmVnbm9fb25seV9kZWZfZmluZCAocHJlX2xvb3BfYmIsIFJFR05PIChyZWcpKTsKKyAgcnR4 IGNvdW50ZXJfbWF4X2xhc3Rfc2V0OworICBpZiAoY291bnRlcl9tYXhfbGFzdF9kZWYpCisgICAg Y291bnRlcl9tYXhfbGFzdF9zZXQgPSBQQVRURVJOIChERl9SRUZfSU5TTiAoY291bnRlcl9tYXhf bGFzdF9kZWYpKTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB3ZSBlbmNv dW50ZXIgYSBzaW1wbGUgU0VUIGZyb20gYSBSRUcsIGZvbGxvdyBpdCB0aHJvdWdoLiAgKi8KKyAg aWYgKEdFVF9DT0RFIChjb3VudGVyX21heF9sYXN0X3NldCkgPT0gU0VUCisgICAgICAmJiBSRUdf UCAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpKSkKKyAgICByZXR1cm4gYXJtX212ZV9j aGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVtcworCSAgICAgKHByZV9sb29wX2JiLT5uZXh0X2Ji LCBYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIHZjdHBfc3RlcCk7CisKKyAgLyogSWYg d2UgZW5jb3VudGVyIGEgU0VUIGZyb20gYW4gSUZfVEhFTl9FTFNFIHdoZXJlIG9uZSBvZiB0aGUg b3BlcmFuZHMgaXMgYQorICAgICBjb25zdGFudCBhbmQgdGhlIG90aGVyIGlzIGEgUkVHLCBmb2xs b3cgdGhyb3VnaCB0byB0aGF0IFJFRy4gICovCisgIGlmIChHRVRfQ09ERSAoY291bnRlcl9tYXhf bGFzdF9zZXQpID09IFNFVAorICAgICAgJiYgR0VUX0NPREUgKFhFWFAgKGNvdW50ZXJfbWF4X2xh c3Rfc2V0LCAxKSkgPT0gSUZfVEhFTl9FTFNFCisgICAgICAmJiBSRUdfUCAoWEVYUCAoWEVYUCAo Y291bnRlcl9tYXhfbGFzdF9zZXQsIDEpLCAxKSkKKyAgICAgICYmIENPTlNUX0lOVF9QIChYRVhQ IChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDIpKSkKKyAgICByZXR1cm4gYXJtX212 ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVtcworCSAgICAgKHByZV9sb29wX2JiLT5uZXh0 X2JiLCBYRVhQIChYRVhQIChjb3VudGVyX21heF9sYXN0X3NldCwgMSksIDEpLCB2Y3RwX3N0ZXAp OworCisgIGlmIChHRVRfQ09ERSAoWEVYUCAoY291bnRlcl9tYXhfbGFzdF9zZXQsIDEpKSA9PSBB U0hJRlRSVAorICAgICAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAgKGNvdW50ZXJfbWF4X2xh c3Rfc2V0LCAxKSwgMSkpCisgICAgICAmJiAoKDEgPDwgSU5UVkFMIChYRVhQIChYRVhQIChjb3Vu dGVyX21heF9sYXN0X3NldCwgMSksIDEpKSkKKwkgICA9PSBhYnMgKElOVFZBTCAodmN0cF9zdGVw KSkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworLyogSWYgd2Ug aGF2ZSBpZGVudGlmaWVkIHRoZSBsb29wIHRvIGhhdmUgYW4gaW5jcmVtZW50aW5nIGNvdW50ZXIs IHdlIG5lZWQgdG8KKyAgIG1ha2Ugc3VyZSB0aGF0IGl0IGluY3JlbWVudHMgYnkgMSBhbmQgdGhh dCB0aGUgbG9vcCBpcyBzdHJ1Y3R1cmVkIGNvcnJlY3RseToKKyAgICAqIFRoZSBjb3VudGVyIHN0 YXJ0cyBmcm9tIDAKKyAgICAqIFRoZSBjb3VudGVyIHRlcm1pbmF0ZXMgYXQgKG51bV9vZl9lbGVt ICsgbnVtX29mX2xhbmVzIC0gMSkgLyBudW1fb2ZfbGFuZXMKKyAgICAqIFRoZSB2Y3RwIGluc24g dXNlcyBhIHJlZyB0aGF0IGRlY3JlbWVudHMgYXBwcm9wcmlhdGVseSBpbiBlYWNoIGl0ZXJhdGlv bi4KKyovCisKK3N0YXRpYyBydHhfaW5zbioKK2FybV9tdmVfZGxzdHBfY2hlY2tfaW5jX2NvdW50 ZXIgKGJhc2ljX2Jsb2NrIGJvZHksIHJ0eF9pbnNuKiB2Y3RwX2luc24sCisJCQkJIHJ0eCBjb25k Y29uc3QsIHJ0eCBjb25kY291bnQpCit7CisgIHJ0eCB2Y3RwX3JlZyA9IFhWRUNFWFAgKFhFWFAg KFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKyAgLyogVGhlIGxvb3AgbGF0Y2ggaGFz IHRvIGJlIGVtcHR5LiAgV2hlbiBjb21waWxpbmcgYWxsIHRoZSBrbm93biBNVkUgTG9McyBpbgor ICAgICB1c2VyIGFwcGxpY2F0aW9ucywgbm9uZSBvZiB0aG9zZSB3aXRoIGluY3JlbWVudGluZyBj b3VudGVycyBoYWQgYW55IHJlYWwKKyAgICAgaW5zbnMgaW4gdGhlIGxvb3AgbGF0Y2guICBBcyBz dWNoLCB0aGlzIGZ1bmN0aW9uIGhhcyBvbmx5IGJlZW4gdGVzdGVkIHdpdGgKKyAgICAgYW4gZW1w dHkgbGF0Y2ggYW5kIG1heSBtaXNiZWhhdmUgb3IgSUNFIGlmIHdlIHNvbWVob3cgZ2V0IGhlcmUg d2l0aCBhbgorICAgICBpbmNyZW1lbnQgaW4gdGhlIGxhdGNoLCBzbywgZm9yIGNvcnJlY3RuZXNz LCBlcnJvciBvdXQgZWFybHkuICAqLworICBpZiAoIWVtcHR5X2Jsb2NrX3AgKGJvZHktPmxvb3Bf ZmF0aGVyLT5sYXRjaCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2xhc3MgcnR4X2l2IHZjdHBf cmVnX2l2OworICAvKiBGb3IgbG9vcHMgb2YgdHlwZSBCKSB0aGUgbG9vcCBjb3VudGVyIGlzIGlu ZGVwZW5kZW50IG9mIHRoZSBkZWNyZW1lbnQKKyAgICAgb2YgdGhlIHJlZyB1c2VkIGluIHRoZSB2 Y3RwX2luc24uIFNvIHJ1biBpdiBhbmFseXNpcyBvbiB0aGF0IHJlZy4gIFRoaXMKKyAgICAgaGFz IHRvIHN1Y2NlZWQgZm9yIHN1Y2ggbG9vcHMgdG8gYmUgc3VwcG9ydGVkLiAgKi8KKyAgaWYgKCFp dl9hbmFseXplICh2Y3RwX2luc24sIGFzX2E8c2NhbGFyX2ludF9tb2RlPiAoR0VUX01PREUgKHZj dHBfcmVnKSksCisgICAgICB2Y3RwX3JlZywgJnZjdHBfcmVnX2l2KSkKKyAgICByZXR1cm4gTlVM TDsKKworICAvKiBFeHRyYWN0IHRoZSBkZWNyZW1lbnRudW0gb2YgdGhlIHZjdHAgcmVnIGZyb20g dGhlIGl2LiAgKi8KKyAgaW50IGRlY3JlbWVudG51bSA9IGFicyAoSU5UVkFMICh2Y3RwX3JlZ19p di5zdGVwKSk7CisKKyAgLyogRmluZCB3aGVyZSBib3RoIG9mIHRob3NlIGFyZSBtb2RpZmllZCBp biB0aGUgbG9vcCBib2R5IGJiLiAgKi8KKyAgZGZfcmVmIGNvbmRjb3VudF9yZWdfc2V0X2RmID0g ZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAoYm9keSwgUkVHTk8gKGNvbmRjb3VudCkpOworICBk Zl9yZWYgdmN0cF9yZWdfc2V0X2RmID0gZGZfYmJfcmVnbm9fb25seV9kZWZfZmluZCAoYm9keSwg UkVHTk8gKHZjdHBfcmVnKSk7CisgIGlmICghY29uZGNvdW50X3JlZ19zZXRfZGYgfHwgIXZjdHBf cmVnX3NldF9kZikKKyAgICByZXR1cm4gTlVMTDsKKyAgcnR4IGNvbmRjb3VudF9yZWdfc2V0ID0g UEFUVEVSTiAoREZfUkVGX0lOU04gKGNvbmRjb3VudF9yZWdfc2V0X2RmKSk7CisgIHJ0eF9pbnNu KiB2Y3RwX3JlZ19zZXQgPSBERl9SRUZfSU5TTiAodmN0cF9yZWdfc2V0X2RmKTsKKyAgLyogRW5z dXJlIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIHZjdHAgcmVnIGZyb20gZGYgaXMgY29uc2lzdGVu dCB3aXRoCisgICAgIHRoZSBpdiBhbmQgdGhlIG51bWJlciBvZiBsYW5lcyBvbiB0aGUgdmN0cCBp bnNuLiAgKi8KKyAgaWYgKCEoR0VUX0NPREUgKFhFWFAgKFBBVFRFUk4gKHZjdHBfcmVnX3NldCks IDEpKSA9PSBQTFVTCisgICAgICAmJiBSRUdOTyAoWEVYUCAoUEFUVEVSTiAodmN0cF9yZWdfc2V0 KSwgMCkpCisJICA9PSBSRUdOTyAoWEVYUCAoWEVYUCAoUEFUVEVSTiAodmN0cF9yZWdfc2V0KSwg MSksIDApKSkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChkZWNyZW1lbnRudW0gIT0gYWJzIChJ TlRWQUwgKFhFWFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfcmVnX3NldCksIDEpLCAxKSkpCisgICAg ICB8fCBkZWNyZW1lbnRudW0gIT0gYXJtX212ZV9nZXRfdmN0cF9sYW5lcyAoUEFUVEVSTiAodmN0 cF9pbnNuKSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKFJFR19QIChjb25kY291bnQpICYm IFJFR19QIChjb25kY29uc3QpKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8gcHJv dmUgdGhhdCB0aGUgbG9vcCBpcyBnb2luZyAwLi5jb25kY29uc3Qgd2l0aCBhbgorCSBpbmMgb2Yg MSBpbiBlYWNoIGl0ZXJhdGlvbi4gICovCisgICAgICBpZiAoR0VUX0NPREUgKFhFWFAgKGNvbmRj b3VudF9yZWdfc2V0LCAxKSkgPT0gUExVUworCSAgJiYgQ09OU1RfSU5UX1AgKFhFWFAgKFhFWFAg KGNvbmRjb3VudF9yZWdfc2V0LCAxKSwgMSkpCisJICAmJiBJTlRWQUwgKFhFWFAgKFhFWFAgKGNv bmRjb3VudF9yZWdfc2V0LCAxKSwgMSkpID09IDEpCisJeworCSAgICBydHggY291bnRlcl9yZWcg PSBYRVhQIChjb25kY291bnRfcmVnX3NldCwgMCk7CisJICAgIC8qIENoZWNrIHRoYXQgdGhlIGNv dW50ZXIgZGlkIGluZGVlZCBzdGFydCBmcm9tIHplcm8uICAqLworCSAgICBkZl9yZWYgdGhpc19z ZXQgPSBERl9SRUdfREVGX0NIQUlOIChSRUdOTyAoY291bnRlcl9yZWcpKTsKKwkgICAgaWYgKCF0 aGlzX3NldCkKKwkgICAgICByZXR1cm4gTlVMTDsKKwkgICAgZGZfcmVmIGxhc3Rfc2V0ID0gREZf UkVGX05FWFRfUkVHICh0aGlzX3NldCk7CisJICAgIGlmICghbGFzdF9zZXQpCisJICAgICAgcmV0 dXJuIE5VTEw7CisJICAgIHJ0eF9pbnNuKiBsYXN0X3NldF9pbnNuID0gREZfUkVGX0lOU04gKGxh c3Rfc2V0KTsKKwkgICAgaWYgKCFzaW5nbGVfc2V0IChsYXN0X3NldF9pbnNuKSkKKwkgICAgICBy ZXR1cm4gTlVMTDsKKwkgICAgcnR4IGNvdW50ZXJfb3JpZ19zZXQ7CisJICAgIGNvdW50ZXJfb3Jp Z19zZXQgPSBYRVhQIChQQVRURVJOIChsYXN0X3NldF9pbnNuKSwgMSk7CisJICAgIGlmICghQ09O U1RfSU5UX1AgKGNvdW50ZXJfb3JpZ19zZXQpCisJCXx8IChJTlRWQUwgKGNvdW50ZXJfb3JpZ19z ZXQpICE9IDApKQorCSAgICAgIHJldHVybiBOVUxMOworCSAgICAvKiBBbmQgZmluYWxseSBjaGVj ayB0aGF0IHRoZSB0YXJnZXQgdmFsdWUgb2YgdGhlIGNvdW50ZXIsCisJICAgICAgIGNvbmRjb25z dCwgaXMgb2YgdGhlIGNvcnJlY3Qgc2hhcGUuICAqLworCSAgICBpZiAoIWFybV9tdmVfY2hlY2tf cmVnX29yaWdpbl9pc19udW1fZWxlbXMgKGJvZHksIGNvbmRjb25zdCwKKwkJCQkJCQl2Y3RwX3Jl Z19pdi5zdGVwKSkKKwkgICAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBlbHNlCisJcmV0dXJu IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRXZlcnl0aGlu ZyBsb29rcyB2YWxpZC4gICovCisgIHJldHVybiB2Y3RwX2luc247Cit9CisKKy8qIEhlbHBlciBm dW5jdGlvbiB0byBgYXJtX212ZV9sb29wX3ZhbGlkX2Zvcl9kbHN0cGAuICBJbiB0aGUgY2FzZSBv ZiBhCisgICBjb3VudGVyIHRoYXQgaXMgZGVjcmVtZW50aW5nLCBlbnN1cmUgdGhhdCBpdCBpcyBk ZWNyZW1lbnRpbmcgYnkgdGhlCisgICByaWdodCBhbW91bnQgaW4gZWFjaCBpdGVyYXRpb24gYW5k IHRoYXQgdGhlIHRhcmdldCBjb25kaXRpb24gaXMgd2hhdAorICAgd2UgZXhwZWN0LiAgKi8KKwor c3RhdGljIHJ0eF9pbnNuKgorYXJtX212ZV9kbHN0cF9jaGVja19kZWNfY291bnRlciAoYmFzaWNf YmxvY2sgYm9keSwgcnR4X2luc24qIHZjdHBfaW5zbiwKKwkJCQkgcnR4IGNvbmRjb25zdCwgcnR4 IGNvbmRjb3VudCkKK3sKKyAgcnR4IHZjdHBfcmVnID0gWFZFQ0VYUCAoWEVYUCAoUEFUVEVSTiAo dmN0cF9pbnNuKSwgMSksIDAsIDApOworICBjbGFzcyBydHhfaXYgdmN0cF9yZWdfaXY7CisgIGlu dCBkZWNyZW1lbnRudW07CisgIC8qIEZvciBkZWNyZW1lbnRpbmcgbG9vcHMgb2YgdHlwZSBBKSwg dGhlIGNvdW50ZXIgaXMgdXN1YWxseSBwcmVzZW50IGluIHRoZQorICAgICBsb29wIGxhdGNoLiAg SGVyZSB3ZSBzaW1wbHkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGNvdW50ZXIgaXMgdGhlIHNh bWUKKyAgICAgcmVnIHRoYXQgaXMgYWxzbyB1c2VkIGluIHRoZSB2Y3RwX2luc24gYW5kIHRoYXQg aXQgaXMgbm90IG90aGVyd2lzZQorICAgICBtb2RpZmllZC4gICovCisgIHJ0eF9pbnNuICpkZWNf aW5zbiA9IEJCX0VORCAoYm9keS0+bG9vcF9mYXRoZXItPmxhdGNoKTsKKyAgLyogSWYgbm90IGlu IHRoZSBsb29wIGxhdGNoLCB0cnkgdG8gZmluZCB0aGUgZGVjcmVtZW50IGluIHRoZSBsb29wIGJv ZHkuICAqLworICBpZiAoIU5PTkRFQlVHX0lOU05fUCAoZGVjX2luc24pKQorICB7CisgICAgZGZf cmVmIHRlbXAgPSBkZl9iYl9yZWdub19vbmx5X2RlZl9maW5kIChib2R5LCBSRUdOTyAoY29uZGNv dW50KSk7CisgICAgLyogSWYgd2UgaGF2ZW4ndCBiZWVuIGFibGUgdG8gZmluZCB0aGUgZGVjcmVt ZW50LCBiYWlsIG91dC4gICovCisgICAgaWYgKCF0ZW1wKQorICAgICAgcmV0dXJuIE5VTEw7Cisg ICAgZGVjX2luc24gPSBERl9SRUZfSU5TTiAodGVtcCk7CisgIH0KKworICAvKiBOZXh0LCBlbnN1 cmUgdGhhdCBpdCBpcyBhIFBMVVMgb2YgdGhlIGZvcm06CisgICAgIChzZXQgKHJlZyBhKSAocGx1 cyAocmVnIGEpIChjb25zdF9pbnQpKSkKKyAgICAgd2hlcmUgKHJlZyBhKSBpcyB0aGUgc2FtZSBh cyBjb25kY291bnQuICAqLworICBpZiAoR0VUX0NPREUgKFhFWFAgKFBBVFRFUk4gKGRlY19pbnNu KSwgMSkpID09IFBMVVMKKyAgICAgICYmIFJFR05PIChYRVhQIChQQVRURVJOIChkZWNfaW5zbiks IDApKQorCSAgPT0gUkVHTk8gKFhFWFAgKFhFWFAgKFBBVFRFUk4gKGRlY19pbnNuKSwgMSksIDAp KQorICAgICAgJiYgUkVHTk8gKFhFWFAgKFBBVFRFUk4gKGRlY19pbnNuKSwgMCkpID09IFJFR05P IChjb25kY291bnQpKQorICAgIGRlY3JlbWVudG51bSA9IGFicyAoSU5UVkFMIChYRVhQIChYRVhQ IChQQVRURVJOIChkZWNfaW5zbiksIDEpLCAxKSkpOworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7 CisKKyAgLyogT2ssIHNvIHdlIG5vdyBrbm93IHRoZSBsb29wIGRlY3JlbWVudC4gIElmIGl0IGlz IGEgMSwgdGhlbiB3ZSBuZWVkIHRvCisgICAgIGxvb2sgYXQgdGhlIGxvb3AgdmN0cF9yZWcgYW5k IHZlcmlmeSB0aGF0IGl0IGFsc28gZGVjcmVtZW50cyBjb3JyZWN0bHkuCisgICAgIFRoZW4sIHdl IG5lZWQgdG8gZXN0YWJsaXNoIHRoYXQgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBsb29wIGRl Y3JlbWVudAorICAgICBvcmlnaW5hdGVzIGZyb20gdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSB2 Y3RwIGRlY3JlbWVudC4gICovCisgIGlmIChkZWNyZW1lbnRudW0gPT0gMSkKKyAgICB7CisgICAg ICBjbGFzcyBydHhfaXYgdmN0cF9yZWdfaXY7CisgICAgICAvKiBUaGUgbG9vcCBjb3VudGVyIGlz IGZvdW5kIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZSBkZWNyZW1lbnQKKwkgb2YgdGhlIHJlZyB1 c2VkIGluIHRoZSB2Y3RwX2luc24sIGFnYWluLiAgRW5zdXJlIHRoYXQgSVYgYW5hbHlzaXMKKwkg c3VjY2VlZHMgYW5kIGNoZWNrIHRoZSBzdGVwLiAgKi8KKyAgICAgIGlmICghaXZfYW5hbHl6ZSAo dmN0cF9pbnNuLCBhc19hPHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RFICh2Y3RwX3JlZykpLAor CQkgICAgICAgdmN0cF9yZWcsICZ2Y3RwX3JlZ19pdikpCisJcmV0dXJuIE5VTEw7CisgICAgICAv KiBFbnN1cmUgaXQgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGxhbmVzIG9mIHRoZSB2Y3RwIGluc3Ry dWN0aW9uLiAgKi8KKyAgICAgIGlmIChhYnMgKElOVFZBTCAodmN0cF9yZWdfaXYuc3RlcCkpCisJ ICAhPSBhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24pKSkKKwlyZXR1 cm4gTlVMTDsKKyAgICAgIGlmICghYXJtX212ZV9jaGVja19yZWdfb3JpZ2luX2lzX251bV9lbGVt cyAoYm9keSwgY29uZGNvdW50LCB2Y3RwX3JlZ19pdi5zdGVwKSkKKwlyZXR1cm4gTlVMTDsKKyAg ICB9CisgIC8qIElmIHRoZSBkZWNyZW1lbnRzIGFyZSB0aGUgc2FtZSwgdGhlbiB0aGUgc2l0dWF0 aW9uIGlzIHNpbXBsZTogZWl0aGVyIHRoZXkKKyAgICAgYXJlIGFsc28gdGhlIHNhbWUgcmVnLCB3 aGljaCBpcyBzYWZlLCBvciB0aGV5IGFyZSBkaWZmZXJlbnQgcmVnaXN0ZXJzLCBpbgorICAgICB3 aGljaCBjYXNlIG1ha3NlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIG9ubHkgc2ltcGxlIFNFVCBmcm9t IG9uZSB0byB0aGUKKyAgICAgb3RoZXIgaW5zaWRlIHRoZSBsb29wLiovCisgIGVsc2UgaWYgKGRl Y3JlbWVudG51bSA9PSBhcm1fbXZlX2dldF92Y3RwX2xhbmVzIChQQVRURVJOICh2Y3RwX2luc24p KSkKKyAgICB7CisgICAgICBpZiAoUkVHTk8gKGNvbmRjb3VudCkgIT0gUkVHTk8gKHZjdHBfcmVn KSkKKwl7CisJICAvKiBJdCB3YXNuJ3QgdGhlIHNhbWUgcmVnLCBidXQgaXQgY291bGQgYmUgYmVo aWxkIGEKKwkgICAgIChzZXQgKHZjdHBfcmVnKSAoY29uZGNvdW50KSksIHNvIGluc3RlYWQgZmlu ZCB3aGVyZQorCSAgICAgdGhlIFZDVFAgaW5zbiBpcyBERUYnZCBpbnNpZGUgdGhlIGxvb3AuICAq LworCSAgcnR4IHZjdHBfcmVnX3NldCA9CisJCVBBVFRFUk4gKERGX1JFRl9JTlNOIChkZl9iYl9y ZWdub19vbmx5X2RlZl9maW5kCisJCQkJCShib2R5LCBSRUdOTyAodmN0cF9yZWcpKSkpOworCSAg LyogVGhpcyBtdXN0IGp1c3QgYmUgYSBzaW1wbGUgU0VUIGZyb20gdGhlIGNvbmRjb3VudC4gICov CisJICBpZiAoR0VUX0NPREUgKHZjdHBfcmVnX3NldCkgIT0gU0VUIHx8ICFSRUdfUCAoWEVYUCAo dmN0cF9yZWdfc2V0LCAxKSkKKwkgICAgICB8fCBSRUdOTyAoWEVYUCAodmN0cF9yZWdfc2V0LCAx KSkgIT0gUkVHTk8gKGNvbmRjb3VudCkpCisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9Cisg IGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBXZSBub3cgb25seSBuZWVkIHRvIGZpbmQg b3V0IHRoYXQgdGhlIGxvb3AgdGVybWluYXRlcyB3aXRoIGEgTEUKKyAgICAgemVybyBjb25kaXRp b24uICBJZiBjb25kY29uc3QgaXMgYSBjb25zdF9pbnQsIHRoZW4gdGhpcyBpcyBlYXN5LgorICAg ICBJZiBpdHMgYSBSRUcsIGxvb2sgYXQgdGhlIGxhc3QgY29uZGl0aW9uK2p1bXAgaW4gYSBiYiBi ZWZvcmUKKyAgICAgdGhlIGxvb3AsIGJlY2F1c2UgdGhhdCB1c3VhbGx5IHdpbGwgaGF2ZSBhIGJy YW5jaCBqdW1waW5nIG92ZXIKKyAgICAgdGhlIGxvb3AgYm9keS4gICovCisgIGlmIChDT05TVF9J TlRfUCAoY29uZGNvbnN0KQorICAgICAgJiYgIShJTlRWQUwgKGNvbmRjb25zdCkgPT0gMCAmJiBK VU1QX1AgKEJCX0VORCAoYm9keSkpCisJICAgJiYgR0VUX0NPREUgKFhFWFAgKFBBVFRFUk4gKEJC X0VORCAoYm9keSkpLCAxKSkgPT0gSUZfVEhFTl9FTFNFCisJICAgJiYgKEdFVF9DT0RFIChYRVhQ IChYRVhQIChQQVRURVJOIChCQl9FTkQgKGJvZHkpKSwgMSksIDApKSA9PSBORQorCSAgICAgICB8 fEdFVF9DT0RFIChYRVhQIChYRVhQIChQQVRURVJOIChCQl9FTkQgKGJvZHkpKSwgMSksIDApKSA9 PSBHVCkpKQorICAgIHJldHVybiBOVUxMOworICBlbHNlIGlmIChSRUdfUCAoY29uZGNvbnN0KSkK KyAgICB7CisgICAgICBiYXNpY19ibG9jayBwcmVfbG9vcF9iYiA9IGJvZHk7CisgICAgICB3aGls ZSAocHJlX2xvb3BfYmItPnByZXZfYmIgJiYgQkJfRU5EIChwcmVfbG9vcF9iYi0+cHJldl9iYikK KwkgICAgICYmICFKVU1QX1AgKEJCX0VORCAocHJlX2xvb3BfYmItPnByZXZfYmIpKSkKKwlwcmVf bG9vcF9iYiA9IHByZV9sb29wX2JiLT5wcmV2X2JiOworICAgICAgaWYgKHByZV9sb29wX2JiICYm IEJCX0VORCAocHJlX2xvb3BfYmIpKQorCXByZV9sb29wX2JiID0gcHJlX2xvb3BfYmItPnByZXZf YmI7CisgICAgICBlbHNlCisJcmV0dXJuIE5VTEw7CisgICAgICBydHggaW5pdGlhbF9jb21wYXJl ID0gTlVMTF9SVFg7CisgICAgICBpZiAoIShwcmV2X25vbm5vdGVfbm9uZGVidWdfaW5zbl9iYiAo QkJfRU5EIChwcmVfbG9vcF9iYikpCisJICAgICYmIElOU05fUCAocHJldl9ub25ub3RlX25vbmRl YnVnX2luc25fYmIgKEJCX0VORCAocHJlX2xvb3BfYmIpKSkpKQorCXJldHVybiBOVUxMOworICAg ICAgZWxzZQorCWluaXRpYWxfY29tcGFyZQorCSAgICA9IFBBVFRFUk4gKHByZXZfbm9ubm90ZV9u b25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKHByZV9sb29wX2JiKSkpOworICAgICAgaWYgKCEoaW5p dGlhbF9jb21wYXJlICYmIEdFVF9DT0RFIChpbml0aWFsX2NvbXBhcmUpID09IFNFVAorCSAgICAm JiBjY19yZWdpc3RlciAoWEVYUCAoaW5pdGlhbF9jb21wYXJlLCAwKSwgVk9JRG1vZGUpCisJICAg ICYmIEdFVF9DT0RFIChYRVhQIChpbml0aWFsX2NvbXBhcmUsIDEpKSA9PSBDT01QQVJFCisJICAg ICYmIENPTlNUX0lOVF9QIChYRVhQIChYRVhQIChpbml0aWFsX2NvbXBhcmUsIDEpLCAxKSkKKwkg ICAgJiYgSU5UVkFMIChYRVhQIChYRVhQIChpbml0aWFsX2NvbXBhcmUsIDEpLCAxKSkgPT0gMCkp CisJcmV0dXJuIE5VTEw7CisKKyAgICAgIC8qIFVzdWFsbHkgdGhpcyBpcyBhIExFIGNvbmRpdGlv biwgYnV0IGl0IGNhbiBhbHNvIGp1c3QgYmUgYSBHVCBvciBhbiBFUQorCSBjb25kaXRpb24gKGlm IHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBvciB0aGUgY29tcGlsZXIga25vd3MgaXRzIG5vdCBuZWdh dGl2ZSkgICovCisgICAgICBydHhfaW5zbiAqbG9vcF9qdW1wb3ZlciA9IEJCX0VORCAocHJlX2xv b3BfYmIpOworICAgICAgaWYgKCEoSlVNUF9QIChsb29wX2p1bXBvdmVyKQorCSAgICAmJiBHRVRf Q09ERSAoWEVYUCAoUEFUVEVSTiAobG9vcF9qdW1wb3ZlciksIDEpKSA9PSBJRl9USEVOX0VMU0UK KwkgICAgJiYgKEdFVF9DT0RFIChYRVhQIChYRVhQIChQQVRURVJOIChsb29wX2p1bXBvdmVyKSwg MSksIDApKSA9PSBMRQorCQl8fCBHRVRfQ09ERSAoWEVYUCAoWEVYUCAoUEFUVEVSTiAobG9vcF9q dW1wb3ZlciksIDEpLCAwKSkgPT0gR1QKKwkJfHwgR0VUX0NPREUgKFhFWFAgKFhFWFAgKFBBVFRF Uk4gKGxvb3BfanVtcG92ZXIpLCAxKSwgMCkpID09IEVRKSkpCisJcmV0dXJuIE5VTEw7CisgICAg fQorCisgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgdmFsaWQuICAqLworICByZXR1cm4gdmN0cF9pbnNu OworfQorCisvKiBGdW5jdGlvbiB0byBjaGVjayBhIGxvb3AncyBzdHJ1Y3R1cmUgdG8gc2VlIGlm IGl0IGlzIGEgdmFsaWQgY2FuZGlkYXRlIGZvcgorICAgYW4gTVZFIFRhaWwgUHJlZGljYXRlZCBM b3ctT3ZlcmhlYWQgTG9vcC4gIFJldHVybnMgdGhlIGxvb3AncyBWQ1RQX0lOU04gaWYKKyAgIGl0 IGlzIHZhbGlkLCBvciBOVUxMIGlmIGl0IGlzbid0LiAgKi8KKworc3RhdGljIHJ0eF9pbnNuKgor YXJtX212ZV9sb29wX3ZhbGlkX2Zvcl9kbHN0cCAoYmFzaWNfYmxvY2sgYm9keSkKK3sKKyAgLyog RG9sb29wIGNhbiBvbmx5IGJlIGRvbmUgImVsZW1lbnR3aXNlIiB3aXRoIHByZWRpY2F0ZWQgZGxz dHAvbGV0cCBpZiBpdAorICAgICBjb250YWlucyBhIFZDVFAgb24gdGhlIG51bWJlciBvZiBlbGVt ZW50cyBwcm9jZXNzZWQgYnkgdGhlIGxvb3AuCisgICAgIEZpbmQgdGhlIFZDVFAgcHJlZGljYXRl IGdlbmVyYXRpb24gaW5zaWRlIHRoZSBsb29wIGJvZHkgQkIuICAqLworICBydHhfaW5zbiAqdmN0 cF9pbnNuID0gYXJtX212ZV9nZXRfbG9vcF92Y3RwIChib2R5KTsKKyAgaWYgKCF2Y3RwX2luc24p CisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogVGhlcmUgYXJlIG9ubHkgdHdvIHR5cGVzIG9mIGxv b3BzIHRoYXQgY2FuIGJlIHR1cm5lZCBpbnRvIGRsc3RwL2xldHAKKyAgICAgbG9vcHM6CisgICAg ICBBKSBMb29wcyBvZiB0aGUgZm9ybToKKwkgIHdoaWxlIChudW1fb2ZfZWxlbSA+IDApCisJICAg IHsKKwkgICAgICBwID0gdmN0cDxzaXplPiAobnVtX29mX2VsZW0pCisJICAgICAgbiAtPSBudW1f b2ZfbGFuZXM7CisJICAgIH0KKyAgICAgIEIpIExvb3BzIG9mIHRoZSBmb3JtOgorCSAgaW50IG51 bV9vZl9pdGVycyA9IChudW1fb2ZfZWxlbSArIG51bV9vZl9sYW5lcyAtIDEpIC8gbnVtX29mX2xh bmVzCisJICBmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2l0ZXJzOyBpKyspCisJICAgIHsKKwkgICAg ICBwID0gdmN0cDxzaXplPiAobnVtX29mX2VsZW0pCisJICAgICAgbiAtPSBudW1fb2ZfbGFuZXM7 CisJICAgIH0KKworICAgIFRoZW4sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBsb29wIGFib3Zl IHdlIG5lZWQgd2lsbCBuZWVkIHRvIGRvCisgICAgZGlmZmVyZW50IHNldHMgb2YgY2hlY2tzLiAg Ki8KKyAgaXZfYW5hbHlzaXNfbG9vcF9pbml0IChib2R5LT5sb29wX2ZhdGhlcik7CisKKyAgLyog SW4gb3JkZXIgdG8gZmluZCBvdXQgaWYgdGhlIGxvb3AgaXMgb2YgdHlwZSBBIG9yIEIgYWJvdmUg bG9vayBmb3IgdGhlCisgICAgIGxvb3AgY291bnRlcjogaXQgd2lsbCBlaXRoZXIgYmUgaW5jcmVt ZW50aW5nIGJ5IG9uZSBwZXIgaXRlcmF0aW9uIG9yCisgICAgIGl0IHdpbGwgYmUgZGVjcmVtZW50 aW5nIGJ5IG51bV9vZl9sYW5lcy4gIFdlIGNhbiBmaW5kIHRoZSBsb29wIGNvdW50ZXIKKyAgICAg aW4gdGhlIGNvbmRpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLiAgKi8KKyAgcnR4X2luc24g Kmxvb3BfY29uZCA9IHByZXZfbm9ubm90ZV9ub25kZWJ1Z19pbnNuX2JiIChCQl9FTkQgKGJvZHkp KTsKKyAgaWYgKCEoY2NfcmVnaXN0ZXIgKFhFWFAgKFBBVFRFUk4gKGxvb3BfY29uZCksIDApLCBW T0lEbW9kZSkKKwkmJiBHRVRfQ09ERSAoWEVYUCAoUEFUVEVSTiAobG9vcF9jb25kKSwgMSkpID09 IENPTVBBUkUpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFRoZSBvcGVyYW5kcyBpbiB0aGUg Y29uZGl0aW9uOiAgVHJ5IHRvIGlkZW50aWZ5IHdoaWNoIG9uZSBpcyB0aGUKKyAgICAgY29uc3Rh bnQgYW5kIHdoaWNoIGlzIHRoZSBjb3VudGVyIGFuZCBydW4gSVYgYW5hbHlzaXMgb24gdGhlIGxh dHRlci4gICovCisgIHJ0eCBjb25kX2FyZ18xID0gWEVYUCAoWEVYUCAoUEFUVEVSTiAobG9vcF9j b25kKSwgMSksIDApOworICBydHggY29uZF9hcmdfMiA9IFhFWFAgKFhFWFAgKFBBVFRFUk4gKGxv b3BfY29uZCksIDEpLCAxKTsKKworICBydHggbG9vcF9jb25kX2NvbnN0YW50OworICBydHggbG9v cF9jb3VudGVyOworICBjbGFzcyBydHhfaXYgY29uZF9jb3VudGVyX2l2LCBjb25kX3RlbXBfaXY7 CisKKyAgaWYgKENPTlNUX0lOVF9QIChjb25kX2FyZ18xKSkKKyAgICB7CisgICAgICAvKiBjb25k X2FyZ18xIGlzIHRoZSBjb25zdGFudCBhbmQgY29uZF9hcmdfMiBpcyB0aGUgY291bnRlci4gICov CisgICAgICBsb29wX2NvbmRfY29uc3RhbnQgPSBjb25kX2FyZ18xOworICAgICAgbG9vcF9jb3Vu dGVyID0gY29uZF9hcmdfMjsKKyAgICAgIGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNfYTxzY2Fs YXJfaW50X21vZGU+IChHRVRfTU9ERSAoY29uZF9hcmdfMikpLAorCQkgIGNvbmRfYXJnXzIsICZj b25kX2NvdW50ZXJfaXYpOworICAgIH0KKyAgZWxzZSBpZiAoQ09OU1RfSU5UX1AgKGNvbmRfYXJn XzIpKQorICAgIHsKKyAgICAgIC8qIGNvbmRfYXJnXzIgaXMgdGhlIGNvbnN0YW50IGFuZCBjb25k X2FyZ18xIGlzIHRoZSBjb3VudGVyLiAgKi8KKyAgICAgIGxvb3BfY29uZF9jb25zdGFudCA9IGNv bmRfYXJnXzI7CisgICAgICBsb29wX2NvdW50ZXIgPSBjb25kX2FyZ18xOworICAgICAgaXZfYW5h bHl6ZSAobG9vcF9jb25kLCBhc19hPHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RFIChjb25kX2Fy Z18xKSksCisJCSAgY29uZF9hcmdfMSwgJmNvbmRfY291bnRlcl9pdik7CisgICAgfQorICBlbHNl IGlmIChSRUdfUCAoY29uZF9hcmdfMSkgJiYgUkVHX1AgKGNvbmRfYXJnXzIpKQorICAgIHsKKyAg ICAgIC8qIElmIGJvdGggb3BlcmFuZHMgdG8gdGhlIGNvbXBhcmUgYXJlIFJFR3MsIHdlIGNhbiBz YWZlbHkKKwkgcnVuIElWIGFuYWx5c2lzIG9uIGJvdGggYW5kIHRoZW4gZGV0ZXJtaW5lIHdoaWNo IGlzIHRoZQorCSBjb25zdGFudCBieSBsb29raW5nIGF0IHRoZSBzdGVwLgorCSBGaXJzdCBhc3N1 bWUgY29uZF9hcmdfMSBpcyB0aGUgY291bnRlci4gICovCisgICAgICBsb29wX2NvdW50ZXIgPSBj b25kX2FyZ18xOworICAgICAgbG9vcF9jb25kX2NvbnN0YW50ID0gY29uZF9hcmdfMjsKKyAgICAg IGl2X2FuYWx5emUgKGxvb3BfY29uZCwgYXNfYTxzY2FsYXJfaW50X21vZGU+IChHRVRfTU9ERSAo Y29uZF9hcmdfMSkpLAorCQkgIGNvbmRfYXJnXzEsICZjb25kX2NvdW50ZXJfaXYpOworICAgICAg aXZfYW5hbHl6ZSAobG9vcF9jb25kLCBhc19hPHNjYWxhcl9pbnRfbW9kZT4gKEdFVF9NT0RFIChj b25kX2FyZ18yKSksCisJCSAgY29uZF9hcmdfMiwgJmNvbmRfdGVtcF9pdik7CisKKyAgICAgIGlm ICghQ09OU1RfSU5UX1AgKGNvbmRfY291bnRlcl9pdi5zdGVwKSB8fCAhQ09OU1RfSU5UX1AgKGNv bmRfdGVtcF9pdi5zdGVwKSkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIC8qIExvb2sgYXQgdGhlIHN0 ZXBzIGFuZCBzd2FwIGFyb3VuZCB0aGUgcnR4J3MgaWYgbmVlZGVkLiAgRXJyb3Igb3V0IGlmCisJ IG9uZSBvZiB0aGVtIGNhbm5vdCBiZSBpZGVudGlmaWVkIGFzIGNvbnN0YW50LiAgKi8KKyAgICAg IGlmIChJTlRWQUwgKGNvbmRfY291bnRlcl9pdi5zdGVwKSAhPSAwICYmIElOVFZBTCAoY29uZF90 ZW1wX2l2LnN0ZXApICE9IDApCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoSU5UVkFMIChjb25k X2NvdW50ZXJfaXYuc3RlcCkgPT0gMCAmJiBJTlRWQUwgKGNvbmRfdGVtcF9pdi5zdGVwKSAhPSAw KQorCXsKKwkgIGxvb3BfY291bnRlciA9IGNvbmRfYXJnXzI7CisJICBsb29wX2NvbmRfY29uc3Rh bnQgPSBjb25kX2FyZ18xOworCSAgY29uZF9jb3VudGVyX2l2ID0gY29uZF90ZW1wX2l2OworCX0K KyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoIVJFR19QIChsb29wX2Nv dW50ZXIpKQorICAgIHJldHVybiBOVUxMOworICBpZiAoIShSRUdfUCAobG9vcF9jb25kX2NvbnN0 YW50KSB8fCBDT05TVF9JTlRfUCAobG9vcF9jb25kX2NvbnN0YW50KSkpCisgICAgcmV0dXJuIE5V TEw7CisKKyAgLyogTm93IHdlIGhhdmUgZXh0cmFjdGVkIHRoZSBJViBzdGVwIG9mIHRoZSBsb29w IGNvdW50ZXIsIGNhbGwgdGhlCisgICAgIGFwcHJvcHJpYXRlIGNoZWNraW5nIGZ1bmN0aW9uLiAg Ki8KKyAgaWYgKElOVFZBTCAoY29uZF9jb3VudGVyX2l2LnN0ZXApID4gMCkKKyAgICByZXR1cm4g YXJtX212ZV9kbHN0cF9jaGVja19pbmNfY291bnRlciAoYm9keSwgdmN0cF9pbnNuLAorCQkJCQkg ICAgbG9vcF9jb25kX2NvbnN0YW50LCBsb29wX2NvdW50ZXIpOworICBlbHNlIGlmIChJTlRWQUwg KGNvbmRfY291bnRlcl9pdi5zdGVwKSA8IDApCisgICAgcmV0dXJuIGFybV9tdmVfZGxzdHBfY2hl Y2tfZGVjX2NvdW50ZXIgKGJvZHksIHZjdHBfaW5zbiwKKwkJCQkJICAgIGxvb3BfY29uZF9jb25z dGFudCwgbG9vcF9jb3VudGVyKTsKKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBQ cmVkaWN0IHdoZXRoZXIgdGhlIGdpdmVuIGxvb3AgaW4gZ2ltcGxlIHdpbGwgYmUgdHJhbnNmb3Jt ZWQgaW4gdGhlIFJUTAorICAgZG9sb29wX29wdGltaXplIHBhc3MuICAqLworCitzdGF0aWMgYm9v bAorYXJtX3ByZWRpY3RfZG9sb29wX3AgKHN0cnVjdCBsb29wICpsb29wKQoreworICBnY2NfYXNz ZXJ0IChsb29wKTsKKyAgLyogT24gYXJtLCB0YXJnZXRtLmNhbl91c2VfZG9sb29wX3AgaXMgYWN0 dWFsbHkKKyAgICAgY2FuX3VzZV9kb2xvb3BfaWZfaW5uZXJtb3N0LiAgRW5zdXJlIHRoZSBsb29w IGlzIGlubmVybW9zdCwKKyAgICAgaXQgaXMgdmFsaWQgYW5kIGFzIHBlciBhcm1fdGFyZ2V0X2Ji X29rX2Zvcl9sb2IgYW5kIHRoZQorICAgICBjb3JyZWN0IGFyY2hpdGVjdHVyZSBmbGFncyBhcmUg ZW5hYmxlZC4gICovCisgIGlmICghKFRBUkdFVF8zMkJJVCAmJiBUQVJHRVRfSEFWRV9MT0IgJiYg b3B0aW1pemUgPiAwKSkKKyAgICB7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQorCWZwcmludGYgKGR1bXBfZmlsZSwgIlByZWRpY3QgZG9sb29wIGZh aWx1cmUgZHVlIHRvIgorCQkJICAgICIgdGFyZ2V0IGFyY2hpdGVjdHVyZSBvciBvcHRpbWlzYXRp b24gZmxhZ3MuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIGVsc2UgaWYgKGxv b3AtPmlubmVyICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKwlmcHJpbnRmIChkdW1wX2ZpbGUsICJQcmVkaWN0IGRvbG9v cCBmYWlsdXJlIGR1ZSB0byIKKwkJCSAgICAiIGxvb3AgbmVzdGluZy5cbiIpOworICAgICAgcmV0 dXJuIGZhbHNlOworICAgIH0KKyAgZWxzZSBpZiAoIWFybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAo bG9vcC0+aGVhZGVyLT5uZXh0X2JiKSkKKyAgICB7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChk dW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCWZwcmludGYgKGR1bXBfZmlsZSwgIlByZWRpY3Qg ZG9sb29wIGZhaWx1cmUgZHVlIHRvIgorCQkJICAgICIgbG9vcCBiYiBjb21wbGV4aXR5LlxuIik7 CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKiBJ bXBsZW1lbnQgdGFyZ2V0bS5sb29wX3Vucm9sbF9hZGp1c3QuICBVc2UgdGhpcyB0byBibG9jayB1 bnJvbGxpbmcgb2YgbG9vcHMKKyAgIHRoYXQgbWF5IGxhdGVyIGJlIHR1cm5lZCBpbnRvIE1WRSBU YWlsIFByZWRpY2F0ZWQgTG93IE92ZXJoZWFkIExvb3BzLiAgVGhlCisgICBwZXJmb3JtYW5jZSBi ZW5lZml0IG9mIGFuIE1WRSBMb0wgaXMgbGlrZWx5IHRvIGJlIG11Y2ggaGlnaGVyIHRoYW4gdGhh dCBvZgorICAgdGhlIHVucm9sbGluZy4gICovCisKK3Vuc2lnbmVkCithcm1fbG9vcF91bnJvbGxf YWRqdXN0ICh1bnNpZ25lZCBudW5yb2xsLCBzdHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgaWYgKFRB UkdFVF9IQVZFX01WRQorICAgICAgJiYgYXJtX3RhcmdldF9iYl9va19mb3JfbG9iIChsb29wLT5s YXRjaCkKKyAgICAgICYmIGFybV9tdmVfbG9vcF92YWxpZF9mb3JfZGxzdHAgKGxvb3AtPmhlYWRl cikpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gbnVucm9sbDsKK30KKworLyog RnVuY3Rpb24gdG8gaGFkbGUgZW1pdHRpbmcgYSBWUFQtdW5wcmVkaWNhdGVkIHZlcnNpb24gb2Yg YSBWUFQtcHJlZGljYXRlZAorICAgaW5zbiB0byBhIHNlcXVlbmNlLiAgKi8KKworc3RhdGljIGJv b2wKK2FybV9lbWl0X212ZV91bnByZWRpY2F0ZWRfaW5zbl90b19zZXEgKHJ0eF9pbnNuKiBpbnNu KQoreworICBydHggaW5zbl92cHJfcmVnX29wZXJhbmQgPSBhcm1fZ2V0X3JlcXVpcmVkX3Zwcl9y ZWdfcGFyYW0gKGluc24pOworICBpbnQgbmV3X2ljb2RlID0gZ2V0X2F0dHJfbXZlX3VucHJlZGlj YXRlZF9pbnNuIChpbnNuKTsKKyAgaWYgKCFpbl9zZXF1ZW5jZV9wICgpCisgICAgICB8fCAhTVZF X1ZQVF9QUkVESUNBVEVEX0lOU05fUCAoaW5zbikKKyAgICAgIHx8ICghaW5zbl92cHJfcmVnX29w ZXJhbmQpCisgICAgICB8fCAoIW5ld19pY29kZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGV4 dHJhY3RfaW5zbiAoaW5zbik7CisgIHJ0eCBhcnJbOF07CisgIGludCBqID0gMDsKKworICAvKiBX aGVuIHRyYW5zZm9ybWluZyBhIFZQVC1wcmVkaWNhdGVkIGluc3RydWN0aW9uCisgICAgIGludG8g aXRzIHVucHJlZGljYXRlZCBlcXVpdmFsZW50IHdlIG5lZWQgdG8gZHJvcAorICAgICB0aGUgVlBS IG9wZXJhbmQgYW5kIHdlIG1heSBuZWVkIHRvIGFsc28gZHJvcCBhCisgICAgIG1lcmdlICJ2dW5p bml0IiBpbnB1dCBvcGVyYW5kLCBkZXBlbmRpbmcgb24gdGhlCisgICAgIGluc3RydWN0aW9uIHBh dHRlcm4uICBIZXJlIGVuc3VyZSB0aGF0IHdlIGhhdmUgYXQKKyAgICAgbW9zdCBhIHR3by1vcGVy YW5kIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvCisgICAgIGluc3RydW5jdGlvbnMuICAqLwor ICBpbnQgbl9vcGVyYW5kc19kaWZmCisgICAgICA9IHJlY29nX2RhdGEubl9vcGVyYW5kcyAtIGlu c25fZGF0YVtuZXdfaWNvZGVdLm5fb3BlcmFuZHM7CisgIGlmICghKG5fb3BlcmFuZHNfZGlmZiA+ IDAgJiYgbl9vcGVyYW5kc19kaWZmIDw9IDIpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBU aGVuLCBsb29wIHRocm91Z2ggdGhlIG9wZXJhbmRzIG9mIHRoZSBwcmVkaWNhdGVkCisgICAgIGlu c3RydWN0aW9uLCBhbmQgcmV0YWluIHRoZSBvbmVzIHRoYXQgbWFwIHRvIHRoZQorICAgICB1bnBy ZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24uICAqLworICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29nX2Rh dGEubl9vcGVyYW5kczsgaSsrKQorICAgIHsKKyAgICAgIC8qIElnbm9yZSB0aGUgVlBSIGFuZCwg aWYgbmVlZGVkLCB0aGUgdnVuaW5pdAorCSBvcGVyYW5kLiAgKi8KKyAgICAgIGlmIChpbnNuX3Zw cl9yZWdfb3BlcmFuZCA9PSByZWNvZ19kYXRhLm9wZXJhbmRbaV0KKwkgIHx8IChuX29wZXJhbmRz X2RpZmYgPT0gMgorCSAgICAgICYmICFzdHJjbXAgKHJlY29nX2RhdGEuY29uc3RyYWludHNbaV0s ICIwIikpKQorCWNvbnRpbnVlOworICAgICAgZWxzZQorCXsKKwkgIGFycltqXSA9IHJlY29nX2Rh dGEub3BlcmFuZFtpXTsKKwkgIGorKzsKKwl9CisgICAgfQorCisgIC8qIEZpbmFsbHksIGVtaXQg dGhlIHVwcmVkaWNhdGVkIGluc3RydWN0aW9uLiAgKi8KKyAgc3dpdGNoIChqKQorICAgIHsKKyAg ICAgIGNhc2UgMToKKwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSkpOwor CWJyZWFrOworICAgICAgY2FzZSAyOgorCWVtaXRfaW5zbiAoR0VOX0ZDTiAobmV3X2ljb2RlKSAo YXJyWzBdLCBhcnJbMV0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMzoKKwllbWl0X2luc24gKEdF Tl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdLCBhcnJbMl0pKTsKKwlicmVhazsKKyAg ICAgIGNhc2UgNDoKKwllbWl0X2luc24gKEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJy WzFdLCBhcnJbMl0sCisJCQkJCWFyclszXSkpOworCWJyZWFrOworICAgICAgY2FzZSA1OgorCWVt aXRfaW5zbiAoR0VOX0ZDTiAobmV3X2ljb2RlKSAoYXJyWzBdLCBhcnJbMV0sIGFyclsyXSwgYXJy WzNdLAorCQkJCQlhcnJbNF0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNjoKKwllbWl0X2luc24g KEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwKKwkJ CQkJYXJyWzRdLCBhcnJbNV0pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNzoKKwllbWl0X2luc24g KEdFTl9GQ04gKG5ld19pY29kZSkgKGFyclswXSwgYXJyWzFdLCBhcnJbMl0sIGFyclszXSwKKwkJ CQkJYXJyWzRdLCBhcnJbNV0sIGFycls2XSkpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwln Y2NfdW5yZWFjaGFibGUgKCk7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyogV2hlbiBh IHZjdHAgaW5zbiBpcyB1c2VkLCBpdHMgb3V0IGlzIG9mdGVuIGZvbGxvd2VkIGJ5CisgICBhIHpl cm8tZXh0ZW5kIGluc24gdG8gU0ltb2RlLCB3aGljaCBpcyB0aGVuIFNVQlJFRydkIGludG8gYQor ICAgdmVjdG9yIGZvcm0gb2YgbW9kZSBWQUxJRF9NVkVfUFJFRF9NT0RFOiB0aGlzIHZlY3RvciBm b3JtIGlzCisgICB3aGF0IGlzIHRoZW4gdXNlZCBhcyBhbiBpbnB1dCB0byB0aGUgaW5zdHJ1Y3Rp b25zIHdpdGhpbiB0aGUKKyAgIGxvb3AuICBIZW5jZSwgc3RvcmUgdGhhdCB2ZWN0b3IgZm9ybSBv ZiB0aGUgVlBSIHJlZyBpbnRvCisgICB2Y3RwX3Zwcl9nZW5lcmF0ZWQsIHNvIHRoYXQgd2UgY2Fu IG1hdGNoIGl0IHdpdGggaW5zdHJ1Y3Rpb25zCisgICBpbiB0aGUgbG9vcCB0byBkZXRlcm1pbmUg aWYgdGhleSBhcmUgcHJlZGljYXRlZCBvbiB0aGlzIHNhbWUKKyAgIFZQUi4gIElmIHRoZXJlIGlz IG5vIHplcm8tZXh0ZW5kIGFuZCBzdWJyZWcgb3IgaXQgaXMgb3RoZXJ3aXNlCisgICBpbnZhbGlk LCB0aGVuIHJldHVybiBOVUxMIHRvIGNhbmNlbCB0aGUgZGxzdHAgdHJhbnNmb3JtLiAgKi8KKwor c3RhdGljIHJ0eAorYXJtX212ZV9nZXRfdmN0cF92ZWNfZm9ybSAocnR4X2luc24gKmluc24pCit7 CisgIHJ0eCB2Y3RwX3Zwcl9nZW5lcmF0ZWQgPSBOVUxMX1JUWDsKKyAgcnR4X2luc24gKm5leHRf dXNlMSA9IE5VTEw7CisgIGRmX3JlZiB1c2U7CisgIGZvciAodXNlCisJPSBERl9SRUdfVVNFX0NI QUlOCisJICAgKERGX1JFRl9SRUdOTyAoREZfSU5TTl9JTkZPX0RFRlMgKERGX0lOU05fSU5GT19H RVQgKGluc24pKSkpOworICAgICAgIHVzZTsgdXNlID0gREZfUkVGX05FWFRfUkVHICh1c2UpKQor ICAgIGlmICghbmV4dF91c2UxICYmIE5PTkRFQlVHX0lOU05fUCAoREZfUkVGX0lOU04gKHVzZSkp KQorICAgICAgbmV4dF91c2UxID0gREZfUkVGX0lOU04gKHVzZSk7CisKKyAgaWYgKHNpbmdsZV9z ZXQgKG5leHRfdXNlMSkKKyAgICAgICYmIEdFVF9DT0RFIChTRVRfU1JDIChzaW5nbGVfc2V0IChu ZXh0X3VzZTEpKSkgPT0gWkVST19FWFRFTkQpCisgICAgeworICAgICAgcnR4X2luc24gKm5leHRf dXNlMiA9IE5VTEw7CisgICAgICBmb3IgKHVzZQorCSAgICA9IERGX1JFR19VU0VfQ0hBSU4KKwkg ICAgICAgKERGX1JFRl9SRUdOTworCQkgKERGX0lOU05fSU5GT19ERUZTIChERl9JTlNOX0lORk9f R0VUIChuZXh0X3VzZTEpKSkpOworCSAgIHVzZTsgdXNlID0gREZfUkVGX05FWFRfUkVHICh1c2Up KQorCWlmICghbmV4dF91c2UyICYmIE5PTkRFQlVHX0lOU05fUCAoREZfUkVGX0lOU04gKHVzZSkp KQorCSAgbmV4dF91c2UyID0gREZfUkVGX0lOU04gKHVzZSk7CisKKyAgICAgIGlmIChzaW5nbGVf c2V0IChuZXh0X3VzZTIpCisJICAmJiBHRVRfQ09ERSAoU0VUX1NSQyAoc2luZ2xlX3NldCAobmV4 dF91c2UyKSkpID09IFNVQlJFRykKKwl2Y3RwX3Zwcl9nZW5lcmF0ZWQgPSBYRVhQIChQQVRURVJO IChuZXh0X3VzZTIpLCAwKTsKKyAgICB9CisKKyAgaWYgKCF2Y3RwX3Zwcl9nZW5lcmF0ZWQgfHwg IVJFR19QICh2Y3RwX3Zwcl9nZW5lcmF0ZWQpCisgICAgICB8fCAhVkFMSURfTVZFX1BSRURfTU9E RSAoR0VUX01PREUgKHZjdHBfdnByX2dlbmVyYXRlZCkpKQorICAgIHJldHVybiBOVUxMX1JUWDsK KworICByZXR1cm4gdmN0cF92cHJfZ2VuZXJhdGVkOworfQorCisvKiBBdHRlbXB0IHRvIHRyYW5z Zm9ybSB0aGUgbG9vcCBjb250ZW50cyBvZiBsb29wIGJhc2ljIGJsb2NrIGZyb20gVlBUCisgICBw cmVkaWNhdGVkIGluc25zIGludG8gdW5wcmVkaWNhdGVkIGluc25zIGZvciBhIGRsc3RwL2xldHAg bG9vcC4gICovCisKK3J0eAorYXJtX2F0dGVtcHRfZGxzdHBfdHJhbnNmb3JtIChydHggbGFiZWwp Cit7CisgIGJhc2ljX2Jsb2NrIGJvZHkgPSBCTE9DS19GT1JfSU5TTiAobGFiZWwpLT5wcmV2X2Ji OworCisgIC8qIEVuc3VyZSB0aGF0IHRoZSBiYiBpcyB3aXRoaW4gYSBsb29wIHRoYXQgaGFzIGFs bCByZXF1aXJlZCBtZXRhZGF0YS4gICovCisgIGlmICghYm9keS0+bG9vcF9mYXRoZXIgfHwgIWJv ZHktPmxvb3BfZmF0aGVyLT5oZWFkZXIKKyAgICAgIHx8ICFib2R5LT5sb29wX2ZhdGhlci0+c2lt cGxlX2xvb3BfZGVzYykKKyAgICByZXR1cm4gR0VOX0lOVCAoMSk7CisKKyAgcnR4X2luc24gKnZj dHBfaW5zbiA9IGFybV9tdmVfbG9vcF92YWxpZF9mb3JfZGxzdHAgKGJvZHkpOworICBpZiAoIXZj dHBfaW5zbikKKyAgICByZXR1cm4gR0VOX0lOVCAoMSk7CisgIHJ0eCB2Y3RwX3JlZyA9IFhWRUNF WFAgKFhFWFAgKFBBVFRFUk4gKHZjdHBfaW5zbiksIDEpLCAwLCAwKTsKKworICBydHggdmN0cF92 cHJfZ2VuZXJhdGVkID0gYXJtX212ZV9nZXRfdmN0cF92ZWNfZm9ybSAodmN0cF9pbnNuKTsKKyAg aWYgKCF2Y3RwX3Zwcl9nZW5lcmF0ZWQpCisgICAgcmV0dXJuIEdFTl9JTlQgKDEpOworCisgIC8q IGRlY3JlbWVudHVudW0gaXMgYWxyZWFkeSBrbm93biB0byBiZSB2YWxpZCBhdCB0aGlzIHBvaW50 LiAgKi8KKyAgaW50IGRlY3JlbWVudG51bSA9IGFybV9tdmVfZ2V0X3ZjdHBfbGFuZXMgKFBBVFRF Uk4gKHZjdHBfaW5zbikpOworCisgIHJ0eF9pbnNuICppbnNuID0gMDsKKyAgcnR4X2luc24gKmN1 cl9pbnNuID0gMDsKKyAgcnR4X2luc24gKnNlcTsKKyAgaGFzaF9tYXAgPHJ0eF9pbnNuICosIGJv b2w+ICpzYWZlX2luc25fbWFwCisgICAgICA9IG5ldyBoYXNoX21hcCA8cnR4X2luc24gKiwgYm9v bD47CisKKyAgLyogU2NhbiB0aHJvdWdoIHRoZSBpbnNucyBpbiB0aGUgbG9vcCBiYiBhbmQgZW1p dCB0aGUgdHJhbnNmb3JtZWQgYmIKKyAgICAgaW5zbnMgdG8gYSBzZXF1ZW5jZS4gICovCisgIHN0 YXJ0X3NlcXVlbmNlICgpOworICBGT1JfQkJfSU5TTlMgKGJvZHksIGluc24pCisgICAgeworICAg ICAgaWYgKEdFVF9DT0RFIChpbnNuKSA9PSBDT0RFX0xBQkVMIHx8IE5PVEVfSU5TTl9CQVNJQ19C TE9DS19QIChpbnNuKSkKKwljb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKE5PVEVfUCAoaW5zbikp CisJZW1pdF9ub3RlICgoZW51bSBpbnNuX25vdGUpTk9URV9LSU5EIChpbnNuKSk7CisgICAgICBl bHNlIGlmIChERUJVR19JTlNOX1AgKGluc24pKQorCWVtaXRfZGVidWdfaW5zbiAoUEFUVEVSTiAo aW5zbikpOworICAgICAgZWxzZSBpZiAoIUlOU05fUCAoaW5zbikpCisJeworCSAgZW5kX3NlcXVl bmNlICgpOworCSAgcmV0dXJuIEdFTl9JTlQgKDEpOworCX0KKyAgICAgIC8qIFdoZW4gd2UgZmlu ZCB0aGUgdmN0cCBpbnN0cnVjdGlvbjogY29udGludWUuICAqLworICAgICAgZWxzZSBpZiAoaW5z biA9PSB2Y3RwX2luc24pCisJY29udGludWU7CisgICAgICAgLyogSWYgdGhlIGluc24gcGF0dGVy biByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBWUFIgdmFsdWUgZnJvbSB0aGUKKwkgIHZjdHAgYXMg YW4gaW5wdXQgcGFyYW1ldGVyIGZvciBwcmVkaWNhdGlvbi4gICovCisgICAgICBlbHNlIGlmIChh cm1fbXZlX3ZlY19pbnNuX2lzX3ByZWRpY2F0ZWRfd2l0aF90aGlzX3ByZWRpY2F0ZQorCQkoaW5z biwgdmN0cF92cHJfZ2VuZXJhdGVkKSkKKwl7CisJICBib29sIHN1Y2Nlc3MgPSBhcm1fZW1pdF9t dmVfdW5wcmVkaWNhdGVkX2luc25fdG9fc2VxIChpbnNuKTsKKwkgIGlmICghc3VjY2VzcykKKwkg ICAgeworCSAgICAgIGVuZF9zZXF1ZW5jZSAoKTsKKwkgICAgICByZXR1cm4gR0VOX0lOVCAoMSk7 CisJICAgIH0KKwl9CisgICAgICAvKiBJZiB0aGUgaW5zbiBpc24ndCBWUFQgcHJlZGljYXRlZCBv biB2Y3RwX3Zwcl9nZW5lcmF0ZWQsIHdlIG5lZWQgdG8KKwkgbWFrZSBzdXJlIHRoYXQgaXQgaXMg c3RpbGwgdmFsaWQgd2l0aGluIHRoZSBkbHN0cC9sZXRwIGxvb3AuICAqLworICAgICAgZWxzZQor CXsKKwkgIC8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gVVNFLXMgdGhlIHZjdHBfdnByX2dlbmVyYXRl ZCBvdGhlciB0aGFuIGZvcgorCSAgICAgcHJlZGljYXRpb24sIHRoaXMgYmxvY2tzIHRoZSB0cmFu c2Zvcm1hdGlvbiBhcyB3ZSBhcmUgbm90IGFsbG93ZWQKKwkgICAgIHRvIG9wdGltaXNlIHRoZSBW UFIgdmFsdWUgYXdheS4gICovCisJICBkZl9yZWYgaW5zbl91c2VzID0gTlVMTDsKKwkgIEZPUl9F QUNIX0lOU05fVVNFIChpbnNuX3VzZXMsIGluc24pCisJICB7CisJICAgIGlmIChydHhfZXF1YWxf cCAodmN0cF92cHJfZ2VuZXJhdGVkLCBERl9SRUZfUkVHIChpbnNuX3VzZXMpKSkKKwkgICAgICB7 CisJCWVuZF9zZXF1ZW5jZSAoKTsKKwkJcmV0dXJuIEdFTl9JTlQgKDEpOworCSAgICAgIH0KKwkg IH0KKwkgIC8qIElmIHdpdGhpbiB0aGUgbG9vcCB3ZSBoYXZlIGFuIE1WRSB2ZWN0b3IgaW5zdHJ1 Y3Rpb24gdGhhdCBpcworCSAgICAgdW5wcmVkaWNhdGVkLCB0aGUgZGxzdHAvbGV0cCBsb29waW5n IHdpbGwgYWRkIGltcGxpY2l0CisJICAgICBwcmVkaWNhdGlvbiB0byBpdC4gIFRoaXMgd2lsbCBy ZXN1bHQgaW4gYSBjaGFuZ2UgaW4gYmVoYXZpb3VyCisJICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24s IHNvIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYgYW55IGluc3RydWN0aW9ucworCSAgICAgdGhhdCBm ZWVkIGludG8gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd2VyZSBpbXBsaWNpdGx5CisJICAgICBw cmVkaWNhdGVkLiAgKi8KKwkgIGlmIChhcm1fbXZlX2NoZWNrX2RmX2NoYWluX2JhY2tfZm9yX2lt cGxpY19wcmVkaWMKKwkgICAgICAgKHNhZmVfaW5zbl9tYXAsIGluc24sIHZjdHBfdnByX2dlbmVy YXRlZCkpCisJICAgIHsKKwkgICAgICBpZiAoYXJtX212ZV9jaGVja19kZl9jaGFpbl9md2RfZm9y X2ltcGxpY19wcmVkaWNfaW1wYWN0CisJCSAgICAoaW5zbiwgdmN0cF92cHJfZ2VuZXJhdGVkKSkK KwkJeworCQkgIGVuZF9zZXF1ZW5jZSAoKTsKKwkJICByZXR1cm4gR0VOX0lOVCAoMSk7CisJCX0K KwkgICAgfQorCSAgZW1pdF9pbnNuIChQQVRURVJOIChpbnNuKSk7CisJfQorICAgIH0KKyAgc2Vx ID0gZ2V0X2luc25zICgpOworICBlbmRfc2VxdWVuY2UgKCk7CisKKyAgLyogUmUtd3JpdGUgdGhl IGVudGlyZSBCQiBjb250ZW50cyB3aXRoIHRoZSB0cmFuc2Zvcm1lZAorICAgICBzZXF1ZW5jZS4g ICovCisgIEZPUl9CQl9JTlNOU19TQUZFIChib2R5LCBpbnNuLCBjdXJfaW5zbikKKyAgICBpZiAo IShHRVRfQ09ERSAoaW5zbikgPT0gQ09ERV9MQUJFTCB8fCBOT1RFX0lOU05fQkFTSUNfQkxPQ0tf UCAoaW5zbikpKQorICAgICAgZGVsZXRlX2luc24gKGluc24pOworICBmb3IgKGluc24gPSBzZXE7 IE5FWFRfSU5TTiAoaW5zbik7IGluc24gPSBORVhUX0lOU04gKGluc24pKQorICAgIGlmIChOT1RF X1AgKGluc24pKQorICAgICAgZW1pdF9ub3RlX2FmdGVyICgoZW51bSBpbnNuX25vdGUpTk9URV9L SU5EIChpbnNuKSwgQkJfRU5EIChib2R5KSk7CisgICAgZWxzZSBpZiAoREVCVUdfSU5TTl9QIChp bnNuKSkKKyAgICAgIGVtaXRfZGVidWdfaW5zbl9hZnRlciAoUEFUVEVSTiAoaW5zbiksIEJCX0VO RCAoYm9keSkpOworICAgIGVsc2UKKyAgICAgIGVtaXRfaW5zbl9hZnRlciAoUEFUVEVSTiAoaW5z biksIEJCX0VORCAoYm9keSkpOworCisgIGVtaXRfanVtcF9pbnNuX2FmdGVyIChQQVRURVJOIChp bnNuKSwgQkJfRU5EIChib2R5KSk7CisgIC8qIFRoZSB0cmFuc2Zvcm1hdGlvbiBoYXMgc3VjY2Vl ZGVkLCBzbyBub3cgbW9kaWZ5IHRoZSAiY291bnQiCisgICAgIChhLmsuYS4gbml0ZXJfZXhwcikg Zm9yIHRoZSBtaWRkbGUtZW5kLiAgQWxzbyBzZXQgbm9sb29wX2Fzc3VtcHRpb25zCisgICAgIHRv IE5VTEwgdG8gc3RvcCB0aGUgbWlkZGxlLWVuZCBmcm9tIG1ha2luZyBhc3N1bXB0aW9ucyBhYm91 dCB0aGUKKyAgICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICAqLworICBzaW1wbGVfbG9vcF9kZXNj IChib2R5LT5sb29wX2ZhdGhlciktPm5pdGVyX2V4cHIgPSB2Y3RwX3JlZzsKKyAgc2ltcGxlX2xv b3BfZGVzYyAoYm9keS0+bG9vcF9mYXRoZXIpLT5ub2xvb3BfYXNzdW1wdGlvbnMgPSBOVUxMX1JU WDsKKyAgcmV0dXJuIEdFTl9JTlQgKGRlY3JlbWVudG51bSk7CiB9CiAKICNpZiBDSEVDS0lOR19Q CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9hcm0ubWQgYi9nY2MvY29uZmlnL2FybS9hcm0u bWQKaW5kZXggOGVmZGViZWNjM2MuLmRhNzQ1Mjg4ZjI2IDEwMDY0NAotLS0gYS9nY2MvY29uZmln L2FybS9hcm0ubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtLm1kCkBAIC0xMjQsNiArMTI0LDEx IEBACiA7IGFuZCBub3QgYWxsIEFSTSBpbnNucyBkby4KIChkZWZpbmVfYXR0ciAicHJlZGljYXRl ZCIgInllcyxubyIgKGNvbnN0X3N0cmluZyAibm8iKSkKIAorCis7IEFuIGF0dHJpYnV0ZSB0aGF0 IGVuY29kZXMgdGhlIENPREVfRk9SXzxpbnNuPiBvZiB0aGUgTVZFIFZQVCB1bnByZWRpY2F0ZWQK KzsgdmVyc2lvbiBvZiBhIFZQVC1wcmVkaWNhdGVkIGluc3RydWN0aW9uLiAgRm9yIHVucHJlZGlj YXRlZCBpbnN0cnVjdGlvbnMKKzsgdGhhdCBhcmUgcHJlZGljYWJsZSwgZW5jb2RlIHRoZSBzYW1l IHBhdHRlcm4ncyBDT0RFX0ZPUl88aW5zbj4gYXMgYSB3YXkgdG8KKzsgZW5jb2RlIHRoYXQgaXQg aXMgYSBwcmVkaWNhYmxlIGluc3RydWN0aW9uLgogKGRlZmluZV9hdHRyICJtdmVfdW5wcmVkaWNh dGVkX2luc24iICIiIChjb25zdF9pbnQgMCkpCiAKIDsgTEVOR1RIIG9mIGFuIGluc3RydWN0aW9u IChpbiBieXRlcykKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZCBiL2dj Yy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZAppbmRleCA1ZWEyZDllODY2OC4uOTM5ODcwMmNkZGQg MTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2l0ZXJhdG9ycy5tZAorKysgYi9nY2MvY29uZmln L2FybS9pdGVyYXRvcnMubWQKQEAgLTI2NzMsNiArMjY3MywxNyBAQAogKGRlZmluZV9pbnRfYXR0 ciBtcnJjIFsoVlVOU1BFQ19NUlJDICJtcnJjIikgKFZVTlNQRUNfTVJSQzIgIm1ycmMyIildKQog KGRlZmluZV9pbnRfYXR0ciBNUlJDIFsoVlVOU1BFQ19NUlJDICJNUlJDIikgKFZVTlNQRUNfTVJS QzIgIk1SUkMyIildKQogCisoZGVmaW5lX2ludF9hdHRyIGRsc3RwX2VsZW1zaXplIFsoRExTVFA4 ICI4IikgKERMU1RQMTYgIjE2IikgKERMU1RQMzIgIjMyIikKKwkJCQkgKERMU1RQNjQgIjY0Iild KQorCisoZGVmaW5lX2ludF9hdHRyIGxldHBfbnVtX2xhbmVzIFsoTEVUUDggIjE2IikgKExFVFAx NiAiOCIpIChMRVRQMzIgIjQiKQorCQkJCSAoTEVUUDY0ICIyIildKQorKGRlZmluZV9pbnRfYXR0 ciBsZXRwX251bV9sYW5lc19uZWcgWyhMRVRQOCAiLTE2IikgKExFVFAxNiAiLTgiKSAoTEVUUDMy ICItNCIpCisJCQkJICAgICAoTEVUUDY0ICItMiIpXSkKKworKGRlZmluZV9pbnRfYXR0ciBsZXRw X251bV9sYW5lc19taW51c18xIFsoTEVUUDggIjE1IikgKExFVFAxNiAiNyIpIChMRVRQMzIgIjMi KQorCQkJCQkgKExFVFA2NCAiMSIpXSkKKwogKGRlZmluZV9pbnRfYXR0ciBvcHN1ZmZpeCBbKFVO U1BFQ19ET1RfUyAiczgiKQogCQkJICAgKFVOU1BFQ19ET1RfVSAidTgiKQogCQkJICAgKFVOU1BF Q19ET1RfVVMgInM4IikKQEAgLTI5MTYsNiArMjkyNywxMCBAQAogKGRlZmluZV9pbnRfaXRlcmF0 b3IgVlNITENRX00gW1ZTSExDUV9NX1MgVlNITENRX01fVV0pCiAoZGVmaW5lX2ludF9pdGVyYXRv ciBWUVNITFVRX01fTiBbVlFTSExVUV9NX05fU10pCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWUVNI TFVRX04gW1ZRU0hMVVFfTl9TXSkKKyhkZWZpbmVfaW50X2l0ZXJhdG9yIERMU1RQIFtETFNUUDgg RExTVFAxNiBETFNUUDMyCisJCQkJICAgRExTVFA2NF0pCisoZGVmaW5lX2ludF9pdGVyYXRvciBM RVRQIFtMRVRQOCBMRVRQMTYgTEVUUDMyCisJCQkgICBMRVRQNjRdKQogCiA7OyBEZWZpbmUgaXRl cmF0b3JzIGZvciBWQ01MQSBvcGVyYXRpb25zCiAoZGVmaW5lX2ludF9pdGVyYXRvciBWQ01MQV9P UCBbVU5TUEVDX1ZDTUxBCmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9tdmUubWQgYi9nY2Mv Y29uZmlnL2FybS9tdmUubWQKaW5kZXggNDRhMDRiODZjYjUuLmMwODNmOTY1ZmE5IDEwMDY0NAot LS0gYS9nY2MvY29uZmlnL2FybS9tdmUubWQKKysrIGIvZ2NjL2NvbmZpZy9hcm0vbXZlLm1kCkBA IC02OTIyLDIzICs2OTIyLDI0IEBACiA7OyBPcmlnaW5hbGx5IGV4cGFuZGVkIGJ5ICdwcmVkaWNh dGVkX2RvbG9vcF9lbmQnLgogOzsgSW4gdGhlIHJhcmUgc2l0dWF0aW9uIHdoZXJlIHRoZSBicmFu Y2ggaXMgdG9vIGZhciwgd2UgZG8gYWxzbyBuZWVkIHRvCiA7OyByZXZlcnQgRlBTQ1IuTFRQU0la RSBiYWNrIHRvIDB4MTAwIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4KLShkZWZpbmVfaW5zbiAi KnByZWRpY2F0ZWRfZG9sb29wX2VuZF9pbnRlcm5hbCIKKyhkZWZpbmVfaW5zbiAicHJlZGljYXRl ZF9kb2xvb3BfZW5kX2ludGVybmFsPGxldHBfbnVtX2xhbmVzPiIKICAgWyhzZXQgKHBjKQogCShp Zl90aGVuX2Vsc2UKLQkgICAoZ2UgKHBsdXM6U0kgKHJlZzpTSSBMUl9SRUdOVU0pCi0JCQkobWF0 Y2hfb3BlcmFuZDpTSSAwICJjb25zdF9pbnRfb3BlcmFuZCIgIiIpKQotCQkoY29uc3RfaW50IDAp KQotCSAobGFiZWxfcmVmIChtYXRjaF9vcGVyYW5kIDEgIiIgIiIpKQorCSAgIChndHUgKHVuc3Bl YzpTSSBbKHBsdXM6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMCAic19yZWdpc3Rlcl9vcGVyYW5kIiAi PXIiKQorCQkJCSAgICAgKGNvbnN0X2ludCA8bGV0cF9udW1fbGFuZXNfbmVnPikpXQorCQlMRVRQ KQorCQkoY29uc3RfaW50IDxsZXRwX251bV9sYW5lc19taW51c18xPikpCisJIChtYXRjaF9vcGVy YW5kIDEgIiIgIiIpCiAJIChwYykpKQotICAgKHNldCAocmVnOlNJIExSX1JFR05VTSkKLQkocGx1 czpTSSAocmVnOlNJIExSX1JFR05VTSkgKG1hdGNoX2R1cCAwKSkpCisgICAoc2V0IChtYXRjaF9k dXAgMCkKKwkocGx1czpTSSAobWF0Y2hfZHVwIDApIChjb25zdF9pbnQgPGxldHBfbnVtX2xhbmVz X25lZz4pKSkKICAgIChjbG9iYmVyIChyZWc6Q0MgQ0NfUkVHTlVNKSldCi0gICJUQVJHRVRfMzJC SVQgJiYgVEFSR0VUX0hBVkVfTE9CICYmIFRBUkdFVF9IQVZFX01WRSAmJiBUQVJHRVRfVEhVTUIy IgorICAiVEFSR0VUX0hBVkVfTVZFIgogICB7CiAgICAgaWYgKGdldF9hdHRyX2xlbmd0aCAoaW5z bikgPT0gNCkKICAgICAgIHJldHVybiAibGV0cFx0JXxsciwgJWwxIjsKICAgICBlbHNlCi0gICAg ICByZXR1cm4gInN1YnNcdCV8bHIsICMlbjBcblx0Ymd0XHQlbDFcblx0bGN0cCI7CisgICAgICBy ZXR1cm4gInN1YnNcdCV8bHIsICM8bGV0cF9udW1fbGFuZXM+XG5cdGJoaVx0JWwxXG5cdGxjdHAi OwogICB9CiAgIFsoc2V0IChhdHRyICJsZW5ndGgiKQogCShpZl90aGVuX2Vsc2UKQEAgLTY5NDcs MTEgKzY5NDgsMTEgQEAKIAkgICAgKGNvbnN0X2ludCA2KSkpCiAgICAoc2V0X2F0dHIgInR5cGUi ICJicmFuY2giKV0pCiAKLShkZWZpbmVfaW5zbiAiZGxzdHA8bW9kZTE+X2luc24iCisoZGVmaW5l X2luc24gImRsc3RwPGRsc3RwX2VsZW1zaXplPl9pbnNuIgogICBbCiAgICAgKHNldCAocmVnOlNJ IExSX1JFR05VTSkKIAkgKHVuc3BlYzpTSSBbKG1hdGNoX29wZXJhbmQ6U0kgMCAic19yZWdpc3Rl cl9vcGVyYW5kIiAiciIpXQogCSAgRExTVFApKQogICBdCi0gICJUQVJHRVRfMzJCSVQgJiYgVEFS R0VUX0hBVkVfTE9CICYmIFRBUkdFVF9IQVZFX01WRSAmJiBUQVJHRVRfVEhVTUIyIgotICAiZGxz dHAuPG1vZGUxPlx0JXxsciwgJTAiKQorICAiVEFSR0VUX0hBVkVfTVZFIgorICAiZGxzdHAuPGRs c3RwX2VsZW1zaXplPlx0JXxsciwgJTAiKQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vdGh1 bWIyLm1kIGIvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCmluZGV4IGUxZTAxM2JlZmE3Li41NGRk NGVlNTY0YiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vdGh1bWIyLm1kCisrKyBiL2djYy9j b25maWcvYXJtL3RodW1iMi5tZApAQCAtMTYxMyw3ICsxNjEzLDcgQEAKICAgICh1c2UgKG1hdGNo X29wZXJhbmQgMSAiIiAiIikpXSAgICAgOyBsYWJlbAogICAiVEFSR0VUXzMyQklUIgogICAiCi0g eworewogICAgLyogQ3VycmVudGx5IFNNUyByZWxpZXMgb24gdGhlIGRvLWxvb3AgcGF0dGVybiB0 byByZWNvZ25pemUgbG9vcHMKICAgICAgIHdoZXJlICgxKSB0aGUgY29udHJvbCBwYXJ0IGNvbnNp c3RzIG9mIGFsbCBpbnNucyBkZWZpbmluZyBhbmQvb3IKICAgICAgIHVzaW5nIGEgY2VydGFpbiAn Y291bnQnIHJlZ2lzdGVyIGFuZCAoMikgdGhlIGxvb3AgY291bnQgY2FuIGJlCkBAIC0xNjIzLDQx ICsxNjIzLDc3IEBACiAKICAgICAgIEFsc28gdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxvdyBvdmVy IGhlYWQgbG9vcHMgZmVhdHVyZSwgd2hpY2ggaXMgcGFydCBvZgogICAgICAgdGhlIEFybXY4LjEt TSBNYWlubGluZSBMb3cgT3ZlcmhlYWQgQnJhbmNoIChMT0IpIGV4dGVuc2lvbi4gICovCi0gICBp ZiAob3B0aW1pemUgPiAwICYmIChmbGFnX21vZHVsb19zY2hlZCB8fCBUQVJHRVRfSEFWRV9MT0Ip KQotICAgewotICAgICBydHggczA7Ci0gICAgIHJ0eCBiY29tcDsKLSAgICAgcnR4IGxvY19yZWY7 Ci0gICAgIHJ0eCBjY19yZWc7Ci0gICAgIHJ0eCBpbnNuOwotICAgICBydHggY21wOwotCi0gICAg IGlmIChHRVRfTU9ERSAob3BlcmFuZHNbMF0pICE9IFNJbW9kZSkKLSAgICAgICBGQUlMOwotCi0g ICAgIHMwID0gb3BlcmFuZHMgWzBdOwotCi0gICAgIC8qIExvdyBvdmVyIGhlYWQgbG9vcCBpbnN0 cnVjdGlvbnMgcmVxdWlyZSB0aGUgZmlyc3Qgb3BlcmFuZCB0byBiZSBMUi4gICovCi0gICAgIGlm IChUQVJHRVRfSEFWRV9MT0IgJiYgYXJtX3RhcmdldF9pbnNuX29rX2Zvcl9sb2IgKG9wZXJhbmRz IFsxXSkpCi0gICAgICAgczAgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBMUl9SRUdOVU0pOwotCi0g ICAgIGlmIChUQVJHRVRfVEhVTUIyKQotICAgICAgIGluc24gPSBlbWl0X2luc24gKGdlbl90aHVt YjJfYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQgKC0xKSkpOwotICAgICBlbHNlCi0g ICAgICAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX2FkZHNpM19jb21wYXJlMCAoczAsIHMwLCBHRU5f SU5UICgtMSkpKTsKLQotICAgICBjbXAgPSBYVkVDRVhQIChQQVRURVJOIChpbnNuKSwgMCwgMCk7 Ci0gICAgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXApOwotICAgICBiY29tcCA9IGdlbl9ydHhfTkUg KFZPSURtb2RlLCBjY19yZWcsIGNvbnN0MF9ydHgpOwotICAgICBsb2NfcmVmID0gZ2VuX3J0eF9M QUJFTF9SRUYgKFZPSURtb2RlLCBvcGVyYW5kcyBbMV0pOwotICAgICBlbWl0X2p1bXBfaW5zbiAo Z2VuX3J0eF9TRVQgKHBjX3J0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBn ZW5fcnR4X0lGX1RIRU5fRUxTRSAoVk9JRG1vZGUsIGJjb21wLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcmVmLCBwY19ydHgpKSk7 Ci0gICAgIERPTkU7Ci0gICB9Ci0gZWxzZQotICAgRkFJTDsKLSB9IikKKyAgaWYgKG9wdGltaXpl ID4gMCAmJiAoZmxhZ19tb2R1bG9fc2NoZWQgfHwgVEFSR0VUX0hBVkVfTE9CKSkKKyAgICB7Cisg ICAgICBydHggczA7CisgICAgICBydHggYmNvbXA7CisgICAgICBydHggbG9jX3JlZjsKKyAgICAg IHJ0eCBjY19yZWc7CisgICAgICBydHggaW5zbjsKKyAgICAgIHJ0eCBjbXA7CisgICAgICBydHgg ZGVjcmVtZW50X251bTsKKworICAgICAgaWYgKEdFVF9NT0RFIChvcGVyYW5kc1swXSkgIT0gU0lt b2RlKQorCUZBSUw7CisKKyAgICAgIHMwID0gb3BlcmFuZHNbMF07CisKKyAgICAgICBpZiAoVEFS R0VUX0hBVkVfTE9CICYmIGFybV90YXJnZXRfYmJfb2tfZm9yX2xvYiAoQkxPQ0tfRk9SX0lOU04g KG9wZXJhbmRzWzFdKSkpCisJeworCSAgczAgPSBnZW5fcnR4X1JFRyAoU0ltb2RlLCBMUl9SRUdO VU0pOworCisJICAvKiBJZiB3ZSBoYXZlIGEgY29tcGF0aWJlIE1WRSB0YXJnZXQsIHRyeSBhbmQg YW5hbHlzZSB0aGUgbG9vcAorCSAgICAgY29udGVudHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiB1 c2UgcHJlZGljYXRlZCBkbHN0cC9sZXRwCisJICAgICBsb29waW5nLiAgKi8KKwkgIGlmIChUQVJH RVRfSEFWRV9NVkUKKwkgICAgICAmJiAoZGVjcmVtZW50X251bSA9IGFybV9hdHRlbXB0X2Rsc3Rw X3RyYW5zZm9ybSAob3BlcmFuZHNbMV0pKQorCSAgICAgICYmIChJTlRWQUwgKGRlY3JlbWVudF9u dW0pICE9IDEpKQorCSAgICB7CisJICAgICAgbG9jX3JlZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChW T0lEbW9kZSwgb3BlcmFuZHNbMV0pOworCSAgICAgIHN3aXRjaCAoSU5UVkFMIChkZWNyZW1lbnRf bnVtKSkKKwkJeworCQkgIGNhc2UgMjoKKwkJICAgIGluc24gPSBlbWl0X2p1bXBfaW5zbiAoZ2Vu X3ByZWRpY2F0ZWRfZG9sb29wX2VuZF9pbnRlcm5hbDIKKwkJCQkJICAgIChzMCwgbG9jX3JlZikp OworCQkgICAgYnJlYWs7CisJCSAgY2FzZSA0OgorCQkgICAgaW5zbiA9IGVtaXRfanVtcF9pbnNu IChnZW5fcHJlZGljYXRlZF9kb2xvb3BfZW5kX2ludGVybmFsNAorCQkJCQkgICAgKHMwLCBsb2Nf cmVmKSk7CisJCSAgICBicmVhazsKKwkJICBjYXNlIDg6CisJCSAgICBpbnNuID0gZW1pdF9qdW1w X2luc24gKGdlbl9wcmVkaWNhdGVkX2RvbG9vcF9lbmRfaW50ZXJuYWw4CisJCQkJCSAgICAoczAs IGxvY19yZWYpKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgMTY6CisJCSAgICBpbnNuID0gZW1p dF9qdW1wX2luc24gKGdlbl9wcmVkaWNhdGVkX2RvbG9vcF9lbmRfaW50ZXJuYWwxNgorCQkJCQkg ICAgKHMwLCBsb2NfcmVmKSk7CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgZ2Nj X3VucmVhY2hhYmxlICgpOworCQl9CisJICAgICAgRE9ORTsKKwkgICAgfQorCX0KKworCS8qIE90 aGVyd2lzZSwgdHJ5IHN0YW5kYXJkIGRlY3JlbWVudC1ieS1vbmUgZGxzL2xlIGxvb3BpbmcuICAq LworCWlmIChUQVJHRVRfVEhVTUIyKQorCSAgaW5zbiA9IGVtaXRfaW5zbiAoZ2VuX3RodW1iMl9h ZGRzaTNfY29tcGFyZTAgKHMwLCBzMCwKKwkJCQkJCQlHRU5fSU5UICgtMSkpKTsKKwllbHNlCisJ ICBpbnNuID0gZW1pdF9pbnNuIChnZW5fYWRkc2kzX2NvbXBhcmUwIChzMCwgczAsIEdFTl9JTlQg KC0xKSkpOworCisJY21wID0gWFZFQ0VYUCAoUEFUVEVSTiAoaW5zbiksIDAsIDApOworCWNjX3Jl ZyA9IFNFVF9ERVNUIChjbXApOworCWJjb21wID0gZ2VuX3J0eF9ORSAoVk9JRG1vZGUsIGNjX3Jl ZywgY29uc3QwX3J0eCk7CisJbG9jX3JlZiA9IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwg b3BlcmFuZHNbMV0pOworCWVtaXRfanVtcF9pbnNuIChnZW5fcnR4X1NFVCAocGNfcnR4LAorCQkJ CSAgICAgZ2VuX3J0eF9JRl9USEVOX0VMU0UgKFZPSURtb2RlLCBiY29tcCwKKwkJCQkJCQkgICBs b2NfcmVmLCBwY19ydHgpKSk7CisJRE9ORTsKKyAgICB9CisgIGVsc2UKKyAgICBGQUlMOworfSIp CiAKIChkZWZpbmVfaW5zbiAiKmNsZWFyX2Fwc3IiCiAgIFsodW5zcGVjX3ZvbGF0aWxlOlNJIFso Y29uc3RfaW50IDApXSBWVU5TUEVDX0NMUk1fQVBTUikKQEAgLTE3NTUsNyArMTc5MSwzNyBAQAog ICB7CiAgICAgaWYgKFJFR05PIChvcGVyYW5kc1swXSkgPT0gTFJfUkVHTlVNKQogICAgICAgewot CWVtaXRfaW5zbiAoZ2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOworCS8qIFBpY2sgb3V0IHRo ZSBudW1iZXIgYnkgd2hpY2ggd2UgYXJlIGRlY3JlbWVudGluZyB0aGUgbG9vcCBjb3VudGVyCisJ ICAgaW4gZXZlcnkgaXRlcmF0aW9uLiAgSWYgaXQncyA+IDEsIHRoZW4gdXNlIGRsc3RwLiAgKi8K KwlpbnQgY29uc3RfaW50X2RlY19udW0KKwkgICAgID0gYWJzIChJTlRWQUwgKFhFWFAgKFhFWFAg KFhWRUNFWFAgKFBBVFRFUk4gKG9wZXJhbmRzWzFdKSwgMCwgMSksCisJCQkJICAxKSwKKwkJCSAg ICAxKSkpOworCXN3aXRjaCAoY29uc3RfaW50X2RlY19udW0pCisJICB7CisJICAgIGNhc2UgMTY6 CisJICAgICAgZW1pdF9pbnNuIChnZW5fZGxzdHA4X2luc24gKG9wZXJhbmRzWzBdKSk7CisJICAg ICAgYnJlYWs7CisKKwkgICAgY2FzZSA4OgorCSAgICAgIGVtaXRfaW5zbiAoZ2VuX2Rsc3RwMTZf aW5zbiAob3BlcmFuZHNbMF0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIDQ6CisJICAg ICAgZW1pdF9pbnNuIChnZW5fZGxzdHAzMl9pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJy ZWFrOworCisJICAgIGNhc2UgMjoKKwkgICAgICBlbWl0X2luc24gKGdlbl9kbHN0cDY0X2luc24g KG9wZXJhbmRzWzBdKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAxOgorCSAgICAgIGVt aXRfaW5zbiAoZ2VuX2Rsc19pbnNuIChvcGVyYW5kc1swXSkpOworCSAgICAgIGJyZWFrOworCisJ ICAgIGRlZmF1bHQ6CisJICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOworCSAgfQogCURPTkU7CiAg ICAgICB9CiAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hcm0vdW5zcGVjcy5tZCBi L2djYy9jb25maWcvYXJtL3Vuc3BlY3MubWQKaW5kZXggNDcxM2VjODQwYWIuLjJkNmYyN2MxNGY0 IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FybS91bnNwZWNzLm1kCisrKyBiL2djYy9jb25maWcv YXJtL3Vuc3BlY3MubWQKQEAgLTU4Myw2ICs1ODMsMTQgQEAKICAgVkFERExWUV9VCiAgIFZDVFAK ICAgVkNUUF9NCisgIERMU1RQOAorICBETFNUUDE2CisgIERMU1RQMzIKKyAgRExTVFA2NAorICBM RVRQOAorICBMRVRQMTYKKyAgTEVUUDMyCisgIExFVFA2NAogICBWUE5PVAogICBWQ1JFQVRFUV9G CiAgIFZDVlRRX05fVE9fRl9TCmRpZmYgLS1naXQgYS9nY2MvZGYtY29yZS5jYyBiL2djYy9kZi1j b3JlLmNjCmluZGV4IGQ0ODEyYjA0YTdjLi40ZmNjMTRiZjc5MCAxMDA2NDQKLS0tIGEvZ2NjL2Rm LWNvcmUuY2MKKysrIGIvZ2NjL2RmLWNvcmUuY2MKQEAgLTE5NjQsNiArMTk2NCwyMSBAQCBkZl9i Yl9yZWdub19sYXN0X2RlZl9maW5kIChiYXNpY19ibG9jayBiYiwgdW5zaWduZWQgaW50IHJlZ25v KQogICByZXR1cm4gTlVMTDsKIH0KIAorLyogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgZGVmIG9m IFJFR05PIHdpdGhpbiBCQi4gIElmIHRoZXJlIGlzIG5vIGRlZiBvcgorICAgdGhlcmUgYXJlIG11 bHRpcGxlIGRlZnMsIHJldHVybiBOVUxMLiAgKi8KKworZGZfcmVmCitkZl9iYl9yZWdub19vbmx5 X2RlZl9maW5kIChiYXNpY19ibG9jayBiYiwgdW5zaWduZWQgaW50IHJlZ25vKQoreworICBkZl9y ZWYgdGVtcCA9IGRmX2JiX3JlZ25vX2ZpcnN0X2RlZl9maW5kIChiYiwgcmVnbm8pOworICBpZiAo IXRlbXApCisgICAgcmV0dXJuIE5VTEw7CisgIGVsc2UgaWYgKHRlbXAgPT0gZGZfYmJfcmVnbm9f bGFzdF9kZWZfZmluZCAoYmIsIHJlZ25vKSkKKyAgICByZXR1cm4gdGVtcDsKKyAgZWxzZQorICAg IHJldHVybiBOVUxMOworfQorCiAvKiBGaW5kcyB0aGUgcmVmZXJlbmNlIGNvcnJlc3BvbmRpbmcg dG8gdGhlIGRlZmluaXRpb24gb2YgUkVHIGluIElOU04uCiAgICBERiBpcyB0aGUgZGF0YWZsb3cg b2JqZWN0LiAgKi8KIApkaWZmIC0tZ2l0IGEvZ2NjL2RmLmggYi9nY2MvZGYuaAppbmRleCA0MDI2 NTdhNzA3Ni4uOTg2MjM2MzdmOWMgMTAwNjQ0Ci0tLSBhL2djYy9kZi5oCisrKyBiL2djYy9kZi5o CkBAIC05ODcsNiArOTg3LDcgQEAgZXh0ZXJuIHZvaWQgZGZfY2hlY2tfY2ZnX2NsZWFuICh2b2lk KTsKICNlbmRpZgogZXh0ZXJuIGRmX3JlZiBkZl9iYl9yZWdub19maXJzdF9kZWZfZmluZCAoYmFz aWNfYmxvY2ssIHVuc2lnbmVkIGludCk7CiBleHRlcm4gZGZfcmVmIGRmX2JiX3JlZ25vX2xhc3Rf ZGVmX2ZpbmQgKGJhc2ljX2Jsb2NrLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGRmX3JlZiBkZl9i Yl9yZWdub19vbmx5X2RlZl9maW5kIChiYXNpY19ibG9jaywgdW5zaWduZWQgaW50KTsKIGV4dGVy biBkZl9yZWYgZGZfZmluZF9kZWYgKHJ0eF9pbnNuICosIHJ0eCk7CiBleHRlcm4gYm9vbCBkZl9y ZWdfZGVmaW5lZCAocnR4X2luc24gKiwgcnR4KTsKIGV4dGVybiBkZl9yZWYgZGZfZmluZF91c2Ug KHJ0eF9pbnNuICosIHJ0eCk7CmRpZmYgLS1naXQgYS9nY2MvbG9vcC1kb2xvb3AuY2MgYi9nY2Mv bG9vcC1kb2xvb3AuY2MKaW5kZXggNGZlYjBhMjVhYjkuLmQ1NGVkNzkyMjAzIDEwMDY0NAotLS0g YS9nY2MvbG9vcC1kb2xvb3AuY2MKKysrIGIvZ2NjL2xvb3AtZG9sb29wLmNjCkBAIC04NSwxMCAr ODUsMTAgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpkb2xvb3BfcGF0KQogICAg ICBmb3JtczoKIAogICAgICAxKSAgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAo Y29uZGl0aW9uKQotCSAgCQkJICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFiZWwpKQotCQkJCSAg ICAgICAgICAgIChwYykpKQotCSAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChj b25zdF9pbnQgLTEpKSkKLQkgICAgICAgICAgICAgKGFkZGl0aW9uYWwgY2xvYmJlcnMgYW5kIHVz ZXMpXSkKKwkJCQkJICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKKwkJCQkJICAgIChwYykpKQorCQkg ICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKQorCQkgICAgIChhZGRp dGlvbmFsIGNsb2JiZXJzIGFuZCB1c2VzKV0pCiAKICAgICAgVGhlIGJyYW5jaCBtdXN0IGJlIHRo ZSBmaXJzdCBlbnRyeSBvZiB0aGUgcGFyYWxsZWwgKGFsc28gcmVxdWlyZWQKICAgICAgYnkganVt cC5jYyksIGFuZCB0aGUgc2Vjb25kIGVudHJ5IG9mIHRoZSBwYXJhbGxlbCBtdXN0IGJlIGEgc2V0 IG9mCkBAIC05NiwxOSArOTYsMzQgQEAgZG9sb29wX2NvbmRpdGlvbl9nZXQgKHJ0eF9pbnNuICpk b2xvb3BfcGF0KQogICAgICB0aGUgbG9vcCBjb3VudGVyIGluIGFuIGlmX3RoZW5fZWxzZSB0b28u CiAKICAgICAgMikgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0gICAg ICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0JICAgICAgICAgICAgICAg ICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLQkJCSAgICAgICAgIChwYykpKS4gIAorCSAo c2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCisJCQkJIChsYWJlbF9yZWYgKGxhYmVs KSkKKwkJCQkgKHBjKSkpLgogCiAgICAgIFNvbWUgdGFyZ2V0cyAoQVJNKSBkbyB0aGUgY29tcGFy aXNvbiBiZWZvcmUgdGhlIGJyYW5jaCwgYXMgaW4gdGhlCiAgICAgIGZvbGxvd2luZyBmb3JtOgog Ci0gICAgIDMpIChwYXJhbGxlbCBbKHNldCAoY2MpIChjb21wYXJlICgocGx1cyAocmVnKSAoY29u c3RfaW50IC0xKSwgMCkpKQotICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJl ZykgKGNvbnN0X2ludCAtMSkpKV0pCi0gICAgICAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChj YyA9PSBORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFi ZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMpKSkgKi8KLQorICAgICAz KSAocGFyYWxsZWwgWyhzZXQgKGNjKSAoY29tcGFyZSAocGx1cyAocmVnKSAoY29uc3RfaW50IC0x KSkgMCkpCisJCSAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpKV0pCisJ KHNldCAocGMpIChpZl90aGVuX2Vsc2UgKGNjID09IE5FKQorCQkJCShsYWJlbF9yZWYgKGxhYmVs KSkKKwkJCQkocGMpKSkKKworICAgICAgVGhlIEFSTSB0YXJnZXQgYWxzbyBzdXBwb3J0cyBhIHNw ZWNpYWwgY2FzZSBvZiBhIGNvdW50ZXIgdGhhdCBkZWNyZW1lbnRzCisgICAgICBieSBgbmAgYW5k IHRlcm1pbmF0aW5nIGluIGEgR1RVIGNvbmRpdGlvbi4gIEluIHRoYXQgY2FzZSwgdGhlIGNvbXBh cmUgYW5kCisgICAgICBicmFuY2ggYXJlIGFsbCBwYXJ0IG9mIG9uZSBpbnNuLCBjb250YWluaW5n IGFuIFVOU1BFQzoKKworICAgICAgNCkgKHBhcmFsbGVsIFsKKwkgICAgKHNldCAocGMpCisJCShp Zl90aGVuX2Vsc2UgKGd0dSAodW5zcGVjOlNJIFsocGx1czpTSSAocmVnOlNJIDE0IGxyKQorCQkJ CQkJCShjb25zdF9pbnQgLW4pKV0pCisJCQkJICAgKGNvbnN0X2ludCBuLTFdKSkKKwkJICAgIChs YWJlbF9yZWYpCisJCSAgICAocGMpKSkKKwkgICAgKHNldCAocmVnOlNJIDE0IGxyKQorCQkgKHBs dXM6U0kgKHJlZzpTSSAxNCBscikKKwkJCSAgKGNvbnN0X2ludCAtbikpKQorICAgICAqLwogICBw YXR0ZXJuID0gUEFUVEVSTiAoZG9sb29wX3BhdCk7CiAKICAgaWYgKEdFVF9DT0RFIChwYXR0ZXJu KSAhPSBQQVJBTExFTCkKQEAgLTE0Myw3ICsxNTgsNyBAQCBkb2xvb3BfY29uZGl0aW9uX2dldCAo cnR4X2luc24gKmRvbG9vcF9wYXQpCiAJICAgICAgfHwgR0VUX0NPREUgKGNtcF9hcmcxKSAhPSBQ TFVTKQogCSAgICByZXR1cm4gMDsKIAkgIHJlZ19vcmlnID0gWEVYUCAoY21wX2FyZzEsIDApOwot CSAgaWYgKFhFWFAgKGNtcF9hcmcxLCAxKSAhPSBHRU5fSU5UICgtMSkgCisJICBpZiAoWEVYUCAo Y21wX2FyZzEsIDEpICE9IEdFTl9JTlQgKC0xKQogCSAgICAgIHx8ICFSRUdfUCAocmVnX29yaWcp KQogCSAgICByZXR1cm4gMDsKIAkgIGNjX3JlZyA9IFNFVF9ERVNUIChjbXBfb3JpZyk7CkBAIC0x NzMsMTUgKzE4OCwxNiBAQCBkb2xvb3BfY29uZGl0aW9uX2dldCAocnR4X2luc24gKmRvbG9vcF9w YXQpCiAgIGlmICghIFJFR19QIChyZWcpKQogICAgIHJldHVybiAwOwogCi0gIC8qIENoZWNrIGlm IHNvbWV0aGluZyA9IChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKS4KKyAgLyogQ2hlY2sgaWYg c29tZXRoaW5nID0gKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtbikpLgogICAgICBPbiBJQS02NCwg dGhpcyBkZWNyZW1lbnQgaXMgd3JhcHBlZCBpbiBhbiBpZl90aGVuX2Vsc2UuICAqLwogICBpbmNf c3JjID0gU0VUX1NSQyAoaW5jKTsKICAgaWYgKEdFVF9DT0RFIChpbmNfc3JjKSA9PSBJRl9USEVO X0VMU0UpCiAgICAgaW5jX3NyYyA9IFhFWFAgKGluY19zcmMsIDEpOwogICBpZiAoR0VUX0NPREUg KGluY19zcmMpICE9IFBMVVMKICAgICAgIHx8IFhFWFAgKGluY19zcmMsIDApICE9IHJlZwotICAg ICAgfHwgWEVYUCAoaW5jX3NyYywgMSkgIT0gY29uc3RtMV9ydHgpCisgICAgICB8fCAhQ09OU1Rf SU5UX1AgKFhFWFAgKGluY19zcmMsIDEpKSkKICAgICByZXR1cm4gMDsKKyAgaW50IGRlY19udW0g PSBhYnMgKElOVFZBTCAoWEVYUCAoaW5jX3NyYywgMSkpKTsKIAogICAvKiBDaGVjayBmb3IgKHNl dCAocGMpIChpZl90aGVuX2Vsc2UgKGNvbmRpdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKQEAgLTE5Niw2MCArMjEyLDcxIEBA IGRvbG9vcF9jb25kaXRpb25fZ2V0IChydHhfaW5zbiAqZG9sb29wX3BhdCkKICAgLyogRXh0cmFj dCBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4gICovCiAgIGNvbmRpdGlvbiA9IFhFWFAgKFNF VF9TUkMgKGNtcCksIDApOwogCi0gIC8qIFdlIGV4cGVjdCBhIEdFIG9yIE5FIGNvbXBhcmlzb24g d2l0aCAwIG9yIDEuICAqLwotICBpZiAoKEdFVF9DT0RFIChjb25kaXRpb24pICE9IEdFCi0gICAg ICAgJiYgR0VUX0NPREUgKGNvbmRpdGlvbikgIT0gTkUpCi0gICAgICB8fCAoWEVYUCAoY29uZGl0 aW9uLCAxKSAhPSBjb25zdDBfcnR4Ci0gICAgICAgICAgJiYgWEVYUCAoY29uZGl0aW9uLCAxKSAh PSBjb25zdDFfcnR4KSkKKyAgLyogV2UgZXhwZWN0IGEgR0Ugb3IgTkUgY29tcGFyaXNvbiB3aXRo IDAgb3IgMSwgb3IgYSBHVFUgY29tcGFyaXNvbiB3aXRoCisgICAgIGRlY19udW0gLSAxLiAgKi8K KyAgaWYgKCEoKEdFVF9DT0RFIChjb25kaXRpb24pID09IEdFCisJIHx8IEdFVF9DT0RFIChjb25k aXRpb24pID09IE5FKQorCSYmIChYRVhQIChjb25kaXRpb24sIDEpID09IGNvbnN0MF9ydHgKKwkg ICAgfHwgWEVYUCAoY29uZGl0aW9uLCAxKSA9PSBjb25zdDFfcnR4ICkpCisgICAgICAmJiEoR0VU X0NPREUgKGNvbmRpdGlvbikgPT0gR1RVCisJICAmJiAoKElOVFZBTCAoWEVYUCAoY29uZGl0aW9u LCAxKSkpID09IChkZWNfbnVtIC0gMSkpKSkKICAgICByZXR1cm4gMDsKIAotICBpZiAoKFhFWFAg KGNvbmRpdGlvbiwgMCkgPT0gcmVnKQorICAvKiBGb3IgdGhlIEFSTSBzcGVjaWFsIGNhc2Ugb2Yg aGF2aW5nIGEgR1RVOiByZS1mb3JtIHRoZSBjb25kaXRpb24gd2l0aG91dAorICAgICB0aGUgdW5z cGVjIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgbWlkZGxlLWVuZC4gICovCisgIGlmIChHRVRfQ09E RSAoY29uZGl0aW9uKSA9PSBHVFUpCisgICAgeworICAgICAgY29uZGl0aW9uID0gZ2VuX3J0eF9m bXRfZWUgKEdUVSwgVk9JRG1vZGUsIGluY19zcmMsCisJCQkJICBHRU5fSU5UIChkZWNfbnVtIC0g MSkpOworICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKyAgICB9CisgIGVsc2UgaWYgKChYRVhQIChj b25kaXRpb24sIDApID09IHJlZykKICAgICAgIC8qIEZvciB0aGUgdGhpcmQgY2FzZTogICovICAK ICAgICAgIHx8ICgoY2NfcmVnICE9IE5VTExfUlRYKQogCSAgJiYgKFhFWFAgKGNvbmRpdGlvbiwg MCkgPT0gY2NfcmVnKQogCSAgJiYgKHJlZ19vcmlnID09IHJlZykpCiAgICAgICB8fCAoR0VUX0NP REUgKFhFWFAgKGNvbmRpdGlvbiwgMCkpID09IFBMVVMKIAkgICYmIFhFWFAgKFhFWFAgKGNvbmRp dGlvbiwgMCksIDApID09IHJlZykpCi0gICB7CisgICAgewogICAgICBpZiAoR0VUX0NPREUgKHBh dHRlcm4pICE9IFBBUkFMTEVMKQogICAgICAvKiAgRm9yIHRoZSBzZWNvbmQgZm9ybSB3ZSBleHBl Y3Q6CiAKLSAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpCi0g ICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDApCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAocGMpKSkuCisJIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0 X2ludCAtMSkpCisJIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMCkKKwkJCQkgKGxh YmVsX3JlZiAobGFiZWwpKQorCQkJCSAocGMpKSkuCiAKLSAgICAgICAgIGlzIGVxdWl2YWxlbnQg dG8gdGhlIGZvbGxvd2luZzoKKwkgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOgogCi0g ICAgICAgICAocGFyYWxsZWwgWyhzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChyZWcgIT0gMSkKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsX3JlZiAobGFi ZWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGMpKSkK LSAgICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNvbnN0X2ludCAt MSkpKQotICAgICAgICAgICAgICAgICAgICAgKGFkZGl0aW9uYWwgY2xvYmJlcnMgYW5kIHVzZXMp XSkKKwkgKHBhcmFsbGVsIFsoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAocmVnICE9IDEpCisJCQkJ CSAgICAobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJCSAgICAocGMpKSkKKwkJICAgICAoc2V0IChy ZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKKwkJICAgICAoYWRkaXRpb25hbCBjbG9i YmVycyBhbmQgdXNlcyldKQogCi0gICAgICAgIEZvciB0aGUgdGhpcmQgZm9ybSB3ZSBleHBlY3Q6 CisJRm9yIHRoZSB0aGlyZCBmb3JtIHdlIGV4cGVjdDoKIAotICAgICAgICAocGFyYWxsZWwgWyhz ZXQgKGNjKSAoY29tcGFyZSAoKHBsdXMgKHJlZykgKGNvbnN0X2ludCAtMSkpLCAwKSkKLSAgICAg ICAgICAgICAgICAgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSldKQot ICAgICAgICAoc2V0IChwYykgKGlmX3RoZW5fZWxzZSAoY2MgPT0gTkUpCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChsYWJlbF9yZWYgKGxhYmVsKSkKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKHBjKSkpIAorCShwYXJhbGxlbCBbKHNldCAoY2MpIChjb21wYXJlICgo cGx1cyAocmVnKSAoY29uc3RfaW50IC0xKSksIDApKQorCQkgICAoc2V0IChyZWcpIChwbHVzIChy ZWcpIChjb25zdF9pbnQgLTEpKSldKQorCShzZXQgKHBjKSAoaWZfdGhlbl9lbHNlIChjYyA9PSBO RSkKKwkJCQkobGFiZWxfcmVmIChsYWJlbCkpCisJCQkJKHBjKSkpIAogCi0gICAgICAgIHdoaWNo IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZzoKKwl3aGljaCBpcyBlcXVpdmFsZW50IHRv IHRoZSBmb2xsb3dpbmc6CiAKLSAgICAgICAgKHBhcmFsbGVsIFsoc2V0IChjYykgKGNvbXBhcmUg KHJlZywgIDEpKQotICAgICAgICAgICAgICAgICAgIChzZXQgKHJlZykgKHBsdXMgKHJlZykgKGNv bnN0X2ludCAtMSkpKQotICAgICAgICAgICAgICAgICAgIChzZXQgKHBjKSAoaWZfdGhlbl9lbHNl IChORSA9PSBjYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bGFiZWxfcmVmIChsYWJlbCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHBjKSkpKV0pCisJKHBhcmFsbGVsIFsoc2V0IChjYykgKGNvbXBhcmUgKHJlZywgIDEp KQorCQkgICAoc2V0IChyZWcpIChwbHVzIChyZWcpIChjb25zdF9pbnQgLTEpKSkKKwkJICAgKHNl dCAocGMpIChpZl90aGVuX2Vsc2UgKE5FID09IGNjKQorCQkJCQkgICAobGFiZWxfcmVmIChsYWJl bCkpCisJCQkJCSAgIChwYykpKSldKQogCi0gICAgICAgIFNvIHdlIHJldHVybiB0aGUgc2Vjb25k IGZvcm0gaW5zdGVhZCBmb3IgdGhlIHR3byBjYXNlcy4KKwlTbyB3ZSByZXR1cm4gdGhlIHNlY29u ZCBmb3JtIGluc3RlYWQgZm9yIHRoZSB0d28gY2FzZXMuCiAKICAgICAgKi8KLSAgICAgICAgY29u ZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKE5FLCBWT0lEbW9kZSwgaW5jX3NyYywgY29uc3QxX3J0 eCk7CisJY29uZGl0aW9uID0gZ2VuX3J0eF9mbXRfZWUgKE5FLCBWT0lEbW9kZSwgaW5jX3NyYywg Y29uc3QxX3J0eCk7CiAKICAgICByZXR1cm4gY29uZGl0aW9uOwotICAgfQorICAgIH0KIAogICAv KiA/Pz8gSWYgYSBtYWNoaW5lIHVzZXMgYSBmdW5ueSBjb21wYXJpc29uLCB3ZSBjb3VsZCByZXR1 cm4gYQogICAgICBjYW5vbmljYWxpemVkIGZvcm0gaGVyZS4gICovCkBAIC00OTIsNyArNTE5LDgg QEAgZG9sb29wX21vZGlmeSAoY2xhc3MgbG9vcCAqbG9vcCwgY2xhc3Mgbml0ZXJfZGVzYyAqZGVz YywKICAgICBjYXNlIEdFOgogICAgICAgLyogQ3VycmVudGx5IG9ubHkgR0UgdGVzdHMgYWdhaW5z dCB6ZXJvIGFyZSBzdXBwb3J0ZWQuICAqLwogICAgICAgZ2NjX2Fzc2VydCAoWEVYUCAoY29uZGl0 aW9uLCAxKSA9PSBjb25zdDBfcnR4KTsKLQorICAgICAgLyogRkFMTFRIUlUgKi8KKyAgICBjYXNl IEdUVToKICAgICAgIG5vbG9vcCA9IGNvbnN0bTFfcnR4OwogCiAgICAgICAvKiBUaGUgaXRlcmF0 aW9uIGNvdW50IGRvZXMgbm90IG5lZWQgaW5jcmVtZW50aW5nIGZvciBhIEdFIHRlc3QuICAqLwpA QCAtNjQyLDcgKzY3MCw3IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3MgbG9vcCAqbG9vcCkKIHsK ICAgc2NhbGFyX2ludF9tb2RlIG1vZGU7CiAgIHJ0eCBkb2xvb3BfcmVnOwotICBydHggY291bnQ7 CisgIHJ0eCBjb3VudCA9IE5VTExfUlRYOwogICB3aWRlc3RfaW50IGl0ZXJhdGlvbnMsIGl0ZXJh dGlvbnNfbWF4OwogICBydHhfY29kZV9sYWJlbCAqc3RhcnRfbGFiZWw7CiAgIHJ0eCBjb25kaXRp b247CkBAIC02ODUsMTcgKzcxMyw2IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3MgbG9vcCAqbG9v cCkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgbWF4X2Nvc3QKLSAgICA9IENPU1RT X05fSU5TTlMgKHBhcmFtX21heF9pdGVyYXRpb25zX2NvbXB1dGF0aW9uX2Nvc3QpOwotICBpZiAo c2V0X3NyY19jb3N0IChkZXNjLT5uaXRlcl9leHByLCBtb2RlLCBvcHRpbWl6ZV9sb29wX2Zvcl9z cGVlZF9wIChsb29wKSkKLSAgICAgID4gbWF4X2Nvc3QpCi0gICAgewotICAgICAgaWYgKGR1bXBf ZmlsZSkKLQlmcHJpbnRmIChkdW1wX2ZpbGUsCi0JCSAiRG9sb29wOiBudW1iZXIgb2YgaXRlcmF0 aW9ucyB0b28gY29zdGx5IHRvIGNvbXB1dGUuXG4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAg ICB9Ci0KICAgaWYgKGRlc2MtPmNvbnN0X2l0ZXIpCiAgICAgaXRlcmF0aW9ucyA9IHdpZGVzdF9p bnQ6OmZyb20gKHJ0eF9tb2RlX3QgKGRlc2MtPm5pdGVyX2V4cHIsIG1vZGUpLAogCQkJCSAgIFVO U0lHTkVEKTsKQEAgLTcxNiwxMiArNzMzLDI1IEBAIGRvbG9vcF9vcHRpbWl6ZSAoY2xhc3MgbG9v cCAqbG9vcCkKIAogICAvKiBHZW5lcmF0ZSBsb29waW5nIGluc24uICBJZiB0aGUgcGF0dGVybiBG QUlMcyB0aGVuIGdpdmUgdXAgdHJ5aW5nCiAgICAgIHRvIG1vZGlmeSB0aGUgbG9vcCBzaW5jZSB0 aGVyZSBpcyBzb21lIGFzcGVjdCB0aGUgYmFjay1lbmQgZG9lcwotICAgICBub3QgbGlrZS4gICov Ci0gIGNvdW50ID0gY29weV9ydHggKGRlc2MtPm5pdGVyX2V4cHIpOworICAgICBub3QgbGlrZS4g IElmIHRoaXMgc3VjY2VlZHMsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgdGhlIGxvb3AKKyAgICAg ZGVzYy0+bml0ZXJfZXhwciBoYXMgYmVlbiBhbHRlcmVkIGJ5IHRoZSBiYWNrZW5kLCBzbyBvbmx5 IGV4dHJhY3QKKyAgICAgdGhhdCBkYXRhIGFmdGVyIHRoZSBnZW5fZG9sb29wX2VuZC4gICovCiAg IHN0YXJ0X2xhYmVsID0gYmxvY2tfbGFiZWwgKGRlc2MtPmluX2VkZ2UtPmRlc3QpOwogICBkb2xv b3BfcmVnID0gZ2VuX3JlZ19ydHggKG1vZGUpOwogICBydHhfaW5zbiAqZG9sb29wX3NlcSA9IHRh cmdldG0uZ2VuX2RvbG9vcF9lbmQgKGRvbG9vcF9yZWcsIHN0YXJ0X2xhYmVsKTsKIAorICBtYXhf Y29zdAorICAgID0gQ09TVFNfTl9JTlNOUyAocGFyYW1fbWF4X2l0ZXJhdGlvbnNfY29tcHV0YXRp b25fY29zdCk7CisgIGlmIChzZXRfc3JjX2Nvc3QgKGRlc2MtPm5pdGVyX2V4cHIsIG1vZGUsIG9w dGltaXplX2xvb3BfZm9yX3NwZWVkX3AgKGxvb3ApKQorICAgICAgPiBtYXhfY29zdCkKKyAgICB7 CisgICAgICBpZiAoZHVtcF9maWxlKQorCWZwcmludGYgKGR1bXBfZmlsZSwKKwkJICJEb2xvb3A6 IG51bWJlciBvZiBpdGVyYXRpb25zIHRvbyBjb3N0bHkgdG8gY29tcHV0ZS5cbiIpOworICAgICAg cmV0dXJuIGZhbHNlOworICAgIH0KKworICBjb3VudCA9IGNvcHlfcnR4IChkZXNjLT5uaXRlcl9l eHByKTsKICAgd29yZF9tb2RlX3NpemUgPSBHRVRfTU9ERV9QUkVDSVNJT04gKHdvcmRfbW9kZSk7 CiAgIHdvcmRfbW9kZV9tYXggPSAoSE9TVF9XSURFX0lOVF8xVSA8PCAod29yZF9tb2RlX3NpemUg LSAxKSA8PCAxKSAtIDE7CiAgIGlmICghIGRvbG9vcF9zZXEKZGlmZiAtLWdpdCBhL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iLmggYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L2xvYi5oCmluZGV4IGZlYWFlN2NjODk5Li4zOTQxZmU3YThiNiAxMDA2NDQKLS0tIGEvZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IuaAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvYXJtL2xvYi5oCkBAIC0xLDE1ICsxLDEzMSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgotCisj aW5jbHVkZSA8c3RkaW50Lmg+CiAvKiBDb21tb24gY29kZSBmb3IgbG9iIHRlc3RzLiAgKi8KIAog I2RlZmluZSBOT19MT0IgYXNtIHZvbGF0aWxlICgiQCBjbG9iYmVyIGxyIiA6IDogOiAibHIiICkK IAotI2RlZmluZSBOIDEwMDAwCisjZGVmaW5lIE4gMTAwCisKK3N0YXRpYyB2b2lkCityZXNldF9k YXRhIChpbnQgKmEsIGludCAqYiwgaW50ICpjLCBpbnQgeCkKK3sKKyAgbWVtc2V0IChhLCAtMSwg eCAqIHNpemVvZiAoKmEpKTsKKyAgbWVtc2V0IChiLCAtMSwgeCAqIHNpemVvZiAoKmIpKTsKKyAg bWVtc2V0IChjLCAwLCB4ICogc2l6ZW9mICgqYykpOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRf ZGF0YTggKGludDhfdCAqYSwgaW50OF90ICpiLCBpbnQ4X3QgKmMsIGludCB4KQoreworICBtZW1z ZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgqYSkpOworICBtZW1zZXQgKGIsIC0xLCB4ICogc2l6ZW9m ICgqYikpOworICBtZW1zZXQgKGMsIDAsIHggKiBzaXplb2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2 b2lkCityZXNldF9kYXRhMTYgKGludDE2X3QgKmEsIGludDE2X3QgKmIsIGludDE2X3QgKmMsIGlu dCB4KQoreworICBtZW1zZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgqYSkpOworICBtZW1zZXQgKGIs IC0xLCB4ICogc2l6ZW9mICgqYikpOworICBtZW1zZXQgKGMsIDAsIHggKiBzaXplb2YgKCpjKSk7 Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9kYXRhMzIgKGludDMyX3QgKmEsIGludDMyX3QgKmIs IGludDMyX3QgKmMsIGludCB4KQoreworICBtZW1zZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgqYSkp OworICBtZW1zZXQgKGIsIC0xLCB4ICogc2l6ZW9mICgqYikpOworICBtZW1zZXQgKGMsIDAsIHgg KiBzaXplb2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9kYXRhNjQgKGludDY0X3Qg KmEsIGludDY0X3QgKmMsIGludCB4KQoreworICBtZW1zZXQgKGEsIC0xLCB4ICogc2l6ZW9mICgq YSkpOworICBtZW1zZXQgKGMsIDAsIHggKiBzaXplb2YgKCpjKSk7Cit9CisKK3N0YXRpYyB2b2lk CitjaGVja19wbHVzIChpbnQgKmEsIGludCAqYiwgaW50ICpjLCBpbnQgeCkKK3sKKyAgZm9yIChp bnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgeworICAgICAgTk9fTE9COworICAgICAgaWYgKGkg PCB4KQorCXsKKwkgIGlmIChjW2ldICE9IChhW2ldICsgYltpXSkpIGFib3J0ICgpOworCX0KKyAg ICAgIGVsc2UKKwl7CisJICBpZiAoY1tpXSAhPSAwKSBhYm9ydCAoKTsKKwl9CisgICAgfQorfQor CitzdGF0aWMgdm9pZAorY2hlY2tfcGx1czggKGludDhfdCAqYSwgaW50OF90ICpiLCBpbnQ4X3Qg KmMsIGludCB4KQoreworICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKKyAgICB7CisgICAg ICBOT19MT0I7CisgICAgICBpZiAoaSA8IHgpCisJeworCSAgaWYgKGNbaV0gIT0gKGFbaV0gKyBi W2ldKSkgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChjW2ldICE9IDApIGFi b3J0ICgpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19wbHVzMTYgKGludDE2 X3QgKmEsIGludDE2X3QgKmIsIGludDE2X3QgKmMsIGludCB4KQoreworICBmb3IgKGludCBpID0g MDsgaSA8IE47IGkrKykKKyAgICB7CisgICAgICBOT19MT0I7CisgICAgICBpZiAoaSA8IHgpCisJ eworCSAgaWYgKGNbaV0gIT0gKGFbaV0gKyBiW2ldKSkgYWJvcnQgKCk7CisJfQorICAgICAgZWxz ZQorCXsKKwkgIGlmIChjW2ldICE9IDApIGFib3J0ICgpOworCX0KKyAgICB9Cit9CisKK3N0YXRp YyB2b2lkCitjaGVja19wbHVzMzIgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMs IGludCB4KQoreworICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKKyAgICB7CisgICAgICBO T19MT0I7CisgICAgICBpZiAoaSA8IHgpCisJeworCSAgaWYgKGNbaV0gIT0gKGFbaV0gKyBiW2ld KSkgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChjW2ldICE9IDApIGFib3J0 ICgpOworCX0KKyAgICB9Cit9CiAKIHN0YXRpYyB2b2lkCi1yZXNldF9kYXRhIChpbnQgKmEsIGlu dCAqYiwgaW50ICpjKQorY2hlY2tfbWVtY3B5NjQgKGludDY0X3QgKmEsIGludDY0X3QgKmMsIGlu dCB4KQogewotICBtZW1zZXQgKGEsIC0xLCBOICogc2l6ZW9mICgqYSkpOwotICBtZW1zZXQgKGIs IC0xLCBOICogc2l6ZW9mICgqYikpOwotICBtZW1zZXQgKGMsIC0xLCBOICogc2l6ZW9mICgqYykp OworICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykKKyAgICB7CisgICAgICBOT19MT0I7Cisg ICAgICBpZiAoaSA8IHgpCisJeworCSAgaWYgKGNbaV0gIT0gYVtpXSkgYWJvcnQgKCk7CisJfQor ICAgICAgZWxzZQorCXsKKwkgIGlmIChjW2ldICE9IDApIGFib3J0ICgpOworCX0KKyAgICB9CiB9 CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjEuYyBiL2djYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iMS5jCmluZGV4IGJhNWM4MmNkNTVjLi5jOGNlNjUz YTVjMyAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9sb2IxLmMKQEAgLTU0LDI5ICs1NCwxOCBA QCBsb29wMyAoaW50ICphLCBpbnQgKmIsIGludCAqYykKICAgICB9IHdoaWxlIChpIDwgTik7CiB9 CiAKLXZvaWQKLWNoZWNrIChpbnQgKmEsIGludCAqYiwgaW50ICpjKQotewotICBmb3IgKGludCBp ID0gMDsgaSA8IE47IGkrKykKLSAgICB7Ci0gICAgICBOT19MT0I7Ci0gICAgICBpZiAoY1tpXSAh PSBhW2ldICsgYltpXSkKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KIGludAogbWFpbiAodm9pZCkK IHsKLSAgcmVzZXRfZGF0YSAoYSwgYiwgYyk7CisgIHJlc2V0X2RhdGEgKGEsIGIsIGMsIE4pOwog ICBsb29wMSAoYSwgYiAsYyk7Ci0gIGNoZWNrIChhLCBiICxjKTsKLSAgcmVzZXRfZGF0YSAoYSwg YiwgYyk7CisgIGNoZWNrX3BsdXMgKGEsIGIsIGMsIE4pOworICByZXNldF9kYXRhIChhLCBiLCBj LCBOKTsKICAgbG9vcDIgKGEsIGIgLGMpOwotICBjaGVjayAoYSwgYiAsYyk7Ci0gIHJlc2V0X2Rh dGEgKGEsIGIsIGMpOworICBjaGVja19wbHVzIChhLCBiLCBjLCBOKTsKKyAgcmVzZXRfZGF0YSAo YSwgYiwgYywgTik7CiAgIGxvb3AzIChhLCBiICxjKTsKLSAgY2hlY2sgKGEsIGIgLGMpOworICBj aGVja19wbHVzIChhLCBiLCBjLCBOKTsKIAogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbG9iNi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2FybS9sb2I2LmMKaW5kZXggMTdiNjEyNDI5NWUuLjRmZTExNmUyYzJiIDEwMDY0NAotLS0g YS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL2xvYjYuYworKysgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvYXJtL2xvYjYuYwpAQCAtNzksMTQgKzc5LDE0IEBAIGNoZWNrICh2b2lkKQog aW50CiBtYWluICh2b2lkKQogewotICByZXNldF9kYXRhIChhMSwgYjEsIGMxKTsKLSAgcmVzZXRf ZGF0YSAoYTIsIGIyLCBjMik7CisgIHJlc2V0X2RhdGEgKGExLCBiMSwgYzEsIE4pOworICByZXNl dF9kYXRhIChhMiwgYjIsIGMyLCBOKTsKICAgbG9vcDEgKGExLCBiMSwgYzEpOwogICByZWYxIChh MiwgYjIsIGMyKTsKICAgY2hlY2sgKCk7CiAKLSAgcmVzZXRfZGF0YSAoYTEsIGIxLCBjMSk7Ci0g IHJlc2V0X2RhdGEgKGEyLCBiMiwgYzIpOworICByZXNldF9kYXRhIChhMSwgYjEsIGMxLCBOKTsK KyAgcmVzZXRfZGF0YSAoYTIsIGIyLCBjMiwgTik7CiAgIGxvb3AyIChhMSwgYjEsIGMxKTsKICAg cmVmMiAoYTIsIGIyLCBjMik7CiAgIGNoZWNrICgpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtY29tcGlsZS1hc20uYyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWNvbXBpbGUtYXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjVkZGQ5OTRlNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtY29tcGlsZS1hc20uYwpAQCAtMCww ICsxLDU2MSBAQAorLyogeyBkZy1kbyBjb21waWxlIHsgdGFyZ2V0IHsgYXJtKi0qLSogfSB9IH0g Ki8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9tdmVfb2sgfSAq LworLyogeyBkZy1vcHRpb25zICItTzMgLXNhdmUtdGVtcHMiIH0gKi8KKy8qIHsgZGctYWRkLW9w dGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRlIDxhcm1fbXZlLmg+CisKKyNkZWZp bmUgSU1NIDUKKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWShCSVRTLCBM QU5FUywgTERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJCQkJXAordm9pZCB0ZXN0 XyMjTkFNRSMjUFJFRCMjXyMjU0lHTiMjQklUUyAoVFlQRSMjQklUUyMjX3QgKmEsIFRZUEUjI0JJ VFMjI190ICpiLCAgVFlQRSMjQklUUyMjX3QgKmMsIGludCBuKQlcCit7CQkJCQkJCQkJCQlcCisg IHdoaWxlIChuID4gMCkJCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQkJCVwKKyAgICAgIG12ZV9w cmVkMTZfdCBwID0gdmN0cCMjQklUUyMjcSAobik7CQkJCQkJXAorICAgICAgVFlQRSMjQklUUyMj eCMjTEFORVMjI190IHZhID0gdmxkciMjTERSU1RSWVRQRSMjcV96XyMjU0lHTiMjQklUUyAoYSwg cCk7CQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmIgPSB2bGRyIyNMRFJTVFJZ VFBFIyNxX3pfIyNTSUdOIyNCSVRTIChiLCBwKTsJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xB TkVTIyNfdCB2YyA9IE5BTUUjI1BSRUQjI18jI1NJR04jI0JJVFMgKHZhLCB2YiwgcCk7CQlcCisg ICAgICB2c3RyIyNMRFJTVFJZVFBFIyNxX3BfIyNTSUdOIyNCSVRTIChjLCB2YywgcCk7CQkJCQlc CisgICAgICBjICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIGEgKz0gTEFORVM7CQkJCQkJCQkJ XAorICAgICAgYiArPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgICBuIC09IExBTkVTOwkJCQkJCQkJ CVwKKyAgICB9CQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQ X1NJR05FRF9VTlNJR05FRF9URVJOQVJZKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCBOQU1FLCBQ UkVEKQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWSAoQklUUywgTEFORVMsIExEUlNU UllUUEUsIGludCwgcywgTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVS TkFSWSAoQklUUywgTEFORVMsIExEUlNUUllUUEUsIHVpbnQsIHUsIE5BTUUsIFBSRUQpCisKKyNk ZWZpbmUgVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5B UlkoTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVE X1RFUk5BUlkgKDgsIDE2LCBiLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExT VFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKDE2LCA4LCBoLCBOQU1FLCBQUkVEKQkJCQlcCitU RVNUX0NPTVBJTEVfSU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKDMyLCA0LCB3LCBO QU1FLCBQUkVEKQorCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZICh2YWRkcSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19T SUdORURfVU5TSUdORURfVEVSTkFSWSAodm11bHEsIF94KQorVEVTVF9DT01QSUxFX0lOX0RMU1RQ X0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZzdWJxLCBfeCkKK1RFU1RfQ09NUElM RV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZICh2aGFkZHEsIF94KQor VEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUlkgKHZv cnJxLCBfeCkKKworCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX00oQklU UywgTEFORVMsIExEUlNUUllUUEUsIFRZUEUsIFNJR04sIE5BTUUsIFBSRUQpCQkJCVwKK3ZvaWQg dGVzdF8jI05BTUUjI1BSRUQjI18jI1NJR04jI0JJVFMgKFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNf dCBfX2luYWN0aXZlLCBUWVBFIyNCSVRTIyNfdCAqYSwgVFlQRSMjQklUUyMjX3QgKmIsICBUWVBF IyNCSVRTIyNfdCAqYywgaW50IG4pCVwKK3sJCQkJCQkJCQkJCVwKKyAgd2hpbGUgKG4gPiAwKQkJ CQkJCQkJCQlcCisgICAgewkJCQkJCQkJCQkJXAorICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw IyNCSVRTIyNxIChuKTsJCQkJCQlcCisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmEg PSB2bGRyIyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdOIyNCSVRTIChhLCBwKTsJCVwKKyAgICAgIFRZ UEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YiA9IHZsZHIjI0xEUlNUUllUUEUjI3Ffel8jI1NJR04j I0JJVFMgKGIsIHApOwkJXAorICAgICAgVFlQRSMjQklUUyMjeCMjTEFORVMjI190IHZjID0gTkFN RSMjUFJFRCMjXyMjU0lHTiMjQklUUyAoX19pbmFjdGl2ZSwgdmEsIHZiLCBwKTsJCVwKKyAgICAg IHZzdHIjI0xEUlNUUllUUEUjI3FfcF8jI1NJR04jI0JJVFMgKGMsIHZjLCBwKTsJCQkJCVwKKyAg ICAgIGMgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgYSArPSBMQU5FUzsJCQkJCQkJCQlcCisg ICAgICBiICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIG4gLT0gTEFORVM7CQkJCQkJCQkJXAor ICAgIH0JCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfU0lH TkVEX1VOU0lHTkVEX1RFUk5BUllfTShCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgTkFNRSwgUFJF RCkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1RFUk5BUllfTSAoQklUUywgTEFORVMsIExEUlNU UllUUEUsIGludCwgcywgTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVS TkFSWV9NIChCSVRTLCBMQU5FUywgTERSU1RSWVRQRSwgdWludCwgdSwgTkFNRSwgUFJFRCkKKwor I2RlZmluZSBURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVS TkFSWV9NKE5BTUUsIFBSRUQpCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJ R05FRF9URVJOQVJZX00gKDgsIDE2LCBiLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVf SU5fRExTVFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTSAoMTYsIDgsIGgsIE5BTUUsIFBSRUQp CQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICgz MiwgNCwgdywgTkFNRSwgUFJFRCkKKworCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19T SUdORURfVU5TSUdORURfVEVSTkFSWV9NICh2YWRkcSwgX20pCitURVNUX0NPTVBJTEVfSU5fRExT VFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICh2bXVscSwgX20pCitURVNUX0NP TVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NICh2c3VicSwg X20pCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFS WV9NICh2aGFkZHEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VO U0lHTkVEX1RFUk5BUllfTSAodm9ycnEsIF9tKQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9E TFNUUF9URVJOQVJZX04oQklUUywgTEFORVMsIExEUlNUUllUUEUsIFRZUEUsIFNJR04sIE5BTUUs IFBSRUQpCVwKK3ZvaWQgdGVzdF8jI05BTUUjI1BSRUQjI19uXyMjU0lHTiMjQklUUyAoVFlQRSMj QklUUyMjX3QgKmEsICBUWVBFIyNCSVRTIyNfdCAqYywgaW50IG4pCVwKK3sJCQkJCQkJCQkJCVwK KyAgd2hpbGUgKG4gPiAwKQkJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCQkJXAorICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwIyNCSVRTIyNxIChuKTsJCQkJCQlcCisgICAgICBUWVBFIyNCSVRT IyN4IyNMQU5FUyMjX3QgdmEgPSB2bGRyIyNMRFJTVFJZVFBFIyNxX3pfIyNTSUdOIyNCSVRTIChh LCBwKTsJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNfdCB2YyA9IE5BTUUjI1BSRUQj I19uXyMjU0lHTiMjQklUUyAodmEsIElNTSwgcCk7CQlcCisgICAgICB2c3RyIyNMRFJTVFJZVFBF IyNxX3BfIyNTSUdOIyNCSVRTIChjLCB2YywgcCk7CQkJCQlcCisgICAgICBjICs9IExBTkVTOwkJ CQkJCQkJCVwKKyAgICAgIGEgKz0gTEFORVM7CQkJCQkJCQkJXAorICAgICAgbiAtPSBMQU5FUzsJ CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9J Tl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9OKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBF LCBOQU1FLCBQUkVEKQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9OIChCSVRTLCBM QU5FUywgTERSU1RSWVRQRSwgaW50LCBzLCBOQU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9J Tl9ETFNUUF9URVJOQVJZX04gKEJJVFMsIExBTkVTLCBMRFJTVFJZVFBFLCB1aW50LCB1LCBOQU1F LCBQUkVEKQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9V TlNJR05FRF9URVJOQVJZX04oTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBf U0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAoOCwgMTYsIGIsIE5BTUUsIFBSRUQpCQkJCVwKK1RF U1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICgxNiwgOCwgaCwg TkFNRSwgUFJFRCkJCQkJXAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9U RVJOQVJZX04gKDMyLCA0LCB3LCBOQU1FLCBQUkVEKQorCitURVNUX0NPTVBJTEVfSU5fRExTVFBf SU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2YWRkcSwgX3gpCitURVNUX0NPTVBJ TEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2bXVscSwgX3gp CitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9O ICh2c3VicSwgX3gpCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdO RURfVEVSTkFSWV9OICh2aGFkZHEsIF94KQorCitURVNUX0NPTVBJTEVfSU5fRExTVFBfSU5UQklU U19TSUdORURfVU5TSUdORURfVEVSTkFSWV9OICh2YnJzcnEsIF94KQorVEVTVF9DT01QSUxFX0lO X0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAodnNobHEsIF94KQorVEVT VF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTiAodnNo cnEsIF94KQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9URVJOQVJZX01fTihCSVRT LCBMQU5FUywgTERSU1RSWVRQRSwgVFlQRSwgU0lHTiwgTkFNRSwgUFJFRCkJXAordm9pZCB0ZXN0 XyMjTkFNRSMjUFJFRCMjX25fIyNTSUdOIyNCSVRTIChUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3Qg X19pbmFjdGl2ZSwgVFlQRSMjQklUUyMjX3QgKmEsICBUWVBFIyNCSVRTIyNfdCAqYywgaW50IG4p CVwKK3sJCQkJCQkJCQkJCVwKKyAgd2hpbGUgKG4gPiAwKQkJCQkJCQkJCQlcCisgICAgewkJCQkJ CQkJCQkJXAorICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwIyNCSVRTIyNxIChuKTsJCQkJCQlc CisgICAgICBUWVBFIyNCSVRTIyN4IyNMQU5FUyMjX3QgdmEgPSB2bGRyIyNMRFJTVFJZVFBFIyNx X3pfIyNTSUdOIyNCSVRTIChhLCBwKTsJCVwKKyAgICAgIFRZUEUjI0JJVFMjI3gjI0xBTkVTIyNf dCB2YyA9IE5BTUUjI1BSRUQjI19uXyMjU0lHTiMjQklUUyAoX19pbmFjdGl2ZSwgdmEsIElNTSwg cCk7CQlcCisgICAgICB2c3RyIyNMRFJTVFJZVFBFIyNxX3BfIyNTSUdOIyNCSVRTIChjLCB2Yywg cCk7CQkJCQlcCisgICAgICBjICs9IExBTkVTOwkJCQkJCQkJCVwKKyAgICAgIGEgKz0gTEFORVM7 CQkJCQkJCQkJXAorICAgICAgbiAtPSBMQU5FUzsJCQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCQkJ XAorfQorCisjZGVmaW5lIFRFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVS TkFSWV9NX04oQklUUywgTEFORVMsIExEUlNUUllUUEUsIE5BTUUsIFBSRUQpCVwKK1RFU1RfQ09N UElMRV9JTl9ETFNUUF9URVJOQVJZX01fTiAoQklUUywgTEFORVMsIExEUlNUUllUUEUsIGludCwg cywgTkFNRSwgUFJFRCkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExTVFBfVEVSTkFSWV9NX04gKEJJ VFMsIExBTkVTLCBMRFJTVFJZVFBFLCB1aW50LCB1LCBOQU1FLCBQUkVEKQorCisjZGVmaW5lIFRF U1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTihO QU1FLCBQUkVEKQkJCVwKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9TSUdORURfVU5TSUdORURfVEVS TkFSWV9NX04gKDgsIDE2LCBiLCBOQU1FLCBQUkVEKQkJCQlcCitURVNUX0NPTVBJTEVfSU5fRExT VFBfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICgxNiwgOCwgaCwgTkFNRSwgUFJFRCkJCQkJ XAorVEVTVF9DT01QSUxFX0lOX0RMU1RQX1NJR05FRF9VTlNJR05FRF9URVJOQVJZX01fTiAoMzIs IDQsIHcsIE5BTUUsIFBSRUQpCisKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05F RF9VTlNJR05FRF9URVJOQVJZX01fTiAodmFkZHEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RMU1RQ X0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2bXVscSwgX20pCitURVNUX0NP TVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZzdWJx LCBfbSkKK1RFU1RfQ09NUElMRV9JTl9ETFNUUF9JTlRCSVRTX1NJR05FRF9VTlNJR05FRF9URVJO QVJZX01fTiAodmhhZGRxLCBfbSkKKworVEVTVF9DT01QSUxFX0lOX0RMU1RQX0lOVEJJVFNfU0lH TkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2YnJzcnEsIF9tKQorVEVTVF9DT01QSUxFX0lOX0RM U1RQX0lOVEJJVFNfU0lHTkVEX1VOU0lHTkVEX1RFUk5BUllfTV9OICh2c2hscSwgX20pCitURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWV9NX04gKHZz aHJxLCBfbSkKKworLyogTm93IHRlc3Qgc29tZSBtb3JlIGNvbmZpZ3VyYXRpb25zLiAgKi8KKwor LyogVXNpbmcgYSA+PTEgY29uZGl0aW9uLiAgKi8KK3ZvaWQgdGVzdDEgKGludDMyX3QgKmEsIGlu dDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+PSAxKQorICAgIHsK KyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEg PSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3pfczMy IChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOwor ICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjKz00OworICAgICAgYSs9NDsK KyAgICAgIGIrPTQ7CisgICAgICBuLT00OworICAgIH0KK30KKworLyogVGVzdCBhIGZvciBsb29w IGZvcm1hdCBvZiBkZWNyZW1lbnRpbmcgdG8gemVybyAqLworaW50MzJfdCBhW10gPSB7MCwgMSwg MiwgMywgNCwgNSwgNiwgN307Cit2b2lkIHRlc3QyIChpbnQzMl90ICpiLCBpbnQgbnVtX2VsZW1z KQoreworICAgIGZvciAoaW50IGkgPSBudW1fZWxlbXM7IGkgPiAwOyBpLT0gNCkKKyAgICB7Cisg ICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAoaSk7CisgICAgICAgIGludDMyeDRfdCB2 YSA9IHZsZHJ3cV96X3MzMiAoJihhW2ldKSwgcCk7CisgICAgICAgIHZzdHJ3cV9wX3MzMiAoYiAr IGksIHZhLCBwKTsKKyAgICB9Cit9CisKKy8qIEl0ZXJhdGlvbiBjb3VudGVyIGNvdW50aW5nIHVw IHRvIG51bV9pdGVyLiAgKi8KK3ZvaWQgdGVzdDMgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVp bnQ4X3QgKmMsIGludCBuKQoreworICAgIGludCBudW1faXRlciA9IChuICsgMTUpLzE2OworICAg IGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2l0ZXI7IGkrKykKKyAgICB7CisgICAgICAgIG12ZV9w cmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96 X3U4IChhLCBwKTsKKyAgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsK KyAgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAg IHZzdHJicV9wX3U4IChjLCB2YywgcCk7CisgICAgICAgIG4tPTE2OworICAgIH0KK30KKworLyog SXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgZG93biBmcm9tIG51bV9pdGVyLiAgKi8KK3ZvaWQg dGVzdDQgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuKQoreworICAg IGludCBudW1faXRlciA9IChuICsgMTUpLzE2OworICAgIGZvciAoaW50IGkgPSBudW1faXRlcjsg aSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsK KyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICAgdWlu dDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICAgdWludDh4MTZfdCB2YyA9 IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgIHZzdHJicV9wX3U4IChjLCB2YywgcCk7 CisgICAgICAgIG4tPTE2OworICAgIH0KK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIGFy aXRobWV0aWMgaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDUgKHVp bnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsICB1aW50OF90ICpkLCBpbnQgbikKK3sK KyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4 cSAobik7CisgICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAg ICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfdTggKGIpOworCS8qIElzIGFmZmVjdGVkIGJ5IGlt cGxpY2l0IHByZWRpY2F0aW9uLCBiZWNhdXNlIHZiIGFsc28KKwljYW1lIGZyb20gYW4gdW5wcmVk aWNhdGVkIGxvYWQsIGJ1dCB0aGVyZSBpcyBubyBmdW5jdGlvbmFsCisJcHJvYmxlbSwgYmVjYXVz ZSB0aGUgcmVzdWx0IGlzIHVzZWQgaW4gYSBwcmVkaWNhdGVkIHN0b3JlLiAgKi8gCisgICAgICAg IHVpbnQ4eDE2X3QgdmMgPSB2YWRkcV91OCAodmEsIHZiKTsKKyAgICAgICAgdWludDh4MTZfdCB2 ZCA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgIHZzdHJicV9wX3U4IChjLCB2Yywg cCk7CisgICAgICAgIHZzdHJicV9wX3U4IChkLCB2ZCwgcCk7CisgICAgICAgIG4tPTE2OworICAg IH0KK30KKworLyogVXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGZvciBvbmUgaW5zdHJ1Y3Rp b24gaW4gdGhlIGxvb3AuICAqLwordm9pZCB0ZXN0NiAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwg aW50MzJfdCAqYywgaW50IG4sIG12ZV9wcmVkMTZfdCBwMSkKK3sKKyAgd2hpbGUgKG4gPiAwKQor ICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0 X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndx X3pfczMyIChiLCBwMSk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEsIHZi LCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAg ICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyog R2VuZXJhdGluZyBhbmQgdXNpbmcgYW5vdGhlciBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGgg YSB2Y3RwLgorICAgVGhlIGRvbG9vcCBsb2dpYyB3aWxsIGFsd2F5cyB0cnkgdG8gZG8gdGhlIHRy YW5zZm9ybSBvbiB0aGUgZmlyc3QKKyAgIHZjdHAgaXQgZW5jb3VudGVycywgc28gdGhpcyBpcyBz dGlsbCBleHBlY3RlZCB0byB3b3JrLiAgKi8KK3ZvaWQgdGVzdDcgKGludDMyX3QgKmEsIGludDMy X3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBpbnQgZykKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAg IHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3Qg dmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmN0cDMy cSAoZyk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHAxKTsKKyAgICAg IGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3Bf czMyIChjLCB2YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9 IDQ7CisgICAgICBuIC09IDQ7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBh IGRpZmZlcmVudCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2Y3RwLAorICAgYnV0IHRo aXMgdGltZSB0aGUgcDEgd2lsbCBhbHNvIGNoYW5nZSBpbiBldmVyeSBsb29wIChzdGlsbCBmaW5l KSAgKi8KK3ZvaWQgdGVzdDggKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGlu dCBuLCBpbnQgZykKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZf dCBwID0gdmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEs IHApOworICAgICAgbXZlX3ByZWQxNl90IHAxID0gdmN0cDMycSAoZyk7CisgICAgICBpbnQzMng0 X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRx X3hfczMyICh2YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAg ICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAgICBuIC09IDQ7Cisg ICAgICBnKys7CisgICAgfQorfQorCisvKiBHZW5lcmF0aW5nIGFuZCB1c2luZyBhIGRpZmZlcmVu dCBWUFIgdmFsdWUgaW4gdGhlIGxvb3AsIHdpdGggYSB2Y3RwX20KKyAgIHRoYXQgaXMgaW5kZXBl bmRlbnQgb2YgdGhlIGxvb3AgdmN0cCBWUFIuICAqLwordm9pZCB0ZXN0OSAoaW50MzJfdCAqYSwg aW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4sIG12ZV9wcmVkMTZfdCBwMSkKK3sKKyAgd2hp bGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7Cisg ICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgbXZlX3ByZWQx Nl90IHAyID0gdmN0cDMycV9tIChuLCBwMSk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ff el9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIs IHAyKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0OworICAg ICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyog R2VuZXJhdGluZyBhbmQgdXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLAor ICAgd2l0aCBhIHZjdHBfbSB0aGF0IGlzIHRpZWQgdG8gdGhlIGJhc2UgdmN0cCBWUFIuICBUaGlz CisgICBpcyBzdGlsbCBmaW5lLCBiZWNhdXNlIHRoZSB2Y3RwX20gd2lsbCBiZSB0cmFuc2Zvcm1l ZAorICAgaW50byBhIHZjdHAgYW5kIGJlIGltcGxpY2l0bHkgcHJlZGljYXRlZC4gICovCit2b2lk IHRlc3QxMCAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwgaW50MzJfdCAqYywgaW50IG4pCit7Cisg IHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4p OworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIG12ZV9w cmVkMTZfdCBwMSA9IHZjdHAzMnFfbSAobiwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRy d3Ffel9zMzIgKGIsIHAxKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwg dmIsIHAxKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0Owor ICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKwor LyogR2VuZXJhdGluZyBhbmQgdXNpbmcgYSBkaWZmZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29w LCB3aXRoIGEgdmNtcC4gICovCit2b2lkIHRlc3QxMSAoaW50MzJfdCAqYSwgaW50MzJfdCAqYiwg aW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pf czMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7Cisg ICAgICBtdmVfcHJlZDE2X3QgcDEgPSB2Y21wZXFxX3MzMiAodmEsIHZiKTsKKyAgICAgIGludDMy eDRfdCB2YyA9IHZhZGRxX3hfczMyICh2YSwgdmIsIHAxKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAo YywgdmMsIHApOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0Owor ICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogR2VuZXJhdGluZyBhbmQgdXNpbmcgYSBkaWZm ZXJlbnQgVlBSIHZhbHVlIGluIHRoZSBsb29wLCB3aXRoIGEgdmNtcF9tLiAgKi8KK3ZvaWQgdGVz dDEyIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbiwgbXZlX3ByZWQx Nl90IHAxKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7 CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAgbXZlX3By ZWQxNl90IHAyID0gdmNtcGVxcV9tX3MzMiAodmEsIHZiLCBwMSk7CisgICAgICBpbnQzMng0X3Qg dmMgPSB2YWRkcV94X3MzMiAodmEsIHZiLCBwMik7CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZj LCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAg IG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIEdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgZGlmZmVyZW50 IFZQUiB2YWx1ZSBpbiB0aGUgbG9vcCwgd2l0aCBhIHZjbXBfbSAKKyAgIHRoYXQgaXMgdGllZCB0 byB0aGUgYmFzZSB2Y3RwIFZQUiAoc2FtZSBhcyBhYm92ZSwgdGhpcyB3aWxsIGJlIHR1cm5lZAor ICAgaW50byBhIHZjbXAgYW5kIGJlIGltcGxpY2l0bHkgcHJlZGljYXRlZCkuICAqLwordm9pZCB0 ZXN0MTMgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGludDMyX3QgKmMsIGludCBuLCBtdmVfcHJl ZDE2X3QgcDEpCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBw KTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBtdmVf cHJlZDE2X3QgcDIgPSB2Y21wZXFxX21fczMyICh2YSwgdmIsIHApOworICAgICAgaW50MzJ4NF90 IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcDIpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2 YywgcCk7CisgICAgICBjICs9IDQ7CisgICAgICBhICs9IDQ7CisgICAgICBiICs9IDQ7CisgICAg ICBuIC09IDQ7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgb3Agd2l0aCBh IHNjYWxhciBvdXRwdXQsIHdoZXJlIHRoZSByZXN1bHQgaXMgdmFsaWQKKyAgIG91dHNpZGUgdGhl IGJiLiAgVGhpcyBpcyB2YWxpZCwgYmVjYXVzZSBhbGwgdGhlIGlucHV0cyB0byB0aGUgdW5wcmVk aWNhdGVkCisgICBvcCBhcmUgY29ycmVjdGx5IHByZWRpY2F0ZWQuICAqLwordWludDhfdCB0ZXN0 MTQgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuLCB1aW50OHgxNl90 IHZ4KQoreworICAgIHVpbnQ4X3Qgc3VtID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgewor ICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZh ID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91 OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX21fdTggKHZ4LCB2YSwgdmIs IHApOworICAgICAgIHN1bSArPSB2YWRkdnFfdTggKHZjKTsKKyAgICAgICBhICs9IDE2OworICAg ICAgIGIgKz0gMTY7CisgICAgICAgbiAtPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30K KworLyogU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW5vdGhlciBzY2FsYXIgb3AgYmV0d2VlbiB0 aGUgdW5wcmVkaWNhdGVkIG9wIGFuZAorICAgdGhlIHNjYWxhciBvcCBvdXRzaWRlIHRoZSBsb29w LiAgKi8KK3VpbnQ4X3QgdGVzdDE1ICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpj LCBpbnQgbiwgdWludDh4MTZfdCB2eCwgaW50IGcpCit7CisgICAgdWludDhfdCBzdW0gPSAwOwor ICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwOHEg KG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7CisgICAgICAg dWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICB1aW50OHgxNl90IHZj ID0gdmFkZHFfbV91OCAodngsIHZhLCB2YiwgcCk7CisgICAgICAgc3VtICs9IHZhZGR2cV91OCAo dmMpOworICAgICAgIHN1bSArPSBnOworICAgICAgIGEgKz0gMTY7CisgICAgICAgYiArPSAxNjsK KyAgICAgICBuIC09IDE2OworICAgIH0KKyAgICByZXR1cm4gc3VtOworfQorCisvKiBVc2luZyBh biB1bnByZWRpY2F0ZWQgdmNtcCB0byBnZW5lcmF0ZSBhIG5ldyBwcmVkaWNhdGUgdmFsdWUgaW4g dGhlCisgICBsb29wIGFuZCB0aGVuIHVzaW5nIGl0IGluIGEgcHJlZGljYXRlZCBzdG9yZSBpbnNu LiAgKi8KK3ZvaWQgdGVzdDE2IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBp bnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0g dmN0cDMycSAobik7CisgICAgICBpbnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOwor ICAgICAgaW50MzJ4NF90IHZiID0gdmxkcndxX3MzMiAoYik7CisgICAgICBpbnQzMng0X3QgdmMg PSB2YWRkcV94X3MzMiAodmEsIHZiLCBwKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjbXBl cXFfczMyICh2YSwgdmMpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcDEpOworICAgICAg YyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAg IH0KK30KKworLyogVXNpbmcgYSBwcmVkaWNhdGVkIHZjbXAgdG8gZ2VuZXJhdGUgYSBuZXcgcHJl ZGljYXRlIHZhbHVlIGluIHRoZQorICAgbG9vcCBhbmQgdGhlbiB1c2luZyBpdCBpbiBhIHByZWRp Y2F0ZWQgc3RvcmUgaW5zbi4gICovCit2b2lkIHRlc3QxNyAoaW50MzJfdCAqYSwgaW50MzJfdCAq YiwgaW50MzJfdCAqYywgaW50IG4pCit7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBt dmVfcHJlZDE2X3QgcCA9IHZjdHAzMnEgKG4pOworICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndx X3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZsZHJ3cV96X3MzMiAoYiwgcCk7 CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV9zMzIgKHZhLCB2Yik7CisgICAgICBtdmVfcHJl ZDE2X3QgcDEgPSB2Y21wZXFxX21fczMyICh2YSwgdmMsIHApOworICAgICAgdnN0cndxX3BfczMy IChjLCB2YywgcDEpOworICAgICAgYyArPSA0OworICAgICAgYSArPSA0OworICAgICAgYiArPSA0 OworICAgICAgbiAtPSA0OworICAgIH0KK30KKworLyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciB1 bnByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24gaW4gYSB2YWxpZCB3YXkuCisgICBUaGlzIHRlc3RzIHRo YXQgInZjIiBoYXMgY29ycmVjdGx5IG1hc2tlZCB0aGUgcmlza3kgInZiIi4gICovCit1aW50MTZf dCB0ZXN0MTggKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwgIHVpbnQxNl90ICpjLCBpbnQgbikK K3sKKyAgdWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIpOworICB1aW50MTZfdCByZXMgPSAw OworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwMTZx IChuKTsKKyAgICAgIHVpbnQxNng4X3QgdmEgPSB2bGRyaHFfel91MTYgKGEsIHApOworICAgICAg dWludDE2eDhfdCB2YyA9IHZhZGRxX3hfdTE2ICh2YSwgdmIsIHApOworICAgICAgcmVzID0gdmFk ZHZxX3UxNiAodmMpOworICAgICAgYyArPSA4OworICAgICAgYSArPSA4OworICAgICAgYiArPSA4 OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogVXNpbmcgYW4g YWNyb3NzLXZlY3RvciB1bnByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24gd2l0aCBhIHNjYWxhciBmcm9t IG91dHNpZGUgdGhlIGxvb3AuICAqLwordWludDE2X3QgdGVzdDE5ICh1aW50MTZfdCAqYSwgdWlu dDE2X3QgKmIsICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNng4X3QgdmIgPSB2bGRy aHFfdTE2IChiKTsKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsK KyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90IHZh ID0gdmxkcmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHVpbnQxNng4X3QgdmMgPSB2YWRkcV94X3Ux NiAodmEsIHZiLCBwKTsKKyAgICAgIHJlcyA9IHZhZGR2YXFfdTE2IChyZXMsIHZjKTsKKyAgICAg IGMgKz0gODsKKyAgICAgIGEgKz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAg ICB9CisgIHJldHVybiByZXM7Cit9CisKKy8qIFVzaW5nIGFuIGFjcm9zcy12ZWN0b3IgcHJlZGlj YXRlZCBpbnN0cnVjdGlvbiBpbiBhIHZhbGlkIHdheS4gICovCit1aW50MTZfdCAgdGVzdDIwICh1 aW50MTZfdCAqYSwgdWludDE2X3QgKmIsICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQx Nl90IHJlcyA9IDA7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIpOwor ICAgICAgdWludDE2eDhfdCB2YSA9IHZsZHJocV96X3UxNiAoYSwgcCk7CisgICAgICByZXMgPSB2 YWRkdmFxX3BfdTE2IChyZXMsIHZiLCBwKTsKKyAgICAgIGMgKz0gODsKKyAgICAgIGEgKz0gODsK KyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiByZXM7Cit9CisK Ky8qIFVzaW5nIGFuIGFjcm9zcy12ZWN0b3IgcHJlZGljYXRlZCBpbnN0cnVjdGlvbiBpbiBhIHZh bGlkIHdheS4gICovCit1aW50MTZfdCAgdGVzdDIxICh1aW50MTZfdCAqYSwgdWludDE2X3QgKmIs ICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNl90IHJlcyA9IDA7CisgIHdoaWxlIChu ID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAg dWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIpOworICAgICAgdWludDE2eDhfdCB2YSA9IHZs ZHJocV96X3UxNiAoYSwgcCk7CisgICAgICByZXMrKzsKKyAgICAgIHJlcyA9IHZhZGR2YXFfcF91 MTYgKHJlcywgdmIsIHApOworICAgICAgYyArPSA4OworICAgICAgYSArPSA4OworICAgICAgYiAr PSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworaW50IHRlc3Qy MiAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50 IHJlcyA9IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90 IHAgPSB2Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEs IHApOworICAgICAgICByZXMgPSB2bWF4dnEgKHJlcywgdmEpOworICAgICAgICBuLT0xNjsKKyAg ICAgICAgYSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2ludCB0ZXN0MjMgKGlu dDhfdCAqYSwgaW50OF90ICpiLCBpbnQ4X3QgKmMsIGludCBuKQoreworICAgIGludCByZXMgPSAw OworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0 cDhxIChuKTsKKyAgICAgICAgaW50OHgxNl90IHZhID0gdmxkcmJxX3pfczggKGEsIHApOworICAg ICAgICByZXMgPSB2bWF4YXZxIChyZXMsIHZhKTsKKyAgICAgICAgbi09MTY7CisgICAgICAgIGEr PTE2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKiBUaGUgZmluYWwgbnVtYmVyIG9m IERMU1RQcyBjdXJyZW50bHkgaXMgY2FsY3VsYXRlZCBieSB0aGUgbnVtYmVyIG9mCisgIGBURVNU X0NPTVBJTEVfSU5fRExTVFBfSU5UQklUU19TSUdORURfVU5TSUdORURfVEVSTkFSWS4qYCBtYWNy b3MgKiA2ICsgMjMuICAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtc dGRsc3RwfSAxNjcgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMg e1x0bGV0cH0gMTY3IH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2FybS9tdmUvZGxzdHAtaW50MTZ4OC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9t dmUvZGxzdHAtaW50MTZ4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li4wMTI1YTJhMTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9hcm0vbXZlL2Rsc3RwLWludDE2eDguYwpAQCAtMCwwICsxLDY5IEBACisvKiB7IGRnLWRvIHJ1 biB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZl LXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUt dGFyZ2V0IGFybV9tdmVfaHcgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLXNhdmUtdGVtcHMi IH0gKi8KKy8qIHsgZGctYWRkLW9wdGlvbnMgYXJtX3Y4XzFtX212ZSB9ICovCisKKyNpbmNsdWRl IDxhcm1fbXZlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNp bmNsdWRlICIuLi9sb2IuaCIKKwordm9pZCAgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkgdGVz dCAoaW50MTZfdCAqYSwgaW50MTZfdCAqYiwgaW50MTZfdCAqYywgaW50IG4pCit7CisgIHdoaWxl IChuID4gMCkKKyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAg ICAgaW50MTZ4OF90IHZhID0gdmxkcmhxX3pfczE2IChhLCBwKTsKKyAgICAgIGludDE2eDhfdCB2 YiA9IHZsZHJocV96X3MxNiAoYiwgcCk7CisgICAgICBpbnQxNng4X3QgdmMgPSB2YWRkcV94X3Mx NiAodmEsIHZiLCBwKTsKKyAgICAgIHZzdHJocV9wX3MxNiAoYywgdmMsIHApOworICAgICAgYys9 ODsKKyAgICAgIGErPTg7CisgICAgICBiKz04OworICAgICAgbi09ODsKKyAgICB9Cit9CisKK2lu dCBtYWluICgpCit7CisgIGludCBpOworICBpbnQxNl90IHRlbXAxW05dOworICBpbnQxNl90IHRl bXAyW05dOworICBpbnQxNl90IHRlbXAzW05dOworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tf cGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKKworICByZXNldF9kYXRhMTYgKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKyAg Y2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCAxKTsKKworICByZXNldF9kYXRhMTYg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3 KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA3KTsKKworICByZXNldF9k YXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCA4KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA4KTsKKworICBy ZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCA5KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCA5KTsK KworICByZXNldF9kYXRhMTYgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCAxNik7CisgIGNoZWNrX3BsdXMxNiAodGVtcDEsIHRlbXAyLCB0ZW1w MywgMTYpOworCisgIHJlc2V0X2RhdGExNiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czE2ICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCAxNyk7CisKKyAgcmVzZXRfZGF0YTE2ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBO KTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGRsc3RwLjE2 fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9 IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJcdHZjdHAiIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInAwIiB9IH0gKi8KZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rsc3RwLWludDMyeDQuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMDZiOTYwYWQ5Y2EKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQzMng0LmMKQEAg LTAsMCArMSw2OSBAQAorLyogeyBkZy1kbyBydW4geyB0YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAq LworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX3Y4XzFtX212ZV9vayB9ICov CisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhcm1fbXZlX2h3IH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFy bV92OF8xbV9tdmUgfSAqLworCisjaW5jbHVkZSA8YXJtX212ZS5oPgorI2luY2x1ZGUgPHN0ZGlv Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiLi4vbG9iLmgiCisKK3ZvaWQgIF9f YXR0cmlidXRlX18gKChub2lubGluZSkpIHRlc3QgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGlu dDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3By ZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3Mz MiAoYSwgcCk7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAg ICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3Ff cF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMrPTQ7CisgICAgICBhKz00OworICAgICAgYis9NDsK KyAgICAgIG4tPTQ7CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsKKyAgaW50 MzJfdCB0ZW1wMVtOXTsKKyAgaW50MzJfdCB0ZW1wMltOXTsKKyAgaW50MzJfdCB0ZW1wM1tOXTsK KyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEs IHRlbXAyLCB0ZW1wMywgMCk7CisgIGNoZWNrX3BsdXMzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywg MCk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisgIGNoZWNrX3BsdXMzMiAodGVtcDEsIHRlbXAyLCB0 ZW1wMywgMSk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAg dGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgMyk7CisgIGNoZWNrX3BsdXMzMiAodGVtcDEsIHRl bXAyLCB0ZW1wMywgMyk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBO KTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgNCk7CisgIGNoZWNrX3BsdXMzMiAodGVt cDEsIHRlbXAyLCB0ZW1wMywgNCk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgNSk7CisgIGNoZWNrX3BsdXMz MiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgNSk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1wMSwgdGVt cDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgOCk7CisgIGNoZWNr X3BsdXMzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgOCk7CisKKyAgcmVzZXRfZGF0YTMyICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgOSk7Cisg IGNoZWNrX3BsdXMzMiAodGVtcDEsIHRlbXAyLCB0ZW1wMywgOSk7CisKKyAgcmVzZXRfZGF0YTMy ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLXRpbWVzIHtcdGRsc3RwLjMyfSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1u b3QgInAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0v bXZlL2Rsc3RwLWludDY0eDIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZlL2Rs c3RwLWludDY0eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNWE3 ODJkZDdmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJt L212ZS9kbHN0cC1pbnQ2NHgyLmMKQEAgLTAsMCArMSw2OSBAQAorLyogeyBkZy1kbyBydW4geyB0 YXJnZXQgeyBhcm0qLSotKiB9IH0gfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJn ZXQgYXJtX3Y4XzFtX212ZV9vayB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdl dCBhcm1fbXZlX2h3IH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1zYXZlLXRlbXBzIiB9ICov CisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8xbV9tdmUgfSAqLworCisjaW5jbHVkZSA8YXJt X212ZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVk ZSAiLi4vbG9iLmgiCisKK3ZvaWQgIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpIHRlc3QgKGlu dDY0X3QgKmEsIGludDY0X3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgewor ICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3RwNjRxIChuKTsKKyAgICAgIGludDY0eDJfdCB2YSA9 IHZsZHJkcV9nYXRoZXJfb2Zmc2V0X3pfczY0IChhLCB2Y3JlYXRlcV91NjQgKDAsIDgpLCBwKTsK KyAgICAgIHZzdHJkcV9zY2F0dGVyX29mZnNldF9wX3M2NCAoYywgdmNyZWF0ZXFfdTY0ICgwLCA4 KSwgdmEsIHApOworICAgICAgYys9MjsKKyAgICAgIGErPTI7CisgICAgICBuLT0yOworICAgIH0K K30KKworaW50IG1haW4gKCkKK3sKKyAgaW50IGk7CisgIGludDY0X3QgdGVtcDFbTl07CisgIGlu dDY0X3QgdGVtcDNbTl07CisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMywgMCk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDAp OworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0 ZW1wMywgMSk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDEpOworCisgIHJlc2V0 X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgMik7Cisg IGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDIpOworCisgIHJlc2V0X2RhdGE2NCAgKHRl bXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgMyk7CisgIGNoZWNrX21lbWNw eTY0ICh0ZW1wMSwgdGVtcDMsIDMpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywg Tik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgNCk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwg dGVtcDMsIDQpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3Qg KHRlbXAxLCB0ZW1wMywgNSk7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDUpOwor CisgIHJlc2V0X2RhdGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1w MywgNik7CisgIGNoZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDYpOworCisgIHJlc2V0X2Rh dGE2NCAgKHRlbXAxLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMywgNyk7CisgIGNo ZWNrX21lbWNweTY0ICh0ZW1wMSwgdGVtcDMsIDcpOworCisgIHJlc2V0X2RhdGE2NCAgKHRlbXAx LCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyB7 XHRkbHN0cC42NH0gMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1l cyB7XHRsZXRwfSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAi XHR2Y3RwIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIlx0dnBz dCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJwMCIgfSB9ICov CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ4 eDE2LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9kbHN0cC1pbnQ4eDE2LmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjhlYTE4MWM4MmQ0Ci0tLSAv ZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2FybS9tdmUvZGxzdHAtaW50 OHgxNi5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHsgYXJtKi0q LSogfSB9IH0gKi8KKy8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGFybV92OF8xbV9t dmVfb2sgfSAqLworLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgYXJtX212ZV9odyB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtc2F2ZS10ZW1wcyIgfSAqLworLyogeyBkZy1hZGQt b3B0aW9ucyBhcm1fdjhfMW1fbXZlIH0gKi8KKworI2luY2x1ZGUgPGFybV9tdmUuaD4KKyNpbmNs dWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIi4uL2xvYi5oIgor Cit2b2lkICBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB0ZXN0IChpbnQ4X3QgKmEsIGludDhf dCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAg IG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJi cV96X3M4IChhLCBwKTsKKyAgICAgIGludDh4MTZfdCB2YiA9IHZsZHJicV96X3M4IChiLCBwKTsK KyAgICAgIGludDh4MTZfdCB2YyA9IHZhZGRxX3hfczggKHZhLCB2YiwgcCk7CisgICAgICB2c3Ry YnFfcF9zOCAoYywgdmMsIHApOworICAgICAgYys9MTY7CisgICAgICBhKz0xNjsKKyAgICAgIGIr PTE2OworICAgICAgbi09MTY7CisgICAgfQorfQorCitpbnQgbWFpbiAoKQoreworICBpbnQgaTsK KyAgaW50OF90IHRlbXAxW05dOworICBpbnQ4X3QgdGVtcDJbTl07CisgIGludDhfdCB0ZW1wM1tO XTsKKyAgcmVzZXRfZGF0YTggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIE4pOworICB0ZXN0ICh0ZW1w MSwgdGVtcDIsIHRlbXAzLCAwKTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMs IDApOworCisgIHJlc2V0X2RhdGE4ICh0ZW1wMSwgdGVtcDIsIHRlbXAzLCBOKTsKKyAgdGVzdCAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgMSk7CisgIGNoZWNrX3BsdXM4ICh0ZW1wMSwgdGVtcDIsIHRl bXAzLCAxKTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7CisgIHRl c3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE1KTsKKyAgY2hlY2tfcGx1czggKHRlbXAxLCB0ZW1w MiwgdGVtcDMsIDE1KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7 CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE2KTsKKyAgY2hlY2tfcGx1czggKHRlbXAx LCB0ZW1wMiwgdGVtcDMsIDE2KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAyLCB0ZW1w MywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKyAgY2hlY2tfcGx1czgg KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDE3KTsKKworICByZXNldF9kYXRhOCAodGVtcDEsIHRlbXAy LCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKyAgY2hlY2tf cGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMyKTsKKworICByZXNldF9kYXRhOCAodGVtcDEs IHRlbXAyLCB0ZW1wMywgTik7CisgIHRlc3QgKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKyAg Y2hlY2tfcGx1czggKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDMzKTsKKworICByZXNldF9kYXRhOCAo dGVtcDEsIHRlbXAyLCB0ZW1wMywgTik7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci10aW1lcyB7XHRkbHN0cC44fSAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLXRpbWVzIHtcdGxldHB9IDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItbm90ICJcdHZjdHAiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiXHR2cHN0IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3Qg InAwIiB9IH0gKi8KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9hcm0vbXZl L2Rsc3RwLWludmFsaWQtYXNtLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYXJtL212ZS9k bHN0cC1pbnZhbGlkLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li5mN2MzZTA0Zjg4MwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9hcm0vbXZlL2Rsc3RwLWludmFsaWQtYXNtLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qIHsgZGct ZG8gY29tcGlsZSB7IHRhcmdldCB7IGFybSotKi0qIH0gfSB9ICovCisvKiB7IGRnLXJlcXVpcmUt ZWZmZWN0aXZlLXRhcmdldCBhcm1fdjhfMW1fbXZlX29rIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAi LU8zIC1zYXZlLXRlbXBzIiB9ICovCisvKiB7IGRnLWFkZC1vcHRpb25zIGFybV92OF8xbV9tdmUg fSAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXJtX212ZS5oPgorCisvKiBU ZXJtaW5hdGluZyBvbiBhIG5vbi16ZXJvIG51bWJlciBvZiBlbGVtZW50cy4gICovCit2b2lkIHRl c3QwICh1aW50OF90ICphLCB1aW50OF90ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAgICB3 aGlsZSAobiA+IDEpCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsK KyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4 eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZh ZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAg ICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogVGVybWluYXRpbmcgb24gbiA+PSAwLiAgKi8K K3ZvaWQgdGVzdDEgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIGludCBuKQor eworICAgIHdoaWxlIChuID49IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0 cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAg ICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZf dCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgdnN0cmJxX3BfdTggKGMsIHZj LCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKworLyogU2ltaWxhciwgdGVybWluYXRp bmcgb24gYSBub24temVybyBudW1iZXIgb2YgZWxlbWVudHMsIGJ1dCBpbiBhIGZvciBsb29wCisg ICBmb3JtYXQuICAqLworaW50MzJfdCBhW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgN307Cit2 b2lkIHRlc3QyIChpbnQzMl90ICpiLCBpbnQgbnVtX2VsZW1zKQoreworICAgIGZvciAoaW50IGkg PSBudW1fZWxlbXM7IGkgPj0gMjsgaS09IDQpCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBw ID0gdmN0cDMycSAoaSk7CisgICAgICAgaW50MzJ4NF90IHZhID0gdmxkcndxX3pfczMyICgmKGFb aV0pLCBwKTsKKyAgICAgICB2c3Ryd3FfcF9zMzIgKGIgKyBpLCB2YSwgcCk7CisgICAgfQorfQor CisvKiBJdGVyYXRpb24gY291bnRlciBjb3VudGluZyB1cCB0byBudW1faXRlciwgd2l0aCBhIG5v bi16ZXJvIHN0YXJ0aW5nIG51bS4gICovCit2b2lkIHRlc3QzICh1aW50OF90ICphLCB1aW50OF90 ICpiLCB1aW50OF90ICpjLCBpbnQgbikKK3sKKyAgICBpbnQgbnVtX2l0ZXIgPSAobiArIDE1KS8x NjsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bV9pdGVyOyBpKyspCisgICAgeworICAgICAg IG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxk cmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwg cCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAg ICAgdnN0cmJxX3BfdTggKGMsIHZjLCBwKTsKKyAgICAgICBuIC09IDE2OworICAgIH0KK30KKwor LyogSXRlcmF0aW9uIGNvdW50ZXIgY291bnRpbmcgdXAgdG8gbnVtX2l0ZXIsIHdpdGggYSBsYXJn ZXIgaW5jcmVtZW50ICAqLwordm9pZCB0ZXN0NCAodWludDhfdCAqYSwgdWludDhfdCAqYiwgdWlu dDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IG51bV9pdGVyID0gKG4gKyAxNSkvMTY7CisgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1faXRlcjsgaSs9MikKKyAgICB7CisgICAgICAgbXZlX3By ZWQxNl90IHAgPSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91 OCAoYSwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAg ICAgICB1aW50OHgxNl90IHZjID0gdmFkZHFfeF91OCAodmEsIHZiLCBwKTsKKyAgICAgICB2c3Ry YnFfcF91OCAoYywgdmMsIHApOworICAgICAgIG4gLT0gMTY7CisgICAgfQorfQorCisvKiBVc2lu ZyBhbiB1bnByZWRpY2F0ZWQgc3RvcmUgaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBsb29wLiAgKi8K K3ZvaWQgdGVzdDUgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsICB1aW50OF90 ICpkLCBpbnQgbikKK3sKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgIG12ZV9wcmVk MTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTgg KGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIgPSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAg ICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgIHVpbnQ4eDE2X3Qg dmQgPSB2YWRkcV94X3U4ICh2YSwgdmIsIHApOworICAgICAgIHZzdHJicV91OCAoZCwgdmQpOwor ICAgICAgIG4gLT0gMTY7CisgICAgfQorfQorCisvKiBVc2luZyBhbiB1bnByZWRpY2F0ZWQgc3Rv cmUgb3V0c2lkZSB0aGUgbG9vcC4gICovCit2b2lkIHRlc3Q2ICh1aW50OF90ICphLCB1aW50OF90 ICpiLCB1aW50OF90ICpjLCBpbnQgbiwgdWludDh4MTZfdCB2eCkKK3sKKyAgICB3aGlsZSAobiA+ IDApCisgICAgeworICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICB1 aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOworICAgICAgIHVpbnQ4eDE2X3QgdmIg PSB2bGRyYnFfel91OCAoYiwgcCk7CisgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX21fdTgg KHZ4LCB2YSwgdmIsIHApOworICAgICAgIHZ4ID0gdmFkZHFfdTggKHZ4LCB2Yyk7CisgICAgICAg YSArPSAxNjsKKyAgICAgICBiICs9IDE2OworICAgICAgIG4gLT0gMTY7CisgICAgfQorICAgIHZz dHJicV91OCAoYywgdngpOworfQorCisvKiBVc2luZyBhIFZQUiB0aGF0IGdldHMgbW9kaWZpZWQg d2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQgdGVzdDkgKGludDMyX3QgKmEsIGludDMyX3QgKmIs IGludDMyX3QgKmMsIGludCBuKQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96 X3MzMiAoYSwgcCk7CisgICAgICBwKys7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9z MzIgKGIsIHApOworICAgICAgaW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7 CisgICAgICB2c3Ryd3FfcF9zMzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEg Kz0gNDsKKyAgICAgIGIgKz0gNDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5n IGEgVlBSIHRoYXQgZ2V0cyByZS1nZW5lcmF0ZWQgd2l0aGluIHRoZSBsb29wLiAgKi8KK3ZvaWQg dGVzdDEwIChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCBpbnQgbikKK3sKKyAg bXZlX3ByZWQxNl90IHAgPSB2Y3RwMzJxIChuKTsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAg ICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV96X3MzMiAoYSwgcCk7CisgICAgICBwID0gdmN0cDMy cSAobik7CisgICAgICBpbnQzMng0X3QgdmIgPSB2bGRyd3Ffel9zMzIgKGIsIHApOworICAgICAg aW50MzJ4NF90IHZjID0gdmFkZHFfeF9zMzIgKHZhLCB2YiwgcCk7CisgICAgICB2c3Ryd3FfcF9z MzIgKGMsIHZjLCBwKTsKKyAgICAgIGMgKz0gNDsKKyAgICAgIGEgKz0gNDsKKyAgICAgIGIgKz0g NDsKKyAgICAgIG4gLT0gNDsKKyAgICB9Cit9CisKKy8qIFVzaW5nIHZjdHAzMnFfbSBpbnN0ZWFk IG9mIHZjdHAzMnEuICAqLwordm9pZCB0ZXN0MTEgKGludDMyX3QgKmEsIGludDMyX3QgKmIsIGlu dDMyX3QgKmMsIGludCBuLCBtdmVfcHJlZDE2X3QgcDApCit7CisgIHdoaWxlIChuID4gMCkKKyAg ICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAzMnFfbSAobiwgcDApOworICAgICAgaW50 MzJ4NF90IHZhID0gdmxkcndxX3pfczMyIChhLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YiA9IHZs ZHJ3cV96X3MzMiAoYiwgcCk7CisgICAgICBpbnQzMng0X3QgdmMgPSB2YWRkcV94X3MzMiAodmEs IHZiLCBwKTsKKyAgICAgIHZzdHJ3cV9wX3MzMiAoYywgdmMsIHApOworICAgICAgYyArPSA0Owor ICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKwor LyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIG9wIHdpdGggYSBzY2FsYXIgb3V0cHV0LCB3aGVyZSB0 aGUgcmVzdWx0IGlzIHZhbGlkCisgICBvdXRzaWRlIHRoZSBiYi4gIFRoaXMgaXMgaW52YWxpZCwg YmVjYXVzZSBvbmUgb2YgdGhlIGlucHV0cyB0byB0aGUKKyAgIHVucHJlZGljYXRlZCBvcCBpcyBh bHNvIHVucHJlZGljYXRlZC4gICovCit1aW50OF90IHRlc3QxMiAodWludDhfdCAqYSwgdWludDhf dCAqYiwgdWludDhfdCAqYywgaW50IG4sIHVpbnQ4eDE2X3QgdngpCit7CisgICAgdWludDhfdCBz dW0gPSAwOworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAgbXZlX3ByZWQxNl90IHAg PSB2Y3RwOHEgKG4pOworICAgICAgIHVpbnQ4eDE2X3QgdmEgPSB2bGRyYnFfel91OCAoYSwgcCk7 CisgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV91OCAoYik7CisgICAgICAgdWludDh4MTZf dCB2YyA9IHZhZGRxX3U4ICh2YSwgdmIpOworICAgICAgIHN1bSArPSB2YWRkdnFfdTggKHZjKTsK KyAgICAgICBhICs9IDE2OworICAgICAgIGIgKz0gMTY7CisgICAgICAgbiAtPSAxNjsKKyAgICB9 CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogVXNpbmcgYW4gdW5wcmVkaWNhdGVkIHZjbXAgdG8g Z2VuZXJhdGUgYSBuZXcgcHJlZGljYXRlIHZhbHVlIGluIHRoZQorICAgbG9vcCBhbmQgdGhlbiB1 c2luZyB0aGF0IFZQUiB0byBwcmVkaWNhdGUgYSBzdG9yZSBpbnNuLiAgKi8KK3ZvaWQgdGVzdDEz IChpbnQzMl90ICphLCBpbnQzMl90ICpiLCBpbnQzMng0X3QgdmMsIGludDMyX3QgKmMsIGludCBu KQoreworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw MzJxIChuKTsKKyAgICAgIGludDMyeDRfdCB2YSA9IHZsZHJ3cV9zMzIgKGEpOworICAgICAgaW50 MzJ4NF90IHZiID0gdmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZh ZGRxX3MzMiAodmEsIHZiKTsKKyAgICAgIG12ZV9wcmVkMTZfdCBwMSA9IHZjbXBlcXFfczMyICh2 YSwgdmMpOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcDEpOworICAgICAgYyArPSA0Owor ICAgICAgYSArPSA0OworICAgICAgYiArPSA0OworICAgICAgbiAtPSA0OworICAgIH0KK30KKwor LyogVXNpbmcgYW4gYWNyb3NzLXZlY3RvciB1bnByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24uICJ2YiIg aXMgdGhlIHJpc2suICAqLwordWludDE2X3QgdGVzdDE0ICh1aW50MTZfdCAqYSwgdWludDE2X3Qg KmIsICB1aW50MTZfdCAqYywgaW50IG4pCit7CisgIHVpbnQxNng4X3QgdmIgPSB2bGRyaHFfdTE2 IChiKTsKKyAgdWludDE2X3QgcmVzID0gMDsKKyAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAg IG12ZV9wcmVkMTZfdCBwID0gdmN0cDE2cSAobik7CisgICAgICB1aW50MTZ4OF90IHZhID0gdmxk cmhxX3pfdTE2IChhLCBwKTsKKyAgICAgIHZiID0gdmFkZHFfdTE2ICh2YSwgdmIpOworICAgICAg cmVzID0gdmFkZHZxX3UxNiAodmIpOworICAgICAgYyArPSA4OworICAgICAgYSArPSA4OworICAg ICAgYiArPSA4OworICAgICAgbiAtPSA4OworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyog VXNpbmcgYW4gYWNyb3NzLXZlY3RvciB1bnByZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24uICJ2YyIgaXMg dGhlIHJpc2suICovCit1aW50MTZfdCB0ZXN0MTUgKHVpbnQxNl90ICphLCB1aW50MTZfdCAqYiwg IHVpbnQxNl90ICpjLCBpbnQgbikKK3sKKyAgdWludDE2eDhfdCB2YiA9IHZsZHJocV91MTYgKGIp OworICB1aW50MTZfdCByZXMgPSAwOworICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgbXZl X3ByZWQxNl90IHAgPSB2Y3RwMTZxIChuKTsKKyAgICAgIHVpbnQxNng4X3QgdmEgPSB2bGRyaHFf el91MTYgKGEsIHApOworICAgICAgdWludDE2eDhfdCB2YyA9IHZhZGRxX3UxNiAodmEsIHZiKTsK KyAgICAgIHJlcyA9IHZhZGR2YXFfdTE2IChyZXMsIHZjKTsKKyAgICAgIGMgKz0gODsKKyAgICAg IGEgKz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiBy ZXM7Cit9CisKK3VpbnQxNl90IHRlc3QxNiAodWludDE2X3QgKmEsIHVpbnQxNl90ICpiLCAgdWlu dDE2X3QgKmMsIGludCBuKQoreworICB1aW50MTZfdCByZXMgPTA7CisgIHdoaWxlIChuID4gMCkK KyAgICB7CisgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHAxNnEgKG4pOworICAgICAgdWludDE2 eDhfdCB2YiA9IHZsZHJocV91MTYgKGIpOworICAgICAgdWludDE2eDhfdCB2YSA9IHZsZHJocV96 X3UxNiAoYSwgcCk7CisgICAgICByZXMgPSB2YWRkdmFxX3UxNiAocmVzLCB2Yik7CisgICAgICBy ZXMgPSB2YWRkdmFxX3BfdTE2IChyZXMsIHZhLCBwKTsKKyAgICAgIGMgKz0gODsKKyAgICAgIGEg Kz0gODsKKyAgICAgIGIgKz0gODsKKyAgICAgIG4gLT0gODsKKyAgICB9CisgIHJldHVybiByZXM7 Cit9CisKK2ludCB0ZXN0MTcgKGludDhfdCAqYSwgaW50OF90ICpiLCBpbnQ4X3QgKmMsIGludCBu KQoreworICAgIGludCByZXMgPSAwOworICAgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICAg IG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsKKyAgICAgICAgaW50OHgxNl90IHZhID0gdmxk cmJxX3pfczggKGEsIHApOworICAgICAgICByZXMgPSB2bWF4dnEgKHJlcywgdmEpOworICAgICAg ICBuLT0xNjsKKyAgICAgICAgYSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwor CitpbnQgdGVzdDE4IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sK KyAgICBpbnQgcmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVf cHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96 X3M4IChhLCBwKTsKKyAgICAgICAgcmVzID0gdm1pbnZxIChyZXMsIHZhKTsKKyAgICAgICAgbi09 MTY7CisgICAgICAgIGErPTE2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgdGVz dDE5IChpbnQ4X3QgKmEsIGludDhfdCAqYiwgaW50OF90ICpjLCBpbnQgbikKK3sKKyAgICBpbnQg cmVzID0gMDsKKyAgICB3aGlsZSAobiA+IDApCisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3Qg cCA9IHZjdHA4cSAobik7CisgICAgICAgIGludDh4MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBw KTsKKyAgICAgICAgcmVzID0gdm1pbmF2cSAocmVzLCB2YSk7CisgICAgICAgIG4tPTE2OworICAg ICAgICBhKz0xNjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHRlc3QyMCAodWlu dDhfdCAqYSwgdWludDhfdCAqYiwgdWludDhfdCAqYywgaW50IG4pCit7CisgICAgaW50IHJlcyA9 IDA7CisgICAgd2hpbGUgKG4gPiAwKQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2 Y3RwOHEgKG4pOworICAgICAgICB1aW50OHgxNl90IHZhID0gdmxkcmJxX3pfdTggKGEsIHApOwor ICAgICAgICByZXMgPSB2bWludnEgKHJlcywgdmEpOworICAgICAgICBuLT0xNjsKKyAgICAgICAg YSs9MTY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ4eDE2X3QgdGVzdDIxICh1 aW50OF90ICphLCB1aW50MzJfdCAqYiwgaW50IG4sIHVpbnQ4eDE2X3QgcmVzKQoreworICAgIHdo aWxlIChuID4gMCkKKyAgICB7CisgICAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDhxIChuKTsK KyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICAgcmVz ID0gdnNobGNxX3U4ICh2YSwgYiwgMSk7CisgICAgICAgIG4tPTE2OworICAgICAgICBhKz0xNjsK KyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworaW50OHgxNl90IHRlc3QyMiAoaW50OF90ICph LCBpbnQzMl90ICpiLCBpbnQgbiwgaW50OHgxNl90IHJlcykKK3sKKyAgICB3aGlsZSAobiA+IDAp CisgICAgeworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobik7CisgICAgICAgIGlu dDh4MTZfdCB2YSA9IHZsZHJicV96X3M4IChhLCBwKTsKKyAgICAgICAgcmVzID0gdnNobGNxX3M4 ICh2YSwgYiwgMSk7CisgICAgICAgIG4tPTE2OworICAgICAgICBhKz0xNjsKKyAgICB9CisgICAg cmV0dXJuIHJlczsKK30KKworLyogVXNpbmcgYW4gdW5zaWduZWQgbnVtYmVyIG9mIGVsZW1lbnRz IHRvIGNvdW50IGRvd24gZnJvbSwgd2l0aCBhID4wKi8KK3ZvaWQgdGVzdDIzIChpbnQzMl90ICph LCBpbnQzMl90ICpiLCBpbnQzMl90ICpjLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgd2hpbGUgKG4g PiAwKQorICAgIHsKKyAgICAgIG12ZV9wcmVkMTZfdCBwID0gdmN0cDMycSAobik7CisgICAgICBp bnQzMng0X3QgdmEgPSB2bGRyd3Ffel9zMzIgKGEsIHApOworICAgICAgaW50MzJ4NF90IHZiID0g dmxkcndxX3pfczMyIChiLCBwKTsKKyAgICAgIGludDMyeDRfdCB2YyA9IHZhZGRxX3hfczMyICh2 YSwgdmIsIHApOworICAgICAgdnN0cndxX3BfczMyIChjLCB2YywgcCk7CisgICAgICBjKz00Owor ICAgICAgYSs9NDsKKyAgICAgIGIrPTQ7CisgICAgICBuLT00OworICAgIH0KK30KKworLyogVXNp bmcgYW4gdW5zaWduZWQgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvdW50IHVwIHRvLCB3aXRoIGEg PG4qLwordm9pZCB0ZXN0MjQgKHVpbnQ4X3QgKmEsIHVpbnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIHVu c2lnbmVkIGludCBuKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSs9MTYpCisgICAg eworICAgICAgICBtdmVfcHJlZDE2X3QgcCA9IHZjdHA4cSAobi1pKTsKKyAgICAgICAgdWludDh4 MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsKKyAgICAgICAgdWludDh4MTZfdCB2YiA9IHZs ZHJicV96X3U4IChiLCBwKTsKKyAgICAgICAgdWludDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZh LCB2YiwgcCk7CisgICAgICAgIHZzdHJicV9wX3U4IChjLCB2YywgcCk7CisgICAgICAgIG4tPTE2 OworICAgIH0KK30KKworCisvKiBVc2luZyBhbiB1bnNpZ25lZCBudW1iZXIgb2YgZWxlbWVudHMg dG8gY291bnQgdXAgdG8sIHdpdGggYSA8PW4qLwordm9pZCB0ZXN0MjUgKHVpbnQ4X3QgKmEsIHVp bnQ4X3QgKmIsIHVpbnQ4X3QgKmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIGZvciAoaW50IGkg PSAxOyBpIDw9IG47IGkrPTE2KQorICAgIHsKKyAgICAgICAgbXZlX3ByZWQxNl90IHAgPSB2Y3Rw OHEgKG4taSsxKTsKKyAgICAgICAgdWludDh4MTZfdCB2YSA9IHZsZHJicV96X3U4IChhLCBwKTsK KyAgICAgICAgdWludDh4MTZfdCB2YiA9IHZsZHJicV96X3U4IChiLCBwKTsKKyAgICAgICAgdWlu dDh4MTZfdCB2YyA9IHZhZGRxX3hfdTggKHZhLCB2YiwgcCk7CisgICAgICAgIHZzdHJicV9wX3U4 IChjLCB2YywgcCk7CisgICAgICAgIG4tPTE2OworICAgIH0KK30KKworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLW5vdCAiXHRkbHN0cCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJcdGxldHAiIH0gfSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp bGUK --------------Z9WW62ku0Uj0U0smP9DoFyW0--