From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out198-30.us.a.mail.aliyun.com (out198-30.us.a.mail.aliyun.com [47.90.198.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9B841684B0; Mon, 29 Dec 2025 01:36:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=47.90.198.30 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766972232; cv=none; b=h5oNALIOtqPTok8JVTcT/5ZdvPPbnWGK9tLwoUozpz661jmMfaHSz5rvcYydyCfAcYWEHMmvL6uQYWv3diZDcmvdKLWuSfUo1wZWyeK8+1tsqogE6tu9FIZG3cDgIP+oirh3NM1wHe/MowKpZg6xGTRD4PMeaWgKcHODOuOSjOg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766972232; c=relaxed/simple; bh=GexGjjIPXSp9ts4YHV5hLkaa0y9cEas7YFimofKuHk0=; h=Date:From:To:Cc:Message-ID:Subject:MIME-Version:References: In-Reply-To:Content-Type; b=iuPEd1JUXi7OAjnKL6LkbmuprMEl0JsFcsGwU+lN5Wp4Uz0pJQGJe6sfUqe9Ib2op8AnciBVGDSFSqdyaTzH5iCnybemlQTIZvmaNErgp8MQn9IZT3oghcuI1gF6yRPa0D+JRbWNAvDG2baIcxkVIy2N8yAibnXuPRrglaDHb9g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=nebula-matrix.com; spf=pass smtp.mailfrom=nebula-matrix.com; arc=none smtp.client-ip=47.90.198.30 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=nebula-matrix.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nebula-matrix.com X-Alimail-AntiSpam:AC=CONTINUE;BC=0.07386655|-1;CH=green;DM=|CONTINUE|false|;DS=CONTINUE|ham_system_inform|0.0125368-0.00122067-0.986243;FP=14518794032994848054|0|0|0|0|-1|-1|-1;HT=maildocker-contentspam033037021217;MF=illusion.wang@nebula-matrix.com;NM=1;PH=DW;RN=6;RT=6;SR=0;TI=W4_0.2.3_2125054A_1766972196855_o7001c198n; Received: from WS-web (illusion.wang@nebula-matrix.com[W4_0.2.3_2125054A_1766972196855_o7001c198n] cluster:ay29) at Mon, 29 Dec 2025 09:36:46 +0800 Date: Mon, 29 Dec 2025 09:36:46 +0800 From: "Illusion Wang" To: "Andrew Lunn" Cc: "Dimon" , "Alvin" , "Sam" , "netdev" , "open list" Reply-To: "Illusion Wang" Message-ID: <3e91ac11-5d6a-407b-ad52-c489aafd3d55.illusion.wang@nebula-matrix.com> Subject: =?UTF-8?B?5Zue5aSN77yaW1BBVENIIHYxIG5ldC1uZXh0IDEzLzE1XSBuZXQvbmVidWxhLW1hdHJpeDog?= =?UTF-8?B?YWRkIERldiBzdGFydCwgc3RvcCBvcGVyYXRpb24=?= X-Mailer: [Alimail-Mailagent revision 63][W4_0.2.3][null][Chrome] Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 x-aliyun-im-through: {"version":"v1.0"} References: <20251223035113.31122-1-illusion.wang@nebula-matrix.com> <20251223035113.31122-14-illusion.wang@nebula-matrix.com>,<4174bcb9-cb94-431f-9965-aa595d91e7bd@lunn.ch> x-aliyun-mail-creator: W4_0.2.3_null_EuMTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzMy4wLjY5NDMuMTQyIFNhZmFyaS81MzcuMzYgZGluZ3RhbGstd2luLzEuMC4wIG53KDAuMTQuNykgRGluZ1RhbGsoOC4xLjEwLVJlbGVhc2UuMjUxMjAyMDEzKSBNb2pvLzEuMC4wIE5hdGl2ZSBBcHBUeXBlKHJlbGVhc2UpIENoYW5uZWwvMjAxMjAwIEFyY2hpdGVjdHVyZS94ODZfNjQgd2ViRHQvUEM=uL In-Reply-To: <4174bcb9-cb94-431f-9965-aa595d91e7bd@lunn.ch> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 CgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQrlj5Hku7bkurrvvJpBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+CuWP kemAgeaXtumXtO+8mjIwMjXlubQxMuaciDI05pelKOWRqOS4iSkgMTk6MDMK5pS25Lu25Lq677ya SWxsdXNpb24gV2FuZzxpbGx1c2lvbi53YW5nQG5lYnVsYS1tYXRyaXguY29tPgrmioTjgIDpgIHv vJpEaW1vbjxkaW1vbi56aGFvQG5lYnVsYS1tYXRyaXguY29tPjsgQWx2aW48YWx2aW4ud2FuZ0Bu ZWJ1bGEtbWF0cml4LmNvbT47IFNhbTxzYW0uY2hlbkBuZWJ1bGEtbWF0cml4LmNvbT47IG5ldGRl djxuZXRkZXZAdmdlci5rZXJuZWwub3JnPjsgb3BlbiBsaXN0PGxpbnV4LWtlcm5lbEB2Z2VyLmtl cm5lbC5vcmc+CuS4u+OAgOmimO+8mlJlOiBbUEFUQ0ggdjEgbmV0LW5leHQgMTMvMTVdIG5ldC9u ZWJ1bGEtbWF0cml4OiBhZGQgRGV2IHN0YXJ0LCBzdG9wIG9wZXJhdGlvbgoKCk9uIFR1ZSwgRGVj IDIzLCAyMDI1IGF0IDExOjUwOjM2QU0gKzA4MDAsIGlsbHVzaW9uLndhbmcgd3JvdGU6Cj4gc29t ZSBpbXBvcnRhbnQgc3RlcHMgaW4gZGV2IHN0YXJ0Ogo+IDEuc3RhcnQgY29tbW9uIGRldjogY29u ZmlnIG1zaXggbWFwIHRhYmxlLCBhbGxvYyBhbmQgZW5hYmxlIG1zaXggdmVjdG9ycywKPiByZWdp c3RlciBtYWlsYm94IElTUiBhbmQgZW5hYmxlIG1haWxib3ggaXJxLCBzZXQgdXAgY2hhbiBrZWVw YWxpdmUgdGFzay4KPiAyLnN0YXJ0IGN0cmwgZGV2OiByZXF1ZXN0IGFibm9ybWFsIGFuZCBhZG1p bnEgSVNSICwgZW5hYmxlIHRoZW0uIHNjaGVkdWxlIHNvbWUKPiBjdHJsIHRhc2tzIHN1Y2ggYXMg YWRhcHQgZGVzYyBnb3RoZXIgdGFzay4KPiAzLnN0YXJ0IG5ldCBkZXY6Cj7CoCAzLjEgYWxsb2Mg bmV0ZGV2IHdpdGggbXVsdGktcXVldWUgc3VwcG9ydCwgY29uZmlnIHByaXZhdGUgZGF0YSBhbmQg YXNzb2NpYXRlc3MKPiB3aXRoIHRoZSBhZGFwdGVyLgo+wqAgMy4yIGFsbG9jIHR4L3J4IHJpbmdz LCBzZXQgdXAgbmV0d29yayByZXNvdXJjZSBtYW5hZ2VtZW50cyh2bGFuLHJhdGUgbGltaXRpbmcp Cj7CoCAzLjMgYnVpbGQgdGhlIG5ldGRldiBzdHJ1Y3R1cmUsIG1hcCBxdWV1ZXMgdG8gbXNpeCBp bnRlcnJ1cHRzLCBpbml0IGh3IHN0YXRzLgo+wqAgMy40IHJlZ2lzdGVyIGxpbmsgc3RhdHMgYW5k IHJlc2V0IGV2ZW50IGNoYW4gbXNnLgo+wqAgMy41IHN0YXJ0IG5ldCB2c2kgYW5kIHJlZ2lzdGVy IG5ldCBpcnEuCj7CoCAzLjYgcmVnaXN0ZXIgbmV0ZGV2Cj7CoCAzLjcgc29tZSBvdGhlciBoYW5k bGVzIHN1Y2ggYXMgc3lzZnMgYXR0cmlidXRlcy4KCnN5c2ZzIGF0dHJpYnV0ZXMgcmluZ3MgYWxh cm0gYmVsbHMuIFBsZWFzZSBtYWtlIHRoYXQgYSBwYXRjaCBvZiBpdHMKb3duIHNvIGl0IGNhbiBn ZXQgcHJvcGVyIHJldmlldy4KCj4gCj4gU2lnbmVkLW9mZi1ieTogaWxsdXNpb24ud2FuZyA8aWxs dXNpb24ud2FuZ0BuZWJ1bGEtbWF0cml4LmNvbT4KPiBDaGFuZ2UtSWQ6IEljOTdiYmU1M2FjZTBl NzBlYzcwNDIzNTUxM2EyMTc0ZDZjOWIyMTllCj4gLS0tCj7CoCAuLi4vbmV0L2V0aGVybmV0L25l YnVsYS1tYXRyaXgvbmJsL25ibF9jb3JlLmggfMKgIMKgIDIgKwo+wqAgLi4uL25lYnVsYS1tYXRy aXgvbmJsL25ibF9jb3JlL25ibF9kZXYuY8KgIMKgIMKgIHwgMzUxMyArKysrKysrKysrKy0tLS0t Cj7CoCAuLi4vbmVidWxhLW1hdHJpeC9uYmwvbmJsX2NvcmUvbmJsX3NlcnZpY2UuY8KgIHwgMzU5 NSArKysrKysrKysrKysrKystLQo+wqAgLi4uL25ibC9uYmxfaW5jbHVkZS9uYmxfZGVmX2Rldi5o IMKgIMKgIMKgIMKgIMKgIMKgIHzCoCDCoCA5ICstCj7CoCAuLi4vbmJsL25ibF9pbmNsdWRlL25i bF9kZWZfc2VydmljZS5oIMKgIMKgIMKgIMKgIHwgwqAgNTUgKwo+wqAgLi4uL25ldC9ldGhlcm5l dC9uZWJ1bGEtbWF0cml4L25ibC9uYmxfbWFpbi5jIHwgwqAgNzggKy0KPsKgIDYgZmlsZXMgY2hh bmdlZCwgNTgyOSBpbnNlcnRpb25zKCspLCAxNDIzIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZWJ1bGEtbWF0cml4L25ibC9uYmxfY29yZS5oIGIv ZHJpdmVycy9uZXQvZXRoZXJuZXQvbmVidWxhLW1hdHJpeC9uYmwvbmJsX2NvcmUuaAo+IGluZGV4 IDk2ZTAwYmNjNWZmNC4uNjlmN2EzYjFiM2FiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbmV0L2V0 aGVybmV0L25lYnVsYS1tYXRyaXgvbmJsL25ibF9jb3JlLmgKPiArKysgYi9kcml2ZXJzL25ldC9l dGhlcm5ldC9uZWJ1bGEtbWF0cml4L25ibC9uYmxfY29yZS5oCj4gQEAgLTEzNiw2ICsxMzYsOCBA QCBzdHJ1Y3QgbmJsX3NvZnR3YXJlX3Rvb2xfdGFibGUgewo+wqAgCj7CoCBzdHJ1Y3QgbmJsX2Fk YXB0ZXIgKm5ibF9jb3JlX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuYmxfaW5p dF9wYXJhbSAqcGFyYW0pOwo+wqAgdm9pZCBuYmxfY29yZV9yZW1vdmUoc3RydWN0IG5ibF9hZGFw dGVyICphZGFwdGVyKTsKPiAraW50IG5ibF9jb3JlX3N0YXJ0KHN0cnVjdCBuYmxfYWRhcHRlciAq YWRhcHRlciwgc3RydWN0IG5ibF9pbml0X3BhcmFtICpwYXJhbSk7Cj4gK3ZvaWQgbmJsX2NvcmVf c3RvcChzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIpOwo+wqAgCj7CoCBpbnQgbmJsX3N0X2lu aXQoc3RydWN0IG5ibF9zb2Z0d2FyZV90b29sX3RhYmxlICpzdF90YWJsZSk7Cj7CoCB2b2lkIG5i bF9zdF9yZW1vdmUoc3RydWN0IG5ibF9zb2Z0d2FyZV90b29sX3RhYmxlICpzdF90YWJsZSk7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25lYnVsYS1tYXRyaXgvbmJsL25ibF9j b3JlL25ibF9kZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25lYnVsYS1tYXRyaXgvbmJsL25i bF9jb3JlL25ibF9kZXYuYwo+IGluZGV4IDg1M2RkNTQ2OWY2MC4uZDk3NjUxYzVkYWEwIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25lYnVsYS1tYXRyaXgvbmJsL25ibF9jb3Jl L25ibF9kZXYuYwo+ICsrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25lYnVsYS1tYXRyaXgvbmJs L25ibF9jb3JlL25ibF9kZXYuYwo+IEBAIC0yNywxMSArMjcsMzUgQEAgc3RhdGljIHN0cnVjdCBu YmxfZGV2X2JvYXJkX2lkX3RhYmxlIGJvYXJkX2lkX3RhYmxlOwo+wqAgCj7CoCBzdHJ1Y3QgbmJs X2Rldl9vcHMgZGV2X29wczsKPsKgIAo+ICtzdGF0aWMgaW50IG5ibF9kZXZfY2xlYW5fbWFpbGJv eF9zY2hlZHVsZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpOwo+ICtzdGF0aWMgdm9pZCBu YmxfZGV2X2NsZWFuX2FkbWlucV9zY2hlZHVsZShzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19p bmZvKTsKPsKgIHN0YXRpYyB2b2lkIG5ibF9kZXZfaGFuZGxlX2ZhdGFsX2VycihzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QpOwo+wqAgc3RhdGljIGludCBuYmxfZGV2X3NldHVwX3N0X2Rldihz dHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0p Owo+wqAgc3RhdGljIHZvaWQgbmJsX2Rldl9yZW1vdmVfc3RfZGV2KHN0cnVjdCBuYmxfYWRhcHRl ciAqYWRhcHRlcik7Cj7CoCAKPsKgIC8qIC0tLS0tLS0tLS3CoCBCYXNpYyBmdW5jdGlvbnPCoCAt LS0tLS0tLS0tICovCj4gK3N0YXRpYyBpbnQgbmJsX2Rldl9nZXRfcG9ydF9hdHRyaWJ1dGVzKHN0 cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArewo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29w cyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArCj4gKyBy ZXR1cm4gc2Vydl9vcHMtPmdldF9wb3J0X2F0dHJpYnV0ZXMoTkJMX0RFVl9NR1RfVE9fU0VSVl9Q UklWKGRldl9tZ3QpKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X2VuYWJsZV9wb3J0 KHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgYm9vbCBlbmFibGUpCj4gK3sKPiArIHN0cnVj dCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2 X21ndCk7Cj4gKwo+ICsgcmV0dXJuIHNlcnZfb3BzLT5lbmFibGVfcG9ydChOQkxfREVWX01HVF9U T19TRVJWX1BSSVYoZGV2X21ndCksIGVuYWJsZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5i bF9kZXZfaW5pdF9wb3J0KHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArewo+ICsgc3Ry dWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhk ZXZfbWd0KTsKPiArCj4gKyBpZiAocmVzdG9yZV9ldGgpCj4gK8KgIHNlcnZfb3BzLT5pbml0X3Bv cnQoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpKTsKPiArfQo+ICsKPsKgIHN0YXRp YyBpbnQgbmJsX2Rldl9hbGxvY19ib2FyZF9pZChzdHJ1Y3QgbmJsX2Rldl9ib2FyZF9pZF90YWJs ZSAqaW5kZXhfdGFibGUsIHUzMiBib2FyZF9rZXkpCj7CoCB7Cj4gwqAgaW50IGkgPSAwOwo+IEBA IC03MCw3ICs5NCw0MSBAQCBzdGF0aWMgdm9pZCBuYmxfZGV2X2ZyZWVfYm9hcmRfaWQoc3RydWN0 IG5ibF9kZXZfYm9hcmRfaWRfdGFibGUgKmluZGV4X3RhYmxlLCB1Mwo+wqAgwqAgbWVtc2V0KCZp bmRleF90YWJsZS0+ZW50cnlbaV0sIDAsIHNpemVvZihpbmRleF90YWJsZS0+ZW50cnlbaV0pKTsK PsKgIH0KPsKgIAo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3NldF9uZXRkZXZfcHJpdihzdHJ1Y3Qg bmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSwKPiArwqAgwqAgwqAg wqAgc3RydWN0IG5ibF9kZXZfdnNpICp1c2VyX3ZzaSkKPiArewo+ICsgc3RydWN0IG5ibF9uZXRk ZXZfcHJpdiAqbmV0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwo+ICsKPiArIG5ldF9wcml2 LT50eF9xdWV1ZV9udW0gPSB2c2ktPnF1ZXVlX251bTsKPiArIG5ldF9wcml2LT5yeF9xdWV1ZV9u dW0gPSB2c2ktPnF1ZXVlX251bTsKPiArIG5ldF9wcml2LT5xdWV1ZV9zaXplID0gdnNpLT5xdWV1 ZV9zaXplOwo+ICsgbmV0X3ByaXYtPm5ldGRldiA9IG5ldGRldjsKPiArIG5ldF9wcml2LT5kYXRh X3ZzaSA9IHZzaS0+dnNpX2lkOwo+ICsgaWYgKHVzZXJfdnNpKQo+ICvCoCBuZXRfcHJpdi0+dXNl cl92c2kgPSB1c2VyX3ZzaS0+dnNpX2lkOwo+ICsgZWxzZQo+ICvCoCBuZXRfcHJpdi0+dXNlcl92 c2kgPSB2c2ktPnZzaV9pZDsKPiArfQo+ICsKPsKgIC8qIC0tLS0tLS0tLS3CoCBJbnRlcnJ1cHQg Y29uZmlnwqAgLS0tLS0tLS0tLSAqLwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbmJsX2Rldl9jbGVh bl9tYWlsYm94KGludCBfX2Fsd2F5c191bnVzZWQgaXJxLCB2b2lkICpkYXRhKQo+ICt7Cj4gKyBz dHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopZGF0YTsK PiArCj4gKyBuYmxfZGV2X2NsZWFuX21haWxib3hfc2NoZWR1bGUoZGV2X21ndCk7Cj4gKwo+ICsg cmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbmJsX2Rl dl9jbGVhbl9hZG1pbnEoaW50IF9fYWx3YXlzX3VudXNlZCBpcnEsIHZvaWQgKmRhdGEpCj4gK3sK PiArIHN0cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSAoc3RydWN0IG5ibF90YXNrX2lu Zm8gKilkYXRhOwo+ICsKPiArIG5ibF9kZXZfY2xlYW5fYWRtaW5xX3NjaGVkdWxlKHRhc2tfaW5m byk7Cj4gKwo+ICsgcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+wqAgc3RhdGljIHZvaWQg bmJsX2Rldl9oYW5kbGVfYWJub3JtYWxfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ wqAgewo+IMKgIHN0cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yo d29yaywgc3RydWN0IG5ibF90YXNrX2luZm8sCj4gQEAgLTgxLDYgKzEzOSwyMyBAQCBzdGF0aWMg dm9pZCBuYmxfZGV2X2hhbmRsZV9hYm5vcm1hbF9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndv cmspCj4gwqAgc2Vydl9vcHMtPnByb2Nlc3NfYWJub3JtYWxfZXZlbnQoTkJMX0RFVl9NR1RfVE9f U0VSVl9QUklWKGRldl9tZ3QpKTsKPsKgIH0KPsKgIAo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2Ns ZWFuX2Fibm9ybWFsX3N0YXR1cyhzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiAr IHN0cnVjdCBuYmxfZGV2X2N0cmwgKmN0cmxfZGV2ID0gTkJMX0RFVl9NR1RfVE9fQ1RSTF9ERVYo ZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvID0gTkJMX0RFVl9D VFJMX1RPX1RBU0tfSU5GTyhjdHJsX2Rldik7Cj4gKwo+ICsgbmJsX2NvbW1vbl9xdWV1ZV93b3Jr KCZ0YXNrX2luZm8tPmNsZWFuX2Fibm9ybWFsX2lycV90YXNrLCB0cnVlKTsKPiArfQo+ICsKPiAr c3RhdGljIGlycXJldHVybl90IG5ibF9kZXZfY2xlYW5fYWJub3JtYWxfZXZlbnQoaW50IF9fYWx3 YXlzX3VudXNlZCBpcnEsIHZvaWQgKmRhdGEpCj4gK3sKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAq ZGV2X21ndCA9IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKilkYXRhOwo+ICsKPiArIG5ibF9kZXZfY2xl YW5fYWJub3JtYWxfc3RhdHVzKGRldl9tZ3QpOwo+ICsKPiArIHJldHVybiBJUlFfSEFORExFRDsK PiArfQo+ICsKPsKgIHN0YXRpYyB2b2lkIG5ibF9kZXZfcmVnaXN0ZXJfY29tbW9uX2lycShzdHJ1 Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj7CoCB7Cj4gwqAgc3RydWN0IG5ibF9kZXZfY29tbW9u ICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsKPiBAQCAt MTE0LDE0MTQgKzE4OSwyODc2IEBAIHN0YXRpYyB2b2lkIG5ibF9kZXZfcmVnaXN0ZXJfY3RybF9p cnEoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+IMKgIG1zaXhfaW5mby0+c2Vydl9pbmZv W05CTF9NU0lYX0FETUlORFFfVFlQRV0ubnVtID0gaXJxX251bS5hZG1pbnFfaXJxX251bTsKPsKg IH0KPsKgIAo+IC0vKiAtLS0tLS0tLS0twqAgQ2hhbm5lbCBjb25maWfCoCAtLS0tLS0tLS0tICov Cj4gLXN0YXRpYyBpbnQgbmJsX2Rldl9zZXR1cF9jaGFuX3FpbmZvKHN0cnVjdCBuYmxfZGV2X21n dCAqZGV2X21ndCwgdTggY2hhbl90eXBlKQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfcmVxdWVzdF9u ZXRfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxf Y2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7 Cj4gLSBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfREVWX01HVF9UT19ERVYoZGV2X21ndCk7Cj4g KyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZf T1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfY29tbW9uICpkZXZfY29tbW9uID0gTkJM X0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfbXNpeF9pbmZv ICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9UT19NU0lYX0lORk8oZGV2X2NvbW1vbik7Cj4g KyBzdHJ1Y3QgbmJsX21zaXhfaW5mb19wYXJhbSBwYXJhbSA9IHswfTsKPiArIGludCBtc2l4X251 bSA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX05FVF9UWVBFXS5udW07Cj4gwqAgaW50 IHJldCA9IDA7Cj7CoCAKPiAtIGlmICghY2hhbl9vcHMtPmNoZWNrX3F1ZXVlX2V4aXN0KE5CTF9E RVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgY2hhbl90eXBlKSkKPiAtwqAgcmV0dXJuIDA7 Cj4gKyBwYXJhbS5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKG1zaXhfbnVtLCBzaXplb2YoKnBhcmFt Lm1zaXhfZW50cmllcyksIEdGUF9LRVJORUwpOwo+ICsgaWYgKCFwYXJhbS5tc2l4X2VudHJpZXMp Cj4gK8KgIHJldHVybiAtRU5PTUVNOwo+wqAgCj4gLSByZXQgPSBjaGFuX29wcy0+Y2ZnX2NoYW5f cWluZm9fbWFwX3RhYmxlKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwKPiAtIMKg IMKgIMKgIGNoYW5fdHlwZSk7Cj4gLSBpZiAocmV0KQo+IC3CoCBkZXZfZXJyKGRldiwgInNldHVw IGNoYW46JWQsIHFpbmZvIG1hcCB0YWJsZSBmYWlsZWRcbiIsIGNoYW5fdHlwZSk7Cj4gKyBwYXJh bS5tc2l4X251bSA9IG1zaXhfbnVtOwo+ICsgbWVtY3B5KHBhcmFtLm1zaXhfZW50cmllcywgbXNp eF9pbmZvLT5tc2l4X2VudHJpZXMgKwo+ICvCoCBtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJ WF9ORVRfVFlQRV0uYmFzZV92ZWN0b3JfaWQsCj4gK8KgIHNpemVvZihwYXJhbS5tc2l4X2VudHJp ZXNbMF0pICogbXNpeF9udW0pOwo+wqAgCj4gKyByZXQgPSBzZXJ2X29wcy0+cmVxdWVzdF9uZXRf aXJxKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgJnBhcmFtKTsKPiArCj4gKyBr ZnJlZShwYXJhbS5tc2l4X2VudHJpZXMpOwo+IMKgIHJldHVybiByZXQ7Cj7CoCB9Cj7CoCAKPiAt c3RhdGljIGludCBuYmxfZGV2X3NldHVwX2NoYW5fcXVldWUoc3RydWN0IG5ibF9kZXZfbWd0ICpk ZXZfbWd0LCB1OCBjaGFuX3R5cGUpCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfZnJlZV9uZXRfaXJx KHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfY2hhbm5l bF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gLSBp bnQgcmV0ID0gMDsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RF Vl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jb21tb24gKmRl dl9jb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT05fREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0 IG5ibF9tc2l4X2luZm8gKm1zaXhfaW5mbyA9IE5CTF9ERVZfQ09NTU9OX1RPX01TSVhfSU5GTyhk ZXZfY29tbW9uKTsKPiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvX3BhcmFtIHBhcmFtID0gezB9Owo+ ICsgaW50IG1zaXhfbnVtID0gbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfTkVUX1RZUEVd Lm51bTsKPsKgIAo+IC0gaWYgKGNoYW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxfREVWX01H VF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlwZSkpCj4gLcKgIHJldCA9IGNoYW5fb3Bz LT5zZXR1cF9xdWV1ZShOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlw ZSk7Cj4gKyBwYXJhbS5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKG1zaXhfbnVtLCBzaXplb2YoKnBh cmFtLm1zaXhfZW50cmllcyksIEdGUF9LRVJORUwpOwo+ICsgaWYgKCFwYXJhbS5tc2l4X2VudHJp ZXMpCj4gK8KgIHJldHVybjsKPsKgIAo+IC0gcmV0dXJuIHJldDsKPiArIHBhcmFtLm1zaXhfbnVt ID0gbXNpeF9udW07Cj4gKyBtZW1jcHkocGFyYW0ubXNpeF9lbnRyaWVzLCBtc2l4X2luZm8tPm1z aXhfZW50cmllcyArCj4gK8KgIG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX05FVF9UWVBF XS5iYXNlX3ZlY3Rvcl9pZCwKPiArwqAgwqAgwqAgwqAgc2l6ZW9mKHBhcmFtLm1zaXhfZW50cmll c1swXSkgKiBtc2l4X251bSk7Cj4gKwo+ICsgc2Vydl9vcHMtPmZyZWVfbmV0X2lycShOQkxfREVW X01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksICZwYXJhbSk7Cj4gKwo+ICsga2ZyZWUocGFyYW0u bXNpeF9lbnRyaWVzKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfcmVtb3ZlX2No YW5fcXVldWUoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCB1OCBjaGFuX3R5cGUpCj4gK3N0 YXRpYyBpbnQgbmJsX2Rldl9yZXF1ZXN0X21haWxib3hfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAq ZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJM X0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gLSBpbnQgcmV0ID0gMDsKPiArIHN0cnVj dCBkZXZpY2UgKmRldiA9IE5CTF9ERVZfTUdUX1RPX0RFVihkZXZfbWd0KTsKPiArIHN0cnVjdCBu YmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsK PiArIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAqZGV2X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NP TU1PTl9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0g TkJMX0RFVl9DT01NT05fVE9fTVNJWF9JTkZPKGRldl9jb21tb24pOwo+ICsgdTE2IGxvY2FsX3Zl Y3Rvcl9pZDsKPiArIHUzMiBpcnFfbnVtOwo+ICsgaW50IGVycjsKPsKgIAo+IC0gaWYgKGNoYW5f b3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCks IGNoYW5fdHlwZSkpCj4gLcKgIHJldCA9IGNoYW5fb3BzLT50ZWFyZG93bl9xdWV1ZShOQkxfREVW X01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlwZSk7Cj4gKyBpZiAoIW1zaXhfaW5m by0+c2Vydl9pbmZvW05CTF9NU0lYX01BSUxCT1hfVFlQRV0ubnVtKQo+ICvCoCByZXR1cm4gMDsK PsKgIAo+IC0gcmV0dXJuIHJldDsKPiAtfQo+ICsgbG9jYWxfdmVjdG9yX2lkID0gbXNpeF9pbmZv LT5zZXJ2X2luZm9bTkJMX01TSVhfTUFJTEJPWF9UWVBFXS5iYXNlX3ZlY3Rvcl9pZDsKPiArIGly cV9udW0gPSBtc2l4X2luZm8tPm1zaXhfZW50cmllc1tsb2NhbF92ZWN0b3JfaWRdLnZlY3RvcjsK PsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3JlbW92ZV9jaGFuX2tlZXBhbGl2ZShzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHU4IGNoYW5fdHlwZSkKPiAtewo+IC0gc3RydWN0IG5ibF9j aGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsK PiArIHNucHJpbnRmKGRldl9jb21tb24tPm1haWxib3hfbmFtZSwgc2l6ZW9mKGRldl9jb21tb24t Pm1haWxib3hfbmFtZSksCj4gKyDCoCAibmJsX21haWxib3hAcGNpOiVzIiwgcGNpX25hbWUoTkJM X0NPTU1PTl9UT19QREVWKGNvbW1vbikpKTsKPiArIGVyciA9IGRldm1fcmVxdWVzdF9pcnEoZGV2 LCBpcnFfbnVtLCBuYmxfZGV2X2NsZWFuX21haWxib3gsCj4gK8KgIMKgIMKgIMKgIMKgIDAsIGRl dl9jb21tb24tPm1haWxib3hfbmFtZSwgZGV2X21ndCk7Cj4gKyBpZiAoZXJyKSB7Cj4gK8KgIGRl dl9lcnIoZGV2LCAiUmVxdWVzdCBtYWlsYm94IGlycSBoYW5kbGVyIGZhaWxlZCBlcnI6ICVkXG4i LCBlcnIpOwo+ICvCoCByZXR1cm4gZXJyOwo+ICsgfQo+wqAgCj4gLSBpZiAoY2hhbl9vcHMtPmNo ZWNrX3F1ZXVlX2V4aXN0KE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgY2hhbl90 eXBlKSkKPiAtwqAgY2hhbl9vcHMtPnJlbW92ZV9rZWVwYWxpdmUoTkJMX0RFVl9NR1RfVE9fQ0hB Tl9QUklWKGRldl9tZ3QpLCBjaGFuX3R5cGUpOwo+ICsgcmV0dXJuIDA7Cj7CoCB9Cj7CoCAKPiAt c3RhdGljIHZvaWQgbmJsX2Rldl9yZWdpc3Rlcl9jaGFuX3Rhc2soc3RydWN0IG5ibF9kZXZfbWd0 ICpkZXZfbWd0LAo+IC0gwqAgwqAgwqAgwqAgwqAgdTggY2hhbl90eXBlLCBzdHJ1Y3Qgd29ya19z dHJ1Y3QgKnRhc2spCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfZnJlZV9tYWlsYm94X2lycShzdHJ1 Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX2NoYW5uZWxfb3Bz ICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0 IGRldmljZSAqZGV2ID0gTkJMX0RFVl9NR1RfVE9fREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5i bF9kZXZfY29tbW9uICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZf bWd0KTsKPiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1P Tl9UT19NU0lYX0lORk8oZGV2X2NvbW1vbik7Cj4gKyB1MTYgbG9jYWxfdmVjdG9yX2lkOwo+ICsg dTMyIGlycV9udW07Cj7CoCAKPiAtIGlmIChjaGFuX29wcy0+Y2hlY2tfcXVldWVfZXhpc3QoTkJM X0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLCBjaGFuX3R5cGUpKQo+IC3CoCBjaGFuX29w cy0+cmVnaXN0ZXJfY2hhbl90YXNrKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwg Y2hhbl90eXBlLCB0YXNrKTsKPiAtfQo+ICsgaWYgKCFtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxf TVNJWF9NQUlMQk9YX1RZUEVdLm51bSkKPiArwqAgcmV0dXJuOwo+wqAgCj4gLS8qIC0tLS0tLS0t LS3CoCBUYXNrcyBjb25maWfCoCAtLS0tLS0tLS0tICovCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZf Y2xlYW5fbWFpbGJveF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiAtewo+IC0gc3Ry dWN0IG5ibF9kZXZfY29tbW9uICpjb21tb25fZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVj dCBuYmxfZGV2X2NvbW1vbiwKPiAtwqAgwqAgwqAgwqAgY2xlYW5fbWJ4X3Rhc2spOwo+IC0gc3Ry dWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gY29tbW9uX2Rldi0+ZGV2X21ndDsKPiAtIHN0cnVj dCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2 X21ndCk7Cj4gKyBsb2NhbF92ZWN0b3JfaWQgPSBtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJ WF9NQUlMQk9YX1RZUEVdLmJhc2VfdmVjdG9yX2lkOwo+ICsgaXJxX251bSA9IG1zaXhfaW5mby0+ bXNpeF9lbnRyaWVzW2xvY2FsX3ZlY3Rvcl9pZF0udmVjdG9yOwo+wqAgCj4gLSBjaGFuX29wcy0+ Y2xlYW5fcXVldWVfc3VidGFzayhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIE5C TF9DSEFOX1RZUEVfTUFJTEJPWCk7Cj4gKyBkZXZtX2ZyZWVfaXJxKGRldiwgaXJxX251bSwgZGV2 X21ndCk7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9wcmVwYXJlX3Jlc2V0X3Rh c2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfZW5hYmxl X21haWxib3hfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIGludCBy ZXQ7Cj4gLSBzdHJ1Y3QgbmJsX3Jlc2V0X3Rhc2tfaW5mbyAqdGFza19pbmZvID0gY29udGFpbmVy X29mKHdvcmssIHN0cnVjdCBuYmxfcmVzZXRfdGFza19pbmZvLAo+IC3CoCDCoCDCoCDCoCDCoCDC oCB0YXNrKTsKPiAtIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAqY29tbW9uX2RldiA9IGNvbnRhaW5l cl9vZih0YXNrX2luZm8sIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiwKPiAtwqAgwqAgwqAgwqAgcmVz ZXRfdGFzayk7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSBjb21tb25fZGV2LT5k ZXZfbWd0Owo+IC0gc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1Rf VE9fQ09NTU9OKGRldl9tZ3QpOwo+IMKgIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3Bz ID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gwqAgc3RydWN0IG5ibF9jaGFu bmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiAt IHN0cnVjdCBuYmxfY2hhbl9zZW5kX2luZm8gY2hhbl9zZW5kOwo+ICsgc3RydWN0IG5ibF9kZXZf Y29tbW9uICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsK PiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9UT19N U0lYX0lORk8oZGV2X2NvbW1vbik7Cj4gKyB1MTYgbG9jYWxfdmVjdG9yX2lkOwo+wqAgCj4gLSBz ZXJ2X29wcy0+bmV0ZGV2X3N0b3AoZGV2X21ndC0+bmV0X2Rldi0+bmV0ZGV2KTsKPiAtIG5ldGlm X2RldmljZV9kZXRhY2goZGV2X21ndC0+bmV0X2Rldi0+bmV0ZGV2KTsgLyogdG8gYXZvaWQgZXRo dG9vbCBvcGVyYXRpb24gKi8KPiAtIG5ibF9kZXZfcmVtb3ZlX2NoYW5fa2VlcGFsaXZlKGRldl9t Z3QsIE5CTF9DSEFOX1RZUEVfTUFJTEJPWCk7Cj4gKyBpZiAoIW1zaXhfaW5mby0+c2Vydl9pbmZv W05CTF9NU0lYX01BSUxCT1hfVFlQRV0ubnVtKQo+ICvCoCByZXR1cm4gMDsKPsKgIAo+IC0gTkJM X0NIQU5fU0VORChjaGFuX3NlbmQsIE5CTF9DT01NT05fVE9fTUdUX1BGKGNvbW1vbiksIE5CTF9D SEFOX01TR19BQ0tfUkVTRVRfRVZFTlQsIE5VTEwsCj4gLcKgIMKgIMKgIMKgIDAsIE5VTEwsIDAs IDApOwo+IC0gLyogbm90aWZ5IGN0cmwgZGV2LCBmaW5pc2ggcmVzZXQgZXZlbnQgcHJvY2VzcyAq Lwo+IC0gcmV0ID0gY2hhbl9vcHMtPnNlbmRfbXNnKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihk ZXZfbWd0KSwgJmNoYW5fc2VuZCk7Cj4gLSBjaGFuX29wcy0+c2V0X3F1ZXVlX3N0YXRlKE5CTF9E RVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgTkJMX0NIQU5fQUJOT1JNQUwsCj4gKyBsb2Nh bF92ZWN0b3JfaWQgPSBtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJWF9NQUlMQk9YX1RZUEVd LmJhc2VfdmVjdG9yX2lkOwo+ICsgY2hhbl9vcHMtPnNldF9xdWV1ZV9zdGF0ZShOQkxfREVWX01H VF9UT19DSEFOX1BSSVYoZGV2X21ndCksIE5CTF9DSEFOX0lOVEVSUlVQVF9SRUFEWSwKPsKgIMKg IMKgIMKgIE5CTF9DSEFOX1RZUEVfTUFJTEJPWCwgdHJ1ZSk7Cj7CoCAKPiAtIC8qIHNsZWVwIHRv IGF2b2lkIHNlbmRfbXNnIGlzIHJ1bm5pbmcgKi8KPiAtIHVzbGVlcF9yYW5nZSgxMCwgMjApOwo+ IC0KPiAtIC8qIGN0cmwgZGV2IG11c3Qgc2h1dGRvd24gcGh5IHJlZyByZWFkL3dyaXRlIGFmdGVy IGN0cmwgZGV2IGhhcyBub3RpZnkgZW1wIHNodXRkb3duIGRldiAqLwo+IC0gaWYgKCFOQkxfREVW X01HVF9UT19DVFJMX0RFVihkZXZfbWd0KSkKPiAtwqAgc2Vydl9vcHMtPnNldF9od19zdGF0dXMo TkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBOQkxfSFdfRkFUQUxfRVJSKTsKPiAr IHJldHVybiBzZXJ2X29wcy0+ZW5hYmxlX21haWxib3hfaXJxKE5CTF9ERVZfTUdUX1RPX1NFUlZf UFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIMKgIGxvY2FsX3ZlY3Rvcl9pZCwgdHJ1ZSk7Cj7C oCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9jbGVhbl9hZG1pbnFfdGFzayhzdHJ1Y3Qg d29ya19zdHJ1Y3QgKndvcmspCj4gK3N0YXRpYyBpbnQgbmJsX2Rldl9kaXNhYmxlX21haWxib3hf aXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfdGFz a19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ibF90YXNrX2lu Zm8sCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCBjbGVhbl9hZG1pbnFfdGFzayk7Cj4gLSBzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSB0YXNrX2luZm8tPmRldl9tZ3Q7Cj4gKyBzdHJ1Y3QgbmJs X3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3Qp Owo+IMKgIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9f Q0hBTl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jb21tb24gKmRldl9jb21tb24g PSBOQkxfREVWX01HVF9UT19DT01NT05fREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9tc2l4 X2luZm8gKm1zaXhfaW5mbyA9IE5CTF9ERVZfQ09NTU9OX1RPX01TSVhfSU5GTyhkZXZfY29tbW9u KTsKPiArIHUxNiBsb2NhbF92ZWN0b3JfaWQ7Cj7CoCAKPiAtIGNoYW5fb3BzLT5jbGVhbl9xdWV1 ZV9zdWJ0YXNrKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgTkJMX0NIQU5fVFlQ RV9BRE1JTlEpOwo+ICsgaWYgKCFtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJWF9NQUlMQk9Y X1RZUEVdLm51bSkKPiArwqAgcmV0dXJuIDA7Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJv ZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKg IMKgIE5CTF9UQVNLX0NMRUFOX01BSUxCT1hfQ0FQKSkKPiArwqAgbmJsX2NvbW1vbl9mbHVzaF90 YXNrKCZkZXZfY29tbW9uLT5jbGVhbl9tYnhfdGFzayk7Cj4gKwo+ICsgbG9jYWxfdmVjdG9yX2lk ID0gbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfTUFJTEJPWF9UWVBFXS5iYXNlX3ZlY3Rv cl9pZDsKPiArIGNoYW5fb3BzLT5zZXRfcXVldWVfc3RhdGUoTkJMX0RFVl9NR1RfVE9fQ0hBTl9Q UklWKGRldl9tZ3QpLCBOQkxfQ0hBTl9JTlRFUlJVUFRfUkVBRFksCj4gK8KgIMKgIMKgIE5CTF9D SEFOX1RZUEVfTUFJTEJPWCwgZmFsc2UpOwo+ICsKPiArIHJldHVybiBzZXJ2X29wcy0+ZW5hYmxl X21haWxib3hfaXJxKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKg IMKgIMKgIGxvY2FsX3ZlY3Rvcl9pZCwgZmFsc2UpOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lk IG5ibF9kZXZfZndfaGVhcnRiZWF0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICtz dGF0aWMgaW50IG5ibF9kZXZfcmVxdWVzdF9hZG1pbnFfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAq ZGV2X21ndCwgc3RydWN0IG5ibF90YXNrX2luZm8gKnRhc2tfaW5mbykKPsKgIHsKPiAtIHN0cnVj dCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5i bF90YXNrX2luZm8sCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCBmd19oYl90YXNrKTsKPiAtIHN0cnVj dCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2X21ndDsKPiAtIHN0cnVjdCBu YmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21n dCk7Cj4gLSBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RP X1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IGRldmljZSAqZGV2ID0gTkJMX0RFVl9NR1Rf VE9fREVWKGRldl9tZ3QpOwo+IMKgIHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5C TF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAq ZGV2X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1 Y3QgbmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0gTkJMX0RFVl9DT01NT05fVE9fTVNJWF9JTkZP KGRldl9jb21tb24pOwo+ICsgdTE2IGxvY2FsX3ZlY3Rvcl9pZDsKPiArIHUzMiBpcnFfbnVtOwo+ ICsgY2hhciAqaXJxX25hbWU7Cj4gKyBpbnQgZXJyOwo+wqAgCj4gLSBpZiAodGFza19pbmZvLT5m d19yZXNldHRpbmcpCj4gLcKgIHJldHVybjsKPiArIGlmICghbXNpeF9pbmZvLT5zZXJ2X2luZm9b TkJMX01TSVhfQURNSU5EUV9UWVBFXS5udW0pCj4gK8KgIHJldHVybiAwOwo+wqAgCj4gLSBpZiAo IXNlcnZfb3BzLT5jaGVja19md19oZWFydGJlYXQoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRl dl9tZ3QpKSkgewo+IC3CoCBkZXZfbm90aWNlKE5CTF9DT01NT05fVE9fREVWKGNvbW1vbiksICJG VyByZXNldCBkZXRlY3RlZCIpOwo+IC3CoCB0YXNrX2luZm8tPmZ3X3Jlc2V0dGluZyA9IHRydWU7 Cj4gLcKgIGNoYW5fb3BzLT5zZXRfcXVldWVfc3RhdGUoTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklW KGRldl9tZ3QpLCBOQkxfQ0hBTl9BQk5PUk1BTCwKPiAtIMKgIMKgIE5CTF9DSEFOX1RZUEVfQURN SU5RLCB0cnVlKTsKPiAtwqAgbmJsX2NvbW1vbl9xdWV1ZV9kZWxheWVkX3dvcmsoJnRhc2tfaW5m by0+ZndfcmVzZXRfdGFzaywgTVNFQ19QRVJfU0VDLCB0cnVlKTsKPiArIGxvY2FsX3ZlY3Rvcl9p ZCA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX0FETUlORFFfVFlQRV0uYmFzZV92ZWN0 b3JfaWQ7Cj4gKyBpcnFfbnVtID0gbXNpeF9pbmZvLT5tc2l4X2VudHJpZXNbbG9jYWxfdmVjdG9y X2lkXS52ZWN0b3I7Cj4gKyBpcnFfbmFtZSA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lY X0FETUlORFFfVFlQRV0uaXJxX25hbWU7Cj4gKwo+ICsgc25wcmludGYoaXJxX25hbWUsIE5CTF9T VFJJTkdfTkFNRV9MRU4sICJuYmxfYWRtaW5xQHBjaTolcyIsCj4gKyDCoCBwY2lfbmFtZShOQkxf Q09NTU9OX1RPX1BERVYoY29tbW9uKSkpOwo+ICsgZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYs IGlycV9udW0sIG5ibF9kZXZfY2xlYW5fYWRtaW5xLAo+ICvCoCDCoCDCoCDCoCDCoCAwLCBpcnFf bmFtZSwgdGFza19pbmZvKTsKPiArIGlmIChlcnIpIHsKPiArwqAgZGV2X2VycihkZXYsICJSZXF1 ZXN0IGFkbWlucSBpcnEgaGFuZGxlciBmYWlsZWQgZXJyOiAlZFxuIiwgZXJyKTsKPiArwqAgcmV0 dXJuIGVycjsKPiDCoCB9Cj4gKwo+ICsgcmV0dXJuIDA7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZv aWQgbmJsX2Rldl9md19yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArc3Rh dGljIHZvaWQgbmJsX2Rldl9mcmVlX2FkbWlucV9pcnEoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0LCBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvKQo+wqAgewo+ICsgc3RydWN0IGRl dmljZSAqZGV2ID0gTkJMX0RFVl9NR1RfVE9fREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9k ZXZfY29tbW9uICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0 KTsKPiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9U T19NU0lYX0lORk8oZGV2X2NvbW1vbik7Cj4gKyB1MTYgbG9jYWxfdmVjdG9yX2lkOwo+ICsgdTMy IGlycV9udW07Cj4gKwo+ICsgaWYgKCFtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJWF9BRE1J TkRRX1RZUEVdLm51bSkKPiArwqAgcmV0dXJuOwo+ICsKPiArIGxvY2FsX3ZlY3Rvcl9pZCA9IG1z aXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX0FETUlORFFfVFlQRV0uYmFzZV92ZWN0b3JfaWQ7 Cj4gKyBpcnFfbnVtID0gbXNpeF9pbmZvLT5tc2l4X2VudHJpZXNbbG9jYWxfdmVjdG9yX2lkXS52 ZWN0b3I7Cj4gKwo+ICsgZGV2bV9mcmVlX2lycShkZXYsIGlycV9udW0sIHRhc2tfaW5mbyk7Cj7C oCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9hZGFwdF9kZXNjX2dvdGhlcl90YXNrKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArc3RhdGljIGludCBuYmxfZGV2X2VuYWJsZV9hZG1p bnFfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxf dGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ibF90YXNr X2luZm8sCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCBhZGFwdF9kZXNjX2dvdGhlcl90YXNrKTsKPiAt IHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2X21ndDsKPiDCoCBz dHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BT KGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVW X01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAqZGV2 X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3Qg bmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0gTkJMX0RFVl9DT01NT05fVE9fTVNJWF9JTkZPKGRl dl9jb21tb24pOwo+ICsgdTE2IGxvY2FsX3ZlY3Rvcl9pZDsKPsKgIAo+IC0gc2Vydl9vcHMtPmFk YXB0X2Rlc2NfZ290aGVyKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSk7Cj4gKyBp ZiAoIW1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX0FETUlORFFfVFlQRV0ubnVtKQo+ICvC oCByZXR1cm4gMDsKPiArCj4gKyBsb2NhbF92ZWN0b3JfaWQgPSBtc2l4X2luZm8tPnNlcnZfaW5m b1tOQkxfTVNJWF9BRE1JTkRRX1RZUEVdLmJhc2VfdmVjdG9yX2lkOwo+ICsgY2hhbl9vcHMtPnNl dF9xdWV1ZV9zdGF0ZShOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIE5CTF9DSEFO X0lOVEVSUlVQVF9SRUFEWSwKPiArwqAgwqAgwqAgTkJMX0NIQU5fVFlQRV9BRE1JTlEsIHRydWUp Owo+ICsKPiArIHJldHVybiBzZXJ2X29wcy0+ZW5hYmxlX2FkbWlucV9pcnEoTkJMX0RFVl9NR1Rf VE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgwqAgbG9jYWxfdmVjdG9yX2lkLCB0 cnVlKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3JlY292ZXJ5X2Fibm9ybWFs X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfZGlz YWJsZV9hZG1pbnFfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0 cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0 IG5ibF90YXNrX2luZm8sCj4gLSDCoCDCoCDCoCDCoCDCoCDCoCByZWNvdmVyeV9hYm5vcm1hbF90 YXNrKTsKPiAtIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2X21n dDsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RP X1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMg PSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X2Nv bW1vbiAqZGV2X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCk7Cj4g KyBzdHJ1Y3QgbmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0gTkJMX0RFVl9DT01NT05fVE9fTVNJ WF9JTkZPKGRldl9jb21tb24pOwo+ICsgdTE2IGxvY2FsX3ZlY3Rvcl9pZDsKPsKgIAo+IC0gc2Vy dl9vcHMtPnJlY292ZXJ5X2Fibm9ybWFsKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSk7Cj4gLX0KPiArIGlmICghbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfQURNSU5EUV9U WVBFXS5udW0pCj4gK8KgIHJldHVybiAwOwo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZfY3Ry bF9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiAtewo+IC0gc3RydWN0IG5i bF90YXNrX2luZm8gKnRhc2tfaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmJsX3Rh c2tfaW5mbywKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIHJlc2V0X3Rhc2spOwo+IC0gc3RydWN0IG5i bF9kZXZfbWd0ICpkZXZfbWd0ID0gdGFza19pbmZvLT5kZXZfbWd0Owo+ICsgbG9jYWxfdmVjdG9y X2lkID0gbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfQURNSU5EUV9UWVBFXS5iYXNlX3Zl Y3Rvcl9pZDsKPiArIGNoYW5fb3BzLT5zZXRfcXVldWVfc3RhdGUoTkJMX0RFVl9NR1RfVE9fQ0hB Tl9QUklWKGRldl9tZ3QpLCBOQkxfQ0hBTl9JTlRFUlJVUFRfUkVBRFksCj4gK8KgIMKgIMKgIE5C TF9DSEFOX1RZUEVfQURNSU5RLCBmYWxzZSk7Cj7CoCAKPiAtIG5ibF9kZXZfaGFuZGxlX2ZhdGFs X2VycihkZXZfbWd0KTsKPiArIHJldHVybiBzZXJ2X29wcy0+ZW5hYmxlX2FkbWlucV9pcnEoTkJM X0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgwqAgbG9jYWxfdmVj dG9yX2lkLCBmYWxzZSk7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9jdHJsX3Rh c2tfc2NoZWR1bGUoc3RydWN0IG5ibF90YXNrX2luZm8gKnRhc2tfaW5mbykKPiArc3RhdGljIGlu dCBuYmxfZGV2X3JlcXVlc3RfYWJub3JtYWxfaXJxKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21n dCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2 X21ndDsKPiAtIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1Rf VE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfREVWX01H VF9UT19ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBO QkxfREVWX01HVF9UT19DT01NT04oZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jb21tb24g KmRldl9jb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT05fREVWKGRldl9tZ3QpOwo+ICsgc3Ry dWN0IG5ibF9tc2l4X2luZm8gKm1zaXhfaW5mbyA9IE5CTF9ERVZfQ09NTU9OX1RPX01TSVhfSU5G TyhkZXZfY29tbW9uKTsKPiArIGNoYXIgKmlycV9uYW1lOwo+ICsgdTMyIGlycV9udW07Cj4gKyBp bnQgZXJyOwo+ICsgdTE2IGxvY2FsX3ZlY3Rvcl9pZDsKPsKgIAo+IC0gaWYgKHNlcnZfb3BzLT5n ZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAt IMKgIMKgIMKgIE5CTF9UQVNLX0ZXX0hCX0NBUCkpCj4gLcKgIG5ibF9jb21tb25fcXVldWVfd29y aygmdGFza19pbmZvLT5md19oYl90YXNrLCB0cnVlKTsKPiArIGlmICghbXNpeF9pbmZvLT5zZXJ2 X2luZm9bTkJMX01TSVhfQUJOT1JNQUxfVFlQRV0ubnVtKQo+ICvCoCByZXR1cm4gMDsKPsKgIAo+ IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZf UFJJVihkZXZfbWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9UQVNLX0FEQVBUX0RFU0NfR09USEVSKSkK PiAtwqAgbmJsX2NvbW1vbl9xdWV1ZV93b3JrKCZ0YXNrX2luZm8tPmFkYXB0X2Rlc2NfZ290aGVy X3Rhc2ssIHRydWUpOwo+ICsgbG9jYWxfdmVjdG9yX2lkID0gbXNpeF9pbmZvLT5zZXJ2X2luZm9b TkJMX01TSVhfQUJOT1JNQUxfVFlQRV0uYmFzZV92ZWN0b3JfaWQ7Cj4gKyBpcnFfbnVtID0gbXNp eF9pbmZvLT5tc2l4X2VudHJpZXNbbG9jYWxfdmVjdG9yX2lkXS52ZWN0b3I7Cj4gKyBpcnFfbmFt ZSA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX0FCTk9STUFMX1RZUEVdLmlycV9uYW1l Owo+ICsKPiArIHNucHJpbnRmKGlycV9uYW1lLCBOQkxfU1RSSU5HX05BTUVfTEVOLCAibmJsX2Fi bm9ybWFsQHBjaTolcyIsCj4gKyDCoCBwY2lfbmFtZShOQkxfQ09NTU9OX1RPX1BERVYoY29tbW9u KSkpOwo+ICsgZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycV9udW0sIG5ibF9kZXZfY2xl YW5fYWJub3JtYWxfZXZlbnQsCj4gK8KgIMKgIMKgIMKgIMKgIDAsIGlycV9uYW1lLCBkZXZfbWd0 KTsKPiArIGlmIChlcnIpIHsKPiArwqAgZGV2X2VycihkZXYsICJSZXF1ZXN0IGFibm9ybWFsX2ly cSBpcnEgaGFuZGxlciBmYWlsZWQgZXJyOiAlZFxuIiwgZXJyKTsKPiArwqAgcmV0dXJuIGVycjsK PiArIH0KPsKgIAo+IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZf TUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9SRUNPVkVSWV9BQk5P Uk1BTF9TVEFUVVMpKQo+IC3CoCBuYmxfY29tbW9uX3F1ZXVlX3dvcmsoJnRhc2tfaW5mby0+cmVj b3ZlcnlfYWJub3JtYWxfdGFzaywgdHJ1ZSk7Cj4gKyByZXR1cm4gMDsKPsKgIH0KPsKgIAo+IC1z dGF0aWMgdm9pZCBuYmxfZGV2X2N0cmxfdGFza190aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCkK PiArc3RhdGljIHZvaWQgbmJsX2Rldl9mcmVlX2Fibm9ybWFsX2lycShzdHJ1Y3QgbmJsX2Rldl9t Z3QgKmRldl9tZ3QpCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvID0g Y29udGFpbmVyX29mKHQsIHN0cnVjdCBuYmxfdGFza19pbmZvLCBzZXJ2X3RpbWVyKTsKPiArIHN0 cnVjdCBkZXZpY2UgKmRldiA9IE5CTF9ERVZfTUdUX1RPX0RFVihkZXZfbWd0KTsKPiArIHN0cnVj dCBuYmxfZGV2X2NvbW1vbiAqZGV2X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYo ZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0gTkJMX0RFVl9D T01NT05fVE9fTVNJWF9JTkZPKGRldl9jb21tb24pOwo+ICsgdTE2IGxvY2FsX3ZlY3Rvcl9pZDsK PiArIHUzMiBpcnFfbnVtOwo+wqAgCj4gLSBtb2RfdGltZXIoJnRhc2tfaW5mby0+c2Vydl90aW1l ciwgcm91bmRfamlmZmllcyh0YXNrX2luZm8tPnNlcnZfdGltZXJfcGVyaW9kICsgamlmZmllcykp Owo+IC0gbmJsX2Rldl9jdHJsX3Rhc2tfc2NoZWR1bGUodGFza19pbmZvKTsKPiArIGlmICghbXNp eF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfQUJOT1JNQUxfVFlQRV0ubnVtKQo+ICvCoCByZXR1 cm47Cj4gKwo+ICsgbG9jYWxfdmVjdG9yX2lkID0gbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01T SVhfQUJOT1JNQUxfVFlQRV0uYmFzZV92ZWN0b3JfaWQ7Cj4gKyBpcnFfbnVtID0gbXNpeF9pbmZv LT5tc2l4X2VudHJpZXNbbG9jYWxfdmVjdG9yX2lkXS52ZWN0b3I7Cj4gKwo+ICsgZGV2bV9mcmVl X2lycShkZXYsIGlycV9udW0sIGRldl9tZ3QpOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lkIG5i bF9kZXZfY2hhbl9ub3RpZnlfZmxyX3Jlc3Aodm9pZCAqcHJpdiwgdTE2IHNyY19pZCwgdTE2IG1z Z19pZCwKPiAtwqAgwqAgwqAgdm9pZCAqZGF0YSwgdTMyIGRhdGFfbGVuKQo+ICtzdGF0aWMgaW50 IG5ibF9kZXZfZW5hYmxlX2Fibm9ybWFsX2lycShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3Qp Cj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZf bWd0ICopcHJpdjsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9E RVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+IC0gdTE2IHZmaWQ7Cj4gKyBzdHJ1Y3QgbmJs X2Rldl9jb21tb24gKmRldl9jb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT05fREVWKGRldl9t Z3QpOwo+ICsgc3RydWN0IG5ibF9tc2l4X2luZm8gKm1zaXhfaW5mbyA9IE5CTF9ERVZfQ09NTU9O X1RPX01TSVhfSU5GTyhkZXZfY29tbW9uKTsKPiArIHUxNiBsb2NhbF92ZWN0b3JfaWQ7Cj4gKyBp bnQgZXJyID0gMDsKPsKgIAo+IC0gdmZpZCA9ICoodTE2ICopZGF0YTsKPiAtIHNlcnZfb3BzLT5w cm9jZXNzX2ZscihOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHZmaWQpOwo+ICsg aWYgKCFtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxfTVNJWF9BQk5PUk1BTF9UWVBFXS5udW0pCj4g K8KgIHJldHVybiAwOwo+ICsKPiArIGxvY2FsX3ZlY3Rvcl9pZCA9IG1zaXhfaW5mby0+c2Vydl9p bmZvW05CTF9NU0lYX0FCTk9STUFMX1RZUEVdLmJhc2VfdmVjdG9yX2lkOwo+ICsgZXJyID0gc2Vy dl9vcHMtPmVuYWJsZV9hYm5vcm1hbF9pcnEoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9t Z3QpLAo+ICsgwqAgwqAgwqAgwqAgbG9jYWxfdmVjdG9yX2lkLCB0cnVlKTsKPiArCj4gKyByZXR1 cm4gZXJyOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZfY3RybF9yZWdpc3Rlcl9m bHJfY2hhbl9tc2coc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICtzdGF0aWMgaW50IG5i bF9kZXZfZGlzYWJsZV9hYm5vcm1hbF9pcnEoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ wqAgewo+IC0gc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9U T19DSEFOX09QUyhkZXZfbWd0KTsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29w cyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZf Y29tbW9uICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsK PiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9UT19N U0lYX0lORk8oZGV2X2NvbW1vbik7Cj4gKyB1MTYgbG9jYWxfdmVjdG9yX2lkOwo+ICsgaW50IGVy ciA9IDA7Cj7CoCAKPiAtIGlmICghc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RF Vl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+IC3CoCDCoCDCoCDCoCBOQkxfUFJPQ0VTU19G TFJfQ0FQKSkKPiAtwqAgcmV0dXJuOwo+ICsgaWYgKCFtc2l4X2luZm8tPnNlcnZfaW5mb1tOQkxf TVNJWF9BQk5PUk1BTF9UWVBFXS5udW0pCj4gK8KgIHJldHVybiAwOwo+wqAgCj4gLSBjaGFuX29w cy0+cmVnaXN0ZXJfbXNnKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwKPiAtwqAg wqAgwqAgwqAgwqAgTkJMX0NIQU5fTVNHX0FETUlOUV9GTFJfTk9USUZZLAo+IC3CoCDCoCDCoCDC oCDCoCBuYmxfZGV2X2NoYW5fbm90aWZ5X2Zscl9yZXNwLCBkZXZfbWd0KTsKPiArIGxvY2FsX3Zl Y3Rvcl9pZCA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW05CTF9NU0lYX0FCTk9STUFMX1RZUEVdLmJh c2VfdmVjdG9yX2lkOwo+ICsgZXJyID0gc2Vydl9vcHMtPmVuYWJsZV9hYm5vcm1hbF9pcnEoTkJM X0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgwqAgbG9jYWxfdmVj dG9yX2lkLCBmYWxzZSk7Cj4gKwo+ICsgcmV0dXJuIGVycjsKPsKgIH0KPsKgIAo+IC1zdGF0aWMg c3RydWN0IG5ibF9kZXZfdGVtcF9hbGFybV9pbmZvIHRlbXBfYWxhcm1faW5mb1tOQkxfVEVNUF9T VEFUVVNfTUFYXSA9IHsKPiAtIHtMT0dMRVZFTF9XQVJOSU5HLCAiSGlnaCB0ZW1wZXJhdHVyZSBv biBzZW5zb3JzMCByZXN1bWVkLlxuIn0sCj4gLSB7TE9HTEVWRUxfV0FSTklORywgIkhpZ2ggdGVt cGVyYXR1cmUgb24gc2Vuc29yczAgb2JzZXJ2ZWQsIHNlY3VyaXR5KFdBUk5JTkcpLlxuIn0sCj4g LSB7TE9HTEVWRUxfQ1JJVCwgIkhpZ2ggdGVtcGVyYXR1cmUgb24gc2Vuc29yczAgb2JzZXJ2ZWQs IHNlY3VyaXR5KENSSVRJQ0FMKS5cbiJ9LAo+IC0ge0xPR0xFVkVMX0VNRVJHLCAiSGlnaCB0ZW1w ZXJhdHVyZSBvbiBzZW5zb3JzMCBvYnNlcnZlZCwgc2VjdXJpdHkoRU1FUkdFTkNZKS5cbiJ9LAo+ IC19Owo+IC0KPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9oYW5kbGVfdGVtcF9leHQoc3RydWN0IG5i bF9kZXZfbWd0ICpkZXZfbWd0LCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKQo+ICtzdGF0aWMgaW50 IG5ibF9kZXZfY29uZmlndXJlX21zaXhfbWFwKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkK PsKgIHsKPiAtIHUxNiB0ZW1wID0gKHUxNikqZGF0YTsKPiAtIHU2NCB1cHRpbWUgPSAwOwo+IC0g c3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OKGRl dl9tZ3QpOwo+IC0gc3RydWN0IG5ibF9kZXZfY3RybCAqY3RybF9kZXYgPSBOQkxfREVWX01HVF9U T19DVFJMX0RFVihkZXZfbWd0KTsKPiAtIGVudW0gbmJsX2Rldl90ZW1wX3N0YXR1cyBvbGRfdGVt cF9zdGF0dXMgPSBjdHJsX2Rldi0+dGVtcF9zdGF0dXM7Cj4gLSBlbnVtIG5ibF9kZXZfdGVtcF9z dGF0dXMgbmV3X3RlbXBfc3RhdHVzID0gTkJMX1RFTVBfU1RBVFVTX05PUk1BTDsKPiAtCj4gLSAv KiBubyByZXN1bWUgaWYgdGVtcCBleGNlZWQgTkJMX1RFTVBfRU1FUkdfVEhSRVNIT0xELCBldmVu IGlmIHRoZSB0ZW1wIHJlc3VtZSBub21hbC4KPiAtwqAgKiBCZWNhdXNlIHRoZSBodyBoYXMgc2h1 dGRvd24uCj4gLcKgICovCj4gLSBpZiAob2xkX3RlbXBfc3RhdHVzID09IE5CTF9URU1QX1NUQVRV U19FTUVSRykKPiAtwqAgcmV0dXJuOwo+IC0KPiAtIC8qIGlmIHRlbXAgaW4gKDg1LTEwNSkgYW5k IG5vdCBpbiBub3JtYWxfc3RhdHVzLCBubyByZXN1bWUgdG8gYXZvaWQgYWxhcm0gb3NjaWxsYXRl ICovCj4gLSBpZiAodGVtcCA+IE5CTF9URU1QX05PTUFMX1RIUkVTSE9MRCAmJgo+IC0gwqAgwqAg dGVtcCA8IE5CTF9URU1QX1dBUk5JTkdfVEhSRVNIT0xEICYmCj4gLSDCoCDCoCBvbGRfdGVtcF9z dGF0dXMgPiBOQkxfVEVNUF9TVEFUVVNfTk9STUFMKQo+IC3CoCByZXR1cm47Cj4gLQo+IC0gaWYg KHRlbXAgPj0gTkJMX1RFTVBfV0FSTklOR19USFJFU0hPTEQgJiYKPiAtIMKgIMKgIHRlbXAgPCBO QkxfVEVNUF9DUklUX1RIUkVTSE9MRCkKPiAtwqAgbmV3X3RlbXBfc3RhdHVzID0gTkJMX1RFTVBf U1RBVFVTX1dBUk5JTkc7Cj4gLSBlbHNlIGlmICh0ZW1wID49IE5CTF9URU1QX0NSSVRfVEhSRVNI T0xEICYmCj4gLSDCoCB0ZW1wIDwgTkJMX1RFTVBfRU1FUkdfVEhSRVNIT0xEKQo+IC3CoCBuZXdf dGVtcF9zdGF0dXMgPSBOQkxfVEVNUF9TVEFUVVNfQ1JJVDsKPiAtIGVsc2UgaWYgKHRlbXAgPj0g TkJMX1RFTVBfRU1FUkdfVEhSRVNIT0xEKQo+IC3CoCBuZXdfdGVtcF9zdGF0dXMgPSBOQkxfVEVN UF9TVEFUVVNfRU1FUkc7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5C TF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfY29tbW9u ICpkZXZfY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsKPiArIHN0 cnVjdCBuYmxfbXNpeF9pbmZvICptc2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9UT19NU0lYX0lO Rk8oZGV2X2NvbW1vbik7Cj4gKyBpbnQgZXJyID0gMDsKPiArIGludCBpOwo+ICsgdTE2IG1zaXhf bm90X25ldF9udW0gPSAwOwo+wqAgCj4gLSBpZiAobmV3X3RlbXBfc3RhdHVzID09IG9sZF90ZW1w X3N0YXR1cykKPiAtwqAgcmV0dXJuOwo+ICsgZm9yIChpID0gTkJMX01TSVhfTkVUX1RZUEU7IGkg PCBOQkxfTVNJWF9UWVBFX01BWDsgaSsrKQo+ICvCoCBtc2l4X2luZm8tPnNlcnZfaW5mb1tpXS5i YXNlX3ZlY3Rvcl9pZCA9IG1zaXhfaW5mby0+c2Vydl9pbmZvW2kgLSAxXS5iYXNlX3ZlY3Rvcl9p ZAo+ICvCoCDCoCDCoCDCoCArIG1zaXhfaW5mby0+c2Vydl9pbmZvW2kgLSAxXS5udW07Cj7CoCAK PiAtIGN0cmxfZGV2LT50ZW1wX3N0YXR1cyA9IG5ld190ZW1wX3N0YXR1czsKPiArIGZvciAoaSA9 IE5CTF9NU0lYX01BSUxCT1hfVFlQRTsgaSA8IE5CTF9NU0lYX1RZUEVfTUFYOyBpKyspIHsKPiAr wqAgaWYgKGkgPT0gTkJMX01TSVhfTkVUX1RZUEUpCj4gKyDCoCBjb250aW51ZTsKPsKgIAo+IC0g LyogdGVtcCBmYWxsIG9ubHkgYWxhcm0gd2hlbiB0aGUgYWxhcm0gbmVlZCB0byByZXN1bWUgKi8K PiAtIGlmIChuZXdfdGVtcF9zdGF0dXMgPCBvbGRfdGVtcF9zdGF0dXMgJiYgbmV3X3RlbXBfc3Rh dHVzICE9IE5CTF9URU1QX1NUQVRVU19OT1JNQUwpCj4gLcKgIHJldHVybjsKPiArwqAgbXNpeF9u b3RfbmV0X251bSArPSBtc2l4X2luZm8tPnNlcnZfaW5mb1tpXS5udW07Cj4gKyB9Cj7CoCAKPiAt IGlmIChkYXRhX2xlbiA+IHNpemVvZih1MTYpKQo+IC3CoCB1cHRpbWUgPSAqKHU2NCAqKShkYXRh ICsgc2l6ZW9mKHUxNikpOwo+IC0gbmJsX2xvZyhjb21tb24sIHRlbXBfYWxhcm1faW5mb1tuZXdf dGVtcF9zdGF0dXNdLmxvZ3ZlbCwKPiAtwqAgIlslbGx1XSAlcyIsIHVwdGltZSwgdGVtcF9hbGFy bV9pbmZvW25ld190ZW1wX3N0YXR1c10uYWxhcm1faW5mbyk7Cj4gKyBlcnIgPSBzZXJ2X29wcy0+ Y29uZmlndXJlX21zaXhfbWFwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAr wqAgwqAgwqAgwqAgbXNpeF9pbmZvLT5zZXJ2X2luZm9bTkJMX01TSVhfTkVUX1RZUEVdLm51bSwK PiArwqAgwqAgwqAgwqAgbXNpeF9ub3RfbmV0X251bSwKPiArwqAgwqAgwqAgwqAgbXNpeF9pbmZv LT5zZXJ2X2luZm9bTkJMX01TSVhfTkVUX1RZUEVdLmh3X3NlbGZfbWFza19lbik7Cj7CoCAKPiAt IGlmIChuZXdfdGVtcF9zdGF0dXMgPT0gTkJMX1RFTVBfU1RBVFVTX0VNRVJHKSB7Cj4gLcKgIGN0 cmxfZGV2LT50YXNrX2luZm8ucmVzZXRfZXZlbnQgPSBOQkxfSFdfRkFUQUxfRVJSX0VWRU5UOwo+ IC3CoCBuYmxfY29tbW9uX3F1ZXVlX3dvcmsoJmN0cmxfZGV2LT50YXNrX2luZm8ucmVzZXRfdGFz aywgZmFsc2UpOwo+IC0gfQo+ICsgcmV0dXJuIGVycjsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgY29u c3QgY2hhciAqbmJsX2xvZ19sZXZlbF9uYW1lKGludCBsZXZlbCkKPiArc3RhdGljIGludCBuYmxf ZGV2X2Rlc3Ryb3lfbXNpeF9tYXAoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+wqAgewo+ IC0gc3dpdGNoIChsZXZlbCkgewo+IC0gY2FzZSBOQkxfRU1QX0FMRVJUX0xPR19GQVRBTDoKPiAt wqAgcmV0dXJuICJGQVRBTCI7Cj4gLSBjYXNlIE5CTF9FTVBfQUxFUlRfTE9HX0VSUk9SOgo+IC3C oCByZXR1cm4gIkVSUk9SIjsKPiAtIGNhc2UgTkJMX0VNUF9BTEVSVF9MT0dfV0FSTklORzoKPiAt wqAgcmV0dXJuICJXQVJOSU5HIjsKPiAtIGNhc2UgTkJMX0VNUF9BTEVSVF9MT0dfSU5GTzoKPiAt wqAgcmV0dXJuICJJTkZPIjsKPiAtIGRlZmF1bHQ6Cj4gLcKgIHJldHVybiAiVU5LTk9XTiI7Cj4g LSB9Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RP X1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgaW50IGVyciA9IDA7Cj4gKwo+ICsgZXJyID0gc2Vydl9v cHMtPmRlc3Ryb3lfbXNpeF9tYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpKTsK PiArIHJldHVybiBlcnI7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9oYW5kbGVf ZW1wX2xvZ19leHQoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCB1OCAqZGF0YSwgdTE2IGRh dGFfbGVuKQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfYWxsb2NfbXNpeF9lbnRyaWVzKHN0cnVjdCBu YmxfZGV2X21ndCAqZGV2X21ndCwgdTE2IG51bV9lbnRyaWVzKQo+wqAgewo+IC0gc3RydWN0IG5i bF9lbXBfYWxlcnRfbG9nX2V2ZW50ICpsb2dfZXZlbnQgPSAoc3RydWN0IG5ibF9lbXBfYWxlcnRf bG9nX2V2ZW50ICopZGF0YTsKPiAtIHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5C TF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAq ZGV2X2NvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1 Y3QgbmJsX21zaXhfaW5mbyAqbXNpeF9pbmZvID0gTkJMX0RFVl9DT01NT05fVE9fTVNJWF9JTkZP KGRldl9jb21tb24pOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxf REVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArIHUxNiBpOwo+wqAgCj4gLSBuYmxfbG9n KGNvbW1vbiwgTE9HTEVWRUxfSU5GTywgIltGV11bJWxsdV0gPCVzPiAlLipzIiwgbG9nX2V2ZW50 LT51cHRpbWUsCj4gLcKgIG5ibF9sb2dfbGV2ZWxfbmFtZShsb2dfZXZlbnQtPmxldmVsKSwgZGF0 YV9sZW4gLSBzaXplb2YodTY0KSAtIHNpemVvZih1OCksCj4gLcKgIGxvZ19ldmVudC0+ZGF0YSk7 Cj4gLX0KPiArIG1zaXhfaW5mby0+bXNpeF9lbnRyaWVzID0gZGV2bV9rY2FsbG9jKE5CTF9ERVZf TUdUX1RPX0RFVihkZXZfbWd0KSwgbnVtX2VudHJpZXMsCj4gK8KgIMKgIMKgIMKgIMKgIMKgIHNp emVvZihtc2l4X2luZm8tPm1zaXhfZW50cmllcyksCj4gK8KgIMKgIMKgIMKgIMKgIMKgIEdGUF9L RVJORUwpOwo+ICsgaWYgKCFtc2l4X2luZm8tPm1zaXhfZW50cmllcykKPiArwqAgcmV0dXJuIC1F Tk9NRU07Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9jaGFuX25vdGlmeV9ldnRfYWxlcnRf cmVzcCh2b2lkICpwcml2LCB1MTYgc3JjX2lkLCB1MTYgbXNnX2lkLAo+IC3CoCDCoCDCoCDCoCDC oCDCoCB2b2lkICpkYXRhLCB1MzIgZGF0YV9sZW4pCj4gLXsKPiAtIHN0cnVjdCBuYmxfZGV2X21n dCAqZGV2X21ndCA9IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKilwcml2Owo+IC0gc3RydWN0IG5ibF9j aGFuX3BhcmFtX2VtcF9hbGVydF9ldmVudCAqYWxlcnRfcGFyYW0gPQo+IC3CoCDCoCDCoCAoc3Ry dWN0IG5ibF9jaGFuX3BhcmFtX2VtcF9hbGVydF9ldmVudCAqKWRhdGE7Cj4gKyBmb3IgKGkgPSAw OyBpIDwgbnVtX2VudHJpZXM7IGkrKykKPiArwqAgbXNpeF9pbmZvLT5tc2l4X2VudHJpZXNbaV0u ZW50cnkgPQo+ICvCoCDCoCBzZXJ2X29wcy0+Z2V0X21zaXhfZW50cnlfaWQoTkJMX0RFVl9NR1Rf VE9fU0VSVl9QUklWKGRldl9tZ3QpLCBpKTsKPsKgIAo+IC0gc3dpdGNoIChhbGVydF9wYXJhbS0+ dHlwZSkgewo+IC0gY2FzZSBOQkxfRU1QX0VWRU5UX1RFTVBfQUxFUlQ6Cj4gLcKgIG5ibF9kZXZf aGFuZGxlX3RlbXBfZXh0KGRldl9tZ3QsIGFsZXJ0X3BhcmFtLT5kYXRhLCBhbGVydF9wYXJhbS0+ bGVuKTsKPiAtwqAgcmV0dXJuOwo+IC0gY2FzZSBOQkxfRU1QX0VWRU5UX0xPR19BTEVSVDoKPiAt wqAgbmJsX2Rldl9oYW5kbGVfZW1wX2xvZ19leHQoZGV2X21ndCwgYWxlcnRfcGFyYW0tPmRhdGEs IGFsZXJ0X3BhcmFtLT5sZW4pOwo+IC3CoCByZXR1cm47Cj4gLSBkZWZhdWx0Ogo+IC3CoCByZXR1 cm47Cj4gLSB9Cj4gKyBkZXZfaW5mbyhOQkxfREVWX01HVF9UT19ERVYoZGV2X21ndCksICJhbGxv YyBtc2l4IGVudHJ5OiAldS0ldS5cbiIsCj4gKyDCoCBtc2l4X2luZm8tPm1zaXhfZW50cmllc1sw XS5lbnRyeSwgbXNpeF9pbmZvLT5tc2l4X2VudHJpZXNbbnVtX2VudHJpZXMgLSAxXS5lbnRyeSk7 Cj4gKwo+ICsgcmV0dXJuIDA7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9jdHJs X3JlZ2lzdGVyX2VtcF9leHRfYWxlcnRfY2hhbl9tc2coc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0KQo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2ZyZWVfbXNpeF9lbnRyaWVzKHN0cnVjdCBuYmxf ZGV2X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5f b3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gLQo+IC0gaWYgKCFjaGFu X29wcy0+Y2hlY2tfcXVldWVfZXhpc3QoTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3Qp LAo+IC3CoCDCoCDCoCBOQkxfQ0hBTl9UWVBFX01BSUxCT1gpKQo+IC3CoCByZXR1cm47Cj4gKyBz dHJ1Y3QgbmJsX2Rldl9jb21tb24gKmRldl9jb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT05f REVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9tc2l4X2luZm8gKm1zaXhfaW5mbyA9IE5CTF9E RVZfQ09NTU9OX1RPX01TSVhfSU5GTyhkZXZfY29tbW9uKTsKPsKgIAo+IC0gY2hhbl9vcHMtPnJl Z2lzdGVyX21zZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksCj4gLcKgIMKgIMKg IMKgIMKgIE5CTF9DSEFOX01TR19BRE1JTlFfRVhUX0FMRVJULAo+IC3CoCDCoCDCoCDCoCDCoCBu YmxfZGV2X2NoYW5fbm90aWZ5X2V2dF9hbGVydF9yZXNwLCBkZXZfbWd0KTsKPiArIGRldm1fa2Zy ZWUoTkJMX0RFVl9NR1RfVE9fREVWKGRldl9tZ3QpLCBtc2l4X2luZm8tPm1zaXhfZW50cmllcyk7 Cj4gKyBtc2l4X2luZm8tPm1zaXhfZW50cmllcyA9IE5VTEw7Cj7CoCB9Cj7CoCAKPiAtc3RhdGlj IGludCBuYmxfZGV2X3NldHVwX2N0cmxfZGV2X3Rhc2soc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0KQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfYWxsb2NfbXNpeF9pbnRyKHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2X2N0cmwgKmN0cmxfZGV2ID0g TkJMX0RFVl9NR1RfVE9fQ1RSTF9ERVYoZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX3Rhc2tfaW5m byAqdGFza19pbmZvID0gTkJMX0RFVl9DVFJMX1RPX1RBU0tfSU5GTyhjdHJsX2Rldik7Cj4gLSBz dHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BT KGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfY29tbW9uICpkZXZfY29tbW9uID0gTkJMX0RF Vl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfbXNpeF9pbmZvICpt c2l4X2luZm8gPSBOQkxfREVWX0NPTU1PTl9UT19NU0lYX0lORk8oZGV2X2NvbW1vbik7Cj4gKyBz dHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT04oZGV2 X21ndCk7Cj4gKyBpbnQgbmVlZGVkID0gMDsKPiArIGludCBlcnI7Cj4gKyBpbnQgaTsKPsKgIAo+ IC0gdGFza19pbmZvLT5kZXZfbWd0ID0gZGV2X21ndDsKPiArIGZvciAoaSA9IDA7IGkgPCBOQkxf TVNJWF9UWVBFX01BWDsgaSsrKQo+ICvCoCBuZWVkZWQgKz0gbXNpeF9pbmZvLT5zZXJ2X2luZm9b aV0ubnVtOwo+wqAgCj4gLSBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RF Vl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJMX1RBU0tfRldfSEJf Q0FQKSkgewo+IC3CoCBuYmxfY29tbW9uX2FsbG9jX3Rhc2soJnRhc2tfaW5mby0+ZndfaGJfdGFz aywgbmJsX2Rldl9md19oZWFydGJlYXRfdGFzayk7Cj4gLcKgIHRhc2tfaW5mby0+dGltZXJfc2V0 dXAgPSB0cnVlOwo+ICsgZXJyID0gbmJsX2Rldl9hbGxvY19tc2l4X2VudHJpZXMoZGV2X21ndCwg KHUxNiluZWVkZWQpOwo+ICsgaWYgKGVycikgewo+ICvCoCBwcl9lcnIoIkFsbG9jYXRlIG1zaXgg ZW50cmllcyBmYWlsZWRcbiIpOwo+ICvCoCByZXR1cm4gZXJyOwo+IMKgIH0KPsKgIAo+IC0gaWYg KHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihk ZXZfbWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9UQVNLX0ZXX1JFU0VUX0NBUCkpIHsKPiAtwqAgbmJs X2NvbW1vbl9hbGxvY19kZWxheWVkX3Rhc2soJnRhc2tfaW5mby0+ZndfcmVzZXRfdGFzaywgbmJs X2Rldl9md19yZXNldF90YXNrKTsKPiAtwqAgdGFza19pbmZvLT50aW1lcl9zZXR1cCA9IHRydWU7 Cj4gKyBlcnIgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UoTkJMX0NPTU1PTl9UT19QREVWKGNvbW1v biksIG1zaXhfaW5mby0+bXNpeF9lbnRyaWVzLAo+ICvCoCDCoCDCoCDCoCBuZWVkZWQsIG5lZWRl ZCk7Cj4gKyBpZiAoZXJyIDwgMCkgewo+ICvCoCBwcl9lcnIoInBjaV9lbmFibGVfbXNpeF9yYW5n ZSBmYWlsZWQsIGVyciA9ICVkLlxuIiwgZXJyKTsKPiArwqAgZ290byBlbmFibGVfbXNpeF9mYWls ZWQ7Cj4gwqAgfQo+wqAgCj4gLSBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJM X0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJMX1RBU0tfQ0xF QU5fQURNSU5EUV9DQVApKSB7Cj4gLcKgIG5ibF9jb21tb25fYWxsb2NfdGFzaygmdGFza19pbmZv LT5jbGVhbl9hZG1pbnFfdGFzaywgbmJsX2Rldl9jbGVhbl9hZG1pbnFfdGFzayk7Cj4gLcKgIHRh c2tfaW5mby0+dGltZXJfc2V0dXAgPSB0cnVlOwo+IC0gfQo+ICsgcmV0dXJuIG5lZWRlZDsKPsKg IAo+IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NF UlZfUFJJVihkZXZfbWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9UQVNLX0FEQVBUX0RFU0NfR09USEVS KSkgewo+IC3CoCBuYmxfY29tbW9uX2FsbG9jX3Rhc2soJnRhc2tfaW5mby0+YWRhcHRfZGVzY19n b3RoZXJfdGFzaywKPiAtwqAgwqAgwqAgwqAgwqAgbmJsX2Rldl9hZGFwdF9kZXNjX2dvdGhlcl90 YXNrKTsKPiAtwqAgdGFza19pbmZvLT50aW1lcl9zZXR1cCA9IHRydWU7Cj4gLSB9Cj4gK2VuYWJs ZV9tc2l4X2ZhaWxlZDoKPiArIG5ibF9kZXZfZnJlZV9tc2l4X2VudHJpZXMoZGV2X21ndCk7Cj4g KyByZXR1cm4gZXJyOwo+ICt9Cj7CoCAKPiAtIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4 X2NhcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCBOQkxf UkVDT1ZFUllfQUJOT1JNQUxfU1RBVFVTKSkgewo+IC3CoCBuYmxfY29tbW9uX2FsbG9jX3Rhc2so JnRhc2tfaW5mby0+cmVjb3ZlcnlfYWJub3JtYWxfdGFzaywKPiAtwqAgwqAgwqAgwqAgwqAgbmJs X2Rldl9yZWNvdmVyeV9hYm5vcm1hbF90YXNrKTsKPiAtwqAgdGFza19pbmZvLT50aW1lcl9zZXR1 cCA9IHRydWU7Cj4gLSB9Cj4gLSBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJM X0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJMX1RBU0tfUkVT RVRfQ1RSTF9DQVApKQo+IC3CoCBuYmxfY29tbW9uX2FsbG9jX3Rhc2soJnRhc2tfaW5mby0+cmVz ZXRfdGFzaywgJm5ibF9kZXZfY3RybF9yZXNldF90YXNrKTsKPiArc3RhdGljIHZvaWQgbmJsX2Rl dl9mcmVlX21zaXhfaW50cihzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiArIHN0 cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZf bWd0KTsKPsKgIAo+IC0gbmJsX2NvbW1vbl9hbGxvY190YXNrKCZ0YXNrX2luZm8tPmNsZWFuX2Fi bm9ybWFsX2lycV90YXNrLAo+IC0gwqAgwqAgwqAgwqAgbmJsX2Rldl9oYW5kbGVfYWJub3JtYWxf ZXZlbnQpOwo+ICsgcGNpX2Rpc2FibGVfbXNpeChOQkxfQ09NTU9OX1RPX1BERVYoY29tbW9uKSk7 Cj4gKyBuYmxfZGV2X2ZyZWVfbXNpeF9lbnRyaWVzKGRldl9tZ3QpOwo+ICt9Cj7CoCAKPiAtIGlm ICh0YXNrX2luZm8tPnRpbWVyX3NldHVwKSB7Cj4gLcKgIHRpbWVyX3NldHVwKCZ0YXNrX2luZm8t PnNlcnZfdGltZXIsIG5ibF9kZXZfY3RybF90YXNrX3RpbWVyLCAwKTsKPiAtwqAgdGFza19pbmZv LT5zZXJ2X3RpbWVyX3BlcmlvZCA9IEhaOwo+IC0gfQo+ICtzdGF0aWMgaW50IG5ibF9kZXZfaW5p dF9pbnRlcnJ1cHRfc2NoZW1lKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArewo+ICsg aW50IGVyciA9IDA7Cj7CoCAKPiAtIG5ibF9kZXZfcmVnaXN0ZXJfY2hhbl90YXNrKGRldl9tZ3Qs IE5CTF9DSEFOX1RZUEVfQURNSU5RLCAmdGFza19pbmZvLT5jbGVhbl9hZG1pbnFfdGFzayk7Cj4g KyBlcnIgPSBuYmxfZGV2X2FsbG9jX21zaXhfaW50cihkZXZfbWd0KTsKPiArIGlmIChlcnIgPCAw KSB7Cj4gK8KgIGRldl9lcnIoTkJMX0RFVl9NR1RfVE9fREVWKGRldl9tZ3QpLCAiRmFpbGVkIHRv IGVuYWJsZSBNU0ktWCB2ZWN0b3JzXG4iKTsKPiArwqAgcmV0dXJuIGVycjsKPiArIH0KPsKgIAo+ IMKgIHJldHVybiAwOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3ZlX2N0 cmxfZGV2X3Rhc2soc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICtzdGF0aWMgdm9pZCBu YmxfZGV2X2NsZWFyX2ludGVycnVwdF9zY2hlbWUoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0 KQo+wqAgewo+IC0gc3RydWN0IG5ibF9kZXZfY3RybCAqY3RybF9kZXYgPSBOQkxfREVWX01HVF9U T19DVFJMX0RFVihkZXZfbWd0KTsKPiAtIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3Bz ID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX3Rhc2tf aW5mbyAqdGFza19pbmZvID0gTkJMX0RFVl9DVFJMX1RPX1RBU0tfSU5GTyhjdHJsX2Rldik7Cj4g KyBuYmxfZGV2X2ZyZWVfbXNpeF9pbnRyKGRldl9tZ3QpOwo+ICt9Cj7CoCAKPiAtIG5ibF9kZXZf cmVnaXN0ZXJfY2hhbl90YXNrKGRldl9tZ3QsIE5CTF9DSEFOX1RZUEVfQURNSU5RLCBOVUxMKTsK PiArLyogLS0tLS0tLS0tLcKgIENoYW5uZWwgY29uZmlnwqAgLS0tLS0tLS0tLSAqLwo+ICtzdGF0 aWMgaW50IG5ibF9kZXZfc2V0dXBfY2hhbl9xaW5mbyhzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9t Z3QsIHU4IGNoYW5fdHlwZSkKPiArewo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9v cHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBkZXZpY2Ug KmRldiA9IE5CTF9ERVZfTUdUX1RPX0RFVihkZXZfbWd0KTsKPiArIGludCByZXQgPSAwOwo+wqAg Cj4gLSBuYmxfY29tbW9uX3JlbGVhc2VfdGFzaygmdGFza19pbmZvLT5jbGVhbl9hYm5vcm1hbF9p cnFfdGFzayk7Cj4gKyBpZiAoIWNoYW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxfREVWX01H VF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlwZSkpCj4gK8KgIHJldHVybiAwOwo+wqAg Cj4gLSBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VS Vl9QUklWKGRldl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJMX1RBU0tfRldfUkVTRVRfQ0FQKSkKPiAt wqAgbmJsX2NvbW1vbl9yZWxlYXNlX2RlbGF5ZWRfdGFzaygmdGFza19pbmZvLT5md19yZXNldF90 YXNrKTsKPiArIHJldCA9IGNoYW5fb3BzLT5jZmdfY2hhbl9xaW5mb19tYXBfdGFibGUoTkJMX0RF Vl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgY2hhbl90eXBlKTsKPiAr IGlmIChyZXQpCj4gK8KgIGRldl9lcnIoZGV2LCAic2V0dXAgY2hhbjolZCwgcWluZm8gbWFwIHRh YmxlIGZhaWxlZFxuIiwgY2hhbl90eXBlKTsKPsKgIAo+IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJv ZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAtIMKgIMKg IMKgIE5CTF9UQVNLX0ZXX0hCX0NBUCkpCj4gLcKgIG5ibF9jb21tb25fcmVsZWFzZV90YXNrKCZ0 YXNrX2luZm8tPmZ3X2hiX3Rhc2spOwo+ICsgcmV0dXJuIHJldDsKPiArfQo+wqAgCj4gLSBpZiAo c2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRl dl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJMX1RBU0tfQ0xFQU5fQURNSU5EUV9DQVApKQo+IC3CoCBu YmxfY29tbW9uX3JlbGVhc2VfdGFzaygmdGFza19pbmZvLT5jbGVhbl9hZG1pbnFfdGFzayk7Cj4g K3N0YXRpYyBpbnQgbmJsX2Rldl9zZXR1cF9jaGFuX3F1ZXVlKHN0cnVjdCBuYmxfZGV2X21ndCAq ZGV2X21ndCwgdTggY2hhbl90eXBlKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2NoYW5uZWxfb3BzICpj aGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9tZ3QpOwo+ICsgaW50IHJldCA9 IDA7Cj7CoCAKPiAtIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01H VF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCBOQkxfVEFTS19BREFQVF9ERVND X0dPVEhFUikpCj4gLcKgIG5ibF9jb21tb25fcmVsZWFzZV90YXNrKCZ0YXNrX2luZm8tPmFkYXB0 X2Rlc2NfZ290aGVyX3Rhc2spOwo+ICsgaWYgKGNoYW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChO QkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlwZSkpCj4gK8KgIHJldCA9 IGNoYW5fb3BzLT5zZXR1cF9xdWV1ZShOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCks IGNoYW5fdHlwZSk7Cj7CoCAKPiAtIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChO QkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCBOQkxfUkVDT1ZF UllfQUJOT1JNQUxfU1RBVFVTKSkKPiAtwqAgbmJsX2NvbW1vbl9yZWxlYXNlX3Rhc2soJnRhc2tf aW5mby0+cmVjb3ZlcnlfYWJub3JtYWxfdGFzayk7Cj4gKyByZXR1cm4gcmV0Owo+ICt9Cj7CoCAK PiAtIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJW X1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCBOQkxfVEFTS19SRVNFVF9DVFJMX0NBUCkpCj4g LcKgIG5ibF9jb21tb25fcmVsZWFzZV90YXNrKCZ0YXNrX2luZm8tPnJlc2V0X3Rhc2spOwo+ICtz dGF0aWMgaW50IG5ibF9kZXZfcmVtb3ZlX2NoYW5fcXVldWUoc3RydWN0IG5ibF9kZXZfbWd0ICpk ZXZfbWd0LCB1OCBjaGFuX3R5cGUpCj4gK3sKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNo YW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gKyBpbnQgcmV0ID0g MDsKPiArCj4gKyBpZiAoY2hhbl9vcHMtPmNoZWNrX3F1ZXVlX2V4aXN0KE5CTF9ERVZfTUdUX1RP X0NIQU5fUFJJVihkZXZfbWd0KSwgY2hhbl90eXBlKSkKPiArwqAgcmV0ID0gY2hhbl9vcHMtPnRl YXJkb3duX3F1ZXVlKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgY2hhbl90eXBl KTsKPiArCj4gKyByZXR1cm4gcmV0Owo+wqAgfQo+wqAgCj4gLXN0YXRpYyBpbnQgbmJsX2Rldl91 cGRhdGVfdGVtcGxhdGVfY29uZmlnKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArc3Rh dGljIGJvb2wgbmJsX2Rldl9zaG91bGRfY2hhbl9rZWVwYWxpdmUoc3RydWN0IG5ibF9kZXZfbWd0 ICpkZXZfbWd0KQo+wqAgewo+IMKgIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0g TkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBib29sIHJldCA9IHRydWU7Cj7C oCAKPiAtIHJldHVybiBzZXJ2X29wcy0+dXBkYXRlX3RlbXBsYXRlX2NvbmZpZyhOQkxfREVWX01H VF9UT19TRVJWX1BSSVYoZGV2X21ndCkpOwo+ICsgcmV0ID0gc2Vydl9vcHMtPmdldF9wcm9kdWN0 X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICvCoCDCoCDCoCDC oCDCoCBOQkxfVEFTS19LRUVQX0FMSVZFKTsKPiArCj4gKyByZXR1cm4gcmV0Owo+wqAgfQo+wqAg Cj4gLS8qIC0tLS0tLS0tLS3CoCBEZXYgaW5pdCBwcm9jZXNzwqAgLS0tLS0tLS0tLSAqLwo+IC1z dGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfY29tbW9uX2RldihzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFk YXB0ZXIsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0pCj4gK3N0YXRpYyBpbnQgbmJsX2Rl dl9zZXR1cF9jaGFuX2tlZXBhbGl2ZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHU4IGNo YW5fdHlwZSkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IChzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKilOQkxfQURBUFRFUl9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+IC0gc3RydWN0 IG5ibF9kZXZfY29tbW9uICpjb21tb25fZGV2Owo+IMKgIHN0cnVjdCBuYmxfc2VydmljZV9vcHMg KnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3Qg bmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9t Z3QpOwo+IMKgIHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RP X0NPTU1PTihkZXZfbWd0KTsKPiAtIGludCBib2FyZF9pZDsKPiAtCj4gLSBjb21tb25fZGV2ID0g ZGV2bV9remFsbG9jKE5CTF9BREFQVEVSX1RPX0RFVihhZGFwdGVyKSwKPiAtwqAgwqAgwqAgc2l6 ZW9mKHN0cnVjdCBuYmxfZGV2X2NvbW1vbiksIEdGUF9LRVJORUwpOwo+IC0gaWYgKCFjb21tb25f ZGV2KQo+IC3CoCByZXR1cm4gLUVOT01FTTsKPiAtIGNvbW1vbl9kZXYtPmRldl9tZ3QgPSBkZXZf bWd0Owo+ICsgdTE2IGRlc3RfZnVuY19pZCA9IE5CTF9DT01NT05fVE9fTUdUX1BGKGNvbW1vbik7 Cj7CoCAKPiAtIGlmIChuYmxfZGV2X3NldHVwX2NoYW5fcXVldWUoZGV2X21ndCwgTkJMX0NIQU5f VFlQRV9NQUlMQk9YKSkKPiAtwqAgZ290byBzZXR1cF9jaGFuX2ZhaWw7Cj4gKyBpZiAoIW5ibF9k ZXZfc2hvdWxkX2NoYW5fa2VlcGFsaXZlKGRldl9tZ3QpKQo+ICvCoCByZXR1cm4gMDsKPsKgIAo+ IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZf UFJJVihkZXZfbWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9UQVNLX0NMRUFOX01BSUxCT1hfQ0FQKSkK PiAtwqAgbmJsX2NvbW1vbl9hbGxvY190YXNrKCZjb21tb25fZGV2LT5jbGVhbl9tYnhfdGFzaywg bmJsX2Rldl9jbGVhbl9tYWlsYm94X3Rhc2spOwo+ICsgaWYgKGNoYW5fdHlwZSAhPSBOQkxfQ0hB Tl9UWVBFX01BSUxCT1gpCj4gK8KgIHJldHVybiAtRU9QTk9UU1VQUDsKPsKgIAo+IC0gaWYgKHNl cnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZf bWd0KSwKPiAtIMKgIMKgIMKgIE5CTF9UQVNLX1JFU0VUX0NBUCkpCj4gLcKgIG5ibF9jb21tb25f YWxsb2NfdGFzaygmY29tbW9uX2Rldi0+cmVzZXRfdGFzay50YXNrLCAmbmJsX2Rldl9wcmVwYXJl X3Jlc2V0X3Rhc2spOwo+ICsgZGVzdF9mdW5jX2lkID0gc2Vydl9vcHMtPmdldF9mdW5jdGlvbl9p ZChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfQ09N TU9OX1RPX1ZTSV9JRChjb21tb24pKTsKPsKgIAo+IC0gaWYgKHBhcmFtLT5jYXBzLmlzX25pYykg ewo+IC3CoCBib2FyZF9pZCA9IHNlcnZfb3BzLT5nZXRfYm9hcmRfaWQoTkJMX0RFVl9NR1RfVE9f U0VSVl9QUklWKGRldl9tZ3QpKTsKPiAtwqAgaWYgKGJvYXJkX2lkIDwgMCkKPiAtIMKgIGdvdG8g Z2V0X2JvYXJkX2lkX2ZhaWw7Cj4gLcKgIE5CTF9DT01NT05fVE9fQk9BUkRfSUQoY29tbW9uKSA9 IGJvYXJkX2lkOwo+IC0gfQo+ICsgaWYgKGNoYW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxf REVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIGNoYW5fdHlwZSkpCj4gK8KgIHJldHVybiBj aGFuX29wcy0+c2V0dXBfa2VlcGFsaXZlKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0 KSwKPiArIMKgIMKgIMKgIGRlc3RfZnVuY19pZCwgY2hhbl90eXBlKTsKPsKgIAo+IC0gTkJMX0NP TU1PTl9UT19WU0lfSUQoY29tbW9uKSA9IHNlcnZfb3BzLT5nZXRfdnNpX2lkKE5CTF9ERVZfTUdU X1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgMCwKPiAtIMKgIMKgIMKgIMKgIMKgIE5CTF9WU0lfREFU QSk7Cj4gKyByZXR1cm4gLUVOT0VOVDsKPiArfQo+wqAgCj4gLSBzZXJ2X29wcy0+Z2V0X2V0aF9p ZChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIE5CTF9DT01NT05fVE9fVlNJX0lE KGNvbW1vbiksCj4gLcKgIMKgIMKgIMKgICZOQkxfQ09NTU9OX1RPX0VUSF9NT0RFKGNvbW1vbiks ICZOQkxfQ09NTU9OX1RPX0VUSF9JRChjb21tb24pLAo+IC3CoCDCoCDCoCDCoCAmTkJMX0NPTU1P Tl9UT19MT0dJQ19FVEhfSUQoY29tbW9uKSk7Cj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3Zl X2NoYW5fa2VlcGFsaXZlKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgdTggY2hhbl90eXBl KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdU X1RPX0NIQU5fT1BTKGRldl9tZ3QpOwo+wqAgCj4gLSBuYmxfZGV2X3JlZ2lzdGVyX2NoYW5fdGFz ayhkZXZfbWd0LCBOQkxfQ0hBTl9UWVBFX01BSUxCT1gsICZjb21tb25fZGV2LT5jbGVhbl9tYnhf dGFzayk7Cj4gKyBpZiAoY2hhbl9vcHMtPmNoZWNrX3F1ZXVlX2V4aXN0KE5CTF9ERVZfTUdUX1RP X0NIQU5fUFJJVihkZXZfbWd0KSwgY2hhbl90eXBlKSkKPiArwqAgY2hhbl9vcHMtPnJlbW92ZV9r ZWVwYWxpdmUoTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLCBjaGFuX3R5cGUpOwo+ ICt9Cj7CoCAKPiAtIE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCkgPSBjb21tb25f ZGV2Owo+IC0KPiAtIG5ibF9kZXZfcmVnaXN0ZXJfY29tbW9uX2lycShkZXZfbWd0KTsKPiArc3Rh dGljIHZvaWQgbmJsX2Rldl9yZWdpc3Rlcl9jaGFuX3Rhc2soc3RydWN0IG5ibF9kZXZfbWd0ICpk ZXZfbWd0LAo+ICsgwqAgwqAgwqAgwqAgwqAgdTggY2hhbl90eXBlLCBzdHJ1Y3Qgd29ya19zdHJ1 Y3QgKnRhc2spCj4gK3sKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJM X0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj7CoCAKPiAtIHJldHVybiAwOwo+ICsgaWYg KGNoYW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2 X21ndCksIGNoYW5fdHlwZSkpCj4gK8KgIGNoYW5fb3BzLT5yZWdpc3Rlcl9jaGFuX3Rhc2soTkJM X0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLCBjaGFuX3R5cGUsIHRhc2spOwo+ICt9Cj7C oCAKPiAtZ2V0X2JvYXJkX2lkX2ZhaWw6Cj4gLSBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2Zp eF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+IC0gwqAgwqAgwqAgTkJM X1RBU0tfUkVTRVRfQ0FQKSkKPiAtwqAgbmJsX2NvbW1vbl9yZWxlYXNlX3Rhc2soJmNvbW1vbl9k ZXYtPnJlc2V0X3Rhc2sudGFzayk7Cj4gKy8qIC0tLS0tLS0tLS3CoCBUYXNrcyBjb25maWfCoCAt LS0tLS0tLS0tICovCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2xlYW5fbWFpbGJveF90YXNrKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArewo+ICsgc3RydWN0IG5ibF9kZXZfY29tbW9uICpj b21tb25fZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiwKPiAr wqAgwqAgwqAgwqAgY2xlYW5fbWJ4X3Rhc2spOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0ID0gY29tbW9uX2Rldi0+ZGV2X21ndDsKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNo YW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj7CoCAKPiAtIGlmIChz ZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2 X21ndCksCj4gLSDCoCDCoCDCoCBOQkxfVEFTS19DTEVBTl9NQUlMQk9YX0NBUCkpCj4gLcKgIG5i bF9jb21tb25fcmVsZWFzZV90YXNrKCZjb21tb25fZGV2LT5jbGVhbl9tYnhfdGFzayk7Cj4gLXNl dHVwX2NoYW5fZmFpbDoKPiAtIGRldm1fa2ZyZWUoTkJMX0FEQVBURVJfVE9fREVWKGFkYXB0ZXIp LCBjb21tb25fZGV2KTsKPiAtIHJldHVybiAtRUZBVUxUOwo+ICsgY2hhbl9vcHMtPmNsZWFuX3F1 ZXVlX3N1YnRhc2soTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLCBOQkxfQ0hBTl9U WVBFX01BSUxCT1gpOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3ZlX2Nv bW1vbl9kZXYoc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyKQo+ICtzdGF0aWMgaW50IG5ibF9k ZXZfY2xlYW5fbWFpbGJveF9zY2hlZHVsZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj7C oCB7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0 ICopTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiAtIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gwqAg c3RydWN0IG5ibF9kZXZfY29tbW9uICpjb21tb25fZGV2ID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9O X0RFVihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X2N0cmwgKmN0cmxfZGV2ID0gTkJMX0RF Vl9NR1RfVE9fQ1RSTF9ERVYoZGV2X21ndCk7Cj7CoCAKPiAtIGlmICghY29tbW9uX2RldikKPiAt wqAgcmV0dXJuOwo+IC0KPiAtIG5ibF9kZXZfcmVnaXN0ZXJfY2hhbl90YXNrKGRldl9tZ3QsIE5C TF9DSEFOX1RZUEVfTUFJTEJPWCwgTlVMTCk7Cj4gLQo+IC0gaWYgKHNlcnZfb3BzLT5nZXRfcHJv ZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAtIMKgIMKg IMKgIE5CTF9UQVNLX1JFU0VUX0NBUCkpCj4gLcKgIG5ibF9jb21tb25fcmVsZWFzZV90YXNrKCZj b21tb25fZGV2LT5yZXNldF90YXNrLnRhc2spOwo+IC0KPiAtIGlmIChzZXJ2X29wcy0+Z2V0X3By b2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDC oCDCoCBOQkxfVEFTS19DTEVBTl9NQUlMQk9YX0NBUCkpCj4gLcKgIG5ibF9jb21tb25fcmVsZWFz ZV90YXNrKCZjb21tb25fZGV2LT5jbGVhbl9tYnhfdGFzayk7Cj4gLQo+IC0gbmJsX2Rldl9yZW1v dmVfY2hhbl9xdWV1ZShkZXZfbWd0LCBOQkxfQ0hBTl9UWVBFX01BSUxCT1gpOwo+ICsgaWYgKGN0 cmxfZGV2KQo+ICvCoCBxdWV1ZV93b3JrKGN0cmxfZGV2LT5jdHJsX2Rldl93cTEsICZjb21tb25f ZGV2LT5jbGVhbl9tYnhfdGFzayk7Cj4gKyBlbHNlCj4gK8KgIG5ibF9jb21tb25fcXVldWVfd29y aygmY29tbW9uX2Rldi0+Y2xlYW5fbWJ4X3Rhc2ssIGZhbHNlKTsKPsKgIAo+IC0gZGV2bV9rZnJl ZShOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRlciksIGNvbW1vbl9kZXYpOwo+IC0gTkJMX0RFVl9N R1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KSA9IE5VTEw7Cj4gKyByZXR1cm4gMDsKPsKgIH0KPsKg IAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfY3RybF9kZXYoc3RydWN0IG5ibF9hZGFwdGVy ICphZGFwdGVyLCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0gKnBhcmFtKQo+ICtzdGF0aWMgdm9pZCBu YmxfZGV2X3ByZXBhcmVfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj7CoCB7 Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICop TkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiAtIHN0cnVjdCBuYmxfc2VydmljZV9v cHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gLSBzdHJ1 Y3QgbmJsX2Rldl9jdHJsICpjdHJsX2RldjsKPiAtIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5CTF9B REFQVEVSX1RPX0RFVihhZGFwdGVyKTsKPiArIGludCByZXQ7Cj4gKyBzdHJ1Y3QgbmJsX3Jlc2V0 X3Rhc2tfaW5mbyAqdGFza19pbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuYmxfcmVz ZXRfdGFza19pbmZvLAo+ICvCoCDCoCDCoCDCoCDCoCDCoCB0YXNrKTsKPiArIHN0cnVjdCBuYmxf ZGV2X2NvbW1vbiAqY29tbW9uX2RldiA9IGNvbnRhaW5lcl9vZih0YXNrX2luZm8sIHN0cnVjdCBu YmxfZGV2X2NvbW1vbiwKPiArwqAgwqAgwqAgwqAgcmVzZXRfdGFzayk7Cj4gKyBzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QgPSBjb21tb25fZGV2LT5kZXZfbWd0Owo+IMKgIHN0cnVjdCBuYmxf Y29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsKPiAt IGludCBpLCByZXQgPSAwOwo+IC0gdTMyIGJvYXJkX2tleTsKPiAtIGNoYXIgcGFydF9udW1iZXJb NTBdID0gIiI7Cj4gLSBjaGFyIHNlcmlhbF9udW1iZXJbMTI4XSA9ICIiOwo+IC0gaW50IGJvYXJk X2lkOwo+IC0KPiAtIGJvYXJkX2tleSA9IHBjaV9kb21haW5fbnIoZGV2X21ndC0+Y29tbW9uLT5w ZGV2LT5idXMpIDw8IDE2IHwKPiAtIMKgIGRldl9tZ3QtPmNvbW1vbi0+cGRldi0+YnVzLT5udW1i ZXI7Cj4gLSBpZiAocGFyYW0tPmNhcHMuaXNfbmljKSB7Cj4gLcKgIGJvYXJkX2lkID0KPiAtIMKg IG5ibF9kZXZfYWxsb2NfYm9hcmRfaWQoJmJvYXJkX2lkX3RhYmxlLCBib2FyZF9rZXkpOwo+IC3C oCBpZiAoYm9hcmRfaWQgPCAwKQo+IC0gwqAgcmV0dXJuIC1FTk9TUEM7Cj4gLcKgIE5CTF9DT01N T05fVE9fQk9BUkRfSUQoY29tbW9uKSA9wqAgYm9hcmRfaWQ7Cj4gLSB9Cj4gKyBzdHJ1Y3QgbmJs X3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3Qp Owo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19D SEFOX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfY2hhbl9zZW5kX2luZm8gY2hhbl9zZW5k Owo+wqAgCj4gLSBkZXZfaW5mbyhkZXYsICJib2FyZF9rZXkgMHgleCBhbGxvYyBib2FyZCBpZCAw eCV4XG4iLAo+IC0gwqAgYm9hcmRfa2V5LCBOQkxfQ09NTU9OX1RPX0JPQVJEX0lEKGNvbW1vbikp Owo+ICsgc2Vydl9vcHMtPm5ldGRldl9zdG9wKGRldl9tZ3QtPm5ldF9kZXYtPm5ldGRldik7Cj4g KyBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldl9tZ3QtPm5ldF9kZXYtPm5ldGRldik7IC8qIHRvIGF2 b2lkIGV0aHRvb2wgb3BlcmF0aW9uICovCj4gKyBuYmxfZGV2X3JlbW92ZV9jaGFuX2tlZXBhbGl2 ZShkZXZfbWd0LCBOQkxfQ0hBTl9UWVBFX01BSUxCT1gpOwo+wqAgCj4gLSBjdHJsX2RldiA9IGRl dm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbmJsX2Rldl9jdHJsKSwgR0ZQX0tFUk5FTCk7 Cj4gLSBpZiAoIWN0cmxfZGV2KQo+IC3CoCBnb3RvIGFsbG9jX2ZhaWw7Cj4gLSBOQkxfREVWX0NU UkxfVE9fVEFTS19JTkZPKGN0cmxfZGV2KS0+YWRhcHRlciA9IGFkYXB0ZXI7Cj4gLSBOQkxfREVW X01HVF9UT19DVFJMX0RFVihkZXZfbWd0KSA9IGN0cmxfZGV2Owo+ICsgTkJMX0NIQU5fU0VORChj aGFuX3NlbmQsIE5CTF9DT01NT05fVE9fTUdUX1BGKGNvbW1vbiksIE5CTF9DSEFOX01TR19BQ0tf UkVTRVRfRVZFTlQsIE5VTEwsCj4gK8KgIMKgIMKgIMKgIDAsIE5VTEwsIDAsIDApOwo+ICsgLyog bm90aWZ5IGN0cmwgZGV2LCBmaW5pc2ggcmVzZXQgZXZlbnQgcHJvY2VzcyAqLwo+ICsgcmV0ID0g Y2hhbl9vcHMtPnNlbmRfbXNnKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgJmNo YW5fc2VuZCk7Cj4gKyBjaGFuX29wcy0+c2V0X3F1ZXVlX3N0YXRlKE5CTF9ERVZfTUdUX1RPX0NI QU5fUFJJVihkZXZfbWd0KSwgTkJMX0NIQU5fQUJOT1JNQUwsCj4gK8KgIMKgIMKgIE5CTF9DSEFO X1RZUEVfTUFJTEJPWCwgdHJ1ZSk7Cj7CoCAKPiAtIG5ibF9kZXZfcmVnaXN0ZXJfY3RybF9pcnEo ZGV2X21ndCk7Cj4gKyAvKiBzbGVlcCB0byBhdm9pZCBzZW5kX21zZyBpcyBydW5uaW5nICovCj4g KyB1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKPsKgIAo+IC0gY3RybF9kZXYtPmN0cmxfZGV2X3dxMSA9 IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJuYmxfY3RybGRldl93cTEiKTsKPiAtIGlm ICghY3RybF9kZXYtPmN0cmxfZGV2X3dxMSkgewo+IC3CoCBkZXZfZXJyKGRldiwgIkZhaWxlZCB0 byBjcmVhdGUgd29ya3F1ZXVlIG5ibF9jdHJsZGV2X3dxMVxuIik7Cj4gLcKgIGdvdG8gYWxsb2Nf d3FfZmFpbDsKPiAtIH0KPiArIC8qIGN0cmwgZGV2IG11c3Qgc2h1dGRvd24gcGh5IHJlZyByZWFk L3dyaXRlIGFmdGVyIGN0cmwgZGV2IGhhcyBub3RpZnkgZW1wIHNodXRkb3duIGRldiAqLwo+ICsg aWYgKCFOQkxfREVWX01HVF9UT19DVFJMX0RFVihkZXZfbWd0KSkKPiArwqAgc2Vydl9vcHMtPnNl dF9od19zdGF0dXMoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBOQkxfSFdfRkFU QUxfRVJSKTsKPiArfQo+wqAgCj4gLSByZXQgPSBzZXJ2X29wcy0+aW5pdF9jaGlwKE5CTF9ERVZf TUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSk7Cj4gLSBpZiAocmV0KSB7Cj4gLcKgIGRldl9lcnIo ZGV2LCAiY3RybCBkZXYgY2hpcF9pbml0IGZhaWxlZFxuIik7Cj4gLcKgIGdvdG8gY2hpcF9pbml0 X2ZhaWw7Cj4gLSB9Cj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2xlYW5fYWRtaW5xX3Rhc2soc3Ry dWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFz a19pbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuYmxfdGFza19pbmZvLAo+ICsgwqAg wqAgwqAgwqAgwqAgwqAgY2xlYW5fYWRtaW5xX3Rhc2spOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0 ICpkZXZfbWd0ID0gdGFza19pbmZvLT5kZXZfbWd0Owo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29w cyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPsKgIAo+IC0g cmV0ID0gc2Vydl9vcHMtPnN0YXJ0X21ndF9mbG93KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihk ZXZfbWd0KSk7Cj4gLSBpZiAocmV0KSB7Cj4gLcKgIGRldl9lcnIoZGV2LCAiY3RybCBkZXYgc3Rh cnRfbWd0X2Zsb3cgZmFpbGVkXG4iKTsKPiAtwqAgZ290byBtZ3RfZmxvd19mYWlsOwo+IC0gfQo+ ICsgY2hhbl9vcHMtPmNsZWFuX3F1ZXVlX3N1YnRhc2soTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklW KGRldl9tZ3QpLCBOQkxfQ0hBTl9UWVBFX0FETUlOUSk7Cj4gK30KPsKgIAo+IC0gZm9yIChpID0g MDsgaSA8IE5CTF9DSEFOX1RZUEVfTUFYOyBpKyspIHsKPiAtwqAgcmV0ID0gbmJsX2Rldl9zZXR1 cF9jaGFuX3FpbmZvKGRldl9tZ3QsIGkpOwo+IC3CoCBpZiAocmV0KSB7Cj4gLSDCoCBkZXZfZXJy KGRldiwgImN0cmwgZGV2IHNldHVwIGNoYW4gcWluZm8gZmFpbGVkXG4iKTsKPiAtwqAgwqAgZ290 byBzZXR1cF9jaGFuX3FfZmFpbDsKPiAtwqAgfQo+IC0gfQo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2 X2NsZWFuX2FkbWlucV9zY2hlZHVsZShzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvKQo+ ICt7Cj4gKyBuYmxfY29tbW9uX3F1ZXVlX3dvcmsoJnRhc2tfaW5mby0+Y2xlYW5fYWRtaW5xX3Rh c2ssIHRydWUpOwo+ICt9Cj7CoCAKPiAtIG5ibF9kZXZfY3RybF9yZWdpc3Rlcl9mbHJfY2hhbl9t c2coZGV2X21ndCk7Cj4gLSBuYmxfZGV2X2N0cmxfcmVnaXN0ZXJfZW1wX2V4dF9hbGVydF9jaGFu X21zZyhkZXZfbWd0KTsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl9md19oZWFydGJlYXRfdGFzayhz dHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4gK3sKPiArIHN0cnVjdCBuYmxfdGFza19pbmZvICp0 YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ibF90YXNrX2luZm8sCj4gKyDC oCDCoCDCoCDCoCDCoCDCoCBmd19oYl90YXNrKTsKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2 X21ndCA9IHRhc2tfaW5mby0+ZGV2X21ndDsKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNo YW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJs X3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3Qp Owo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09N TU9OKGRldl9tZ3QpOwo+wqAgCj4gLSByZXQgPSBuYmxfZGV2X3NldHVwX2NoYW5fcXVldWUoZGV2 X21ndCwgTkJMX0NIQU5fVFlQRV9BRE1JTlEpOwo+IC0gaWYgKHJldCkgewo+IC3CoCBkZXZfZXJy KGRldiwgImN0cmwgZGV2IHNldHVwIGNoYW4gcXVldWUgZmFpbGVkXG4iKTsKPiAtIMKgIGdvdG8g c2V0dXBfY2hhbl9xX2ZhaWw7Cj4gLSB9Cj4gKyBpZiAodGFza19pbmZvLT5md19yZXNldHRpbmcp Cj4gK8KgIHJldHVybjsKPsKgIAo+IC0gcmV0ID0gbmJsX2Rldl9zZXR1cF9jdHJsX2Rldl90YXNr KGRldl9tZ3QpOwo+IC0gaWYgKHJldCkgewo+IC3CoCBkZXZfZXJyKGRldiwgImN0cmwgZGV2IHRh c2sgZmFpbGVkXG4iKTsKPiAtwqAgZ290byBzZXR1cF9jdHJsX2Rldl90YXNrX2ZhaWw7Cj4gKyBp ZiAoIXNlcnZfb3BzLT5jaGVja19md19oZWFydGJlYXQoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklW KGRldl9tZ3QpKSkgewo+ICvCoCBkZXZfbm90aWNlKE5CTF9DT01NT05fVE9fREVWKGNvbW1vbiks ICJGVyByZXNldCBkZXRlY3RlZCIpOwo+ICvCoCB0YXNrX2luZm8tPmZ3X3Jlc2V0dGluZyA9IHRy dWU7Cj4gK8KgIGNoYW5fb3BzLT5zZXRfcXVldWVfc3RhdGUoTkJMX0RFVl9NR1RfVE9fQ0hBTl9Q UklWKGRldl9tZ3QpLCBOQkxfQ0hBTl9BQk5PUk1BTCwKPiArIMKgIMKgIE5CTF9DSEFOX1RZUEVf QURNSU5RLCB0cnVlKTsKPiArwqAgbmJsX2NvbW1vbl9xdWV1ZV9kZWxheWVkX3dvcmsoJnRhc2tf aW5mby0+ZndfcmVzZXRfdGFzaywgTVNFQ19QRVJfU0VDLCB0cnVlKTsKPiDCoCB9Cj4gLQo+IC0g c2Vydl9vcHMtPmdldF9wYXJ0X251bWJlcihOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21n dCksIHBhcnRfbnVtYmVyKTsKPiAtIHNlcnZfb3BzLT5nZXRfc2VyaWFsX251bWJlcihOQkxfREVW X01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHNlcmlhbF9udW1iZXIpOwo+IC0gZGV2X2luZm8o ZGV2LCAicGFydCBudW1iZXI6ICVzLCBzZXJpYWwgbnVtYmVyOiAlc1xuIiwgcGFydF9udW1iZXIs IHNlcmlhbF9udW1iZXIpOwo+IC0KPiAtIG5ibF9kZXZfdXBkYXRlX3RlbXBsYXRlX2NvbmZpZyhk ZXZfbWd0KTsKPiAtCj4gLSByZXR1cm4gMDsKPiAtCj4gLXNldHVwX2N0cmxfZGV2X3Rhc2tfZmFp bDoKPiAtIG5ibF9kZXZfcmVtb3ZlX2NoYW5fcXVldWUoZGV2X21ndCwgTkJMX0NIQU5fVFlQRV9B RE1JTlEpOwo+IC1zZXR1cF9jaGFuX3FfZmFpbDoKPiAtIHNlcnZfb3BzLT5zdG9wX21ndF9mbG93 KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSk7Cj4gLW1ndF9mbG93X2ZhaWw6Cj4g LSBzZXJ2X29wcy0+ZGVzdHJveV9jaGlwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSk7Cj4gLWNoaXBfaW5pdF9mYWlsOgo+IC0gZGVzdHJveV93b3JrcXVldWUoY3RybF9kZXYtPmN0 cmxfZGV2X3dxMSk7Cj4gLWFsbG9jX3dxX2ZhaWw6Cj4gLSBkZXZtX2tmcmVlKGRldiwgY3RybF9k ZXYpOwo+IC0gTkJMX0RFVl9NR1RfVE9fQ1RSTF9ERVYoZGV2X21ndCkgPSBOVUxMOwo+IC1hbGxv Y19mYWlsOgo+IC0gbmJsX2Rldl9mcmVlX2JvYXJkX2lkKCZib2FyZF9pZF90YWJsZSwgYm9hcmRf a2V5KTsKPiAtIHJldHVybiByZXQ7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl9y ZW1vdmVfY3RybF9kZXYoc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyKQo+ICtzdGF0aWMgdm9p ZCBuYmxfZGV2X2Z3X3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+wqAgewo+ IC0gc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKU5C TF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9jdHJsICoq Y3RybF9kZXYgPSAmTkJMX0RFVl9NR1RfVE9fQ1RSTF9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3Qg ZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Cj4gKyBz dHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvID0gY29udGFpbmVyX29mKGRlbGF5ZWRfd29y aywgc3RydWN0IG5ibF90YXNrX2luZm8sCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCBmd19yZXNldF90 YXNrKTsKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2X21n dDsKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5fb3BzID0gTkJMX0RFVl9NR1RfVE9f Q0hBTl9PUFMoZGV2X21ndCk7Cj4gwqAgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMg PSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiAtIHUzMiBib2FyZF9rZXk7Cj4g KyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT04o ZGV2X21ndCk7Cj7CoCAKPiAtIGlmICghKmN0cmxfZGV2KQo+IC3CoCByZXR1cm47Cj4gKyBpZiAo c2Vydl9vcHMtPmNoZWNrX2Z3X3Jlc2V0KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSkpIHsKPiArwqAgZGV2X25vdGljZShOQkxfQ09NTU9OX1RPX0RFVihjb21tb24pLCAiRlcgcmVj b3ZlcmVkIik7Cj4gK8KgIG5ibF9kZXZfZGlzYWJsZV9hZG1pbnFfaXJxKGRldl9tZ3QpOwo+ICvC oCBuYmxfZGV2X2ZyZWVfYWRtaW5xX2lycShkZXZfbWd0LCB0YXNrX2luZm8pOwo+wqAgCj4gLSBi b2FyZF9rZXkgPSBwY2lfZG9tYWluX25yKGRldl9tZ3QtPmNvbW1vbi0+cGRldi0+YnVzKSA8PCAx NiB8Cj4gLSDCoCBkZXZfbWd0LT5jb21tb24tPnBkZXYtPmJ1cy0+bnVtYmVyOwo+IC0gbmJsX2Rl dl9yZW1vdmVfY2hhbl9xdWV1ZShkZXZfbWd0LCBOQkxfQ0hBTl9UWVBFX0FETUlOUSk7Cj4gLSBu YmxfZGV2X3JlbW92ZV9jdHJsX2Rldl90YXNrKGRldl9tZ3QpOwo+ICvCoCBtc2xlZXAoTkJMX0RF Vl9GV19SRVNFVF9XQUlUX1RJTUUpOyAvLyB3YWl0IGFkbWlucSB0aW1lb3V0Cj4gK8KgIG5ibF9k ZXZfcmVtb3ZlX2NoYW5fcXVldWUoZGV2X21ndCwgTkJMX0NIQU5fVFlQRV9BRE1JTlEpOwo+ICvC oCBuYmxfZGV2X3NldHVwX2NoYW5fcWluZm8oZGV2X21ndCwgTkJMX0NIQU5fVFlQRV9BRE1JTlEp Owo+ICvCoCBuYmxfZGV2X3NldHVwX2NoYW5fcXVldWUoZGV2X21ndCwgTkJMX0NIQU5fVFlQRV9B RE1JTlEpOwo+ICvCoCBuYmxfZGV2X3JlcXVlc3RfYWRtaW5xX2lycShkZXZfbWd0LCB0YXNrX2lu Zm8pOwo+ICvCoCBuYmxfZGV2X2VuYWJsZV9hZG1pbnFfaXJxKGRldl9tZ3QpOwo+wqAgCj4gLSBz ZXJ2X29wcy0+c3RvcF9tZ3RfZmxvdyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCkp Owo+IC0gc2Vydl9vcHMtPmRlc3Ryb3lfY2hpcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2 X21ndCkpOwo+ICvCoCBjaGFuX29wcy0+c2V0X3F1ZXVlX3N0YXRlKE5CTF9ERVZfTUdUX1RPX0NI QU5fUFJJVihkZXZfbWd0KSwgTkJMX0NIQU5fQUJOT1JNQUwsCj4gKyDCoCDCoCDCoCBOQkxfQ0hB Tl9UWVBFX0FETUlOUSwgZmFsc2UpOwo+wqAgCj4gLSBkZXN0cm95X3dvcmtxdWV1ZSgoKmN0cmxf ZGV2KS0+Y3RybF9kZXZfd3ExKTsKPiAtIGRldm1fa2ZyZWUoTkJMX0FEQVBURVJfVE9fREVWKGFk YXB0ZXIpLCAqY3RybF9kZXYpOwo+IC0gKmN0cmxfZGV2ID0gTlVMTDsKPiArwqAgaWYgKE5CTF9E RVZfTUdUX1RPX0NUUkxfREVWKGRldl9tZ3QpKSB7Cj4gKyDCoCBuYmxfZGV2X2dldF9wb3J0X2F0 dHJpYnV0ZXMoZGV2X21ndCk7Cj4gKyDCoCBuYmxfZGV2X2VuYWJsZV9wb3J0KGRldl9tZ3QsIHRy dWUpOwo+ICvCoCB9Cj4gK8KgIHRhc2tfaW5mby0+ZndfcmVzZXR0aW5nID0gZmFsc2U7Cj4gK8Kg IHJldHVybjsKPiArIH0KPsKgIAo+IC0gLyogSWYgaXQgaXMgbm90IG5pYywgdGhpcyBmcmVlIGZ1 bmN0aW9uIHdpbGwgZG8gbm90aGluZywgc28gbm8gbmVlZCBjaGVjayAqLwo+IC0gbmJsX2Rldl9m cmVlX2JvYXJkX2lkKCZib2FyZF9pZF90YWJsZSwgYm9hcmRfa2V5KTsKPiArIG5ibF9jb21tb25f cXVldWVfZGVsYXllZF93b3JrKGRlbGF5ZWRfd29yaywgTVNFQ19QRVJfU0VDLCB0cnVlKTsKPsKg IH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZp Y2UgKm5ldGRldikKPiArc3RhdGljIHZvaWQgbmJsX2Rldl9hZGFwdF9kZXNjX2dvdGhlcl90YXNr KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPsKgIHsKPiAtIHN0cnVjdCBuYmxfYWRhcHRlciAq YWRhcHRlciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihuZXRkZXYpOwo+IC0gc3RydWN0IG5ibF9k ZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiArIHN0 cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0 IG5ibF90YXNrX2luZm8sCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCBhZGFwdF9kZXNjX2dvdGhlcl90 YXNrKTsKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IHRhc2tfaW5mby0+ZGV2X21n dDsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RP X1NFUlZfT1BTKGRldl9tZ3QpOwo+wqAgCj4gLSByZXR1cm4gc2Vydl9vcHMtPm5ldGRldl9vcGVu KG5ldGRldik7Cj4gKyBzZXJ2X29wcy0+YWRhcHRfZGVzY19nb3RoZXIoTkJMX0RFVl9NR1RfVE9f U0VSVl9QUklWKGRldl9tZ3QpKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfbmV0 ZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKPiArc3RhdGljIHZvaWQgbmJsX2Rl dl9yZWNvdmVyeV9hYm5vcm1hbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPsKgIHsK PiAtIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihu ZXRkZXYpOwo+IC0gc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBURVJfVE9f REVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBj b250YWluZXJfb2Yod29yaywgc3RydWN0IG5ibF90YXNrX2luZm8sCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCByZWNvdmVyeV9hYm5vcm1hbF90YXNrKTsKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2 X21ndCA9IHRhc2tfaW5mby0+ZGV2X21ndDsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpz ZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+wqAgCj4gLSByZXR1 cm4gc2Vydl9vcHMtPm5ldGRldl9zdG9wKG5ldGRldik7Cj4gKyBzZXJ2X29wcy0+cmVjb3Zlcnlf YWJub3JtYWwoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpKTsKPsKgIH0KPsKgIAo+ IC1zdGF0aWMgbmV0ZGV2X3R4X3QgbmJsX2Rldl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpz a2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY3Ry bF9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPsKgIHsKPiAtIHN0cnVjdCBu YmxfYWRhcHRlciAqYWRhcHRlciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihuZXRkZXYpOwo+IC0g c3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFw dGVyKTsKPiAtIHN0cnVjdCBuYmxfcmVzb3VyY2VfcHRfb3BzICpwdF9vcHMgPSBOQkxfREVWX01H VF9UT19SRVNfUFRfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF90YXNrX2luZm8gKnRhc2tf aW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbywKPiArIMKgIMKg IMKgIMKgIMKgIMKgIHJlc2V0X3Rhc2spOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0 ID0gdGFza19pbmZvLT5kZXZfbWd0Owo+wqAgCj4gLSByZXR1cm4gcHRfb3BzLT5zdGFydF94bWl0 KHNrYiwgbmV0ZGV2KTsKPiArIG5ibF9kZXZfaGFuZGxlX2ZhdGFsX2VycihkZXZfbWd0KTsKPsKg IH0KPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X25ldGRldl9nZXRfc3RhdHM2NChzdHJ1Y3Qg bmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQo+ICtz dGF0aWMgdm9pZCBuYmxfZGV2X2N0cmxfdGFza19zY2hlZHVsZShzdHJ1Y3QgbmJsX3Rhc2tfaW5m byAqdGFza19pbmZvKQo+wqAgewo+IC0gc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyID0gTkJM X05FVERFVl9UT19BREFQVEVSKG5ldGRldik7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9t Z3QgPSBOQkxfQURBUFRFUl9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9kZXZf bWd0ICpkZXZfbWd0ID0gdGFza19pbmZvLT5kZXZfbWd0Owo+IMKgIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj7CoCAK PiAtIHNlcnZfb3BzLT5nZXRfc3RhdHM2NChuZXRkZXYsIHN0YXRzKTsKPiAtfQo+ICsgaWYgKHNl cnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZf bWd0KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX0ZXX0hCX0NBUCkpCj4gK8KgIG5ibF9jb21tb25f cXVldWVfd29yaygmdGFza19pbmZvLT5md19oYl90YXNrLCB0cnVlKTsKPsKgIAo+IC1zdGF0aWMg aW50IG5ibF9kZXZfbmV0ZGV2X3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwg X19iZTE2IHByb3RvLCB1MTYgdmlkKQo+IC17Cj4gLSBzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0 ZXIgPSBOQkxfTkVUREVWX1RPX0FEQVBURVIobmV0ZGV2KTsKPiAtIHN0cnVjdCBuYmxfZGV2X21n dCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj4gLSBzdHJ1Y3Qg bmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9t Z3QpOwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX0FEQVBUX0RFU0NfR09U SEVSKSkKPiArwqAgbmJsX2NvbW1vbl9xdWV1ZV93b3JrKCZ0YXNrX2luZm8tPmFkYXB0X2Rlc2Nf Z290aGVyX3Rhc2ssIHRydWUpOwo+wqAgCj4gLSByZXR1cm4gc2Vydl9vcHMtPnJ4X2FkZF92aWQo bmV0ZGV2LCBwcm90bywgdmlkKTsKPiArIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2Nh cChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfUkVD T1ZFUllfQUJOT1JNQUxfU1RBVFVTKSkKPiArwqAgbmJsX2NvbW1vbl9xdWV1ZV93b3JrKCZ0YXNr X2luZm8tPnJlY292ZXJ5X2Fibm9ybWFsX3Rhc2ssIHRydWUpOwo+wqAgfQo+wqAgCj4gLXN0YXRp YyBpbnQgbmJsX2Rldl9uZXRkZXZfcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRl diwgX19iZTE2IHByb3RvLCB1MTYgdmlkKQo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2N0cmxfdGFz a190aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfYWRhcHRl ciAqYWRhcHRlciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihuZXRkZXYpOwo+IC0gc3RydWN0IG5i bF9kZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiAr IHN0cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBjb250YWluZXJfb2YodCwgc3RydWN0 IG5ibF90YXNrX2luZm8sIHNlcnZfdGltZXIpOwo+ICsKPiArIG1vZF90aW1lcigmdGFza19pbmZv LT5zZXJ2X3RpbWVyLCByb3VuZF9qaWZmaWVzKHRhc2tfaW5mby0+c2Vydl90aW1lcl9wZXJpb2Qg KyBqaWZmaWVzKSk7Cj4gKyBuYmxfZGV2X2N0cmxfdGFza19zY2hlZHVsZSh0YXNrX2luZm8pOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2N0cmxfdGFza19zdGFydChzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiArIHN0cnVjdCBuYmxfZGV2X2N0cmwgKmN0cmxfZGV2 ID0gTkJMX0RFVl9NR1RfVE9fQ1RSTF9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX3Rhc2tf aW5mbyAqdGFza19pbmZvID0gTkJMX0RFVl9DVFJMX1RPX1RBU0tfSU5GTyhjdHJsX2Rldik7Cj4g Kwo+ICsgaWYgKCF0YXNrX2luZm8tPnRpbWVyX3NldHVwKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsg bW9kX3RpbWVyKCZ0YXNrX2luZm8tPnNlcnZfdGltZXIsIHJvdW5kX2ppZmZpZXMoamlmZmllcyAr IHRhc2tfaW5mby0+c2Vydl90aW1lcl9wZXJpb2QpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg bmJsX2Rldl9jdHJsX3Rhc2tfc3RvcChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sK PiArIHN0cnVjdCBuYmxfZGV2X2N0cmwgKmN0cmxfZGV2ID0gTkJMX0RFVl9NR1RfVE9fQ1RSTF9E RVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX3Rhc2tfaW5mbyAqdGFza19pbmZvID0gTkJMX0RF Vl9DVFJMX1RPX1RBU0tfSU5GTyhjdHJsX2Rldik7Cj4gKwo+ICsgaWYgKCF0YXNrX2luZm8tPnRp bWVyX3NldHVwKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgdGltZXJfZGVsZXRlX3N5bmMoJnRhc2tf aW5mby0+c2Vydl90aW1lcik7Cj4gKyB0YXNrX2luZm8tPnRpbWVyX3NldHVwID0gZmFsc2U7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2hhbl9ub3RpZnlfZmxyX3Jlc3Aodm9pZCAq cHJpdiwgdTE2IHNyY19pZCwgdTE2IG1zZ19pZCwKPiArwqAgwqAgwqAgdm9pZCAqZGF0YSwgdTMy IGRhdGFfbGVuKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0 IG5ibF9kZXZfbWd0ICopcHJpdjsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29w cyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgdTE2IHZmaWQ7Cj7CoCAK PiAtIHJldHVybiBzZXJ2X29wcy0+cnhfa2lsbF92aWQobmV0ZGV2LCBwcm90bywgdmlkKTsKPiAr IHZmaWQgPSAqKHUxNiAqKWRhdGE7Cj4gKyBzZXJ2X29wcy0+cHJvY2Vzc19mbHIoTkJMX0RFVl9N R1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCB2ZmlkKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgY29u c3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHNfbGVvbmlzX3BmID0gewo+IC0gLm5k b19vcGVuID0gbmJsX2Rldl9uZXRkZXZfb3BlbiwKPiAtIC5uZG9fc3RvcCA9IG5ibF9kZXZfbmV0 ZGV2X3N0b3AsCj4gLSAubmRvX3N0YXJ0X3htaXQgPSBuYmxfZGV2X3N0YXJ0X3htaXQsCj4gLSAu bmRvX3ZhbGlkYXRlX2FkZHIgPSBldGhfdmFsaWRhdGVfYWRkciwKPiAtIC5uZG9fZ2V0X3N0YXRz NjQgPSBuYmxfZGV2X25ldGRldl9nZXRfc3RhdHM2NCwKPiAtIC5uZG9fdmxhbl9yeF9hZGRfdmlk ID0gbmJsX2Rldl9uZXRkZXZfcnhfYWRkX3ZpZCwKPiAtIC5uZG9fdmxhbl9yeF9raWxsX3ZpZCA9 IG5ibF9kZXZfbmV0ZGV2X3J4X2tpbGxfdmlkLAo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2N0cmxf cmVnaXN0ZXJfZmxyX2NoYW5fbXNnKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArewo+ ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFO X09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJM X0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKwo+ICsgaWYgKCFzZXJ2X29wcy0+Z2V0 X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gK8Kg IMKgIMKgIMKgIE5CTF9QUk9DRVNTX0ZMUl9DQVApKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgY2hh bl9vcHMtPnJlZ2lzdGVyX21zZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksCj4g K8KgIMKgIMKgIMKgIMKgIE5CTF9DSEFOX01TR19BRE1JTlFfRkxSX05PVElGWSwKPiArwqAgwqAg wqAgwqAgwqAgbmJsX2Rldl9jaGFuX25vdGlmeV9mbHJfcmVzcCwgZGV2X21ndCk7Cj4gK30KPsKg IAo+ICtzdGF0aWMgc3RydWN0IG5ibF9kZXZfdGVtcF9hbGFybV9pbmZvIHRlbXBfYWxhcm1faW5m b1tOQkxfVEVNUF9TVEFUVVNfTUFYXSA9IHsKPiArIHtMT0dMRVZFTF9XQVJOSU5HLCAiSGlnaCB0 ZW1wZXJhdHVyZSBvbiBzZW5zb3JzMCByZXN1bWVkLlxuIn0sCj4gKyB7TE9HTEVWRUxfV0FSTklO RywgIkhpZ2ggdGVtcGVyYXR1cmUgb24gc2Vuc29yczAgb2JzZXJ2ZWQsIHNlY3VyaXR5KFdBUk5J TkcpLlxuIn0sCj4gKyB7TE9HTEVWRUxfQ1JJVCwgIkhpZ2ggdGVtcGVyYXR1cmUgb24gc2Vuc29y czAgb2JzZXJ2ZWQsIHNlY3VyaXR5KENSSVRJQ0FMKS5cbiJ9LAo+ICsge0xPR0xFVkVMX0VNRVJH LCAiSGlnaCB0ZW1wZXJhdHVyZSBvbiBzZW5zb3JzMCBvYnNlcnZlZCwgc2VjdXJpdHkoRU1FUkdF TkNZKS5cbiJ9LAo+wqAgfTsKPsKgIAo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vf b3BzIG5ldGRldl9vcHNfbGVvbmlzX3ZmID0gewo+IC0gLm5kb19vcGVuID0gbmJsX2Rldl9uZXRk ZXZfb3BlbiwKPiAtIC5uZG9fc3RvcCA9IG5ibF9kZXZfbmV0ZGV2X3N0b3AsCj4gLSAubmRvX3N0 YXJ0X3htaXQgPSBuYmxfZGV2X3N0YXJ0X3htaXQsCj4gLSAubmRvX3ZhbGlkYXRlX2FkZHIgPSBl dGhfdmFsaWRhdGVfYWRkciwKPiAtIC5uZG9fZ2V0X3N0YXRzNjQgPSBuYmxfZGV2X25ldGRldl9n ZXRfc3RhdHM2NCwKPiAtIC5uZG9fdmxhbl9yeF9hZGRfdmlkID0gbmJsX2Rldl9uZXRkZXZfcnhf YWRkX3ZpZCwKPiAtIC5uZG9fdmxhbl9yeF9raWxsX3ZpZCA9IG5ibF9kZXZfbmV0ZGV2X3J4X2tp bGxfdmlkLAo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2hhbmRsZV90ZW1wX2V4dChzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QsIHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4pCj4gK3sKPiArIHUxNiB0 ZW1wID0gKHUxNikqZGF0YTsKPiArIHU2NCB1cHRpbWUgPSAwOwo+ICsgc3RydWN0IG5ibF9jb21t b25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3Ry dWN0IG5ibF9kZXZfY3RybCAqY3RybF9kZXYgPSBOQkxfREVWX01HVF9UT19DVFJMX0RFVihkZXZf bWd0KTsKPiArIGVudW0gbmJsX2Rldl90ZW1wX3N0YXR1cyBvbGRfdGVtcF9zdGF0dXMgPSBjdHJs X2Rldi0+dGVtcF9zdGF0dXM7Cj4gKyBlbnVtIG5ibF9kZXZfdGVtcF9zdGF0dXMgbmV3X3RlbXBf c3RhdHVzID0gTkJMX1RFTVBfU1RBVFVTX05PUk1BTDsKPiArCj4gKyAvKiBubyByZXN1bWUgaWYg dGVtcCBleGNlZWQgTkJMX1RFTVBfRU1FUkdfVEhSRVNIT0xELCBldmVuIGlmIHRoZSB0ZW1wIHJl c3VtZSBub21hbC4KPiArwqAgKiBCZWNhdXNlIHRoZSBodyBoYXMgc2h1dGRvd24uCj4gK8KgICov Cj4gKyBpZiAob2xkX3RlbXBfc3RhdHVzID09IE5CTF9URU1QX1NUQVRVU19FTUVSRykKPiArwqAg cmV0dXJuOwo+ICsKPiArIC8qIGlmIHRlbXAgaW4gKDg1LTEwNSkgYW5kIG5vdCBpbiBub3JtYWxf c3RhdHVzLCBubyByZXN1bWUgdG8gYXZvaWQgYWxhcm0gb3NjaWxsYXRlICovCj4gKyBpZiAodGVt cCA+IE5CTF9URU1QX05PTUFMX1RIUkVTSE9MRCAmJgo+ICsgwqAgwqAgdGVtcCA8IE5CTF9URU1Q X1dBUk5JTkdfVEhSRVNIT0xEICYmCj4gKyDCoCDCoCBvbGRfdGVtcF9zdGF0dXMgPiBOQkxfVEVN UF9TVEFUVVNfTk9STUFMKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgaWYgKHRlbXAgPj0gTkJMX1RF TVBfV0FSTklOR19USFJFU0hPTEQgJiYKPiArIMKgIMKgIHRlbXAgPCBOQkxfVEVNUF9DUklUX1RI UkVTSE9MRCkKPiArwqAgbmV3X3RlbXBfc3RhdHVzID0gTkJMX1RFTVBfU1RBVFVTX1dBUk5JTkc7 Cj4gKyBlbHNlIGlmICh0ZW1wID49IE5CTF9URU1QX0NSSVRfVEhSRVNIT0xEICYmCj4gKyDCoCB0 ZW1wIDwgTkJMX1RFTVBfRU1FUkdfVEhSRVNIT0xEKQo+ICvCoCBuZXdfdGVtcF9zdGF0dXMgPSBO QkxfVEVNUF9TVEFUVVNfQ1JJVDsKPiArIGVsc2UgaWYgKHRlbXAgPj0gTkJMX1RFTVBfRU1FUkdf VEhSRVNIT0xEKQo+ICvCoCBuZXdfdGVtcF9zdGF0dXMgPSBOQkxfVEVNUF9TVEFUVVNfRU1FUkc7 Cj4gKwo+ICsgaWYgKG5ld190ZW1wX3N0YXR1cyA9PSBvbGRfdGVtcF9zdGF0dXMpCj4gK8KgIHJl dHVybjsKPiArCj4gKyBjdHJsX2Rldi0+dGVtcF9zdGF0dXMgPSBuZXdfdGVtcF9zdGF0dXM7Cj4g Kwo+ICsgLyogdGVtcCBmYWxsIG9ubHkgYWxhcm0gd2hlbiB0aGUgYWxhcm0gbmVlZCB0byByZXN1 bWUgKi8KPiArIGlmIChuZXdfdGVtcF9zdGF0dXMgPCBvbGRfdGVtcF9zdGF0dXMgJiYgbmV3X3Rl bXBfc3RhdHVzICE9IE5CTF9URU1QX1NUQVRVU19OT1JNQUwpCj4gK8KgIHJldHVybjsKPiArCj4g KyBpZiAoZGF0YV9sZW4gPiBzaXplb2YodTE2KSkKPiArwqAgdXB0aW1lID0gKih1NjQgKikoZGF0 YSArIHNpemVvZih1MTYpKTsKPiArIG5ibF9sb2coY29tbW9uLCB0ZW1wX2FsYXJtX2luZm9bbmV3 X3RlbXBfc3RhdHVzXS5sb2d2ZWwsCj4gK8KgICJbJWxsdV0gJXMiLCB1cHRpbWUsIHRlbXBfYWxh cm1faW5mb1tuZXdfdGVtcF9zdGF0dXNdLmFsYXJtX2luZm8pOwo+ICsKPiArIGlmIChuZXdfdGVt cF9zdGF0dXMgPT0gTkJMX1RFTVBfU1RBVFVTX0VNRVJHKSB7Cj4gK8KgIGN0cmxfZGV2LT50YXNr X2luZm8ucmVzZXRfZXZlbnQgPSBOQkxfSFdfRkFUQUxfRVJSX0VWRU5UOwo+ICvCoCBuYmxfY29t bW9uX3F1ZXVlX3dvcmsoJmN0cmxfZGV2LT50YXNrX2luZm8ucmVzZXRfdGFzaywgZmFsc2UpOwo+ ICsgfQo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QgY2hhciAqbmJsX2xvZ19sZXZlbF9uYW1lKGlu dCBsZXZlbCkKPiArewo+ICsgc3dpdGNoIChsZXZlbCkgewo+ICsgY2FzZSBOQkxfRU1QX0FMRVJU X0xPR19GQVRBTDoKPiArwqAgcmV0dXJuICJGQVRBTCI7Cj4gKyBjYXNlIE5CTF9FTVBfQUxFUlRf TE9HX0VSUk9SOgo+ICvCoCByZXR1cm4gIkVSUk9SIjsKPiArIGNhc2UgTkJMX0VNUF9BTEVSVF9M T0dfV0FSTklORzoKPiArwqAgcmV0dXJuICJXQVJOSU5HIjsKPiArIGNhc2UgTkJMX0VNUF9BTEVS VF9MT0dfSU5GTzoKPiArwqAgcmV0dXJuICJJTkZPIjsKPiArIGRlZmF1bHQ6Cj4gK8KgIHJldHVy biAiVU5LTk9XTiI7Cj4gKyB9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfaGFuZGxl X2VtcF9sb2dfZXh0KHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgdTggKmRhdGEsIHUxNiBk YXRhX2xlbikKPiArewo+ICsgc3RydWN0IG5ibF9lbXBfYWxlcnRfbG9nX2V2ZW50ICpsb2dfZXZl bnQgPSAoc3RydWN0IG5ibF9lbXBfYWxlcnRfbG9nX2V2ZW50ICopZGF0YTsKPiArIHN0cnVjdCBu YmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsK PiArCj4gKyBuYmxfbG9nKGNvbW1vbiwgTE9HTEVWRUxfSU5GTywgIltGV11bJWxsdV0gPCVzPiAl LipzIiwgbG9nX2V2ZW50LT51cHRpbWUsCj4gK8KgIG5ibF9sb2dfbGV2ZWxfbmFtZShsb2dfZXZl bnQtPmxldmVsKSwgZGF0YV9sZW4gLSBzaXplb2YodTY0KSAtIHNpemVvZih1OCksCj4gK8KgIGxv Z19ldmVudC0+ZGF0YSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2hhbl9ub3Rp ZnlfZXZ0X2FsZXJ0X3Jlc3Aodm9pZCAqcHJpdiwgdTE2IHNyY19pZCwgdTE2IG1zZ19pZCwKPiAr wqAgwqAgwqAgwqAgwqAgwqAgdm9pZCAqZGF0YSwgdTMyIGRhdGFfbGVuKQo+ICt7Cj4gKyBzdHJ1 Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopcHJpdjsKPiAr IHN0cnVjdCBuYmxfY2hhbl9wYXJhbV9lbXBfYWxlcnRfZXZlbnQgKmFsZXJ0X3BhcmFtID0KPiAr wqAgwqAgwqAgKHN0cnVjdCBuYmxfY2hhbl9wYXJhbV9lbXBfYWxlcnRfZXZlbnQgKilkYXRhOwo+ ICsKPiArIHN3aXRjaCAoYWxlcnRfcGFyYW0tPnR5cGUpIHsKPiArIGNhc2UgTkJMX0VNUF9FVkVO VF9URU1QX0FMRVJUOgo+ICvCoCBuYmxfZGV2X2hhbmRsZV90ZW1wX2V4dChkZXZfbWd0LCBhbGVy dF9wYXJhbS0+ZGF0YSwgYWxlcnRfcGFyYW0tPmxlbik7Cj4gK8KgIHJldHVybjsKPiArIGNhc2Ug TkJMX0VNUF9FVkVOVF9MT0dfQUxFUlQ6Cj4gK8KgIG5ibF9kZXZfaGFuZGxlX2VtcF9sb2dfZXh0 KGRldl9tZ3QsIGFsZXJ0X3BhcmFtLT5kYXRhLCBhbGVydF9wYXJhbS0+bGVuKTsKPiArwqAgcmV0 dXJuOwo+ICsgZGVmYXVsdDoKPiArwqAgcmV0dXJuOwo+ICsgfQo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBuYmxfZGV2X2N0cmxfcmVnaXN0ZXJfZW1wX2V4dF9hbGVydF9jaGFuX21zZyhzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiArIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNo YW5fb3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gKwo+ICsgaWYgKCFj aGFuX29wcy0+Y2hlY2tfcXVldWVfZXhpc3QoTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9t Z3QpLAo+ICvCoCDCoCDCoCBOQkxfQ0hBTl9UWVBFX01BSUxCT1gpKQo+ICvCoCByZXR1cm47Cj4g Kwo+ICsgY2hhbl9vcHMtPnJlZ2lzdGVyX21zZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2 X21ndCksCj4gK8KgIMKgIMKgIMKgIMKgIE5CTF9DSEFOX01TR19BRE1JTlFfRVhUX0FMRVJULAo+ ICvCoCDCoCDCoCDCoCDCoCBuYmxfZGV2X2NoYW5fbm90aWZ5X2V2dF9hbGVydF9yZXNwLCBkZXZf bWd0KTsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X3NldHVwX2N0cmxfZGV2X3Rhc2so c3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jdHJs ICpjdHJsX2RldiA9IE5CTF9ERVZfTUdUX1RPX0NUUkxfREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0 IG5ibF90YXNrX2luZm8gKnRhc2tfaW5mbyA9IE5CTF9ERVZfQ1RSTF9UT19UQVNLX0lORk8oY3Ry bF9kZXYpOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01H VF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArCj4gKyB0YXNrX2luZm8tPmRldl9tZ3QgPSBkZXZf bWd0Owo+ICsKPiArIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01H VF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfVEFTS19GV19IQl9DQVAp KSB7Cj4gK8KgIG5ibF9jb21tb25fYWxsb2NfdGFzaygmdGFza19pbmZvLT5md19oYl90YXNrLCBu YmxfZGV2X2Z3X2hlYXJ0YmVhdF90YXNrKTsKPiArwqAgdGFza19pbmZvLT50aW1lcl9zZXR1cCA9 IHRydWU7Cj4gKyB9Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5C TF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX0ZX X1JFU0VUX0NBUCkpIHsKPiArwqAgbmJsX2NvbW1vbl9hbGxvY19kZWxheWVkX3Rhc2soJnRhc2tf aW5mby0+ZndfcmVzZXRfdGFzaywgbmJsX2Rldl9md19yZXNldF90YXNrKTsKPiArwqAgdGFza19p bmZvLT50aW1lcl9zZXR1cCA9IHRydWU7Cj4gKyB9Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRf cHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKg IMKgIMKgIE5CTF9UQVNLX0NMRUFOX0FETUlORFFfQ0FQKSkgewo+ICvCoCBuYmxfY29tbW9uX2Fs bG9jX3Rhc2soJnRhc2tfaW5mby0+Y2xlYW5fYWRtaW5xX3Rhc2ssIG5ibF9kZXZfY2xlYW5fYWRt aW5xX3Rhc2spOwo+ICvCoCB0YXNrX2luZm8tPnRpbWVyX3NldHVwID0gdHJ1ZTsKPiArIH0KPiAr Cj4gKyBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VS Vl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgTkJMX1RBU0tfQURBUFRfREVTQ19HT1RIRVIp KSB7Cj4gK8KgIG5ibF9jb21tb25fYWxsb2NfdGFzaygmdGFza19pbmZvLT5hZGFwdF9kZXNjX2dv dGhlcl90YXNrLAo+ICvCoCDCoCDCoCDCoCDCoCBuYmxfZGV2X2FkYXB0X2Rlc2NfZ290aGVyX3Rh c2spOwo+ICvCoCB0YXNrX2luZm8tPnRpbWVyX3NldHVwID0gdHJ1ZTsKPiArIH0KPiArCj4gKyBp ZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklW KGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgTkJMX1JFQ09WRVJZX0FCTk9STUFMX1NUQVRVUykpIHsK PiArwqAgbmJsX2NvbW1vbl9hbGxvY190YXNrKCZ0YXNrX2luZm8tPnJlY292ZXJ5X2Fibm9ybWFs X3Rhc2ssCj4gK8KgIMKgIMKgIMKgIMKgIG5ibF9kZXZfcmVjb3ZlcnlfYWJub3JtYWxfdGFzayk7 Cj4gK8KgIHRhc2tfaW5mby0+dGltZXJfc2V0dXAgPSB0cnVlOwo+ICsgfQo+ICsgaWYgKHNlcnZf b3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX1JFU0VUX0NUUkxfQ0FQKSkKPiArwqAgbmJsX2NvbW1v bl9hbGxvY190YXNrKCZ0YXNrX2luZm8tPnJlc2V0X3Rhc2ssICZuYmxfZGV2X2N0cmxfcmVzZXRf dGFzayk7Cj4gKwo+ICsgbmJsX2NvbW1vbl9hbGxvY190YXNrKCZ0YXNrX2luZm8tPmNsZWFuX2Fi bm9ybWFsX2lycV90YXNrLAo+ICsgwqAgwqAgwqAgwqAgbmJsX2Rldl9oYW5kbGVfYWJub3JtYWxf ZXZlbnQpOwo+ICsKPiArIGlmICh0YXNrX2luZm8tPnRpbWVyX3NldHVwKSB7Cj4gK8KgIHRpbWVy X3NldHVwKCZ0YXNrX2luZm8tPnNlcnZfdGltZXIsIG5ibF9kZXZfY3RybF90YXNrX3RpbWVyLCAw KTsKPiArwqAgdGFza19pbmZvLT5zZXJ2X3RpbWVyX3BlcmlvZCA9IEhaOwo+ICsgfQo+ICsKPiAr IG5ibF9kZXZfcmVnaXN0ZXJfY2hhbl90YXNrKGRldl9tZ3QsIE5CTF9DSEFOX1RZUEVfQURNSU5R LCAmdGFza19pbmZvLT5jbGVhbl9hZG1pbnFfdGFzayk7Cj4gKwo+ICsgcmV0dXJuIDA7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3ZlX2N0cmxfZGV2X3Rhc2soc3RydWN0IG5i bF9kZXZfbWd0ICpkZXZfbWd0KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jdHJsICpjdHJsX2Rl diA9IE5CTF9ERVZfTUdUX1RPX0NUUkxfREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9zZXJ2 aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiAr IHN0cnVjdCBuYmxfdGFza19pbmZvICp0YXNrX2luZm8gPSBOQkxfREVWX0NUUkxfVE9fVEFTS19J TkZPKGN0cmxfZGV2KTsKPiArCj4gKyBuYmxfZGV2X3JlZ2lzdGVyX2NoYW5fdGFzayhkZXZfbWd0 LCBOQkxfQ0hBTl9UWVBFX0FETUlOUSwgTlVMTCk7Cj4gKwo+ICsgbmJsX2NvbW1vbl9yZWxlYXNl X3Rhc2soJnRhc2tfaW5mby0+Y2xlYW5fYWJub3JtYWxfaXJxX3Rhc2spOwo+ICsKPiArIGlmIChz ZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2 X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfVEFTS19GV19SRVNFVF9DQVApKQo+ICvCoCBuYmxfY29t bW9uX3JlbGVhc2VfZGVsYXllZF90YXNrKCZ0YXNrX2luZm8tPmZ3X3Jlc2V0X3Rhc2spOwo+ICsK PiArIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJW X1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfVEFTS19GV19IQl9DQVApKQo+ICvCoCBu YmxfY29tbW9uX3JlbGVhc2VfdGFzaygmdGFza19pbmZvLT5md19oYl90YXNrKTsKPiArCj4gKyBp ZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklW KGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAgTkJMX1RBU0tfQ0xFQU5fQURNSU5EUV9DQVApKQo+ICvC oCBuYmxfY29tbW9uX3JlbGVhc2VfdGFzaygmdGFza19pbmZvLT5jbGVhbl9hZG1pbnFfdGFzayk7 Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX0FEQVBUX0RFU0NfR09U SEVSKSkKPiArwqAgbmJsX2NvbW1vbl9yZWxlYXNlX3Rhc2soJnRhc2tfaW5mby0+YWRhcHRfZGVz Y19nb3RoZXJfdGFzayk7Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2Fw KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIE5CTF9SRUNP VkVSWV9BQk5PUk1BTF9TVEFUVVMpKQo+ICvCoCBuYmxfY29tbW9uX3JlbGVhc2VfdGFzaygmdGFz a19pbmZvLT5yZWNvdmVyeV9hYm5vcm1hbF90YXNrKTsKPiArCj4gKyBpZiAoc2Vydl9vcHMtPmdl dF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsg wqAgwqAgwqAgTkJMX1RBU0tfUkVTRVRfQ1RSTF9DQVApKQo+ICvCoCBuYmxfY29tbW9uX3JlbGVh c2VfdGFzaygmdGFza19pbmZvLT5yZXNldF90YXNrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBu YmxfZGV2X3VwZGF0ZV90ZW1wbGF0ZV9jb25maWcoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0 KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdU X1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsKPiArIHJldHVybiBzZXJ2X29wcy0+dXBkYXRlX3Rl bXBsYXRlX2NvbmZpZyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCkpOwo+ICt9Cj4g Kwo+ICsvKiAtLS0tLS0tLS0twqAgRGV2IGluaXQgcHJvY2Vzc8KgIC0tLS0tLS0tLS0gKi8KPiAr c3RhdGljIGludCBuYmxfZGV2X3NldHVwX2NvbW1vbl9kZXYoc3RydWN0IG5ibF9hZGFwdGVyICph ZGFwdGVyLCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0gKnBhcmFtKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopTkJMX0FEQVBURVJfVE9f REVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfZGV2X2NvbW1vbiAqY29tbW9uX2RldjsK PiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VS Vl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxf REVWX01HVF9UT19DT01NT04oZGV2X21ndCk7Cj4gKyBpbnQgYm9hcmRfaWQ7Cj4gKwo+ICsgY29t bW9uX2RldiA9IGRldm1fa3phbGxvYyhOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRlciksCj4gK8Kg IMKgIMKgIHNpemVvZihzdHJ1Y3QgbmJsX2Rldl9jb21tb24pLCBHRlBfS0VSTkVMKTsKPiArIGlm ICghY29tbW9uX2RldikKPiArwqAgcmV0dXJuIC1FTk9NRU07Cj4gKyBjb21tb25fZGV2LT5kZXZf bWd0ID0gZGV2X21ndDsKPiArCj4gKyBpZiAobmJsX2Rldl9zZXR1cF9jaGFuX3F1ZXVlKGRldl9t Z3QsIE5CTF9DSEFOX1RZUEVfTUFJTEJPWCkpCj4gK8KgIGdvdG8gc2V0dXBfY2hhbl9mYWlsOwo+ ICsKPiArIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19T RVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfVEFTS19DTEVBTl9NQUlMQk9YX0NB UCkpCj4gK8KgIG5ibF9jb21tb25fYWxsb2NfdGFzaygmY29tbW9uX2Rldi0+Y2xlYW5fbWJ4X3Rh c2ssIG5ibF9kZXZfY2xlYW5fbWFpbGJveF90YXNrKTsKPiArCj4gKyBpZiAoc2Vydl9vcHMtPmdl dF9wcm9kdWN0X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsg wqAgwqAgwqAgTkJMX1RBU0tfUkVTRVRfQ0FQKSkKPiArwqAgbmJsX2NvbW1vbl9hbGxvY190YXNr KCZjb21tb25fZGV2LT5yZXNldF90YXNrLnRhc2ssICZuYmxfZGV2X3ByZXBhcmVfcmVzZXRfdGFz ayk7Cj4gKwo+ICsgaWYgKHBhcmFtLT5jYXBzLmlzX25pYykgewo+ICvCoCBib2FyZF9pZCA9IHNl cnZfb3BzLT5nZXRfYm9hcmRfaWQoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpKTsK PiArwqAgaWYgKGJvYXJkX2lkIDwgMCkKPiArIMKgIGdvdG8gZ2V0X2JvYXJkX2lkX2ZhaWw7Cj4g K8KgIE5CTF9DT01NT05fVE9fQk9BUkRfSUQoY29tbW9uKSA9IGJvYXJkX2lkOwo+ICsgfQo+ICsK PiArIE5CTF9DT01NT05fVE9fVlNJX0lEKGNvbW1vbikgPSBzZXJ2X29wcy0+Z2V0X3ZzaV9pZChO QkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIDAsCj4gKyDCoCDCoCDCoCDCoCDCoCBO QkxfVlNJX0RBVEEpOwo+ICsKPiArIHNlcnZfb3BzLT5nZXRfZXRoX2lkKE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSwgTkJMX0NPTU1PTl9UT19WU0lfSUQoY29tbW9uKSwKPiArwqAg wqAgwqAgwqAgJk5CTF9DT01NT05fVE9fRVRIX01PREUoY29tbW9uKSwgJk5CTF9DT01NT05fVE9f RVRIX0lEKGNvbW1vbiksCj4gK8KgIMKgIMKgIMKgICZOQkxfQ09NTU9OX1RPX0xPR0lDX0VUSF9J RChjb21tb24pKTsKPiArCj4gKyBuYmxfZGV2X3JlZ2lzdGVyX2NoYW5fdGFzayhkZXZfbWd0LCBO QkxfQ0hBTl9UWVBFX01BSUxCT1gsICZjb21tb25fZGV2LT5jbGVhbl9tYnhfdGFzayk7Cj4gKwo+ ICsgTkJMX0RFVl9NR1RfVE9fQ09NTU9OX0RFVihkZXZfbWd0KSA9IGNvbW1vbl9kZXY7Cj4gKwo+ ICsgbmJsX2Rldl9yZWdpc3Rlcl9jb21tb25faXJxKGRldl9tZ3QpOwo+ICsKPiArIHJldHVybiAw Owo+ICsKPiArZ2V0X2JvYXJkX2lkX2ZhaWw6Cj4gKyBpZiAoc2Vydl9vcHMtPmdldF9wcm9kdWN0 X2ZpeF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAgwqAg TkJMX1RBU0tfUkVTRVRfQ0FQKSkKPiArwqAgbmJsX2NvbW1vbl9yZWxlYXNlX3Rhc2soJmNvbW1v bl9kZXYtPnJlc2V0X3Rhc2sudGFzayk7Cj4gKwo+ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVj dF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKg IE5CTF9UQVNLX0NMRUFOX01BSUxCT1hfQ0FQKSkKPiArwqAgbmJsX2NvbW1vbl9yZWxlYXNlX3Rh c2soJmNvbW1vbl9kZXYtPmNsZWFuX21ieF90YXNrKTsKPiArc2V0dXBfY2hhbl9mYWlsOgo+ICsg ZGV2bV9rZnJlZShOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRlciksIGNvbW1vbl9kZXYpOwo+ICsg cmV0dXJuIC1FRkFVTFQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3ZlX2Nv bW1vbl9kZXYoc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopTkJMX0FEQVBURVJfVE9f REVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0g TkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9jb21t b24gKmNvbW1vbl9kZXYgPSBOQkxfREVWX01HVF9UT19DT01NT05fREVWKGRldl9tZ3QpOwo+ICsK PiArIGlmICghY29tbW9uX2RldikKPiArwqAgcmV0dXJuOwo+ICsKPiArIG5ibF9kZXZfcmVnaXN0 ZXJfY2hhbl90YXNrKGRldl9tZ3QsIE5CTF9DSEFOX1RZUEVfTUFJTEJPWCwgTlVMTCk7Cj4gKwo+ ICsgaWYgKHNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZfTUdUX1RPX1NFUlZf UFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIE5CTF9UQVNLX1JFU0VUX0NBUCkpCj4gK8KgIG5i bF9jb21tb25fcmVsZWFzZV90YXNrKCZjb21tb25fZGV2LT5yZXNldF90YXNrLnRhc2spOwo+ICsK PiArIGlmIChzZXJ2X29wcy0+Z2V0X3Byb2R1Y3RfZml4X2NhcChOQkxfREVWX01HVF9UT19TRVJW X1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCBOQkxfVEFTS19DTEVBTl9NQUlMQk9YX0NBUCkp Cj4gK8KgIG5ibF9jb21tb25fcmVsZWFzZV90YXNrKCZjb21tb25fZGV2LT5jbGVhbl9tYnhfdGFz ayk7Cj4gKwo+ICsgbmJsX2Rldl9yZW1vdmVfY2hhbl9xdWV1ZShkZXZfbWd0LCBOQkxfQ0hBTl9U WVBFX01BSUxCT1gpOwo+ICsKPiArIGRldm1fa2ZyZWUoTkJMX0FEQVBURVJfVE9fREVWKGFkYXB0 ZXIpLCBjb21tb25fZGV2KTsKPiArIE5CTF9ERVZfTUdUX1RPX0NPTU1PTl9ERVYoZGV2X21ndCkg PSBOVUxMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfY3RybF9kZXYoc3Ry dWN0IG5ibF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0gKnBhcmFtKQo+ ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0 ICopTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBz dHJ1Y3QgbmJsX2Rldl9jdHJsICpjdHJsX2RldjsKPiArIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5C TF9BREFQVEVSX1RPX0RFVihhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNv bW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsKPiArIGludCBpLCByZXQgPSAw Owo+ICsgdTMyIGJvYXJkX2tleTsKPiArIGNoYXIgcGFydF9udW1iZXJbNTBdID0gIiI7Cj4gKyBj aGFyIHNlcmlhbF9udW1iZXJbMTI4XSA9ICIiOwo+ICsgaW50IGJvYXJkX2lkOwo+ICsKPiArIGJv YXJkX2tleSA9IHBjaV9kb21haW5fbnIoZGV2X21ndC0+Y29tbW9uLT5wZGV2LT5idXMpIDw8IDE2 IHwKPiArIMKgIGRldl9tZ3QtPmNvbW1vbi0+cGRldi0+YnVzLT5udW1iZXI7Cj4gKyBpZiAocGFy YW0tPmNhcHMuaXNfbmljKSB7Cj4gK8KgIGJvYXJkX2lkID0KPiArIMKgIG5ibF9kZXZfYWxsb2Nf Ym9hcmRfaWQoJmJvYXJkX2lkX3RhYmxlLCBib2FyZF9rZXkpOwo+ICvCoCBpZiAoYm9hcmRfaWQg PCAwKQo+ICsgwqAgcmV0dXJuIC1FTk9TUEM7Cj4gK8KgIE5CTF9DT01NT05fVE9fQk9BUkRfSUQo Y29tbW9uKSA9wqAgYm9hcmRfaWQ7Cj4gKyB9Cj4gKwo+ICsgZGV2X2luZm8oZGV2LCAiYm9hcmRf a2V5IDB4JXggYWxsb2MgYm9hcmQgaWQgMHgleFxuIiwKPiArIMKgIGJvYXJkX2tleSwgTkJMX0NP TU1PTl9UT19CT0FSRF9JRChjb21tb24pKTsKPiArCj4gKyBjdHJsX2RldiA9IGRldm1fa3phbGxv YyhkZXYsIHNpemVvZihzdHJ1Y3QgbmJsX2Rldl9jdHJsKSwgR0ZQX0tFUk5FTCk7Cj4gKyBpZiAo IWN0cmxfZGV2KQo+ICvCoCBnb3RvIGFsbG9jX2ZhaWw7Cj4gKyBOQkxfREVWX0NUUkxfVE9fVEFT S19JTkZPKGN0cmxfZGV2KS0+YWRhcHRlciA9IGFkYXB0ZXI7Cj4gKyBOQkxfREVWX01HVF9UT19D VFJMX0RFVihkZXZfbWd0KSA9IGN0cmxfZGV2Owo+ICsKPiArIG5ibF9kZXZfcmVnaXN0ZXJfY3Ry bF9pcnEoZGV2X21ndCk7Cj4gKwo+ICsgY3RybF9kZXYtPmN0cmxfZGV2X3dxMSA9IGNyZWF0ZV9z aW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJuYmxfY3RybGRldl93cTEiKTsKPiArIGlmICghY3RybF9k ZXYtPmN0cmxfZGV2X3dxMSkgewo+ICvCoCBkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUg d29ya3F1ZXVlIG5ibF9jdHJsZGV2X3dxMVxuIik7Cj4gK8KgIGdvdG8gYWxsb2Nfd3FfZmFpbDsK PiArIH0KPiArCj4gKyByZXQgPSBzZXJ2X29wcy0+aW5pdF9jaGlwKE5CTF9ERVZfTUdUX1RPX1NF UlZfUFJJVihkZXZfbWd0KSk7Cj4gKyBpZiAocmV0KSB7Cj4gK8KgIGRldl9lcnIoZGV2LCAiY3Ry bCBkZXYgY2hpcF9pbml0IGZhaWxlZFxuIik7Cj4gK8KgIGdvdG8gY2hpcF9pbml0X2ZhaWw7Cj4g KyB9Cj4gKwo+ICsgcmV0ID0gc2Vydl9vcHMtPnN0YXJ0X21ndF9mbG93KE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSk7Cj4gKyBpZiAocmV0KSB7Cj4gK8KgIGRldl9lcnIoZGV2LCAi Y3RybCBkZXYgc3RhcnRfbWd0X2Zsb3cgZmFpbGVkXG4iKTsKPiArwqAgZ290byBtZ3RfZmxvd19m YWlsOwo+ICsgfQo+ICsKPiArIGZvciAoaSA9IDA7IGkgPCBOQkxfQ0hBTl9UWVBFX01BWDsgaSsr KSB7Cj4gK8KgIHJldCA9IG5ibF9kZXZfc2V0dXBfY2hhbl9xaW5mbyhkZXZfbWd0LCBpKTsKPiAr wqAgaWYgKHJldCkgewo+ICsgwqAgZGV2X2VycihkZXYsICJjdHJsIGRldiBzZXR1cCBjaGFuIHFp bmZvIGZhaWxlZFxuIik7Cj4gK8KgIMKgIGdvdG8gc2V0dXBfY2hhbl9xX2ZhaWw7Cj4gK8KgIH0K PiArIH0KPiArCj4gKyBuYmxfZGV2X2N0cmxfcmVnaXN0ZXJfZmxyX2NoYW5fbXNnKGRldl9tZ3Qp Owo+ICsgbmJsX2Rldl9jdHJsX3JlZ2lzdGVyX2VtcF9leHRfYWxlcnRfY2hhbl9tc2coZGV2X21n dCk7Cj4gKwo+ICsgcmV0ID0gbmJsX2Rldl9zZXR1cF9jaGFuX3F1ZXVlKGRldl9tZ3QsIE5CTF9D SEFOX1RZUEVfQURNSU5RKTsKPiArIGlmIChyZXQpIHsKPiArwqAgZGV2X2VycihkZXYsICJjdHJs IGRldiBzZXR1cCBjaGFuIHF1ZXVlIGZhaWxlZFxuIik7Cj4gKyDCoCBnb3RvIHNldHVwX2NoYW5f cV9mYWlsOwo+ICsgfQo+ICsKPiArIHJldCA9IG5ibF9kZXZfc2V0dXBfY3RybF9kZXZfdGFzayhk ZXZfbWd0KTsKPiArIGlmIChyZXQpIHsKPiArwqAgZGV2X2VycihkZXYsICJjdHJsIGRldiB0YXNr IGZhaWxlZFxuIik7Cj4gK8KgIGdvdG8gc2V0dXBfY3RybF9kZXZfdGFza19mYWlsOwo+ICsgfQo+ ICsKPiArIHNlcnZfb3BzLT5nZXRfcGFydF9udW1iZXIoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklW KGRldl9tZ3QpLCBwYXJ0X251bWJlcik7Cj4gKyBzZXJ2X29wcy0+Z2V0X3NlcmlhbF9udW1iZXIo TkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBzZXJpYWxfbnVtYmVyKTsKPiArIGRl dl9pbmZvKGRldiwgInBhcnQgbnVtYmVyOiAlcywgc2VyaWFsIG51bWJlcjogJXNcbiIsIHBhcnRf bnVtYmVyLCBzZXJpYWxfbnVtYmVyKTsKPiArCj4gKyBuYmxfZGV2X3VwZGF0ZV90ZW1wbGF0ZV9j b25maWcoZGV2X21ndCk7Cj4gKwo+ICsgcmV0dXJuIDA7Cj4gKwo+ICtzZXR1cF9jdHJsX2Rldl90 YXNrX2ZhaWw6Cj4gKyBuYmxfZGV2X3JlbW92ZV9jaGFuX3F1ZXVlKGRldl9tZ3QsIE5CTF9DSEFO X1RZUEVfQURNSU5RKTsKPiArc2V0dXBfY2hhbl9xX2ZhaWw6Cj4gKyBzZXJ2X29wcy0+c3RvcF9t Z3RfZmxvdyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCkpOwo+ICttZ3RfZmxvd19m YWlsOgo+ICsgc2Vydl9vcHMtPmRlc3Ryb3lfY2hpcChOQkxfREVWX01HVF9UT19TRVJWX1BSSVYo ZGV2X21ndCkpOwo+ICtjaGlwX2luaXRfZmFpbDoKPiArIGRlc3Ryb3lfd29ya3F1ZXVlKGN0cmxf ZGV2LT5jdHJsX2Rldl93cTEpOwo+ICthbGxvY193cV9mYWlsOgo+ICsgZGV2bV9rZnJlZShkZXYs IGN0cmxfZGV2KTsKPiArIE5CTF9ERVZfTUdUX1RPX0NUUkxfREVWKGRldl9tZ3QpID0gTlVMTDsK PiArYWxsb2NfZmFpbDoKPiArIG5ibF9kZXZfZnJlZV9ib2FyZF9pZCgmYm9hcmRfaWRfdGFibGUs IGJvYXJkX2tleSk7Cj4gKyByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxf ZGV2X3JlbW92ZV9jdHJsX2RldihzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIpCj4gK3sKPiAr IHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKilOQkxf QURBUFRFUl9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9kZXZfY3RybCAqKmN0 cmxfZGV2ID0gJk5CTF9ERVZfTUdUX1RPX0NUUkxfREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5i bF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0 KTsKPiArIHUzMiBib2FyZF9rZXk7Cj4gKwo+ICsgaWYgKCEqY3RybF9kZXYpCj4gK8KgIHJldHVy bjsKPiArCj4gKyBib2FyZF9rZXkgPSBwY2lfZG9tYWluX25yKGRldl9tZ3QtPmNvbW1vbi0+cGRl di0+YnVzKSA8PCAxNiB8Cj4gKyDCoCBkZXZfbWd0LT5jb21tb24tPnBkZXYtPmJ1cy0+bnVtYmVy Owo+ICsgbmJsX2Rldl9yZW1vdmVfY2hhbl9xdWV1ZShkZXZfbWd0LCBOQkxfQ0hBTl9UWVBFX0FE TUlOUSk7Cj4gKyBuYmxfZGV2X3JlbW92ZV9jdHJsX2Rldl90YXNrKGRldl9tZ3QpOwo+ICsKPiAr IHNlcnZfb3BzLT5zdG9wX21ndF9mbG93KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSk7Cj4gKyBzZXJ2X29wcy0+ZGVzdHJveV9jaGlwKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihk ZXZfbWd0KSk7Cj4gKwo+ICsgZGVzdHJveV93b3JrcXVldWUoKCpjdHJsX2RldiktPmN0cmxfZGV2 X3dxMSk7Cj4gKyBkZXZtX2tmcmVlKE5CTF9BREFQVEVSX1RPX0RFVihhZGFwdGVyKSwgKmN0cmxf ZGV2KTsKPiArICpjdHJsX2RldiA9IE5VTEw7Cj4gKwo+ICsgLyogSWYgaXQgaXMgbm90IG5pYywg dGhpcyBmcmVlIGZ1bmN0aW9uIHdpbGwgZG8gbm90aGluZywgc28gbm8gbmVlZCBjaGVjayAqLwo+ ICsgbmJsX2Rldl9mcmVlX2JvYXJkX2lkKCZib2FyZF9pZF90YWJsZSwgYm9hcmRfa2V5KTsKPiAr fQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X25ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNl ICpuZXRkZXYpCj4gK3sKPiArIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlciA9IE5CTF9ORVRE RVZfVE9fQURBUFRFUihuZXRkZXYpOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0g TkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9v cHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKwo+ICsg cmV0dXJuIHNlcnZfb3BzLT5uZXRkZXZfb3BlbihuZXRkZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IG5ibF9kZXZfbmV0ZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKPiArewo+ ICsgc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyID0gTkJMX05FVERFVl9UT19BREFQVEVSKG5l dGRldik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSBOQkxfQURBUFRFUl9UT19E RVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBO QkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArCj4gKyByZXR1cm4gc2Vydl9vcHMt Pm5ldGRldl9zdG9wKG5ldGRldik7Cj4gK30KPiArCj4gK3N0YXRpYyBuZXRkZXZfdHhfdCBuYmxf ZGV2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5l dGRldikKPiArewo+ICsgc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyID0gTkJMX05FVERFVl9U T19BREFQVEVSKG5ldGRldik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSBOQkxf QURBUFRFUl9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9yZXNvdXJjZV9wdF9v cHMgKnB0X29wcyA9IE5CTF9ERVZfTUdUX1RPX1JFU19QVF9PUFMoZGV2X21ndCk7Cj4gKwo+ICsg cmV0dXJuIHB0X29wcy0+c3RhcnRfeG1pdChza2IsIG5ldGRldik7Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIG5ibF9kZXZfbmV0ZGV2X2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRk ZXYsIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCj4gK3sKPiArIHN0cnVjdCBuYmxf YWRhcHRlciAqYWRhcHRlciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihuZXRkZXYpOwo+ICsgc3Ry dWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVy KTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9f U0VSVl9PUFMoZGV2X21ndCk7Cj4gKwo+ICsgc2Vydl9vcHMtPmdldF9zdGF0czY0KG5ldGRldiwg c3RhdHMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG5ibF9kZXZfbmV0ZGV2X3J4X2FkZF92aWQo c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgX19iZTE2IHByb3RvLCB1MTYgdmlkKQo+ICt7Cj4g KyBzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOQkxfTkVUREVWX1RPX0FEQVBURVIobmV0 ZGV2KTsKPiArIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RF Vl9NR1QoYWRhcHRlcik7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5C TF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsKPiArIHJldHVybiBzZXJ2X29wcy0+ cnhfYWRkX3ZpZChuZXRkZXYsIHByb3RvLCB2aWQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG5i bF9kZXZfbmV0ZGV2X3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIF9fYmUx NiBwcm90bywgdTE2IHZpZCkKPiArewo+ICsgc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyID0g TkJMX05FVERFVl9UT19BREFQVEVSKG5ldGRldik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRl dl9tZ3QgPSBOQkxfQURBUFRFUl9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9z ZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsK PiArCj4gKyByZXR1cm4gc2Vydl9vcHMtPnJ4X2tpbGxfdmlkKG5ldGRldiwgcHJvdG8sIHZpZCk7 Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29w c19sZW9uaXNfcGYgPSB7Cj4gKyAubmRvX29wZW4gPSBuYmxfZGV2X25ldGRldl9vcGVuLAo+ICsg Lm5kb19zdG9wID0gbmJsX2Rldl9uZXRkZXZfc3RvcCwKPiArIC5uZG9fc3RhcnRfeG1pdCA9IG5i bF9kZXZfc3RhcnRfeG1pdCwKPiArIC5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9h ZGRyLAo+ICsgLm5kb19nZXRfc3RhdHM2NCA9IG5ibF9kZXZfbmV0ZGV2X2dldF9zdGF0czY0LAo+ ICsgLm5kb192bGFuX3J4X2FkZF92aWQgPSBuYmxfZGV2X25ldGRldl9yeF9hZGRfdmlkLAo+ICsg Lm5kb192bGFuX3J4X2tpbGxfdmlkID0gbmJsX2Rldl9uZXRkZXZfcnhfa2lsbF92aWQsCj4gKwo+ ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3Bz X2xlb25pc192ZiA9IHsKPiArIC5uZG9fb3BlbiA9IG5ibF9kZXZfbmV0ZGV2X29wZW4sCj4gKyAu bmRvX3N0b3AgPSBuYmxfZGV2X25ldGRldl9zdG9wLAo+ICsgLm5kb19zdGFydF94bWl0ID0gbmJs X2Rldl9zdGFydF94bWl0LAo+ICsgLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2Fk ZHIsCj4gKyAubmRvX2dldF9zdGF0czY0ID0gbmJsX2Rldl9uZXRkZXZfZ2V0X3N0YXRzNjQsCj4g KyAubmRvX3ZsYW5fcnhfYWRkX3ZpZCA9IG5ibF9kZXZfbmV0ZGV2X3J4X2FkZF92aWQsCj4gKyAu bmRvX3ZsYW5fcnhfa2lsbF92aWQgPSBuYmxfZGV2X25ldGRldl9yeF9raWxsX3ZpZCwKPiArCj4g K307Cj4gKwo+ICtzdGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfbmV0b3BzX2xlb25pcyh2b2lkICpw cml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAo+ICsgwqAgwqAgwqAgwqAgwqAgc3RydWN0 IG5ibF9pbml0X3BhcmFtICpwYXJhbSkKPiArewo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKXByaXY7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vf b3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgYm9v bCBpc192ZiA9IHBhcmFtLT5jYXBzLmlzX3ZmOwo+ICsKPiArIGlmIChpc192Zikgewo+ICvCoCBu ZXRkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wc19sZW9uaXNfdmY7Cj4gKyB9IGVsc2Ugewo+ ICvCoCBuZXRkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wc19sZW9uaXNfcGY7Cj4gK8KgIHNl cnZfb3BzLT5zZXRfbmV0ZGV2X29wcyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCks Cj4gK8KgIMKgIMKgICZuZXRkZXZfb3BzX2xlb25pc19wZiwgdHJ1ZSk7Cj4gKyB9Cj4gKyByZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl9yZW1vdmVfbmV0b3BzKHN0cnVj dCBuZXRfZGV2aWNlICpuZXRkZXYpCj4gK3sKPiArIG5ldGRldi0+bmV0ZGV2X29wcyA9IE5VTEw7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfc2V0X2V0aF9tYWNfYWRkcihzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCj4gK3sKPiAr IHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9P UFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVW X01HVF9UT19DT01NT04oZGV2X21ndCk7Cj4gKyB1OCBtYWNbRVRIX0FMRU5dOwo+ICsKPiArIGV0 aGVyX2FkZHJfY29weShtYWMsIG5ldGRldi0+ZGV2X2FkZHIpOwo+ICsgc2Vydl9vcHMtPnNldF9l dGhfbWFjX2FkZHIoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLAo+ICsgwqAgwqAg wqAgbWFjLCBOQkxfQ09NTU9OX1RPX0VUSF9JRChjb21tb24pKTsKPiArfQo+ICsKPiArc3RhdGlj IGludCBuYmxfZGV2X2NmZ19uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0 IG5ibF9kZXZfbWd0ICpkZXZfbWd0LAo+ICsgwqAgwqAgwqAgwqAgc3RydWN0IG5ibF9pbml0X3Bh cmFtICpwYXJhbSwKPiArIMKgIMKgIMKgIMKgIHN0cnVjdCBuYmxfcmVnaXN0ZXJfbmV0X3Jlc3Vs dCAqcmVnaXN0ZXJfcmVzdWx0KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2 X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9k ZXZfbmV0X29wcyAqbmV0X2Rldl9vcHMgPSBOQkxfREVWX01HVF9UT19ORVRERVZfT1BTKGRldl9t Z3QpOwo+ICsgdTY0IHZsYW5fZmVhdHVyZXMgPSAwOwo+ICsgaW50IHJldCA9IDA7Cj4gKwo+ICsg aWYgKHBhcmFtLT5wY2lfdXNpbmdfZGFjKQo+ICvCoCBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElG X0ZfSElHSERNQTsKPiArIG5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7Cj4gKwo+ICsg dmxhbl9mZWF0dXJlcyA9IHJlZ2lzdGVyX3Jlc3VsdC0+dmxhbl9mZWF0dXJlcyA/IHJlZ2lzdGVy X3Jlc3VsdC0+dmxhbl9mZWF0dXJlcwo+ICsgwqAgwqAgwqAgOiByZWdpc3Rlcl9yZXN1bHQtPmZl YXR1cmVzOwo+ICsgbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBuYmxfZmVhdHVyZXNfdG9fbmV0ZGV2 X2ZlYXR1cmVzKHJlZ2lzdGVyX3Jlc3VsdC0+aHdfZmVhdHVyZXMpOwo+ICsgbmV0ZGV2LT5mZWF0 dXJlcyB8PSBuYmxfZmVhdHVyZXNfdG9fbmV0ZGV2X2ZlYXR1cmVzKHJlZ2lzdGVyX3Jlc3VsdC0+ ZmVhdHVyZXMpOwo+ICsgbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IG5ibF9mZWF0dXJlc190b19u ZXRkZXZfZmVhdHVyZXModmxhbl9mZWF0dXJlcyk7Cj4gKwo+ICsgbmV0ZGV2LT5wcml2X2ZsYWdz IHw9IElGRl9VTklDQVNUX0ZMVDsKPiArCj4gKyBTRVRfREVWX01JTl9NVFUobmV0ZGV2LCBFVEhf TUlOX01UVSk7Cj4gKyBTRVRfREVWX01BWF9NVFUobmV0ZGV2LCByZWdpc3Rlcl9yZXN1bHQtPm1h eF9tdHUpOwo+ICsgbmV0ZGV2LT5tdHUgPSBtaW5fdCh1MTYsIHJlZ2lzdGVyX3Jlc3VsdC0+bWF4 X210dSwgTkJMX0RFRkFVTFRfTVRVKTsKPiArIHNlcnZfb3BzLT5jaGFuZ2VfbXR1KG5ldGRldiwg bmV0ZGV2LT5tdHUpOwo+ICsKPiArIGlmIChpc192YWxpZF9ldGhlcl9hZGRyKHJlZ2lzdGVyX3Jl c3VsdC0+bWFjKSkKPiArwqAgZXRoX2h3X2FkZHJfc2V0KG5ldGRldiwgcmVnaXN0ZXJfcmVzdWx0 LT5tYWMpOwo+ICsgZWxzZQo+ICvCoCBldGhfaHdfYWRkcl9yYW5kb20obmV0ZGV2KTsKPiArCj4g KyBldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5wZXJtX2FkZHIsIG5ldGRldi0+ZGV2X2FkZHIpOwo+ ICsKPiArIHNlcnZfb3BzLT5zZXRfc3Bvb2ZfY2hlY2tfYWRkcihOQkxfREVWX01HVF9UT19TRVJW X1BSSVYoZGV2X21ndCksIG5ldGRldi0+cGVybV9hZGRyKTsKPiArCj4gKyBuZXRkZXYtPm5lZWRl ZF9oZWFkcm9vbSA9IHNlcnZfb3BzLT5nZXRfdHhfaGVhZHJvb20oTkJMX0RFVl9NR1RfVE9fU0VS Vl9QUklWKGRldl9tZ3QpKTsKPiArCj4gKyByZXQgPSBuZXRfZGV2X29wcy0+c2V0dXBfbmV0ZGV2 X29wcyhkZXZfbWd0LCBuZXRkZXYsIHBhcmFtKTsKPiArIGlmIChyZXQpCj4gK8KgIGdvdG8gc2V0 X29wc19mYWlsOwo+ICsKPiArIG5ibF9kZXZfc2V0X2V0aF9tYWNfYWRkcihkZXZfbWd0LCBuZXRk ZXYpOwo+ICsKPiArIHJldHVybiAwOwo+ICtzZXRfb3BzX2ZhaWw6Cj4gKyByZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3Jlc2V0X25ldGRldihzdHJ1Y3QgbmV0X2Rl dmljZSAqbmV0ZGV2KQo+ICt7Cj4gKyBuYmxfZGV2X3JlbW92ZV9uZXRvcHMobmV0ZGV2KTsKPiAr fQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X3JlZ2lzdGVyX25ldChzdHJ1Y3QgbmJsX2Rldl9t Z3QgKmRldl9tZ3QsCj4gK8KgIMKgIHN0cnVjdCBuYmxfcmVnaXN0ZXJfbmV0X3Jlc3VsdCAqcmVn aXN0ZXJfcmVzdWx0KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9uZXQgKm5ldF9kZXYgPSBOQkxf REVWX01HVF9UT19ORVRfREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAq c2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBw Y2lfZGV2ICpwZGV2ID0gTkJMX0NPTU1PTl9UT19QREVWKE5CTF9ERVZfTUdUX1RPX0NPTU1PTihk ZXZfbWd0KSk7Cj4gKyNpZmRlZiBDT05GSUdfUENJX0lPVgo+ICsgc3RydWN0IHJlc291cmNlICpy ZXM7Cj4gKyNlbmRpZgo+ICsgdTE2IHBmX2JkZjsKPiArIHU2NCBwZl9iYXJfc3RhcnQ7Cj4gKyB1 NjQgdmZfYmFyX3N0YXJ0LCB2Zl9iYXJfc2l6ZTsKPiArIHUxNiB0b3RhbF92ZnMgPSAwLCBvZmZz ZXQsIHN0cmlkZTsKPiArIGludCBwb3M7Cj4gKyB1MzIgdmFsOwo+ICsgc3RydWN0IG5ibF9yZWdp c3Rlcl9uZXRfcGFyYW0gcmVnaXN0ZXJfcGFyYW0gPSB7MH07Cj4gKyBpbnQgcmV0ID0gMDsKPiAr Cj4gKyBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmdmFs KTsKPiArIHBmX2Jhcl9zdGFydCA9ICh1NjQpKHZhbCAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01B U0spOwo+ICsgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCAr IDQsICZ2YWwpOwo+ICsgcGZfYmFyX3N0YXJ0IHw9ICgodTY0KXZhbCA8PCAzMik7Cj4gKwo+ICsg cmVnaXN0ZXJfcGFyYW0ucGZfYmFyX3N0YXJ0ID0gcGZfYmFyX3N0YXJ0Owo+ICsKPiArIHBvcyA9 IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9FWFRfQ0FQX0lEX1NSSU9WKTsKPiAr IGlmIChwb3MpIHsKPiArwqAgcGZfYmRmID0gUENJX0RFVklEKHBkZXYtPmJ1cy0+bnVtYmVyLCBw ZGV2LT5kZXZmbik7Cj4gKwo+ICvCoCBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQ Q0lfU1JJT1ZfVkZfT0ZGU0VULCAmb2Zmc2V0KTsKPiArwqAgcGNpX3JlYWRfY29uZmlnX3dvcmQo cGRldiwgcG9zICsgUENJX1NSSU9WX1ZGX1NUUklERSwgJnN0cmlkZSk7Cj4gK8KgIHBjaV9yZWFk X2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9TUklPVl9UT1RBTF9WRiwgJnRvdGFsX3Zmcyk7 Cj4gKwo+ICvCoCBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX1NSSU9WX0JB UiwgJnZhbCk7Cj4gK8KgIHZmX2Jhcl9zdGFydCA9ICh1NjQpKHZhbCAmIFBDSV9CQVNFX0FERFJF U1NfTUVNX01BU0spOwo+ICvCoCBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJ X1NSSU9WX0JBUiArIDQsICZ2YWwpOwo+ICvCoCB2Zl9iYXJfc3RhcnQgfD0gKCh1NjQpdmFsIDw8 IDMyKTsKPiArCj4gKyNpZmRlZiBDT05GSUdfUENJX0lPVgo+ICvCoCByZXMgPSAmcGRldi0+cmVz b3VyY2VbUENJX0lPVl9SRVNPVVJDRVNdOwo+ICvCoCB2Zl9iYXJfc2l6ZSA9IHJlc291cmNlX3Np emUocmVzKTsKPiArI2Vsc2UKPiArwqAgdmZfYmFyX3NpemUgPSAwOwo+ICsjZW5kaWYKPiArwqAg aWYgKHRvdGFsX3Zmcykgewo+ICsgwqAgcmVnaXN0ZXJfcGFyYW0ucGZfYmRmID0gcGZfYmRmOwo+ ICsgwqAgcmVnaXN0ZXJfcGFyYW0udmZfYmFyX3N0YXJ0ID0gdmZfYmFyX3N0YXJ0Owo+ICsgwqAg cmVnaXN0ZXJfcGFyYW0udmZfYmFyX3NpemUgPSB2Zl9iYXJfc2l6ZTsKPiArIMKgIHJlZ2lzdGVy X3BhcmFtLnRvdGFsX3ZmcyA9IHRvdGFsX3ZmczsKPiArIMKgIHJlZ2lzdGVyX3BhcmFtLm9mZnNl dCA9IG9mZnNldDsKPiArIMKgIHJlZ2lzdGVyX3BhcmFtLnN0cmlkZSA9IHN0cmlkZTsKPiArwqAg fQo+ICsgfQo+ICsKPiArIG5ldF9kZXYtPnRvdGFsX3ZmcyA9IHRvdGFsX3ZmczsKPiArCj4gKyBy ZXQgPSBzZXJ2X29wcy0+cmVnaXN0ZXJfbmV0KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZf bWd0KSwKPiArIMKgIMKgIMKgIMKgICZyZWdpc3Rlcl9wYXJhbSwgcmVnaXN0ZXJfcmVzdWx0KTsK PiArCj4gKyBpZiAoIXJlZ2lzdGVyX3Jlc3VsdC0+dHhfcXVldWVfbnVtIHx8ICFyZWdpc3Rlcl9y ZXN1bHQtPnJ4X3F1ZXVlX251bSkKPiArwqAgcmV0dXJuIC1FSU87Cj4gKwo+ICsgcmV0dXJuIHJl dDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl91bnJlZ2lzdGVyX25ldChzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNl cnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgZGV2 aWNlICpkZXYgPSBOQkxfREVWX01HVF9UT19ERVYoZGV2X21ndCk7Cj4gKyBpbnQgcmV0Owo+ICsK PiArIHJldCA9IHNlcnZfb3BzLT51bnJlZ2lzdGVyX25ldChOQkxfREVWX01HVF9UT19TRVJWX1BS SVYoZGV2X21ndCkpOwo+ICsgaWYgKHJldCkKPiArwqAgZGV2X2VycihkZXYsICJ1bnJlZ2lzdGVy IG5ldCBmYWlsZWRcbiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTE2IG5ibF9kZXZfdnNpX2FsbG9j X3F1ZXVlKHN0cnVjdCBuYmxfZGV2X25ldCAqbmV0X2RldiwgdTE2IHF1ZXVlX251bSkKPiArewo+ ICsgc3RydWN0IG5ibF9kZXZfdnNpX2NvbnRyb2xsZXIgKnZzaV9jdHJsID0gJm5ldF9kZXYtPnZz aV9jdHJsOwo+ICsgdTE2IHF1ZXVlX29mZnNldCA9IDA7Cj4gKwo+ICsgaWYgKHZzaV9jdHJsLT5x dWV1ZV9mcmVlX29mZnNldCArIHF1ZXVlX251bSA+IG5ldF9kZXYtPnRvdGFsX3F1ZXVlX251bSkK PiArwqAgcmV0dXJuIC1FTk9TUEM7Cj4gKwo+ICsgcXVldWVfb2Zmc2V0ID0gdnNpX2N0cmwtPnF1 ZXVlX2ZyZWVfb2Zmc2V0Owo+ICsgdnNpX2N0cmwtPnF1ZXVlX2ZyZWVfb2Zmc2V0ICs9IHF1ZXVl X251bTsKPiArCj4gKyByZXR1cm4gcXVldWVfb2Zmc2V0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IG5ibF9kZXZfdnNpX2NvbW1vbl9zZXR1cChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0 cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0sCj4gK8KgIMKgIMKgIMKgIHN0cnVjdCBuYmxfZGV2 X3ZzaSAqdnNpKQo+ICt7Cj4gKyBpbnQgcmV0ID0gMDsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9v cHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBzdHJ1 Y3QgbmJsX3ZzaV9wYXJhbSB2c2lfcGFyYW0gPSB7MH07Cj4gKwo+ICsgdnNpLT5xdWV1ZV9vZmZz ZXQgPSBuYmxfZGV2X3ZzaV9hbGxvY19xdWV1ZShOQkxfREVWX01HVF9UT19ORVRfREVWKGRldl9t Z3QpLAo+ICvCoCDCoCDCoCDCoCDCoCB2c2ktPnF1ZXVlX251bSk7Cj4gKyB2c2lfcGFyYW0uaW5k ZXggPSB2c2ktPmluZGV4Owo+ICsgdnNpX3BhcmFtLnZzaV9pZCA9IHZzaS0+dnNpX2lkOwo+ICsg dnNpX3BhcmFtLnF1ZXVlX29mZnNldCA9IHZzaS0+cXVldWVfb2Zmc2V0Owo+ICsgdnNpX3BhcmFt LnF1ZXVlX251bSA9IHZzaS0+cXVldWVfbnVtOwo+ICsKPiArIC8qIFRlbGwgc2VydiAmIHJlcyBs YXllciB0aGUgbWFwcGluZyBmcm9tIHZzaSB0byBxdWV1ZV9pZCAqLwo+ICsgcmV0ID0gc2Vydl9v cHMtPnJlZ2lzdGVyX3ZzaV9pbmZvKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwg JnZzaV9wYXJhbSk7Cj4gKyByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxf ZGV2X3ZzaV9jb21tb25fcmVtb3ZlKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0 IG5ibF9kZXZfdnNpICp2c2kpCj4gK3sKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X3Zz aV9jb21tb25fc3RhcnQoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCBzdHJ1Y3QgbmV0X2Rl dmljZSAqbmV0ZGV2LAo+ICvCoCDCoCDCoCDCoCBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSkKPiAr ewo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19T RVJWX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5CTF9ERVZfTUdUX1RP X0RFVihkZXZfbWd0KTsKPiArIGludCByZXQ7Cj4gKwo+ICsgdnNpLT5uYXBpX25ldGRldiA9IG5l dGRldjsKPiArCj4gKyByZXQgPSBzZXJ2X29wcy0+c2V0dXBfcTJ2c2koTkJMX0RFVl9NR1RfVE9f U0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPnZzaV9pZCk7Cj4gKyBpZiAocmV0KSB7Cj4gK8KgIGRl dl9lcnIoZGV2LCAiU2V0dXAgcTJ2c2kgZmFpbGVkXG4iKTsKPiArwqAgZ290byBzZXRfcTJ2c2lf ZmFpbDsKPiArIH0KPiArCj4gKyByZXQgPSBzZXJ2X29wcy0+c2V0dXBfcnNzKE5CTF9ERVZfTUdU X1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgdnNpLT52c2lfaWQpOwo+ICsgaWYgKHJldCkgewo+ICvC oCBkZXZfZXJyKGRldiwgIlNldHVwIHJzcyBmYWlsZWRcbiIpOwo+ICvCoCBnb3RvIHNldF9yc3Nf ZmFpbDsKPiArIH0KPiArCj4gKyByZXQgPSBzZXJ2X29wcy0+c2V0dXBfcnNzX2luZGlyKE5CTF9E RVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgdnNpLT52c2lfaWQpOwo+ICsgaWYgKHJldCkg ewo+ICvCoCBkZXZfZXJyKGRldiwgIlNldHVwIHJzcyBpbmRpciBmYWlsZWRcbiIpOwo+ICvCoCBn b3RvIHNldHVwX3Jzc19pbmRpcl9mYWlsOwo+ICsgfQo+ICsKPiArIGlmICh2c2ktPnVzZV9pbmRl cGVuZF9pcnEpIHsKPiArwqAgcmV0ID0gc2Vydl9vcHMtPmVuYWJsZV9uYXBpcyhOQkxfREVWX01H VF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHZzaS0+aW5kZXgpOwo+ICvCoCBpZiAocmV0KSB7Cj4g KyDCoCBkZXZfZXJyKGRldiwgIkVuYWJsZSBuYXBpcyBmYWlsZWRcbiIpOwo+ICsgwqAgZ290byBl bmFibGVfbmFwaV9mYWlsOwo+ICvCoCB9Cj4gKyB9Cj4gKwo+ICsgcmV0ID0gc2Vydl9vcHMtPmlu aXRfdHhfcmF0ZShOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHZzaS0+dnNpX2lk KTsKPiArIGlmIChyZXQpIHsKPiArwqAgZGV2X2VycihkZXYsICJpbml0IHR4X3JhdGUgZmFpbGVk XG4iKTsKPiArwqAgZ290byBpbml0X3R4X3JhdGVfZmFpbDsKPiArIH0KPiArCj4gKyByZXR1cm4g MDsKPiArCj4gK2luaXRfdHhfcmF0ZV9mYWlsOgo+ICsgc2Vydl9vcHMtPmRpc2FibGVfbmFwaXMo TkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPmluZGV4KTsKPiArZW5hYmxl X25hcGlfZmFpbDoKPiArc2V0dXBfcnNzX2luZGlyX2ZhaWw6Cj4gKyBzZXJ2X29wcy0+cmVtb3Zl X3JzcyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHZzaS0+dnNpX2lkKTsKPiAr c2V0X3Jzc19mYWlsOgo+ICsgc2Vydl9vcHMtPnJlbW92ZV9xMnZzaShOQkxfREVWX01HVF9UT19T RVJWX1BSSVYoZGV2X21ndCksIHZzaS0+dnNpX2lkKTsKPiArc2V0X3EydnNpX2ZhaWw6Cj4gKyBy ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV9jb21tb25fc3Rv cChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuYmxfZGV2X3ZzaSAqdnNpKQo+ ICt7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RP X1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsKPiArIGlmICh2c2ktPnVzZV9pbmRlcGVuZF9pcnEpCj4g K8KgIHNlcnZfb3BzLT5kaXNhYmxlX25hcGlzKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZf bWd0KSwgdnNpLT5pbmRleCk7Cj4gKyBzZXJ2X29wcy0+cmVtb3ZlX3JzcyhOQkxfREVWX01HVF9U T19TRVJWX1BSSVYoZGV2X21ndCksIHZzaS0+dnNpX2lkKTsKPiArIHNlcnZfb3BzLT5yZW1vdmVf cTJ2c2koTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPnZzaV9pZCk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgbmJsX2Rldl92c2lfZGF0YV9yZWdpc3RlcihzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0sCj4gKyDCoCDC oCDCoCDCoCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAq Y29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9k ZXZfdnNpICp2c2kgPSAoc3RydWN0IG5ibF9kZXZfdnNpICopdnNpX2RhdGE7Cj4gKyBpbnQgcmV0 ID0gMDsKPiArCj4gKyByZXQgPSBuYmxfZGV2X3JlZ2lzdGVyX25ldChkZXZfbWd0LCAmdnNpLT5y ZWdpc3Rlcl9yZXN1bHQpOwo+ICsgaWYgKHJldCkKPiArwqAgcmV0dXJuIHJldDsKPiArCj4gKyB2 c2ktPnF1ZXVlX251bSA9IHZzaS0+cmVnaXN0ZXJfcmVzdWx0LnR4X3F1ZXVlX251bTsKPiArIHZz aS0+cXVldWVfc2l6ZSA9IHZzaS0+cmVnaXN0ZXJfcmVzdWx0LnF1ZXVlX3NpemU7Cj4gKwo+ICsg bmJsX2RlYnVnKGNvbW1vbiwgTkJMX0RFQlVHX1ZTSSwgIkRhdGEgdnNpIHJlZ2lzdGVyLCBxdWV1 ZV9udW0gJWQsIHF1ZXVlX3NpemUgJWQiLAo+ICvCoCDCoCB2c2ktPnF1ZXVlX251bSwgdnNpLT5x dWV1ZV9zaXplKTsKPiArCj4gKyByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxf ZGV2X3ZzaV9kYXRhX3NldHVwKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0IG5i bF9pbml0X3BhcmFtICpwYXJhbSwKPiArwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiAr IHN0cnVjdCBuYmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRh Owo+ICsKPiArIHJldHVybiBuYmxfZGV2X3ZzaV9jb21tb25fc2V0dXAoZGV2X21ndCwgcGFyYW0s IHZzaSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfdnNpX2RhdGFfcmVtb3ZlKHN0 cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHN0cnVj dCBuYmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsK PiArIG5ibF9kZXZfdnNpX2NvbW1vbl9yZW1vdmUoZGV2X21ndCwgdnNpKTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBuYmxfZGV2X3ZzaV9kYXRhX3N0YXJ0KHZvaWQgKmRldl9wcml2LCBzdHJ1Y3Qg bmV0X2RldmljZSAqbmV0ZGV2LAo+ICvCoCDCoCDCoCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsg c3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKWRldl9w cml2Owo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1RfVE9f Q09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBO QkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBkZXZpY2UgKmRldiA9 IE5CTF9ERVZfTUdUX1RPX0RFVihkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X3ZzaSAqdnNp ID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsgaW50IHJldDsKPiArIHUxNiB2 aWQ7Cj4gKwo+ICsgdmlkID0gdnNpLT5yZWdpc3Rlcl9yZXN1bHQudmxhbl90Y2kgJiBWTEFOX1ZJ RF9NQVNLOwo+ICsgcmV0ID0gc2Vydl9vcHMtPnN0YXJ0X25ldF9mbG93KE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSwgbmV0ZGV2LCB2c2ktPnZzaV9pZCwgdmlkLAo+ICsgwqAgwqAg wqAgwqAgwqAgdnNpLT5yZWdpc3Rlcl9yZXN1bHQudHJ1c3RlZCk7Cj4gKyBpZiAocmV0KSB7Cj4g K8KgIGRldl9lcnIoZGV2LCAiU2V0IG5ldGRldiBmbG93IHRhYmxlIGZhaWxlZFxuIik7Cj4gK8Kg IGdvdG8gc2V0X2Zsb3dfZmFpbDsKPiArIH0KPiArCj4gKyBpZiAoIU5CTF9DT01NT05fVE9fVkZf Q0FQKGNvbW1vbikpIHsKPiArwqAgcmV0ID0gc2Vydl9vcHMtPnNldF9sbGRwX2Zsb3coTkJMX0RF Vl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPnZzaV9pZCk7Cj4gK8KgIGlmIChyZXQp IHsKPiArIMKgIGRldl9lcnIoZGV2LCAiU2V0IG5ldGRldiBsbGRwIGZsb3cgZmFpbGVkXG4iKTsK PiArIMKgIGdvdG8gc2V0X2xsZHBfZmFpbDsKPiArwqAgfQo+ICvCoCB2c2ktPmZlYXR1cmUuaGFz X2xsZHAgPSB0cnVlOwo+ICsgfQo+ICsKPiArIHJldCA9IG5ibF9kZXZfdnNpX2NvbW1vbl9zdGFy dChkZXZfbWd0LCBuZXRkZXYsIHZzaSk7Cj4gKyBpZiAocmV0KSB7Cj4gK8KgIGRldl9lcnIoZGV2 LCAiVnNpIGNvbW1vbiBzdGFydCBmYWlsZWRcbiIpOwo+ICvCoCBnb3RvIGNvbW1vbl9zdGFydF9m YWlsOwo+ICsgfQo+ICsKPiArIHJldHVybiAwOwo+ICsKPiArY29tbW9uX3N0YXJ0X2ZhaWw6Cj4g KyBpZiAoIU5CTF9DT01NT05fVE9fVkZfQ0FQKGNvbW1vbikpCj4gK8KgIHNlcnZfb3BzLT5yZW1v dmVfbGxkcF9mbG93KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgdnNpLT52c2lf aWQpOwo+ICtzZXRfbGxkcF9mYWlsOgo+ICsgc2Vydl9vcHMtPnN0b3BfbmV0X2Zsb3coTkJMX0RF Vl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPnZzaV9pZCk7Cj4gK3NldF9mbG93X2Zh aWw6Cj4gKyByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV9k YXRhX3N0b3Aodm9pZCAqZGV2X3ByaXYsIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gKyBzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopZGV2X3ByaXY7Cj4g KyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVWX01HVF9UT19DT01NT04o ZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZf TUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfdnNpICp2c2kgPSAo c3RydWN0IG5ibF9kZXZfdnNpICopdnNpX2RhdGE7Cj4gKwo+ICsgbmJsX2Rldl92c2lfY29tbW9u X3N0b3AoZGV2X21ndCwgdnNpKTsKPiArCj4gKyBpZiAoIU5CTF9DT01NT05fVE9fVkZfQ0FQKGNv bW1vbikpIHsKPiArwqAgc2Vydl9vcHMtPnJlbW92ZV9sbGRwX2Zsb3coTkJMX0RFVl9NR1RfVE9f U0VSVl9QUklWKGRldl9tZ3QpLCB2c2ktPnZzaV9pZCk7Cj4gK8KgIHZzaS0+ZmVhdHVyZS5oYXNf bGxkcCA9IGZhbHNlOwo+ICsgfQo+ICsKPiArIHNlcnZfb3BzLT5zdG9wX25ldF9mbG93KE5CTF9E RVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgdnNpLT52c2lfaWQpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IG5ibF9kZXZfdnNpX2RhdGFfbmV0ZGV2X2J1aWxkKHN0cnVjdCBuYmxfZGV2X21n dCAqZGV2X21ndCwgc3RydWN0IG5ibF9pbml0X3BhcmFtICpwYXJhbSwKPiArwqAgwqAgwqAgc3Ry dWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHN0cnVjdCBu YmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsKPiAr IHZzaS0+bmV0ZGV2ID0gbmV0ZGV2Owo+ICsgcmV0dXJuIG5ibF9kZXZfY2ZnX25ldGRldihuZXRk ZXYsIGRldl9tZ3QsIHBhcmFtLCAmdnNpLT5yZWdpc3Rlcl9yZXN1bHQpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV9kYXRhX25ldGRldl9kZXN0cm95KHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCwgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHN0cnVjdCBuYmxfZGV2X3Zz aSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsKPiArIG5ibF9kZXZf cmVzZXRfbmV0ZGV2KHZzaS0+bmV0ZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2 X3ZzaV9jdHJsX3JlZ2lzdGVyKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0IG5i bF9pbml0X3BhcmFtICpwYXJhbSwKPiArIMKgIMKgIMKgIMKgIHZvaWQgKnZzaV9kYXRhKQo+ICt7 Cj4gKyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVWX01HVF9UT19DT01N T04oZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rl dl92c2kgKil2c2lfZGF0YTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0g TkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKwo+ICsgc2Vydl9vcHMtPmdldF9y ZXBfcXVldWVfaW5mbyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDC oCDCoCDCoCAmdnNpLT5xdWV1ZV9udW0sICZ2c2ktPnF1ZXVlX3NpemUpOwo+ICsKPiArIG5ibF9k ZWJ1Zyhjb21tb24sIE5CTF9ERUJVR19WU0ksICJDdHJsIHZzaSByZWdpc3RlciwgcXVldWVfbnVt ICVkLCBxdWV1ZV9zaXplICVkIiwKPiArwqAgwqAgdnNpLT5xdWV1ZV9udW0sIHZzaS0+cXVldWVf c2l6ZSk7Cj4gKyByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X3ZzaV9j dHJsX3NldHVwKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0IG5ibF9pbml0X3Bh cmFtICpwYXJhbSwKPiArwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHN0cnVjdCBu YmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsKPiAr IHJldHVybiBuYmxfZGV2X3ZzaV9jb21tb25fc2V0dXAoZGV2X21ndCwgcGFyYW0sIHZzaSk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfdnNpX2N0cmxfcmVtb3ZlKHN0cnVjdCBuYmxf ZGV2X21ndCAqZGV2X21ndCwgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHN0cnVjdCBuYmxfZGV2 X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRhOwo+ICsKPiArIG5ibF9k ZXZfdnNpX2NvbW1vbl9yZW1vdmUoZGV2X21ndCwgdnNpKTsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBuYmxfZGV2X3ZzaV9jdHJsX3N0YXJ0KHZvaWQgKmRldl9wcml2LCBzdHJ1Y3QgbmV0X2Rldmlj ZSAqbmV0ZGV2LAo+ICvCoCDCoCDCoCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsgc3RydWN0IG5i bF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKWRldl9wcml2Owo+ICsg c3RydWN0IG5ibF9kZXZfdnNpICp2c2kgPSAoc3RydWN0IG5ibF9kZXZfdnNpICopdnNpX2RhdGE7 Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NF UlZfT1BTKGRldl9tZ3QpOwo+ICsgaW50IHJldCA9IDA7Cj4gKwo+ICsgcmV0ID0gbmJsX2Rldl92 c2lfY29tbW9uX3N0YXJ0KGRldl9tZ3QsIG5ldGRldiwgdnNpKTsKPiArIGlmIChyZXQpCj4gK8Kg IGdvdG8gc3RhcnRfZmFpbDsKPiArCj4gKyAvKiBGb3IgY3RybCB2c2ksIG9wZW4gaXQgYWZ0ZXIg Y3JlYXRlLCBmb3IgdGhhdCB3ZSBkb24ndCBoYXZlIG5kb19vcGVuIG9wcy4gKi8KPiArIHJldCA9 IHNlcnZfb3BzLT52c2lfb3BlbihOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIG5l dGRldiwKPiArIMKgIMKgIHZzaS0+aW5kZXgsIHZzaS0+cXVldWVfbnVtLCAxKTsKPiArIGlmIChy ZXQpCj4gK8KgIGdvdG8gb3Blbl9mYWlsOwo+ICsKPiArIHJldHVybiByZXQ7Cj4gKwo+ICtvcGVu X2ZhaWw6Cj4gKyBuYmxfZGV2X3ZzaV9jb21tb25fc3RvcChkZXZfbWd0LCB2c2kpOwo+ICtzdGFy dF9mYWlsOgo+ICsgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl92 c2lfY3RybF9zdG9wKHZvaWQgKmRldl9wcml2LCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsgc3Ry dWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKWRldl9wcml2 Owo+ICsgc3RydWN0IG5ibF9kZXZfdnNpICp2c2kgPSAoc3RydWN0IG5ibF9kZXZfdnNpICopdnNp X2RhdGE7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdU X1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsKPiArIHNlcnZfb3BzLT52c2lfc3RvcChOQkxfREVW X01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIHZzaS0+aW5kZXgpOwo+ICsgbmJsX2Rldl92c2lf Y29tbW9uX3N0b3AoZGV2X21ndCwgdnNpKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2 X3ZzaV9jdHJsX25ldGRldl9idWlsZChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVj dCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0sCj4gK8KgIMKgIMKgIHN0cnVjdCBuZXRfZGV2aWNlICpu ZXRkZXYsIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gKyByZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgbmJsX2Rldl92c2lfY3RybF9uZXRkZXZfZGVzdHJveShzdHJ1Y3QgbmJsX2Rldl9t Z3QgKmRldl9tZ3QsIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg bmJsX2Rldl92c2lfdXNlcl9yZWdpc3RlcihzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0 cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0sCj4gKyDCoCDCoCDCoCDCoCB2b2lkICp2c2lfZGF0 YSkKPiArewo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9NR1Rf VE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfdnNpICp2c2kgPSAoc3RydWN0 IG5ibF9kZXZfdnNpICopdnNpX2RhdGE7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2 X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsKPiArIHNlcnZfb3Bz LT5nZXRfdXNlcl9xdWV1ZV9pbmZvKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwK PiArwqAgwqAgwqAgwqAgwqAgJnZzaS0+cXVldWVfbnVtLCAmdnNpLT5xdWV1ZV9zaXplLAo+ICvC oCDCoCDCoCDCoCDCoCBOQkxfQ09NTU9OX1RPX1ZTSV9JRChjb21tb24pKTsKPiArCj4gKyBuYmxf ZGVidWcoY29tbW9uLCBOQkxfREVCVUdfVlNJLCAiVXNlciB2c2kgcmVnaXN0ZXIsIHF1ZXVlX251 bSAlZCwgcXVldWVfc2l6ZSAlZCIsCj4gK8KgIMKgIHZzaS0+cXVldWVfbnVtLCB2c2ktPnF1ZXVl X3NpemUpOwo+ICsgcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbmJsX2Rldl92c2lf dXNlcl9zZXR1cChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuYmxfaW5pdF9w YXJhbSAqcGFyYW0sCj4gK8KgIMKgIMKgIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gKyBzdHJ1Y3Qg bmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rldl92c2kgKil2c2lfZGF0YTsKPiArCj4g KyByZXR1cm4gbmJsX2Rldl92c2lfY29tbW9uX3NldHVwKGRldl9tZ3QsIHBhcmFtLCB2c2kpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV91c2VyX3JlbW92ZShzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QsIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rl dl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rldl92c2kgKil2c2lfZGF0YTsKPiArCj4gKyBuYmxf ZGV2X3ZzaV9jb21tb25fcmVtb3ZlKGRldl9tZ3QsIHZzaSk7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgbmJsX2Rldl92c2lfdXNlcl9zdGFydCh2b2lkICpkZXZfcHJpdiwgc3RydWN0IG5ldF9kZXZp Y2UgKm5ldGRldiwKPiArwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gK3sKPiArIHJldHVybiAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV91c2VyX3N0b3Aodm9pZCAqZGV2 X3ByaXYsIHZvaWQgKnZzaV9kYXRhKQo+ICt7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbmJsX2Rl dl92c2lfdXNlcl9uZXRkZXZfYnVpbGQoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LAo+ICvC oCDCoCDCoCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0gKnBhcmFtLAo+ICvCoCDCoCDCoCBzdHJ1Y3Qg bmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsgcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfdnNpX3VzZXJfbmV0ZGV2X2Rlc3Ryb3koc3Ry dWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCB2b2lkICp2c2lfZGF0YSkKPiArewo+ICsgLyogbm90 aGluZyBuZWVkIHRvIGRvICovCj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbmJsX2Rldl92c2lf dGJsIHZzaV90YmxbTkJMX1ZTSV9NQVhdID0gewo+ICsgW05CTF9WU0lfREFUQV0gPSB7Cj4gK8Kg IC52c2lfb3BzID0gewo+ICsgwqAgLnJlZ2lzdGVyX3ZzaSA9IG5ibF9kZXZfdnNpX2RhdGFfcmVn aXN0ZXIsCj4gKyDCoCAuc2V0dXAgPSBuYmxfZGV2X3ZzaV9kYXRhX3NldHVwLAo+ICsgwqAgLnJl bW92ZSA9IG5ibF9kZXZfdnNpX2RhdGFfcmVtb3ZlLAo+ICsgwqAgLnN0YXJ0ID0gbmJsX2Rldl92 c2lfZGF0YV9zdGFydCwKPiArIMKgIC5zdG9wID0gbmJsX2Rldl92c2lfZGF0YV9zdG9wLAo+ICsg wqAgLm5ldGRldl9idWlsZCA9IG5ibF9kZXZfdnNpX2RhdGFfbmV0ZGV2X2J1aWxkLAo+ICsgwqAg Lm5ldGRldl9kZXN0cm95ID0gbmJsX2Rldl92c2lfZGF0YV9uZXRkZXZfZGVzdHJveSwKPiArwqAg fSwKPiArwqAgLnZmX3N1cHBvcnQgPSB0cnVlLAo+ICvCoCAub25seV9uaWNfc3VwcG9ydCA9IGZh bHNlLAo+ICvCoCAuaW5fa2VybmVsID0gdHJ1ZSwKPiArwqAgLnVzZV9pbmRlcGVuZF9pcnEgPSB0 cnVlLAo+ICvCoCAuc3RhdGljX3F1ZXVlID0gdHJ1ZSwKPiArIH0sCj4gKyBbTkJMX1ZTSV9DVFJM XSA9IHsKPiArwqAgLnZzaV9vcHMgPSB7Cj4gKyDCoCAucmVnaXN0ZXJfdnNpID0gbmJsX2Rldl92 c2lfY3RybF9yZWdpc3RlciwKPiArIMKgIC5zZXR1cCA9IG5ibF9kZXZfdnNpX2N0cmxfc2V0dXAs Cj4gKyDCoCAucmVtb3ZlID0gbmJsX2Rldl92c2lfY3RybF9yZW1vdmUsCj4gKyDCoCAuc3RhcnQg PSBuYmxfZGV2X3ZzaV9jdHJsX3N0YXJ0LAo+ICsgwqAgLnN0b3AgPSBuYmxfZGV2X3ZzaV9jdHJs X3N0b3AsCj4gKyDCoCAubmV0ZGV2X2J1aWxkID0gbmJsX2Rldl92c2lfY3RybF9uZXRkZXZfYnVp bGQsCj4gKyDCoCAubmV0ZGV2X2Rlc3Ryb3kgPSBuYmxfZGV2X3ZzaV9jdHJsX25ldGRldl9kZXN0 cm95LAo+ICvCoCB9LAo+ICvCoCAudmZfc3VwcG9ydCA9IGZhbHNlLAo+ICvCoCAub25seV9uaWNf c3VwcG9ydCA9IHRydWUsCj4gK8KgIC5pbl9rZXJuZWwgPSB0cnVlLAo+ICvCoCAudXNlX2luZGVw ZW5kX2lycSA9IHRydWUsCj4gK8KgIC5zdGF0aWNfcXVldWUgPSB0cnVlLAo+ICsgfSwKPiArIFtO QkxfVlNJX1VTRVJdID0gewo+ICvCoCAudnNpX29wcyA9IHsKPiArIMKgIC5yZWdpc3Rlcl92c2kg PSBuYmxfZGV2X3ZzaV91c2VyX3JlZ2lzdGVyLAo+ICsgwqAgLnNldHVwID0gbmJsX2Rldl92c2lf dXNlcl9zZXR1cCwKPiArIMKgIC5yZW1vdmUgPSBuYmxfZGV2X3ZzaV91c2VyX3JlbW92ZSwKPiAr IMKgIC5zdGFydCA9IG5ibF9kZXZfdnNpX3VzZXJfc3RhcnQsCj4gKyDCoCAuc3RvcCA9IG5ibF9k ZXZfdnNpX3VzZXJfc3RvcCwKPiArIMKgIC5uZXRkZXZfYnVpbGQgPSBuYmxfZGV2X3ZzaV91c2Vy X25ldGRldl9idWlsZCwKPiArIMKgIC5uZXRkZXZfZGVzdHJveSA9IG5ibF9kZXZfdnNpX3VzZXJf bmV0ZGV2X2Rlc3Ryb3ksCj4gK8KgIH0sCj4gK8KgIC52Zl9zdXBwb3J0ID0gZmFsc2UsCj4gK8Kg IC5vbmx5X25pY19zdXBwb3J0ID0gdHJ1ZSwKPiArwqAgLmluX2tlcm5lbCA9IGZhbHNlLAo+ICvC oCAudXNlX2luZGVwZW5kX2lycSA9IGZhbHNlLAo+ICvCoCAuc3RhdGljX3F1ZXVlID0gZmFsc2Us Cj4gKyB9LAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBuYmxfZGV2X3ZzaV9idWlsZChzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0pCj4gK3sK PiArIHN0cnVjdCBuYmxfZGV2X25ldCAqbmV0X2RldiA9IE5CTF9ERVZfTUdUX1RPX05FVF9ERVYo ZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZf TUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfdnNpICp2c2kgPSBO VUxMOwo+ICsgaW50IGk7Cj4gKwo+ICsgbmV0X2Rldi0+dnNpX2N0cmwucXVldWVfbnVtID0gMDsK PiArIG5ldF9kZXYtPnZzaV9jdHJsLnF1ZXVlX2ZyZWVfb2Zmc2V0ID0gMDsKPiArCj4gKyAvKiBC dWlsZCBhbGwgdnNpLCBhbmQgYWxsb2MgdnNpX2lkIGZvciBlYWNoIG9mIHRoZW0gKi8KPiArIGZv ciAoaSA9IDA7IGkgPCBOQkxfVlNJX01BWDsgaSsrKSB7Cj4gK8KgIGlmICgocGFyYW0tPmNhcHMu aXNfdmYgJiYgIXZzaV90YmxbaV0udmZfc3VwcG9ydCkgfHwKPiArwqAgwqAgwqAgKCFwYXJhbS0+ Y2Fwcy5pc19uaWMgJiYgdnNpX3RibFtpXS5vbmx5X25pY19zdXBwb3J0KSkKPiArIMKgIGNvbnRp bnVlOwo+ICsKPiArwqAgdnNpID0gZGV2bV9remFsbG9jKE5CTF9ERVZfTUdUX1RPX0RFVihkZXZf bWd0KSwgc2l6ZW9mKCp2c2kpLCBHRlBfS0VSTkVMKTsKPiArwqAgaWYgKCF2c2kpCj4gKyDCoCBn b3RvIG1hbGxvY192c2lfZmFpbDsKPiArCj4gK8KgIHZzaS0+b3BzID0gJnZzaV90YmxbaV0udnNp X29wczsKPiArwqAgdnNpLT52c2lfaWQgPSBzZXJ2X29wcy0+Z2V0X3ZzaV9pZChOQkxfREVWX01H VF9UT19TRVJWX1BSSVYoZGV2X21ndCksIDAsIGkpOwo+ICvCoCB2c2ktPmluZGV4ID0gaTsKPiAr wqAgdnNpLT5pbl9rZXJuZWwgPSB2c2lfdGJsW2ldLmluX2tlcm5lbDsKPiArwqAgdnNpLT51c2Vf aW5kZXBlbmRfaXJxID0gdnNpX3RibFtpXS51c2VfaW5kZXBlbmRfaXJxOwo+ICvCoCB2c2ktPnN0 YXRpY19xdWV1ZSA9IHZzaV90YmxbaV0uc3RhdGljX3F1ZXVlOwo+ICvCoCBuZXRfZGV2LT52c2lf Y3RybC52c2lfbGlzdFtpXSA9IHZzaTsKPiArIH0KPiArCj4gKyByZXR1cm4gMDsKPiArCj4gK21h bGxvY192c2lfZmFpbDoKPiArIHdoaWxlICgtLWkgKyAxKSB7Cj4gK8KgIGRldm1fa2ZyZWUoTkJM X0RFVl9NR1RfVE9fREVWKGRldl9tZ3QpLCBuZXRfZGV2LT52c2lfY3RybC52c2lfbGlzdFtpXSk7 Cj4gK8KgIG5ldF9kZXYtPnZzaV9jdHJsLnZzaV9saXN0W2ldID0gTlVMTDsKPiArIH0KPiArCj4g KyByZXR1cm4gLUVOT01FTTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl92c2lfZGVz dHJveShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3sKPiArIHN0cnVjdCBuYmxfZGV2 X25ldCAqbmV0X2RldiA9IE5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2X21ndCk7Cj4gKyBpbnQg aTsKPiArCj4gKyBmb3IgKGkgPSAwOyBpIDwgTkJMX1ZTSV9NQVg7IGkrKykKPiArwqAgaWYgKG5l dF9kZXYtPnZzaV9jdHJsLnZzaV9saXN0W2ldKSB7Cj4gKyDCoCBkZXZtX2tmcmVlKE5CTF9ERVZf TUdUX1RPX0RFVihkZXZfbWd0KSwgbmV0X2Rldi0+dnNpX2N0cmwudnNpX2xpc3RbaV0pOwo+ICsg wqAgbmV0X2Rldi0+dnNpX2N0cmwudnNpX2xpc3RbaV0gPSBOVUxMOwo+ICvCoCB9Cj4gK30KPiAr Cj4gK3N0cnVjdCBuYmxfZGV2X3ZzaSAqbmJsX2Rldl92c2lfc2VsZWN0KHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCwgdTggdnNpX2luZGV4KQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9uZXQg Km5ldF9kZXYgPSBOQkxfREVWX01HVF9UT19ORVRfREVWKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5i bF9kZXZfdnNpICp2c2kgPSBOVUxMOwo+ICsgaW50IGkgPSAwOwo+ICsKPiArIGZvciAoaSA9IDA7 IGkgPCBOQkxfVlNJX01BWDsgaSsrKSB7Cj4gK8KgIHZzaSA9IG5ldF9kZXYtPnZzaV9jdHJsLnZz aV9saXN0W2ldOwo+ICvCoCBpZiAodnNpICYmIHZzaS0+aW5kZXggPT0gdnNpX2luZGV4KQo+ICsg wqAgcmV0dXJuIHZzaTsKPiArIH0KPiArCj4gKyByZXR1cm4gTlVMTDsKPiArfQo+ICsKPiArc3Rh dGljIGludCBuYmxfZGV2X2NoYW5fZ2V0X3N0X25hbWVfcmVxKHN0cnVjdCBuYmxfZGV2X21ndCAq ZGV2X21ndCkKPiArewo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RF Vl9NR1RfVE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hh bl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxf ZGV2X3N0X2RldiAqc3RfZGV2ID0gTkJMX0RFVl9NR1RfVE9fU1RfREVWKGRldl9tZ3QpOwo+ICsg c3RydWN0IG5ibF9jaGFuX3NlbmRfaW5mbyBjaGFuX3NlbmQgPSB7MH07Cj4gKwo+ICsgTkJMX0NI QU5fU0VORChjaGFuX3NlbmQsIE5CTF9DT01NT05fVE9fTUdUX1BGKGNvbW1vbiksCj4gK8KgIMKg IMKgIMKgIE5CTF9DSEFOX01TR19HRVRfU1RfTkFNRSwgTlVMTCwgMCwKPiArwqAgwqAgwqAgwqAg c3RfZGV2LT5yZWFsX3N0X25hbWUsIHNpemVvZihzdF9kZXYtPnJlYWxfc3RfbmFtZSksIDEpOwo+ ICsgcmV0dXJuIGNoYW5fb3BzLT5zZW5kX21zZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2 X21ndCksICZjaGFuX3NlbmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X2NoYW5f Z2V0X3N0X25hbWVfcmVzcCh2b2lkICpwcml2LCB1MTYgc3JjX2lkLCB1MTYgbXNnX2lkLAo+ICsg wqAgwqAgwqAgdm9pZCAqZGF0YSwgdTMyIGRhdGFfbGVuKQo+ICt7Cj4gKyBzdHJ1Y3QgbmJsX2Rl dl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopcHJpdjsKPiArIHN0cnVjdCBu YmxfZGV2X3N0X2RldiAqc3RfZGV2ID0gTkJMX0RFVl9NR1RfVE9fU1RfREVWKGRldl9tZ3QpOwo+ ICsgc3RydWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFO X09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBkZXZpY2UgKmRldiA9IE5CTF9DT01NT05fVE9fREVW KGRldl9tZ3QtPmNvbW1vbik7Cj4gKyBzdHJ1Y3QgbmJsX2NoYW5fYWNrX2luZm8gY2hhbl9hY2s7 Cj4gKyBpbnQgcmV0Owo+ICsKPiArIE5CTF9DSEFOX0FDSyhjaGFuX2Fjaywgc3JjX2lkLCBOQkxf Q0hBTl9NU0dfR0VUX1NUX05BTUUsIG1zZ19pZCwKPiArIMKgIMKgIMKgIDAsIHN0X2Rldi0+c3Rf bmFtZSwgc2l6ZW9mKHN0X2Rldi0+c3RfbmFtZSkpOwo+ICsgcmV0ID0gY2hhbl9vcHMtPnNlbmRf YWNrKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgJmNoYW5fYWNrKTsKPiArIGlm IChyZXQpCj4gK8KgIGRldl9lcnIoZGV2LCAiY2hhbm5lbCBzZW5kIGFjayBmYWlsZWQgd2l0aCBy ZXQ6ICVkLCBtc2dfdHlwZTogJWRcbiIsCj4gKyDCoCByZXQsIE5CTF9DSEFOX01TR19HRVRfU1Rf TkFNRSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfcmVnaXN0ZXJfZ2V0X3N0X25h bWVfY2hhbl9tc2coc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICt7Cj4gKyBzdHJ1Y3Qg bmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9t Z3QpOwo+ICsgc3RydWN0IG5ibF9kZXZfc3RfZGV2ICpzdF9kZXYgPSBOQkxfREVWX01HVF9UT19T VF9ERVYoZGV2X21ndCk7Cj4gKwo+ICsgaWYgKCFjaGFuX29wcy0+Y2hlY2tfcXVldWVfZXhpc3Qo TkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLAo+ICvCoCDCoCDCoCBOQkxfQ0hBTl9U WVBFX01BSUxCT1gpKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgY2hhbl9vcHMtPnJlZ2lzdGVyX21z ZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksCj4gK8KgIMKgIMKgIMKgIMKgIE5C TF9DSEFOX01TR19HRVRfU1RfTkFNRSwKPiArwqAgwqAgwqAgwqAgwqAgbmJsX2Rldl9jaGFuX2dl dF9zdF9uYW1lX3Jlc3AsIGRldl9tZ3QpOwo+ICsgc3RfZGV2LT5yZXNwX21zZ19yZWdpc3RlcmVk ID0gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rldl91bnJlZ2lzdGVyX2dldF9z dF9uYW1lX2NoYW5fbXNnKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiArewo+ICsgc3Ry dWN0IG5ibF9jaGFubmVsX29wcyAqY2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhk ZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfZGV2X3N0X2RldiAqc3RfZGV2ID0gTkJMX0RFVl9NR1Rf VE9fU1RfREVWKGRldl9tZ3QpOwo+ICsKPiArIGlmICghc3RfZGV2LT5yZXNwX21zZ19yZWdpc3Rl cmVkKQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgY2hhbl9vcHMtPnVucmVnaXN0ZXJfbXNnKE5CTF9E RVZfTUdUX1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgTkJMX0NIQU5fTVNHX0dFVF9TVF9OQU1FKTsK PiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBuYmxfZGV2X25ldF9vcHMgbmV0ZGV2X29wc1tOQkxf UFJPRFVDVF9NQVhdID0gewo+ICsgewo+ICvCoCAuc2V0dXBfbmV0ZGV2X29wcyA9IG5ibF9kZXZf c2V0dXBfbmV0b3BzX2xlb25pcywKPiArIH0sCj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCBuYmxf ZGV0X3NldHVwX25ldF9kZXZfb3BzKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0 IG5ibF9pbml0X3BhcmFtICpwYXJhbSkKPiArewo+ICsgTkJMX0RFVl9NR1RfVE9fTkVUREVWX09Q UyhkZXZfbWd0KSA9ICZuZXRkZXZfb3BzW3BhcmFtLT5wcm9kdWN0X3R5cGVdOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfbmV0X2RldihzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFk YXB0ZXIsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0pCj4gK3sKPiArIHN0cnVjdCBuYmxf ZGV2X21ndCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj4gKyBz dHJ1Y3QgbmJsX2Rldl9uZXQgKipuZXRfZGV2ID0gJk5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2 X21ndCk7Cj4gKyBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRl cik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaTsKPiArIGludCBpLCByZXQgPSAwOwo+ICsg dTE2IHRvdGFsX3F1ZXVlX251bSA9IDAsIGtlcm5lbF9xdWV1ZV9udW0gPSAwLCB1c2VyX3F1ZXVl X251bSA9IDA7Cj4gKyB1MTYgZHluYW1pY19xdWV1ZV9tYXggPSAwLCBpcnFfcXVldWVfbnVtID0g MDsKPiArCj4gKyAqbmV0X2RldiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbmJs X2Rldl9uZXQpLCBHRlBfS0VSTkVMKTsKPiArIGlmICghKm5ldF9kZXYpCj4gK8KgIHJldHVybiAt RU5PTUVNOwo+ICsKPiArIHJldCA9IG5ibF9kZXZfdnNpX2J1aWxkKGRldl9tZ3QsIHBhcmFtKTsK PiArIGlmIChyZXQpCj4gK8KgIGdvdG8gdnNpX2J1aWxkX2ZhaWw7Cj4gKwo+ICsgZm9yIChpID0g MDsgaSA8IE5CTF9WU0lfTUFYOyBpKyspIHsKPiArwqAgdnNpID0gKCpuZXRfZGV2KS0+dnNpX2N0 cmwudnNpX2xpc3RbaV07Cj4gKwo+ICvCoCBpZiAoIXZzaSkKPiArIMKgIGNvbnRpbnVlOwo+ICsK PiArwqAgcmV0ID0gdnNpLT5vcHMtPnJlZ2lzdGVyX3ZzaShkZXZfbWd0LCBwYXJhbSwgdnNpKTsK PiArwqAgaWYgKHJldCkgewo+ICsgwqAgZGV2X2VycihOQkxfREVWX01HVF9UT19ERVYoZGV2X21n dCksICJWc2kgJWQgcmVnaXN0ZXIgZmFpbGVkIiwgdnNpLT5pbmRleCk7Cj4gKyDCoCBnb3RvIHZz aV9yZWdpc3Rlcl9mYWlsOwo+ICvCoCB9Cj4gKwo+ICvCoCBpZiAodnNpLT5zdGF0aWNfcXVldWUp IHsKPiArIMKgIHRvdGFsX3F1ZXVlX251bSArPSB2c2ktPnF1ZXVlX251bTsKPiArwqAgfSBlbHNl IHsKPiArIMKgIGlmIChkeW5hbWljX3F1ZXVlX21heCA8IHZzaS0+cXVldWVfbnVtKQo+ICvCoCDC oCBkeW5hbWljX3F1ZXVlX21heCA9IHZzaS0+cXVldWVfbnVtOwo+ICvCoCB9Cj4gKwo+ICvCoCBp ZiAodnNpLT51c2VfaW5kZXBlbmRfaXJxKQo+ICsgwqAgaXJxX3F1ZXVlX251bSArPSB2c2ktPnF1 ZXVlX251bTsKPiArCj4gK8KgIGlmICh2c2ktPmluX2tlcm5lbCkKPiArIMKgIGtlcm5lbF9xdWV1 ZV9udW0gKz0gdnNpLT5xdWV1ZV9udW07Cj4gK8KgIGVsc2UKPiArIMKgIHVzZXJfcXVldWVfbnVt ICs9IHZzaS0+cXVldWVfbnVtOwo+ICsgfQo+ICsKPiArIC8qIGFsbCB2c2kncyBkeW5hbWljIG9u bHkgc3VwcG9ydCBlbmFibGUgdXNlIG9uZSBhdCB0aGUgc2FtZSB0aW1lLiAqLwo+ICsgdG90YWxf cXVldWVfbnVtICs9IGR5bmFtaWNfcXVldWVfbWF4Owo+ICsKPiArIC8qIHRoZSB0b3RhbCBxdWV1 ZSBzZXQgbXVzdCBiZWZvcmUgdnNpIHN0ZXB1cCAqLwo+ICsgKCpuZXRfZGV2KS0+dG90YWxfcXVl dWVfbnVtID0gdG90YWxfcXVldWVfbnVtOwo+ICsgKCpuZXRfZGV2KS0+a2VybmVsX3F1ZXVlX251 bSA9IGtlcm5lbF9xdWV1ZV9udW07Cj4gKyAoKm5ldF9kZXYpLT51c2VyX3F1ZXVlX251bSA9IHVz ZXJfcXVldWVfbnVtOwo+ICsKPiArIGZvciAoaSA9IDA7IGkgPCBOQkxfVlNJX01BWDsgaSsrKSB7 Cj4gK8KgIHZzaSA9ICgqbmV0X2RldiktPnZzaV9jdHJsLnZzaV9saXN0W2ldOwo+ICsKPiArwqAg aWYgKCF2c2kpCj4gKyDCoCBjb250aW51ZTsKPiArCj4gK8KgIGlmICghdnNpLT5pbl9rZXJuZWwp Cj4gKyDCoCBjb250aW51ZTsKPiArCj4gK8KgIHJldCA9IHZzaS0+b3BzLT5zZXR1cChkZXZfbWd0 LCBwYXJhbSwgdnNpKTsKPiArwqAgaWYgKHJldCkgewo+ICsgwqAgZGV2X2VycihOQkxfREVWX01H VF9UT19ERVYoZGV2X21ndCksICJWc2kgJWQgc2V0dXAgZmFpbGVkIiwgdnNpLT5pbmRleCk7Cj4g KyDCoCBnb3RvIHZzaV9zZXR1cF9mYWlsOwo+ICvCoCB9Cj4gKyB9Cj4gKwo+ICsgbmJsX2Rldl9y ZWdpc3Rlcl9uZXRfaXJxKGRldl9tZ3QsIGlycV9xdWV1ZV9udW0pOwo+ICsKPiArIG5ibF9kZXRf c2V0dXBfbmV0X2Rldl9vcHMoZGV2X21ndCwgcGFyYW0pOwo+ICsKPiArIHJldHVybiAwOwo+ICsK PiArdnNpX3NldHVwX2ZhaWw6Cj4gK3ZzaV9yZWdpc3Rlcl9mYWlsOgo+ICsgbmJsX2Rldl92c2lf ZGVzdHJveShkZXZfbWd0KTsKPiArdnNpX2J1aWxkX2ZhaWw6Cj4gKyBkZXZtX2tmcmVlKGRldiwg Km5ldF9kZXYpOwo+ICsgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbmJsX2Rl dl9yZW1vdmVfbmV0X2RldihzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIpCj4gK3sKPiArIHN0 cnVjdCBkZXZpY2UgKmRldiA9IE5CTF9BREFQVEVSX1RPX0RFVihhZGFwdGVyKTsKPiArIHN0cnVj dCBuYmxfZGV2X21ndCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7 Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9uZXQgKipuZXRfZGV2ID0gJk5CTF9ERVZfTUdUX1RPX05FVF9E RVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaTsKPiArIGludCBpID0gMDsK PiArCj4gKyBpZiAoISpuZXRfZGV2KQo+ICvCoCByZXR1cm47Cj4gKwo+ICsgZm9yIChpID0gMDsg aSA8IE5CTF9WU0lfTUFYOyBpKyspIHsKPiArwqAgdnNpID0gKCpuZXRfZGV2KS0+dnNpX2N0cmwu dnNpX2xpc3RbaV07Cj4gKwo+ICvCoCBpZiAoIXZzaSkKPiArIMKgIGNvbnRpbnVlOwo+ICsKPiAr wqAgdnNpLT5vcHMtPnJlbW92ZShkZXZfbWd0LCB2c2kpOwo+ICsgfQo+ICsgbmJsX2Rldl92c2lf ZGVzdHJveShkZXZfbWd0KTsKPsKgIAo+IC19Owo+ICsgbmJsX2Rldl91bnJlZ2lzdGVyX25ldChk ZXZfbWd0KTsKPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfc2V0dXBfbmV0b3BzX2xlb25pcyh2 b2lkICpwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAo+IC0gwqAgwqAgwqAgwqAgwqAg c3RydWN0IG5ibF9pbml0X3BhcmFtICpwYXJhbSkKPiArIGRldm1fa2ZyZWUoZGV2LCAqbmV0X2Rl dik7Cj4gKyAqbmV0X2RldiA9IE5VTEw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbmJsX2Rldl9z ZXR1cF9zdF9kZXYoc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbmJsX2luaXRf cGFyYW0gKnBhcmFtKQo+wqAgewo+IC0gc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0 cnVjdCBuYmxfZGV2X21ndCAqKXByaXY7Cj4gKyBpbnQgcmV0Owo+ICsgc3RydWN0IG5ibF9kZXZf bWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKU5CTF9BREFQVEVSX1RPX0RFVl9N R1QoYWRhcHRlcik7Cj4gKyBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfQURBUFRFUl9UT19ERVYo YWRhcHRlcik7Cj4gwqAgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVW X01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiAtIGJvb2wgaXNfdmYgPSBwYXJhbS0+Y2Fwcy5p c192ZjsKPiArIHN0cnVjdCBuYmxfZGV2X3N0X2RldiAqc3RfZGV2Owo+wqAgCj4gLSBpZiAoaXNf dmYpIHsKPiAtwqAgbmV0ZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHNfbGVvbmlzX3ZmOwo+ ICsgLyogdW5pZnkgcmVzdG9vbCdzIGNoYXJkZXYgZm9yIGxlb25pcy9kcmFjby9ybmljNDAwLiBh bGwgcGYgY3JlYXRlIGNoYXJkZXYgKi8KPiArIGlmICghc2Vydl9vcHMtPmdldF9wcm9kdWN0X2Zp eF9jYXAoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBOQkxfUkVTVE9PTF9DQVAp KQo+ICvCoCByZXR1cm4gMDsKPiArCj4gKyBzdF9kZXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXpl b2Yoc3RydWN0IG5ibF9kZXZfc3RfZGV2KSwgR0ZQX0tFUk5FTCk7Cj4gKyBpZiAoIXN0X2RldikK PiArwqAgcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsgTkJMX0RFVl9NR1RfVE9fU1RfREVWKGRldl9t Z3QpID0gc3RfZGV2Owo+ICsgcmV0ID0gc2Vydl9vcHMtPnNldHVwX3N0KE5CTF9ERVZfTUdUX1RP X1NFUlZfUFJJVihkZXZfbWd0KSwKPiArwqAgwqAgwqAgbmJsX2dldF9zdF90YWJsZSgpLCBzdF9k ZXYtPnN0X25hbWUpOwo+ICsgaWYgKHJldCkgewo+ICvCoCBkZXZfZXJyKGRldiwgImNyZWF0ZSBy ZXNvdXJjZSBjaGFyIGRldiBmYWlsZWRcbiIpOwo+ICvCoCBnb3RvIGFsbG9jX2NoYXJkZXZfZmFp bGVkOwo+ICsgfQo+ICsKPiArIGlmIChwYXJhbS0+Y2Fwcy5oYXNfY3RybCkgewo+ICvCoCBuYmxf ZGV2X3JlZ2lzdGVyX2dldF9zdF9uYW1lX2NoYW5fbXNnKGRldl9tZ3QpOwo+IMKgIH0gZWxzZSB7 Cj4gLcKgIG5ldGRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzX2xlb25pc19wZjsKPiAtwqAg c2Vydl9vcHMtPnNldF9uZXRkZXZfb3BzKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0 KSwKPiAtwqAgwqAgwqAgJm5ldGRldl9vcHNfbGVvbmlzX3BmLCB0cnVlKTsKPiArwqAgcmV0ID0g bmJsX2Rldl9jaGFuX2dldF9zdF9uYW1lX3JlcShkZXZfbWd0KTsKPiArwqAgaWYgKCFyZXQpCj4g KyDCoCBzZXJ2X29wcy0+cmVnaXN0ZXJfcmVhbF9zdF9uYW1lKE5CTF9ERVZfTUdUX1RPX1NFUlZf UFJJVihkZXZfbWd0KSwKPiArIMKgIMKgIMKgIHN0X2Rldi0+cmVhbF9zdF9uYW1lKTsKPiArwqAg ZWxzZQo+ICsgwqAgZGV2X2VycihkZXYsICJnZXQgcmVhbCByZXNvdXJjZSBjaGFyIGRldiBmYWls ZWRcbiIpOwo+IMKgIH0KPiArCj4gwqAgcmV0dXJuIDA7Cj4gK2FsbG9jX2NoYXJkZXZfZmFpbGVk Ogo+ICsgZGV2bV9rZnJlZShOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRlciksIHN0X2Rldik7Cj4g KyBOQkxfREVWX01HVF9UT19TVF9ERVYoZGV2X21ndCkgPSBOVUxMOwo+ICsgcmV0dXJuIC0xOwo+ wqAgfQo+wqAgCj4gLXN0YXRpYyBpbnQgbmJsX2Rldl9yZWdpc3Rlcl9uZXQoc3RydWN0IG5ibF9k ZXZfbWd0ICpkZXZfbWd0LAo+IC3CoCDCoCBzdHJ1Y3QgbmJsX3JlZ2lzdGVyX25ldF9yZXN1bHQg KnJlZ2lzdGVyX3Jlc3VsdCkKPiArc3RhdGljIHZvaWQgbmJsX2Rldl9yZW1vdmVfc3RfZGV2KHN0 cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlcikKPsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2X25ldCAq bmV0X2RldiA9IE5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJs X2Rldl9tZ3QgKmRldl9tZ3QgPSAoc3RydWN0IG5ibF9kZXZfbWd0ICopTkJMX0FEQVBURVJfVE9f REVWX01HVChhZGFwdGVyKTsKPiDCoCBzdHJ1Y3QgbmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9 IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9tZ3QpOwo+IC0gc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSBOQkxfQ09NTU9OX1RPX1BERVYoTkJMX0RFVl9NR1RfVE9fQ09NTU9OKGRldl9tZ3QpKTsK PiAtI2lmZGVmIENPTkZJR19QQ0lfSU9WCj4gLSBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiAtI2Vu ZGlmCj4gLSB1MTYgcGZfYmRmOwo+IC0gdTY0IHBmX2Jhcl9zdGFydDsKPiAtIHU2NCB2Zl9iYXJf c3RhcnQsIHZmX2Jhcl9zaXplOwo+IC0gdTE2IHRvdGFsX3ZmcyA9IDAsIG9mZnNldCwgc3RyaWRl Owo+IC0gaW50IHBvczsKPiAtIHUzMiB2YWw7Cj4gLSBzdHJ1Y3QgbmJsX3JlZ2lzdGVyX25ldF9w YXJhbSByZWdpc3Rlcl9wYXJhbSA9IHswfTsKPiAtIGludCByZXQgPSAwOwo+IC0KPiAtIHBjaV9y ZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZ2YWwpOwo+IC0gcGZf YmFyX3N0YXJ0ID0gKHU2NCkodmFsICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7Cj4gLSBw Y2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgNCwgJnZhbCk7 Cj4gLSBwZl9iYXJfc3RhcnQgfD0gKCh1NjQpdmFsIDw8IDMyKTsKPiAtCj4gLSByZWdpc3Rlcl9w YXJhbS5wZl9iYXJfc3RhcnQgPSBwZl9iYXJfc3RhcnQ7Cj4gLQo+IC0gcG9zID0gcGNpX2ZpbmRf ZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX0VYVF9DQVBfSURfU1JJT1YpOwo+IC0gaWYgKHBvcykg ewo+IC3CoCBwZl9iZGYgPSBQQ0lfREVWSUQocGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZu KTsKPiAtCj4gLcKgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9TUklPVl9W Rl9PRkZTRVQsICZvZmZzZXQpOwo+IC3CoCBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3Mg KyBQQ0lfU1JJT1ZfVkZfU1RSSURFLCAmc3RyaWRlKTsKPiAtwqAgcGNpX3JlYWRfY29uZmlnX3dv cmQocGRldiwgcG9zICsgUENJX1NSSU9WX1RPVEFMX1ZGLCAmdG90YWxfdmZzKTsKPiAtCj4gLcKg IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfU1JJT1ZfQkFSLCAmdmFsKTsK PiAtwqAgdmZfYmFyX3N0YXJ0ID0gKHU2NCkodmFsICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFT Syk7Cj4gLcKgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfU1JJT1ZfQkFS ICsgNCwgJnZhbCk7Cj4gLcKgIHZmX2Jhcl9zdGFydCB8PSAoKHU2NCl2YWwgPDwgMzIpOwo+ICsg c3RydWN0IG5ibF9kZXZfc3RfZGV2ICpzdF9kZXYgPSBOQkxfREVWX01HVF9UT19TVF9ERVYoZGV2 X21ndCk7Cj7CoCAKPiAtI2lmZGVmIENPTkZJR19QQ0lfSU9WCj4gLcKgIHJlcyA9ICZwZGV2LT5y ZXNvdXJjZVtQQ0lfSU9WX1JFU09VUkNFU107Cj4gLcKgIHZmX2Jhcl9zaXplID0gcmVzb3VyY2Vf c2l6ZShyZXMpOwo+IC0jZWxzZQo+IC3CoCB2Zl9iYXJfc2l6ZSA9IDA7Cj4gLSNlbmRpZgo+IC3C oCBpZiAodG90YWxfdmZzKSB7Cj4gLSDCoCByZWdpc3Rlcl9wYXJhbS5wZl9iZGYgPSBwZl9iZGY7 Cj4gLSDCoCByZWdpc3Rlcl9wYXJhbS52Zl9iYXJfc3RhcnQgPSB2Zl9iYXJfc3RhcnQ7Cj4gLSDC oCByZWdpc3Rlcl9wYXJhbS52Zl9iYXJfc2l6ZSA9IHZmX2Jhcl9zaXplOwo+IC0gwqAgcmVnaXN0 ZXJfcGFyYW0udG90YWxfdmZzID0gdG90YWxfdmZzOwo+IC0gwqAgcmVnaXN0ZXJfcGFyYW0ub2Zm c2V0ID0gb2Zmc2V0Owo+IC0gwqAgcmVnaXN0ZXJfcGFyYW0uc3RyaWRlID0gc3RyaWRlOwo+IC3C oCB9Cj4gLSB9Cj4gKyBpZiAoIXNlcnZfb3BzLT5nZXRfcHJvZHVjdF9maXhfY2FwKE5CTF9ERVZf TUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgTkJMX1JFU1RPT0xfQ0FQKSkKPiArwqAgcmV0dXJu Owo+wqAgCj4gLSBuZXRfZGV2LT50b3RhbF92ZnMgPSB0b3RhbF92ZnM7Cj4gKyBuYmxfZGV2X3Vu cmVnaXN0ZXJfZ2V0X3N0X25hbWVfY2hhbl9tc2coZGV2X21ndCk7Cj4gKyBzZXJ2X29wcy0+cmVt b3ZlX3N0KE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgbmJsX2dldF9zdF90YWJs ZSgpKTsKPsKgIAo+IC0gcmV0ID0gc2Vydl9vcHMtPnJlZ2lzdGVyX25ldChOQkxfREVWX01HVF9U T19TRVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCDCoCAmcmVnaXN0ZXJfcGFyYW0sIHJl Z2lzdGVyX3Jlc3VsdCk7Cj4gKyBkZXZtX2tmcmVlKE5CTF9BREFQVEVSX1RPX0RFVihhZGFwdGVy KSwgc3RfZGV2KTsKPiArIE5CTF9ERVZfTUdUX1RPX1NUX0RFVihkZXZfbWd0KSA9IE5VTEw7Cj4g K30KPsKgIAo+IC0gaWYgKCFyZWdpc3Rlcl9yZXN1bHQtPnR4X3F1ZXVlX251bSB8fCAhcmVnaXN0 ZXJfcmVzdWx0LT5yeF9xdWV1ZV9udW0pCj4gLcKgIHJldHVybiAtRUlPOwo+ICtzdGF0aWMgaW50 IG5ibF9kZXZfc2V0dXBfZGV2X21ndChzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24sIHN0 cnVjdCBuYmxfZGV2X21ndCAqKmRldl9tZ3QpCj4gK3sKPiArICpkZXZfbWd0ID0gZGV2bV9remFs bG9jKE5CTF9DT01NT05fVE9fREVWKGNvbW1vbiksIHNpemVvZihzdHJ1Y3QgbmJsX2Rldl9tZ3Qp LCBHRlBfS0VSTkVMKTsKPiArIGlmICghKmRldl9tZ3QpCj4gK8KgIHJldHVybiAtRU5PTUVNOwo+ wqAgCj4gLSByZXR1cm4gcmV0Owo+ICsgTkJMX0RFVl9NR1RfVE9fQ09NTU9OKCpkZXZfbWd0KSA9 IGNvbW1vbjsKPiArIHJldHVybiAwOwo+wqAgfQo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXZf dW5yZWdpc3Rlcl9uZXQoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICtzdGF0aWMgdm9p ZCBuYmxfZGV2X3JlbW92ZV9kZXZfbWd0KHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiwg c3RydWN0IG5ibF9kZXZfbWd0ICoqZGV2X21ndCkKPsKgIHsKPiAtIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gLSBz dHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfREVWX01HVF9UT19ERVYoZGV2X21ndCk7Cj4gLSBpbnQg cmV0Owo+IC0KPiAtIHJldCA9IHNlcnZfb3BzLT51bnJlZ2lzdGVyX25ldChOQkxfREVWX01HVF9U T19TRVJWX1BSSVYoZGV2X21ndCkpOwo+IC0gaWYgKHJldCkKPiAtwqAgZGV2X2VycihkZXYsICJ1 bnJlZ2lzdGVyIG5ldCBmYWlsZWRcbiIpOwo+ICsgZGV2bV9rZnJlZShOQkxfQ09NTU9OX1RPX0RF Vihjb21tb24pLCAqZGV2X21ndCk7Cj4gKyAqZGV2X21ndCA9IE5VTEw7Cj7CoCB9Cj7CoCAKPiAt c3RhdGljIHUxNiBuYmxfZGV2X3ZzaV9hbGxvY19xdWV1ZShzdHJ1Y3QgbmJsX2Rldl9uZXQgKm5l dF9kZXYsIHUxNiBxdWV1ZV9udW0pCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfcmVtb3ZlX29wcyhz dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBuYmxfZGV2X29wc190YmwgKipkZXZfb3BzX3RibCkK PsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2X3ZzaV9jb250cm9sbGVyICp2c2lfY3RybCA9ICZuZXRf ZGV2LT52c2lfY3RybDsKPiAtIHUxNiBxdWV1ZV9vZmZzZXQgPSAwOwo+ICsgZGV2bV9rZnJlZShk ZXYsICpkZXZfb3BzX3RibCk7Cj4gKyAqZGV2X29wc190YmwgPSBOVUxMOwo+ICt9Cj7CoCAKPiAt IGlmICh2c2lfY3RybC0+cXVldWVfZnJlZV9vZmZzZXQgKyBxdWV1ZV9udW0gPiBuZXRfZGV2LT50 b3RhbF9xdWV1ZV9udW0pCj4gLcKgIHJldHVybiAtRU5PU1BDOwo+ICtzdGF0aWMgaW50IG5ibF9k ZXZfc2V0dXBfb3BzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG5ibF9kZXZfb3BzX3RibCAq KmRldl9vcHNfdGJsLAo+ICvCoCDCoCDCoCDCoCBzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIp Cj4gK3sKPiArICpkZXZfb3BzX3RibCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qg bmJsX2Rldl9vcHNfdGJsKSwgR0ZQX0tFUk5FTCk7Cj4gKyBpZiAoISpkZXZfb3BzX3RibCkKPiAr wqAgcmV0dXJuIC1FTk9NRU07Cj7CoCAKPiAtIHF1ZXVlX29mZnNldCA9IHZzaV9jdHJsLT5xdWV1 ZV9mcmVlX29mZnNldDsKPiAtIHZzaV9jdHJsLT5xdWV1ZV9mcmVlX29mZnNldCArPSBxdWV1ZV9u dW07Cj4gKyBOQkxfREVWX09QU19UQkxfVE9fT1BTKCpkZXZfb3BzX3RibCkgPSAmZGV2X29wczsK PiArIE5CTF9ERVZfT1BTX1RCTF9UT19QUklWKCpkZXZfb3BzX3RibCkgPSBhZGFwdGVyOwo+wqAg Cj4gLSByZXR1cm4gcXVldWVfb2Zmc2V0Owo+ICsgcmV0dXJuIDA7Cj7CoCB9Cj7CoCAKPiAtc3Rh dGljIGludCBuYmxfZGV2X3ZzaV9jb21tb25fc2V0dXAoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZf bWd0LCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0gKnBhcmFtLAo+IC3CoCDCoCDCoCDCoCBzdHJ1Y3Qg bmJsX2Rldl92c2kgKnZzaSkKPiAraW50IG5ibF9kZXZfaW5pdCh2b2lkICpwLCBzdHJ1Y3QgbmJs X2luaXRfcGFyYW0gKnBhcmFtKQo+wqAgewo+ICsgc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVy ID0gKHN0cnVjdCBuYmxfYWRhcHRlciAqKXA7Cj4gKyBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxf QURBUFRFUl9UT19ERVYoYWRhcHRlcik7Cj4gKyBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21t b24gPSBOQkxfQURBUFRFUl9UT19DT01NT04oYWRhcHRlcik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9t Z3QgKipkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKikmTkJMX0FEQVBURVJfVE9fREVW X01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfZGV2X29wc190YmwgKipkZXZfb3BzX3RibCA9 ICZOQkxfQURBUFRFUl9UT19ERVZfT1BTX1RCTChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2Vy dmljZV9vcHNfdGJsICpzZXJ2X29wc190YmwgPSBOQkxfQURBUFRFUl9UT19TRVJWX09QU19UQkwo YWRhcHRlcik7Cj4gKyBzdHJ1Y3QgbmJsX2NoYW5uZWxfb3BzX3RibCAqY2hhbl9vcHNfdGJsID0g TkJMX0FEQVBURVJfVE9fQ0hBTl9PUFNfVEJMKGFkYXB0ZXIpOwo+IMKgIGludCByZXQgPSAwOwo+ IC0gc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9vcHMgPSBOQkxfREVWX01HVF9UT19TRVJW X09QUyhkZXZfbWd0KTsKPiAtIHN0cnVjdCBuYmxfdnNpX3BhcmFtIHZzaV9wYXJhbSA9IHswfTsK PsKgIAo+IC0gdnNpLT5xdWV1ZV9vZmZzZXQgPSBuYmxfZGV2X3ZzaV9hbGxvY19xdWV1ZShOQkxf REVWX01HVF9UT19ORVRfREVWKGRldl9tZ3QpLAo+IC3CoCDCoCDCoCDCoCDCoCB2c2ktPnF1ZXVl X251bSk7Cj4gLSB2c2lfcGFyYW0uaW5kZXggPSB2c2ktPmluZGV4Owo+IC0gdnNpX3BhcmFtLnZz aV9pZCA9IHZzaS0+dnNpX2lkOwo+IC0gdnNpX3BhcmFtLnF1ZXVlX29mZnNldCA9IHZzaS0+cXVl dWVfb2Zmc2V0Owo+IC0gdnNpX3BhcmFtLnF1ZXVlX251bSA9IHZzaS0+cXVldWVfbnVtOwo+ICsg cmV0ID0gbmJsX2Rldl9zZXR1cF9kZXZfbWd0KGNvbW1vbiwgZGV2X21ndCk7Cj4gKyBpZiAocmV0 KQo+ICvCoCBnb3RvIHNldHVwX21ndF9mYWlsOwo+wqAgCj4gLSAvKiBUZWxsIHNlcnYgJiByZXMg bGF5ZXIgdGhlIG1hcHBpbmcgZnJvbSB2c2kgdG8gcXVldWVfaWQgKi8KPiAtIHJldCA9IHNlcnZf b3BzLT5yZWdpc3Rlcl92c2lfaW5mbyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCks ICZ2c2lfcGFyYW0pOwo+IC0gcmV0dXJuIHJldDsKPiAtfQo+ICsgTkJMX0RFVl9NR1RfVE9fU0VS Vl9PUFNfVEJMKCpkZXZfbWd0KSA9IHNlcnZfb3BzX3RibDsKPiArIE5CTF9ERVZfTUdUX1RPX0NI QU5fT1BTX1RCTCgqZGV2X21ndCkgPSBjaGFuX29wc190Ymw7Cj7CoCAKPiAtc3RhdGljIHZvaWQg bmJsX2Rldl92c2lfY29tbW9uX3JlbW92ZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0 cnVjdCBuYmxfZGV2X3ZzaSAqdnNpKQo+IC17Cj4gLX0KPiArIHJldCA9IG5ibF9kZXZfc2V0dXBf Y29tbW9uX2RldihhZGFwdGVyLCBwYXJhbSk7Cj4gKyBpZiAocmV0KQo+ICvCoCBnb3RvIHNldHVw X2NvbW1vbl9kZXZfZmFpbDsKPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfdnNpX2RhdGFfcmVn aXN0ZXIoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0g KnBhcmFtLAo+IC0gwqAgwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gLXsKPiAtIHN0cnVjdCBu YmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZfTUdUX1RPX0NPTU1PTihkZXZfbWd0KTsK PiAtIHN0cnVjdCBuYmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9k YXRhOwo+IC0gaW50IHJldCA9IDA7Cj4gKyBpZiAocGFyYW0tPmNhcHMuaGFzX2N0cmwpIHsKPiAr wqAgcmV0ID0gbmJsX2Rldl9zZXR1cF9jdHJsX2RldihhZGFwdGVyLCBwYXJhbSk7Cj4gK8KgIGlm IChyZXQpCj4gKyDCoCBnb3RvIHNldHVwX2N0cmxfZGV2X2ZhaWw7Cj4gKyB9Cj7CoCAKPiAtIHJl dCA9IG5ibF9kZXZfcmVnaXN0ZXJfbmV0KGRldl9tZ3QsICZ2c2ktPnJlZ2lzdGVyX3Jlc3VsdCk7 Cj4gKyByZXQgPSBuYmxfZGV2X3NldHVwX25ldF9kZXYoYWRhcHRlciwgcGFyYW0pOwo+IMKgIGlm IChyZXQpCj4gLcKgIHJldHVybiByZXQ7Cj4gK8KgIGdvdG8gc2V0dXBfbmV0X2Rldl9mYWlsOwo+ wqAgCj4gLSB2c2ktPnF1ZXVlX251bSA9IHZzaS0+cmVnaXN0ZXJfcmVzdWx0LnR4X3F1ZXVlX251 bTsKPiAtIHZzaS0+cXVldWVfc2l6ZSA9IHZzaS0+cmVnaXN0ZXJfcmVzdWx0LnF1ZXVlX3NpemU7 Cj4gKyByZXQgPSBuYmxfZGV2X3NldHVwX3N0X2RldihhZGFwdGVyLCBwYXJhbSk7Cj4gKyBpZiAo cmV0KQo+ICvCoCBnb3RvIHNldHVwX3N0X2Rldl9mYWlsOwo+wqAgCj4gLSBuYmxfZGVidWcoY29t bW9uLCBOQkxfREVCVUdfVlNJLCAiRGF0YSB2c2kgcmVnaXN0ZXIsIHF1ZXVlX251bSAlZCwgcXVl dWVfc2l6ZSAlZCIsCj4gLcKgIMKgIHZzaS0+cXVldWVfbnVtLCB2c2ktPnF1ZXVlX3NpemUpOwo+ ICsgcmV0ID0gbmJsX2Rldl9zZXR1cF9vcHMoZGV2LCBkZXZfb3BzX3RibCwgYWRhcHRlcik7Cj4g KyBpZiAocmV0KQo+ICvCoCBnb3RvIHNldHVwX29wc19mYWlsOwo+wqAgCj4gwqAgcmV0dXJuIDA7 Cj4gKwo+ICtzZXR1cF9vcHNfZmFpbDoKPiArIG5ibF9kZXZfcmVtb3ZlX3N0X2RldihhZGFwdGVy KTsKPiArc2V0dXBfc3RfZGV2X2ZhaWw6Cj4gKyBuYmxfZGV2X3JlbW92ZV9uZXRfZGV2KGFkYXB0 ZXIpOwo+ICtzZXR1cF9uZXRfZGV2X2ZhaWw6Cj4gKyBuYmxfZGV2X3JlbW92ZV9jdHJsX2Rldihh ZGFwdGVyKTsKPiArc2V0dXBfY3RybF9kZXZfZmFpbDoKPiArIG5ibF9kZXZfcmVtb3ZlX2NvbW1v bl9kZXYoYWRhcHRlcik7Cj4gK3NldHVwX2NvbW1vbl9kZXZfZmFpbDoKPiArIG5ibF9kZXZfcmVt b3ZlX2Rldl9tZ3QoY29tbW9uLCBkZXZfbWd0KTsKPiArc2V0dXBfbWd0X2ZhaWw6Cj4gKyByZXR1 cm4gcmV0Owo+wqAgfQo+wqAgCj4gLXN0YXRpYyBpbnQgbmJsX2Rldl92c2lfZGF0YV9zZXR1cChz dHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0s Cj4gLcKgIMKgIMKgIHZvaWQgKnZzaV9kYXRhKQo+ICt2b2lkIG5ibF9kZXZfcmVtb3ZlKHZvaWQg KnApCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rldl92 c2kgKil2c2lfZGF0YTsKPiArIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3Qg bmJsX2FkYXB0ZXIgKilwOwo+ICsgc3RydWN0IGRldmljZSAqZGV2ID0gTkJMX0FEQVBURVJfVE9f REVWKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0FE QVBURVJfVE9fQ09NTU9OKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICoqZGV2X21n dCA9IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKiopJk5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRl cik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9vcHNfdGJsICoqZGV2X29wc190YmwgPSAmTkJMX0FEQVBU RVJfVE9fREVWX09QU19UQkwoYWRhcHRlcik7Cj7CoCAKPiAtIHJldHVybiBuYmxfZGV2X3ZzaV9j b21tb25fc2V0dXAoZGV2X21ndCwgcGFyYW0sIHZzaSk7Cj4gLX0KPiArIG5ibF9kZXZfcmVtb3Zl X29wcyhkZXYsIGRldl9vcHNfdGJsKTsKPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV9k YXRhX3JlbW92ZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHZvaWQgKnZzaV9kYXRhKQo+ IC17Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rldl92c2kgKil2 c2lfZGF0YTsKPiArIG5ibF9kZXZfcmVtb3ZlX3N0X2RldihhZGFwdGVyKTsKPiArIG5ibF9kZXZf cmVtb3ZlX25ldF9kZXYoYWRhcHRlcik7Cj4gKyBuYmxfZGV2X3JlbW92ZV9jdHJsX2RldihhZGFw dGVyKTsKPiArIG5ibF9kZXZfcmVtb3ZlX2NvbW1vbl9kZXYoYWRhcHRlcik7Cj7CoCAKPiAtIG5i bF9kZXZfdnNpX2NvbW1vbl9yZW1vdmUoZGV2X21ndCwgdnNpKTsKPiArIG5ibF9kZXZfcmVtb3Zl X2Rldl9tZ3QoY29tbW9uLCBkZXZfbWd0KTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9k ZXZfdnNpX2N0cmxfcmVnaXN0ZXIoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCBzdHJ1Y3Qg bmJsX2luaXRfcGFyYW0gKnBhcmFtLAo+IC0gwqAgwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4g K3N0YXRpYyB2b2lkIG5ibF9kZXZfbm90aWZ5X2Rldl9wcmVwYXJlX3Jlc2V0KHN0cnVjdCBuYmxf ZGV2X21ndCAqZGV2X21ndCwKPiArwqAgwqAgwqAgwqAgwqAgZW51bSBuYmxfcmVzZXRfZXZlbnQg ZXZlbnQpCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVW X01HVF9UT19DT01NT04oZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChz dHJ1Y3QgbmJsX2Rldl92c2kgKil2c2lfZGF0YTsKPiArIGludCBmdW5jX251bSA9IDA7Cj4gKyB1 bnNpZ25lZCBsb25nIGN1cl9mdW5jID0gMDsKPiArIHVuc2lnbmVkIGxvbmcgbmV4dF9mdW5jID0g MDsKPiArIHVuc2lnbmVkIGxvbmcgKmZ1bmNfYml0bWFwOwo+IMKgIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBz dHJ1Y3QgbmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BT KGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0RFVl9N R1RfVE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jaGFuX3NlbmRfaW5mbyBjaGFu X3NlbmQ7Cj4gKwo+ICsgZnVuY19iaXRtYXAgPSBkZXZtX2tjYWxsb2MoTkJMX0NPTU1PTl9UT19E RVYoY29tbW9uKSwgQklUU19UT19MT05HUyhOQkxfTUFYX0ZVTkMpLAo+ICsgwqAgwqAgwqAgc2l6 ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKPiArIGlmICghZnVuY19iaXRtYXApCj4gK8KgIHJldHVy bjsKPsKgIAo+IC0gc2Vydl9vcHMtPmdldF9yZXBfcXVldWVfaW5mbyhOQkxfREVWX01HVF9UT19T RVJWX1BSSVYoZGV2X21ndCksCj4gLSDCoCDCoCDCoCDCoCAmdnNpLT5xdWV1ZV9udW0sICZ2c2kt PnF1ZXVlX3NpemUpOwo+ICsgc2Vydl9vcHMtPmdldF9hY3RpdmVfZnVuY19iaXRtYXBzKE5CTF9E RVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwgZnVuY19iaXRtYXAsCj4gKyDCoCDCoCDCoCBO QkxfTUFYX0ZVTkMpOwo+ICsgbWVtc2V0KGRldl9tZ3QtPmN0cmxfZGV2LT50YXNrX2luZm8ucmVz ZXRfc3RhdHVzLCAwLAo+ICvCoCDCoCDCoCDCoCBzaXplb2YoZGV2X21ndC0+Y3RybF9kZXYtPnRh c2tfaW5mby5yZXNldF9zdGF0dXMpKTsKPiArIC8qIGNsZWFyIGN0cmxfZGV2IGZ1bmNfaWQsIGFu ZCBkbyBpdCBsYXN0ICovCj4gKyBjbGVhcl9iaXQoTkJMX0NPTU1PTl9UT19NR1RfUEYoY29tbW9u KSwgZnVuY19iaXRtYXApOwo+ICsKPiArIGN1cl9mdW5jID0gTkJMX0NPTU1PTl9UT19NR1RfUEYo Y29tbW9uKTsKPiArIHdoaWxlICgxKSB7Cj4gK8KgIG5leHRfZnVuYyA9IGZpbmRfbmV4dF9iaXQo ZnVuY19iaXRtYXAsIE5CTF9NQVhfRlVOQywgY3VyX2Z1bmMgKyAxKTsKPiArwqAgaWYgKG5leHRf ZnVuYyA+PSBOQkxfTUFYX0ZVTkMpCj4gKyDCoCBicmVhazsKPsKgIAo+IC0gbmJsX2RlYnVnKGNv bW1vbiwgTkJMX0RFQlVHX1ZTSSwgIkN0cmwgdnNpIHJlZ2lzdGVyLCBxdWV1ZV9udW0gJWQsIHF1 ZXVlX3NpemUgJWQiLAo+IC3CoCDCoCB2c2ktPnF1ZXVlX251bSwgdnNpLT5xdWV1ZV9zaXplKTsK PiAtIHJldHVybiAwOwo+IC19Cj4gK8KgIGN1cl9mdW5jID0gbmV4dF9mdW5jOwo+ICvCoCBkZXZf bWd0LT5jdHJsX2Rldi0+dGFza19pbmZvLnJlc2V0X3N0YXR1c1tjdXJfZnVuY10gPSBOQkxfUkVT RVRfU0VORDsKPiArwqAgTkJMX0NIQU5fU0VORChjaGFuX3NlbmQsIGN1cl9mdW5jLCBOQkxfQ0hB Tl9NU0dfTk9USUZZX1JFU0VUX0VWRU5ULCAmZXZlbnQsCj4gKyDCoCDCoCDCoCDCoCBzaXplb2Yo ZXZlbnQpLCBOVUxMLCAwLCAwKTsKPiArwqAgY2hhbl9vcHMtPnNlbmRfbXNnKE5CTF9ERVZfTUdU X1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgJmNoYW5fc2VuZCk7Cj4gK8KgIGZ1bmNfbnVtKys7Cj4g K8KgIGlmIChmdW5jX251bSA+PSBOQkxfREVWX0JBVENIX1JFU0VUX0ZVTkNfTlVNKSB7Cj4gKyDC oCB1c2xlZXBfcmFuZ2UoTkJMX0RFVl9CQVRDSF9SRVNFVF9VU0VDLCBOQkxfREVWX0JBVENIX1JF U0VUX1VTRUMgKiAyKTsKPiArIMKgIGZ1bmNfbnVtID0gMDsKPiArwqAgfQo+ICsgfQo+wqAgCj4g LXN0YXRpYyBpbnQgbmJsX2Rldl92c2lfY3RybF9zZXR1cChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRl dl9tZ3QsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0sCj4gLcKgIMKgIMKgIHZvaWQgKnZz aV9kYXRhKQo+IC17Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJsX2Rl dl92c2kgKil2c2lfZGF0YTsKPiArIGlmIChmdW5jX251bSkKPiArwqAgdXNsZWVwX3JhbmdlKE5C TF9ERVZfQkFUQ0hfUkVTRVRfVVNFQywgTkJMX0RFVl9CQVRDSF9SRVNFVF9VU0VDICogMik7Cj7C oCAKPiAtIHJldHVybiBuYmxfZGV2X3ZzaV9jb21tb25fc2V0dXAoZGV2X21ndCwgcGFyYW0sIHZz aSk7Cj4gLX0KPiArIC8qIGN0cmwgZGV2IG5lZWQgcHJvYyBsYXN0LCBiYXNlY2FzZSByZXNldCB0 YXNrIHdpbGwgY2xvc2UgbWFpbGJveCAqLwo+ICsgZGV2X21ndC0+Y3RybF9kZXYtPnRhc2tfaW5m by5yZXNldF9zdGF0dXNbTkJMX0NPTU1PTl9UT19NR1RfUEYoY29tbW9uKV0gPSBOQkxfUkVTRVRf U0VORDsKPiArIE5CTF9DSEFOX1NFTkQoY2hhbl9zZW5kLCBOQkxfQ09NTU9OX1RPX01HVF9QRihj b21tb24pLCBOQkxfQ0hBTl9NU0dfTk9USUZZX1JFU0VUX0VWRU5ULAo+ICvCoCDCoCDCoCDCoCBO VUxMLCAwLCBOVUxMLCAwLCAwKTsKPiArIGNoYW5fb3BzLT5zZW5kX21zZyhOQkxfREVWX01HVF9U T19DSEFOX1BSSVYoZGV2X21ndCksICZjaGFuX3NlbmQpOwo+ICsgdXNsZWVwX3JhbmdlKE5CTF9E RVZfQkFUQ0hfUkVTRVRfVVNFQywgTkJMX0RFVl9CQVRDSF9SRVNFVF9VU0VDICogMik7Cj7CoCAK PiAtc3RhdGljIHZvaWQgbmJsX2Rldl92c2lfY3RybF9yZW1vdmUoc3RydWN0IG5ibF9kZXZfbWd0 ICpkZXZfbWd0LCB2b2lkICp2c2lfZGF0YSkKPiAtewo+IC0gc3RydWN0IG5ibF9kZXZfdnNpICp2 c2kgPSAoc3RydWN0IG5ibF9kZXZfdnNpICopdnNpX2RhdGE7Cj4gKyBjdXJfZnVuYyA9IE5CTF9D T01NT05fVE9fTUdUX1BGKGNvbW1vbik7Cj4gKyB3aGlsZSAoMSkgewo+ICvCoCBpZiAoZGV2X21n dC0+Y3RybF9kZXYtPnRhc2tfaW5mby5yZXNldF9zdGF0dXNbY3VyX2Z1bmNdID09IE5CTF9SRVNF VF9TRU5EKQo+ICsgwqAgbmJsX2luZm8oY29tbW9uLCBOQkxfREVCVUdfTUFJTiwgImZ1bmMgJWxk IHJlc2V0IGZhaWxlZCIsIGN1cl9mdW5jKTsKPsKgIAo+IC0gbmJsX2Rldl92c2lfY29tbW9uX3Jl bW92ZShkZXZfbWd0LCB2c2kpOwo+ICvCoCBuZXh0X2Z1bmMgPSBmaW5kX25leHRfYml0KGZ1bmNf Yml0bWFwLCBOQkxfTUFYX0ZVTkMsIGN1cl9mdW5jICsgMSk7Cj4gK8KgIGlmIChuZXh0X2Z1bmMg Pj0gTkJMX01BWF9GVU5DKQo+ICsgwqAgYnJlYWs7Cj4gKwo+ICvCoCBjdXJfZnVuYyA9IG5leHRf ZnVuYzsKPiArIH0KPiArCj4gKyBkZXZtX2tmcmVlKE5CTF9DT01NT05fVE9fREVWKGNvbW1vbiks IGZ1bmNfYml0bWFwKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZfdnNpX3VzZXJf cmVnaXN0ZXIoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCBzdHJ1Y3QgbmJsX2luaXRfcGFy YW0gKnBhcmFtLAo+IC0gwqAgwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gK3N0YXRpYyB2b2lk IG5ibF9kZXZfaGFuZGxlX2ZhdGFsX2VycihzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj7C oCB7Cj4gLSBzdHJ1Y3QgbmJsX2NvbW1vbl9pbmZvICpjb21tb24gPSBOQkxfREVWX01HVF9UT19D T01NT04oZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IChzdHJ1Y3QgbmJs X2Rldl92c2kgKil2c2lfZGF0YTsKPiArIHN0cnVjdCBuYmxfY2hhbl9wYXJhbV9ub3RpZnlfZndf cmVzZXRfaW5mbyBmd19yZXNldCA9IHswfTsKPiArIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRl ciA9IE5CTF9ORVRERVZfVE9fQURBUFRFUihkZXZfbWd0LT5uZXRfZGV2LT5uZXRkZXYpOwo+IMKg IHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9P UFMoZGV2X21ndCk7Cj4gKyBzdHJ1Y3QgbmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9E RVZfTUdUX1RPX0NIQU5fT1BTKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAq Y29tbW9uID0gTkJMX0RFVl9NR1RfVE9fQ09NTU9OKGRldl9tZ3QpOwo+ICsgc3RydWN0IG5ibF9j aGFuX3NlbmRfaW5mbyBjaGFuX3NlbmQ7Cj7CoCAKPiAtIHNlcnZfb3BzLT5nZXRfdXNlcl9xdWV1 ZV9pbmZvKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwKPiAtwqAgwqAgwqAgwqAg wqAgJnZzaS0+cXVldWVfbnVtLCAmdnNpLT5xdWV1ZV9zaXplLAo+IC3CoCDCoCDCoCDCoCDCoCBO QkxfQ09NTU9OX1RPX1ZTSV9JRChjb21tb24pKTsKPiArIGlmICh0ZXN0X2FuZF9zZXRfYml0KE5C TF9GQVRBTF9FUlIsIGFkYXB0ZXItPnN0YXRlKSkgewo+ICvCoCBuYmxfaW5mbyhjb21tb24sIE5C TF9ERUJVR19NQUlOLCAiZGV2IGluIGZhdGFsX2VyciBzdGF0dXMgYWxyZWFkeS4iKTsKPiArwqAg cmV0dXJuOwo+ICsgfQo+wqAgCj4gLSBuYmxfZGVidWcoY29tbW9uLCBOQkxfREVCVUdfVlNJLCAi VXNlciB2c2kgcmVnaXN0ZXIsIHF1ZXVlX251bSAlZCwgcXVldWVfc2l6ZSAlZCIsCj4gLcKgIMKg IHZzaS0+cXVldWVfbnVtLCB2c2ktPnF1ZXVlX3NpemUpOwo+IC0gcmV0dXJuIDA7Cj4gLX0KPiAr IG5ibF9kZXZfZGlzYWJsZV9hYm5vcm1hbF9pcnEoZGV2X21ndCk7Cj4gKyBuYmxfZGV2X2N0cmxf dGFza19zdG9wKGRldl9tZ3QpOwo+ICsgbmJsX2Rldl9ub3RpZnlfZGV2X3ByZXBhcmVfcmVzZXQo ZGV2X21ndCwgTkJMX0hXX0ZBVEFMX0VSUl9FVkVOVCk7Cj7CoCAKPiAtc3RhdGljIGludCBuYmxf ZGV2X3ZzaV91c2VyX3NldHVwKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3RydWN0IG5i bF9pbml0X3BhcmFtICpwYXJhbSwKPiAtwqAgwqAgwqAgdm9pZCAqdnNpX2RhdGEpCj4gLXsKPiAt IHN0cnVjdCBuYmxfZGV2X3ZzaSAqdnNpID0gKHN0cnVjdCBuYmxfZGV2X3ZzaSAqKXZzaV9kYXRh Owo+ICsgLyogbm90aWZ5IGVtcCBzaHV0ZG93biBkZXYgKi8KPiArIGZ3X3Jlc2V0LnR5cGUgPSBO QkxfRldfSElHSF9URU1QX1JFU0VUOwo+ICsgTkJMX0NIQU5fU0VORChjaGFuX3NlbmQsIE5CTF9D SEFOX0FETUlOUV9GVU5DVElPTl9JRCwKPiArwqAgwqAgwqAgwqAgTkJMX0NIQU5fTVNHX0FETUlO UV9OT1RJRllfRldfUkVTRVQsICZmd19yZXNldCwgc2l6ZW9mKGZ3X3Jlc2V0KSwgTlVMTCwgMCwg MCk7Cj4gKyBjaGFuX29wcy0+c2VuZF9tc2coTkJMX0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9t Z3QpLCAmY2hhbl9zZW5kKTsKPsKgIAo+IC0gcmV0dXJuIG5ibF9kZXZfdnNpX2NvbW1vbl9zZXR1 cChkZXZfbWd0LCBwYXJhbSwgdnNpKTsKPiArIGNoYW5fb3BzLT5zZXRfcXVldWVfc3RhdGUoTkJM X0RFVl9NR1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLCBOQkxfQ0hBTl9BQk5PUk1BTCwKPiArwqAg wqAgwqAgTkJMX0NIQU5fVFlQRV9BRE1JTlEsIHRydWUpOwo+ICsgc2Vydl9vcHMtPnNldF9od19z dGF0dXMoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBOQkxfSFdfRkFUQUxfRVJS KTsKPiArIG5ibF9pbmZvKGNvbW1vbiwgTkJMX0RFQlVHX01BSU4sICJkZXYgaW4gZmF0YWxfZXJy IHN0YXR1cy4iKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3ZzaV91c2VyX3Jl bW92ZShzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QsIHZvaWQgKnZzaV9kYXRhKQo+ICsvKiAt LS0tLS0tLS0twqAgRGV2IHN0YXJ0IHByb2Nlc3PCoCAtLS0tLS0tLS0tICovCj4gK3N0YXRpYyBp bnQgbmJsX2Rldl9zdGFydF9jdHJsX2RldihzdHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0 cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0pCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kg KnZzaSA9IChzdHJ1Y3QgbmJsX2Rldl92c2kgKil2c2lfZGF0YTsKPiArIHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCA9IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKilOQkxfQURBUFRFUl9UT19ERVZf TUdUKGFkYXB0ZXIpOwo+ICsgaW50IGVyciA9IDA7Cj7CoCAKPiAtIG5ibF9kZXZfdnNpX2NvbW1v bl9yZW1vdmUoZGV2X21ndCwgdnNpKTsKPiAtfQo+ICsgZXJyID0gbmJsX2Rldl9yZXF1ZXN0X2Fi bm9ybWFsX2lycShkZXZfbWd0KTsKPiArIGlmIChlcnIpCj4gK8KgIGdvdG8gYWJub3JtYWxfcmVx dWVzdF9pcnFfZXJyOwo+wqAgCj4gLXN0YXRpYyBzdHJ1Y3QgbmJsX2Rldl92c2lfdGJsIHZzaV90 YmxbTkJMX1ZTSV9NQVhdID0gewo+IC0gW05CTF9WU0lfREFUQV0gPSB7Cj4gLcKgIC52c2lfb3Bz ID0gewo+IC0gwqAgLnJlZ2lzdGVyX3ZzaSA9IG5ibF9kZXZfdnNpX2RhdGFfcmVnaXN0ZXIsCj4g LSDCoCAuc2V0dXAgPSBuYmxfZGV2X3ZzaV9kYXRhX3NldHVwLAo+IC0gwqAgLnJlbW92ZSA9IG5i bF9kZXZfdnNpX2RhdGFfcmVtb3ZlLAo+IC3CoCB9LAo+IC3CoCAudmZfc3VwcG9ydCA9IHRydWUs Cj4gLcKgIC5vbmx5X25pY19zdXBwb3J0ID0gZmFsc2UsCj4gLcKgIC5pbl9rZXJuZWwgPSB0cnVl LAo+IC3CoCAudXNlX2luZGVwZW5kX2lycSA9IHRydWUsCj4gLcKgIC5zdGF0aWNfcXVldWUgPSB0 cnVlLAo+IC0gfSwKPiAtIFtOQkxfVlNJX0NUUkxdID0gewo+IC3CoCAudnNpX29wcyA9IHsKPiAt IMKgIC5yZWdpc3Rlcl92c2kgPSBuYmxfZGV2X3ZzaV9jdHJsX3JlZ2lzdGVyLAo+IC0gwqAgLnNl dHVwID0gbmJsX2Rldl92c2lfY3RybF9zZXR1cCwKPiAtIMKgIC5yZW1vdmUgPSBuYmxfZGV2X3Zz aV9jdHJsX3JlbW92ZSwKPiAtwqAgfSwKPiAtwqAgLnZmX3N1cHBvcnQgPSBmYWxzZSwKPiAtwqAg Lm9ubHlfbmljX3N1cHBvcnQgPSB0cnVlLAo+IC3CoCAuaW5fa2VybmVsID0gdHJ1ZSwKPiAtwqAg LnVzZV9pbmRlcGVuZF9pcnEgPSB0cnVlLAo+IC3CoCAuc3RhdGljX3F1ZXVlID0gdHJ1ZSwKPiAt IH0sCj4gLSBbTkJMX1ZTSV9VU0VSXSA9IHsKPiAtwqAgLnZzaV9vcHMgPSB7Cj4gLSDCoCAucmVn aXN0ZXJfdnNpID0gbmJsX2Rldl92c2lfdXNlcl9yZWdpc3RlciwKPiAtIMKgIC5zZXR1cCA9IG5i bF9kZXZfdnNpX3VzZXJfc2V0dXAsCj4gLSDCoCAucmVtb3ZlID0gbmJsX2Rldl92c2lfdXNlcl9y ZW1vdmUsCj4gLcKgIH0sCj4gLcKgIC52Zl9zdXBwb3J0ID0gZmFsc2UsCj4gLcKgIC5vbmx5X25p Y19zdXBwb3J0ID0gdHJ1ZSwKPiAtwqAgLmluX2tlcm5lbCA9IGZhbHNlLAo+IC3CoCAudXNlX2lu ZGVwZW5kX2lycSA9IGZhbHNlLAo+IC3CoCAuc3RhdGljX3F1ZXVlID0gZmFsc2UsCj4gLSB9LAo+ IC19Owo+ICsgZXJyID0gbmJsX2Rldl9lbmFibGVfYWJub3JtYWxfaXJxKGRldl9tZ3QpOwo+ICsg aWYgKGVycikKPiArwqAgZ290byBlbmFibGVfYWJub3JtYWxfaXJxX2VycjsKPsKgIAo+IC1zdGF0 aWMgaW50IG5ibF9kZXZfdnNpX2J1aWxkKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCwgc3Ry dWN0IG5ibF9pbml0X3BhcmFtICpwYXJhbSkKPiAtewo+IC0gc3RydWN0IG5ibF9kZXZfbmV0ICpu ZXRfZGV2ID0gTkJMX0RFVl9NR1RfVE9fTkVUX0RFVihkZXZfbWd0KTsKPiAtIHN0cnVjdCBuYmxf c2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7 Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IE5VTEw7Cj4gLSBpbnQgaTsKPiArIGVyciA9 IG5ibF9kZXZfcmVxdWVzdF9hZG1pbnFfaXJxKGRldl9tZ3QsICZOQkxfREVWX01HVF9UT19DVFJM X0RFVihkZXZfbWd0KS0+dGFza19pbmZvKTsKPiArIGlmIChlcnIpCj4gK8KgIGdvdG8gcmVxdWVz dF9hZG1pbnFfaXJxX2VycjsKPsKgIAo+IC0gbmV0X2Rldi0+dnNpX2N0cmwucXVldWVfbnVtID0g MDsKPiAtIG5ldF9kZXYtPnZzaV9jdHJsLnF1ZXVlX2ZyZWVfb2Zmc2V0ID0gMDsKPiArIGVyciA9 IG5ibF9kZXZfZW5hYmxlX2FkbWlucV9pcnEoZGV2X21ndCk7Cj4gKyBpZiAoZXJyKQo+ICvCoCBn b3RvIGVuYWJsZV9hZG1pbnFfaXJxX2VycjsKPsKgIAo+IC0gLyogQnVpbGQgYWxsIHZzaSwgYW5k IGFsbG9jIHZzaV9pZCBmb3IgZWFjaCBvZiB0aGVtICovCj4gLSBmb3IgKGkgPSAwOyBpIDwgTkJM X1ZTSV9NQVg7IGkrKykgewo+IC3CoCBpZiAoKHBhcmFtLT5jYXBzLmlzX3ZmICYmICF2c2lfdGJs W2ldLnZmX3N1cHBvcnQpIHx8Cj4gLcKgIMKgIMKgICghcGFyYW0tPmNhcHMuaXNfbmljICYmIHZz aV90YmxbaV0ub25seV9uaWNfc3VwcG9ydCkpCj4gLSDCoCBjb250aW51ZTsKPiArIG5ibF9kZXZf Z2V0X3BvcnRfYXR0cmlidXRlcyhkZXZfbWd0KTsKPiArIG5ibF9kZXZfaW5pdF9wb3J0KGRldl9t Z3QpOwo+ICsgbmJsX2Rldl9lbmFibGVfcG9ydChkZXZfbWd0LCB0cnVlKTsKPiArIG5ibF9kZXZf Y3RybF90YXNrX3N0YXJ0KGRldl9tZ3QpOwo+wqAgCj4gLcKgIHZzaSA9IGRldm1fa3phbGxvYyhO QkxfREVWX01HVF9UT19ERVYoZGV2X21ndCksIHNpemVvZigqdnNpKSwgR0ZQX0tFUk5FTCk7Cj4g LcKgIGlmICghdnNpKQo+IC0gwqAgZ290byBtYWxsb2NfdnNpX2ZhaWw7Cj4gKyByZXR1cm4gMDsK PsKgIAo+IC3CoCB2c2ktPm9wcyA9ICZ2c2lfdGJsW2ldLnZzaV9vcHM7Cj4gLcKgIHZzaS0+dnNp X2lkID0gc2Vydl9vcHMtPmdldF92c2lfaWQoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9t Z3QpLCAwLCBpKTsKPiAtwqAgdnNpLT5pbmRleCA9IGk7Cj4gLcKgIHZzaS0+aW5fa2VybmVsID0g dnNpX3RibFtpXS5pbl9rZXJuZWw7Cj4gLcKgIHZzaS0+dXNlX2luZGVwZW5kX2lycSA9IHZzaV90 YmxbaV0udXNlX2luZGVwZW5kX2lycTsKPiAtwqAgdnNpLT5zdGF0aWNfcXVldWUgPSB2c2lfdGJs W2ldLnN0YXRpY19xdWV1ZTsKPiAtwqAgbmV0X2Rldi0+dnNpX2N0cmwudnNpX2xpc3RbaV0gPSB2 c2k7Cj4gLSB9Cj4gK2VuYWJsZV9hZG1pbnFfaXJxX2VycjoKPiArIG5ibF9kZXZfZnJlZV9hZG1p bnFfaXJxKGRldl9tZ3QsICZOQkxfREVWX01HVF9UT19DVFJMX0RFVihkZXZfbWd0KS0+dGFza19p bmZvKTsKPiArcmVxdWVzdF9hZG1pbnFfaXJxX2VycjoKPiArIG5ibF9kZXZfZGlzYWJsZV9hYm5v cm1hbF9pcnEoZGV2X21ndCk7Cj4gK2VuYWJsZV9hYm5vcm1hbF9pcnFfZXJyOgo+ICsgbmJsX2Rl dl9mcmVlX2Fibm9ybWFsX2lycShkZXZfbWd0KTsKPiArYWJub3JtYWxfcmVxdWVzdF9pcnFfZXJy Ogo+ICsgcmV0dXJuIGVycjsKPiArfQo+wqAgCj4gLSByZXR1cm4gMDsKPiArc3RhdGljIHZvaWQg bmJsX2Rldl9zdG9wX2N0cmxfZGV2KHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlcikKPiArewo+ ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKU5C TF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj7CoCAKPiAtbWFsbG9jX3ZzaV9mYWlsOgo+ IC0gd2hpbGUgKC0taSArIDEpIHsKPiAtwqAgZGV2bV9rZnJlZShOQkxfREVWX01HVF9UT19ERVYo ZGV2X21ndCksIG5ldF9kZXYtPnZzaV9jdHJsLnZzaV9saXN0W2ldKTsKPiAtwqAgbmV0X2Rldi0+ dnNpX2N0cmwudnNpX2xpc3RbaV0gPSBOVUxMOwo+IC0gfQo+ICsgaWYgKCFOQkxfREVWX01HVF9U T19DVFJMX0RFVihkZXZfbWd0KSkKPiArwqAgcmV0dXJuOwo+wqAgCj4gLSByZXR1cm4gLUVOT01F TTsKPiArIG5ibF9kZXZfY3RybF90YXNrX3N0b3AoZGV2X21ndCk7Cj4gKyBuYmxfZGV2X2VuYWJs ZV9wb3J0KGRldl9tZ3QsIGZhbHNlKTsKPiArIG5ibF9kZXZfZGlzYWJsZV9hZG1pbnFfaXJxKGRl dl9tZ3QpOwo+ICsgbmJsX2Rldl9mcmVlX2FkbWlucV9pcnEoZGV2X21ndCwgJk5CTF9ERVZfTUdU X1RPX0NUUkxfREVWKGRldl9tZ3QpLT50YXNrX2luZm8pOwo+ICsgbmJsX2Rldl9kaXNhYmxlX2Fi bm9ybWFsX2lycShkZXZfbWd0KTsKPiArIG5ibF9kZXZfZnJlZV9hYm5vcm1hbF9pcnEoZGV2X21n dCk7Cj7CoCB9Cj7CoCAKPiAtc3RhdGljIHZvaWQgbmJsX2Rldl92c2lfZGVzdHJveShzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2hhbl9ub3RpZnlf bGlua19zdGF0ZV9yZXNwKHZvaWQgKnByaXYsIHUxNiBzcmNfaWQsIHUxNiBtc2dfaWQsCj4gK8Kg IMKgIMKgIHZvaWQgKmRhdGEsIHUzMiBkYXRhX2xlbikKPsKgIHsKPiAtIHN0cnVjdCBuYmxfZGV2 X25ldCAqbmV0X2RldiA9IE5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2X21ndCk7Cj4gLSBpbnQg aTsKPiArIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilw cml2Owo+ICsgc3RydWN0IG5ibF9hZGFwdGVyICphZGFwdGVyID0gTkJMX05FVERFVl9UT19BREFQ VEVSKG5ldGRldik7Cj4gKyBzdHJ1Y3QgbmJsX2Rldl9tZ3QgKmRldl9tZ3QgPSBOQkxfQURBUFRF Ul9UT19ERVZfTUdUKGFkYXB0ZXIpOwo+ICsgc3RydWN0IG5ibF9zZXJ2aWNlX29wcyAqc2Vydl9v cHMgPSBOQkxfREVWX01HVF9UT19TRVJWX09QUyhkZXZfbWd0KTsKPiArIHN0cnVjdCBuYmxfY2hh bl9wYXJhbV9ub3RpZnlfbGlua19zdGF0ZSAqbGlua19pbmZvOwo+wqAgCj4gLSBmb3IgKGkgPSAw OyBpIDwgTkJMX1ZTSV9NQVg7IGkrKykKPiAtwqAgaWYgKG5ldF9kZXYtPnZzaV9jdHJsLnZzaV9s aXN0W2ldKSB7Cj4gLSDCoCBkZXZtX2tmcmVlKE5CTF9ERVZfTUdUX1RPX0RFVihkZXZfbWd0KSwg bmV0X2Rldi0+dnNpX2N0cmwudnNpX2xpc3RbaV0pOwo+IC0gwqAgbmV0X2Rldi0+dnNpX2N0cmwu dnNpX2xpc3RbaV0gPSBOVUxMOwo+IC3CoCB9Cj4gKyBsaW5rX2luZm8gPSAoc3RydWN0IG5ibF9j aGFuX3BhcmFtX25vdGlmeV9saW5rX3N0YXRlICopZGF0YTsKPiArCj4gKyBzZXJ2X29wcy0+c2V0 X25ldGRldl9jYXJyaWVyX3N0YXRlKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZfbWd0KSwK PiArwqAgwqAgwqAgwqAgbmV0ZGV2LCBsaW5rX2luZm8tPmxpbmtfc3RhdGUpOwo+wqAgfQo+wqAg Cj4gLXN0cnVjdCBuYmxfZGV2X3ZzaSAqbmJsX2Rldl92c2lfc2VsZWN0KHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCwgdTggdnNpX2luZGV4KQo+ICtzdGF0aWMgdm9pZCBuYmxfZGV2X3JlZ2lz dGVyX2xpbmtfc3RhdGVfY2hhbl9tc2coc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LAo+ICsg wqAgwqAgwqAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKPsKgIHsKPiAtIHN0cnVjdCBuYmxf ZGV2X25ldCAqbmV0X2RldiA9IE5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2X21ndCk7Cj4gLSBz dHJ1Y3QgbmJsX2Rldl92c2kgKnZzaSA9IE5VTEw7Cj4gLSBpbnQgaSA9IDA7Cj4gKyBzdHJ1Y3Qg bmJsX2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9t Z3QpOwo+wqAgCj4gLSBmb3IgKGkgPSAwOyBpIDwgTkJMX1ZTSV9NQVg7IGkrKykgewo+IC3CoCB2 c2kgPSBuZXRfZGV2LT52c2lfY3RybC52c2lfbGlzdFtpXTsKPiAtwqAgaWYgKHZzaSAmJiB2c2kt PmluZGV4ID09IHZzaV9pbmRleCkKPiAtIMKgIHJldHVybiB2c2k7Cj4gLSB9Cj4gKyBpZiAoIWNo YW5fb3BzLT5jaGVja19xdWV1ZV9leGlzdChOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21n dCksCj4gK8KgIMKgIMKgIE5CTF9DSEFOX1RZUEVfTUFJTEJPWCkpCj4gK8KgIHJldHVybjsKPsKg IAo+IC0gcmV0dXJuIE5VTEw7Cj4gKyBjaGFuX29wcy0+cmVnaXN0ZXJfbXNnKE5CTF9ERVZfTUdU X1RPX0NIQU5fUFJJVihkZXZfbWd0KSwKPiArwqAgwqAgwqAgwqAgwqAgTkJMX0NIQU5fTVNHX05P VElGWV9MSU5LX1NUQVRFLAo+ICvCoCDCoCDCoCDCoCDCoCBuYmxfZGV2X2NoYW5fbm90aWZ5X2xp bmtfc3RhdGVfcmVzcCwgbmV0ZGV2KTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgaW50IG5ibF9kZXZf Y2hhbl9nZXRfc3RfbmFtZV9yZXEoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICtzdGF0 aWMgdm9pZCBuYmxfZGV2X2NoYW5fbm90aWZ5X3Jlc2V0X2V2ZW50X3Jlc3Aodm9pZCAqcHJpdiwg dTE2IHNyY19pZCwgdTE2IG1zZ19pZCwKPiArIMKgIMKgIMKgIHZvaWQgKmRhdGEsIHUzMiBkYXRh X2xlbikKPsKgIHsKPiAtIHN0cnVjdCBuYmxfY29tbW9uX2luZm8gKmNvbW1vbiA9IE5CTF9ERVZf TUdUX1RPX0NPTU1PTihkZXZfbWd0KTsKPiAtIHN0cnVjdCBuYmxfY2hhbm5lbF9vcHMgKmNoYW5f b3BzID0gTkJMX0RFVl9NR1RfVE9fQ0hBTl9PUFMoZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX2Rl dl9zdF9kZXYgKnN0X2RldiA9IE5CTF9ERVZfTUdUX1RPX1NUX0RFVihkZXZfbWd0KTsKPiAtIHN0 cnVjdCBuYmxfY2hhbl9zZW5kX2luZm8gY2hhbl9zZW5kID0gezB9Owo+ICsgc3RydWN0IG5ibF9k ZXZfbWd0ICpkZXZfbWd0ID0gKHN0cnVjdCBuYmxfZGV2X21ndCAqKXByaXY7Cj4gKyBlbnVtIG5i bF9yZXNldF9ldmVudCBldmVudCA9ICooZW51bSBuYmxfcmVzZXRfZXZlbnQgKilkYXRhOwo+wqAg Cj4gLSBOQkxfQ0hBTl9TRU5EKGNoYW5fc2VuZCwgTkJMX0NPTU1PTl9UT19NR1RfUEYoY29tbW9u KSwKPiAtwqAgwqAgwqAgwqAgTkJMX0NIQU5fTVNHX0dFVF9TVF9OQU1FLCBOVUxMLCAwLAo+IC3C oCDCoCDCoCDCoCBzdF9kZXYtPnJlYWxfc3RfbmFtZSwgc2l6ZW9mKHN0X2Rldi0+cmVhbF9zdF9u YW1lKSwgMSk7Cj4gLSByZXR1cm4gY2hhbl9vcHMtPnNlbmRfbXNnKE5CTF9ERVZfTUdUX1RPX0NI QU5fUFJJVihkZXZfbWd0KSwgJmNoYW5fc2VuZCk7Cj4gKyBkZXZfbWd0LT5jb21tb25fZGV2LT5y ZXNldF90YXNrLmV2ZW50ID0gZXZlbnQ7Cj4gKyBuYmxfY29tbW9uX3F1ZXVlX3dvcmsoJmRldl9t Z3QtPmNvbW1vbl9kZXYtPnJlc2V0X3Rhc2sudGFzaywgZmFsc2UpOwo+wqAgfQo+wqAgCj4gLXN0 YXRpYyB2b2lkIG5ibF9kZXZfY2hhbl9nZXRfc3RfbmFtZV9yZXNwKHZvaWQgKnByaXYsIHUxNiBz cmNfaWQsIHUxNiBtc2dfaWQsCj4gLSDCoCDCoCDCoCB2b2lkICpkYXRhLCB1MzIgZGF0YV9sZW4p Cj4gK3N0YXRpYyB2b2lkIG5ibF9kZXZfY2hhbl9hY2tfcmVzZXRfZXZlbnRfcmVzcCh2b2lkICpw cml2LCB1MTYgc3JjX2lkLCB1MTYgbXNnX2lkLAo+ICsgwqAgwqAgwqAgwqAgwqAgdm9pZCAqZGF0 YSwgdTMyIGRhdGFfbGVuKQo+wqAgewo+IMKgIHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCA9 IChzdHJ1Y3QgbmJsX2Rldl9tZ3QgKilwcml2Owo+IC0gc3RydWN0IG5ibF9kZXZfc3RfZGV2ICpz dF9kZXYgPSBOQkxfREVWX01HVF9UT19TVF9ERVYoZGV2X21ndCk7Cj4gLSBzdHJ1Y3QgbmJsX2No YW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9tZ3QpOwo+ IC0gc3RydWN0IGRldmljZSAqZGV2ID0gTkJMX0NPTU1PTl9UT19ERVYoZGV2X21ndC0+Y29tbW9u KTsKPiAtIHN0cnVjdCBuYmxfY2hhbl9hY2tfaW5mbyBjaGFuX2FjazsKPiAtIGludCByZXQ7Cj7C oCAKPiAtIE5CTF9DSEFOX0FDSyhjaGFuX2Fjaywgc3JjX2lkLCBOQkxfQ0hBTl9NU0dfR0VUX1NU X05BTUUsIG1zZ19pZCwKPiAtIMKgIMKgIMKgIDAsIHN0X2Rldi0+c3RfbmFtZSwgc2l6ZW9mKHN0 X2Rldi0+c3RfbmFtZSkpOwo+IC0gcmV0ID0gY2hhbl9vcHMtPnNlbmRfYWNrKE5CTF9ERVZfTUdU X1RPX0NIQU5fUFJJVihkZXZfbWd0KSwgJmNoYW5fYWNrKTsKPiAtIGlmIChyZXQpCj4gLcKgIGRl dl9lcnIoZGV2LCAiY2hhbm5lbCBzZW5kIGFjayBmYWlsZWQgd2l0aCByZXQ6ICVkLCBtc2dfdHlw ZTogJWRcbiIsCj4gLSDCoCByZXQsIE5CTF9DSEFOX01TR19HRVRfU1RfTkFNRSk7Cj4gKyBXUklU RV9PTkNFKGRldl9tZ3QtPmN0cmxfZGV2LT50YXNrX2luZm8ucmVzZXRfc3RhdHVzW3NyY19pZF0s IE5CTF9SRVNFVF9ET05FKTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3JlZ2lz dGVyX2dldF9zdF9uYW1lX2NoYW5fbXNnKHN0cnVjdCBuYmxfZGV2X21ndCAqZGV2X21ndCkKPiAr c3RhdGljIHZvaWQgbmJsX2Rldl9yZWdpc3Rlcl9yZXNldF9ldmVudF9jaGFuX21zZyhzdHJ1Y3Qg bmJsX2Rldl9tZ3QgKmRldl9tZ3QpCj7CoCB7Cj4gwqAgc3RydWN0IG5ibF9jaGFubmVsX29wcyAq Y2hhbl9vcHMgPSBOQkxfREVWX01HVF9UT19DSEFOX09QUyhkZXZfbWd0KTsKPiAtIHN0cnVjdCBu YmxfZGV2X3N0X2RldiAqc3RfZGV2ID0gTkJMX0RFVl9NR1RfVE9fU1RfREVWKGRldl9tZ3QpOwo+ wqAgCj4gwqAgaWYgKCFjaGFuX29wcy0+Y2hlY2tfcXVldWVfZXhpc3QoTkJMX0RFVl9NR1RfVE9f Q0hBTl9QUklWKGRldl9tZ3QpLAo+wqAgwqAgwqAgwqAgTkJMX0NIQU5fVFlQRV9NQUlMQk9YKSkK PsKgIMKgIHJldHVybjsKPsKgIAo+IMKgIGNoYW5fb3BzLT5yZWdpc3Rlcl9tc2coTkJMX0RFVl9N R1RfVE9fQ0hBTl9QUklWKGRldl9tZ3QpLAo+IC3CoCDCoCDCoCDCoCDCoCBOQkxfQ0hBTl9NU0df R0VUX1NUX05BTUUsCj4gLcKgIMKgIMKgIMKgIMKgIG5ibF9kZXZfY2hhbl9nZXRfc3RfbmFtZV9y ZXNwLCBkZXZfbWd0KTsKPiAtIHN0X2Rldi0+cmVzcF9tc2dfcmVnaXN0ZXJlZCA9IHRydWU7Cj4g K8KgIMKgIMKgIMKgIMKgIE5CTF9DSEFOX01TR19OT1RJRllfUkVTRVRfRVZFTlQsCj4gK8KgIMKg IMKgIMKgIMKgIG5ibF9kZXZfY2hhbl9ub3RpZnlfcmVzZXRfZXZlbnRfcmVzcCwgZGV2X21ndCk7 Cj4gKyBjaGFuX29wcy0+cmVnaXN0ZXJfbXNnKE5CTF9ERVZfTUdUX1RPX0NIQU5fUFJJVihkZXZf bWd0KSwKPiArwqAgwqAgwqAgwqAgwqAgTkJMX0NIQU5fTVNHX0FDS19SRVNFVF9FVkVOVCwKPiAr wqAgwqAgwqAgwqAgwqAgbmJsX2Rldl9jaGFuX2Fja19yZXNldF9ldmVudF9yZXNwLCBkZXZfbWd0 KTsKPsKgIH0KPsKgIAo+IC1zdGF0aWMgdm9pZCBuYmxfZGV2X3VucmVnaXN0ZXJfZ2V0X3N0X25h bWVfY2hhbl9tc2coc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0KQo+ICtpbnQgbmJsX2Rldl9z ZXR1cF92Zl9jb25maWcodm9pZCAqcCwgaW50IG51bV92ZnMpCj7CoCB7Cj4gLSBzdHJ1Y3QgbmJs X2NoYW5uZWxfb3BzICpjaGFuX29wcyA9IE5CTF9ERVZfTUdUX1RPX0NIQU5fT1BTKGRldl9tZ3Qp Owo+IC0gc3RydWN0IG5ibF9kZXZfc3RfZGV2ICpzdF9kZXYgPSBOQkxfREVWX01HVF9UT19TVF9E RVYoZGV2X21ndCk7Cj4gLQo+IC0gaWYgKCFzdF9kZXYtPnJlc3BfbXNnX3JlZ2lzdGVyZWQpCj4g LcKgIHJldHVybjsKPiArIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgbmJs X2FkYXB0ZXIgKilwOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0ID0gTkJMX0FEQVBU RVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZf b3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj7CoCAKPiAtIGNoYW5fb3Bz LT51bnJlZ2lzdGVyX21zZyhOQkxfREVWX01HVF9UT19DSEFOX1BSSVYoZGV2X21ndCksIE5CTF9D SEFOX01TR19HRVRfU1RfTkFNRSk7Cj4gKyByZXR1cm4gc2Vydl9vcHMtPnNldHVwX3ZmX2NvbmZp ZyhOQkxfREVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksIG51bV92ZnMsIGZhbHNlKTsKPsKg IH0KPsKgIAo+IC1zdGF0aWMgc3RydWN0IG5ibF9kZXZfbmV0X29wcyBuZXRkZXZfb3BzW05CTF9Q Uk9EVUNUX01BWF0gPSB7Cj4gLSB7Cj4gLcKgIC5zZXR1cF9uZXRkZXZfb3BzID0gbmJsX2Rldl9z ZXR1cF9uZXRvcHNfbGVvbmlzLAo+IC0gfSwKPiAtfTsKPiArdm9pZCBuYmxfZGV2X3JlZ2lzdGVy X2Rldl9uYW1lKHZvaWQgKnApCj4gK3sKPiArIHN0cnVjdCBuYmxfYWRhcHRlciAqYWRhcHRlciA9 IChzdHJ1Y3QgbmJsX2FkYXB0ZXIgKilwOwo+ICsgc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0 ID0gTkJMX0FEQVBURVJfVE9fREVWX01HVChhZGFwdGVyKTsKPiArIHN0cnVjdCBuYmxfc2Vydmlj ZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VSVl9PUFMoZGV2X21ndCk7Cj4gKyBz dHJ1Y3QgbmJsX2Rldl9uZXQgKm5ldF9kZXYgPSBOQkxfREVWX01HVF9UT19ORVRfREVWKGRldl9t Z3QpOwo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0FEQVBURVJfVE9f Q09NTU9OKGFkYXB0ZXIpOwo+wqAgCj4gLXN0YXRpYyB2b2lkIG5ibF9kZXRfc2V0dXBfbmV0X2Rl dl9vcHMoc3RydWN0IG5ibF9kZXZfbWd0ICpkZXZfbWd0LCBzdHJ1Y3QgbmJsX2luaXRfcGFyYW0g KnBhcmFtKQo+ICsgLyogZ2V0IHBmX25hbWUgdGhlbiByZWdpc3RlciBpdCB0byBBRiAqLwo+ICsg c2Vydl9vcHMtPnJlZ2lzdGVyX2Rldl9uYW1lKE5CTF9ERVZfTUdUX1RPX1NFUlZfUFJJVihkZXZf bWd0KSwKPiArwqAgwqAgwqAgwqAgY29tbW9uLT52c2lfaWQsIG5ldF9kZXYtPm5ldGRldi0+bmFt ZSk7Cj4gK30KPiArCj4gK3ZvaWQgbmJsX2Rldl9nZXRfZGV2X25hbWUodm9pZCAqcCwgY2hhciAq ZGV2X25hbWUpCj7CoCB7Cj4gLSBOQkxfREVWX01HVF9UT19ORVRERVZfT1BTKGRldl9tZ3QpID0g Jm5ldGRldl9vcHNbcGFyYW0tPnByb2R1Y3RfdHlwZV07Cj4gKyBzdHJ1Y3QgbmJsX2FkYXB0ZXIg KmFkYXB0ZXIgPSAoc3RydWN0IG5ibF9hZGFwdGVyICopcDsKPiArIHN0cnVjdCBuYmxfZGV2X21n dCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj4gKyBzdHJ1Y3Qg bmJsX3NlcnZpY2Vfb3BzICpzZXJ2X29wcyA9IE5CTF9ERVZfTUdUX1RPX1NFUlZfT1BTKGRldl9t Z3QpOwo+ICsgc3RydWN0IG5ibF9jb21tb25faW5mbyAqY29tbW9uID0gTkJMX0FEQVBURVJfVE9f Q09NTU9OKGFkYXB0ZXIpOwo+ICsKPiArIHNlcnZfb3BzLT5nZXRfZGV2X25hbWUoTkJMX0RFVl9N R1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpLCBjb21tb24tPnZzaV9pZCwgZGV2X25hbWUpOwo+wqAg fQo+wqAgCj4gLXN0YXRpYyBpbnQgbmJsX2Rldl9zZXR1cF9uZXRfZGV2KHN0cnVjdCBuYmxfYWRh cHRlciAqYWRhcHRlciwgc3RydWN0IG5ibF9pbml0X3BhcmFtICpwYXJhbSkKPiArdm9pZCBuYmxf ZGV2X3JlbW92ZV92Zl9jb25maWcodm9pZCAqcCkKPsKgIHsKPiArIHN0cnVjdCBuYmxfYWRhcHRl ciAqYWRhcHRlciA9IChzdHJ1Y3QgbmJsX2FkYXB0ZXIgKilwOwo+IMKgIHN0cnVjdCBuYmxfZGV2 X21ndCAqZGV2X21ndCA9IE5CTF9BREFQVEVSX1RPX0RFVl9NR1QoYWRhcHRlcik7Cj4gLSBzdHJ1 Y3QgbmJsX2Rldl9uZXQgKipuZXRfZGV2ID0gJk5CTF9ERVZfTUdUX1RPX05FVF9ERVYoZGV2X21n dCk7Cj4gLSBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOQkxfQURBUFRFUl9UT19ERVYoYWRhcHRlcik7 Cj4gLSBzdHJ1Y3QgbmJsX2Rldl92c2kgKnZzaTsKPiAtIGludCBpLCByZXQgPSAwOwo+IC0gdTE2 IHRvdGFsX3F1ZXVlX251bSA9IDAsIGtlcm5lbF9xdWV1ZV9udW0gPSAwLCB1c2VyX3F1ZXVlX251 bSA9IDA7Cj4gLSB1MTYgZHluYW1pY19xdWV1ZV9tYXggPSAwLCBpcnFfcXVldWVfbnVtID0gMDsK PiArIHN0cnVjdCBuYmxfc2VydmljZV9vcHMgKnNlcnZfb3BzID0gTkJMX0RFVl9NR1RfVE9fU0VS Vl9PUFMoZGV2X21ndCk7Cj7CoCAKPiAtICpuZXRfZGV2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6 ZW9mKHN0cnVjdCBuYmxfZGV2X25ldCksIEdGUF9LRVJORUwpOwo+IC0gaWYgKCEqbmV0X2RldikK PiAtwqAgcmV0dXJuIC1FTk9NRU07Cj4gKyByZXR1cm4gc2Vydl9vcHMtPnJlbW92ZV92Zl9jb25m aWcoTkJMX0RFVl9NR1RfVE9fU0VSVl9QUklWKGRldl9tZ3QpKTsKPiArfQo+wqAgCj4gLSByZXQg PSBuYmxfZGV2X3ZzaV9idWlsZChkZXZfbWd0LCBwYXJhbSk7Cj4gLSBpZiAocmV0KQo+IC3CoCBn b3RvIHZzaV9idWlsZF9mYWlsOwo+ICtzdGF0aWMgaW50IG5ibF9kZXZfc3RhcnRfbmV0X2Rldihz dHJ1Y3QgbmJsX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBuYmxfaW5pdF9wYXJhbSAqcGFyYW0p Cgo+ICsgcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Cj4gKyBpZiAocmV0KSB7Cj4gK8Kg IGRldl9lcnIoZGV2LCAiUmVnaXN0ZXIgbmV0ZGV2IGZhaWxlZFxuIik7Cj4gK8KgIGdvdG8gcmVn aXN0ZXJfbmV0ZGV2X2ZhaWw7Cj4gwqAgfQoKQnkgdGhlIHRpbWUgcmVnaXN0ZXJfbmV0ZGV2KCkg aGFzIHJldHVybmVkLCB5b3VyIGRldmljZSBpcyBsaXZlLApwb3RlbnRpYWxseSBzZW5kaW5nIGFu ZCByZWNlaXZpbmcgcGFja2V0cywgZXNwZWNpYWxseSBpZiB0aGluZ3MgbGlrZQpORlMgcm9vdCBh cmUgdXNlZC4KCj4gLSBuYmxfZGV2X3JlZ2lzdGVyX25ldF9pcnEoZGV2X21ndCwgaXJxX3F1ZXVl X251bSk7Cj4gKyBpZiAoIXBhcmFtLT5jYXBzLmlzX3ZmKSB7Cj4gK8KgIGlmIChuZXRfZGV2LT50 b3RhbF92ZnMpIHsKPiArIMKgIHJldCA9IHNlcnZfb3BzLT5zZXR1cF92Zl9yZXNvdXJjZShOQkxf REVWX01HVF9UT19TRVJWX1BSSVYoZGV2X21ndCksCj4gKyDCoCDCoCDCoCDCoCBuZXRfZGV2LT50 b3RhbF92ZnMpOwo+ICsgwqAgaWYgKHJldCkKPiArwqAgwqAgZ290byBzZXR1cF92Zl9yZXNfZmFp bDsKPiArwqAgfQo+ICvCoCBuYmxfbmV0ZGV2X2FkZF9zdF9zeXNmcyhuZXRkZXYsIG5ldF9kZXYp OwoKU28geW91IG5lZWQgdG8gYmUgdmVyeSBjYXJlZnVsIG9mIGFueSBpbml0aWFsaXNhdGlvbiB3 aGljaCBoYXBwZW5zCmFmdGVyIHJlZ2lzdGVyX25ldGRldigpLiBEb2VzIGl0IGhhcHBlbiB0b28g bGF0ZT8KClRoaXMgaXMgYSBidWcgaSBrZWVwIHBvaW50aW5nIG91dCBmb3IgbmV3IGRyaXZlcnMu IFRoZSBmYWN0IHlvdQpyZXBlYXRlZCBpdCBzdWdnZXN0cyB5b3UgaGF2ZSBub3QgYmVlbiBtb25p dG9yaW5nIHRoZSBuZXRkZXYgbGlzdCBhbmQKbGVhcm5pbmcgZnJvbSByZXZpZXdzIG90aGVyIG5l dyBkcml2ZXJzIGdldC4gU28gaSBleHBlY3QgeW91IGFyZSBnb2luZwp0byBiZSBkb2luZyBhIGxv dCBvZiByZXdyaXRpbmcgOi0oCgogQW5kcmV3Cgo+PgpJIGFwb2xvZ2l6ZSwgYnV0IEkgaGF2ZW4n dCBpZGVudGlmaWVkIHRoZSBpc3N1ZS4gQ3VycmVudGx5LCBJJ20gYWRkaW5nIHN5c2ZzIApvcGVy YXRpb25zIGFmdGVyIHJlZ2lzdGVyX25ldGRldigpLCBhcyBJIGJlbGlldmUgc3lzZnMgaW5pdGlh bGl6YXRpb24gc2hvdWxkIAppbmRlZWQgb2NjdXIgYWZ0ZXIgbmV0d29yayBkZXZpY2UgcmVnaXN0 cmF0aW9uLiBGb3IgZXhhbXBsZSwgaW4gaWdiX21haW4uYywKIGlnYl9zeXNmc19pbml0KCkgaXMg YWxzbyBjYWxsZWQgYWZ0ZXIgcmVnaXN0ZXJfbmV0ZGV2KCkuCgpDb3VsZCB5b3UgcGxlYXNlIGVs YWJvcmF0ZSBvbiB0aGUgc3BlY2lmaWMgY29uY2VybnMgeW91IGhhdmUgcmVnYXJkaW5nIAppbml0 aWFsaXphdGlvbiBvcmRlciBvciBwb3RlbnRpYWwgcmlzayBzY2VuYXJpb3M/IEkgd2lsbCBjYXJl ZnVsbHkgcmV2aWV3IG90aGVyCmRyaXZlcnMnIHJldmlldyBjb21tZW50cyBhbmQgZW5zdXJlIGNv bXBsaWFuY2Ugd2l0aCBrZXJuZWwgY29tbXVuaXR5IGJlc3QgcHJhY3RpY2VzLgoKaWxsdXNpb24u d2FuZwo+Pgo=