Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp1944763imw; Sat, 16 Jul 2022 19:50:33 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sAf1pDxgEUuLidXg2wzQ6YK68/12Q+LIjG+A51FrCzBxAXfI596CmL0C/8+P2LanB2tORO X-Received: by 2002:a05:6402:40ce:b0:43a:918d:a73f with SMTP id z14-20020a05640240ce00b0043a918da73fmr29008485edb.387.1658026233369; Sat, 16 Jul 2022 19:50:33 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1658026233; cv=pass; d=google.com; s=arc-20160816; b=n/k199nwimNnT4+5a/Phi3q0bx6xBxm77no8/EvhWRQAfWtk10k+j9gKX2509Gn7Ub 7qsGGDtEPv8ShoTjynNxvBSEQqsUBDI0ejQimTeTkJy2Gnv88e5OVvhid4Vvc7zueB7H Jce3hPPSlgBie9lO/JQAOeUfh+rfvaRnSWytATXTy00OGE+I1C4hBSjGLdh50BX1ApFS mRr6qFFkQkDf8g1owdIZYH/488GOXmKftjU1GKJXJGkO+IsegysBjgep1Y14i9GcgT05 Zh1MT6X8Foz1ZdnCKrwNgohjsWPYd2tDPVE6RtQYuu3Kh+p/l4/sQ5P7/iSvl43c+aLV ERqg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:to:from :dkim-signature:dkim-signature; bh=2eep3hjYB6zmDLf+XulkM3bCy+XkUI8IVx9mkNfKPYk=; b=e3cGf+Ef6u+PneverKmHmLjaWMY86ToCmutT5BUApKHwcXyQU9Y9R413gVEg+IOudk cSzKuREBqXAp4xAAs6vvnTa5H+Qg26nDv8YFKr/gKCS4k4taH0Q2NAMMiF5ik+Efzw6G xVRRaEAfIyRL2puISVVoWPWjwWHLZ1W3SkhKYDjoVFOE2p1swG4lHWEx0gS03vpXL3Kw H2Jf8dmviH92c+LlurdNkiVO3ewUX/A8UT4jyVxWc7qyC4eFZagQgC2oQJfH9G3JA/2Y 0abQPFI+11zAwPaUmesWHmxpPD2je3N/Ktj6MLtA4Cca3jwZ7LwaHXla7w4SGptQzzPP Tqnw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2022-7-12 header.b=ndb9CsVA; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=pMo0cEA4; arc=pass (i=1 spf=pass spfdomain=oracle.com dkim=pass dkdomain=oracle.com dmarc=pass fromdomain=oracle.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qb28-20020a1709077e9c00b006feb4205ecdsi5846099ejc.742.2022.07.16.19.50.08; Sat, 16 Jul 2022 19:50:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2022-7-12 header.b=ndb9CsVA; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=pMo0cEA4; arc=pass (i=1 spf=pass spfdomain=oracle.com dkim=pass dkdomain=oracle.com dmarc=pass fromdomain=oracle.com); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233147AbiGQCsL (ORCPT + 99 others); Sat, 16 Jul 2022 22:48:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232902AbiGQCrF (ORCPT ); Sat, 16 Jul 2022 22:47:05 -0400 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 534A51A802 for ; Sat, 16 Jul 2022 19:47:01 -0700 (PDT) Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26GJ8m1P031761; Sun, 17 Jul 2022 02:46:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2022-7-12; bh=2eep3hjYB6zmDLf+XulkM3bCy+XkUI8IVx9mkNfKPYk=; b=ndb9CsVAzUB6BXSx1+N3ncruPTr6u8bjyMRpMYU74LCj4R7jZNH3cmVmLaCL7zZ4Np4X U7cddUo6OnjJ2r/1Gls/8qHQRyd/gFagOMOt5qK0+QYFKflO/mq6PdOW8MEWFt/G/YLw 3rSuabiK9CgyXzNkhsMzvyPanhMyQUGvnjrd5WUVXi+6y86A9hk7ZuToMERW5qhxcX34 Ot2wDvLXWUfr6X/uc0K5h5ItAOpOLnoQQT4T+vw+CBdbcZpISVwKL8Segg5ST2RZHBdC bx3jiakQWNhtgKwEWuCsDKZzyU768iW14LC1saMlX8Crtf5ZLCsQh+apy0kE0ThEakMm wA== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3hbm428y78-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 17 Jul 2022 02:46:43 +0000 Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 26GMYISf036165; Sun, 17 Jul 2022 02:46:42 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2168.outbound.protection.outlook.com [104.47.56.168]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3hc1ejp63c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 17 Jul 2022 02:46:41 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dWxqQSz/SG7qH7qDEqnBtFxl26BUA0KMgwj4DENz6jk3JA2p9qUp3/3wZWLe+QEeVT1XdAxbKhVQC4JPAtGNQAfJSjUShMCyXhKT7hvLpcF2R0TarbLf4pRW9KswyO3ibR8tVR73CE91hXY1mGDlBtSgPF/eyYxmrVMCPDnKwwtBIbmcQc9hKLM87tfPntr2rzYu+7m8iPyW7C2Jp2d01Y3dYCJPLamCcTqS/EDaPgxl+FTOezK0QePGDcmY1gwhfa306SBJac1YMChGq/hn6Qh4ovZgLpzqB3NI1dSePUmQwX0PUa+2gDMMwtyeHIhjIS5FpK/5W3fQ1At43n2b0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=2eep3hjYB6zmDLf+XulkM3bCy+XkUI8IVx9mkNfKPYk=; b=ZnSL36GWae3uDTpje4VNGf7gekPA6Wyp0HLizdN6ZOCY20AnCkN7IQYi7p+/cyiP2X9i13+adufVcW0cUrSTuFFaMKp8b1qPfBuX2ZnsNHIOP8UfXNYdbkXG3pGN+TQ3piFVJ8sNlEMrANADPeCiHIVnZQP6F4WODVHrRKwQjO3rg4zcQwPjmLptP3xb5+Sr4qc0Bvk+GVk9vb6jfgska6tdbqaw2JyhamTAXBz215bwjttkKJgmY0JvhoeCzK9IsYoE7f79FE5eXUhTArGoL4og3FrUhijhsvXAl45CLS0UzbwDfsandMaSNAnlHMh9c8s66TkDzeOB8AijG4KDbA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2eep3hjYB6zmDLf+XulkM3bCy+XkUI8IVx9mkNfKPYk=; b=pMo0cEA4o17dTCeKZtCI5WC++D4hJRt38H26PxKl/2dzZSB2o/RYxkVFZY/o+UUhsKEGWUYvnbqImlxJ6cXrHLImIh3fagKIoF43lwS4NL2HcyZtd5MCVurIcxjDzAT7TjMPzx5rWhBFQaUgdHA+q2GTKcSq3m1iF4340Ifk2m0= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by BN6PR1001MB2369.namprd10.prod.outlook.com (2603:10b6:405:30::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5438.13; Sun, 17 Jul 2022 02:46:33 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::c4d1:edc3:7d21:7c68]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::c4d1:edc3:7d21:7c68%6]) with mapi id 15.20.5438.020; Sun, 17 Jul 2022 02:46:33 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton , Yu Zhao , Hugh Dickins Subject: [PATCH v11 01/69] Maple Tree: add new data structure Thread-Topic: [PATCH v11 01/69] Maple Tree: add new data structure Thread-Index: AQHYmYdsEZx4iRaruEuWtTwXy+YwWg== Date: Sun, 17 Jul 2022 02:46:33 +0000 Message-ID: <20220717024615.2106835-2-Liam.Howlett@oracle.com> References: <20220717024615.2106835-1-Liam.Howlett@oracle.com> In-Reply-To: <20220717024615.2106835-1-Liam.Howlett@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.35.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 2bcfc3dd-6f6e-4497-85ac-08da679e8f4f x-ms-traffictypediagnostic: BN6PR1001MB2369:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: V0UDO9HsnvjU16ShmlGNVU7TAQDkrtP1El7lWDAiL4ugTvq0JbNPz+3sWoPEKrl+rTOPuwlfzdyIoPzDerJ07JXYhj5RnawBfOfiLCvh81Q/e3bez+3fIcqp2Z8EKEmWrXdW5lL4/LB5mdZ0aRo9kWAUXztE1Qgn0a4DY7qCbsmRYMw+gPuYLzMPY//Zw50oBvtKv6s/EztORGeIZb65C7c/jsOsFzFmaGri+Q+cFWYwAFdmqT+A8kYA8XEfF43/9EkrBKDaniwUugskUka6MaqjLqz0FcbFT17BgFuRztyiP6mtH33DGrxRN362iX5QIfzjSVvMjdalY/Tdkw5eIV0wIVDkJWf43/Km1DkZFVySZREPMGaDymOTfw2efsT9n6kaR01MoASYdwtXzyHWK+ndi9tsMyOVZNj2x1f4vWks0ne/kFI8dO5xVBcbTJ4yrwIzpgl8GjvH1WKLgAwXbw5xUisTZIz4D/5Zb6U1ChQ7sGYCfAiWd2K9ceQmZwcZHxrsUB5RcqFKnZOl87qQ9ltYJ8TzmFypTOvw766uUUee0Nu6NOJkG/dmEUbiqR7TmJPXD78IHiuBES80aCYPJ3YX6jvXyAhtx3fep10b6qs3XZ9XKkbWT/RsIE5pxWbDxCZDy5TOoknQ4nQJPlgaVa7S/JG4AEP6CZDY+H9t1qQOd4oMb1msC6grDYGkWaETJ9fv6rUofUpFcagHyfEt4VIZIXu9JTW7DGzi2GBH3xzZ4FN6yRf0gVobnWuDd83uZBqWThOXJ323ilnFI/YBtyvfywHLdH/OqDej5FI44+E3hP7wJ+J2n8PwL+QkmbnP46yYGhan7kx8CXyZDhvQz00qN+lVFeWn26a2lxLIpsU29m7twe6C6zvdyp4NQuOaIDtvMHsK9rTLsBWn90vWFfVn+ZzLe4HKluxMUdQy3ls= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR10MB3022.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(366004)(136003)(396003)(376002)(39860400002)(346002)(1076003)(6486002)(966005)(71200400001)(186003)(478600001)(38070700005)(6512007)(76116006)(6506007)(2616005)(41300700001)(26005)(122000001)(38100700002)(83380400001)(66946007)(36756003)(8936002)(2906002)(5660300002)(30864003)(44832011)(110136005)(316002)(86362001)(8676002)(66476007)(66556008)(66446008)(64756008)(91956017)(579004)(559001)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?cmdpNmFvNlh0Uk00cUpRay9lZEM3SnY0b0hVQURqWnNLVWthc00yR1drWFdq?= =?utf-8?B?VkNvTGJnaUJ0MUN6VlpacGpVSUpUZFdIMWgxMytmMktBbVRlWlJNSTNZUmV3?= =?utf-8?B?cXMyQ3hKZ0NNTEVBNmxBN3NpU3lBbWtRZkRCNnY3SmhwZ3dROVRyaDNNRjdv?= =?utf-8?B?U3NQS01VYUU3S3BZdENtT2FubFdUb1dQNTQzT2ZWenZ5NnBFaVpMOGxSVmky?= =?utf-8?B?bmR2UjlLZWU3ekhzK2pRaWJqYXdpdzlUSTgzNHIyL1k3UXJxM2hhVzdoaTEy?= =?utf-8?B?aHk0Z1N3MXZTSE9SZS9nUCt5NWcyMU5Wa0Nhc2lpR2x4U2t6RTNaOStvUHNN?= =?utf-8?B?VWJCZkU5OWk2YmlSc2w0MzlWQlFvaVRPMlJwOTFNd3dxZ042THp1aEtIeWpm?= =?utf-8?B?ZDVPbzUvZ0g3RXIxeWRFcG1ZazJJcDVhMXVCSWNwVXBmUlFYWkJWWGxUOWI0?= =?utf-8?B?bUYzTW5sc0RjbHQ0UDNmY1pJbno5L0JYR09vSlNhNEZPYzFPc3ZYWHo4cVpX?= =?utf-8?B?ZlJ2cUpKNDlsRWhSaFZHUndpdHBOdDRWMzdxZEtOREtpU1FTNjhHWUdueE1z?= =?utf-8?B?TitKak5lVUN5QXRqdWVUeW1qaUZ4TDlGRG9LMkJBK3RIb1Q2ZGJFamJHL2sx?= =?utf-8?B?by9lTTlqMTZreGcwQ3dPaEY1R1dRM0kvdjlLcXdJbHRzeGptZWZqOGdjWmlk?= =?utf-8?B?LzhPV3YzM25VdUFDK3lQUkZLUGZBQWtUZzRBZEJKRHV4bWUvWG9qY0Y4ZWx0?= =?utf-8?B?MUw5S3FlWXlkb3NYQXF5dysvbXM5R3FxN2NERlNLOHlaeit1d1VwcDRjZldQ?= =?utf-8?B?cHl2dmt5NEM4T0tBUEdGZGEyc3BFSXgvOXp0KzVlRUZyZnY4MVBKUFVsN3Bp?= =?utf-8?B?c1VrV2d6NE1FbkFnWVNCdnZ3OXNRaGNDb01iWUk3UXN2U01XYXpnYWZERERW?= =?utf-8?B?ZnROVmlaSmJERDZ2ME1TUUZZM0FUQ2x4WkgzblVzVnRtZFdPdkpYK0dWUjRk?= =?utf-8?B?dEQ0Vk12bjFBTS9qanM1RWt4QVRIeUhsTE5iSmsyUEFUYklsVzlrMGN1cTlh?= =?utf-8?B?cHdma2hMV1Q3ZEY3bUF1by80QlVlZEN5VVJGL1I4d0grZDA5Y1o4NWs1YmNl?= =?utf-8?B?T1ZDWW44N3Y4ZkFIZmJobS9qUUpwRjRmUlVrV2ZHZkZHYWlyMmpnQXc2N0Jz?= =?utf-8?B?bm5TRUpjOU1sVmJpaXkwSXQ3emJpUllRVC9IcGIvYXM4Y0NPOVN4a2VwSzg3?= =?utf-8?B?MDJFUDFtbEVXUWgwdXUzdndZTUk0YW9SV3JVNTM4QkE4RG5KQzhLZ0dFWXc5?= =?utf-8?B?VkwzRXFTMGl3RHlBU2lCQy9zOTdCN2NJU00rTFFzNUgzdWlneUZJa0RCanFG?= =?utf-8?B?eDV1ZmxORUMvTVJTSUxDOHBTaFM1bTFKa3R1YlpkVkVRWWxHNWdnUXNOV2Y2?= =?utf-8?B?QVI4aVJpWkdNUTErdVhQYk9jZlM3VU8zTXQ0OVNCQzR1Ty91QXRUTW5yOUwv?= =?utf-8?B?c1VJT2NDSDdQc0ZQcytKYlJ5bElRNkI3dk1ubDAyN1V5dm04QjhzcVphbHJP?= =?utf-8?B?NVNidG5sQVpQTXhOR08rbTRadk84K28xSm93SWFhaENLb0dKa0JNSklmc2NL?= =?utf-8?B?RnQ1bG1EVXBzbjBKbXltYU8yaXVEVzZmZk1rOW03c2xVSmJXVmJjNUxBZUNp?= =?utf-8?B?Y0IvWlFRalFBbkhxZTV0SGN1aUJ0alZpRE9GOERmaXcyd2dpMlo3MEx5Yjhx?= =?utf-8?B?bnhDTFFaQ1dxQVRkWVVMQU1oVllpVUVkSlExY3psZjVER0c1QzZpWittSFE4?= =?utf-8?B?VE5wQmhqTzMyM3NDUHIxbWVONWw5R2VOa1BhSWNyN3IwQXNreUd1RmNFRVU5?= =?utf-8?B?cjh2NjhUZmpzc3dsYU03UHdBRXo5Vk1DdUhsWnNBRDQyRlpZanlUTUZ2R1hw?= =?utf-8?B?ZW9xcjJnK3hlYmVHZGhCZStOaFpCZU85bzljY1pKSmsrOUllK3JkLzhMK1Jz?= =?utf-8?B?RXFyZ3FBOVYvVkliUnROc3hpV3ZqSUpDNklvakdhMkdDYktJQkRTMzVGL1Vz?= =?utf-8?B?MnNhazM3NnE0Sm85QlE4OG9RTDlxblNpdk1uZDhqYVYrc3VCclkrcnJ3b1JH?= =?utf-8?B?SVZuWXBpM0VMZkpCZEJrSHNxRi9VTzAxb3huY2h2V2JyYVl4eE9xTjlrVXV0?= =?utf-8?B?c2c9PQ==?= Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR10MB3022.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2bcfc3dd-6f6e-4497-85ac-08da679e8f4f X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Jul 2022 02:46:33.2568 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 4HwgIya5ROocPXVwIHsT4vmbka9NrpoRm6OCYaVhYhAc7ted/rJ/0pVh0cq3f9bh0EsH+B0CEITBJiUou4D8rw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR1001MB2369 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-17_01,2022-07-15_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 mlxlogscore=999 suspectscore=0 phishscore=0 adultscore=0 spamscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207170010 X-Proofpoint-ORIG-GUID: uAGT1ndn4ameo1CNwTyEJtHS0umRNbK1 X-Proofpoint-GUID: uAGT1ndn4ameo1CNwTyEJtHS0umRNbK1 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpQYXRj aCBzZXJpZXMgIkludHJvZHVjaW5nIHRoZSBNYXBsZSBUcmVlIi4NCg0KVGhlIG1hcGxlIHRyZWUg aXMgYW4gUkNVLXNhZmUgcmFuZ2UgYmFzZWQgQi10cmVlIGRlc2lnbmVkIHRvIHVzZSBtb2Rlcm4N CnByb2Nlc3NvciBjYWNoZSBlZmZpY2llbnRseS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwbGFj ZXMgaW4gdGhlIGtlcm5lbA0KdGhhdCBhIG5vbi1vdmVybGFwcGluZyByYW5nZS1iYXNlZCB0cmVl IHdvdWxkIGJlIGJlbmVmaWNpYWwsIGVzcGVjaWFsbHkNCm9uZSB3aXRoIGEgc2ltcGxlIGludGVy ZmFjZS4gIElmIHlvdSB1c2UgYW4gcmJ0cmVlIHdpdGggb3RoZXIgZGF0YQ0Kc3RydWN0dXJlcyB0 byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9yIGFuIGludGVydmFsIHRyZWUgdG8gdHJhY2sNCm5vbi1v dmVybGFwcGluZyByYW5nZXMsIHRoZW4gdGhpcyBpcyBmb3IgeW91Lg0KDQpUaGUgdHJlZSBoYXMg YSBicmFuY2hpbmcgZmFjdG9yIG9mIDEwIGZvciBub24tbGVhZiBub2RlcyBhbmQgMTYgZm9yIGxl YWYNCm5vZGVzLiAgV2l0aCB0aGUgaW5jcmVhc2VkIGJyYW5jaGluZyBmYWN0b3IsIGl0IGlzIHNp Z25pZmljYW50bHkgc2hvcnRlcg0KdGhhbiB0aGUgcmJ0cmVlIHNvIGl0IGhhcyBmZXdlciBjYWNo ZSBtaXNzZXMuICBUaGUgcmVtb3ZhbCBvZiB0aGUgbGlua2VkDQpsaXN0IGJldHdlZW4gc3Vic2Vx dWVudCBlbnRyaWVzIGFsc28gcmVkdWNlcyB0aGUgY2FjaGUgbWlzc2VzIGFuZCB0aGUgbmVlZA0K dG8gcHVsbCBpbiB0aGUgcHJldmlvdXMgYW5kIG5leHQgVk1BIGR1cmluZyBtYW55IHRyZWUgYWx0 ZXJhdGlvbnMuDQoNClRoZSBmaXJzdCB1c2VyIHRoYXQgaXMgY292ZXJlZCBpbiB0aGlzIHBhdGNo IHNldCBpcyB0aGUgdm1fYXJlYV9zdHJ1Y3QsDQp3aGVyZSB0aHJlZSBkYXRhIHN0cnVjdHVyZXMg YXJlIHJlcGxhY2VkIGJ5IHRoZSBtYXBsZSB0cmVlOiB0aGUgYXVnbWVudGVkDQpyYnRyZWUsIHRo ZSB2bWEgY2FjaGUsIGFuZCB0aGUgbGlua2VkIGxpc3Qgb2YgVk1BcyBpbiB0aGUgbW1fc3RydWN0 LiAgVGhlDQpsb25nIHRlcm0gZ29hbCBpcyB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBtbWFwX2xv Y2sgY29udGVudGlvbi4NCg0KVGhlIHBsYW4gaXMgdG8gZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSB3 ZSB1c2UgdGhlIG1hcGxlIHRyZWUgaW4gUkNVIG1vZGUuDQpSZWFkZXJzIHdpbGwgbm90IGJsb2Nr IGZvciB3cml0ZXJzLiAgQSBzaW5nbGUgd3JpdGUgb3BlcmF0aW9uIHdpbGwgYmUNCmFsbG93ZWQg YXQgYSB0aW1lLiAgQSByZWFkZXIgcmUtd2Fsa3MgaWYgc3RhbGUgZGF0YSBpcyBlbmNvdW50ZXJl ZC4gIFZNQXMNCndvdWxkIGJlIFJDVSBlbmFibGVkIGFuZCB0aGlzIG1vZGUgd291bGQgYmUgZW50 ZXJlZCBvbmNlIG11bHRpcGxlIHRhc2tzDQphcmUgdXNpbmcgdGhlIG1tX3N0cnVjdC4NCg0KRGF2 aWRsb3Igc2FpZA0KDQo6IFllcyBJIGxpa2UgdGhlIG1hcGxlIHRyZWUsIGFuZCBhdCB0aGlzIHN0 YWdlIEkgZG9uJ3QgdGhpbmsgd2UgY2FuIGFzayBmb3INCjogbW9yZSBmcm9tIHRoaXMgc2VyaWVz IHdydCB0aGUgTU0gLSBhbGJlaXQgdGhlcmUgc2VlbXMgdG8gc3RpbGwgYmUgc29tZQ0KOiBmb2xr cyByZXBvcnRpbmcgYnJlYWthZ2UuICBGdW5kYW1lbnRhbGx5IEkgc2VlIExpYW0ncyB3b3JrIHRv IChyZSltb3ZlDQo6IGNvbXBsZXhpdHkgb3V0IG9mIHRoZSBNTSAobm90IHRvIHNheSB0aGF0IHRo ZSBhY3R1YWwgbWFwbGUgdHJlZSBpcyBub3QNCjogY29tcGxleCkgYnkgY29uc29saWRhdGluZyB0 aGUgdGhyZWUgY29tcGxpbWVudGFyeSBkYXRhIHN0cnVjdHVyZXMgdmVyeQ0KOiBtdWNoIHdvcnRo IGl0IGNvbnNpZGVyaW5nIHBlcmZvcm1hbmNlIGRvZXMgbm90IHRha2UgYSBoaXQuICBUaGlzIHdh cyB2ZXJ5DQo6IG11Y2ggYSB0dXJuIG9mZiB3aXRoIHRoZSByYW5nZSBsb2NraW5nIGFwcHJvYWNo LCB3aGljaCB3b3JzdCBjYXNlIHNjZW5hcmlvDQo6IGluY3VycmVkIGluIHByb2hpYml0aXZlIG92 ZXJoZWFkLiAgQWxzbyBhcyBMaWFtIGFuZCBNYXR0aGV3IGhhdmUNCjogbWVudGlvbmVkLCBSQ1Ug b3BlbnMgdXAgYSBsb3Qgb2YgbmljZSBwZXJmb3JtYW5jZSBvcHBvcnR1bml0aWVzLCBhbmQgaW4N CjogYWRkaXRpb24gYWNhZGVtaWFbMV0gaGFzIHNob3duIG91dHN0YW5kaW5nIHNjYWxhYmlsaXR5 IG9mIGFkZHJlc3Mgc3BhY2VzDQo6IHdpdGggdGhlIGZvdW5kYXRpb24gb2YgcmVwbGFjaW5nIHRo ZSBsb2NrZWQgcmJ0cmVlIHdpdGggUkNVIGF3YXJlIHRyZWVzLg0KDQpBIHNpbWlsYXIgd29yayBo YXMgYmVlbiBkaXNjb3ZlcmVkIGluIHRoZSBhY2FkZW1pYyBwcmVzcw0KDQoJaHR0cHM6Ly9wZG9z LmNzYWlsLm1pdC5lZHUvcGFwZXJzL3JjdXZtOmFzcGxvczEyLnBkZg0KDQpTaGVlciBjb2luY2lk ZW5jZS4gIFdlIGRlc2lnbmVkIG91ciB0cmVlIHdpdGggdGhlIGludGVudGlvbiBvZiBzb2x2aW5n IHRoZQ0KaGFyZGVzdCBwcm9ibGVtIGZpcnN0LiAgVXBvbiBzZXR0bGluZyBvbiBhIGItdHJlZSB2 YXJpYW50IGFuZCBhIHJvdWdoDQpvdXRsaW5lLCB3ZSByZXNlYXJjaGVkIHJhbmdlZCBiYXNlZCBi LXRyZWVzIGFuZCBSQ1UgYi10cmVlcyBhbmQgZGlkIGZpbmQNCnRoYXQgYXJ0aWNsZS4gIFNvIGl0 IHdhcyBuaWNlIHRvIGZpbmQgcmVhc3N1cmFuY2VzIHRoYXQgd2Ugd2VyZSBvbiB0aGUNCnJpZ2h0 IHBhdGgsIGJ1dCBvdXIgZGVzaWduIGNob2ljZSBvZiB1c2luZyByYW5nZXMgbWFkZSB0aGF0IHBh cGVyIHVudXNhYmxlDQpmb3IgdXMuDQoNClRoaXMgcGF0Y2ggKG9mIDY5KToNCg0KVGhlIG1hcGxl IHRyZWUgaXMgYW4gUkNVLXNhZmUgcmFuZ2UgYmFzZWQgQi10cmVlIGRlc2lnbmVkIHRvIHVzZSBt b2Rlcm4NCnByb2Nlc3NvciBjYWNoZSBlZmZpY2llbnRseS4gIFRoZXJlIGFyZSBhIG51bWJlciBv ZiBwbGFjZXMgaW4gdGhlIGtlcm5lbA0KdGhhdCBhIG5vbi1vdmVybGFwcGluZyByYW5nZS1iYXNl ZCB0cmVlIHdvdWxkIGJlIGJlbmVmaWNpYWwsIGVzcGVjaWFsbHkNCm9uZSB3aXRoIGEgc2ltcGxl IGludGVyZmFjZS4gIElmIHlvdSB1c2UgYW4gcmJ0cmVlIHdpdGggb3RoZXIgZGF0YQ0Kc3RydWN0 dXJlcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9yIGFuIGludGVydmFsIHRyZWUgdG8gdHJhY2sN Cm5vbi1vdmVybGFwcGluZyByYW5nZXMsIHRoZW4gdGhpcyBpcyBmb3IgeW91Lg0KDQpUaGUgdHJl ZSBoYXMgYSBicmFuY2hpbmcgZmFjdG9yIG9mIDEwIGZvciBub24tbGVhZiBub2RlcyBhbmQgMTYg Zm9yIGxlYWYNCm5vZGVzLiAgV2l0aCB0aGUgaW5jcmVhc2VkIGJyYW5jaGluZyBmYWN0b3IsIGl0 IGlzIHNpZ25pZmljYW50bHkgc2hvcnRlcg0KdGhhbiB0aGUgcmJ0cmVlIHNvIGl0IGhhcyBmZXdl ciBjYWNoZSBtaXNzZXMuICBUaGUgcmVtb3ZhbCBvZiB0aGUgbGlua2VkDQpsaXN0IGJldHdlZW4g c3Vic2VxdWVudCBlbnRyaWVzIGFsc28gcmVkdWNlcyB0aGUgY2FjaGUgbWlzc2VzIGFuZCB0aGUg bmVlZA0KdG8gcHVsbCBpbiB0aGUgcHJldmlvdXMgYW5kIG5leHQgVk1BIGR1cmluZyBtYW55IHRy ZWUgYWx0ZXJhdGlvbnMuDQoNClRoZSBmaXJzdCB1c2VyIHRoYXQgaXMgY292ZXJlZCBpbiB0aGlz IHBhdGNoIHNldCBpcyB0aGUgdm1fYXJlYV9zdHJ1Y3QsDQp3aGVyZSB0aHJlZSBkYXRhIHN0cnVj dHVyZXMgYXJlIHJlcGxhY2VkIGJ5IHRoZSBtYXBsZSB0cmVlOiB0aGUgYXVnbWVudGVkDQpyYnRy ZWUsIHRoZSB2bWEgY2FjaGUsIGFuZCB0aGUgbGlua2VkIGxpc3Qgb2YgVk1BcyBpbiB0aGUgbW1f c3RydWN0LiAgVGhlDQpsb25nIHRlcm0gZ29hbCBpcyB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBt bWFwX2xvY2sgY29udGVudGlvbi4NCg0KVGhlIHBsYW4gaXMgdG8gZ2V0IHRvIHRoZSBwb2ludCB3 aGVyZSB3ZSB1c2UgdGhlIG1hcGxlIHRyZWUgaW4gUkNVIG1vZGUuDQpSZWFkZXJzIHdpbGwgbm90 IGJsb2NrIGZvciB3cml0ZXJzLiAgQSBzaW5nbGUgd3JpdGUgb3BlcmF0aW9uIHdpbGwgYmUNCmFs bG93ZWQgYXQgYSB0aW1lLiAgQSByZWFkZXIgcmUtd2Fsa3MgaWYgc3RhbGUgZGF0YSBpcyBlbmNv dW50ZXJlZC4gIFZNQXMNCndvdWxkIGJlIFJDVSBlbmFibGVkIGFuZCB0aGlzIG1vZGUgd291bGQg YmUgZW50ZXJlZCBvbmNlIG11bHRpcGxlIHRhc2tzDQphcmUgdXNpbmcgdGhlIG1tX3N0cnVjdC4N Cg0KTGluazogaHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDIyMDYyMTIwNDYzMi4zMzcwMDQ5 LTEtTGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20NCkxpbms6IGh0dHBzOi8vbGttbC5rZXJuZWwub3Jn L3IvMjAyMjA1MDQwMTA3MTYuNjYxMTE1LTEtTGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20NCkxpbms6 IGh0dHBzOi8vbGttbC5rZXJuZWwub3JnL3IvMjAyMjA1MDQwMDI1NTQuNjU0NjQyLTEtTGlhbS5I b3dsZXR0QG9yYWNsZS5jb20NCkxpbms6IGh0dHBzOi8vbGttbC5rZXJuZWwub3JnL3IvMjAyMjA1 MDQwMTA3MTYuNjYxMTE1LTMtTGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20NCkxpbms6IGh0dHBzOi8v bGttbC5rZXJuZWwub3JnL3IvMjAyMjA1MTExNDQzMDQuMTQzMDg1MS0yLUxpYW0uSG93bGV0dEBv cmFjbGUuY29tDQpMaW5rOiBodHRwczovL2xrbWwua2VybmVsLm9yZy9yLzIwMjIwNTE3MTQ1OTEz LjM0ODA3MjktMS1MaWFtLkhvd2xldHRAb3JhY2xlLmNvbQ0KTGluazogaHR0cHM6Ly9sa21sLmtl cm5lbC5vcmcvci8yMDIyMDUxNzE1MjIwOS4zNDg2NzI0LTEtTGlhbS5Ib3dsZXR0QG9yYWNsZS5j b20NCkxpbms6IGh0dHBzOi8vbGttbC5rZXJuZWwub3JnL3IvMjAyMjA1MTkxNTAzMDQuMTI4OTYz Ni0xLUxpYW0uSG93bGV0dEBvcmFjbGUuY29tDQpMaW5rOiBodHRwczovL2xrbWwua2VybmVsLm9y Zy9yLzIwMjIwNjA3MDYzODM0LjcwMDQtMS1sdWthcy5idWx3YWhuQGdtYWlsLmNvbQ0KTGluazog aHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDIyMDYxNTE0MTkyMS40MTc1OTgtMi1MaWFtLkhv d2xldHRAb3JhY2xlLmNvbQ0KTGluazogaHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDIyMDYx NTE0MTkyMS40MTc1OTgtMy1MaWFtLkhvd2xldHRAb3JhY2xlLmNvbQ0KTGluazogaHR0cHM6Ly9s a21sLmtlcm5lbC5vcmcvci8yMDIyMDYxNjAxMTczOS44MDI2NjktMy1MaWFtLkhvd2xldHRAb3Jh Y2xlLmNvbQ0KTGluazogaHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDIyMDYxNTE3NDIxMy43 Mzg4NDktMS1MaWFtLkhvd2xldHRAb3JhY2xlLmNvbQ0KTGluazogaHR0cHM6Ly9sa21sLmtlcm5l bC5vcmcvci8yMDIyMDYxNzEzNDYwOS4xNzcxNjExLTEtTGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20N Ckxpbms6IGh0dHBzOi8vbGttbC5rZXJuZWwub3JnL3IvMjAyMjA2MjEyMDQ2MzIuMzM3MDA0OS0y LUxpYW0uSG93bGV0dEBvcmFjbGUuY29tDQpTaWduZWQtb2ZmLWJ5OiBMaWFtIFIuIEhvd2xldHQg PExpYW0uSG93bGV0dEBvcmFjbGUuY29tPg0KU2lnbmVkLW9mZi1ieTogTWF0dGhldyBXaWxjb3gg KE9yYWNsZSkgPHdpbGx5QGluZnJhZGVhZC5vcmc+DQpUZXN0ZWQtYnk6IERhdmlkIEhvd2VsbHMg PGRob3dlbGxzQHJlZGhhdC5jb20+DQpUZXN0ZWQtYnk6IFN2ZW4gU2NobmVsbGUgPHN2ZW5zQGxp bnV4LmlibS5jb20+DQpTaWduZWQtb2ZmLWJ5OiBMdWthcyBCdWx3YWhuIDxsdWthcy5idWx3YWhu QGdtYWlsLmNvbT4NCkNjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29t Pg0KQ2M6IFNlb25nSmFlIFBhcmsgPHNqQGtlcm5lbC5vcmc+DQpDYzogVmxhc3RpbWlsIEJhYmth IDx2YmFia2FAc3VzZS5jej4NCkNjOiBXaWxsIERlYWNvbiA8d2lsbEBrZXJuZWwub3JnPg0KQ2M6 IERhdmlkbG9ociBCdWVzbyA8ZGF2ZUBzdGdvbGFicy5uZXQ+DQpTaWduZWQtb2ZmLWJ5OiBBbmRy ZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnPg0KLS0tDQogRG9jdW1lbnRhdGlv bi9jb3JlLWFwaS9pbmRleC5yc3QgICAgICAgICAgICAgIHwgICAgMSArDQogRG9jdW1lbnRhdGlv bi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdCAgICAgICAgIHwgIDIxNyArDQogTUFJTlRBSU5FUlMg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxMiArDQogaW5jbHVkZS9saW51 eC9tYXBsZV90cmVlLmggICAgICAgICAgICAgICAgICAgIHwgIDY4NiArKw0KIGluY2x1ZGUvdHJh Y2UvZXZlbnRzL21hcGxlX3RyZWUuaCAgICAgICAgICAgICB8ICAxMjMgKw0KIGluaXQvbWFpbi5j ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKw0KIGxpYi9LY29uZmln LmRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTUgKw0KIGxpYi9NYWtlZmls ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0NCiBsaWIvbWFwbGVf dHJlZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3MTAyICsrKysrKysrKysrKysr KysrDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUgICAgICAgICAgIHwgICAg MiArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oIHwgICAg MSArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaCAgIHwgICAg NyArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMgICAgICAgICAgICAgIHwgICA1 OSArDQogLi4uL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaCAgICAgIHwgICAg NSArDQogMTQgZmlsZXMgY2hhbmdlZCwgODIzNCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0p DQogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5y c3QNCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgNCiBjcmVh dGUgbW9kZSAxMDA2NDQgaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQogY3JlYXRl IG1vZGUgMTAwNjQ0IGxpYi9tYXBsZV90cmVlLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMv dGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0KIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB0 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0KDQpkaWZm IC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9u L2NvcmUtYXBpL2luZGV4LnJzdA0KaW5kZXggZGVkZDRkODUzMzI5Li45ZWYzN2U5ODVhNDAgMTAw NjQ0DQotLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdA0KKysrIGIvRG9jdW1l bnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCkBAIC0zNiw2ICszNiw3IEBAIExpYnJhcnkgZnVu Y3Rpb25hbGl0eSB0aGF0IGlzIHVzZWQgdGhyb3VnaG91dCB0aGUga2VybmVsLg0KICAgIGtyZWYN CiAgICBhc3NvY19hcnJheQ0KICAgIHhhcnJheQ0KKyAgIG1hcGxlX3RyZWUNCiAgICBpZHINCiAg ICBjaXJjdWxhci1idWZmZXJzDQogICAgcmJ0cmVlDQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlv bi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdCBiL0RvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVf dHJlZS5yc3QNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjQ1ZGVm Y2YxNWRhNw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBs ZV90cmVlLnJzdA0KQEAgLTAsMCArMSwyMTcgQEANCisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMCsNCisNCisNCis9PT09PT09PT09DQorTWFwbGUgVHJlZQ0KKz09PT09PT09PT0N CisNCis6QXV0aG9yOiBMaWFtIFIuIEhvd2xldHQNCisNCitPdmVydmlldw0KKz09PT09PT09DQor DQorVGhlIE1hcGxlIFRyZWUgaXMgYSBCLVRyZWUgZGF0YSB0eXBlIHdoaWNoIGlzIG9wdGltaXpl ZCBmb3Igc3RvcmluZw0KK25vbi1vdmVybGFwcGluZyByYW5nZXMsIGluY2x1ZGluZyByYW5nZXMg b2Ygc2l6ZSAxLiAgVGhlIHRyZWUgd2FzIGRlc2lnbmVkIHRvDQorYmUgc2ltcGxlIHRvIHVzZSBh bmQgZG9lcyBub3QgcmVxdWlyZSBhIHVzZXIgd3JpdHRlbiBzZWFyY2ggbWV0aG9kLiAgSXQNCitz dXBwb3J0cyBpdGVyYXRpbmcgb3ZlciBhIHJhbmdlIG9mIGVudHJpZXMgYW5kIGdvaW5nIHRvIHRo ZSBwcmV2aW91cyBvciBuZXh0DQorZW50cnkgaW4gYSBjYWNoZS1lZmZpY2llbnQgbWFubmVyLiAg VGhlIHRyZWUgY2FuIGFsc28gYmUgcHV0IGludG8gYW4gUkNVLXNhZmUNCittb2RlIG9mIG9wZXJh dGlvbiB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBjb25jdXJyZW50bHkuICBXcml0 ZXJzIG11c3QNCitzeW5jaHJvbml6ZSBvbiBhIGxvY2ssIHdoaWNoIGNhbiBiZSB0aGUgZGVmYXVs dCBzcGlubG9jaywgb3IgdGhlIHVzZXIgY2FuIHNldA0KK3RoZSBsb2NrIHRvIGFuIGV4dGVybmFs IGxvY2sgb2YgYSBkaWZmZXJlbnQgdHlwZS4NCisNCitUaGUgTWFwbGUgVHJlZSBtYWludGFpbnMg YSBzbWFsbCBtZW1vcnkgZm9vdHByaW50IGFuZCB3YXMgZGVzaWduZWQgdG8gdXNlDQorbW9kZXJu IHByb2Nlc3NvciBjYWNoZSBlZmZpY2llbnRseS4gIFRoZSBtYWpvcml0eSBvZiB0aGUgdXNlcnMg d2lsbCBiZSBhYmxlIHRvDQordXNlIHRoZSBub3JtYWwgQVBJLiAgQW4gOnJlZjpgbWFwbGUtdHJl ZS1hZHZhbmNlZC1hcGlgIGV4aXN0cyBmb3IgbW9yZSBjb21wbGV4DQorc2NlbmFyaW9zLiAgVGhl IG1vc3QgaW1wb3J0YW50IHVzYWdlIG9mIHRoZSBNYXBsZSBUcmVlIGlzIHRoZSB0cmFja2luZyBv ZiB0aGUNCit2aXJ0dWFsIG1lbW9yeSBhcmVhcy4NCisNCitUaGUgTWFwbGUgVHJlZSBjYW4gc3Rv cmUgdmFsdWVzIGJldHdlZW4gYGAwYGAgYW5kIGBgVUxPTkdfTUFYYGAuICBUaGUgTWFwbGUNCitU cmVlIHJlc2VydmVzIHZhbHVlcyB3aXRoIHRoZSBib3R0b20gdHdvIGJpdHMgc2V0IHRvICcxMCcg d2hpY2ggYXJlIGJlbG93IDQwOTYNCisoaWUgMiwgNiwgMTAgLi4gNDA5NCkgZm9yIGludGVybmFs IHVzZS4gIElmIHRoZSBlbnRyaWVzIG1heSB1c2UgcmVzZXJ2ZWQNCitlbnRyaWVzIHRoZW4gdGhl IHVzZXJzIGNhbiBjb252ZXJ0IHRoZSBlbnRyaWVzIHVzaW5nIHhhX21rX3ZhbHVlKCkgYW5kIGNv bnZlcnQNCit0aGVtIGJhY2sgYnkgY2FsbGluZyB4YV90b192YWx1ZSgpLiAgSWYgdGhlIHVzZXIg bmVlZHMgdG8gdXNlIGEgcmVzZXJ2ZWQNCit2YWx1ZSwgdGhlbiB0aGUgdXNlciBjYW4gY29udmVy dCB0aGUgdmFsdWUgd2hlbiB1c2luZyB0aGUNCis6cmVmOmBtYXBsZS10cmVlLWFkdmFuY2VkLWFw aWAsIGJ1dCBhcmUgYmxvY2tlZCBieSB0aGUgbm9ybWFsIEFQSS4NCisNCitUaGUgTWFwbGUgVHJl ZSBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgc2VhcmNoaW5nIGZvciBhIGdhcCBv ZiBhIGdpdmVuDQorc2l6ZSAob3IgbGFyZ2VyKS4NCisNCitQcmUtYWxsb2NhdGluZyBvZiBub2Rl cyBpcyBhbHNvIHN1cHBvcnRlZCB1c2luZyB0aGUNCis6cmVmOmBtYXBsZS10cmVlLWFkdmFuY2Vk LWFwaWAuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNlcnMgd2hvIG11c3QgZ3VhcmFudGVlIGENCitz dWNjZXNzZnVsIHN0b3JlIG9wZXJhdGlvbiB3aXRoaW4gYSBnaXZlbg0KK2NvZGUgc2VnbWVudCB3 aGVuIGFsbG9jYXRpbmcgY2Fubm90IGJlIGRvbmUuICBBbGxvY2F0aW9ucyBvZiBub2RlcyBhcmUN CityZWxhdGl2ZWx5IHNtYWxsIGF0IGFyb3VuZCAyNTYgYnl0ZXMuDQorDQorLi4gX21hcGxlLXRy ZWUtbm9ybWFsLWFwaToNCisNCitOb3JtYWwgQVBJDQorPT09PT09PT09PQ0KKw0KK1N0YXJ0IGJ5 IGluaXRpYWxpc2luZyBhIG1hcGxlIHRyZWUsIGVpdGhlciB3aXRoIERFRklORV9NVFJFRSgpIGZv ciBzdGF0aWNhbGx5DQorYWxsb2NhdGVkIG1hcGxlIHRyZWVzIG9yIG10X2luaXQoKSBmb3IgZHlu YW1pY2FsbHkgYWxsb2NhdGVkIG9uZXMuICBBDQorZnJlc2hseS1pbml0aWFsaXNlZCBtYXBsZSB0 cmVlIGNvbnRhaW5zIGEgYGBOVUxMYGAgcG9pbnRlciBmb3IgdGhlIHJhbmdlIGBgMGBgDQorLSBg YFVMT05HX01BWGBgLiAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gdHlwZXMgb2YgbWFwbGUgdHJl ZXMgc3VwcG9ydGVkOiB0aGUNCithbGxvY2F0aW9uIHRyZWUgYW5kIHRoZSByZWd1bGFyIHRyZWUu ICBUaGUgcmVndWxhciB0cmVlIGhhcyBhIGhpZ2hlciBicmFuY2hpbmcNCitmYWN0b3IgZm9yIGlu dGVybmFsIG5vZGVzLiAgVGhlIGFsbG9jYXRpb24gdHJlZSBoYXMgYSBsb3dlciBicmFuY2hpbmcg ZmFjdG9yDQorYnV0IGFsbG93cyB0aGUgdXNlciB0byBzZWFyY2ggZm9yIGEgZ2FwIG9mIGEgZ2l2 ZW4gc2l6ZSBvciBsYXJnZXIgZnJvbSBlaXRoZXINCitgYDBgYCB1cHdhcmRzIG9yIGBgVUxPTkdf TUFYYGAgZG93bi4gIEFuIGFsbG9jYXRpb24gdHJlZSBjYW4gYmUgdXNlZCBieQ0KK3Bhc3Npbmcg aW4gdGhlIGBgTVRfRkxBR1NfQUxMT0NfUkFOR0VgYCBmbGFnIHdoZW4gaW5pdGlhbGlzaW5nIHRo ZSB0cmVlLg0KKw0KK1lvdSBjYW4gdGhlbiBzZXQgZW50cmllcyB1c2luZyBtdHJlZV9zdG9yZSgp IG9yIG10cmVlX3N0b3JlX3JhbmdlKCkuDQorbXRyZWVfc3RvcmUoKSB3aWxsIG92ZXJ3cml0ZSBh bnkgZW50cnkgd2l0aCB0aGUgbmV3IGVudHJ5IGFuZCByZXR1cm4gMCBvbg0KK3N1Y2Nlc3Mgb3Ig YW4gZXJyb3IgY29kZSBvdGhlcndpc2UuICBtdHJlZV9zdG9yZV9yYW5nZSgpIHdvcmtzIGluIHRo ZSBzYW1lIHdheQ0KK2J1dCB0YWtlcyBhIHJhbmdlLiAgbXRyZWVfbG9hZCgpIGlzIHVzZWQgdG8g cmV0cmlldmUgdGhlIGVudHJ5IHN0b3JlZCBhdCBhDQorZ2l2ZW4gaW5kZXguICBZb3UgY2FuIHVz ZSBtdHJlZV9lcmFzZSgpIHRvIGVyYXNlIGFuIGVudGlyZSByYW5nZSBieSBvbmx5DQora25vd2lu ZyBvbmUgdmFsdWUgd2l0aGluIHRoYXQgcmFuZ2UsIG9yIG10cmVlX3N0b3JlKCkgY2FsbCB3aXRo IGFuIGVudHJ5IG9mDQorTlVMTCBtYXkgYmUgdXNlZCB0byBwYXJ0aWFsbHkgZXJhc2UgYSByYW5n ZSBvciBtYW55IHJhbmdlcyBhdCBvbmNlLg0KKw0KK0lmIHlvdSB3YW50IHRvIG9ubHkgc3RvcmUg YSBuZXcgZW50cnkgdG8gYSByYW5nZSAob3IgaW5kZXgpIGlmIHRoYXQgcmFuZ2UgaXMNCitjdXJy ZW50bHkgYGBOVUxMYGAsIHlvdSBjYW4gdXNlIG10cmVlX2luc2VydF9yYW5nZSgpIG9yIG10cmVl X2luc2VydCgpIHdoaWNoDQorcmV0dXJuIC1FRVhJU1QgaWYgdGhlIHJhbmdlIGlzIG5vdCBlbXB0 eS4NCisNCitZb3UgY2FuIHNlYXJjaCBmb3IgYW4gZW50cnkgZnJvbSBhbiBpbmRleCB1cHdhcmRz IGJ5IHVzaW5nIG10X2ZpbmQoKS4NCisNCitZb3UgY2FuIHdhbGsgZWFjaCBlbnRyeSB3aXRoaW4g YSByYW5nZSBieSBjYWxsaW5nIG10X2Zvcl9lYWNoKCkuICBZb3UgbXVzdA0KK3Byb3ZpZGUgYSB0 ZW1wb3JhcnkgdmFyaWFibGUgdG8gc3RvcmUgYSBjdXJzb3IuICBJZiB5b3Ugd2FudCB0byB3YWxr IGVhY2gNCitlbGVtZW50IG9mIHRoZSB0cmVlIHRoZW4gYGAwYGAgYW5kIGBgVUxPTkdfTUFYYGAg bWF5IGJlIHVzZWQgYXMgdGhlIHJhbmdlLiAgSWYNCit0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGhv bGQgdGhlIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd2FsayB0aGVuIGl0IGlzDQord29y dGggbG9va2luZyBhdCB0aGUgbWFzX2Zvcl9lYWNoKCkgQVBJIGluIHRoZSA6cmVmOmBtYXBsZS10 cmVlLWFkdmFuY2VkLWFwaWANCitzZWN0aW9uLg0KKw0KK1NvbWV0aW1lcyBpdCBpcyBuZWNlc3Nh cnkgdG8gZW5zdXJlIHRoZSBuZXh0IGNhbGwgdG8gc3RvcmUgdG8gYSBtYXBsZSB0cmVlIGRvZXMN Citub3QgYWxsb2NhdGUgbWVtb3J5LCBwbGVhc2Ugc2VlIDpyZWY6YG1hcGxlLXRyZWUtYWR2YW5j ZWQtYXBpYCBmb3IgdGhpcyB1c2UgY2FzZS4NCisNCitGaW5hbGx5LCB5b3UgY2FuIHJlbW92ZSBh bGwgZW50cmllcyBmcm9tIGEgbWFwbGUgdHJlZSBieSBjYWxsaW5nDQorbXRyZWVfZGVzdHJveSgp LiAgSWYgdGhlIG1hcGxlIHRyZWUgZW50cmllcyBhcmUgcG9pbnRlcnMsIHlvdSBtYXkgd2lzaCB0 byBmcmVlDQordGhlIGVudHJpZXMgZmlyc3QuDQorDQorQWxsb2NhdGluZyBOb2Rlcw0KKy0tLS0t LS0tLS0tLS0tLS0NCisNCitUaGUgYWxsb2NhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlIGludGVy bmFsIHRyZWUgY29kZS4gIFNlZQ0KKzpyZWY6YG1hcGxlLXRyZWUtYWR2YW5jZWQtYWxsb2NgIGZv ciBvdGhlciBvcHRpb25zLg0KKw0KK0xvY2tpbmcNCistLS0tLS0tDQorDQorWW91IGRvIG5vdCBo YXZlIHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcuICBTZWUgOnJlZjpgbWFwbGUtdHJlZS1hZHZhbmNl ZC1sb2Nrc2ANCitmb3Igb3RoZXIgb3B0aW9ucy4NCisNCitUaGUgTWFwbGUgVHJlZSB1c2VzIFJD VSBhbmQgYW4gaW50ZXJuYWwgc3BpbmxvY2sgdG8gc3luY2hyb25pc2UgYWNjZXNzOg0KKw0KK1Rh a2VzIFJDVSByZWFkIGxvY2s6DQorICogbXRyZWVfbG9hZCgpDQorICogbXRfZmluZCgpDQorICog bXRfZm9yX2VhY2goKQ0KKyAqIG10X25leHQoKQ0KKyAqIG10X3ByZXYoKQ0KKw0KK1Rha2VzIG1h X2xvY2sgaW50ZXJuYWxseToNCisgKiBtdHJlZV9zdG9yZSgpDQorICogbXRyZWVfc3RvcmVfcmFu Z2UoKQ0KKyAqIG10cmVlX2luc2VydCgpDQorICogbXRyZWVfaW5zZXJ0X3JhbmdlKCkNCisgKiBt dHJlZV9lcmFzZSgpDQorICogbXRyZWVfZGVzdHJveSgpDQorICogbXRfc2V0X2luX3JjdSgpDQor ICogbXRfY2xlYXJfaW5fcmN1KCkNCisNCitJZiB5b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBv ZiB0aGUgaW50ZXJuYWwgbG9jayB0byBwcm90ZWN0IHRoZSBkYXRhDQorc3RydWN0dXJlcyB0aGF0 IHlvdSBhcmUgc3RvcmluZyBpbiB0aGUgTWFwbGUgVHJlZSwgeW91IGNhbiBjYWxsIG10cmVlX2xv Y2soKQ0KK2JlZm9yZSBjYWxsaW5nIG10cmVlX2xvYWQoKSwgdGhlbiB0YWtlIGEgcmVmZXJlbmNl IGNvdW50IG9uIHRoZSBvYmplY3QgeW91DQoraGF2ZSBmb3VuZCBiZWZvcmUgY2FsbGluZyBtdHJl ZV91bmxvY2soKS4gIFRoaXMgd2lsbCBwcmV2ZW50IHN0b3JlcyBmcm9tDQorcmVtb3ZpbmcgdGhl IG9iamVjdCBmcm9tIHRoZSB0cmVlIGJldHdlZW4gbG9va2luZyB1cCB0aGUgb2JqZWN0IGFuZA0K K2luY3JlbWVudGluZyB0aGUgcmVmY291bnQuICBZb3UgY2FuIGFsc28gdXNlIFJDVSB0byBhdm9p ZCBkZXJlZmVyZW5jaW5nDQorZnJlZWQgbWVtb3J5LCBidXQgYW4gZXhwbGFuYXRpb24gb2YgdGhh dCBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMNCitkb2N1bWVudC4NCisNCisuLiBfbWFwbGUt dHJlZS1hZHZhbmNlZC1hcGk6DQorDQorQWR2YW5jZWQgQVBJDQorPT09PT09PT09PT09DQorDQor VGhlIGFkdmFuY2VkIEFQSSBvZmZlcnMgbW9yZSBmbGV4aWJpbGl0eSBhbmQgYmV0dGVyIHBlcmZv cm1hbmNlIGF0IHRoZQ0KK2Nvc3Qgb2YgYW4gaW50ZXJmYWNlIHdoaWNoIGNhbiBiZSBoYXJkZXIg dG8gdXNlIGFuZCBoYXMgZmV3ZXIgc2FmZWd1YXJkcy4NCitZb3UgbXVzdCB0YWtlIGNhcmUgb2Yg eW91ciBvd24gbG9ja2luZyB3aGlsZSB1c2luZyB0aGUgYWR2YW5jZWQgQVBJLg0KK1lvdSBjYW4g dXNlIHRoZSBtYV9sb2NrLCBSQ1Ugb3IgYW4gZXh0ZXJuYWwgbG9jayBmb3IgcHJvdGVjdGlvbi4N CitZb3UgY2FuIG1peCBhZHZhbmNlZCBhbmQgbm9ybWFsIG9wZXJhdGlvbnMgb24gdGhlIHNhbWUg YXJyYXksIGFzIGxvbmcNCithcyB0aGUgbG9ja2luZyBpcyBjb21wYXRpYmxlLiAgVGhlIDpyZWY6 YG1hcGxlLXRyZWUtbm9ybWFsLWFwaWAgaXMgaW1wbGVtZW50ZWQNCitpbiB0ZXJtcyBvZiB0aGUg YWR2YW5jZWQgQVBJLg0KKw0KK1RoZSBhZHZhbmNlZCBBUEkgaXMgYmFzZWQgYXJvdW5kIHRoZSBt YV9zdGF0ZSwgdGhpcyBpcyB3aGVyZSB0aGUgJ21hcycNCitwcmVmaXggb3JpZ2luYXRlcy4gIFRo ZSBtYV9zdGF0ZSBzdHJ1Y3Qga2VlcHMgdHJhY2sgb2YgdHJlZSBvcGVyYXRpb25zIHRvIG1ha2UN CitsaWZlIGVhc2llciBmb3IgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgdHJlZSB1c2Vycy4N CisNCitJbml0aWFsaXNpbmcgdGhlIG1hcGxlIHRyZWUgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIDpy ZWY6YG1hcGxlLXRyZWUtbm9ybWFsLWFwaWAuDQorUGxlYXNlIHNlZSBhYm92ZS4NCisNCitUaGUg bWFwbGUgc3RhdGUga2VlcHMgdHJhY2sgb2YgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmQgaW4gbWFz LT5pbmRleCBhbmQNCittYXMtPmxhc3QsIHJlc3BlY3RpdmVseS4NCisNCittYXNfd2FsaygpIHdp bGwgd2FsayB0aGUgdHJlZSB0byB0aGUgbG9jYXRpb24gb2YgbWFzLT5pbmRleCBhbmQgc2V0IHRo ZQ0KK21hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCBhY2NvcmRpbmcgdG8gdGhlIHJhbmdlIGZvciB0 aGUgZW50cnkuDQorDQorWW91IGNhbiBzZXQgZW50cmllcyB1c2luZyBtYXNfc3RvcmUoKS4gIG1h c19zdG9yZSgpIHdpbGwgb3ZlcndyaXRlIGFueSBlbnRyeQ0KK3dpdGggdGhlIG5ldyBlbnRyeSBh bmQgcmV0dXJuIHRoZSBmaXJzdCBleGlzdGluZyBlbnRyeSB0aGF0IGlzIG92ZXJ3cml0dGVuLg0K K1RoZSByYW5nZSBpcyBwYXNzZWQgaW4gYXMgbWVtYmVycyBvZiB0aGUgbWFwbGUgc3RhdGU6IGlu ZGV4IGFuZCBsYXN0Lg0KKw0KK1lvdSBjYW4gdXNlIG1hc19lcmFzZSgpIHRvIGVyYXNlIGFuIGVu dGlyZSByYW5nZSBieSBzZXR0aW5nIGluZGV4IGFuZA0KK2xhc3Qgb2YgdGhlIG1hcGxlIHN0YXRl IHRvIHRoZSBkZXNpcmVkIHJhbmdlIHRvIGVyYXNlLiAgVGhpcyB3aWxsIGVyYXNlDQordGhlIGZp cnN0IHJhbmdlIHRoYXQgaXMgZm91bmQgaW4gdGhhdCByYW5nZSwgc2V0IHRoZSBtYXBsZSBzdGF0 ZSBpbmRleA0KK2FuZCBsYXN0IGFzIHRoZSByYW5nZSB0aGF0IHdhcyBlcmFzZWQgYW5kIHJldHVy biB0aGUgZW50cnkgdGhhdCBleGlzdGVkDQorYXQgdGhhdCBsb2NhdGlvbi4NCisNCitZb3UgY2Fu IHdhbGsgZWFjaCBlbnRyeSB3aXRoaW4gYSByYW5nZSBieSB1c2luZyBtYXNfZm9yX2VhY2goKS4g IElmIHlvdSB3YW50DQordG8gd2FsayBlYWNoIGVsZW1lbnQgb2YgdGhlIHRyZWUgdGhlbiBgYDBg YCBhbmQgYGBVTE9OR19NQVhgYCBtYXkgYmUgdXNlZCBhcw0KK3RoZSByYW5nZS4gIElmIHRoZSBs b2NrIG5lZWRzIHRvIGJlIHBlcmlvZGljYWxseSBkcm9wcGVkLCBzZWUgdGhlIGxvY2tpbmcNCitz ZWN0aW9uIG1hc19wYXVzZSgpLg0KKw0KK1VzaW5nIGEgbWFwbGUgc3RhdGUgYWxsb3dzIG1hc19u ZXh0KCkgYW5kIG1hc19wcmV2KCkgdG8gZnVuY3Rpb24gYXMgaWYgdGhlDQordHJlZSB3YXMgYSBs aW5rZWQgbGlzdC4gIFdpdGggc3VjaCBhIGhpZ2ggYnJhbmNoaW5nIGZhY3RvciB0aGUgYW1vcnRp emVkDQorcGVyZm9ybWFuY2UgcGVuYWx0eSBpcyBvdXR3ZWlnaGVkIGJ5IGNhY2hlIG9wdGltaXph dGlvbi4gIG1hc19uZXh0KCkgd2lsbA0KK3JldHVybiB0aGUgbmV4dCBlbnRyeSB3aGljaCBvY2N1 cnMgYWZ0ZXIgdGhlIGVudHJ5IGF0IGluZGV4LiAgbWFzX3ByZXYoKQ0KK3dpbGwgcmV0dXJuIHRo ZSBwcmV2aW91cyBlbnRyeSB3aGljaCBvY2N1cnMgYmVmb3JlIHRoZSBlbnRyeSBhdCBpbmRleC4N CisNCittYXNfZmluZCgpIHdpbGwgZmluZCB0aGUgZmlyc3QgZW50cnkgd2hpY2ggZXhpc3RzIGF0 IG9yIGFib3ZlIGluZGV4IG9uDQordGhlIGZpcnN0IGNhbGwsIGFuZCB0aGUgbmV4dCBlbnRyeSBm cm9tIGV2ZXJ5IHN1YnNlcXVlbnQgY2FsbHMuDQorDQorbWFzX2ZpbmRfcmV2KCkgd2lsbCBmaW5k IHRoZSBmaXN0IGVudHJ5IHdoaWNoIGV4aXN0cyBhdCBvciBiZWxvdyB0aGUgbGFzdCBvbg0KK3Ro ZSBmaXJzdCBjYWxsLCBhbmQgdGhlIHByZXZpb3VzIGVudHJ5IGZyb20gZXZlcnkgc3Vic2VxdWVu dCBjYWxscy4NCisNCitJZiB0aGUgdXNlciBuZWVkcyB0byB5aWVsZCB0aGUgbG9jayBkdXJpbmcg YW4gb3BlcmF0aW9uLCB0aGVuIHRoZSBtYXBsZSBzdGF0ZQ0KK211c3QgYmUgcGF1c2VkIHVzaW5n IG1hc19wYXVzZSgpLg0KKw0KK1RoZXJlIGFyZSBhIGZldyBleHRyYSBpbnRlcmZhY2VzIHByb3Zp ZGVkIHdoZW4gdXNpbmcgYW4gYWxsb2NhdGlvbiB0cmVlLg0KK0lmIHlvdSB3aXNoIHRvIHNlYXJj aCBmb3IgYSBnYXAgd2l0aGluIGEgcmFuZ2UsIHRoZW4gbWFzX2VtcHR5X2FyZWEoKQ0KK29yIG1h c19lbXB0eV9hcmVhX3JldigpIGNhbiBiZSB1c2VkLiAgbWFzX2VtcHR5X2FyZWEoKSBzZWFyY2hl cyBmb3IgYSBnYXANCitzdGFydGluZyBhdCB0aGUgbG93ZXN0IGluZGV4IGdpdmVuIHVwIHRvIHRo ZSBtYXhpbXVtIG9mIHRoZSByYW5nZS4NCittYXNfZW1wdHlfYXJlYV9yZXYoKSBzZWFyY2hlcyBm b3IgYSBnYXAgc3RhcnRpbmcgYXQgdGhlIGhpZ2hlc3QgaW5kZXggZ2l2ZW4NCithbmQgY29udGlu dWVzIGRvd253YXJkIHRvIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuDQorDQorLi4gX21h cGxlLXRyZWUtYWR2YW5jZWQtYWxsb2M6DQorDQorQWR2YW5jZWQgQWxsb2NhdGluZyBOb2Rlcw0K Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitBbGxvY2F0aW9ucyBhcmUgdXN1YWxseSBo YW5kbGVkIGludGVybmFsbHkgdG8gdGhlIHRyZWUsIGhvd2V2ZXIgaWYgYWxsb2NhdGlvbnMNCitu ZWVkIHRvIG9jY3VyIGJlZm9yZSBhIHdyaXRlIG9jY3VycyB0aGVuIGNhbGxpbmcgbWFzX2V4cGVj dGVkX2VudHJpZXMoKSB3aWxsDQorYWxsb2NhdGUgdGhlIHdvcnN0LWNhc2UgbnVtYmVyIG9mIG5l ZWRlZCBub2RlcyB0byBpbnNlcnQgdGhlIHByb3ZpZGVkIG51bWJlciBvZg0KK3Jhbmdlcy4gIFRo aXMgYWxzbyBjYXVzZXMgdGhlIHRyZWUgdG8gZW50ZXIgbWFzcyBpbnNlcnRpb24gbW9kZS4gIE9u Y2UNCitpbnNlcnRpb25zIGFyZSBjb21wbGV0ZSBjYWxsaW5nIG1hc19kZXN0cm95KCkgb24gdGhl IG1hcGxlIHN0YXRlIHdpbGwgZnJlZSB0aGUNCit1bnVzZWQgYWxsb2NhdGlvbnMuDQorDQorLi4g X21hcGxlLXRyZWUtYWR2YW5jZWQtbG9ja3M6DQorDQorQWR2YW5jZWQgTG9ja2luZw0KKy0tLS0t LS0tLS0tLS0tLS0NCisNCitUaGUgbWFwbGUgdHJlZSB1c2VzIGEgc3BpbmxvY2sgYnkgZGVmYXVs dCwgYnV0IGV4dGVybmFsIGxvY2tzIGNhbiBiZSB1c2VkIGZvcg0KK3RyZWUgdXBkYXRlcyBhcyB3 ZWxsLiAgVG8gdXNlIGFuIGV4dGVybmFsIGxvY2ssIHRoZSB0cmVlIG11c3QgYmUgaW5pdGlhbGl6 ZWQNCit3aXRoIHRoZSBgYE1UX0ZMQUdTX0xPQ0tfRVhURVJOIGZsYWdgYCwgdGhpcyBpcyB1c3Vh bGx5IGRvbmUgd2l0aCB0aGUNCitNVFJFRV9JTklUX0VYVCgpICNkZWZpbmUsIHdoaWNoIHRha2Vz IGFuIGV4dGVybmFsIGxvY2sgYXMgYW4gYXJndW1lbnQuDQorDQorRnVuY3Rpb25zIGFuZCBzdHJ1 Y3R1cmVzDQorPT09PT09PT09PT09PT09PT09PT09PT09DQorDQorLi4ga2VybmVsLWRvYzo6IGlu Y2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQorLi4ga2VybmVsLWRvYzo6IGxpYi9tYXBsZV90cmVl LmMNCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTDQppbmRleCA5NWI0NDM2 N2YwY2UuLmUwMGQyYzhmZGE3ZiAxMDA2NDQNCi0tLSBhL01BSU5UQUlORVJTDQorKysgYi9NQUlO VEFJTkVSUw0KQEAgLTExNzkyLDYgKzExNzkyLDE4IEBAIEw6CWxpbnV4LW1hbkB2Z2VyLmtlcm5l bC5vcmcNCiBTOglNYWludGFpbmVkDQogVzoJaHR0cDovL3d3dy5rZXJuZWwub3JnL2RvYy9tYW4t cGFnZXMNCiANCitNQVBMRSBUUkVFDQorTToJTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRA b3JhY2xlLmNvbT4NCitMOglsaW51eC1tbUBrdmFjay5vcmcNCitTOglTdXBwb3J0ZWQNCitGOglE b2N1bWVudGF0aW9uL2NvcmUtYXBpL21hcGxlX3RyZWUucnN0DQorRjoJaW5jbHVkZS9saW51eC9t YXBsZV90cmVlLmgNCitGOglpbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCitGOgls aWIvbWFwbGVfdHJlZS5jDQorRjoJbGliL3Rlc3RfbWFwbGVfdHJlZS5jDQorRjoJdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0KK0Y6CXRvb2xzL3Rlc3RpbmcvcmFk aXgtdHJlZS9tYXBsZS5jDQorDQogTUFSRFVLIChDUkVBVE9SIENJNDApIERFVklDRSBUUkVFIFNV UFBPUlQNCiBNOglSYWh1bCBCZWRhcmthciA8cmFodWxiZWRhcmthcjg5QGdtYWlsLmNvbT4NCiBM OglsaW51eC1taXBzQHZnZXIua2VybmVsLm9yZw0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgv bWFwbGVfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUg MTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjI1OGNhMjIyZTE0NQ0KLS0tIC9kZXYvbnVsbA0K KysrIGIvaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgNCkBAIC0wLDAgKzEsNjg2IEBADQorLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArICovDQorI2lmbmRlZiBfTElOVVhfTUFQ TEVfVFJFRV9IDQorI2RlZmluZSBfTElOVVhfTUFQTEVfVFJFRV9IDQorLyoNCisgKiBNYXBsZSBU cmVlIC0gQW4gUkNVLXNhZmUgYWRhcHRpdmUgdHJlZSBmb3Igc3RvcmluZyByYW5nZXMNCisgKiBD b3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBPcmFjbGUNCisgKiBBdXRob3JzOiAgICAgTGlhbSBSLiBI b3dsZXR0IDxMaWFtLkhvd2xldHRAT3JhY2xlLmNvbT4NCisgKiAgICAgICAgICAgICAgTWF0dGhl dyBXaWxjb3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQorICovDQorDQorI2luY2x1ZGUgPGxpbnV4 L2tlcm5lbC5oPg0KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPg0KKyNpbmNsdWRlIDxsaW51 eC9zcGlubG9jay5oPg0KKy8qICNkZWZpbmUgQ09ORklHX01BUExFX1JDVV9ESVNBQkxFRCAqLw0K Ky8qICNkZWZpbmUgQ09ORklHX0RFQlVHX01BUExFX1RSRUVfVkVSQk9TRSAqLw0KKw0KKy8qDQor ICogQWxsb2NhdGVkIG5vZGVzIGFyZSBtdXRhYmxlIHVudGlsIHRoZXkgaGF2ZSBiZWVuIGluc2Vy dGVkIGludG8gdGhlIHRyZWUsDQorICogYXQgd2hpY2ggdGltZSB0aGV5IGNhbm5vdCBjaGFuZ2Ug dGhlaXIgdHlwZSB1bnRpbCB0aGV5IGhhdmUgYmVlbiByZW1vdmVkDQorICogZnJvbSB0aGUgdHJl ZSBhbmQgYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkLg0KKyAqDQorICogUmVtb3ZlZCBu b2RlcyBoYXZlIHRoZWlyIC0+cGFyZW50IHNldCB0byBwb2ludCB0byB0aGVtc2VsdmVzLiAgUkNV IHJlYWRlcnMNCisgKiBjaGVjayAtPnBhcmVudCBiZWZvcmUgcmVseWluZyBvbiB0aGUgdmFsdWUg dGhhdCB0aGV5IGxvYWRlZCBmcm9tIHRoZQ0KKyAqIHNsb3RzIGFycmF5LiAgVGhpcyBsZXRzIHVz IHJldXNlIHRoZSBzbG90cyBhcnJheSBmb3IgdGhlIFJDVSBoZWFkLg0KKyAqDQorICogTm9kZXMg aW4gdGhlIHRyZWUgcG9pbnQgdG8gdGhlaXIgcGFyZW50IHVubGVzcyBiaXQgMCBpcyBzZXQuDQor ICovDQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKEJVSUxEX1ZEU08zMl82 NCkNCisvKiA2NGJpdCBzaXplcyAqLw0KKyNkZWZpbmUgTUFQTEVfTk9ERV9TTE9UUwkzMQkvKiAy NTYgYnl0ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICovDQorI2RlZmluZSBNQVBMRV9SQU5HRTY0X1NM T1RTCTE2CS8qIDI1NiBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfU0xPVFMJMTAJ LyogMjQwIGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWAkxNQkvKiBP dXQgb2YgcmFuZ2UgZm9yIG1ldGFkYXRhICovDQorI2RlZmluZSBNQVBMRV9BTExPQ19TTE9UUwko TUFQTEVfTk9ERV9TTE9UUyAtIDEpDQorI2Vsc2UNCisvKiAzMmJpdCBzaXplcyAqLw0KKyNkZWZp bmUgTUFQTEVfTk9ERV9TTE9UUwk2MwkvKiAyNTYgYnl0ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICov DQorI2RlZmluZSBNQVBMRV9SQU5HRTY0X1NMT1RTCTMyCS8qIDI1NiBieXRlcyAqLw0KKyNkZWZp bmUgTUFQTEVfQVJBTkdFNjRfU0xPVFMJMjEJLyogMjQwIGJ5dGVzICovDQorI2RlZmluZSBNQVBM RV9BUkFOR0U2NF9NRVRBX01BWAkzMQkvKiBPdXQgb2YgcmFuZ2UgZm9yIG1ldGFkYXRhICovDQor I2RlZmluZSBNQVBMRV9BTExPQ19TTE9UUwkoTUFQTEVfTk9ERV9TTE9UUyAtIDIpDQorI2VuZGlm IC8qIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKEJVSUxEX1ZEU08zMl82NCkgKi8N CisNCisjZGVmaW5lIE1BUExFX05PREVfTUFTSwkJMjU1VUwNCisNCisvKg0KKyAqIFRoZSBub2Rl LT5wYXJlbnQgb2YgdGhlIHJvb3Qgbm9kZSBoYXMgYml0IDAgc2V0IGFuZCB0aGUgcmVzdCBvZiB0 aGUgcG9pbnRlcg0KKyAqIGlzIGEgcG9pbnRlciB0byB0aGUgdHJlZSBpdHNlbGYuICBObyBtb3Jl IGJpdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIHBvaW50ZXINCisgKiAob24gbTY4aywgdGhlIGRh dGEgc3RydWN0dXJlIG1heSBvbmx5IGJlIDItYnl0ZSBhbGlnbmVkKS4NCisgKg0KKyAqIEludGVy bmFsIG5vbi1yb290IG5vZGVzIGNhbiBvbmx5IGhhdmUgbWFwbGVfcmFuZ2VfKiBub2RlcyBhcyBw YXJlbnRzLiAgVGhlDQorICogcGFyZW50IHBvaW50ZXIgaXMgMjU2QiBhbGlnbmVkIGxpa2UgYWxs IG90aGVyIHRyZWUgbm9kZXMuICBXaGVuIHN0b3JpbmcgYSAzMg0KKyAqIG9yIDY0IGJpdCB2YWx1 ZXMsIHRoZSBvZmZzZXQgY2FuIGZpdCBpbnRvIDQgYml0cy4gIFRoZSAxNiBiaXQgdmFsdWVzIG5l ZWQgYW4NCisgKiBleHRyYSBiaXQgdG8gc3RvcmUgdGhlIG9mZnNldC4gIFRoaXMgZXh0cmEgYml0 IGNvbWVzIGZyb20gYSByZXVzZSBvZiB0aGUgbGFzdA0KKyAqIGJpdCBpbiB0aGUgbm9kZSB0eXBl LiAgVGhpcyBpcyBwb3NzaWJsZSBieSB1c2luZyBiaXQgMSB0byBpbmRpY2F0ZSBpZiBiaXQgMg0K KyAqIGlzIHBhcnQgb2YgdGhlIHR5cGUgb3IgdGhlIHNsb3QuDQorICoNCisgKiBPbmNlIHRoZSB0 eXBlIGlzIGRlY2lkZWQsIHRoZSBkZWNpc2lvbiBvZiBhbiBhbGxvY2F0aW9uIHJhbmdlIHR5cGUg b3IgYSByYW5nZQ0KKyAqIHR5cGUgaXMgZG9uZSBieSBleGFtaW5pbmcgdGhlIGltbXV0YWJsZSB0 cmVlIGZsYWcgZm9yIHRoZSBNQVBMRV9BTExPQ19SQU5HRQ0KKyAqIGZsYWcuDQorICoNCisgKiAg Tm9kZSB0eXBlczoNCisgKiAgIDB4Pz8xID0gUm9vdA0KKyAqICAgMHg/MDAgPSAxNiBiaXQgbm9k ZXMNCisgKiAgIDB4MDEwID0gMzIgYml0IG5vZGVzDQorICogICAweDExMCA9IDY0IGJpdCBub2Rl cw0KKyAqDQorICogIFNsb3Qgc2l6ZSBhbmQgbG9jYXRpb24gaW4gdGhlIHBhcmVudCBwb2ludGVy Og0KKyAqICAgdHlwZSAgOiBzbG90IGxvY2F0aW9uDQorICogICAweD8/MSA6IFJvb3QNCisgKiAg IDB4PzAwIDogMTYgYml0IHZhbHVlcywgdHlwZSBpbiAwLTEsIHNsb3QgaW4gMi02DQorICogICAw eDAxMCA6IDMyIGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0yLCBzbG90IGluIDMtNg0KKyAqICAgMHgx MTAgOiA2NCBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYNCisgKi8NCit0eXBl ZGVmIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWFwbGVfZW5vZGU7IC8qIGVuY29kZWQgbm9kZSAqLw0K K3R5cGVkZWYgc3RydWN0IG1hcGxlX3Bub2RlICptYXBsZV9wbm9kZTsgLyogcGFyZW50IG5vZGUg Ki8NCisNCisvKg0KKyAqIFRoaXMgbWV0YWRhdGEgaXMgdXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2Fw IHVwZGF0aW5nIGNvZGUgYW5kIGluIHJldmVyc2UNCisgKiBzZWFyY2hpbmcgZm9yIGdhcHMgb3Ig YW55IG90aGVyIGNvZGUgdGhhdCBuZWVkcyB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEuDQor ICovDQorc3RydWN0IG1hcGxlX21ldGFkYXRhIHsNCisJdW5zaWduZWQgY2hhciBlbmQ7DQorCXVu c2lnbmVkIGNoYXIgZ2FwOw0KK307DQorDQorLyoNCisgKiBMZWFmIG5vZGVzIGRvIG5vdCBzdG9y ZSBwb2ludGVycyB0byBub2RlcywgdGhleSBzdG9yZSB1c2VyIGRhdGEuICBVc2VycyBtYXkNCisg KiBzdG9yZSBhbG1vc3QgYW55IGJpdCBwYXR0ZXJuLiAgQXMgbm90ZWQgYWJvdmUsIHRoZSBvcHRp bWlzYXRpb24gb2Ygc3RvcmluZyBhbg0KKyAqIGVudHJ5IGF0IDAgaW4gdGhlIHJvb3QgcG9pbnRl ciBjYW5ub3QgYmUgZG9uZSBmb3IgZGF0YSB3aGljaCBoYXZlIHRoZSBib3R0b20NCisgKiB0d28g Yml0cyBzZXQgdG8gJzEwJy4gIFdlIGFsc28gcmVzZXJ2ZSB2YWx1ZXMgd2l0aCB0aGUgYm90dG9t IHR3byBiaXRzIHNldCB0bw0KKyAqICcxMCcgd2hpY2ggYXJlIGJlbG93IDQwOTYgKGllIDIsIDYs IDEwIC4uIDQwOTQpIGZvciBpbnRlcm5hbCB1c2UuICBTb21lIEFQSXMNCisgKiByZXR1cm4gZXJy bm9zIGFzIGEgbmVnYXRpdmUgZXJybm8gc2hpZnRlZCByaWdodCBieSB0d28gYml0cyBhbmQgdGhl IGJvdHRvbQ0KKyAqIHR3byBiaXRzIHNldCB0byAnMTAnLCBhbmQgd2hpbGUgY2hvb3NpbmcgdG8g c3RvcmUgdGhlc2UgdmFsdWVzIGluIHRoZSBhcnJheQ0KKyAqIGlzIG5vdCBhbiBlcnJvciwgaXQg bWF5IGxlYWQgdG8gY29uZnVzaW9uIGlmIHlvdSdyZSB0ZXN0aW5nIGZvciBhbiBlcnJvciB3aXRo DQorICogbWFzX2lzX2VycigpLg0KKyAqDQorICogTm9uLWxlYWYgbm9kZXMgc3RvcmUgdGhlIHR5 cGUgb2YgdGhlIG5vZGUgcG9pbnRlZCB0byAoZW51bSBtYXBsZV90eXBlIGluIGJpdHMNCisgKiAz LTYpLCBiaXQgMiBpcyByZXNlcnZlZC4gIFRoYXQgbGVhdmVzIGJpdHMgMC0xIHVudXNlZCBmb3Ig bm93Lg0KKyAqDQorICogSW4gcmVndWxhciBCLVRyZWUgdGVybXMsIHBpdm90cyBhcmUgY2FsbGVk IGtleXMuICBUaGUgdGVybSBwaXZvdCBpcyB1c2VkIHRvDQorICogaW5kaWNhdGUgdGhhdCB0aGUg dHJlZSBpcyBzcGVjaWZ5aW5nIHJhbmdlcywgIFBpdm90cyBtYXkgYXBwZWFyIGluIHRoZQ0KKyAq IHN1YnRyZWUgd2l0aCBhbiBlbnRyeSBhdHRhY2hlZCB0byB0aGUgdmFsdWUgd2hlcmVhcyBrZXlz IGFyZSB1bmlxdWUgdG8gYQ0KKyAqIHNwZWNpZmljIHBvc2l0aW9uIG9mIGEgQi10cmVlLiAgUGl2 b3QgdmFsdWVzIGFyZSBpbmNsdXNpdmUgb2YgdGhlIHNsb3Qgd2l0aA0KKyAqIHRoZSBzYW1lIGlu ZGV4Lg0KKyAqLw0KKw0KK3N0cnVjdCBtYXBsZV9yYW5nZV82NCB7DQorCXN0cnVjdCBtYXBsZV9w bm9kZSAqcGFyZW50Ow0KKwl1bnNpZ25lZCBsb25nIHBpdm90W01BUExFX1JBTkdFNjRfU0xPVFMg LSAxXTsNCisJdW5pb24gew0KKwkJdm9pZCBfX3JjdSAqc2xvdFtNQVBMRV9SQU5HRTY0X1NMT1RT XTsNCisJCXN0cnVjdCB7DQorCQkJdm9pZCBfX3JjdSAqcGFkW01BUExFX1JBTkdFNjRfU0xPVFMg LSAxXTsNCisJCQlzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgbWV0YTsNCisJCX07DQorCX07DQorfTsN CisNCisvKg0KKyAqIEF0IHRyZWUgY3JlYXRpb24gdGltZSwgdGhlIHVzZXIgY2FuIHNwZWNpZnkg dGhhdCB0aGV5J3JlIHdpbGxpbmcgdG8gdHJhZGUgb2ZmDQorICogc3RvcmluZyBmZXdlciBlbnRy aWVzIGluIGEgdHJlZSBpbiByZXR1cm4gZm9yIHN0b3JpbmcgbW9yZSBpbmZvcm1hdGlvbiBpbg0K KyAqIGVhY2ggbm9kZS4NCisgKg0KKyAqIFRoZSBtYXBsZSB0cmVlIHN1cHBvcnRzIHJlY29yZGlu ZyB0aGUgbGFyZ2VzdCByYW5nZSBvZiBOVUxMIGVudHJpZXMgYXZhaWxhYmxlDQorICogaW4gdGhp cyBub2RlLCBhbHNvIGNhbGxlZCBnYXBzLiAgVGhpcyBvcHRpbWlzZXMgdGhlIHRyZWUgZm9yIGFs bG9jYXRpbmcgYQ0KKyAqIHJhbmdlLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9hcmFuZ2VfNjQgew0K KwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBM RV9BUkFOR0U2NF9TTE9UUyAtIDFdOw0KKwl2b2lkIF9fcmN1ICpzbG90W01BUExFX0FSQU5HRTY0 X1NMT1RTXTsNCisJdW5zaWduZWQgbG9uZyBnYXBbTUFQTEVfQVJBTkdFNjRfU0xPVFNdOw0KKwlz dHJ1Y3QgbWFwbGVfbWV0YWRhdGEgbWV0YTsNCit9Ow0KKw0KK3N0cnVjdCBtYXBsZV9hbGxvYyB7 DQorCXVuc2lnbmVkIGxvbmcgdG90YWw7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9jb3VudDsNCisJ dW5zaWduZWQgaW50IHJlcXVlc3RfY291bnQ7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqc2xvdFtN QVBMRV9BTExPQ19TTE9UU107DQorfTsNCisNCitzdHJ1Y3QgbWFwbGVfdG9waWFyeSB7DQorCXN0 cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7IC8q IE92ZXJsYXBzIHRoZSBwaXZvdCAqLw0KK307DQorDQorZW51bSBtYXBsZV90eXBlIHsNCisJbWFw bGVfZGVuc2UsDQorCW1hcGxlX2xlYWZfNjQsDQorCW1hcGxlX3JhbmdlXzY0LA0KKwltYXBsZV9h cmFuZ2VfNjQsDQorfTsNCisNCisNCisvKioNCisgKiBET0M6IE1hcGxlIHRyZWUgZmxhZ3MNCisg Kg0KKyAqICogTVRfRkxBR1NfQUxMT0NfUkFOR0UJLSBUcmFjayBnYXBzIGluIHRoaXMgdHJlZQ0K KyAqICogTVRfRkxBR1NfVVNFX1JDVQkJLSBPcGVyYXRlIGluIFJDVSBtb2RlDQorICogKiBNVF9G TEFHU19IRUlHSFRfT0ZGU0VUCS0gVGhlIHBvc2l0aW9uIG9mIHRoZSB0cmVlIGhlaWdodCBpbiB0 aGUgZmxhZ3MNCisgKiAqIE1UX0ZMQUdTX0hFSUdIVF9NQVNLCS0gVGhlIG1hc2sgZm9yIHRoZSBt YXBsZSB0cmVlIGhlaWdodCB2YWx1ZQ0KKyAqICogTVRfRkxBR1NfTE9DS19NQVNLCQktIEhvdyB0 aGUgbXRfbG9jayBpcyB1c2VkDQorICogKiBNVF9GTEFHU19MT0NLX0lSUQkJLSBBY3F1aXJlZCBp cnEtc2FmZQ0KKyAqICogTVRfRkxBR1NfTE9DS19CSAkJLSBBY3F1aXJlZCBiaC1zYWZlDQorICog KiBNVF9GTEFHU19MT0NLX0VYVEVSTgktIG10X2xvY2sgaXMgbm90IHVzZWQNCisgKg0KKyAqIE1B UExFX0hFSUdIVF9NQVgJVGhlIGxhcmdlc3QgaGVpZ2h0IHRoYXQgY2FuIGJlIHN0b3JlZA0KKyAq Lw0KKyNkZWZpbmUgTVRfRkxBR1NfQUxMT0NfUkFOR0UJMHgwMQ0KKyNkZWZpbmUgTVRfRkxBR1Nf VVNFX1JDVQkweDAyDQorI2RlZmluZSBNVF9GTEFHU19IRUlHSFRfT0ZGU0VUCTB4MDINCisjZGVm aW5lIE1UX0ZMQUdTX0hFSUdIVF9NQVNLCTB4N0MNCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfTUFT SwkweDMwMA0KKyNkZWZpbmUgTVRfRkxBR1NfTE9DS19JUlEJMHgxMDANCisjZGVmaW5lIE1UX0ZM QUdTX0xPQ0tfQkgJMHgyMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfRVhURVJOCTB4MzAwDQor DQorI2RlZmluZSBNQVBMRV9IRUlHSFRfTUFYCTMxDQorDQorDQorI2RlZmluZSBNQVBMRV9OT0RF X1RZUEVfTUFTSwkweDBGDQorI2RlZmluZSBNQVBMRV9OT0RFX1RZUEVfU0hJRlQJMHgwMw0KKw0K KyNkZWZpbmUgTUFQTEVfUkVTRVJWRURfUkFOR0UJNDA5Ng0KKw0KKyNpZmRlZiBDT05GSUdfTE9D S0RFUA0KK3R5cGVkZWYgc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrZGVwX21hcF9wOw0KKyNkZWZp bmUgbXRfbG9ja19pc19oZWxkKG10KQlsb2NrX2lzX2hlbGQobXQtPm1hX2V4dGVybmFsX2xvY2sp DQorI2RlZmluZSBtdF9zZXRfZXh0ZXJuYWxfbG9jayhtdCwgbG9jaykJCQkJCVwNCisJKG10KS0+ bWFfZXh0ZXJuYWxfbG9jayA9ICYobG9jayktPmRlcF9tYXANCisjZWxzZQ0KK3R5cGVkZWYgc3Ry dWN0IHsgLyogbm90aGluZyAqLyB9IGxvY2tkZXBfbWFwX3A7DQorI2RlZmluZSBtdF9sb2NrX2lz X2hlbGQobXQpCTENCisjZGVmaW5lIG10X3NldF9leHRlcm5hbF9sb2NrKG10LCBsb2NrKQlkbyB7 IH0gd2hpbGUgKDApDQorI2VuZGlmDQorDQorLyoNCisgKiBJZiB0aGUgdHJlZSBjb250YWlucyBh IHNpbmdsZSBlbnRyeSBhdCBpbmRleCAwLCBpdCBpcyB1c3VhbGx5IHN0b3JlZCBpbg0KKyAqIHRy ZWUtPm1hX3Jvb3QuICBUbyBvcHRpbWlzZSBmb3IgdGhlIHBhZ2UgY2FjaGUsIGFuIGVudHJ5IHdo aWNoIGVuZHMgaW4gJzAwJywNCisgKiAnMDEnIG9yICcxMScgaXMgc3RvcmVkIGluIHRoZSByb290 LCBidXQgYW4gZW50cnkgd2hpY2ggZW5kcyBpbiAnMTAnIHdpbGwgYmUNCisgKiBzdG9yZWQgaW4g YSBub2RlLiAgQml0cyAzLTYgYXJlIHVzZWQgdG8gc3RvcmUgZW51bSBtYXBsZV90eXBlLg0KKyAq DQorICogVGhlIGZsYWdzIGFyZSB1c2VkIGJvdGggdG8gc3RvcmUgc29tZSBpbW11dGFibGUgaW5m b3JtYXRpb24gYWJvdXQgdGhpcyB0cmVlDQorICogKHNldCBhdCB0cmVlIGNyZWF0aW9uIHRpbWUp IGFuZCBkeW5hbWljIGluZm9ybWF0aW9uIHNldCB1bmRlciB0aGUgc3BpbmxvY2suDQorICoNCisg KiBBbm90aGVyIHVzZSBvZiBmbGFncyBhcmUgdG8gaW5kaWNhdGUgZ2xvYmFsIHN0YXRlcyBvZiB0 aGUgdHJlZS4gIFRoaXMgaXMgdGhlDQorICogY2FzZSB3aXRoIHRoZSBNQVBMRV9VU0VfUkNVIGZs YWcsIHdoaWNoIGluZGljYXRlcyB0aGUgdHJlZSBpcyBjdXJyZW50bHkgaW4NCisgKiBSQ1UgbW9k ZS4gIFRoaXMgbW9kZSB3YXMgYWRkZWQgdG8gYWxsb3cgdGhlIHRyZWUgdG8gcmV1c2Ugbm9kZXMg aW5zdGVhZCBvZg0KKyAqIHJlLWFsbG9jYXRpbmcgYW5kIFJDVSBmcmVlaW5nIG5vZGVzIHdoZW4g dGhlcmUgaXMgYSBzaW5nbGUgdXNlci4NCisgKi8NCitzdHJ1Y3QgbWFwbGVfdHJlZSB7DQorCXVu aW9uIHsNCisJCXNwaW5sb2NrX3QJbWFfbG9jazsNCisJCWxvY2tkZXBfbWFwX3AJbWFfZXh0ZXJu YWxfbG9jazsNCisJfTsNCisJdm9pZCBfX3JjdSAgICAgICptYV9yb290Ow0KKwl1bnNpZ25lZCBp bnQJbWFfZmxhZ3M7DQorfTsNCisNCisvKioNCisgKiBNVFJFRV9JTklUKCkgLSBJbml0aWFsaXpl IGEgbWFwbGUgdHJlZQ0KKyAqIEBuYW1lOiBUaGUgbWFwbGUgdHJlZSBuYW1lDQorICogQGZsYWdz OiBUaGUgbWFwbGUgdHJlZSBmbGFncw0KKyAqDQorICovDQorI2RlZmluZSBNVFJFRV9JTklUKG5h bWUsIF9fZmxhZ3MpIHsJCQkJCVwNCisJLm1hX2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCgo bmFtZSkubWFfbG9jayksCQlcDQorCS5tYV9mbGFncyA9IF9fZmxhZ3MsCQkJCQkJXA0KKwkubWFf cm9vdCA9IE5VTEwsCQkJCQkJXA0KK30NCisNCisvKioNCisgKiBNVFJFRV9JTklUX0VYVCgpIC0g SW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUgd2l0aCBhbiBleHRlcm5hbCBsb2NrLg0KKyAqIEBuYW1l OiBUaGUgdHJlZSBuYW1lDQorICogQGZsYWdzOiBUaGUgbWFwbGUgdHJlZSBmbGFncw0KKyAqIEBs b2NrOiBUaGUgZXh0ZXJuYWwgbG9jaw0KKyAqLw0KKyNpZmRlZiBDT05GSUdfTE9DS0RFUA0KKyNk ZWZpbmUgTVRSRUVfSU5JVF9FWFQobmFtZSwgX19mbGFncywgX19sb2NrKSB7CQkJCVwNCisJLm1h X2V4dGVybmFsX2xvY2sgPSAmKF9fbG9jaykuZGVwX21hcCwJCQkJXA0KKwkubWFfZmxhZ3MgPSAo X19mbGFncyksCQkJCQkJXA0KKwkubWFfcm9vdCA9IE5VTEwsCQkJCQkJXA0KK30NCisjZWxzZQ0K KyNkZWZpbmUgTVRSRUVfSU5JVF9FWFQobmFtZSwgX19mbGFncywgX19sb2NrKQlNVFJFRV9JTklU KG5hbWUsIF9fZmxhZ3MpDQorI2VuZGlmDQorDQorI2RlZmluZSBERUZJTkVfTVRSRUUobmFtZSkJ CQkJCQlcDQorCXN0cnVjdCBtYXBsZV90cmVlIG5hbWUgPSBNVFJFRV9JTklUKG5hbWUsIDApDQor DQorI2RlZmluZSBtdHJlZV9sb2NrKG10KQkJc3Bpbl9sb2NrKCgmKG10KS0+bWFfbG9jaykpDQor I2RlZmluZSBtdHJlZV91bmxvY2sobXQpCXNwaW5fdW5sb2NrKCgmKG10KS0+bWFfbG9jaykpDQor DQorLyoNCisgKiBUaGUgTWFwbGUgVHJlZSBzcXVlZXplcyB2YXJpb3VzIGJpdHMgaW4gYXQgdmFy aW91cyBwb2ludHMgd2hpY2ggYXJlbid0DQorICogbmVjZXNzYXJpbHkgb2J2aW91cy4gIFVzdWFs bHksIHRoaXMgaXMgZG9uZSBieSBvYnNlcnZpbmcgdGhhdCBwb2ludGVycyBhcmUNCisgKiBOLWJ5 dGUgYWxpZ25lZCBhbmQgdGh1cyB0aGUgYm90dG9tIGxvZ18yKE4pIGJpdHMgYXJlIGF2YWlsYWJs ZSBmb3IgdXNlLiAgV2UNCisgKiBkb24ndCB1c2UgdGhlIGhpZ2ggYml0cyBvZiBwb2ludGVycyB0 byBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlY2F1c2UNCisgKiB3ZSBkb24ndCBrbm93 IHdoYXQgYml0cyBhcmUgdW51c2VkIG9uIGFueSBnaXZlbiBhcmNoaXRlY3R1cmUuDQorICoNCisg KiBOb2RlcyBhcmUgMjU2IGJ5dGVzIGluIHNpemUgYW5kIGFyZSBhbHNvIGFsaWduZWQgdG8gMjU2 IGJ5dGVzLCBnaXZpbmcgdXMgOA0KKyAqIGxvdyBiaXRzIGZvciBvdXIgb3duIHB1cnBvc2VzLiAg Tm9kZXMgYXJlIGN1cnJlbnRseSBvZiA0IHR5cGVzOg0KKyAqIDEuIFNpbmdsZSBwb2ludGVyIChS YW5nZSBpcyAwLTApDQorICogMi4gTm9uLWxlYWYgQWxsb2NhdGlvbiBSYW5nZSBub2Rlcw0KKyAq IDMuIE5vbi1sZWFmIFJhbmdlIG5vZGVzDQorICogNC4gTGVhZiBSYW5nZSBub2RlcyBBbGwgbm9k ZXMgY29uc2lzdCBvZiBhIG51bWJlciBvZiBub2RlIHNsb3RzLA0KKyAqICAgIHBpdm90cywgYW5k IGEgcGFyZW50IHBvaW50ZXIuDQorICovDQorDQorc3RydWN0IG1hcGxlX25vZGUgew0KKwl1bmlv biB7DQorCQlzdHJ1Y3Qgew0KKwkJCXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwkJCXZv aWQgX19yY3UgKnNsb3RbTUFQTEVfTk9ERV9TTE9UU107DQorCQl9Ow0KKwkJc3RydWN0IHsNCisJ CQl2b2lkICpwYWQ7DQorCQkJc3RydWN0IHJjdV9oZWFkIHJjdTsNCisJCQlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKnBpdl9wYXJlbnQ7DQorCQkJdW5zaWduZWQgY2hhciBwYXJlbnRfc2xvdDsNCisJCQll bnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJCQl1bnNpZ25lZCBjaGFyIHNsb3RfbGVuOw0KKwkJCXVu c2lnbmVkIGludCBtYV9mbGFnczsNCisJCX07DQorCQlzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgbXI2 NDsNCisJCXN0cnVjdCBtYXBsZV9hcmFuZ2VfNjQgbWE2NDsNCisJCXN0cnVjdCBtYXBsZV9hbGxv YyBhbGxvYzsNCisJfTsNCit9Ow0KKw0KKy8qDQorICogTW9yZSBjb21wbGljYXRlZCBzdG9yZXMg Y2FuIGNhdXNlIHR3byBub2RlcyB0byBiZWNvbWUgb25lIG9yIHRocmVlIGFuZA0KKyAqIHBvdGVu dGlhbGx5IGFsdGVyIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUuICBFaXRoZXIgaGFsZiBvZiB0aGUg dHJlZSBtYXkgbmVlZA0KKyAqIHRvIGJlIHJlYmFsYW5jZWQgYWdhaW5zdCB0aGUgb3RoZXIuICBU aGUgbWFfdG9waWFyeSBzdHJ1Y3QgaXMgdXNlZCB0byB0cmFjaw0KKyAqIHdoaWNoIG5vZGVzIGhh dmUgYmVlbiAnY3V0JyBmcm9tIHRoZSB0cmVlIHNvIHRoYXQgdGhlIGNoYW5nZSBjYW4gYmUgZG9u ZQ0KKyAqIHNhZmVseSBhdCBhIGxhdGVyIGRhdGUuICBUaGlzIGlzIGRvbmUgdG8gc3VwcG9ydCBS Q1UuDQorICovDQorc3RydWN0IG1hX3RvcGlhcnkgew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmhl YWQ7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqdGFpbDsNCisJc3RydWN0IG1hcGxlX3RyZWUgKm10 cmVlOw0KK307DQorDQordm9pZCAqbXRyZWVfbG9hZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgaW5kZXgpOw0KKw0KK2ludCBtdHJlZV9pbnNlcnQoc3RydWN0IG1hcGxlX3Ry ZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LA0KKwkJdm9pZCAqZW50cnksIGdmcF90IGdmcCk7 DQoraW50IG10cmVlX2luc2VydF9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVk IGxvbmcgZmlyc3QsDQorCQl1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVudHJ5LCBnZnBfdCBn ZnApOw0KK2ludCBtdHJlZV9hbGxvY19yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2ln bmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNpemUsIHVu c2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCk7DQoraW50 IG10cmVlX2FsbG9jX3JyYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcg KnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxv bmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCk7DQorDQoraW50IG10cmVl X3N0b3JlX3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBmaXJzdCwN CisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdCwgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQor aW50IG10cmVlX3N0b3JlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRl eCwNCisJCXZvaWQgKmVudHJ5LCBnZnBfdCBnZnApOw0KK3ZvaWQgKm10cmVlX2VyYXNlKHN0cnVj dCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCk7DQorDQordm9pZCBtdHJlZV9k ZXN0cm95KHN0cnVjdCBtYXBsZV90cmVlICptdCk7DQordm9pZCBfX210X2Rlc3Ryb3koc3RydWN0 IG1hcGxlX3RyZWUgKm10KTsNCisNCisvKioNCisgKiBtdHJlZV9lbXB0eSgpIC0gRGV0ZXJtaW5l IGlmIGEgdHJlZSBoYXMgYW55IHByZXNlbnQgZW50cmllcy4NCisgKiBAbXQ6IE1hcGxlIFRyZWUu DQorICoNCisgKiBDb250ZXh0OiBBbnkgY29udGV4dC4NCisgKiBSZXR1cm46ICV0cnVlIGlmIHRo ZSB0cmVlIGNvbnRhaW5zIG9ubHkgTlVMTCBwb2ludGVycy4NCisgKi8NCitzdGF0aWMgaW5saW5l IGJvb2wgbXRyZWVfZW1wdHkoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0 dXJuIG10LT5tYV9yb290ID09IE5VTEw7DQorfQ0KKw0KKy8qIEFkdmFuY2VkIEFQSSAqLw0KKw0K Ky8qDQorICogVGhlIG1hcGxlIHN0YXRlIGlzIGRlZmluZWQgaW4gdGhlIHN0cnVjdCBtYV9zdGF0 ZSBhbmQgaXMgdXNlZCB0byBrZWVwIHRyYWNrDQorICogb2YgaW5mb3JtYXRpb24gZHVyaW5nIG9w ZXJhdGlvbnMsIGFuZCBldmVuIGJldHdlZW4gb3BlcmF0aW9ucyB3aGVuIHVzaW5nIHRoZQ0KKyAq IGFkdmFuY2VkIEFQSS4NCisgKg0KKyAqIElmIHN0YXRlLT5ub2RlIGhhcyBiaXQgMCBzZXQgdGhl biBpdCByZWZlcmVuY2VzIGEgdHJlZSBsb2NhdGlvbiB3aGljaCBpcyBub3QNCisgKiBhIG5vZGUg KGVnIHRoZSByb290KS4gIElmIGJpdCAxIGlzIHNldCwgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgYXJl IGEgbmVnYXRpdmUNCisgKiBlcnJuby4gIEJpdCAyICh0aGUgJ3VuYWxsb2NhdGVkIHNsb3RzJyBi aXQpIGlzIGNsZWFyLiAgQml0cyAzLTYgaW5kaWNhdGUgdGhlDQorICogbm9kZSB0eXBlLg0KKyAq DQorICogc3RhdGUtPmFsbG9jIGVpdGhlciBoYXMgYSByZXF1ZXN0IG51bWJlciBvZiBub2RlcyBv ciBhbiBhbGxvY2F0ZWQgbm9kZS4gIElmDQorICogc3RhdC0+YWxsb2MgaGFzIGEgcmVxdWVzdGVk IG51bWJlciBvZiBub2RlcywgdGhlIGZpcnN0IGJpdCB3aWxsIGJlIHNldCAoMHgxKQ0KKyAqIGFu ZCB0aGUgcmVtYWluaW5nIGJpdHMgYXJlIHRoZSB2YWx1ZS4gIElmIHN0YXRlLT5hbGxvYyBpcyBh IG5vZGUsIHRoZW4gdGhlDQorICogbm9kZSB3aWxsIGJlIG9mIHR5cGUgbWFwbGVfYWxsb2MuICBt YXBsZV9hbGxvYyBoYXMgTUFQTEVfTk9ERV9TTE9UUyAtIDEgZm9yDQorICogc3RvcmluZyBtb3Jl IGFsbG9jYXRlZCBub2RlcywgYSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgYWxsb2NhdGVkLCBhbmQg dGhlDQorICogbm9kZV9jb3VudCBpbiB0aGlzIG5vZGUuICBub2RlX2NvdW50IGlzIHRoZSBudW1i ZXIgb2YgYWxsb2NhdGVkIG5vZGVzIGluIHRoaXMNCisgKiBub2RlLiAgVGhlIHNjYWxpbmcgYmV5 b25kIE1BUExFX05PREVfU0xPVFMgLSAxIGlzIGhhbmRsZWQgYnkgc3RvcmluZyBmdXJ0aGVyDQor ICogbm9kZXMgaW50byBzdGF0ZS0+YWxsb2MtPnNsb3RbMF0ncyBub2RlLiAgTm9kZXMgYXJlIHRh a2VuIGZyb20gc3RhdGUtPmFsbG9jDQorICogYnkgcmVtb3ZpbmcgYSBub2RlIGZyb20gdGhlIHN0 YXRlLT5hbGxvYyBub2RlIHVudGlsIHN0YXRlLT5hbGxvYy0+bm9kZV9jb3VudA0KKyAqIGlzIDEs IHdoZW4gc3RhdGUtPmFsbG9jIGlzIHJldHVybmVkIGFuZCB0aGUgc3RhdGUtPmFsbG9jLT5zbG90 WzBdIGlzIHByb21vdGVkDQorICogdG8gc3RhdGUtPmFsbG9jLiAgTm9kZXMgYXJlIHB1c2hlZCBv bnRvIHN0YXRlLT5hbGxvYyBieSBwdXR0aW5nIHRoZSBjdXJyZW50DQorICogc3RhdGUtPmFsbG9j IGludG8gdGhlIHB1c2hlZCBub2RlJ3Mgc2xvdFswXS4NCisgKg0KKyAqIFRoZSBzdGF0ZSBhbHNv IGNvbnRhaW5zIHRoZSBpbXBsaWVkIG1pbi9tYXggb2YgdGhlIHN0YXRlLT5ub2RlLCB0aGUgZGVw dGggb2YNCisgKiB0aGlzIHNlYXJjaCwgYW5kIHRoZSBvZmZzZXQuIFRoZSBpbXBsaWVkIG1pbi9t YXggYXJlIGVpdGhlciBmcm9tIHRoZSBwYXJlbnQNCisgKiBub2RlIG9yIGFyZSAwLW9vIGZvciB0 aGUgcm9vdCBub2RlLiAgVGhlIGRlcHRoIGlzIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkDQor ICogZXZlcnkgdGltZSBhIG5vZGUgaXMgd2Fsa2VkIGRvd24gb3IgdXAuICBUaGUgb2Zmc2V0IGlz IHRoZSBzbG90L3Bpdm90IG9mDQorICogaW50ZXJlc3QgaW4gdGhlIG5vZGUgLSBlaXRoZXIgZm9y IHJlYWRpbmcgb3Igd3JpdGluZy4NCisgKg0KKyAqIFdoZW4gcmV0dXJuaW5nIGEgdmFsdWUgdGhl IG1hcGxlIHN0YXRlIGluZGV4IGFuZCBsYXN0IHJlc3BlY3RpdmVseSBjb250YWluDQorICogdGhl IHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHJhbmdlIGZvciB0aGUgZW50cnkuICBSYW5nZXMgYXJlIGlu Y2x1c2l2ZSBpbiB0aGUNCisgKiBNYXBsZSBUcmVlLg0KKyAqLw0KK3N0cnVjdCBtYV9zdGF0ZSB7 DQorCXN0cnVjdCBtYXBsZV90cmVlICp0cmVlOwkvKiBUaGUgdHJlZSB3ZSdyZSBvcGVyYXRpbmcg aW4gKi8NCisJdW5zaWduZWQgbG9uZyBpbmRleDsJCS8qIFRoZSBpbmRleCB3ZSdyZSBvcGVyYXRp bmcgb24gLSByYW5nZSBzdGFydCAqLw0KKwl1bnNpZ25lZCBsb25nIGxhc3Q7CQkvKiBUaGUgbGFz dCBpbmRleCB3ZSdyZSBvcGVyYXRpbmcgb24gLSByYW5nZSBlbmQgKi8NCisJc3RydWN0IG1hcGxl X2Vub2RlICpub2RlOwkvKiBUaGUgbm9kZSBjb250YWluaW5nIHRoaXMgZW50cnkgKi8NCisJdW5z aWduZWQgbG9uZyBtaW47CQkvKiBUaGUgbWluaW11bSBpbmRleCBvZiB0aGlzIG5vZGUgLSBpbXBs aWVkIHBpdm90IG1pbiAqLw0KKwl1bnNpZ25lZCBsb25nIG1heDsJCS8qIFRoZSBtYXhpbXVtIGlu ZGV4IG9mIHRoaXMgbm9kZSAtIGltcGxpZWQgcGl2b3QgbWF4ICovDQorCXN0cnVjdCBtYXBsZV9h bGxvYyAqYWxsb2M7CS8qIEFsbG9jYXRlZCBub2RlcyBmb3IgdGhpcyBvcGVyYXRpb24gKi8NCisJ dW5zaWduZWQgY2hhciBkZXB0aDsJCS8qIGRlcHRoIG9mIHRyZWUgZGVzY2VudCBkdXJpbmcgd3Jp dGUgKi8NCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgbWFzX2ZsYWdz Ow0KK307DQorDQorc3RydWN0IG1hX3dyX3N0YXRlIHsNCisJc3RydWN0IG1hX3N0YXRlICptYXM7 DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOwkvKiBEZWNvZGVkIG1hcy0+bm9kZSAqLw0KKwl1 bnNpZ25lZCBsb25nIHJfbWluOwkJLyogcmFuZ2UgbWluICovDQorCXVuc2lnbmVkIGxvbmcgcl9t YXg7CQkvKiByYW5nZSBtYXggKi8NCisJZW51bSBtYXBsZV90eXBlIHR5cGU7CQkvKiBtYXMtPm5v ZGUgdHlwZSAqLw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldF9lbmQ7CS8qIFRoZSBvZmZzZXQgd2hl cmUgdGhlIHdyaXRlIGVuZHMgKi8NCisJdW5zaWduZWQgY2hhciBub2RlX2VuZDsJCS8qIG1hcy0+ bm9kZSBlbmQgKi8NCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOwkJLyogbWFzLT5ub2RlLT5waXZv dHMgcG9pbnRlciAqLw0KKwl1bnNpZ25lZCBsb25nIGVuZF9waXY7CQkvKiBUaGUgcGl2b3QgYXQg dGhlIG9mZnNldCBlbmQgKi8NCisJdm9pZCBfX3JjdSAqKnNsb3RzOwkJLyogbWFzLT5ub2RlLT5z bG90cyBwb2ludGVyICovDQorCXZvaWQgKmVudHJ5OwkJCS8qIFRoZSBlbnRyeSB0byB3cml0ZSAq Lw0KKwl2b2lkICpjb250ZW50OwkJCS8qIFRoZSBleGlzdGluZyBlbnRyeSB0aGF0IGlzIGJlaW5n IG92ZXJ3cml0dGVuICovDQorfTsNCisNCisjZGVmaW5lIG1hc19sb2NrKG1hcykgICAgICAgICAg IHNwaW5fbG9jaygmKChtYXMpLT50cmVlLT5tYV9sb2NrKSkNCisjZGVmaW5lIG1hc191bmxvY2so bWFzKSAgICAgICAgIHNwaW5fdW5sb2NrKCYoKG1hcyktPnRyZWUtPm1hX2xvY2spKQ0KKw0KKw0K Ky8qDQorICogU3BlY2lhbCB2YWx1ZXMgZm9yIG1hX3N0YXRlLm5vZGUuDQorICogTUFTX1NUQVJU IG1lYW5zIHdlIGhhdmUgbm90IHNlYXJjaGVkIHRoZSB0cmVlLg0KKyAqIE1BU19ST09UIG1lYW5z IHdlIGhhdmUgc2VhcmNoZWQgdGhlIHRyZWUgYW5kIHRoZSBlbnRyeSB3ZSBmb3VuZCBsaXZlcyBp bg0KKyAqIHRoZSByb290IG9mIHRoZSB0cmVlIChpZSBpdCBoYXMgaW5kZXggMCwgbGVuZ3RoIDEg YW5kIGlzIHRoZSBvbmx5IGVudHJ5IGluDQorICogdGhlIHRyZWUpLg0KKyAqIE1BU19OT05FIG1l YW5zIHdlIGhhdmUgc2VhcmNoZWQgdGhlIHRyZWUgYW5kIHRoZXJlIGlzIG5vIG5vZGUgaW4gdGhl DQorICogdHJlZSBmb3IgdGhpcyBlbnRyeS4gIEZvciBleGFtcGxlLCB3ZSBzZWFyY2hlZCBmb3Ig aW5kZXggMSBpbiBhbiBlbXB0eQ0KKyAqIHRyZWUuICBPciB3ZSBoYXZlIGEgdHJlZSB3aGljaCBw b2ludHMgdG8gYSBmdWxsIGxlYWYgbm9kZSBhbmQgd2UNCisgKiBzZWFyY2hlZCBmb3IgYW4gZW50 cnkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4gY2FuIGJlIGNvbnRhaW5lZCBpbiB0aGF0DQorICogbGVh ZiBub2RlLg0KKyAqIE1BX0VSUk9SIHJlcHJlc2VudHMgYW4gZXJybm8uICBBZnRlciBkcm9wcGlu ZyB0aGUgbG9jayBhbmQgYXR0ZW1wdGluZw0KKyAqIHRvIHJlc29sdmUgdGhlIGVycm9yLCB0aGUg d2FsayB3b3VsZCBoYXZlIHRvIGJlIHJlc3RhcnRlZCBmcm9tIHRoZQ0KKyAqIHRvcCBvZiB0aGUg dHJlZSBhcyB0aGUgdHJlZSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkLg0KKyAqLw0KKyNkZWZpbmUg TUFTX1NUQVJUCSgoc3RydWN0IG1hcGxlX2Vub2RlICopMVVMKQ0KKyNkZWZpbmUgTUFTX1JPT1QJ KChzdHJ1Y3QgbWFwbGVfZW5vZGUgKik1VUwpDQorI2RlZmluZSBNQVNfTk9ORQkoKHN0cnVjdCBt YXBsZV9lbm9kZSAqKTlVTCkNCisjZGVmaW5lIE1BU19QQVVTRQkoKHN0cnVjdCBtYXBsZV9lbm9k ZSAqKTE3VUwpDQorI2RlZmluZSBNQV9FUlJPUihlcnIpIFwNCisJCSgoc3RydWN0IG1hcGxlX2Vu b2RlICopKCgodW5zaWduZWQgbG9uZyllcnIgPDwgMikgfCAyVUwpKQ0KKw0KKyNkZWZpbmUgTUFf U1RBVEUobmFtZSwgbXQsIGZpcnN0LCBlbmQpCQkJCQlcDQorCXN0cnVjdCBtYV9zdGF0ZSBuYW1l ID0gewkJCQkJXA0KKwkJLnRyZWUgPSBtdCwJCQkJCQlcDQorCQkuaW5kZXggPSBmaXJzdCwJCQkJ CQlcDQorCQkubGFzdCA9IGVuZCwJCQkJCQlcDQorCQkubm9kZSA9IE1BU19TVEFSVCwJCQkJCVwN CisJCS5taW4gPSAwLAkJCQkJCVwNCisJCS5tYXggPSBVTE9OR19NQVgsCQkJCQlcDQorCQkuYWxs b2MgPSBOVUxMLAkJCQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUgTUFfV1JfU1RBVEUobmFtZSwgbWFf c3RhdGUsIHdyX2VudHJ5KQkJCQlcDQorCXN0cnVjdCBtYV93cl9zdGF0ZSBuYW1lID0gewkJCQkJ XA0KKwkJLm1hcyA9IG1hX3N0YXRlLAkJCQkJXA0KKwkJLmNvbnRlbnQgPSBOVUxMLAkJCQkJXA0K KwkJLmVudHJ5ID0gd3JfZW50cnksCQkJCQlcDQorCX0NCisNCisjZGVmaW5lIE1BX1RPUElBUlko bmFtZSwgdHJlZSkJCQkJCQlcDQorCXN0cnVjdCBtYV90b3BpYXJ5IG5hbWUgPSB7CQkJCQlcDQor CQkuaGVhZCA9IE5VTEwsCQkJCQkJXA0KKwkJLnRhaWwgPSBOVUxMLAkJCQkJCVwNCisJCS5tdHJl ZSA9IHRyZWUsCQkJCQkJXA0KKwl9DQorDQordm9pZCAqbWFzX3dhbGsoc3RydWN0IG1hX3N0YXRl ICptYXMpOw0KK3ZvaWQgKm1hc19zdG9yZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50 cnkpOw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQoraW50IG1hc19z dG9yZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnApOw0K K3ZvaWQgbWFzX3N0b3JlX3ByZWFsbG9jKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRy eSk7DQordm9pZCAqbWFzX2ZpbmQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcg bWF4KTsNCit2b2lkICptYXNfZmluZF9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgbWluKTsNCitpbnQgbWFzX3ByZWFsbG9jYXRlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2 b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCisNCitib29sIG1hc19ub21lbShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgZ2ZwX3QgZ2ZwKTsNCit2b2lkIG1hc19wYXVzZShzdHJ1Y3QgbWFfc3RhdGUgKm1h cyk7DQordm9pZCBtYXBsZV90cmVlX2luaXQodm9pZCk7DQordm9pZCBtYXNfZGVzdHJveShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcyk7DQoraW50IG1hc19leHBlY3RlZF9lbnRyaWVzKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG5yX2VudHJpZXMpOw0KKw0KK3ZvaWQgKm1hc19wcmV2 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbik7DQordm9pZCAqbWFzX25l eHQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KTsNCisNCitpbnQgbWFz X2VtcHR5X2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLCB1bnNp Z25lZCBsb25nIG1heCwNCisJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7DQorDQorLyogQ2hlY2tz IGlmIGEgbWFzIGhhcyBub3QgZm91bmQgYW55dGhpbmcgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wg bWFzX2lzX25vbmUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2Rl ID09IE1BU19OT05FOw0KK30NCisNCisvKiBDaGVja3MgaWYgYSBtYXMgaGFzIGJlZW4gcGF1c2Vk ICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19wYXVzZWQoc3RydWN0IG1hX3N0YXRlICpt YXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19QQVVTRTsNCit9DQorDQordm9pZCBt YXNfZHVwX3RyZWUoc3RydWN0IG1hX3N0YXRlICpvbGRtYXMsIHN0cnVjdCBtYV9zdGF0ZSAqbWFz KTsNCit2b2lkIG1hc19kdXBfc3RvcmUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5 KTsNCisNCisvKg0KKyAqIFRoaXMgZmluZHMgYW4gZW1wdHkgYXJlYSBmcm9tIHRoZSBoaWdoZXN0 IGFkZHJlc3MgdG8gdGhlIGxvd2VzdC4NCisgKiBBS0EgIlRvcGRvd24iIHZlcnNpb24sDQorICov DQoraW50IG1hc19lbXB0eV9hcmVhX3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg bG9uZyBtaW4sDQorCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYXgsIHVuc2lnbmVkIGxvbmcgc2l6 ZSk7DQorLyoqDQorICogbWFzX3Jlc2V0KCkgLSBSZXNldCBhIE1hcGxlIFRyZWUgb3BlcmF0aW9u IHN0YXRlLg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlLg0KKyAqDQorICog UmVzZXRzIHRoZSBlcnJvciBvciB3YWxrIHN0YXRlIG9mIHRoZSBAbWFzIHNvIGZ1dHVyZSB3YWxr cyBvZiB0aGUNCisgKiBhcnJheSB3aWxsIHN0YXJ0IGZyb20gdGhlIHJvb3QuICBVc2UgdGhpcyBp ZiB5b3UgaGF2ZSBkcm9wcGVkIHRoZQ0KKyAqIGxvY2sgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIG1h X3N0YXRlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG1hc19yZXNldChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCW1hcy0+bm9k ZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFzX2Zvcl9lYWNoKCkgLSBJdGVyYXRl IG92ZXIgYSByYW5nZSBvZiB0aGUgbWFwbGUgdHJlZS4NCisgKiBAbWFzOiBNYXBsZSBUcmVlIG9w ZXJhdGlvbiBzdGF0ZSAobWFwbGVfc3RhdGUpDQorICogQGVudHJ5OiBFbnRyeSByZXRyaWV2ZWQg ZnJvbSB0aGUgdHJlZQ0KKyAqIEBtYXg6IG1heGltdW0gaW5kZXggdG8gcmV0cmlldmUgZnJvbSB0 aGUgdHJlZQ0KKyAqDQorICogV2hlbiByZXR1cm5lZCwgbWFzLT5pbmRleCBhbmQgbWFzLT5sYXN0 IHdpbGwgaG9sZCB0aGUgZW50aXJlIHJhbmdlIGZvciB0aGUNCisgKiBlbnRyeS4NCisgKg0KKyAq IE5vdGU6IG1heSByZXR1cm4gdGhlIHplcm8gZW50cnkuDQorICoNCisgKi8NCisjZGVmaW5lIG1h c19mb3JfZWFjaChfX21hcywgX19lbnRyeSwgX19tYXgpIFwNCisJd2hpbGUgKCgoX19lbnRyeSkg PSBtYXNfZmluZCgoX19tYXMpLCAoX19tYXgpKSkgIT0gTlVMTCkNCisNCisNCisvKioNCisgKiBt YXNfc2V0X3JhbmdlKCkgLSBTZXQgdXAgTWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUgZm9yIGEg ZGlmZmVyZW50IGluZGV4Lg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlLg0K KyAqIEBzdGFydDogTmV3IHN0YXJ0IG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVlLg0KKyAqIEBs YXN0OiBOZXcgZW5kIG9mIHJhbmdlIGluIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQorICogTW92ZSB0 aGUgb3BlcmF0aW9uIHN0YXRlIHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IHJhbmdlLiAgVGhpcyB3 aWxsDQorICogaGF2ZSB0aGUgZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9tIHRoZSB0b3A7 IHNlZSBtYXNfbmV4dCgpDQorICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRleC4NCisgKi8N CitzdGF0aWMgaW5saW5lDQordm9pZCBtYXNfc2V0X3JhbmdlKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxhc3QpDQorew0KKwkgICAgICAg bWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkgICAgICAgbWFzLT5sYXN0ID0gbGFzdDsNCisJICAgICAg IG1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCit9DQorDQorLyoqDQorICogbWFzX3NldCgpIC0gU2V0 IHVwIE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVudCBpbmRleC4NCisg KiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAaW5kZXg6IE5ldyBpbmRl eCBpbnRvIHRoZSBNYXBsZSBUcmVlLg0KKyAqDQorICogTW92ZSB0aGUgb3BlcmF0aW9uIHN0YXRl IHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IGluZGV4LiAgVGhpcyB3aWxsDQorICogaGF2ZSB0aGUg ZWZmZWN0IG9mIHN0YXJ0aW5nIGEgd2FsayBmcm9tIHRoZSB0b3A7IHNlZSBtYXNfbmV4dCgpDQor ICogdG8gbW92ZSB0byBhbiBhZGphY2VudCBpbmRleC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX3NldChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7 DQorDQorCW1hc19zZXRfcmFuZ2UobWFzLCBpbmRleCwgaW5kZXgpOw0KK30NCisNCitzdGF0aWMg aW5saW5lIGJvb2wgbXRfZXh0ZXJuYWxfbG9jayhjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQp DQorew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0xPQ0tfTUFTSykgPT0gTVRf RkxBR1NfTE9DS19FWFRFUk47DQorfQ0KKw0KKy8qKg0KKyAqIG10X2luaXRfZmxhZ3MoKSAtIElu aXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJlZSB3aXRoIGZsYWdzLg0KKyAqIEBtdDogTWFwbGUg VHJlZQ0KKyAqIEBmbGFnczogbWFwbGUgdHJlZSBmbGFncy4NCisgKg0KKyAqIElmIHlvdSBuZWVk IHRvIGluaXRpYWxpc2UgYSBNYXBsZSBUcmVlIHdpdGggc3BlY2lhbCBmbGFncyAoZWcsIGFuDQor ICogYWxsb2NhdGlvbiB0cmVlKSwgdXNlIHRoaXMgZnVuY3Rpb24uDQorICoNCisgKiBDb250ZXh0 OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfaW5pdF9mbGFncyhz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGludCBmbGFncykNCit7DQorCW10LT5tYV9m bGFncyA9IGZsYWdzOw0KKwlpZiAoIW10X2V4dGVybmFsX2xvY2sobXQpKQ0KKwkJc3Bpbl9sb2Nr X2luaXQoJm10LT5tYV9sb2NrKTsNCisJcmN1X2Fzc2lnbl9wb2ludGVyKG10LT5tYV9yb290LCBO VUxMKTsNCit9DQorDQorLyoqDQorICogbXRfaW5pdCgpIC0gSW5pdGlhbGlzZSBhbiBlbXB0eSBt YXBsZSB0cmVlLg0KKyAqIEBtdDogTWFwbGUgVHJlZQ0KKyAqDQorICogQW4gZW1wdHkgTWFwbGUg VHJlZS4NCisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtdF9pbml0KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCW10X2luaXRfZmxh Z3MobXQsIDApOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRfaW5fcmN1KHN0cnVjdCBt YXBsZV90cmVlICptdCkNCit7DQorI2lmZGVmIENPTkZJR19NQVBMRV9SQ1VfRElTQUJMRUQNCisJ cmV0dXJuIGZhbHNlOw0KKyNlbmRpZg0KKwlyZXR1cm4gbXQtPm1hX2ZsYWdzICYgTVRfRkxBR1Nf VVNFX1JDVTsNCit9DQorDQorLyoqDQorICogbXRfY2xlYXJfaW5fcmN1KCkgLSBTd2l0Y2ggdGhl IHRyZWUgdG8gbm9uLVJDVSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxlIFRyZWUNCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbXRfY2xlYXJfaW5fcmN1KHN0cnVjdCBtYXBsZV90cmVlICptdCkN Cit7DQorCWlmICghbXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJaWYgKG10X2V4dGVy bmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZChtdCkpOw0KKwkJbXQt Pm1hX2ZsYWdzICY9IH5NVF9GTEFHU19VU0VfUkNVOw0KKwl9IGVsc2Ugew0KKwkJbXRyZWVfbG9j ayhtdCk7DQorCQltdC0+bWFfZmxhZ3MgJj0gfk1UX0ZMQUdTX1VTRV9SQ1U7DQorCQltdHJlZV91 bmxvY2sobXQpOw0KKwl9DQorfQ0KKw0KKy8qKg0KKyAqIG10X3NldF9pbl9yY3UoKSAtIFN3aXRj aCB0aGUgdHJlZSB0byBSQ1Ugc2FmZSBtb2RlLg0KKyAqIEBtdDogVGhlIE1hcGxlIFRyZWUNCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfc2V0X2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAq bXQpDQorew0KKwlpZiAobXRfaW5fcmN1KG10KSkNCisJCXJldHVybjsNCisNCisJaWYgKG10X2V4 dGVybmFsX2xvY2sobXQpKSB7DQorCQlCVUdfT04oIW10X2xvY2tfaXNfaGVsZChtdCkpOw0KKwkJ bXQtPm1hX2ZsYWdzIHw9IE1UX0ZMQUdTX1VTRV9SQ1U7DQorCX0gZWxzZSB7DQorCQltdHJlZV9s b2NrKG10KTsNCisJCW10LT5tYV9mbGFncyB8PSBNVF9GTEFHU19VU0VfUkNVOw0KKwkJbXRyZWVf dW5sb2NrKG10KTsNCisJfQ0KK30NCisNCit2b2lkICptdF9maW5kKHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KTsNCit2b2lkICpt dF9maW5kX2FmdGVyKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgs DQorCQkgICAgdW5zaWduZWQgbG9uZyBtYXgpOw0KK3ZvaWQgKm10X3ByZXYoc3RydWN0IG1hcGxl X3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCAgdW5zaWduZWQgbG9uZyBtaW4pOw0KK3Zv aWQgKm10X25leHQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCB1 bnNpZ25lZCBsb25nIG1heCk7DQorDQorLyoqDQorICogbXRfZm9yX2VhY2ggLSBJdGVyYXRlIG92 ZXIgZWFjaCBlbnRyeSBzdGFydGluZyBhdCBpbmRleCB1bnRpbCBtYXguDQorICogQHRyZWU6IFRo ZSBNYXBsZSBUcmVlDQorICogQGVudHJ5OiBUaGUgY3VycmVudCBlbnRyeQ0KKyAqIEBpbmRleDog VGhlIGluZGV4IHRvIHVwZGF0ZSB0byB0cmFjayB0aGUgbG9jYXRpb24gaW4gdGhlIHRyZWUNCisg KiBAbWF4OiBUaGUgbWF4aW11bSBsaW1pdCBmb3IgQGluZGV4DQorICoNCisgKiBOb3RlOiBXaWxs IG5vdCByZXR1cm4gdGhlIHplcm8gZW50cnkuDQorICovDQorI2RlZmluZSBtdF9mb3JfZWFjaChf X3RyZWUsIF9fZW50cnksIF9faW5kZXgsIF9fbWF4KSBcDQorCWZvciAoX19lbnRyeSA9IG10X2Zp bmQoX190cmVlLCAmKF9faW5kZXgpLCBfX21heCk7IFwNCisJCV9fZW50cnk7IF9fZW50cnkgPSBt dF9maW5kX2FmdGVyKF9fdHJlZSwgJihfX2luZGV4KSwgX19tYXgpKQ0KKw0KKw0KKyNpZmRlZiBD T05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KK2V4dGVybiBhdG9taWNfdCBtYXBsZV90cmVlX3Rlc3Rz X3J1bjsNCitleHRlcm4gYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19wYXNzZWQ7DQorDQordm9p ZCBtdF9kdW1wKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCk7DQordm9pZCBtdF92YWxpZGF0 ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KKyNkZWZpbmUgTVRfQlVHX09OKF9fdHJlZSwgX194 KSBkbyB7CQkJCQlcDQorCWF0b21pY19pbmMoJm1hcGxlX3RyZWVfdGVzdHNfcnVuKTsJCQkJXA0K KwlpZiAoX194KSB7CQkJCQkJCVwNCisJCXByX2luZm8oIkJVRyBhdCAlczolZCAoJXUpXG4iLAkJ CQlcDQorCQlfX2Z1bmNfXywgX19MSU5FX18sIF9feCk7CQkJCVwNCisJCW10X2R1bXAoX190cmVl KTsJCQkJCVwNCisJCXByX2luZm8oIlBhc3M6ICV1IFJ1bjoldVxuIiwJCQkJXA0KKwkJCWF0b21p Y19yZWFkKCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCksCQlcDQorCQkJYXRvbWljX3JlYWQoJm1h cGxlX3RyZWVfdGVzdHNfcnVuKSk7CQlcDQorCQlkdW1wX3N0YWNrKCk7CQkJCQkJXA0KKwl9IGVs c2UgewkJCQkJCQlcDQorCQlhdG9taWNfaW5jKCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCk7CQkJ XA0KKwl9CQkJCQkJCQlcDQorfSB3aGlsZSAoMCkNCisjZWxzZQ0KKyNkZWZpbmUgTVRfQlVHX09O KF9fdHJlZSwgX194KSBCVUdfT04oX194KQ0KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfTUFQTEVf VFJFRSAqLw0KKw0KKyNlbmRpZiAvKl9MSU5VWF9NQVBMRV9UUkVFX0ggKi8NCmRpZmYgLS1naXQg YS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50 cy9tYXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAu LjJiZTQwM2JkYzJiZA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMv bWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDEyMyBAQA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wICovDQorI3VuZGVmIFRSQUNFX1NZU1RFTQ0KKyNkZWZpbmUgVFJBQ0VfU1lT VEVNIG1hcGxlX3RyZWUNCisNCisjaWYgIWRlZmluZWQoX1RSQUNFX01NX0gpIHx8IGRlZmluZWQo VFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpDQorI2RlZmluZSBfVFJBQ0VfTU1fSA0KKw0KKw0KKyNp bmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+DQorDQorc3RydWN0IG1hX3N0YXRlOw0KKw0KK1RS QUNFX0VWRU5UKG1hX29wLA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1h X3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2Vu dHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVk IGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxk KHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkN CisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQor CQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJ CV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmlu ZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJ CT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9wcmludGsoIiVzXHROb2RlOiAlcCAoJWx1ICVs dSkgcmFuZ2U6ICVsdS0lbHUiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19l bnRyeS0+bm9kZSwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVu c2lnbmVkIGxvbmcpIF9fZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnkt PmluZGV4LA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdA0KKwkpDQorKQ0KK1RS QUNFX0VWRU5UKG1hX3JlYWQsDQorDQorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3Qg bWFfc3RhdGUgKm1hcyksDQorDQorCVRQX0FSR1MoZm4sIG1hcyksDQorDQorCVRQX1NUUlVDVF9f ZW50cnkoDQorCQkJX19maWVsZChjb25zdCBjaGFyICosIGZuKQ0KKwkJCV9fZmllbGQodW5zaWdu ZWQgbG9uZywgbWluKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbWF4KQ0KKwkJCV9fZmll bGQodW5zaWduZWQgbG9uZywgaW5kZXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBsYXN0 KQ0KKwkJCV9fZmllbGQodm9pZCAqLCBub2RlKQ0KKwkpLA0KKw0KKwlUUF9mYXN0X2Fzc2lnbigN CisJCQlfX2VudHJ5LT5mbgkJPSBmbjsNCisJCQlfX2VudHJ5LT5taW4JCT0gbWFzLT5taW47DQor CQkJX19lbnRyeS0+bWF4CQk9IG1hcy0+bWF4Ow0KKwkJCV9fZW50cnktPmluZGV4CQk9IG1hcy0+ aW5kZXg7DQorCQkJX19lbnRyeS0+bGFzdAkJPSBtYXMtPmxhc3Q7DQorCQkJX19lbnRyeS0+bm9k ZQkJPSBtYXMtPm5vZGU7DQorCSksDQorDQorCVRQX3ByaW50aygiJXNcdE5vZGU6ICVwICglbHUg JWx1KSByYW5nZTogJWx1LSVsdSIsDQorCQkgIF9fZW50cnktPmZuLA0KKwkJICAodm9pZCAqKSBf X2VudHJ5LT5ub2RlLA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWluLA0KKwkJICAo dW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWF4LA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRy eS0+aW5kZXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5sYXN0DQorCSkNCispDQor DQorVFJBQ0VfRVZFTlQobWFfd3JpdGUsDQorDQorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmZuLCBz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBwaXYsDQorCQkgdm9pZCAqdmFsKSwN CisNCisJVFBfQVJHUyhmbiwgbWFzLCBwaXYsIHZhbCksDQorDQorCVRQX1NUUlVDVF9fZW50cnko DQorCQkJX19maWVsZChjb25zdCBjaGFyICosIGZuKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9u ZywgbWluKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbWF4KQ0KKwkJCV9fZmllbGQodW5z aWduZWQgbG9uZywgaW5kZXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBsYXN0KQ0KKwkJ CV9fZmllbGQodW5zaWduZWQgbG9uZywgcGl2KQ0KKwkJCV9fZmllbGQodm9pZCAqLCB2YWwpDQor CQkJX19maWVsZCh2b2lkICosIG5vZGUpDQorCSksDQorDQorCVRQX2Zhc3RfYXNzaWduKA0KKwkJ CV9fZW50cnktPmZuCQk9IGZuOw0KKwkJCV9fZW50cnktPm1pbgkJPSBtYXMtPm1pbjsNCisJCQlf X2VudHJ5LT5tYXgJCT0gbWFzLT5tYXg7DQorCQkJX19lbnRyeS0+aW5kZXgJCT0gbWFzLT5pbmRl eDsNCisJCQlfX2VudHJ5LT5sYXN0CQk9IG1hcy0+bGFzdDsNCisJCQlfX2VudHJ5LT5waXYJCT0g cGl2Ow0KKwkJCV9fZW50cnktPnZhbAkJPSB2YWw7DQorCQkJX19lbnRyeS0+bm9kZQkJPSBtYXMt Pm5vZGU7DQorCSksDQorDQorCVRQX3ByaW50aygiJXNcdE5vZGUgJXAgKCVsdSAlbHUpIHJhbmdl OiVsdS0lbHUgcGl2ICglbHUpIHZhbCAlcCIsDQorCQkgIF9fZW50cnktPmZuLA0KKwkJICAodm9p ZCAqKSBfX2VudHJ5LT5ub2RlLA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWluLA0K KwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWF4LA0KKwkJICAodW5zaWduZWQgbG9uZykg X19lbnRyeS0+aW5kZXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5sYXN0LA0KKwkJ ICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+cGl2LA0KKwkJICAodm9pZCAqKSBfX2VudHJ5LT52 YWwNCisJKQ0KKykNCisjZW5kaWYgLyogX1RSQUNFX01NX0ggKi8NCisNCisvKiBUaGlzIHBhcnQg bXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8NCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3Ry YWNlLmg+DQpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYw0KaW5kZXggMGVl MzljZGNmY2FjLi4xZWRiMWJmZWM2NDAgMTAwNjQ0DQotLS0gYS9pbml0L21haW4uYw0KKysrIGIv aW5pdC9tYWluLmMNCkBAIC0xMTYsNiArMTE2LDcgQEAgc3RhdGljIGludCBrZXJuZWxfaW5pdCh2 b2lkICopOw0KIA0KIGV4dGVybiB2b2lkIGluaXRfSVJRKHZvaWQpOw0KIGV4dGVybiB2b2lkIHJh ZGl4X3RyZWVfaW5pdCh2b2lkKTsNCitleHRlcm4gdm9pZCBtYXBsZV90cmVlX2luaXQodm9pZCk7 DQogDQogLyoNCiAgKiBEZWJ1ZyBoZWxwZXI6IHZpYSB0aGlzIGZsYWcgd2Uga25vdyB0aGF0IHdl IGFyZSBpbiAnZWFybHkgYm9vdHVwIGNvZGUnDQpAQCAtMTAwMSw2ICsxMDAyLDcgQEAgYXNtbGlu a2FnZSBfX3Zpc2libGUgdm9pZCBfX2luaXQgX19ub19zYW5pdGl6ZV9hZGRyZXNzIHN0YXJ0X2tl cm5lbCh2b2lkKQ0KIAkJICJJbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCAqdmVyeSogZWFybHksIGZp eGluZyBpdFxuIikpDQogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOw0KIAlyYWRpeF90cmVlX2luaXQo KTsNCisJbWFwbGVfdHJlZV9pbml0KCk7DQogDQogCS8qDQogCSAqIFNldCB1cCBob3VzZWtlZXBp bmcgYmVmb3JlIHNldHRpbmcgdXAgd29ya3F1ZXVlcyB0byBhbGxvdyB0aGUgdW5ib3VuZA0KZGlm ZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcNCmluZGV4IDJl MjRkYjRiZmYxOS4uMDVjMzg1OGNkZjQxIDEwMDY0NA0KLS0tIGEvbGliL0tjb25maWcuZGVidWcN CisrKyBiL2xpYi9LY29uZmlnLmRlYnVnDQpAQCAtODEyLDYgKzgxMiwxMyBAQCBjb25maWcgREVC VUdfVk1fVk1BQ0FDSEUNCiAJICBjYW4gY2F1c2Ugc2lnbmlmaWNhbnQgb3ZlcmhlYWQsIHNvIG9u bHkgZW5hYmxlIGl0IGluIG5vbi1wcm9kdWN0aW9uDQogCSAgZW52aXJvbm1lbnRzLg0KIA0KK2Nv bmZpZyBERUJVR19WTV9NQVBMRV9UUkVFDQorCWJvb2wgIkRlYnVnIFZNIG1hcGxlIHRyZWVzIg0K KwlkZXBlbmRzIG9uIERFQlVHX1ZNDQorCXNlbGVjdCBERUJVR19NQVBMRV9UUkVFDQorCWhlbHAN CisJICBFbmFibGUgVk0gbWFwbGUgdHJlZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJh IHZhbGlkYXRpb25zLg0KKw0KIAkgIElmIHVuc3VyZSwgc2F5IE4uDQogDQogY29uZmlnIERFQlVH X1ZNX1JCDQpAQCAtMTYyNyw2ICsxNjM0LDE0IEBAIGNvbmZpZyBCVUdfT05fREFUQV9DT1JSVVBU SU9ODQogDQogCSAgSWYgdW5zdXJlLCBzYXkgTi4NCiANCitjb25maWcgREVCVUdfTUFQTEVfVFJF RQ0KKwlib29sICJEZWJ1ZyBtYXBsZSB0cmVlcyINCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwN CisJaGVscA0KKwkgIEVuYWJsZSBtYXBsZSB0cmVlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQg ZXh0cmEgdmFsaWRhdGlvbnMuDQorDQorCSAgSWYgdW5zdXJlLCBzYXkgTi4NCisNCiBlbmRtZW51 DQogDQogY29uZmlnIERFQlVHX0NSRURFTlRJQUxTDQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxl IGIvbGliL01ha2VmaWxlDQppbmRleCBlYTU0Mjk0ZDczYmYuLjQ1ZGQ2YjZlNDMyNSAxMDA2NDQN Ci0tLSBhL2xpYi9NYWtlZmlsZQ0KKysrIGIvbGliL01ha2VmaWxlDQpAQCAtMjksNyArMjksOCBA QCBlbmRpZg0KIA0KIGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNwcmludGYubyBjbWRsaW5l Lm8gXA0KIAkgcmJ0cmVlLm8gcmFkaXgtdHJlZS5vIHRpbWVycXVldWUubyB4YXJyYXkubyBcDQot CSBpZHIubyBleHRhYmxlLm8gc2hhMS5vIGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwNCisJIG1h cGxlX3RyZWUubyBpZHIubyBleHRhYmxlLm8gXA0KKwkgc2hhMS5vIGlycV9yZWdzLm8gYXJndl9z cGxpdC5vIFwNCiAJIGZsZXhfcHJvcG9ydGlvbnMubyByYXRlbGltaXQubyBzaG93X21lbS5vIFwN CiAJIGlzX3NpbmdsZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5vIGtvYmplY3RfdWV2 ZW50Lm8gXA0KIAkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIHNpcGhhc2gubyBkZWNfYW5kX2xvY2su byBcDQpkaWZmIC0tZ2l0IGEvbGliL21hcGxlX3RyZWUuYyBiL2xpYi9tYXBsZV90cmVlLmMNCm5l dyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjFiODEzMGYxOWMyZQ0KLS0t IC9kZXYvbnVsbA0KKysrIGIvbGliL21hcGxlX3RyZWUuYw0KQEAgLTAsMCArMSw3MTAyIEBADQor Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArDQorLyoNCisgKiBNYXBsZSBUcmVl IGltcGxlbWVudGF0aW9uDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlIENvcnBv cmF0aW9uDQorICogQXV0aG9yczogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xl LmNvbT4NCisgKgkgICAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQorICov DQorDQorLyoNCisgKiBET0M6IEludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2Yg dGhlIE1hcGxlIFRyZWUNCisgKg0KKyAqIEVhY2ggbm9kZSB0eXBlIGhhcyBhIG51bWJlciBvZiBz bG90cyBmb3IgZW50cmllcyBhbmQgYSBudW1iZXIgb2Ygc2xvdHMgZm9yDQorICogcGl2b3RzLiAg SW4gdGhlIGNhc2Ugb2YgZGVuc2Ugbm9kZXMsIHRoZSBwaXZvdHMgYXJlIGltcGxpZWQgYnkgdGhl IHBvc2l0aW9uDQorICogYW5kIGFyZSBzaW1wbHkgdGhlIHNsb3QgaW5kZXggKyB0aGUgbWluaW11 bSBvZiB0aGUgbm9kZS4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMg YXJlIGNhbGxlZCBrZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRl IHRoYXQgdGhlIHRyZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBp biB0aGUNCisgKiBzdWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdo ZXJlIGFzIGtleXMgYXJlIHVuaXF1ZSB0byBhDQorICogc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBC LXRyZWUuICBQaXZvdCB2YWx1ZXMgYXJlIGluY2x1c2l2ZSBvZiB0aGUgc2xvdCB3aXRoDQorICog dGhlIHNhbWUgaW5kZXguDQorICoNCisgKg0KKyAqIFRoZSBmb2xsb3dpbmcgaWxsdXN0cmF0ZXMg dGhlIGxheW91dCBvZiBhIHJhbmdlNjQgbm9kZXMgc2xvdHMgYW5kIHBpdm90cy4NCisgKg0KKyAq DQorICogIFNsb3RzIC0+IHwgMCB8IDEgfCAyIHwgLi4uIHwgMTIgfCAxMyB8IDE0IHwgMTUgfA0K KyAqICAgICAgICAgICDilKwgICDilKwgICDilKwgICDilKwgICAgIOKUrCAgICDilKwgICAg4pSs ICAgIOKUrCAgICDilKwNCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDi lIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSAIEltcGxpZWQgbWF4aW11bQ0KKyAqICAg ICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKU lOKUgCBQaXZvdCAxNA0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKU giAgICDilIIgICAg4pSU4pSAIFBpdm90IDEzDQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKU giAgIOKUgiAgICAg4pSCICAgIOKUlOKUgCBQaXZvdCAxMg0KKyAqICAgICAgICAgICDilIIgICDi lIIgICDilIIgICDilIIgICAgIOKUlOKUgCBQaXZvdCAxMQ0KKyAqICAgICAgICAgICDilIIgICDi lIIgICDilIIgICDilJTilIAgUGl2b3QgMg0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilJTi lIAgUGl2b3QgMQ0KKyAqICAgICAgICAgICDilIIgICDilJTilIAgUGl2b3QgMA0KKyAqICAgICAg ICAgICDilJTilIAgIEltcGxpZWQgbWluaW11bQ0KKyAqDQorICogU2xvdCBjb250ZW50czoNCisg KiAgSW50ZXJuYWwgKG5vbi1sZWFmKSBub2RlcyBjb250YWluIHBvaW50ZXJzIHRvIG90aGVyIG5v ZGVzLg0KKyAqICBMZWFmIG5vZGVzIGNvbnRhaW4gZW50cmllcy4NCisgKg0KKyAqIFRoZSBsb2Nh dGlvbiBvZiBpbnRlcmVzdCBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhbiBvZmZzZXQuICBBbGwg b2Zmc2V0cyBoYXZlDQorICogYSBzbG90LCBidXQgdGhlIGxhc3Qgb2Zmc2V0IGhhcyBhbiBpbXBs aWVkIHBpdm90IGZyb20gdGhlIG5vZGUgYWJvdmUgKG9yDQorICogVUlOVF9NQVggZm9yIHRoZSBy b290IG5vZGUuDQorICoNCisgKiBSYW5nZXMgY29tcGxpY2F0ZSBjZXJ0YWluIHdyaXRlIGFjdGl2 aXRpZXMuICBXaGVuIG1vZGlmeWluZyBhbnkgb2YNCisgKiB0aGUgQi10cmVlIHZhcmlhbnRzLCBp dCBpcyBrbm93biB0aGF0IG9uZSBlbnRyeSB3aWxsIGVpdGhlciBiZSBhZGRlZCBvcg0KKyAqIGRl bGV0ZWQuICBXaGVuIG1vZGlmeWluZyB0aGUgTWFwbGUgVHJlZSwgb25lIHN0b3JlIG9wZXJhdGlv biBtYXkgb3ZlcndyaXRlDQorICogdGhlIGVudGlyZSBkYXRhIHNldCwgb3Igb25lIGhhbGYgb2Yg dGhlIHRyZWUsIG9yIHRoZSBtaWRkbGUgaGFsZiBvZiB0aGUgdHJlZS4NCisgKg0KKyAqLw0KKw0K Kw0KKyNpbmNsdWRlIDxsaW51eC9tYXBsZV90cmVlLmg+DQorI2luY2x1ZGUgPGxpbnV4L3hhcnJh eS5oPg0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQu aD4NCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4N CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4NCisNCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lO VFMNCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaD4NCisNCisjZGVmaW5lIE1B X1JPT1RfUEFSRU5UIDENCisNCisvKiBNYXBsZSBzdGF0ZSBmbGFncyAqLw0KKyNkZWZpbmUgTUFf U1RBVEVfQlVMSwkJMQ0KKyNkZWZpbmUgTUFfU1RBVEVfUkVCQUxBTkNFCTINCisNCisjZGVmaW5l IG1hX3BhcmVudF9wdHIoeCkgKChzdHJ1Y3QgbWFwbGVfcG5vZGUgKikoeCkpDQorI2RlZmluZSBt YV9tbm9kZV9wdHIoeCkgKChzdHJ1Y3QgbWFwbGVfbm9kZSAqKSh4KSkNCisjZGVmaW5lIG1hX2Vu b2RlX3B0cih4KSAoKHN0cnVjdCBtYXBsZV9lbm9kZSAqKSh4KSkNCitzdGF0aWMgc3RydWN0IGtt ZW1fY2FjaGUgKm1hcGxlX25vZGVfY2FjaGU7DQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBM RV9UUkVFDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbXRfbWF4W10gPSB7DQorCVttYXBs ZV9kZW5zZV0JCT0gTUFQTEVfTk9ERV9TTE9UUywNCisJW21hcGxlX2xlYWZfNjRdCQk9IFVMT05H X01BWCwNCisJW21hcGxlX3JhbmdlXzY0XQk9IFVMT05HX01BWCwNCisJW21hcGxlX2FyYW5nZV82 NF0JPSBVTE9OR19NQVgsDQorfTsNCisjZGVmaW5lIG10X25vZGVfbWF4KHgpIG10X21heFttdGVf bm9kZV90eXBlKHgpXQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG10 X3Nsb3RzW10gPSB7DQorCVttYXBsZV9kZW5zZV0JCT0gTUFQTEVfTk9ERV9TTE9UUywNCisJW21h cGxlX2xlYWZfNjRdCQk9IE1BUExFX1JBTkdFNjRfU0xPVFMsDQorCVttYXBsZV9yYW5nZV82NF0J PSBNQVBMRV9SQU5HRTY0X1NMT1RTLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IE1BUExFX0FSQU5H RTY0X1NMT1RTLA0KK307DQorI2RlZmluZSBtdF9zbG90X2NvdW50KHgpIG10X3Nsb3RzW210ZV9u b2RlX3R5cGUoeCldDQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXRfcGl2b3RzW10g PSB7DQorCVttYXBsZV9kZW5zZV0JCT0gMCwNCisJW21hcGxlX2xlYWZfNjRdCQk9IE1BUExFX1JB TkdFNjRfU0xPVFMgLSAxLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gTUFQTEVfUkFOR0U2NF9TTE9U UyAtIDEsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0gTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxLA0K K307DQorI2RlZmluZSBtdF9waXZvdF9jb3VudCh4KSBtdF9waXZvdHNbbXRlX25vZGVfdHlwZSh4 KV0NCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdF9taW5fc2xvdHNbXSA9IHsNCisJ W21hcGxlX2RlbnNlXQkJPSBNQVBMRV9OT0RFX1NMT1RTIC8gMiwNCisJW21hcGxlX2xlYWZfNjRd CQk9IChNQVBMRV9SQU5HRTY0X1NMT1RTIC8gMikgLSAyLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0g KE1BUExFX1JBTkdFNjRfU0xPVFMgLyAyKSAtIDIsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0gKE1B UExFX0FSQU5HRTY0X1NMT1RTIC8gMikgLSAxLA0KK307DQorI2RlZmluZSBtdF9taW5fc2xvdF9j b3VudCh4KSBtdF9taW5fc2xvdHNbbXRlX25vZGVfdHlwZSh4KV0NCisNCisjZGVmaW5lIE1BUExF X0JJR19OT0RFX1NMT1RTCShNQVBMRV9SQU5HRTY0X1NMT1RTICogMiArIDIpDQorI2RlZmluZSBN QVBMRV9CSUdfTk9ERV9HQVBTCShNQVBMRV9BUkFOR0U2NF9TTE9UUyAqIDIgKyAxKQ0KKw0KK3N0 cnVjdCBtYXBsZV9iaWdfbm9kZSB7DQorCXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwl1 bnNpZ25lZCBsb25nIHBpdm90W01BUExFX0JJR19OT0RFX1NMT1RTIC0gMV07DQorCXVuaW9uIHsN CisJCXN0cnVjdCBtYXBsZV9lbm9kZSAqc2xvdFtNQVBMRV9CSUdfTk9ERV9TTE9UU107DQorCQlz dHJ1Y3Qgew0KKwkJCXVuc2lnbmVkIGxvbmcgcGFkZGluZ1tNQVBMRV9CSUdfTk9ERV9HQVBTXTsN CisJCQl1bnNpZ25lZCBsb25nIGdhcFtNQVBMRV9CSUdfTk9ERV9HQVBTXTsNCisJCX07DQorCX07 DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQ7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KK307DQor DQorLyoNCisgKiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZSBpcyB1c2VkIHRvIGJ1aWxkIGEgdHJl ZSB0byByZXBsYWNlIGEgc2VnbWVudCBvZiBhbg0KKyAqIGV4aXN0aW5nIHRyZWUgaW4gYSBtb3Jl IGF0b21pYyB3YXkuICBBbnkgd2Fsa2VycyBvZiB0aGUgb2xkZXIgdHJlZSB3aWxsIGhpdCBhDQor ICogZGVhZCBub2RlIGFuZCByZXN0YXJ0IG9uIHVwZGF0ZXMuDQorICovDQorc3RydWN0IG1hcGxl X3N1YnRyZWVfc3RhdGUgew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm9yaWdfbDsJLyogT3JpZ2luYWwg bGVmdCBzaWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICpvcmlnX3I7CS8qIE9y aWdpbmFsIHJpZ2h0IHNpZGUgb2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKmw7CQkv KiBOZXcgbGVmdCBzaWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICptOwkJLyog TmV3IG1pZGRsZSBvZiBzdWJ0cmVlIChyYXJlKSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKnI7CQkv KiBOZXcgcmlnaHQgc2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV90b3BpYXJ5ICpmcmVl OwkvKiBub2RlcyB0byBiZSBmcmVlZCAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFyeSAqZGVzdHJveTsJ LyogTm9kZXMgdG8gYmUgZGVzdHJveWVkICh3YWxrZWQgYW5kIGZyZWVkKSAqLw0KKwlzdHJ1Y3Qg bWFwbGVfYmlnX25vZGUgKmJuOw0KK307DQorDQorLyogRnVuY3Rpb25zICovDQorc3RhdGljIGlu bGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbXRfYWxsb2Nfb25lKGdmcF90IGdmcCkNCit7DQorCXJl dHVybiBrbWVtX2NhY2hlX2FsbG9jKG1hcGxlX25vZGVfY2FjaGUsIGdmcCB8IF9fR0ZQX1pFUk8p Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGludCBtdF9hbGxvY19idWxrKGdmcF90IGdmcCwgc2l6 ZV90IHNpemUsIHZvaWQgKipub2RlcykNCit7DQorCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX2J1 bGsobWFwbGVfbm9kZV9jYWNoZSwgZ2ZwIHwgX19HRlBfWkVSTywgc2l6ZSwNCisJCQkJICAgICBu b2Rlcyk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdF9mcmVlX2J1bGsoc2l6ZV90IHNp emUsIHZvaWQgX19yY3UgKipub2RlcykNCit7DQorCWttZW1fY2FjaGVfZnJlZV9idWxrKG1hcGxl X25vZGVfY2FjaGUsIHNpemUsICh2b2lkICoqKW5vZGVzKTsNCit9DQorDQorc3RhdGljIHZvaWQg bXRfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25v ZGUgKm5vZGUgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG1hcGxlX25vZGUsIHJjdSk7DQor DQorCWttZW1fY2FjaGVfZnJlZShtYXBsZV9ub2RlX2NhY2hlLCBub2RlKTsNCit9DQorDQorLyoN CisgKiBtYV9mcmVlX3JjdSgpIC0gVXNlIHJjdSBjYWxsYmFjayB0byBmcmVlIGEgbWFwbGUgbm9k ZQ0KKyAqIEBub2RlOiBUaGUgbm9kZSB0byBmcmVlDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSB1 c2VzIHRoZSBwYXJlbnQgcG9pbnRlciB0byBpbmRpY2F0ZSB0aGlzIG5vZGUgaXMgbm8gbG9uZ2Vy IGluDQorICogdXNlIGFuZCB3aWxsIGJlIGZyZWVkLg0KKyAqLw0KK3N0YXRpYyB2b2lkIG1hX2Zy ZWVfcmN1KHN0cnVjdCBtYXBsZV9ub2RlICpub2RlKQ0KK3sNCisJbm9kZS0+cGFyZW50ID0gbWFf cGFyZW50X3B0cihub2RlKTsNCisJY2FsbF9yY3UoJm5vZGUtPnJjdSwgbXRfZnJlZV9yY3UpOw0K K30NCisNCitzdGF0aWMgdW5zaWduZWQgaW50IG10X2hlaWdodChjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0hFSUdIVF9N QVNLKSA+PiBNVF9GTEFHU19IRUlHSFRfT0ZGU0VUOw0KK30NCisNCitzdGF0aWMgdm9pZCBtYXNf c2V0X2hlaWdodChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGludCBuZXdf ZmxhZ3MgPSBtYXMtPnRyZWUtPm1hX2ZsYWdzOw0KKw0KKwluZXdfZmxhZ3MgJj0gfk1UX0ZMQUdT X0hFSUdIVF9NQVNLOw0KKwlCVUdfT04obWFzLT5kZXB0aCA+IE1BUExFX0hFSUdIVF9NQVgpOw0K KwluZXdfZmxhZ3MgfD0gbWFzLT5kZXB0aCA8PCBNVF9GTEFHU19IRUlHSFRfT0ZGU0VUOw0KKwlt YXMtPnRyZWUtPm1hX2ZsYWdzID0gbmV3X2ZsYWdzOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQg aW50IG1hc19tdF9oZWlnaHQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRf aGVpZ2h0KG1hcy0+dHJlZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgZW51bSBtYXBsZV90eXBl IG10ZV9ub2RlX3R5cGUoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJl dHVybiAoKHVuc2lnbmVkIGxvbmcpZW50cnkgPj4gTUFQTEVfTk9ERV9UWVBFX1NISUZUKSAmDQor CQlNQVBMRV9OT0RFX1RZUEVfTUFTSzsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lz X2RlbnNlKGNvbnN0IGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJcmV0dXJuIHR5cGUgPCBt YXBsZV9sZWFmXzY0Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFfaXNfbGVhZihjb25z dCBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXJldHVybiB0eXBlIDwgbWFwbGVfcmFuZ2Vf NjQ7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfaXNfbGVhZihjb25zdCBzdHJ1Y3Qg bWFwbGVfZW5vZGUgKmVudHJ5KQ0KK3sNCisJcmV0dXJuIG1hX2lzX2xlYWYobXRlX25vZGVfdHlw ZShlbnRyeSkpOw0KK30NCisNCisvKg0KKyAqIFdlIGFsc28gcmVzZXJ2ZSB2YWx1ZXMgd2l0aCB0 aGUgYm90dG9tIHR3byBiaXRzIHNldCB0byAnMTAnIHdoaWNoIGFyZQ0KKyAqIGJlbG93IDQwOTYN CisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbXRfaXNfcmVzZXJ2ZWQoY29uc3Qgdm9pZCAqZW50 cnkpDQorew0KKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWVudHJ5IDwgTUFQTEVfUkVTRVJWRURf UkFOR0UpICYmDQorCQl4YV9pc19pbnRlcm5hbChlbnRyeSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtYXNfc2V0X2VycihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgbG9uZyBlcnIpDQorew0K KwltYXMtPm5vZGUgPSBNQV9FUlJPUihlcnIpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wg bWFzX2lzX3B0cihzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtYXMtPm5vZGUg PT0gTUFTX1JPT1Q7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfc3RhcnQoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19TVEFSVDsN Cit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19lcnIoc3RydWN0IG1hX3N0YXRlICpt YXMpDQorew0KKwlyZXR1cm4geGFfaXNfZXJyKG1hcy0+bm9kZSk7DQorfQ0KKw0KK3N0YXRpYyBp bmxpbmUgYm9vbCBtYXNfc2VhcmNoYWJsZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlm IChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAobWFzX2lzX3B0 cihtYXMpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3Rh dGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbXRlX3RvX25vZGUoY29uc3Qgc3RydWN0IG1h cGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVybiAoc3RydWN0IG1hcGxlX25vZGUgKikoKHVu c2lnbmVkIGxvbmcpZW50cnkgJiB+TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBt dGVfdG9fbWF0KCkgLSBDb252ZXJ0IGEgbWFwbGUgZW5jb2RlZCBub2RlIHRvIGEgbWFwbGUgdG9w aWFyeSBub2RlLg0KKyAqIEBlbnRyeTogVGhlIG1hcGxlIGVuY29kZWQgbm9kZQ0KKyAqDQorICog UmV0dXJuOiBhIG1hcGxlIHRvcGlhcnkgcG9pbnRlcg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IG1hcGxlX3RvcGlhcnkgKm10ZV90b19tYXQoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpl bnRyeSkNCit7DQorCXJldHVybiAoc3RydWN0IG1hcGxlX3RvcGlhcnkgKikNCisJCSgodW5zaWdu ZWQgbG9uZyllbnRyeSAmIH5NQVBMRV9OT0RFX01BU0spOw0KK30NCisNCisvKg0KKyAqIG1hc19t bigpIC0gR2V0IHRoZSBtYXBsZSBzdGF0ZSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqDQorICogUmV0dXJuOiB0aGUgbWFwbGUgbm9kZSAobm90IGVuY29kZWQgLSBiYXJlIHBv aW50ZXIpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm1hc19tbihj b25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtdGVfdG9fbm9kZShtYXMt Pm5vZGUpOw0KK30NCisNCisvKg0KKyAqIG10ZV9zZXRfbm9kZV9kZWFkKCkgLSBTZXQgYSBtYXBs ZSBlbmNvZGVkIG5vZGUgYXMgZGVhZC4NCisgKiBAbW46IFRoZSBtYXBsZSBlbmNvZGVkIG5vZGUu DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9zZXRfbm9kZV9kZWFkKHN0cnVjdCBtYXBs ZV9lbm9kZSAqbW4pDQorew0KKwltdGVfdG9fbm9kZShtbiktPnBhcmVudCA9IG1hX3BhcmVudF9w dHIobXRlX3RvX25vZGUobW4pKTsNCisJc21wX3dtYigpOyAvKiBOZWVkZWQgZm9yIFJDVSAqLw0K K30NCisNCisvKiBCaXQgMSBpbmRpY2F0ZXMgdGhlIHJvb3QgaXMgYSBub2RlICovDQorI2RlZmlu ZSBNQVBMRV9ST09UX05PREUJCQkweDAyDQorLyogbWFwbGVfdHlwZSBzdG9yZWQgYml0IDMtNiAq Lw0KKyNkZWZpbmUgTUFQTEVfRU5PREVfVFlQRV9TSElGVAkJMHgwMw0KKy8qIEJpdCAyIG1lYW5z IGEgTlVMTCBzb21ld2hlcmUgYmVsb3cgKi8NCisjZGVmaW5lIE1BUExFX0VOT0RFX05VTEwJCTB4 MDQNCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbXRfbWtfbm9kZShjb25z dCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJCSAgICAgZW51bSBtYXBsZV90eXBlIHR5 cGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSB8DQorCQkJKHR5 cGUgPDwgTUFQTEVfRU5PREVfVFlQRV9TSElGVCkgfCBNQVBMRV9FTk9ERV9OVUxMKTsNCit9DQor DQorc3RhdGljIGlubGluZSB2b2lkICptdGVfbWtfcm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSB8IE1B UExFX1JPT1RfTk9ERSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRlX3NhZmVfcm9v dChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKiko KHVuc2lnbmVkIGxvbmcpbm9kZSAmIH5NQVBMRV9ST09UX05PREUpOw0KK30NCisNCitzdGF0aWMg aW5saW5lIHZvaWQgbXRlX3NldF9mdWxsKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkN Cit7DQorCW5vZGUgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylub2RlICYgfk1BUExFX0VOT0RF X05VTEwpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX2NsZWFyX2Z1bGwoY29uc3Qg c3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJbm9kZSA9ICh2b2lkICopKCh1bnNpZ25l ZCBsb25nKW5vZGUgfCBNQVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQorc3RhdGljIGlubGluZSBi b29sIG1hX2lzX3Jvb3Qoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKCh1 bnNpZ25lZCBsb25nKW5vZGUtPnBhcmVudCAmIE1BX1JPT1RfUEFSRU5UKTsNCit9DQorDQorc3Rh dGljIGlubGluZSBib29sIG10ZV9pc19yb290KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9k ZSkNCit7DQorCXJldHVybiBtYV9pc19yb290KG10ZV90b19ub2RlKG5vZGUpKTsNCit9DQorDQor c3RhdGljIGlubGluZSBib29sIG1hc19pc19yb290X2xpbWl0cyhjb25zdCBzdHJ1Y3QgbWFfc3Rh dGUgKm1hcykNCit7DQorCXJldHVybiAhbWFzLT5taW4gJiYgbWFzLT5tYXggPT0gVUxPTkdfTUFY Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRfaXNfYWxsb2Moc3RydWN0IG1hcGxlX3Ry ZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19BTExPQ19SQU5H RSk7DQorfQ0KKw0KKy8qDQorICogVGhlIFBhcmVudCBQb2ludGVyDQorICogRXhjbHVkaW5nIHJv b3QsIHRoZSBwYXJlbnQgcG9pbnRlciBpcyAyNTZCIGFsaWduZWQgbGlrZSBhbGwgb3RoZXIgdHJl ZSBub2Rlcy4NCisgKiBXaGVuIHN0b3JpbmcgYSAzMiBvciA2NCBiaXQgdmFsdWVzLCB0aGUgb2Zm c2V0IGNhbiBmaXQgaW50byA1IGJpdHMuICBUaGUgMTYNCisgKiBiaXQgdmFsdWVzIG5lZWQgYW4g ZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBvZmZzZXQuICBUaGlzIGV4dHJhIGJpdCBjb21lcyBmcm9t DQorICogYSByZXVzZSBvZiB0aGUgbGFzdCBiaXQgaW4gdGhlIG5vZGUgdHlwZS4gIFRoaXMgaXMg cG9zc2libGUgYnkgdXNpbmcgYml0IDEgdG8NCisgKiBpbmRpY2F0ZSBpZiBiaXQgMiBpcyBwYXJ0 IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90Lg0KKyAqDQorICogTm90ZSB0eXBlczoNCisgKiAgMHg/ PzEgPSBSb290DQorICogIDB4PzAwID0gMTYgYml0IG5vZGVzDQorICogIDB4MDEwID0gMzIgYml0 IG5vZGVzDQorICogIDB4MTEwID0gNjQgYml0IG5vZGVzDQorICoNCisgKiBTbG90IHNpemUgYW5k IGFsaWdubWVudA0KKyAqICAwYj8/MSA6IFJvb3QNCisgKiAgMGI/MDAgOiAxNiBiaXQgdmFsdWVz LCB0eXBlIGluIDAtMSwgc2xvdCBpbiAyLTcNCisgKiAgMGIwMTAgOiAzMiBiaXQgdmFsdWVzLCB0 eXBlIGluIDAtMiwgc2xvdCBpbiAzLTcNCisgKiAgMGIxMTAgOiA2NCBiaXQgdmFsdWVzLCB0eXBl IGluIDAtMiwgc2xvdCBpbiAzLTcNCisgKi8NCisNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9ST09U CQkweDAxDQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVAkJMHgwMw0KKyNkZWZp bmUgTUFQTEVfUEFSRU5UX1NMT1RfTUFTSwkJMHhGOA0KKw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5U XzE2Ql9TTE9UX1NISUZUCTB4MDINCisjZGVmaW5lIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNL CTB4RkMNCisNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9SQU5HRTY0CQkweDA2DQorI2RlZmluZSBN QVBMRV9QQVJFTlRfUkFOR0UzMgkJMHgwNA0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX05PVF9SQU5H RTE2CTB4MDINCisNCisvKg0KKyAqIG10ZV9wYXJlbnRfc2hpZnQoKSAtIEdldCB0aGUgcGFyZW50 IHNoaWZ0IGZvciB0aGUgc2xvdCBzdG9yYWdlLg0KKyAqIEBwYXJlbnQ6IFRoZSBwYXJlbnQgcG9p bnRlciBjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcNCisgKiBSZXR1cm46IFRoZSBzaGlmdCBpbnRv IHRoYXQgcG9pbnRlciB0byB0aGUgc3RhciB0byBvZiB0aGUgc2xvdA0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZyBtdGVfcGFyZW50X3NoaWZ0KHVuc2lnbmVkIGxvbmcgcGFyZW50 KQ0KK3sNCisJLyogTm90ZSBiaXQgMSA9PSAwIG1lYW5zIDE2QiAqLw0KKwlpZiAobGlrZWx5KHBh cmVudCAmIE1BUExFX1BBUkVOVF9OT1RfUkFOR0UxNikpDQorCQlyZXR1cm4gTUFQTEVfUEFSRU5U X1NMT1RfU0hJRlQ7DQorDQorCXJldHVybiBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfU0hJRlQ7DQor fQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90X21hc2soKSAtIEdldCB0aGUgc2xvdCBtYXNr IGZvciB0aGUgcGFyZW50Lg0KKyAqIEBwYXJlbnQ6IFRoZSBwYXJlbnQgcG9pbnRlciBjYXN0IGFz IGFuIHVuc2lnbmVkIGxvbmcuDQorICogUmV0dXJuOiBUaGUgc2xvdCBtYXNrIGZvciB0aGF0IHBh cmVudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3BhcmVudF9zbG90 X21hc2sodW5zaWduZWQgbG9uZyBwYXJlbnQpDQorew0KKwkvKiBOb3RlIGJpdCAxID09IDAgbWVh bnMgMTZCICovDQorCWlmIChsaWtlbHkocGFyZW50ICYgTUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2 KSkNCisJCXJldHVybiBNQVBMRV9QQVJFTlRfU0xPVF9NQVNLOw0KKw0KKwlyZXR1cm4gTUFQTEVf UEFSRU5UXzE2Ql9TTE9UX01BU0s7DQorfQ0KKw0KKy8qDQorICogbWFzX3BhcmVudF9lbnVtKCkg LSBSZXR1cm4gdGhlIG1hcGxlX3R5cGUgb2YgdGhlIHBhcmVudCBmcm9tIHRoZSBzdG9yZWQNCisg KiBwYXJlbnQgdHlwZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhl IG1hcGxlX2Vub2RlIHRvIGV4dHJhY3QgdGhlIHBhcmVudCdzIGVudW0NCisgKiBSZXR1cm46IFRo ZSBub2RlLT5wYXJlbnQgbWFwbGVfdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUNCitlbnVtIG1h cGxlX3R5cGUgbXRlX3BhcmVudF9lbnVtKHN0cnVjdCBtYXBsZV9lbm9kZSAqcF9lbm9kZSwNCisJ CQkJc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBwX3R5cGU7DQor DQorCXBfdHlwZSA9ICh1bnNpZ25lZCBsb25nKXBfZW5vZGU7DQorCWlmIChwX3R5cGUgJiBNQVBM RV9QQVJFTlRfUk9PVCkNCisJCXJldHVybiAwOyAvKiBWYWxpZGF0ZWQgaW4gdGhlIGNhbGxlci4g Ki8NCisNCisJcF90eXBlICY9IE1BUExFX05PREVfTUFTSzsNCisJcF90eXBlID0gcF90eXBlICYg fihNQVBMRV9QQVJFTlRfUk9PVCB8IG10ZV9wYXJlbnRfc2xvdF9tYXNrKHBfdHlwZSkpOw0KKw0K Kwlzd2l0Y2ggKHBfdHlwZSkgew0KKwljYXNlIE1BUExFX1BBUkVOVF9SQU5HRTY0OiAvKiBvciBN QVBMRV9QQVJFTlRfQVJBTkdFNjQgKi8NCisJCWlmIChtdF9pc19hbGxvYyhtdCkpDQorCQkJcmV0 dXJuIG1hcGxlX2FyYW5nZV82NDsNCisJCXJldHVybiBtYXBsZV9yYW5nZV82NDsNCisJfQ0KKw0K KwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGlubGluZQ0KK2VudW0gbWFwbGVfdHlwZSBtYXNf cGFyZW50X2VudW0oc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5v ZGUpDQorew0KKwlyZXR1cm4gbXRlX3BhcmVudF9lbnVtKG1hX2Vub2RlX3B0cihtdGVfdG9fbm9k ZShlbm9kZSktPnBhcmVudCksIG1hcy0+dHJlZSk7DQorfQ0KKw0KKy8qDQorICogbXRlX3NldF9w YXJlbnQoKSAtIFNldCB0aGUgcGFyZW50IG5vZGUgYW5kIGVuY29kZSB0aGUgc2xvdA0KKyAqIEBl bm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAcGFyZW50OiBUaGUgZW5jb2RlZCBt YXBsZSBub2RlIHRoYXQgaXMgdGhlIHBhcmVudCBvZiBAZW5vZGUuDQorICogQHNsb3Q6IFRoZSBz bG90IHRoYXQgQGVub2RlIHJlc2lkZXMgaW4gQHBhcmVudC4NCisgKg0KKyAqIFNsb3QgbnVtYmVy IGlzIGVuY29kZWQgaW4gdGhlIGVub2RlLT5wYXJlbnQgYml0IDMtNiBvciAyLTYsIGRlcGVuZGlu ZyBvbiB0aGUNCisgKiBwYXJlbnQgdHlwZS4NCisgKi8NCitzdGF0aWMgaW5saW5lDQordm9pZCBt dGVfc2V0X3BhcmVudChzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlLCBjb25zdCBzdHJ1Y3QgbWFw bGVfZW5vZGUgKnBhcmVudCwNCisJCSAgICB1bnNpZ25lZCBjaGFyIHNsb3QpDQorew0KKwl1bnNp Z25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcg c2hpZnQ7DQorCXVuc2lnbmVkIGxvbmcgdHlwZTsNCisJZW51bSBtYXBsZV90eXBlIHBfdHlwZSA9 IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisNCisJQlVHX09OKHBfdHlwZSA9PSBtYXBsZV9kZW5z ZSk7DQorCUJVR19PTihwX3R5cGUgPT0gbWFwbGVfbGVhZl82NCk7DQorDQorCXN3aXRjaCAocF90 eXBlKSB7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0K KwkJc2hpZnQgPSBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVDsNCisJCXR5cGUgPSBNQVBMRV9QQVJF TlRfUkFOR0U2NDsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxlX2RlbnNlOg0K KwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlzaGlmdCA9IHR5cGUgPSAwOw0KKwkJYnJlYWs7DQor CX0NCisNCisJdmFsICY9IH5NQVBMRV9OT0RFX01BU0s7IC8qIENsZWFyIGFsbCBub2RlIG1ldGFk YXRhIGluIHBhcmVudCAqLw0KKwl2YWwgfD0gKHNsb3QgPDwgc2hpZnQpIHwgdHlwZTsNCisJbXRl X3RvX25vZGUoZW5vZGUpLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKHZhbCk7DQorfQ0KKw0KKy8q DQorICogbXRlX3BhcmVudF9zbG90KCkgLSBnZXQgdGhlIHBhcmVudCBzbG90IG9mIEBlbm9kZS4N CisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICoNCisgKiBSZXR1cm46IFRo ZSBzbG90IGluIHRoZSBwYXJlbnQgbm9kZSB3aGVyZSBAZW5vZGUgcmVzaWRlcy4NCisgKi8NCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdGVfcGFyZW50X3Nsb3QoY29uc3Qgc3RydWN0IG1h cGxlX2Vub2RlICplbm9kZSkNCit7DQorCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxv bmcpIG10ZV90b19ub2RlKGVub2RlKS0+cGFyZW50Ow0KKw0KKwkvKiBSb290LiAqLw0KKwlpZiAo dmFsICYgMSkNCisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkgKiBPa2F5IHRvIHVzZSBNQVBMRV9Q QVJFTlRfMTZCX1NMT1RfTUFTSyBhcyB0aGUgbGFzdCBiaXQgd2lsbCBiZSBsb3N0DQorCSAqIGJ5 IHNoaWZ0IGlmIHRoZSBwYXJlbnQgc2hpZnQgaXMgTUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQNCisJ ICovDQorCXJldHVybiAodmFsICYgTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX01BU0spID4+IG10ZV9w YXJlbnRfc2hpZnQodmFsKTsNCit9DQorDQorLyoNCisgKiBtdGVfcGFyZW50KCkgLSBHZXQgdGhl IHBhcmVudCBvZiBAbm9kZS4NCisgKiBAbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisg Kg0KKyAqIFJldHVybjogVGhlIHBhcmVudCBtYXBsZSBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgc3RydWN0IG1hcGxlX25vZGUgKm10ZV9wYXJlbnQoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2Rl ICplbm9kZSkNCit7DQorCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZykNCisJCQkobXRl X3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpICYgfk1BUExFX05PREVfTUFTSyk7DQorfQ0KKw0KKy8q DQorICogbWFfZGVhZF9ub2RlKCkgLSBjaGVjayBpZiB0aGUgQGVub2RlIGlzIGRlYWQuDQorICog QGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYg ZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9kZWFk X25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUpDQorew0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqcGFyZW50ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpDQorCQkJCQkgICAgIG5vZGUt PnBhcmVudCAmIH5NQVBMRV9OT0RFX01BU0spOw0KKw0KKwlyZXR1cm4gKHBhcmVudCA9PSBub2Rl KTsNCit9DQorLyoNCisgKiBtdGVfZGVhZF9ub2RlKCkgLSBjaGVjayBpZiB0aGUgQGVub2RlIGlz IGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICoNCisgKiBSZXR1 cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtdGVfZGVhZF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50LCAqbm9kZTsNCisNCisJbm9kZSA9IG10ZV90b19u b2RlKGVub2RlKTsNCisJcGFyZW50ID0gbXRlX3BhcmVudChlbm9kZSk7DQorCXJldHVybiAocGFy ZW50ID09IG5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19hbGxvY2F0ZWQoKSAtIEdldCB0aGUg bnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZCBpbiBhIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIG1hX3N0YXRlIGFsbG9jIG1lbWJlciBpcyBvdmVy bG9hZGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdA0KKyAqIGFsbG9jYXRlZCBub2Rl IG9yIHRvIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIG5vZGVzIHRvIGFsbG9jYXRlLiAgSWYgYml0 IDAgaXMNCisgKiBzZXQsIHRoZW4gdGhlIGFsbG9jIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgcmVx dWVzdGVkIG5vZGVzLiAgSWYgdGhlcmUgaXMgYW4NCisgKiBhbGxvY2F0ZWQgbm9kZSwgdGhlbiB0 aGUgdG90YWwgYWxsb2NhdGVkIG5vZGVzIGlzIGluIHRoYXQgbm9kZS4NCisgKg0KKyAqIFJldHVy bjogVGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQNCisgKi8NCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGxvbmcgbWFzX2FsbG9jYXRlZChjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCWlmICghbWFzLT5hbGxvYyB8fCAoKHVuc2lnbmVkIGxvbmcpbWFzLT5hbGxvYyAm IDB4MSkpDQorCQlyZXR1cm4gMDsNCisNCisJcmV0dXJuIG1hcy0+YWxsb2MtPnRvdGFsOw0KK30N CisNCisvKg0KKyAqIG1hc19zZXRfYWxsb2NfcmVxKCkgLSBTZXQgdGhlIHJlcXVlc3RlZCBudW1i ZXIgb2YgYWxsb2NhdGlvbnMuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICogQGNvdW50 OiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLg0KKyAqDQorICogVGhlIHJlcXVlc3RlZCBudW1i ZXIgb2YgYWxsb2NhdGlvbnMgaXMgZWl0aGVyIGluIHRoZSBmaXJzdCBhbGxvY2F0ZWQgbm9kZSwN CisgKiBsb2NhdGVkIGluIEBtYXMtPmFsbG9jLT5yZXF1ZXN0X2NvdW50LCBvciBkaXJlY3RseSBp biBAbWFzLT5hbGxvYyBpZiB0aGVyZSBpcw0KKyAqIG5vIGFsbG9jYXRlZCBub2RlLiAgU2V0IHRo ZSByZXF1ZXN0IGVpdGhlciBpbiB0aGUgbm9kZSBvciBkbyB0aGUgbmVjZXNzYXJ5DQorICogZW5j b2RpbmcgdG8gc3RvcmUgaW4gQG1hcy0+YWxsb2MgZGlyZWN0bHkuDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG1hc19zZXRfYWxsb2NfcmVxKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBsb25nIGNvdW50KQ0KK3sNCisJaWYgKCFtYXMtPmFsbG9jIHx8ICgodW5zaWduZWQgbG9uZylt YXMtPmFsbG9jICYgMHgxKSkgew0KKwkJaWYgKCFjb3VudCkNCisJCQltYXMtPmFsbG9jID0gTlVM TDsNCisJCWVsc2UNCisJCQltYXMtPmFsbG9jID0gKHN0cnVjdCBtYXBsZV9hbGxvYyAqKSgoKGNv dW50KSA8PCAxVSkgfCAxVSk7DQorCQlyZXR1cm47DQorCX0NCisNCisJbWFzLT5hbGxvYy0+cmVx dWVzdF9jb3VudCA9IGNvdW50Ow0KK30NCisNCisvKg0KKyAqIG1hc19hbGxvY19yZXEoKSAtIGdl dCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucy4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKg0KKyAqIFRoZSBhbGxvYyBjb3VudCBpcyBlaXRoZXIgc3RvcmVkIGRpcmVj dGx5IGluIEBtYXMsIG9yIGluDQorICogQG1hcy0+YWxsb2MtPnJlcXVlc3RfY291bnQgaWYgdGhl cmUgaXMgYXQgbGVhc3Qgb25lIG5vZGUgYWxsb2NhdGVkLiAgRGVjb2RlDQorICogdGhlIHJlcXVl c3QgY291bnQgaWYgaXQncyBzdG9yZWQgZGlyZWN0bHkgaW4gQG1hcy0+YWxsb2MuDQorICoNCisg KiBSZXR1cm46IFRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgY291bnQuDQorICovDQorc3RhdGljIGlu bGluZSB1bnNpZ25lZCBpbnQgbWFzX2FsbG9jX3JlcShjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCWlmICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKQ0KKwkJcmV0dXJu ICh1bnNpZ25lZCBsb25nKShtYXMtPmFsbG9jKSA+PiAxOw0KKwllbHNlIGlmIChtYXMtPmFsbG9j KQ0KKwkJcmV0dXJuIG1hcy0+YWxsb2MtPnJlcXVlc3RfY291bnQ7DQorCXJldHVybiAwOw0KK30N CisNCisvKg0KKyAqIG1hX3Bpdm90cygpIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9k ZSBwaXZvdHMuDQorICogQG5vZGUgLSB0aGUgbWFwbGUgbm9kZQ0KKyAqIEB0eXBlIC0gdGhlIG5v ZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgcGl2 b3RzDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICptYV9waXZvdHMoc3RydWN0 IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkgICBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQor CXN3aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCXJldHVybiBub2Rl LT5tYTY0LnBpdm90Ow0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZf NjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5waXZvdDsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJ CXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG1hX2dh cHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgZ2Fwcy4NCisgKiBAbm9kZSAt IHRoZSBtYXBsZSBub2RlDQorICogQHR5cGUgLSB0aGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1 cm46IEEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBnYXBzDQorICovDQorc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBsb25nICptYV9nYXBzKHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLA0KKwkJCQkg ICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2Ug bWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQuZ2FwOw0KKwljYXNlIG1hcGxl X3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCWNhc2UgbWFwbGVfZGVuc2U6DQor CQlyZXR1cm4gTlVMTDsNCisJfQ0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtdGVf cGl2b3QoKSAtIEdldCB0aGUgcGl2b3QgYXQgQHBpdiBvZiB0aGUgbWFwbGUgZW5jb2RlZCBub2Rl Lg0KKyAqIEBtbjogVGhlIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAcGl2OiBUaGUgcGl2b3Qu DQorICoNCisgKiBSZXR1cm46IHRoZSBwaXZvdCBhdCBAcGl2IG9mIEBtbi4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3Bpdm90KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9k ZSAqbW4sDQorCQkJCSB1bnNpZ25lZCBjaGFyIHBpdikNCit7DQorCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKw0KKwlpZiAocGl2ID49IG10X3Bpdm90c1twaXZd KSB7DQorCQlXQVJOX09OKDEpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJc3dpdGNoIChtdGVfbm9k ZV90eXBlKG1uKSkgew0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCXJldHVybiBub2RlLT5t YTY0LnBpdm90W3Bpdl07DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVh Zl82NDoNCisJCXJldHVybiBub2RlLT5tcjY0LnBpdm90W3Bpdl07DQorCWNhc2UgbWFwbGVfZGVu c2U6DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNf c2FmZV9waXZvdCgpIC0gZ2V0IHRoZSBwaXZvdCBhdCBAcGl2IG9yIG1hcy0+bWF4Lg0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6IFRoZSBwb2ludGVyIHRvIHRoZSBtYXBs ZSBub2RlIHBpdm90cw0KKyAqIEBwaXY6IFRoZSBwaXZvdCB0byBmZXRjaA0KKyAqIEB0eXBlOiBU aGUgbWFwbGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1cm46IFRoZSBwaXZvdCBhdCBAcGl2IHdp dGhpbiB0aGUgbGltaXQgb2YgdGhlIEBwaXZvdHMgYXJyYXksIEBtYXMtPm1heA0KKyAqIG90aGVy d2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcNCittYXNfc2FmZV9waXZv dChjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkg ICAgICAgdW5zaWduZWQgY2hhciBwaXYsIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJaWYg KHBpdiA+PSBtdF9waXZvdHNbdHlwZV0pDQorCQlyZXR1cm4gbWFzLT5tYXg7DQorDQorCXJldHVy biBwaXZvdHNbcGl2XTsNCit9DQorDQorLyoNCisgKiBtYXNfc2FmZV9taW4oKSAtIFJldHVybiB0 aGUgbWluaW11bSBmb3IgYSBnaXZlbiBvZmZzZXQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQHBpdm90czogVGhlIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICog QG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBwaXZvdCBhcnJheQ0KKyAqDQorICogUmV0dXJu OiBUaGUgbWluaW11bSByYW5nZSB2YWx1ZSB0aGF0IGlzIGNvbnRhaW5lZCBpbiBAb2Zmc2V0Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZw0KK21hc19zYWZlX21pbihzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyAqcGl2b3RzLCB1bnNpZ25lZCBjaGFyIG9mZnNl dCkNCit7DQorCWlmIChsaWtlbHkob2Zmc2V0KSkNCisJCXJldHVybiBwaXZvdHNbb2Zmc2V0IC0g MV0gKyAxOw0KKw0KKwlyZXR1cm4gbWFzLT5taW47DQorfQ0KKw0KKy8qDQorICogbWFzX2xvZ2lj YWxfcGl2b3QoKSAtIEdldCB0aGUgbG9naWNhbCBwaXZvdCBvZiBhIGdpdmVuIG9mZnNldC4NCisg KiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAcGl2b3RzOiBUaGUgcG9pbnRlciB0byB0aGUg bWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHBpdm90 IGFycmF5DQorICogQHR5cGU6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKg0KKyAqIFdoZW4gdGhl cmUgaXMgbm8gdmFsdWUgYXQgYSBwaXZvdCAoYmV5b25kIHRoZSBlbmQgb2YgdGhlIGRhdGEpLCB0 aGVuIHRoZQ0KKyAqIHBpdm90IGlzIGFjdHVhbGx5IEBtYXMtPm1heC4NCisgKg0KKyAqIFJldHVy bjogdGhlIGxvZ2ljYWwgcGl2b3Qgb2YgYSBnaXZlbiBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZw0KK21hc19sb2dpY2FsX3Bpdm90KHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsDQorCQkgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBl bnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXVuc2lnbmVkIGxvbmcgbHBpdiA9IG1hc19zYWZl X3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5cGUpOw0KKw0KKwlpZiAobGlrZWx5KGxwaXYp KQ0KKwkJcmV0dXJuIGxwaXY7DQorDQorCWlmIChsaWtlbHkob2Zmc2V0KSkNCisJCXJldHVybiBt YXMtPm1heDsNCisNCisJcmV0dXJuIGxwaXY7DQorfQ0KKw0KKy8qDQorICogbXRlX3NldF9waXZv dCgpIC0gU2V0IGEgcGl2b3QgdG8gYSB2YWx1ZSBpbiBhbiBlbmNvZGVkIG1hcGxlIG5vZGUuDQor ICogQG1uOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHBpdjogVGhlIHBpdm90IG9mZnNl dA0KKyAqIEB2YWw6IFRoZSB2YWx1ZSBvZiB0aGUgcGl2b3QNCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbXRlX3NldF9waXZvdChzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uLCB1bnNpZ25lZCBjaGFy IHBpdiwNCisJCQkJdW5zaWduZWQgbG9uZyB2YWwpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAq bm9kZSA9IG10ZV90b19ub2RlKG1uKTsNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9k ZV90eXBlKG1uKTsNCisNCisJQlVHX09OKHBpdiA+PSBtdF9waXZvdHNbdHlwZV0pOw0KKwlzd2l0 Y2ggKHR5cGUpIHsNCisJZGVmYXVsdDoNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBt YXBsZV9sZWFmXzY0Og0KKwkJbm9kZS0+bXI2NC5waXZvdFtwaXZdID0gdmFsOw0KKwkJYnJlYWs7 DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJbm9kZS0+bWE2NC5waXZvdFtwaXZdID0gdmFs Ow0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlicmVhazsNCisJfQ0KKw0KK30N CisNCisvKg0KKyAqIG1hX3Nsb3RzKCkgLSBHZXQgYSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2Rl IHNsb3RzLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2Rl IHR5cGUNCisgKg0KKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHNsb3Rz DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIF9fcmN1ICoqbWFfc2xvdHMoc3RydWN0IG1hcGxl X25vZGUgKm1uLCBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlzd2l0Y2ggKG10KSB7DQorCWRl ZmF1bHQ6DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG1uLT5tYTY0LnNsb3Q7 DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXJldHVy biBtbi0+bXI2NC5zbG90Ow0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJuIG1uLT5zbG90 Ow0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdF9sb2NrZWQoY29uc3Qgc3RydWN0 IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIG10X2V4dGVybmFsX2xvY2sobXQpID8gbXRf bG9ja19pc19oZWxkKG10KSA6DQorCQlsb2NrZGVwX2lzX2hlbGQoJm10LT5tYV9sb2NrKTsNCit9 DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdF9zbG90KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVl ICptdCwNCisJCXZvaWQgX19yY3UgKipzbG90cywgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0K KwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHNsb3RzW29mZnNldF0sIG10X2xvY2tlZCht dCkpOw0KK30NCisNCisvKg0KKyAqIG1hc19zbG90X2xvY2tlZCgpIC0gR2V0IHRoZSBzbG90IHZh bHVlIHdoZW4gaG9sZGluZyB0aGUgbWFwbGUgdHJlZSBsb2NrLg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqIEBzbG90czogVGhlIHBvaW50ZXIgdG8gdGhlIHNsb3RzDQorICogQG9mZnNl dDogVGhlIG9mZnNldCBpbnRvIHRoZSBzbG90cyBhcnJheSB0byBmZXRjaA0KKyAqDQorICogUmV0 dXJuOiBUaGUgZW50cnkgc3RvcmVkIGluIEBzbG90cyBhdCB0aGUgQG9mZnNldC4NCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgKm1hc19zbG90X2xvY2tlZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dm9pZCBfX3JjdSAqKnNsb3RzLA0KKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQor ew0KKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzbG90c1tvZmZzZXRdLCBtdF9s b2NrZWQobWFzLT50cmVlKSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Nsb3QoKSAtIEdldCB0aGUg c2xvdCB2YWx1ZSB3aGVuIG5vdCBob2xkaW5nIHRoZSBtYXBsZSB0cmVlIGxvY2suDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQHNsb3RzOiBUaGUgcG9pbnRlciB0byB0aGUgc2xvdHMN CisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHNsb3RzIGFycmF5IHRvIGZldGNoDQor ICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBzdG9yZWQgaW4gQHNsb3RzIGF0IHRoZSBAb2Zmc2V0 DQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfc2xvdChzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdm9pZCBfX3JjdSAqKnNsb3RzLA0KKwkJCSAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQor ew0KKwlyZXR1cm4gbXRfc2xvdChtYXMtPnRyZWUsIHNsb3RzLCBvZmZzZXQpOw0KK30NCisNCisv Kg0KKyAqIG1hc19yb290KCkgLSBHZXQgdGhlIG1hcGxlIHRyZWUgcm9vdC4NCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBwb2ludGVyIHRvIHRoZSByb290 IG9mIHRoZSB0cmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfcm9vdChzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2sobWFzLT50 cmVlLT5tYV9yb290LCBtdF9sb2NrZWQobWFzLT50cmVlKSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxp bmUgdm9pZCAqbXRfcm9vdF9sb2NrZWQoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0 dXJuIHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobXQtPm1hX3Jvb3QsIG10X2xvY2tlZChtdCkp Ow0KK30NCisNCisvKg0KKyAqIG1hc19yb290X2xvY2tlZCgpIC0gR2V0IHRoZSBtYXBsZSB0cmVl IHJvb3Qgd2hlbiBob2xkaW5nIHRoZSBtYXBsZSB0cmVlIGxvY2suDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgcG9pbnRlciB0byB0aGUgcm9vdCBvZiB0 aGUgdHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3Jvb3RfbG9ja2VkKHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG10X3Jvb3RfbG9ja2VkKG1hcy0+dHJlZSk7 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX21ldGFkYXRhICptYV9tZXRhKHN0 cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCSAgICAgZW51bSBtYXBsZV90eXBlIG10KQ0KK3sN CisJc3dpdGNoIChtdCkgew0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCXJldHVybiAmbW4t Pm1hNjQubWV0YTsNCisJZGVmYXVsdDoNCisJCXJldHVybiAmbW4tPm1yNjQubWV0YTsNCisJfQ0K K30NCisNCisvKg0KKyAqIG1hX3NldF9tZXRhKCkgLSBTZXQgdGhlIG1ldGFkYXRhIGluZm9ybWF0 aW9uIG9mIGEgbm9kZS4NCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQorICogQG10OiBUaGUgbWFw bGUgbm9kZSB0eXBlDQorICogQG9mZnNldDogVGhlIG9mZnNldCBvZiB0aGUgaGlnaGVzdCBzdWIt Z2FwIGluIHRoaXMgbm9kZS4NCisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBkYXRhIGluIHRoaXMg bm9kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFfc2V0X21ldGEoc3RydWN0IG1hcGxl X25vZGUgKm1uLCBlbnVtIG1hcGxlX3R5cGUgbXQsDQorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIg b2Zmc2V0LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAq bWV0YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJbWV0YS0+Z2FwID0gb2Zmc2V0Ow0KKwltZXRh LT5lbmQgPSBlbmQ7DQorfQ0KKw0KKy8qDQorICogbWFfbWV0YV9lbmQoKSAtIEdldCB0aGUgZGF0 YSBlbmQgb2YgYSBub2RlIGZyb20gdGhlIG1ldGFkYXRhDQorICogQG1uOiBUaGUgbWFwbGUgbm9k ZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgY2hhciBtYV9tZXRhX2VuZChzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sDQorCQkJCQllbnVt IG1hcGxlX3R5cGUgbXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1ldGEgPSBtYV9t ZXRhKG1uLCBtdCk7DQorDQorCXJldHVybiBtZXRhLT5lbmQ7DQorfQ0KKw0KKy8qDQorICogbWFf bWV0YV9nYXAoKSAtIEdldCB0aGUgbGFyZ2VzdCBnYXAgbG9jYXRpb24gb2YgYSBub2RlIGZyb20g dGhlIG1ldGFkYXRhDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtdDogVGhlIG1hcGxl IG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYV9tZXRhX2dh cChzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sDQorCQkJCQllbnVtIG1hcGxlX3R5cGUgbXQpDQorew0K KwlCVUdfT04obXQgIT0gbWFwbGVfYXJhbmdlXzY0KTsNCisNCisJcmV0dXJuIG1uLT5tYTY0Lm1l dGEuZ2FwOw0KK30NCisNCisvKg0KKyAqIG1hX3NldF9tZXRhX2dhcCgpIC0gU2V0IHRoZSBsYXJn ZXN0IGdhcCBsb2NhdGlvbiBpbiBhIG5vZGVzIG1ldGFkYXRhDQorICogQG1uOiBUaGUgbWFwbGUg bm9kZQ0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEBvZmZzZXQ6IFRoZSBsb2Nh dGlvbiBvZiB0aGUgbGFyZ2VzdCBnYXAuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hX3Nl dF9tZXRhX2dhcChzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJ CQkJICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKw0KKwlzdHJ1Y3QgbWFwbGVfbWV0YWRh dGEgKm1ldGEgPSBtYV9tZXRhKG1uLCBtdCk7DQorDQorCW1ldGEtPmdhcCA9IG9mZnNldDsNCit9 DQorDQorLyoNCisgKiBtYXRfYWRkKCkgLSBBZGQgYSBAZGVhZF9lbm9kZSB0byB0aGUgbWFfdG9w aWFyeSBvZiBhIGxpc3Qgb2YgZGVhZCBub2Rlcy4NCisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnks IGEgbGlua2VkIGxpc3Qgb2YgZGVhZCBub2Rlcy4NCisgKiBAZGVhZF9lbm9kZSAtIHRoZSBub2Rl IHRvIGJlIG1hcmtlZCBhcyBkZWFkIGFuZCBhZGRlZCB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdA0K KyAqDQorICogQWRkIHRoZSBAZGVhZF9lbm9kZSB0byB0aGUgbGlua2VkIGxpc3QgaW4gQG1hdC4N CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWF0X2FkZChzdHJ1Y3QgbWFfdG9waWFyeSAqbWF0 LA0KKwkJCSAgIHN0cnVjdCBtYXBsZV9lbm9kZSAqZGVhZF9lbm9kZSkNCit7DQorCW10ZV9zZXRf bm9kZV9kZWFkKGRlYWRfZW5vZGUpOw0KKwltdGVfdG9fbWF0KGRlYWRfZW5vZGUpLT5uZXh0ID0g TlVMTDsNCisJaWYgKCFtYXQtPnRhaWwpIHsNCisJCW1hdC0+dGFpbCA9IG1hdC0+aGVhZCA9IGRl YWRfZW5vZGU7DQorCQlyZXR1cm47DQorCX0NCisNCisJbXRlX3RvX21hdChtYXQtPnRhaWwpLT5u ZXh0ID0gZGVhZF9lbm9kZTsNCisJbWF0LT50YWlsID0gZGVhZF9lbm9kZTsNCit9DQorDQorc3Rh dGljIHZvaWQgbXRlX2Rlc3Ryb3lfd2FsayhzdHJ1Y3QgbWFwbGVfZW5vZGUgKiwgc3RydWN0IG1h cGxlX3RyZWUgKik7DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19mcmVlKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnVzZWQpOw0KKw0KKy8qDQorICogbWFzX21hdF9m cmVlKCkgLSBGcmVlIGFsbCBub2RlcyBpbiBhIGRlYWQgbGlzdC4NCisgKiBAbWFzIC0gdGhlIG1h cGxlIHN0YXRlDQorICogQG1hdCAtIHRoZSBtYV90b3BpYXJ5IGxpbmtlZCBsaXN0IG9mIGRlYWQg bm9kZXMgdG8gZnJlZS4NCisgKg0KKyAqIEZyZWUgd2FsayBhIGRlYWQgbGlzdC4NCisgKi8NCitz dGF0aWMgdm9pZCBtYXNfbWF0X2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV90 b3BpYXJ5ICptYXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7DQorDQorCXdoaWxl IChtYXQtPmhlYWQpIHsNCisJCW5leHQgPSBtdGVfdG9fbWF0KG1hdC0+aGVhZCktPm5leHQ7DQor CQltYXNfZnJlZShtYXMsIG1hdC0+aGVhZCk7DQorCQltYXQtPmhlYWQgPSBuZXh0Ow0KKwl9DQor fQ0KKw0KKy8qDQorICogbWFzX21hdF9kZXN0cm95KCkgLSBGcmVlIGFsbCBub2RlcyBhbmQgc3Vi dHJlZXMgaW4gYSBkZWFkIGxpc3QuDQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBt YXQgLSB0aGUgbWFfdG9waWFyeSBsaW5rZWQgbGlzdCBvZiBkZWFkIG5vZGVzIHRvIGZyZWUuDQor ICoNCisgKiBEZXN0cm95IHdhbGsgYSBkZWFkIGxpc3QuDQorICovDQorc3RhdGljIHZvaWQgbWFz X21hdF9kZXN0cm95KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFfdG9waWFyeSAqbWF0 KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0Ow0KKw0KKwl3aGlsZSAobWF0LT5oZWFk KSB7DQorCQluZXh0ID0gbXRlX3RvX21hdChtYXQtPmhlYWQpLT5uZXh0Ow0KKwkJbXRlX2Rlc3Ry b3lfd2FsayhtYXQtPmhlYWQsIG1hdC0+bXRyZWUpOw0KKwkJbWF0LT5oZWFkID0gbmV4dDsNCisJ fQ0KK30NCisvKg0KKyAqIG1hc19kZXNjZW5kKCkgLSBEZXNjZW5kIGludG8gdGhlIHNsb3Qgc3Rv cmVkIGluIHRoZSBtYV9zdGF0ZS4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlLg0KKyAqDQor ICogTm90ZTogTm90IFJDVSBzYWZlLCBvbmx5IHVzZSBpbiB3cml0ZSBzaWRlIG9yIGRlYnVnIGNv ZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19kZXNjZW5kKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCXVuc2lnbmVkIGxvbmcgKnBp dm90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwl0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xv dHMobm9kZSwgdHlwZSk7DQorDQorCWlmIChtYXMtPm9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2 b3RzW21hcy0+b2Zmc2V0IC0gMV0gKyAxOw0KKwltYXMtPm1heCA9IG1hc19zYWZlX3Bpdm90KG1h cywgcGl2b3RzLCBtYXMtPm9mZnNldCwgdHlwZSk7DQorCW1hcy0+bm9kZSA9IG1hc19zbG90KG1h cywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCit9DQorDQorLyoNCisgKiBtdGVfc2V0X2dhcCgpIC0g U2V0IGEgbWFwbGUgbm9kZSBnYXAuDQorICogQG1uOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQor ICogQGdhcDogVGhlIG9mZnNldCBvZiB0aGUgZ2FwIHRvIHNldA0KKyAqIEB2YWw6IFRoZSBnYXAg dmFsdWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3NldF9nYXAoY29uc3Qgc3RydWN0 IG1hcGxlX2Vub2RlICptbiwNCisJCQkJIHVuc2lnbmVkIGNoYXIgZ2FwLCB1bnNpZ25lZCBsb25n IHZhbCkNCit7DQorCXN3aXRjaCAobXRlX25vZGVfdHlwZShtbikpIHsNCisJZGVmYXVsdDoNCisJ CWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCW10ZV90b19ub2RlKG1uKS0+bWE2 NC5nYXBbZ2FwXSA9IHZhbDsNCisJCWJyZWFrOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2Fz Y2VuZCgpIC0gV2FsayB1cCBhIGxldmVsIG9mIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqDQorICogU2V0cyB0aGUgQG1hcy0+bWF4IGFuZCBAbWFzLT5taW4gdG8gdGhl IGNvcnJlY3QgdmFsdWVzIHdoZW4gd2Fsa2luZyB1cC4gIFRoaXMNCisgKiBtYXkgY2F1c2Ugc2V2 ZXJhbCBsZXZlbHMgb2Ygd2Fsa2luZyB1cCB0byBmaW5kIHRoZSBjb3JyZWN0IG1pbiBhbmQgbWF4 Lg0KKyAqIE1heSBmaW5kIGEgZGVhZCBub2RlIHdoaWNoIHdpbGwgY2F1c2UgYSBwcmVtYXR1cmUg cmV0dXJuLg0KKyAqIFJldHVybjogMSBvbiBkZWFkIG5vZGUsIDAgb3RoZXJ3aXNlDQorICovDQor c3RhdGljIGludCBtYXNfYXNjZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0 IG1hcGxlX2Vub2RlICpwX2Vub2RlOyAvKiBwYXJlbnQgZW5vZGUuICovDQorCXN0cnVjdCBtYXBs ZV9lbm9kZSAqYV9lbm9kZTsgLyogYW5jZXN0b3IgZW5vZGUuICovDQorCXN0cnVjdCBtYXBsZV9u b2RlICphX25vZGU7IC8qIGFuY2VzdG9yIG5vZGUuICovDQorCXN0cnVjdCBtYXBsZV9ub2RlICpw X25vZGU7IC8qIHBhcmVudCBub2RlLiAqLw0KKwl1bnNpZ25lZCBjaGFyIGFfc2xvdDsNCisJZW51 bSBtYXBsZV90eXBlIGFfdHlwZTsNCisJdW5zaWduZWQgbG9uZyBtaW4sIG1heDsNCisJdW5zaWdu ZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJYm9vbCBzZXRfbWF4 ID0gZmFsc2UsIHNldF9taW4gPSBmYWxzZTsNCisNCisJYV9ub2RlID0gbWFzX21uKG1hcyk7DQor CWlmIChtYV9pc19yb290KGFfbm9kZSkpIHsNCisJCW1hcy0+b2Zmc2V0ID0gMDsNCisJCXJldHVy biAwOw0KKwl9DQorDQorCXBfbm9kZSA9IG10ZV9wYXJlbnQobWFzLT5ub2RlKTsNCisJaWYgKHVu bGlrZWx5KGFfbm9kZSA9PSBwX25vZGUpKQ0KKwkJcmV0dXJuIDE7DQorCWFfdHlwZSA9IG1hc19w YXJlbnRfZW51bShtYXMsIG1hcy0+bm9kZSk7DQorCW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdCht YXMtPm5vZGUpOw0KKwlhX2Vub2RlID0gbXRfbWtfbm9kZShwX25vZGUsIGFfdHlwZSk7DQorDQor CS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBhbGwgcGFyZW50IGluZm9ybWF0aW9uIGlzIHN0aWxsIGFj Y3VyYXRlICovDQorCWlmIChwX25vZGUgIT0gbXRlX3BhcmVudChtYXMtPm5vZGUpKQ0KKwkJcmV0 dXJuIDE7DQorDQorCW1hcy0+bm9kZSA9IGFfZW5vZGU7DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0 Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QoYV9lbm9kZSkpIHsNCisJCW1hcy0+bWF4ID0gVUxPTkdf TUFYOw0KKwkJbWFzLT5taW4gPSAwOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJbWluID0gMDsN CisJbWF4ID0gVUxPTkdfTUFYOw0KKwlkbyB7DQorCQlwX2Vub2RlID0gYV9lbm9kZTsNCisJCWFf dHlwZSA9IG1hc19wYXJlbnRfZW51bShtYXMsIHBfZW5vZGUpOw0KKwkJYV9ub2RlID0gbXRlX3Bh cmVudChwX2Vub2RlKTsNCisJCWFfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChwX2Vub2RlKTsNCisJ CXBpdm90cyA9IG1hX3Bpdm90cyhhX25vZGUsIGFfdHlwZSk7DQorCQlhX2Vub2RlID0gbXRfbWtf bm9kZShhX25vZGUsIGFfdHlwZSk7DQorDQorCQlpZiAoIXNldF9taW4gJiYgYV9zbG90KSB7DQor CQkJc2V0X21pbiA9IHRydWU7DQorCQkJbWluID0gcGl2b3RzW2Ffc2xvdCAtIDFdICsgMTsNCisJ CX0NCisNCisJCWlmICghc2V0X21heCAmJiBhX3Nsb3QgPCBtdF9waXZvdHNbYV90eXBlXSkgew0K KwkJCXNldF9tYXggPSB0cnVlOw0KKwkJCW1heCA9IHBpdm90c1thX3Nsb3RdOw0KKwkJfQ0KKw0K KwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShhX25vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisN CisJCWlmICh1bmxpa2VseShtYV9pc19yb290KGFfbm9kZSkpKQ0KKwkJCWJyZWFrOw0KKw0KKwl9 IHdoaWxlICghc2V0X21pbiB8fCAhc2V0X21heCk7DQorDQorCW1hcy0+bWF4ID0gbWF4Ow0KKwlt YXMtPm1pbiA9IG1pbjsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX3BvcF9ub2Rl KCkgLSBHZXQgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtYXBsZSBub2RlIGZyb20gdGhlIG1hcGxl IHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBBIHBv aW50ZXIgdG8gYSBtYXBsZSBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxl X25vZGUgKm1hc19wb3Bfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBt YXBsZV9hbGxvYyAqcmV0LCAqbm9kZSA9IG1hcy0+YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcgdG90 YWwgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorDQorCS8qIG5vdGhpbmcgb3IgYSByZXF1ZXN0IHBl bmRpbmcuICovDQorCWlmICh1bmxpa2VseSghdG90YWwpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQor CWlmICh0b3RhbCA9PSAxKSB7DQorCQkvKiBzaW5nbGUgYWxsb2NhdGlvbiBpbiB0aGlzIG1hX3N0 YXRlICovDQorCQltYXMtPmFsbG9jID0gTlVMTDsNCisJCXJldCA9IG5vZGU7DQorCQlnb3RvIHNp bmdsZV9ub2RlOw0KKwl9DQorDQorCWlmICghbm9kZS0+bm9kZV9jb3VudCkgew0KKwkJLyogU2lu Z2xlIGFsbG9jYXRpb24gaW4gdGhpcyBub2RlLiAqLw0KKwkJbWFzLT5hbGxvYyA9IG5vZGUtPnNs b3RbMF07DQorCQlub2RlLT5zbG90WzBdID0gTlVMTDsNCisJCW1hcy0+YWxsb2MtPnRvdGFsID0g bm9kZS0+dG90YWwgLSAxOw0KKwkJcmV0ID0gbm9kZTsNCisJCWdvdG8gbmV3X2hlYWQ7DQorCX0N CisNCisJbm9kZS0+dG90YWwtLTsNCisJcmV0ID0gbm9kZS0+c2xvdFtub2RlLT5ub2RlX2NvdW50 XTsNCisJbm9kZS0+c2xvdFtub2RlLT5ub2RlX2NvdW50LS1dID0gTlVMTDsNCisNCitzaW5nbGVf bm9kZToNCituZXdfaGVhZDoNCisJcmV0LT50b3RhbCA9IDA7DQorCXJldC0+bm9kZV9jb3VudCA9 IDA7DQorCWlmIChyZXQtPnJlcXVlc3RfY291bnQpIHsNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1h cywgcmV0LT5yZXF1ZXN0X2NvdW50ICsgMSk7DQorCQlyZXQtPnJlcXVlc3RfY291bnQgPSAwOw0K Kwl9DQorCXJldHVybiAoc3RydWN0IG1hcGxlX25vZGUgKilyZXQ7DQorfQ0KKw0KKy8qDQorICog bWFzX3B1c2hfbm9kZSgpIC0gUHVzaCBhIG5vZGUgYmFjayBvbiB0aGUgbWFwbGUgc3RhdGUgYWxs b2NhdGlvbi4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAdXNlZDogVGhlIHVzZWQg bWFwbGUgbm9kZQ0KKyAqDQorICogU3RvcmVzIHRoZSBtYXBsZSBub2RlIGJhY2sgaW50byBAbWFz LT5hbGxvYyBmb3IgcmV1c2UuICBVcGRhdGVzIGFsbG9jYXRlZCBhbmQNCisgKiByZXF1ZXN0ZWQg bm9kZSBjb3VudCBhcyBuZWNlc3NhcnkuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19w dXNoX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9ub2RlICp1c2VkKQ0K K3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpyZXVzZSA9IChzdHJ1Y3QgbWFwbGVfYWxsb2MgKil1 c2VkOw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKmhlYWQgPSBtYXMtPmFsbG9jOw0KKwl1bnNpZ25l ZCBsb25nIGNvdW50Ow0KKwl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkID0gbWFzX2FsbG9jX3JlcSht YXMpOw0KKw0KKwltZW1zZXQocmV1c2UsIDAsIHNpemVvZigqcmV1c2UpKTsNCisJY291bnQgPSBt YXNfYWxsb2NhdGVkKG1hcyk7DQorDQorCWlmIChjb3VudCAmJiAoaGVhZC0+bm9kZV9jb3VudCA8 IE1BUExFX0FMTE9DX1NMT1RTIC0gMSkpIHsNCisJCWlmIChoZWFkLT5zbG90WzBdKQ0KKwkJCWhl YWQtPm5vZGVfY291bnQrKzsNCisJCWhlYWQtPnNsb3RbaGVhZC0+bm9kZV9jb3VudF0gPSByZXVz ZTsNCisJCWhlYWQtPnRvdGFsKys7DQorCQlnb3RvIGRvbmU7DQorCX0NCisNCisJcmV1c2UtPnRv dGFsID0gMTsNCisJaWYgKChoZWFkKSAmJiAhKCh1bnNpZ25lZCBsb25nKWhlYWQgJiAweDEpKSB7 DQorCQloZWFkLT5yZXF1ZXN0X2NvdW50ID0gMDsNCisJCXJldXNlLT5zbG90WzBdID0gaGVhZDsN CisJCXJldXNlLT50b3RhbCArPSBoZWFkLT50b3RhbDsNCisJfQ0KKw0KKwltYXMtPmFsbG9jID0g cmV1c2U7DQorZG9uZToNCisJaWYgKHJlcXVlc3RlZCA+IDEpDQorCQltYXNfc2V0X2FsbG9jX3Jl cShtYXMsIHJlcXVlc3RlZCAtIDEpOw0KK30NCisNCisvKg0KKyAqIG1hc19hbGxvY19ub2Rlcygp IC0gQWxsb2NhdGUgbm9kZXMgaW50byBhIG1hcGxlIHN0YXRlDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQGdmcDogVGhlIEdGUCBGbGFncw0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYXNfYWxsb2Nfbm9kZXMoc3RydWN0IG1hX3N0YXRlICptYXMsIGdmcF90IGdmcCkNCit7DQor CXN0cnVjdCBtYXBsZV9hbGxvYyAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2FsbG9jICoqbm9kZXAg PSAmbWFzLT5hbGxvYzsNCisJdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWQgPSBtYXNfYWxsb2NhdGVk KG1hcyk7DQorCXVuc2lnbmVkIGxvbmcgc3VjY2VzcyA9IGFsbG9jYXRlZDsNCisJdW5zaWduZWQg aW50IHJlcXVlc3RlZCA9IG1hc19hbGxvY19yZXEobWFzKTsNCisJdW5zaWduZWQgaW50IGNvdW50 Ow0KKwl2b2lkICoqc2xvdHMgPSBOVUxMOw0KKwl1bnNpZ25lZCBpbnQgbWF4X3JlcSA9IDA7DQor DQorCWlmICghcmVxdWVzdGVkKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXNfc2V0X2FsbG9jX3JlcSht YXMsIDApOw0KKwlpZiAoIWFsbG9jYXRlZCB8fCBtYXMtPmFsbG9jLT5ub2RlX2NvdW50ID09IE1B UExFX0FMTE9DX1NMT1RTIC0gMSkgew0KKwkJbm9kZSA9IChzdHJ1Y3QgbWFwbGVfYWxsb2MgKilt dF9hbGxvY19vbmUoZ2ZwKTsNCisJCWlmICghbm9kZSkNCisJCQlnb3RvIG5vbWVtX29uZTsNCisN CisJCWlmIChhbGxvY2F0ZWQpDQorCQkJbm9kZS0+c2xvdFswXSA9IG1hcy0+YWxsb2M7DQorDQor CQlzdWNjZXNzKys7DQorCQltYXMtPmFsbG9jID0gbm9kZTsNCisJCXJlcXVlc3RlZC0tOw0KKwl9 DQorDQorCW5vZGUgPSBtYXMtPmFsbG9jOw0KKwl3aGlsZSAocmVxdWVzdGVkKSB7DQorCQltYXhf cmVxID0gTUFQTEVfTk9ERV9TTE9UUyAtIDE7DQorCQlpZiAobm9kZS0+c2xvdFswXSkgew0KKwkJ CXVuc2lnbmVkIGludCBvZmZzZXQgPSBub2RlLT5ub2RlX2NvdW50ICsgMTsNCisNCisJCQlzbG90 cyA9ICh2b2lkICoqKSZub2RlLT5zbG90W29mZnNldF07DQorCQkJbWF4X3JlcSAtPSBvZmZzZXQ7 DQorCQl9IGVsc2Ugew0KKwkJCXNsb3RzID0gKHZvaWQgKiopJm5vZGUtPnNsb3Q7DQorCQl9DQor DQorCQltYXhfcmVxID0gbWluKHJlcXVlc3RlZCwgbWF4X3JlcSk7DQorCQljb3VudCA9IG10X2Fs bG9jX2J1bGsoZ2ZwLCBtYXhfcmVxLCBzbG90cyk7DQorCQlpZiAoIWNvdW50KQ0KKwkJCWdvdG8g bm9tZW1fYnVsazsNCisNCisJCW5vZGUtPm5vZGVfY291bnQgKz0gY291bnQ7DQorCQkvKiB6ZXJv IGluZGV4ZWQuICovDQorCQlpZiAoc2xvdHMgPT0gKHZvaWQgKiopJm5vZGUtPnNsb3QpDQorCQkJ bm9kZS0+bm9kZV9jb3VudC0tOw0KKw0KKwkJc3VjY2VzcyArPSBjb3VudDsNCisJCW5vZGVwID0g Jm5vZGUtPnNsb3RbMF07DQorCQlub2RlID0gKm5vZGVwOw0KKwkJcmVxdWVzdGVkIC09IGNvdW50 Ow0KKwl9DQorCW1hcy0+YWxsb2MtPnRvdGFsID0gc3VjY2VzczsNCisJcmV0dXJuOw0KKw0KK25v bWVtX2J1bGs6DQorCS8qIENsZWFuIHVwIHBvdGVudGlhbCBmcmVlZCBhbGxvY2F0aW9ucyBvbiBi dWxrIGZhaWx1cmUgKi8NCisJbWVtc2V0KHNsb3RzLCAwLCBtYXhfcmVxICogc2l6ZW9mKHVuc2ln bmVkIGxvbmcpKTsNCitub21lbV9vbmU6DQorCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgcmVxdWVz dGVkKTsNCisJaWYgKG1hcy0+YWxsb2MgJiYgISgoKHVuc2lnbmVkIGxvbmcpbWFzLT5hbGxvYyAm IDB4MSkpKQ0KKwkJbWFzLT5hbGxvYy0+dG90YWwgPSBzdWNjZXNzOw0KKwltYXNfc2V0X2Vyciht YXMsIC1FTk9NRU0pOw0KKwlyZXR1cm47DQorDQorfQ0KKw0KKy8qDQorICogbWFzX2ZyZWUoKSAt IEZyZWUgYW4gZW5jb2RlZCBtYXBsZSBub2RlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQHVzZWQ6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgdG8gZnJlZS4NCisgKg0KKyAqIFVzZXMg cmN1IGZyZWUgaWYgbmVjZXNzYXJ5LCBwdXNoZXMgQHVzZWQgYmFjayBvbiB0aGUgbWFwbGUgc3Rh dGUgYWxsb2NhdGlvbnMNCisgKiBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG1hc19mcmVlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnVzZWQp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqdG1wID0gbXRlX3RvX25vZGUodXNlZCk7DQorDQor CWlmIChtdF9pbl9yY3UobWFzLT50cmVlKSkNCisJCW1hX2ZyZWVfcmN1KHRtcCk7DQorCWVsc2UN CisJCW1hc19wdXNoX25vZGUobWFzLCB0bXApOw0KK30NCisNCisvKg0KKyAqIG1hc19ub2RlX2Nv dW50KCkgLSBDaGVjayBpZiBlbm91Z2ggbm9kZXMgYXJlIGFsbG9jYXRlZCBhbmQgcmVxdWVzdCBt b3JlIGlmDQorICogdGhlcmUgaXMgbm90IGVub3VnaCBub2Rlcy4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAY291bnQ6IFRoZSBudW1iZXIgb2Ygbm9kZXMgbmVlZGVkDQorICogQGdm cDogdGhlIGdmcCBmbGFncw0KKyAqLw0KK3N0YXRpYyB2b2lkIG1hc19ub2RlX2NvdW50X2dmcChz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGNvdW50LCBnZnBfdCBnZnApDQorew0KKwl1bnNpZ25l ZCBsb25nIGFsbG9jYXRlZCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJaWYgKGFsbG9jYXRl ZCA8IGNvdW50KSB7DQorCQltYXNfc2V0X2FsbG9jX3JlcShtYXMsIGNvdW50IC0gYWxsb2NhdGVk KTsNCisJCW1hc19hbGxvY19ub2RlcyhtYXMsIGdmcCk7DQorCX0NCit9DQorDQorLyoNCisgKiBt YXNfbm9kZV9jb3VudCgpIC0gQ2hlY2sgaWYgZW5vdWdoIG5vZGVzIGFyZSBhbGxvY2F0ZWQgYW5k IHJlcXVlc3QgbW9yZSBpZg0KKyAqIHRoZXJlIGlzIG5vdCBlbm91Z2ggbm9kZXMuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQGNvdW50OiBUaGUgbnVtYmVyIG9mIG5vZGVzIG5lZWRl ZA0KKyAqDQorICogTm90ZTogVXNlcyBHRlBfTk9XQUlUIHwgX19HRlBfTk9XQVJOIGZvciBnZnAg ZmxhZ3MuDQorICovDQorc3RhdGljIHZvaWQgbWFzX25vZGVfY291bnQoc3RydWN0IG1hX3N0YXRl ICptYXMsIGludCBjb3VudCkNCit7DQorCXJldHVybiBtYXNfbm9kZV9jb3VudF9nZnAobWFzLCBj b3VudCwgR0ZQX05PV0FJVCB8IF9fR0ZQX05PV0FSTik7DQorfQ0KKw0KKy8qDQorICogbWFzX3N0 YXJ0KCkgLSBTZXRzIHVwIG1hcGxlIHN0YXRlIGZvciBvcGVyYXRpb25zLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIElmIG1hcy0+bm9kZSA9PSBNQVNfU1RBUlQsIHRoZW4g c2V0IHRoZSBtaW4sIG1heCwgZGVwdGgsIGFuZCBvZmZzZXQgdG8NCisgKiBkZWZhdWx0cy4NCisg Kg0KKyAqIFJldHVybjoNCisgKiAtIElmIG1hcy0+bm9kZSBpcyBhbiBlcnJvciBvciBub3QgTUFT X1NUQVJULCByZXR1cm4gTlVMTC4NCisgKiAtIElmIGl0J3MgYW4gZW1wdHkgdHJlZTogICAgIE5V TEwgJiBtYXMtPm5vZGUgPT0gTUFTX05PTkUNCisgKiAtIElmIGl0J3MgYSBzaW5nbGUgZW50cnk6 ICAgIFRoZSBlbnRyeSAmIG1hcy0+bm9kZSA9PSBNQVNfUk9PVA0KKyAqIC0gSWYgaXQncyBhIHRy ZWU6ICAgICAgICAgICAgTlVMTCAmIG1hcy0+bm9kZSA9PSBzYWZlIHJvb3Qgbm9kZS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWFzX3N0YXJ0KHN0cnVjdCBtYV9z dGF0ZSAqbWFzKQ0KK3sNCisJaWYgKGxpa2VseShtYXNfaXNfc3RhcnQobWFzKSkpIHsNCisJCXN0 cnVjdCBtYXBsZV9lbm9kZSAqcm9vdDsNCisNCisJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwkJ bWFzLT5taW4gPSAwOw0KKwkJbWFzLT5tYXggPSBVTE9OR19NQVg7DQorCQltYXMtPmRlcHRoID0g MDsNCisJCW1hcy0+b2Zmc2V0ID0gMDsNCisNCisJCXJvb3QgPSBtYXNfcm9vdChtYXMpOw0KKwkJ LyogVHJlZSB3aXRoIG5vZGVzICovDQorCQlpZiAobGlrZWx5KHhhX2lzX25vZGUocm9vdCkpKSB7 DQorCQkJbWFzLT5ub2RlID0gbXRlX3NhZmVfcm9vdChyb290KTsNCisJCQlyZXR1cm4gTlVMTDsN CisJCX0NCisNCisJCS8qIGVtcHR5IHRyZWUgKi8NCisJCWlmICh1bmxpa2VseSghcm9vdCkpIHsN CisJCQltYXMtPm9mZnNldCA9IE1BUExFX05PREVfU0xPVFM7DQorCQkJcmV0dXJuIE5VTEw7DQor CQl9DQorDQorCQkvKiBTaW5nbGUgZW50cnkgdHJlZSAqLw0KKwkJbWFzLT5ub2RlID0gTUFTX1JP T1Q7DQorCQltYXMtPm9mZnNldCA9IE1BUExFX05PREVfU0xPVFM7DQorDQorCQkvKiBTaW5nbGUg ZW50cnkgdHJlZS4gKi8NCisJCWlmIChtYXMtPmluZGV4ID4gMCkNCisJCQlyZXR1cm4gTlVMTDsN CisNCisJCXJldHVybiByb290Ow0KKwl9DQorDQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0K KyAqIG1hX2RhdGFfZW5kKCkgLSBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgaW4gYSBub2RlLg0K KyAqIEBub2RlOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEB0eXBlOiBUaGUgbWFwbGUgbm9kZSB0eXBl DQorICogQHBpdm90czogVGhlIGFycmF5IG9mIHBpdm90cyBpbiB0aGUgbm9kZQ0KKyAqIEBtYXg6 IFRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBub2RlDQorICoNCisgKiBVc2VzIG1ldGFkYXRhIHRv IGZpbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSB3aGVuIHBvc3NpYmxlLg0KKyAqIFJldHVybjogVGhl IHplcm8gaW5kZXhlZCBsYXN0IHNsb3Qgd2l0aCBkYXRhIChtYXkgYmUgbnVsbCkuDQorICovDQor c3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hX2RhdGFfZW5kKHN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlLA0KKwkJCQkJZW51bSBtYXBsZV90eXBlIHR5cGUsDQorCQkJCQl1bnNpZ25lZCBsb25n ICpwaXZvdHMsDQorCQkJCQl1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCXVuc2lnbmVkIGNoYXIg b2Zmc2V0Ow0KKw0KKwlpZiAodHlwZSA9PSBtYXBsZV9hcmFuZ2VfNjQpDQorCQlyZXR1cm4gbWFf bWV0YV9lbmQobm9kZSwgdHlwZSk7DQorDQorCW9mZnNldCA9IG10X3Bpdm90c1t0eXBlXSAtIDE7 DQorCWlmIChsaWtlbHkoIXBpdm90c1tvZmZzZXRdKSkNCisJCXJldHVybiBtYV9tZXRhX2VuZChu b2RlLCB0eXBlKTsNCisNCisJaWYgKGxpa2VseShwaXZvdHNbb2Zmc2V0XSA9PSBtYXgpKQ0KKwkJ cmV0dXJuIG9mZnNldDsNCisNCisJcmV0dXJuIG10X3Bpdm90c1t0eXBlXTsNCit9DQorDQorLyoN CisgKiBtYXNfZGF0YV9lbmQoKSAtIEZpbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSAoc2xvdCkuDQor ICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBUaGlzIG1ldGhvZCBpcyBvcHRpbWl6 ZWQgdG8gY2hlY2sgdGhlIG1ldGFkYXRhIG9mIGEgbm9kZSBpZiB0aGUgbm9kZSB0eXBlDQorICog c3VwcG9ydHMgZGF0YSBlbmQgbWV0YWRhdGEuDQorICoNCisgKiBSZXR1cm46IFRoZSB6ZXJvIGlu ZGV4ZWQgbGFzdCBzbG90IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgY2hhciBtYXNfZGF0YV9lbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQor CXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCXR5 cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJ aWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUs IHR5cGUpOw0KKw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCW9mZnNldCA9 IG10X3Bpdm90c1t0eXBlXSAtIDE7DQorCWlmIChsaWtlbHkoIXBpdm90c1tvZmZzZXRdKSkNCisJ CXJldHVybiBtYV9tZXRhX2VuZChub2RlLCB0eXBlKTsNCisNCisJaWYgKGxpa2VseShwaXZvdHNb b2Zmc2V0XSA9PSBtYXMtPm1heCkpDQorCQlyZXR1cm4gb2Zmc2V0Ow0KKw0KKwlyZXR1cm4gbXRf cGl2b3RzW3R5cGVdOw0KK30NCisNCisvKg0KKyAqIG1hc19sZWFmX21heF9nYXAoKSAtIFJldHVy bnMgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbGVhZiBub2RlDQorICogQG1hcyAtIHRoZSBtYXBsZSBz dGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11bSBnYXAgaW4gdGhlIGxlYWYuDQorICov DQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzX2xlYWZfbWF4X2dhcChzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdW5zaWduZWQgbG9uZyBwc3RhcnQs IGdhcCwgbWF4X2dhcDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm1uOw0KKwl1bnNpZ25lZCBsb25n ICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hhciBpOw0KKwl1 bnNpZ25lZCBjaGFyIG1heF9waXY7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwltbiA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCW1h eF9nYXAgPSAwOw0KKwlpZiAodW5saWtlbHkobWFfaXNfZGVuc2UobXQpKSkgew0KKwkJZ2FwID0g MDsNCisJCWZvciAoaSA9IDA7IGkgPCBtdF9zbG90c1ttdF07IGkrKykgew0KKwkJCWlmIChzbG90 c1tpXSkgew0KKwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQor CQkJCWdhcCA9IDA7DQorCQkJfSBlbHNlIHsNCisJCQkJZ2FwKys7DQorCQkJfQ0KKwkJfQ0KKwkJ aWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisJCXJldHVybiBtYXhfZ2Fw Ow0KKwl9DQorDQorCS8qDQorCSAqIENoZWNrIHRoZSBmaXJzdCBpbXBsaWVkIHBpdm90IG9wdGlt aXplcyB0aGUgbG9vcCBiZWxvdyBhbmQgc2xvdCAxIG1heQ0KKwkgKiBiZSBza2lwcGVkIGlmIHRo ZXJlIGlzIGEgZ2FwIGluIHNsb3QgMC4NCisJICovDQorCXBpdm90cyA9IG1hX3Bpdm90cyhtbiwg bXQpOw0KKwlpZiAobGlrZWx5KCFzbG90c1swXSkpIHsNCisJCW1heF9nYXAgPSBwaXZvdHNbMF0g LSBtYXMtPm1pbiArIDE7DQorCQlpID0gMjsNCisJfSBlbHNlIHsNCisJCWkgPSAxOw0KKwl9DQor DQorCS8qIHJlZHVjZSBtYXhfcGl2IGFzIHRoZSBzcGVjaWFsIGNhc2UgaXMgY2hlY2tlZCBiZWZv cmUgdGhlIGxvb3AgKi8NCisJbWF4X3BpdiA9IG1hX2RhdGFfZW5kKG1uLCBtdCwgcGl2b3RzLCBt YXMtPm1heCkgLSAxOw0KKwkvKg0KKwkgKiBDaGVjayBlbmQgaW1wbGllZCBwaXZvdCB3aGljaCBj YW4gb25seSBiZSBhIGdhcCBvbiB0aGUgcmlnaHQgbW9zdA0KKwkgKiBub2RlLg0KKwkgKi8NCisJ aWYgKHVubGlrZWx5KG1hcy0+bWF4ID09IFVMT05HX01BWCkgJiYgIXNsb3RzW21heF9waXYgKyAx XSkgew0KKwkJZ2FwID0gVUxPTkdfTUFYIC0gcGl2b3RzW21heF9waXZdOw0KKwkJaWYgKGdhcCA+ IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisJfQ0KKw0KKwlmb3IgKDsgaSA8PSBtYXhf cGl2OyBpKyspIHsNCisJCS8qIGRhdGEgPT0gbm8gZ2FwLiAqLw0KKwkJaWYgKGxpa2VseShzbG90 c1tpXSkpDQorCQkJY29udGludWU7DQorDQorCQlwc3RhcnQgPSBwaXZvdHNbaSAtIDFdOw0KKwkJ Z2FwID0gcGl2b3RzW2ldIC0gcHN0YXJ0Ow0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4 X2dhcCA9IGdhcDsNCisNCisJCS8qIFRoZXJlIGNhbm5vdCBiZSB0d28gZ2FwcyBpbiBhIHJvdy4g Ki8NCisJCWkrKzsNCisJfQ0KKwlyZXR1cm4gbWF4X2dhcDsNCit9DQorDQorLyoNCisgKiBtYV9t YXhfZ2FwKCkgLSBHZXQgdGhlIG1heGltdW0gZ2FwIGluIGEgbWFwbGUgbm9kZSAobm9uLWxlYWYp DQorICogQG5vZGU6IFRoZSBtYXBsZSBub2RlDQorICogQGdhcHM6IFRoZSBwb2ludGVyIHRvIHRo ZSBnYXBzDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQCpvZmY6IFBvaW50ZXIg dG8gc3RvcmUgdGhlIG9mZnNldCBsb2NhdGlvbiBvZiB0aGUgZ2FwLg0KKyAqDQorICogVXNlcyB0 aGUgbWV0YWRhdGEgZGF0YSBlbmQgdG8gc2NhbiBiYWNrd2FyZHMgYWNyb3NzIHNldCBnYXBzLg0K KyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11bSBnYXAgdmFsdWUNCisgKi8NCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGxvbmcNCittYV9tYXhfZ2FwKHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLCB1 bnNpZ25lZCBsb25nICpnYXBzLCBlbnVtIG1hcGxlX3R5cGUgbXQsDQorCSAgICB1bnNpZ25lZCBj aGFyICpvZmYpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCwgaTsNCisJdW5zaWduZWQgbG9u ZyBtYXhfZ2FwID0gMDsNCisNCisJaSA9IG9mZnNldCA9IG1hX21ldGFfZW5kKG5vZGUsIG10KTsN CisJZG8gew0KKwkJaWYgKGdhcHNbaV0gPiBtYXhfZ2FwKSB7DQorCQkJbWF4X2dhcCA9IGdhcHNb aV07DQorCQkJb2Zmc2V0ID0gaTsNCisJCX0NCisJfSB3aGlsZSAoaS0tKTsNCisNCisJKm9mZiA9 IG9mZnNldDsNCisJcmV0dXJuIG1heF9nYXA7DQorfQ0KKw0KKy8qDQorICogbWFzX21heF9nYXAo KSAtIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbm9uLWxlYWYgbm9kZSBhbmQgc2V0IHRoZSBz bG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIElmIHRoZSBtZXRhZGF0 YSBnYXAgaXMgc2V0IHRvIE1BUExFX0FSQU5HRTY0X01FVEFfTUFYLCB0aGVyZSBpcyBubyBnYXAu DQorICoNCisgKiBSZXR1cm46IFRoZSBnYXAgdmFsdWUuDQorICovDQorc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIG1hc19tYXhfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5z aWduZWQgbG9uZyAqZ2FwczsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCWVudW0gbWFwbGVf dHlwZSBtdDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorDQorCW10ID0gbXRlX25vZGVf dHlwZShtYXMtPm5vZGUpOw0KKwlpZiAobWFfaXNfbGVhZihtdCkpDQorCQlyZXR1cm4gbWFzX2xl YWZfbWF4X2dhcChtYXMpOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW9mZnNldCA9IG1h X21ldGFfZ2FwKG5vZGUsIG10KTsNCisJaWYgKG9mZnNldCA9PSBNQVBMRV9BUkFOR0U2NF9NRVRB X01BWCkNCisJCXJldHVybiAwOw0KKw0KKwlnYXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQorCXJl dHVybiBnYXBzW29mZnNldF07DQorfQ0KKw0KKy8qDQorICogbWFzX3BhcmVudF9nYXAoKSAtIFNl dCB0aGUgcGFyZW50IGdhcCBhbmQgYW55IGdhcHMgYWJvdmUsIGFzIG5lZWRlZA0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBnYXAgb2Zmc2V0IGluIHRoZSBwYXJl bnQgdG8gc2V0DQorICogQG5ldzogVGhlIG5ldyBnYXAgdmFsdWUuDQorICoNCisgKiBTZXQgdGhl IHBhcmVudCBnYXAgdGhlbiBjb250aW51ZSB0byBzZXQgdGhlIGdhcCB1cHdhcmRzLCB1c2luZyB0 aGUgbWV0YWRhdGENCisgKiBvZiB0aGUgcGFyZW50IHRvIHNlZSBpZiBpdCBpcyBuZWNlc3Nhcnkg dG8gY2hlY2sgdGhlIG5vZGUgYWJvdmUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19w YXJlbnRfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwNCisJ CXVuc2lnbmVkIGxvbmcgbmV3KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtZXRhX2dhcCA9IDA7DQor CXN0cnVjdCBtYXBsZV9ub2RlICpwbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpwZW5vZGU7 DQorCXVuc2lnbmVkIGxvbmcgKnBnYXBzOw0KKwl1bnNpZ25lZCBjaGFyIG1ldGFfb2Zmc2V0Ow0K KwllbnVtIG1hcGxlX3R5cGUgcG10Ow0KKw0KKwlwbm9kZSA9IG10ZV9wYXJlbnQobWFzLT5ub2Rl KTsNCisJcG10ID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJcGVub2RlID0g bXRfbWtfbm9kZShwbm9kZSwgcG10KTsNCisJcGdhcHMgPSBtYV9nYXBzKHBub2RlLCBwbXQpOw0K Kw0KK2FzY2VuZDoNCisJbWV0YV9vZmZzZXQgPSBtYV9tZXRhX2dhcChwbm9kZSwgcG10KTsNCisJ aWYgKG1ldGFfb2Zmc2V0ID09IE1BUExFX0FSQU5HRTY0X01FVEFfTUFYKQ0KKwkJbWV0YV9nYXAg PSAwOw0KKwllbHNlDQorCQltZXRhX2dhcCA9IHBnYXBzW21ldGFfb2Zmc2V0XTsNCisNCisJcGdh cHNbb2Zmc2V0XSA9IG5ldzsNCisNCisJaWYgKG1ldGFfZ2FwID09IG5ldykNCisJCXJldHVybjsN CisNCisJaWYgKG9mZnNldCAhPSBtZXRhX29mZnNldCkgew0KKwkJaWYgKG1ldGFfZ2FwID4gbmV3 KQ0KKwkJCXJldHVybjsNCisNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10LCBvZmZzZXQp Ow0KKwl9IGVsc2UgaWYgKG5ldyA8IG1ldGFfZ2FwKSB7DQorCQltZXRhX29mZnNldCA9IDE1Ow0K KwkJbmV3ID0gbWFfbWF4X2dhcChwbm9kZSwgcGdhcHMsIHBtdCwgJm1ldGFfb2Zmc2V0KTsNCisJ CW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10LCBtZXRhX29mZnNldCk7DQorCX0NCisNCisJaWYg KG1hX2lzX3Jvb3QocG5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwkvKiBHbyB0byB0aGUgcGFyZW50 IG5vZGUuICovDQorCXBub2RlID0gbXRlX3BhcmVudChwZW5vZGUpOw0KKwlwbXQgPSBtYXNfcGFy ZW50X2VudW0obWFzLCBwZW5vZGUpOw0KKwlwZ2FwcyA9IG1hX2dhcHMocG5vZGUsIHBtdCk7DQor CW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChwZW5vZGUpOw0KKwlwZW5vZGUgPSBtdF9ta19ub2Rl KHBub2RlLCBwbXQpOw0KKwlnb3RvIGFzY2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfdXBkYXRl X2dhcCgpIC0gVXBkYXRlIGEgbm9kZXMgZ2FwcyBhbmQgcHJvcGFnYXRlIHVwIGlmIG5lY2Vzc2Fy eS4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYXNfdXBkYXRlX2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGNo YXIgcHNsb3Q7DQorCXVuc2lnbmVkIGxvbmcgcF9nYXA7DQorCXVuc2lnbmVkIGxvbmcgbWF4X2dh cDsNCisNCisJaWYgKCFtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJbWF4X2dhcCA9IG1h c19tYXhfZ2FwKG1hcyk7DQorDQorCXBzbG90ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7 DQorCXBfZ2FwID0gbWFfZ2FwcyhtdGVfcGFyZW50KG1hcy0+bm9kZSksDQorCQkJbWFzX3BhcmVu dF9lbnVtKG1hcywgbWFzLT5ub2RlKSlbcHNsb3RdOw0KKw0KKwlpZiAocF9nYXAgIT0gbWF4X2dh cCkNCisJCW1hc19wYXJlbnRfZ2FwKG1hcywgcHNsb3QsIG1heF9nYXApOw0KK30NCisNCisvKg0K KyAqIG1hc19hZG9wdF9jaGlsZHJlbigpIC0gU2V0IHRoZSBwYXJlbnQgcG9pbnRlciBvZiBhbGwg bm9kZXMgaW4gQHBhcmVudCB0bw0KKyAqIEBwYXJlbnQgd2l0aCB0aGUgc2xvdCBlbmNvZGVkLg0K KyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgKGZvciB0aGUgdHJlZSkNCisgKiBAcGFyZW50IC0g dGhlIG1hcGxlIGVuY29kZWQgbm9kZSBjb250YWluaW5nIHRoZSBjaGlsZHJlbi4NCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbWFzX2Fkb3B0X2NoaWxkcmVuKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LA0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQpDQorew0KKwllbnVtIG1hcGxlX3R5cGUg dHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUg PSBtYXNfbW4obWFzKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlw ZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorDQor CW9mZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWFzLT5tYXgpOw0KKwlk byB7DQorCQljaGlsZCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJ bXRlX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCwgb2Zmc2V0KTsNCisJfSB3aGlsZSAob2Zmc2V0 LS0pOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXBsYWNlKCkgLSBSZXBsYWNlIGEgbWFwbGUgbm9k ZSBpbiB0aGUgdHJlZSB3aXRoIG1hcy0+bm9kZS4gIFVzZXMgdGhlDQorICogcGFyZW50IGVuY29k aW5nIHRvIGxvY2F0ZSB0aGUgbWFwbGUgbm9kZSBpbiB0aGUgdHJlZS4NCisgKiBAbWFzIC0gdGhl IG1hX3N0YXRlIHRvIHVzZSBmb3Igb3BlcmF0aW9ucy4NCisgKiBAYWR2YW5jZWQgLSBib29sZWFu IHRvIGFkb3B0IHRoZSBjaGlsZCBub2RlcyBhbmQgZnJlZSB0aGUgb2xkIG5vZGUgKGZhbHNlKSBv cg0KKyAqIGxlYXZlIHRoZSBub2RlICh0cnVlKSBhbmQgaGFuZGxlIHRoZSBhZG9wdGlvbiBhbmQg ZnJlZSBlbHNld2hlcmUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19yZXBsYWNlKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCBib29sIGFkdmFuY2VkKQ0KKwlfX211c3RfaG9sZChtYXMtPnRy ZWUtPmxvY2spDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4gPSBtYXNfbW4obWFzKTsNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpvbGRfZW5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0ID0g MDsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gTlVMTDsNCisNCisJaWYgKG1hX2lzX3Jvb3QobW4p KSB7DQorCQlvbGRfZW5vZGUgPSBtYXNfcm9vdF9sb2NrZWQobWFzKTsNCisJfSBlbHNlIHsNCisJ CW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90 cyhtdGVfcGFyZW50KG1hcy0+bm9kZSksDQorCQkJCSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMt Pm5vZGUpKTsNCisJCW9sZF9lbm9kZSA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZz ZXQpOw0KKwl9DQorDQorCWlmICghYWR2YW5jZWQgJiYgIW10ZV9pc19sZWFmKG1hcy0+bm9kZSkp DQorCQltYXNfYWRvcHRfY2hpbGRyZW4obWFzLCBtYXMtPm5vZGUpOw0KKw0KKwlpZiAobXRlX2lz X3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJbW4tPnBhcmVudCA9IG1hX3BhcmVudF9wdHIoDQorCQkJ ICAgICAgKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCQly Y3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290LCBtdGVfbWtfcm9vdChtYXMtPm5v ZGUpKTsNCisJCW1hc19zZXRfaGVpZ2h0KG1hcyk7DQorCX0gZWxzZSB7DQorCQlyY3VfYXNzaWdu X3BvaW50ZXIoc2xvdHNbb2Zmc2V0XSwgbWFzLT5ub2RlKTsNCisJfQ0KKw0KKwlpZiAoIWFkdmFu Y2VkKQ0KKwkJbWFzX2ZyZWUobWFzLCBvbGRfZW5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19u ZXdfY2hpbGQoKSAtIEZpbmQgdGhlIG5ldyBjaGlsZCBvZiBhIG5vZGUuDQorICogQG1hczogdGhl IG1hcGxlIHN0YXRlDQorICogQGNoaWxkOiB0aGUgbWFwbGUgc3RhdGUgdG8gc3RvcmUgdGhlIGNo aWxkLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfbmV3X2NoaWxkKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCBzdHJ1Y3QgbWFfc3RhdGUgKmNoaWxkKQ0KKwlfX211c3RfaG9sZChtYXMtPnRy ZWUtPmxvY2spDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zm c2V0Ow0KKwl1bnNpZ25lZCBjaGFyIGVuZDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwlz dHJ1Y3QgbWFwbGVfZW5vZGUgKmVudHJ5Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJ dm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsN CisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJ cGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwg bXQsIHBpdm90cywgbWFzLT5tYXgpOw0KKwlmb3IgKG9mZnNldCA9IG1hcy0+b2Zmc2V0OyBvZmZz ZXQgPD0gZW5kOyBvZmZzZXQrKykgew0KKwkJZW50cnkgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBz bG90cywgb2Zmc2V0KTsNCisJCWlmIChtdGVfcGFyZW50KGVudHJ5KSA9PSBub2RlKSB7DQorCQkJ KmNoaWxkID0gKm1hczsNCisJCQltYXMtPm9mZnNldCA9IG9mZnNldCArIDE7DQorCQkJY2hpbGQt Pm9mZnNldCA9IG9mZnNldDsNCisJCQltYXNfZGVzY2VuZChjaGlsZCk7DQorCQkJY2hpbGQtPm9m ZnNldCA9IDA7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCX0NCisJcmV0dXJuIGZhbHNlOw0K K30NCisNCisvKg0KKyAqIG1hYl9zaGlmdF9yaWdodCgpIC0gU2hpZnQgdGhlIGRhdGEgaW4gbWFi IHJpZ2h0LiBOb3RlLCBkb2VzIG5vdCBjbGVhbiBvdXQgdGhlDQorICogb2xkIGRhdGEgb3Igc2V0 IGJfbm9kZS0+Yl9lbmQuDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlDQorICogQHNo aWZ0OiB0aGUgc2hpZnQgY291bnQNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFiX3NoaWZ0 X3JpZ2h0KHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCQkgdW5zaWduZWQgY2hh ciBzaGlmdCkNCit7DQorCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJfbm9kZS0+Yl9lbmQgKiBzaXpl b2YodW5zaWduZWQgbG9uZyk7DQorDQorCW1lbW1vdmUoYl9ub2RlLT5waXZvdCArIHNoaWZ0LCBi X25vZGUtPnBpdm90LCBzaXplKTsNCisJbWVtbW92ZShiX25vZGUtPnNsb3QgKyBzaGlmdCwgYl9u b2RlLT5zbG90LCBzaXplKTsNCisJaWYgKGJfbm9kZS0+dHlwZSA9PSBtYXBsZV9hcmFuZ2VfNjQp DQorCQltZW1tb3ZlKGJfbm9kZS0+Z2FwICsgc2hpZnQsIGJfbm9kZS0+Z2FwLCBzaXplKTsNCit9 DQorDQorLyoNCisgKiBtYWJfbWlkZGxlX25vZGUoKSAtIENoZWNrIGlmIGEgbWlkZGxlIG5vZGUg aXMgbmVlZGVkICh1bmxpa2VseSkNCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUgdGhh dCBjb250YWlucyB0aGUgZGF0YS4NCisgKiBAc2l6ZTogdGhlIGFtb3VudCBvZiBkYXRhIGluIHRo ZSBiX25vZGUNCisgKiBAc3BsaXQ6IHRoZSBwb3RlbnRpYWwgc3BsaXQgbG9jYXRpb24NCisgKiBA c2xvdF9jb3VudDogdGhlIHNpemUgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGEgc2luZ2xlIG5vZGUg YmVpbmcgY29uc2lkZXJlZC4NCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiBhIG1pZGRsZSBub2Rl IGlzIHJlcXVpcmVkLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYWJfbWlkZGxlX25vZGUo c3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsIGludCBzcGxpdCwNCisJCQkJICAgdW5zaWdu ZWQgY2hhciBzbG90X2NvdW50KQ0KK3sNCisJdW5zaWduZWQgY2hhciBzaXplID0gYl9ub2RlLT5i X2VuZDsNCisNCisJaWYgKHNpemUgPj0gMiAqIHNsb3RfY291bnQpDQorCQlyZXR1cm4gdHJ1ZTsN CisNCisJaWYgKCFiX25vZGUtPnNsb3Rbc3BsaXRdICYmIChzaXplID49IDIgKiBzbG90X2NvdW50 IC0gMSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0K KyAqIG1hYl9ub19udWxsX3NwbGl0KCkgLSBlbnN1cmUgdGhlIHNwbGl0IGRvZXNuJ3QgZmFsbCBv biBhIE5VTEwNCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUgd2l0aCB0aGUgZGF0YQ0K KyAqIEBzcGxpdDogdGhlIHN1Z2dlc3RlZCBzcGxpdCBsb2NhdGlvbg0KKyAqIEBzbG90X2NvdW50 OiB0aGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBub2RlIGJlaW5nIGNvbnNpZGVyZWQuDQorICoN CisgKiBSZXR1cm46IHRoZSBzcGxpdCBsb2NhdGlvbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIGlu dCBtYWJfbm9fbnVsbF9zcGxpdChzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwNCisJCQkJ ICAgIHVuc2lnbmVkIGNoYXIgc3BsaXQsIHVuc2lnbmVkIGNoYXIgc2xvdF9jb3VudCkNCit7DQor CWlmICghYl9ub2RlLT5zbG90W3NwbGl0XSkgew0KKwkJLyoNCisJCSAqIElmIHRoZSBzcGxpdCBp cyBsZXNzIHRoYW4gdGhlIG1heCBzbG90ICYmIHRoZSByaWdodCBzaWRlIHdpbGwNCisJCSAqIHN0 aWxsIGJlIHN1ZmZpY2llbnQsIHRoZW4gaW5jcmVtZW50IHRoZSBzcGxpdCBvbiBOVUxMLg0KKwkJ ICovDQorCQlpZiAoKHNwbGl0IDwgc2xvdF9jb3VudCAtIDEpICYmDQorCQkgICAgKGJfbm9kZS0+ Yl9lbmQgLSBzcGxpdCkgPiAobXRfbWluX3Nsb3RzW2Jfbm9kZS0+dHlwZV0pKQ0KKwkJCXNwbGl0 Kys7DQorCQllbHNlDQorCQkJc3BsaXQtLTsNCisJfQ0KKwlyZXR1cm4gc3BsaXQ7DQorfQ0KKw0K Ky8qDQorICogbWFiX2NhbGNfc3BsaXQoKSAtIENhbGN1bGF0ZSB0aGUgc3BsaXQgbG9jYXRpb24g YW5kIGlmIHRoZXJlIG5lZWRzIHRvIGJlIHR3bw0KKyAqIHNwbGl0cy4NCisgKiBAYm46IFRoZSBt YXBsZV9iaWdfbm9kZSB3aXRoIHRoZSBkYXRhDQorICogQG1pZF9zcGxpdDogVGhlIHNlY29uZCBz cGxpdCwgaWYgcmVxdWlyZWQuICAwIG90aGVyd2lzZS4NCisgKg0KKyAqIFJldHVybjogVGhlIGZp cnN0IHNwbGl0IGxvY2F0aW9uLiAgVGhlIG1pZGRsZSBzcGxpdCBpcyBzZXQgaW4gQG1pZF9zcGxp dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYWJfY2FsY19zcGxpdChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywNCisJIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYm4sIHVuc2lnbmVkIGNoYXIgKm1p ZF9zcGxpdCwgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kID0g Ym4tPmJfZW5kOw0KKwlpbnQgc3BsaXQgPSBiX2VuZCAvIDI7IC8qIEFzc3VtZSBlcXVhbCBzcGxp dC4gKi8NCisJdW5zaWduZWQgY2hhciBzbG90X21pbiwgc2xvdF9jb3VudCA9IG10X3Nsb3RzW2Ju LT50eXBlXTsNCisNCisJLyoNCisJICogVG8gc3VwcG9ydCBnYXAgdHJhY2tpbmcsIGFsbCBOVUxM IGVudHJpZXMgYXJlIGtlcHQgdG9nZXRoZXIgYW5kIGEgbm9kZSBjYW5ub3QNCisJICogZW5kIG9u IGEgTlVMTCBlbnRyeSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBsZWZ0LW1vc3QgbGVhZi4g IFRoZQ0KKwkgKiBsaW1pdGF0aW9uIG1lYW5zIHRoYXQgdGhlIHNwbGl0IG9mIGEgbm9kZSBtdXN0 IGJlIGNoZWNrZWQgZm9yIHRoaXMgY29uZGl0aW9uDQorCSAqIGFuZCBiZSBhYmxlIHRvIHB1dCBt b3JlIGRhdGEgaW4gb25lIGRpcmVjdGlvbiBvciB0aGUgb3RoZXIuDQorCSAqLw0KKwlpZiAodW5s aWtlbHkoKG1hcy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfQlVMSykpKSB7DQorCQkqbWlkX3NwbGl0 ID0gMDsNCisJCWlmIChtYV9pc19sZWFmKGJuLT50eXBlKSkNCisJCQlzbG90X21pbiA9IDI7DQor CQllbHNlDQorCQkJcmV0dXJuIGJfZW5kIC0gbXRfbWluX3Nsb3RzW2JuLT50eXBlXTsNCisNCisJ CXNwbGl0ID0gYl9lbmQgLSBzbG90X21pbjsNCisJCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NUQVRF X1JFQkFMQU5DRTsNCisJCWlmICghYm4tPnNsb3Rbc3BsaXRdKQ0KKwkJCXNwbGl0LS07DQorCQly ZXR1cm4gc3BsaXQ7DQorCX0NCisNCisJLyoNCisJICogQWx0aG91Z2ggZXh0cmVtZWx5IHJhcmUs IGl0IGlzIHBvc3NpYmxlIHRvIGVudGVyIHdoYXQgaXMga25vd24gYXMgdGhlIDMtd2F5DQorCSAq IHNwbGl0IHNjZW5hcmlvLiAgVGhlIDMtd2F5IHNwbGl0IGNvbWVzIGFib3V0IGJ5IG1lYW5zIG9m IGEgc3RvcmUgb2YgYSByYW5nZQ0KKwkgKiB0aGF0IG92ZXJ3cml0ZXMgdGhlIGVuZCBhbmQgYmVn aW5uaW5nIG9mIHR3byBmdWxsIG5vZGVzLiAgVGhlIHJlc3VsdCBpcyBhIHNldA0KKwkgKiBvZiBl bnRyaWVzIHRoYXQgY2Fubm90IGJlIHN0b3JlZCBpbiAyIG5vZGVzLiAgU29tZXRpbWVzLCB0aGVz ZSB0d28gbm9kZXMgY2FuDQorCSAqIGFsc28gYmUgbG9jYXRlZCBpbiBkaWZmZXJlbnQgcGFyZW50 IG5vZGVzIHdoaWNoIGFyZSBhbHNvIGZ1bGwuICBUaGlzIGNhbg0KKwkgKiBjYXJyeSB1cHdhcmRz IGFsbCB0aGUgd2F5IHRvIHRoZSByb290IGluIHRoZSB3b3JzdCBjYXNlLg0KKwkgKi8NCisJaWYg KHVubGlrZWx5KG1hYl9taWRkbGVfbm9kZShibiwgc3BsaXQsIHNsb3RfY291bnQpKSkgew0KKwkJ c3BsaXQgPSBiX2VuZCAvIDM7DQorCQkqbWlkX3NwbGl0ID0gc3BsaXQgKiAyOw0KKwl9IGVsc2Ug ew0KKwkJc2xvdF9taW4gPSBtdF9taW5fc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkJKm1pZF9zcGxp dCA9IDA7DQorCQkvKg0KKwkJICogQXZvaWQgaGF2aW5nIGEgcmFuZ2UgbGVzcyB0aGFuIHRoZSBz bG90IGNvdW50IHVubGVzcyBpdA0KKwkJICogY2F1c2VzIG9uZSBub2RlIHRvIGJlIGRlZmljaWVu dC4NCisJCSAqIE5PVEU6IG10X21pbl9zbG90cyBpcyAxIGJhc2VkLCBiX2VuZCBhbmQgc3BsaXQg YXJlIHplcm8uDQorCQkgKi8NCisJCXdoaWxlICgoKGJuLT5waXZvdFtzcGxpdF0gLSBtaW4pIDwg c2xvdF9jb3VudCAtIDEpICYmDQorCQkgICAgICAgKHNwbGl0IDwgc2xvdF9jb3VudCAtIDEpICYm IChiX2VuZCAtIHNwbGl0ID4gc2xvdF9taW4pKQ0KKwkJCXNwbGl0Kys7DQorCX0NCisNCisJLyog QXZvaWQgZW5kaW5nIGEgbm9kZSBvbiBhIE5VTEwgZW50cnkgKi8NCisJc3BsaXQgPSBtYWJfbm9f bnVsbF9zcGxpdChibiwgc3BsaXQsIHNsb3RfY291bnQpOw0KKwlpZiAoISgqbWlkX3NwbGl0KSkN CisJCXJldHVybiBzcGxpdDsNCisNCisJKm1pZF9zcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KGJu LCAqbWlkX3NwbGl0LCBzbG90X2NvdW50KTsNCisNCisJcmV0dXJuIHNwbGl0Ow0KK30NCisNCisv Kg0KKyAqIG1hc19tYWJfY3AoKSAtIENvcHkgZGF0YSBmcm9tIGEgbWFwbGUgc3RhdGUgaW5jbHVz aXZlbHkgdG8gYSBtYXBsZV9iaWdfbm9kZQ0KKyAqIGFuZCBzZXQgQGJfbm9kZS0+Yl9lbmQgdG8g dGhlIG5leHQgZnJlZSBzbG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXNf c3RhcnQ6IFRoZSBzdGFydGluZyBzbG90IHRvIGNvcHkNCisgKiBAbWFzX2VuZDogVGhlIGVuZCBz bG90IHRvIGNvcHkgKGluY2x1c2l2ZWx5KQ0KKyAqIEBiX25vZGU6IFRoZSBtYXBsZV9iaWdfbm9k ZSB0byBwbGFjZSB0aGUgZGF0YQ0KKyAqIEBtYWJfc3RhcnQ6IFRoZSBzdGFydGluZyBsb2NhdGlv biBpbiBtYXBsZV9iaWdfbm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKi8NCitzdGF0aWMgaW5s aW5lIHZvaWQgbWFzX21hYl9jcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBt YXNfc3RhcnQsDQorCQkJdW5zaWduZWQgY2hhciBtYXNfZW5kLCBzdHJ1Y3QgbWFwbGVfYmlnX25v ZGUgKmJfbm9kZSwNCisJCQl1bnNpZ25lZCBjaGFyIG1hYl9zdGFydCkNCit7DQorCWVudW0gbWFw bGVfdHlwZSBtdDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzLCAqZ2FwczsNCisJaW50IGkgPSBtYXNfc3Rh cnQsIGogPSBtYWJfc3RhcnQ7DQorCXVuc2lnbmVkIGNoYXIgcGl2X2VuZDsNCisNCisJbm9kZSA9 IG1hc19tbihtYXMpOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3Rz ID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJaWYgKCFpKSB7DQorCQliX25vZGUtPnBpdm90W2pd ID0gcGl2b3RzW2krK107DQorCQlpZiAodW5saWtlbHkoaSA+IG1hc19lbmQpKQ0KKwkJCWdvdG8g Y29tcGxldGU7DQorCQlqKys7DQorCX0NCisNCisJcGl2X2VuZCA9IG1pbihtYXNfZW5kLCBtdF9w aXZvdHNbbXRdKTsNCisJZm9yICg7IGkgPCBwaXZfZW5kOyBpKyssIGorKykgew0KKwkJYl9ub2Rl LT5waXZvdFtqXSA9IHBpdm90c1tpXTsNCisJCWlmICh1bmxpa2VseSghYl9ub2RlLT5waXZvdFtq XSkpDQorCQkJYnJlYWs7DQorDQorCQlpZiAodW5saWtlbHkobWFzLT5tYXggPT0gYl9ub2RlLT5w aXZvdFtqXSkpDQorCQkJZ290byBjb21wbGV0ZTsNCisJfQ0KKw0KKwlpZiAobGlrZWx5KGkgPD0g bWFzX2VuZCkpDQorCQliX25vZGUtPnBpdm90W2pdID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZv dHMsIGksIG10KTsNCisNCitjb21wbGV0ZToNCisJYl9ub2RlLT5iX2VuZCA9ICsrajsNCisJaiAt PSBtYWJfc3RhcnQ7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwltZW1jcHkoYl9u b2RlLT5zbG90ICsgbWFiX3N0YXJ0LCBzbG90cyArIG1hc19zdGFydCwgc2l6ZW9mKHZvaWQgKikg KiBqKTsNCisJaWYgKCFtYV9pc19sZWFmKG10KSAmJiBtdF9pc19hbGxvYyhtYXMtPnRyZWUpKSB7 DQorCQlnYXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQorCQltZW1jcHkoYl9ub2RlLT5nYXAgKyBt YWJfc3RhcnQsIGdhcHMgKyBtYXNfc3RhcnQsDQorCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxv bmcpICogaik7DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfbGVhZl9zZXRfbWV0YSgpIC0gU2V0 IHRoZSBtZXRhZGF0YSBvZiBhIGxlYWYgaWYgcG9zc2libGUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQG5vZGU6IFRoZSBtYXBsZSBub2RlDQorICogQHBpdm90czogcG9pbnRlciB0 byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAbXQ6IFRoZSBtYXBsZSB0eXBlDQorICogQGVu ZDogVGhlIGFzc3VtZWQgZW5kDQorICoNCisgKiBOb3RlLCBlbmQgbWF5IGJlIGluY3JlbWVudGVk IHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGJ1dCBub3QgbW9kaWZpZWQgYXQgdGhlDQorICogc291cmNl LiAgVGhpcyBpcyBmaW5lIHNpbmNlIHRoZSBtZXRhZGF0YSBpcyB0aGUgbGFzdCB0aGluZyB0byBi ZSBzdG9yZWQgaW4gYQ0KKyAqIG5vZGUgZHVyaW5nIGEgd3JpdGUuDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG1hc19sZWFmX3NldF9tZXRhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJCWVudW0gbWFw bGVfdHlwZSBtdCwgdW5zaWduZWQgY2hhciBlbmQpDQorew0KKwkvKiBUaGVyZSBpcyBubyByb29t IGZvciBtZXRhZGF0YSBhbHJlYWR5ICovDQorCWlmIChtdF9waXZvdHNbbXRdIDw9IGVuZCkNCisJ CXJldHVybjsNCisNCisJaWYgKHBpdm90c1tlbmRdICYmIHBpdm90c1tlbmRdIDwgbWFzLT5tYXgp DQorCQllbmQrKzsNCisNCisJaWYgKGVuZCA8IG10X3Nsb3RzW210XSAtIDEpDQorCQltYV9zZXRf bWV0YShub2RlLCBtdCwgMCwgZW5kKTsNCit9DQorDQorLyoNCisgKiBtYWJfbWFzX2NwKCkgLSBD b3B5IGRhdGEgZnJvbSBtYXBsZV9iaWdfbm9kZSB0byBhIG1hcGxlIGVuY29kZWQgbm9kZS4NCisg KiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUgdGhhdCBoYXMgdGhlIGRhdGENCisgKiBAbWFi X3N0YXJ0OiB0aGUgc3RhcnQgbG9jYXRpb24gaW4gQGJfbm9kZS4NCisgKiBAbWFiX2VuZDogVGhl IGVuZCBsb2NhdGlvbiBpbiBAYl9ub2RlIChpbmNsdXNpdmVseSkNCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUgd2l0aCB0aGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtYWJfbWFzX2NwKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCSAg ICAgIHVuc2lnbmVkIGNoYXIgbWFiX3N0YXJ0LCB1bnNpZ25lZCBjaGFyIG1hYl9lbmQsDQorCQkJ ICAgICAgc3RydWN0IG1hX3N0YXRlICptYXMsIGJvb2wgbmV3X21heCkNCit7DQorCWludCBpLCBq ID0gMDsNCisJZW51bSBtYXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKG1hcy0+bm9kZSk7DQorCXZv aWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAq cGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAqZ2FwcyA9IE5V TEw7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKw0KKwlpZiAobWFiX2VuZCAtIG1hYl9zdGFydCA+ IG10X3Bpdm90c1ttdF0pDQorCQltYWJfZW5kLS07DQorDQorCWlmICghcGl2b3RzW210X3Bpdm90 c1ttdF0gLSAxXSkNCisJCXNsb3RzW210X3Bpdm90c1ttdF1dID0gTlVMTDsNCisNCisJaSA9IG1h Yl9zdGFydDsNCisJZG8gew0KKwkJcGl2b3RzW2orK10gPSBiX25vZGUtPnBpdm90W2krK107DQor CX0gd2hpbGUgKGkgPD0gbWFiX2VuZCAmJiBsaWtlbHkoYl9ub2RlLT5waXZvdFtpXSkpOw0KKw0K KwltZW1jcHkoc2xvdHMsIGJfbm9kZS0+c2xvdCArIG1hYl9zdGFydCwNCisJICAgICAgIHNpemVv Zih2b2lkICopICogKGkgLSBtYWJfc3RhcnQpKTsNCisNCisJaWYgKG5ld19tYXgpDQorCQltYXMt Pm1heCA9IGJfbm9kZS0+cGl2b3RbaSAtIDFdOw0KKw0KKwllbmQgPSBqIC0gMTsNCisJaWYgKGxp a2VseSghbWFfaXNfbGVhZihtdCkgJiYgbXRfaXNfYWxsb2MobWFzLT50cmVlKSkpIHsNCisJCXVu c2lnbmVkIGxvbmcgbWF4X2dhcCA9IDA7DQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDE1Ow0K Kw0KKwkJZ2FwcyA9IG1hX2dhcHMobm9kZSwgbXQpOw0KKwkJZG8gew0KKwkJCWdhcHNbLS1qXSA9 IGJfbm9kZS0+Z2FwWy0taV07DQorCQkJaWYgKGdhcHNbal0gPiBtYXhfZ2FwKSB7DQorCQkJCW9m ZnNldCA9IGo7DQorCQkJCW1heF9nYXAgPSBnYXBzW2pdOw0KKwkJCX0NCisJCX0gd2hpbGUgKGop Ow0KKw0KKwkJbWFfc2V0X21ldGEobm9kZSwgbXQsIG9mZnNldCwgZW5kKTsNCisJfSBlbHNlIHsN CisJCW1hc19sZWFmX3NldF9tZXRhKG1hcywgbm9kZSwgcGl2b3RzLCBtdCwgZW5kKTsNCisJfQ0K K30NCisNCisvKg0KKyAqIG1hc19kZXNjZW5kX2Fkb3B0KCkgLSBEZXNjZW5kIHRocm91Z2ggYSBz dWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4uDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHdp dGggdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBvZiB0aGUgc3ViLXRyZWUuDQorICoNCisgKiBEZXNj ZW5kIHRocm91Z2ggYSBzdWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4gd2hvIGRvIG5vdCBoYXZl IHRoZSBjb3JyZWN0DQorICogcGFyZW50cyBzZXQuICBGb2xsb3cgdGhlIHBhcmVudHMgd2hpY2gg aGF2ZSB0aGUgY29ycmVjdCBwYXJlbnRzIGFzIHRoZXkgYXJlDQorICogdGhlIG5ldyBlbnRyaWVz IHdoaWNoIG5lZWQgdG8gYmUgZm9sbG93ZWQgdG8gZmluZCBvdGhlciBpbmNvcnJlY3RseSBzZXQN CisgKiBwYXJlbnRzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVzY2VuZF9hZG9w dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSBsaXN0WzNdLCBu ZXh0WzNdOw0KKwlpbnQgaSwgbjsNCisNCisJLyoNCisJICogQXQgZWFjaCBsZXZlbCB0aGVyZSBt YXkgYmUgdXAgdG8gMyBjb3JyZWN0IHBhcmVudCBwb2ludGVycyB3aGljaCBpbmRpY2F0ZXMNCisJ ICogdGhlIG5ldyBub2RlcyB3aGljaCBuZWVkIHRvIGJlIHdhbGtlZCB0byBmaW5kIGFueSBuZXcg bm9kZXMgYXQgYSBsb3dlciBsZXZlbC4NCisJICovDQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBp KyspIHsNCisJCWxpc3RbaV0gPSAqbWFzOw0KKwkJbGlzdFtpXS5vZmZzZXQgPSAwOw0KKwkJbmV4 dFtpXS5vZmZzZXQgPSAwOw0KKwl9DQorCW5leHRbMF0gPSAqbWFzOw0KKw0KKwl3aGlsZSAoIW10 ZV9pc19sZWFmKGxpc3RbMF0ubm9kZSkpIHsNCisJCW4gPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8 IDM7IGkrKykgew0KKwkJCWlmIChtYXNfaXNfbm9uZSgmbGlzdFtpXSkpDQorCQkJCWNvbnRpbnVl Ow0KKw0KKwkJCWlmIChpICYmIGxpc3RbaS0xXS5ub2RlID09IGxpc3RbaV0ubm9kZSkNCisJCQkJ Y29udGludWU7DQorDQorCQkJd2hpbGUgKChuIDwgMykgJiYgKG1hc19uZXdfY2hpbGQoJmxpc3Rb aV0sICZuZXh0W25dKSkpDQorCQkJCW4rKzsNCisNCisJCQltYXNfYWRvcHRfY2hpbGRyZW4oJmxp c3RbaV0sIGxpc3RbaV0ubm9kZSk7DQorCQl9DQorDQorCQl3aGlsZSAobiA8IDMpDQorCQkJbmV4 dFtuKytdLm5vZGUgPSBNQVNfTk9ORTsNCisNCisJCS8qIGRlc2NlbmQgYnkgc2V0dGluZyB0aGUg bGlzdCB0byB0aGUgY2hpbGRyZW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQkJ bGlzdFtpXSA9IG5leHRbaV07DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfYnVsa19yZWJhbGFu Y2UoKSAtIFJlYmFsYW5jZSB0aGUgZW5kIG9mIGEgdHJlZSBhZnRlciBhIGJ1bGsgaW5zZXJ0Lg0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbmQ6IFRoZSBtYXBsZSBub2RlIGVuZA0K KyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfYnVsa19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5k LA0KKwkJCQkgICAgICBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlpZiAoIShtYXMtPm1hc19m bGFncyAmIE1BX1NUQVRFX0JVTEspKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3Qo bWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJaWYgKGVuZCA+IG10X21pbl9zbG90c1ttdF0p IHsNCisJCW1hcy0+bWFzX2ZsYWdzICY9IH5NQV9TVEFURV9SRUJBTEFOQ0U7DQorCQlyZXR1cm47 DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfc3RvcmVfYl9ub2RlKCkgLSBTdG9yZSBhbiBAZW50 cnkgaW50byB0aGUgYl9ub2RlIHdoaWxlIGFsc28gY29weWluZyB0aGUNCisgKiBkYXRhIGZyb20g YSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRlIHN0YXRl DQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGZpbGwgd2l0aCBkYXRhDQorICog QG9mZnNldF9lbmQ6IHRoZSBvZmZzZXQgdG8gZW5kIGNvcHlpbmcNCisgKg0KKyAqIFJldHVybjog VGhlIGFjdHVhbCBlbmQgb2YgdGhlIGRhdGEgc3RvcmVkIGluIEBiX25vZGUNCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3N0b3JlX2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21h cywNCisJCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBjaGFyIG9mZnNl dF9lbmQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3Q7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQ7 DQorCS8qIFBvc3NpYmxlIHVuZGVyZmxvdyBvZiBwaXYgd2lsbCB3cmFwIGJhY2sgdG8gMCBiZWZv cmUgdXNlLiAqLw0KKwl1bnNpZ25lZCBsb25nIHBpdjsNCisJc3RydWN0IG1hX3N0YXRlICptYXMg PSB3cl9tYXMtPm1hczsNCisNCisJYl9ub2RlLT50eXBlID0gd3JfbWFzLT50eXBlOw0KKwliX2Vu ZCA9IDA7DQorCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJaWYgKHNsb3QpIHsNCisJCS8qIENvcHkg c3RhcnQgZGF0YSB1cCB0byBpbnNlcnQuICovDQorCQltYXNfbWFiX2NwKG1hcywgMCwgc2xvdCAt IDEsIGJfbm9kZSwgMCk7DQorCQliX2VuZCA9IGJfbm9kZS0+Yl9lbmQ7DQorCQlwaXYgPSBiX25v ZGUtPnBpdm90W2JfZW5kIC0gMV07DQorCX0gZWxzZQ0KKwkJcGl2ID0gbWFzLT5taW4gLSAxOw0K Kw0KKwlpZiAocGl2ICsgMSA8IG1hcy0+aW5kZXgpIHsNCisJCS8qIEhhbmRsZSByYW5nZSBzdGFy dGluZyBhZnRlciBvbGQgcmFuZ2UgKi8NCisJCWJfbm9kZS0+c2xvdFtiX2VuZF0gPSB3cl9tYXMt PmNvbnRlbnQ7DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2Vu ZF0gPSBtYXMtPmluZGV4IC0gMSAtIHBpdjsNCisJCWJfbm9kZS0+cGl2b3RbYl9lbmQrK10gPSBt YXMtPmluZGV4IC0gMTsNCisJfQ0KKw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5LiAqLw0KKwlt YXMtPm9mZnNldCA9IGJfZW5kOw0KKwliX25vZGUtPnNsb3RbYl9lbmRdID0gd3JfbWFzLT5lbnRy eTsNCisJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBtYXMtPmxhc3Q7DQorDQorCS8qIEFwcGVuZGVk LiAqLw0KKwlpZiAobWFzLT5sYXN0ID49IG1hcy0+bWF4KQ0KKwkJZ290byBiX2VuZDsNCisNCisJ LyogSGFuZGxlIG5ldyByYW5nZSBlbmRpbmcgYmVmb3JlIG9sZCByYW5nZSBlbmRzICovDQorCXBp diA9IG1hc19sb2dpY2FsX3Bpdm90KG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNldF9lbmQsIHdy X21hcy0+dHlwZSk7DQorCWlmIChwaXYgPiBtYXMtPmxhc3QpIHsNCisJCWlmIChwaXYgPT0gVUxP TkdfTUFYKQ0KKwkJCW1hc19idWxrX3JlYmFsYW5jZShtYXMsIGJfbm9kZS0+Yl9lbmQsIHdyX21h cy0+dHlwZSk7DQorDQorCQlpZiAob2Zmc2V0X2VuZCAhPSBzbG90KQ0KKwkJCXdyX21hcy0+Y29u dGVudCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJCSAgb2Zm c2V0X2VuZCk7DQorDQorCQliX25vZGUtPnNsb3RbKytiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7 DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBwaXYg LSBtYXMtPmxhc3QgKyAxOw0KKwkJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBwaXY7DQorCX0NCisN CisJc2xvdCA9IG9mZnNldF9lbmQgKyAxOw0KKwlpZiAoc2xvdCA+IHdyX21hcy0+bm9kZV9lbmQp DQorCQlnb3RvIGJfZW5kOw0KKw0KKwkvKiBDb3B5IGVuZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhl IG5vZGUuICovDQorCW1hc19tYWJfY3AobWFzLCBzbG90LCB3cl9tYXMtPm5vZGVfZW5kICsgMSwg Yl9ub2RlLCArK2JfZW5kKTsNCisJYl9ub2RlLT5iX2VuZC0tOw0KKwlyZXR1cm47DQorDQorYl9l bmQ6DQorCWJfbm9kZS0+Yl9lbmQgPSBiX2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJldl9z aWJsaW5nKCkgLSBGaW5kIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIHNhbWUgcGFyZW50Lg0K KyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHRoZXJl IGlzIGEgcHJldmlvdXMgc2libGluZywgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgYm9vbCBtYXNfcHJldl9zaWJsaW5nKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJ dW5zaWduZWQgaW50IHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKw0KKwlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKCFw X3Nsb3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1hc19hc2NlbmQobWFzKTsNCisJbWFzLT5v ZmZzZXQgPSBwX3Nsb3QgLSAxOw0KKwltYXNfZGVzY2VuZChtYXMpOw0KKwlyZXR1cm4gdHJ1ZTsN Cit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9zaWJsaW5nKCkgLSBGaW5kIHRoZSBuZXh0IG5vZGUg d2l0aCB0aGUgc2FtZSBwYXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisg KiBSZXR1cm46IHRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHNpYmxpbmcsIGZhbHNlIG90aGVyd2lz ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX25leHRfc2libGluZyhzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCU1BX1NUQVRFKHBhcmVudCwgbWFzLT50cmVlLCBtYXMtPmluZGV4 LCBtYXMtPmxhc3QpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVy biBmYWxzZTsNCisNCisJcGFyZW50ID0gKm1hczsNCisJbWFzX2FzY2VuZCgmcGFyZW50KTsNCisJ cGFyZW50Lm9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpICsgMTsNCisJaWYgKHBh cmVudC5vZmZzZXQgPiBtYXNfZGF0YV9lbmQoJnBhcmVudCkpDQorCQlyZXR1cm4gZmFsc2U7DQor DQorCSptYXMgPSBwYXJlbnQ7DQorCW1hc19kZXNjZW5kKG1hcyk7DQorCXJldHVybiB0cnVlOw0K K30NCisNCisvKg0KKyAqIG10ZV9ub2RlX29yX25vZGUoKSAtIFJldHVybiB0aGUgZW5jb2RlZCBu b2RlIG9yIE1BU19OT05FLg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisg Kg0KKyAqIFNob3J0aGFuZCB0byBhdm9pZCBzZXR0aW5nICVOVUxMcyBpbiB0aGUgdHJlZSBvciBt YXBsZV9zdWJ0cmVlX3N0YXRlLg0KKyAqDQorICogUmV0dXJuOiBAZW5vZGUgb3IgTUFTX05PTkUN CisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbXRlX25vZGVfb3Jfbm9u ZShzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJaWYgKGVub2RlKQ0KKwkJcmV0dXJu IGVub2RlOw0KKw0KKwlyZXR1cm4gbWFfZW5vZGVfcHRyKE1BU19OT05FKTsNCit9DQorDQorLyoN CisgKiBtYXNfd3Jfbm9kZV93YWxrKCkgLSBGaW5kIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhl IGluZGV4IGluIHRoZSBAbWFzLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0K KyAqDQorICogVXNlcyBtYXNfc2xvdF9sb2NrZWQoKSBhbmQgZG9lcyBub3QgbmVlZCB0byB3b3Jy eSBhYm91dCBkZWFkIG5vZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3Jfbm9k ZV93YWxrKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRl ICptYXMgPSB3cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBjb3VudDsNCisJdW5zaWduZWQg Y2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1pbiwgbWF4Ow0KKw0KKwlpZiAo dW5saWtlbHkobWFfaXNfZGVuc2Uod3JfbWFzLT50eXBlKSkpIHsNCisJCXdyX21hcy0+cl9tYXgg PSB3cl9tYXMtPnJfbWluID0gbWFzLT5pbmRleDsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzLT5pbmRl eCA9IG1hcy0+bWluOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCXdyX21hcy0+bm9kZSA9IG1hc19t bih3cl9tYXMtPm1hcyk7DQorCXdyX21hcy0+cGl2b3RzID0gbWFfcGl2b3RzKHdyX21hcy0+bm9k ZSwgd3JfbWFzLT50eXBlKTsNCisJY291bnQgPSB3cl9tYXMtPm5vZGVfZW5kID0gbWFfZGF0YV9l bmQod3JfbWFzLT5ub2RlLCB3cl9tYXMtPnR5cGUsDQorCQkJCQkgICAgICAgd3JfbWFzLT5waXZv dHMsIG1hcy0+bWF4KTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1pbiA9IG1hc19zYWZl X21pbihtYXMsIHdyX21hcy0+cGl2b3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkob2Zmc2V0 ID09IGNvdW50KSkNCisJCWdvdG8gbWF4Ow0KKw0KKwltYXggPSB3cl9tYXMtPnBpdm90c1tvZmZz ZXRdOw0KKwlpbmRleCA9IG1hcy0+aW5kZXg7DQorCWlmICh1bmxpa2VseShpbmRleCA8PSBtYXgp KQ0KKwkJZ290byBkb25lOw0KKw0KKwlpZiAodW5saWtlbHkoIW1heCAmJiBvZmZzZXQpKQ0KKwkJ Z290byBtYXg7DQorDQorCW1pbiA9IG1heCArIDE7DQorCXdoaWxlICgrK29mZnNldCA8IGNvdW50 KSB7DQorCQltYXggPSB3cl9tYXMtPnBpdm90c1tvZmZzZXRdOw0KKwkJaWYgKGluZGV4IDw9IG1h eCkNCisJCQlnb3RvIGRvbmU7DQorCQllbHNlIGlmICh1bmxpa2VseSghbWF4KSkNCisJCQlicmVh azsNCisNCisJCW1pbiA9IG1heCArIDE7DQorCX0NCisNCittYXg6DQorCW1heCA9IG1hcy0+bWF4 Ow0KK2RvbmU6DQorCXdyX21hcy0+cl9tYXggPSBtYXg7DQorCXdyX21hcy0+cl9taW4gPSBtaW47 DQorCXdyX21hcy0+b2Zmc2V0X2VuZCA9IG1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KK30NCisNCisv Kg0KKyAqIG1hc190b3BpYXJ5X3JhbmdlKCkgLSBBZGQgYSByYW5nZSBvZiBzbG90cyB0byB0aGUg dG9waWFyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZGVzdHJveTogVGhlIHRv cGlhcnkgdG8gYWRkIHRoZSBzbG90cyAodXN1YWxseSBkZXN0cm95KQ0KKyAqIEBzdGFydDogVGhl IHN0YXJ0aW5nIHNsb3QgaW5jbHVzaXZlbHkNCisgKiBAZW5kOiBUaGUgZW5kIHNsb3QgaW5jbHVz aXZlbHkNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3RvcGlhcnlfcmFuZ2Uoc3RydWN0 IG1hX3N0YXRlICptYXMsDQorCXN0cnVjdCBtYV90b3BpYXJ5ICpkZXN0cm95LCB1bnNpZ25lZCBj aGFyIHN0YXJ0LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorDQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG10ZV9p c19sZWFmKG1hcy0+bm9kZSkpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXMpLCBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSkpOw0KKwlmb3IgKG9mZnNldCA9IHN0YXJ0OyBvZmZzZXQgPD0g ZW5kOyBvZmZzZXQrKykgew0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSA9IG1hc19zbG90 X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKw0KKwkJaWYgKG10ZV9kZWFkX25vZGUoZW5v ZGUpKQ0KKwkJCWNvbnRpbnVlOw0KKw0KKwkJbWF0X2FkZChkZXN0cm95LCBlbm9kZSk7DQorCX0N Cit9DQorDQorLyoNCisgKiBtYXN0X3RvcGlhcnkoKSAtIEFkZCB0aGUgcG9ydGlvbnMgb2YgdGhl IHRyZWUgdG8gdGhlIHJlbW92YWwgbGlzdDsgZWl0aGVyIHRvDQorICogYmUgZnJlZWQgb3IgZGlz Y2FyZGVkIChkZXN0cm95IHdhbGspLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0 ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF90b3BpYXJ5KHN0cnVjdCBtYXBsZV9z dWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXN0LT5vcmln X2wsIE5VTEwpOw0KKwl1bnNpZ25lZCBjaGFyIHJfc3RhcnQsIHJfZW5kOw0KKwl1bnNpZ25lZCBj aGFyIGxfc3RhcnQsIGxfZW5kOw0KKwl2b2lkIF9fcmN1ICoqbF9zbG90cywgKipyX3Nsb3RzOw0K Kw0KKwl3cl9tYXMudHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCisJ bWFzdC0+b3JpZ19sLT5pbmRleCA9IG1hc3QtPm9yaWdfbC0+bGFzdDsNCisJbWFzX3dyX25vZGVf d2Fsaygmd3JfbWFzKTsNCisJbF9zdGFydCA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0ICsgMTsNCisJ bF9lbmQgPSBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19sKTsNCisJcl9zdGFydCA9IDA7DQorCXJf ZW5kID0gbWFzdC0+b3JpZ19yLT5vZmZzZXQ7DQorDQorCWlmIChyX2VuZCkNCisJCXJfZW5kLS07 DQorDQorCWxfc2xvdHMgPSBtYV9zbG90cyhtYXNfbW4obWFzdC0+b3JpZ19sKSwNCisJCQkgICBt dGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0KKw0KKwlyX3Nsb3RzID0gbWFfc2xv dHMobWFzX21uKG1hc3QtPm9yaWdfciksDQorCQkJICAgbXRlX25vZGVfdHlwZShtYXN0LT5vcmln X3ItPm5vZGUpKTsNCisNCisJaWYgKChsX3N0YXJ0IDwgbF9lbmQpICYmDQorCSAgICBtdGVfZGVh ZF9ub2RlKG1hc19zbG90X2xvY2tlZChtYXN0LT5vcmlnX2wsIGxfc2xvdHMsIGxfc3RhcnQpKSkg ew0KKwkJbF9zdGFydCsrOw0KKwl9DQorDQorCWlmIChtdGVfZGVhZF9ub2RlKG1hc19zbG90X2xv Y2tlZChtYXN0LT5vcmlnX3IsIHJfc2xvdHMsIHJfZW5kKSkpIHsNCisJCWlmIChyX2VuZCkNCisJ CQlyX2VuZC0tOw0KKwl9DQorDQorCWlmICgobF9zdGFydCA+IHJfZW5kKSAmJiAobWFzdC0+b3Jp Z19sLT5ub2RlID09IG1hc3QtPm9yaWdfci0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCS8qIEF0 IHRoZSBub2RlIHdoZXJlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIG1lZXQsIGFkZCB0aGUgcGFydHMg YmV0d2VlbiAqLw0KKwlpZiAobWFzdC0+b3JpZ19sLT5ub2RlID09IG1hc3QtPm9yaWdfci0+bm9k ZSkgew0KKwkJcmV0dXJuIG1hc190b3BpYXJ5X3JhbmdlKG1hc3QtPm9yaWdfbCwgbWFzdC0+ZGVz dHJveSwNCisJCQkJCSAgICAgbF9zdGFydCwgcl9lbmQpOw0KKwl9DQorDQorCS8qIG1hc3QtPm9y aWdfciBpcyBkaWZmZXJlbnQgYW5kIGNvbnN1bWVkLiAqLw0KKwlpZiAobXRlX2lzX2xlYWYobWFz dC0+b3JpZ19yLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJaWYgKG10ZV9kZWFkX25vZGUobWFz X3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfbCwgbF9zbG90cywgbF9lbmQpKSkNCisJCWxfZW5kLS07 DQorDQorDQorCWlmIChsX3N0YXJ0IDw9IGxfZW5kKQ0KKwkJbWFzX3RvcGlhcnlfcmFuZ2UobWFz dC0+b3JpZ19sLCBtYXN0LT5kZXN0cm95LCBsX3N0YXJ0LCBsX2VuZCk7DQorDQorCWlmIChtdGVf ZGVhZF9ub2RlKG1hc19zbG90X2xvY2tlZChtYXN0LT5vcmlnX3IsIHJfc2xvdHMsIHJfc3RhcnQp KSkNCisJCXJfc3RhcnQrKzsNCisNCisJaWYgKHJfc3RhcnQgPD0gcl9lbmQpDQorCQltYXNfdG9w aWFyeV9yYW5nZShtYXN0LT5vcmlnX3IsIG1hc3QtPmRlc3Ryb3ksIDAsIHJfZW5kKTsNCit9DQor DQorLyoNCisgKiBtYXN0X3JlYmFsYW5jZV9uZXh0KCkgLSBSZWJhbGFuY2UgYWdhaW5zdCB0aGUg bmV4dCBub2RlDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG9sZF9y OiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlIHRvIHRoZSByaWdodCAobmV4dCBub2RlKS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9yZWJhbGFuY2VfbmV4dChzdHJ1Y3QgbWFwbGVfc3Vi dHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBtYXN0LT5ibi0+ Yl9lbmQ7DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19yLCAwLCBtdF9zbG90X2NvdW50KG1h c3QtPm9yaWdfci0+bm9kZSksDQorCQkgICBtYXN0LT5ibiwgYl9lbmQpOw0KKwltYXN0LT5vcmln X3ItPmxhc3QgPSBtYXN0LT5vcmlnX3ItPm1heDsNCit9DQorDQorLyoNCisgKiBtYXN0X3JlYmFs YW5jZV9wcmV2KCkgLSBSZWJhbGFuY2UgYWdhaW5zdCB0aGUgcHJldmlvdXMgbm9kZQ0KKyAqIEBt YXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBvbGRfbDogVGhlIGVuY29kZWQgbWFw bGUgbm9kZSB0byB0aGUgbGVmdCAocHJldmlvdXMgbm9kZSkNCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzdF9yZWJhbGFuY2VfcHJldihzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFz dCkNCit7DQorCXVuc2lnbmVkIGNoYXIgZW5kID0gbWFzX2RhdGFfZW5kKG1hc3QtPm9yaWdfbCkg KyAxOw0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kID0gbWFzdC0+Ym4tPmJfZW5kOw0KKw0KKwltYWJf c2hpZnRfcmlnaHQobWFzdC0+Ym4sIGVuZCk7DQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAw LCBlbmQgLSAxLCBtYXN0LT5ibiwgMCk7DQorCW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+ bWluOw0KKwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+b3JpZ19sLT5taW47DQorCW1hc3Qt PmJuLT5iX2VuZCA9IGVuZCArIGJfZW5kOw0KKwltYXN0LT5sLT5vZmZzZXQgKz0gZW5kOw0KK30N CisNCisvKg0KKyAqIG1hc3Rfc3Bhbm5pbmdfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2Ugbm9kZXMg d2l0aCBuZWFyZXN0IG5laWdoYm91ciBmYXZvdXJpbmcNCisgKiB0aGUgbm9kZSB0byB0aGUgcmln aHQuICBDaGVja2luZyB0aGUgbm9kZXMgdG8gdGhlIHJpZ2h0IHRoZW4gdGhlIGxlZnQgYXQgZWFj aA0KKyAqIGxldmVsIHVwd2FyZHMgdW50aWwgcm9vdCBpcyByZWFjaGVkLiAgRnJlZSBhbmQgZGVz dHJveSBhcyBuZWVkZWQuDQorICogRGF0YSBpcyBjb3BpZWQgaW50byB0aGUgQG1hc3QtPmJuLg0K KyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5l DQorYm9vbCBtYXN0X3NwYW5uaW5nX3JlYmFsYW5jZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0 ZSAqbWFzdCkNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSByX3RtcCA9ICptYXN0LT5vcmlnX3I7DQor CXN0cnVjdCBtYV9zdGF0ZSBsX3RtcCA9ICptYXN0LT5vcmlnX2w7DQorCXN0cnVjdCBtYXBsZV9l bm9kZSAqYW5jZXN0b3IgPSBOVUxMOw0KKwl1bnNpZ25lZCBjaGFyIHN0YXJ0LCBlbmQ7DQorCXVu c2lnbmVkIGNoYXIgZGVwdGggPSAwOw0KKw0KKwlyX3RtcCA9ICptYXN0LT5vcmlnX3I7DQorCWxf dG1wID0gKm1hc3QtPm9yaWdfbDsNCisJZG8gew0KKwkJbWFzX2FzY2VuZChtYXN0LT5vcmlnX3Ip Ow0KKwkJbWFzX2FzY2VuZChtYXN0LT5vcmlnX2wpOw0KKwkJZGVwdGgrKzsNCisJCWlmICghYW5j ZXN0b3IgJiYNCisJCSAgICAobWFzdC0+b3JpZ19yLT5ub2RlID09IG1hc3QtPm9yaWdfbC0+bm9k ZSkpIHsNCisJCQlhbmNlc3RvciA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCisJCQllbmQgPSBtYXN0 LT5vcmlnX3ItPm9mZnNldCAtIDE7DQorCQkJc3RhcnQgPSBtYXN0LT5vcmlnX2wtPm9mZnNldCAr IDE7DQorCQl9DQorDQorCQlpZiAobWFzdC0+b3JpZ19yLT5vZmZzZXQgPCBtYXNfZGF0YV9lbmQo bWFzdC0+b3JpZ19yKSkgew0KKwkJCWlmICghYW5jZXN0b3IpIHsNCisJCQkJYW5jZXN0b3IgPSBt YXN0LT5vcmlnX3ItPm5vZGU7DQorCQkJCXN0YXJ0ID0gMDsNCisJCQl9DQorDQorCQkJbWFzdC0+ b3JpZ19yLT5vZmZzZXQrKzsNCisJCQlkbyB7DQorCQkJCW1hc19kZXNjZW5kKG1hc3QtPm9yaWdf cik7DQorCQkJCW1hc3QtPm9yaWdfci0+b2Zmc2V0ID0gMDsNCisJCQkJZGVwdGgtLTsNCisJCQl9 IHdoaWxlIChkZXB0aCk7DQorDQorCQkJbWFzdF9yZWJhbGFuY2VfbmV4dChtYXN0KTsNCisJCQlk byB7DQorCQkJCXVuc2lnbmVkIGNoYXIgbF9vZmYgPSAwOw0KKwkJCQlzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmNoaWxkID0gcl90bXAubm9kZTsNCisNCisJCQkJbWFzX2FzY2VuZCgmcl90bXApOw0KKwkJ CQlpZiAoYW5jZXN0b3IgPT0gcl90bXAubm9kZSkNCisJCQkJCWxfb2ZmID0gc3RhcnQ7DQorDQor CQkJCWlmIChyX3RtcC5vZmZzZXQpDQorCQkJCQlyX3RtcC5vZmZzZXQtLTsNCisNCisJCQkJaWYg KGxfb2ZmIDwgcl90bXAub2Zmc2V0KQ0KKwkJCQkJbWFzX3RvcGlhcnlfcmFuZ2UoJnJfdG1wLCBt YXN0LT5kZXN0cm95LA0KKwkJCQkJCQkgIGxfb2ZmLCByX3RtcC5vZmZzZXQpOw0KKw0KKwkJCQlp ZiAobF90bXAubm9kZSAhPSBjaGlsZCkNCisJCQkJCW1hdF9hZGQobWFzdC0+ZnJlZSwgY2hpbGQp Ow0KKw0KKwkJCX0gd2hpbGUgKHJfdG1wLm5vZGUgIT0gYW5jZXN0b3IpOw0KKw0KKwkJCSptYXN0 LT5vcmlnX2wgPSBsX3RtcDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCX0gZWxzZSBpZiAobWFz dC0+b3JpZ19sLT5vZmZzZXQgIT0gMCkgew0KKwkJCWlmICghYW5jZXN0b3IpIHsNCisJCQkJYW5j ZXN0b3IgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQorCQkJCWVuZCA9IG1hc19kYXRhX2VuZChtYXN0 LT5vcmlnX2wpOw0KKwkJCX0NCisNCisJCQltYXN0LT5vcmlnX2wtPm9mZnNldC0tOw0KKwkJCWRv IHsNCisJCQkJbWFzX2Rlc2NlbmQobWFzdC0+b3JpZ19sKTsNCisJCQkJbWFzdC0+b3JpZ19sLT5v ZmZzZXQgPQ0KKwkJCQkJbWFzX2RhdGFfZW5kKG1hc3QtPm9yaWdfbCk7DQorCQkJCWRlcHRoLS07 DQorCQkJfSB3aGlsZSAoZGVwdGgpOw0KKw0KKwkJCW1hc3RfcmViYWxhbmNlX3ByZXYobWFzdCk7 DQorCQkJZG8gew0KKwkJCQl1bnNpZ25lZCBjaGFyIHJfb2ZmOw0KKwkJCQlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKmNoaWxkID0gbF90bXAubm9kZTsNCisNCisJCQkJbWFzX2FzY2VuZCgmbF90bXApOw0K KwkJCQlpZiAoYW5jZXN0b3IgPT0gbF90bXAubm9kZSkNCisJCQkJCXJfb2ZmID0gZW5kOw0KKwkJ CQllbHNlDQorCQkJCQlyX29mZiA9IG1hc19kYXRhX2VuZCgmbF90bXApOw0KKw0KKwkJCQlpZiAo bF90bXAub2Zmc2V0IDwgcl9vZmYpDQorCQkJCQlsX3RtcC5vZmZzZXQrKzsNCisNCisJCQkJaWYg KGxfdG1wLm9mZnNldCA8IHJfb2ZmKQ0KKwkJCQkJbWFzX3RvcGlhcnlfcmFuZ2UoJmxfdG1wLCBt YXN0LT5kZXN0cm95LA0KKwkJCQkJCQkgIGxfdG1wLm9mZnNldCwgcl9vZmYpOw0KKw0KKwkJCQlp ZiAocl90bXAubm9kZSAhPSBjaGlsZCkNCisJCQkJCW1hdF9hZGQobWFzdC0+ZnJlZSwgY2hpbGQp Ow0KKw0KKwkJCX0gd2hpbGUgKGxfdG1wLm5vZGUgIT0gYW5jZXN0b3IpOw0KKw0KKwkJCSptYXN0 LT5vcmlnX3IgPSByX3RtcDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJfSB3aGlsZSAoIW10 ZV9pc19yb290KG1hc3QtPm9yaWdfci0+bm9kZSkpOw0KKw0KKwkqbWFzdC0+b3JpZ19yID0gcl90 bXA7DQorCSptYXN0LT5vcmlnX2wgPSBsX3RtcDsNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisv Kg0KKyAqIG1hc3RfYXNjZW5kX2ZyZWUoKSAtIEFkZCBjdXJyZW50IG9yaWdpbmFsIG1hcGxlIHN0 YXRlIG5vZGVzIHRvIHRoZSBmcmVlIGxpc3QNCisgKiBhbmQgYXNjZW5kLg0KKyAqIEBtYXN0OiB0 aGUgbWFwbGUgc3VidHJlZSBzdGF0ZS4NCisgKg0KKyAqIEFzY2VuZCB0aGUgb3JpZ2luYWwgbGVm dCBhbmQgcmlnaHQgc2lkZXMgYW5kIGFkZCB0aGUgcHJldmlvdXMgbm9kZXMgdG8gdGhlDQorICog ZnJlZSBsaXN0LiAgU2V0IHRoZSBzbG90cyB0byBwb2ludCB0byB0aGUgY29ycmVjdCBsb2NhdGlv biBpbiB0aGUgbmV3IG5vZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZA0KK21hc3RfYXNj ZW5kX2ZyZWUoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwlNQV9XUl9T VEFURSh3cl9tYXMsIG1hc3QtPm9yaWdfciwgIE5VTEwpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUg KmxlZnQgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQg PSBtYXN0LT5vcmlnX3ItPm5vZGU7DQorDQorCW1hc19hc2NlbmQobWFzdC0+b3JpZ19sKTsNCisJ bWFzX2FzY2VuZChtYXN0LT5vcmlnX3IpOw0KKwltYXRfYWRkKG1hc3QtPmZyZWUsIGxlZnQpOw0K Kw0KKwlpZiAobGVmdCAhPSByaWdodCkNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgcmlnaHQpOw0K Kw0KKwltYXN0LT5vcmlnX3ItPm9mZnNldCA9IDA7DQorCW1hc3QtPm9yaWdfci0+aW5kZXggPSBt YXN0LT5yLT5tYXg7DQorCS8qIGxhc3Qgc2hvdWxkIGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRv IGluZGV4ICovDQorCWlmIChtYXN0LT5vcmlnX3ItPmxhc3QgPCBtYXN0LT5vcmlnX3ItPmluZGV4 KQ0KKwkJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5pbmRleDsNCisJLyoNCisJ ICogVGhlIG5vZGUgbWF5IG5vdCBjb250YWluIHRoZSB2YWx1ZSBzbyBzZXQgc2xvdCB0byBlbnN1 cmUgYWxsDQorCSAqIG9mIHRoZSBub2RlcyBjb250ZW50cyBhcmUgZnJlZWQgb3IgZGVzdHJveWVk Lg0KKwkgKi8NCisJd3JfbWFzLnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfci0+bm9k ZSk7DQorCW1hc193cl9ub2RlX3dhbGsoJndyX21hcyk7DQorCS8qIFNldCB1cCB0aGUgbGVmdCBz aWRlIG9mIHRoaW5ncyAqLw0KKwltYXN0LT5vcmlnX2wtPm9mZnNldCA9IDA7DQorCW1hc3QtPm9y aWdfbC0+aW5kZXggPSBtYXN0LT5sLT5taW47DQorCXdyX21hcy5tYXMgPSBtYXN0LT5vcmlnX2w7 DQorCXdyX21hcy50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwlt YXNfd3Jfbm9kZV93YWxrKCZ3cl9tYXMpOw0KKw0KKwltYXN0LT5ibi0+dHlwZSA9IHdyX21hcy50 eXBlOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXdfbWFfbm9kZSgpIC0gQ3JlYXRlIGFuZCByZXR1 cm4gYSBuZXcgbWFwbGUgbm9kZS4gIEhlbHBlciBmdW5jdGlvbi4NCisgKiBAbWFzOiB0aGUgbWFw bGUgc3RhdGUgd2l0aCB0aGUgYWxsb2NhdGlvbnMuDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2Jp Z19ub2RlIHdpdGggdGhlIHR5cGUgZW5jb2RpbmcuDQorICoNCisgKiBVc2UgdGhlIG5vZGUgdHlw ZSBmcm9tIHRoZSBtYXBsZV9iaWdfbm9kZSB0byBhbGxvY2F0ZSBhIG5ldyBub2RlIGZyb20gdGhl DQorICogbWFfc3RhdGUuICBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBtYWlubHkgZm9yIGNvZGUgcmVh ZGFiaWxpdHkuDQorICoNCisgKiBSZXR1cm46IEEgbmV3IG1hcGxlIGVuY29kZWQgbm9kZQ0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlDQorKm1hc19uZXdfbWFfbm9kZShz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0K KwlyZXR1cm4gbXRfbWtfbm9kZShtYV9tbm9kZV9wdHIobWFzX3BvcF9ub2RlKG1hcykpLCBiX25v ZGUtPnR5cGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19tYWJfdG9fbm9kZSgpIC0gU2V0IHVwIHJp Z2h0IGFuZCBtaWRkbGUgbm9kZXMNCisgKg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZSB0aGF0 IGNvbnRhaW5zIHRoZSBhbGxvY2F0aW9ucy4NCisgKiBAYl9ub2RlOiB0aGUgbm9kZSB3aGljaCBj b250YWlucyB0aGUgZGF0YS4NCisgKiBAbGVmdDogVGhlIHBvaW50ZXIgd2hpY2ggd2lsbCBoYXZl IHRoZSBsZWZ0IG5vZGUNCisgKiBAcmlnaHQ6IFRoZSBwb2ludGVyIHdoaWNoIG1heSBoYXZlIHRo ZSByaWdodCBub2RlDQorICogQG1pZGRsZTogdGhlIHBvaW50ZXIgd2hpY2ggbWF5IGhhdmUgdGhl IG1pZGRsZSBub2RlIChyYXJlKQ0KKyAqIEBtaWRfc3BsaXQ6IHRoZSBzcGxpdCBsb2NhdGlvbiBm b3IgdGhlIG1pZGRsZSBub2RlDQorICoNCisgKiBSZXR1cm46IHRoZSBzcGxpdCBvZiBsZWZ0Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYXNfbWFiX3RvX25vZGUoc3RydWN0 IG1hX3N0YXRlICptYXMsDQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCBzdHJ1Y3Qg bWFwbGVfZW5vZGUgKipsZWZ0LA0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKipyaWdodCwgc3RydWN0 IG1hcGxlX2Vub2RlICoqbWlkZGxlLA0KKwl1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQsIHVuc2ln bmVkIGxvbmcgbWluKQ0KK3sNCisJdW5zaWduZWQgY2hhciBzcGxpdCA9IDA7DQorCXVuc2lnbmVk IGNoYXIgc2xvdF9jb3VudCA9IG10X3Nsb3RzW2Jfbm9kZS0+dHlwZV07DQorDQorCSpsZWZ0ID0g bWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisJKnJpZ2h0ID0gTlVMTDsNCisJKm1pZGRs ZSA9IE5VTEw7DQorCSptaWRfc3BsaXQgPSAwOw0KKw0KKwlpZiAoYl9ub2RlLT5iX2VuZCA8IHNs b3RfY291bnQpIHsNCisJCXNwbGl0ID0gYl9ub2RlLT5iX2VuZDsNCisJfSBlbHNlIHsNCisJCXNw bGl0ID0gbWFiX2NhbGNfc3BsaXQobWFzLCBiX25vZGUsIG1pZF9zcGxpdCwgbWluKTsNCisJCSpy aWdodCA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCX0NCisNCisJaWYgKCptaWRf c3BsaXQpDQorCQkqbWlkZGxlID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisNCisJ cmV0dXJuIHNwbGl0Ow0KKw0KK30NCisNCisvKg0KKyAqIG1hYl9zZXRfYl9lbmQoKSAtIEFkZCBl bnRyeSB0byBiX25vZGUgYXQgYl9ub2RlLT5iX2VuZCBhbmQgaW5jcmVtZW50IHRoZSBlbmQNCisg KiBwb2ludGVyLg0KKyAqIEBiX25vZGUgLSB0aGUgYmlnIG5vZGUgdG8gYWRkIHRoZSBlbnRyeQ0K KyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgdG8gZ2V0IHRoZSBwaXZvdCAobWFzLT5tYXgpDQor ICogQGVudHJ5IC0gdGhlIGVudHJ5IHRvIGFkZCwgaWYgTlVMTCBub3RoaW5nIGhhcHBlbnMuDQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9zZXRfYl9lbmQoc3RydWN0IG1hcGxlX2JpZ19u b2RlICpiX25vZGUsDQorCQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJIHZvaWQgKmVu dHJ5KQ0KK3sNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybjsNCisNCisJYl9ub2RlLT5zbG90W2Jf bm9kZS0+Yl9lbmRdID0gZW50cnk7DQorCWlmIChtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJ Yl9ub2RlLT5nYXBbYl9ub2RlLT5iX2VuZF0gPSBtYXNfbWF4X2dhcChtYXMpOw0KKwliX25vZGUt PnBpdm90W2Jfbm9kZS0+Yl9lbmQrK10gPSBtYXMtPm1heDsNCit9DQorDQorLyoNCisgKiBtYXNf c2V0X3NwbGl0X3BhcmVudCgpIC0gY29tYmluZV90aGVuX3NlcGFyYXRlIGhlbHBlciBmdW5jdGlv bi4gIFNldHMgdGhlIHBhcmVudA0KKyAqIG9mIEBtYXMtPm5vZGUgdG8gZWl0aGVyIEBsZWZ0IG9y IEByaWdodCwgZGVwZW5kaW5nIG9uIEBzbG90IGFuZCBAc3BsaXQNCisgKg0KKyAqIEBtYXMgLSB0 aGUgbWFwbGUgc3RhdGUgd2l0aCB0aGUgbm9kZSB0aGF0IG5lZWRzIGEgcGFyZW50DQorICogQGxl ZnQgLSBwb3NzaWJsZSBwYXJlbnQgMQ0KKyAqIEByaWdodCAtIHBvc3NpYmxlIHBhcmVudCAyDQor ICogQHNsb3QgLSB0aGUgc2xvdCB0aGUgbWFzLT5ub2RlIHdhcyBwbGFjZWQNCisgKiBAc3BsaXQg LSB0aGUgc3BsaXQgbG9jYXRpb24gYmV0d2VlbiBAbGVmdCBhbmQgQHJpZ2h0DQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc19zZXRfc3BsaXRfcGFyZW50KHN0cnVjdCBtYV9zdGF0ZSAqbWFz LA0KKwkJCQkJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LA0KKwkJCQkJc3RydWN0IG1hcGxlX2Vu b2RlICpyaWdodCwNCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNsb3QsIHVuc2lnbmVkIGNoYXIgc3Bs aXQpDQorew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJCXJldHVybjsNCisNCisJaWYgKCgq c2xvdCkgPD0gc3BsaXQpDQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5vZGUsIGxlZnQsICpzbG90 KTsNCisJZWxzZSBpZiAocmlnaHQpDQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5vZGUsIHJpZ2h0 LCAoKnNsb3QpIC0gc3BsaXQgLSAxKTsNCisNCisJKCpzbG90KSsrOw0KK30NCisNCisvKg0KKyAq IG10ZV9taWRfc3BsaXRfY2hlY2soKSAtIENoZWNrIGlmIHRoZSBuZXh0IG5vZGUgcGFzc2VzIHRo ZSBtaWQtc3BsaXQNCisgKiBAKipsOiBQb2ludGVyIHRvIGxlZnQgZW5jb2RlZCBtYXBsZSBub2Rl Lg0KKyAqIEAqKm06IFBvaW50ZXIgdG8gbWlkZGxlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBA KipyOiBQb2ludGVyIHRvIHJpZ2h0IGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAc2xvdDogVGhl IG9mZnNldA0KKyAqIEAqc3BsaXQ6IFRoZSBzcGxpdCBsb2NhdGlvbi4NCisgKiBAbWlkX3NwbGl0 OiBUaGUgbWlkZGxlIHNwbGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfbWlkX3Nw bGl0X2NoZWNrKHN0cnVjdCBtYXBsZV9lbm9kZSAqKmwsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFw bGVfZW5vZGUgKipyLA0KKwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJ CQkJICAgICAgIHVuc2lnbmVkIGNoYXIgc2xvdCwNCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIg KnNwbGl0LA0KKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwlpZiAo KnIgPT0gcmlnaHQpDQorCQlyZXR1cm47DQorDQorCWlmIChzbG90IDwgbWlkX3NwbGl0KQ0KKwkJ cmV0dXJuOw0KKw0KKwkqbCA9ICpyOw0KKwkqciA9IHJpZ2h0Ow0KKwkqc3BsaXQgPSBtaWRfc3Bs aXQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zZXRfc3BsaXRfcGFyZW50cygpIC0gSGVscGVyIGZ1 bmN0aW9uIHRvIHNldCB0aHJlZSBub2RlcyBwYXJlbnRzLiAgU2xvdA0KKyAqIGlzIHRha2VuIGZy b20gQG1hc3QtPmwuDQorICogQG1hc3QgLSB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBs ZWZ0IC0gdGhlIGxlZnQgbm9kZQ0KKyAqIEByaWdodCAtIHRoZSByaWdodCBub2RlDQorICogQHNw bGl0IC0gdGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0 X3NldF9zcGxpdF9wYXJlbnRzKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkJ CQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQsDQorCQkJCQkgIHN0cnVjdCBtYXBsZV9lbm9k ZSAqbWlkZGxlLA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJpZ2h0LA0KKwkJCQkJICB1 bnNpZ25lZCBjaGFyIHNwbGl0LA0KKwkJCQkJICB1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCkNCit7 DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsID0gbGVmdDsN CisJc3RydWN0IG1hcGxlX2Vub2RlICpyID0gcmlnaHQ7DQorDQorCWlmIChtYXNfaXNfbm9uZSht YXN0LT5sKSkNCisJCXJldHVybjsNCisNCisJaWYgKG1pZGRsZSkNCisJCXIgPSBtaWRkbGU7DQor DQorCXNsb3QgPSBtYXN0LT5sLT5vZmZzZXQ7DQorDQorCW10ZV9taWRfc3BsaXRfY2hlY2soJmws ICZyLCByaWdodCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwltYXNfc2V0X3NwbGl0X3Bh cmVudChtYXN0LT5sLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0KKw0KKwltdGVfbWlkX3NwbGl0X2No ZWNrKCZsLCAmciwgcmlnaHQsIHNsb3QsICZzcGxpdCwgbWlkX3NwbGl0KTsNCisJbWFzX3NldF9z cGxpdF9wYXJlbnQobWFzdC0+bSwgbCwgciwgJnNsb3QsIHNwbGl0KTsNCisNCisJbXRlX21pZF9z cGxpdF9jaGVjaygmbCwgJnIsIHJpZ2h0LCBzbG90LCAmc3BsaXQsIG1pZF9zcGxpdCk7DQorCW1h c19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPnIsIGwsIHIsICZzbG90LCBzcGxpdCk7DQorfQ0KKw0K Ky8qDQorICogbWFzX3dtYl9yZXBsYWNlKCkgLSBXcml0ZSBtZW1vcnkgYmFycmllciBhbmQgcmVw bGFjZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBmcmVlOiB0aGUgbWFwbGUgdG9w aWFyeSBsaXN0IG9mIG5vZGVzIHRvIGZyZWUNCisgKiBAZGVzdHJveTogVGhlIG1hcGxlIHRvcGlh cnkgbGlzdCBvZiBub2RlcyB0byBkZXN0cm95ICh3YWxrIGFuZCBmcmVlKQ0KKyAqDQorICogVXBk YXRlcyBnYXAgYXMgbmVjZXNzYXJ5Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd21i X3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJCSAgIHN0cnVjdCBtYV90b3BpYXJ5 ICpmcmVlLA0KKwkJCQkgICBzdHJ1Y3QgbWFfdG9waWFyeSAqZGVzdHJveSkNCit7DQorCS8qIEFs bCBub2RlcyBtdXN0IHNlZSBvbGQgZGF0YSBhcyBkZWFkIHByaW9yIHRvIHJlcGxhY2luZyB0aGF0 IGRhdGEgKi8NCisJc21wX3dtYigpOyAvKiBOZWVkZWQgZm9yIFJDVSAqLw0KKw0KKwkvKiBJbnNl cnQgdGhlIG5ldyBkYXRhIGluIHRoZSB0cmVlICovDQorCW1hc19yZXBsYWNlKG1hcywgdHJ1ZSk7 DQorDQorCWlmICghbXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19kZXNjZW5kX2Fkb3B0 KG1hcyk7DQorDQorCW1hc19tYXRfZnJlZShtYXMsIGZyZWUpOw0KKw0KKwlpZiAoZGVzdHJveSkN CisJCW1hc19tYXRfZGVzdHJveShtYXMsIGRlc3Ryb3kpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYo bWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQor DQorLyoNCisgKiBtYXN0X25ld19yb290KCkgLSBTZXQgYSBuZXcgdHJlZSByb290IGR1cmluZyBz dWJ0cmVlIGNyZWF0aW9uDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfbmV3 X3Jvb3Qoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCSBzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCW1hc19tbihtYXN0LT5sKS0+cGFyZW50ID0NCisJCW1hX3BhcmVu dF9wdHIoKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCWlm ICghbXRlX2RlYWRfbm9kZShtYXN0LT5vcmlnX2wtPm5vZGUpICYmDQorCSAgICAhbXRlX2lzX3Jv b3QobWFzdC0+b3JpZ19sLT5ub2RlKSkgew0KKwkJZG8gew0KKwkJCW1hc3RfYXNjZW5kX2ZyZWUo bWFzdCk7DQorCQkJbWFzdF90b3BpYXJ5KG1hc3QpOw0KKwkJfSB3aGlsZSAoIW10ZV9pc19yb290 KG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0KKwl9DQorCWlmICgobWFzdC0+b3JpZ19sLT5ub2RlICE9 IG1hcy0+bm9kZSkgJiYNCisJCSAgIChtYXN0LT5sLT5kZXB0aCA+IG1hc19tdF9oZWlnaHQobWFz KSkpIHsNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgbWFzLT5ub2RlKTsNCisJfQ0KK30NCisNCisv Kg0KKyAqIG1hc3RfY3BfdG9fbm9kZXMoKSAtIENvcHkgZGF0YSBvdXQgdG8gbm9kZXMuDQorICog QG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQGxlZnQ6IFRoZSBsZWZ0IGVuY29k ZWQgbWFwbGUgbm9kZQ0KKyAqIEBtaWRkbGU6IFRoZSBtaWRkbGUgZW5jb2RlZCBtYXBsZSBub2Rl DQorICogQHJpZ2h0OiBUaGUgcmlnaHQgZW5jb2RlZCBtYXBsZSBub2RlDQorICogQHNwbGl0OiBU aGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0d2VlbiBsZWZ0IGFuZCAobWlkZGxlID8gbWlkZGxlIDog cmlnaHQpDQorICogQG1pZF9zcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNwbGl0IGJldHdlZW4gbWlk ZGxlIGFuZCByaWdodC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9jcF90b19ub2Rl cyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpsZWZ0LCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1pZGRsZSwNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpyaWdodCwgdW5zaWduZWQgY2hhciBzcGxpdCwgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQor ew0KKwlib29sIG5ld19sbWF4ID0gdHJ1ZTsNCisNCisJbWFzdC0+bC0+bm9kZSA9IG10ZV9ub2Rl X29yX25vbmUobGVmdCk7DQorCW1hc3QtPm0tPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKG1pZGRs ZSk7DQorCW1hc3QtPnItPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKHJpZ2h0KTsNCisNCisJbWFz dC0+bC0+bWluID0gbWFzdC0+b3JpZ19sLT5taW47DQorCWlmIChzcGxpdCA9PSBtYXN0LT5ibi0+ Yl9lbmQpIHsNCisJCW1hc3QtPmwtPm1heCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwkJbmV3X2xt YXggPSBmYWxzZTsNCisJfQ0KKw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFz dC0+bCwgbmV3X2xtYXgpOw0KKw0KKwlpZiAobWlkZGxlKSB7DQorCQltYWJfbWFzX2NwKG1hc3Qt PmJuLCAxICsgc3BsaXQsIG1pZF9zcGxpdCwgbWFzdC0+bSwgdHJ1ZSk7DQorCQltYXN0LT5tLT5t aW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdICsgMTsNCisJCXNwbGl0ID0gbWlkX3NwbGl0Ow0K Kwl9DQorDQorCW1hc3QtPnItPm1heCA9IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwlpZiAocmlnaHQp IHsNCisJCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDEgKyBzcGxpdCwgbWFzdC0+Ym4tPmJfZW5kLCBt YXN0LT5yLCBmYWxzZSk7DQorCQltYXN0LT5yLT5taW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRd ICsgMTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY29tYmluZV9jcF9sZWZ0IC0gQ29weSBp biB0aGUgb3JpZ2luYWwgbGVmdCBzaWRlIG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmlu ZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1h c3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1h c3RfY29tYmluZV9jcF9sZWZ0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sN CisJdW5zaWduZWQgY2hhciBsX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisNCisJaWYg KCFsX3Nsb3QpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAwLCBs X3Nsb3QgLSAxLCBtYXN0LT5ibiwgMCk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5lX2Nw X3JpZ2h0OiBDb3B5IGluIHRoZSBvcmlnaW5hbCByaWdodCBzaWRlIG9mIHRoZSB0cmVlIGludG8g dGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmln IG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5kIC0g MV0gPj0gbWFzdC0+b3JpZ19yLT5tYXgpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFz dC0+b3JpZ19yLCBtYXN0LT5vcmlnX3ItPm9mZnNldCArIDEsDQorCQkgICBtdF9zbG90X2NvdW50 KG1hc3QtPm9yaWdfci0+bm9kZSksIG1hc3QtPmJuLA0KKwkJICAgbWFzdC0+Ym4tPmJfZW5kKTsN CisJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorfQ0KKw0KKy8qDQor ICogbWFzdF9zdWZmaWNpZW50OiBDaGVjayBpZiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBoYXMg ZW5vdWdoIGRhdGEgaW4gdGhlIGJpZw0KKyAqIG5vZGUgdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBz dWZmaWNpZW50IG5vZGUNCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8N CitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9zdWZmaWNpZW50KHN0cnVjdCBtYXBsZV9zdWJ0cmVl X3N0YXRlICptYXN0KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5iX2VuZCA+IG10X21pbl9zbG90X2Nv dW50KG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZh bHNlOw0KK30NCisNCisvKg0KKyAqIG1hc3Rfb3ZlcmZsb3c6IENoZWNrIGlmIHRoZXJlIGlzIHRv byBtdWNoIGRhdGEgaW4gdGhlIHN1YnRyZWUgc3RhdGUgZm9yIGENCisgKiBzaW5nbGUgbm9kZS4N CisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5l IGJvb2wgbWFzdF9vdmVyZmxvdyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7 DQorCWlmIChtYXN0LT5ibi0+Yl9lbmQgPj0gbXRfc2xvdF9jb3VudChtYXN0LT5vcmlnX2wtPm5v ZGUpKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGlj IGlubGluZSB2b2lkICptdHJlZV9yYW5nZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCwgKmxhc3Q7 DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2ln bmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nIG1heCwgbWluOw0KKwl1bnNpZ25lZCBsb25n IHByZXZfbWF4LCBwcmV2X21pbjsNCisNCisJbGFzdCA9IG5leHQgPSBtYXMtPm5vZGU7DQorCXBy ZXZfbWluID0gbWluID0gbWFzLT5taW47DQorCW1heCA9IG1hcy0+bWF4Ow0KKwlkbyB7DQorCQlv ZmZzZXQgPSAwOw0KKwkJbGFzdCA9IG5leHQ7DQorCQlub2RlID0gbXRlX3RvX25vZGUobmV4dCk7 DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhu b2RlLCB0eXBlKTsNCisJCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWF4 KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9u b2RlOw0KKw0KKwkJaWYgKHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5kZXgpIHsNCisJCQlwcmV2 X21heCA9IG1heDsNCisJCQlwcmV2X21pbiA9IG1pbjsNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0 XTsNCisJCQlnb3RvIG5leHQ7DQorCQl9DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7DQorCQl9 IHdoaWxlICgob2Zmc2V0IDwgZW5kKSAmJiAocGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7 DQorDQorCQlwcmV2X21pbiA9IG1pbjsNCisJCW1pbiA9IHBpdm90c1tvZmZzZXQgLSAxXSArIDE7 DQorCQlwcmV2X21heCA9IG1heDsNCisJCWlmIChsaWtlbHkob2Zmc2V0IDwgZW5kICYmIHBpdm90 c1tvZmZzZXRdKSkNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisNCituZXh0Og0KKwkJc2xv dHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJCW5leHQgPSBtdF9zbG90KG1hcy0+dHJlZSwg c2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJ CQlnb3RvIGRlYWRfbm9kZTsNCisJfSB3aGlsZSAoIW1hX2lzX2xlYWYodHlwZSkpOw0KKw0KKwlt YXMtPm9mZnNldCA9IG9mZnNldDsNCisJbWFzLT5pbmRleCA9IG1pbjsNCisJbWFzLT5sYXN0ID0g bWF4Ow0KKwltYXMtPm1pbiA9IHByZXZfbWluOw0KKwltYXMtPm1heCA9IHByZXZfbWF4Ow0KKwlt YXMtPm5vZGUgPSBsYXN0Ow0KKwlyZXR1cm4gKHZvaWQgKikgbmV4dDsNCisNCitkZWFkX25vZGU6 DQorCW1hc19yZXNldChtYXMpOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNf c3Bhbm5pbmdfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2UgYWNyb3NzIHR3byBub2RlcyB3aGljaCBt YXkgbm90IGJlIHBlZXJzLg0KKyAqIEBtYXM6IFRoZSBzdGFydGluZyBtYXBsZSBzdGF0ZQ0KKyAq IEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZSwga2VlcHMgdHJhY2sgb2YgNCBtYXBsZSBz dGF0ZXMuDQorICogQGNvdW50OiBUaGUgZXN0aW1hdGVkIGNvdW50IG9mIGl0ZXJhdGlvbnMgbmVl ZGVkLg0KKyAqDQorICogRm9sbG93IHRoZSB0cmVlIHVwd2FyZHMgZnJvbSBAbF9tYXMgYW5kIEBy X21hcyBmb3IgQGNvdW50LCBvciB1bnRpbCB0aGUgcm9vdA0KKyAqIGlzIGhpdC4gIEZpcnN0IEBi X25vZGUgaXMgc3BsaXQgaW50byB0d28gZW50cmllcyB3aGljaCBhcmUgaW5zZXJ0ZWQgaW50byB0 aGUNCisgKiBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4gIEBiX25vZGUgaXMgcmV0dXJuZWQg cG9wdWxhdGVkIHdpdGggdGhlIGZpbmFsDQorICogaXRlcmF0aW9uLiBAbWFzIGlzIHVzZWQgdG8g b2J0YWluIGFsbG9jYXRpb25zLiAgb3JpZ19sX21hcyBrZWVwcyB0cmFjayBvZiB0aGUNCisgKiBu b2RlcyB0aGF0IHdpbGwgcmVtYWluIGFjdGl2ZSBieSB1c2luZyBvcmlnX2xfbWFzLT5pbmRleCBh bmQgb3JpZ19sX21hcy0+bGFzdA0KKyAqIHRvIGFjY291bnQgb2Ygd2hhdCBoYXMgYmVlbiBjb3Bp ZWQgaW50byB0aGUgbmV3IHN1Yi10cmVlLiAgVGhlIHVwZGF0ZSBvZg0KKyAqIG9yaWdfbF9tYXMt Pmxhc3QgaXMgdXNlZCBpbiBtYXNfY29uc3VtZSB0byBmaW5kIHRoZSBzbG90cyB0aGF0IHdpbGwg bmVlZCB0bw0KKyAqIGJlIGVpdGhlciBmcmVlZCBvciBkZXN0cm95ZWQuICBvcmlnX2xfbWFzLT5k ZXB0aCBrZWVwcyB0cmFjayBvZiB0aGUgaGVpZ2h0IG9mDQorICogdGhlIG5ldyBzdWItdHJlZSBp biBjYXNlIHRoZSBzdWItdHJlZSBiZWNvbWVzIHRoZSBmdWxsIHRyZWUuDQorICoNCisgKiBSZXR1 cm46IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYl9ub2RlIGR1cmluZyB0aGUgbGFzdCBsb29w Lg0KKyAqLw0KK3N0YXRpYyBpbnQgbWFzX3NwYW5uaW5nX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywNCisJCXN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LCB1bnNpZ25lZCBj aGFyIGNvdW50KQ0KK3sNCisJdW5zaWduZWQgY2hhciBzcGxpdCwgbWlkX3NwbGl0Ow0KKwl1bnNp Z25lZCBjaGFyIHNsb3QgPSAwOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQgPSBOVUxMLCAq bWlkZGxlID0gTlVMTCwgKnJpZ2h0ID0gTlVMTDsNCisNCisJTUFfU1RBVEUobF9tYXMsIG1hcy0+ dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5pbmRleCk7DQorCU1BX1NUQVRFKHJfbWFzLCBtYXMtPnRy ZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKG1fbWFzLCBtYXMtPnRyZWUs IG1hcy0+aW5kZXgsIG1hcy0+aW5kZXgpOw0KKwlNQV9UT1BJQVJZKGZyZWUsIG1hcy0+dHJlZSk7 DQorCU1BX1RPUElBUlkoZGVzdHJveSwgbWFzLT50cmVlKTsNCisNCisJLyoNCisJICogVGhlIHRy ZWUgbmVlZHMgdG8gYmUgcmViYWxhbmNlZCBhbmQgbGVhdmVzIG5lZWQgdG8gYmUga2VwdCBhdCB0 aGUgc2FtZSBsZXZlbC4NCisJICogUmViYWxhbmNpbmcgaXMgZG9uZSBieSB1c2Ugb2YgdGhlIGBg c3RydWN0IG1hcGxlX3RvcGlhcnlgYC4NCisJICovDQorCW1hc3QtPmwgPSAmbF9tYXM7DQorCW1h c3QtPm0gPSAmbV9tYXM7DQorCW1hc3QtPnIgPSAmcl9tYXM7DQorCW1hc3QtPmZyZWUgPSAmZnJl ZTsNCisJbWFzdC0+ZGVzdHJveSA9ICZkZXN0cm95Ow0KKwlsX21hcy5ub2RlID0gcl9tYXMubm9k ZSA9IG1fbWFzLm5vZGUgPSBNQVNfTk9ORTsNCisJaWYgKCEobWFzdC0+b3JpZ19sLT5taW4gJiYg bWFzdC0+b3JpZ19yLT5tYXggPT0gVUxPTkdfTUFYKSAmJg0KKwkgICAgdW5saWtlbHkobWFzdC0+ Ym4tPmJfZW5kIDw9IG10X21pbl9zbG90c1ttYXN0LT5ibi0+dHlwZV0pKQ0KKwkJbWFzdF9zcGFu bmluZ19yZWJhbGFuY2UobWFzdCk7DQorDQorCW1hc3QtPm9yaWdfbC0+ZGVwdGggPSAwOw0KKw0K KwkvKg0KKwkgKiBFYWNoIGxldmVsIG9mIHRoZSB0cmVlIGlzIGV4YW1pbmVkIGFuZCBiYWxhbmNl ZCwgcHVzaGluZyBkYXRhIHRvIHRoZSBsZWZ0IG9yDQorCSAqIHJpZ2h0LCBvciByZWJhbGFuY2lu ZyBhZ2FpbnN0IGxlZnQgb3IgcmlnaHQgbm9kZXMgaXMgZW1wbG95ZWQgdG8gYXZvaWQNCisJICog cmlwcGxpbmcgdXAgdGhlIHRyZWUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBjaHVybi4gIE9uY2Ug YSBuZXcgc3ViLXNlY3Rpb24gb2YNCisJICogdGhlIHRyZWUgaXMgY3JlYXRlZCwgdGhlcmUgbWF5 IGJlIGEgbWl4IG9mIG5ldyBhbmQgb2xkIG5vZGVzLiAgVGhlIG9sZCBub2Rlcw0KKwkgKiB3aWxs IGhhdmUgdGhlIGluY29ycmVjdCBwYXJlbnQgcG9pbnRlcnMgYW5kIGN1cnJlbnRseSBiZSBpbiB0 d28gdHJlZXM6IHRoZQ0KKwkgKiBvcmlnaW5hbCB0cmVlIGFuZCB0aGUgcGFydGlhbGx5IG5ldyB0 cmVlLiAgVG8gcmVtZWR5IHRoZSBwYXJlbnQgcG9pbnRlcnMgaW4NCisJICogdGhlIG9sZCB0cmVl LCB0aGUgbmV3IGRhdGEgaXMgc3dhcHBlZCBpbnRvIHRoZSBhY3RpdmUgdHJlZSBhbmQgYSB3YWxr IGRvd24NCisJICogdGhlIHRyZWUgaXMgcGVyZm9ybWVkIGFuZCB0aGUgcGFyZW50IHBvaW50ZXJz IGFyZSB1cGRhdGVkLg0KKwkgKiBTZWUgbWFzX2Rlc2NlbmRfYWRvcHQoKSBmb3IgbW9yZSBpbmZv cm1hdGlvbi4uDQorCSAqLw0KKwl3aGlsZSAoY291bnQtLSkgew0KKwkJbWFzdC0+Ym4tPmJfZW5k LS07DQorCQltYXN0LT5ibi0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2Rl KTsNCisJCXNwbGl0ID0gbWFzX21hYl90b19ub2RlKG1hcywgbWFzdC0+Ym4sICZsZWZ0LCAmcmln aHQsICZtaWRkbGUsDQorCQkJCQkmbWlkX3NwbGl0LCBtYXN0LT5vcmlnX2wtPm1pbik7DQorCQlt YXN0X3NldF9zcGxpdF9wYXJlbnRzKG1hc3QsIGxlZnQsIG1pZGRsZSwgcmlnaHQsIHNwbGl0LA0K KwkJCQkgICAgICAgbWlkX3NwbGl0KTsNCisJCW1hc3RfY3BfdG9fbm9kZXMobWFzdCwgbGVmdCwg bWlkZGxlLCByaWdodCwgc3BsaXQsIG1pZF9zcGxpdCk7DQorDQorCQkvKg0KKwkJICogQ29weSBk YXRhIGZyb20gbmV4dCBsZXZlbCBpbiB0aGUgdHJlZSB0byBtYXN0LT5ibiBmcm9tIG5leHQNCisJ CSAqIGl0ZXJhdGlvbg0KKwkJICovDQorCQltZW1zZXQobWFzdC0+Ym4sIDAsIHNpemVvZihzdHJ1 Y3QgbWFwbGVfYmlnX25vZGUpKTsNCisJCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShs ZWZ0KTsNCisJCW1hc3QtPm9yaWdfbC0+ZGVwdGgrKzsNCisNCisJCS8qIFJvb3QgYWxyZWFkeSBz dG9yZWQgaW4gbC0+bm9kZS4gKi8NCisJCWlmIChtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+bCkp DQorCQkJZ290byBuZXdfcm9vdDsNCisNCisJCW1hc3RfYXNjZW5kX2ZyZWUobWFzdCk7DQorCQlt YXN0X2NvbWJpbmVfY3BfbGVmdChtYXN0KTsNCisJCWxfbWFzLm9mZnNldCA9IG1hc3QtPmJuLT5i X2VuZDsNCisJCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sICZsX21hcywgbGVmdCk7DQorCQltYWJf c2V0X2JfZW5kKG1hc3QtPmJuLCAmbV9tYXMsIG1pZGRsZSk7DQorCQltYWJfc2V0X2JfZW5kKG1h c3QtPmJuLCAmcl9tYXMsIHJpZ2h0KTsNCisNCisJCS8qIENvcHkgYW55dGhpbmcgbmVjZXNzYXJ5 IG91dCBvZiB0aGUgcmlnaHQgbm9kZS4gKi8NCisJCW1hc3RfY29tYmluZV9jcF9yaWdodChtYXN0 KTsNCisJCW1hc3RfdG9waWFyeShtYXN0KTsNCisJCW1hc3QtPm9yaWdfbC0+bGFzdCA9IG1hc3Qt Pm9yaWdfbC0+bWF4Ow0KKw0KKwkJaWYgKG1hc3Rfc3VmZmljaWVudChtYXN0KSkNCisJCQljb250 aW51ZTsNCisNCisJCWlmIChtYXN0X292ZXJmbG93KG1hc3QpKQ0KKwkJCWNvbnRpbnVlOw0KKw0K KwkJLyogTWF5IGJlIGEgbmV3IHJvb3Qgc3RvcmVkIGluIG1hc3QtPmJuICovDQorCQlpZiAobWFz X2lzX3Jvb3RfbGltaXRzKG1hc3QtPm9yaWdfbCkpDQorCQkJYnJlYWs7DQorDQorCQltYXN0X3Nw YW5uaW5nX3JlYmFsYW5jZShtYXN0KTsNCisNCisJCS8qIHJlYmFsYW5jaW5nIGZyb20gb3RoZXIg bm9kZXMgbWF5IHJlcXVpcmUgYW5vdGhlciBsb29wLiAqLw0KKwkJaWYgKCFjb3VudCkNCisJCQlj b3VudCsrOw0KKwl9DQorDQorCWxfbWFzLm5vZGUgPSBtdF9ta19ub2RlKG1hX21ub2RlX3B0ciht YXNfcG9wX25vZGUobWFzKSksDQorCQkJCW10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2Rl KSk7DQorCW1hc3QtPm9yaWdfbC0+ZGVwdGgrKzsNCisJbWFiX21hc19jcChtYXN0LT5ibiwgMCwg bXRfc2xvdHNbbWFzdC0+Ym4tPnR5cGVdIC0gMSwgJmxfbWFzLCB0cnVlKTsNCisJbXRlX3NldF9w YXJlbnQobGVmdCwgbF9tYXMubm9kZSwgc2xvdCk7DQorCWlmIChtaWRkbGUpDQorCQltdGVfc2V0 X3BhcmVudChtaWRkbGUsIGxfbWFzLm5vZGUsICsrc2xvdCk7DQorDQorCWlmIChyaWdodCkNCisJ CW10ZV9zZXRfcGFyZW50KHJpZ2h0LCBsX21hcy5ub2RlLCArK3Nsb3QpOw0KKw0KKwlpZiAobWFz X2lzX3Jvb3RfbGltaXRzKG1hc3QtPmwpKSB7DQorbmV3X3Jvb3Q6DQorCQltYXN0X25ld19yb290 KG1hc3QsIG1hcyk7DQorCX0gZWxzZSB7DQorCQltYXNfbW4oJmxfbWFzKS0+cGFyZW50ID0gbWFz X21uKG1hc3QtPm9yaWdfbCktPnBhcmVudDsNCisJfQ0KKw0KKwlpZiAoIW10ZV9kZWFkX25vZGUo bWFzdC0+b3JpZ19sLT5ub2RlKSkNCisJCW1hdF9hZGQoJmZyZWUsIG1hc3QtPm9yaWdfbC0+bm9k ZSk7DQorDQorCW1hcy0+ZGVwdGggPSBtYXN0LT5vcmlnX2wtPmRlcHRoOw0KKwkqbWFzdC0+b3Jp Z19sID0gbF9tYXM7DQorCW10ZV9zZXRfbm9kZV9kZWFkKG1hcy0+bm9kZSk7DQorDQorCS8qIFNl dCB1cCBtYXMgZm9yIGluc2VydGlvbi4gKi8NCisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9IG1hcy0+ ZGVwdGg7DQorCW1hc3QtPm9yaWdfbC0+YWxsb2MgPSBtYXMtPmFsbG9jOw0KKwkqbWFzID0gKm1h c3QtPm9yaWdfbDsNCisJbWFzX3dtYl9yZXBsYWNlKG1hcywgJmZyZWUsICZkZXN0cm95KTsNCisJ bXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwlyZXR1cm4gbWFzdC0+Ym4tPmJfZW5kOw0KK30NCisN CisvKg0KKyAqIG1hc19yZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSBhIGdpdmVuIG5vZGUuDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGJfbm9kZTogVGhlIGJpZyBtYXBsZSBub2RlLg0K KyAqDQorICogUmViYWxhbmNlIHR3byBub2RlcyBpbnRvIGEgc2luZ2xlIG5vZGUgb3IgdHdvIG5l dyBub2RlcyB0aGF0IGFyZSBzdWZmaWNpZW50Lg0KKyAqIENvbnRpbnVlIHVwd2FyZHMgdW50aWwg dHJlZSBpcyBzdWZmaWNpZW50Lg0KKyAqDQorICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGVsZW1l bnRzIGluIGJfbm9kZSBkdXJpbmcgdGhlIGxhc3QgbG9vcC4NCisgKi8NCitzdGF0aWMgaW5saW5l IGludCBtYXNfcmViYWxhbmNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQlzdHJ1Y3QgbWFw bGVfYmlnX25vZGUgKmJfbm9kZSkNCit7DQorCWNoYXIgZW1wdHlfY291bnQgPSBtYXNfbXRfaGVp Z2h0KG1hcyk7DQorCXN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlIG1hc3Q7DQorCXVuc2lnbmVk IGNoYXIgc2hpZnQsIGJfZW5kID0gKytiX25vZGUtPmJfZW5kOw0KKw0KKwlNQV9TVEFURShsX21h cywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21hcywg bWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKw0KKwl0cmFjZV9tYV9vcChfX2Z1 bmNfXywgbWFzKTsNCisNCisJLyoNCisJICogUmViYWxhbmNpbmcgb2NjdXJzIGlmIGEgbm9kZSBp cyBpbnN1ZmZpY2llbnQuICBEYXRhIGlzIHJlYmFsYW5jZWQNCisJICogYWdhaW5zdCB0aGUgbm9k ZSB0byB0aGUgcmlnaHQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdGhlIG5vZGUgdG8gdGhlDQor CSAqIGxlZnQgb2YgdGhpcyBub2RlIGlzIHJlYmFsYW5jZWQgYWdhaW5zdCB0aGlzIG5vZGUuICBJ ZiByZWJhbGFuY2luZw0KKwkgKiBjYXVzZXMganVzdCBvbmUgbm9kZSB0byBiZSBwcm9kdWNlZCBp bnN0ZWFkIG9mIHR3bywgdGhlbiB0aGUgcGFyZW50DQorCSAqIGlzIGFsc28gZXhhbWluZWQgYW5k IHJlYmFsYW5jZWQgaWYgaXQgaXMgaW5zdWZmaWNpZW50LiAgRXZlcnkgbGV2ZWwNCisJICogdHJp ZXMgdG8gY29tYmluZSB0aGUgZGF0YSBpbiB0aGUgc2FtZSB3YXkuICBJZiBvbmUgbm9kZSBjb250 YWlucyB0aGUNCisJICogZW50aXJlIHJhbmdlIG9mIHRoZSB0cmVlLCB0aGVuIHRoYXQgbm9kZSBp cyB1c2VkIGFzIGEgbmV3IHJvb3Qgbm9kZS4NCisJICovDQorCW1hc19ub2RlX2NvdW50KG1hcywg MSArIGVtcHR5X2NvdW50ICogMyk7DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4g MDsNCisNCisJbWFzdC5vcmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnJfbWFzOw0K KwltYXN0LmJuID0gYl9ub2RlOw0KKwltYXN0LmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXMt Pm5vZGUpOw0KKw0KKwlsX21hcyA9IHJfbWFzID0gKm1hczsNCisNCisJaWYgKG1hc19uZXh0X3Np YmxpbmcoJnJfbWFzKSkgew0KKwkJbWFzX21hYl9jcCgmcl9tYXMsIDAsIG10X3Nsb3RfY291bnQo cl9tYXMubm9kZSksIGJfbm9kZSwgYl9lbmQpOw0KKwkJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4 ID0gcl9tYXMubWF4Ow0KKwl9IGVsc2Ugew0KKwkJbWFzX3ByZXZfc2libGluZygmbF9tYXMpOw0K KwkJc2hpZnQgPSBtYXNfZGF0YV9lbmQoJmxfbWFzKSArIDE7DQorCQltYWJfc2hpZnRfcmlnaHQo Yl9ub2RlLCBzaGlmdCk7DQorCQltYXMtPm9mZnNldCArPSBzaGlmdDsNCisJCW1hc19tYWJfY3Ao JmxfbWFzLCAwLCBzaGlmdCAtIDEsIGJfbm9kZSwgMCk7DQorCQliX25vZGUtPmJfZW5kID0gc2hp ZnQgKyBiX2VuZDsNCisJCWxfbWFzLmluZGV4ID0gbF9tYXMubGFzdCA9IGxfbWFzLm1pbjsNCisJ fQ0KKw0KKwlyZXR1cm4gbWFzX3NwYW5uaW5nX3JlYmFsYW5jZShtYXMsICZtYXN0LCBlbXB0eV9j b3VudCk7DQorfQ0KKw0KKy8qDQorICogbWFzX2Rlc3Ryb3lfcmViYWxhbmNlKCkgLSBSZWJhbGFu Y2UgbGVmdC1tb3N0IG5vZGUgd2hpbGUgZGVzdHJveWluZyB0aGUgbWFwbGUNCisgKiBzdGF0ZS4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBsZWZ0 LW1vc3Qgbm9kZS4NCisgKg0KKyAqIER1cmluZyBhIG1hc3MtaW5zZXJ0IGV2ZW50IChzdWNoIGFz IGZvcmtpbmcpLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvDQorICogcmViYWxhbmNlIHRoZSBsZWZ0 LW1vc3Qgbm9kZSB3aGVuIGl0IGlzIG5vdCBzdWZmaWNpZW50Lg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtYXNfZGVzdHJveV9yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2ln bmVkIGNoYXIgZW5kKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZSht YXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSByZXVzZSwgKm5ld25vZGUsICpwYXJlbnQs ICpuZXdfbGVmdCwgKmxlZnQsICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVwYXJlbnQ7 DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB0bXAsIHNwbGl0ID0gbXRfc2xvdHNbbXRdIC8gMjsN CisJdm9pZCBfX3JjdSAqKmxfc2xvdHMsICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKmxfcGl2 cywgKnBpdnMsIGdhcDsNCisJYm9vbCBpbl9yY3UgPSBtdF9pbl9yY3UobWFzLT50cmVlKTsNCisN CisJTUFfU1RBVEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisN CisJbF9tYXMgPSAqbWFzOw0KKwltYXNfcHJldl9zaWJsaW5nKCZsX21hcyk7DQorDQorCS8qIHNl dCB1cCBub2RlLiAqLw0KKwlpZiAoaW5fcmN1KSB7DQorCQkvKiBBbGxvY2F0ZSBmb3IgYm90aCBs ZWZ0IGFuZCByaWdodCBhcyB3ZWxsIGFzIHBhcmVudC4gKi8NCisJCW1hc19ub2RlX2NvdW50KG1h cywgMyk7DQorCQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybjsNCisNCisJCW5ld25v ZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJfSBlbHNlIHsNCisJCW5ld25vZGUgPSAmcmV1c2U7 DQorCX0NCisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwluZXdub2RlLT5wYXJlbnQgPSBub2Rl LT5wYXJlbnQ7DQorCXNsb3RzID0gbWFfc2xvdHMobmV3bm9kZSwgbXQpOw0KKwlwaXZzID0gbWFf cGl2b3RzKG5ld25vZGUsIG10KTsNCisJbGVmdCA9IG1hc19tbigmbF9tYXMpOw0KKwlsX3Nsb3Rz ID0gbWFfc2xvdHMobGVmdCwgbXQpOw0KKwlsX3BpdnMgPSBtYV9waXZvdHMobGVmdCwgbXQpOw0K KwlpZiAoIWxfc2xvdHNbc3BsaXRdKQ0KKwkJc3BsaXQrKzsNCisJdG1wID0gbWFzX2RhdGFfZW5k KCZsX21hcykgLSBzcGxpdDsNCisNCisJbWVtY3B5KHNsb3RzLCBsX3Nsb3RzICsgc3BsaXQgKyAx LCBzaXplb2Yodm9pZCAqKSAqIHRtcCk7DQorCW1lbWNweShwaXZzLCBsX3BpdnMgKyBzcGxpdCAr IDEsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIHRtcCk7DQorCXBpdnNbdG1wXSA9IGxfbWFzLm1h eDsNCisJbWVtY3B5KHNsb3RzICsgdG1wLCBtYV9zbG90cyhub2RlLCBtdCksIHNpemVvZih2b2lk ICopICogZW5kKTsNCisJbWVtY3B5KHBpdnMgKyB0bXAsIG1hX3Bpdm90cyhub2RlLCBtdCksIHNp emVvZih1bnNpZ25lZCBsb25nKSAqIGVuZCk7DQorDQorCWxfbWFzLm1heCA9IGxfcGl2c1tzcGxp dF07DQorCW1hcy0+bWluID0gbF9tYXMubWF4ICsgMTsNCisJZXBhcmVudCA9IG10X21rX25vZGUo bXRlX3BhcmVudChsX21hcy5ub2RlKSwNCisJCQkgICAgIG1hc19wYXJlbnRfZW51bSgmbF9tYXMs IGxfbWFzLm5vZGUpKTsNCisJdG1wICs9IGVuZDsNCisJaWYgKCFpbl9yY3UpIHsNCisJCXVuc2ln bmVkIGNoYXIgbWF4X3AgPSBtdF9waXZvdHNbbXRdOw0KKwkJdW5zaWduZWQgY2hhciBtYXhfcyA9 IG10X3Nsb3RzW210XTsNCisNCisJCWlmICh0bXAgPCBtYXhfcCkNCisJCQltZW1zZXQocGl2cyAr IHRtcCwgMCwNCisJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgKikgKiAobWF4X3AgLSB0 bXApKTsNCisNCisJCWlmICh0bXAgPCBtdF9zbG90c1ttdF0pDQorCQkJbWVtc2V0KHNsb3RzICsg dG1wLCAwLCBzaXplb2Yodm9pZCAqKSAqIChtYXhfcyAtIHRtcCkpOw0KKw0KKwkJbWVtY3B5KG5v ZGUsIG5ld25vZGUsIHNpemVvZihzdHJ1Y3QgbWFwbGVfbm9kZSkpOw0KKwkJbWFfc2V0X21ldGEo bm9kZSwgbXQsIDAsIHRtcCAtIDEpOw0KKwkJbXRlX3NldF9waXZvdChlcGFyZW50LCBtdGVfcGFy ZW50X3Nsb3QobF9tYXMubm9kZSksDQorCQkJICAgICAgbF9waXZzW3NwbGl0XSk7DQorDQorCQkv KiBSZW1vdmUgZGF0YSBmcm9tIGxfcGl2cy4gKi8NCisJCXRtcCA9IHNwbGl0ICsgMTsNCisJCW1l bXNldChsX3BpdnMgKyB0bXAsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIChtYXhfcCAtIHRt cCkpOw0KKwkJbWVtc2V0KGxfc2xvdHMgKyB0bXAsIDAsIHNpemVvZih2b2lkICopICogKG1heF9z IC0gdG1wKSk7DQorCQltYV9zZXRfbWV0YShsZWZ0LCBtdCwgMCwgc3BsaXQpOw0KKw0KKwkJZ290 byBkb25lOw0KKwl9DQorDQorCS8qIFJDVSByZXF1aXJlcyByZXBsYWNpbmcgYm90aCBsX21hcywg bWFzLCBhbmQgcGFyZW50LiAqLw0KKwltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5ld25vZGUsIG10 KTsNCisJbWFfc2V0X21ldGEobmV3bm9kZSwgbXQsIDAsIHRtcCk7DQorDQorCW5ld19sZWZ0ID0g bWFzX3BvcF9ub2RlKG1hcyk7DQorCW5ld19sZWZ0LT5wYXJlbnQgPSBsZWZ0LT5wYXJlbnQ7DQor CW10ID0gbXRlX25vZGVfdHlwZShsX21hcy5ub2RlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhuZXdf bGVmdCwgbXQpOw0KKwlwaXZzID0gbWFfcGl2b3RzKG5ld19sZWZ0LCBtdCk7DQorCW1lbWNweShz bG90cywgbF9zbG90cywgc2l6ZW9mKHZvaWQgKikgKiBzcGxpdCk7DQorCW1lbWNweShwaXZzLCBs X3BpdnMsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIHNwbGl0KTsNCisJbWFfc2V0X21ldGEobmV3 X2xlZnQsIG10LCAwLCBzcGxpdCk7DQorCWxfbWFzLm5vZGUgPSBtdF9ta19ub2RlKG5ld19sZWZ0 LCBtdCk7DQorDQorCS8qIHJlcGxhY2UgcGFyZW50LiAqLw0KKwlvZmZzZXQgPSBtdGVfcGFyZW50 X3Nsb3QobWFzLT5ub2RlKTsNCisJbXQgPSBtYXNfcGFyZW50X2VudW0oJmxfbWFzLCBsX21hcy5u b2RlKTsNCisJcGFyZW50ID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMo cGFyZW50LCBtdCk7DQorCXBpdnMgPSBtYV9waXZvdHMocGFyZW50LCBtdCk7DQorCW1lbWNweShw YXJlbnQsIG10ZV90b19ub2RlKGVwYXJlbnQpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsN CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW29mZnNldF0sIG1hcy0+bm9kZSk7DQorCXJjdV9h c3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXQgLSAxXSwgbF9tYXMubm9kZSk7DQorCXBpdnNbb2Zm c2V0IC0gMV0gPSBsX21hcy5tYXg7DQorCWVwYXJlbnQgPSBtdF9ta19ub2RlKHBhcmVudCwgbXQp Ow0KK2RvbmU6DQorCWdhcCA9IG1hc19sZWFmX21heF9nYXAobWFzKTsNCisJbXRlX3NldF9nYXAo ZXBhcmVudCwgbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSksIGdhcCk7DQorCWdhcCA9IG1hc19s ZWFmX21heF9nYXAoJmxfbWFzKTsNCisJbXRlX3NldF9nYXAoZXBhcmVudCwgbXRlX3BhcmVudF9z bG90KGxfbWFzLm5vZGUpLCBnYXApOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorDQorCWlmIChpbl9y Y3UpDQorCQltYXNfcmVwbGFjZShtYXMsIGZhbHNlKTsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFz KTsNCit9DQorDQorLyoNCisgKiBtYXNfc3BsaXRfZmluYWxfbm9kZSgpIC0gU3BsaXQgdGhlIGZp bmFsIG5vZGUgaW4gYSBzdWJ0cmVlIG9wZXJhdGlvbi4NCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1 YnRyZWUgc3RhdGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBUaGUg aGVpZ2h0IG9mIHRoZSB0cmVlIGluIGNhc2UgaXQncyBhIG5ldyByb290Lg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtYXNfc3BsaXRfZmluYWxfbm9kZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSAqbWFzdCwNCisJCQkJCXN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgaGVpZ2h0KQ0KK3sN CisJc3RydWN0IG1hcGxlX2Vub2RlICphbmNlc3RvcjsNCisNCisJaWYgKG10ZV9pc19yb290KG1h cy0+bm9kZSkpIHsNCisJCWlmIChtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJCW1hc3QtPmJu LT50eXBlID0gbWFwbGVfYXJhbmdlXzY0Ow0KKwkJZWxzZQ0KKwkJCW1hc3QtPmJuLT50eXBlID0g bWFwbGVfcmFuZ2VfNjQ7DQorCQltYXMtPmRlcHRoID0gaGVpZ2h0Ow0KKwl9DQorCS8qDQorCSAq IE9ubHkgYSBzaW5nbGUgbm9kZSBpcyB1c2VkIGhlcmUsIGNvdWxkIGJlIHJvb3QuDQorCSAqIFRo ZSBCaWdfbm9kZSBkYXRhIHNob3VsZCBqdXN0IGZpdCBpbiBhIHNpbmdsZSBub2RlLg0KKwkgKi8N CisJYW5jZXN0b3IgPSBtYXNfbmV3X21hX25vZGUobWFzLCBtYXN0LT5ibik7DQorCW10ZV9zZXRf cGFyZW50KG1hc3QtPmwtPm5vZGUsIGFuY2VzdG9yLCBtYXN0LT5sLT5vZmZzZXQpOw0KKwltdGVf c2V0X3BhcmVudChtYXN0LT5yLT5ub2RlLCBhbmNlc3RvciwgbWFzdC0+ci0+b2Zmc2V0KTsNCisJ bXRlX3RvX25vZGUoYW5jZXN0b3IpLT5wYXJlbnQgPSBtYXNfbW4obWFzKS0+cGFyZW50Ow0KKw0K KwltYXN0LT5sLT5ub2RlID0gYW5jZXN0b3I7DQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10 X3Nsb3RzW21hc3QtPmJuLT50eXBlXSAtIDEsIG1hc3QtPmwsIHRydWUpOw0KKwltYXMtPm9mZnNl dCA9IG1hc3QtPmJuLT5iX2VuZCAtIDE7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAq IG1hc3RfZmlsbF9ibm9kZSgpIC0gQ29weSBkYXRhIGludG8gdGhlIGJpZyBub2RlIGluIHRoZSBz dWJ0cmVlIHN0YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1h czogdGhlIG1hcGxlIHN0YXRlDQorICogQHNraXA6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBz a2lwIGZvciBuZXcgbm9kZXMgaW5zZXJ0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXN0X2ZpbGxfYm5vZGUoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQkg c3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJCQkgdW5zaWduZWQgY2hhciBza2lwKQ0KK3sNCisJ Ym9vbCBjcCA9IHRydWU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkID0gbWFzLT5ub2RlOw0K Kwl1bnNpZ25lZCBjaGFyIHNwbGl0Ow0KKw0KKwltZW1zZXQobWFzdC0+Ym4tPmdhcCwgMCwgc2l6 ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+Z2FwKSk7DQorCW1lbXNl dChtYXN0LT5ibi0+c2xvdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0laRSht YXN0LT5ibi0+c2xvdCkpOw0KKwltZW1zZXQobWFzdC0+Ym4tPnBpdm90LCAwLCBzaXplb2YodW5z aWduZWQgbG9uZykgKiBBUlJBWV9TSVpFKG1hc3QtPmJuLT5waXZvdCkpOw0KKwltYXN0LT5ibi0+ Yl9lbmQgPSAwOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJY3AgPSBm YWxzZTsNCisJfSBlbHNlIHsNCisJCW1hc19hc2NlbmQobWFzKTsNCisJCW1hdF9hZGQobWFzdC0+ ZnJlZSwgb2xkKTsNCisJCW1hcy0+b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7 DQorCX0NCisNCisJaWYgKGNwICYmIG1hc3QtPmwtPm9mZnNldCkNCisJCW1hc19tYWJfY3AobWFz LCAwLCBtYXN0LT5sLT5vZmZzZXQgLSAxLCBtYXN0LT5ibiwgMCk7DQorDQorCXNwbGl0ID0gbWFz dC0+Ym4tPmJfZW5kOw0KKwltYWJfc2V0X2JfZW5kKG1hc3QtPmJuLCBtYXN0LT5sLCBtYXN0LT5s LT5ub2RlKTsNCisJbWFzdC0+ci0+b2Zmc2V0ID0gbWFzdC0+Ym4tPmJfZW5kOw0KKwltYWJfc2V0 X2JfZW5kKG1hc3QtPmJuLCBtYXN0LT5yLCBtYXN0LT5yLT5ub2RlKTsNCisJaWYgKG1hc3QtPmJu LT5waXZvdFttYXN0LT5ibi0+Yl9lbmQgLSAxXSA9PSBtYXMtPm1heCkNCisJCWNwID0gZmFsc2U7 DQorDQorCWlmIChjcCkNCisJCW1hc19tYWJfY3AobWFzLCBzcGxpdCArIHNraXAsIG10X3Nsb3Rf Y291bnQobWFzLT5ub2RlKSAtIDEsDQorCQkJICAgbWFzdC0+Ym4sIG1hc3QtPmJuLT5iX2VuZCk7 DQorDQorCW1hc3QtPmJuLT5iX2VuZC0tOw0KKwltYXN0LT5ibi0+dHlwZSA9IG10ZV9ub2RlX3R5 cGUobWFzLT5ub2RlKTsNCit9DQorDQorLyoNCisgKiBtYXN0X3NwbGl0X2RhdGEoKSAtIFNwbGl0 IHRoZSBkYXRhIGluIHRoZSBzdWJ0cmVlIHN0YXRlIGJpZyBub2RlIGludG8gcmVndWxhcg0KKyAq IG5vZGVzLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNwbGl0IHRoZSBiaWcg bm9kZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3NwbGl0X2RhdGEoc3RydWN0IG1h cGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCSAgIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNp Z25lZCBjaGFyIHNwbGl0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBwX3Nsb3Q7DQorDQorCW1hYl9t YXNfY3AobWFzdC0+Ym4sIDAsIHNwbGl0LCBtYXN0LT5sLCB0cnVlKTsNCisJbXRlX3NldF9waXZv dChtYXN0LT5yLT5ub2RlLCAwLCBtYXN0LT5yLT5tYXgpOw0KKwltYWJfbWFzX2NwKG1hc3QtPmJu LCBzcGxpdCArIDEsIG1hc3QtPmJuLT5iX2VuZCwgbWFzdC0+ciwgZmFsc2UpOw0KKwltYXN0LT5s LT5vZmZzZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJbWFzdC0+bC0+bWF4ID0g bWFzdC0+Ym4tPnBpdm90W3NwbGl0XTsNCisJbWFzdC0+ci0+bWluID0gbWFzdC0+bC0+bWF4ICsg MTsNCisJaWYgKG10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCXBfc2xv dCA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0Ow0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5v cmlnX2wsIG1hc3QtPmwtPm5vZGUsIG1hc3QtPnItPm5vZGUsDQorCQkJICAgICAmcF9zbG90LCBz cGxpdCk7DQorCW1hc19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPm9yaWdfciwgbWFzdC0+bC0+bm9k ZSwgbWFzdC0+ci0+bm9kZSwNCisJCQkgICAgICZwX3Nsb3QsIHNwbGl0KTsNCit9DQorDQorLyoN CisgKiBtYXNfcHVzaF9kYXRhKCkgLSBJbnN0ZWFkIG9mIHNwbGl0dGluZyBhIG5vZGUsIGl0IGlz IGJlbmVmaWNpYWwgdG8gcHVzaCB0aGUNCisgKiBkYXRhIHRvIHRoZSByaWdodCBvciBsZWZ0IG5v ZGUgaWYgdGhlcmUgaXMgcm9vbS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVp Z2h0OiBUaGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIG1hcGxlIHN0YXRlDQorICogQG1hc3Q6IFRo ZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQGxlZnQ6IFB1c2ggbGVmdCBvciBub3QuDQorICoN CisgKiBLZWVwaW5nIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUgbG93IG1lYW5zIGZhc3RlciBsb29r dXBzLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHB1c2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfcHVzaF9kYXRhKHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCBpbnQgaGVpZ2h0LA0KKwkJCQkgc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3Qs IGJvb2wgbGVmdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdF90b3RhbCA9IG1hc3QtPmJuLT5i X2VuZDsNCisJdW5zaWduZWQgY2hhciBlbmQsIHNwYWNlLCBzcGxpdDsNCisNCisJTUFfU1RBVEUo dG1wX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwl0bXBfbWFzID0g Km1hczsNCisJdG1wX21hcy5kZXB0aCA9IG1hc3QtPmwtPmRlcHRoOw0KKw0KKwlpZiAobGVmdCAm JiAhbWFzX3ByZXZfc2libGluZygmdG1wX21hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorCWVsc2Ug aWYgKCFsZWZ0ICYmICFtYXNfbmV4dF9zaWJsaW5nKCZ0bXBfbWFzKSkNCisJCXJldHVybiBmYWxz ZTsNCisNCisJZW5kID0gbWFzX2RhdGFfZW5kKCZ0bXBfbWFzKTsNCisJc2xvdF90b3RhbCArPSBl bmQ7DQorCXNwYWNlID0gMiAqIG10X3Nsb3RfY291bnQobWFzLT5ub2RlKSAtIDI7DQorCS8qIC0y IGluc3RlYWQgb2YgLTEgdG8gZW5zdXJlIHRoZXJlIGlzbid0IGEgdHJpcGxlIHNwbGl0ICovDQor CWlmIChtYV9pc19sZWFmKG1hc3QtPmJuLT50eXBlKSkNCisJCXNwYWNlLS07DQorDQorCWlmICht YXMtPm1heCA9PSBVTE9OR19NQVgpDQorCQlzcGFjZS0tOw0KKw0KKwlpZiAoc2xvdF90b3RhbCA+ PSBzcGFjZSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJLyogR2V0IHRoZSBkYXRhOyBGaWxsIG1h c3QtPmJuICovDQorCW1hc3QtPmJuLT5iX2VuZCsrOw0KKwlpZiAobGVmdCkgew0KKwkJbWFiX3No aWZ0X3JpZ2h0KG1hc3QtPmJuLCBlbmQgKyAxKTsNCisJCW1hc19tYWJfY3AoJnRtcF9tYXMsIDAs IGVuZCwgbWFzdC0+Ym4sIDApOw0KKwkJbWFzdC0+Ym4tPmJfZW5kID0gc2xvdF90b3RhbCArIDE7 DQorCX0gZWxzZSB7DQorCQltYXNfbWFiX2NwKCZ0bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCBt YXN0LT5ibi0+Yl9lbmQpOw0KKwl9DQorDQorCS8qIENvbmZpZ3VyZSBtYXN0IGZvciBzcGxpdHRp bmcgb2YgbWFzdC0+Ym4gKi8NCisJc3BsaXQgPSBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0gLSAy Ow0KKwlpZiAobGVmdCkgew0KKwkJLyogIFN3aXRjaCBtYXMgdG8gcHJldiBub2RlICAqLw0KKwkJ bWF0X2FkZChtYXN0LT5mcmVlLCBtYXMtPm5vZGUpOw0KKwkJKm1hcyA9IHRtcF9tYXM7DQorCQkv KiBTdGFydCB1c2luZyBtYXN0LT5sIGZvciB0aGUgbGVmdCBzaWRlLiAqLw0KKwkJdG1wX21hcy5u b2RlID0gbWFzdC0+bC0+bm9kZTsNCisJCSptYXN0LT5sID0gdG1wX21hczsNCisJfSBlbHNlIHsN CisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgdG1wX21hcy5ub2RlKTsNCisJCXRtcF9tYXMubm9kZSA9 IG1hc3QtPnItPm5vZGU7DQorCQkqbWFzdC0+ciA9IHRtcF9tYXM7DQorCQlzcGxpdCA9IHNsb3Rf dG90YWwgLSBzcGxpdDsNCisJfQ0KKwlzcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KG1hc3QtPmJu LCBzcGxpdCwgbXRfc2xvdHNbbWFzdC0+Ym4tPnR5cGVdKTsNCisJLyogVXBkYXRlIHBhcmVudCBz bG90IGZvciBzcGxpdCBjYWxjdWxhdGlvbi4gKi8NCisJaWYgKGxlZnQpDQorCQltYXN0LT5vcmln X2wtPm9mZnNldCArPSBlbmQgKyAxOw0KKw0KKwltYXN0X3NwbGl0X2RhdGEobWFzdCwgbWFzLCBz cGxpdCk7DQorCW1hc3RfZmlsbF9ibm9kZShtYXN0LCBtYXMsIDIpOw0KKwltYXNfc3BsaXRfZmlu YWxfbm9kZShtYXN0LCBtYXMsIGhlaWdodCArIDEpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQor LyoNCisgKiBtYXNfc3BsaXQoKSAtIFNwbGl0IGRhdGEgdGhhdCBpcyB0b28gYmlnIGZvciBvbmUg bm9kZSBpbnRvIHR3by4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAYl9ub2RlOiBU aGUgbWFwbGUgYmlnIG5vZGUNCisgKiBSZXR1cm46IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJl Lg0KKyAqLw0KK3N0YXRpYyBpbnQgbWFzX3NwbGl0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1 Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSkNCit7DQorDQorCXN0cnVjdCBtYXBsZV9zdWJ0cmVl X3N0YXRlIG1hc3Q7DQorCWludCBoZWlnaHQgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIG1pZF9zcGxp dCwgc3BsaXQgPSAwOw0KKw0KKwkvKg0KKwkgKiBTcGxpdHRpbmcgaXMgaGFuZGxlZCBkaWZmZXJl bnRseSBmcm9tIGFueSBvdGhlciBCLXRyZWU7IHRoZSBNYXBsZQ0KKwkgKiBUcmVlIHNwbGl0cyB1 cHdhcmRzLiAgU3BsaXR0aW5nIHVwIG1lYW5zIHRoYXQgdGhlIHNwbGl0IG9wZXJhdGlvbg0KKwkg KiBvY2N1cnMgd2hlbiB0aGUgd2FsayBvZiB0aGUgdHJlZSBoaXRzIHRoZSBsZWF2ZXMgYW5kIG5v dCBvbiB0aGUgd2F5DQorCSAqIGRvd24uICBUaGUgcmVhc29uIGZvciBzcGxpdHRpbmcgdXAgaXMg dGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtub3cNCisJICogaG93IG11Y2ggc3BhY2Ugd2lsbCBi ZSBuZWVkZWQgdW50aWwgdGhlIGxlYWYgaXMgKG9yIGxlYXZlcyBhcmUpDQorCSAqIHJlYWNoZWQu ICBTaW5jZSBvdmVyd3JpdGluZyBkYXRhIGlzIGFsbG93ZWQgYW5kIGEgcmFuZ2UgY291bGQNCisJ ICogb3ZlcndyaXRlIG1vcmUgdGhhbiBvbmUgcmFuZ2Ugb3IgcmVzdWx0IGluIGNoYW5naW5nIG9u ZSBlbnRyeSBpbnRvIDMNCisJICogZW50cmllcywgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IGlm IGEgc3BsaXQgaXMgcmVxdWlyZWQgdW50aWwgdGhlDQorCSAqIGRhdGEgaXMgZXhhbWluZWQuDQor CSAqDQorCSAqIFNwbGl0dGluZyBpcyBhIGJhbGFuY2luZyBhY3QgYmV0d2VlbiBrZWVwaW5nIGFs bG9jYXRpb25zIHRvIGEgbWluaW11bQ0KKwkgKiBhbmQgYXZvaWRpbmcgYSAnaml0dGVyJyBldmVu dCB3aGVyZSBhIHRyZWUgaXMgZXhwYW5kZWQgdG8gbWFrZSByb29tDQorCSAqIGZvciBhbiBlbnRy eSBmb2xsb3dlZCBieSBhIGNvbnRyYWN0aW9uIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQuICBU bw0KKwkgKiBhY2NvbXBsaXNoIHRoZSBiYWxhbmNlLCB0aGVyZSBhcmUgZW1wdHkgc2xvdHMgcmVt YWluaW5nIGluIGJvdGggbGVmdA0KKwkgKiBhbmQgcmlnaHQgbm9kZXMgYWZ0ZXIgYSBzcGxpdC4N CisJICovDQorCU1BX1NUQVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFz dCk7DQorCU1BX1NUQVRFKHJfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7 DQorCU1BX1NUQVRFKHByZXZfbF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0 KTsNCisJTUFfU1RBVEUocHJldl9yX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxh c3QpOw0KKwlNQV9UT1BJQVJZKG1hdCwgbWFzLT50cmVlKTsNCisNCisJdHJhY2VfbWFfb3AoX19m dW5jX18sIG1hcyk7DQorCW1hcy0+ZGVwdGggPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCS8qIEFs bG9jYXRpb24gZmFpbHVyZXMgd2lsbCBoYXBwZW4gZWFybHkuICovDQorCW1hc19ub2RlX2NvdW50 KG1hcywgMSArIG1hcy0+ZGVwdGggKiAyKTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJl dHVybiAwOw0KKw0KKwltYXN0LmwgPSAmbF9tYXM7DQorCW1hc3QuciA9ICZyX21hczsNCisJbWFz dC5vcmlnX2wgPSAmcHJldl9sX21hczsNCisJbWFzdC5vcmlnX3IgPSAmcHJldl9yX21hczsNCisJ bWFzdC5mcmVlID0gJm1hdDsNCisJbWFzdC5ibiA9IGJfbm9kZTsNCisNCisJd2hpbGUgKGhlaWdo dCsrIDw9IG1hcy0+ZGVwdGgpIHsNCisJCWlmIChtdF9zbG90c1tiX25vZGUtPnR5cGVdID4gYl9u b2RlLT5iX2VuZCkgew0KKwkJCW1hc19zcGxpdF9maW5hbF9ub2RlKCZtYXN0LCBtYXMsIGhlaWdo dCk7DQorCQkJYnJlYWs7DQorCQl9DQorDQorCQlsX21hcyA9IHJfbWFzID0gKm1hczsNCisJCWxf bWFzLm5vZGUgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwkJcl9tYXMubm9kZSA9 IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCQkvKg0KKwkJICogQW5vdGhlciB3YXkg dGhhdCAnaml0dGVyJyBpcyBhdm9pZGVkIGlzIHRvIHRlcm1pbmF0ZSBhIHNwbGl0IHVwIGVhcmx5 IGlmIHRoZQ0KKwkJICogbGVmdCBvciByaWdodCBub2RlIGhhcyBzcGFjZSB0byBzcGFyZS4gIFRo aXMgaXMgcmVmZXJyZWQgdG8gYXMgInB1c2hpbmcgbGVmdCINCisJCSAqIG9yICJwdXNoaW5nIHJp Z2h0IiBhbmQgaXMgc2ltaWxhciB0byB0aGUgQiogdHJlZSwgZXhjZXB0IHRoZSBub2RlcyBsZWZ0 IG9yDQorCQkgKiByaWdodCBjYW4gcmFyZWx5IGJlIHJldXNlZCBkdWUgdG8gUkNVLCBidXQgdGhl IHJpcHBsZSB1cHdhcmRzIGlzIGhhbHRlZCB3aGljaA0KKwkJICogaXMgYSBzaWduaWZpY2FudCBz YXZpbmdzLg0KKwkJICovDQorCQkvKiBUcnkgdG8gcHVzaCBsZWZ0LiAqLw0KKwkJaWYgKG1hc19w dXNoX2RhdGEobWFzLCBoZWlnaHQsICZtYXN0LCB0cnVlKSkNCisJCQlicmVhazsNCisNCisJCS8q IFRyeSB0byBwdXNoIHJpZ2h0LiAqLw0KKwkJaWYgKG1hc19wdXNoX2RhdGEobWFzLCBoZWlnaHQs ICZtYXN0LCBmYWxzZSkpDQorCQkJYnJlYWs7DQorDQorCQlzcGxpdCA9IG1hYl9jYWxjX3NwbGl0 KG1hcywgYl9ub2RlLCAmbWlkX3NwbGl0LCBwcmV2X2xfbWFzLm1pbik7DQorCQltYXN0X3NwbGl0 X2RhdGEoJm1hc3QsIG1hcywgc3BsaXQpOw0KKwkJLyoNCisJCSAqIFVzdWFsbHkgY29ycmVjdCwg bWFiX21hc19jcCBpbiB0aGUgYWJvdmUgY2FsbCBvdmVyd3JpdGVzDQorCQkgKiByLT5tYXguDQor CQkgKi8NCisJCW1hc3Quci0+bWF4ID0gbWFzLT5tYXg7DQorCQltYXN0X2ZpbGxfYm5vZGUoJm1h c3QsIG1hcywgMSk7DQorCQlwcmV2X2xfbWFzID0gKm1hc3QubDsNCisJCXByZXZfcl9tYXMgPSAq bWFzdC5yOw0KKwl9DQorDQorCS8qIFNldCB0aGUgb3JpZ2luYWwgbm9kZSBhcyBkZWFkICovDQor CW1hdF9hZGQobWFzdC5mcmVlLCBtYXMtPm5vZGUpOw0KKwltYXMtPm5vZGUgPSBsX21hcy5ub2Rl Ow0KKwltYXNfd21iX3JlcGxhY2UobWFzLCBtYXN0LmZyZWUsIE5VTEwpOw0KKwltdHJlZV9yYW5n ZV93YWxrKG1hcyk7DQorCXJldHVybiAxOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXVzZV9ub2Rl KCkgLSBSZXVzZSB0aGUgbm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKiBAd3JfbWFzOiBUaGUg bWFwbGUgd3JpdGUgc3RhdGUNCisgKiBAYm46IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6 IFRoZSBlbmQgb2YgdGhlIGRhdGEuDQorICoNCisgKiBXaWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ug aW4gUkNVIG1vZGUuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgbm9kZSB3YXMgcmV1c2VkLCBm YWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXVzZV9ub2Rl KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzLA0KKwkJCSAgc3RydWN0IG1hcGxlX2JpZ19ub2Rl ICpibiwgdW5zaWduZWQgY2hhciBlbmQpDQorew0KKwkvKiBOZWVkIHRvIGJlIHJjdSBzYWZlLiAq Lw0KKwlpZiAobXRfaW5fcmN1KHdyX21hcy0+bWFzLT50cmVlKSkNCisJCXJldHVybiBmYWxzZTsN CisNCisJaWYgKGVuZCA+IGJuLT5iX2VuZCkgew0KKwkJaW50IGNsZWFyID0gbXRfc2xvdHNbd3Jf bWFzLT50eXBlXSAtIGJuLT5iX2VuZDsNCisNCisJCW1lbXNldCh3cl9tYXMtPnNsb3RzICsgYm4t PmJfZW5kLCAwLCBzaXplb2Yodm9pZCAqKSAqIGNsZWFyLS0pOw0KKwkJbWVtc2V0KHdyX21hcy0+ cGl2b3RzICsgYm4tPmJfZW5kLCAwLCBzaXplb2Yodm9pZCAqKSAqIGNsZWFyKTsNCisJfQ0KKwlt YWJfbWFzX2NwKGJuLCAwLCBibi0+Yl9lbmQsIHdyX21hcy0+bWFzLCBmYWxzZSk7DQorCXJldHVy biB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19jb21taXRfYl9ub2RlKCkgLSBDb21taXQgdGhl IGJpZyBub2RlIGludG8gdGhlIHRyZWUuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0 YXRlDQorICogQGJfbm9kZTogVGhlIG1hcGxlIGJpZyBub2RlDQorICogQGVuZDogVGhlIGVuZCBv ZiB0aGUgZGF0YS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfY29tbWl0X2Jfbm9kZShz dHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcywNCisJCQkgICAgc3RydWN0IG1hcGxlX2JpZ19ub2Rl ICpiX25vZGUsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5v ZGU7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBiX25vZGUtPmJfZW5kOw0KKwllbnVtIG1hcGxl X3R5cGUgYl90eXBlID0gYl9ub2RlLT50eXBlOw0KKw0KKwlpZiAoKGJfZW5kIDwgbXRfbWluX3Ns b3RzW2JfdHlwZV0pICYmDQorCSAgICAoIW10ZV9pc19yb290KHdyX21hcy0+bWFzLT5ub2RlKSkg JiYNCisJICAgIChtYXNfbXRfaGVpZ2h0KHdyX21hcy0+bWFzKSA+IDEpKQ0KKwkJcmV0dXJuIG1h c19yZWJhbGFuY2Uod3JfbWFzLT5tYXMsIGJfbm9kZSk7DQorDQorCWlmIChiX2VuZCA+PSBtdF9z bG90c1tiX3R5cGVdKQ0KKwkJcmV0dXJuIG1hc19zcGxpdCh3cl9tYXMtPm1hcywgYl9ub2RlKTsN CisNCisJaWYgKG1hc19yZXVzZV9ub2RlKHdyX21hcywgYl9ub2RlLCBlbmQpKQ0KKwkJZ290byBy ZXVzZV9ub2RlOw0KKw0KKwltYXNfbm9kZV9jb3VudCh3cl9tYXMtPm1hcywgMSk7DQorCWlmICht YXNfaXNfZXJyKHdyX21hcy0+bWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlub2RlID0gbWFzX3Bv cF9ub2RlKHdyX21hcy0+bWFzKTsNCisJbm9kZS0+cGFyZW50ID0gbWFzX21uKHdyX21hcy0+bWFz KS0+cGFyZW50Ow0KKwl3cl9tYXMtPm1hcy0+bm9kZSA9IG10X21rX25vZGUobm9kZSwgYl90eXBl KTsNCisJbWFiX21hc19jcChiX25vZGUsIDAsIGJfZW5kLCB3cl9tYXMtPm1hcywgdHJ1ZSk7DQor DQorCW1hc19yZXBsYWNlKHdyX21hcy0+bWFzLCBmYWxzZSk7DQorcmV1c2Vfbm9kZToNCisJbWFz X3VwZGF0ZV9nYXAod3JfbWFzLT5tYXMpOw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoNCisgKiBt YXNfcm9vdF9leHBhbmQoKSAtIEV4cGFuZCBhIHJvb3QgdG8gYSBub2RlDQorICogQG1hczogVGhl IG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUgaW50byB0aGUgdHJl ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19yb290X2V4cGFuZChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwl2b2lkICpjb250ZW50cyA9IG1hc19yb290X2xv Y2tlZChtYXMpOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG1hcGxlX2xlYWZfNjQ7DQorCXN0 cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVk IGxvbmcgKnBpdm90czsNCisJaW50IHNsb3QgPSAwOw0KKw0KKwltYXNfbm9kZV9jb3VudChtYXMs IDEpOw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiAwOw0KKw0K Kwlub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0 eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJbm9kZS0+cGFyZW50ID0g bWFfcGFyZW50X3B0cigNCisJCSAgICAgICgodW5zaWduZWQgbG9uZyltYXMtPnRyZWUgfCBNQV9S T09UX1BBUkVOVCkpOw0KKwltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5vZGUsIHR5cGUpOw0KKw0K KwlpZiAobWFzLT5pbmRleCkgew0KKwkJaWYgKGNvbnRlbnRzKSB7DQorCQkJcmN1X2Fzc2lnbl9w b2ludGVyKHNsb3RzW3Nsb3RdLCBjb250ZW50cyk7DQorCQkJaWYgKGxpa2VseShtYXMtPmluZGV4 ID4gMSkpDQorCQkJCXNsb3QrKzsNCisJCX0NCisJCXBpdm90c1tzbG90KytdID0gbWFzLT5pbmRl eCAtIDE7DQorCX0NCisNCisJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW3Nsb3RdLCBlbnRyeSk7 DQorCW1hcy0+b2Zmc2V0ID0gc2xvdDsNCisJcGl2b3RzW3Nsb3RdID0gbWFzLT5sYXN0Ow0KKwlp ZiAobWFzLT5sYXN0ICE9IFVMT05HX01BWCkNCisJCXNsb3QrKzsNCisJbWFzLT5kZXB0aCA9IDE7 DQorCW1hc19zZXRfaGVpZ2h0KG1hcyk7DQorDQorCS8qIHN3YXAgdGhlIG5ldyByb290IGludG8g dGhlIHRyZWUgKi8NCisJcmN1X2Fzc2lnbl9wb2ludGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgbXRl X21rX3Jvb3QobWFzLT5ub2RlKSk7DQorCW1hX3NldF9tZXRhKG5vZGUsIG1hcGxlX2xlYWZfNjQs IDAsIHNsb3QpOw0KKwlyZXR1cm4gc2xvdDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1h c19zdG9yZV9yb290KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCWlm IChsaWtlbHkoKG1hcy0+bGFzdCAhPSAwKSB8fCAobWFzLT5pbmRleCAhPSAwKSkpDQorCQltYXNf cm9vdF9leHBhbmQobWFzLCBlbnRyeSk7DQorCWVsc2UgaWYgKCgodW5zaWduZWQgbG9uZykgKGVu dHJ5KSAmIDMpID09IDIpDQorCQltYXNfcm9vdF9leHBhbmQobWFzLCBlbnRyeSk7DQorCWVsc2Ug ew0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgZW50cnkpOw0KKwkJ bWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2lzX3NwYW5f d3IoKSAtIENoZWNrIGlmIHRoZSB3cml0ZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzIGEgd3JpdGUg dGhhdA0KKyAqIHNwYW5zIHRoZSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBwaXY6IFRoZSBwaXZvdCB2YWx1ZSBiZWluZyB3cml0dGVuDQorICogQHR5cGU6IFRoZSBtYXBs ZSBub2RlIHR5cGUNCisgKiBAZW50cnk6IFRoZSBkYXRhIHRvIHdyaXRlDQorICoNCisgKiBTcGFu bmluZyB3cml0ZXMgYXJlIHdyaXRlcyB0aGF0IHN0YXJ0IGluIG9uZSBub2RlIGFuZCBlbmQgaW4g YW5vdGhlciBPUiBpZg0KKyAqIHRoZSB3cml0ZSBvZiBhICVOVUxMIHdpbGwgY2F1c2UgdGhlIG5v ZGUgdG8gZW5kIHdpdGggYSAlTlVMTC4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiB0aGlzIGlz IGEgc3Bhbm5pbmcgd3JpdGUsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgYm9vbCBt YXNfaXNfc3Bhbl93cihzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXVuc2lnbmVk IGxvbmcgbWF4Ow0KKwl1bnNpZ25lZCBsb25nIGxhc3QgPSB3cl9tYXMtPm1hcy0+bGFzdDsNCisJ dW5zaWduZWQgbG9uZyBwaXYgPSB3cl9tYXMtPnJfbWF4Ow0KKwllbnVtIG1hcGxlX3R5cGUgdHlw ZSA9IHdyX21hcy0+dHlwZTsNCisJdm9pZCAqZW50cnkgPSB3cl9tYXMtPmVudHJ5Ow0KKw0KKwkv KiBDb250YWluZWQgaW4gdGhpcyBwaXZvdCAqLw0KKwlpZiAocGl2ID4gbGFzdCkNCisJCXJldHVy biBmYWxzZTsNCisNCisJbWF4ID0gd3JfbWFzLT5tYXMtPm1heDsNCisJaWYgKHVubGlrZWx5KG1h X2lzX2xlYWYodHlwZSkpKSB7DQorCQkvKiBGaXRzIGluIHRoZSBub2RlLCBidXQgbWF5IHNwYW4g c2xvdHMuICovDQorCQlpZiAobGFzdCA8IG1heCkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkv KiBXcml0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZSBidXQgbm90IG51bGwuICovDQorCQlpZiAo KGxhc3QgPT0gbWF4KSAmJiBlbnRyeSkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKg0KKwkJ ICogV3JpdGluZyBVTE9OR19NQVggaXMgbm90IGEgc3Bhbm5pbmcgd3JpdGUgcmVnYXJkbGVzcyBv ZiB0aGUNCisJCSAqIHZhbHVlIGJlaW5nIHdyaXR0ZW4gYXMgbG9uZyBhcyB0aGUgcmFuZ2UgZml0 cyBpbiB0aGUgbm9kZS4NCisJCSAqLw0KKwkJaWYgKChsYXN0ID09IFVMT05HX01BWCkgJiYgKGxh c3QgPT0gbWF4KSkNCisJCQlyZXR1cm4gZmFsc2U7DQorCX0gZWxzZSBpZiAocGl2ID09IGxhc3Qp IHsNCisJCWlmIChlbnRyeSkNCisJCQlyZXR1cm4gZmFsc2U7DQorDQorCQkvKiBEZXRlY3Qgc3Bh bm5pbmcgc3RvcmUgd3Igd2FsayAqLw0KKwkJaWYgKGxhc3QgPT0gVUxPTkdfTUFYKQ0KKwkJCXJl dHVybiBmYWxzZTsNCisJfQ0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgd3JfbWFzLT5t YXMsIHBpdiwgZW50cnkpOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc193cl93YWxrX2Rlc2NlbmQoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQor ew0KKwl3cl9tYXMtPm1hcy0+ZGVwdGgrKzsNCisJd3JfbWFzLT50eXBlID0gbXRlX25vZGVfdHlw ZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCW1hc193cl9ub2RlX3dhbGsod3JfbWFzKTsNCisJd3Jf bWFzLT5zbG90cyA9IG1hX3Nsb3RzKHdyX21hcy0+bm9kZSwgd3JfbWFzLT50eXBlKTsNCit9DQor DQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl93YWxrX3RyYXZlcnNlKHN0cnVjdCBtYV93cl9z dGF0ZSAqd3JfbWFzKQ0KK3sNCisJd3JfbWFzLT5tYXMtPm1heCA9IHdyX21hcy0+cl9tYXg7DQor CXdyX21hcy0+bWFzLT5taW4gPSB3cl9tYXMtPnJfbWluOw0KKwl3cl9tYXMtPm1hcy0+bm9kZSA9 IHdyX21hcy0+Y29udGVudDsNCisJd3JfbWFzLT5tYXMtPm9mZnNldCA9IDA7DQorfQ0KKy8qDQor ICogbWFzX3dyX3dhbGsoKSAtIFdhbGsgdGhlIHRyZWUgZm9yIGEgd3JpdGUuDQorICogQHdyX21h czogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBVc2VzIG1hc19zbG90X2xvY2tlZCgp IGFuZCBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlYWQgbm9kZXMuDQorICoNCisgKiBS ZXR1cm46IFRydWUgaWYgaXQncyBjb250YWluZWQgaW4gYSBub2RlLCBmYWxzZSBvbiBzcGFubmlu ZyB3cml0ZS4NCisgKi8NCitzdGF0aWMgYm9vbCBtYXNfd3Jfd2FsayhzdHJ1Y3QgbWFfd3Jfc3Rh dGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQor DQorCXdoaWxlICh0cnVlKSB7DQorCQltYXNfd3Jfd2Fsa19kZXNjZW5kKHdyX21hcyk7DQorCQlp ZiAodW5saWtlbHkobWFzX2lzX3NwYW5fd3Iod3JfbWFzKSkpDQorCQkJcmV0dXJuIGZhbHNlOw0K Kw0KKwkJd3JfbWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgd3JfbWFzLT5zbG90 cywNCisJCQkJCQkgIG1hcy0+b2Zmc2V0KTsNCisJCWlmIChtYV9pc19sZWFmKHdyX21hcy0+dHlw ZSkpDQorCQkJcmV0dXJuIHRydWU7DQorDQorCQltYXNfd3Jfd2Fsa190cmF2ZXJzZSh3cl9tYXMp Ow0KKwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgYm9vbCBtYXNfd3Jfd2Fs a19pbmRleChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0 ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCXdoaWxlICh0cnVlKSB7DQorCQltYXNfd3Jfd2Fs a19kZXNjZW5kKHdyX21hcyk7DQorCQl3cl9tYXMtPmNvbnRlbnQgPSBtYXNfc2xvdF9sb2NrZWQo bWFzLCB3cl9tYXMtPnNsb3RzLA0KKwkJCQkJCSAgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2lz X2xlYWYod3JfbWFzLT50eXBlKSkNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCW1hc193cl93YWxrX3Ry YXZlcnNlKHdyX21hcyk7DQorDQorCX0NCisJcmV0dXJuIHRydWU7DQorfQ0KKy8qDQorICogbWFz X2V4dGVuZF9zcGFubmluZ19udWxsKCkgLSBFeHRlbmQgYSBzdG9yZSBvZiBhICVOVUxMIHRvIGlu Y2x1ZGUgc3Vycm91bmRpbmcgJU5VTExzLg0KKyAqIEBsX3dyX21hczogVGhlIGxlZnQgbWFwbGUg d3JpdGUgc3RhdGUNCisgKiBAcl93cl9tYXM6IFRoZSByaWdodCBtYXBsZSB3cml0ZSBzdGF0ZQ0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZXh0ZW5kX3NwYW5uaW5nX251bGwoc3RydWN0 IG1hX3dyX3N0YXRlICpsX3dyX21hcywNCisJCQkJCSAgICBzdHJ1Y3QgbWFfd3Jfc3RhdGUgKnJf d3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICpyX21hcyA9IHJfd3JfbWFzLT5tYXM7DQor CXN0cnVjdCBtYV9zdGF0ZSAqbF9tYXMgPSBsX3dyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBjaGFy IGxfc2xvdDsNCisNCisJbF9zbG90ID0gbF9tYXMtPm9mZnNldDsNCisJaWYgKCFsX3dyX21hcy0+ Y29udGVudCkNCisJCWxfbWFzLT5pbmRleCA9IGxfd3JfbWFzLT5yX21pbjsNCisNCisJaWYgKChs X21hcy0+aW5kZXggPT0gbF93cl9tYXMtPnJfbWluKSAmJg0KKwkJIChsX3Nsb3QgJiYNCisJCSAg IW1hc19zbG90X2xvY2tlZChsX21hcywgbF93cl9tYXMtPnNsb3RzLCBsX3Nsb3QgLSAxKSkpIHsN CisJCWlmIChsX3Nsb3QgPiAxKQ0KKwkJCWxfbWFzLT5pbmRleCA9IGxfd3JfbWFzLT5waXZvdHNb bF9zbG90IC0gMl0gKyAxOw0KKwkJZWxzZQ0KKwkJCWxfbWFzLT5pbmRleCA9IGxfbWFzLT5taW47 DQorDQorCQlsX21hcy0+b2Zmc2V0ID0gbF9zbG90IC0gMTsNCisJfQ0KKw0KKwlpZiAoIXJfd3Jf bWFzLT5jb250ZW50KSB7DQorCQlpZiAocl9tYXMtPmxhc3QgPCByX3dyX21hcy0+cl9tYXgpDQor CQkJcl9tYXMtPmxhc3QgPSByX3dyX21hcy0+cl9tYXg7DQorCQlyX21hcy0+b2Zmc2V0Kys7DQor CX0gZWxzZSBpZiAoKHJfbWFzLT5sYXN0ID09IHJfd3JfbWFzLT5yX21heCkgJiYNCisJICAgIChy X21hcy0+bGFzdCA8IHJfbWFzLT5tYXgpICYmDQorCSAgICAhbWFzX3Nsb3RfbG9ja2VkKHJfbWFz LCByX3dyX21hcy0+c2xvdHMsIHJfbWFzLT5vZmZzZXQgKyAxKSkgew0KKwkJcl9tYXMtPmxhc3Qg PSBtYXNfc2FmZV9waXZvdChyX21hcywgcl93cl9tYXMtPnBpdm90cywNCisJCQkJCSAgICAgcl93 cl9tYXMtPnR5cGUsIHJfbWFzLT5vZmZzZXQgKyAxKTsNCisJCXJfbWFzLT5vZmZzZXQrKzsNCisJ fQ0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zdGF0ZV93YWxrKHN0cnVjdCBtYV9z dGF0ZSAqbWFzKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorDQorCWVudHJ5ID0gbWFzX3N0YXJ0KG1h cyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICht YXNfaXNfcHRyKG1hcykpDQorCQlyZXR1cm4gZW50cnk7DQorDQorCXJldHVybiBtdHJlZV9yYW5n ZV93YWxrKG1hcyk7DQorfQ0KKw0KKy8qDQorICogbXRyZWVfbG9va3VwX3dhbGsoKSAtIEludGVy bmFsIHF1aWNrIGxvb2t1cCB0aGF0IGRvZXMgbm90IGtlZXAgbWFwbGUgc3RhdGUgdXANCisgKiB0 byBkYXRlLg0KKyAqDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogTm90ZTog TGVhdmVzIG1hcyBpbiB1bmRlc2lyYWJsZSBzdGF0ZS4NCisgKiBSZXR1cm46IFRoZSBlbnRyeSBm b3IgQG1hcy0+aW5kZXggb3IgJU5VTEwgb24gZGVhZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCAqbXRyZWVfbG9va3VwX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1 bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlzdHJ1Y3Qg bWFwbGVfbm9kZSAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0Ow0KKwllbnVtIG1h cGxlX3R5cGUgdHlwZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBjaGFyIGVu ZDsNCisJdW5zaWduZWQgbG9uZyBtYXg7DQorDQorCW5leHQgPSBtYXMtPm5vZGU7DQorCW1heCA9 IFVMT05HX01BWDsNCisJZG8gew0KKwkJb2Zmc2V0ID0gMDsNCisJCW5vZGUgPSBtdGVfdG9fbm9k ZShuZXh0KTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG5leHQpOw0KKwkJcGl2b3RzID0gbWFf cGl2b3RzKG5vZGUsIHR5cGUpOw0KKwkJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2 b3RzLCBtYXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290 byBkZWFkX25vZGU7DQorDQorCQlpZiAocGl2b3RzW29mZnNldF0gPj0gbWFzLT5pbmRleCkNCisJ CQlnb3RvIG5leHQ7DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7DQorCQl9IHdoaWxlICgob2Zm c2V0IDwgZW5kKSAmJiAocGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlpZiAo bGlrZWx5KG9mZnNldCA+IGVuZCkpDQorCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorbmV4 dDoNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xvdCht YXMtPnRyZWUsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShu b2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5cGUp KTsNCisNCisJcmV0dXJuICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNfcmVz ZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19yb290KCkg LSBDcmVhdGUgYSBuZXcgcm9vdCBub2RlIHRoYXQgb25seSBjb250YWlucyB0aGUgZW50cnkgcGFz c2VkDQorICogaW4uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUg ZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGluZGV4ID09IDAg YW5kIHRoZSBsYXN0ID09IFVMT05HX01BWA0KKyAqDQorICogUmV0dXJuIDAgb24gZXJyb3IsIDEg b24gc3VjY2Vzcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV3X3Jvb3Qoc3RydWN0 IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpy b290ID0gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbWFw bGVfbGVhZl82NDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKw0KKwlpZiAoIWVudHJ5ICYmICFtYXMt PmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpIHsNCisJCW1hcy0+ZGVwdGggPSAwOw0K KwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUt Pm1hX3Jvb3QsIGVudHJ5KTsNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCWdvdG8gZG9u ZTsNCisJfQ0KKw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAobWFzX2lzX2Vyciht YXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJcGl2 b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5 cGUpOw0KKwlub2RlLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNpZ25l ZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10X21r X25vZGUobm9kZSwgdHlwZSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1swXSwgZW50cnkp Ow0KKwlwaXZvdHNbMF0gPSBtYXMtPmxhc3Q7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNfc2V0 X2hlaWdodChtYXMpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290LCBt dGVfbWtfcm9vdChtYXMtPm5vZGUpKTsNCisNCitkb25lOg0KKwlpZiAoeGFfaXNfbm9kZShyb290 KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbWFzLT50cmVlKTsNCisNCisJcmV0dXJuIDE7 DQorfQ0KKy8qDQorICogbWFzX3dyX3NwYW5uaW5nX3N0b3JlKCkgLSBDcmVhdGUgYSBzdWJ0cmVl IHdpdGggdGhlIHN0b3JlIG9wZXJhdGlvbiBjb21wbGV0ZWQNCisgKiBhbmQgbmV3IG5vZGVzIHdo ZXJlIG5lY2Vzc2FyeSwgdGhlbiBwbGFjZSB0aGUgc3ViLXRyZWUgaW4gdGhlIGFjdHVhbCB0cmVl Lg0KKyAqIE5vdGUgdGhhdCBtYXMgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG5vZGUgd2hp Y2ggY2F1c2VkIHRoZSBzdG9yZSB0bw0KKyAqIHNwYW4uDQorICogQHdyX21hczogVGhlIG1hcGxl IHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IDAgb24gZXJyb3IsIHBvc2l0aXZlIG9uIHN1 Y2Nlc3MuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3Rh dGUgbWFzdDsNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlIGJfbm9kZTsNCisJc3RydWN0IG1hX3N0 YXRlICptYXM7DQorCXVuc2lnbmVkIGNoYXIgaGVpZ2h0Ow0KKw0KKwkvKiBMZWZ0IGFuZCBSaWdo dCBzaWRlIG9mIHNwYW5uaW5nIHN0b3JlICovDQorCU1BX1NUQVRFKGxfbWFzLCBOVUxMLCAwLCAw KTsNCisJTUFfU1RBVEUocl9tYXMsIE5VTEwsIDAsIDApOw0KKw0KKwlNQV9XUl9TVEFURShyX3dy X21hcywgJnJfbWFzLCB3cl9tYXMtPmVudHJ5KTsNCisJTUFfV1JfU1RBVEUobF93cl9tYXMsICZs X21hcywgd3JfbWFzLT5lbnRyeSk7DQorDQorCS8qDQorCSAqIEEgc3RvcmUgb3BlcmF0aW9uIHRo YXQgc3BhbnMgbXVsdGlwbGUgbm9kZXMgaXMgY2FsbGVkIGEgc3Bhbm5pbmcNCisJICogc3RvcmUg YW5kIGlzIGhhbmRsZWQgZWFybHkgaW4gdGhlIHN0b3JlIGNhbGwgc3RhY2sgYnkgdGhlIGZ1bmN0 aW9uDQorCSAqIG1hc19pc19zcGFuX3dyKCkuICBXaGVuIGEgc3Bhbm5pbmcgc3RvcmUgaXMgaWRl bnRpZmllZCwgdGhlIG1hcGxlDQorCSAqIHN0YXRlIGlzIGR1cGxpY2F0ZWQuICBUaGUgZmlyc3Qg bWFwbGUgc3RhdGUgd2Fsa3MgdGhlIGxlZnQgdHJlZSBwYXRoDQorCSAqIHRvIGBgaW5kZXhgYCwg dGhlIGR1cGxpY2F0ZSB3YWxrcyB0aGUgcmlnaHQgdHJlZSBwYXRoIHRvIGBgbGFzdGBgLg0KKwkg KiBUaGUgZGF0YSBpbiB0aGUgdHdvIG5vZGVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIG5v ZGUsIHR3byBub2RlcywNCisJICogb3IgcG9zc2libHkgdGhyZWUgbm9kZXMgKHNlZSB0aGUgMy13 YXkgc3BsaXQgYWJvdmUpLiAgQSBgYE5VTExgYA0KKwkgKiB3cml0dGVuIHRvIHRoZSBsYXN0IGVu dHJ5IG9mIGEgbm9kZSBpcyBjb25zaWRlcmVkIGEgc3Bhbm5pbmcgc3RvcmUgYXMNCisJICogYSBy ZWJhbGFuY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIGFu IG92ZXJmbG93DQorCSAqIG9mIGRhdGEgbWF5IGhhcHBlbi4NCisJICovDQorCW1hcyA9IHdyX21h cy0+bWFzOw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisNCisJaWYgKHVubGlrZWx5 KCFtYXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpKQ0KKwkJcmV0dXJuIG1hc19u ZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkvKg0KKwkgKiBOb2RlIHJlYmFsYW5jaW5n IG1heSBvY2N1ciBkdWUgdG8gdGhpcyBzdG9yZSwgc28gdGhlcmUgbWF5IGJlIHRocmVlIG5ldw0K KwkgKiBlbnRyaWVzIHBlciBsZXZlbCBwbHVzIGEgbmV3IHJvb3QuDQorCSAqLw0KKwloZWlnaHQg PSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCW1hc19ub2RlX2NvdW50KG1hcywgMSArIGhlaWdodCAq IDMpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCS8qDQorCSAq IFNldCB1cCByaWdodCBzaWRlLiAgTmVlZCB0byBnZXQgdG8gdGhlIG5leHQgb2Zmc2V0IGFmdGVy IHRoZSBzcGFubmluZw0KKwkgKiBzdG9yZSB0byBlbnN1cmUgaXQncyBub3QgTlVMTCBhbmQgdG8g Y29tYmluZSBib3RoIHRoZSBuZXh0IG5vZGUgYW5kDQorCSAqIHRoZSBub2RlIHdpdGggdGhlIHN0 YXJ0IHRvZ2V0aGVyLg0KKwkgKi8NCisJcl9tYXMgPSAqbWFzOw0KKwkvKiBBdm9pZCBvdmVyZmxv dywgd2FsayB0byBuZXh0IHNsb3QgaW4gdGhlIHRyZWUuICovDQorCWlmIChyX21hcy5sYXN0ICsg MSkNCisJCXJfbWFzLmxhc3QrKzsNCisNCisJcl9tYXMuaW5kZXggPSByX21hcy5sYXN0Ow0KKwlt YXNfd3Jfd2Fsa19pbmRleCgmcl93cl9tYXMpOw0KKwlyX21hcy5sYXN0ID0gcl9tYXMuaW5kZXgg PSBtYXMtPmxhc3Q7DQorDQorCS8qIFNldCB1cCBsZWZ0IHNpZGUuICovDQorCWxfbWFzID0gKm1h czsNCisJbWFzX3dyX3dhbGtfaW5kZXgoJmxfd3JfbWFzKTsNCisNCisJaWYgKCF3cl9tYXMtPmVu dHJ5KSB7DQorCQltYXNfZXh0ZW5kX3NwYW5uaW5nX251bGwoJmxfd3JfbWFzLCAmcl93cl9tYXMp Ow0KKwkJbWFzLT5vZmZzZXQgPSBsX21hcy5vZmZzZXQ7DQorCQltYXMtPmluZGV4ID0gbF9tYXMu aW5kZXg7DQorCQltYXMtPmxhc3QgPSBsX21hcy5sYXN0ID0gcl9tYXMubGFzdDsNCisJfQ0KKw0K KwkvKiBleHBhbmRpbmcgTlVMTHMgbWF5IG1ha2UgdGhpcyBjb3ZlciB0aGUgZW50aXJlIHJhbmdl ICovDQorCWlmICghbF9tYXMuaW5kZXggJiYgcl9tYXMubGFzdCA9PSBVTE9OR19NQVgpIHsNCisJ CW1hc19zZXRfcmFuZ2UobWFzLCAwLCBVTE9OR19NQVgpOw0KKwkJcmV0dXJuIG1hc19uZXdfcm9v dChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwl9DQorDQorCW1lbXNldCgmYl9ub2RlLCAwLCBzaXpl b2Yoc3RydWN0IG1hcGxlX2JpZ19ub2RlKSk7DQorCS8qIENvcHkgbF9tYXMgYW5kIHN0b3JlIHRo ZSB2YWx1ZSBpbiBiX25vZGUuICovDQorCW1hc19zdG9yZV9iX25vZGUoJmxfd3JfbWFzLCAmYl9u b2RlLCBsX3dyX21hcy5ub2RlX2VuZCk7DQorCS8qIENvcHkgcl9tYXMgaW50byBiX25vZGUuICov DQorCWlmIChyX21hcy5vZmZzZXQgPD0gcl93cl9tYXMubm9kZV9lbmQpDQorCQltYXNfbWFiX2Nw KCZyX21hcywgcl9tYXMub2Zmc2V0LCByX3dyX21hcy5ub2RlX2VuZCwNCisJCQkgICAmYl9ub2Rl LCBiX25vZGUuYl9lbmQgKyAxKTsNCisJZWxzZQ0KKwkJYl9ub2RlLmJfZW5kKys7DQorDQorCS8q IFN0b3Agc3Bhbm5pbmcgc2VhcmNoZXMgYnkgc2VhcmNoaW5nIGZvciBqdXN0IGluZGV4LiAqLw0K KwlsX21hcy5pbmRleCA9IGxfbWFzLmxhc3QgPSBtYXMtPmluZGV4Ow0KKw0KKwltYXN0LmJuID0g JmJfbm9kZTsNCisJbWFzdC5vcmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnJfbWFz Ow0KKwkvKiBDb21iaW5lIGxfbWFzIGFuZCByX21hcyBhbmQgc3BsaXQgdGhlbSB1cCBldmVubHkg YWdhaW4uICovDQorCXJldHVybiBtYXNfc3Bhbm5pbmdfcmViYWxhbmNlKG1hcywgJm1hc3QsIGhl aWdodCArIDEpOw0KK30NCisNCisvKg0KKyAqIG1hc193cl9ub2RlX3N0b3JlKCkgLSBBdHRlbXB0 IHRvIHN0b3JlIHRoZSB2YWx1ZSBpbiBhIG5vZGUNCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUgd3Jp dGUgc3RhdGUNCisgKg0KKyAqIEF0dGVtcHRzIHRvIHJldXNlIHRoZSBub2RlLCBidXQgbWF5IGFs bG9jYXRlLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHN0b3JlZCwgZmFsc2Ugb3RoZXJ3aXNl DQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc193cl9ub2RlX3N0b3JlKHN0cnVjdCBtYV93 cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1h czsNCisJdm9pZCBfX3JjdSAqKmRzdF9zbG90czsNCisJdW5zaWduZWQgbG9uZyAqZHN0X3Bpdm90 czsNCisJdW5zaWduZWQgY2hhciBkc3Rfb2Zmc2V0Ow0KKwl1bnNpZ25lZCBjaGFyIG5ld19lbmQg PSB3cl9tYXMtPm5vZGVfZW5kOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQg Y2hhciBub2RlX3Nsb3RzID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXTsNCisJc3RydWN0IG1hcGxl X25vZGUgcmV1c2UsICpuZXdub2RlOw0KKwl1bnNpZ25lZCBjaGFyIGNvcHlfc2l6ZSwgbWF4X3Bp diA9IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVdOw0KKwlib29sIGluX3JjdSA9IG10X2luX3JjdSht YXMtPnRyZWUpOw0KKw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJaWYgKG1hcy0+bGFzdCA9 PSB3cl9tYXMtPnJfbWF4KSB7DQorCQkvKiBydW5zIHJpZ2h0IHRvIHRoZSBlbmQgb2YgdGhlIG5v ZGUgKi8NCisJCWlmIChtYXMtPmxhc3QgPT0gbWFzLT5tYXgpDQorCQkJbmV3X2VuZCA9IG9mZnNl dDsNCisJCS8qIGRvbid0IGNvcHkgdGhpcyBvZmZzZXQgKi8NCisJCXdyX21hcy0+b2Zmc2V0X2Vu ZCsrOw0KKwl9IGVsc2UgaWYgKG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgpIHsNCisJCS8qIG5l dyByYW5nZSBlbmRzIGluIHRoaXMgcmFuZ2UgKi8NCisJCWlmICh1bmxpa2VseSh3cl9tYXMtPnJf bWF4ID09IFVMT05HX01BWCkpDQorCQkJbWFzX2J1bGtfcmViYWxhbmNlKG1hcywgd3JfbWFzLT5u b2RlX2VuZCwgd3JfbWFzLT50eXBlKTsNCisNCisJCW5ld19lbmQrKzsNCisJfSBlbHNlIHsNCisJ CWlmICh3cl9tYXMtPmVuZF9waXYgPT0gbWFzLT5sYXN0KQ0KKwkJCXdyX21hcy0+b2Zmc2V0X2Vu ZCsrOw0KKw0KKwkJbmV3X2VuZCAtPSB3cl9tYXMtPm9mZnNldF9lbmQgLSBvZmZzZXQgLSAxOw0K Kwl9DQorDQorCS8qIG5ldyByYW5nZSBzdGFydHMgd2l0aGluIGEgcmFuZ2UgKi8NCisJaWYgKHdy X21hcy0+cl9taW4gPCBtYXMtPmluZGV4KQ0KKwkJbmV3X2VuZCsrOw0KKw0KKwkvKiBOb3QgZW5v dWdoIHJvb20gKi8NCisJaWYgKG5ld19lbmQgPj0gbm9kZV9zbG90cykNCisJCXJldHVybiBmYWxz ZTsNCisNCisJLyogTm90IGVub3VnaCBkYXRhLiAqLw0KKwlpZiAoIW10ZV9pc19yb290KG1hcy0+ bm9kZSkgJiYgKG5ld19lbmQgPD0gbXRfbWluX3Nsb3RzW3dyX21hcy0+dHlwZV0pICYmDQorCSAg ICAhKG1hcy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfQlVMSykpDQorCQlyZXR1cm4gZmFsc2U7DQor DQorCS8qIHNldCB1cCBub2RlLiAqLw0KKwlpZiAoaW5fcmN1KSB7DQorCQltYXNfbm9kZV9jb3Vu dChtYXMsIDEpOw0KKwkJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1cm4gZmFsc2U7DQor DQorCQluZXdub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCX0gZWxzZSB7DQorCQltZW1zZXQo JnJldXNlLCAwLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJCW5ld25vZGUgPSAmcmV1 c2U7DQorCX0NCisNCisJbmV3bm9kZS0+cGFyZW50ID0gbWFzX21uKG1hcyktPnBhcmVudDsNCisJ ZHN0X3Bpdm90cyA9IG1hX3Bpdm90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwlkc3Rfc2xv dHMgPSBtYV9zbG90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkvKiBDb3B5IGZyb20gc3Rh cnQgdG8gaW5zZXJ0IHBvaW50ICovDQorCW1lbWNweShkc3RfcGl2b3RzLCB3cl9tYXMtPnBpdm90 cywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogKG9mZnNldCArIDEpKTsNCisJbWVtY3B5KGRzdF9z bG90cywgd3JfbWFzLT5zbG90cywgc2l6ZW9mKHZvaWQgKikgKiAob2Zmc2V0ICsgMSkpOw0KKwlk c3Rfb2Zmc2V0ID0gb2Zmc2V0Ow0KKw0KKwkvKiBIYW5kbGUgaW5zZXJ0IG9mIG5ldyByYW5nZSBz dGFydGluZyBhZnRlciBvbGQgcmFuZ2UgKi8NCisJaWYgKHdyX21hcy0+cl9taW4gPCBtYXMtPmlu ZGV4KSB7DQorCQltYXMtPm9mZnNldCsrOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRzdF9zbG90 c1tkc3Rfb2Zmc2V0XSwgd3JfbWFzLT5jb250ZW50KTsNCisJCWRzdF9waXZvdHNbZHN0X29mZnNl dCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3JlIHRoZSBuZXcgZW50cnkg YW5kIHJhbmdlIGVuZC4gKi8NCisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2KQ0KKwkJZHN0X3Bp dm90c1tkc3Rfb2Zmc2V0XSA9IG1hcy0+bGFzdDsNCisJbWFzLT5vZmZzZXQgPSBkc3Rfb2Zmc2V0 Ow0KKwlyY3VfYXNzaWduX3BvaW50ZXIoZHN0X3Nsb3RzW2RzdF9vZmZzZXRdLCB3cl9tYXMtPmVu dHJ5KTsNCisNCisJLyoNCisJICogdGhpcyByYW5nZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBu b2RlIG9yIGl0IG92ZXJ3cm90ZSB0aGUgcmVzdCBvZg0KKwkgKiB0aGUgZGF0YQ0KKwkgKi8NCisJ aWYgKHdyX21hcy0+b2Zmc2V0X2VuZCA+IHdyX21hcy0+bm9kZV9lbmQgfHwgbWFzLT5sYXN0ID49 IG1hcy0+bWF4KSB7DQorCQluZXdfZW5kID0gZHN0X29mZnNldDsNCisJCWdvdG8gZG9uZTsNCisJ fQ0KKw0KKwlkc3Rfb2Zmc2V0Kys7DQorCS8qIENvcHkgdG8gdGhlIGVuZCBvZiBub2RlIGlmIG5l Y2Vzc2FyeS4gKi8NCisJY29weV9zaXplID0gd3JfbWFzLT5ub2RlX2VuZCAtIHdyX21hcy0+b2Zm c2V0X2VuZCArIDE7DQorCW1lbWNweShkc3Rfc2xvdHMgKyBkc3Rfb2Zmc2V0LCB3cl9tYXMtPnNs b3RzICsgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBjb3B5 X3NpemUpOw0KKwlpZiAoZHN0X29mZnNldCA8IG1heF9waXYpIHsNCisJCWlmIChjb3B5X3NpemUg PiBtYXhfcGl2IC0gZHN0X29mZnNldCkNCisJCQljb3B5X3NpemUgPSBtYXhfcGl2IC0gZHN0X29m ZnNldDsNCisNCisJCW1lbWNweShkc3RfcGl2b3RzICsgZHN0X29mZnNldCwNCisJCSAgICAgICB3 cl9tYXMtPnBpdm90cyArIHdyX21hcy0+b2Zmc2V0X2VuZCwNCisJCSAgICAgICBzaXplb2YodW5z aWduZWQgbG9uZykgKiBjb3B5X3NpemUpOw0KKwl9DQorDQorCWlmICgod3JfbWFzLT5ub2RlX2Vu ZCA9PSBub2RlX3Nsb3RzIC0gMSkgJiYgKG5ld19lbmQgPCBub2RlX3Nsb3RzIC0gMSkpDQorCQlk c3RfcGl2b3RzW25ld19lbmRdID0gbWFzLT5tYXg7DQorDQorZG9uZToNCisJbWFzX2xlYWZfc2V0 X21ldGEobWFzLCBuZXdub2RlLCBkc3RfcGl2b3RzLCBtYXBsZV9sZWFmXzY0LCBuZXdfZW5kKTsN CisJaWYgKGluX3JjdSkgew0KKwkJbWFzLT5ub2RlID0gbXRfbWtfbm9kZShuZXdub2RlLCB3cl9t YXMtPnR5cGUpOw0KKwkJbWFzX3JlcGxhY2UobWFzLCBmYWxzZSk7DQorCX0gZWxzZSB7DQorCQlt ZW1jcHkod3JfbWFzLT5ub2RlLCBuZXdub2RlLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsN CisJfQ0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCB3cl9tYXMtPmVudHJ5KTsN CisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICog bWFzX3dyX3Nsb3Rfc3RvcmU6IEF0dGVtcHQgdG8gc3RvcmUgYSB2YWx1ZSBpbiBhIHNsb3QuDQor ICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRydWUg aWYgc3RvcmVkLCBmYWxzZSBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFz X3dyX3Nsb3Rfc3RvcmUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3Qg bWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBsb25nIGxtYXg7IC8qIExv Z2ljYWwgbWF4LiAqLw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKw0K KwlpZiAoKHdyX21hcy0+cl9tYXggPiBtYXMtPmxhc3QpICYmICgod3JfbWFzLT5yX21pbiAhPSBt YXMtPmluZGV4KSB8fA0KKwkJCQkgIChvZmZzZXQgIT0gd3JfbWFzLT5ub2RlX2VuZCkpKQ0KKwkJ cmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAob2Zmc2V0ID09IHdyX21hcy0+bm9kZV9lbmQgLSAxKQ0K KwkJbG1heCA9IG1hcy0+bWF4Ow0KKwllbHNlDQorCQlsbWF4ID0gd3JfbWFzLT5waXZvdHNbb2Zm c2V0ICsgMV07DQorDQorCS8qIGdvaW5nIHRvIG92ZXJ3cml0ZSB0b28gbWFueSBzbG90cy4gKi8N CisJaWYgKGxtYXggPCBtYXMtPmxhc3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmICh3cl9t YXMtPnJfbWluID09IG1hcy0+aW5kZXgpIHsNCisJCS8qIG92ZXJ3cml0aW5nIHR3byBvciBtb3Jl IHJhbmdlcyB3aXRoIG9uZS4gKi8NCisJCWlmIChsbWF4ID09IG1hcy0+bGFzdCkNCisJCQlyZXR1 cm4gZmFsc2U7DQorDQorCQkvKiBPdmVyd3JpdGluZyBhbGwgb2Ygb2Zmc2V0IGFuZCBhIHBvcnRp b24gb2Ygb2Zmc2V0ICsgMS4gKi8NCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3Rz W29mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJd3JfbWFzLT5waXZvdHNbb2Zmc2V0XSA9IG1h cy0+bGFzdDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBEb2Vzbid0IGVuZCBvbiB0aGUg bmV4dCByYW5nZSBlbmQuICovDQorCWlmIChsbWF4ICE9IG1hcy0+bGFzdCkNCisJCXJldHVybiBm YWxzZTsNCisNCisJLyogT3ZlcndyaXRpbmcgYSBwb3J0aW9uIG9mIG9mZnNldCBhbmQgYWxsIG9m IG9mZnNldCArIDEgKi8NCisJaWYgKChvZmZzZXQgKyAxIDwgbXRfcGl2b3RzW3dyX21hcy0+dHlw ZV0pICYmDQorCSAgICAod3JfbWFzLT5lbnRyeSB8fCB3cl9tYXMtPnBpdm90c1tvZmZzZXQgKyAx XSkpDQorCQl3cl9tYXMtPnBpdm90c1tvZmZzZXQgKyAxXSA9IG1hcy0+bGFzdDsNCisNCisJcmN1 X2Fzc2lnbl9wb2ludGVyKHdyX21hcy0+c2xvdHNbb2Zmc2V0ICsgMV0sIHdyX21hcy0+ZW50cnkp Ow0KKwl3cl9tYXMtPnBpdm90c1tvZmZzZXRdID0gbWFzLT5pbmRleCAtIDE7DQorCW1hcy0+b2Zm c2V0Kys7IC8qIEtlZXAgbWFzIGFjY3VyYXRlLiAqLw0KKw0KK2RvbmU6DQorCXRyYWNlX21hX3dy aXRlKF9fZnVuY19fLCBtYXMsIDAsIHdyX21hcy0+ZW50cnkpOw0KKwltYXNfdXBkYXRlX2dhcCht YXMpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl9l bmRfcGl2KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJd2hpbGUgKCh3cl9tYXMt Pm1hcy0+bGFzdCA+IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJICAgICAgICh3cl9tYXMtPm9mZnNl dF9lbmQgPCB3cl9tYXMtPm5vZGVfZW5kKSkNCisJCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+ cGl2b3RzWysrd3JfbWFzLT5vZmZzZXRfZW5kXTsNCisNCisJaWYgKHdyX21hcy0+bWFzLT5sYXN0 ID4gd3JfbWFzLT5lbmRfcGl2KQ0KKwkJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5tYXMtPm1h eDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl9leHRlbmRfbnVsbChzdHJ1Y3Qg bWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFz LT5tYXM7DQorDQorCWlmIChtYXMtPmxhc3QgPCB3cl9tYXMtPmVuZF9waXYgJiYgIXdyX21hcy0+ c2xvdHNbd3JfbWFzLT5vZmZzZXRfZW5kXSkNCisJCW1hcy0+bGFzdCA9IHdyX21hcy0+ZW5kX3Bp djsNCisNCisJLyogQ2hlY2sgbmV4dCBzbG90KHMpIGlmIHdlIGFyZSBvdmVyd3JpdGluZyB0aGUg ZW5kICovDQorCWlmICgobWFzLT5sYXN0ID09IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJICAgICh3 cl9tYXMtPm5vZGVfZW5kICE9IHdyX21hcy0+b2Zmc2V0X2VuZCkgJiYNCisJICAgICF3cl9tYXMt PnNsb3RzW3dyX21hcy0+b2Zmc2V0X2VuZCArIDFdKSB7DQorCQl3cl9tYXMtPm9mZnNldF9lbmQr KzsNCisJCWlmICh3cl9tYXMtPm9mZnNldF9lbmQgPT0gd3JfbWFzLT5ub2RlX2VuZCkNCisJCQlt YXMtPmxhc3QgPSBtYXMtPm1heDsNCisJCWVsc2UNCisJCQltYXMtPmxhc3QgPSB3cl9tYXMtPnBp dm90c1t3cl9tYXMtPm9mZnNldF9lbmRdOw0KKwkJd3JfbWFzLT5lbmRfcGl2ID0gbWFzLT5sYXN0 Ow0KKwl9DQorDQorCWlmICghd3JfbWFzLT5jb250ZW50KSB7DQorCQkvKiBJZiB0aGlzIG9uZSBp cyBudWxsLCB0aGUgbmV4dCBhbmQgcHJldiBhcmUgbm90ICovDQorCQltYXMtPmluZGV4ID0gd3Jf bWFzLT5yX21pbjsNCisJfSBlbHNlIHsNCisJCS8qIENoZWNrIHByZXYgc2xvdCBpZiB3ZSBhcmUg b3ZlcndyaXRpbmcgdGhlIHN0YXJ0ICovDQorCQlpZiAobWFzLT5pbmRleCA9PSB3cl9tYXMtPnJf bWluICYmIG1hcy0+b2Zmc2V0ICYmDQorCQkgICAgIXdyX21hcy0+c2xvdHNbbWFzLT5vZmZzZXQg LSAxXSkgew0KKwkJCW1hcy0+b2Zmc2V0LS07DQorCQkJd3JfbWFzLT5yX21pbiA9IG1hcy0+aW5k ZXggPQ0KKwkJCQltYXNfc2FmZV9taW4obWFzLCB3cl9tYXMtPnBpdm90cywgbWFzLT5vZmZzZXQp Ow0KKwkJCXdyX21hcy0+cl9tYXggPSB3cl9tYXMtPnBpdm90c1ttYXMtPm9mZnNldF07DQorCQl9 DQorCX0NCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc193cl9hcHBlbmQoc3RydWN0IG1h X3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl1bnNpZ25lZCBjaGFyIGVuZCA9IHdyX21hcy0+bm9k ZV9lbmQ7DQorCXVuc2lnbmVkIGNoYXIgbmV3X2VuZCA9IGVuZCArIDE7DQorCXN0cnVjdCBtYV9z dGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9waXZvdHMgPSBt dF9waXZvdHNbd3JfbWFzLT50eXBlXTsNCisNCisJaWYgKChtYXMtPmluZGV4ICE9IHdyX21hcy0+ cl9taW4pICYmIChtYXMtPmxhc3QgPT0gd3JfbWFzLT5yX21heCkpIHsNCisJCWlmIChuZXdfZW5k IDwgbm9kZV9waXZvdHMpDQorCQkJd3JfbWFzLT5waXZvdHNbbmV3X2VuZF0gPSB3cl9tYXMtPnBp dm90c1tlbmRdOw0KKw0KKwkJaWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRf bWV0YSh3cl9tYXMtPm5vZGUsIG1hcGxlX2xlYWZfNjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJcmN1 X2Fzc2lnbl9wb2ludGVyKHdyX21hcy0+c2xvdHNbbmV3X2VuZF0sIHdyX21hcy0+ZW50cnkpOw0K KwkJbWFzLT5vZmZzZXQgPSBuZXdfZW5kOw0KKwkJd3JfbWFzLT5waXZvdHNbZW5kXSA9IG1hcy0+ aW5kZXggLSAxOw0KKw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJaWYgKChtYXMtPmluZGV4 ID09IHdyX21hcy0+cl9taW4pICYmIChtYXMtPmxhc3QgPCB3cl9tYXMtPnJfbWF4KSkgew0KKwkJ aWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQl3cl9tYXMtPnBpdm90c1tuZXdfZW5kXSA9 IHdyX21hcy0+cGl2b3RzW2VuZF07DQorDQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5z bG90c1tuZXdfZW5kXSwgd3JfbWFzLT5jb250ZW50KTsNCisJCWlmIChuZXdfZW5kIDwgbm9kZV9w aXZvdHMpDQorCQkJbWFfc2V0X21ldGEod3JfbWFzLT5ub2RlLCBtYXBsZV9sZWFmXzY0LCAwLCBu ZXdfZW5kKTsNCisNCisJCXdyX21hcy0+cGl2b3RzW2VuZF0gPSBtYXMtPmxhc3Q7DQorCQlyY3Vf YXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tlbmRdLCB3cl9tYXMtPmVudHJ5KTsNCisJCXJl dHVybiB0cnVlOw0KKwl9DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc193cl9tb2RpZnkoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl1 bnNpZ25lZCBjaGFyIG5vZGVfc2xvdHM7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9zaXplOw0KKwlz dHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwlzdHJ1Y3QgbWFwbGVfYmlnX25v ZGUgYl9ub2RlOw0KKw0KKwkvKiBEaXJlY3QgcmVwbGFjZW1lbnQgKi8NCisJaWYgKHdyX21hcy0+ cl9taW4gPT0gbWFzLT5pbmRleCAmJiB3cl9tYXMtPnJfbWF4ID09IG1hcy0+bGFzdCkgew0KKwkJ cmN1X2Fzc2lnbl9wb2ludGVyKHdyX21hcy0+c2xvdHNbbWFzLT5vZmZzZXRdLCB3cl9tYXMtPmVu dHJ5KTsNCisJCWlmICghIXdyX21hcy0+ZW50cnkgXiAhIXdyX21hcy0+Y29udGVudCkNCisJCQlt YXNfdXBkYXRlX2dhcChtYXMpOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCS8qIEF0dGVtcHQgdG8g YXBwZW5kICovDQorCW5vZGVfc2xvdHMgPSBtdF9zbG90c1t3cl9tYXMtPnR5cGVdOw0KKwlub2Rl X3NpemUgPSB3cl9tYXMtPm5vZGVfZW5kIC0gd3JfbWFzLT5vZmZzZXRfZW5kICsgbWFzLT5vZmZz ZXQgKyAyOw0KKwlpZiAobWFzLT5tYXggPT0gVUxPTkdfTUFYKQ0KKwkJbm9kZV9zaXplKys7DQor DQorCS8qIHNsb3QgYW5kIG5vZGUgc3RvcmUgd2lsbCBub3QgZml0LCBnbyB0byB0aGUgc2xvdyBw YXRoICovDQorCWlmICh1bmxpa2VseShub2RlX3NpemUgPj0gbm9kZV9zbG90cykpDQorCQlnb3Rv IHNsb3dfcGF0aDsNCisNCisJaWYgKHdyX21hcy0+ZW50cnkgJiYgKHdyX21hcy0+bm9kZV9lbmQg PCBub2RlX3Nsb3RzIC0gMSkgJiYNCisJICAgIChtYXMtPm9mZnNldCA9PSB3cl9tYXMtPm5vZGVf ZW5kKSAmJiBtYXNfd3JfYXBwZW5kKHdyX21hcykpIHsNCisJCWlmICghd3JfbWFzLT5jb250ZW50 IHx8ICF3cl9tYXMtPmVudHJ5KQ0KKwkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCQlyZXR1cm47 DQorCX0NCisNCisJaWYgKCh3cl9tYXMtPm9mZnNldF9lbmQgLSBtYXMtPm9mZnNldCA8PSAxKSAm JiBtYXNfd3Jfc2xvdF9zdG9yZSh3cl9tYXMpKQ0KKwkJcmV0dXJuOw0KKwllbHNlIGlmIChtYXNf d3Jfbm9kZV9zdG9yZSh3cl9tYXMpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobWFzX2lzX2Vyciht YXMpKQ0KKwkJcmV0dXJuOw0KKw0KK3Nsb3dfcGF0aDoNCisJbWVtc2V0KCZiX25vZGUsIDAsIHNp emVvZihzdHJ1Y3QgbWFwbGVfYmlnX25vZGUpKTsNCisJbWFzX3N0b3JlX2Jfbm9kZSh3cl9tYXMs ICZiX25vZGUsIHdyX21hcy0+b2Zmc2V0X2VuZCk7DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19f LCBtYXMsIDAsIHdyX21hcy0+ZW50cnkpOw0KKwltYXNfY29tbWl0X2Jfbm9kZSh3cl9tYXMsICZi X25vZGUsIHdyX21hcy0+bm9kZV9lbmQpOw0KK30NCisNCisvKg0KKyAqIG1hc193cl9zdG9yZV9l bnRyeSgpIC0gSW50ZXJuYWwgY2FsbCB0byBzdG9yZSBhIHZhbHVlDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBSZXR1 cm46IFRoZSBjb250ZW50cyB0aGF0IHdhcyBzdG9yZWQgYXQgdGhlIGluZGV4Lg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3dyX3N0b3JlX2VudHJ5KHN0cnVjdCBtYV93cl9zdGF0ZSAq d3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJ d3JfbWFzLT5jb250ZW50ID0gbWFzX3N0YXJ0KG1hcyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMp IHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3N0b3JlX3Jvb3QobWFzLCB3cl9tYXMtPmVu dHJ5KTsNCisJCXJldHVybiB3cl9tYXMtPmNvbnRlbnQ7DQorCX0NCisNCisJaWYgKHVubGlrZWx5 KCFtYXNfd3Jfd2Fsayh3cl9tYXMpKSkgew0KKwkJbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHdyX21h cyk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCS8qIEF0IHRoaXMgcG9p bnQsIHdlIGFyZSBhdCB0aGUgbGVhZiBub2RlIHRoYXQgbmVlZHMgdG8gYmUgYWx0ZXJlZC4gKi8N CisJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5yX21heDsNCisJbWFzX3dyX2VuZF9waXYod3Jf bWFzKTsNCisNCisJaWYgKCF3cl9tYXMtPmVudHJ5KQ0KKwkJbWFzX3dyX2V4dGVuZF9udWxsKHdy X21hcyk7DQorDQorCS8qIE5ldyByb290IGZvciBhIHNpbmdsZSBwb2ludGVyICovDQorCWlmICh1 bmxpa2VseSghbWFzLT5pbmRleCAmJiBtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKSkgew0KKwkJbWFz X25ld19yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50 Ow0KKwl9DQorDQorCW1hc193cl9tb2RpZnkod3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy0+Y29u dGVudDsNCit9DQorDQorLyoqDQorICogbWFzX2luc2VydCgpIC0gSW50ZXJuYWwgY2FsbCB0byBp bnNlcnQgYSB2YWx1ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhl IGVudHJ5IHRvIHN0b3JlDQorICoNCisgKiBSZXR1cm46ICVOVUxMIG9yIHRoZSBjb250ZW50cyB0 aGF0IGFscmVhZHkgZXhpc3RzIGF0IHRoZSByZXF1ZXN0ZWQgaW5kZXgNCisgKiBvdGhlcndpc2Uu ICBUaGUgbWFwbGUgc3RhdGUgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgZXJyb3IgY29uZGl0aW9u cy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19pbnNlcnQoc3RydWN0IG1hX3N0YXRl ICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5 KTsNCisNCisJLyoNCisJICogSW5zZXJ0aW5nIGEgbmV3IHJhbmdlIGluc2VydHMgZWl0aGVyIDAs IDEsIG9yIDIgcGl2b3RzIHdpdGhpbiB0aGUNCisJICogdHJlZS4gIElmIHRoZSBpbnNlcnQgZml0 cyBleGFjdGx5IGludG8gYW4gZXhpc3RpbmcgZ2FwIHdpdGggYSB2YWx1ZQ0KKwkgKiBvZiBOVUxM LCB0aGVuIHRoZSBzbG90IG9ubHkgbmVlZHMgdG8gYmUgd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFs dWUuDQorCSAqIElmIHRoZSByYW5nZSBiZWluZyBpbnNlcnRlZCBpcyBhZGphY2VudCB0byBhbm90 aGVyIHJhbmdlLCB0aGVuIG9ubHkgYQ0KKwkgKiBzaW5nbGUgcGl2b3QgbmVlZHMgdG8gYmUgaW5z ZXJ0ZWQgKGFzIHdlbGwgYXMgd3JpdGluZyB0aGUgZW50cnkpLiAgSWYNCisJICogdGhlIG5ldyBy YW5nZSBpcyB3aXRoaW4gYSBnYXAgYnV0IGRvZXMgbm90IHRvdWNoIGFueSBvdGhlciByYW5nZXMs DQorCSAqIHRoZW4gdHdvIHBpdm90cyBuZWVkIHRvIGJlIGluc2VydGVkOiB0aGUgc3RhcnQgLSAx LCBhbmQgdGhlIGVuZC4gIEFzDQorCSAqIHVzdWFsLCB0aGUgZW50cnkgbXVzdCBiZSB3cml0dGVu LiAgTW9zdCBvcGVyYXRpb25zIHJlcXVpcmUgYSBuZXcgbm9kZQ0KKwkgKiB0byBiZSBhbGxvY2F0 ZWQgYW5kIHJlcGxhY2UgYW4gZXhpc3Rpbmcgbm9kZSB0byBlbnN1cmUgUkNVIHNhZmV0eSwNCisJ ICogd2hlbiBpbiBSQ1UgbW9kZS4gIFRoZSBleGNlcHRpb24gdG8gcmVxdWlyaW5nIGEgbmV3bHkg YWxsb2NhdGVkIG5vZGUNCisJICogaXMgd2hlbiBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiBhIG5v ZGUgKGFwcGVuZGluZykuICBXaGVuIGRvbmUNCisJICogY2FyZWZ1bGx5LCBhcHBlbmRpbmcgY2Fu IHJldXNlIHRoZSBub2RlIGluIHBsYWNlLg0KKwkgKi8NCisJd3JfbWFzLmNvbnRlbnQgPSBtYXNf c3RhcnQobWFzKTsNCisJaWYgKHdyX21hcy5jb250ZW50KQ0KKwkJZ290byBleGlzdHM7DQorDQor CWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3N0b3Jl X3Jvb3QobWFzLCBlbnRyeSk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwkvKiBzcGFubmlu ZyB3cml0ZXMgYWx3YXlzIG92ZXJ3cml0ZSBzb21ldGhpbmcgKi8NCisJaWYgKCFtYXNfd3Jfd2Fs aygmd3JfbWFzKSkNCisJCWdvdG8gZXhpc3RzOw0KKw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBh cmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVyZWQuICovDQorCXdyX21h cy5vZmZzZXRfZW5kID0gbWFzLT5vZmZzZXQ7DQorCXdyX21hcy5lbmRfcGl2ID0gd3JfbWFzLnJf bWF4Ow0KKw0KKwlpZiAod3JfbWFzLmNvbnRlbnQgfHwgKG1hcy0+bGFzdCA+IHdyX21hcy5yX21h eCkpDQorCQlnb3RvIGV4aXN0czsNCisNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0K Kw0KKwltYXNfd3JfbW9kaWZ5KCZ3cl9tYXMpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQor DQorZXhpc3RzOg0KKwltYXNfc2V0X2VycihtYXMsIC1FRVhJU1QpOw0KKwlyZXR1cm4gd3JfbWFz LmNvbnRlbnQ7DQorDQorfQ0KKw0KKy8qDQorICogbWFzX3ByZXZfbm9kZSgpIC0gRmluZCB0aGUg cHJldiBub24tbnVsbCBlbnRyeSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUNCisgKiB0cmVlLiAg VGhlIHByZXYgdmFsdWUgd2lsbCBiZSBtYXMtPm5vZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19OT05F Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlciBsaW1pdCB0 byBzZWFyY2gNCisgKg0KKyAqIFRoZSBwcmV2IG5vZGUgdmFsdWUgd2lsbCBiZSBtYXMtPm5vZGVb bWFzLT5vZmZzZXRdIG9yIE1BU19OT05FLg0KKyAqIFJldHVybjogMSBpZiB0aGUgbm9kZSBpcyBk ZWFkLCAwIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfcHJldl9ub2Rl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCWVudW0gbWFw bGVfdHlwZSBtdDsNCisJaW50IG9mZnNldCwgbGV2ZWw7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGU7 DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisNCisJaWYgKG1hc19pc19ub25lKG1hcykpDQor CQlyZXR1cm4gMDsNCisNCisJbGV2ZWwgPSAwOw0KKwlkbyB7DQorCQlub2RlID0gbWFzX21uKG1h cyk7DQorCQlpZiAobWFfaXNfcm9vdChub2RlKSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0KKwkJ LyogV2FsayB1cC4gKi8NCisJCWlmICh1bmxpa2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJCXJl dHVybiAxOw0KKwkJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwl9IHdoaWxl ICghb2Zmc2V0KTsNCisNCisJb2Zmc2V0LS07DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQp Ow0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwltYXMtPm1heCA9IHBpdm90c1tv ZmZzZXRdOw0KKwlpZiAob2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0g KyAxOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0K Kw0KKwlpZiAobWFzLT5tYXggPCBtaW4pDQorCQlnb3RvIG5vX2VudHJ5X21pbjsNCisNCisJd2hp bGUgKGxldmVsID4gMSkgew0KKwkJbGV2ZWwtLTsNCisJCWVub2RlID0gbWFzX3Nsb3QobWFzLCBz bG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJ CXJldHVybiAxOw0KKw0KKwkJbWFzLT5ub2RlID0gZW5vZGU7DQorCQltdCA9IG10ZV9ub2RlX3R5 cGUobWFzLT5ub2RlKTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFfc2xv dHMobm9kZSwgbXQpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJCW9mZnNl dCA9IG1hX2RhdGFfZW5kKG5vZGUsIG10LCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJCWlmIChvZmZz ZXQpDQorCQkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKw0KKwkJaWYgKG9m ZnNldCA8IG10X3Bpdm90c1ttdF0pDQorCQkJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisN CisJCWlmIChtYXMtPm1heCA8IG1pbikNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKwl9DQorDQorCW1h cy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCWlmICh1bmxpa2VseSht YV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCW1hcy0+b2Zmc2V0ID0gbWFz X2RhdGFfZW5kKG1hcyk7DQorCWlmICh1bmxpa2VseShtdGVfZGVhZF9ub2RlKG1hcy0+bm9kZSkp KQ0KKwkJcmV0dXJuIDE7DQorDQorCXJldHVybiAwOw0KKw0KK25vX2VudHJ5X21pbjoNCisJbWFz LT5vZmZzZXQgPSBvZmZzZXQ7DQorCWlmIChvZmZzZXQpDQorCQltYXMtPm1pbiA9IHBpdm90c1tv ZmZzZXQgLSAxXSArIDE7DQorbm9fZW50cnk6DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUo bm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1 cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9ub2RlKCkgLSBHZXQgdGhlIG5leHQgbm9k ZSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUgdHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBwaXZvdCB2YWx1ZSB0byBjaGVjay4NCisgKg0KKyAq IFRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNfTk9O RS4NCisgKiBSZXR1cm46IDEgb24gZGVhZCBub2RlLCAwIG90aGVyd2lzZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIGludCBtYXNfbmV4dF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3Qg bWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25l ZCBsb25nIG1pbiwgcGl2b3Q7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1h cGxlX2Vub2RlICplbm9kZTsNCisJaW50IGxldmVsID0gMDsNCisJdW5zaWduZWQgY2hhciBvZmZz ZXQ7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwlp ZiAobWFzLT5tYXggPj0gbWF4KQ0KKwkJZ290byBub19lbnRyeTsNCisNCisJbGV2ZWwgPSAwOw0K KwlkbyB7DQorCQlpZiAobWFfaXNfcm9vdChub2RlKSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0K KwkJbWluID0gbWFzLT5tYXggKyAxOw0KKwkJaWYgKG1pbiA+IG1heCkNCisJCQlnb3RvIG5vX2Vu dHJ5Ow0KKw0KKwkJaWYgKHVubGlrZWx5KG1hc19hc2NlbmQobWFzKSkpDQorCQkJcmV0dXJuIDE7 DQorDQorCQlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJCWxldmVsKys7DQorCQlub2RlID0gbWFz X21uKG1hcyk7DQorCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCXBpdm90cyA9 IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCX0gd2hpbGUgKHVubGlrZWx5KG9mZnNldCA9PSBtYV9k YXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCkpKTsNCisNCisJc2xvdHMgPSBtYV9z bG90cyhub2RlLCBtdCk7DQorCXBpdm90ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsICsr b2Zmc2V0LCBtdCk7DQorCXdoaWxlICh1bmxpa2VseShsZXZlbCA+IDEpKSB7DQorCQkvKiBEZXNj ZW5kLCBpZiBuZWNlc3NhcnkgKi8NCisJCWVub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zm c2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCXJldHVybiAx Ow0KKw0KKwkJbWFzLT5ub2RlID0gZW5vZGU7DQorCQlsZXZlbC0tOw0KKwkJbm9kZSA9IG1hc19t bihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlzbG90cyA9IG1h X3Nsb3RzKG5vZGUsIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCQlv ZmZzZXQgPSAwOw0KKwkJcGl2b3QgPSBwaXZvdHNbMF07DQorCX0NCisNCisJZW5vZGUgPSBtYXNf c2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5v ZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBlbm9kZTsNCisJbWFzLT5taW4g PSBtaW47DQorCW1hcy0+bWF4ID0gcGl2b3Q7DQorCXJldHVybiAwOw0KKw0KK25vX2VudHJ5Og0K KwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwlt YXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX25l eHRfbmVudHJ5KCkgLSBHZXQgdGhlIG5leHQgbm9kZSBlbnRyeQ0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICogQCpyYW5n ZV9zdGFydDogUG9pbnRlciB0byBzdG9yZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlLg0KKyAqDQor ICogU2V0cyBAbWFzLT5vZmZzZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBub2RlIGVudHJ5 LCBAbWFzLT5sYXN0IHRvIHRoZQ0KKyAqIHBpdm90IG9mIHRoZSBlbnRyeS4NCisgKg0KKyAqIFJl dHVybjogVGhlIG5leHQgZW50cnksICVOVUxMIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCAqbWFzX25leHRfbmVudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgICAgc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGxvbmcgbWF4LCBlbnVtIG1hcGxlX3R5cGUg dHlwZSkNCit7DQorCXVuc2lnbmVkIGNoYXIgY291bnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3Q7 DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl2b2lk ICplbnRyeTsNCisNCisJaWYgKG1hcy0+bGFzdCA9PSBtYXMtPm1heCkgew0KKwkJbWFzLT5pbmRl eCA9IG1hcy0+bWF4Ow0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcGl2b3RzID0gbWFfcGl2 b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwltYXMt PmluZGV4ID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBtYXMtPm9mZnNldCk7DQorCWlmICht YV9kZWFkX25vZGUobm9kZSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1hcy0+aW5kZXgg PiBtYXgpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJY291bnQgPSBtYV9kYXRhX2VuZChub2RlLCB0 eXBlLCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJaWYgKG1hcy0+b2Zmc2V0ID4gY291bnQpDQorCQly ZXR1cm4gTlVMTDsNCisNCisJd2hpbGUgKG1hcy0+b2Zmc2V0IDwgY291bnQpIHsNCisJCXBpdm90 ID0gcGl2b3RzW21hcy0+b2Zmc2V0XTsNCisJCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywg bWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2RlYWRfbm9kZShub2RlKSkNCisJCQlyZXR1cm4gTlVM TDsNCisNCisJCWlmIChlbnRyeSkNCisJCQlnb3RvIGZvdW5kOw0KKw0KKwkJaWYgKHBpdm90ID49 IG1heCkNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCW1hcy0+aW5kZXggPSBwaXZvdCArIDE7DQor CQltYXMtPm9mZnNldCsrOw0KKwl9DQorDQorCWlmIChtYXMtPmluZGV4ID4gbWFzLT5tYXgpIHsN CisJCW1hcy0+aW5kZXggPSBtYXMtPmxhc3Q7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlw aXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBtYXMtPm9mZnNldCwgdHlwZSk7DQor CWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0KKwlpZiAobWFfZGVh ZF9ub2RlKG5vZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICghcGl2b3QpDQorCQlyZXR1 cm4gTlVMTDsNCisNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KK2ZvdW5kOg0K KwltYXMtPmxhc3QgPSBwaXZvdDsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMgaW5s aW5lIHZvaWQgbWFzX3Jld2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBp bmRleCkNCit7DQorDQorcmV0cnk6DQorCW1hc19zZXQobWFzLCBpbmRleCk7DQorCW1hc19zdGF0 ZV93YWxrKG1hcyk7DQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCWdvdG8gcmV0cnk7DQor DQorCXJldHVybjsNCisNCit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9lbnRyeSgpIC0gSW50ZXJu YWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqIEBsaW1pdDogVGhlIG1heGltdW0gcmFuZ2Ugc3RhcnQuDQorICoNCisgKiBTZXQg dGhlIEBtYXMtPm5vZGUgdG8gdGhlIG5leHQgZW50cnkgYW5kIHRoZSByYW5nZV9zdGFydCB0bw0K KyAqIHRoZSBiZWdpbm5pbmcgdmFsdWUgZm9yIHRoZSBlbnRyeS4gIERvZXMgbm90IGNoZWNrIGJl eW9uZCBAbGltaXQuDQorICogU2V0cyBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCB0byB0aGUg bGltaXQgaWYgaXQgaXMgaGl0Lg0KKyAqIFJlc3RhcnRzIG9uIGRlYWQgbm9kZXMuDQorICoNCisg KiBSZXR1cm46IHRoZSBuZXh0IGVudHJ5IG9yICVOVUxMLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCAqbWFzX25leHRfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcg bGltaXQpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq cHJldl9ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdW5zaWduZWQgY2hhciBv ZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgbGFzdDsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKw0K KwlsYXN0ID0gbWFzLT5sYXN0Ow0KK3JldHJ5Og0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJ cHJldl9ub2RlID0gbWFzLT5ub2RlOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwltYXMtPm9mZnNldCsrOw0KKwlpZiAodW5saWtlbHko bWFzLT5vZmZzZXQgPj0gbXRfc2xvdHNbbXRdKSkgew0KKwkJbWFzLT5vZmZzZXQgPSBtdF9zbG90 c1ttdF0gLSAxOw0KKwkJZ290byBuZXh0X25vZGU7DQorCX0NCisNCisJd2hpbGUgKCFtYXNfaXNf bm9uZShtYXMpKSB7DQorCQllbnRyeSA9IG1hc19uZXh0X25lbnRyeShtYXMsIG5vZGUsIGxpbWl0 LCBtdCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkgew0KKwkJCW1hc19y ZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJfQ0KKw0KKwkJaWYgKGxpa2Vs eShlbnRyeSkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKw0KKwkJaWYgKHVubGlrZWx5KChtYXMtPmlu ZGV4ID4gbGltaXQpKSkNCisJCQlicmVhazsNCisNCituZXh0X25vZGU6DQorCQlwcmV2X25vZGUg PSBtYXMtPm5vZGU7DQorCQlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJCWlmICh1bmxpa2VseSht YXNfbmV4dF9ub2RlKG1hcywgbm9kZSwgbGltaXQpKSkgew0KKwkJCW1hc19yZXdhbGsobWFzLCBs YXN0KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJfQ0KKwkJbWFzLT5vZmZzZXQgPSAwOw0KKwkJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCX0N CisNCisJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCA9IGxpbWl0Ow0KKwltYXMtPm9mZnNldCA9IG9m ZnNldDsNCisJbWFzLT5ub2RlID0gcHJldl9ub2RlOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQor LyoNCisgKiBtYXNfcHJldl9uZW50cnkoKSAtIEdldCB0aGUgcHJldmlvdXMgbm9kZSBlbnRyeS4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiBUaGUgbG93ZXIgbGltaXQg dG8gY2hlY2sgZm9yIGEgdmFsdWUuDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSwgJU5VTEwg b3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3ByZXZfbmVudHJ5KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGxpbWl0LA0KKwkJCQkgICAgdW5zaWdu ZWQgbG9uZyBpbmRleCkNCit7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1pbjsNCisJdW5zaWdu ZWQgY2hhciBvZmZzZXQ7DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbjsNCisJZW51bSBtYXBsZV90 eXBlIG10Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQorCWlmICghbWFzLT5vZmZzZXQpDQorCQlyZXR1 cm4gTlVMTDsNCisNCisJbW4gPSBtYXNfbW4obWFzKTsNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1h cy0+bm9kZSk7DQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0IC0gMTsNCisJaWYgKG9mZnNldCA+PSBt dF9zbG90c1ttdF0pDQorCQlvZmZzZXQgPSBtdF9zbG90c1ttdF0gLSAxOw0KKw0KKwlzbG90cyA9 IG1hX3Nsb3RzKG1uLCBtdCk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhtbiwgbXQpOw0KKwlpZiAo b2Zmc2V0ID09IG10X3Bpdm90c1ttdF0pDQorCQlwaXZvdCA9IG1hcy0+bWF4Ow0KKwllbHNlDQor CQlwaXZvdCA9IHBpdm90c1tvZmZzZXRdOw0KKw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2Rl KG1uKSkpIHsNCisJCW1hc19yZXdhbGsobWFzLCBpbmRleCk7DQorCQlnb3RvIHJldHJ5Ow0KKwl9 DQorDQorCXdoaWxlIChvZmZzZXQgJiYgKCghbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSAm JiBwaXZvdCA+PSBsaW1pdCkgfHwNCisJICAgICAgICFwaXZvdCkpDQorCQlwaXZvdCA9IHBpdm90 c1stLW9mZnNldF07DQorDQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0 KTsNCisJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtl bHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJCW1hc19yZXdhbGsobWFzLCBpbmRleCk7DQorCQln b3RvIHJldHJ5Ow0KKwl9DQorDQorCWlmIChsaWtlbHkoZW50cnkpKSB7DQorCQltYXMtPm9mZnNl dCA9IG9mZnNldDsNCisJCW1hcy0+bGFzdCA9IHBpdm90Ow0KKwkJbWFzLT5pbmRleCA9IG1pbjsN CisJfQ0KKwlyZXR1cm4gZW50cnk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3By ZXZfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJ dm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQorCXdoaWxlIChsaWtlbHkoIW1hc19pc19ub25lKG1h cykpKSB7DQorCQllbnRyeSA9IG1hc19wcmV2X25lbnRyeShtYXMsIG1pbiwgbWFzLT5pbmRleCk7 DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0IDwgbWluKSkNCisJCQlnb3RvIG5vdF9mb3VuZDsN CisNCisJCWlmIChsaWtlbHkoZW50cnkpKQ0KKwkJCXJldHVybiBlbnRyeTsNCisNCisJCWlmICh1 bmxpa2VseShtYXNfcHJldl9ub2RlKG1hcywgbWluKSkpIHsNCisJCQltYXNfcmV3YWxrKG1hcywg bWFzLT5pbmRleCk7DQorCQkJZ290byByZXRyeTsNCisJCX0NCisNCisJCW1hcy0+b2Zmc2V0Kys7 DQorCX0NCisNCisJbWFzLT5vZmZzZXQtLTsNCitub3RfZm91bmQ6DQorCW1hcy0+aW5kZXggPSBt YXMtPmxhc3QgPSBtaW47DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXZf YXdhbGsoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgUmV2ZXJzZSBhbGxvY2F0aW9uIHdhbGsuICBG aW5kIHRoZQ0KKyAqIGhpZ2hlc3QgZ2FwIGFkZHJlc3Mgb2YgYSBnaXZlbiBzaXplIGluIGEgZ2l2 ZW4gbm9kZSBhbmQgZGVzY2VuZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2l6 ZTogVGhlIG5lZWRlZCBzaXplLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIGZvdW5kIGluIGEg bGVhZiwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqDQorICovDQorc3RhdGljIGJvb2wgbWFzX3Jldl9h d2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJZW51 bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlID0gbWFzX21uKG1hcyk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cywg KmdhcHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgbG9uZyBnYXAgPSAwOw0K Kwl1bnNpZ25lZCBsb25nIG1heCwgbWluLCBpbmRleDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7 DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0KKwkJcmV0dXJuIHRydWU7DQor DQorCWlmIChtYV9pc19kZW5zZSh0eXBlKSkgew0KKwkJLyogZGVuc2Ugbm9kZXMuICovDQorCQlt YXMtPm9mZnNldCA9ICh1bnNpZ25lZCBjaGFyKShtYXMtPmluZGV4IC0gbWFzLT5taW4pOw0KKwkJ cmV0dXJuIHRydWU7DQorCX0NCisNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0K KwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwlnYXBzID0gbWFfZ2Fwcyhub2RlLCB0 eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMs IHBpdm90cywgb2Zmc2V0KTsNCisJLyogU2tpcCBvdXQgb2YgYm91bmRzLiAqLw0KKwl3aGlsZSAo bWFzLT5sYXN0IDwgbWluKQ0KKwkJbWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCAtLW9m ZnNldCk7DQorDQorCW1heCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5 cGUpOw0KKwlpbmRleCA9IG1hcy0+aW5kZXg7DQorCXdoaWxlIChpbmRleCA8PSBtYXgpIHsNCisJ CWdhcCA9IDA7DQorCQlpZiAoZ2FwcykNCisJCQlnYXAgPSBnYXBzW29mZnNldF07DQorCQllbHNl IGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSkNCisJCQlnYXAgPSBtYXggLSBtaW4g KyAxOw0KKw0KKwkJaWYgKGdhcCkgew0KKwkJCWlmICgoc2l6ZSA8PSBnYXApICYmIChzaXplIDw9 IG1hcy0+bGFzdCAtIG1pbiArIDEpKQ0KKwkJCQlicmVhazsNCisNCisJCQlpZiAoIWdhcHMpIHsN CisJCQkJLyogU2tpcCB0aGUgbmV4dCBzbG90LCBpdCBjYW5ub3QgYmUgYSBnYXAuICovDQorCQkJ CWlmIChvZmZzZXQgPCAyKQ0KKwkJCQkJZ290byBhc2NlbmQ7DQorDQorCQkJCW9mZnNldCAtPSAy Ow0KKwkJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJCQkJbWluID0gbWFzX3NhZmVfbWluKG1h cywgcGl2b3RzLCBvZmZzZXQpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorDQorCQlp ZiAoIW9mZnNldCkNCisJCQlnb3RvIGFzY2VuZDsNCisNCisJCW9mZnNldC0tOw0KKwkJbWF4ID0g bWluIC0gMTsNCisJCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJ fQ0KKw0KKwlpZiAodW5saWtlbHkoaW5kZXggPiBtYXgpKSB7DQorCQltYXNfc2V0X2VycihtYXMs IC1FQlVTWSk7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KG1hX2lz X2xlYWYodHlwZSkpKSB7DQorCQltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJCW1hcy0+bWluID0g bWluOw0KKwkJbWFzLT5tYXggPSBtaW4gKyBnYXAgLSAxOw0KKwkJcmV0dXJuIHRydWU7DQorCX0N CisNCisJLyogZGVzY2VuZCwgb25seSBoYXBwZW5zIHVuZGVyIGxvY2suICovDQorCW1hcy0+bm9k ZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCW1hcy0+bWluID0gbWluOw0KKwlt YXMtPm1heCA9IG1heDsNCisJbWFzLT5vZmZzZXQgPSBtYXNfZGF0YV9lbmQobWFzKTsNCisJcmV0 dXJuIGZhbHNlOw0KKw0KK2FzY2VuZDoNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQor CQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQor c3RhdGljIGlubGluZSBib29sIG1hc19hbm9kZV9kZXNjZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJdW5zaWduZWQgbG9uZyBwaXZvdCwgbWluLCBnYXAgPSAw Ow0KKwl1bnNpZ25lZCBjaGFyIGNvdW50LCBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgKmdhcHMg PSBOVUxMLCAqcGl2b3RzID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCB0eXBlKTsNCisJdm9pZCBf X3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobWFzX21uKG1hcyksIHR5cGUpOw0KKwlib29sIGZvdW5k ID0gZmFsc2U7DQorDQorCWlmIChtYV9pc19kZW5zZSh0eXBlKSkgew0KKwkJbWFzLT5vZmZzZXQg PSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRleCAtIG1hcy0+bWluKTsNCisJCXJldHVybiB0cnVl Ow0KKwl9DQorDQorCWdhcHMgPSBtYV9nYXBzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUp Ow0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJY291bnQgPSBtdF9zbG90c1t0eXBlXTsNCisJ bWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBvZmZzZXQpOw0KKwlmb3IgKDsgb2Zmc2V0 IDwgY291bnQ7IG9mZnNldCsrKSB7DQorCQlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2 b3RzLCBvZmZzZXQsIHR5cGUpOw0KKwkJaWYgKG9mZnNldCAmJiAhcGl2b3QpDQorCQkJYnJlYWs7 DQorDQorCQkvKiBOb3Qgd2l0aGluIGxvd2VyIGJvdW5kcyAqLw0KKwkJaWYgKG1hcy0+aW5kZXgg PiBwaXZvdCkNCisJCQlnb3RvIG5leHRfc2xvdDsNCisNCisJCWlmIChnYXBzKQ0KKwkJCWdhcCA9 IGdhcHNbb2Zmc2V0XTsNCisJCWVsc2UgaWYgKCFtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQp KQ0KKwkJCWdhcCA9IG1pbihwaXZvdCwgbWFzLT5sYXN0KSAtIG1heChtYXMtPmluZGV4LCBtaW4p ICsgMTsNCisJCWVsc2UNCisJCQlnb3RvIG5leHRfc2xvdDsNCisNCisJCWlmIChnYXAgPj0gc2l6 ZSkgew0KKwkJCWlmIChtYV9pc19sZWFmKHR5cGUpKSB7DQorCQkJCWZvdW5kID0gdHJ1ZTsNCisJ CQkJZ290byBkb25lOw0KKwkJCX0NCisJCQlpZiAobWFzLT5pbmRleCA8PSBwaXZvdCkgew0KKwkJ CQltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJCQltYXMtPm1p biA9IG1pbjsNCisJCQkJbWFzLT5tYXggPSBwaXZvdDsNCisJCQkJb2Zmc2V0ID0gMDsNCisJCQkJ dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCQkJY291bnQgPSBtdF9zbG90c1t0 eXBlXTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KK25leHRfc2xvdDoNCisJCW1pbiA9IHBp dm90ICsgMTsNCisJCWlmIChtYXMtPmxhc3QgPCBtaW4pIHsNCisJCQltYXNfc2V0X2VycihtYXMs IC1FQlVTWSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCX0NCisNCisJaWYgKG10ZV9pc19y b290KG1hcy0+bm9kZSkpDQorCQlmb3VuZCA9IHRydWU7DQorZG9uZToNCisJbWFzLT5vZmZzZXQg PSBvZmZzZXQ7DQorCXJldHVybiBmb3VuZDsNCit9DQorDQorLyoqDQorICogbWFzX3dhbGsoKSAt IFNlYXJjaCBmb3IgQG1hcy0+aW5kZXggaW4gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlLg0KKyAqDQorICogbWFzLT5pbmRleCBhbmQgbWFzLT5sYXN0IHdpbGwgYmUgc2V0IHRv IHRoZSByYW5nZSBpZiB0aGVyZSBpcyBhIHZhbHVlLiAgSWYNCisgKiBtYXMtPm5vZGUgaXMgTUFT X05PTkUsIHJlc2V0IHRvIE1BU19TVEFSVC4NCisgKg0KKyAqIFJldHVybjogdGhlIGVudHJ5IGF0 IHRoZSBsb2NhdGlvbiBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfd2FsayhzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5Og0KKwllbnRyeSA9IG1h c19zdGF0ZV93YWxrKG1hcyk7DQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCWdvdG8gcmV0 cnk7DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykpIHsNCisJCWlmICghbWFzLT5pbmRleCkgew0K KwkJCW1hcy0+bGFzdCA9IDA7DQorCQl9IGVsc2Ugew0KKwkJCW1hcy0+aW5kZXggPSAxOw0KKwkJ CW1hcy0+bGFzdCA9IFVMT05HX01BWDsNCisJCX0NCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0K KwlpZiAobWFzX2lzX25vbmUobWFzKSkgew0KKwkJbWFzLT5pbmRleCA9IDA7DQorCQltYXMtPmxh c3QgPSBVTE9OR19NQVg7DQorCX0NCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCisNCitzdGF0aWMg aW5saW5lIGJvb2wgbWFzX3Jld2luZF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJ dW5zaWduZWQgY2hhciBzbG90Ow0KKw0KKwlkbyB7DQorCQlpZiAobXRlX2lzX3Jvb3QobWFzLT5u b2RlKSkgew0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJCQlpZiAoIXNsb3QpDQorCQkJCXJl dHVybiBmYWxzZTsNCisJCX0gZWxzZSB7DQorCQkJbWFzX2FzY2VuZChtYXMpOw0KKwkJCXNsb3Qg PSBtYXMtPm9mZnNldDsNCisJCX0NCisJfSB3aGlsZSAoIXNsb3QpOw0KKw0KKwltYXMtPm9mZnNl dCA9IC0tc2xvdDsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3NraXBfbm9k ZSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24uICBTa2lwIG92ZXIgYSBub2RlLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVy IG5vZGUsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3Nr aXBfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdCwg c2xvdF9jb3VudDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwllbnVtIG1hcGxlX3R5cGUg bXQ7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzbG90X2NvdW50ID0g bXRfc2xvdHNbbXRdIC0gMTsNCisJZG8gew0KKwkJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkp IHsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQkJaWYgKHNsb3QgPiBzbG90X2NvdW50KSB7 DQorCQkJCW1hc19zZXRfZXJyKG1hcywgLUVCVVNZKTsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJ CX0NCisJCX0gZWxzZSB7DQorCQkJbWFzX2FzY2VuZChtYXMpOw0KKwkJCXNsb3QgPSBtYXMtPm9m ZnNldDsNCisJCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCQlzbG90X2NvdW50 ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisJCX0NCisJfSB3aGlsZSAoc2xvdCA+IHNsb3RfY291bnQp Ow0KKw0KKwltYXMtPm9mZnNldCA9ICsrc2xvdDsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1hc19t bihtYXMpLCBtdCk7DQorCWlmIChzbG90ID4gMCkNCisJCW1hcy0+bWluID0gcGl2b3RzW3Nsb3Qg LSAxXSArIDE7DQorDQorCWlmIChzbG90IDw9IHNsb3RfY291bnQpDQorCQltYXMtPm1heCA9IHBp dm90c1tzbG90XTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX2F3YWxr KCkgLSBBbGxvY2F0aW9uIHdhbGsuICBTZWFyY2ggZnJvbSBsb3cgYWRkcmVzcyB0byBoaWdoLCBm b3IgYSBnYXAgb2YNCisgKiBAc2l6ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBz aXplOiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIHJlcXVpcmVkDQorICoNCisgKiBTZWFyY2ggYmV0d2Vl biBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCBmb3IgYSBnYXAgb2YgQHNpemUuDQorICovDQor c3RhdGljIGlubGluZSB2b2lkIG1hc19hd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBzaXplKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsYXN0ID0gTlVMTDsNCisN CisJLyoNCisJICogVGhlcmUgYXJlIDQgb3B0aW9uczoNCisJICogZ28gdG8gY2hpbGQgKGRlc2Nl bmQpDQorCSAqIGdvIGJhY2sgdG8gcGFyZW50IChhc2NlbmQpDQorCSAqIG5vIGdhcCBmb3VuZC4g KHJldHVybiwgc2xvdCA9PSBNQVBMRV9OT0RFX1NMT1RTKQ0KKwkgKiBmb3VuZCB0aGUgZ2FwLiAo cmV0dXJuLCBzbG90ICE9IE1BUExFX05PREVfU0xPVFMpDQorCSAqLw0KKwl3aGlsZSAoIW1hc19p c19lcnIobWFzKSAmJiAhbWFzX2Fub2RlX2Rlc2NlbmQobWFzLCBzaXplKSkgew0KKwkJaWYgKGxh c3QgPT0gbWFzLT5ub2RlKQ0KKwkJCW1hc19za2lwX25vZGUobWFzKTsNCisJCWVsc2UNCisJCQls YXN0ID0gbWFzLT5ub2RlOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2ZpbGxfZ2FwKCkgLSBG aWxsIGEgbG9jYXRlZCBnYXAgd2l0aCBAZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQGVudHJ5OiBUaGUgdmFsdWUgdG8gc3RvcmUNCisgKiBAc2xvdDogVGhlIG9mZnNldCBp bnRvIHRoZSBub2RlIHRvIHN0b3JlIHRoZSBAZW50cnkNCisgKiBAc2l6ZTogVGhlIHNpemUgb2Yg dGhlIGVudHJ5DQorICogQGluZGV4OiBUaGUgc3RhcnQgbG9jYXRpb24NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgbWFzX2ZpbGxfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRy eSwNCisJCXVuc2lnbmVkIGNoYXIgc2xvdCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBs b25nICppbmRleCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorCXVu c2lnbmVkIGNoYXIgcHNsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJc3RydWN0 IG1hcGxlX2Vub2RlICptbiA9IG1hcy0+bm9kZTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0K KwllbnVtIG1hcGxlX3R5cGUgcHR5cGU7DQorCS8qDQorCSAqIG1hcy0+aW5kZXggaXMgdGhlIHN0 YXJ0IGFkZHJlc3MgZm9yIHRoZSBzZWFyY2gNCisJICogIHdoaWNoIG1heSBubyBsb25nZXIgYmUg bmVlZGVkLg0KKwkgKiBtYXMtPmxhc3QgaXMgdGhlIGVuZCBhZGRyZXNzIGZvciB0aGUgc2VhcmNo DQorCSAqLw0KKw0KKwkqaW5kZXggPSBtYXMtPmluZGV4Ow0KKwltYXMtPmxhc3QgPSBtYXMtPmlu ZGV4ICsgc2l6ZSAtIDE7DQorDQorCS8qDQorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdXNpbmcg bWFzLT5tYXggYW5kIG1hcy0+bWluIHRvIGNvcnJlY3RseQ0KKwkgKiBjYWxjdWxhdGUgdGhlIGlu ZGV4IGFuZCBsYXN0IHdpbGwgY2F1c2UgYW4gaXNzdWUgaW4gdGhlIGdhcA0KKwkgKiBjYWxjdWxh dGlvbiwgc28gZml4IHRoZSBtYV9zdGF0ZSBoZXJlDQorCSAqLw0KKwltYXNfYXNjZW5kKG1hcyk7 DQorCXB0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZv dHMobWFzX21uKG1hcyksIHB0eXBlKTsNCisJbWFzLT5tYXggPSBtYXNfc2FmZV9waXZvdChtYXMs IHBpdm90cywgcHNsb3QsIHB0eXBlKTsNCisJbWFzLT5taW4gPSBtYXNfc2FmZV9taW4obWFzLCBw aXZvdHMsIHBzbG90KTsNCisJbWFzLT5ub2RlID0gbW47DQorCW1hcy0+b2Zmc2V0ID0gc2xvdDsN CisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KK30NCisNCisvKg0KKyAqIG1hc19zcGFy c2VfYXJlYSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24uICBSZXR1cm4gdXBwZXIgb3IgbG93ZXIgbGlt aXQgd2hlbg0KKyAqIHNlYXJjaGluZyBmb3IgYSBnYXAgaW4gYW4gZW1wdHkgdHJlZS4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiB0aGUgbWluaW11bSByYW5nZQ0KKyAqIEBt YXg6IFRoZSBtYXhpbXVtIHJhbmdlDQorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBnYXANCisg KiBAZndkOiBTZWFyY2hpbmcgZm9yd2FyZCBvciBiYWNrDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc19zcGFyc2VfYXJlYShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBt aW4sDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUsIGJvb2wgZndk KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7DQorDQorCWlmICghdW5saWtlbHkobWFz X2lzX25vbmUobWFzKSkpDQorCQlzdGFydCsrOw0KKwkvKiBtYXNfaXNfcHRyICovDQorDQorCWlm IChzdGFydCA8IG1pbikNCisJCXN0YXJ0ID0gbWluOw0KKw0KKwlpZiAoZndkKSB7DQorCQltYXMt PmluZGV4ID0gc3RhcnQ7DQorCQltYXMtPmxhc3QgPSBzdGFydCArIHNpemUgLSAxOw0KKwkJcmV0 dXJuOw0KKwl9DQorDQorCW1hcy0+aW5kZXggPSBtYXg7DQorfQ0KKw0KKy8qDQorICogbWFzX2Vt cHR5X2FyZWEoKSAtIEdldCB0aGUgbG93ZXN0IGFkZHJlc3Mgd2l0aGluIHRoZSByYW5nZSB0aGF0 IGlzDQorICogc3VmZmljaWVudCBmb3IgdGhlIHNpemUgcmVxdWVzdGVkLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQor ICogQG1heDogVGhlIGhpZ2hlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQorICogQHNpemU6IFRoZSBz aXplIG5lZWRlZA0KKyAqLw0KK2ludCBtYXNfZW1wdHlfYXJlYShzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9u ZyBzaXplKQ0KK3sNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgKnBp dm90czsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykp DQorCQltYXNfc3RhcnQobWFzKTsNCisJZWxzZSBpZiAobWFzLT5vZmZzZXQgPj0gMikNCisJCW1h cy0+b2Zmc2V0IC09IDI7DQorCWVsc2UgaWYgKCFtYXNfc2tpcF9ub2RlKG1hcykpDQorCQlyZXR1 cm4gLUVCVVNZOw0KKw0KKwkvKiBFbXB0eSBzZXQgKi8NCisJaWYgKG1hc19pc19ub25lKG1hcykg fHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNfc3BhcnNlX2FyZWEobWFzLCBtaW4sIG1heCwg c2l6ZSwgdHJ1ZSk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQgb2YgdGhl IHdpbmRvdyBjYW4gb25seSBiZSB3aXRoaW4gdGhlc2UgdmFsdWVzICovDQorCW1hcy0+aW5kZXgg PSBtaW47DQorCW1hcy0+bGFzdCA9IG1heDsNCisJbWFzX2F3YWxrKG1hcywgc2l6ZSk7DQorDQor CWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5v ZGUpOw0KKw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJaWYgKHVubGlrZWx5KG9mZnNldCA9 PSBNQVBMRV9OT0RFX1NMT1RTKSkNCisJCXJldHVybiAtRUJVU1k7DQorDQorCW10ID0gbXRlX25v ZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIG10 KTsNCisJaWYgKG9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsN CisNCisJaWYgKG9mZnNldCA8IG10X3Bpdm90c1ttdF0pDQorCQltYXMtPm1heCA9IHBpdm90c1tv ZmZzZXRdOw0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1hcy0+bWluKQ0KKwkJbWFzLT5pbmRleCA9 IG1hcy0+bWluOw0KKw0KKwltYXMtPmxhc3QgPSBtYXMtPmluZGV4ICsgc2l6ZSAtIDE7DQorCXJl dHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hc19lbXB0eV9hcmVhX3JldigpIC0gR2V0IHRoZSBo aWdoZXN0IGFkZHJlc3Mgd2l0aGluIHRoZSByYW5nZSB0aGF0IGlzDQorICogc3VmZmljaWVudCBm b3IgdGhlIHNpemUgcmVxdWVzdGVkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBt aW46IFRoZSBsb3dlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQorICogQG1heDogVGhlIGhpZ2hlc3Qg dmFsdWUgb2YgdGhlIHJhbmdlDQorICogQHNpemU6IFRoZSBzaXplIG5lZWRlZA0KKyAqLw0KK2lu dCBtYXNfZW1wdHlfYXJlYV9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcg bWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqbGFzdCA9IG1hcy0+bm9kZTsNCisNCisJaWYgKG1hc19pc19zdGFy dChtYXMpKSB7DQorCQltYXNfc3RhcnQobWFzKTsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFf ZW5kKG1hcyk7DQorCX0gZWxzZSBpZiAobWFzLT5vZmZzZXQgPj0gMikgew0KKwkJbWFzLT5vZmZz ZXQgLT0gMjsNCisJfSBlbHNlIGlmICghbWFzX3Jld2luZF9ub2RlKG1hcykpIHsNCisJCXJldHVy biAtRUJVU1k7DQorCX0NCisNCisJLyogRW1wdHkgc2V0LiAqLw0KKwlpZiAobWFzX2lzX25vbmUo bWFzKSB8fCBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19zcGFyc2VfYXJlYShtYXMsIG1pbiwg bWF4LCBzaXplLCBmYWxzZSk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQg b2YgdGhlIHdpbmRvdyBjYW4gb25seSBiZSB3aXRoaW4gdGhlc2UgdmFsdWVzLiAqLw0KKwltYXMt PmluZGV4ID0gbWluOw0KKwltYXMtPmxhc3QgPSBtYXg7DQorDQorCXdoaWxlICghbWFzX3Jldl9h d2FsayhtYXMsIHNpemUpKSB7DQorCQlpZiAobGFzdCA9PSBtYXMtPm5vZGUpIHsNCisJCQlpZiAo IW1hc19yZXdpbmRfbm9kZShtYXMpKQ0KKwkJCQlyZXR1cm4gLUVCVVNZOw0KKwkJfSBlbHNlIHsN CisJCQlsYXN0ID0gbWFzLT5ub2RlOw0KKwkJfQ0KKwl9DQorDQorCWlmIChtYXNfaXNfZXJyKG1h cykpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCWlmICh1bmxpa2VseShtYXMt Pm9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RTKSkNCisJCXJldHVybiAtRUJVU1k7DQorDQorCS8q DQorCSAqIG1hc19yZXZfYXdhbGsoKSBoYXMgc2V0IG1hcy0+bWluIGFuZCBtYXMtPm1heCB0byB0 aGUgZ2FwIHZhbHVlcy4gIElmDQorCSAqIHRoZSBtYXhpbXVtIGlzIG91dHNpZGUgdGhlIHdpbmRv dyB3ZSBhcmUgc2VhcmNoaW5nLCB0aGVuIHVzZSB0aGUgbGFzdA0KKwkgKiBsb2NhdGlvbiBpbiB0 aGUgc2VhcmNoLg0KKwkgKiBtYXMtPm1heCBhbmQgbWFzLT5taW4gaXMgdGhlIHJhbmdlIG9mIHRo ZSBnYXAuDQorCSAqIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCBhcmUgY3VycmVudGx5IHNldCB0 byB0aGUgc2VhcmNoIHJhbmdlLg0KKwkgKi8NCisNCisJLyogVHJpbSB0aGUgdXBwZXIgbGltaXQg dG8gdGhlIG1heC4gKi8NCisJaWYgKG1hcy0+bWF4IDw9IG1hcy0+bGFzdCkNCisJCW1hcy0+bGFz dCA9IG1hcy0+bWF4Ow0KKw0KKwltYXMtPmluZGV4ID0gbWFzLT5sYXN0IC0gc2l6ZSArIDE7DQor CXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGludCBtYXNfYWxsb2Moc3RydWN0IG1h X3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25l ZCBsb25nICppbmRleCkNCit7DQorCXVuc2lnbmVkIGxvbmcgbWluOw0KKw0KKwltYXNfc3RhcnQo bWFzKTsNCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQlt YXNfcm9vdF9leHBhbmQobWFzLCBlbnRyeSk7DQorCQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJ CXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisNCisJCWlmICghbWFzLT5pbmRleCkNCisJCQly ZXR1cm4gbXRlX3Bpdm90KG1hcy0+bm9kZSwgMCk7DQorCQlyZXR1cm4gbXRlX3Bpdm90KG1hcy0+ bm9kZSwgMSk7DQorCX0NCisNCisJLyogTXVzdCBiZSB3YWxraW5nIGEgdHJlZS4gKi8NCisJbWFz X2F3YWxrKG1hcywgc2l6ZSk7DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4geGFf ZXJyKG1hcy0+bm9kZSk7DQorDQorCWlmIChtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RT KQ0KKwkJZ290byBub19nYXA7DQorDQorCS8qDQorCSAqIEF0IHRoaXMgcG9pbnQsIG1hcy0+bm9k ZSBwb2ludHMgdG8gdGhlIHJpZ2h0IG5vZGUgYW5kIHdlIGhhdmUgYW4NCisJICogb2Zmc2V0IHRo YXQgaGFzIGEgc3VmZmljaWVudCBnYXAuDQorCSAqLw0KKwltaW4gPSBtYXMtPm1pbjsNCisJaWYg KG1hcy0+b2Zmc2V0KQ0KKwkJbWluID0gbXRlX3Bpdm90KG1hcy0+bm9kZSwgbWFzLT5vZmZzZXQg LSAxKSArIDE7DQorDQorCWlmIChtYXMtPmluZGV4IDwgbWluKQ0KKwkJbWFzLT5pbmRleCA9IG1p bjsNCisNCisJbWFzX2ZpbGxfZ2FwKG1hcywgZW50cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRl eCk7DQorCXJldHVybiAwOw0KKw0KK25vX2dhcDoNCisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQor c3RhdGljIGlubGluZSBpbnQgbWFzX3Jldl9hbGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5z aWduZWQgbG9uZyBtaW4sDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4LCB2b2lkICplbnRyeSwNCisJ CQkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCWludCBy ZXQgPSAwOw0KKw0KKwlyZXQgPSBtYXNfZW1wdHlfYXJlYV9yZXYobWFzLCBtaW4sIG1heCwgc2l6 ZSk7DQorCWlmIChyZXQpDQorCQlyZXR1cm4gcmV0Ow0KKw0KKwlpZiAobWFzX2lzX2VycihtYXMp KQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZzZXQgPT0g TUFQTEVfTk9ERV9TTE9UUykNCisJCWdvdG8gbm9fZ2FwOw0KKw0KKwltYXNfZmlsbF9nYXAobWFz LCBlbnRyeSwgbWFzLT5vZmZzZXQsIHNpemUsIGluZGV4KTsNCisJcmV0dXJuIDA7DQorDQorbm9f Z2FwOg0KKwlyZXR1cm4gLUVCVVNZOw0KK30NCisNCisvKg0KKyAqIG1hc19kZWFkX2xlYXZlcygp IC0gTWFyayBhbGwgbGVhdmVzIG9mIGEgbm9kZSBhcyBkZWFkLg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqIEBzbG90czogUG9pbnRlciB0byB0aGUgc2xvdCBhcnJheQ0KKyAqDQorICog TXVzdCBob2xkIHRoZSB3cml0ZSBsb2NrLg0KKyAqDQorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9m IGxlYXZlcyBtYXJrZWQgYXMgZGVhZC4NCisgKi8NCitzdGF0aWMgaW5saW5lDQordW5zaWduZWQg Y2hhciBtYXNfZGVhZF9sZWF2ZXMoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgX19yY3UgKipz bG90cykNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwllbnVtIG1hcGxlX3R5cGUg dHlwZTsNCisJdm9pZCAqZW50cnk7DQorCWludCBvZmZzZXQ7DQorDQorCWZvciAob2Zmc2V0ID0g MDsgb2Zmc2V0IDwgbXRfc2xvdF9jb3VudChtYXMtPm5vZGUpOyBvZmZzZXQrKykgew0KKwkJZW50 cnkgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCXR5cGUgPSBtdGVf bm9kZV90eXBlKGVudHJ5KTsNCisJCW5vZGUgPSBtdGVfdG9fbm9kZShlbnRyeSk7DQorCQkvKiBV c2UgYm90aCBub2RlIGFuZCB0eXBlIHRvIGNhdGNoIExFICYgQkUgbWV0YWRhdGEgKi8NCisJCWlm ICghbm9kZSB8fCAhdHlwZSkNCisJCQlicmVhazsNCisNCisJCW10ZV9zZXRfbm9kZV9kZWFkKGVu dHJ5KTsNCisJCXNtcF93bWIoKTsgLyogTmVlZGVkIGZvciBSQ1UgKi8NCisJCW5vZGUtPnR5cGUg PSB0eXBlOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW29mZnNldF0sIG5vZGUpOw0KKwl9 DQorDQorCXJldHVybiBvZmZzZXQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIF9fcmN1ICoqbWFzX2Rl YWRfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgKm5leHQ7DQorCXZvaWQgX19yY3UgKipzbG90cyA9 IE5VTEw7DQorDQorCW5leHQgPSBtYXNfbW4obWFzKTsNCisJZG8gew0KKwkJbWFzLT5ub2RlID0g bWFfZW5vZGVfcHRyKG5leHQpOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJc2xvdHMgPSBt YV9zbG90cyhub2RlLCBub2RlLT50eXBlKTsNCisJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQobWFz LCBzbG90cywgb2Zmc2V0KTsNCisJCW9mZnNldCA9IDA7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFm KG5leHQtPnR5cGUpKTsNCisNCisJcmV0dXJuIHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9pZCBt dF9mcmVlX3dhbGsoc3RydWN0IHJjdV9oZWFkICpoZWFkKQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNs b3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgKnN0YXJ0Ow0KKwlzdHJ1Y3QgbWFwbGVf dHJlZSBtdDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBl Ow0KKwlNQV9TVEFURShtYXMsICZtdCwgMCwgMCk7DQorDQorCW5vZGUgPSBjb250YWluZXJfb2Yo aGVhZCwgc3RydWN0IG1hcGxlX25vZGUsIHJjdSk7DQorDQorCWlmIChtYV9pc19sZWFmKG5vZGUt PnR5cGUpKQ0KKwkJZ290byBmcmVlX2xlYWY7DQorDQorCW10X2luaXRfZmxhZ3MoJm10LCBub2Rl LT5tYV9mbGFncyk7DQorCW1hc19sb2NrKCZtYXMpOw0KKwlzdGFydCA9IG5vZGU7DQorCW1hcy5u b2RlID0gbXRfbWtfbm9kZShub2RlLCBub2RlLT50eXBlKTsNCisJc2xvdHMgPSBtYXNfZGVhZF93 YWxrKCZtYXMsIDApOw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlkbyB7DQorCQltdF9mcmVl X2J1bGsobm9kZS0+c2xvdF9sZW4sIHNsb3RzKTsNCisJCW9mZnNldCA9IG5vZGUtPnBhcmVudF9z bG90ICsgMTsNCisJCW1hcy5ub2RlID0gbm9kZS0+cGl2X3BhcmVudDsNCisJCWlmIChtYXNfbW4o Jm1hcykgPT0gbm9kZSkNCisJCQlnb3RvIHN0YXJ0X3Nsb3RzX2ZyZWU7DQorDQorCQl0eXBlID0g bXRlX25vZGVfdHlwZShtYXMubm9kZSk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2Rl KG1hcy5ub2RlKSwgdHlwZSk7DQorCQlpZiAoKG9mZnNldCA8IG10X3Nsb3RzW3R5cGVdKSAmJiAo c2xvdHNbb2Zmc2V0XSkpDQorCQkJc2xvdHMgPSBtYXNfZGVhZF93YWxrKCZtYXMsIG9mZnNldCk7 DQorDQorCQlub2RlID0gbWFzX21uKCZtYXMpOw0KKwl9IHdoaWxlICgobm9kZSAhPSBzdGFydCkg fHwgKG5vZGUtPnNsb3RfbGVuIDwgb2Zmc2V0KSk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9k ZSwgbm9kZS0+dHlwZSk7DQorCW10X2ZyZWVfYnVsayhub2RlLT5zbG90X2xlbiwgc2xvdHMpOw0K Kw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorCW1hc191bmxvY2soJm1hcyk7DQorZnJlZV9sZWFmOg0K KwltdF9mcmVlX3JjdSgmbm9kZS0+cmN1KTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIF9f cmN1ICoqbWFzX2Rlc3Ryb3lfZGVzY2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKnByZXYsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJc3RydWN0 IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCA9IG1hcy0+bm9k ZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gTlVMTDsNCisNCisJZG8gew0KKwkJbWFzLT5ub2Rl ID0gbmV4dDsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobm9k ZSwgbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpKTsNCisJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQo bWFzLCBzbG90cywgMCk7DQorCQlpZiAoKG10ZV9kZWFkX25vZGUobmV4dCkpKQ0KKwkJCW5leHQg PSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgMSk7DQorDQorCQltdGVfc2V0X25vZGVfZGVh ZChtYXMtPm5vZGUpOw0KKwkJbm9kZS0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsN CisJCW5vZGUtPnBpdl9wYXJlbnQgPSBwcmV2Ow0KKwkJbm9kZS0+cGFyZW50X3Nsb3QgPSBvZmZz ZXQ7DQorCQlvZmZzZXQgPSAwOw0KKwkJcHJldiA9IG1hcy0+bm9kZTsNCisJfSB3aGlsZSAoIW10 ZV9pc19sZWFmKG5leHQpKTsNCisNCisJcmV0dXJuIHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9p ZCBtdF9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwgdW5zaWduZWQgY2hh ciBtYV9mbGFncywNCisJCQkgICAgYm9vbCBmcmVlKQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3Rz Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpzdGFydDsNCisJc3RydWN0IG1hcGxlX3RyZWUgbXQ7DQorDQorCU1B X1NUQVRFKG1hcywgJm10LCAwLCAwKTsNCisNCisJaWYgKG10ZV9pc19sZWFmKGVub2RlKSkNCisJ CWdvdG8gZnJlZV9sZWFmOw0KKw0KKwltdF9pbml0X2ZsYWdzKCZtdCwgbWFfZmxhZ3MpOw0KKwlt YXNfbG9jaygmbWFzKTsNCisNCisJbWFzLm5vZGUgPSBzdGFydCA9IGVub2RlOw0KKwlzbG90cyA9 IG1hc19kZXN0cm95X2Rlc2NlbmQoJm1hcywgc3RhcnQsIDApOw0KKwlub2RlID0gbWFzX21uKCZt YXMpOw0KKwlkbyB7DQorCQllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJCXVuc2lnbmVkIGNoYXIg b2Zmc2V0Ow0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQsICp0bXA7DQorDQorCQlub2Rl LT5zbG90X2xlbiA9IG1hc19kZWFkX2xlYXZlcygmbWFzLCBzbG90cyk7DQorCQlpZiAoZnJlZSkN CisJCQltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNsb3RzKTsNCisJCW9mZnNldCA9IG5v ZGUtPnBhcmVudF9zbG90ICsgMTsNCisJCW1hcy5ub2RlID0gbm9kZS0+cGl2X3BhcmVudDsNCisJ CWlmIChtYXNfbW4oJm1hcykgPT0gbm9kZSkNCisJCQlnb3RvIHN0YXJ0X3Nsb3RzX2ZyZWU7DQor DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShtYXMubm9kZSk7DQorCQlzbG90cyA9IG1hX3Nsb3Rz KG10ZV90b19ub2RlKG1hcy5ub2RlKSwgdHlwZSk7DQorCQlpZiAob2Zmc2V0ID49IG10X3Nsb3Rz W3R5cGVdKQ0KKwkJCWdvdG8gbmV4dDsNCisNCisJCXRtcCA9IG1hc19zbG90X2xvY2tlZCgmbWFz LCBzbG90cywgb2Zmc2V0KTsNCisJCWlmIChtdGVfbm9kZV90eXBlKHRtcCkgJiYgbXRlX3RvX25v ZGUodG1wKSkgew0KKwkJCXBhcmVudCA9IG1hcy5ub2RlOw0KKwkJCW1hcy5ub2RlID0gdG1wOw0K KwkJCXNsb3RzID0gbWFzX2Rlc3Ryb3lfZGVzY2VuZCgmbWFzLCBwYXJlbnQsIG9mZnNldCk7DQor CQl9DQorbmV4dDoNCisJCW5vZGUgPSBtYXNfbW4oJm1hcyk7DQorCX0gd2hpbGUgKHN0YXJ0ICE9 IG1hcy5ub2RlKTsNCisNCisJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJbm9kZS0+c2xvdF9sZW4g PSBtYXNfZGVhZF9sZWF2ZXMoJm1hcywgc2xvdHMpOw0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVf YnVsayhub2RlLT5zbG90X2xlbiwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorCW1h c191bmxvY2soJm1hcyk7DQorDQorZnJlZV9sZWFmOg0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVf cmN1KCZub2RlLT5yY3UpOw0KK30NCisNCisvKg0KKyAqIG10ZV9kZXN0cm95X3dhbGsoKSAtIEZy ZWUgYSB0cmVlIG9yIHN1Yi10cmVlLg0KKyAqIEBlbm9kZSAtIHRoZSBlbmNvZGVkIG1hcGxlIG5v ZGUgKG1hcGxlX2Vub2RlKSB0byBzdGFydA0KKyAqIEBtbiAtIHRoZSB0cmVlIHRvIGZyZWUgLSBu ZWVkZWQgZm9yIG5vZGUgdHlwZXMuDQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2su DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxl X2Vub2RlICplbm9kZSwNCisJCQkJICAgIHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXN0 cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUoZW5vZGUpOw0KKw0KKwlpZiAobXRf aW5fcmN1KG10KSkgew0KKwkJbXRfZGVzdHJveV93YWxrKGVub2RlLCBtdC0+bWFfZmxhZ3MsIGZh bHNlKTsNCisJCWNhbGxfcmN1KCZub2RlLT5yY3UsIG10X2ZyZWVfd2Fsayk7DQorCX0gZWxzZSB7 DQorCQltdF9kZXN0cm95X3dhbGsoZW5vZGUsIG10LT5tYV9mbGFncywgdHJ1ZSk7DQorCX0NCit9 DQorDQorc3RhdGljIHZvaWQgbWFzX3dyX3N0b3JlX3NldHVwKHN0cnVjdCBtYV93cl9zdGF0ZSAq d3JfbWFzKQ0KK3sNCisJaWYgKCFtYXNfaXNfc3RhcnQod3JfbWFzLT5tYXMpKSB7DQorCQlpZiAo bWFzX2lzX25vbmUod3JfbWFzLT5tYXMpKSB7DQorCQkJbWFzX3Jlc2V0KHdyX21hcy0+bWFzKTsN CisJCX0gZWxzZSB7DQorCQkJd3JfbWFzLT5yX21heCA9IHdyX21hcy0+bWFzLT5tYXg7DQorCQkJ d3JfbWFzLT50eXBlID0gbXRlX25vZGVfdHlwZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCQkJaWYg KG1hc19pc19zcGFuX3dyKHdyX21hcykpDQorCQkJCW1hc19yZXNldCh3cl9tYXMtPm1hcyk7DQor CQl9DQorCX0NCisNCit9DQorDQorLyogSW50ZXJmYWNlICovDQorDQorLyoqDQorICogbWFzX3N0 b3JlKCkgLSBTdG9yZSBhbiBAZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAq IEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlLg0KKyAqDQorICogVGhlIEBtYXMtPmluZGV4IGFu ZCBAbWFzLT5sYXN0IGlzIHVzZWQgdG8gc2V0IHRoZSByYW5nZSBmb3IgdGhlIEBlbnRyeS4NCisg KiBOb3RlOiBUaGUgQG1hcyBzaG91bGQgaGF2ZSBwcmUtYWxsb2NhdGVkIGVudHJpZXMgdG8gZW5z dXJlIHRoZXJlIGlzIG1lbW9yeSB0bw0KKyAqIHN0b3JlIHRoZSBlbnRyeS4gIFBsZWFzZSBzZWUg bWFzX2V4cGVjdGVkX2VudHJpZXMoKS9tYXNfZGVzdHJveSgpIGZvciBtb3JlIGRldGFpbHMuDQor ICoNCisgKiBSZXR1cm46IHRoZSBmaXJzdCBlbnRyeSBiZXR3ZWVuIG1hcy0+aW5kZXggYW5kIG1h cy0+bGFzdCBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfc3RvcmUoc3RydWN0IG1hX3N0YXRl ICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5 KTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KKyNpZmRl ZiBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bGFzdCkN CisJCXByX2VycigiRXJyb3IgJWx1ID4gJWx1ICVwXG4iLCBtYXMtPmluZGV4LCBtYXMtPmxhc3Qs IGVudHJ5KTsNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWFzLT5pbmRleCA+IG1hcy0+bGFzdCk7 DQorCWlmIChtYXMtPmluZGV4ID4gbWFzLT5sYXN0KSB7DQorCQltYXNfc2V0X2VycihtYXMsIC1F SU5WQUwpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisjZW5kaWYNCisNCisJLyoNCisJICog U3RvcmluZyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgaW5zZXJ0IHdpdGggdGhlIGFkZGVkIGNh dmVhdCB0aGF0IGl0DQorCSAqIGNhbiBvdmVyd3JpdGUgZW50cmllcy4gIEFsdGhvdWdoIHRoaXMg c2VlbXMgc2ltcGxlIGVub3VnaCwgb25lIG1heQ0KKwkgKiB3YW50IHRvIGV4YW1pbmUgd2hhdCBo YXBwZW5zIGlmIGEgc2luZ2xlIHN0b3JlIG9wZXJhdGlvbiB3YXMgdG8NCisJICogb3ZlcndyaXRl IG11bHRpcGxlIGVudHJpZXMgd2l0aGluIGEgc2VsZi1iYWxhbmNpbmcgQi1UcmVlLg0KKwkgKi8N CisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndy X21hcyk7DQorCXJldHVybiB3cl9tYXMuY29udGVudDsNCit9DQorDQorLyoqDQorICogbWFzX3N0 b3JlX2dmcCgpIC0gU3RvcmUgYSB2YWx1ZSBpbnRvIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhl IEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zIGlmIG5lY2Vzc2FyeS4NCisgKg0KKyAq IFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGludmFsaWQgcmVxdWVzdCwgLUVOT01F TSBpZiBtZW1vcnkgY291bGQgbm90DQorICogYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtYXNf c3RvcmVfZ2ZwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0K K3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVudHJ5KTsNCisNCisJbWFzX3dyX3N0b3Jl X3NldHVwKCZ3cl9tYXMpOw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCBlbnRy eSk7DQorcmV0cnk6DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFzKTsNCisJaWYgKHVubGlr ZWx5KG1hc19ub21lbShtYXMsIGdmcCkpKQ0KKwkJZ290byByZXRyeTsNCisNCisJaWYgKHVubGlr ZWx5KG1hc19pc19lcnIobWFzKSkpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQor CXJldHVybiAwOw0KK30NCisNCisvKioNCisgKiBtYXNfc3RvcmVfcHJlYWxsb2MoKSAtIFN0b3Jl IGEgdmFsdWUgaW50byB0aGUgdHJlZSB1c2luZyBtZW1vcnkNCisgKiBwcmVhbGxvY2F0ZWQgaW4g dGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTog VGhlIGVudHJ5IHRvIHN0b3JlLg0KKyAqLw0KK3ZvaWQgbWFzX3N0b3JlX3ByZWFsbG9jKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywg bWFzLCBlbnRyeSk7DQorDQorCW1hc193cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJdHJhY2Vf bWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnko JndyX21hcyk7DQorCUJVR19PTihtYXNfaXNfZXJyKG1hcykpOw0KKwltYXNfZGVzdHJveShtYXMp Ow0KK30NCisNCisvKioNCisgKiBtYXNfcHJlYWxsb2NhdGUoKSAtIFByZWFsbG9jYXRlIGVub3Vn aCBub2RlcyBmb3IgYSBzdG9yZSBvcGVyYXRpb24NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAZW50cnk6IFRoZSBlbnRyeSB0aGF0IHdpbGwgYmUgc3RvcmVkDQorICogQGdmcDogVGhl IEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9u IHN1Y2Nlc3MsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICov DQoraW50IG1hc19wcmVhbGxvY2F0ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnks IGdmcF90IGdmcCkNCit7DQorCWludCByZXQ7DQorDQorCW1hc19ub2RlX2NvdW50X2dmcChtYXMs IDEgKyBtYXNfbXRfaGVpZ2h0KG1hcykgKiAzLCBnZnApOw0KKwlpZiAobGlrZWx5KCFtYXNfaXNf ZXJyKG1hcykpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgMCk7 DQorCXJldCA9IHhhX2VycihtYXMtPm5vZGUpOw0KKwltYXNfcmVzZXQobWFzKTsNCisJbWFzX2Rl c3Ryb3kobWFzKTsNCisJbWFzX3Jlc2V0KG1hcyk7DQorCXJldHVybiByZXQ7DQorfQ0KKw0KKy8q DQorICogbWFzX2V4cGVjdGVkX2VudHJpZXMoKSAtIFNldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9m IGVudHJpZXMgdGhhdCB3aWxsIGJlIGluc2VydGVkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0 ZQ0KKyAqIEBucl9lbnRyaWVzOiBUaGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVudHJpZXMuDQorICoN CisgKiBUaGlzIHdpbGwgYXR0ZW1wdCB0byBwcmUtYWxsb2NhdGUgZW5vdWdoIG5vZGVzIHRvIHN0 b3JlIHRoZSBleHBlY3RlZCBudW1iZXINCisgKiBvZiBlbnRyaWVzLiAgVGhlIGFsbG9jYXRpb25z IHdpbGwgb2NjdXIgdXNpbmcgdGhlIGJ1bGsgYWxsb2NhdG9yIGludGVyZmFjZQ0KKyAqIGZvciBz cGVlZC4gIFBsZWFzZSBjYWxsIG1hc19kZXN0cm95KCkgb24gdGhlIEBtYXMgYWZ0ZXIgaW5zZXJ0 aW5nIHRoZSBlbnRyaWVzDQorICogdG8gZW5zdXJlIGFueSB1bnVzZWQgbm9kZXMgYXJlIGZyZWVk Lg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxk IG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG1hc19leHBlY3RlZF9lbnRyaWVzKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG5yX2VudHJpZXMpDQorew0KKwlpbnQgbm9u bGVhZl9jYXAgPSBNQVBMRV9BUkFOR0U2NF9TTE9UUyAtIDI7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqZW5vZGUgPSBtYXMtPm5vZGU7DQorCWludCBucl9ub2RlczsNCisJaW50IHJldDsNCisNCisJ LyoNCisJICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBkdXBsaWNhdGUgYSB0cmVlIHRv IGEgbmV3IHRyZWUsIHN1Y2ggYXMNCisJICogZm9ya2luZyBhIHByb2Nlc3MgYW5kIGR1cGxpY2F0 aW5nIHRoZSBWTUFzIGZyb20gb25lIHRyZWUgdG8gYSBuZXcNCisJICogdHJlZS4gIFdoZW4gc3Vj aCBhIHNpdHVhdGlvbiBhcmlzZXMsIGl0IGlzIGtub3duIHRoYXQgdGhlIG5ldyB0cmVlIGlzDQor CSAqIG5vdCBnb2luZyB0byBiZSB1c2VkIHVudGlsIHRoZSBlbnRpcmUgdHJlZSBpcyBwb3B1bGF0 ZWQuICBGb3INCisJICogcGVyZm9ybWFuY2UgcmVhc29ucywgaXQgaXMgYmVzdCB0byB1c2UgYSBi dWxrIGxvYWQgd2l0aCBSQ1UgZGlzYWJsZWQuDQorCSAqIFRoaXMgYWxsb3dzIGZvciBvcHRpbWlz dGljIHNwbGl0dGluZyB0aGF0IGZhdm91cnMgdGhlIGxlZnQgYW5kIHJldXNlDQorCSAqIG9mIG5v ZGVzIGR1cmluZyB0aGUgb3BlcmF0aW9uLg0KKwkgKi8NCisNCisJLyogT3B0aW1pemUgc3BsaXR0 aW5nIGZvciBidWxrIGluc2VydCBpbi1vcmRlciAqLw0KKwltYXMtPm1hc19mbGFncyB8PSBNQV9T VEFURV9CVUxLOw0KKw0KKwkvKg0KKwkgKiBBdm9pZCBvdmVyZmxvdywgYXNzdW1lIGEgZ2FwIGJl dHdlZW4gZWFjaCBlbnRyeSBhbmQgYSB0cmFpbGluZyBudWxsLg0KKwkgKiBJZiB0aGlzIGlzIHdy b25nLCBpdCBqdXN0IG1lYW5zIGFsbG9jYXRpb24gY2FuIGhhcHBlbiBkdXJpbmcNCisJICogaW5z ZXJ0aW9uIG9mIGVudHJpZXMuDQorCSAqLw0KKwlucl9ub2RlcyA9IG1heChucl9lbnRyaWVzLCBu cl9lbnRyaWVzICogMiArIDEpOw0KKw0KKwlpZiAoIW10X2lzX2FsbG9jKG1hcy0+dHJlZSkpDQor CQlub25sZWFmX2NhcCA9IE1BUExFX1JBTkdFNjRfU0xPVFMgLSAyOw0KKw0KKwkvKiBMZWF2ZXMg Ki8NCisJbnJfbm9kZXMgPSBESVZfUk9VTkRfVVAobnJfbm9kZXMsIE1BUExFX1JBTkdFNjRfU0xP VFMgLSAxKTsNCisJLyogSW50ZXJuYWwgbm9kZXMgKi8NCisJbnJfbm9kZXMgKz0gRElWX1JPVU5E X1VQKG5yX25vZGVzLCBub25sZWFmX2NhcCk7DQorCW1hc19ub2RlX2NvdW50KG1hcywgbnJfbm9k ZXMpOw0KKw0KKwlpZiAoIW1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlyZXQg PSB4YV9lcnIobWFzLT5ub2RlKTsNCisJbWFzLT5ub2RlID0gZW5vZGU7DQorCXJldHVybiByZXQ7 DQorDQorfQ0KKw0KKy8qDQorICogbWFzX2Rlc3Ryb3koKSAtIGRlc3Ryb3kgYSBtYXBsZSBzdGF0 ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFVwb24gY29tcGxldGlvbiwg Y2hlY2sgdGhlIGxlZnQtbW9zdCBub2RlIGFuZCByZWJhbGFuY2UgYWdhaW5zdCB0aGUgbm9kZSB0 bw0KKyAqIHRoZSByaWdodCBpZiBuZWNlc3NhcnkuICBGcmVlcyBhbnkgYWxsb2NhdGVkIG5vZGVz IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcGxlDQorICogc3RhdGUuDQorICovDQordm9pZCBtYXNf ZGVzdHJveShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAq bm9kZTsNCisNCisJLyoNCisJICogV2hlbiB1c2luZyBtYXNfZm9yX2VhY2goKSB0byBpbnNlcnQg YW4gZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzLA0KKwkgKiBpdCBpcyBwb3NzaWJsZSB0aGF0 IHRoZSBudW1iZXIgaW5zZXJ0ZWQgaXMgbGVzcyB0aGFuIHRoZSBleHBlY3RlZA0KKwkgKiBudW1i ZXIuICBUbyBmaXggYW4gaW52YWxpZCBmaW5hbCBub2RlLCBhIGNoZWNrIGlzIHBlcmZvcm1lZCBo ZXJlIHRvDQorCSAqIHJlYmFsYW5jZSB0aGUgcHJldmlvdXMgbm9kZSB3aXRoIHRoZSBmaW5hbCBu b2RlLg0KKwkgKi8NCisJaWYgKG1hcy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfUkVCQUxBTkNFKSB7 DQorCQl1bnNpZ25lZCBjaGFyIGVuZDsNCisNCisJCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJ CQltYXNfc3RhcnQobWFzKTsNCisNCisJCW10cmVlX3JhbmdlX3dhbGsobWFzKTsNCisJCWVuZCA9 IG1hc19kYXRhX2VuZChtYXMpICsgMTsNCisJCWlmIChlbmQgPCBtdF9taW5fc2xvdF9jb3VudCht YXMtPm5vZGUpIC0gMSkNCisJCQltYXNfZGVzdHJveV9yZWJhbGFuY2UobWFzLCBlbmQpOw0KKw0K KwkJbWFzLT5tYXNfZmxhZ3MgJj0gfk1BX1NUQVRFX1JFQkFMQU5DRTsNCisJfQ0KKwltYXMtPm1h c19mbGFncyAmPSB+TUFfU1RBVEVfQlVMSzsNCisNCisJd2hpbGUgKG1hcy0+YWxsb2MgJiYgISgo dW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkgew0KKwkJbm9kZSA9IG1hcy0+YWxsb2M7 DQorCQltYXMtPmFsbG9jID0gbm9kZS0+c2xvdFswXTsNCisJCWlmIChub2RlLT5ub2RlX2NvdW50 ID4gMCkNCisJCQltdF9mcmVlX2J1bGsobm9kZS0+bm9kZV9jb3VudCwNCisJCQkJICAgICAodm9p ZCBfX3JjdSAqKikmbm9kZS0+c2xvdFsxXSk7DQorCQlrbWVtX2NhY2hlX2ZyZWUobWFwbGVfbm9k ZV9jYWNoZSwgbm9kZSk7DQorCX0NCisJbWFzLT5hbGxvYyA9IE5VTEw7DQorfQ0KKw0KKy8qKg0K KyAqIG1hc19uZXh0KCkgLSBHZXQgdGhlIG5leHQgZW50cnkuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2suDQorICoNCisgKiBS ZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGFmdGVyIEBtYXMtPmluZGV4Lg0KKyAqIE11c3QgaG9sZCBy Y3VfcmVhZF9sb2NrIG9yIHRoZSB3cml0ZSBsb2NrLg0KKyAqIENhbiByZXR1cm4gdGhlIHplcm8g ZW50cnkuDQorICoNCisgKiBSZXR1cm46IFRoZSBuZXh0IGVudHJ5IG9yICVOVUxMDQorICovDQor dm9pZCAqbWFzX25leHQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0K K3sNCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFz LT5ub2RlID0gTUFTX1NUQVJUOw0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQltYXNf d2FsayhtYXMpOyAvKiBSZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfd2FsayAq Lw0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJ CQltYXMtPmluZGV4ID0gMTsNCisJCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCQl9DQorCQly ZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAobWFzLT5sYXN0ID09IFVMT05HX01BWCkNCisJCXJl dHVybiBOVUxMOw0KKw0KKwkvKiBSZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNf bmV4dF9lbnRyeSAqLw0KKwlyZXR1cm4gbWFzX25leHRfZW50cnkobWFzLCBtYXgpOw0KK30NCitF WFBPUlRfU1lNQk9MX0dQTChtYXNfbmV4dCk7DQorDQorLyoqDQorICogbXRfbmV4dCgpIC0gZ2V0 IHRoZSBuZXh0IHZhbHVlIGluIHRoZSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJl ZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGluZGV4DQorICogQG1heDogVGhlIG1heGltdW0gaW5k ZXggdG8gY2hlY2sNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IGF0IEBpbmRleCBvciBoaWdo ZXIsIG9yICVOVUxMIGlmIG5vdGhpbmcgaXMgZm91bmQuDQorICovDQordm9pZCAqbXRfbmV4dChz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcg bWF4KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKwlNQV9TVEFURShtYXMsIG10LCBpbmRl eCwgaW5kZXgpOw0KKw0KKwlyY3VfcmVhZF9sb2NrKCk7DQorCWVudHJ5ID0gbWFzX25leHQoJm1h cywgbWF4KTsNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQ T1JUX1NZTUJPTF9HUEwobXRfbmV4dCk7DQorDQorLyoqDQorICogbWFzX3ByZXYoKSAtIEdldCB0 aGUgcHJldmlvdXMgZW50cnkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBU aGUgbWluaW11bSB2YWx1ZSB0byBjaGVjay4NCisgKg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9s b2NrIG9yIHRoZSB3cml0ZSBsb2NrLg0KKyAqIFdpbGwgcmVzZXQgbWFzIHRvIE1BU19TVEFSVCBp ZiB0aGUgbm9kZSBpcyBNQVNfTk9ORS4gIFdpbGwgc3RvcCBvbiBub3QNCisgKiBzZWFyY2hhYmxl IG5vZGVzLg0KKyAqDQorICogUmV0dXJuOiB0aGUgcHJldmlvdXMgdmFsdWUgb3IgJU5VTEwuDQor ICovDQordm9pZCAqbWFzX3ByZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcg bWluKQ0KK3sNCisJaWYgKCFtYXMtPmluZGV4KSB7DQorCQkvKiBOb3RoaW5nIGNvbWVzIGJlZm9y ZSAwICovDQorCQltYXMtPmxhc3QgPSAwOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJaWYg KHVubGlrZWx5KG1hc19pc19wdHIobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1h c19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2RlID0gTUFT X1NUQVJUOw0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpIHsNCisJCW1hc193YWxrKG1hcyk7 DQorCQlpZiAoIW1hcy0+aW5kZXgpDQorCQkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJaWYgKG1h c19pc19wdHIobWFzKSkgew0KKwkJaWYgKCFtYXMtPmluZGV4KSB7DQorCQkJbWFzLT5sYXN0ID0g MDsNCisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisNCisJCW1hcy0+aW5kZXggPSBtYXMtPmxhc3Qg PSAwOw0KKwkJcmV0dXJuIG1hc19yb290X2xvY2tlZChtYXMpOw0KKwl9DQorCXJldHVybiBtYXNf cHJldl9lbnRyeShtYXMsIG1pbik7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19wcmV2KTsN CisNCisvKioNCisgKiBtdF9wcmV2KCkgLSBnZXQgdGhlIHByZXZpb3VzIHZhbHVlIGluIHRoZSBt YXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0 IGluZGV4DQorICogQG1pbjogVGhlIG1pbmltdW0gaW5kZXggdG8gY2hlY2sNCisgKg0KKyAqIFJl dHVybjogVGhlIGVudHJ5IGF0IEBpbmRleCBvciBsb3dlciwgb3IgJU5VTEwgaWYgbm90aGluZyBp cyBmb3VuZC4NCisgKi8NCit2b2lkICptdF9wcmV2KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5z aWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwl2b2lkICplbnRyeSA9 IE5VTEw7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorDQorCXJjdV9yZWFk X2xvY2soKTsNCisJZW50cnkgPSBtYXNfcHJldigmbWFzLCBtaW4pOw0KKwlyY3VfcmVhZF91bmxv Y2soKTsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtdF9wcmV2KTsN CisNCisvKioNCisgKiBtYXNfcGF1c2UoKSAtIFBhdXNlIGEgbWFzX2ZpbmQvbWFzX2Zvcl9lYWNo IHRvIGRyb3AgdGhlIGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlIHRvIHBhdXNlDQor ICoNCisgKiBTb21lIHVzZXJzIG5lZWQgdG8gcGF1c2UgYSB3YWxrIGFuZCBkcm9wIHRoZSBsb2Nr IHRoZXkncmUgaG9sZGluZyBpbg0KKyAqIG9yZGVyIHRvIHlpZWxkIHRvIGEgaGlnaGVyIHByaW9y aXR5IHRocmVhZCBvciBjYXJyeSBvdXQgYW4gb3BlcmF0aW9uDQorICogb24gYW4gZW50cnkuICBU aG9zZSB1c2VycyBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB0aGV5IGRyb3ANCisg KiB0aGUgbG9jay4gIEl0IHJlc2V0cyB0aGUgQG1hcyB0byBiZSBzdWl0YWJsZSBmb3IgdGhlIG5l eHQgaXRlcmF0aW9uDQorICogb2YgdGhlIGxvb3AgYWZ0ZXIgdGhlIHVzZXIgaGFzIHJlYWNxdWly ZWQgdGhlIGxvY2suICBJZiBtb3N0IGVudHJpZXMNCisgKiBmb3VuZCBkdXJpbmcgYSB3YWxrIHJl cXVpcmUgeW91IHRvIGNhbGwgbWFzX3BhdXNlKCksIHRoZSBtdF9mb3JfZWFjaCgpDQorICogaXRl cmF0b3IgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUuDQorICoNCisgKi8NCit2b2lkIG1hc19wYXVz ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCW1hcy0+bm9kZSA9IE1BU19QQVVTRTsNCit9 DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX3BhdXNlKTsNCisNCisvKioNCisgKiBtYXNfZmluZCgp IC0gT24gdGhlIGZpcnN0IGNhbGwsIGZpbmQgdGhlIGVudHJ5IGF0IG9yIGFmdGVyIG1hcy0+aW5k ZXggdXAgdG8NCisgKiAlbWF4LiAgT3RoZXJ3aXNlLCBmaW5kIHRoZSBlbnRyeSBhZnRlciBtYXMt PmluZGV4Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVt IHZhbHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhl IHdyaXRlIGxvY2suDQorICogSWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0IGFuZCBpbmRleCBhcmUg dXBkYXRlZCBhY2NvcmRpbmdseS4NCisgKiBNYXkgc2V0IEBtYXMtPm5vZGUgdG8gTUFTX05PTkUu DQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNf ZmluZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwlpZiAo dW5saWtlbHkobWFzX2lzX3BhdXNlZChtYXMpKSkgew0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bGFz dCA9PSBVTE9OR19NQVgpKSB7DQorCQkJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCQkJcmV0dXJu IE5VTEw7DQorCQl9DQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCQltYXMtPmluZGV4ID0g KyttYXMtPmxhc3Q7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KG1hc19pc19zdGFydChtYXMpKSkg ew0KKwkJLyogRmlyc3QgcnVuIG9yIGNvbnRpbnVlICovDQorCQl2b2lkICplbnRyeTsNCisNCisJ CWlmIChtYXMtPmluZGV4ID4gbWF4KQ0KKwkJCXJldHVybiBOVUxMOw0KKw0KKwkJZW50cnkgPSBt YXNfd2FsayhtYXMpOw0KKwkJaWYgKGVudHJ5KQ0KKwkJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0K KwlpZiAodW5saWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykpKQ0KKwkJcmV0dXJuIE5VTEw7DQor DQorCS8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICov DQorCXJldHVybiBtYXNfbmV4dF9lbnRyeShtYXMsIG1heCk7DQorfQ0KKw0KKy8qKg0KKyAqIG1h c19maW5kX3JldjogT24gdGhlIGZpcnN0IGNhbGwsIGZpbmQgdGhlIGZpcnN0IG5vbi1udWxsIGVu dHJ5IGF0IG9yIGJlbG93DQorICogbWFzLT5pbmRleCBkb3duIHRvICVtaW4uICBPdGhlcndpc2Ug ZmluZCB0aGUgZmlyc3Qgbm9uLW51bGwgZW50cnkgYmVsb3cNCisgKiBtYXMtPmluZGV4IGRvd24g dG8gJW1pbi4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBUaGUgbWluaW11 bSB2YWx1ZSB0byBjaGVjay4NCisgKg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9sb2NrIG9yIHRo ZSB3cml0ZSBsb2NrLg0KKyAqIElmIGFuIGVudHJ5IGV4aXN0cywgbGFzdCBhbmQgaW5kZXggYXJl IHVwZGF0ZWQgYWNjb3JkaW5nbHkuDQorICogTWF5IHNldCBAbWFzLT5ub2RlIHRvIE1BU19OT05F Lg0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgb3IgJU5VTEwuDQorICovDQordm9pZCAqbWFz X2ZpbmRfcmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQor CWlmICh1bmxpa2VseShtYXNfaXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtlbHkobWFz LT5sYXN0ID09IFVMT05HX01BWCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCQly ZXR1cm4gTlVMTDsNCisJCX0NCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1hcy0+bGFz dCA9IC0tbWFzLT5pbmRleDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0YXJ0KG1h cykpKSB7DQorCQkvKiBGaXJzdCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQgKmVudHJ5Ow0K Kw0KKwkJaWYgKG1hcy0+aW5kZXggPCBtaW4pDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQllbnRy eSA9IG1hc193YWxrKG1hcyk7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKwl9 DQorDQorCWlmICh1bmxpa2VseSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1cm4gTlVM TDsNCisNCisJaWYgKG1hcy0+aW5kZXggPCBtaW4pDQorCQlyZXR1cm4gTlVMTDsNCisNCisJLyog UmV0cmllcyBvbiBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25leHRfZW50cnkgKi8NCisJcmV0 dXJuIG1hc19wcmV2X2VudHJ5KG1hcywgbWluKTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFz X2ZpbmQpOw0KKw0KKy8qKg0KKyAqIG1hc19lcmFzZSgpIC0gRmluZCB0aGUgcmFuZ2UgaW4gd2hp Y2ggaW5kZXggcmVzaWRlcyBhbmQgZXJhc2UgdGhlIGVudGlyZQ0KKyAqIHJhbmdlLg0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogTXVzdCBob2xkIHRoZSB3cml0ZSBsb2NrLg0K KyAqIFNlYXJjaGVzIGZvciBAbWFzLT5pbmRleCwgc2V0cyBAbWFzLT5pbmRleCBhbmQgQG1hcy0+ bGFzdCB0byB0aGUgcmFuZ2UgYW5kDQorICogZXJhc2VzIHRoYXQgcmFuZ2UuDQorICoNCisgKiBS ZXR1cm46IHRoZSBlbnRyeSB0aGF0IHdhcyBlcmFzZWQgb3IgJU5VTEwsIEBtYXMtPmluZGV4IGFu ZCBAbWFzLT5sYXN0IGFyZSB1cGRhdGVkLg0KKyAqLw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQgKmVudHJ5Ow0KKwlNQV9XUl9TVEFURSh3cl9tYXMs IG1hcywgTlVMTCk7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wYXVzZWQo bWFzKSkNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisNCisJLyogUmV0cnkgdW5uZWNlc3Nh cnkgd2hlbiBob2xkaW5nIHRoZSB3cml0ZSBsb2NrLiAqLw0KKwllbnRyeSA9IG1hc19zdGF0ZV93 YWxrKG1hcyk7DQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCit3cml0ZV9yZXRy eToNCisJLyogTXVzdCByZXNldCB0byBlbnN1cmUgc3Bhbm5pbmcgd3JpdGVzIG9mIGxhc3Qgc2xv dCBhcmUgZGV0ZWN0ZWQgKi8NCisJbWFzX3Jlc2V0KG1hcyk7DQorCW1hc193cl9zdG9yZV9zZXR1 cCgmd3JfbWFzKTsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlpZiAobWFzX25v bWVtKG1hcywgR0ZQX0tFUk5FTCkpDQorCQlnb3RvIHdyaXRlX3JldHJ5Ow0KKw0KKwlyZXR1cm4g ZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19lcmFzZSk7DQorDQorLyoqDQorICog bWFzX25vbWVtKCkgLSBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgYWxsb2NhdGluZyBhbmQg ZG8gdGhlIGFsbG9jYXRpb24NCisgKiBpZiBuZWNlc3NhcnkgSWYgdGhlcmUgYXJlIGFsbG9jYXRp b25zLCB0aGVuIGZyZWUgdGhlbS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZ2Zw OiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMNCisgKiBSZXR1cm46IHRydWUg b24gYWxsb2NhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK2Jvb2wgbWFzX25vbWVtKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCBnZnBfdCBnZnApDQorCV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+ bG9jaykNCit7DQorCWlmIChsaWtlbHkobWFzLT5ub2RlICE9IE1BX0VSUk9SKC1FTk9NRU0pKSkg ew0KKwkJbWFzX2Rlc3Ryb3kobWFzKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlpZiAo Z2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSAmJiAhbXRfZXh0ZXJuYWxfbG9jayhtYXMtPnRy ZWUpKSB7DQorCQltdHJlZV91bmxvY2sobWFzLT50cmVlKTsNCisJCW1hc19hbGxvY19ub2Rlcyht YXMsIGdmcCk7DQorCQltdHJlZV9sb2NrKG1hcy0+dHJlZSk7DQorCX0gZWxzZSB7DQorCQltYXNf YWxsb2Nfbm9kZXMobWFzLCBnZnApOw0KKwl9DQorDQorCWlmICghbWFzX2FsbG9jYXRlZChtYXMp KQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCXJldHVy biB0cnVlOw0KK30NCisNCit2b2lkIF9faW5pdCBtYXBsZV90cmVlX2luaXQodm9pZCkNCit7DQor CW1hcGxlX25vZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibWFwbGVfbm9kZSIsDQorCQkJ c2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSwNCisJ CQlTTEFCX1BBTklDLCBOVUxMKTsNCit9DQorDQorLyoqDQorICogbXRyZWVfbG9hZCgpIC0gTG9h ZCBhIHZhbHVlIHN0b3JlZCBpbiBhIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVl DQorICogQGluZGV4OiBUaGUgaW5kZXggdG8gbG9hZA0KKyAqDQorICogUmV0dXJuOiB0aGUgZW50 cnkgb3IgJU5VTEwNCisgKi8NCit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICpt dCwgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBp bmRleCk7DQorCXZvaWQgKmVudHJ5Ow0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFz KTsNCisJcmN1X3JlYWRfbG9jaygpOw0KK3JldHJ5Og0KKwllbnRyeSA9IG1hc19zdGFydCgmbWFz KTsNCisJaWYgKHVubGlrZWx5KG1hc19pc19ub25lKCZtYXMpKSkNCisJCWdvdG8gdW5sb2NrOw0K Kw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3B0cigmbWFzKSkpIHsNCisJCWlmIChpbmRleCkNCisJ CQllbnRyeSA9IE5VTEw7DQorDQorCQlnb3RvIHVubG9jazsNCisJfQ0KKw0KKwllbnRyeSA9IG10 cmVlX2xvb2t1cF93YWxrKCZtYXMpOw0KKwlpZiAoIWVudHJ5ICYmIHVubGlrZWx5KG1hc19pc19z dGFydCgmbWFzKSkpDQorCQlnb3RvIHJldHJ5Ow0KK3VubG9jazoNCisJcmN1X3JlYWRfdW5sb2Nr KCk7DQorCWlmICh4YV9pc196ZXJvKGVudHJ5KSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyZXR1 cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfbG9hZCk7DQorDQorLyoqDQorICog bXRyZWVfc3RvcmVfcmFuZ2UoKSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEgZ2l2ZW4gcmFuZ2UuDQor ICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IG9mIHRoZSByYW5n ZQ0KKyAqIEBsYXN0OiBUaGUgZW5kIG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5 IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25z DQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVl c3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8N CitpbnQgbXRyZWVfc3RvcmVfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBs b25nIGluZGV4LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2Zw KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGxhc3QpOw0KKwlNQV9XUl9TVEFURSh3 cl9tYXMsICZtYXMsIGVudHJ5KTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sICZtYXMs IDAsIGVudHJ5KTsNCisJaWYgKFdBUk5fT05fT05DRSh4YV9pc19hZHZhbmNlZChlbnRyeSkpKQ0K KwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChpbmRleCA+IGxhc3QpDQorCQlyZXR1cm4gLUVJ TlZBTDsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorcmV0cnk6DQorCW1hc193cl9zdG9yZV9lbnRy eSgmd3JfbWFzKTsNCisJaWYgKG1hc19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsN CisNCisJbXRyZWVfdW5sb2NrKG10KTsNCisJaWYgKG1hc19pc19lcnIoJm1hcykpDQorCQlyZXR1 cm4geGFfZXJyKG1hcy5ub2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wo bXRyZWVfc3RvcmVfcmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX3N0b3JlKCkgLSBTdG9yZSBh biBlbnRyeSBhdCBhIGdpdmVuIGluZGV4Lg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBA aW5kZXg6IFRoZSBpbmRleCB0byBzdG9yZSB0aGUgdmFsdWUNCisgKiBAZW50cnk6IFRoZSBlbnRy eSB0byBzdG9yZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9u cw0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCByZXF1 ZXN0LCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QNCisgKiBiZSBhbGxvY2F0ZWQuDQorICov DQoraW50IG10cmVlX3N0b3JlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBp bmRleCwgdm9pZCAqZW50cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVlX3N0 b3JlX3JhbmdlKG10LCBpbmRleCwgaW5kZXgsIGVudHJ5LCBnZnApOw0KK30NCitFWFBPUlRfU1lN Qk9MKG10cmVlX3N0b3JlKTsNCisNCisvKioNCisgKiBtdHJlZV9pbnNlcnRfcmFuZ2UoKSAtIElu c2VydCBhbiBlbnRyeSBhdCBhIGdpdmUgcmFuZ2UgaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICog QG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBmaXJzdDogVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQ0K KyAqIEBsYXN0OiBUaGUgZW5kIG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRv IHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0K KyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlmIHRoZSByYW5nZSBpcyBv Y2N1cGllZCwgLUVJTlZBTCBvbiBpbnZhbGlkDQorICogcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1v cnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfaW5zZXJ0X3Jhbmdl KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBmaXJzdCwNCisJCXVuc2lnbmVk IGxvbmcgbGFzdCwgdm9pZCAqZW50cnksIGdmcF90IGdmcCkNCit7DQorCU1BX1NUQVRFKG1zLCBt dCwgZmlyc3QsIGxhc3QpOw0KKw0KKwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVu dHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKGZpcnN0ID4gbGFzdCkNCisJCXJl dHVybiAtRUlOVkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFzX2luc2Vy dCgmbXMsIGVudHJ5KTsNCisJaWYgKG1hc19ub21lbSgmbXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5 Ow0KKw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwlpZiAobWFzX2lzX2VycigmbXMpKQ0KKwkJcmV0 dXJuIHhhX2Vycihtcy5ub2RlKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wo bXRyZWVfaW5zZXJ0X3JhbmdlKTsNCisNCisvKioNCisgKiBtdHJlZV9pbnNlcnQoKSAtIEluc2Vy dCBhbiBlbnRyeSBhdCBhIGdpdmUgaW5kZXggaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICogQG10 OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleCA6IFRoZSBpbmRleCB0byBzdG9yZSB0aGUgdmFs dWUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqIEBnZnA6IFRoZSBGR1BfRkxB R1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucy4NCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNz LCAtRUVYSVNUUyBpZiB0aGUgcmFuZ2UgaXMgb2NjdXBpZWQsIC1FSU5WQUwgb24gaW52YWxpZA0K KyAqIHJlcXVlc3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQor ICovDQoraW50IG10cmVlX2luc2VydChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxv bmcgaW5kZXgsIHZvaWQgKmVudHJ5LA0KKwkJIGdmcF90IGdmcCkNCit7DQorCXJldHVybiBtdHJl ZV9pbnNlcnRfcmFuZ2UobXQsIGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9S VF9TWU1CT0wobXRyZWVfaW5zZXJ0KTsNCisNCitpbnQgbXRyZWVfYWxsb2NfcmFuZ2Uoc3RydWN0 IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwg dW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcg bWF4LCBnZnBfdCBnZnApDQorew0KKwlpbnQgcmV0ID0gMDsNCisNCisJTUFfU1RBVEUobWFzLCBt dCwgbWluLCBtYXggLSBzaXplKTsNCisJaWYgKCFtdF9pc19hbGxvYyhtdCkpDQorCQlyZXR1cm4g LUVJTlZBTDsNCisNCisJaWYgKFdBUk5fT05fT05DRShtdF9pc19yZXNlcnZlZChlbnRyeSkpKQ0K KwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChtaW4gPiBtYXgpDQorCQlyZXR1cm4gLUVJTlZB TDsNCisNCisJaWYgKG1heCA8IHNpemUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFz aXplKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0K KwltYXMub2Zmc2V0ID0gMDsNCisJbWFzLmluZGV4ID0gbWluOw0KKwltYXMubGFzdCA9IG1heCAt IHNpemU7DQorCXJldCA9IG1hc19hbGxvYygmbWFzLCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJ aWYgKG1hc19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5s b2NrKG10KTsNCisJcmV0dXJuIHJldDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9hbGxvY19y YW5nZSk7DQorDQoraW50IG10cmVlX2FsbG9jX3JyYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHVuc2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHNp emUsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdmcCkN Cit7DQorCWludCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAtIHNp emUpOw0KKwlpZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlp ZiAoV0FSTl9PTl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJTlZB TDsNCisNCisJaWYgKG1pbiA+PSBtYXgpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKG1h eCA8IHNpemUgLSAxKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmICghc2l6ZSkNCisJCXJl dHVybiAtRUlOVkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJcmV0ID0gbWFz X3Jldl9hbGxvYygmbWFzLCBtaW4sIG1heCwgZW50cnksIHNpemUsIHN0YXJ0cCk7DQorCWlmICht YXNfbm9tZW0oJm1hcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVlX3VubG9jayht dCk7DQorCXJldHVybiByZXQ7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfYWxsb2NfcnJhbmdl KTsNCisNCisvKioNCisgKiBtdHJlZV9lcmFzZSgpIC0gRmluZCBhbiBpbmRleCBhbmQgZXJhc2Ug dGhlIGVudGlyZSByYW5nZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBU aGUgaW5kZXggdG8gZXJhc2UNCisgKg0KKyAqIEVyYXNpbmcgaXMgdGhlIHNhbWUgYXMgYSB3YWxr IHRvIGFuIGVudHJ5IHRoZW4gYSBzdG9yZSBvZiBhIE5VTEwgdG8gdGhhdA0KKyAqIEVOVElSRSBy YW5nZS4gIEluIGZhY3QsIGl0IGlzIGltcGxlbWVudGVkIGFzIHN1Y2ggdXNpbmcgdGhlIGFkdmFu Y2VkIEFQSS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCB0aGUgQGluZGV4 IG9yICVOVUxMDQorICovDQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB1bnNpZ25lZCBsb25nIGluZGV4KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKw0KKwlN QV9TVEFURShtYXMsIG10LCBpbmRleCwgaW5kZXgpOw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywg Jm1hcyk7DQorDQorCW10cmVlX2xvY2sobXQpOw0KKwllbnRyeSA9IG1hc19lcmFzZSgmbWFzKTsN CisJbXRyZWVfdW5sb2NrKG10KTsNCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lN Qk9MKG10cmVlX2VyYXNlKTsNCisNCisvKioNCisgKiBfX210X2Rlc3Ryb3koKSAtIFdhbGsgYW5k IGZyZWUgYWxsIG5vZGVzIG9mIGEgbG9ja2VkIG1hcGxlIHRyZWUuDQorICogQG10OiBUaGUgbWFw bGUgdHJlZQ0KKyAqDQorICogTm90ZTogRG9lcyBub3QgaGFuZGxlIGxvY2tpbmcuDQorICovDQor dm9pZCBfX210X2Rlc3Ryb3koc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqcm9v dCA9IG10X3Jvb3RfbG9ja2VkKG10KTsNCisNCisJcmN1X2Fzc2lnbl9wb2ludGVyKG10LT5tYV9y b290LCBOVUxMKTsNCisJaWYgKHhhX2lzX25vZGUocm9vdCkpDQorCQltdGVfZGVzdHJveV93YWxr KHJvb3QsIG10KTsNCisNCisJbXQtPm1hX2ZsYWdzID0gMDsNCit9DQorRVhQT1JUX1NZTUJPTF9H UEwoX19tdF9kZXN0cm95KTsNCisNCisvKioNCisgKiBtdHJlZV9kZXN0cm95KCkgLSBEZXN0cm95 IGEgbWFwbGUgdHJlZQ0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKg0KKyAqIEZyZWVzIGFs bCByZXNvdXJjZXMgdXNlZCBieSB0aGUgdHJlZS4gIEhhbmRsZXMgbG9ja2luZy4NCisgKi8NCit2 b2lkIG10cmVlX2Rlc3Ryb3koc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJbXRyZWVfbG9j ayhtdCk7DQorCV9fbXRfZGVzdHJveShtdCk7DQorCW10cmVlX3VubG9jayhtdCk7DQorfQ0KK0VY UE9SVF9TWU1CT0wobXRyZWVfZGVzdHJveSk7DQorDQorLyoqDQorICogbXRfZmluZCgpIC0gU2Vh cmNoIGZyb20gdGhlIHN0YXJ0IHVwIHVudGlsIGFuIGVudHJ5IGlzIGZvdW5kLg0KKyAqIEBtdDog VGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFBvaW50ZXIgd2hpY2ggY29udGFpbnMgdGhlIHN0 YXJ0IGxvY2F0aW9uIG9mIHRoZSBzZWFyY2gNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0 byBjaGVjaw0KKyAqDQorICogSGFuZGxlcyBsb2NraW5nLiAgQGluZGV4IHdpbGwgYmUgaW5jcmVt ZW50ZWQgdG8gb25lIGJleW9uZCB0aGUgcmFuZ2UuDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRy eSBhdCBvciBhZnRlciB0aGUgQGluZGV4IG9yICVOVUxMDQorICovDQordm9pZCAqbXRfZmluZChz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LCB1bnNpZ25lZCBsb25n IG1heCkNCit7DQorCU1BX1NUQVRFKG1hcywgbXQsICppbmRleCwgKmluZGV4KTsNCisJdm9pZCAq ZW50cnk7DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorCXVuc2lnbmVkIGxvbmcg Y29weSA9ICppbmRleDsNCisjZW5kaWYNCisNCisJdHJhY2VfbWFfcmVhZChfX2Z1bmNfXywgJm1h cyk7DQorDQorCWlmICgoKmluZGV4KSA+IG1heCkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyY3Vf cmVhZF9sb2NrKCk7DQorcmV0cnk6DQorCWVudHJ5ID0gbWFzX3N0YXRlX3dhbGsoJm1hcyk7DQor CWlmIChtYXNfaXNfc3RhcnQoJm1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlpZiAodW5saWtl bHkoeGFfaXNfemVybyhlbnRyeSkpKQ0KKwkJZW50cnkgPSBOVUxMOw0KKw0KKwlpZiAoZW50cnkp DQorCQlnb3RvIHVubG9jazsNCisNCisJd2hpbGUgKG1hc19zZWFyY2hhYmxlKCZtYXMpICYmICht YXMuaW5kZXggPCBtYXgpKSB7DQorCQllbnRyeSA9IG1hc19uZXh0X2VudHJ5KCZtYXMsIG1heCk7 DQorCQlpZiAobGlrZWx5KGVudHJ5ICYmICF4YV9pc196ZXJvKGVudHJ5KSkpDQorCQkJYnJlYWs7 DQorCX0NCisNCisJaWYgKHVubGlrZWx5KHhhX2lzX3plcm8oZW50cnkpKSkNCisJCWVudHJ5ID0g TlVMTDsNCit1bmxvY2s6DQorCXJjdV9yZWFkX3VubG9jaygpOw0KKwlpZiAobGlrZWx5KGVudHJ5 KSkgew0KKwkJKmluZGV4ID0gbWFzLmxhc3QgKyAxOw0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQ TEVfVFJFRQ0KKwkJaWYgKCgqaW5kZXgpICYmICgqaW5kZXgpIDw9IGNvcHkpDQorCQkJcHJfZXJy KCJpbmRleCBub3QgaW5jcmVhc2VkISAlbHggPD0gJWx4XG4iLA0KKwkJCSAgICAgICAqaW5kZXgs IGNvcHkpOw0KKwkJTVRfQlVHX09OKG10LCAoKmluZGV4KSAmJiAoKCppbmRleCkgPD0gY29weSkp Ow0KKyNlbmRpZg0KKwl9DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTCht dF9maW5kKTsNCisNCisvKioNCisgKiBtdF9maW5kX2FmdGVyKCkgLSBTZWFyY2ggZnJvbSB0aGUg c3RhcnQgdXAgdW50aWwgYW4gZW50cnkgaXMgZm91bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJl ZQ0KKyAqIEBpbmRleDogUG9pbnRlciB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgbG9jYXRpb24g b2YgdGhlIHNlYXJjaA0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICoN CisgKiBIYW5kbGVzIGxvY2tpbmcsIGRldGVjdHMgd3JhcHBpbmcgb24gaW5kZXggPT0gMA0KKyAq DQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQgb3IgYWZ0ZXIgdGhlIEBpbmRleCBvciAlTlVMTA0K KyAqLw0KK3ZvaWQgKm10X2ZpbmRfYWZ0ZXIoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25l ZCBsb25nICppbmRleCwNCisJCSAgICB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCWlmICghKCpp bmRleCkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJcmV0dXJuIG10X2ZpbmQobXQsIGluZGV4LCBt YXgpOw0KK30NCitFWFBPUlRfU1lNQk9MKG10X2ZpbmRfYWZ0ZXIpOw0KKw0KKyNpZmRlZiBDT05G SUdfREVCVUdfTUFQTEVfVFJFRQ0KK2F0b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcnVuOw0KK0VY UE9SVF9TWU1CT0xfR1BMKG1hcGxlX3RyZWVfdGVzdHNfcnVuKTsNCithdG9taWNfdCBtYXBsZV90 cmVlX3Rlc3RzX3Bhc3NlZDsNCitFWFBPUlRfU1lNQk9MX0dQTChtYXBsZV90cmVlX3Rlc3RzX3Bh c3NlZCk7DQorDQorI2lmbmRlZiBfX0tFUk5FTF9fDQorZXh0ZXJuIHZvaWQga21lbV9jYWNoZV9z ZXRfbm9uX2tlcm5lbChzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBpbnQpOw0KK3ZvaWQg bXRfc2V0X25vbl9rZXJuZWwodW5zaWduZWQgaW50IHZhbCkNCit7DQorCWttZW1fY2FjaGVfc2V0 X25vbl9rZXJuZWwobWFwbGVfbm9kZV9jYWNoZSwgdmFsKTsNCit9DQorDQorZXh0ZXJuIHVuc2ln bmVkIGxvbmcga21lbV9jYWNoZV9nZXRfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKik7DQordW5z aWduZWQgbG9uZyBtdF9nZXRfYWxsb2Nfc2l6ZSh2b2lkKQ0KK3sNCisJcmV0dXJuIGttZW1fY2Fj aGVfZ2V0X2FsbG9jKG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdm9pZCBrbWVt X2NhY2hlX3plcm9fbnJfdGFsbG9jYXRlZChzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit2b2lkIG10 X3plcm9fbnJfdGFsbG9jYXRlZCh2b2lkKQ0KK3sNCisJa21lbV9jYWNoZV96ZXJvX25yX3RhbGxv Y2F0ZWQobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB1bnNpZ25lZCBpbnQga21l bV9jYWNoZV9ucl90YWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGlu dCBtdF9ucl90YWxsb2NhdGVkKHZvaWQpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9ucl90YWxs b2NhdGVkKG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGtt ZW1fY2FjaGVfbnJfYWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGlu dCBtdF9ucl9hbGxvY2F0ZWQodm9pZCkNCit7DQorCXJldHVybiBrbWVtX2NhY2hlX25yX2FsbG9j YXRlZChtYXBsZV9ub2RlX2NhY2hlKTsNCit9DQorDQorLyoNCisgKiBtYXNfZGVhZF9ub2RlKCkg LSBDaGVjayBpZiB0aGUgbWFwbGUgc3RhdGUgaXMgcG9pbnRpbmcgdG8gYSBkZWFkIG5vZGUuDQor ICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGluZGV4OiBUaGUgaW5kZXggdG8gcmVzdG9y ZSBpbiBAbWFzLg0KKyAqDQorICogVXNlZCBpbiB0ZXN0IGNvZGUuDQorICogUmV0dXJuOiAxIGlm IEBtYXMgaGFzIGJlZW4gcmVzZXQgdG8gTUFTX1NUQVJULCAwIG90aGVyd2lzZS4NCisgKi8NCitz dGF0aWMgaW5saW5lIGludCBtYXNfZGVhZF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNp Z25lZCBsb25nIGluZGV4KQ0KK3sNCisJaWYgKHVubGlrZWx5KCFtYXNfc2VhcmNoYWJsZShtYXMp IHx8IG1hc19pc19zdGFydChtYXMpKSkNCisJCXJldHVybiAwOw0KKw0KKwlpZiAobGlrZWx5KCFt dGVfZGVhZF9ub2RlKG1hcy0+bm9kZSkpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW1hc19yZXdhbGso bWFzLCBpbmRleCk7DQorCXJldHVybiAxOw0KK30NCisjZW5kaWYgLyogbm90IGRlZmluZWQgX19L RVJORUxfXyAqLw0KKw0KKy8qDQorICogbWFzX2dldF9zbG90KCkgLSBHZXQgdGhlIGVudHJ5IGlu IHRoZSBtYXBsZSBzdGF0ZSBub2RlIHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdCBhcnJheSB0 byBmZXRjaC4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCBAb2Zmc2V0Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICptYXNfZ2V0X3Nsb3Qoc3Ry dWN0IG1hX3N0YXRlICptYXMsDQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVy biBtYXNfc2xvdChtYXMsIG1hX3Nsb3RzKG1hc19tbihtYXMpLCBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSkpLA0KKwkJCW9mZnNldCk7DQorfQ0KKw0KKw0KKy8qDQorICogbWFzX2ZpcnN0X2VudHJ5 KCkgLSBHbyB0aGUgZmlyc3QgbGVhZiBhbmQgZmluZCB0aGUgZmlyc3QgZW50cnkuDQorICogQG1h czogdGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBsaW1pdDogdGhlIG1heGltdW0gaW5kZXggdG8gY2hl Y2suDQorICogQCpyX3N0YXJ0OiBQb2ludGVyIHRvIHNldCB0byB0aGUgcmFuZ2Ugc3RhcnQuDQor ICoNCisgKiBTZXRzIG1hcy0+b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5LCByX3N0 YXJ0IHRvIHRoZSByYW5nZSBtaW5pbXVtLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZmlyc3QgZW50 cnkgb3IgTUFTX05PTkUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfZmlyc3RfZW50 cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCXVuc2ln bmVkIGxvbmcgbGltaXQsIGVudW0gbWFwbGVfdHlwZSBtdCkNCisNCit7DQorCXVuc2lnbmVkIGxv bmcgbWF4Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKw0KKwltYXMtPmluZGV4ID0gbWFzLT5taW47DQorCWlm IChtYXMtPmluZGV4ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7DQorDQorCW1heCA9IG1hcy0+bWF4 Ow0KKwltYXMtPm9mZnNldCA9IDA7DQorCXdoaWxlIChsaWtlbHkoIW1hX2lzX2xlYWYobXQpKSkg ew0KKwkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKTsNCisJ CXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhtbiwgbXQp Ow0KKwkJbWF4ID0gcGl2b3RzWzBdOw0KKwkJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCAw KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCQlyZXR1cm4gTlVMTDsN CisJCW1hcy0+bm9kZSA9IGVudHJ5Ow0KKwkJbW4gPSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwl9DQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG10ZV9k ZWFkX25vZGUobWFzLT5ub2RlKSk7DQorDQorCW1hcy0+bWF4ID0gbWF4Ow0KKwlzbG90cyA9IG1h X3Nsb3RzKG1uLCBtdCk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgMCk7DQorCWlm ICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwkvKiBT bG90IDAgb3IgMSBtdXN0IGJlIHNldCAqLw0KKwlpZiAobWFzLT5pbmRleCA+IGxpbWl0KQ0KKwkJ Z290byBub25lOw0KKw0KKwlpZiAobGlrZWx5KGVudHJ5KSkNCisJCXJldHVybiBlbnRyeTsNCisN CisJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCW1hcy0+aW5kZXggPSBwaXZvdHNbMF0g KyAxOw0KKwltYXMtPm9mZnNldCA9IDE7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywg MSk7DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCXJldHVybiBOVUxMOw0K Kw0KKwlpZiAobWFzLT5pbmRleCA+IGxpbWl0KQ0KKwkJZ290byBub25lOw0KKw0KKwlpZiAobGlr ZWx5KGVudHJ5KSkNCisJCXJldHVybiBlbnRyeTsNCisNCitub25lOg0KKwlpZiAobGlrZWx5KCFt YV9kZWFkX25vZGUobW4pKSkNCisJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1cm4gTlVM TDsNCit9DQorDQorLyogRGVwdGggZmlyc3Qgc2VhcmNoLCBwb3N0LW9yZGVyICovDQorc3RhdGlj IHZvaWQgbWFzX2Rmc19wb3N0b3JkZXIoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxv bmcgbWF4KQ0KK3sNCisNCisJc3RydWN0IG1hcGxlX2Vub2RlICpwID0gTUFTX05PTkUsICptbiA9 IG1hcy0+bm9kZTsNCisJdW5zaWduZWQgbG9uZyBwX21pbiwgcF9tYXg7DQorDQorCW1hc19uZXh0 X25vZGUobWFzLCBtYXNfbW4obWFzKSwgbWF4KTsNCisJaWYgKCFtYXNfaXNfbm9uZShtYXMpKQ0K KwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobW4pKQ0KKwkJcmV0dXJuOw0KKw0KKwlt YXMtPm5vZGUgPSBtbjsNCisJbWFzX2FzY2VuZChtYXMpOw0KKwl3aGlsZSAobWFzLT5ub2RlICE9 IE1BU19OT05FKSB7DQorCQlwID0gbWFzLT5ub2RlOw0KKwkJcF9taW4gPSBtYXMtPm1pbjsNCisJ CXBfbWF4ID0gbWFzLT5tYXg7DQorCQltYXNfcHJldl9ub2RlKG1hcywgMCk7DQorCX0NCisNCisJ aWYgKHAgPT0gTUFTX05PTkUpDQorCQlyZXR1cm47DQorDQorCW1hcy0+bm9kZSA9IHA7DQorCW1h cy0+bWF4ID0gcF9tYXg7DQorCW1hcy0+bWluID0gcF9taW47DQorfQ0KKw0KKy8qIFRyZWUgdmFs aWRhdGlvbnMgKi8NCitzdGF0aWMgdm9pZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxl X3RyZWUgKm10LCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKTsNCitzdGF0aWMgdm9pZCBtdF9kdW1wX3Jhbmdl KHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGlu dCBkZXB0aCkNCit7DQorCXN0YXRpYyBjb25zdCBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIjsNCisNCisJaWYgKG1pbiA9PSBtYXgpDQorCQlwcl9pbmZv KCIlLipzJWx1OiAiLCBkZXB0aCAqIDIsIHNwYWNlcywgbWluKTsNCisJZWxzZQ0KKwkJcHJfaW5m bygiJS4qcyVsdS0lbHU6ICIsIGRlcHRoICogMiwgc3BhY2VzLCBtaW4sIG1heCk7DQorfQ0KKw0K K3N0YXRpYyB2b2lkIG10X2R1bXBfZW50cnkodm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWlu LCB1bnNpZ25lZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCW10 X2R1bXBfcmFuZ2UobWluLCBtYXgsIGRlcHRoKTsNCisNCisJaWYgKHhhX2lzX3ZhbHVlKGVudHJ5 KSkNCisJCXByX2NvbnQoInZhbHVlICVsZCAoMHglbHgpIFslcF1cbiIsIHhhX3RvX3ZhbHVlKGVu dHJ5KSwNCisJCQkJeGFfdG9fdmFsdWUoZW50cnkpLCBlbnRyeSk7DQorCWVsc2UgaWYgKHhhX2lz X3plcm8oZW50cnkpKQ0KKwkJcHJfY29udCgiemVybyAoJWxkKVxuIiwgeGFfdG9faW50ZXJuYWwo ZW50cnkpKTsNCisJZWxzZSBpZiAobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKQ0KKwkJcHJfY29udCgi VU5LTk9XTiBFTlRSWSAoJXApXG4iLCBlbnRyeSk7DQorCWVsc2UNCisJCXByX2NvbnQoIiVwXG4i LCBlbnRyeSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1 Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1 bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxl X3JhbmdlXzY0ICpub2RlID0gJm10ZV90b19ub2RlKGVudHJ5KS0+bXI2NDsNCisJYm9vbCBsZWFm ID0gbXRlX2lzX2xlYWYoZW50cnkpOw0KKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWluOw0KKwlp bnQgaTsNCisNCisJcHJfY29udCgiIGNvbnRlbnRzOiAiKTsNCisJZm9yIChpID0gMDsgaSA8IE1B UExFX1JBTkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIlcCAlbHUgIiwgbm9kZS0+ c2xvdFtpXSwgbm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIlcFxuIiwgbm9kZS0+c2xvdFtp XSk7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9SQU5HRTY0X1NMT1RTOyBpKyspIHsNCisJCXVu c2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExFX1JBTkdFNjRfU0xP VFMgLSAxKSkNCisJCQlsYXN0ID0gbm9kZS0+cGl2b3RbaV07DQorCQllbHNlIGlmICghbm9kZS0+ c2xvdFtpXSAmJiBtYXggIT0gbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSkNCisJCQlicmVh azsNCisJCWlmIChsYXN0ID09IDAgJiYgaSA+IDApDQorCQkJYnJlYWs7DQorCQlpZiAobGVhZikN CisJCQltdF9kdW1wX2VudHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJZmly c3QsIGxhc3QsIGRlcHRoICsgMSk7DQorCQllbHNlIGlmIChub2RlLT5zbG90W2ldKQ0KKwkJCW10 X2R1bXBfbm9kZShtdCwgbXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlmaXJzdCwg bGFzdCwgZGVwdGggKyAxKTsNCisNCisJCWlmIChsYXN0ID09IG1heCkNCisJCQlicmVhazsNCisJ CWlmIChsYXN0ID4gbWF4KSB7DQorCQkJcHJfZXJyKCJub2RlICVwIGxhc3QgKCVsdSkgPiBtYXgg KCVsdSkgYXQgcGl2b3QgJWQhXG4iLA0KKwkJCQkJbm9kZSwgbGFzdCwgbWF4LCBpKTsNCisJCQli cmVhazsNCisJCX0NCisJCWZpcnN0ID0gbGFzdCArIDE7DQorCX0NCit9DQorDQorc3RhdGljIHZv aWQgbXRfZHVtcF9hcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVu dHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQg aW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82NCAqbm9kZSA9ICZtdGVfdG9f bm9kZShlbnRyeSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9pc19sZWFmKGVudHJ5KTsNCisJ dW5zaWduZWQgbG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQorDQorCXByX2NvbnQoIiBjb250 ZW50czogIik7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKQ0K KwkJcHJfY29udCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXByX2NvbnQoInwgJTAyWCAlMDJY fCAiLCBub2RlLT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0KKwlmb3IgKGkgPSAwOyBpIDwg TUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIlcCAlbHUgIiwgbm9k ZS0+c2xvdFtpXSwgbm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIlcFxuIiwgbm9kZS0+c2xv dFtpXSk7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKSB7DQor CQl1bnNpZ25lZCBsb25nIGxhc3QgPSBtYXg7DQorDQorCQlpZiAoaSA8IChNQVBMRV9BUkFOR0U2 NF9TTE9UUyAtIDEpKQ0KKwkJCWxhc3QgPSBub2RlLT5waXZvdFtpXTsNCisJCWVsc2UgaWYgKCFu b2RlLT5zbG90W2ldKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPT0gMCAmJiBpID4gMCkNCisJ CQlicmVhazsNCisJCWlmIChsZWFmKQ0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9k ZS0+c2xvdCwgaSksDQorCQkJCQlmaXJzdCwgbGFzdCwgZGVwdGggKyAxKTsNCisJCWVsc2UgaWYg KG5vZGUtPnNsb3RbaV0pDQorCQkJbXRfZHVtcF9ub2RlKG10LCBtdF9zbG90KG10LCBub2RlLT5z bG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEpOw0KKw0KKwkJaWYgKGxhc3Qg PT0gbWF4KQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxhc3QgPiBtYXgpIHsNCisJCQlwcl9lcnIoIm5v ZGUgJXAgbGFzdCAoJWx1KSA+IG1heCAoJWx1KSBhdCBwaXZvdCAlZCFcbiIsDQorCQkJCQlub2Rl LCBsYXN0LCBtYXgsIGkpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJZmlyc3QgPSBsYXN0ICsgMTsN CisJfQ0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxl X3RyZWUgKm10LCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5v ZGUgPSBtdGVfdG9fbm9kZShlbnRyeSk7DQorCXVuc2lnbmVkIGludCB0eXBlID0gbXRlX25vZGVf dHlwZShlbnRyeSk7DQorCXVuc2lnbmVkIGludCBpOw0KKw0KKwltdF9kdW1wX3JhbmdlKG1pbiwg bWF4LCBkZXB0aCk7DQorDQorCXByX2NvbnQoIm5vZGUgJXAgZGVwdGggJWQgdHlwZSAlZCBwYXJl bnQgJXAiLCBub2RlLCBkZXB0aCwgdHlwZSwNCisJCQlub2RlID8gbm9kZS0+cGFyZW50IDogTlVM TCk7DQorCXN3aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcHJfY29udCgi XG4iKTsNCisJCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9OT0RFX1NMT1RTOyBpKyspIHsNCisJCQlp ZiAobWluICsgaSA+IG1heCkNCisJCQkJcHJfY29udCgiT1VUIE9GIFJBTkdFOiAiKTsNCisJCQlt dF9kdW1wX2VudHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJbWluICsgaSwg bWluICsgaSwgZGVwdGgpOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfbGVhZl82NDoN CisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJCW10X2R1bXBfcmFuZ2U2NChtdCwgZW50cnksIG1p biwgbWF4LCBkZXB0aCk7DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlt dF9kdW1wX2FyYW5nZTY0KG10LCBlbnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0K Kw0KKwlkZWZhdWx0Og0KKwkJcHJfY29udCgiIFVOS05PV04gVFlQRVxuIik7DQorCX0NCit9DQor DQordm9pZCBtdF9kdW1wKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXZvaWQg KmVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKG10LT5tYV9yb290LCBtdF9sb2NrZWQobXQp KTsNCisNCisJcHJfaW5mbygibWFwbGVfdHJlZSglcCkgZmxhZ3MgJVgsIGhlaWdodCAldSByb290 ICVwXG4iLA0KKwkJIG10LCBtdC0+bWFfZmxhZ3MsIG10X2hlaWdodChtdCksIGVudHJ5KTsNCisJ aWYgKCF4YV9pc19ub2RlKGVudHJ5KSkNCisJCW10X2R1bXBfZW50cnkoZW50cnksIDAsIDAsIDAp Ow0KKwllbHNlIGlmIChlbnRyeSkNCisJCW10X2R1bXBfbm9kZShtdCwgZW50cnksIDAsIG10X21h eFttdGVfbm9kZV90eXBlKGVudHJ5KV0sIDApOw0KK30NCisNCisvKg0KKyAqIENhbGN1bGF0ZSB0 aGUgbWF4aW11bSBnYXAgaW4gYSBub2RlIGFuZCBjaGVjayBpZiB0aGF0J3Mgd2hhdCBpcyByZXBv cnRlZCBpbg0KKyAqIHRoZSBwYXJlbnQgKHVubGVzcyByb290KS4NCisgKi8NCitzdGF0aWMgdm9p ZCBtYXNfdmFsaWRhdGVfZ2FwcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBt YXBsZV9lbm9kZSAqbXRlID0gbWFzLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcF9tbjsN CisJdW5zaWduZWQgbG9uZyBnYXAgPSAwLCBtYXhfZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBw X2VuZCwgcF9zdGFydCA9IG1hcy0+bWluOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdDsNCisJdW5z aWduZWQgbG9uZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bp dm90cyhtdGVfdG9fbm9kZShtdGUpLCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKwlpbnQgaTsNCisN CisJaWYgKG1hX2lzX2RlbnNlKG10ZV9ub2RlX3R5cGUobXRlKSkpIHsNCisJCWZvciAoaSA9IDA7 IGkgPCBtdF9zbG90X2NvdW50KG10ZSk7IGkrKykgew0KKwkJCWlmIChtYXNfZ2V0X3Nsb3QobWFz LCBpKSkgew0KKwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQor CQkJCWdhcCA9IDA7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlnYXArKzsNCisJCX0NCisJ CWdvdG8gY291bnRlZDsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtdGUp LCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudCht dGUpOyBpKyspIHsNCisJCXBfZW5kID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCBwaXZvdHMsIGks IG10ZV9ub2RlX3R5cGUobXRlKSk7DQorDQorCQlpZiAoIWdhcHMpIHsNCisJCQlpZiAobWFzX2dl dF9zbG90KG1hcywgaSkpIHsNCisJCQkJZ2FwID0gMDsNCisJCQkJZ290byBub3RfZW1wdHk7DQor CQkJfQ0KKw0KKwkJCWdhcCArPSBwX2VuZCAtIHBfc3RhcnQgKyAxOw0KKwkJfSBlbHNlIHsNCisJ CQl2b2lkICplbnRyeSA9IG1hc19nZXRfc2xvdChtYXMsIGkpOw0KKw0KKwkJCWdhcCA9IGdhcHNb aV07DQorCQkJaWYgKCFlbnRyeSkgew0KKwkJCQlpZiAoZ2FwICE9IHBfZW5kIC0gcF9zdGFydCAr IDEpIHsNCisJCQkJCXByX2VycigiJXBbJXVdIC0+ICVwICVsdSAhPSAlbHUgLSAlbHUgKyAxXG4i LA0KKwkJCQkJCW1hc19tbihtYXMpLCBpLA0KKwkJCQkJCW1hc19nZXRfc2xvdChtYXMsIGkpLCBn YXAsDQorCQkJCQkJcF9lbmQsIHBfc3RhcnQpOw0KKwkJCQkJbXRfZHVtcChtYXMtPnRyZWUpOw0K Kw0KKwkJCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCQkJCQlnYXAgIT0gcF9lbmQgLSBwX3N0 YXJ0ICsgMSk7DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlpZiAoZ2FwID4gcF9lbmQgLSBw X3N0YXJ0ICsgMSkgew0KKwkJCQkJcHJfZXJyKCIlcFsldV0gJWx1ID49ICVsdSAtICVsdSArIDEg KCVsdSlcbiIsDQorCQkJCQltYXNfbW4obWFzKSwgaSwgZ2FwLCBwX2VuZCwgcF9zdGFydCwNCisJ CQkJCXBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJ CQkJCQlnYXAgPiBwX2VuZCAtIHBfc3RhcnQgKyAxKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisN CisJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCW1heF9nYXAgPSBnYXA7DQorbm90X2VtcHR5Og0K KwkJcF9zdGFydCA9IHBfZW5kICsgMTsNCisJCWlmIChwX2VuZCA+PSBtYXMtPm1heCkNCisJCQli cmVhazsNCisJfQ0KKw0KK2NvdW50ZWQ6DQorCWlmIChtdGVfaXNfcm9vdChtdGUpKQ0KKwkJcmV0 dXJuOw0KKw0KKwlwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9tbiA9 IG10ZV9wYXJlbnQobXRlKTsNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWF4X2dhcCA+IG1hcy0+ bWF4KTsNCisJaWYgKG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1hcywgbXRlKSlbcF9z bG90XSAhPSBtYXhfZ2FwKSB7DQorCQlwcl9lcnIoImdhcCAlcFsldV0gIT0gJWx1XG4iLCBwX21u LCBwX3Nsb3QsIG1heF9nYXApOw0KKwkJbXRfZHVtcChtYXMtPnRyZWUpOw0KKwl9DQorDQorCU1U X0JVR19PTihtYXMtPnRyZWUsDQorCQkgIG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1h cywgbXRlKSlbcF9zbG90XSAhPSBtYXhfZ2FwKTsNCit9DQorDQorc3RhdGljIHZvaWQgbWFzX3Zh bGlkYXRlX3BhcmVudF9zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1h cGxlX25vZGUgKnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpub2RlOw0KKwllbnVtIG1h cGxlX3R5cGUgcF90eXBlID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJdW5z aWduZWQgY2hhciBwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJdm9pZCBf X3JjdSAqKnNsb3RzOw0KKwlpbnQgaTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkp DQorCQlyZXR1cm47DQorDQorCXBhcmVudCA9IG10ZV9wYXJlbnQobWFzLT5ub2RlKTsNCisJc2xv dHMgPSBtYV9zbG90cyhwYXJlbnQsIHBfdHlwZSk7DQorCU1UX0JVR19PTihtYXMtPnRyZWUsIG1h c19tbihtYXMpID09IHBhcmVudCk7DQorDQorCS8qIENoZWNrIHByZXYvbmV4dCBwYXJlbnQgc2xv dCBmb3IgZHVwbGljYXRlIG5vZGUgZW50cnkgKi8NCisNCisJZm9yIChpID0gMDsgaSA8IG10X3Ns b3RzW3BfdHlwZV07IGkrKykgew0KKwkJbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIGkpOw0K KwkJaWYgKGkgPT0gcF9zbG90KSB7DQorCQkJaWYgKG5vZGUgIT0gbWFzLT5ub2RlKQ0KKwkJCQlw cl9lcnIoInBhcmVudCAlcFsldV0gZG9lcyBub3QgaGF2ZSAlcFxuIiwNCisJCQkJCXBhcmVudCwg aSwgbWFzX21uKG1hcykpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIG5vZGUgIT0gbWFzLT5u b2RlKTsNCisJCX0gZWxzZSBpZiAobm9kZSA9PSBtYXMtPm5vZGUpIHsNCisJCQlwcl9lcnIoIklu dmFsaWQgY2hpbGQgJXAgYXQgcGFyZW50ICVwWyV1XSBwX3Nsb3QgJXVcbiIsDQorCQkJICAgICAg IG1hc19tbihtYXMpLCBwYXJlbnQsIGksIHBfc2xvdCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJl ZSwgbm9kZSA9PSBtYXMtPm5vZGUpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1h c192YWxpZGF0ZV9jaGlsZF9zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBt YXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3Ug KipzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1bnNp Z25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwgdHlw ZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqY2hpbGQ7DQorCXVuc2lnbmVkIGNoYXIgaTsNCisN CisJaWYgKG10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9 IDA7IGkgPCBtdF9zbG90c1t0eXBlXTsgaSsrKSB7DQorCQljaGlsZCA9IG1hc19zbG90KG1hcywg c2xvdHMsIGkpOw0KKwkJaWYgKCFwaXZvdHNbaV0gfHwgcGl2b3RzW2ldID09IG1hcy0+bWF4KQ0K KwkJCWJyZWFrOw0KKw0KKwkJaWYgKCFjaGlsZCkNCisJCQlicmVhazsNCisNCisJCWlmIChtdGVf cGFyZW50X3Nsb3QoY2hpbGQpICE9IGkpIHsNCisJCQlwcl9lcnIoIlNsb3QgZXJyb3IgYXQgJXBb JXVdOiBjaGlsZCAlcCBoYXMgcHNsb3QgJXVcbiIsDQorCQkJICAgICAgIG1hc19tbihtYXMpLCBp LCBtdGVfdG9fbm9kZShjaGlsZCksDQorCQkJICAgICAgIG10ZV9wYXJlbnRfc2xvdChjaGlsZCkp Ow0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIDEpOw0KKwkJfQ0KKw0KKwkJaWYgKG10ZV9wYXJl bnQoY2hpbGQpICE9IG10ZV90b19ub2RlKG1hcy0+bm9kZSkpIHsNCisJCQlwcl9lcnIoImNoaWxk ICVwIGhhcyBwYXJlbnQgJXAgbm90ICVwXG4iLA0KKwkJCSAgICAgICBtdGVfdG9fbm9kZShjaGls ZCksIG10ZV9wYXJlbnQoY2hpbGQpLA0KKwkJCSAgICAgICBtdGVfdG9fbm9kZShtYXMtPm5vZGUp KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCAxKTsNCisJCX0NCisJfQ0KK30NCisNCisvKg0K KyAqIFZhbGlkYXRlIGFsbCBwaXZvdHMgYXJlIHdpdGhpbiBtYXMtPm1pbiBhbmQgbWFzLT5tYXgu DQorICovDQorc3RhdGljIHZvaWQgbWFzX3ZhbGlkYXRlX2xpbWl0cyhzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCWludCBpOw0KKwl1bnNpZ25lZCBsb25nIHByZXZfcGl2ID0gMDsNCisJZW51 bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19y Y3UgKipzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1 bnNpZ25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIHR5cGUpOw0KKw0K KwkvKiBhbGwgbGltaXRzIGFyZSBmaW5lIGhlcmUuICovDQorCWlmIChtdGVfaXNfcm9vdChtYXMt Pm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdHNbdHlwZV07 IGkrKykgew0KKwkJdW5zaWduZWQgbG9uZyBwaXY7DQorDQorCQlwaXYgPSBtYXNfc2FmZV9waXZv dChtYXMsIHBpdm90cywgaSwgdHlwZSk7DQorDQorCQlpZiAoIXBpdiAmIChpICE9IDApKQ0KKwkJ CWJyZWFrOw0KKw0KKwkJaWYgKCFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKSB7DQorCQkJdm9pZCAq ZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBpKTsNCisNCisJCQlpZiAoIWVudHJ5KQ0KKwkJ CQlwcl9lcnIoIiVwWyV1XSBjYW5ub3QgYmUgbnVsbFxuIiwNCisJCQkJICAgICAgIG1hc19tbiht YXMpLCBpKTsNCisNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCAhZW50cnkpOw0KKwkJfQ0KKw0K KwkJaWYgKHByZXZfcGl2ID4gcGl2KSB7DQorCQkJcHJfZXJyKCIlcFsldV0gcGl2ICVsdSA8IHBy ZXZfcGl2ICVsdVxuIiwNCisJCQkJbWFzX21uKG1hcyksIGksIHBpdiwgcHJldl9waXYpOw0KKwkJ CU1UX0JVR19PTihtYXMtPnRyZWUsIHBpdiA8IHByZXZfcGl2KTsNCisJCX0NCisNCisJCWlmIChw aXYgPCBtYXMtPm1pbikgew0KKwkJCXByX2VycigiJXBbJXVdICVsdSA8ICVsdVxuIiwgbWFzX21u KG1hcyksIGksDQorCQkJCXBpdiwgbWFzLT5taW4pOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUs IHBpdiA8IG1hcy0+bWluKTsNCisJCX0NCisJCWlmIChwaXYgPiBtYXMtPm1heCkgew0KKwkJCXBy X2VycigiJXBbJXVdICVsdSA+ICVsdVxuIiwgbWFzX21uKG1hcyksIGksDQorCQkJCXBpdiwgbWFz LT5tYXgpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIHBpdiA+IG1hcy0+bWF4KTsNCisJCX0N CisJCXByZXZfcGl2ID0gcGl2Ow0KKwkJaWYgKHBpdiA9PSBtYXMtPm1heCkNCisJCQlicmVhazsN CisJfQ0KKwlmb3IgKGkgKz0gMTsgaSA8IG10X3Nsb3RzW3R5cGVdOyBpKyspIHsNCisJCXZvaWQg KmVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorDQorCQlpZiAoZW50cnkgJiYgKGkg IT0gbXRfc2xvdHNbdHlwZV0gLSAxKSkgew0KKwkJCXByX2VycigiJXBbJXVdIHNob3VsZCBub3Qg aGF2ZSBlbnRyeSAlcFxuIiwgbWFzX21uKG1hcyksDQorCQkJICAgICAgIGksIGVudHJ5KTsNCisJ CQlNVF9CVUdfT04obWFzLT50cmVlLCBlbnRyeSAhPSBOVUxMKTsNCisJCX0NCisNCisJCWlmIChp IDwgbXRfcGl2b3RzW3R5cGVdKSB7DQorCQkJdW5zaWduZWQgbG9uZyBwaXYgPSBwaXZvdHNbaV07 DQorDQorCQkJaWYgKCFwaXYpDQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJCXByX2VycigiJXBbJXVd IHNob3VsZCBub3QgaGF2ZSBwaXYgJWx1XG4iLA0KKwkJCSAgICAgICBtYXNfbW4obWFzKSwgaSwg cGl2KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBpIDwgbXRfcGl2b3RzW3R5cGVdIC0gMSk7 DQorCQl9DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbXRfdmFsaWRhdGVfbnVsbHMoc3RydWN0 IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqZW50cnksICpsYXN0ID0gKHZvaWQgKikxOw0K Kwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJTUFf U1RBVEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1hc19zdGFydCgmbWFzKTsNCisJaWYgKG1hc19p c19ub25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBNQVNfUk9PVCkpDQorCQlyZXR1cm47DQorDQor CXdoaWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUpKQ0KKwkJbWFzX2Rlc2NlbmQoJm1hcyk7DQor DQorCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUpLCBtdGVfbm9kZV90eXBl KG1hcy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3QoJm1hcywgc2xvdHMsIG9m ZnNldCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5KSB7DQorCQkJcHJfZXJyKCJTZXF1ZW50aWFs IG51bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJCW1hc19tbigmbWFzKSwgb2Zmc2V0KTsNCisJ CX0NCisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYgIWVudHJ5KTsNCisJCWxhc3QgPSBlbnRyeTsN CisJCWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5kKCZtYXMpKSB7DQorCQkJbWFzX25leHRfbm9k ZSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCk7DQorCQkJaWYgKG1hc19pc19ub25lKCZt YXMpKQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0ID0gMDsNCisJCQlzbG90cyA9IG1hX3Nsb3Rz KG10ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJCSBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKSk7 DQorCQl9IGVsc2Ugew0KKwkJCW9mZnNldCsrOw0KKwkJfQ0KKw0KKwl9IHdoaWxlICghbWFzX2lz X25vbmUoJm1hcykpOw0KK30NCisNCisvKg0KKyAqIHZhbGlkYXRlIGEgbWFwbGUgdHJlZSBieSBj aGVja2luZzoNCisgKiAxLiBUaGUgbGltaXRzIChwaXZvdHMgYXJlIHdpdGhpbiBtYXMtPm1pbiB0 byBtYXMtPm1heCkNCisgKiAyLiBUaGUgZ2FwIGlzIGNvcnJlY3RseSBzZXQgaW4gdGhlIHBhcmVu dHMNCisgKi8NCit2b2lkIG10X3ZhbGlkYXRlKHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQor CXVuc2lnbmVkIGNoYXIgZW5kOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCAwLCAwKTsNCisJcmN1 X3JlYWRfbG9jaygpOw0KKwltYXNfc3RhcnQoJm1hcyk7DQorCWlmICghbWFzX3NlYXJjaGFibGUo Jm1hcykpDQorCQlnb3RvIGRvbmU7DQorDQorCW1hc19maXJzdF9lbnRyeSgmbWFzLCBtYXNfbW4o Jm1hcyksIFVMT05HX01BWCwgbXRlX25vZGVfdHlwZShtYXMubm9kZSkpOw0KKwl3aGlsZSAoIW1h c19pc19ub25lKCZtYXMpKSB7DQorCQlNVF9CVUdfT04obWFzLnRyZWUsIG10ZV9kZWFkX25vZGUo bWFzLm5vZGUpKTsNCisJCWlmICghbXRlX2lzX3Jvb3QobWFzLm5vZGUpKSB7DQorCQkJZW5kID0g bWFzX2RhdGFfZW5kKCZtYXMpOw0KKwkJCWlmICgoZW5kIDwgbXRfbWluX3Nsb3RfY291bnQobWFz Lm5vZGUpKSAmJg0KKwkJCSAgICAobWFzLm1heCAhPSBVTE9OR19NQVgpKSB7DQorCQkJCXByX2Vy cigiSW52YWxpZCBzaXplICV1IG9mICVwXG4iLCBlbmQsDQorCQkJCW1hc19tbigmbWFzKSk7DQor CQkJCU1UX0JVR19PTihtYXMudHJlZSwgMSk7DQorCQkJfQ0KKw0KKwkJfQ0KKwkJbWFzX3ZhbGlk YXRlX3BhcmVudF9zbG90KCZtYXMpOw0KKwkJbWFzX3ZhbGlkYXRlX2NoaWxkX3Nsb3QoJm1hcyk7 DQorCQltYXNfdmFsaWRhdGVfbGltaXRzKCZtYXMpOw0KKwkJaWYgKG10X2lzX2FsbG9jKG10KSkN CisJCQltYXNfdmFsaWRhdGVfZ2FwcygmbWFzKTsNCisJCW1hc19kZnNfcG9zdG9yZGVyKCZtYXMs IFVMT05HX01BWCk7DQorCX0NCisJbXRfdmFsaWRhdGVfbnVsbHMobXQpOw0KK2RvbmU6DQorCXJj dV9yZWFkX3VubG9jaygpOw0KKw0KK30NCisNCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX01BUExF X1RSRUUgKi8NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9y ZSBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0aWdub3JlDQppbmRleCBkOTcxNTE2NDAx ZTYuLmM5MDFkOTZkZDAxMyAxMDA2NDQNCi0tLSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8u Z2l0aWdub3JlDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KQEAg LTYsMyArNiw1IEBAIG1haW4NCiBtdWx0aW9yZGVyDQogcmFkaXgtdHJlZS5jDQogeGFycmF5DQor bWFwbGUNCittYV94YV9iZW5jaG1hcmsNCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4 LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmggYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2Vu ZXJhdGVkL2F1dG9jb25mLmgNCmluZGV4IDIyMThiM2NjMTg0ZS4uZTdkYTgwMzUwMjM2IDEwMDY0 NA0KLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQor KysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmgNCkBAIC0x ICsxLDIgQEANCiAjZGVmaW5lIENPTkZJR19YQVJSQVlfTVVMVEkgMQ0KKyNkZWZpbmUgQ09ORklH XzY0QklUIDENCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFw bGVfdHJlZS5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0K bmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uN2Q4ZDFmNDQ1Yjg5DQot LS0gL2Rldi9udWxsDQorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVf dHJlZS5oDQpAQCAtMCwwICsxLDcgQEANCisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMCsgKi8NCisjZGVmaW5lIGF0b21pY190IGludDMyX3QNCisjaW5jbHVkZSAiLi4vLi4vLi4v Li4vaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgiDQorI2RlZmluZSBhdG9taWNfaW5jKHgpIHVh dG9taWNfaW5jKHgpDQorI2RlZmluZSBhdG9taWNfcmVhZCh4KSB1YXRvbWljX3JlYWQoeCkNCisj ZGVmaW5lIGF0b21pY19zZXQoeCwgeSkgZG8ge30gd2hpbGUgKDApDQorI2RlZmluZSBVOF9NQVgg VUNIQVJfTUFYDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMg Yi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQN CmluZGV4IDAwMDAwMDAwMDAwMC4uMzUwODI2NzE5MjhhDQotLS0gL2Rldi9udWxsDQorKysgYi90 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KQEAgLTAsMCArMSw1OSBAQA0KKy8vIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KKy8qDQorICogbWFwbGVfdHJlZS5jOiBV c2Vyc3BhY2Ugc2hpbSBmb3IgbWFwbGUgdHJlZSB0ZXN0LXN1aXRlDQorICogQ29weXJpZ2h0IChj KSAyMDE4IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQorICovDQor DQorI2RlZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKyNkZWZpbmUgQ09ORklHX01BUExF X1NFQVJDSA0KKyNpbmNsdWRlICJ0ZXN0LmgiDQorDQorI2RlZmluZSBtb2R1bGVfaW5pdCh4KQ0K KyNkZWZpbmUgbW9kdWxlX2V4aXQoeCkNCisjZGVmaW5lIE1PRFVMRV9BVVRIT1IoeCkNCisjZGVm aW5lIE1PRFVMRV9MSUNFTlNFKHgpDQorI2RlZmluZSBkdW1wX3N0YWNrKCkJYXNzZXJ0KDApDQor DQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi9tYXBsZV90cmVlLmMiDQorI3VuZGVmIENPTkZJR19E RUJVR19NQVBMRV9UUkVFDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi90ZXN0X21hcGxlX3RyZWUu YyINCisNCit2b2lkIGZhcm1lcl90ZXN0cyh2b2lkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUg Km5vZGU7DQorCURFRklORV9NVFJFRSh0cmVlKTsNCisNCisJbXRfZHVtcCgmdHJlZSk7DQorDQor CXRyZWUubWFfcm9vdCA9IHhhX21rX3ZhbHVlKDApOw0KKwltdF9kdW1wKCZ0cmVlKTsNCisNCisJ bm9kZSA9IG10X2FsbG9jX29uZShHRlBfS0VSTkVMKTsNCisJbm9kZS0+cGFyZW50ID0gKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpKCZ0cmVlKSB8IDEpOw0KKwlub2RlLT5zbG90WzBdID0geGFfbWtf dmFsdWUoMCk7DQorCW5vZGUtPnNsb3RbMV0gPSB4YV9ta192YWx1ZSgxKTsNCisJbm9kZS0+bXI2 NC5waXZvdFswXSA9IDA7DQorCW5vZGUtPm1yNjQucGl2b3RbMV0gPSAxOw0KKwlub2RlLT5tcjY0 LnBpdm90WzJdID0gMDsNCisJdHJlZS5tYV9yb290ID0gbXRfbWtfbm9kZShub2RlLCBtYXBsZV9s ZWFmXzY0KTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW1hX2ZyZWVfcmN1KG5vZGUpOw0KK30N CisNCit2b2lkIG1hcGxlX3RyZWVfdGVzdHModm9pZCkNCit7DQorCWZhcm1lcl90ZXN0cygpOw0K KwltYXBsZV90cmVlX3NlZWQoKTsNCisJbWFwbGVfdHJlZV9oYXJ2ZXN0KCk7DQorfQ0KKw0KK2lu dCBfX3dlYWsgbWFpbih2b2lkKQ0KK3sNCisJbWFwbGVfdHJlZV9pbml0KCk7DQorCW1hcGxlX3Ry ZWVfdGVzdHMoKTsNCisJcmN1X2JhcnJpZXIoKTsNCisJaWYgKG5yX2FsbG9jYXRlZCkNCisJCXBy aW50ZigibnJfYWxsb2NhdGVkID0gJWRcbiIsIG5yX2FsbG9jYXRlZCk7DQorCXJldHVybiAwOw0K K30NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21h cGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVf dHJlZS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi45N2QwZTFk ZGNmMDgNCi0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFj ZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDUgQEANCisvKiBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisNCisjZGVmaW5lIHRyYWNlX21hX29wKGEsIGIpIGRv IHt9IHdoaWxlICgwKQ0KKyNkZWZpbmUgdHJhY2VfbWFfcmVhZChhLCBiKSBkbyB7fSB3aGlsZSAo MCkNCisjZGVmaW5lIHRyYWNlX21hX3dyaXRlKGEsIGIsIGMsIGQpIGRvIHt9IHdoaWxlICgwKQ0K LS0gDQoyLjM1LjENCg==