From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F234DCD13D3 for ; Thu, 30 Apr 2026 18:33:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 49CB310F3DB; Thu, 30 Apr 2026 18:33:57 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (1024-bit key; unprotected) header.d=ti.com header.i=@ti.com header.b="H2Zkjp7C"; dkim-atps=neutral Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012064.outbound.protection.outlook.com [40.93.195.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 819CE10F411 for ; Thu, 30 Apr 2026 18:33:53 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nu+KMTc6YvQOjqOpEJmxH+XzJEwkQBhD2sfvvCsqejx5tsO++SPZ9LvGKn20fUDwwX63NCUvpz6TUOmaS21az9swg4pvMZ9H80eSeilfKbsMQ61N1R03Vu2wOKwvF3pYZaRMn/niGzRZxoGbwCXlOFqBX+5hSc4FDkP5u5WihqfHowm9ePIvwj2vKxc0LwoXJwE5moOcQD1CNxuEYVO4rO0F+rVedwHLH/zR/XbIa9kbNsfJrTYJkpZQ/jAOFJkNPpn52drAsK3Ma6cnJV7VCdKPwrf9jQUGilPJm4MeqDzCv4No5B/ExHUS3vueW0V3QuUfUx8VkLYSCUlClG4ayg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Hk8dQ5I/qhKk6ARbWtfgwqoTTzXJcosGtGD9ZfDllyo=; b=nWEXggFAh236FeWnzwWzrc2RwUniSYTUlgK3Rrw9wXTWYjlzmw8BQFH1bEnE7ngkPd7Q0qikTDrE42C4TRPhROBCSmy2F6zN0qx0xzVThhfPf1gy+rGg+oXGehMWc70YAj4Ow3AGucPY/ZUnMhTIsbg2kjixz6pOoVuEYEDcZS2yRL+1jg9f+w02GS7SMb4vI801k8CSPoS5SgFqlKglwF+nnelFDcBIUa44d0fFHmMmOfuzhGcIAjC3MWF/UFQjZ/jOLaYkEnc1SpXKjCaqEA0+YRAX4nAweiqG8f2BncACwNxsFLrRerm7tzABDgdhVGmmMI7ctMh4ZXSovMVOGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Hk8dQ5I/qhKk6ARbWtfgwqoTTzXJcosGtGD9ZfDllyo=; b=H2Zkjp7Cc7IOXEvBzyUjPfgDILuU2eG/GEDvd5aO31MsQQVJZ9mzWKAvPm2z+4OWtRHsHniLksXIlciQDIQUQtkgoAOI//udrEl5EMZbtk8kR3X7w8O5/71RACzYq5cCc4fdxuWeRfUpnyYQyz1UzhzrAl4Rg+2Yj5Cm+kwJxZg= Received: from BYAPR02CA0043.namprd02.prod.outlook.com (2603:10b6:a03:54::20) by BN0PR10MB4967.namprd10.prod.outlook.com (2603:10b6:408:123::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9870.20; Thu, 30 Apr 2026 18:33:50 +0000 Received: from SJ1PEPF00001CE6.namprd03.prod.outlook.com (2603:10b6:a03:54:cafe::36) by BYAPR02CA0043.outlook.office365.com (2603:10b6:a03:54::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9870.21 via Frontend Transport; Thu, 30 Apr 2026 18:33:50 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none; dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by SJ1PEPF00001CE6.mail.protection.outlook.com (10.167.242.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.18 via Frontend Transport; Thu, 30 Apr 2026 18:33:50 +0000 Received: from DLEE212.ent.ti.com (157.170.170.114) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 30 Apr 2026 13:33:49 -0500 Received: from DLEE200.ent.ti.com (157.170.170.75) by DLEE212.ent.ti.com (157.170.170.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 30 Apr 2026 13:33:47 -0500 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DLEE200.ent.ti.com (157.170.170.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 30 Apr 2026 13:33:47 -0500 Received: from localhost (ti.dhcp.ti.com [172.24.233.157] (may be forged)) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 63UIXjIj1698737; Thu, 30 Apr 2026 13:33:46 -0500 From: Devarsh Thakkar To: David Airlie , Simona Vetter , "Maarten Lankhorst" , Maxime Ripard , Thomas Zimmermann , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Neil Armstrong , "Bjorn Andersson" , , , CC: , , , , , , , Subject: [PATCH 3/6] drm/tiny: Add DRM driver for Solomon SSD16xx e-paper display controllers Date: Fri, 1 May 2026 00:03:08 +0530 Message-ID: <20260430183311.2978142-4-devarsht@ti.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20260430183311.2978142-1-devarsht@ti.com> References: <20260430183311.2978142-1-devarsht@ti.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CE6:EE_|BN0PR10MB4967:EE_ X-MS-Office365-Filtering-Correlation-Id: e609e2ef-ddb7-438a-6212-08dea6e70629 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700016|82310400026|7416014|376014|1800799024|921020|18002099003|18092099006|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: 9HK44xTf4fcsE9LMDVvpTmF8GkI8E9jaiSRyqUli16VP96o/tp3XIzIJv4yu/ppv93gvDLNFFLC4D7P7PvH/eO3eOH9/Gge2eYdcT8D4ssp/CSzPjoP+kGSbAY8S85VQTftBgZRtPvmOim6cEYBWZrWT9W1Lch2ir1YjGlSxuVC1k+6r5zKAw8ec522NLQadZfGdGPxcT8PYH/n92Fsbi6ysWsAIdyB8Oxi4NUamrp+x41ej07+PMd1BU8ym7GJCdpFyIVk52bjlWRAF81PswrLJ6ujNrJg5Nexa7pp84dzJm1YWghe3SWzjvhMRR1YKUH+ssKbOgV3EHTTQ0NFm22bdWFQKgcMDbwKtQaGYu/TFefkEjsFeSleFFR06Qe/nmXOV9e3hJg7JYGhxLnhNPCN8kcf8iC7ipuwIM8LzZL79Xo7neX06N033Kv7uq8Ui3fwsxnx9vSUu1/7fTpmdKXzTdRbWVGTsYDUkXkEYx7NpStb8ObeIDoqtSVFDz5F9eEMDDjoMg+dI1YYfrCD9lBq/OL+5PTF2kNR69BFatwwOHs1lPmZ0+WmwanO4+BllmPL1ka7OHQ8WKGUpuw5gDzjKm0XH8jBN33CYsEOCR2UTEA3D9jAKGfWYWIPnIcD6VAjulgjT2Xp6WJyWQh+gN6ZUvzeLE3wjdPcLaE5uMKrGEpIG+v/rO3at39aoHTf/dnLlLRVFT07vNiUuGSjyp8S7HRfjFWhoriRFPf5hNnM= X-Forefront-Antispam-Report: CIP:198.47.23.194; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:lewvzet200.ext.ti.com; PTR:InfoDomainNonexistent; CAT:NONE; SFS:(13230040)(36860700016)(82310400026)(7416014)(376014)(1800799024)(921020)(18002099003)(18092099006)(56012099003)(22082099003); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DufytjRK8pycJlLlQ/Fr2iimwZas2T91pLLZ6yBQBv9WKmJO5VzzY63ngpUx1OtbMBn0F2xJ0UnsUQvdnBnlaIGa9ViP3Km+d8nc/P6vjaQSmnny8JyAlUbqSQpzjF47myFH+tA0tJebf2jkAup+mknkWa7ZSpOWWTTkhgBhIv+dqxbtrxkFW6rXHL62XpV2Z/tr9LjWfEzi1p8dBDPZtpPdk3MI81INS5bdxVM7cimMBgmAW+e5ToEdLOlZrkP3ND9Oplg1mXGctxFvqftqcL252UgIHUfJccaD/Unc/+nZLPHPapYa705fHCpKo206PLpkjR0Ir4Fqod4Hm8X6jpkDSrWpmfU/XgGlH2vxgm1RCnIv2Q7M1vTR9aFlNdx99AKkj1qYsjn85bMjG1VjxmpfO+ypnLuF1gGhyAsUc0efVXrEu/j0O5jwsfNYYYlA X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Apr 2026 18:33:50.2448 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e609e2ef-ddb7-438a-6212-08dea6e70629 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7; Ip=[198.47.23.194]; Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CE6.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN0PR10MB4967 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" QWRkIGEgRFJNIGRyaXZlciBmb3IgdGhlIFNvbG9tb24gU3lzdGVjaCBTU0QxNnh4IGZhbWlseSBv ZiBlLXBhcGVyIGRpc3BsYXkKY29udHJvbGxlcnMgKFNTRDE2ODAgWzRdLCBTU0QxNjczIFszXSwg U1NEMTY4MSBbNV0sIFNTRDE2ODMgWzFdKSBiYXNlZAplLXBhcGVyIGRpc3BsYXkgcGFuZWxzLCBz dGFydGluZyB3aXRoIHN1cHBvcnQgZm9yIHRoZSBHb29kZGlzcGxheQpHREVZMDQyVDgxIHdoaWNo IGlzIDQuMiIsIDQwMHgzMDAgcmVzb2x1dGlvbiBibGFjay93aGl0ZSBlLXBhcGVyIGRpc3BsYXkK dXNpbmcgU1NEMTY4MyBjb250cm9sbGVyLgoKSGFyZHdhcmUgZmVhdHVyZXMgc3VwcG9ydGVkOgog IC0gU1BJIGNvbW11bmljYXRpb24gd2l0aCBvcHRpb25hbCBEL0MgR1BJTyAoNC13aXJlIG1vZGUp IG9yIDktYml0IFNQSQogICAgd2l0aCBlbWJlZGRlZCBEL0MjIGJpdCAoMy13aXJlIG1vZGUpIGNv bW1hbmQvZGF0YSBzaWduYWxpbmcKICAtIEJVU1kgR1BJTyBwb2xsaW5nIHdpdGggY29uZmlndXJh YmxlIHRpbWVvdXQKICAtIEhhcmR3YXJlIHJlc2V0IHZpYSBkZWRpY2F0ZWQgcmVzZXQgR1BJTwog IC0gSW50ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29yIHJlYWRvdXQKICAtIEJvcmRlciB3YXZlZm9y bSBjb250cm9sIHdpdGggMTAgY29uZmlndXJhYmxlIG1vZGVzOgogICAgTFVUMC0zIChHUyB0cmFu c2l0aW9uIHdhdmVmb3JtcyksIGZpeGVkIHZvbHRhZ2UgbGV2ZWxzIChWU1MvVlNIMS9WU0wvCiAg ICBWU0gyKSwgVkNPTSBmb2xsb3csIGFuZCBIaVogKGZsb2F0aW5nLCBkZWZhdWx0KQogIC0gRGVl cCBzbGVlcCBtb2RlczogTW9kZSAxIChSQU0gcmV0YWluZWQpIGFuZCBNb2RlIDIgKFJBTSBsb3N0 KQogIC0gRGF0YSBlbnRyeSBtb2RlcyBmb3IgYWxsIGZvdXIgb3JpZW50YXRpb25zCiAgLSBEdWFs IGRpc3BsYXkgUkFNIHBsYW5lczogQlcgUkFNIChwcmltYXJ5IGltYWdlKSBhbmQgUkVEIFJBTQog ICAgKHBhcnRpYWwgcmVmcmVzaCBiYXNlbGluZSAvIDMtY29sb3IgQldSIHJlZCBwaXhlbHMpCgpS ZWZyZXNoIG1vZGVzOgogIFRocmVlIGluZGVwZW5kZW50bHkgc2VsZWN0YWJsZSByZWZyZXNoIHdh dmVmb3JtczoKICAtIFBhcnRpYWwgKH4zMDAtNTAwIG1zKTogbG93LWxhdGVuY3kgQlcgdXBkYXRl IHVzaW5nIFJFRCBSQU0gYXMKICAgIHdhdmVmb3JtIHRyYW5zaXRpb24gYmFzZWxpbmUKICAtIEZ1 bGwgKH4xLjUtMiBzKTogY29tcGxldGUgcGl4ZWwtY3ljbGUgcmVzZXQgd2l0aCB0ZW1wZXJhdHVy ZS0KICAgIGNvbXBlbnNhdGVkIExVVCByZWxvYWQKICAtIEZhc3QgKH4xLjAtMS41IHMpOiBhYmJy ZXZpYXRlZCB3YXZlZm9ybSB1c2luZyBhIHByZS1sb2FkZWQgTFVUCgpQaXhlbCBmb3JtYXQgY29u dmVyc2lvbnM6CiAgVGhlIGRyaXZlciBhY2NlcHRzIGFsbCBjb21tb24gRFJNIGZvcm1hdHMgYW5k IGNvbnZlcnRzIHRvIDFicHA6CiAgLSBSMSAobmF0aXZlIDFicHApLCBjb2xvciBmb3JtYXRzIChY UkdCODg4OCwgUkdCODg4LCBSR0I1NjUpLAogICAgcGFja2VkIFlVViAoWVVZViwgVVlWWSksIHBs YW5hciBZVVYgKE5WMTIsIE5WMTYpLCBncmF5c2NhbGUgKFI4KQogIC0gMy1jb2xvciBCV1I6IGNs YXNzaWZpZXMgcGl4ZWxzIGFzIGJsYWNrLCB3aGl0ZSwgb3IgcmVkIGJ5IGRvbWluYW50CiAgICBj aGFubmVsOyB3cml0ZXMgc2VwYXJhdGUgMWJwcCBCVyBhbmQgUkVEIGJ1ZmZlcnMKCk9yaWVudGF0 aW9uIC8gcm90YXRpb246CiAgLSBGdWxsIDQtd2F5IHJvdGF0aW9uOiAwwrAgKGxhbmRzY2FwZSks IDkwwrAgKHBvcnRyYWl0IENXKSwKICAgIDE4MMKwIChsYW5kc2NhcGUgaW52ZXJ0ZWQpLCAyNzDC sCAocG9ydHJhaXQgQ0NXKQogIC0gSW1wbGVtZW50ZWQgdmlhIHRoZSBEYXRhIEVudHJ5IE1vZGUg cmVnaXN0ZXIg4oCUIG5vIEdQVSBvciBtZW1vcnkKICAgIHJvdGF0aW9uIG92ZXJoZWFkCiAgLSBD b25maWd1cmFibGUgdmlhIGRldmljZSB0cmVlICdyb3RhdGlvbicgcHJvcGVydHksIG1vZHVsZSBw YXJhbWV0ZXIKICAgIChvdmVycmlkZXMgRFQpLCBvciBydW50aW1lIERSTSBjb25uZWN0b3IgcHJv cGVydHkgKGhpZ2hlc3QgcHJpb3JpdHkpCgpEUk0gZnJhbWV3b3JrIGludGVncmF0aW9uOgogIC0g ZHJtX2F0b21pY19oZWxwZXItYmFzZWQgbW9kZXNldHRpbmcgd2l0aCBkYW1hZ2UgdHJhY2tpbmcK ICAtIFNpbmdsZSBwcmltYXJ5IHBsYW5lLCBDUlRDLCBzaW1wbGUgZW5jb2RlciwgU1BJIGNvbm5l Y3RvcgogIC0gZHJtX2dlbV9kbWEgYmFja2VuZCBmb3IgcGh5c2ljYWxseSBjb250aWd1b3VzIFNQ SSBETUEgYnVmZmVycwogIC0gZmJkZXYgZmFsbGJhY2sgdmlhIERSTV9GQkRFVl9ETUFfRFJJVkVS X09QUwoKRS1wYXBlciBwYW5lbHMgYXJlIGJpc3RhYmxlOiB0aGV5IHJldGFpbiB0aGUgbGFzdCBk aXNwbGF5ZWQgaW1hZ2UKaW5kZWZpbml0ZWx5IHdpdGhvdXQgcG93ZXIuICBHaG9zdGluZyBhcnRl ZmFjdHMgbWF5IGFjY3VtdWxhdGUgb3ZlciB0aW1lLAphbmQgYmFzZWQgb24gdXNlciBwb2xpY3kg dGhlIGRyaXZlciBjYW4gc3dpdGNoIHRvIGEgZnVsbCByZWZyZXNoIG1vZGUgdG8KY2xlYXIgdGhl bS4gIFNpbWlsYXJseSwgYmFzZWQgb24gdXNlciBwb2xpY3ksIHRoZSBkcml2ZXIgY2FuIGNsZWFy IHRoZQpzY3JlZW4gb24gZXZlcnkgYXBwbGljYXRpb24gc3RhcnQgb3Igc3RvcCB0byBwcm92aWRl IGEgY2xlYW4gc2xhdGUgZm9yIHRoZQpuZXh0IGFwcGxpY2F0aW9uIGFsdGhvdWdoIHNvbWUgYXBw bGljYXRpb25zIG1heSByZXF1aXJlIHByZXNlcnZpbmcgdGhlCmxhc3QgZGlzcGxheWVkIGNvbnRl eHQgd2hlbiBnb2luZyB0byBzdXNwZW5kIG9yIGV4aXRpbmcuICBUbyBwcm92aWRlIHN1Y2gKZmxl eGliaWxpdHksIHRoZSBkcml2ZXIgaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nIERSTSBjb25uZWN0 b3IgcHJvcGVydGllcwphbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHBhcmFtZXRlcnM6 CgpEUk0gY29ubmVjdG9yIHByb3BlcnRpZXMgKHJ1bnRpbWUgY29uZmlndXJhYmxlKToKICAtIHJv dGF0aW9uOiBEaXNwbGF5IG9yaWVudGF0aW9uIGluIGRlZ3JlZXMgKDAsIDkwLCAxODAsIDI3MCku CgogIC0gcmVmcmVzaF9tb2RlOiBTZWxlY3QgdXBkYXRlIHdhdmVmb3JtICgwPXBhcnRpYWwsIDE9 ZnVsbCwgMj1mYXN0KS4KICAgIEFmZmVjdHMgYWxsIHN1YnNlcXVlbnQgZnJhbWVzIHVudGlsIGNo YW5nZWQuCgogIC0gcmVmcmVzaF9tb2RlX2luaXQ6IFdhdmVmb3JtIGZvciB0aGUgZmlyc3QgZnJh bWUgYWZ0ZXIgQ1JUQyBlbmFibGUgb3IgYQogICAgbmV3IERSTSBtYXN0ZXIgdGFraW5nIGNvbnRy b2wgKDA9ZGlzYWJsZWQsIDE9cGFydGlhbCwgMj1mdWxsLCAzPWZhc3QpLgogICAgQWZ0ZXIgdGhl IGZpcnN0IGZyYW1lIHRoZSBkcml2ZXIgcmV2ZXJ0cyB0byByZWZyZXNoX21vZGUuICBBcm1lZCB2 aWEKICAgIGRybV9kcml2ZXIubWFzdGVyX3NldDsgZGlzYXJtZWQgYnkgbWFzdGVyX2Ryb3AgaWYg dGhlIGNsaWVudCBleGl0cwogICAgd2l0aG91dCBzdWJtaXR0aW5nIGEgZnJhbWUuCgogIC0gY2xl YXJfb25faW5pdDogQ2xlYXIgZGlzcGxheSBvbiBmaXJzdCBEUk0gY2xpZW50IG9wZW4gKDA9ZGlz YWJsZWQsCiAgICAxPXBhcnRpYWwsIDI9ZnVsbCwgMz1mYXN0KS4KCiAgLSBjbGVhcl9vbl9jbG9z ZTogQ2xlYXIgZGlzcGxheSB3aGVuIHRoZSBkaXNwbGF5aW5nIGNsaWVudCBleGl0cwogICAgKDA9 ZGlzYWJsZWQsIDE9cGFydGlhbCwgMj1mdWxsLCAzPWZhc3QpLiBGaXJlcyB2aWEKICAgIGRybV9k cml2ZXIubWFzdGVyX2Ryb3Agd2hlbiBhIGNsaWVudCBkcm9wcyBEUk0gbWFzdGVyLgogICAgSXQg YWxzbyBkaXNhcm1zIGluaXRfcmVmcmVzaF9wZW5kaW5nIHNvIG5vIHN0YWxlIGluaXQgcmVmcmVz aCBsZWFrcyB0bwogICAgdGhlIG5leHQgY2xpZW50LgoKICAtIGNsZWFyX29uX2Rpc2FibGU6IENs ZWFyIGRpc3BsYXkgb24gQ1JUQyBkaXNhYmxlIC8gRFBNUyBvZmYKICAgICgwPWRpc2FibGVkLCAx PXBhcnRpYWwsIDI9ZnVsbCwgMz1mYXN0KS4gRmlyZXMgdmlhCiAgICBjcnRjX2F0b21pY19kaXNh YmxlLiBJbmRlcGVuZGVudCBvZiBjbGVhcl9vbl9jbG9zZSDigJQgYQogICAgZGlzcGxheV9jbGVh cmVkX29uX2RlaW5pdCBndWFyZCBwcmV2ZW50cyBhIHJlZHVuZGFudCBzZWNvbmQgY2xlYXIKICAg IHdoZW4gYm90aCBmaXJlIGZvciB0aGUgc2FtZSBzZXNzaW9uIChlLmcuIGNvbXBvc2l0b3IgZG9l cyBEUE1TIG9mZgogICAgdGhlbiBleGl0cykuCgogIC0gY29sb3JfbW9kZTogU2VsZWN0cyB3aGV0 aGVyIGEgcmVkLXBsYW5lLWNhcGFibGUgcGFuZWwgaXMgZHJpdmVuIGluCiAgICAzLWNvbG9yIChi bGFjay93aGl0ZS9yZWQpIG9yIGJsYWNrLXdoaXRlLW9ubHkgbW9kZSAoMD1ibGFjay13aGl0ZSwK ICAgIDE9My1jb2xvcikuIDMtY29sb3IgaXMgb25seSB2YWxpZCBmb3IgcGFuZWxzIHdpdGggcmVk IHBsYW5lIHN1cHBvcnQ7CiAgICBibGFjay13aGl0ZSBtb2RlIGJ5cGFzc2VzIHRoZSBSRUQgUkFN IHJlZ2FyZGxlc3Mgb2YgcGFuZWwgY2FwYWJpbGl0eSwKICAgIGFsbG93aW5nIGEgQldSIHBhbmVs IHRvIGJlIGRyaXZlbiBhcyBhIGZhc3RlciBCVyBkaXNwbGF5LgoKICAtIGJvcmRlcl93YXZlZm9y bV9pbml0OiBCb3JkZXIgd2F2ZWZvcm0gZHVyaW5nIGNsZWFyL2luaXQgb3BlcmF0aW9ucwogICAg KGVudW0gMC05OiBMVVQwLTMsIFZTUywgVlNIMSwgVlNMLCBWU0gyLCBWQ09NLCBIaVopLgoKICAt IGJvcmRlcl93YXZlZm9ybV9yZWZyZXNoOiBCb3JkZXIgd2F2ZWZvcm0gZHVyaW5nIGRpc3BsYXkg dXBkYXRlcwogICAgKGVudW0gMC05LCBzYW1lIHZhbHVlcykuCgogIC0gYm9yZGVyX3JlZnJlc2hf b25fZXZlcnlfdXBkYXRlOiBXaGVuIGRpc2FibGVkLCBib3JkZXIgd2F2ZWZvcm0KICAgIGNvbW1h bmQgaXMgc2VudCBvbmx5IHdoZW4gdGhlIGJvcmRlciBzdGF0ZSBjaGFuZ2VzICgwPWRpc2FibGVk LAogICAgMT1lbmFibGVkKS4KCk1vZHVsZSBwYXJhbWV0ZXJzIChvdmVycmlkZSBEVCAvIHBhbmVs IGNvbmZpZyBkZWZhdWx0cyk6CiAgRWFjaCBEUk0gY29ubmVjdG9yIHByb3BlcnR5IGFib3ZlIGhh cyBhIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHBhcmFtZXRlcgp0aGF0IHNldHMgaXRzIGluaXRpYWwg dmFsdWUgYXQgbG9hZCB0aW1lLCBwcm92aWRpbmcgdGhlIHNhbWUgY29udHJvbCB2aWEKc3lzZnMg YW5kIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIHdpdGhvdXQgcmVxdWlyaW5nIGEgRFJNLWNhcGFi bGUgdXNlcnNwYWNlCm9yIGhhbmRsaW5nLiAgQWxsIHBhcmFtZXRlcnMgZGVmYXVsdCB0byAtMSAo dXNlIHBhbmVsIGNvbmZpZyBkZWZhdWx0KSBzbwp0aGF0IGEgYmFyZSBpbnNtb2Qgd2l0aCBubyBh cmd1bWVudHMgd29ya3MgY29ycmVjdGx5IG91dCBvZiB0aGUgYm94LgoKTGlua3M6ClsxXSA6IGh0 dHBzOi8vd3d3LmNyeXN0YWxmb250ei5jb20vY29udHJvbGxlcnMvU29sb21vblN5c3RlY2gvU1NE MTY4MwpbMl0gOiBodHRwczovL2ZpbGVzLnNlZWVkc3R1ZGlvLmNvbS93aWtpL090aGVyX0Rpc3Bs YXkvNDItZXBhcGVyL0dERVkwNDJUODEucGRmClszXSA6IGh0dHBzOi8vd3d3LmNyeXN0YWxmb250 ei5jb20vY29udHJvbGxlcnMvU29sb21vblN5c3RlY2gvU1NEMTY3MwpbNF0gOiBodHRwczovL3d3 dy5jcnlzdGFsZm9udHouY29tL2NvbnRyb2xsZXJzL1NvbG9tb25TeXN0ZWNoL1NTRDE2ODAKWzVd IDogaHR0cHM6Ly93d3cuY3J5c3RhbGZvbnR6LmNvbS9jb250cm9sbGVycy9Tb2xvbW9uU3lzdGVj aC9TU0QxNjgxCgpTaWduZWQtb2ZmLWJ5OiBEZXZhcnNoIFRoYWtrYXIgPGRldmFyc2h0QHRpLmNv bT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vdGlueS9LY29uZmlnICAgICAgICAgfCAgIDEzICsKIGRy aXZlcnMvZ3B1L2RybS90aW55L01ha2VmaWxlICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUv ZHJtL3RpbnkvcGFuZWwtc3NkMTZ4eC5jIHwgMjU0OCArKysrKysrKysrKysrKysrKysrKysrKysr KwogMyBmaWxlcyBjaGFuZ2VkLCAyNTYyIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vdGlueS9wYW5lbC1zc2QxNnh4LmMKCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vdGlueS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL3RpbnkvS2NvbmZpZwpp bmRleCBmMGU3MmQ0YjZhNDcuLmQyNTM2Mzk2MmExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUv ZHJtL3RpbnkvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGlueS9LY29uZmlnCkBAIC0y MTUsMyArMjE1LDE2IEBAIGNvbmZpZyBUSU5ZRFJNX1NIQVJQX01FTU9SWQogCSAgKiA0LjQwIiBT aGFycCBNZW1vcnkgTENEIChMUzA0NFE3REgwMSkKIAogCSAgSWYgTSBpcyBzZWxlY3RlZCB0aGUg bW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNoYXJwX21lbW9yeS4KKworY29uZmlnIERSTV9QQU5FTF9T U0QxNlhYCisJdHJpc3RhdGUgIkRSTSBzdXBwb3J0IGZvciBTb2xvbW9uIFNTRDE2eHggZS1pbmsg ZGlzcGxheSBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIERSTSAmJiBTUEkKKwlzZWxlY3QgRFJN X0NMSUVOVF9TRUxFQ1RJT04KKwlzZWxlY3QgRFJNX0tNU19IRUxQRVIKKwlzZWxlY3QgRFJNX0dF TV9ETUFfSEVMUEVSCisJaGVscAorCSAgRFJNIGRyaXZlciBmb3IgU29sb21vbiBTU0QxNnh4IGZh bWlseSBlLWluayBkaXNwbGF5IGNvbnRyb2xsZXJzCisJICAoU1NEMTY4MCwgU1NEMTY4MSwgU1NE MTY4MykuIFN1cHBvcnRzIHRoZSBHREVZMDQyVDgxIDQuMiIgNDAweDMwMAorCSAgbW9ub2Nocm9t ZSBlLWluayBwYW5lbC4KKworCSAgSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUg Y2FsbGVkIHBhbmVsLXNzZDE2eHguCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdGlueS9N YWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90aW55L01ha2VmaWxlCmluZGV4IDQ4ZDMwYmY2MTUy Zi4uM2YyNGU1YzZhNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdGlueS9NYWtlZmls ZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdGlueS9NYWtlZmlsZQpAQCAtMTUsMyArMTUsNCBAQCBv YmotJChDT05GSUdfVElOWURSTV9JTEk5NDg2KQkJKz0gaWxpOTQ4Ni5vCiBvYmotJChDT05GSUdf VElOWURSTV9NSTAyODNRVCkJCSs9IG1pMDI4M3F0Lm8KIG9iai0kKENPTkZJR19USU5ZRFJNX1JF UEFQRVIpCQkrPSByZXBhcGVyLm8KIG9iai0kKENPTkZJR19USU5ZRFJNX1NIQVJQX01FTU9SWSkJ Kz0gc2hhcnAtbWVtb3J5Lm8KK29iai0kKENPTkZJR19EUk1fUEFORUxfU1NEMTZYWCkJCSs9IHBh bmVsLXNzZDE2eHgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RpbnkvcGFuZWwtc3Nk MTZ4eC5jIGIvZHJpdmVycy9ncHUvZHJtL3RpbnkvcGFuZWwtc3NkMTZ4eC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYjIzMjgzN2M1NGZmCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9ncHUvZHJtL3RpbnkvcGFuZWwtc3NkMTZ4eC5jCkBAIC0wLDAgKzEsMjU0 OCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQorLyoKKyAqIERS TSBkcml2ZXIgZm9yIGUtcGFwZXIgZGlzcGxheSBwYW5lbHMgdXNpbmcgU29sb21vbiBTU0QxNnh4 IGZhbWlseSBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAyNiBUZXhhcyBJbnN0 cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwczovL3d3dy50aS5jb20vCisgKgorICogQXV0aG9y OiBEZXZhcnNoIFRoYWtrYXIgPGRldmFyc2h0QHRpLmNvbT4KKyAqCisgKiBSZWZlcmVuY2VzOiBo dHRwczovL2dpdGh1Yi5jb20vTGVzb3Jkcy9lcGFwZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgv ZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5o PgorI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5o PgorCisjaW5jbHVkZSA8ZHJtL2NsaWVudHMvZHJtX2NsaWVudF9zZXR1cC5oPgorI2luY2x1ZGUg PGRybS9kcm1fYXRvbWljLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVyLmg+Cisj aW5jbHVkZSA8ZHJtL2RybV9kYW1hZ2VfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9kcnYu aD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZiX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZmJk ZXZfZG1hLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mYl9kbWFfaGVscGVyLmg+CisjaW5jbHVkZSA8 ZHJtL2RybV9mcmFtZWJ1ZmZlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2RtYV9oZWxwZXIu aD4KKyNpbmNsdWRlIDxkcm0vZHJtX2dlbV9mcmFtZWJ1ZmZlcl9oZWxwZXIuaD4KKyNpbmNsdWRl IDxkcm0vZHJtX3Byb2JlX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fc2ltcGxlX2ttc19o ZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+CisKK3N0YXRpYyBpbnQgcm90YXRp b24gPSAtMTsKK21vZHVsZV9wYXJhbShyb3RhdGlvbiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJN X0RFU0Mocm90YXRpb24sCisJCSAiRGlzcGxheSByb3RhdGlvbiAoLTE9dXNlIERULCAwLzE4MD1s YW5kc2NhcGUsIDkwLzI3MD1wb3J0cmFpdCkiKTsKKworc3RhdGljIGludCByZWZyZXNoX21vZGUg PSAtMTsKK21vZHVsZV9wYXJhbShyZWZyZXNoX21vZGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFS TV9ERVNDKHJlZnJlc2hfbW9kZSwKKwkJICJSZWZyZXNoIG1vZGUgKC0xPXBhbmVsIGRlZmF1bHQs IDA9cGFydGlhbCB+MzAwLTUwMG1zLCAxPWZ1bGwgfjEuNS0ycywgMj1mYXN0IH4xLjAtMS41cyki KTsKKworc3RhdGljIGludCBib3JkZXJfd2F2ZWZvcm1faW5pdF9sdXQgPSAtMTsKK21vZHVsZV9w YXJhbShib3JkZXJfd2F2ZWZvcm1faW5pdF9sdXQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9E RVNDKGJvcmRlcl93YXZlZm9ybV9pbml0X2x1dCwKKwkJICJCb3JkZXIgd2F2ZWZvcm0gaW5kZXgg ZHVyaW5nIGNsZWFyL2luaXQgKC0xPXBhbmVsIGRlZmF1bHQsIDAtOT1lbnVtIGluZGV4KSIpOwor CitzdGF0aWMgaW50IGJvcmRlcl93YXZlZm9ybV9sdXQgPSAtMTsKK21vZHVsZV9wYXJhbShib3Jk ZXJfd2F2ZWZvcm1fbHV0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhib3JkZXJfd2F2 ZWZvcm1fbHV0LAorCQkgIkJvcmRlciB3YXZlZm9ybSBpbmRleCBkdXJpbmcgZGlzcGxheSB1cGRh dGVzICgtMT1wYW5lbCBkZWZhdWx0LCAwLTk9ZW51bSBpbmRleCkiKTsKKworc3RhdGljIGJvb2wg Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlOworbW9kdWxlX3BhcmFtKGJvcmRlcl9yZWZy ZXNoX29uX2V2ZXJ5X3VwZGF0ZSwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJvcmRl cl9yZWZyZXNoX29uX2V2ZXJ5X3VwZGF0ZSwKKwkJICJSZS1zZW5kIGJvcmRlciB3YXZlZm9ybSBj b21tYW5kIGJlZm9yZSBlYWNoIGRpc3BsYXkgdXBkYXRlIChkZWZhdWx0OiBmYWxzZSkiKTsKKwor c3RhdGljIGludCBjbGVhcl9vbl9pbml0ID0gLTE7Cittb2R1bGVfcGFyYW0oY2xlYXJfb25faW5p dCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2xlYXJfb25faW5pdCwKKwkJICJDbGVh ciBkaXNwbGF5IG9uIGZpcnN0IGFwcCBsYXVuY2ggKC0xPWRpc2FibGVkLCAwPXBhcnRpYWwsIDE9 ZnVsbCwgMj1mYXN0KSIpOworCitzdGF0aWMgaW50IGNsZWFyX29uX2Nsb3NlID0gLTE7Cittb2R1 bGVfcGFyYW0oY2xlYXJfb25fY2xvc2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNs ZWFyX29uX2Nsb3NlLAorCQkgIkNsZWFyIGRpc3BsYXkgb24gYXBwIGNsb3NlL0NSVEMgZGlzYWJs ZSAoLTE9ZGlzYWJsZWQsIDA9cGFydGlhbCwgMT1mdWxsLCAyPWZhc3QpIik7CisKK3N0YXRpYyBp bnQgY2xlYXJfb25fZGlzYWJsZSA9IC0xOworbW9kdWxlX3BhcmFtKGNsZWFyX29uX2Rpc2FibGUs IGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsZWFyX29uX2Rpc2FibGUsCisJCSAiQ2xl YXIgZGlzcGxheSBvbiBDUlRDIGRpc2FibGUvRFBNUyBvZmYgKC0xPWRpc2FibGVkLCAwPXBhcnRp YWwsIDE9ZnVsbCwgMj1mYXN0KSIpOworCitzdGF0aWMgaW50IHJlZnJlc2hfbW9kZV9pbml0ID0g LTE7Cittb2R1bGVfcGFyYW0ocmVmcmVzaF9tb2RlX2luaXQsIGludCwgMDY0NCk7CitNT0RVTEVf UEFSTV9ERVNDKHJlZnJlc2hfbW9kZV9pbml0LAorCQkgIlNraXAgYmFzZWxpbmUgZXN0YWJsaXNo bWVudCBvbiBmaXJzdCBlbmFibGUgKC0xPWRpc2FibGVkLCAwPXBhcnRpYWwsIDE9ZnVsbCwgMj1m YXN0KSIpOworCitzdGF0aWMgaW50IGNvbG9yX21vZGUgPSAtMTsKK21vZHVsZV9wYXJhbShjb2xv cl9tb2RlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb2xvcl9tb2RlLAorCQkgIkNv bG9yIG1vZGUgKC0xPXBhbmVsIGRlZmF1bHQsIDA9YmxhY2std2hpdGUsIDE9My1jb2xvcjsgMy1j b2xvciBvbmx5IHZhbGlkIGZvciBwYW5lbHMgd2l0aCByZWQgcGxhbmUgc3VwcG9ydCkiKTsKKwor LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNTRDE2eHggZmFtaWx5IGNvbW1vbjogY29tbWFuZHMsIGRh dGEgdmFsdWVzLCBhbmQgYml0IGRlZmluaXRpb25zLgorICogVGhlc2UgYXBwbHkgZXF1YWxseSB0 byBTU0QxNjczLCBTU0QxNjgwLCBhbmQgU1NEMTY4My4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8K KworLyogU1BJIGNvbW1hbmQgY29kZXMgKGNvbW1vbikgKi8KKyNkZWZpbmUgU1NEMTZYWF9DTURf RFJJVkVSX09VVFBVVF9DT05UUk9MCQkweDAxCisjZGVmaW5lIFNTRDE2WFhfQ01EX0RBVEFfRU5U UllfTU9ERQkJCTB4MTEKKyNkZWZpbmUgU1NEMTZYWF9DTURfU1dfUkVTRVQJCQkJMHgxMgorI2Rl ZmluZSBTU0QxNlhYX0NNRF9NQVNURVJfQUNUSVZBVElPTgkJCTB4MjAKKyNkZWZpbmUgU1NEMTZY WF9DTURfRElTUExBWV9VUERBVEVfQ09OVFJPTDEJCTB4MjEKKyNkZWZpbmUgU1NEMTZYWF9DTURf RElTUExBWV9VUERBVEVfQ09OVFJPTDIJCTB4MjIKKyNkZWZpbmUgU1NEMTZYWF9DTURfV1JJVEVf UkFNX0JXCQkJMHgyNAorI2RlZmluZSBTU0QxNlhYX0NNRF9CT1JERVJfV0FWRUZPUk1fQ09OVFJP TAkJMHgzQworI2RlZmluZSBTU0QxNlhYX0NNRF9TRVRfUkFNX1hfQUREUkVTU19TVEFSVF9FTkQJ CTB4NDQKKyNkZWZpbmUgU1NEMTZYWF9DTURfU0VUX1JBTV9ZX0FERFJFU1NfU1RBUlRfRU5ECQkw eDQ1CisjZGVmaW5lIFNTRDE2WFhfQ01EX1NFVF9SQU1fWF9BRERSRVNTX0NPVU5URVIJCTB4NEUK KyNkZWZpbmUgU1NEMTZYWF9DTURfU0VUX1JBTV9ZX0FERFJFU1NfQ09VTlRFUgkJMHg0RgorCisv KgorICogRGF0YSBFbnRyeSBNb2RlIChjb21tYW5kIDB4MTEpIEFNL0lEWS9JRFggYml0IGVuY29k aW5nIChjb21tb24pLgorICoKKyAqIEJpdCAyIChBTSk6IEFkZHJlc3MgdXBkYXRlIGRpcmVjdGlv bjogMCA9IFggZGlyZWN0aW9uLCAxID0gWSBkaXJlY3Rpb24KKyAqIElEWzE6MF0gd2hlbiBBTT0w IChYLWRpcmVjdGlvbiBtb2RlcywgYWRkcmVzcyBjb3VudGVyIGFkdmFuY2VzIGluIFgpOgorICog ICAwMCA9IFggZGVjcmVtZW50LCBZIGRlY3JlbWVudCAgIDAxID0gWCBpbmNyZW1lbnQsIFkgZGVj cmVtZW50CisgKiAgIDEwID0gWCBkZWNyZW1lbnQsIFkgaW5jcmVtZW50ICAgMTEgPSBYIGluY3Jl bWVudCwgWSBpbmNyZW1lbnQgKGRlZmF1bHQpCisgKgorICogUm90YXRpb24gdG8gZGF0YSBlbnRy eSBtb2RlIG1hcHBpbmcgKGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB1c2VzIHR3byBtb2RlcywKKyAq IHdpdGggc2NhbiBkaXJlY3Rpb24gY29udHJvbGxlZCB2aWEgUkFNIGN1cnNvciBwb3NpdGlvbmlu ZyBhbmQgbWFudWFsIHR3ZWFraW5nKToKKyAqICAgMMKwLzI3MMKwIOKGkiAweDAzIChYKyssIFkr KykgICBMYW5kc2NhcGUvUG9ydHJhaXQtQ1c6IGN1cnNvciBhdCAoMCwgMCkKKyAqICAgOTDCsC8x ODDCsCDihpIgMHgwMCAoWC0tLCBZLS0pICBQb3J0cmFpdC1DQ1cvVXBzaWRlLWRvd246IGN1cnNv ciBhdCAobWF4LCBtYXgpCisgKgorICogVGhlIHBpeGVsIHBhY2tpbmcgaW4gY29udmVydF9mYl90 b18xYnBwIGlzIGdyb3VwZWQgYnkgcGh5c2ljYWwgbGF5b3V0OgorICogICAtIFBvcnRyYWl0ICg5 MMKwLzI3MMKwKTogY29sdW1uLW1ham9yIHBhY2tpbmcsIHJpZ2h0bW9zdCBjb2x1bW4gZmlyc3QK KyAqICAgLSBMYW5kc2NhcGUgKDDCsC8xODDCsCk6IHJvdy1tYWpvciBwYWNraW5nLCB0b3AgdG8g Ym90dG9tLCBsZWZ0IHRvIHJpZ2h0CisgKiBIYXJkd2FyZSBjdXJzb3IgcG9zaXRpb24gYW5kIHNj YW4gbW9kZSBoYW5kbGUgdGhlIGZpbmFsIG9yaWVudGF0aW9uLgorICovCisjZGVmaW5lIFNTRDE2 WFhfREFUQV9FTlRSWV9YREVDX1lERUMJCTB4MDAgIC8qIFgtLSwgWS0tIChYLW1vZGUpICovCisj ZGVmaW5lIFNTRDE2WFhfREFUQV9FTlRSWV9YSU5DX1lJTkMJCTB4MDMgIC8qIFgrKywgWSsrIChY LW1vZGUsIGRlZmF1bHQpICovCisKKy8qIFBPUiByZXNldCB2YWx1ZTogR0Q9MCAoRzAgZmlyc3Qp LCBTTT0wIChpbnRlcmxhY2VkKSwgVEI9MCAoRzAtPkcyOTkpICovCisjZGVmaW5lIFNTRDE2WFhf RFJJVkVSX09VVFBVVF9DVFJMX0RFRkFVTFQJMHgwMAorCisvKiBEaXNwbGF5IFVwZGF0ZSBDb250 cm9sIDEgKDB4MjEpIGJ5dGUgMiBkZWZhdWx0IChjb21tb24pICovCisjZGVmaW5lIFNTRDE2WFhf Q1RSTDFfQllURTJfREVGQVVMVAkJMHgwMAorCisvKgorICogRGlzcGxheSBVcGRhdGUgQ29udHJv bCAyICgweDIyKSBpbmRpdmlkdWFsIGJpdCBkZWZpbml0aW9ucyAoY29tbW9uKS4KKyAqIE5PVEU6 IEJJVCgzKSBpcyBOT1QgY29tbW9uIOKAlCBzZWUgU1NEMTY4M19DVFJMMl9NT0RFMiBpbiB0aGUg U1NEMTY4MworICogc2VjdGlvbiBiZWxvdzsgaXQgaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQg bWVhbmluZyBpbiBTU0QxNjczLgorICovCisjZGVmaW5lIFNTRDE2WFhfQ1RSTDJfRU5BQkxFX0NM SwkJQklUKDcpCisjZGVmaW5lIFNTRDE2WFhfQ1RSTDJfRU5BQkxFX0FOQUxPRwkJQklUKDYpCisj ZGVmaW5lIFNTRDE2WFhfQ1RSTDJfTE9BRF9URU1QRVJBVFVSRQkJQklUKDUpCisjZGVmaW5lIFNT RDE2WFhfQ1RSTDJfTE9BRF9MVVQJCQlCSVQoNCkKKyNkZWZpbmUgU1NEMTZYWF9DVFJMMl9ESVNQ TEFZCQkJQklUKDIpCisjZGVmaW5lIFNTRDE2WFhfQ1RSTDJfRElTQUJMRV9BTkFMT0cJCUJJVCgx KQorI2RlZmluZSBTU0QxNlhYX0NUUkwyX0RJU0FCTEVfQ0xLCQlCSVQoMCkKKworI2RlZmluZSBT U0QxNlhYX1NQSV9CSVRTX1BFUl9XT1JECQk4CisjZGVmaW5lIFNTRDE2WFhfU1BJX1NQRUVEX0RF RkFVTFQJCTEwMDAwMDAKKworLyogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBCVVNZIHBp biB0byBkZWFzc2VydCBhZnRlciBhIGRpc3BsYXkgdXBkYXRlICovCisjZGVmaW5lIFNTRDE2WFhf QlVTWV9XQUlUX1RJTUVPVVRfTVMJCTYwMDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNTRDE2 ODMgLyBTU0QxNjgwIHNwZWNpZmljOiBjb21tYW5kcywgZGF0YSB2YWx1ZXMsIGFuZCBiaXQgZGVm aW5pdGlvbnMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBEZWVwIFNsZWVwIE1v ZGUgdmFsdWVzIChjb21tYW5kIDB4MTApLgorICovCisjZGVmaW5lIFNTRDE2ODNfREVFUF9TTEVF UF9NT0RFXzEJCQkweDAxICAvKiBSQU0gcmV0YWluZWQgKi8KKyNkZWZpbmUgU1NEMTY4M19ERUVQ X1NMRUVQX01PREVfMgkJCTB4MDMgIC8qIFJBTSBsb3N0IChtYXggcG93ZXIpICovCisKKy8qCisg KiBUZW1wZXJhdHVyZSBTZW5zb3IgU2VsZWN0aW9uIChjb21tYW5kIDB4MTgpLgorICovCisjZGVm aW5lIFNTRDE2ODNfQ01EX1RFTVBFUkFUVVJFX1NFTlNPUl9DT05UUk9MCQkweDE4CisjZGVmaW5l IFNTRDE2ODNfVEVNUF9TRU5TT1JfSU5URVJOQUwJCQkweDgwICAvKiBCaXQgNzogdXNlIGludGVy bmFsIHNlbnNvciAqLworCisvKgorICogV3JpdGUgUkVEIFJBTSAoY29tbWFuZCAweDI2KS4KKyAq LworI2RlZmluZSBTU0QxNjgzX0NNRF9XUklURV9SQU1fUkVECQkJMHgyNgorCisvKgorICogQm9y ZGVyIFdhdmVmb3JtIENvbnRyb2wgKGNvbW1hbmQgMHgzQykgYnl0ZSB2YWx1ZXMuCisgKi8KKyNk ZWZpbmUgU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fTFVUMAkJMHgwMCAgLyogR1MgVHJhbnNpdGlv biBMVVQwIChibGFjaykgKi8KKyNkZWZpbmUgU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fTFVUMQkJ MHgwMSAgLyogR1MgVHJhbnNpdGlvbiBMVVQxICh3aGl0ZSkgKi8KKyNkZWZpbmUgU1NEMTY4M19C T1JERVJfV0FWRUZPUk1fTFVUMgkJMHgwMiAgLyogR1MgVHJhbnNpdGlvbiBMVVQyIChibGFjaykg Ki8KKyNkZWZpbmUgU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fTFVUMwkJMHgwMyAgLyogR1MgVHJh bnNpdGlvbiBMVVQzIChncmF5KSAqLworI2RlZmluZSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9G SVhMVkxfVlNTCTB4NDAgIC8qIEZpeCBMZXZlbCBWU1MgKDBWLCBibGFjaykgKi8KKyNkZWZpbmUg U1NEMTY4M19CT1JERVJfV0FWRUZPUk1fRklYTFZMX1ZTSDEJMHg1MCAgLyogRml4IExldmVsIFZT SDEgKCsxNVYsIGJsYWNrKSAqLworI2RlZmluZSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9GSVhM VkxfVlNMCTB4NjAgIC8qIEZpeCBMZXZlbCBWU0wgKC0xNVYsIHdoaXRlKSAqLworI2RlZmluZSBT U0QxNjgzX0JPUkRFUl9XQVZFRk9STV9GSVhMVkxfVlNIMgkweDcwICAvKiBGaXggTGV2ZWwgVlNI MiAoKzE1ViBhbHQsIGJsYWNrKSAqLworI2RlZmluZSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9W Q09NCQkweDgwICAvKiBGb2xsb3cgVkNPTSAoLTJWfi0zViwgcHJlc2VydmUpICovCisjZGVmaW5l IFNTRDE2ODNfQk9SREVSX1dBVkVGT1JNX0hJWgkJMHhDMCAgLyogSGlaIChmbG9hdGluZywgZGVm YXVsdCkgKi8KKworLyoKKyAqIERpc3BsYXkgVXBkYXRlIENvbnRyb2wgMSAoMHgyMSkgYnl0ZSAx IOKAlCBSRUQgUkFNIGNvbnRyb2wuCisgKi8KKyNkZWZpbmUgU1NEMTY4M19DVFJMMV9OT1JNQUwJ CQkweDAwICAvKiBCb3RoIEJXIGFuZCBSRUQgUkFNcyBlbmFibGVkICovCisjZGVmaW5lIFNTRDE2 ODNfQ1RSTDFfQllQQVNTX1JFRF9SQU0JCTB4NDAgIC8qIEJ5cGFzcyBSRUQgUkFNIChmb3JjZSBS RUQ9MCkgKi8KKworLyoKKyAqIERpc3BsYXkgVXBkYXRlIENvbnRyb2wgMiAoMHgyMikgQklUKDMp IOKAlCAiRGlzcGxheSBNb2RlIDIiIChwYXJ0aWFsL0JXKS4KKyAqLworI2RlZmluZSBTU0QxNjgz X0NUUkwyX01PREUyCQkJQklUKDMpCisKKy8qIENvbXBvc2l0ZSBDVFJMMiBzZXF1ZW5jZXMgZm9y IGVhY2ggcmVmcmVzaCBtb2RlICovCisjZGVmaW5lIFNTRDE2ODNfQ1RSTDJfRlVMTF9SRUZSRVNI IChTU0QxNlhYX0NUUkwyX0VOQUJMRV9DTEsgfCBcCisJCQkJICAgIFNTRDE2WFhfQ1RSTDJfRU5B QkxFX0FOQUxPRyB8IFwKKwkJCQkgICAgU1NEMTZYWF9DVFJMMl9MT0FEX1RFTVBFUkFUVVJFIHwg XAorCQkJCSAgICBTU0QxNlhYX0NUUkwyX0xPQURfTFVUIHwgXAorCQkJCSAgICBTU0QxNlhYX0NU UkwyX0RJU1BMQVkgfCBcCisJCQkJICAgIFNTRDE2WFhfQ1RSTDJfRElTQUJMRV9BTkFMT0cgfCBc CisJCQkJICAgIFNTRDE2WFhfQ1RSTDJfRElTQUJMRV9DTEspICAvKiAweEY3LCB+MS41LTJzICov CisKKyNkZWZpbmUgU1NEMTY4M19DVFJMMl9GQVNUX1JFRlJFU0ggKFNTRDE2WFhfQ1RSTDJfRU5B QkxFX0NMSyB8IFwKKwkJCQkgICAgU1NEMTZYWF9DVFJMMl9FTkFCTEVfQU5BTE9HIHwgXAorCQkJ CSAgICBTU0QxNlhYX0NUUkwyX0RJU1BMQVkgfCBcCisJCQkJICAgIFNTRDE2WFhfQ1RSTDJfRElT QUJMRV9BTkFMT0cgfCBcCisJCQkJICAgIFNTRDE2WFhfQ1RSTDJfRElTQUJMRV9DTEspICAvKiAw eEM3LCB+MS4wLTEuNXMgKi8KKworI2RlZmluZSBTU0QxNjgzX0NUUkwyX1BBUlRJQUxfUkVGUkVT SCAoU1NEMTZYWF9DVFJMMl9FTkFCTEVfQ0xLIHwgXAorCQkJCSAgICAgICBTU0QxNlhYX0NUUkwy X0VOQUJMRV9BTkFMT0cgfCBcCisJCQkJICAgICAgIFNTRDE2WFhfQ1RSTDJfTE9BRF9URU1QRVJB VFVSRSB8IFwKKwkJCQkgICAgICAgU1NEMTZYWF9DVFJMMl9MT0FEX0xVVCB8IFwKKwkJCQkgICAg ICAgU1NEMTY4M19DVFJMMl9NT0RFMiB8IFwKKwkJCQkgICAgICAgU1NEMTZYWF9DVFJMMl9ESVNQ TEFZIHwgXAorCQkJCSAgICAgICBTU0QxNlhYX0NUUkwyX0RJU0FCTEVfQU5BTE9HIHwgXAorCQkJ CSAgICAgICBTU0QxNlhYX0NUUkwyX0RJU0FCTEVfQ0xLKSAgLyogMHhGRiwgfjMwMC01MDBtcyAq LworCisvKgorICogU3RhbmRhbG9uZSBMVVQgcHJlLWxvYWQgc2VxdWVuY2UgKDB4OTEgPSBFTkFC TEVfQ0xLIHwgTE9BRF9MVVQgfCBMT0FEX1RFTVBFUkFUVVJFIHwKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTQUJMRV9DTEspLgorICogUHJlLWxvYWRzIHRo ZSBPVFAgTFVUIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGRpc3BsYXkgdXBkYXRlLiBSZXF1aXJlZCBm b3IKKyAqIEZBU1QgcmVmcmVzaCBtb2RlICgweEM3KSB3aGljaCBvbWl0cyBMT0FEX0xVVCBmcm9t IGVhY2ggdXBkYXRlIGN5Y2xlLgorICovCisjZGVmaW5lIFNTRDE2ODNfQ1RSTDJfTE9BRF9URU1Q X0xVVAkJKFNTRDE2WFhfQ1RSTDJfRU5BQkxFX0NMSyB8IFwKKwkJCQkJCSBTU0QxNlhYX0NUUkwy X0xPQURfTFVUIHwgXAorCQkJCQkJIFNTRDE2WFhfQ1RSTDJfTE9BRF9URU1QRVJBVFVSRSB8IFwK KwkJCQkJCSBTU0QxNlhYX0NUUkwyX0RJU0FCTEVfQ0xLKSAgLyogMHhCMSAqLworCitNT0RVTEVf SU1QT1JUX05TKCJETUFfQlVGIik7CisKK2VudW0gc3NkMTZ4eF9jb250cm9sbGVyIHsKKwlTU0Qx NjgzID0gMSwKK307CisKK2VudW0gc3NkMTZ4eF9tb2RlbCB7CisJR0RFWTA0MlQ4MSA9IDEsCit9 OworCitlbnVtIHNzZDE2eHhfcmVmcmVzaF9tb2RlIHsKKwlTU0QxNlhYX1JFRlJFU0hfUEFSVElB TCA9IDAsICAvKiBQYXJ0aWFsIHJlZnJlc2ggKH4zMDAtNTAwbXMpICovCisJU1NEMTZYWF9SRUZS RVNIX0ZVTEwsICAgICAgICAgLyogRnVsbCByZWZyZXNoICh+MS41LTJzKSAqLworCVNTRDE2WFhf UkVGUkVTSF9GQVNULCAgICAgICAgIC8qIEZhc3QgcmVmcmVzaCwgc2tpcCB0ZW1wIGxvYWQgKH4x LjAtMS41cykgKi8KK307CisKK2VudW0gc3NkMTZ4eF9jb2xvcl9tb2RlIHsKKwlTU0QxNlhYX0NP TE9SX01PREVfQlcgPSAwLCAgICAgLyogQmxhY2svd2hpdGUgb25seTsgUkVEIFJBTSBhbHdheXMg YnlwYXNzZWQgKi8KKwlTU0QxNlhYX0NPTE9SX01PREVfM0NPTE9SID0gMSwgLyogMy1jb2xvdXIg QldSOyBSRUQgUkFNIHVzZWQgZm9yIHJlZCBwaXhlbHMgKi8KK307CisKKy8qIEJvcmRlciB3YXZl Zm9ybSBlbnVtIGluZGljZXMgKDAtOSk7IG1hcHBlZCB0byBIVyBieXRlcyB2aWEKKyAqIGNvbnRy b2xsZXJfY2ZnLT5ib3JkZXJfd2F2ZWZvcm1fdGFibGVbXQorICovCitlbnVtIHNzZDE2eHhfYm9y ZGVyX3dhdmVmb3JtIHsKKwlTU0QxNlhYX0JPUkRFUl9MVVQwID0gMCwgIC8qIEdTIFRyYW5zaXRp b24gTFVUMCAoYmxhY2spICovCisJU1NEMTZYWF9CT1JERVJfTFVUMSwgICAgICAvKiBHUyBUcmFu c2l0aW9uIExVVDEgKHdoaXRlKSAqLworCVNTRDE2WFhfQk9SREVSX0xVVDIsICAgICAgLyogR1Mg VHJhbnNpdGlvbiBMVVQyIChibGFjaykgKi8KKwlTU0QxNlhYX0JPUkRFUl9MVVQzLCAgICAgIC8q IEdTIFRyYW5zaXRpb24gTFVUMyAoZ3JheSkgKi8KKwlTU0QxNlhYX0JPUkRFUl9WU1MsICAgICAg IC8qIEZpeCBMZXZlbCBWU1MgKGJsYWNrKSAqLworCVNTRDE2WFhfQk9SREVSX1ZTSDEsICAgICAg LyogRml4IExldmVsIFZTSDEgKGJsYWNrKSAqLworCVNTRDE2WFhfQk9SREVSX1ZTTCwgICAgICAg LyogRml4IExldmVsIFZTTCAod2hpdGUpICovCisJU1NEMTZYWF9CT1JERVJfVlNIMiwgICAgICAv KiBGaXggTGV2ZWwgVlNIMiAoYmxhY2spICovCisJU1NEMTZYWF9CT1JERVJfVkNPTSwgICAgICAv KiBGb2xsb3cgVkNPTSAocHJlc2VydmUpICovCisJU1NEMTZYWF9CT1JERVJfSElaLCAgICAgICAv KiBIaVogKGZsb2F0aW5nLCBkZWZhdWx0KSAqLworfTsKKworLyogU1NEMTY4My9TU0QxNjgwIGJv cmRlciB3YXZlZm9ybSBieXRlIGVuY29kaW5nIGZvciBjb21tYW5kIDB4M0MgKi8KK3N0YXRpYyBj b25zdCB1OCBzc2QxNjgzX2JvcmRlcl93YXZlZm9ybV90YWJsZVtdID0geworCVtTU0QxNlhYX0JP UkRFUl9MVVQwXSA9IFNTRDE2ODNfQk9SREVSX1dBVkVGT1JNX0xVVDAsCisJW1NTRDE2WFhfQk9S REVSX0xVVDFdID0gU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fTFVUMSwKKwlbU1NEMTZYWF9CT1JE RVJfTFVUMl0gPSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9MVVQyLAorCVtTU0QxNlhYX0JPUkRF Ul9MVVQzXSA9IFNTRDE2ODNfQk9SREVSX1dBVkVGT1JNX0xVVDMsCisJW1NTRDE2WFhfQk9SREVS X1ZTU10gID0gU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fRklYTFZMX1ZTUywKKwlbU1NEMTZYWF9C T1JERVJfVlNIMV0gPSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9GSVhMVkxfVlNIMSwKKwlbU1NE MTZYWF9CT1JERVJfVlNMXSAgPSBTU0QxNjgzX0JPUkRFUl9XQVZFRk9STV9GSVhMVkxfVlNMLAor CVtTU0QxNlhYX0JPUkRFUl9WU0gyXSA9IFNTRDE2ODNfQk9SREVSX1dBVkVGT1JNX0ZJWExWTF9W U0gyLAorCVtTU0QxNlhYX0JPUkRFUl9WQ09NXSA9IFNTRDE2ODNfQk9SREVSX1dBVkVGT1JNX1ZD T00sCisJW1NTRDE2WFhfQk9SREVSX0hJWl0gID0gU1NEMTY4M19CT1JERVJfV0FWRUZPUk1fSEla LAorfTsKKworc3RydWN0IHNzZDE2eHhfY29udHJvbGxlcl9jb25maWcgeworCXUxNiBtYXhfd2lk dGg7CisJdTE2IG1heF9oZWlnaHQ7CisJdTggcmFtX3hfYWRkcmVzc19iaXRzOworCXU4IHJhbV95 X2FkZHJlc3NfYml0czsKKworCS8qCisJICogaGFzX3RlbXBfc2Vuc29yX2N0cmw6IGNvbnRyb2xs ZXIgc3VwcG9ydHMgY29tbWFuZCAweDE4IChUZW1wZXJhdHVyZQorCSAqIFNlbnNvciBTZWxlY3Rp b24pLiAgUHJlc2VudCBpbiBTU0QxNjgzL1NTRDE2ODA7IGFic2VudCBpbiBTU0QxNjczCisJICog d2hpY2ggdXNlcyBjb21tYW5kIDB4MUEgKGRpcmVjdCB0ZW1wZXJhdHVyZSB3cml0ZSkgaW5zdGVh ZC4KKwkgKi8KKwlib29sIGhhc190ZW1wX3NlbnNvcl9jdHJsOworCisJLyoKKwkgKiBEZWVwIHNs ZWVwIG1vZGUgYnl0ZSB2YWx1ZXMgZm9yIGNvbW1hbmQgMHgxMC4KKwkgKiAgIGRlZXBfc2xlZXBf bW9kZV9sZXZlbDE6IGxvd2VyLXBvd2VyIHNsZWVwLCBSQU0gY29udGVudCByZXRhaW5lZAorCSAq ICAgICAoTU9ERV8xIG9uIFNTRDE2ODMvU1NEMTY4MDsgdXNlZCBmb3IgcnVudGltZSBpZGxlIC8g YXBwLWNsb3NlKS4KKwkgKiAgIGRlZXBfc2xlZXBfbW9kZV9sZXZlbDI6IG1heGltdW0gcG93ZXIg c2F2aW5ncywgUkFNIG1heSBiZSBsb3N0CisJICogICAgIChNT0RFXzIgb24gU1NEMTY4My9TU0Qx NjgwOyB1c2VkIGZvciBzeXN0ZW0gc3VzcGVuZCkuCisJICogQ2hpcHMgd2l0aCBhIHNpbmdsZSBz bGVlcCBtb2RlIHNldCBib3RoIGZpZWxkcyB0byB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwl1OCBk ZWVwX3NsZWVwX21vZGVfbGV2ZWwxOworCXU4IGRlZXBfc2xlZXBfbW9kZV9sZXZlbDI7CisKKwkv KgorCSAqIGJvcmRlcl93YXZlZm9ybV90YWJsZTogY2hpcC1zcGVjaWZpYyBieXRlIHZhbHVlcyBm b3IgdGhlIDEwIGxvZ2ljYWwKKwkgKiBib3JkZXIgd2F2ZWZvcm0gbW9kZXMgKGluZGV4ZWQgYnkg ZW51bSBzc2QxNnh4X2JvcmRlcl93YXZlZm9ybSkuCisJICogVGhlIGVuY29kaW5nIG9mIGNvbW1h bmQgMHgzQyBkaWZmZXJzIGJldHdlZW4gU1NEMTY4My9TU0QxNjgwIGFuZAorCSAqIFNTRDE2NzMs IHNvIGVhY2ggY29udHJvbGxlciBwcm92aWRlcyBpdHMgb3duIHRyYW5zbGF0aW9uIHRhYmxlLgor CSAqLworCWNvbnN0IHU4ICpib3JkZXJfd2F2ZWZvcm1fdGFibGU7CisKKwkvKgorCSAqIERpc3Bs YXkgVXBkYXRlIENvbnRyb2wgMSAoY21kIDB4MjEpIGJ5dGUgMSB2YWx1ZXMuCisJICogY3RybDFf bm9ybWFsOiAgICAgICAgIGJvdGggQlcgYW5kIFJFRCBSQU1zIHBhcnRpY2lwYXRlIGluIHRoZSB3 YXZlZm9ybS4KKwkgKiBjdHJsMV9ieXBhc3NfcmVkX3JhbTogUkVEIFJBTSBieXBhc3NlZDsgd2F2 ZWZvcm0gZHJpdmVuIGZyb20gQlcgUkFNIG9ubHkuCisJICogU1NEMTY3MyBoYXMgbm8gUkVEIFJB TSBzbyBib3RoIGZpZWxkcyBjYXJyeSB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwl1OCBjdHJsMV9u b3JtYWw7CisJdTggY3RybDFfYnlwYXNzX3JlZF9yYW07CisKKwkvKgorCSAqIERpc3BsYXkgVXBk YXRlIENvbnRyb2wgMiAoY21kIDB4MjIpIGNvbXBvc2l0ZSBzZXF1ZW5jZXMgZm9yIGVhY2gKKwkg KiByZWZyZXNoIG1vZGUgKGluZGV4ZWQgYnkgZW51bSBzc2QxNnh4X3JlZnJlc2hfbW9kZSkgYW5k IHRoZQorCSAqIHN0YW5kYWxvbmUgTFVUIHByZS1sb2FkIHNlcXVlbmNlIHVzZWQgYmVmb3JlIGZh c3QgcmVmcmVzaC4KKwkgKiBWYWx1ZXMgZGlmZmVyIGJldHdlZW4gU1NEMTY4My9TU0QxNjgwIGFu ZCBTU0QxNjczIChNT0RFMiBiaXQsIGV0Yy4pLgorCSAqLworCXU4IGN0cmwyX3JlZnJlc2hbM107 ICAgICAvKiBpbmRleGVkIGJ5IFNTRDE2WFhfUkVGUkVTSF9QQVJUSUFML0ZVTEwvRkFTVCAqLwor CXU4IGN0cmwyX2xvYWRfdGVtcF9sdXQ7ICAvKiBzdGFuZGFsb25lIExVVCBwcmUtbG9hZCAobm8g ZGlzcGxheSB1cGRhdGUpICovCit9OworCitzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbF9jb25maWcgewor CS8qIERhdGEgRW50cnkgTW9kZSAtIGNvbnRyb2xzIFgvWSBpbmNyZW1lbnQgZGlyZWN0aW9uIGZv ciBsYW5kc2NhcGUgKDDCsCkgKi8KKwl1OCBkYXRhX2VudHJ5X21vZGU7CisKKwkvKiBEcml2ZXIg T3V0cHV0IENvbnRyb2wgLSB0aGlyZCBieXRlIChzY2FuIGRpcmVjdGlvbikgKi8KKwl1OCBkcml2 ZXJfb3V0cHV0X2N0cmxfYnl0ZTM7CisKKwkvKiBEZWZhdWx0IHJlZnJlc2ggbW9kZSBmb3IgdGhp cyBwYW5lbCAqLworCWVudW0gc3NkMTZ4eF9yZWZyZXNoX21vZGUgZGVmYXVsdF9yZWZyZXNoX21v ZGU7CisKKwkvKiBEZWZhdWx0IGJvcmRlciB3YXZlZm9ybSBkdXJpbmcgY2xlYXIvaW5pdCAoZW51 bSBpbmRleCAwLTkpICovCisJZW51bSBzc2QxNnh4X2JvcmRlcl93YXZlZm9ybSBkZWZhdWx0X2Jv cmRlcl93YXZlZm9ybV9pbml0OworCisJLyogRGVmYXVsdCBib3JkZXIgd2F2ZWZvcm0gZHVyaW5n IGRpc3BsYXkgdXBkYXRlcyAoZW51bSBpbmRleCAwLTkpICovCisJZW51bSBzc2QxNnh4X2JvcmRl cl93YXZlZm9ybSBkZWZhdWx0X2JvcmRlcl93YXZlZm9ybV91cGRhdGU7CisKKwkvKiBXaGV0aGVy IHRvIHJlLXNlbmQgYm9yZGVyIHdhdmVmb3JtIGNvbW1hbmQgYmVmb3JlIGVhY2ggZGlzcGxheSB1 cGRhdGUgKi8KKwlib29sIGRlZmF1bHRfYm9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlOwor CisJLyoKKwkgKiBEZWZhdWx0IGNsZWFyLW9uLWluaXQgYmVoYXZpb3VyLgorCSAqIC0xPWRpc2Fi bGVkLCAwPXBhcnRpYWwsIDE9ZnVsbCwgMj1mYXN0IChtYXRjaGVzIGVudW0gc3NkMTZ4eF9yZWZy ZXNoX21vZGUpCisJICovCisJaW50IGRlZmF1bHRfY2xlYXJfb25faW5pdDsKKworCS8qIERlZmF1 bHQgY2xlYXItb24tY2xvc2UgYmVoYXZpb3VyICgtMT1kaXNhYmxlZCwgMD1wYXJ0aWFsLCAxPWZ1 bGwsIDI9ZmFzdCkgKi8KKwlpbnQgZGVmYXVsdF9jbGVhcl9vbl9jbG9zZTsKKworCS8qIERlZmF1 bHQgY2xlYXItb24tZGlzYWJsZSBiZWhhdmlvdXIgKC0xPWRpc2FibGVkLCAwPXBhcnRpYWwsIDE9 ZnVsbCwgMj1mYXN0KSAqLworCWludCBkZWZhdWx0X2NsZWFyX29uX2Rpc2FibGU7CisKKwkvKgor CSAqIERlZmF1bHQgcmVmcmVzaC1tb2RlLWluaXQ6IC0xPWRpc2FibGVkLCBlbHNlIHNraXAgYmFz ZWxpbmUgZXN0YWJsaXNobWVudAorCSAqIGFuZCBzdGFydCBkaXJlY3RseSBpbiB0aGlzIHJlZnJl c2ggbW9kZS4KKwkgKi8KKwlpbnQgZGVmYXVsdF9yZWZyZXNoX21vZGVfaW5pdDsKKworCS8qCisJ ICogV2hldGhlciB0aGlzIHBhbmVsIGhhcyBhIHBoeXNpY2FsIHJlZCBjb2xvdXIgcGxhbmUgKDMt Y29sb3VyIEJXUikuCisJICogZmFsc2U6IDItY29sb3VyIGJsYWNrL3doaXRlIG9ubHk7IHRoZSBS RUQgUkFNIGlzIGFsd2F5cyBieXBhc3NlZC4KKwkgKiB0cnVlOiAgMy1jb2xvdXIgcGFuZWw7IGZ1 bGwtcmVmcmVzaCB3cml0ZXMgdG8gdGhlIFJFRCBSQU0gc28gdGhhdAorCSAqICAgICAgICByZWQg cGl4ZWxzIGFyZSBkcml2ZW4gdGhyb3VnaCB0aGUgcmVkIHdhdmVmb3JtLgorCSAqLworCWJvb2wg cmVkX3N1cHBvcnRlZDsKKworCS8qIFBhbmVsLXNwZWNpZmljIGRpc3BsYXkgbW9kZSAocmVzb2x1 dGlvbiBhbmQgcGh5c2ljYWwgZGltZW5zaW9ucykgKi8KKwljb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZTsKK307CisKK3N0cnVjdCBzc2QxNnh4X3BhbmVsIHsKKwlzdHJ1Y3QgZHJt X2RldmljZSBkcm07CisKKwlzdHJ1Y3QgZHJtX3BsYW5lIHByaW1hcnlfcGxhbmU7CisJc3RydWN0 IGRybV9jcnRjIGNydGM7CisJc3RydWN0IGRybV9lbmNvZGVyIGVuY29kZXI7CisJc3RydWN0IGRy bV9jb25uZWN0b3IgY29ubmVjdG9yOworCisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwlzdHJ1 Y3QgZ3Bpb19kZXNjICpyZXNldDsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpidXN5OworCXN0cnVjdCBn cGlvX2Rlc2MgKmRjOworCisJZW51bSBzc2QxNnh4X21vZGVsIG1vZGVsOworCWVudW0gc3NkMTZ4 eF9jb250cm9sbGVyIGNvbnRyb2xsZXI7CisJY29uc3Qgc3RydWN0IHNzZDE2eHhfY29udHJvbGxl cl9jb25maWcgKmNvbnRyb2xsZXJfY2ZnOworCWNvbnN0IHN0cnVjdCBzc2QxNnh4X3BhbmVsX2Nv bmZpZyAqcGFuZWxfY2ZnOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCXUzMiB3 aWR0aDsKKwl1MzIgaGVpZ2h0OworCisJYm9vbCBpbml0aWFsaXplZDsKKwlib29sIHJlaW5pdF9w ZW5kaW5nOyAgICAgIC8qIEhXIHJlLWluaXQgcmVxdWlyZWQgYWZ0ZXIgb3JpZW50YXRpb24gY2hh bmdlICovCisJYm9vbCBpbml0X3JlZnJlc2hfcGVuZGluZzsgLyogRmlyc3QgZnJhbWUgYWZ0ZXIg cmVmcmVzaF9tb2RlX2luaXQgZW5hYmxlICovCisJYm9vbCBmaXJzdF9jbGVhcl9kb25lOyAgLyog Y2xlYXJfb25faW5pdCBoYXMgYWxyZWFkeSBmaXJlZCBvbmNlICovCisJYm9vbCBkaXNwbGF5X2Ns ZWFyZWRfb25fZGVpbml0OyAvKiBBdm9pZCByZWR1bmRhbnQgY2xlYXIgaW4gYXRvbWljX2Rpc2Fi bGUvbWFzdGVyX2Ryb3AgKi8KKworCWludCBvcmllbnRhdGlvbjsgLyogRGlzcGxheSBvcmllbnRh dGlvbiBpbiBkZWdyZWVzOiAwLzkwLzE4MC8yNzAgKi8KKwllbnVtIHNzZDE2eHhfcmVmcmVzaF9t b2RlIHJlZnJlc2hfbW9kZTsgLyogQWN0aXZlIHJlZnJlc2ggbW9kZSAqLworCWVudW0gc3NkMTZ4 eF9jb2xvcl9tb2RlIGNvbG9yX21vZGU7ICAgICAvKiBBY3RpdmUgY29sb3IgbW9kZSAoQlcgb3Ig My1jb2xvcikgKi8KKwlib29sIGZhc3RfbHV0X3BlbmRpbmc7IC8qIExVVCBwcmUtbG9hZCBuZWVk ZWQgYmVmb3JlIG5leHQgZmFzdCByZWZyZXNoICovCisKKwkvKiBCb3JkZXIgd2F2ZWZvcm0gKGFz IGVudW0gaW5kaWNlcykgKi8KKwlpbnQgYm9yZGVyX3dhdmVmb3JtX2luaXRfaWR4OyAgIC8qIEJv cmRlciB3YXZlZm9ybSBkdXJpbmcgY2xlYXIvaW5pdCAqLworCWludCBib3JkZXJfd2F2ZWZvcm1f dXBkYXRlX2lkeDsgLyogQm9yZGVyIHdhdmVmb3JtIGR1cmluZyBkaXNwbGF5IHVwZGF0ZXMgKi8K Kwlib29sIGJvcmRlcl9yZWZyZXNoX29uX2V2ZXJ5X3VwZGF0ZTsgLyogUmUtc2VuZCBib3JkZXIg Y21kIGVhY2ggZGlzcGxheSB1cGRhdGUgKi8KKwlib29sIGJvcmRlcl93YXZlZm9ybV9wZW5kaW5n OyAgIC8qIE9uZS1zaG90OiBzZW5kIGJvcmRlciBjbWQgb24gbmV4dCB1cGRhdGUgKi8KKworCS8q IERpc3BsYXkgY29udHJvbCAqLworCWludCBjbGVhcl9vbl9pbml0OyAgICAvKiAtMT1kaXNhYmxl ZCwgMD1wYXJ0aWFsLCAxPWZ1bGwsIDI9ZmFzdCAqLworCWludCBjbGVhcl9vbl9jbG9zZTsgICAv KiAtMT1kaXNhYmxlZCwgMD1wYXJ0aWFsLCAxPWZ1bGwsIDI9ZmFzdCAqLworCWludCBjbGVhcl9v bl9kaXNhYmxlOyAvKiAtMT1kaXNhYmxlZCwgMD1wYXJ0aWFsLCAxPWZ1bGwsIDI9ZmFzdCAqLwor CWludCByZWZyZXNoX21vZGVfaW5pdDsgLyogLTE9ZGlzYWJsZWQsIGVsc2UgdXNlIHRoaXMgbW9k ZSBmb3IgdGhlIGZpcnN0IGZyYW1lICovCisKKwl1OCAgKnR4X2J1ZjsgICAgIC8qIDFicHAgZnJh bWUgYnVmZmVyIChtb25vICsgd2hpdGUpICovCisJdTggICp0eF9yZWRfYnVmOyAvKiAxYnBwIHJl ZC1jaGFubmVsIGJ1ZmZlciAoMy1jb2xvciBwYW5lbHMgb25seSkgKi8KKwl1MTYgKnR4X2J1Zjk7 ICAgIC8qIDktYml0IFNQSSBleHBhbnNpb24gYnVmZmVyICgzLXdpcmUgbW9kZSBvbmx5KSAqLwor CisJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqbGFzdF9mYjsgICAgICAgIC8qIExhc3QgZHJhd24g RkIgZm9yIHJlaW5pdCByZWRyYXdzICovCisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcm90YXRpb25f cHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9wZXJ0eSAqcmVmcmVzaF9tb2RlX3Byb3BlcnR5Owor CXN0cnVjdCBkcm1fcHJvcGVydHkgKmJvcmRlcl93YXZlZm9ybV9pbml0X3Byb3BlcnR5OworCXN0 cnVjdCBkcm1fcHJvcGVydHkgKmJvcmRlcl93YXZlZm9ybV91cGRhdGVfcHJvcGVydHk7CisJc3Ry dWN0IGRybV9wcm9wZXJ0eSAqYm9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlX3Byb3BlcnR5 OworCXN0cnVjdCBkcm1fcHJvcGVydHkgKmNsZWFyX29uX2luaXRfcHJvcGVydHk7CisJc3RydWN0 IGRybV9wcm9wZXJ0eSAqY2xlYXJfb25fY2xvc2VfcHJvcGVydHk7CisJc3RydWN0IGRybV9wcm9w ZXJ0eSAqY2xlYXJfb25fZGlzYWJsZV9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpy ZWZyZXNoX21vZGVfaW5pdF9wcm9wZXJ0eTsKKwlzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpjb2xvcl9t b2RlX3Byb3BlcnR5OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAq dG9fc3NkMTZ4eF9wYW5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZHJtKQoreworCXJldHVybiBjb250 YWluZXJfb2YoZHJtLCBzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCwgZHJtKTsKK30KKworc3RhdGljIGlu bGluZSBzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqY3J0Y190b19zc2QxNnh4X3BhbmVsKHN0cnVjdCBk cm1fY3J0YyAqY3J0YykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBzc2Qx Nnh4X3BhbmVsLCBjcnRjKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3NkMTZ4eF9wYW5l bCAqcGxhbmVfdG9fc3NkMTZ4eF9wYW5lbChzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKK3sKKwly ZXR1cm4gY29udGFpbmVyX29mKHBsYW5lLCBzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCwgcHJpbWFyeV9w bGFuZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3NkMTZ4eF9jb250cm9sbGVyX2NvbmZp ZyBzc2QxNnh4X2NvbnRyb2xsZXJfY29uZmlnc1tdID0geworCVtTU0QxNjgzXSA9IHsKKwkJLm1h eF93aWR0aCA9IDQwMCwKKwkJLm1heF9oZWlnaHQgPSAzMDAsCisJCS5yYW1feF9hZGRyZXNzX2Jp dHMgPSA4LAorCQkucmFtX3lfYWRkcmVzc19iaXRzID0gMTYsCisJCS5oYXNfdGVtcF9zZW5zb3Jf Y3RybCAgICA9IHRydWUsCisJCS5kZWVwX3NsZWVwX21vZGVfbGV2ZWwxICA9IFNTRDE2ODNfREVF UF9TTEVFUF9NT0RFXzEsCisJCS5kZWVwX3NsZWVwX21vZGVfbGV2ZWwyICA9IFNTRDE2ODNfREVF UF9TTEVFUF9NT0RFXzIsCisJCS5ib3JkZXJfd2F2ZWZvcm1fdGFibGUgICA9IHNzZDE2ODNfYm9y ZGVyX3dhdmVmb3JtX3RhYmxlLAorCQkuY3RybDFfbm9ybWFsICAgICAgICAgICAgPSBTU0QxNjgz X0NUUkwxX05PUk1BTCwKKwkJLmN0cmwxX2J5cGFzc19yZWRfcmFtICAgID0gU1NEMTY4M19DVFJM MV9CWVBBU1NfUkVEX1JBTSwKKwkJLmN0cmwyX3JlZnJlc2ggPSB7CisJCQlbU1NEMTZYWF9SRUZS RVNIX1BBUlRJQUxdID0gU1NEMTY4M19DVFJMMl9QQVJUSUFMX1JFRlJFU0gsCisJCQlbU1NEMTZY WF9SRUZSRVNIX0ZVTExdICAgID0gU1NEMTY4M19DVFJMMl9GVUxMX1JFRlJFU0gsCisJCQlbU1NE MTZYWF9SRUZSRVNIX0ZBU1RdICAgID0gU1NEMTY4M19DVFJMMl9GQVNUX1JFRlJFU0gsCisJCX0s CisJCS5jdHJsMl9sb2FkX3RlbXBfbHV0ICAgICA9IFNTRDE2ODNfQ1RSTDJfTE9BRF9URU1QX0xV VCwKKwl9LAorfTsKKworLyogR0RFWTA0MlQ4MTogNC4yIiA0MDB4MzAwIHBhbmVsLCA4NC44eDYz LjZtbSBhY3RpdmUgYXJlYSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2Rl IGdkZXkwNDJ0ODFfbW9kZSA9IHsKKwlEUk1fU0lNUExFX01PREUoNDAwLCAzMDAsIDg1LCA2NCks Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNzZDE2eHhfcGFuZWxfY29uZmlnIHNzZDE2eHhf cGFuZWxfY29uZmlnc1tdID0geworCVtHREVZMDQyVDgxXSA9IHsKKwkJLmRhdGFfZW50cnlfbW9k ZSA9IFNTRDE2WFhfREFUQV9FTlRSWV9YSU5DX1lJTkMsCisJCS5kcml2ZXJfb3V0cHV0X2N0cmxf Ynl0ZTMgPSBTU0QxNlhYX0RSSVZFUl9PVVRQVVRfQ1RSTF9ERUZBVUxULAorCQkuZGVmYXVsdF9y ZWZyZXNoX21vZGUgPSBTU0QxNlhYX1JFRlJFU0hfUEFSVElBTCwKKwkJLmRlZmF1bHRfYm9yZGVy X3dhdmVmb3JtX2luaXQgICA9IFNTRDE2WFhfQk9SREVSX0xVVDEsICAvKiB3aGl0ZSwgY2xlYW4g Y2xlYXIgKi8KKwkJLmRlZmF1bHRfYm9yZGVyX3dhdmVmb3JtX3VwZGF0ZSA9IFNTRDE2WFhfQk9S REVSX0hJWiwgICAvKiBmbG9hdGluZywgcHJlc2VydmUgKi8KKwkJLmRlZmF1bHRfYm9yZGVyX3Jl ZnJlc2hfb25fZXZlcnlfdXBkYXRlID0gZmFsc2UsCisJCS5kZWZhdWx0X2NsZWFyX29uX2luaXQg ICAgPSAtMSwKKwkJLmRlZmF1bHRfY2xlYXJfb25fY2xvc2UgICA9IC0xLAorCQkuZGVmYXVsdF9j bGVhcl9vbl9kaXNhYmxlID0gLTEsCisJCS5kZWZhdWx0X3JlZnJlc2hfbW9kZV9pbml0ID0gU1NE MTZYWF9SRUZSRVNIX0ZVTEwsCisJCS5yZWRfc3VwcG9ydGVkID0gZmFsc2UsICAvKiAyLWNvbG91 ciBibGFjay93aGl0ZSBwYW5lbCAqLworCQkubW9kZSA9ICZnZGV5MDQydDgxX21vZGUsCisJfSwK K307CisKK3N0YXRpYyB2b2lkIHNzZDE2eHhfd2FpdF9mb3JfcGFuZWwoc3RydWN0IHNzZDE2eHhf cGFuZWwgKnBhbmVsLAorCQkJCSAgIGludCAqZXJyKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91 dF9qaWZmaWVzID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoU1NEMTZYWF9CVVNZX1dB SVRfVElNRU9VVF9NUyk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9tcyA9IGppZmZpZXNfdG9fbXNl Y3MoamlmZmllcyk7CisJaW50IGJ1c3lfdmFsOworCisJaWYgKCplcnIpCisJCXJldHVybjsKKwor CWJ1c3lfdmFsID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKHBhbmVsLT5idXN5KTsKKwlkcm1f ZGJnKCZwYW5lbC0+ZHJtLCAiQlVTWSBpbml0aWFsIHZhbHVlOiAlZFxuIiwgYnVzeV92YWwpOwor CisJd2hpbGUgKGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChwYW5lbC0+YnVzeSkgPT0gMSkgewor CQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0X2ppZmZpZXMpKSB7CisJCQlkcm1fZXJy KCZwYW5lbC0+ZHJtLCAiQnVzeSB3YWl0IHRpbWVkIG91dCBhZnRlciAlbHVtc1xuIiwKKwkJCQlq aWZmaWVzX3RvX21zZWNzKGppZmZpZXMpIC0gc3RhcnRfbXMpOworCQkJKmVyciA9IC1FVElNRURP VVQ7CisJCQlyZXR1cm47CisJCX0KKwkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwl9CisKKwlk cm1fZGJnKCZwYW5lbC0+ZHJtLCAiQlVTWSBiZWNhbWUgcmVhZHkgYWZ0ZXIgJWx1bXNcbiIsCisJ CWppZmZpZXNfdG9fbXNlY3MoamlmZmllcykgLSBzdGFydF9tcyk7Cit9CisKK3N0YXRpYyB2b2lk IHNzZDE2eHhfc3BpX3N5bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNz YWdlICptc2csCisJCQkgICAgIGludCAqZXJyKQoreworCWludCByZXQ7CisKKwlpZiAoKmVycikK KwkJcmV0dXJuOworCisJcmV0ID0gc3BpX3N5bmMoc3BpLCBtc2cpOworCWlmIChyZXQgPCAwKQor CQkqZXJyID0gcmV0OworfQorCitzdGF0aWMgdm9pZCBzc2QxNnh4X3NlbmRfY21kKHN0cnVjdCBz c2QxNnh4X3BhbmVsICpwYW5lbCwgdTggY21kLAorCQkJICAgICBpbnQgKmVycikKK3sKKwl1MTYg d29yZDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIgPSB7fTsKKwlzdHJ1Y3Qgc3BpX21lc3Nh Z2UgbXNnOworCisJaWYgKCplcnIpCisJCXJldHVybjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1z Zyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJaWYgKHBhbmVsLT5k YykgeworCQkvKiA0LXdpcmUgU1BJOiBEL0MjIEdQSU8gbG93IHNlbGVjdHMgY29tbWFuZCBtb2Rl ICovCisJCXhmZXIudHhfYnVmID0gJmNtZDsKKwkJeGZlci5sZW4gPSAxOworCQlncGlvZF9zZXRf dmFsdWVfY2Fuc2xlZXAocGFuZWwtPmRjLCAwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAzLXdp cmUgU1BJICg5LWJpdCk6IGJpdCA4IGlzIHRoZSBEL0MjIGJpdC4KKwkJICogRC9DIyA9IDAgbWVh bnMgdGhlIGZvbGxvd2luZyA4IGJpdHMgYXJlIGEgY29tbWFuZC4KKwkJICovCisJCXdvcmQgPSBj bWQ7IC8qIGJpdCA4ID0gMCBmb3IgY29tbWFuZCAqLworCQl4ZmVyLnR4X2J1ZiA9ICZ3b3JkOwor CQl4ZmVyLmxlbiA9IHNpemVvZih1MTYpOworCQl4ZmVyLmJpdHNfcGVyX3dvcmQgPSA5OworCX0K KworCXNzZDE2eHhfc3BpX3N5bmMocGFuZWwtPnNwaSwgJm1zZywgZXJyKTsKK30KKworc3RhdGlj IHZvaWQgc3NkMTZ4eF9zZW5kX2RhdGEoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsLCB1OCBk YXRhLAorCQkJICAgICAgaW50ICplcnIpCit7CisJdTE2IHdvcmQ7CisJc3RydWN0IHNwaV90cmFu c2ZlciB4ZmVyID0ge307CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKworCWlmICgqZXJyKQor CQlyZXR1cm47CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90 YWlsKCZ4ZmVyLCAmbXNnKTsKKworCWlmIChwYW5lbC0+ZGMpIHsKKwkJLyogNC13aXJlIFNQSTog RC9DIyBHUElPIGhpZ2ggc2VsZWN0cyBkYXRhIG1vZGUgKi8KKwkJeGZlci50eF9idWYgPSAmZGF0 YTsKKwkJeGZlci5sZW4gPSAxOworCQlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAocGFuZWwtPmRj LCAxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAzLXdpcmUgU1BJICg5LWJpdCk6IGJpdCA4IGlz IHRoZSBEL0MjIGJpdC4KKwkJICogRC9DIyA9IDEgbWVhbnMgdGhlIGZvbGxvd2luZyA4IGJpdHMg YXJlIGRhdGEuCisJCSAqLworCQl3b3JkID0gMHgxMDAgfCBkYXRhOworCQl4ZmVyLnR4X2J1ZiA9 ICZ3b3JkOworCQl4ZmVyLmxlbiA9IHNpemVvZih1MTYpOworCQl4ZmVyLmJpdHNfcGVyX3dvcmQg PSA5OworCX0KKworCXNzZDE2eHhfc3BpX3N5bmMocGFuZWwtPnNwaSwgJm1zZywgZXJyKTsKK30K Kworc3RhdGljIHZvaWQgc3NkMTZ4eF9zZW5kX3hfcGFyYW0oc3RydWN0IHNzZDE2eHhfcGFuZWwg KnBhbmVsLCB1MTYgeCwKKwkJCQkgaW50ICplcnIpCit7CisJaWYgKCplcnIpCisJCXJldHVybjsK KworCWlmIChwYW5lbC0+Y29udHJvbGxlcl9jZmctPnJhbV94X2FkZHJlc3NfYml0cyA9PSA4KSB7 CisJCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVsLCAodTgpeCwgZXJyKTsKKwl9IGVsc2UgeworCQlz c2QxNnh4X3NlbmRfZGF0YShwYW5lbCwgeCAmIDB4RkYsIGVycik7CisJCXNzZDE2eHhfc2VuZF9k YXRhKHBhbmVsLCAoeCA+PiA4KSAmIDB4RkYsIGVycik7CisJfQorfQorCitzdGF0aWMgdm9pZCBz c2QxNnh4X3NlbmRfeV9wYXJhbShzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwsIHUxNiB5LAor CQkJCSBpbnQgKmVycikKK3sKKwlpZiAoKmVycikKKwkJcmV0dXJuOworCisJaWYgKHBhbmVsLT5j b250cm9sbGVyX2NmZy0+cmFtX3lfYWRkcmVzc19iaXRzID09IDgpIHsKKwkJc3NkMTZ4eF9zZW5k X2RhdGEocGFuZWwsICh1OCl5LCBlcnIpOworCX0gZWxzZSB7CisJCXNzZDE2eHhfc2VuZF9kYXRh KHBhbmVsLCB5ICYgMHhGRiwgZXJyKTsKKwkJc3NkMTZ4eF9zZW5kX2RhdGEocGFuZWwsICh5ID4+ IDgpICYgMHhGRiwgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNzZDE2eHhfc2VuZF9kYXRh X2J1bGsoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsLAorCQkJCSAgIGNvbnN0IHU4ICpkYXRh LCBzaXplX3QgbGVuLAorCQkJCSAgIGludCAqZXJyKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIg eGZlciA9IHt9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisKKwlpZiAoKmVycikKKwkJcmV0 dXJuOworCisJaWYgKCFkYXRhIHx8ICFsZW4pCisJCXJldHVybjsKKworCXNwaV9tZXNzYWdlX2lu aXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJaWYgKHBh bmVsLT5kYykgeworCQkvKiA0LXdpcmUgU1BJOiBEL0MjIEdQSU8gaGlnaCBzZWxlY3RzIGRhdGEg bW9kZSAqLworCQl4ZmVyLnR4X2J1ZiA9IGRhdGE7CisJCXhmZXIubGVuID0gbGVuOworCQlncGlv ZF9zZXRfdmFsdWVfY2Fuc2xlZXAocGFuZWwtPmRjLCAxKTsKKwkJc3NkMTZ4eF9zcGlfc3luYyhw YW5lbC0+c3BpLCAmbXNnLCBlcnIpOworCX0gZWxzZSB7CisJCS8qIDMtd2lyZSAoOS1iaXQpOiBl eHBhbmQgdTgg4oaSIHUxNiB3aXRoIEQvQyM9MSBpbiBiaXQgOC4gKi8KKwkJc2l6ZV90IGk7CisJ CXUxNiAqYnVmID0gcGFuZWwtPnR4X2J1Zjk7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsr KQorCQkJYnVmW2ldID0gMHgxMDAgfCBkYXRhW2ldOworCisJCXhmZXIudHhfYnVmID0gYnVmOwor CQl4ZmVyLmxlbiA9IGxlbiAqIHNpemVvZih1MTYpOworCQl4ZmVyLmJpdHNfcGVyX3dvcmQgPSA5 OworCQlzc2QxNnh4X3NwaV9zeW5jKHBhbmVsLT5zcGksICZtc2csIGVycik7CisJfQorfQorCitz dGF0aWMgdm9pZCBzc2QxNnh4X2Rpc3BsYXlfdXBkYXRlKHN0cnVjdCBzc2QxNnh4X3BhbmVsICpw YW5lbCwKKwkJCQkgICB1OCBjdHJsMV9ieXRlMSwgdTggY3RybDFfYnl0ZTIsIHU4IGN0cmwyX21v ZGUsCisJCQkJICAgaW50ICplcnIpCit7CisJaWYgKCplcnIpCisJCXJldHVybjsKKworCWRybV9k YmcoJnBhbmVsLT5kcm0sCisJCSJkaXNwbGF5X3VwZGF0ZTogU2V0dGluZyBjdHJsMT0weCUwMngs MHglMDJ4IG1vZGU9MHglMDJ4XG4iLAorCQljdHJsMV9ieXRlMSwgY3RybDFfYnl0ZTIsIGN0cmwy X21vZGUpOworCisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfRElTUExBWV9V UERBVEVfQ09OVFJPTDEsIGVycik7CisJc3NkMTZ4eF9zZW5kX2RhdGEocGFuZWwsIGN0cmwxX2J5 dGUxLCBlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVsLCBjdHJsMV9ieXRlMiwgZXJyKTsK KworCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX0RJU1BMQVlfVVBEQVRFX0NP TlRST0wyLCBlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVsLCBjdHJsMl9tb2RlLCBlcnIp OworCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX01BU1RFUl9BQ1RJVkFUSU9O LCBlcnIpOworCisJZHJtX2RiZygmcGFuZWwtPmRybSwKKwkJImRpc3BsYXlfdXBkYXRlOiBNYXN0 ZXIgYWN0aXZhdGlvbiBzZW50LCB3YWl0aW5nLi4uXG4iKTsKKworCXNzZDE2eHhfd2FpdF9mb3Jf cGFuZWwocGFuZWwsIGVycik7Cit9CisKK3N0YXRpYyB2b2lkIHNzZDE2eHhfaHdfcmVzZXQoc3Ry dWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsKQoreworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChw YW5lbC0+cmVzZXQsIDEpOworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOworCWdwaW9kX3Nl dF92YWx1ZV9jYW5zbGVlcChwYW5lbC0+cmVzZXQsIDApOworCXVzbGVlcF9yYW5nZSgxMDAwMCwg MTEwMDApOworfQorCisvKgorICogc3NkMTZ4eF9wcmVsb2FkX2Zhc3RfbHV0KCkgLSBwcmUtbG9h ZCB0aGUgT1RQIExVVCBmb3IgZmFzdCByZWZyZXNoIG1vZGUuCisgKgorICogRmFzdCByZWZyZXNo IChDVFJMMiA9IDB4QzcpIG9taXRzIHRoZSBMT0FEX0xVVCBzdGVwIG9uIGV2ZXJ5IHVwZGF0ZSB0 byBzYXZlCisgKiB0aW1lLiAgSXQgcmVsaWVzIG9uIHRoZSBMVVQgYmVpbmcgbG9hZGVkIHVwZnJv bnQgdmlhIHRoaXMgc3RhbmRhbG9uZSBzZXF1ZW5jZQorICogKENUUkwyID0gMHhCMTogRU5BQkxF X0NMSyB8IExPQURfTFVUIHwgU1NEMTZYWF9DVFJMMl9MT0FEX1RFTVBFUkFUVVJFIHwgRElTQUJM RV9DTEssCisgKiAgbm8gZGlzcGxheSB1cGRhdGUpLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdo ZW46CisgKiAgIGEpIGh3X2luaXQgcnVucyB3aXRoIHJlZnJlc2hfbW9kZSA9PSBGQVNULCBhbmQK KyAqICAgYikgc3dpdGNoaW5nIHRvIGZhc3QgcmVmcmVzaCBmcm9tIGEgbW9kZSB0aGF0IGRpZCBu b3QgbGVhdmUgYSB2YWxpZCBNb2RlMQorICogICAgICBMVVQgaW4gdGhlIGNvbnRyb2xsZXIgKGku ZS4gcHJldmlvdXMgbW9kZSB3YXMgbm90IEZVTEwgcmVmcmVzaCwgd2hpY2gKKyAqICAgICAgY2Fy cmllcyBMT0FEX0xVVCBpbiBpdHMgb3duIENUUkwyIHNlcXVlbmNlKS4KKyAqLworc3RhdGljIGlu dCBzc2QxNnh4X3ByZWxvYWRfZmFzdF9sdXQoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsKQor eworCWludCBlcnIgPSAwOworCisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURf RElTUExBWV9VUERBVEVfQ09OVFJPTDEsICZlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVs LCBwYW5lbC0+Y29udHJvbGxlcl9jZmctPmN0cmwxX2J5cGFzc19yZWRfcmFtLCAmZXJyKTsKKwlz c2QxNnh4X3NlbmRfZGF0YShwYW5lbCwgU1NEMTZYWF9DVFJMMV9CWVRFMl9ERUZBVUxULCAmZXJy KTsKKworCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX0RJU1BMQVlfVVBEQVRF X0NPTlRST0wyLCAmZXJyKTsKKwlzc2QxNnh4X3NlbmRfZGF0YShwYW5lbCwgcGFuZWwtPmNvbnRy b2xsZXJfY2ZnLT5jdHJsMl9sb2FkX3RlbXBfbHV0LCAmZXJyKTsKKworCXNzZDE2eHhfc2VuZF9j bWQocGFuZWwsIFNTRDE2WFhfQ01EX01BU1RFUl9BQ1RJVkFUSU9OLCAmZXJyKTsKKwlzc2QxNnh4 X3dhaXRfZm9yX3BhbmVsKHBhbmVsLCAmZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBpbnQgc3NkMTZ4eF9od19pbml0KHN0cnVjdCBzc2QxNnh4X3BhbmVsICpwYW5lbCkKK3sKKwlp bnQgZXJyID0gMDsKKwl1MTYgcmFtX2hlaWdodCA9IHBhbmVsLT5jb250cm9sbGVyX2NmZy0+bWF4 X2hlaWdodDsKKwl1OCBkYXRhX2VudHJ5X21vZGU7CisKKwlzc2QxNnh4X2h3X3Jlc2V0KHBhbmVs KTsKKworCS8qIFNvZnR3YXJlIHJlc2V0ICovCisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NE MTZYWF9DTURfU1dfUkVTRVQsICZlcnIpOworCXNzZDE2eHhfd2FpdF9mb3JfcGFuZWwocGFuZWws ICZlcnIpOworCisJLyogRHJpdmVyIG91dHB1dCBjb250cm9sICgweDAxKTogTVVYIHJhdGlvIGFu ZCBzY2FuIGRpcmVjdGlvbi4gKi8KKwlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0QxNlhYX0NN RF9EUklWRVJfT1VUUFVUX0NPTlRST0wsICZlcnIpOworCXNzZDE2eHhfc2VuZF95X3BhcmFtKHBh bmVsLCByYW1faGVpZ2h0IC0gMSwgJmVycik7CisJc3NkMTZ4eF9zZW5kX2RhdGEocGFuZWwsIHBh bmVsLT5wYW5lbF9jZmctPmRyaXZlcl9vdXRwdXRfY3RybF9ieXRlMywgJmVycik7CisKKwkvKiBJ bnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IgKFNTRDE2ODMvU1NEMTY4MCBvbmx5OyBub3QgcHJl c2VudCBpbiBTU0QxNjczKSAqLworCWlmIChwYW5lbC0+Y29udHJvbGxlcl9jZmctPmhhc190ZW1w X3NlbnNvcl9jdHJsKSB7CisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2ODNfQ01EX1RF TVBFUkFUVVJFX1NFTlNPUl9DT05UUk9MLCAmZXJyKTsKKwkJc3NkMTZ4eF9zZW5kX2RhdGEocGFu ZWwsIFNTRDE2ODNfVEVNUF9TRU5TT1JfSU5URVJOQUwsICZlcnIpOworCX0KKworCS8qCisJICog Rm9yIEZBU1QgcmVmcmVzaCBtb2RlLCBwcmUtbG9hZCB0aGUgTFVUIG9uY2UgaGVyZSBkdXJpbmcg aW5pdGlhbGl6YXRpb24uCisJICogRkFTVCBtb2RlIGN0cmwyICgweEM3KSBvbWl0cyBMT0FEX0xV VCBvbiBldmVyeSB1cGRhdGUgZm9yIHNwZWVkLCBzbyB0aGUKKwkgKiBMVVQgbXVzdCBiZSBsb2Fk ZWQgdXBmcm9udC4gRlVMTCAoMHhGNykgYW5kIFBBUlRJQUwgKDB4RkYpIGxvYWQgTFVUIG9uCisJ ICogZXZlcnkgdXBkYXRlLCBzbyBubyBwcmVsb2FkIGlzIG5lZWRlZCBmb3IgdGhvc2UgbW9kZXMu CisJICovCisJaWYgKHBhbmVsLT5yZWZyZXNoX21vZGUgPT0gU1NEMTZYWF9SRUZSRVNIX0ZBU1Qp IHsKKwkJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfRElTUExBWV9VUERBVEVf Q09OVFJPTDEsICZlcnIpOworCQlzc2QxNnh4X3NlbmRfZGF0YShwYW5lbCwgcGFuZWwtPmNvbnRy b2xsZXJfY2ZnLT5jdHJsMV9ieXBhc3NfcmVkX3JhbSwgJmVycik7CisJCXNzZDE2eHhfc2VuZF9k YXRhKHBhbmVsLCBTU0QxNlhYX0NUUkwxX0JZVEUyX0RFRkFVTFQsICZlcnIpOworCisJCXNzZDE2 eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX0RJU1BMQVlfVVBEQVRFX0NPTlRST0wyLCAm ZXJyKTsKKwkJc3NkMTZ4eF9zZW5kX2RhdGEocGFuZWwsIHBhbmVsLT5jb250cm9sbGVyX2NmZy0+ Y3RybDJfbG9hZF90ZW1wX2x1dCwgJmVycik7CisKKwkJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwg U1NEMTZYWF9DTURfTUFTVEVSX0FDVElWQVRJT04sICZlcnIpOworCQlzc2QxNnh4X3dhaXRfZm9y X3BhbmVsKHBhbmVsLCAmZXJyKTsKKwl9CisKKwkvKgorCSAqIFNldCBEYXRhIEVudHJ5IE1vZGUg KDB4MTEpIGJhc2VkIG9uIG9yaWVudGF0aW9uLiAgVGhpcyBjb250cm9scworCSAqIGhvdyB0aGUg UkFNIGFkZHJlc3MgY291bnRlciBhdXRvLWFkdmFuY2VzIGFmdGVyIGVhY2ggYnl0ZSB3cml0ZS4K KwkgKgorCSAqIEltcGxlbWVudGF0aW9uIHVzZXMgdHdvIGRhdGEgZW50cnkgbW9kZXM6CisJICog ICAtIDkwwrAvMTgwwrAgdXNlIFhERUNfWURFQyAoMHgwMCk6IFgtLSwgWS0tIHdpdGggY3Vyc29y IGF0IChtYXgsIG1heCkKKwkgKiAgIC0gMMKwLzI3MMKwIHVzZSBYSU5DX1lJTkMgKDB4MDMpOiBY KyssIFkrKyB3aXRoIGN1cnNvciBhdCAoMCwgMCkKKwkgKgorCSAqIFRoZSBjb252ZXJ0X2ZiX3Rv XzFicHAgcGFja2luZyBpcyBncm91cGVkIGJ5IHBoeXNpY2FsIGxheW91dDoKKwkgKiAgIC0gUG9y dHJhaXQgb3JpZW50YXRpb25zICg5MMKwLzI3MMKwKTogY29sdW1uLW1ham9yIHBhY2tpbmcKKwkg KiAgIC0gTGFuZHNjYXBlIG9yaWVudGF0aW9ucyAoMMKwLzE4MMKwKTogcm93LW1ham9yIHBhY2tp bmcKKwkgKgorCSAqIEZpbmFsIHNjYW4gZGlyZWN0aW9uIGFuZCBpbWFnZSBvcmllbnRhdGlvbiBh cmUgY29udHJvbGxlZCBieSB0aGUKKwkgKiBjb21iaW5hdGlvbiBvZiBkYXRhIGVudHJ5IG1vZGUg YW5kIFJBTSBjdXJzb3IgcG9zaXRpb24gc2V0IGluIGZiX2RpcnR5LgorCSAqCisJICogVGhlIFJB TSBhZGRyZXNzIHdpbmRvdyBhbmQgY3Vyc29yIGFyZSBOT1Qgc2V0IGhlcmU7IGZiX2RpcnR5CisJ ICogYWx3YXlzIHByb2dyYW1tZXMgdGhlbSAod2l0aCB0aGUgY29ycmVjdCBlbmQtYmVmb3JlLXN0 YXJ0IG9yZGVyCisJICogZm9yIGRlY3JlbWVudCBtb2RlcykgaW1tZWRpYXRlbHkgYmVmb3JlIHdy aXRpbmcgZnJhbWUgZGF0YS4KKwkgKi8KKwlzd2l0Y2ggKHBhbmVsLT5vcmllbnRhdGlvbikgewor CWNhc2UgOTA6CisJY2FzZSAxODA6CisJCWRhdGFfZW50cnlfbW9kZSA9IFNTRDE2WFhfREFUQV9F TlRSWV9YREVDX1lERUM7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIDDCsC8yNzDCsCAqLworCQlk YXRhX2VudHJ5X21vZGUgPSBTU0QxNlhYX0RBVEFfRU5UUllfWElOQ19ZSU5DOworCQlicmVhazsK Kwl9CisKKwlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0QxNlhYX0NNRF9EQVRBX0VOVFJZX01P REUsICZlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVsLCBkYXRhX2VudHJ5X21vZGUsICZl cnIpOworCWRybV9kYmcoJnBhbmVsLT5kcm0sICJod19pbml0OiBvcmllbnRhdGlvbj0ldcKwIGRh dGFfZW50cnk9MHglMDJ4XG4iLAorCQlwYW5lbC0+b3JpZW50YXRpb24sIGRhdGFfZW50cnlfbW9k ZSk7CisKKwlzc2QxNnh4X3dhaXRfZm9yX3BhbmVsKHBhbmVsLCAmZXJyKTsKKworCWlmIChlcnIp CisJCWRybV9lcnIoJnBhbmVsLT5kcm0sICJIYXJkd2FyZSBpbml0aWFsaXphdGlvbiBmYWlsZWQ6 ICVkXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENsZWFyIGRpc3BsYXkg Ynkgd3JpdGluZyBhbGwtd2hpdGUgdG8gYm90aCBCVyBhbmQgUkVEIFJBTS4KKyAqIFRoZSBjdHJs MiBhcmd1bWVudCBzZWxlY3RzIHRoZSB3YXZlZm9ybSAoZnVsbC9wYXJ0aWFsL2Zhc3QgcmVmcmVz aCkuCisgKiBCb3JkZXIgd2F2ZWZvcm0gaXMgc2V0IHRvIGluaXQgdmFsdWUgYmVmb3JlIGNsZWFy aW5nLCB0aGVuIHJlc3RvcmVkCisgKiB0byB0aGUgdXBkYXRlIHZhbHVlIHRvIHByZXNlcnZlIHRo ZSBib3JkZXIgZHVyaW5nIHN1YnNlcXVlbnQgdXBkYXRlcy4KKyAqLworc3RhdGljIGludCBzc2Qx Nnh4X2NsZWFyX2Rpc3BsYXkoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsLCB1OCBjdHJsMikK K3sKKwljb25zdCB1OCAqYndfdGJsID0gcGFuZWwtPmNvbnRyb2xsZXJfY2ZnLT5ib3JkZXJfd2F2 ZWZvcm1fdGFibGU7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IChw YW5lbC0+d2lkdGggKiBwYW5lbC0+aGVpZ2h0KSAvIDg7CisJdTggKndoaXRlX2J1ZmZlciA9IHBh bmVsLT50eF9idWY7CisKKwltZW1zZXQod2hpdGVfYnVmZmVyLCAweEZGLCBkYXRhX3NpemUpOwor CisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfU0VUX1JBTV9YX0FERFJFU1Nf Q09VTlRFUiwgJmVycik7CisJc3NkMTZ4eF9zZW5kX3hfcGFyYW0ocGFuZWwsIDB4MDAsICZlcnIp OworCisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfU0VUX1JBTV9ZX0FERFJF U1NfQ09VTlRFUiwgJmVycik7CisJc3NkMTZ4eF9zZW5kX3lfcGFyYW0ocGFuZWwsIDB4MDAsICZl cnIpOworCisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfV1JJVEVfUkFNX0JX LCAmZXJyKTsKKwlzc2QxNnh4X3NlbmRfZGF0YV9idWxrKHBhbmVsLCB3aGl0ZV9idWZmZXIsIGRh dGFfc2l6ZSwgJmVycik7CisKKwlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0QxNjgzX0NNRF9X UklURV9SQU1fUkVELCAmZXJyKTsKKwlzc2QxNnh4X3NlbmRfZGF0YV9idWxrKHBhbmVsLCB3aGl0 ZV9idWZmZXIsIGRhdGFfc2l6ZSwgJmVycik7CisKKwkvKiBTZXQgYm9yZGVyIHdhdmVmb3JtIGZv ciB0aGUgY2xlYXIgb3BlcmF0aW9uICovCisJZHJtX2RiZygmcGFuZWwtPmRybSwgImNsZWFyX2Rp c3BsYXk6IFNldCBib3JkZXIgaW5pdCB3YXZlZm9ybTogMHglMDJ4XG4iLAorCQlid190YmxbcGFu ZWwtPmJvcmRlcl93YXZlZm9ybV9pbml0X2lkeF0pOworCXNzZDE2eHhfc2VuZF9jbWQocGFuZWws IFNTRDE2WFhfQ01EX0JPUkRFUl9XQVZFRk9STV9DT05UUk9MLCAmZXJyKTsKKwlzc2QxNnh4X3Nl bmRfZGF0YShwYW5lbCwKKwkJCSAgYndfdGJsW3BhbmVsLT5ib3JkZXJfd2F2ZWZvcm1faW5pdF9p ZHhdLAorCQkJICAmZXJyKTsKKworCS8qIDMtY29sb3VyIG1vZGU6IENUUkwxX05PUk1BTCAocmVh ZCBib3RoIFJBTXMpOyBCVyBtb2RlOiBieXBhc3MgUkVELiAqLworCXNzZDE2eHhfZGlzcGxheV91 cGRhdGUocGFuZWwsCisJCQkgICAgICAgcGFuZWwtPmNvbG9yX21vZGUgPT0gU1NEMTZYWF9DT0xP Ul9NT0RFXzNDT0xPUgorCQkJCQk/IHBhbmVsLT5jb250cm9sbGVyX2NmZy0+Y3RybDFfbm9ybWFs CisJCQkJCTogcGFuZWwtPmNvbnRyb2xsZXJfY2ZnLT5jdHJsMV9ieXBhc3NfcmVkX3JhbSwKKwkJ CSAgICAgICBTU0QxNlhYX0NUUkwxX0JZVEUyX0RFRkFVTFQsIGN0cmwyLCAmZXJyKTsKKworCS8q IFJlc3RvcmUgYm9yZGVyIHdhdmVmb3JtIHRvIHVwZGF0ZS9wcmVzZXJ2YXRpb24gdmFsdWUgKi8K Kwlkcm1fZGJnKCZwYW5lbC0+ZHJtLCAiY2xlYXJfZGlzcGxheTogUmVzdG9yZWQgYm9yZGVyIHVw ZGF0ZSB3YXZlZm9ybTogMHglMDJ4XG4iLAorCQlid190YmxbcGFuZWwtPmJvcmRlcl93YXZlZm9y bV91cGRhdGVfaWR4XSk7CisJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZYWF9DTURfQk9S REVSX1dBVkVGT1JNX0NPTlRST0wsICZlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhKHBhbmVsLAor CQkJICBid190YmxbcGFuZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfaWR4XSwKKwkJCSAgJmVy cik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdTggc3NkMTZ4eF9yZWZyZXNoX21vZGVf dG9fY3RybDIoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsLAorCQkJCQllbnVtIHNzZDE2eHhf cmVmcmVzaF9tb2RlIG1vZGUpCit7CisJaWYgKG1vZGUgPCBBUlJBWV9TSVpFKHBhbmVsLT5jb250 cm9sbGVyX2NmZy0+Y3RybDJfcmVmcmVzaCkpCisJCXJldHVybiBwYW5lbC0+Y29udHJvbGxlcl9j ZmctPmN0cmwyX3JlZnJlc2hbbW9kZV07CisJcmV0dXJuIHBhbmVsLT5jb250cm9sbGVyX2NmZy0+ Y3RybDJfcmVmcmVzaFtTU0QxNlhYX1JFRlJFU0hfRlVMTF07Cit9CisKKy8qCisgKiBDbGVhciBk aXNwbGF5IG9uIG5ldyBEUk0gbWFzdGVyIG9wZW4gKGlmIGNsZWFyX29uX2luaXQgPj0gMCkuCisg KiBHdWFyZGVkIGJ5IHBhbmVsLT5maXJzdF9jbGVhcl9kb25lOyBtYXN0ZXJfZHJvcCByZXNldHMg aXQgdW5jb25kaXRpb25hbGx5CisgKiBzbyBlYWNoIG5ldyBjbGllbnQgc2Vzc2lvbiBnZXRzIGEg ZnJlc2ggY2xlYXIuCisgKi8KK3N0YXRpYyBpbnQgc3NkMTZ4eF9jbGVhcl9kaXNwbGF5X29uX2lu aXQoc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsKQoreworCWludCByZXQ7CisKKwlpZiAocGFu ZWwtPmNsZWFyX29uX2luaXQgPCAwIHx8IHBhbmVsLT5maXJzdF9jbGVhcl9kb25lKQorCQlyZXR1 cm4gMDsKKworCWRybV9kYmcoJnBhbmVsLT5kcm0sICJjbGVhcl9vbl9pbml0OiBydW5uaW5nLCBt b2RlPSVkXG4iLAorCQlwYW5lbC0+Y2xlYXJfb25faW5pdCk7CisJcmV0ID0gc3NkMTZ4eF9jbGVh cl9kaXNwbGF5KHBhbmVsLAorCQkJCSAgICBzc2QxNnh4X3JlZnJlc2hfbW9kZV90b19jdHJsMihw YW5lbCwgcGFuZWwtPmNsZWFyX29uX2luaXQpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJcGFuZWwtPmZpcnN0X2NsZWFyX2RvbmUgPSB0cnVlOworCXJldHVybiAwOworfQorCisvKgor ICogQ2xlYXIgZGlzcGxheSB3aGVuIHRoZSBkaXNwbGF5aW5nIGNsaWVudCBleGl0cyAoaWYgY2xl YXJfb25fY2xvc2UgPj0gMCkuCisgKiBDYWxsZWQgZnJvbSBzc2QxNnh4X2RybV9tYXN0ZXJfZHJv cCgpLgorICovCitzdGF0aWMgaW50IHNzZDE2eHhfY2xlYXJfZGlzcGxheV9vbl9leGl0KHN0cnVj dCBzc2QxNnh4X3BhbmVsICpwYW5lbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBhbmVsLT5jbGVh cl9vbl9jbG9zZSA8IDApCisJCXJldHVybiAwOworCisJZHJtX2RiZygmcGFuZWwtPmRybSwgImNs ZWFyX29uX2Nsb3NlOiBydW5uaW5nLCBtb2RlPSVkXG4iLAorCQlwYW5lbC0+Y2xlYXJfb25fY2xv c2UpOworCXJldCA9ICBzc2QxNnh4X2NsZWFyX2Rpc3BsYXkocGFuZWwsCisJCQkJICAgICBzc2Qx Nnh4X3JlZnJlc2hfbW9kZV90b19jdHJsMihwYW5lbCwgcGFuZWwtPmNsZWFyX29uX2Nsb3NlKSk7 CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogc3Nk MTZ4eF9waXhlbF9sdW1hKCkgLSByZXR1cm4gSVRVLVIgQlQuNjAxIGx1bWluYW5jZSAoMC0yNTUp IGZvciBvbmUgcGl4ZWwuCisgKgorICogRm9yIGNvbG91ciBmb3JtYXRzIHRoZSByZXN1bHQgaXMg KDI5OSpSICsgNTg3KkcgKyAxMTQqQikgLyAxMDAwOworICogZm9yIGx1bWEtb25seSBmb3JtYXRz IHRoZSBsdW1hIGJ5dGUgaXMgcmV0dXJuZWQgZGlyZWN0bHkuCisgKgorICogUjEgaXMgbmV2ZXIg cGFzc2VkIGhlcmUg4oCUIGl0IGlzIGFscmVhZHkgMWJwcCBhbmQgaXMgaGFuZGxlZCBkaXJlY3Rs eSBieQorICogdGhlIGNhbGxlcnMuCisgKi8KK3N0YXRpYyB1OCBzc2QxNnh4X3BpeGVsX2x1bWEo c3RydWN0IGlvc3lzX21hcCAqc3JjLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpm YiwKKwkJCSAgICAgdW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5KQoreworCXN3aXRjaCAo ZmItPmZvcm1hdC0+Zm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX1hSR0I4ODg4OiB7CisJCXUz MiAqbGluZSA9ICh1MzIgKikoc3JjLT52YWRkciArIHkgKiBmYi0+cGl0Y2hlc1swXSk7CisJCXUz MiBweCA9IGxpbmVbeF07CisJCXU4IHIgPSAocHggPj4gMTYpICYgMHhGRiwgZyA9IChweCA+PiA4 KSAmIDB4RkYsIGIgPSBweCAmIDB4RkY7CisKKwkJcmV0dXJuICh1OCkoKDI5OXUgKiByICsgNTg3 dSAqIGcgKyAxMTR1ICogYikgLyAxMDAwdSk7CisJfQorCWNhc2UgRFJNX0ZPUk1BVF9SR0I4ODg6 IHsKKwkJdTggKmxpbmUgPSAodTggKikoc3JjLT52YWRkciArIHkgKiBmYi0+cGl0Y2hlc1swXSk7 CisJCXU4IHIgPSBsaW5lW3ggKiAzXSwgZyA9IGxpbmVbeCAqIDMgKyAxXSwgYiA9IGxpbmVbeCAq IDMgKyAyXTsKKworCQlyZXR1cm4gKHU4KSgoMjk5dSAqIHIgKyA1ODd1ICogZyArIDExNHUgKiBi KSAvIDEwMDB1KTsKKwl9CisJY2FzZSBEUk1fRk9STUFUX1JHQjU2NTogeworCQl1MTYgKmxpbmUg PSAodTE2ICopKHNyYy0+dmFkZHIgKyB5ICogZmItPnBpdGNoZXNbMF0pOworCQl1MTYgcHggPSBs aW5lW3hdOworCQl1OCByID0gKChweCA+PiAxMSkgJiAweDFGKSA8PCAzOworCQl1OCBnID0gKChw eCA+PiA1KSAmIDB4M0YpIDw8IDI7CisJCXU4IGIgPSAocHggJiAweDFGKSA8PCAzOworCisJCXJl dHVybiAodTgpKCgyOTl1ICogciArIDU4N3UgKiBnICsgMTE0dSAqIGIpIC8gMTAwMHUpOworCX0K KwljYXNlIERSTV9GT1JNQVRfUjg6IHsKKwkJdTggKmxpbmUgPSAodTggKikoc3JjLT52YWRkciAr IHkgKiBmYi0+cGl0Y2hlc1swXSk7CisKKwkJcmV0dXJuIGxpbmVbeF07CisJfQorCWNhc2UgRFJN X0ZPUk1BVF9OVjEyOgorCWNhc2UgRFJNX0ZPUk1BVF9OVjE2OgorCQlyZXR1cm4gKCh1OCAqKShz cmMtPnZhZGRyKSlbeSAqIGZiLT5waXRjaGVzWzBdICsgeF07CisJY2FzZSBEUk1fRk9STUFUX1lV WVY6IHsKKwkJdTggKmxpbmUgPSAodTggKikoc3JjLT52YWRkciArIHkgKiBmYi0+cGl0Y2hlc1sw XSk7CisKKwkJcmV0dXJuIGxpbmVbeCAqIDJdOworCX0KKwljYXNlIERSTV9GT1JNQVRfVVlWWTog eworCQl1OCAqbGluZSA9ICh1OCAqKShzcmMtPnZhZGRyICsgeSAqIGZiLT5waXRjaGVzWzBdKTsK KworCQlyZXR1cm4gbGluZVt4ICogMiArIDFdOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsK Kwl9Cit9CisKKy8qCisgKiBzc2QxNnh4X3BpeGVsX2lzX3doaXRlKCkgLSB0ZXN0IHdoZXRoZXIg YSBwaXhlbCBtYXBzIHRvIHdoaXRlIGluIDFicHAgb3V0cHV0LgorICoKKyAqIFVzZXMgZml4ZWQg dGhyZXNob2xkIG9mIDEyNy4gUGl4ZWxzIHdpdGggbHVtYSBzdHJpY3RseSBncmVhdGVyIHRoYW4g MTI3CisgKiBhcmUgcmVuZGVyZWQgd2hpdGUuCisgKi8KK3N0YXRpYyBib29sIHNzZDE2eHhfcGl4 ZWxfaXNfd2hpdGUoc3RydWN0IGlvc3lzX21hcCAqc3JjLAorCQkJCSAgIHN0cnVjdCBkcm1fZnJh bWVidWZmZXIgKmZiLAorCQkJCSAgIHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSkKK3sK KwkvKiBSMSBpcyBhbHJlYWR5IGJpbmFyaXNlZDsgYXZvaWQgdGhlIGx1bWEgY29tcHV0YXRpb24g ZW50aXJlbHkuICovCisJaWYgKGZiLT5mb3JtYXQtPmZvcm1hdCA9PSBEUk1fRk9STUFUX1IxKSB7 CisJCXU4ICpsaW5lID0gKHU4ICopKHNyYy0+dmFkZHIgKyB5ICogZmItPnBpdGNoZXNbMF0pOwor CisJCXJldHVybiAhIShsaW5lW3ggLyA4XSAmICgxIDw8ICg3IC0gKHggJSA4KSkpKTsKKwl9CisJ cmV0dXJuIHNzZDE2eHhfcGl4ZWxfbHVtYShzcmMsIGZiLCB4LCB5KSA+IDEyNzsKK30KKworLyoK KyAqIHNzZDE2eHhfcGl4ZWxfaXNfcmVkKCkgLSB0ZXN0IHdoZXRoZXIgYSBwaXhlbCBpcyBkb21p bmF0ZWQgYnkgdGhlIHJlZCBjaGFubmVsLgorICoKKyAqIE9ubHkgbWVhbmluZ2Z1bCBmb3IgZm9y bWF0cyB0aGF0IGNhcnJ5IFJHQiBpbmZvcm1hdGlvbiAoWFJHQjg4ODgsIFJHQjg4OCwKKyAqIFJH QjU2NSkuICBGb3IgbHVtYS1vbmx5IGFuZCBtb25vY2hyb21lIGZvcm1hdHMgdGhlcmUgaXMgbm8g cmVkIGNoYW5uZWwsIHNvCisgKiB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgZmFsc2U7IGNh bGxlcnMgc2hvdWxkIHVzZSBzc2QxNnh4X3BpeGVsX2lzX3doaXRlKCkKKyAqIHRvIG9idGFpbiB0 aGUgQlcgdmFsdWUgZm9yIHRob3NlIGZvcm1hdHMuCisgKgorICogUmV0dXJucyB0cnVlIHdoZW4g dGhlIHJlZCBjb21wb25lbnQgZXhjZWVkcyA1MCUgaW50ZW5zaXR5IEFORCBpcyBzdHJpY3RseQor ICogZ3JlYXRlciB0aGFuIGJvdGggZ3JlZW4gYW5kIGJsdWUgKGRvbWluYW50IHJlZCBodWUpLgor ICovCitzdGF0aWMgYm9vbCBzc2QxNnh4X3BpeGVsX2lzX3JlZChzdHJ1Y3QgaW9zeXNfbWFwICpz cmMsCisJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSB1bnNpZ25lZCBpbnQg eCwgdW5zaWduZWQgaW50IHkpCit7CisJdTMyIGZvcm1hdCA9IGZiLT5mb3JtYXQtPmZvcm1hdDsK KworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX1hSR0I4ODg4OiB7CisJCXUz MiAqbGluZSA9ICh1MzIgKikoc3JjLT52YWRkciArIHkgKiBmYi0+cGl0Y2hlc1swXSk7CisJCXUz MiBweCA9IGxpbmVbeF07CisJCXU4IHIgPSAocHggPj4gMTYpICYgMHhGRjsKKwkJdTggZyA9IChw eCA+PiA4KSAmIDB4RkY7CisJCXU4IGIgPSBweCAmIDB4RkY7CisKKwkJcmV0dXJuIHIgPiAxMjcg JiYgciA+IGcgJiYgciA+IGI7CisJfQorCWNhc2UgRFJNX0ZPUk1BVF9SR0I4ODg6IHsKKwkJdTgg KmxpbmUgPSAodTggKikoc3JjLT52YWRkciArIHkgKiBmYi0+cGl0Y2hlc1swXSk7CisJCXU4IHIg PSBsaW5lW3ggKiAzXTsKKwkJdTggZyA9IGxpbmVbeCAqIDMgKyAxXTsKKwkJdTggYiA9IGxpbmVb eCAqIDMgKyAyXTsKKworCQlyZXR1cm4gciA+IDEyNyAmJiByID4gZyAmJiByID4gYjsKKwl9CisJ Y2FzZSBEUk1fRk9STUFUX1JHQjU2NTogeworCQl1MTYgKmxpbmUgPSAodTE2ICopKHNyYy0+dmFk ZHIgKyB5ICogZmItPnBpdGNoZXNbMF0pOworCQl1MTYgcHggPSBsaW5lW3hdOworCQl1OCByID0g KChweCA+PiAxMSkgJiAweDFGKSA8PCAzOworCQl1OCBnID0gKChweCA+PiA1KSAmIDB4M0YpIDw8 IDI7CisJCXU4IGIgPSAocHggJiAweDFGKSA8PCAzOworCisJCXJldHVybiByID4gMTI3ICYmIHIg PiBnICYmIHIgPiBiOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7IC8qIE5vIGNvbG91 ciBjaGFubmVsIGluZm9ybWF0aW9uICovCisJfQorfQorCisvKgorICogc3NkMTZ4eF9jb252ZXJ0 X2ZiX3RvXzNjb2xvcigpIC0gc3BsaXQgYSBmcmFtZWJ1ZmZlciBpbnRvIEJXIGFuZCBSRUQgcGxh bmVzLgorICogQGJ3X2RzdDogIG91dHB1dCBidWZmZXIgZm9yIHRoZSBibGFjay93aGl0ZSBSQU0g cGxhbmUgKDE9d2hpdGUsIDA9YmxhY2spCisgKiBAcmVkX2RzdDogb3V0cHV0IGJ1ZmZlciBmb3Ig dGhlIHJlZCBSQU0gcGxhbmUgICAgICAgICgxPXJlZCwgICAwPW5vdCByZWQpCisgKiBAc3JjOiAg ICAgbWFwcGVkIGZyYW1lYnVmZmVyIG1lbW9yeQorICogQGZiOiAgICAgIERSTSBmcmFtZWJ1ZmZl ciBkZXNjcmlwdG9yCisgKiBAcmVjdDogICAgcmVnaW9uIHRvIGNvbnZlcnQgKG11c3QgYmUgYWxp Z25lZCB0byA4LXBpeGVsIGJvdW5kYXJpZXMpCisgKgorICogRWFjaCBvdXRwdXQgYnVmZmVyIG11 c3QgYmUgYXQgbGVhc3QgcmVjdF93aWR0aC84ICogcmVjdF9oZWlnaHQgYnl0ZXMuCisgKiBQaXhl bHMgYXJlIGNsYXNzaWZpZWQgYXM6CisgKiAgIC0gcmVkOiAgIHdyaXR0ZW4gdG8gcmVkX2RzdCBh cyAxLCBid19kc3QgYXMgMCAoYmxhY2spCisgKiAgIC0gd2hpdGU6IHdyaXR0ZW4gdG8gYndfZHN0 IGFzIDEsIHJlZF9kc3QgYXMgMAorICogICAtIGJsYWNrOiB3cml0dGVuIHRvIGJvdGggYXMgMAor ICoKKyAqIEZvciBtb25vY2hyb21lIGZvcm1hdHMgKFIxKSB3aGVyZSBubyBjb2xvdXIgaW5mb3Jt YXRpb24gaXMgYXZhaWxhYmxlIHRoZQorICogc291cmNlIGRhdGEgaXMgY29waWVkIHZlcmJhdGlt IHRvIGJ3X2RzdCBhbmQgcmVkX2RzdCBpcyBjbGVhcmVkIHRvIDB4RkYKKyAqIChhbGwtd2hpdGUg PSBubyByZWQgcGl4ZWxzKS4KKyAqLworc3RhdGljIHZvaWQgc3NkMTZ4eF9jb252ZXJ0X2ZiX3Rv XzNjb2xvcih1OCAqYndfZHN0LCB1OCAqcmVkX2RzdCwKKwkJCQkJIHN0cnVjdCBpb3N5c19tYXAg KnNyYywKKwkJCQkJIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkgc3RydWN0IGRy bV9yZWN0ICpyZWN0KQoreworCXVuc2lnbmVkIGludCB4LCB5OworCXU4IGJ3X2J5dGUgPSAwLCBy ZWRfYnl0ZSA9IDA7CisJdW5zaWduZWQgaW50IGJpdF9wb3MgPSAwOworCXVuc2lnbmVkIGludCBk c3RfaWR4ID0gMDsKKworCWRybV9kYmcoZmItPmRldiwKKwkJImNvbnZlcnRfM2NvbG9yOiBmbXQ9 JXA0Y2MgcmVjdD0oJWQsJWQpLSglZCwlZCkgcGF0aD0lc1xuIiwKKwkJJmZiLT5mb3JtYXQtPmZv cm1hdCwKKwkJcmVjdC0+eDEsIHJlY3QtPnkxLCByZWN0LT54MiwgcmVjdC0+eTIsCisJCWZiLT5m b3JtYXQtPmZvcm1hdCA9PSBEUk1fRk9STUFUX1IxID8gIlIxLWRpcmVjdCIgOiAiY29sb3ItcGl4 ZWwiKTsKKworCS8qCisJICogUjEgaXMgYWxyZWFkeSBtb25vY2hyb21lIOKAlCBubyBjb2xvdXIg Y2hhbm5lbCBleGlzdHMuCisJICogQ29weSBCVyBkYXRhIGRpcmVjdGx5IGFuZCBsZWF2ZSB0aGUg cmVkIHBsYW5lIGFsbC13aGl0ZSAodHJhbnNwYXJlbnQpLgorCSAqLworCWlmIChmYi0+Zm9ybWF0 LT5mb3JtYXQgPT0gRFJNX0ZPUk1BVF9SMSkgeworCQl1bnNpZ25lZCBpbnQgc3JjX3BpdGNoID0g ZmItPnBpdGNoZXNbMF07CisJCXVuc2lnbmVkIGludCB3aWR0aF9ieXRlcyA9IGRybV9yZWN0X3dp ZHRoKHJlY3QpIC8gODsKKwkJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IHdpZHRoX2J5dGVzICog ZHJtX3JlY3RfaGVpZ2h0KHJlY3QpOworCisJCWZvciAoeSA9IHJlY3QtPnkxOyB5IDwgcmVjdC0+ eTI7IHkrKykgeworCQkJdTggKmxpbmUgPSBzcmMtPnZhZGRyICsgeSAqIHNyY19waXRjaCArIChy ZWN0LT54MSAvIDgpOworCisJCQltZW1jcHkoYndfZHN0ICsgZHN0X2lkeCwgbGluZSwgd2lkdGhf Ynl0ZXMpOworCQkJZHN0X2lkeCArPSB3aWR0aF9ieXRlczsKKwkJfQorCQltZW1zZXQocmVkX2Rz dCwgMHhGRiwgZGF0YV9zaXplKTsgLyogMHhGRiA9IGFsbCB3aGl0ZTogbm8gcmVkIHBpeGVscyAq LworCQlyZXR1cm47CisJfQorCisJLyogVXNlIGZpeGVkIHRocmVzaG9sZCBvZiAxMjcgZm9yIGdy YXlzY2FsZSB0byBtb25vY2hyb21lIGNvbnZlcnNpb24uICovCisJZm9yICh5ID0gcmVjdC0+eTE7 IHkgPCByZWN0LT55MjsgeSsrKSB7CisJCWZvciAoeCA9IHJlY3QtPngxOyB4IDwgcmVjdC0+eDI7 IHgrKykgeworCQkJYm9vbCBpc19yZWQgPSBzc2QxNnh4X3BpeGVsX2lzX3JlZChzcmMsIGZiLCB4 LCB5KTsKKworCQkJaWYgKGlzX3JlZCkKKwkJCQlyZWRfYnl0ZSB8PSAoMSA8PCAoNyAtIGJpdF9w b3MpKTsKKwkJCWVsc2UgaWYgKHNzZDE2eHhfcGl4ZWxfaXNfd2hpdGUoc3JjLCBmYiwgeCwgeSkp CisJCQkJYndfYnl0ZSB8PSAoMSA8PCAoNyAtIGJpdF9wb3MpKTsKKwkJCS8qIGVsc2U6IGJsYWNr IHBpeGVsIOKAlCBib3RoIGJpdHMgcmVtYWluIDAgKi8KKwkJCWlmICgrK2JpdF9wb3MgPT0gOCkg eworCQkJCWJ3X2RzdFtkc3RfaWR4XSA9IGJ3X2J5dGU7CisJCQkJcmVkX2RzdFtkc3RfaWR4XSA9 IHJlZF9ieXRlOworCQkJCWRzdF9pZHgrKzsKKwkJCQlid19ieXRlID0gMDsKKwkJCQlyZWRfYnl0 ZSA9IDA7CisJCQkJYml0X3BvcyA9IDA7CisJCQl9CisJCX0KKworCQkvKiBGbHVzaCBhbnkgcGFy dGlhbCBieXRlIGF0IHRoZSBlbmQgb2YgZWFjaCByb3cgKi8KKwkJaWYgKGJpdF9wb3MgPiAwKSB7 CisJCQlid19kc3RbZHN0X2lkeF0gPSBid19ieXRlOworCQkJcmVkX2RzdFtkc3RfaWR4XSA9IHJl ZF9ieXRlOworCQkJZHN0X2lkeCsrOworCQkJYndfYnl0ZSA9IDA7CisJCQlyZWRfYnl0ZSA9IDA7 CisJCQliaXRfcG9zID0gMDsKKwkJfQorCX0KK30KKworLyoKKyAqIHNzZDE2eHhfY29udmVydF9y OF90b19yZWRfb25seSgpIC0gbWFwIGFuIFI4IGZyYW1lYnVmZmVyIHRvIHRoZSBSRUQgUkFNIHBs YW5lLgorICoKKyAqIFVzZWQgd2hlbiB0aGUgcGFuZWwgaGFzIGEgcGh5c2ljYWwgcmVkIGNvbG91 ciBwbGFuZSAocmVkX3N1cHBvcnRlZCA9PSB0cnVlKQorICogYW5kIHRoZSBmcmFtZWJ1ZmZlciBm b3JtYXQgaXMgRFJNX0ZPUk1BVF9SOC4gIFBpeGVscyB3aXRoIHZhbHVlID49IDEyOCBhcmUKKyAq IHRyZWF0ZWQgYXMgcmVkIGluazsgdGhlIEJXIFJBTSBpcyBzZXQgdG8gYWxsLXdoaXRlIHNvIHRo YXQgb25seSByZWQgaW5rCisgKiBhcHBlYXJzIG9uIHRoZSB3aGl0ZSBiYWNrZ3JvdW5kLgorICoK KyAqIEhhcmR3YXJlIG9yaWVudGF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlciB2aWEgUkFN IGNvdW50ZXIgcG9zaXRpb25pbmc7CisgKiBkYXRhIGlzIHdyaXR0ZW4gaW4gbm9ybWFsIHJvdy1t YWpvciBvcmRlciBoZXJlIChzYW1lIGFzIGNvbnZlcnRfZmJfdG9fM2NvbG9yKS4KKyAqLworc3Rh dGljIHZvaWQgc3NkMTZ4eF9jb252ZXJ0X3I4X3RvX3JlZF9vbmx5KHU4ICpid19kc3QsIHU4ICpy ZWRfZHN0LAorCQkJCQkgICBzdHJ1Y3QgaW9zeXNfbWFwICpzcmMsCisJCQkJCSAgIHN0cnVjdCBk cm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCQkgICBzdHJ1Y3QgZHJtX3JlY3QgKnJlY3QpCit7CisJ dW5zaWduZWQgaW50IHNyY19waXRjaCA9IGZiLT5waXRjaGVzWzBdOworCXVuc2lnbmVkIGludCB3 aWR0aCA9IGRybV9yZWN0X3dpZHRoKHJlY3QpOworCXVuc2lnbmVkIGludCBoZWlnaHQgPSBkcm1f cmVjdF9oZWlnaHQocmVjdCk7CisJdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IERJVl9ST1VORF9V UCh3aWR0aCwgOCkgKiBoZWlnaHQ7CisJdW5zaWduZWQgaW50IGRzdF9pZHggPSAwOworCXVuc2ln bmVkIGludCB4LCB5OworCXU4IHJlZF9ieXRlID0gMDsKKwl1bnNpZ25lZCBpbnQgYml0X3BvcyA9 IDA7CisKKwkvKiBCVyBSQU06IGFsbC13aGl0ZSBiYWNrZ3JvdW5kIC0gbm8gYmxhY2sgaW5rLCBv bmx5IHJlZCBpbmsgc2hvd3MgKi8KKwltZW1zZXQoYndfZHN0LCAweEZGLCBkYXRhX3NpemUpOwor CisJLyogUkVEIFJBTTogUjggPj0gMTI4IC0+IHJlZCBpbmsgKDEtYml0IHNldCkgKi8KKwlmb3Ig KHkgPSByZWN0LT55MTsgeSA8IHJlY3QtPnkyOyB5KyspIHsKKwkJdTggKmxpbmUgPSBzcmMtPnZh ZGRyICsgeSAqIHNyY19waXRjaDsKKworCQlmb3IgKHggPSByZWN0LT54MTsgeCA8IHJlY3QtPngy OyB4KyspIHsKKwkJCWlmIChsaW5lW3hdID49IDEyOCkKKwkJCQlyZWRfYnl0ZSB8PSAoMSA8PCAo NyAtIGJpdF9wb3MpKTsKKwkJCWlmICgrK2JpdF9wb3MgPT0gOCkgeworCQkJCXJlZF9kc3RbZHN0 X2lkeCsrXSA9IHJlZF9ieXRlOworCQkJCXJlZF9ieXRlID0gMDsKKwkJCQliaXRfcG9zID0gMDsK KwkJCX0KKwkJfQorCQlpZiAoYml0X3BvcyA+IDApIHsKKwkJCXJlZF9kc3RbZHN0X2lkeCsrXSA9 IHJlZF9ieXRlOworCQkJcmVkX2J5dGUgPSAwOworCQkJYml0X3BvcyA9IDA7CisJCX0KKwl9Cit9 CisKKy8qCisgKiBDb252ZXJ0IGZyYW1lYnVmZmVyIHRvIDEtYml0IG1vbm9jaHJvbWUgZm9yIGUt cGFwZXIgZGlzcGxheS4KKyAqCisgKiBTdXBwb3J0ZWQgZm9ybWF0czogWFJHQjg4ODgsIFJHQjg4 OCwgUkdCNTY1LCBSOCwgTlYxMiwgTlYxNiwgWVVZViwgVVlWWSwgUjEuCisgKiBGb3IgY29sb3Vy IGFuZCBsdW1hIGZvcm1hdHMsIE90c3UncyBnbG9iYWwgYmluYXJpc2F0aW9uIG1ldGhvZCBjb21w dXRlcyBhbgorICogb3B0aW1hbCBwZXItaW1hZ2UgdGhyZXNob2xkIGZyb20gdGhlIGx1bWluYW5j ZSBoaXN0b2dyYW0uCisgKiBSMSBpcyB0aGUgY29udHJvbGxlcidzIG5hdGl2ZSBmb3JtYXQgYW5k IGJ5cGFzc2VzIGNvbnZlcnNpb24gZW50aXJlbHkuCisgKgorICogT3V0cHV0IGxheW91dDoKKyAq ICAgMMKwLzE4MMKwICBsYW5kc2NhcGU6IHJvdy1tYWpvciwgbGVmdC10by1yaWdodCwgdG9wLXRv LWJvdHRvbQorICogICA5MMKwLzI3MMKwIENXIHBvcnRyYWl0OiBjb2x1bW4tbWFqb3IsIHJpZ2h0 bW9zdCBjb2x1bW4gZmlyc3QKKyAqLworc3RhdGljIHZvaWQgc3NkMTZ4eF9jb252ZXJ0X2ZiX3Rv XzFicHAodTggKmRzdCwgc3RydWN0IGlvc3lzX21hcCAqc3JjLAorCQkJCSAgICAgICBzdHJ1Y3Qg ZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9yZWN0ICpyZWN0LAor CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb3JpZW50YXRpb24pCit7CisJdTMyIGZvcm1hdCA9IGZi LT5mb3JtYXQtPmZvcm1hdDsKKwlpbnQgeCwgeTsKKwl1OCBieXRlID0gMDsKKwl1bnNpZ25lZCBp bnQgYml0X3BvcyA9IDA7CisJdW5zaWduZWQgaW50IGRzdF9pZHggPSAwOworCisJLyogVXNlIGZp eGVkIHRocmVzaG9sZCBvZiAxMjcgZm9yIGdyYXlzY2FsZSB0byBtb25vY2hyb21lIGNvbnZlcnNp b24uICovCisJZHJtX2RiZyhmYi0+ZGV2LAorCQkiY29udmVydF8xYnBwOiBmbXQ9JXA0Y2MgcmVj dD0oJWQsJWQpLSglZCwlZCkgb3JpZW50PSV1wrAgcGF0aD0lc1xuIiwKKwkJJmZiLT5mb3JtYXQt PmZvcm1hdCwKKwkJcmVjdC0+eDEsIHJlY3QtPnkxLCByZWN0LT54MiwgcmVjdC0+eTIsCisJCW9y aWVudGF0aW9uLAorCQkoZm9ybWF0ID09IERSTV9GT1JNQVRfUjEgJiYgb3JpZW50YXRpb24gPT0g MCAmJiByZWN0LT54MSAlIDggPT0gMCkgPyAiUjEtZmFzdCIgOgorCQkob3JpZW50YXRpb24gPT0g OTAgfHwgb3JpZW50YXRpb24gPT0gMjcwKSA/ICJwb3J0cmFpdCIgOiAibGFuZHNjYXBlIik7CisK KwkvKgorCSAqIFIxIGZhc3QgcGF0aDogMMKwIGxhbmRzY2FwZSB3aXRoIGJ5dGUtYWxpZ25lZCBy ZWN0LgorCSAqIFIxIGlzIGFscmVhZHkgMWJwcCBzbyBsYW5kc2NhcGUgcm93cyBtYXAgZGlyZWN0 bHkgdG8gb3V0cHV0IGJ5dGVzIHZpYQorCSAqIG1lbWNweSDigJQgbm8gcGVyLXBpeGVsIGNvbXB1 dGF0aW9uIG5lZWRlZC4gIHJlY3QtPngxIG11c3QgYmUgYQorCSAqIG11bHRpcGxlIG9mIDggc28g dGhhdCAocmVjdC0+eDEgLyA4KSBnaXZlcyB0aGUgY29ycmVjdCBieXRlIG9mZnNldDsKKwkgKiBp ZiBub3QsIHRoZSBnZW5lcmljIHBpeGVsLWJ5LXBpeGVsIGxvb3AgYmVsb3cgaGFuZGxlcyBub24t YWxpZ25lZAorCSAqIHJlY3RzIHNhZmVseS4KKwkgKi8KKwlpZiAoZm9ybWF0ID09IERSTV9GT1JN QVRfUjEgJiYgb3JpZW50YXRpb24gPT0gMCAmJiByZWN0LT54MSAlIDggPT0gMCkgeworCQl1bnNp Z25lZCBpbnQgc3JjX3BpdGNoID0gZmItPnBpdGNoZXNbMF07CisJCXVuc2lnbmVkIGludCB3aWR0 aF9ieXRlcyA9IGRybV9yZWN0X3dpZHRoKHJlY3QpIC8gODsKKworCQlmb3IgKHkgPSByZWN0LT55 MTsgeSA8IHJlY3QtPnkyOyB5KyspIHsKKwkJCXU4ICpzcmNfbGluZSA9IHNyYy0+dmFkZHIgKyB5 ICogc3JjX3BpdGNoICsgKHJlY3QtPngxIC8gOCk7CisKKwkJCW1lbWNweShkc3QgKyBkc3RfaWR4 LCBzcmNfbGluZSwgd2lkdGhfYnl0ZXMpOworCQkJZHN0X2lkeCArPSB3aWR0aF9ieXRlczsKKwkJ fQorCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChvcmllbnRhdGlvbikgeworCWNhc2UgOTA6CisJ Y2FzZSAyNzA6CisJCS8qCisJCSAqIFBvcnRyYWl0ICg5MMKwIG9yIDI3MMKwKTogY29sdW1uLW1h am9yIHBhY2tpbmcuCisJCSAqIEVhY2ggcG9ydHJhaXQgc291cmNlIGNvbHVtbiBiZWNvbWVzIG9u ZSBwaHlzaWNhbCBSQU0gcm93LgorCQkgKiBUaGUgZGF0YSBlbnRyeSBtb2RlIGFuZCBjdXJzb3Ig cG9zaXRpb24gY29udHJvbCBzY2FuIGRpcmVjdGlvbi4KKwkJICovCisJCWZvciAoeCA9IHJlY3Qt PngyIC0gMTsgeCA+PSAoaW50KXJlY3QtPngxOyB4LS0pIHsKKwkJCWZvciAoeSA9IHJlY3QtPnkx OyB5IDwgcmVjdC0+eTI7IHkrKykgeworCQkJCWlmIChzc2QxNnh4X3BpeGVsX2lzX3doaXRlKHNy YywgZmIsIHgsIHkpKQorCQkJCQlieXRlIHw9ICgxIDw8ICg3IC0gYml0X3BvcykpOworCQkJCWlm ICgrK2JpdF9wb3MgPT0gOCkgeworCQkJCQlkc3RbZHN0X2lkeCsrXSA9IGJ5dGU7CisJCQkJCWJ5 dGUgPSAwOworCQkJCQliaXRfcG9zID0gMDsKKwkJCQl9CisJCQl9CisJCQlpZiAoYml0X3BvcyA+ IDApIHsKKwkJCQlkc3RbZHN0X2lkeCsrXSA9IGJ5dGU7CisJCQkJYnl0ZSA9IDA7CisJCQkJYml0 X3BvcyA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDA6CisJY2FzZSAxODA6CisJ ZGVmYXVsdDoKKwkJLyoKKwkJICogTGFuZHNjYXBlICgwwrAgb3IgMTgwwrApOiByb3ctbWFqb3Ig cGFja2luZy4KKwkJICogRWFjaCBsYW5kc2NhcGUgc291cmNlIHJvdyBiZWNvbWVzIG9uZSBwaHlz aWNhbCBSQU0gcm93LgorCQkgKiBUaGUgZGF0YSBlbnRyeSBtb2RlIGFuZCBjdXJzb3IgcG9zaXRp b24gY29udHJvbCBzY2FuIGRpcmVjdGlvbi4KKwkJICovCisJCWZvciAoeSA9IHJlY3QtPnkxOyB5 IDwgcmVjdC0+eTI7IHkrKykgeworCQkJZm9yICh4ID0gcmVjdC0+eDE7IHggPCByZWN0LT54Mjsg eCsrKSB7CisJCQkJaWYgKHNzZDE2eHhfcGl4ZWxfaXNfd2hpdGUoc3JjLCBmYiwgeCwgeSkpCisJ CQkJCWJ5dGUgfD0gKDEgPDwgKDcgLSBiaXRfcG9zKSk7CisJCQkJaWYgKCsrYml0X3BvcyA9PSA4 KSB7CisJCQkJCWRzdFtkc3RfaWR4KytdID0gYnl0ZTsKKwkJCQkJYnl0ZSA9IDA7CisJCQkJCWJp dF9wb3MgPSAwOworCQkJCX0KKwkJCX0KKwkJCWlmIChiaXRfcG9zID4gMCkgeworCQkJCWRzdFtk c3RfaWR4KytdID0gYnl0ZTsKKwkJCQlieXRlID0gMDsKKwkJCQliaXRfcG9zID0gMDsKKwkJCX0K KwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3NkMTZ4eF9mYl9kaXJ0eShzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgc3RydWN0IGRybV9yZWN0ICpyZWN0LAorCQkJICAgIHN0 cnVjdCBzc2QxNnh4X3BhbmVsICpwYW5lbCkKK3sKKwljb25zdCB1OCAqY3RybDJfdGJsID0gcGFu ZWwtPmNvbnRyb2xsZXJfY2ZnLT5jdHJsMl9yZWZyZXNoOworCXN0cnVjdCBkcm1fZ2VtX2RtYV9v YmplY3QgKmRtYV9vYmogPSBkcm1fZmJfZG1hX2dldF9nZW1fb2JqKGZiLCAwKTsKKwlzdHJ1Y3Qg aW9zeXNfbWFwIG1hcDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBpbnQgZGF0YV9zaXplID0g KHBhbmVsLT53aWR0aCAqIHBhbmVsLT5oZWlnaHQpIC8gODsKKwl1OCAqbW9ub19idWZmZXIgPSBO VUxMOworCXU4ICpyZWRfYnVmZmVyID0gTlVMTDsKKwl1MTYgcmFtX3hfc3RhcnQsIHJhbV94X2Vu ZCwgcmFtX3lfc3RhcnQsIHJhbV95X2VuZDsKKworCS8qIFByb2Nlc3MgZnVsbCBkaXNwbGF5IGFy ZWE7IGNvbnZlcnQgaGFuZGxlcyBvcmllbnRhdGlvbiB0cmF2ZXJzYWwuICovCisJcmVjdC0+eDEg PSAwOworCXJlY3QtPnkxID0gMDsKKwlyZWN0LT54MiA9IHBhbmVsLT53aWR0aDsKKwlyZWN0LT55 MiA9IHBhbmVsLT5oZWlnaHQ7CisKKwlkcm1fZGJnKCZwYW5lbC0+ZHJtLAorCQkiZmJfZGlydHk6 IGZiPSVkeCVkLCByZWZyZXNoX21vZGU9JWQsIG9yaWVudGF0aW9uPSVkXG4iLAorCQlmYi0+d2lk dGgsIGZiLT5oZWlnaHQsIHBhbmVsLT5yZWZyZXNoX21vZGUsIHBhbmVsLT5vcmllbnRhdGlvbik7 CisKKwltb25vX2J1ZmZlciA9IHBhbmVsLT50eF9idWY7CisJbWVtc2V0KG1vbm9fYnVmZmVyLCAw LCBkYXRhX3NpemUpOworCisJLyogMy1jb2xvdXIgRlVMTC9GQVNUOiBwb3B1bGF0ZSByZWQgY2hh bm5lbC4gKi8KKwlpZiAocGFuZWwtPmNvbG9yX21vZGUgPT0gU1NEMTZYWF9DT0xPUl9NT0RFXzND T0xPUiAmJgorCSAgICAocGFuZWwtPnJlZnJlc2hfbW9kZSA9PSBTU0QxNlhYX1JFRlJFU0hfRlVM TCB8fAorCSAgICAgcGFuZWwtPnJlZnJlc2hfbW9kZSA9PSBTU0QxNlhYX1JFRlJFU0hfRkFTVCkp IHsKKwkJcmVkX2J1ZmZlciA9IHBhbmVsLT50eF9yZWRfYnVmOworCQltZW1zZXQocmVkX2J1ZmZl ciwgMCwgZGF0YV9zaXplKTsKKwl9CisKKwlpb3N5c19tYXBfc2V0X3ZhZGRyKCZtYXAsIGRtYV9v YmotPnZhZGRyKTsKKworCWlmIChyZWRfYnVmZmVyICYmIGZiLT5mb3JtYXQtPmZvcm1hdCA9PSBE Uk1fRk9STUFUX1I4KQorCQlzc2QxNnh4X2NvbnZlcnRfcjhfdG9fcmVkX29ubHkobW9ub19idWZm ZXIsIHJlZF9idWZmZXIsICZtYXAsIGZiLCByZWN0KTsKKwllbHNlIGlmIChyZWRfYnVmZmVyKQor CQlzc2QxNnh4X2NvbnZlcnRfZmJfdG9fM2NvbG9yKG1vbm9fYnVmZmVyLCByZWRfYnVmZmVyLCAm bWFwLCBmYiwgcmVjdCk7CisJZWxzZQorCQlzc2QxNnh4X2NvbnZlcnRfZmJfdG9fMWJwcChtb25v X2J1ZmZlciwgJm1hcCwgZmIsIHJlY3QsIHBhbmVsLT5vcmllbnRhdGlvbik7CisKKwlkcm1fZGJn KCZwYW5lbC0+ZHJtLAorCQkiZmJfZGlydHk6IG1vbm9bMC4uM109MHglMDJ4IDB4JTAyeCAweCUw MnggMHglMDJ4IChkYXRhX3NpemU9JXUpXG4iLAorCQltb25vX2J1ZmZlclswXSwgbW9ub19idWZm ZXJbMV0sIG1vbm9fYnVmZmVyWzJdLCBtb25vX2J1ZmZlclszXSwKKwkJZGF0YV9zaXplKTsKKwor CS8qIFNldCBSQU0gd2luZG93IGFuZCBjdXJzb3IgZm9yIGN1cnJlbnQgb3JpZW50YXRpb24uICov CisJcmFtX3hfc3RhcnQgPSAwOworCXJhbV94X2VuZCA9IChwYW5lbC0+Y29udHJvbGxlcl9jZmct Pm1heF93aWR0aCAvIDgpIC0gMTsKKwlyYW1feV9zdGFydCA9IDA7CisJcmFtX3lfZW5kID0gcGFu ZWwtPmNvbnRyb2xsZXJfY2ZnLT5tYXhfaGVpZ2h0IC0gMTsKKworCXN3aXRjaCAocGFuZWwtPm9y aWVudGF0aW9uKSB7CisJY2FzZSA5MDoKKwljYXNlIDE4MDoKKwkJLyogOTDCsC8xODDCsDogWERF Q19ZREVDIG1vZGUsIHNlbmQgZW5kLWJlZm9yZS1zdGFydDsgY3Vyc29yIGF0IChtYXgsIG1heCku ICovCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX1NFVF9SQU1fWF9BRERS RVNTX1NUQVJUX0VORCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF94X3BhcmFtKHBhbmVsLCByYW1f eF9lbmQsICZlcnIpOworCQlzc2QxNnh4X3NlbmRfeF9wYXJhbShwYW5lbCwgcmFtX3hfc3RhcnQs ICZlcnIpOworCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX1NFVF9SQU1f WV9BRERSRVNTX1NUQVJUX0VORCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF95X3BhcmFtKHBhbmVs LCByYW1feV9lbmQsICZlcnIpOworCQlzc2QxNnh4X3NlbmRfeV9wYXJhbShwYW5lbCwgcmFtX3lf c3RhcnQsICZlcnIpOworCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX1NF VF9SQU1fWF9BRERSRVNTX0NPVU5URVIsICZlcnIpOworCQlzc2QxNnh4X3NlbmRfeF9wYXJhbShw YW5lbCwgcmFtX3hfZW5kLCAmZXJyKTsKKworCQlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0Qx NlhYX0NNRF9TRVRfUkFNX1lfQUREUkVTU19DT1VOVEVSLCAmZXJyKTsKKwkJc3NkMTZ4eF9zZW5k X3lfcGFyYW0ocGFuZWwsIHJhbV95X2VuZCwgJmVycik7CisJCWJyZWFrOworCisJZGVmYXVsdDog LyogMMKwLzI3MMKwICovCisJCS8qIDDCsC8yNzDCsDogWElOQ19ZSU5DIG1vZGUsIGN1cnNvciBh dCAoMCwgMCkuICovCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01EX1NFVF9S QU1fWF9BRERSRVNTX1NUQVJUX0VORCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF94X3BhcmFtKHBh bmVsLCByYW1feF9zdGFydCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF94X3BhcmFtKHBhbmVsLCBy YW1feF9lbmQsICZlcnIpOworCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2WFhfQ01E X1NFVF9SQU1fWV9BRERSRVNTX1NUQVJUX0VORCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF95X3Bh cmFtKHBhbmVsLCByYW1feV9zdGFydCwgJmVycik7CisJCXNzZDE2eHhfc2VuZF95X3BhcmFtKHBh bmVsLCByYW1feV9lbmQsICZlcnIpOworCisJCXNzZDE2eHhfc2VuZF9jbWQocGFuZWwsIFNTRDE2 WFhfQ01EX1NFVF9SQU1fWF9BRERSRVNTX0NPVU5URVIsICZlcnIpOworCQlzc2QxNnh4X3NlbmRf eF9wYXJhbShwYW5lbCwgcmFtX3hfc3RhcnQsICZlcnIpOworCisJCXNzZDE2eHhfc2VuZF9jbWQo cGFuZWwsIFNTRDE2WFhfQ01EX1NFVF9SQU1fWV9BRERSRVNTX0NPVU5URVIsICZlcnIpOworCQlz c2QxNnh4X3NlbmRfeV9wYXJhbShwYW5lbCwgcmFtX3lfc3RhcnQsICZlcnIpOworCQlicmVhazsK Kwl9CisKKwlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0QxNlhYX0NNRF9XUklURV9SQU1fQlcs ICZlcnIpOworCXNzZDE2eHhfc2VuZF9kYXRhX2J1bGsocGFuZWwsIG1vbm9fYnVmZmVyLCBkYXRh X3NpemUsICZlcnIpOworCisJLyogUmUtc2VuZCBib3JkZXIgd2F2ZWZvcm0gd2hlbjogZXZlcnkt dXBkYXRlIG1vZGUsIGluaXQgZnJhbWUsIG9yCisJICogdGhlIGJvcmRlcl93YXZlZm9ybV91cGRh dGUgcHJvcGVydHkganVzdCBjaGFuZ2VkIChvbmUtc2hvdCkuCisJICovCisJZHJtX2RiZygmcGFu ZWwtPmRybSwKKwkJImZiX2RpcnR5OiBib3JkZXIgY2hlY2s6IGV2ZXJ5X3VwZGF0ZT0lZCBpbml0 X3BlbmRpbmc9JWQgYm9yZGVyX3BlbmRpbmc9JWQgaWR4PSVkIGh3PTB4JTAyeFxuIiwKKwkJcGFu ZWwtPmJvcmRlcl9yZWZyZXNoX29uX2V2ZXJ5X3VwZGF0ZSwgcGFuZWwtPmluaXRfcmVmcmVzaF9w ZW5kaW5nLAorCQlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX3BlbmRpbmcsIHBhbmVsLT5ib3JkZXJf d2F2ZWZvcm1fdXBkYXRlX2lkeCwKKwkJcGFuZWwtPmNvbnRyb2xsZXJfY2ZnLT5ib3JkZXJfd2F2 ZWZvcm1fdGFibGVbcGFuZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfaWR4XSk7CisJaWYgKHBh bmVsLT5ib3JkZXJfcmVmcmVzaF9vbl9ldmVyeV91cGRhdGUgfHwgcGFuZWwtPmluaXRfcmVmcmVz aF9wZW5kaW5nIHx8CisJICAgIHBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1fcGVuZGluZykgeworCQl1 OCBpZHggPSBwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX3VwZGF0ZV9pZHg7CisJCXU4IGJvcmRlciA9 IHBhbmVsLT5jb250cm9sbGVyX2NmZy0+Ym9yZGVyX3dhdmVmb3JtX3RhYmxlW2lkeF07CisKKwkJ ZHJtX2RiZygmcGFuZWwtPmRybSwgImZiX2RpcnR5OiBTZW5kaW5nIGJvcmRlciB3YXZlZm9ybTog MHglMDJ4XG4iLAorCQkJYm9yZGVyKTsKKwkJc3NkMTZ4eF9zZW5kX2NtZChwYW5lbCwgU1NEMTZY WF9DTURfQk9SREVSX1dBVkVGT1JNX0NPTlRST0wsICZlcnIpOworCQlzc2QxNnh4X3NlbmRfZGF0 YShwYW5lbCwgYm9yZGVyLCAmZXJyKTsKKwkJcGFuZWwtPmJvcmRlcl93YXZlZm9ybV9wZW5kaW5n ID0gZmFsc2U7CisJfQorCisJc3dpdGNoIChwYW5lbC0+cmVmcmVzaF9tb2RlKSB7CisJY2FzZSBT U0QxNlhYX1JFRlJFU0hfRlVMTDoKKwkJLyoKKwkJICogQlcgZnVsbCByZWZyZXNoOiB3cml0ZSBS RUQgUkFNIEJFRk9SRSBkaXNwbGF5X3VwZGF0ZQorCQkgKiB0byBhdm9pZCBhIHBvc3QtQlVTWSB3 cml0ZSB0aW1pbmcgaXNzdWUgb24gc29tZQorCQkgKiBjb250cm9sbGVyIHJldmlzaW9ucyB0aGF0 IHNpbGVudGx5IGNvcnJ1cHRzIFJFRCBSQU0uCisJCSAqIFJFRCBSQU0gaXMgdGhlbiBieXBhc3Nl ZCAoQ1RSTDFfQllQQVNTX1JFRF9SQU0pIHNvCisJCSAqIHN0YWxlIFJFRCBSQU0gY29udGVudCBk b2VzIG5vdCBhZmZlY3QgdGhlIG91dHB1dC4KKwkJICovCisJCXNzZDE2eHhfc2VuZF9jbWQocGFu ZWwsIFNTRDE2ODNfQ01EX1dSSVRFX1JBTV9SRUQsICZlcnIpOworCQlpZiAocmVkX2J1ZmZlcikg eworCQkJLyogMy1jb2xvdXI6IHdyaXRlIHJlZCBjaGFubmVsIGJlZm9yZSBhY3RpdmF0aW5nICov CisJCQlzc2QxNnh4X3NlbmRfZGF0YV9idWxrKHBhbmVsLCByZWRfYnVmZmVyLCBkYXRhX3NpemUs ICZlcnIpOworCQkJc3NkMTZ4eF9kaXNwbGF5X3VwZGF0ZShwYW5lbCwgcGFuZWwtPmNvbnRyb2xs ZXJfY2ZnLT5jdHJsMV9ub3JtYWwsCisJCQkJCSAgICAgICBTU0QxNlhYX0NUUkwxX0JZVEUyX0RF RkFVTFQsCisJCQkJCSAgICAgICBjdHJsMl90YmxbU1NEMTZYWF9SRUZSRVNIX0ZVTExdLCAmZXJy KTsKKwkJfSBlbHNlIHsKKwkJCXNzZDE2eHhfc2VuZF9kYXRhX2J1bGsocGFuZWwsIG1vbm9fYnVm ZmVyLCBkYXRhX3NpemUsICZlcnIpOworCQkJc3NkMTZ4eF9kaXNwbGF5X3VwZGF0ZShwYW5lbCwg cGFuZWwtPmNvbnRyb2xsZXJfY2ZnLT5jdHJsMV9ieXBhc3NfcmVkX3JhbSwKKwkJCQkJICAgICAg IFNTRDE2WFhfQ1RSTDFfQllURTJfREVGQVVMVCwKKwkJCQkJICAgICAgIGN0cmwyX3RibFtTU0Qx NlhYX1JFRlJFU0hfRlVMTF0sICZlcnIpOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NEMTZYWF9S RUZSRVNIX0ZBU1Q6CisJCS8qCisJCSAqIEZhc3QgcmVmcmVzaDogTFVUIHByZS1sb2FkZWQgZHVy aW5nIGh3X2luaXQ7IEJZUEFTU19SRURfUkFNCisJCSAqIHNvIFJFRCBSQU0gZG9lcyBub3QgYWZm ZWN0IHRoZSBjdXJyZW50IG91dHB1dC4KKwkJICogV3JpdGUgUkVEIFJBTSBCRUZPUkUgZGlzcGxh eV91cGRhdGUgKHNhbWUgcmVhc29uaW5nIGFzIEZVTEwpCisJCSAqIHNvIGl0IGhvbGRzIHRoZSBq dXN0LWRpc3BsYXllZCBmcmFtZSBhcyBhIHZhbGlkIHJlZmVyZW5jZSBmb3IKKwkJICogYW55IHN1 YnNlcXVlbnQgUEFSVElBTCByZWZyZXNoLgorCQkgKi8KKworCQlzc2QxNnh4X3NlbmRfY21kKHBh bmVsLCBTU0QxNjgzX0NNRF9XUklURV9SQU1fUkVELCAmZXJyKTsKKwkJaWYgKHJlZF9idWZmZXIp IHsKKwkJCS8qIDMtY29sb3VyOiB3cml0ZSByZWQgY2hhbm5lbCBiZWZvcmUgYWN0aXZhdGluZyAq LworCQkJc3NkMTZ4eF9zZW5kX2RhdGFfYnVsayhwYW5lbCwgcmVkX2J1ZmZlciwgZGF0YV9zaXpl LCAmZXJyKTsKKwkJCXNzZDE2eHhfZGlzcGxheV91cGRhdGUocGFuZWwsIHBhbmVsLT5jb250cm9s bGVyX2NmZy0+Y3RybDFfbm9ybWFsLAorCQkJCQkgICAgICAgU1NEMTZYWF9DVFJMMV9CWVRFMl9E RUZBVUxULAorCQkJCQkgICAgICAgY3RybDJfdGJsW1NTRDE2WFhfUkVGUkVTSF9GQVNUXSwgJmVy cik7CisJCX0gZWxzZSB7CisJCQlzc2QxNnh4X3NlbmRfZGF0YV9idWxrKHBhbmVsLCBtb25vX2J1 ZmZlciwgZGF0YV9zaXplLCAmZXJyKTsKKwkJCXNzZDE2eHhfZGlzcGxheV91cGRhdGUocGFuZWws IHBhbmVsLT5jb250cm9sbGVyX2NmZy0+Y3RybDFfYnlwYXNzX3JlZF9yYW0sCisJCQkJCSAgICAg ICBTU0QxNlhYX0NUUkwxX0JZVEUyX0RFRkFVTFQsCisJCQkJCSAgICAgICBjdHJsMl90YmxbU1NE MTZYWF9SRUZSRVNIX0ZBU1RdLCAmZXJyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTRDE2WFhf UkVGUkVTSF9QQVJUSUFMOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIFBhcnRpYWwgcmVmcmVzaDog Ym90aCBSQU1zIHVzZWQgZm9yIHRyYW5zaXRpb24gd2F2ZWZvcm1zLgorCQkgKiBSRUQgUkFNIG11 c3QgaG9sZCB0aGUgUFJFVklPVVMgZnJhbWUgKD0gY3VycmVudCBkaXNwbGF5CisJCSAqIGNvbnRl bnQpIHNvIHRoZSBjb250cm9sbGVyIGNhbiBjb21wdXRlIHBpeGVsIHRyYW5zaXRpb25zLgorCQkg KiBXcml0ZSBSRUQgUkFNIEFGVEVSIGRpc3BsYXlfdXBkYXRlIHNvIGl0IGNhcHR1cmVzIHRoZQor CQkgKiBqdXN0LWRpc3BsYXllZCBmcmFtZSBhcyB0aGUgcmVmZXJlbmNlIGZvciB0aGUgbmV4dCBw YXJ0aWFsLgorCQkgKi8KKwkJZHJtX2RiZygmcGFuZWwtPmRybSwKKwkJCSJmYl9kaXJ0eTogcGFy dGlhbCBwcmUtdXBkYXRlOiBtb25vWzBdPTB4JTAyeCAoQlc9bmV3LCBSRUQ9cHJldilcbiIsCisJ CQltb25vX2J1ZmZlclswXSk7CisJCXNzZDE2eHhfZGlzcGxheV91cGRhdGUocGFuZWwsIHBhbmVs LT5jb250cm9sbGVyX2NmZy0+Y3RybDFfbm9ybWFsLAorCQkJCSAgICAgICBTU0QxNlhYX0NUUkwx X0JZVEUyX0RFRkFVTFQsCisJCQkJICAgICAgIGN0cmwyX3RibFtTU0QxNlhYX1JFRlJFU0hfUEFS VElBTF0sICZlcnIpOworCQlzc2QxNnh4X3NlbmRfY21kKHBhbmVsLCBTU0QxNjgzX0NNRF9XUklU RV9SQU1fUkVELCAmZXJyKTsKKwkJc3NkMTZ4eF9zZW5kX2RhdGFfYnVsayhwYW5lbCwgbW9ub19i dWZmZXIsIGRhdGFfc2l6ZSwgJmVycik7CisJCWRybV9kYmcoJnBhbmVsLT5kcm0sCisJCQkiZmJf ZGlydHk6IHBhcnRpYWwgcG9zdC11cGRhdGU6IHdyb3RlIFJFRCBiYXNlbGluZSBtb25vWzBdPTB4 JTAyeFxuIiwKKwkJCW1vbm9fYnVmZmVyWzBdKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVy cjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBsYW5lIEZ1bmN0aW9ucworICov CisKK3N0YXRpYyB2b2lkIHNzZDE2eHhfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpw bGFuZSkKK3sKKwlkcm1fcGxhbmVfY2xlYW51cChwbGFuZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNz ZDE2eHhfcGxhbmVfcmVzZXQoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJZHJtX2F0b21p Y19oZWxwZXJfcGxhbmVfcmVzZXQocGxhbmUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9wbGFuZV9mdW5jcyBzc2QxNnh4X3BsYW5lX2Z1bmNzID0geworCS51cGRhdGVfcGxhbmUgPSBk cm1fYXRvbWljX2hlbHBlcl91cGRhdGVfcGxhbmUsCisJLmRpc2FibGVfcGxhbmUgPSBkcm1fYXRv bWljX2hlbHBlcl9kaXNhYmxlX3BsYW5lLAorCS5kZXN0cm95ID0gc3NkMTZ4eF9wbGFuZV9kZXN0 cm95LAorCS5yZXNldCA9IHNzZDE2eHhfcGxhbmVfcmVzZXQsCisJLmF0b21pY19kdXBsaWNhdGVf c3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kdXBsaWNhdGVfc3RhdGUsCisJLmF0b21p Y19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfZGVzdHJveV9zdGF0ZSwK K307CisKK3N0YXRpYyBpbnQgc3NkMTZ4eF9wbGFuZV9hdG9taWNfY2hlY2soc3RydWN0IGRybV9w bGFuZSAqcGxhbmUsCisJCQkJICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQor eworCXN0cnVjdCBkcm1fcGxhbmVfc3RhdGUgKm5ld19wbGFuZV9zdGF0ZSA9CisJCWRybV9hdG9t aWNfZ2V0X25ld19wbGFuZV9zdGF0ZShzdGF0ZSwgcGxhbmUpOworCXN0cnVjdCBkcm1fY3J0Y19z dGF0ZSAqY3J0Y19zdGF0ZTsKKworCWlmICghbmV3X3BsYW5lX3N0YXRlLT5jcnRjKQorCQlyZXR1 cm4gMDsKKworCWNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShzdGF0 ZSwgbmV3X3BsYW5lX3N0YXRlLT5jcnRjKTsKKworCXJldHVybiBkcm1fYXRvbWljX2hlbHBlcl9j aGVja19wbGFuZV9zdGF0ZShuZXdfcGxhbmVfc3RhdGUsIGNydGNfc3RhdGUsCisJCQkJCQkgICBE Uk1fUExBTkVfTk9fU0NBTElORywKKwkJCQkJCSAgIERSTV9QTEFORV9OT19TQ0FMSU5HLAorCQkJ CQkJICAgZmFsc2UsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgc3NkMTZ4eF9wbGFuZV9hdG9t aWNfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCQlzdHJ1Y3QgZHJtX2F0b21p Y19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqb2xkX3N0YXRlID0g ZHJtX2F0b21pY19nZXRfb2xkX3BsYW5lX3N0YXRlKHN0YXRlLCBwbGFuZSk7CisJc3RydWN0IGRy bV9wbGFuZV9zdGF0ZSAqbmV3X3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X3BsYW5lX3N0YXRl KHN0YXRlLCBwbGFuZSk7CisJc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsID0gcGxhbmVfdG9f c3NkMTZ4eF9wYW5lbChwbGFuZSk7CisJZW51bSBzc2QxNnh4X3JlZnJlc2hfbW9kZSBzYXZlZF9t b2RlOworCXU4IHNhdmVkX2JvcmRlcl93YXZlZm9ybV9pZHg7CisJc3RydWN0IGRybV9mcmFtZWJ1 ZmZlciAqZmIgPSBuZXdfc3RhdGUtPmZiOworCXN0cnVjdCBkcm1fcmVjdCByZWN0OworCWludCBy ZXQ7CisKKwlkcm1fZGJnKCZwYW5lbC0+ZHJtLCAicGxhbmVfYXRvbWljX3VwZGF0ZTogZmI9JXAs IGluaXRpYWxpemVkPSVkXG4iLAorCQlmYiwgcGFuZWwtPmluaXRpYWxpemVkKTsKKworCWlmICgh ZmIgfHwgIXBhbmVsLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBhIHJv dGF0aW9uIGNoYW5nZSBpcyBwZW5kaW5nLCBza2lwIHRoZSB1cGRhdGUgaGVyZSDigJQgY3J0Y19h dG9taWNfZmx1c2gKKwkgKiB3aWxsIHJlLWluaXQgdGhlIGhhcmR3YXJlIGZvciB0aGUgbmV3IG9y aWVudGF0aW9uIGFuZCByZWRyYXcuCisJICovCisJaWYgKHBhbmVsLT5yZWluaXRfcGVuZGluZykg eworCQlkcm1fZGJnKCZwYW5lbC0+ZHJtLCAicGxhbmVfYXRvbWljX3VwZGF0ZTogc2tpcHBpbmcg KHJlaW5pdCBwZW5kaW5nKVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWRybV9hdG9taWNf aGVscGVyX2RhbWFnZV9tZXJnZWQob2xkX3N0YXRlLCBuZXdfc3RhdGUsICZyZWN0KSkgeworCQly ZWN0LngxID0gMDsKKwkJcmVjdC55MSA9IDA7CisJCXJlY3QueDIgPSBmYi0+d2lkdGg7CisJCXJl Y3QueTIgPSBmYi0+aGVpZ2h0OworCQlkcm1fZGJnKCZwYW5lbC0+ZHJtLCAicGxhbmVfYXRvbWlj X3VwZGF0ZTogbm8gZGFtYWdlLCB1c2luZyBmdWxsIHNjcmVlblxuIik7CisJfQorCisJZHJtX2Ri ZygmcGFuZWwtPmRybSwgInBsYW5lX2F0b21pY191cGRhdGU6IGNhbGxpbmcgZmJfZGlydHkgcmVj dD0oJWQsJWQpLSglZCwlZClcbiIsCisJCXJlY3QueDEsIHJlY3QueTEsIHJlY3QueDIsIHJlY3Qu eTIpOworCS8qCisJICogV2hlbiByZWZyZXNoX21vZGVfaW5pdCB3YXMgc2V0LCB1c2UgdGhlIHNw ZWNpZmllZCBtb2RlIGZvciB0aGlzIGZpcnN0CisJICogZnJhbWUgb25seSwgdGhlbiByZXN0b3Jl IHRoZSB1c2VyLWNvbmZpZ3VyZWQgcmVmcmVzaF9tb2RlIHNvCisJICogc3Vic2VxdWVudCB1cGRh dGVzIGNvbnRpbnVlIHdpdGggdGhlIGNvbmZpZ3VyZWQgbW9kZS4KKwkgKi8KKwlzYXZlZF9tb2Rl ID0gcGFuZWwtPnJlZnJlc2hfbW9kZTsKKwlzYXZlZF9ib3JkZXJfd2F2ZWZvcm1faWR4ID0gcGFu ZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfaWR4OworCWlmIChwYW5lbC0+aW5pdF9yZWZyZXNo X3BlbmRpbmcpIHsKKwkJcGFuZWwtPnJlZnJlc2hfbW9kZSA9IHBhbmVsLT5yZWZyZXNoX21vZGVf aW5pdDsKKwkJcGFuZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfaWR4ID0gcGFuZWwtPmJvcmRl cl93YXZlZm9ybV9pbml0X2lkeDsKKwl9CisKKwkvKgorCSAqIEZhc3QgcmVmcmVzaCAoMHhDNykg b21pdHMgTE9BRF9MVVQgb24gZXZlcnkgdXBkYXRlIGN5Y2xlIGFuZCByZWxpZXMKKwkgKiBvbiB0 aGUgTFVUIGJlaW5nIHByZS1sb2FkZWQgdXBmcm9udC4gIFRoZSBwcm9wZXJ0eSBzZXR0ZXIgYXJt cworCSAqIGZhc3RfbHV0X3BlbmRpbmcgd2hlbmV2ZXIgdGhlIHVzZXIgc3dpdGNoZXMgaW50byBm YXN0IG1vZGUuICBDb25zdW1lCisJICogdGhlIGZsYWcgaGVyZSAob25jZSkgYmVmb3JlIHRoZSBm aXJzdCBmYXN0LXJlZnJlc2ggZnJhbWUgc28gdGhlCisJICogY29udHJvbGxlcidzIExVVCBpcyBp biB0aGUgY29ycmVjdCBzdGF0ZS4KKwkgKi8KKwlpZiAocGFuZWwtPmZhc3RfbHV0X3BlbmRpbmcp IHsKKwkJcmV0ID0gc3NkMTZ4eF9wcmVsb2FkX2Zhc3RfbHV0KHBhbmVsKTsKKwkJaWYgKHJldCkg eworCQkJZHJtX2VycigmcGFuZWwtPmRybSwKKwkJCQkicGxhbmVfYXRvbWljX3VwZGF0ZTogZmFz dCBMVVQgcHJlbG9hZCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQl9CisKKwkJcGFuZWwtPmZhc3Rf bHV0X3BlbmRpbmcgPSBmYWxzZTsKKwl9CisKKwlyZXQgPSBzc2QxNnh4X2ZiX2RpcnR5KGZiLCAm cmVjdCwgcGFuZWwpOworCWlmIChyZXQpCisJCWRybV9lcnIoJnBhbmVsLT5kcm0sICJwbGFuZV9h dG9taWNfdXBkYXRlOiBkaXNwbGF5IHVwZGF0ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCWVsc2UK KwkJcGFuZWwtPmxhc3RfZmIgPSBmYjsKKworCXBhbmVsLT5yZWZyZXNoX21vZGUgPSBzYXZlZF9t b2RlOworCXBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1fdXBkYXRlX2lkeCA9IHNhdmVkX2JvcmRlcl93 YXZlZm9ybV9pZHg7CisKKwkvKgorCSAqIElmIHRoaXMgd2FzIHRoZSBpbml0IGZyYW1lICh3aGlj aCB1c2VkIGJvcmRlcl93YXZlZm9ybV9pbml0X2lkeAorCSAqIGluc2lkZSBmYl9kaXJ0eSksIGFy bSBib3JkZXJfd2F2ZWZvcm1fcGVuZGluZyBzbyB0aGUgbm9ybWFsCisJICogKG5vbi1pbml0KSBi b3JkZXIgdmFsdWUgaXMgc2VudCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdXBkYXRlLgorCSAq LworCWlmIChwYW5lbC0+aW5pdF9yZWZyZXNoX3BlbmRpbmcpIHsKKwkJcGFuZWwtPmluaXRfcmVm cmVzaF9wZW5kaW5nID0gZmFsc2U7CisJCXBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1fcGVuZGluZyA9 IHRydWU7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9oZWxwZXJfZnVu Y3Mgc3NkMTZ4eF9wbGFuZV9oZWxwZXJfZnVuY3MgPSB7CisJLmF0b21pY19jaGVjayA9IHNzZDE2 eHhfcGxhbmVfYXRvbWljX2NoZWNrLAorCS5hdG9taWNfdXBkYXRlID0gc3NkMTZ4eF9wbGFuZV9h dG9taWNfdXBkYXRlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENSVEMgRnVu Y3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgc3NkMTZ4eF9jcnRjX2Rlc3Ryb3koc3RydWN0IGRy bV9jcnRjICpjcnRjKQoreworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7Cit9CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3Mgc3NkMTZ4eF9jcnRjX2Z1bmNzID0geworCS5yZXNl dCA9IGRybV9hdG9taWNfaGVscGVyX2NydGNfcmVzZXQsCisJLmRlc3Ryb3kgPSBzc2QxNnh4X2Ny dGNfZGVzdHJveSwKKwkuc2V0X2NvbmZpZyA9IGRybV9hdG9taWNfaGVscGVyX3NldF9jb25maWcs CisJLnBhZ2VfZmxpcCA9IGRybV9hdG9taWNfaGVscGVyX3BhZ2VfZmxpcCwKKwkuYXRvbWljX2R1 cGxpY2F0ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2NydGNfZHVwbGljYXRlX3N0YXRlLAor CS5hdG9taWNfZGVzdHJveV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2NydGNfZGVzdHJveV9z dGF0ZSwKK307CisKK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cyBzc2QxNnh4X2NydGNfbW9k ZV92YWxpZChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJCQkgICAgY29uc3Qgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsID0g Y3J0Y190b19zc2QxNnh4X3BhbmVsKGNydGMpOworCisJLyogQWNjZXB0IG9ubHkgb3VyIHBhbmVs J3MgbmF0aXZlIG1vZGUgKGxhbmRzY2FwZSBvciBwb3J0cmFpdCkgKi8KKwlpZiAoKG1vZGUtPmhk aXNwbGF5ID09IHBhbmVsLT5tb2RlLT5oZGlzcGxheSAmJgorCSAgICAgbW9kZS0+dmRpc3BsYXkg PT0gcGFuZWwtPm1vZGUtPnZkaXNwbGF5KSB8fAorCSAgICAobW9kZS0+aGRpc3BsYXkgPT0gcGFu ZWwtPm1vZGUtPnZkaXNwbGF5ICYmCisJICAgICBtb2RlLT52ZGlzcGxheSA9PSBwYW5lbC0+bW9k ZS0+aGRpc3BsYXkpKQorCQlyZXR1cm4gTU9ERV9PSzsKKworCXJldHVybiBNT0RFX0JBRDsKK30K Kworc3RhdGljIGludCBzc2QxNnh4X2NydGNfYXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fY3J0YyAq Y3J0YywKKwkJCQkgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3NkMTZ4eF9jcnRjX2F0b21pY19kaXNhYmxlKHN0cnVj dCBkcm1fY3J0YyAqY3J0YywKKwkJCQkJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQor eworCXN0cnVjdCBzc2QxNnh4X3BhbmVsICpwYW5lbCA9IGNydGNfdG9fc3NkMTZ4eF9wYW5lbChj cnRjKTsKKwlpbnQgcmV0LCBpZHg7CisKKwlpZiAoIWRybV9kZXZfZW50ZXIoJnBhbmVsLT5kcm0s ICZpZHgpKQorCQlyZXR1cm47CisKKwlpZiAocGFuZWwtPmNsZWFyX29uX2Rpc2FibGUgPCAwIHx8 IHBhbmVsLT5kaXNwbGF5X2NsZWFyZWRfb25fZGVpbml0KQorCQlnb3RvIG91dDsKKworCWRybV9k YmcoJnBhbmVsLT5kcm0sICJjbGVhcl9vbl9kaXNhYmxlOiBydW5uaW5nLCBtb2RlPSVkXG4iLAor CQlwYW5lbC0+Y2xlYXJfb25fZGlzYWJsZSk7CisJcmV0ID0gc3NkMTZ4eF9jbGVhcl9kaXNwbGF5 KHBhbmVsLAorCQkJCSAgICBzc2QxNnh4X3JlZnJlc2hfbW9kZV90b19jdHJsMihwYW5lbCwKKwkJ CQkJCQkJICBwYW5lbC0+Y2xlYXJfb25fZGlzYWJsZSkpOworCWlmIChyZXQpIHsKKwkJZHJtX2Vy cigmcGFuZWwtPmRybSwgImF0b21pY19kaXNhYmxlOiBjbGVhciBmYWlsZWQ6ICVkXG4iLCByZXQp OworCQlnb3RvIG91dDsKKwl9CisKKwlwYW5lbC0+ZGlzcGxheV9jbGVhcmVkX29uX2RlaW5pdCA9 IHRydWU7CitvdXQ6CisJZHJtX2Rldl9leGl0KGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIHNzZDE2 eHhfY3J0Y19hdG9taWNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgICAg c3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzc2QxNnh4X3BhbmVs ICpwYW5lbCA9IGNydGNfdG9fc3NkMTZ4eF9wYW5lbChjcnRjKTsKKwlzdHJ1Y3QgZHJtX2NydGNf c3RhdGUgKmNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShzdGF0ZSwg Y3J0Yyk7CisJaW50IHJldCwgaWR4OworCisJaWYgKCFkcm1fZGV2X2VudGVyKCZwYW5lbC0+ZHJt LCAmaWR4KSkKKwkJcmV0dXJuOworCisJcGFuZWwtPmRpc3BsYXlfY2xlYXJlZF9vbl9kZWluaXQg PSBmYWxzZTsKKworCWRybV9kYmcoJnBhbmVsLT5kcm0sICJhdG9taWNfZW5hYmxlOiAlZHglZFxu IiwKKwkJY3J0Y19zdGF0ZS0+bW9kZS5oZGlzcGxheSwgY3J0Y19zdGF0ZS0+bW9kZS52ZGlzcGxh eSk7CisKKwlwYW5lbC0+d2lkdGggPSBjcnRjX3N0YXRlLT5tb2RlLmhkaXNwbGF5OworCXBhbmVs LT5oZWlnaHQgPSBjcnRjX3N0YXRlLT5tb2RlLnZkaXNwbGF5OworCisJcmV0ID0gc3NkMTZ4eF9o d19pbml0KHBhbmVsKTsKKwlpZiAocmV0KSB7CisJCWRybV9lcnIoJnBhbmVsLT5kcm0sICJjcnRj X2F0b21pY19lbmFibGU6IEhXIGluaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7 CisJfQorCXBhbmVsLT5pbml0aWFsaXplZCA9IHRydWU7CisKKwkvKiBDbGVhciBkaXNwbGF5IG9u IGZpcnN0IGFwcCBsYXVuY2ggaWYgY29uZmlndXJlZCAqLworCXJldCA9IHNzZDE2eHhfY2xlYXJf ZGlzcGxheV9vbl9pbml0KHBhbmVsKTsKKwlpZiAocmV0KQorCQlkcm1fZXJyKCZwYW5lbC0+ZHJt LCAiY3J0Y19hdG9taWNfZW5hYmxlOiBjbGVhciBvbiBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7 CisKKwkvKgorCSAqIElmIHJlZnJlc2hfbW9kZV9pbml0IGlzIHNldCwgYXJtIGluaXRfcmVmcmVz aF9wZW5kaW5nIHNvCisJICogcGxhbmVfYXRvbWljX3VwZGF0ZSB1c2VzIHRoZSBzcGVjaWZpZWQg bW9kZSBmb3IgdGhlIGZpcnN0IGZyYW1lCisJICogdGhlbiByZXN0b3JlcyB0aGUgdXNlci1jb25m aWd1cmVkIG9yIHBhbmVsIGRlZmF1bHQgcmVmcmVzaF9tb2RlLgorCSAqLworCWlmIChwYW5lbC0+ cmVmcmVzaF9tb2RlX2luaXQgPj0gMCkgeworCQlkcm1fZGJnKCZwYW5lbC0+ZHJtLAorCQkJImF0 b21pY19lbmFibGU6IHJlZnJlc2hfbW9kZV9pbml0PSVkLCB1c2luZyBmb3IgZmlyc3QgZnJhbWVc biIsCisJCQlwYW5lbC0+cmVmcmVzaF9tb2RlX2luaXQpOworCQlwYW5lbC0+aW5pdF9yZWZyZXNo X3BlbmRpbmcgPSB0cnVlOworCX0KKworb3V0OgorCWRybV9kZXZfZXhpdChpZHgpOworfQorCisv KgorICogUmUtaW5pdGlhbGl6ZSBoYXJkd2FyZSBhbmQgcmVkcmF3IHRoZSBjdXJyZW50IGZyYW1l YnVmZmVyIHdoZW4gdGhlCisgKiBkaXNwbGF5IG9yaWVudGF0aW9uIGNoYW5nZXMgYXQgcnVudGlt ZSB2aWEgdGhlIHJvdGF0aW9uIGNvbm5lY3RvciBwcm9wZXJ0eS4KKyAqIENhbGxlZCBieSB0aGUg RFJNIGF0b21pYyBoZWxwZXIgYWZ0ZXIgYXRvbWljX2VuYWJsZS9kaXNhYmxlIGhhdmUgcnVuLgor ICovCitzdGF0aWMgdm9pZCBzc2QxNnh4X2NydGNfYXRvbWljX2ZsdXNoKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YywKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCit7CisJ c3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsID0gY3J0Y190b19zc2QxNnh4X3BhbmVsKGNydGMp OworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOworCXN0cnVjdCBkcm1fcmVjdCBmdWxsOwor CWludCByZXQsIGlkeDsKKworCWlmICghcGFuZWwtPnJlaW5pdF9wZW5kaW5nIHx8ICFwYW5lbC0+ aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCWlmICghZHJtX2Rldl9lbnRlcigmcGFuZWwtPmRy bSwgJmlkeCkpCisJCXJldHVybjsKKworCXBhbmVsLT5yZWluaXRfcGVuZGluZyA9IGZhbHNlOwor CisJZHJtX2RiZygmcGFuZWwtPmRybSwgImF0b21pY19mbHVzaDogcmVpbml0LCBvcmllbnRhdGlv bj0ldcKwXG4iLAorCQlwYW5lbC0+b3JpZW50YXRpb24pOworCisJcmV0ID0gc3NkMTZ4eF9od19p bml0KHBhbmVsKTsKKwlpZiAocmV0KSB7CisJCWRybV9lcnIoJnBhbmVsLT5kcm0sICJPcmllbnRh dGlvbiByZS1pbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWZi ID0gcGFuZWwtPnByaW1hcnlfcGxhbmUuc3RhdGUgPyBwYW5lbC0+cHJpbWFyeV9wbGFuZS5zdGF0 ZS0+ZmIKKwkJCQkJOiBwYW5lbC0+bGFzdF9mYjsKKwlpZiAoZmIpIHsKKwkJZnVsbC54MSA9IDA7 CisJCWZ1bGwueTEgPSAwOworCQlmdWxsLngyID0gZmItPndpZHRoOworCQlmdWxsLnkyID0gZmIt PmhlaWdodDsKKwkJcmV0ID0gc3NkMTZ4eF9mYl9kaXJ0eShmYiwgJmZ1bGwsIHBhbmVsKTsKKwkJ aWYgKHJldCkKKwkJCWRybV9lcnIoJnBhbmVsLT5kcm0sICJhdG9taWNfZmx1c2g6IGRpc3BsYXkg dXBkYXRlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWVsc2UKKwkJCXBhbmVsLT5sYXN0X2ZiID0g ZmI7CisJfQorCitvdXQ6CisJZHJtX2Rldl9leGl0KGlkeCk7Cit9CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIHNzZDE2eHhfY3J0Y19oZWxwZXJfZnVuY3MgPSB7 CisJLm1vZGVfdmFsaWQgICAgID0gc3NkMTZ4eF9jcnRjX21vZGVfdmFsaWQsCisJLmF0b21pY19j aGVjayAgID0gc3NkMTZ4eF9jcnRjX2F0b21pY19jaGVjaywKKwkuYXRvbWljX2Rpc2FibGUgPSBz c2QxNnh4X2NydGNfYXRvbWljX2Rpc2FibGUsCisJLmF0b21pY19lbmFibGUgID0gc3NkMTZ4eF9j cnRjX2F0b21pY19lbmFibGUsCisJLmF0b21pY19mbHVzaCAgID0gc3NkMTZ4eF9jcnRjX2F0b21p Y19mbHVzaCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb25uZWN0b3IgRnVu Y3Rpb25zCisgKi8KKworc3RhdGljIGludCBzc2QxNnh4X2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3Ry dWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAq cGFuZWwgPSB0b19zc2QxNnh4X3BhbmVsKGNvbm5lY3Rvci0+ZGV2KTsKKwlib29sIG1vZGVfaXNf cG9ydHJhaXQgPSAocGFuZWwtPm1vZGUtPmhkaXNwbGF5IDwgcGFuZWwtPm1vZGUtPnZkaXNwbGF5 KTsKKwlib29sIG9yaWVudF9pc19wb3J0cmFpdCA9IChwYW5lbC0+b3JpZW50YXRpb24gPT0gOTAg fHwgcGFuZWwtPm9yaWVudGF0aW9uID09IDI3MCk7CisKKwlkcm1fZGJnKCZwYW5lbC0+ZHJtLCAi Y29ubmVjdG9yX2dldF9tb2Rlczogb3JpZW50YXRpb249JXXCsFxuIiwKKwkJcGFuZWwtPm9yaWVu dGF0aW9uKTsKKworCS8qIEZvciBwb3J0cmFpdCwgc3dhcCBkaW1lbnNpb25zIHNvIGNsaWVudHMg c2VlIGxvZ2ljYWwgc2l6ZS4gKi8KKwlpZiAobW9kZV9pc19wb3J0cmFpdCAhPSBvcmllbnRfaXNf cG9ydHJhaXQpIHsKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisKKwkJbW9kZSA9 IGRybV9tb2RlX2R1cGxpY2F0ZSgmcGFuZWwtPmRybSwgcGFuZWwtPm1vZGUpOworCQlpZiAoIW1v ZGUpCisJCQlyZXR1cm4gMDsKKwkJc3dhcChtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRpc3BsYXkp OworCQlzd2FwKG1vZGUtPmhzeW5jX3N0YXJ0LCBtb2RlLT52c3luY19zdGFydCk7CisJCXN3YXAo bW9kZS0+aHN5bmNfZW5kLCBtb2RlLT52c3luY19lbmQpOworCQlzd2FwKG1vZGUtPmh0b3RhbCwg bW9kZS0+dnRvdGFsKTsKKwkJc3dhcChtb2RlLT53aWR0aF9tbSwgbW9kZS0+aGVpZ2h0X21tKTsK KwkJbW9kZS0+dHlwZSB8PSBEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJZHJtX21vZGVfc2V0 X25hbWUobW9kZSk7CisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJ cmV0dXJuIDE7CisJfQorCisJcmV0dXJuIGRybV9jb25uZWN0b3JfaGVscGVyX2dldF9tb2Rlc19m aXhlZChjb25uZWN0b3IsIHBhbmVsLT5tb2RlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBk cm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBzc2QxNnh4X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3Mg PSB7CisJLmdldF9tb2RlcyA9IHNzZDE2eHhfY29ubmVjdG9yX2dldF9tb2RlcywKK307CisKKy8q IEVudW0gdmFsdWVzIGZvciB0aGUgcm90YXRpb24gY29ubmVjdG9yIHByb3BlcnR5IChkZWdyZWVz IGNsb2Nrd2lzZSkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IHNz ZDE2eHhfcm90YXRpb25fZW51bVtdID0geworCXsgMCwgICAiMCIgICB9LAorCXsgOTAsICAiOTAi ICB9LAorCXsgMTgwLCAiMTgwIiB9LAorCXsgMjcwLCAiMjcwIiB9LAorfTsKKworLyogRW51bSB2 YWx1ZXMgZm9yIHRoZSByZWZyZXNoX21vZGUgY29ubmVjdG9yIHByb3BlcnR5ICovCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBzc2QxNnh4X3JlZnJlc2hfbW9kZV9lbnVt W10gPSB7CisJeyBTU0QxNlhYX1JFRlJFU0hfUEFSVElBTCwgInBhcnRpYWwiIH0sCisJeyBTU0Qx NlhYX1JFRlJFU0hfRlVMTCwgICAgImZ1bGwiICAgIH0sCisJeyBTU0QxNlhYX1JFRlJFU0hfRkFT VCwgICAgImZhc3QiICAgIH0sCit9OworCisvKgorICogRW51bSBmb3IgY2xlYXJfb25faW5pdCwg Y2xlYXJfb25fY2xvc2UsIHJlZnJlc2hfbW9kZV9pbml0IHByb3BlcnRpZXMuCisgKiBWYWx1ZSAw ID0gZGlzYWJsZWQ7IHZhbHVlcyAxLTMgPSBwYXJ0aWFsL2Z1bGwvZmFzdCAocmVmcmVzaCBtb2Rl ICsgMSkuCisgKiBUaGUgKzEgb2Zmc2V0IGFsbG93cyBhIHNpbmdsZSBlbnVtIHRvIHJlcHJlc2Vu dCBib3RoICJkaXNhYmxlZCIgYW5kIHRoZQorICogdGhyZWUgcmVmcmVzaCBtb2RlcyB3aXRob3V0 IHNpZ24tZXh0ZW5kaW5nIHRoZSBEUk0gcHJvcGVydHkgdmFsdWUuCisgKi8KK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IHNzZDE2eHhfaW5pdF9yZWZyZXNoX2VudW1bXSA9 IHsKKwl7IDAsICJkaXNhYmxlZCIgfSwKKwl7IDEsICJwYXJ0aWFsIiAgfSwKKwl7IDIsICJmdWxs IiAgICAgfSwKKwl7IDMsICJmYXN0IiAgICAgfSwKK307CisKKy8qIEVudW0gdmFsdWVzIGZvciB0 aGUgY29sb3JfbW9kZSBjb25uZWN0b3IgcHJvcGVydHkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZHJtX3Byb3BfZW51bV9saXN0IHNzZDE2eHhfY29sb3JfbW9kZV9lbnVtW10gPSB7CisJeyBTU0Qx NlhYX0NPTE9SX01PREVfQlcsICAgICAiYmxhY2std2hpdGUiIH0sCisJeyBTU0QxNlhYX0NPTE9S X01PREVfM0NPTE9SLCAiMy1jb2xvciIgICAgIH0sCit9OworCisvKiBFbnVtIHZhbHVlcyBmb3Ig Ym9yZGVyX3dhdmVmb3JtIGNvbm5lY3RvciBwcm9wZXJ0aWVzIChvbmUgcGVyIEhXIG1vZGUpICov CitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wcm9wX2VudW1fbGlzdCBzc2QxNnh4X2JvcmRlcl93 YXZlZm9ybV9lbnVtW10gPSB7CisJeyBTU0QxNlhYX0JPUkRFUl9MVVQwLCAibHV0MF9ibGFjayIg ICAgfSwKKwl7IFNTRDE2WFhfQk9SREVSX0xVVDEsICJsdXQxX3doaXRlIiAgICB9LAorCXsgU1NE MTZYWF9CT1JERVJfTFVUMiwgImx1dDJfYmxhY2siICAgIH0sCisJeyBTU0QxNlhYX0JPUkRFUl9M VVQzLCAibHV0M19ncmF5IiAgICAgfSwKKwl7IFNTRDE2WFhfQk9SREVSX1ZTUywgICJ2c3NfYmxh Y2siICAgICB9LAorCXsgU1NEMTZYWF9CT1JERVJfVlNIMSwgInZzaDFfYmxhY2siICAgIH0sCisJ eyBTU0QxNlhYX0JPUkRFUl9WU0wsICAidnNsX3doaXRlIiAgICAgfSwKKwl7IFNTRDE2WFhfQk9S REVSX1ZTSDIsICJ2c2gyX2JsYWNrIiAgICB9LAorCXsgU1NEMTZYWF9CT1JERVJfVkNPTSwgInZj b21fcHJlc2VydmUiIH0sCisJeyBTU0QxNlhYX0JPUkRFUl9ISVosICAiaGl6X2Zsb2F0IiAgICAg fSwKK307CisKK3N0YXRpYyBpbnQgc3NkMTZ4eF9jb25uZWN0b3JfY3JlYXRlX3Byb3BlcnRpZXMo c3RydWN0IHNzZDE2eHhfcGFuZWwgKnBhbmVsKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0g PSAmcGFuZWwtPmRybTsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gJnBhbmVs LT5jb25uZWN0b3I7CisKKwlwYW5lbC0+cm90YXRpb25fcHJvcGVydHkgPQorCQlkcm1fcHJvcGVy dHlfY3JlYXRlX2VudW0oZHJtLCAwLCAicm90YXRpb24iLAorCQkJCQkgc3NkMTZ4eF9yb3RhdGlv bl9lbnVtLAorCQkJCQkgQVJSQVlfU0laRShzc2QxNnh4X3JvdGF0aW9uX2VudW0pKTsKKwlpZiAo IXBhbmVsLT5yb3RhdGlvbl9wcm9wZXJ0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJtX29iamVj dF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKKwkJCQkgICBwYW5lbC0+cm90YXRp b25fcHJvcGVydHksIHBhbmVsLT5vcmllbnRhdGlvbik7CisKKwlwYW5lbC0+cmVmcmVzaF9tb2Rl X3Byb3BlcnR5ID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZV9lbnVtKGRybSwgMCwgInJlZnJlc2hf bW9kZSIsCisJCQkJCSBzc2QxNnh4X3JlZnJlc2hfbW9kZV9lbnVtLAorCQkJCQkgQVJSQVlfU0la RShzc2QxNnh4X3JlZnJlc2hfbW9kZV9lbnVtKSk7CisJaWYgKCFwYW5lbC0+cmVmcmVzaF9tb2Rl X3Byb3BlcnR5KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0 eSgmY29ubmVjdG9yLT5iYXNlLAorCQkJCSAgIHBhbmVsLT5yZWZyZXNoX21vZGVfcHJvcGVydHks IHBhbmVsLT5yZWZyZXNoX21vZGUpOworCisJcGFuZWwtPmJvcmRlcl93YXZlZm9ybV9pbml0X3By b3BlcnR5ID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZV9lbnVtKGRybSwgMCwgImJvcmRlcl93YXZl Zm9ybV9pbml0IiwKKwkJCQkJIHNzZDE2eHhfYm9yZGVyX3dhdmVmb3JtX2VudW0sCisJCQkJCSBB UlJBWV9TSVpFKHNzZDE2eHhfYm9yZGVyX3dhdmVmb3JtX2VudW0pKTsKKwlpZiAoIXBhbmVsLT5i b3JkZXJfd2F2ZWZvcm1faW5pdF9wcm9wZXJ0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJtX29i amVjdF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKKwkJCQkgICBwYW5lbC0+Ym9y ZGVyX3dhdmVmb3JtX2luaXRfcHJvcGVydHksCisJCQkJICAgcGFuZWwtPmJvcmRlcl93YXZlZm9y bV9pbml0X2lkeCk7CisKKwlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX3VwZGF0ZV9wcm9wZXJ0eSA9 CisJCWRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkcm0sIDAsICJib3JkZXJfd2F2ZWZvcm1fdXBk YXRlIiwKKwkJCQkJIHNzZDE2eHhfYm9yZGVyX3dhdmVmb3JtX2VudW0sCisJCQkJCSBBUlJBWV9T SVpFKHNzZDE2eHhfYm9yZGVyX3dhdmVmb3JtX2VudW0pKTsKKwlpZiAoIXBhbmVsLT5ib3JkZXJf d2F2ZWZvcm1fdXBkYXRlX3Byb3BlcnR5KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkcm1fb2JqZWN0 X2F0dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLAorCQkJCSAgIHBhbmVsLT5ib3JkZXJf d2F2ZWZvcm1fdXBkYXRlX3Byb3BlcnR5LAorCQkJCSAgIHBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1f dXBkYXRlX2lkeCk7CisKKwlwYW5lbC0+Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlX3By b3BlcnR5ID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZV9ib29sKGRybSwgMCwgImJvcmRlcl9yZWZy ZXNoX29uX2V2ZXJ5X3VwZGF0ZSIpOworCWlmICghcGFuZWwtPmJvcmRlcl9yZWZyZXNoX29uX2V2 ZXJ5X3VwZGF0ZV9wcm9wZXJ0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJtX29iamVjdF9hdHRh Y2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKKwkJCQkgICBwYW5lbC0+Ym9yZGVyX3JlZnJl c2hfb25fZXZlcnlfdXBkYXRlX3Byb3BlcnR5LAorCQkJCSAgIHBhbmVsLT5ib3JkZXJfcmVmcmVz aF9vbl9ldmVyeV91cGRhdGUpOworCisJcGFuZWwtPmNsZWFyX29uX2luaXRfcHJvcGVydHkgPQor CQlkcm1fcHJvcGVydHlfY3JlYXRlX2VudW0oZHJtLCAwLCAiY2xlYXJfb25faW5pdCIsCisJCQkJ CSBzc2QxNnh4X2luaXRfcmVmcmVzaF9lbnVtLAorCQkJCQkgQVJSQVlfU0laRShzc2QxNnh4X2lu aXRfcmVmcmVzaF9lbnVtKSk7CisJaWYgKCFwYW5lbC0+Y2xlYXJfb25faW5pdF9wcm9wZXJ0eSkK KwkJcmV0dXJuIC1FTk9NRU07CisJLyogUHJvcGVydHkgdmFsdWUgMD1kaXNhYmxlZCwgMS0zPW1v ZGU7IGZpZWxkIGlzIC0xLzAvMS8yIOKGkiB2YWwgPSBmaWVsZCsxICovCisJZHJtX29iamVjdF9h dHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKKwkJCQkgICBwYW5lbC0+Y2xlYXJfb25f aW5pdF9wcm9wZXJ0eSwKKwkJCQkgICBwYW5lbC0+Y2xlYXJfb25faW5pdCArIDEpOworCisJcGFu ZWwtPmNsZWFyX29uX2Nsb3NlX3Byb3BlcnR5ID0KKwkJZHJtX3Byb3BlcnR5X2NyZWF0ZV9lbnVt KGRybSwgMCwgImNsZWFyX29uX2Nsb3NlIiwKKwkJCQkJIHNzZDE2eHhfaW5pdF9yZWZyZXNoX2Vu dW0sCisJCQkJCSBBUlJBWV9TSVpFKHNzZDE2eHhfaW5pdF9yZWZyZXNoX2VudW0pKTsKKwlpZiAo IXBhbmVsLT5jbGVhcl9vbl9jbG9zZV9wcm9wZXJ0eSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJt X29iamVjdF9hdHRhY2hfcHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKKwkJCQkgICBwYW5lbC0+ Y2xlYXJfb25fY2xvc2VfcHJvcGVydHksCisJCQkJICAgcGFuZWwtPmNsZWFyX29uX2Nsb3NlICsg MSk7CisKKwlwYW5lbC0+Y2xlYXJfb25fZGlzYWJsZV9wcm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0 eV9jcmVhdGVfZW51bShkcm0sIDAsICJjbGVhcl9vbl9kaXNhYmxlIiwKKwkJCQkJIHNzZDE2eHhf aW5pdF9yZWZyZXNoX2VudW0sCisJCQkJCSBBUlJBWV9TSVpFKHNzZDE2eHhfaW5pdF9yZWZyZXNo X2VudW0pKTsKKwlpZiAoIXBhbmVsLT5jbGVhcl9vbl9kaXNhYmxlX3Byb3BlcnR5KQorCQlyZXR1 cm4gLUVOT01FTTsKKwlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNl LAorCQkJCSAgIHBhbmVsLT5jbGVhcl9vbl9kaXNhYmxlX3Byb3BlcnR5LAorCQkJCSAgIHBhbmVs LT5jbGVhcl9vbl9kaXNhYmxlICsgMSk7CisKKwlwYW5lbC0+cmVmcmVzaF9tb2RlX2luaXRfcHJv cGVydHkgPQorCQlkcm1fcHJvcGVydHlfY3JlYXRlX2VudW0oZHJtLCAwLCAicmVmcmVzaF9tb2Rl X2luaXQiLAorCQkJCQkgc3NkMTZ4eF9pbml0X3JlZnJlc2hfZW51bSwKKwkJCQkJIEFSUkFZX1NJ WkUoc3NkMTZ4eF9pbml0X3JlZnJlc2hfZW51bSkpOworCWlmICghcGFuZWwtPnJlZnJlc2hfbW9k ZV9pbml0X3Byb3BlcnR5KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkcm1fb2JqZWN0X2F0dGFjaF9w cm9wZXJ0eSgmY29ubmVjdG9yLT5iYXNlLAorCQkJCSAgIHBhbmVsLT5yZWZyZXNoX21vZGVfaW5p dF9wcm9wZXJ0eSwKKwkJCQkgICBwYW5lbC0+cmVmcmVzaF9tb2RlX2luaXQgKyAxKTsKKworCS8q CisJICogY29sb3JfbW9kZTogb25seSBleHBvc2UgMy1jb2xvciBvcHRpb24gb24gcGFuZWxzIHRo YXQgcGh5c2ljYWxseSBoYXZlCisJICogYSByZWQgcGxhbmU7IG9uIEJXLW9ubHkgcGFuZWxzIHRo ZSBwcm9wZXJ0eSBzdGlsbCBleGlzdHMgZm9yCisJICogY29uc2lzdGVuY3kgYnV0IHVzZXJzcGFj ZSBjYW4gb25seSBzZXQgImJsYWNrLXdoaXRlIi4KKwkgKi8KKwlwYW5lbC0+Y29sb3JfbW9kZV9w cm9wZXJ0eSA9CisJCWRybV9wcm9wZXJ0eV9jcmVhdGVfZW51bShkcm0sIDAsICJjb2xvcl9tb2Rl IiwKKwkJCQkJIHNzZDE2eHhfY29sb3JfbW9kZV9lbnVtLAorCQkJCQkgcGFuZWwtPnBhbmVsX2Nm Zy0+cmVkX3N1cHBvcnRlZAorCQkJCQkJPyBBUlJBWV9TSVpFKHNzZDE2eHhfY29sb3JfbW9kZV9l bnVtKQorCQkJCQkJOiAxKTsKKwlpZiAoIXBhbmVsLT5jb2xvcl9tb2RlX3Byb3BlcnR5KQorCQly ZXR1cm4gLUVOT01FTTsKKwlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eSgmY29ubmVjdG9yLT5i YXNlLAorCQkJCSAgIHBhbmVsLT5jb2xvcl9tb2RlX3Byb3BlcnR5LAorCQkJCSAgIHBhbmVsLT5j b2xvcl9tb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzZDE2eHhfY29ubmVj dG9yX2F0b21pY19nZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwK KwkJCQkJCSBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqc3RhdGUsCisJCQkJCQkg c3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJCQkJCQkgdWludDY0X3QgKnZhbCkKK3sK KwlzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwgPSB0b19zc2QxNnh4X3BhbmVsKGNvbm5lY3Rv ci0+ZGV2KTsKKworCWRybV9kYmcoJnBhbmVsLT5kcm0sICJnZXRfcHJvcGVydHk6ICVzXG4iLCBw cm9wZXJ0eS0+bmFtZSk7CisKKwlpZiAocHJvcGVydHkgPT0gcGFuZWwtPnJvdGF0aW9uX3Byb3Bl cnR5KSB7CisJCSp2YWwgPSBwYW5lbC0+b3JpZW50YXRpb247CisJCXJldHVybiAwOworCX0KKwlp ZiAocHJvcGVydHkgPT0gcGFuZWwtPnJlZnJlc2hfbW9kZV9wcm9wZXJ0eSkgeworCQkqdmFsID0g cGFuZWwtPnJlZnJlc2hfbW9kZTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9wZXJ0eSA9PSBw YW5lbC0+Ym9yZGVyX3dhdmVmb3JtX2luaXRfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBhbmVsLT5i b3JkZXJfd2F2ZWZvcm1faW5pdF9pZHg7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJvcGVydHkg PT0gcGFuZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBh bmVsLT5ib3JkZXJfd2F2ZWZvcm1fdXBkYXRlX2lkeDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChw cm9wZXJ0eSA9PSBwYW5lbC0+Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlX3Byb3BlcnR5 KSB7CisJCSp2YWwgPSBwYW5lbC0+Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlOworCQly ZXR1cm4gMDsKKwl9CisJaWYgKHByb3BlcnR5ID09IHBhbmVsLT5jbGVhcl9vbl9pbml0X3Byb3Bl cnR5KSB7CisJCSp2YWwgPSBwYW5lbC0+Y2xlYXJfb25faW5pdCArIDE7ICAvKiBmaWVsZCAtMS8w LzEvMiDihpIgdmFsIDAvMS8yLzMgKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9wZXJ0eSA9 PSBwYW5lbC0+Y2xlYXJfb25fY2xvc2VfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBhbmVsLT5jbGVh cl9vbl9jbG9zZSArIDE7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJvcGVydHkgPT0gcGFuZWwt PmNsZWFyX29uX2Rpc2FibGVfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBhbmVsLT5jbGVhcl9vbl9k aXNhYmxlICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9wZXJ0eSA9PSBwYW5lbC0+cmVm cmVzaF9tb2RlX2luaXRfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBhbmVsLT5yZWZyZXNoX21vZGVf aW5pdCArIDE7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJvcGVydHkgPT0gcGFuZWwtPmNvbG9y X21vZGVfcHJvcGVydHkpIHsKKwkJKnZhbCA9IHBhbmVsLT5jb2xvcl9tb2RlOworCQlyZXR1cm4g MDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzc2QxNnh4X2Nvbm5l Y3Rvcl9hdG9taWNfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Is CisJCQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKnN0YXRlLAorCQkJCQkJIHN0cnVj dCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCQkJIHVpbnQ2NF90IHZhbCkKK3sKKwlzdHJ1 Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwgPSB0b19zc2QxNnh4X3BhbmVsKGNvbm5lY3Rvci0+ZGV2 KTsKKworCWRybV9kYmcoJnBhbmVsLT5kcm0sICJzZXRfcHJvcGVydHk6ICVzID0gJWxsdVxuIiwg cHJvcGVydHktPm5hbWUsIHZhbCk7CisKKwlpZiAocHJvcGVydHkgPT0gcGFuZWwtPnJvdGF0aW9u X3Byb3BlcnR5KSB7CisJCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gOTAgJiYgdmFsICE9IDE4MCAm JiB2YWwgIT0gMjcwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBhbmVsLT5vcmllbnRhdGlvbiA9 IHZhbDsKKwkJLyoKKwkJICogRmxhZyBoYXJkd2FyZSByZS1pbml0IG5lZWRlZC4gY3J0Y19hdG9t aWNfZmx1c2ggd2lsbCBjYWxsCisJCSAqIHNzZDE2eHhfaHdfaW5pdCgpIHdpdGggdGhlIG5ldyBv cmllbnRhdGlvbiBhbmQgcmVkcmF3LgorCQkgKi8KKwkJcGFuZWwtPnJlaW5pdF9wZW5kaW5nID0g dHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9wZXJ0eSA9PSBwYW5lbC0+cmVmcmVzaF9t b2RlX3Byb3BlcnR5KSB7CisJCWlmICh2YWwgPiBTU0QxNlhYX1JFRlJFU0hfRkFTVCkKKwkJCXJl dHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBGYXN0IHJlZnJlc2ggKDB4QzcpIG9taXRzIExPQURf TFVUIG9uIGV2ZXJ5IHVwZGF0ZSBhbmQgcmVsaWVzCisJCSAqIG9uIHRoZSBMVVQgYmVpbmcgcHJl LWxvYWRlZCB1cGZyb250LiAgQXJtIHRoZSBvbmUtc2hvdCBmbGFnCisJCSAqIHdoZW4gc3dpdGNo aW5nIGludG8gZmFzdCBtb2RlIHNvIHRoZSBuZXh0IHBsYW5lX2F0b21pY191cGRhdGUKKwkJICog bG9hZHMgdGhlIExVVCBiZWZvcmUgdGhlIGZpcnN0IGZhc3QtcmVmcmVzaCBjeWNsZS4gIENsZWFy IGl0CisJCSAqIHdoZW4gc3dpdGNoaW5nIGF3YXkgc28gYSBmcmVzaCBwcmUtbG9hZCBoYXBwZW5z IGlmIHRoZSB1c2VyCisJCSAqIHJldHVybnMgdG8gZmFzdCBtb2RlIGxhdGVyLgorCQkgKi8KKwkJ aWYgKHZhbCA9PSBTU0QxNlhYX1JFRlJFU0hfRkFTVCAmJgorCQkgICAgcGFuZWwtPnJlZnJlc2hf bW9kZSAhPSBTU0QxNlhYX1JFRlJFU0hfRlVMTCkKKwkJCXBhbmVsLT5mYXN0X2x1dF9wZW5kaW5n ID0gdHJ1ZTsKKwkJZWxzZQorCQkJcGFuZWwtPmZhc3RfbHV0X3BlbmRpbmcgPSBmYWxzZTsKKwkJ cGFuZWwtPnJlZnJlc2hfbW9kZSA9IHZhbDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwcm9wZXJ0 eSA9PSBwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX2luaXRfcHJvcGVydHkpIHsKKwkJaWYgKHZhbCA+ PSBBUlJBWV9TSVpFKHNzZDE2ODNfYm9yZGVyX3dhdmVmb3JtX3RhYmxlKSkKKwkJCXJldHVybiAt RUlOVkFMOworCQlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX2luaXRfaWR4ID0gdmFsOworCQlyZXR1 cm4gMDsKKwl9CisJaWYgKHByb3BlcnR5ID09IHBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1fdXBkYXRl X3Byb3BlcnR5KSB7CisJCWNvbnN0IHU4ICpid190YmwgPSBwYW5lbC0+Y29udHJvbGxlcl9jZmct PmJvcmRlcl93YXZlZm9ybV90YWJsZTsKKwkJYm9vbCBjaGFuZ2VkID0gKGludCl2YWwgIT0gcGFu ZWwtPmJvcmRlcl93YXZlZm9ybV91cGRhdGVfaWR4OworCisJCWlmICh2YWwgPj0gQVJSQVlfU0la RShzc2QxNjgzX2JvcmRlcl93YXZlZm9ybV90YWJsZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJ ZHJtX2RiZygmcGFuZWwtPmRybSwKKwkJCSJzZXRfcHJvcGVydHk6IGJvcmRlcl93YXZlZm9ybV91 cGRhdGUgb2xkPSVkIG5ldz0lbGx1IGh3PTB4JTAyeCAtPiAweCUwMnggJXNcbiIsCisJCQlwYW5l bC0+Ym9yZGVyX3dhdmVmb3JtX3VwZGF0ZV9pZHgsIHZhbCwKKwkJCWJ3X3RibFtwYW5lbC0+Ym9y ZGVyX3dhdmVmb3JtX3VwZGF0ZV9pZHhdLAorCQkJYndfdGJsW3ZhbF0sCisJCQljaGFuZ2VkID8g Iihhcm1pbmcgcGVuZGluZykiIDogIihubyBjaGFuZ2UpIik7CisJCS8qIEFybSBvbmUtc2hvdCBm bGFnIHNvIHRoZSBuZXcgYm9yZGVyIHZhbHVlIGlzIHNlbnQgb24gdGhlIHZlcnkKKwkJICogbmV4 dCBkaXNwbGF5IHVwZGF0ZSwgZXZlbiBpZiBib3JkZXJfcmVmcmVzaF9vbl9ldmVyeV91cGRhdGUg aXMKKwkJICogbm90IHNldC4gIENsZWFyZWQgaW4gZmJfZGlydHkgYWZ0ZXIgdGhlIGNvbW1hbmQg aXMgc2VudC4KKwkJICovCisJCWlmICgoaW50KXZhbCAhPSBwYW5lbC0+Ym9yZGVyX3dhdmVmb3Jt X3VwZGF0ZV9pZHgpCisJCQlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX3BlbmRpbmcgPSB0cnVlOwor CQlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX3VwZGF0ZV9pZHggPSB2YWw7CisJCXJldHVybiAwOwor CX0KKwlpZiAocHJvcGVydHkgPT0gcGFuZWwtPmJvcmRlcl9yZWZyZXNoX29uX2V2ZXJ5X3VwZGF0 ZV9wcm9wZXJ0eSkgeworCQlwYW5lbC0+Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlfdXBkYXRlID0g ISF2YWw7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJvcGVydHkgPT0gcGFuZWwtPmNsZWFyX29u X2luaXRfcHJvcGVydHkpIHsKKwkJaWYgKHZhbCA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJ cGFuZWwtPmNsZWFyX29uX2luaXQgPSAoaW50KXZhbCAtIDE7ICAvKiB2YWwgMC8xLzIvMyDihpIg ZmllbGQgLTEvMC8xLzIgKi8KKwkJcGFuZWwtPmZpcnN0X2NsZWFyX2RvbmUgPSBmYWxzZTsgIC8q IGFsbG93IHJlLWZpcmUgb24gbmV4dCBlbmFibGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmIChw cm9wZXJ0eSA9PSBwYW5lbC0+Y2xlYXJfb25fY2xvc2VfcHJvcGVydHkpIHsKKwkJaWYgKHZhbCA+ IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGFuZWwtPmNsZWFyX29uX2Nsb3NlID0gKGludCl2 YWwgLSAxOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHByb3BlcnR5ID09IHBhbmVsLT5jbGVhcl9v bl9kaXNhYmxlX3Byb3BlcnR5KSB7CisJCWlmICh2YWwgPiAzKQorCQkJcmV0dXJuIC1FSU5WQUw7 CisJCXBhbmVsLT5jbGVhcl9vbl9kaXNhYmxlID0gKGludCl2YWwgLSAxOworCQlyZXR1cm4gMDsK Kwl9CisJaWYgKHByb3BlcnR5ID09IHBhbmVsLT5yZWZyZXNoX21vZGVfaW5pdF9wcm9wZXJ0eSkg eworCQlpZiAodmFsID4gMykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwYW5lbC0+cmVmcmVzaF9t b2RlX2luaXQgPSAoaW50KXZhbCAtIDE7CisJCXJldHVybiAwOworCX0KKwlpZiAocHJvcGVydHkg PT0gcGFuZWwtPmNvbG9yX21vZGVfcHJvcGVydHkpIHsKKwkJaWYgKHZhbCA+IFNTRDE2WFhfQ09M T1JfTU9ERV8zQ09MT1IpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHZhbCA9PSBTU0QxNlhY X0NPTE9SX01PREVfM0NPTE9SICYmICFwYW5lbC0+cGFuZWxfY2ZnLT5yZWRfc3VwcG9ydGVkKSB7 CisJCQlkcm1fZGJnKCZwYW5lbC0+ZHJtLAorCQkJCSJzZXRfcHJvcGVydHk6IDMtY29sb3IgbW9k ZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcGFuZWxcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJ CX0KKwkJcGFuZWwtPmNvbG9yX21vZGUgPSB2YWw7CisJCXJldHVybiAwOworCX0KKworCXJldHVy biAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3Mg c3NkMTZ4eF9jb25uZWN0b3JfZnVuY3MgPSB7CisJLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJf Y29ubmVjdG9yX3Jlc2V0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVf Y29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAorCS5h dG9taWNfZHVwbGljYXRlX3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxp Y2F0ZV9zdGF0ZSwKKwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9j b25uZWN0b3JfZGVzdHJveV9zdGF0ZSwKKwkuYXRvbWljX2dldF9wcm9wZXJ0eSA9IHNzZDE2eHhf Y29ubmVjdG9yX2F0b21pY19nZXRfcHJvcGVydHksCisJLmF0b21pY19zZXRfcHJvcGVydHkgPSBz c2QxNnh4X2Nvbm5lY3Rvcl9hdG9taWNfc2V0X3Byb3BlcnR5LAorfTsKKworc3RhdGljIGNvbnN0 IHUzMiBzc2QxNnh4X2Zvcm1hdHNbXSA9IHsKKwlEUk1fRk9STUFUX1hSR0I4ODg4LCAgLyogMzIt Yml0IFJHQiB3aXRoIHBhZGRpbmcgKHByZWZlcnJlZCkgKi8KKwlEUk1fRk9STUFUX1JHQjg4OCwg ICAgLyogMjQtYml0IHBhY2tlZCBSR0IgKi8KKwlEUk1fRk9STUFUX1JHQjU2NSwgICAgLyogMTYt Yml0IFJHQiAoNTo2OjUpICovCisJRFJNX0ZPUk1BVF9SOCwgICAgICAgIC8qIDgtYml0IGdyYXlz Y2FsZSAqLworCURSTV9GT1JNQVRfTlYxMiwgICAgICAvKiBZVVYgNDoyOjAgcGxhbmFyICovCisJ RFJNX0ZPUk1BVF9OVjE2LCAgICAgIC8qIFlVViA0OjI6MiBwbGFuYXIgKi8KKwlEUk1fRk9STUFU X1lVWVYsICAgICAgLyogUGFja2VkIFlVViA0OjI6MiAoWTAgVTAgWTEgVjApICovCisJRFJNX0ZP Uk1BVF9VWVZZLCAgICAgIC8qIFBhY2tlZCBZVVYgNDoyOjIgKFUwIFkwIFYwIFkxKSAqLworCURS TV9GT1JNQVRfUjEsICAgICAgICAvKiAxLWJpdCBtb25vY2hyb21lIChuYXRpdmUsIDggcGl4ZWxz L2J5dGUpICovCit9OworCitERUZJTkVfRFJNX0dFTV9GT1BTKHNzZDE2eHhfZm9wcyk7CisKKy8q CisgKiBzc2QxNnh4X2RybV9tYXN0ZXJfc2V0IC0gYXJtIGluaXQgcmVmcmVzaCB3aGVuIGEgbmV3 IG1hc3RlciB0YWtlcyBjb250cm9sLgorICovCitzdGF0aWMgdm9pZCBzc2QxNnh4X2RybV9tYXN0 ZXJfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sCisJCQkJICAgc3RydWN0IGRybV9maWxlICpm aWxlLCBib29sIGZyb21fb3BlbikKK3sKKwlzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwgPSB0 b19zc2QxNnh4X3BhbmVsKGRybSk7CisKKwlwYW5lbC0+ZGlzcGxheV9jbGVhcmVkX29uX2RlaW5p dCA9IGZhbHNlOworCXBhbmVsLT5maXJzdF9jbGVhcl9kb25lID0gZmFsc2U7CisKKwlpZiAocGFu ZWwtPnJlZnJlc2hfbW9kZV9pbml0ID49IDApCisJCXBhbmVsLT5pbml0X3JlZnJlc2hfcGVuZGlu ZyA9IHRydWU7Cit9CisKKy8qCisgKiBzc2QxNnh4X2RybV9tYXN0ZXJfZHJvcCAtIGNsZWFyIGRp c3BsYXkgYW5kIGRpc2FybSBpbml0IHJlZnJlc2ggd2hlbiB0aGUKKyAqIG1hc3RlciBjbGllbnQg ZXhpdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNzZDE2eHhfZHJtX21hc3Rlcl9kcm9wKHN0cnVjdCBk cm1fZGV2aWNlICpkcm0sCisJCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1 Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwgPSB0b19zc2QxNnh4X3BhbmVsKGRybSk7CisJaW50IHJl dDsKKworCXBhbmVsLT5pbml0X3JlZnJlc2hfcGVuZGluZyA9IGZhbHNlOworCXBhbmVsLT5maXJz dF9jbGVhcl9kb25lID0gZmFsc2U7CisKKwlpZiAocGFuZWwtPmNsZWFyX29uX2Nsb3NlIDwgMCB8 fCBwYW5lbC0+ZGlzcGxheV9jbGVhcmVkX29uX2RlaW5pdCkKKwkJcmV0dXJuOworCisJcmV0ID0g c3NkMTZ4eF9jbGVhcl9kaXNwbGF5X29uX2V4aXQocGFuZWwpOworCWlmIChyZXQpCisJCWRybV9l cnIoZHJtLCAibWFzdGVyX2Ryb3A6IGNsZWFyIG9uIGNsb3NlIGZhaWxlZDogJWRcbiIsIHJldCk7 CisKKwlwYW5lbC0+ZGlzcGxheV9jbGVhcmVkX29uX2RlaW5pdCA9IHRydWU7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgZHJtX2RyaXZlciBzc2QxNnh4X2RybV9kcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0 dXJlcyA9IERSSVZFUl9HRU0gfCBEUklWRVJfTU9ERVNFVCB8IERSSVZFUl9BVE9NSUMsCisJLmZv cHMgPSAmc3NkMTZ4eF9mb3BzLAorCS5uYW1lID0gInNzZDE2eHgiLAorCS5kZXNjID0gIkRSTSBk cml2ZXIgZm9yIFNTRDE2eHggZS1wYXBlciBjb250cm9sbGVyIGZhbWlseSIsCisJLm1ham9yID0g MSwKKwkubWlub3IgPSAwLAorCS5tYXN0ZXJfc2V0ICA9IHNzZDE2eHhfZHJtX21hc3Rlcl9zZXQs CisJLm1hc3Rlcl9kcm9wID0gc3NkMTZ4eF9kcm1fbWFzdGVyX2Ryb3AsCisJRFJNX0dFTV9ETUFf RFJJVkVSX09QUywKKwlEUk1fRkJERVZfRE1BX0RSSVZFUl9PUFMsCit9OworCitzdGF0aWMgY29u c3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBzc2QxNnh4X21vZGVfY29uZmlnX2Z1bmNz ID0geworCS5mYl9jcmVhdGUgPSBkcm1fZ2VtX2ZiX2NyZWF0ZV93aXRoX2RpcnR5LAorCS5hdG9t aWNfY2hlY2sgPSBkcm1fYXRvbWljX2hlbHBlcl9jaGVjaywKKwkuYXRvbWljX2NvbW1pdCA9IGRy bV9hdG9taWNfaGVscGVyX2NvbW1pdCwKK307CisKKy8qCisgKiBVc2UgdGhlIFJQTSBjb21taXQt dGFpbCB2YXJpYW50IHNvIHRoYXQgZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X21vZGVzZXRfZW5h YmxlcworICogKHdoaWNoIGNhbGxzIGNydGNfYXRvbWljX2VuYWJsZSkgcnVucyBiZWZvcmUgZHJt X2F0b21pY19oZWxwZXJfY29tbWl0X3BsYW5lcy4KKyAqIFdpdGhvdXQgdGhpcywgdGhlIHN0YW5k YXJkIGNvbW1pdF90YWlsIGNhbGxzIGNvbW1pdF9wbGFuZXMgYmVmb3JlCisgKiBtb2Rlc2V0X2Vu YWJsZXMsIHNvIHBsYW5lX2F0b21pY191cGRhdGUgd291bGQgc2VlIGluaXRpYWxpemVkID09IGZh bHNlIG9uIHRoZQorICogZmlyc3QgY29tbWl0IGFuZCBzaWxlbnRseSBkcm9wIHRoZSBmcmFtZS4K KyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfaGVscGVyX2Z1bmNzIHNz ZDE2eHhfbW9kZV9jb25maWdfaGVscGVyX2Z1bmNzID0geworCS5hdG9taWNfY29tbWl0X3RhaWwg PSBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfdGFpbF9ycG0sCit9OworCitzdGF0aWMgaW50IHNz ZDE2eHhfYWxsb2NfdHhfYnVmcyhzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwpCit7CisJc3Ry dWN0IGRldmljZSAqZGV2ID0gJnBhbmVsLT5zcGktPmRldjsKKwlzaXplX3QgZnJhbWVfc2l6ZSA9 IChwYW5lbC0+Y29udHJvbGxlcl9jZmctPm1heF93aWR0aCAqCisJCQkgICAgIHBhbmVsLT5jb250 cm9sbGVyX2NmZy0+bWF4X2hlaWdodCkgLyA4OworCisJcGFuZWwtPnR4X2J1ZiA9IGRldm1fa21h bGxvYyhkZXYsIGZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcGFuZWwtPnR4X2J1ZikK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGFuZWwtPnBhbmVsX2NmZy0+cmVkX3N1cHBvcnRl ZCkgeworCQlwYW5lbC0+dHhfcmVkX2J1ZiA9IGRldm1fa21hbGxvYyhkZXYsIGZyYW1lX3NpemUs IEdGUF9LRVJORUwpOworCQlpZiAoIXBhbmVsLT50eF9yZWRfYnVmKQorCQkJcmV0dXJuIC1FTk9N RU07CisJfQorCisJaWYgKCFwYW5lbC0+ZGMpIHsKKwkJcGFuZWwtPnR4X2J1ZjkgPSBkZXZtX2tt YWxsb2NfYXJyYXkoZGV2LCBmcmFtZV9zaXplLAorCQkJCQkJICAgIHNpemVvZih1MTYpLCBHRlBf S0VSTkVMKTsKKwkJaWYgKCFwYW5lbC0+dHhfYnVmOSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzZDE2eHhfcHJvYmUoc3RydWN0IHNwaV9k ZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3BpLT5kZXY7CisJc3RydWN0 IHNzZDE2eHhfcGFuZWwgKnBhbmVsOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm07CisJY29uc3Qg c3RydWN0IHNwaV9kZXZpY2VfaWQgKnNwaV9pZDsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZTsKKwljb25zdCB2b2lkICptYXRjaDsKKwllbnVtIHNzZDE2eHhfbW9kZWwgbW9kZWw7CisJ dTMyIGR0X3JvdGF0aW9uID0gMDsKKwlpbnQgcmV0OworCisJbWF0Y2ggPSBkZXZpY2VfZ2V0X21h dGNoX2RhdGEoZGV2KTsKKwlpZiAobWF0Y2gpIHsKKwkJbW9kZWwgPSAoZW51bSBzc2QxNnh4X21v ZGVsKSh1aW50cHRyX3QpbWF0Y2g7CisJfSBlbHNlIHsKKwkJc3BpX2lkID0gc3BpX2dldF9kZXZp Y2VfaWQoc3BpKTsKKwkJbW9kZWwgPSAoZW51bSBzc2QxNnh4X21vZGVsKXNwaV9pZC0+ZHJpdmVy X2RhdGE7CisJfQorCisJaWYgKCFkZXYtPmNvaGVyZW50X2RtYV9tYXNrKSB7CisJCXJldCA9IGRt YV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwkJaWYg KHJldCkgeworCQkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHNldCBETUEgbWFzazogJWRcbiIs IHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcGFuZWwgPSBkZXZtX2RybV9kZXZf YWxsb2MoZGV2LCAmc3NkMTZ4eF9kcm1fZHJpdmVyLAorCQkJCSAgIHN0cnVjdCBzc2QxNnh4X3Bh bmVsLCBkcm0pOworCWlmIChJU19FUlIocGFuZWwpKQorCQlyZXR1cm4gUFRSX0VSUihwYW5lbCk7 CisKKwlkcm0gPSAmcGFuZWwtPmRybTsKKwlwYW5lbC0+c3BpID0gc3BpOworCXBhbmVsLT5tb2Rl bCA9IG1vZGVsOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHBhbmVsKTsKKworCXNwaS0+bW9kZSA9 IFNQSV9NT0RFXzA7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gU1NEMTZYWF9TUElfQklUU19QRVJf V09SRDsKKworCWlmICghc3BpLT5tYXhfc3BlZWRfaHopIHsKKwkJZHJtX3dhcm4oZHJtLCAic3Bp LW1heC1mcmVxdWVuY3kgbm90IHNwZWNpZmllZCwgdXNpbmcgJXUgSHpcbiIsCisJCQkgU1NEMTZY WF9TUElfU1BFRURfREVGQVVMVCk7CisJCXNwaS0+bWF4X3NwZWVkX2h6ID0gU1NEMTZYWF9TUElf U1BFRURfREVGQVVMVDsKKwl9CisKKwlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKKwlpZiAocmV0IDwg MCkgeworCQlkcm1fZXJyKGRybSwgIlNQSSBzZXR1cCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQly ZXR1cm4gcmV0OworCX0KKworCXN3aXRjaCAobW9kZWwpIHsKKwljYXNlIEdERVkwNDJUODE6CisJ CXBhbmVsLT5jb250cm9sbGVyID0gU1NEMTY4MzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHJt X2Vycihkcm0sICJVbmtub3duIHBhbmVsIG1vZGVsOiAlZFxuIiwgbW9kZWwpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlpZiAocGFuZWwtPmNvbnRyb2xsZXIgPj0gQVJSQVlfU0laRShzc2Qx Nnh4X2NvbnRyb2xsZXJfY29uZmlncykgfHwKKwkgICAgIXNzZDE2eHhfY29udHJvbGxlcl9jb25m aWdzW3BhbmVsLT5jb250cm9sbGVyXS5tYXhfd2lkdGgpCisJCXJldHVybiAtRUlOVkFMOworCXBh bmVsLT5jb250cm9sbGVyX2NmZyA9ICZzc2QxNnh4X2NvbnRyb2xsZXJfY29uZmlnc1twYW5lbC0+ Y29udHJvbGxlcl07CisKKwlpZiAobW9kZWwgPj0gQVJSQVlfU0laRShzc2QxNnh4X3BhbmVsX2Nv bmZpZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwYW5lbC0+cGFuZWxfY2ZnID0gJnNzZDE2eHhf cGFuZWxfY29uZmlnc1ttb2RlbF07CisKKwltb2RlID0gZGV2bV9rbWVtZHVwKGRldiwgcGFuZWwt PnBhbmVsX2NmZy0+bW9kZSwKKwkJCSAgICBzaXplb2YoKnBhbmVsLT5wYW5lbF9jZmctPm1vZGUp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1vZGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFuZWwt PnJlZnJlc2hfbW9kZSA9IHBhbmVsLT5wYW5lbF9jZmctPmRlZmF1bHRfcmVmcmVzaF9tb2RlOwor CS8qIERlZmF1bHQgY29sb3IgbW9kZTogMy1jb2xvciBmb3IgcGFuZWxzIHdpdGggcmVkIHBsYW5l LCBCVyBvdGhlcndpc2UgKi8KKwlwYW5lbC0+Y29sb3JfbW9kZSA9IHBhbmVsLT5wYW5lbF9jZmct PnJlZF9zdXBwb3J0ZWQKKwkJCQk/IFNTRDE2WFhfQ09MT1JfTU9ERV8zQ09MT1IKKwkJCQk6IFNT RDE2WFhfQ09MT1JfTU9ERV9CVzsKKwlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX2luaXRfaWR4ICAg PSBwYW5lbC0+cGFuZWxfY2ZnLT5kZWZhdWx0X2JvcmRlcl93YXZlZm9ybV9pbml0OworCXBhbmVs LT5ib3JkZXJfd2F2ZWZvcm1fdXBkYXRlX2lkeCA9IHBhbmVsLT5wYW5lbF9jZmctPmRlZmF1bHRf Ym9yZGVyX3dhdmVmb3JtX3VwZGF0ZTsKKwlwYW5lbC0+Ym9yZGVyX3JlZnJlc2hfb25fZXZlcnlf dXBkYXRlID0KKwkJcGFuZWwtPnBhbmVsX2NmZy0+ZGVmYXVsdF9ib3JkZXJfcmVmcmVzaF9vbl9l dmVyeV91cGRhdGU7CisJcGFuZWwtPmNsZWFyX29uX2luaXQgICAgPSBwYW5lbC0+cGFuZWxfY2Zn LT5kZWZhdWx0X2NsZWFyX29uX2luaXQ7CisJcGFuZWwtPmNsZWFyX29uX2Nsb3NlICAgPSBwYW5l bC0+cGFuZWxfY2ZnLT5kZWZhdWx0X2NsZWFyX29uX2Nsb3NlOworCXBhbmVsLT5jbGVhcl9vbl9k aXNhYmxlID0gcGFuZWwtPnBhbmVsX2NmZy0+ZGVmYXVsdF9jbGVhcl9vbl9kaXNhYmxlOworCXBh bmVsLT5yZWZyZXNoX21vZGVfaW5pdCA9IHBhbmVsLT5wYW5lbF9jZmctPmRlZmF1bHRfcmVmcmVz aF9tb2RlX2luaXQ7CisKKwkvKiBNb2R1bGUgcGFyYW1ldGVyIG92ZXJyaWRlcyBmb3IgYm9yZGVy L2Rpc3BsYXkgY29udHJvbCAqLworCWlmIChib3JkZXJfd2F2ZWZvcm1faW5pdF9sdXQgPj0gMCAm JgorCSAgICBib3JkZXJfd2F2ZWZvcm1faW5pdF9sdXQgPCAoaW50KUFSUkFZX1NJWkUoc3NkMTY4 M19ib3JkZXJfd2F2ZWZvcm1fdGFibGUpKQorCQlwYW5lbC0+Ym9yZGVyX3dhdmVmb3JtX2luaXRf aWR4ID0gYm9yZGVyX3dhdmVmb3JtX2luaXRfbHV0OworCWlmIChib3JkZXJfd2F2ZWZvcm1fbHV0 ID49IDAgJiYKKwkgICAgYm9yZGVyX3dhdmVmb3JtX2x1dCA8IChpbnQpQVJSQVlfU0laRShzc2Qx NjgzX2JvcmRlcl93YXZlZm9ybV90YWJsZSkpCisJCXBhbmVsLT5ib3JkZXJfd2F2ZWZvcm1fdXBk YXRlX2lkeCA9IGJvcmRlcl93YXZlZm9ybV9sdXQ7CisJaWYgKGJvcmRlcl9yZWZyZXNoX29uX2V2 ZXJ5X3VwZGF0ZSkKKwkJcGFuZWwtPmJvcmRlcl9yZWZyZXNoX29uX2V2ZXJ5X3VwZGF0ZSA9IHRy dWU7CisJaWYgKGNsZWFyX29uX2luaXQgPj0gMCAmJiBjbGVhcl9vbl9pbml0IDw9IDIpCisJCXBh bmVsLT5jbGVhcl9vbl9pbml0ID0gY2xlYXJfb25faW5pdDsKKwlpZiAoY2xlYXJfb25fY2xvc2Ug Pj0gMCAmJiBjbGVhcl9vbl9jbG9zZSA8PSAyKQorCQlwYW5lbC0+Y2xlYXJfb25fY2xvc2UgPSBj bGVhcl9vbl9jbG9zZTsKKwlpZiAoY2xlYXJfb25fZGlzYWJsZSA+PSAwICYmIGNsZWFyX29uX2Rp c2FibGUgPD0gMikKKwkJcGFuZWwtPmNsZWFyX29uX2Rpc2FibGUgPSBjbGVhcl9vbl9kaXNhYmxl OworCWlmIChyZWZyZXNoX21vZGVfaW5pdCA+PSAwICYmIHJlZnJlc2hfbW9kZV9pbml0IDw9IDIp CisJCXBhbmVsLT5yZWZyZXNoX21vZGVfaW5pdCA9IHJlZnJlc2hfbW9kZV9pbml0OworCisJLyog TW9kdWxlIHBhcmFtZXRlciBvdmVycmlkZXMgcGFuZWwgZGVmYXVsdCByZWZyZXNoIG1vZGUgd2hl biBzZXQgKi8KKwlpZiAocmVmcmVzaF9tb2RlID49IDApIHsKKwkJaWYgKHJlZnJlc2hfbW9kZSA+ IFNTRDE2WFhfUkVGUkVTSF9GQVNUKQorCQkJZHJtX3dhcm4oZHJtLCAiSW52YWxpZCByZWZyZXNo X21vZGUgbW9kdWxlIHBhcmFtICVkLCBpZ25vcmVkXG4iLAorCQkJCSByZWZyZXNoX21vZGUpOwor CQllbHNlCisJCQlwYW5lbC0+cmVmcmVzaF9tb2RlID0gcmVmcmVzaF9tb2RlOworCX0KKworCS8q IE1vZHVsZSBwYXJhbWV0ZXIgb3ZlcnJpZGVzIHBhbmVsIGRlZmF1bHQgY29sb3IgbW9kZSB3aGVu IHNldCAqLworCWlmIChjb2xvcl9tb2RlID49IDApIHsKKwkJaWYgKGNvbG9yX21vZGUgPiBTU0Qx NlhYX0NPTE9SX01PREVfM0NPTE9SKQorCQkJZHJtX3dhcm4oZHJtLCAiSW52YWxpZCBjb2xvcl9t b2RlIG1vZHVsZSBwYXJhbSAlZCwgaWdub3JlZFxuIiwKKwkJCQkgY29sb3JfbW9kZSk7CisJCWVs c2UgaWYgKGNvbG9yX21vZGUgPT0gU1NEMTZYWF9DT0xPUl9NT0RFXzNDT0xPUiAmJgorCQkJICFw YW5lbC0+cGFuZWxfY2ZnLT5yZWRfc3VwcG9ydGVkKQorCQkJZHJtX3dhcm4oZHJtLAorCQkJCSAi Y29sb3JfbW9kZT0zLWNvbG9yIHJlcXVlc3RlZCBidXQgcGFuZWwgaGFzIG5vIHJlZCBwbGFuZSwg aWdub3JlZFxuIik7CisJCWVsc2UKKwkJCXBhbmVsLT5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsK Kwl9CisKKwkvKiBQYXJzZSAicm90YXRpb24iIERUIHByb3BlcnR5OyBzd2FwIG1vZGUgZGltZW5z aW9ucyBmb3IgcG9ydHJhaXQuICovCisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgInJv dGF0aW9uIiwgJmR0X3JvdGF0aW9uKTsKKwlpZiAoZHRfcm90YXRpb24gIT0gMCAmJiBkdF9yb3Rh dGlvbiAhPSA5MCAmJiBkdF9yb3RhdGlvbiAhPSAxODAgJiYgZHRfcm90YXRpb24gIT0gMjcwKSB7 CisJCWRybV93YXJuKGRybSwgIkludmFsaWQgRFQgcm90YXRpb24gJXUsIGRlZmF1bHRpbmcgdG8g MMKwXG4iLCBkdF9yb3RhdGlvbik7CisJCWR0X3JvdGF0aW9uID0gMDsKKwl9CisJcGFuZWwtPm9y aWVudGF0aW9uID0gZHRfcm90YXRpb247CisKKwkvKiBNb2R1bGUgcGFyYW1ldGVyIG92ZXJyaWRl cyBEVCByb3RhdGlvbiB3aGVuIHNldCAqLworCWlmIChyb3RhdGlvbiA+PSAwKSB7CisJCWlmIChy b3RhdGlvbiAhPSAwICYmIHJvdGF0aW9uICE9IDkwICYmIHJvdGF0aW9uICE9IDE4MCAmJiByb3Rh dGlvbiAhPSAyNzApCisJCQlkcm1fd2Fybihkcm0sICJJbnZhbGlkIHJvdGF0aW9uIG1vZHVsZSBw YXJhbSAlZCwgaWdub3JlZFxuIiwKKwkJCQkgcm90YXRpb24pOworCQllbHNlCisJCQlwYW5lbC0+ b3JpZW50YXRpb24gPSByb3RhdGlvbjsKKwl9CisKKwlkcm1fZGJnKGRybSwgIlVzaW5nICVzIG9y aWVudGF0aW9uICgldcKwLCAldXgldSBsb2dpY2FsKVxuIiwKKwkJKHBhbmVsLT5vcmllbnRhdGlv biA9PSA5MCB8fCBwYW5lbC0+b3JpZW50YXRpb24gPT0gMjcwKSA/ICJwb3J0cmFpdCIgOiAibGFu ZHNjYXBlIiwKKwkJcGFuZWwtPm9yaWVudGF0aW9uLCBtb2RlLT5oZGlzcGxheSwgbW9kZS0+dmRp c3BsYXkpOworCisJLyogU3dhcCBtb2RlIGRpbWVuc2lvbnMgZm9yIHBvcnRyYWl0IHNvIGNsaWVu dHMgc2VlIGxvZ2ljYWwgc2l6ZS4gKi8KKwlpZiAocGFuZWwtPm9yaWVudGF0aW9uID09IDkwIHx8 IHBhbmVsLT5vcmllbnRhdGlvbiA9PSAyNzApIHsKKwkJc3dhcChtb2RlLT5oZGlzcGxheSwgbW9k ZS0+dmRpc3BsYXkpOworCQlzd2FwKG1vZGUtPmhzeW5jX3N0YXJ0LCBtb2RlLT52c3luY19zdGFy dCk7CisJCXN3YXAobW9kZS0+aHN5bmNfZW5kLCBtb2RlLT52c3luY19lbmQpOworCQlzd2FwKG1v ZGUtPmh0b3RhbCwgbW9kZS0+dnRvdGFsKTsKKwkJc3dhcChtb2RlLT53aWR0aF9tbSwgbW9kZS0+ aGVpZ2h0X21tKTsKKwkJZHJtX2RiZyhkcm0sICJNb2RlIGRpbWVuc2lvbnMgc3dhcHBlZCBmb3Ig cG9ydHJhaXQ6ICV1eCV1XG4iLAorCQkJbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5KTsK Kwl9IGVsc2UgeworCQlkcm1fZGJnKGRybSwgIk1vZGUgZGltZW5zaW9ucyB1bmNoYW5nZWQ6ICV1 eCV1XG4iLAorCQkJbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5KTsKKwl9CisJcGFuZWwt Pm1vZGUgPSBtb2RlOworCXBhbmVsLT53aWR0aCA9IG1vZGUtPmhkaXNwbGF5OworCXBhbmVsLT5o ZWlnaHQgPSBtb2RlLT52ZGlzcGxheTsKKworCS8qIEFjcXVpcmUgR1BJT3MuICovCisJcGFuZWwt PnJlc2V0ID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfSElHSCk7CisJ aWYgKElTX0VSUihwYW5lbC0+cmVzZXQpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBU Ul9FUlIocGFuZWwtPnJlc2V0KSwgIkZhaWxlZCB0byBnZXQgUkVTRVQgR1BJT1xuIik7CisKKwlw YW5lbC0+YnVzeSA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgImJ1c3kiLCBHUElPRF9JTik7CisJaWYg KElTX0VSUihwYW5lbC0+YnVzeSkpCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VS UihwYW5lbC0+YnVzeSksICJGYWlsZWQgdG8gZ2V0IEJVU1kgR1BJT1xuIik7CisKKwlwYW5lbC0+ ZGMgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJkYyIsIEdQSU9EX09VVF9MT1cpOwor CWlmIChJU19FUlIocGFuZWwtPmRjKSkKKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJf RVJSKHBhbmVsLT5kYyksICJGYWlsZWQgdG8gZ2V0IERDIEdQSU9cbiIpOworCWlmICghcGFuZWwt PmRjKSB7CisJCWlmICghc3BpX2lzX2Jwd19zdXBwb3J0ZWQoc3BpLCA5KSkKKwkJCXJldHVybiBk ZXZfZXJyX3Byb2JlKGRldiwgLUVJTlZBTCwKKwkJCQkJICAgICAiMy13aXJlIFNQSSBtb2RlIHJl cXVpcmVzIDktYml0IHdvcmQgc3VwcG9ydFxuIik7CisJCWRybV9kYmcoZHJtLCAiZGMtZ3Bpb3Mg bm90IHNwZWNpZmllZCwgdXNpbmcgMy13aXJlICg5LWJpdCkgU1BJIG1vZGVcbiIpOworCX0KKwor CXJldCA9IHNzZDE2eHhfYWxsb2NfdHhfYnVmcyhwYW5lbCk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCXNzZDE2eHhfaHdfcmVzZXQocGFuZWwpOworCisJcmV0ID0gZHJtbV9tb2RlX2Nv bmZpZ19pbml0KGRybSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRybS0+bW9kZV9j b25maWcuZnVuY3MgPSAmc3NkMTZ4eF9tb2RlX2NvbmZpZ19mdW5jczsKKwlkcm0tPm1vZGVfY29u ZmlnLmhlbHBlcl9wcml2YXRlID0gJnNzZDE2eHhfbW9kZV9jb25maWdfaGVscGVyX2Z1bmNzOwor CWRybS0+bW9kZV9jb25maWcubWluX3dpZHRoID0gbWluKHBhbmVsLT53aWR0aCwgcGFuZWwtPmhl aWdodCk7CisJZHJtLT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSBtYXgocGFuZWwtPndpZHRoLCBw YW5lbC0+aGVpZ2h0KTsKKwlkcm0tPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQgPSBtaW4ocGFuZWwt PndpZHRoLCBwYW5lbC0+aGVpZ2h0KTsKKwlkcm0tPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSBt YXgocGFuZWwtPndpZHRoLCBwYW5lbC0+aGVpZ2h0KTsKKworCWRybV9jb25uZWN0b3JfaGVscGVy X2FkZCgmcGFuZWwtPmNvbm5lY3RvciwgJnNzZDE2eHhfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7 CisJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJnBhbmVsLT5jb25uZWN0b3IsICZzc2Qx Nnh4X2Nvbm5lY3Rvcl9mdW5jcywKKwkJCQkgRFJNX01PREVfQ09OTkVDVE9SX1NQSSk7CisJaWYg KHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRybV91bml2ZXJzYWxfcGxhbmVfaW5pdChk cm0sICZwYW5lbC0+cHJpbWFyeV9wbGFuZSwgMCwKKwkJCQkgICAgICAgJnNzZDE2eHhfcGxhbmVf ZnVuY3MsCisJCQkJICAgICAgIHNzZDE2eHhfZm9ybWF0cywgQVJSQVlfU0laRShzc2QxNnh4X2Zv cm1hdHMpLAorCQkJCSAgICAgICBOVUxMLCBEUk1fUExBTkVfVFlQRV9QUklNQVJZLCBOVUxMKTsK KwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWRybV9wbGFuZV9oZWxwZXJfYWRkKCZwYW5lbC0+ cHJpbWFyeV9wbGFuZSwgJnNzZDE2eHhfcGxhbmVfaGVscGVyX2Z1bmNzKTsKKwlkcm1fcGxhbmVf ZW5hYmxlX2ZiX2RhbWFnZV9jbGlwcygmcGFuZWwtPnByaW1hcnlfcGxhbmUpOworCisJcmV0ID0g ZHJtX2NydGNfaW5pdF93aXRoX3BsYW5lcyhkcm0sICZwYW5lbC0+Y3J0YywgJnBhbmVsLT5wcmlt YXJ5X3BsYW5lLAorCQkJCQlOVUxMLCAmc3NkMTZ4eF9jcnRjX2Z1bmNzLCBOVUxMKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCWRybV9jcnRjX2hlbHBlcl9hZGQoJnBhbmVsLT5jcnRjLCAm c3NkMTZ4eF9jcnRjX2hlbHBlcl9mdW5jcyk7CisKKwlyZXQgPSBkcm1fc2ltcGxlX2VuY29kZXJf aW5pdChkcm0sICZwYW5lbC0+ZW5jb2RlciwgRFJNX01PREVfRU5DT0RFUl9OT05FKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCXBhbmVsLT5lbmNvZGVyLnBvc3NpYmxlX2NydGNzID0gZHJt X2NydGNfbWFzaygmcGFuZWwtPmNydGMpOworCisJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hf ZW5jb2RlcigmcGFuZWwtPmNvbm5lY3RvciwgJnBhbmVsLT5lbmNvZGVyKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3NkMTZ4eF9jb25uZWN0b3JfY3JlYXRlX3Byb3BlcnRp ZXMocGFuZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkcm1fbW9kZV9jb25maWdf cmVzZXQoZHJtKTsKKworCXJldCA9IGRybV9kZXZfcmVnaXN0ZXIoZHJtLCAwKTsKKwlpZiAocmV0 KQorCQlyZXR1cm4gcmV0OworCisJZHJtX2RiZyhkcm0sICJTU0QxNnh4IGUtcGFwZXIgZGlzcGxh eSBpbml0aWFsaXplZCAoJWR4JWQsICVkwrAgcm90YXRpb24pXG4iLAorCQlwYW5lbC0+d2lkdGgs IHBhbmVsLT5oZWlnaHQsIHBhbmVsLT5vcmllbnRhdGlvbik7CisKKwlkcm1fY2xpZW50X3NldHVw KGRybSwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3NkMTZ4eF9yZW1v dmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFu ZWwgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWRybV9kZXZfdW5wbHVnKCZwYW5lbC0+ZHJt KTsKKwlkcm1fYXRvbWljX2hlbHBlcl9zaHV0ZG93bigmcGFuZWwtPmRybSk7Cit9CisKK3N0YXRp YyB2b2lkIHNzZDE2eHhfc2h1dGRvd24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1 Y3Qgc3NkMTZ4eF9wYW5lbCAqcGFuZWwgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWRybV9h dG9taWNfaGVscGVyX3NodXRkb3duKCZwYW5lbC0+ZHJtKTsKK30KKworc3RhdGljIGNvbnN0IHN0 cnVjdCBvZl9kZXZpY2VfaWQgc3NkMTZ4eF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUg PSAiZ29vZGRpc3BsYXksZ2RleTA0MnQ4MSIsIC5kYXRhID0gKHZvaWQgKilHREVZMDQyVDgxIH0s CisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3NkMTZ4eF9vZl9tYXRjaCk7CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBzc2QxNnh4X2lkW10gPSB7CisJeyAi Z2RleTA0MnQ4MSIsIEdERVkwNDJUODEgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxF KHNwaSwgc3NkMTZ4eF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBzc2QxNnh4X3Nw aV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3NkMTZ4eCIsCisJCS5vZl9t YXRjaF90YWJsZSA9IHNzZDE2eHhfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzc2QxNnh4X3By b2JlLAorCS5yZW1vdmUgPSBzc2QxNnh4X3JlbW92ZSwKKwkuc2h1dGRvd24gPSBzc2QxNnh4X3No dXRkb3duLAorCS5pZF90YWJsZSA9IHNzZDE2eHhfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIo c3NkMTZ4eF9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiRGV2YXJzaCBUaGFra2FyIDxk ZXZhcnNodEB0aS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRSTSBkcml2ZXIgZm9yIFNv bG9tb24gU1NEMTZ4eCBlLXBhcGVyIGRpc3BsYXkgY29udHJvbGxlciBmYW1pbHkiKTsKK01PRFVM RV9MSUNFTlNFKCJHUEwiKTsKLS0gCjIuMzkuMQoK