From mboxrd@z Thu Jan 1 00:00:00 1970 From: Clemens Ladisch Subject: [PATCH 1/2] ALSA: add LaCie Firewire Speakers/Griffin FireWave surround driver Date: Mon, 07 Feb 2011 10:14:30 +0100 Message-ID: <4D4FB7F6.8000801@ladisch.de> References: <4D46933D.5050609@ladisch.de> <4D4FB7C8.7090501@ladisch.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <4D4FB7C8.7090501@ladisch.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux1394-devel-bounces@lists.sourceforge.net To: Stefan Richter , Jay Fenlason Cc: alsa-devel@alsa-project.org, linux1394-devel@lists.sourceforge.net List-Id: alsa-devel@alsa-project.org QWRkIGEgZHJpdmVyIGZvciB0d28gcGxheWJhY2stb25seSBGaXJlV2lyZSBkZXZpY2VzIGJhc2Vk IG9uIHRoZSBPWEZXOTcwCmNoaXAuCgp2MjogQmV0dGVyIEFNRFRQIEFQSSBhYnN0cmFjdGlvbjsg Zml4IGZ3X3VuaXQgbGVhazsgc21hbGwgZml4ZXMuCiAgICBUd28tIGFuZCBmb3VyLWNoYW5uZWwg b3V0cHV0IG9uIHRoZSBGaXJlV2F2ZSBpcyBleHBlcmltZW50YWwuCgpTaWduZWQtb2ZmLWJ5OiBD bGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KLS0tCiBkcml2ZXJzL2ZpcmV3aXJl L2NvcmUtaXNvLmMgICAgIHwgICAgMQogZHJpdmVycy9maXJld2lyZS9jb3JlLmggICAgICAgICB8 ICAgIDMKIGluY2x1ZGUvbGludXgvZmlyZXdpcmUuaCAgICAgICAgfCAgICA3CiBzb3VuZC9LY29u ZmlnICAgICAgICAgICAgICAgICAgIHwgICAgMgogc291bmQvTWFrZWZpbGUgICAgICAgICAgICAg ICAgICB8ICAgIDIKIHNvdW5kL2ZpcmV3aXJlL0tjb25maWcgICAgICAgICAgfCAgIDI1ICsKIHNv dW5kL2ZpcmV3aXJlL01ha2VmaWxlICAgICAgICAgfCAgICA2CiBzb3VuZC9maXJld2lyZS9hbWR0 cC5jICAgICAgICAgIHwgIDUxMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogc291 bmQvZmlyZXdpcmUvYW1kdHAuaCAgICAgICAgICB8ICAxNTEgKysrKysrKysrCiBzb3VuZC9maXJl d2lyZS9jbXAuYyAgICAgICAgICAgIHwgIDMxNiArKysrKysrKysrKysrKysrKysrCiBzb3VuZC9m aXJld2lyZS9jbXAuaCAgICAgICAgICAgIHwgICA0MCArKwogc291bmQvZmlyZXdpcmUvZmNwLmMg ICAgICAgICAgICB8ICAyMjMgKysrKysrKysrKysrKwogc291bmQvZmlyZXdpcmUvZmNwLmggICAg ICAgICAgICB8ICAgMTIKIHNvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYyAgfCAgMjI0ICsr KysrKysrKysrKysrCiBzb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmggIHwgICAzOSArKwog c291bmQvZmlyZXdpcmUvbGliLmMgICAgICAgICAgICB8ICAgNjggKysrKwogc291bmQvZmlyZXdp cmUvbGliLmggICAgICAgICAgICB8ICAgMTkgKwogc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZm ZXIuYyB8ICAgNzQgKysrKwogc291bmQvZmlyZXdpcmUvcGFja2V0cy1idWZmZXIuaCB8ICAgMjYg Kwogc291bmQvZmlyZXdpcmUvc3BlYWtlcnMuYyAgICAgICB8ICA0ODQgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAyMCBmaWxlcyBjaGFuZ2VkLCAyMjI5IGluc2VydGlvbnMoKyksIDQg ZGVsZXRpb25zKC0pCgotLS0gYS9zb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL0tjb25maWcKQEAg LTk3LDYgKzk3LDggQEAgc291cmNlICJzb3VuZC9zaC9LY29uZmlnIgogIyBoZXJlIGFzc3VtaW5n IFVTQiBpcyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3VzYi9LY29uZmlnIgog Citzb3VyY2UgInNvdW5kL2ZpcmV3aXJlL0tjb25maWciCisKICMgdGhlIGZvbGxvd2luZyB3aWxs IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgY29uZmlnLgogIyBoZXJlIGFzc3VtaW5nIFBDTUNJQSBp cyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3BjbWNpYS9LY29uZmlnIgotLS0g YS9zb3VuZC9NYWtlZmlsZQorKysgYi9zb3VuZC9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAgb2Jq LSQoQ09ORklHX1NPVU5EX1BSSU1FKSArPSBzb3VuZF9maXJtdwogb2JqLSQoQ09ORklHX1NPVU5E X1BSSU1FKSArPSBvc3MvCiBvYmotJChDT05GSUdfRE1BU09VTkQpICs9IG9zcy8KIG9iai0kKENP TkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJtLyBzaC8g c3ludGgvIHVzYi8gXAotCXNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0 bWVsLworCWZpcmV3aXJlLyBzcGFyYy8gc3BpLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8gc29jLyBh dG1lbC8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBi ZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKLS0tIC9kZXYvbnVs bAorKysgYi9zb3VuZC9maXJld2lyZS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK21lbnVjb25m aWcgU05EX0ZJUkVXSVJFCisJYm9vbCAiRmlyZVdpcmUgc291bmQgZGV2aWNlcyIKKwlkZXBlbmRz IG9uIEZJUkVXSVJFCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgSUVFRS0xMzk0 L0ZpcmVXaXJlL2lMaW5rIHNvdW5kIGRldmljZXMuCisKK2lmIFNORF9GSVJFV0lSRSAmJiBGSVJF V0lSRQorCitjb25maWcgU05EX0ZJUkVXSVJFX0xJQgorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBT TkRfUENNCisKK2NvbmZpZyBTTkRfRklSRVdJUkVfU1BFQUtFUlMKKwl0cmlzdGF0ZSAiRmlyZVdp cmUgc3BlYWtlcnMiCisJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgU05EX0ZJUkVXSVJFX0xJQgor CWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgTGFDaWUgRmly ZXdpcmUgU3BlYWtlcnMKKwkgIGFuZCB0aGUgR3JpZmZpbiBGaXJlV2F2ZSBTdXJyb3VuZC4KKwor CSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhl IG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc25kLWZpcmV3aXJlLXNwZWFrZXJzLgorCitlbmRp ZiAjIFNORF9GSVJFV0lSRQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL01ha2Vm aWxlCkBAIC0wLDAgKzEsNiBAQAorc25kLWZpcmV3aXJlLWxpYi1vYmpzIDo9IGxpYi5vIGlzby1y ZXNvdXJjZXMubyBwYWNrZXRzLWJ1ZmZlci5vIFwKKwkJCSBmY3AubyBjbXAubyBhbWR0cC5vCitz bmQtZmlyZXdpcmUtc3BlYWtlcnMtb2JqcyA6PSBzcGVha2Vycy5vCisKK29iai0kKENPTkZJR19T TkRfRklSRVdJUkVfTElCKSArPSBzbmQtZmlyZXdpcmUtbGliLm8KK29iai0kKENPTkZJR19TTkRf RklSRVdJUkVfU1BFQUtFUlMpICs9IHNuZC1maXJld2lyZS1zcGVha2Vycy5vCi0tLSBhL2RyaXZl cnMvZmlyZXdpcmUvY29yZS1pc28uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtaXNvLmMK QEAgLTM2OSwzICszNjksNCBAQCB2b2lkIGZ3X2lzb19yZXNvdXJjZV9tYW5hZ2Uoc3RydWN0IGZ3 X2NhCiAJCSpjaGFubmVsID0gcmV0OwogCX0KIH0KK0VYUE9SVF9TWU1CT0woZndfaXNvX3Jlc291 cmNlX21hbmFnZSk7Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oCisrKyBiL2RyaXZlcnMv ZmlyZXdpcmUvY29yZS5oCkBAIC0xNDcsOSArMTQ3LDYgQEAgdm9pZCBmd19ub2RlX2V2ZW50KHN0 cnVjdCBmd19jYXJkICpjYXJkLAogLyogLWlzbyAqLwogCiBpbnQgZndfaXNvX2J1ZmZlcl9tYXAo c3RydWN0IGZ3X2lzb19idWZmZXIgKmJ1ZmZlciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEp Owotdm9pZCBmd19pc29fcmVzb3VyY2VfbWFuYWdlKHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQg Z2VuZXJhdGlvbiwKLQkJCSAgICB1NjQgY2hhbm5lbHNfbWFzaywgaW50ICpjaGFubmVsLCBpbnQg KmJhbmR3aWR0aCwKLQkJCSAgICBib29sIGFsbG9jYXRlLCBfX2JlMzIgYnVmZmVyWzJdKTsKIAog CiAvKiAtdG9wb2xvZ3kgKi8KLS0tIGEvaW5jbHVkZS9saW51eC9maXJld2lyZS5oCisrKyBiL2lu Y2x1ZGUvbGludXgvZmlyZXdpcmUuaApAQCAtNDIsNiArNDIsMTAgQEAKICNkZWZpbmUgQ1NSX0JS T0FEQ0FTVF9DSEFOTkVMCQkweDIzNAogI2RlZmluZSBDU1JfQ09ORklHX1JPTQkJCTB4NDAwCiAj ZGVmaW5lIENTUl9DT05GSUdfUk9NX0VORAkJMHg4MDAKKyNkZWZpbmUgQ1NSX09NUFIJCQkweDkw MAorI2RlZmluZSBDU1JfT1BDUihpKQkJCSgweDkwNCArIChpKSAqIDQpCisjZGVmaW5lIENTUl9J TVBSCQkJMHg5ODAKKyNkZWZpbmUgQ1NSX0lQQ1IoaSkJCQkoMHg5ODQgKyAoaSkgKiA0KQogI2Rl ZmluZSBDU1JfRkNQX0NPTU1BTkQJCQkweEIwMAogI2RlZmluZSBDU1JfRkNQX1JFU1BPTlNFCQkw eEQwMAogI2RlZmluZSBDU1JfRkNQX0VORAkJCTB4RjAwCkBAIC00NDEsNSArNDQ1LDggQEAgaW50 IGZ3X2lzb19jb250ZXh0X3N0YXJ0KHN0cnVjdCBmd19pc29fYwogCQkJIGludCBjeWNsZSwgaW50 IHN5bmMsIGludCB0YWdzKTsKIGludCBmd19pc29fY29udGV4dF9zdG9wKHN0cnVjdCBmd19pc29f Y29udGV4dCAqY3R4KTsKIHZvaWQgZndfaXNvX2NvbnRleHRfZGVzdHJveShzdHJ1Y3QgZndfaXNv X2NvbnRleHQgKmN0eCk7Cit2b2lkIGZ3X2lzb19yZXNvdXJjZV9tYW5hZ2Uoc3RydWN0IGZ3X2Nh cmQgKmNhcmQsIGludCBnZW5lcmF0aW9uLAorCQkJICAgIHU2NCBjaGFubmVsc19tYXNrLCBpbnQg KmNoYW5uZWwsIGludCAqYmFuZHdpZHRoLAorCQkJICAgIGJvb2wgYWxsb2NhdGUsIF9fYmUzMiBi dWZmZXJbMl0pOwogCiAjZW5kaWYgLyogX0xJTlVYX0ZJUkVXSVJFX0ggKi8KLS0tIC9kZXYvbnVs bAorKysgYi9zb3VuZC9maXJld2lyZS9jbXAuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENv bm5lY3Rpb24gTWFuYWdlbWVudCBQcm9jZWR1cmVzIChJRUMgNjE4ODMtMSkgaGVscGVyIGZ1bmN0 aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlz Y2guZGU+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5o PgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CisjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUt Y29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgv c2NoZWQuaD4KKyNpbmNsdWRlICJsaWIuaCIKKyNpbmNsdWRlICJpc28tcmVzb3VyY2VzLmgiCisj aW5jbHVkZSAiY21wLmgiCisKKyNkZWZpbmUgSU1QUl9TUEVFRF9NQVNLCQkweGMwMDAwMDAwCisj ZGVmaW5lIElNUFJfU1BFRURfU0hJRlQJMzAKKyNkZWZpbmUgSU1QUl9YU1BFRURfTUFTSwkweDAw MDAwMDYwCisjZGVmaW5lIElNUFJfWFNQRUVEX1NISUZUCTUKKyNkZWZpbmUgSU1QUl9QTFVHU19N QVNLCQkweDAwMDAwMDFmCisKKyNkZWZpbmUgSVBDUl9PTkxJTkUJCTB4ODAwMDAwMDAKKyNkZWZp bmUgSVBDUl9CQ0FTVF9DT05OCQkweDQwMDAwMDAwCisjZGVmaW5lIElQQ1JfUDJQX0NPTk5fTUFT SwkweDNmMDAwMDAwCisjZGVmaW5lIElQQ1JfUDJQX0NPTk5fU0hJRlQJMjQKKyNkZWZpbmUgSVBD Ul9DSEFOTkVMX01BU0sJMHgwMDNmMDAwMAorI2RlZmluZSBJUENSX0NIQU5ORUxfU0hJRlQJMTYK KworZW51bSBidXNfcmVzZXRfaGFuZGxpbmcgeworCUFCT1JUX09OX0JVU19SRVNFVCwKKwlTVUND RUVEX09OX0JVU19SRVNFVCwKK307CisKKyNkZWZpbmUgY21wX2VycihjLCBmbXQsIGFyZy4uLikg XAorCQlkZXZfZXJyKCYoYyktPnJlc291cmNlcy51bml0LT5kZXZpY2UsIGZtdCwgIyNhcmcpCisK K3N0YXRpYyBpbnQgcGNyX21vZGlmeShzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMsCisJCSAgICAg IF9fYmUzMiAoKm1vZGlmeSkoc3RydWN0IGNtcF9jb25uZWN0aW9uICpjLCBfX2JlMzIgb2xkKSwK KwkJICAgICAgaW50ICgqY2hlY2spKHN0cnVjdCBjbXBfY29ubmVjdGlvbiAqYywgX19iZTMyIHBj ciksCisJCSAgICAgIGVudW0gYnVzX3Jlc2V0X2hhbmRsaW5nIGJ1c19yZXNldF9oYW5kbGluZykK K3sKKwlzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UgPSBmd19wYXJlbnRfZGV2aWNlKGMtPnJlc291 cmNlcy51bml0KTsKKwlfX2JlMzIgKmJ1ZmZlciA9IGMtPnJlc291cmNlcy5idWZmZXI7CisJaW50 IGdlbmVyYXRpb24gPSBjLT5yZXNvdXJjZXMuZ2VuZXJhdGlvbjsKKwlpbnQgcmNvZGUsIGVycm9y czsKKwlfX2JlMzIgb2xkX2FyZzsKKwlpbnQgZXJyOworCisJZXJyb3JzID0gMDsKKwlmb3IgKDs7 KSB7CisJCXJjb2RlID0gZndfcnVuX3RyYW5zYWN0aW9uKAorCQkJCWRldmljZS0+Y2FyZCwgVENP REVfUkVBRF9RVUFETEVUX1JFUVVFU1QsCisJCQkJZGV2aWNlLT5ub2RlX2lkLCBnZW5lcmF0aW9u LCBkZXZpY2UtPm1heF9zcGVlZCwKKwkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9JUENSKGMt PnBjcl9pbmRleCksCisJCQkJYnVmZmVyLCA0KTsKKwkJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBM RVRFKSB7CisJCQlpZiAoY2hlY2spIHsKKwkJCQllcnIgPSBjaGVjayhjLCBidWZmZXJbMF0pOwor CQkJCWlmIChlcnIgPCAwKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJYnJlYWs7CisJCX0g ZWxzZSBpZiAocmNvZGUgPT0gUkNPREVfR0VORVJBVElPTikKKwkJCWdvdG8gYnVzX3Jlc2V0Owor CQllbHNlIGlmIChyY29kZV9pc19wZXJtYW5lbnRfZXJyb3IocmNvZGUpIHx8ICsrZXJyb3JzID49 IDMpCisJCQlnb3RvIGlvX2Vycm9yOworCX0KKworCWVycm9ycyA9IDA7CisJZm9yICg7Oykgewor CQlvbGRfYXJnID0gYnVmZmVyWzBdOworCQlidWZmZXJbMV0gPSBtb2RpZnkoYywgYnVmZmVyWzBd KTsKKworCQlyY29kZSA9IGZ3X3J1bl90cmFuc2FjdGlvbigKKwkJCQlkZXZpY2UtPmNhcmQsIFRD T0RFX0xPQ0tfQ09NUEFSRV9TV0FQLAorCQkJCWRldmljZS0+bm9kZV9pZCwgZ2VuZXJhdGlvbiwg ZGV2aWNlLT5tYXhfc3BlZWQsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfSVBDUihjLT5w Y3JfaW5kZXgpLAorCQkJCWJ1ZmZlciwgOCk7CisKKwkJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBM RVRFKSB7CisJCQlpZiAoYnVmZmVyWzBdID09IG9sZF9hcmcpIC8qIHN1Y2Nlc3M/ICovCisJCQkJ YnJlYWs7CisKKwkJCWlmIChjaGVjaykgeworCQkJCWVyciA9IGNoZWNrKGMsIGJ1ZmZlclswXSk7 CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0gZWxzZSBpZiAo cmNvZGUgPT0gUkNPREVfR0VORVJBVElPTikKKwkJCWdvdG8gYnVzX3Jlc2V0OworCQllbHNlIGlm IChyY29kZV9pc19wZXJtYW5lbnRfZXJyb3IocmNvZGUpIHx8ICsrZXJyb3JzID49IDMpCisJCQln b3RvIGlvX2Vycm9yOworCX0KKworCXJldHVybiAwOworCitpb19lcnJvcjoKKwljbXBfZXJyKGMs ICJpUENSJXU6IHRyYW5zYWN0aW9uIGZhaWxlZDogJXNcbiIsCisJCWMtPnBjcl9pbmRleCwgcmNv ZGVfc3RyaW5nKHJjb2RlKSk7CisJcmV0dXJuIC1FSU87CisKK2J1c19yZXNldDoKKwlyZXR1cm4g YnVzX3Jlc2V0X2hhbmRsaW5nID09IEFCT1JUX09OX0JVU19SRVNFVCA/IC1FQUdBSU4gOiAwOwor fQorCisKKy8qKgorICogY21wX2Nvbm5lY3Rpb25faW5pdCAtIGluaXRpYWxpemVzIGEgY29ubmVj dGlvbiBtYW5hZ2VyCisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlciB0byBpbml0aWFsaXpl CisgKiBAdW5pdDogYSB1bml0IG9mIHRoZSB0YXJnZXQgZGV2aWNlCisgKiBAaXBjcl9pbmRleDog dGhlIGluZGV4IG9mIHRoZSBpUENSIG9uIHRoZSB0YXJnZXQgZGV2aWNlCisgKi8KK2ludCBjbXBf Y29ubmVjdGlvbl9pbml0KHN0cnVjdCBjbXBfY29ubmVjdGlvbiogYywKKwkJCXN0cnVjdCBmd191 bml0ICp1bml0LAorCQkJdW5zaWduZWQgaW50IGlwY3JfaW5kZXgpCit7CisJX19iZTMyIGltcHJf YmU7CisJdTMyIGltcHI7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9md190cmFuc2FjdGlvbih1 bml0LCBUQ09ERV9SRUFEX1FVQURMRVRfUkVRVUVTVCwKKwkJCQkgQ1NSX1JFR0lTVEVSX0JBU0Ug KyBDU1JfSU1QUiwKKwkJCQkgJmltcHJfYmUsIDQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4g ZXJyOworCWltcHIgPSBiZTMyX3RvX2NwdShpbXByX2JlKTsKKworCWlmIChpcGNyX2luZGV4ID49 IChpbXByICYgSU1QUl9QTFVHU19NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmd19pc29f cmVzb3VyY2VzX2luaXQoJmMtPnJlc291cmNlcywgdW5pdCk7CisJYy0+Y29ubmVjdGVkID0gZmFs c2U7CisJbXV0ZXhfaW5pdCgmYy0+bXV0ZXgpOworCWMtPnBjcl9pbmRleCA9IGlwY3JfaW5kZXg7 CisJYy0+bWF4X3NwZWVkID0gKGltcHIgJiBJTVBSX1NQRUVEX01BU0spID4+IElNUFJfU1BFRURf U0hJRlQ7CisJaWYgKGMtPm1heF9zcGVlZCA9PSBTQ09ERV9CRVRBKQorCQljLT5tYXhfc3BlZWQg Kz0gKGltcHIgJiBJTVBSX1hTUEVFRF9NQVNLKSA+PiBJTVBSX1hTUEVFRF9TSElGVDsKKworCXJl dHVybiAwOworfQorRVhQT1JUX1NZTUJPTChjbXBfY29ubmVjdGlvbl9pbml0KTsKKworLyoqCisg KiBjbXBfY29ubmVjdGlvbl9kZXN0cm95IC0gZnJlZSBjb25uZWN0aW9uIG1hbmFnZXIgcmVzb3Vy Y2VzCisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICovCit2b2lkIGNtcF9jb25uZWN0 aW9uX2Rlc3Ryb3koc3RydWN0IGNtcF9jb25uZWN0aW9uICpjKQoreworCVdBUk5fT04oYy0+Y29u bmVjdGVkKTsKKwltdXRleF9kZXN0cm95KCZjLT5tdXRleCk7CisJZndfaXNvX3Jlc291cmNlc19k ZXN0cm95KCZjLT5yZXNvdXJjZXMpOworfQorRVhQT1JUX1NZTUJPTChjbXBfY29ubmVjdGlvbl9k ZXN0cm95KTsKKworCitzdGF0aWMgX19iZTMyIGlwY3Jfc2V0X21vZGlmeShzdHJ1Y3QgY21wX2Nv bm5lY3Rpb24gKmMsIF9fYmUzMiBpcGNyKQoreworCWlwY3IgJj0gfmNwdV90b19iZTMyKElQQ1Jf QkNBU1RfQ09OTiB8CisJCQkgICAgIElQQ1JfUDJQX0NPTk5fTUFTSyB8CisJCQkgICAgIElQQ1Jf Q0hBTk5FTF9NQVNLKTsKKwlpcGNyIHw9IGNwdV90b19iZTMyKDEgPDwgSVBDUl9QMlBfQ09OTl9T SElGVCk7CisJaXBjciB8PSBjcHVfdG9fYmUzMihjLT5yZXNvdXJjZXMuY2hhbm5lbCA8PCBJUENS X0NIQU5ORUxfU0hJRlQpOworCisJcmV0dXJuIGlwY3I7Cit9CisKK3N0YXRpYyBpbnQgaXBjcl9z ZXRfY2hlY2soc3RydWN0IGNtcF9jb25uZWN0aW9uICpjLCBfX2JlMzIgaXBjcikKK3sKKwlpZiAo aXBjciAmIGNwdV90b19iZTMyKElQQ1JfQkNBU1RfQ09OTiB8CisJCQkgICAgICAgSVBDUl9QMlBf Q09OTl9NQVNLKSkgeworCQljbXBfZXJyKGMsICJpUENSJXU6IHBsdWcgaXMgYWxyZWFkeSBpbiB1 c2VcbiIsIGMtPnBjcl9pbmRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICghKGlwY3Ig JiBjcHVfdG9fYmUzMihJUENSX09OTElORSkpKSB7CisJCWNtcF9lcnIoYywgImlQQ1IldTogcGx1 ZyBpcyBub3Qgb24tbGluZVxuIiwgYy0+cGNyX2luZGV4KTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVT RUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY21wX2Nvbm5lY3Rpb25fZXN0YWJs aXNoIC0gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgdGFyZ2V0CisgKiBAYzogdGhlIGNv bm5lY3Rpb24gbWFuYWdlcgorICogQG1heF9wYXlsb2FkX2J5dGVzOiB0aGUgYW1vdW50IG9mIGRh dGEgKGluY2x1ZGluZyBDSVAgaGVhZGVycykgcGVyIHBhY2tldAorICoKKyAqIFRoaXMgZnVuY3Rp b24gZXN0YWJsaXNoZXMgYSBwb2ludC10by1wb2ludCBjb25uZWN0aW9uIGZyb20gdGhlIGxvY2Fs CisgKiBjb21wdXRlciB0byB0aGUgdGFyZ2V0IGJ5IGFsbG9jYXRpbmcgaXNvY2hyb25vdXMgcmVz b3VyY2VzIChjaGFubmVsIGFuZAorICogYmFuZHdpZHRoKSBhbmQgc2V0dGluZyB0aGUgdGFyZ2V0 J3MgaW5wdXQgcGx1ZyBjb250cm9sIHJlZ2lzdGVyLiAgV2hlbiB0aGlzCisgKiBmdW5jdGlvbiBz dWNjZWVkcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdHJhbnNtaXR0 aW5nCisgKiBwYWNrZXRzLgorICovCitpbnQgY21wX2Nvbm5lY3Rpb25fZXN0YWJsaXNoKHN0cnVj dCBjbXBfY29ubmVjdGlvbiAqYywKKwkJCSAgICAgdW5zaWduZWQgaW50IG1heF9wYXlsb2FkX2J5 dGVzKQoreworCWludCBlcnI7CisKKwlpZiAoV0FSTl9PTihjLT5jb25uZWN0ZWQpKQorCQlyZXR1 cm4gLUVJU0NPTk47CisKKwljLT5zcGVlZCA9IG1pbihjLT5tYXhfc3BlZWQsCisJCSAgICAgICBm d19wYXJlbnRfZGV2aWNlKGMtPnJlc291cmNlcy51bml0KS0+bWF4X3NwZWVkKTsKKworCW11dGV4 X2xvY2soJmMtPm11dGV4KTsKKworcmV0cnlfYWZ0ZXJfYnVzX3Jlc2V0OgorCWVyciA9IGZ3X2lz b19yZXNvdXJjZXNfYWxsb2NhdGUoJmMtPnJlc291cmNlcywKKwkJCQkJbWF4X3BheWxvYWRfYnl0 ZXMsIGMtPnNwZWVkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfbXV0ZXg7CisKKwllcnIg PSBwY3JfbW9kaWZ5KGMsIGlwY3Jfc2V0X21vZGlmeSwgaXBjcl9zZXRfY2hlY2ssCisJCQkgQUJP UlRfT05fQlVTX1JFU0VUKTsKKwlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJZndfaXNvX3Jlc291 cmNlc19mcmVlKCZjLT5yZXNvdXJjZXMpOworCQlnb3RvIHJldHJ5X2FmdGVyX2J1c19yZXNldDsK Kwl9CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3Jlc291cmNlczsKKworCWMtPmNvbm5lY3Rl ZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmMtPm11dGV4KTsKKworCXJldHVybiAwOworCitl cnJfcmVzb3VyY2VzOgorCWZ3X2lzb19yZXNvdXJjZXNfZnJlZSgmYy0+cmVzb3VyY2VzKTsKK2Vy cl9tdXRleDoKKwltdXRleF91bmxvY2soJmMtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitF WFBPUlRfU1lNQk9MKGNtcF9jb25uZWN0aW9uX2VzdGFibGlzaCk7CisKKy8qKgorICogY21wX2Nv bm5lY3Rpb25fdXBkYXRlIC0gdXBkYXRlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGEgYnVzIHJlc2V0 CisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVz dCBiZSBjYWxsZWQgZnJvbSB0aGUgZHJpdmVyJ3MgLnVwZGF0ZSBoYW5kbGVyIHRvIHJlZXN0YWJs aXNoCisgKiBhbnkgY29ubmVjdGlvbiB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBhY3RpdmUuCisgKgor ICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gIE9u IGFuIGVycm9yLCB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgYnJva2VuIGFuZCB0aGUgY2FsbGVyIG11 c3Qgc3RvcCB0cmFuc21pdHRpbmcgaXNvIHBhY2tldHMuCisgKi8KK2ludCBjbXBfY29ubmVjdGlv bl91cGRhdGUoc3RydWN0IGNtcF9jb25uZWN0aW9uICpjKQoreworCWludCBlcnI7CisKKwltdXRl eF9sb2NrKCZjLT5tdXRleCk7CisKKwlpZiAoIWMtPmNvbm5lY3RlZCkgeworCQltdXRleF91bmxv Y2soJmMtPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gZndfaXNvX3Jlc291cmNl c191cGRhdGUoJmMtPnJlc291cmNlcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX3VuY29u bmVjdDsKKworCWVyciA9IHBjcl9tb2RpZnkoYywgaXBjcl9zZXRfbW9kaWZ5LCBpcGNyX3NldF9j aGVjaywKKwkJCSBTVUNDRUVEX09OX0JVU19SRVNFVCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8g ZXJyX3Jlc291cmNlczsKKworCW11dGV4X3VubG9jaygmYy0+bXV0ZXgpOworCisJcmV0dXJuIDA7 CisKK2Vycl9yZXNvdXJjZXM6CisJZndfaXNvX3Jlc291cmNlc19mcmVlKCZjLT5yZXNvdXJjZXMp OworZXJyX3VuY29ubmVjdDoKKwljLT5jb25uZWN0ZWQgPSBmYWxzZTsKKwltdXRleF91bmxvY2so JmMtPm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGNtcF9jb25uZWN0 aW9uX3VwZGF0ZSk7CisKKworc3RhdGljIF9fYmUzMiBpcGNyX2JyZWFrX21vZGlmeShzdHJ1Y3Qg Y21wX2Nvbm5lY3Rpb24gKmMsIF9fYmUzMiBpcGNyKQoreworCXJldHVybiBpcGNyICYgfmNwdV90 b19iZTMyKElQQ1JfQkNBU1RfQ09OTiB8IElQQ1JfUDJQX0NPTk5fTUFTSyk7Cit9CisKKy8qKgor ICogY21wX2Nvbm5lY3Rpb25fYnJlYWsgLSBicmVhayB0aGUgY29ubmVjdGlvbiB0byB0aGUgdGFy Z2V0CisgKiBAYzogdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24g ZGVhY3RpdmVzIHRoZSBjb25uZWN0aW9uIGluIHRoZSB0YXJnZXQncyBpbnB1dCBwbHVnIGNvbnRy b2wKKyAqIHJlZ2lzdGVyLCBhbmQgZnJlZXMgdGhlIGlzb2Nocm9ub3VzIHJlc291cmNlcyBvZiB0 aGUgY29ubmVjdGlvbi4gIEJlZm9yZQorICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgY2Fs bGVyIHNob3VsZCBjZWFzZSB0cmFuc21pdHRpbmcgcGFja2V0cy4KKyAqLwordm9pZCBjbXBfY29u bmVjdGlvbl9icmVhayhzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmMpCit7CisJaW50IGVycjsKKwor CW11dGV4X2xvY2soJmMtPm11dGV4KTsKKworCWlmICghYy0+Y29ubmVjdGVkKSB7CisJCW11dGV4 X3VubG9jaygmYy0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gcGNyX21vZGlmeShj LCBpcGNyX2JyZWFrX21vZGlmeSwgTlVMTCwgU1VDQ0VFRF9PTl9CVVNfUkVTRVQpOworCWlmIChl cnIgPCAwKQorCQljbXBfZXJyKGMsICJwbHVnIGlzIHN0aWxsIGNvbm5lY3RlZFxuIik7CisKKwlm d19pc29fcmVzb3VyY2VzX2ZyZWUoJmMtPnJlc291cmNlcyk7CisKKwljLT5jb25uZWN0ZWQgPSBm YWxzZTsKKworCW11dGV4X3VubG9jaygmYy0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChjbXBf Y29ubmVjdGlvbl9icmVhayk7Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvZmlyZXdpcmUvY21w LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBTT1VORF9GSVJFV0lSRV9DTVBfSF9JTkNMVURF RAorI2RlZmluZSBTT1VORF9GSVJFV0lSRV9DTVBfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGlu dXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImlzby1yZXNv dXJjZXMuaCIKKworc3RydWN0IGZ3X3VuaXQ7CisKKy8qKgorICogc3RydWN0IGNtcF9jb25uZWN0 aW9uIC0gbWFuYWdlcyBhbiBpc29jaHJvbm91cyBjb25uZWN0aW9uIHRvIGEgZGV2aWNlCisgKiBA c3BlZWQ6IHRoZSBjb25uZWN0aW9uJ3MgYWN0dWFsIHNwZWVkCisgKgorICogVGhpcyBzdHJ1Y3R1 cmUgbWFuYWdlcyAodXNpbmcgQ01QKSBhbiBpc29jaHJvbm91cyBzdHJlYW0gZnJvbSB0aGUgbG9j YWwKKyAqIGNvbXB1dGVyIHRvIGEgZGV2aWNlJ3MgaW5wdXQgcGx1ZyAoaVBDUikuCisgKgorICog VGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBvUENSIGNyZWF0ZWQgb24gdGhlIGxvY2FsIGNvbXB1 dGVyLCBzbyBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIHRvIG92ZXJsYXkgY29ubmVjdGlvbnMgb24g dG9wIG9mIHRoaXMgb25lLgorICovCitzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24geworCWludCBzcGVl ZDsKKwkvKiBwcml2YXRlOiAqLworCWJvb2wgY29ubmVjdGVkOworCXN0cnVjdCBtdXRleCBtdXRl eDsKKwlzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyByZXNvdXJjZXM7CisJdW5zaWduZWQgaW50IHBj cl9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NwZWVkOworfTsKKworaW50IGNtcF9jb25uZWN0 aW9uX2luaXQoc3RydWN0IGNtcF9jb25uZWN0aW9uKiBjb25uZWN0aW9uLAorCQkJc3RydWN0IGZ3 X3VuaXQgKnVuaXQsCisJCQl1bnNpZ25lZCBpbnQgaXBjcl9pbmRleCk7Cit2b2lkIGNtcF9jb25u ZWN0aW9uX2Rlc3Ryb3koc3RydWN0IGNtcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworaW50 IGNtcF9jb25uZWN0aW9uX2VzdGFibGlzaChzdHJ1Y3QgY21wX2Nvbm5lY3Rpb24gKmNvbm5lY3Rp b24sCisJCQkgICAgIHVuc2lnbmVkIGludCBtYXhfcGF5bG9hZCk7CitpbnQgY21wX2Nvbm5lY3Rp b25fdXBkYXRlKHN0cnVjdCBjbXBfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGNtcF9j b25uZWN0aW9uX2JyZWFrKHN0cnVjdCBjbXBfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKyNl bmRpZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZjcC5jCkBAIC0wLDAgKzEs MjIzIEBACisvKgorICogRnVuY3Rpb24gQ29udHJvbCBQcm90b2NvbCAoSUVDIDYxODgzLTEpIGhl bHBlciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xl bWVuc0BsYWRpc2NoLmRlPgorICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5oPgorI2luY2x1ZGUgPGxpbnV4 L2ZpcmV3aXJlLWNvbnN0YW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxp bnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgImZjcC5o IgorI2luY2x1ZGUgImxpYi5oIgorCisjZGVmaW5lIENUU19BVkMgMHgwMAorCisjZGVmaW5lIEVS Uk9SX1JFVFJJRVMJMworI2RlZmluZSBFUlJPUl9ERUxBWV9NUwk1CisjZGVmaW5lIEZDUF9USU1F T1VUX01TCTEyNQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRyYW5zYWN0aW9uc19sb2NrKTsK K3N0YXRpYyBMSVNUX0hFQUQodHJhbnNhY3Rpb25zKTsKKworZW51bSBmY3Bfc3RhdGUgeworCVNU QVRFX1BFTkRJTkcsCisJU1RBVEVfQlVTX1JFU0VULAorCVNUQVRFX0NPTVBMRVRFLAorfTsKKwor c3RydWN0IGZjcF90cmFuc2FjdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVj dCBmd191bml0ICp1bml0OworCXZvaWQgKnJlc3BvbnNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBpbnQg cmVzcG9uc2Vfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVzcG9uc2VfbWF0Y2hfYnl0ZXM7CisJZW51 bSBmY3Bfc3RhdGUgc3RhdGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKK307CisKKy8qKgor ICogZmNwX2F2Y190cmFuc2FjdGlvbiAtIHNlbmQgYW4gQVYvQyBjb21tYW5kIGFuZCB3YWl0IGZv ciBpdHMgcmVzcG9uc2UKKyAqIEB1bml0OiBhIHVuaXQgb24gdGhlIHRhcmdldCBkZXZpY2UKKyAq IEBjb21tYW5kOiBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb21tYW5kIGZyYW1lOyBtdXN0IGJl IERNQS1hYmxlCisgKiBAY29tbWFuZF9zaXplOiB0aGUgc2l6ZSBvZiBAY29tbWFuZAorICogQHJl c3BvbnNlOiBhIGJ1ZmZlciBmb3IgdGhlIHJlc3BvbnNlIGZyYW1lCisgKiBAcmVzcG9uc2Vfc2l6 ZTogdGhlIG1heGltdW0gc2l6ZSBvZiBAcmVzcG9uc2UKKyAqIEByZXNwb25zZV9tYXRjaF9ieXRl czogYSBiaXRtYXAgc3BlY2lmeWluZyB0aGUgYnl0ZXMgdXNlZCB0byBkZXRlY3QgdGhlCisgKiAg ICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3QgcmVzcG9uc2UgZnJhbWUKKyAqCisgKiBUaGlz IGZ1bmN0aW9uIHNlbmRzIGEgRkNQIGNvbW1hbmQgZnJhbWUgdG8gdGhlIHRhcmdldCBhbmQgd2Fp dHMgZm9yIHRoZQorICogY29ycmVzcG9uZGluZyByZXNwb25zZSBmcmFtZSB0byBiZSByZXR1cm5l ZC4KKyAqCisgKiBCZWNhdXNlIGl0IGlzIHBvc3NpYmxlIGZvciBtdWx0aXBsZSBGQ1AgdHJhbnNh Y3Rpb25zIHRvIGJlIGFjdGl2ZSBhdCB0aGUKKyAqIHNhbWUgdGltZSwgdGhlIGNvcnJlY3QgcmVz cG9uc2UgZnJhbWUgaXMgZGV0ZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIGNlcnRhaW4KKyAqIGJ5dGVz LiAgVGhlc2UgYnl0ZXMgbXVzdCBiZSBzZXQgaW4gQHJlc3BvbnNlIGJlZm9yZSBjYWxsaW5nIHRo aXMgZnVuY3Rpb24sCisgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYml0cyBtdXN0IGJlIHNldCBp biBAcmVzcG9uc2VfbWF0Y2hfYnl0ZXMuCisgKgorICogQGNvbW1hbmQgYW5kIEByZXNwb25zZSBj YW4gcG9pbnQgdG8gdGhlIHNhbWUgYnVmZmVyLgorICoKKyAqIEFzeW5jaHJvbm91cyBvcGVyYXRp b24gKElOVEVSSU0sIE5PVElGWSkgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LgorICoK KyAqIFJldHVybnMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZXNwb25zZSBmcmFtZSwgb3IgYSBu ZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgZmNwX2F2Y190cmFuc2FjdGlvbihzdHJ1Y3Qg ZndfdW5pdCAqdW5pdCwKKwkJCWNvbnN0IHZvaWQgKmNvbW1hbmQsIHVuc2lnbmVkIGludCBjb21t YW5kX3NpemUsCisJCQl2b2lkICpyZXNwb25zZSwgdW5zaWduZWQgaW50IHJlc3BvbnNlX3NpemUs CisJCQl1bnNpZ25lZCBpbnQgcmVzcG9uc2VfbWF0Y2hfYnl0ZXMpCit7CisJc3RydWN0IGZjcF90 cmFuc2FjdGlvbiB0OworCWludCB0Y29kZSwgcmV0LCB0cmllcyA9IDA7CisKKwl0LnVuaXQgPSB1 bml0OworCXQucmVzcG9uc2VfYnVmZmVyID0gcmVzcG9uc2U7CisJdC5yZXNwb25zZV9zaXplID0g cmVzcG9uc2Vfc2l6ZTsKKwl0LnJlc3BvbnNlX21hdGNoX2J5dGVzID0gcmVzcG9uc2VfbWF0Y2hf Ynl0ZXM7CisJdC5zdGF0ZSA9IFNUQVRFX1BFTkRJTkc7CisJaW5pdF93YWl0cXVldWVfaGVhZCgm dC53YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJnRyYW5zYWN0aW9uc19sb2NrKTsKKwlsaXN0X2Fk ZF90YWlsKCZ0Lmxpc3QsICZ0cmFuc2FjdGlvbnMpOworCXNwaW5fdW5sb2NrX2lycSgmdHJhbnNh Y3Rpb25zX2xvY2spOworCisJZm9yICg7OykgeworCQl0Y29kZSA9IGNvbW1hbmRfc2l6ZSA9PSA0 ID8gVENPREVfV1JJVEVfUVVBRExFVF9SRVFVRVNUCisJCQkJCSAgOiBUQ09ERV9XUklURV9CTE9D S19SRVFVRVNUOworCQlyZXQgPSBzbmRfZndfdHJhbnNhY3Rpb24odC51bml0LCB0Y29kZSwKKwkJ CQkJIENTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0ZDUF9DT01NQU5ELAorCQkJCQkgKHZvaWQgKilj b21tYW5kLCBjb21tYW5kX3NpemUpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXdh aXRfZXZlbnRfdGltZW91dCh0LndhaXQsIHQuc3RhdGUgIT0gU1RBVEVfUEVORElORywKKwkJCQkg ICBtc2Vjc190b19qaWZmaWVzKEZDUF9USU1FT1VUX01TKSk7CisKKwkJaWYgKHQuc3RhdGUgPT0g U1RBVEVfQ09NUExFVEUpIHsKKwkJCXJldCA9IHQucmVzcG9uc2Vfc2l6ZTsKKwkJCWJyZWFrOwor CQl9IGVsc2UgaWYgKHQuc3RhdGUgPT0gU1RBVEVfQlVTX1JFU0VUKSB7CisJCQltc2xlZXAoRVJS T1JfREVMQVlfTVMpOworCQl9IGVsc2UgaWYgKCsrdHJpZXMgPj0gRVJST1JfUkVUUklFUykgewor CQkJZGV2X2VycigmdC51bml0LT5kZXZpY2UsICJGQ1AgY29tbWFuZCB0aW1lZCBvdXRcbiIpOwor CQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycSgmdHJh bnNhY3Rpb25zX2xvY2spOworCWxpc3RfZGVsKCZ0Lmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgm dHJhbnNhY3Rpb25zX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZmNw X2F2Y190cmFuc2FjdGlvbik7CisKKy8qKgorICogZmNwX2J1c19yZXNldCAtIGluZm9ybSB0aGUg dGFyZ2V0IGhhbmRsZXIgYWJvdXQgYSBidXMgcmVzZXQKKyAqIEB1bml0OiB0aGUgdW5pdCB0aGF0 IG1pZ2h0IGJlIHVzZWQgYnkgZmNwX2F2Y190cmFuc2FjdGlvbigpCisgKgorICogVGhpcyBmdW5j dGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIncyAudXBkYXRlIGhhbmRsZXIgdG8g aW5mb3JtCisgKiB0aGUgRkNQIHRyYW5zYWN0aW9uIGhhbmRsZXIgdGhhdCBhIGJ1cyByZXNldCBo YXMgaGFwcGVuZWQuICBBbnkgcGVuZGluZyBGQ1AKKyAqIHRyYW5zYWN0aW9ucyBhcmUgcmV0cmll ZC4KKyAqLwordm9pZCBmY3BfYnVzX3Jlc2V0KHN0cnVjdCBmd191bml0ICp1bml0KQoreworCXN0 cnVjdCBmY3BfdHJhbnNhY3Rpb24gKnQ7CisKKwlzcGluX2xvY2tfaXJxKCZ0cmFuc2FjdGlvbnNf bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmdHJhbnNhY3Rpb25zLCBsaXN0KSB7CisJ CWlmICh0LT51bml0ID09IHVuaXQgJiYKKwkJICAgIHQtPnN0YXRlID09IFNUQVRFX1BFTkRJTkcp IHsKKwkJCXQtPnN0YXRlID0gU1RBVEVfQlVTX1JFU0VUOworCQkJd2FrZV91cCgmdC0+d2FpdCk7 CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0cmFuc2FjdGlvbnNfbG9jayk7Cit9CitFWFBP UlRfU1lNQk9MKGZjcF9idXNfcmVzZXQpOworCisvKiBjaGVja3Mgd2hldGhlciB0aGUgcmVzcG9u c2UgbWF0Y2hlcyB0aGUgbWFza2VkIGJ5dGVzIGluIHJlc3BvbnNlX2J1ZmZlciAqLworc3RhdGlj IGJvb2wgaXNfbWF0Y2hpbmdfcmVzcG9uc2Uoc3RydWN0IGZjcF90cmFuc2FjdGlvbiAqdHJhbnNh Y3Rpb24sCisJCQkJIGNvbnN0IHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgbGVuZ3RoKQoreworCWNv bnN0IHU4ICpwMSwgKnAyOworCXVuc2lnbmVkIGludCBtYXNrLCBpOworCisJcDEgPSByZXNwb25z ZTsKKwlwMiA9IHRyYW5zYWN0aW9uLT5yZXNwb25zZV9idWZmZXI7CisJbWFzayA9IHRyYW5zYWN0 aW9uLT5yZXNwb25zZV9tYXRjaF9ieXRlczsKKworCWZvciAoaSA9IDA7IDsgKytpKSB7CisJCWlm ICgobWFzayAmIDEpICYmIHAxW2ldICE9IHAyW2ldKQorCQkJcmV0dXJuIGZhbHNlOworCQltYXNr ID4+PSAxOworCQlpZiAoIW1hc2spCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKC0tbGVuZ3RoID09 IDApCisJCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZCBmY3BfcmVzcG9uc2Uo c3RydWN0IGZ3X2NhcmQgKmNhcmQsIHN0cnVjdCBmd19yZXF1ZXN0ICpyZXF1ZXN0LAorCQkJIGlu dCB0Y29kZSwgaW50IGRlc3RpbmF0aW9uLCBpbnQgc291cmNlLAorCQkJIGludCBnZW5lcmF0aW9u LCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LAorCQkJIHZvaWQgKmRhdGEsIHNpemVfdCBsZW5n dGgsIHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IGZjcF90cmFuc2FjdGlvbiAqdDsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxlbmd0aCA8IDEgfHwgKCooY29uc3QgdTgg KilkYXRhICYgMHhmMCkgIT0gQ1RTX0FWQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJnRyYW5zYWN0aW9uc19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAm dHJhbnNhY3Rpb25zLCBsaXN0KSB7CisJCXN0cnVjdCBmd19kZXZpY2UgKmRldmljZSA9IGZ3X3Bh cmVudF9kZXZpY2UodC0+dW5pdCk7CisJCWlmIChkZXZpY2UtPmNhcmQgIT0gY2FyZCB8fAorCQkg ICAgZGV2aWNlLT5nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pCisJCQljb250aW51ZTsKKwkJc21w X3JtYigpOyAvKiBub2RlX2lkIHZzLiBnZW5lcmF0aW9uICovCisJCWlmIChkZXZpY2UtPm5vZGVf aWQgIT0gc291cmNlKQorCQkJY29udGludWU7CisKKwkJaWYgKHQtPnN0YXRlID09IFNUQVRFX1BF TkRJTkcgJiYKKwkJICAgIGlzX21hdGNoaW5nX3Jlc3BvbnNlKHQsIGRhdGEsIGxlbmd0aCkpIHsK KwkJCXQtPnN0YXRlID0gU1RBVEVfQ09NUExFVEU7CisJCQl0LT5yZXNwb25zZV9zaXplID0gbWlu KCh1bnNpZ25lZCBpbnQpbGVuZ3RoLAorCQkJCQkgICAgICAgdC0+cmVzcG9uc2Vfc2l6ZSk7CisJ CQltZW1jcHkodC0+cmVzcG9uc2VfYnVmZmVyLCBkYXRhLCB0LT5yZXNwb25zZV9zaXplKTsKKwkJ CXdha2VfdXAoJnQtPndhaXQpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRy YW5zYWN0aW9uc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZndfYWRkcmVzc19o YW5kbGVyIHJlc3BvbnNlX3JlZ2lzdGVyX2hhbmRsZXIgPSB7CisJLmxlbmd0aCA9IDB4MjAwLAor CS5hZGRyZXNzX2NhbGxiYWNrID0gZmNwX3Jlc3BvbnNlLAorfTsKKworc3RhdGljIGludCBfX2lu aXQgZmNwX21vZHVsZV9pbml0KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBmd19hZGRy ZXNzX3JlZ2lvbiByZXNwb25zZV9yZWdpc3Rlcl9yZWdpb24gPSB7CisJCS5zdGFydCA9IENTUl9S RUdJU1RFUl9CQVNFICsgQ1NSX0ZDUF9SRVNQT05TRSwKKwkJLmVuZCA9IENTUl9SRUdJU1RFUl9C QVNFICsgQ1NSX0ZDUF9FTkQsCisJfTsKKworCWZ3X2NvcmVfYWRkX2FkZHJlc3NfaGFuZGxlcigm cmVzcG9uc2VfcmVnaXN0ZXJfaGFuZGxlciwKKwkJCQkgICAgJnJlc3BvbnNlX3JlZ2lzdGVyX3Jl Z2lvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZjcF9tb2R1bGVf ZXhpdCh2b2lkKQoreworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnRyYW5zYWN0aW9ucykpOworCWZ3 X2NvcmVfcmVtb3ZlX2FkZHJlc3NfaGFuZGxlcigmcmVzcG9uc2VfcmVnaXN0ZXJfaGFuZGxlcik7 Cit9CisKK21vZHVsZV9pbml0KGZjcF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChmY3BfbW9k dWxlX2V4aXQpOwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZjcC5oCkBAIC0w LDAgKzEsMTIgQEAKKyNpZm5kZWYgU09VTkRfRklSRVdJUkVfRkNQX0hfSU5DTFVERUQKKyNkZWZp bmUgU09VTkRfRklSRVdJUkVfRkNQX0hfSU5DTFVERUQKKworc3RydWN0IGZ3X3VuaXQ7CisKK2lu dCBmY3BfYXZjX3RyYW5zYWN0aW9uKHN0cnVjdCBmd191bml0ICp1bml0LAorCQkJY29uc3Qgdm9p ZCAqY29tbWFuZCwgdW5zaWduZWQgaW50IGNvbW1hbmRfc2l6ZSwKKwkJCXZvaWQgKnJlc3BvbnNl LCB1bnNpZ25lZCBpbnQgcmVzcG9uc2Vfc2l6ZSwKKwkJCXVuc2lnbmVkIGludCByZXNwb25zZV9t YXRjaF9ieXRlcyk7Cit2b2lkIGZjcF9idXNfcmVzZXQoc3RydWN0IGZ3X3VuaXQgKnVuaXQpOwor CisjZW5kaWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9zcGVha2Vycy5jCkBA IC0wLDAgKzEsNDg0IEBACisvKgorICogT1hGVzk3MC1iYXNlZCBzcGVha2VycyBkcml2ZXIKKyAq CisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgor ICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNs dWRlIDxsaW51eC9maXJld2lyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLWNvbnN0YW50 cy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZp Y2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xh Yi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+ CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSAiY21wLmgiCisjaW5jbHVkZSAiZmNw LmgiCisjaW5jbHVkZSAiYW1kdHAuaCIKKyNpbmNsdWRlICJsaWIuaCIKKworI2RlZmluZSBPWEZP UkRfRklSTVdBUkVfSURfQUREUkVTUwkoQ1NSX1JFR0lTVEVSX0JBU0UgKyAweDUwMDAwKQorLyog MHg5NzA/dnZ2diBvciAweDk3MT92dnZ2LCB3aGVyZSB2dnZ2ID0gZmlybXdhcmUgdmVyc2lvbiAq LworCisjZGVmaW5lIE9YRk9SRF9IQVJEV0FSRV9JRF9BRERSRVNTCShDU1JfUkVHSVNURVJfQkFT RSArIDB4OTAwMjApCisjZGVmaW5lIE9YRk9SRF9IQVJEV0FSRV9JRF9PWEZXOTcwCTB4Mzk0NDM4 NDEKKyNkZWZpbmUgT1hGT1JEX0hBUkRXQVJFX0lEX09YRlc5NzEJMHgzOTM3MzEwMAorCisjZGVm aW5lIFZFTkRPUl9HUklGRklOCQkweDAwMTI5MgorI2RlZmluZSBWRU5ET1JfTEFDSUUJCTB4MDBk MDRiCisKKyNkZWZpbmUgU1BFQ0lGSUVSXzEzOTRUQQkweDAwYTAyZAorI2RlZmluZSBWRVJTSU9O X0FWQwkJMHgwMTAwMDEKKworc3RydWN0IGRldmljZV9pbmZvIHsKKwljb25zdCBjaGFyICpkcml2 ZXJfbmFtZTsKKwljb25zdCBjaGFyICpzaG9ydF9uYW1lOworCWNvbnN0IGNoYXIgKmxvbmdfbmFt ZTsKKwl1bnNpZ25lZCBpbnQgcmF0ZXM7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzX21heDsKK307 CisKK3N0cnVjdCBmd3NwayB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBmd191 bml0ICp1bml0OworCWNvbnN0IHN0cnVjdCBkZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisJc3Ry dWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY207CisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVj dCBjbXBfY29ubmVjdGlvbiBjb25uZWN0aW9uOworCXN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtIHN0 cmVhbTsKKwlib29sIHN0cmVhbV9ydW5uaW5nOworfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJG aXJlV2lyZSBzcGVha2VycyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkNsZW1lbnMgTGFkaXNj aCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCitz dGF0aWMgaW50IGZ3c3BrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0p Cit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGhhcmR3YXJlID0gewor CQkuaW5mbyA9IFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJU05EUlZfUENNX0lORk9fTU1BUF9W QUxJRCB8CisJCQlTTkRSVl9QQ01fSU5GT19CQVRDSCB8CisJCQlTTkRSVl9QQ01fSU5GT19JTlRF UkxFQVZFRCB8CisJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiwKKwkJLmZvcm1hdHMg PSBBTURUUF9PVVRfUENNX0ZPUk1BVF9CSVRTLAorCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmJ1 ZmZlcl9ieXRlc19tYXggPSAxNiAqIDEwMjQgKiAxMDI0LAorCQkucGVyaW9kX2J5dGVzX21pbiA9 IDEsCisJCS5wZXJpb2RfYnl0ZXNfbWF4ID0gVUlOVF9NQVgsCisJCS5wZXJpb2RzX21pbiA9IDEs CisJCS5wZXJpb2RzX21heCA9IFVJTlRfTUFYLAorCX07CisJc3RydWN0IGZ3c3BrICpmd3NwayA9 IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBlcnI7CisKKwlzdWJzdHJlYW0tPnJ1bnRp bWUtPmh3ID0gaGFyZHdhcmU7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5ody5yYXRlcyAgICAgICAg PSBmd3Nway0+ZGV2aWNlX2luZm8tPnJhdGVzOworCXN1YnN0cmVhbS0+cnVudGltZS0+aHcuY2hh bm5lbHNfbWF4ID0gZndzcGstPmRldmljZV9pbmZvLT5jaGFubmVsc19tYXg7CisKKwllcnIgPSBz bmRfcGNtX2xpbWl0X2h3X3JhdGVzKHN1YnN0cmVhbS0+cnVudGltZSk7CisJaWYgKGVyciA8IDAp CisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChzdWJz dHJlYW0tPnJ1bnRpbWUsIDAsCisJCQkJCSBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIDIp OworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc25kX3BjbV9od19jb25z dHJhaW50X21pbm1heChzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQkJCSAgIFNORFJWX1BDTV9IV19Q QVJBTV9QRVJJT0RfVElNRSwKKwkJCQkJICAgNTAwMCwgODE5MjAwMCk7CisJaWYgKGVyciA8IDAp CisJCXJldHVybiBlcnI7CisKKwllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHN1 YnN0cmVhbS0+cnVudGltZSwgMCwgMzIsIDI0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVy cjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3c3BrX2Nsb3NlKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBmd3Nwa19zdG9wX3N0cmVhbShzdHJ1Y3QgZndzcGsgKmZ3c3BrKQoreworCWlmIChmd3Nway0+ c3RyZWFtX3J1bm5pbmcpIHsKKwkJYW1kdHBfb3V0X3N0cmVhbV9zdG9wKCZmd3Nway0+c3RyZWFt KTsKKwkJY21wX2Nvbm5lY3Rpb25fYnJlYWsoJmZ3c3BrLT5jb25uZWN0aW9uKTsKKwkJZndzcGst PnN0cmVhbV9ydW5uaW5nID0gZmFsc2U7CisJfQorfQorCitzdGF0aWMgaW50IGZ3c3BrX3NldF9y YXRlKHN0cnVjdCBmd3NwayAqZndzcGssIHVuc2lnbmVkIGludCBzZmMpCit7CisJdTggKmJ1ZjsK KwlpbnQgZXJyOworCisJYnVmID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZbMF0gPSAweDAwOwkJLyogQVYvQywgQ09OVFJPTCAq LworCWJ1ZlsxXSA9IDB4ZmY7CQkvKiB1bml0ICovCisJYnVmWzJdID0gMHgxOTsJCS8qIElOUFVU IFBMVUcgU0lHTkFMIEZPUk1BVCAqLworCWJ1ZlszXSA9IDB4MDA7CQkvKiBwbHVnIDAgKi8KKwli dWZbNF0gPSAweDkwOwkJLyogZm9ybWF0OiBhdWRpbyAqLworCWJ1Zls1XSA9IDB4MDAgfCBzZmM7 CS8qIEFNODI0LCBmcmVxdWVuY3kgKi8KKwlidWZbNl0gPSAweGZmOwkJLyogU1lUIChub3QgdXNl ZCkgKi8KKwlidWZbN10gPSAweGZmOworCisJZXJyID0gZmNwX2F2Y190cmFuc2FjdGlvbihmd3Nw ay0+dW5pdCwgYnVmLCA4LCBidWYsIDgsCisJCQkJICBCSVQoMSkgfCBCSVQoMikgfCBCSVQoMykg fCBCSVQoNCkgfCBCSVQoNSkpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChl cnIgPCA2IHx8IGJ1ZlswXSAhPSAweDA5IC8qIEFDQ0VQVEVEICovKSB7CisJCWRldl9lcnIoJmZ3 c3BrLT51bml0LT5kZXZpY2UsICJmYWlsZWQgdG8gc2V0IHNhbXBsZSByYXRlXG4iKTsKKwkJZXJy ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisKKwllcnIgPSAwOworCitlcnJvcjoKKwlrZnJl ZShidWYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmd3Nwa19od19wYXJhbXMo c3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3Qgc25kX3Bj bV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sKKwlzdHJ1Y3QgZndzcGsgKmZ3c3BrID0gc3Vic3Ry ZWFtLT5wcml2YXRlX2RhdGE7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmZ3c3BrLT5tdXRl eCk7CisJZndzcGtfc3RvcF9zdHJlYW0oZndzcGspOworCW11dGV4X3VubG9jaygmZndzcGstPm11 dGV4KTsKKworCWVyciA9IHNuZF9wY21fbGliX2FsbG9jX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVh bSwKKwkJCQkJICAgICAgIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJaWYgKGVy ciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlhbWR0cF9vdXRfc3RyZWFtX3NldF9yYXRlKCZmd3Nw ay0+c3RyZWFtLCBwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKKwlhbWR0cF9vdXRfc3RyZWFtX3Nl dF9wY20oJmZ3c3BrLT5zdHJlYW0sIHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpKTsKKworCWVy ciA9IGZ3c3BrX3NldF9yYXRlKGZ3c3BrLCBmd3Nway0+c3RyZWFtLnNmYyk7CisJaWYgKGVyciA8 IDApCisJCWdvdG8gZXJyX2J1ZmZlcjsKKworCXJldHVybiAwOworCitlcnJfYnVmZmVyOgorCXNu ZF9wY21fbGliX2ZyZWVfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtKTsKK2Vycm9yOgorCXJldHVy biBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZndzcGtfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgZndzcGsgKmZ3c3BrID0gc3Vic3RyZWFtLT5w cml2YXRlX2RhdGE7CisKKwltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOworCWZ3c3BrX3N0b3Bf c3RyZWFtKGZ3c3BrKTsKKwltdXRleF91bmxvY2soJmZ3c3BrLT5tdXRleCk7CisKKwlyZXR1cm4g c25kX3BjbV9saWJfZnJlZV92bWFsbG9jX2J1ZmZlcihzdWJzdHJlYW0pOworfQorCitzdGF0aWMg aW50IGZ3c3BrX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7 CisJc3RydWN0IGZ3c3BrICpmd3NwayA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCWludCBl cnI7CisKKwltdXRleF9sb2NrKCZmd3Nway0+bXV0ZXgpOworCisJaWYgKCFmd3Nway0+c3RyZWFt X3J1bm5pbmcpIHsKKwkJZXJyID0gY21wX2Nvbm5lY3Rpb25fZXN0YWJsaXNoKCZmd3Nway0+Y29u bmVjdGlvbiwKKwkJCWFtZHRwX291dF9zdHJlYW1fZ2V0X21heF9wYXlsb2FkKCZmd3Nway0+c3Ry ZWFtKSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJfbXV0ZXg7CisKKwkJZXJyID0gYW1k dHBfb3V0X3N0cmVhbV9zdGFydCgmZndzcGstPnN0cmVhbSwKKwkJCQkJZndzcGstPmNvbm5lY3Rp b24ucmVzb3VyY2VzLmNoYW5uZWwsCisJCQkJCWZ3c3BrLT5jb25uZWN0aW9uLnNwZWVkKTsKKwkJ aWYgKGVyciA8IDApCisJCQlnb3RvIGVycl9jb25uZWN0aW9uOworCisJCWZ3c3BrLT5zdHJlYW1f cnVubmluZyA9IHRydWU7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmd3Nway0+bXV0ZXgpOworCisJ YW1kdHBfb3V0X3N0cmVhbV9wY21fcHJlcGFyZSgmZndzcGstPnN0cmVhbSk7CisKKwlyZXR1cm4g MDsKKworZXJyX2Nvbm5lY3Rpb246CisJY21wX2Nvbm5lY3Rpb25fYnJlYWsoJmZ3c3BrLT5jb25u ZWN0aW9uKTsKK2Vycl9tdXRleDoKKwltdXRleF91bmxvY2soJmZ3c3BrLT5tdXRleCk7CisKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ3c3BrX3RyaWdnZXIoc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJc3RydWN0IGZ3c3BrICpmd3NwayA9 IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNt OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCQlw Y20gPSBzdWJzdHJlYW07CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoK KwkJcGNtID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCWFtZHRwX291dF9zdHJlYW1fcGNtX3RyaWdnZXIoJmZ3c3BrLT5zdHJlYW0sIHBjbSk7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBmd3Nwa19wb2ludGVyKHN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBmd3NwayAqZndz cGsgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBhbWR0cF9vdXRfc3RyZWFt X3BjbV9wb2ludGVyKCZmd3Nway0+c3RyZWFtKTsKK30KKworc3RhdGljIGludCBmd3Nwa19jcmVh dGVfcGNtKHN0cnVjdCBmd3NwayAqZndzcGspCit7CisJc3RhdGljIHN0cnVjdCBzbmRfcGNtX29w cyBvcHMgPSB7CisJCS5vcGVuICAgICAgPSBmd3Nwa19vcGVuLAorCQkuY2xvc2UgICAgID0gZndz cGtfY2xvc2UsCisJCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkJLmh3X3BhcmFt cyA9IGZ3c3BrX2h3X3BhcmFtcywKKwkJLmh3X2ZyZWUgICA9IGZ3c3BrX2h3X2ZyZWUsCisJCS5w cmVwYXJlICAgPSBmd3Nwa19wcmVwYXJlLAorCQkudHJpZ2dlciAgID0gZndzcGtfdHJpZ2dlciwK KwkJLnBvaW50ZXIgICA9IGZ3c3BrX3BvaW50ZXIsCisJCS5wYWdlICAgICAgPSBzbmRfcGNtX2xp Yl9nZXRfdm1hbGxvY19wYWdlLAorCQkubW1hcCAgICAgID0gc25kX3BjbV9saWJfbW1hcF92bWFs bG9jLAorCX07CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlpbnQgZXJyOworCisJZXJyID0gc25k X3BjbV9uZXcoZndzcGstPmNhcmQsICJPWEZXOTcwIiwgMCwgMSwgMCwgJnBjbSk7CisJaWYgKGVy ciA8IDApCisJCXJldHVybiBlcnI7CisJcGNtLT5wcml2YXRlX2RhdGEgPSBmd3NwazsKKwlzdHJj cHkocGNtLT5uYW1lLCBmd3Nway0+ZGV2aWNlX2luZm8tPnNob3J0X25hbWUpOworCWZ3c3BrLT5w Y20gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwor CWZ3c3BrLT5wY20tPm9wcyA9ICZvcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZndz cGtfcmVhZF9maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBmd191bml0ICp1bml0KQoreworCV9fYmUz MiBkYXRhOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfZndfdHJhbnNhY3Rpb24odW5pdCwgVENP REVfUkVBRF9RVUFETEVUX1JFUVVFU1QsCisJCQkJIE9YRk9SRF9GSVJNV0FSRV9JRF9BRERSRVNT LCAmZGF0YSwgNCk7CisJcmV0dXJuIGVyciA+PSAwID8gYmUzMl90b19jcHUoZGF0YSkgOiAwOwor fQorCitzdGF0aWMgdm9pZCBmd3Nwa19jYXJkX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQor eworCXN0cnVjdCBmd3NwayAqZndzcGsgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisKKwlhbWR0cF9v dXRfc3RyZWFtX2Rlc3Ryb3koJmZ3c3BrLT5zdHJlYW0pOworCWNtcF9jb25uZWN0aW9uX2Rlc3Ry b3koJmZ3c3BrLT5jb25uZWN0aW9uKTsKKwlmd191bml0X3B1dChmd3Nway0+dW5pdCk7CisJbXV0 ZXhfZGVzdHJveSgmZndzcGstPm11dGV4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZp Y2VfaW5mbyAqX19kZXZpbml0IGZ3c3BrX2RldGVjdChzdHJ1Y3QgZndfZGV2aWNlICpkZXYpCit7 CisJc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZpY2VfaW5mbyBncmlmZmluX2ZpcmV3YXZlID0gewor CQkuZHJpdmVyX25hbWUgPSAiRmlyZVdhdmUiLAorCQkuc2hvcnRfbmFtZSA9ICJGaXJlV2F2ZSIs CisJCS5sb25nX25hbWUgPSAiR3JpZmZpbiBGaXJlV2F2ZSBTdXJyb3VuZCIsCisJCS5yYXRlcyA9 IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkg U05EUlZfUENNX1JBVEVfNDgwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzk2MDAwLAorCQkuY2hh bm5lbHNfbWF4ID0gNiwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX2luZm8gbGFj aWVfc3BlYWtlcnMgPSB7CisJCS5kcml2ZXJfbmFtZSA9ICJGV1NwZWFrZXJzIiwKKwkJLnNob3J0 X25hbWUgPSAiRmlyZXdpcmUgU3BlYWtlcnMiLAorCQkubG9uZ19uYW1lID0gIkxhQ2llIEZpcmV3 aXJlIFNwZWFrZXJzIiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMzIwMDAgfAorCQkJIFNO RFJWX1BDTV9SQVRFXzQ0MTAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8CisJCQkgU05E UlZfUENNX1JBVEVfODgyMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzk2MDAwLAorCQkuY2hhbm5l bHNfbWF4ID0gMiwKKwl9OworCXN0cnVjdCBmd19jc3JfaXRlcmF0b3IgaTsKKwlpbnQga2V5LCB2 YWx1ZTsKKworCWZ3X2Nzcl9pdGVyYXRvcl9pbml0KCZpLCBkZXYtPmNvbmZpZ19yb20pOworCXdo aWxlIChmd19jc3JfaXRlcmF0b3JfbmV4dCgmaSwgJmtleSwgJnZhbHVlKSkKKwkJaWYgKGtleSA9 PSBDU1JfVkVORE9SKQorCQkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBWRU5ET1JfR1JJRkZJ TjoKKwkJCQlyZXR1cm4gJmdyaWZmaW5fZmlyZXdhdmU7CisJCQljYXNlIFZFTkRPUl9MQUNJRToK KwkJCQlyZXR1cm4gJmxhY2llX3NwZWFrZXJzOworCQkJfQorCisJcmV0dXJuIE5VTEw7Cit9CisK K3N0YXRpYyBpbnQgX19kZXZpbml0IGZ3c3BrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnVuaXRfZGV2 KQoreworCXN0cnVjdCBmd191bml0ICp1bml0ID0gZndfdW5pdCh1bml0X2Rldik7CisJc3RydWN0 IGZ3X2RldmljZSAqZndfZGV2ID0gZndfcGFyZW50X2RldmljZSh1bml0KTsKKwlzdHJ1Y3Qgc25k X2NhcmQgKmNhcmQ7CisJc3RydWN0IGZ3c3BrICpmd3NwazsKKwl1MzIgZmlybXdhcmU7CisJaW50 IGVycjsKKworCWVyciA9IHNuZF9jYXJkX2NyZWF0ZSgtMSwgTlVMTCwgVEhJU19NT0RVTEUsIHNp emVvZigqZndzcGspLCAmY2FyZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJc25k X2NhcmRfc2V0X2RldihjYXJkLCB1bml0X2Rldik7CisKKwlmd3NwayA9IGNhcmQtPnByaXZhdGVf ZGF0YTsKKwlmd3Nway0+Y2FyZCA9IGNhcmQ7CisJbXV0ZXhfaW5pdCgmZndzcGstPm11dGV4KTsK Kwlmd3Nway0+dW5pdCA9IGZ3X3VuaXRfZ2V0KHVuaXQpOworCWZ3c3BrLT5kZXZpY2VfaW5mbyA9 IGZ3c3BrX2RldGVjdChmd19kZXYpOworCWlmICghZndzcGstPmRldmljZV9pbmZvKSB7CisJCWVy ciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VuaXQ7CisJfQorCisJZXJyID0gY21wX2Nvbm5lY3Rp b25faW5pdCgmZndzcGstPmNvbm5lY3Rpb24sIHVuaXQsIDApOworCWlmIChlcnIgPCAwKQorCQln b3RvIGVycl91bml0OworCisJZXJyID0gYW1kdHBfb3V0X3N0cmVhbV9pbml0KCZmd3Nway0+c3Ry ZWFtLCB1bml0LCBDSVBfTk9OQkxPQ0tJTkcpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9j b25uZWN0aW9uOworCisJY2FyZC0+cHJpdmF0ZV9mcmVlID0gZndzcGtfY2FyZF9mcmVlOworCisJ c3RyY3B5KGNhcmQtPmRyaXZlciwgZndzcGstPmRldmljZV9pbmZvLT5kcml2ZXJfbmFtZSk7CisJ c3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgZndzcGstPmRldmljZV9pbmZvLT5zaG9ydF9uYW1lKTsK KwlmaXJtd2FyZSA9IGZ3c3BrX3JlYWRfZmlybXdhcmVfdmVyc2lvbih1bml0KTsKKwlzbnByaW50 ZihjYXJkLT5sb25nbmFtZSwgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSwKKwkJICIlcyAoT1hGVyV4 ICUwNHgpLCBHVUlEICUwOHglMDh4IGF0ICVzLCBTJWQiLAorCQkgZndzcGstPmRldmljZV9pbmZv LT5sb25nX25hbWUsCisJCSBmaXJtd2FyZSA+PiAyMCwgZmlybXdhcmUgJiAweGZmZmYsCisJCSBm d19kZXYtPmNvbmZpZ19yb21bM10sIGZ3X2Rldi0+Y29uZmlnX3JvbVs0XSwKKwkJIGRldl9uYW1l KCZ1bml0LT5kZXZpY2UpLCAxMDAgPDwgZndfZGV2LT5tYXhfc3BlZWQpOworCXN0cmNweShjYXJk LT5taXhlcm5hbWUsICJPWEZXOTcwIik7CisKKwllcnIgPSBmd3Nwa19jcmVhdGVfcGNtKGZ3c3Br KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHNuZF9jYXJkX3JlZ2lz dGVyKGNhcmQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJZGV2X3NldF9kcnZk YXRhKHVuaXRfZGV2LCBmd3Nwayk7CisKKwlyZXR1cm4gMDsKKworZXJyX2Nvbm5lY3Rpb246CisJ Y21wX2Nvbm5lY3Rpb25fZGVzdHJveSgmZndzcGstPmNvbm5lY3Rpb24pOworZXJyX3VuaXQ6CisJ ZndfdW5pdF9wdXQoZndzcGstPnVuaXQpOworCW11dGV4X2Rlc3Ryb3koJmZ3c3BrLT5tdXRleCk7 CitlcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBpbnQgX19kZXZleGl0IGZ3c3BrX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3Ry dWN0IGZ3c3BrICpmd3NwayA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc25kX2NhcmRfZGlz Y29ubmVjdChmd3Nway0+Y2FyZCk7CisJc25kX2NhcmRfZnJlZV93aGVuX2Nsb3NlZChmd3Nway0+ Y2FyZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZ3c3BrX2J1c19yZXNldChzdHJ1 Y3QgZndfdW5pdCAqdW5pdCkKK3sKKwlzdHJ1Y3QgZndzcGsgKmZ3c3BrID0gZGV2X2dldF9kcnZk YXRhKCZ1bml0LT5kZXZpY2UpOworCisJZmNwX2J1c19yZXNldChmd3Nway0+dW5pdCk7CisKKwlp ZiAoY21wX2Nvbm5lY3Rpb25fdXBkYXRlKCZmd3Nway0+Y29ubmVjdGlvbikgPCAwKSB7CisJCW11 dGV4X2xvY2soJmZ3c3BrLT5tdXRleCk7CisJCWFtZHRwX291dF9zdHJlYW1fcGNtX2Fib3J0KCZm d3Nway0+c3RyZWFtKTsKKwkJZndzcGtfc3RvcF9zdHJlYW0oZndzcGspOworCQltdXRleF91bmxv Y2soJmZ3c3BrLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlhbWR0cF9vdXRfc3RyZWFtX3Vw ZGF0ZSgmZndzcGstPnN0cmVhbSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTEzOTRf ZGV2aWNlX2lkIGZ3c3BrX2lkX3RhYmxlW10gPSB7CisJeworCQkubWF0Y2hfZmxhZ3MgID0gSUVF RTEzOTRfTUFUQ0hfVkVORE9SX0lEIHwKKwkJCQlJRUVFMTM5NF9NQVRDSF9NT0RFTF9JRCB8CisJ CQkJSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwKKwkJCQlJRUVFMTM5NF9NQVRDSF9WRVJT SU9OLAorCQkudmVuZG9yX2lkICAgID0gVkVORE9SX0dSSUZGSU4sCisJCS5tb2RlbF9pZCAgICAg PSAweDAwZjk3MCwKKwkJLnNwZWNpZmllcl9pZCA9IFNQRUNJRklFUl8xMzk0VEEsCisJCS52ZXJz aW9uICAgICAgPSBWRVJTSU9OX0FWQywKKwl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzICA9IElFRUUx Mzk0X01BVENIX1ZFTkRPUl9JRCB8CisJCQkJSUVFRTEzOTRfTUFUQ0hfTU9ERUxfSUQgfAorCQkJ CUlFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8CisJCQkJSUVFRTEzOTRfTUFUQ0hfVkVSU0lP TiwKKwkJLnZlbmRvcl9pZCAgICA9IFZFTkRPUl9MQUNJRSwKKwkJLm1vZGVsX2lkICAgICA9IDB4 MDBmOTcwLAorCQkuc3BlY2lmaWVyX2lkID0gU1BFQ0lGSUVSXzEzOTRUQSwKKwkJLnZlcnNpb24g ICAgICA9IFZFUlNJT05fQVZDLAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShp ZWVlMTM5NCwgZndzcGtfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGZ3X2RyaXZlciBmd3Nw a19kcml2ZXIgPSB7CisJLmRyaXZlciAgID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJ Lm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLmJ1cwk9ICZmd19idXNfdHlwZSwKKwkJLnByb2Jl CT0gZndzcGtfcHJvYmUsCisJCS5yZW1vdmUJPSBfX2RldmV4aXRfcChmd3Nwa19yZW1vdmUpLAor CX0sCisJLnVwZGF0ZSAgID0gZndzcGtfYnVzX3Jlc2V0LAorCS5pZF90YWJsZSA9IGZ3c3BrX2lk X3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWxzYV9md3Nwa19pbml0KHZvaWQpCit7 CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZndzcGtfZHJpdmVyLmRyaXZlcik7Cit9CisKK3N0 YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2Z3c3BrX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdp c3RlcigmZndzcGtfZHJpdmVyLmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFsc2FfZndzcGtf aW5pdCk7Cittb2R1bGVfZXhpdChhbHNhX2Z3c3BrX2V4aXQpOwotLS0gL2Rldi9udWxsCisrKyBi L3NvdW5kL2ZpcmV3aXJlL2xpYi5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBtaXNjZWxsYW5l b3VzIGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNj aCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRl IDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxp bnV4L2ZpcmV3aXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAibGli LmgiCisKKyNkZWZpbmUgRVJST1JfUkVUUllfREVMQVlfTVMJNQorCitjb25zdCBjaGFyICpyY29k ZV9zdHJpbmcodW5zaWduZWQgaW50IHJjb2RlKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25z dCBuYW1lc1tdID0geworCQlbUkNPREVfQ09NUExFVEVdCT0gImNvbXBsZXRlIiwKKwkJW1JDT0RF X0NPTkZMSUNUX0VSUk9SXQk9ICJjb25mbGljdCBlcnJvciIsCisJCVtSQ09ERV9EQVRBX0VSUk9S XQk9ICJkYXRhIGVycm9yIiwKKwkJW1JDT0RFX1RZUEVfRVJST1JdCT0gInR5cGUgZXJyb3IiLAor CQlbUkNPREVfQUREUkVTU19FUlJPUl0JPSAiYWRkcmVzcyBlcnJvciIsCisJCVtSQ09ERV9TRU5E X0VSUk9SXQk9ICJzZW5kIGVycm9yIiwKKwkJW1JDT0RFX0NBTkNFTExFRF0JPSAiY2FuY2VsbGVk IiwKKwkJW1JDT0RFX0JVU1ldCQk9ICJidXN5IiwKKwkJW1JDT0RFX0dFTkVSQVRJT05dCT0gImdl bmVyYXRpb24iLAorCQlbUkNPREVfTk9fQUNLXQkJPSAibm8gYWNrIiwKKwl9OworCisJaWYgKHJj b2RlIDwgQVJSQVlfU0laRShuYW1lcykgJiYgbmFtZXNbcmNvZGVdKQorCQlyZXR1cm4gbmFtZXNb cmNvZGVdOworCWVsc2UKKwkJcmV0dXJuICJ1bmtub3duIjsKK30KK0VYUE9SVF9TWU1CT0wocmNv ZGVfc3RyaW5nKTsKKworaW50IHNuZF9md190cmFuc2FjdGlvbihzdHJ1Y3QgZndfdW5pdCAqdW5p dCwgaW50IHRjb2RlLAorCQkgICAgICAgdTY0IG9mZnNldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qg bGVuZ3RoKQoreworCXN0cnVjdCBmd19kZXZpY2UgKmRldmljZSA9IGZ3X3BhcmVudF9kZXZpY2Uo dW5pdCk7CisJaW50IGdlbmVyYXRpb24sIHJjb2RlLCB0cmllcyA9IDA7CisKKwlmb3IgKDs7KSB7 CisJCWdlbmVyYXRpb24gPSBkZXZpY2UtPmdlbmVyYXRpb247CisJCXNtcF9ybWIoKTsgLyogbm9k ZV9pZCB2cy4gZ2VuZXJhdGlvbiAqLworCQlyY29kZSA9IGZ3X3J1bl90cmFuc2FjdGlvbihkZXZp Y2UtPmNhcmQsIHRjb2RlLAorCQkJCQkgICBkZXZpY2UtPm5vZGVfaWQsIGdlbmVyYXRpb24sCisJ CQkJCSAgIGRldmljZS0+bWF4X3NwZWVkLCBvZmZzZXQsCisJCQkJCSAgIGJ1ZmZlciwgbGVuZ3Ro KTsKKworCQlpZiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpCisJCQlyZXR1cm4gMDsKKworCQlp ZiAocmNvZGVfaXNfcGVybWFuZW50X2Vycm9yKHJjb2RlKSB8fCArK3RyaWVzID49IDMpIHsKKwkJ CWRldl9lcnIoJnVuaXQtPmRldmljZSwgInRyYW5zYWN0aW9uIGZhaWxlZDogJXNcbiIsCisJCQkJ cmNvZGVfc3RyaW5nKHJjb2RlKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCW1zbGVlcChF UlJPUl9SRVRSWV9ERUxBWV9NUyk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzbmRfZndfdHJhbnNh Y3Rpb24pOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkZpcmVXaXJlIGF1ZGlvIGhlbHBlciBmdW5j dGlvbnMiKTsKK01PRFVMRV9BVVRIT1IoIkNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2No LmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotLS0gL2Rldi9udWxsCisrKyBiL3Nv dW5kL2ZpcmV3aXJlL2xpYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgU09VTkRfRklSRVdJ UkVfTElCX0hfSU5DTFVERUQKKyNkZWZpbmUgU09VTkRfRklSRVdJUkVfTElCX0hfSU5DTFVERUQK KworI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oPgorI2luY2x1ZGUgPGxpbnV4 L3R5cGVzLmg+CisKK3N0cnVjdCBmd191bml0OworCitpbnQgc25kX2Z3X3RyYW5zYWN0aW9uKHN0 cnVjdCBmd191bml0ICp1bml0LCBpbnQgdGNvZGUsCisJCSAgICAgICB1NjQgb2Zmc2V0LCB2b2lk ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworY29uc3QgY2hhciAqcmNvZGVfc3RyaW5nKHVuc2ln bmVkIGludCByY29kZSk7CisKKy8qIHJldHVybnMgdHJ1ZSBpZiByZXRyeWluZyB0aGUgdHJhbnNh Y3Rpb24gd291bGQgbm90IG1ha2Ugc2Vuc2UgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByY29kZV9p c19wZXJtYW5lbnRfZXJyb3IoaW50IHJjb2RlKQoreworCXJldHVybiByY29kZSA9PSBSQ09ERV9U WVBFX0VSUk9SIHx8IHJjb2RlID09IFJDT0RFX0FERFJFU1NfRVJST1I7Cit9CisKKyNlbmRpZgot LS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYwpAQCAtMCww ICsxLDIyNCBAQAorLyoKKyAqIGlzb2Nocm9ub3VzIHJlc291cmNlcyBoZWxwZXIgZnVuY3Rpb25z CisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5k ZT4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25z dGFudHMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0 ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+CisjaW5jbHVkZSAiaXNvLXJlc291cmNlcy5oIgorCisvKioKKyAqIGZ3X2lzb19yZXNvdXJj ZXNfaW5pdCAtIGluaXRpYWxpemVzIGEgJnN0cnVjdCBmd19pc29fcmVzb3VyY2VzCisgKiBAcjog dGhlIHJlc291cmNlIG1hbmFnZXIgdG8gaW5pdGlhbGl6ZQorICogQHVuaXQ6IHRoZSBkZXZpY2Ug dW5pdCBmb3Igd2hpY2ggdGhlIHJlc291cmNlcyB3aWxsIGJlIG5lZWRlZAorICoKKyAqIElmIHRo ZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhbGwgY2hhbm5lbCBudW1iZXJzLCBjaGFuZ2UgQHIt PmNoYW5uZWxzX21hc2sKKyAqIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLwordm9p ZCBmd19pc29fcmVzb3VyY2VzX2luaXQoc3RydWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIsIHN0cnVj dCBmd191bml0ICp1bml0KQoreworCXItPmNoYW5uZWxzX21hc2sgPSB+MHVMTDsKKwlyLT51bml0 ID0gZndfdW5pdF9nZXQodW5pdCk7CisJbXV0ZXhfaW5pdCgmci0+bXV0ZXgpOworCXItPmFsbG9j YXRlZCA9IGZhbHNlOworfQorCisvKioKKyAqIGZ3X2lzb19yZXNvdXJjZXNfZGVzdHJveSAtIGRl c3Ryb3kgYSByZXNvdXJjZSBtYW5hZ2VyCisgKiBAcjogdGhlIHJlc291cmNlIG1hbmFnZXIgdGhh dCBpcyBubyBsb25nZXIgbmVlZGVkCisgKi8KK3ZvaWQgZndfaXNvX3Jlc291cmNlc19kZXN0cm95 KHN0cnVjdCBmd19pc29fcmVzb3VyY2VzICpyKQoreworCVdBUk5fT04oci0+YWxsb2NhdGVkKTsK KwltdXRleF9kZXN0cm95KCZyLT5tdXRleCk7CisJZndfdW5pdF9wdXQoci0+dW5pdCk7Cit9CisK K3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFja2V0X2JhbmR3aWR0aCh1bnNpZ25lZCBpbnQgbWF4X3Bh eWxvYWRfYnl0ZXMsIGludCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIHM0MDBfYnl0 ZXM7CisKKwkvKiBpc28gcGFja2V0cyBoYXZlIHRocmVlIGhlYWRlciBxdWFkbGV0cyBhbmQgcXVh ZGxldC1hbGlnbmVkIHBheWxvYWQgKi8KKwlieXRlcyA9IDMgKiA0ICsgQUxJR04obWF4X3BheWxv YWRfYnl0ZXMsIDQpOworCisJLyogY29udmVydCB0byBiYW5kd2lkdGggdW5pdHMgKHF1YWRsZXRz IGF0IFMxNjAwID0gYnl0ZXMgYXQgUzQwMCkgKi8KKwlpZiAoc3BlZWQgPD0gU0NPREVfNDAwKQor CQlzNDAwX2J5dGVzID0gYnl0ZXMgKiAoMSA8PCAoU0NPREVfNDAwIC0gc3BlZWQpKTsKKwllbHNl CisJCXM0MDBfYnl0ZXMgPSBESVZfUk9VTkRfVVAoYnl0ZXMsIDEgPDwgKHNwZWVkIC0gU0NPREVf NDAwKSk7CisKKwlyZXR1cm4gczQwMF9ieXRlczsKK30KKworc3RhdGljIGludCBjdXJyZW50X2Jh bmR3aWR0aF9vdmVyaGVhZChzdHJ1Y3QgZndfY2FyZCAqY2FyZCkKK3sKKwkvKgorCSAqIFVuZGVy IHRoZSB1c3VhbCBwZXNzaW1pc3RpYyBhc3N1bXB0aW9uIChjYWJsZSBsZW5ndGggNC41IG0pLCB0 aGUKKwkgKiBpc29jaHJvbm91cyBvdmVyaGVhZCBmb3IgTiBjYWJsZXMgaXMgMS43OTcgw4LCtXMg KyBOICogMC40OTQgw4LCtXMsIG9yCisJICogODguMyArIE4gKiAyNC4zIGluIGJhbmR3aWR0aCB1 bml0cy4KKwkgKgorCSAqIFRoZSBjYWxjdWxhdGlvbiBiZWxvdyB0cmllcyB0byBkZWR1Y2UgTiBm cm9tIHRoZSBjdXJyZW50IGdhcCBjb3VudC4KKwkgKiBJZiB0aGUgZ2FwIGNvdW50IGhhcyBiZWVu IG9wdGltaXplZCBieSBtZWFzdXJpbmcgdGhlIGFjdHVhbCBwYWNrZXQKKwkgKiB0cmFuc21pc3Np b24gdGltZSwgdGhpcyBkZXJpdmVkIG92ZXJoZWFkIHNob3VsZCBiZSBuZWFyIHRoZSBhY3R1YWwK KwkgKiBvdmVyaGVhZCBhcyB3ZWxsLgorCSAqLworCXJldHVybiBjYXJkLT5nYXBfY291bnQgKiA5 NyAvIDEwICsgODk7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9pc29jaF9yZXNvdXJjZV9kZWxheV9h ZnRlcl9idXNfcmVzZXQoc3RydWN0IGZ3X2NhcmQgKmNhcmQpCit7CisJZm9yICg7OykgeworCQlz NjQgZGVsYXkgPSAoY2FyZC0+cmVzZXRfamlmZmllcyArIEhaKSAtIGdldF9qaWZmaWVzXzY0KCk7 CisJCWlmIChkZWxheSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChzY2hlZHVsZV90aW1lb3V0 X2ludGVycnVwdGlibGUoZGVsYXkpID4gMCkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQor fQorCisvKioKKyAqIGZ3X2lzb19yZXNvdXJjZXNfYWxsb2NhdGUgLSBhbGxvY2F0ZSBpc29jaHJv bm91cyBjaGFubmVsIGFuZCBiYW5kd2lkdGgKKyAqIEByOiB0aGUgcmVzb3VyY2UgbWFuYWdlcgor ICogQG1heF9wYXlsb2FkX2J5dGVzOiB0aGUgYW1vdW50IG9mIGRhdGEgKGluY2x1ZGluZyBDSVAg aGVhZGVycykgcGVyIHBhY2tldAorICogQHNwZWVkOiB0aGUgc3BlZWQgKGUuZy4sIFNDT0RFXzQw MCkgYXQgd2hpY2ggdGhlIHBhY2tldHMgd2lsbCBiZSBzZW50CisgKgorICogVGhpcyBmdW5jdGlv biBhbGxvY2F0ZXMgb25lIGlzb2Nocm9ub3VzIGNoYW5uZWwgYW5kIGVub3VnaCBiYW5kd2lkdGgg Zm9yIHRoZQorICogc3BlY2lmaWVkIHBhY2tldCBzaXplLgorICoKKyAqIFJldHVybnMgdGhlIGNo YW5uZWwgbnVtYmVyIHRoYXQgdGhlIGNhbGxlciBtdXN0IHVzZSBmb3Igc3RyZWFtaW5nLCBvcgor ICogYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgRHVlIHRvIHBvdGVudGlvbmFsbHkgbG9uZyBkZWxh eXMsIHRoaXMgZnVuY3Rpb24gaXMKKyAqIGludGVycnVwdGlibGUgYW5kIGNhbiByZXR1cm4gLUVS RVNUQVJUU1lTLiAgT24gc3VjY2VzcywgdGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9y IGNhbGxpbmcgZndfaXNvX3Jlc291cmNlc191cGRhdGUoKSBvbiBidXMgcmVzZXRzLCBhbmQKKyAq IGZ3X2lzb19yZXNvdXJjZXNfZnJlZSgpIHdoZW4gdGhlIHJlc291cmNlcyBhcmUgbm90IGxvbmdl ciBuZWVkZWQuCisgKi8KK2ludCBmd19pc29fcmVzb3VyY2VzX2FsbG9jYXRlKHN0cnVjdCBmd19p c29fcmVzb3VyY2VzICpyLAorCQkJICAgICAgdW5zaWduZWQgaW50IG1heF9wYXlsb2FkX2J5dGVz LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGZ3X2NhcmQgKmNhcmQgPSBmd19wYXJlbnRfZGV2aWNl KHItPnVuaXQpLT5jYXJkOworCWludCBiYW5kd2lkdGgsIGNoYW5uZWwsIGVycjsKKworCWlmIChX QVJOX09OKHItPmFsbG9jYXRlZCkpCisJCXJldHVybiAtRUJBREZEOworCisJci0+YmFuZHdpZHRo ID0gcGFja2V0X2JhbmR3aWR0aChtYXhfcGF5bG9hZF9ieXRlcywgc3BlZWQpOworCityZXRyeV9h ZnRlcl9idXNfcmVzZXQ6CisJc3Bpbl9sb2NrX2lycSgmY2FyZC0+bG9jayk7CisJci0+Z2VuZXJh dGlvbiA9IGNhcmQtPmdlbmVyYXRpb247CisJci0+YmFuZHdpZHRoX292ZXJoZWFkID0gY3VycmVu dF9iYW5kd2lkdGhfb3ZlcmhlYWQoY2FyZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjYXJkLT5sb2Nr KTsKKworCWVyciA9IHdhaXRfaXNvY2hfcmVzb3VyY2VfZGVsYXlfYWZ0ZXJfYnVzX3Jlc2V0KGNh cmQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmci0+bXV0 ZXgpOworCisJYmFuZHdpZHRoID0gci0+YmFuZHdpZHRoICsgci0+YmFuZHdpZHRoX292ZXJoZWFk OworCWZ3X2lzb19yZXNvdXJjZV9tYW5hZ2UoY2FyZCwgci0+Z2VuZXJhdGlvbiwgci0+Y2hhbm5l bHNfbWFzaywKKwkJCSAgICAgICAmY2hhbm5lbCwgJmJhbmR3aWR0aCwgdHJ1ZSwgci0+YnVmZmVy KTsKKwlpZiAoY2hhbm5lbCA9PSAtRUFHQUlOKSB7CisJCW11dGV4X3VubG9jaygmci0+bXV0ZXgp OworCQlnb3RvIHJldHJ5X2FmdGVyX2J1c19yZXNldDsKKwl9CisJaWYgKGNoYW5uZWwgPj0gMCkg eworCQlyLT5jaGFubmVsID0gY2hhbm5lbDsKKwkJci0+YWxsb2NhdGVkID0gdHJ1ZTsKKwl9IGVs c2UgeworCQlpZiAoY2hhbm5lbCA9PSAtRUJVU1kpCisJCQlkZXZfZXJyKCZyLT51bml0LT5kZXZp Y2UsCisJCQkJImlzb2Nocm9ub3VzIHJlc291cmNlcyBleGhhdXN0ZWRcbiIpOworCQllbHNlCisJ CQlkZXZfZXJyKCZyLT51bml0LT5kZXZpY2UsCisJCQkJImlzb2Nocm9ub3VzIHJlc291cmNlIGFs bG9jYXRpb24gZmFpbGVkXG4iKTsKKwl9CisKKwltdXRleF91bmxvY2soJnItPm11dGV4KTsKKwor CXJldHVybiBjaGFubmVsOworfQorCisvKioKKyAqIGZ3X2lzb19yZXNvdXJjZXNfdXBkYXRlIC0g dXBkYXRlIHJlc291cmNlIGFsbG9jYXRpb25zIGFmdGVyIGEgYnVzIHJlc2V0CisgKiBAcjogdGhl IHJlc291cmNlIG1hbmFnZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZy b20gdGhlIGRyaXZlcidzIC51cGRhdGUgaGFuZGxlciB0byByZWFsbG9jYXRlCisgKiBhbnkgcmVz b3VyY2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgYmVmb3JlIHRoZSBidXMgcmVzZXQuICBJdCBpcyBz YWZlIHRvIGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gaWYgbm8gcmVzb3VyY2VzIGFyZSBjdXJyZW50 bHkgYWxsb2NhdGVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZh aWx1cmUuICBJZiB0aGlzIGhhcHBlbnMsIHRoZSBjYWxsZXIgbXVzdAorICogc3RvcCBzdHJlYW1p bmcuCisgKi8KK2ludCBmd19pc29fcmVzb3VyY2VzX3VwZGF0ZShzdHJ1Y3QgZndfaXNvX3Jlc291 cmNlcyAqcikKK3sKKwlzdHJ1Y3QgZndfY2FyZCAqY2FyZCA9IGZ3X3BhcmVudF9kZXZpY2Uoci0+ dW5pdCktPmNhcmQ7CisJaW50IGJhbmR3aWR0aCwgY2hhbm5lbDsKKworCW11dGV4X2xvY2soJnIt Pm11dGV4KTsKKworCWlmICghci0+YWxsb2NhdGVkKSB7CisJCW11dGV4X3VubG9jaygmci0+bXV0 ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjYXJkLT5sb2NrKTsKKwly LT5nZW5lcmF0aW9uID0gY2FyZC0+Z2VuZXJhdGlvbjsKKwlyLT5iYW5kd2lkdGhfb3ZlcmhlYWQg PSBjdXJyZW50X2JhbmR3aWR0aF9vdmVyaGVhZChjYXJkKTsKKwlzcGluX3VubG9ja19pcnEoJmNh cmQtPmxvY2spOworCisJYmFuZHdpZHRoID0gci0+YmFuZHdpZHRoICsgci0+YmFuZHdpZHRoX292 ZXJoZWFkOworCisJZndfaXNvX3Jlc291cmNlX21hbmFnZShjYXJkLCByLT5nZW5lcmF0aW9uLCAx dUxMIDw8IHItPmNoYW5uZWwsCisJCQkgICAgICAgJmNoYW5uZWwsICZiYW5kd2lkdGgsIHRydWUs IHItPmJ1ZmZlcik7CisJLyoKKwkgKiBXaGVuIGFub3RoZXIgYnVzIHJlc2V0IGhhcHBlbnMsIHBy ZXRlbmQgdGhhdCB0aGUgYWxsb2NhdGlvbgorCSAqIHN1Y2NlZWRlZDsgd2Ugd2lsbCB0cnkgYWdh aW4gZm9yIHRoZSBuZXcgZ2VuZXJhdGlvbiBsYXRlci4KKwkgKi8KKwlpZiAoY2hhbm5lbCA8IDAg JiYgY2hhbm5lbCAhPSAtRUFHQUlOKSB7CisJCXItPmFsbG9jYXRlZCA9IGZhbHNlOworCQlpZiAo Y2hhbm5lbCA9PSAtRUJVU1kpCisJCQlkZXZfZXJyKCZyLT51bml0LT5kZXZpY2UsCisJCQkJImlz b2Nocm9ub3VzIHJlc291cmNlcyBleGhhdXN0ZWRcbiIpOworCQllbHNlCisJCQlkZXZfZXJyKCZy LT51bml0LT5kZXZpY2UsCisJCQkJImlzb2Nocm9ub3VzIHJlc291cmNlIGFsbG9jYXRpb24gZmFp bGVkXG4iKTsKKwl9CisKKwltdXRleF91bmxvY2soJnItPm11dGV4KTsKKworCXJldHVybiBjaGFu bmVsOworfQorCisvKioKKyAqIGZ3X2lzb19yZXNvdXJjZXNfZnJlZSAtIGZyZWVzIGFsbG9jYXRl ZCByZXNvdXJjZXMKKyAqIEByOiB0aGUgcmVzb3VyY2UgbWFuYWdlcgorICoKKyAqIFRoaXMgZnVu Y3Rpb24gZGVhbGxvY2F0ZXMgdGhlIGNoYW5uZWwgYW5kIGJhbmR3aWR0aCwgaWYgYWxsb2NhdGVk LgorICovCit2b2lkIGZ3X2lzb19yZXNvdXJjZXNfZnJlZShzdHJ1Y3QgZndfaXNvX3Jlc291cmNl cyAqcikKK3sKKwlzdHJ1Y3QgZndfY2FyZCAqY2FyZCA9IGZ3X3BhcmVudF9kZXZpY2Uoci0+dW5p dCktPmNhcmQ7CisJaW50IGJhbmR3aWR0aCwgY2hhbm5lbDsKKworCW11dGV4X2xvY2soJnItPm11 dGV4KTsKKworCWlmIChyLT5hbGxvY2F0ZWQpIHsKKwkJYmFuZHdpZHRoID0gci0+YmFuZHdpZHRo ICsgci0+YmFuZHdpZHRoX292ZXJoZWFkOworCQlmd19pc29fcmVzb3VyY2VfbWFuYWdlKGNhcmQs IHItPmdlbmVyYXRpb24sIDF1TEwgPDwgci0+Y2hhbm5lbCwKKwkJCQkgICAgICAgJmNoYW5uZWws ICZiYW5kd2lkdGgsIGZhbHNlLCByLT5idWZmZXIpOworCQlpZiAoY2hhbm5lbCA8IDApCisJCQlk ZXZfZXJyKCZyLT51bml0LT5kZXZpY2UsCisJCQkJImlzb2Nocm9ub3VzIHJlc291cmNlIGRlYWxs b2NhdGlvbiBmYWlsZWRcbiIpOworCisJCXItPmFsbG9jYXRlZCA9IGZhbHNlOworCX0KKworCW11 dGV4X3VubG9jaygmci0+bXV0ZXgpOworfQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3 aXJlL2lzby1yZXNvdXJjZXMuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIFNPVU5EX0ZJUkVX SVJFX0lTT19SRVNPVVJDRVNfSF9JTkNMVURFRAorI2RlZmluZSBTT1VORF9GSVJFV0lSRV9JU09f UkVTT1VSQ0VTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGZ3X3VuaXQ7CisKKy8qKgorICogc3RydWN0IGZ3 X2lzb19yZXNvdXJjZXMgLSBtYW5hZ2VzIGNoYW5uZWwvYmFuZHdpZHRoIGFsbG9jYXRpb24KKyAq IEBjaGFubmVsc19tYXNrOiBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYWxsIGNoYW5u ZWwgbnVtYmVycywgc2V0IHRoaXMKKyAqICAgICAgICAgICAgICAgICBiaXQgbWFzayB0byBzb21l dGhpbmcgZWxzZSB0aGFuIHRoZSBkZWZhdWx0IChhbGwgb25lcykKKyAqCisgKiBUaGlzIHN0cnVj dHVyZSBtYW5hZ2VzIChkZSlhbGxvY2F0aW9uIG9mIGlzb2Nocm9ub3VzIHJlc291cmNlcyAoY2hh bm5lbCBhbmQKKyAqIGJhbmR3aWR0aCkgZm9yIG9uZSBpc29jaHJvbm91cyBzdHJlYW0uCisgKi8K K3N0cnVjdCBmd19pc29fcmVzb3VyY2VzIHsKKwl1NjQgY2hhbm5lbHNfbWFzazsKKwkvKiBwcml2 YXRlOiAqLworCXN0cnVjdCBmd191bml0ICp1bml0OworCXN0cnVjdCBtdXRleCBtdXRleDsKKwl1 bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgYmFuZHdpZHRoOyAvKiBpbiBiYW5k d2lkdGggdW5pdHMsIHdpdGhvdXQgb3ZlcmhlYWQgKi8KKwl1bnNpZ25lZCBpbnQgYmFuZHdpZHRo X292ZXJoZWFkOworCWludCBnZW5lcmF0aW9uOyAvKiBpbiB3aGljaCBhbGxvY2F0aW9uIGlzIHZh bGlkICovCisJYm9vbCBhbGxvY2F0ZWQ7CisJX19iZTMyIGJ1ZmZlclsyXTsKK307CisKK3ZvaWQg ZndfaXNvX3Jlc291cmNlc19pbml0KHN0cnVjdCBmd19pc29fcmVzb3VyY2VzICpyLAorCQkJICAg c3RydWN0IGZ3X3VuaXQgKnVuaXQpOwordm9pZCBmd19pc29fcmVzb3VyY2VzX2Rlc3Ryb3koc3Ry dWN0IGZ3X2lzb19yZXNvdXJjZXMgKnIpOworCitpbnQgZndfaXNvX3Jlc291cmNlc19hbGxvY2F0 ZShzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqciwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtYXhf cGF5bG9hZF9ieXRlcywgaW50IHNwZWVkKTsKK2ludCBmd19pc29fcmVzb3VyY2VzX3VwZGF0ZShz dHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqcik7Cit2b2lkIGZ3X2lzb19yZXNvdXJjZXNfZnJlZShz dHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqcik7CisKKyNlbmRpZgotLS0gL2Rldi9udWxsCisrKyBi L3NvdW5kL2ZpcmV3aXJlL3BhY2tldHMtYnVmZmVyLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAq IGhlbHBlcnMgZm9yIG1hbmFnaW5nIGEgYnVmZmVyIGZvciBtYW55IHBhY2tldHMKKyAqCisgKiBD b3B5cmlnaHQgKGMpIENsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorICogTGlj ZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwg dmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5oPgorI2luY2x1ZGUg PGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJwYWNrZXRzLWJ1ZmZlci5oIgorCisvKioKKyAqIGlz b19wYWNrZXRzX2J1ZmZlcl9pbml0IC0gYWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIHBhY2tldHMK KyAqIEBiOiB0aGUgYnVmZmVyIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKiBAdW5pdDogdGhl IGRldmljZSBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSBzdHJlYW0KKyAqIEBjb3VudDogdGhlIG51 bWJlciBvZiBwYWNrZXRzCisgKiBAcGFja2V0X3NpemU6IHRoZSAobWF4aW11bSkgc2l6ZSBvZiBh IHBhY2tldCwgaW4gYnl0ZXMKKyAqIEBkaXJlY3Rpb246ICVETUFfVE9fREVWSUNFIG9yICVETUFf RlJPTV9ERVZJQ0UKKyAqLworaW50IGlzb19wYWNrZXRzX2J1ZmZlcl9pbml0KHN0cnVjdCBpc29f cGFja2V0c19idWZmZXIgKmIsIHN0cnVjdCBmd191bml0ICp1bml0LAorCQkJICAgIHVuc2lnbmVk IGludCBjb3VudCwgdW5zaWduZWQgaW50IHBhY2tldF9zaXplLAorCQkJICAgIGVudW0gZG1hX2Rh dGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgcGFja2V0c19wZXJfcGFn ZSwgcGFnZXM7CisJdW5zaWduZWQgaW50IGksIHBhZ2VfaW5kZXgsIG9mZnNldF9pbl9wYWdlOwor CXZvaWQgKnA7CisJaW50IGVycjsKKworCWItPnBhY2tldHMgPSBrbWFsbG9jKGNvdW50ICogc2l6 ZW9mKCpiLT5wYWNrZXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiLT5wYWNrZXRzKSB7CisJCWVy ciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcGFja2V0X3NpemUgPSBMMV9DQUNI RV9BTElHTihwYWNrZXRfc2l6ZSk7CisJcGFja2V0c19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHBh Y2tldF9zaXplOworCWlmIChXQVJOX09OKCFwYWNrZXRzX3Blcl9wYWdlKSkgeworCQllcnIgPSAt RUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlwYWdlcyA9IERJVl9ST1VORF9VUChjb3VudCwg cGFja2V0c19wZXJfcGFnZSk7CisKKwllcnIgPSBmd19pc29fYnVmZmVyX2luaXQoJmItPmlzb19i dWZmZXIsIGZ3X3BhcmVudF9kZXZpY2UodW5pdCktPmNhcmQsCisJCQkJIHBhZ2VzLCBkaXJlY3Rp b24pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9wYWNrZXRzOworCisJZm9yIChpID0gMDsg aSA8IGNvdW50OyArK2kpIHsKKwkJcGFnZV9pbmRleCA9IGkgLyBwYWNrZXRzX3Blcl9wYWdlOwor CQlwID0gcGFnZV9hZGRyZXNzKGItPmlzb19idWZmZXIucGFnZXNbcGFnZV9pbmRleF0pOworCQlv ZmZzZXRfaW5fcGFnZSA9IChpICUgcGFja2V0c19wZXJfcGFnZSkgKiBwYWNrZXRfc2l6ZTsKKwkJ Yi0+cGFja2V0c1tpXS5idWZmZXIgPSBwICsgb2Zmc2V0X2luX3BhZ2U7CisJCWItPnBhY2tldHNb aV0ub2Zmc2V0ID0gcGFnZV9pbmRleCAqIFBBR0VfU0laRSArIG9mZnNldF9pbl9wYWdlOworCX0K KworCXJldHVybiAwOworCitlcnJfcGFja2V0czoKKwlrZnJlZShiLT5wYWNrZXRzKTsKK2Vycm9y OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogaXNvX3BhY2tldHNfYnVmZmVyX2Rlc3Ryb3kg LSBmcmVlcyBwYWNrZXQgYnVmZmVyIHJlc291cmNlcworICogQGI6IHRoZSBidWZmZXIgc3RydWN0 dXJlIHRvIGZyZWUKKyAqIEB1bml0OiB0aGUgZGV2aWNlIGF0IHRoZSBvdGhlciBlbmQgb2YgdGhl IHN0cmVhbQorICovCit2b2lkIGlzb19wYWNrZXRzX2J1ZmZlcl9kZXN0cm95KHN0cnVjdCBpc29f cGFja2V0c19idWZmZXIgKmIsCisJCQkJc3RydWN0IGZ3X3VuaXQgKnVuaXQpCit7CisJZndfaXNv X2J1ZmZlcl9kZXN0cm95KCZiLT5pc29fYnVmZmVyLCBmd19wYXJlbnRfZGV2aWNlKHVuaXQpLT5j YXJkKTsKKwlrZnJlZShiLT5wYWNrZXRzKTsKK30KLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9m aXJld2lyZS9wYWNrZXRzLWJ1ZmZlci5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgU09VTkRf RklSRVdJUkVfUEFDS0VUU19CVUZGRVJfSF9JTkNMVURFRAorI2RlZmluZSBTT1VORF9GSVJFV0lS RV9QQUNLRVRTX0JVRkZFUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGlu Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CisKKy8qKgorICogc3RydWN0IGlzb19w YWNrZXRzX2J1ZmZlciAtIG1hbmFnZXMgYSBidWZmZXIgZm9yIG1hbnkgcGFja2V0cworICogQGlz b19idWZmZXI6IHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgcGFja2V0cworICogQHBhY2tldHM6 IGFuIGFycmF5LCB3aXRoIGVhY2ggZWxlbWVudCBwb2ludGluZyB0byBvbmUgcGFja2V0CisgKi8K K3N0cnVjdCBpc29fcGFja2V0c19idWZmZXIgeworCXN0cnVjdCBmd19pc29fYnVmZmVyIGlzb19i dWZmZXI7CisJc3RydWN0IHsKKwkJdm9pZCAqYnVmZmVyOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0 OworCX0gKnBhY2tldHM7Cit9OworCitpbnQgaXNvX3BhY2tldHNfYnVmZmVyX2luaXQoc3RydWN0 IGlzb19wYWNrZXRzX2J1ZmZlciAqYiwgc3RydWN0IGZ3X3VuaXQgKnVuaXQsCisJCQkgICAgdW5z aWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgcGFja2V0X3NpemUsCisJCQkgICAgZW51bSBk bWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKK3ZvaWQgaXNvX3BhY2tldHNfYnVmZmVyX2Rl c3Ryb3koc3RydWN0IGlzb19wYWNrZXRzX2J1ZmZlciAqYiwKKwkJCQlzdHJ1Y3QgZndfdW5pdCAq dW5pdCk7CisKKyNlbmRpZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2FtZHRw LmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBBdWRpbyBhbmQgTXVzaWMgRGF0YSBUcmFuc21p c3Npb24gUHJvdG9jb2wgKElFQyA2MTg4My02KSBzdHJlYW1zCisgKiB3aXRoIENvbW1vbiBJc29j aHJvbm91cyBQYWNrZXQgKElFQyA2MTg4My0xKSBoZWFkZXJzCisgKgorICogQ29weXJpZ2h0IChj KSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqIExpY2Vuc2VkIHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4K KyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+ CisjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVk ZSAiYW1kdHAuaCIKKworI2RlZmluZSBUSUNLU19QRVJfQ1lDTEUJCTMwNzIKKyNkZWZpbmUgQ1lD TEVTX1BFUl9TRUNPTkQJODAwMAorI2RlZmluZSBUSUNLU19QRVJfU0VDT05ECShUSUNLU19QRVJf Q1lDTEUgKiBDWUNMRVNfUEVSX1NFQ09ORCkKKworI2RlZmluZSBUUkFOU0ZFUl9ERUxBWV9USUNL UwkweDJlMDAgLyogNDc5LjE3IMOCwrVzICovCisKKyNkZWZpbmUgVEFHX0NJUAkJCTEKKworI2Rl ZmluZSBDSVBfRU9ICQkJKDF1IDw8IDMxKQorI2RlZmluZSBDSVBfRk1UX0FNCQkoMHgxMCA8PCAy NCkKKyNkZWZpbmUgQU1EVFBfRkRGX0FNODI0CQkoMCA8PCAxOSkKKyNkZWZpbmUgQU1EVFBfRkRG X1NGQ19TSElGVAkxNgorCisvKiBUT0RPOiBtYWtlIHRoZXNlIGNvbmZpZ3VyYWJsZSAqLworI2Rl ZmluZSBJTlRFUlJVUFRfSU5URVJWQUwJMTYKKyNkZWZpbmUgUVVFVUVfTEVOR1RICQk0OAorCisv KioKKyAqIGFtZHRwX291dF9zdHJlYW1faW5pdCAtIGluaXRpYWxpemUgYW4gQU1EVFAgb3V0cHV0 IHN0cmVhbSBzdHJ1Y3R1cmUKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVhbSB0byBpbml0 aWFsaXplCisgKiBAdW5pdDogdGhlIHRhcmdldCBvZiB0aGUgc3RyZWFtCisgKiBAZmxhZ3M6IHRo ZSBwYWNrZXQgdHJhbnNtaXNzaW9uIG1ldGhvZCB0byB1c2UKKyAqLworaW50IGFtZHRwX291dF9z dHJlYW1faW5pdChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywgc3RydWN0IGZ3X3VuaXQgKnVu aXQsCisJCQkgIGVudW0gY2lwX291dF9mbGFncyBmbGFncykKK3sKKwlpZiAoZmxhZ3MgIT0gQ0lQ X05PTkJMT0NLSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMtPnVuaXQgPSBmd191bml0X2dl dCh1bml0KTsKKwlzLT5mbGFncyA9IGZsYWdzOworCXMtPmNvbnRleHQgPSBFUlJfUFRSKC0xKTsK KwltdXRleF9pbml0KCZzLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wo YW1kdHBfb3V0X3N0cmVhbV9pbml0KTsKKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX2Rlc3Ry b3kgLSBmcmVlIHN0cmVhbSByZXNvdXJjZXMKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVh bSB0byBkZXN0cm95CisgKi8KK3ZvaWQgYW1kdHBfb3V0X3N0cmVhbV9kZXN0cm95KHN0cnVjdCBh bWR0cF9vdXRfc3RyZWFtICpzKQoreworCVdBUk5fT04oIUlTX0VSUihzLT5jb250ZXh0KSk7CisJ bXV0ZXhfZGVzdHJveSgmcy0+bXV0ZXgpOworCWZ3X3VuaXRfcHV0KHMtPnVuaXQpOworfQorRVhQ T1JUX1NZTUJPTChhbWR0cF9vdXRfc3RyZWFtX2Rlc3Ryb3kpOworCisvKioKKyAqIGFtZHRwX291 dF9zdHJlYW1fc2V0X3JhdGUgLSBjb25maWd1cmUgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeQorICog QHM6IHRoZSBBTURUUCBvdXRwdXQgc3RyZWFtIHRvIGNvbmZpZ3VyZQorICogQHJhdGU6IDMyMDAw LCA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMCwgMTc2NDAwLCBvciAxOTIwMDAKKyAqCisgKiBU aGUgc3RyZWFtIHJhdGUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgc3RhcnRlZCwg YW5kIG11c3Qgbm90IGJlCisgKiBjaGFuZ2VkIHdoaWxlIHRoZSBzdHJlYW0gaXMgcnVubmluZy4K KyAqLwordm9pZCBhbWR0cF9vdXRfc3RyZWFtX3NldF9yYXRlKHN0cnVjdCBhbWR0cF9vdXRfc3Ry ZWFtICpzLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJ dW5zaWduZWQgaW50IHJhdGU7CisJCXVuc2lnbmVkIGludCBzeXRfaW50ZXJ2YWw7CisJfSByYXRl X2luZm9bXSA9IHsKKwkJW0NJUF9TRkNfMzIwMDBdICA9IHsgIDMyMDAwLCAgOCwgfSwKKwkJW0NJ UF9TRkNfNDQxMDBdICA9IHsgIDQ0MTAwLCAgOCwgfSwKKwkJW0NJUF9TRkNfNDgwMDBdICA9IHsg IDQ4MDAwLCAgOCwgfSwKKwkJW0NJUF9TRkNfODgyMDBdICA9IHsgIDg4MjAwLCAxNiwgfSwKKwkJ W0NJUF9TRkNfOTYwMDBdICA9IHsgIDk2MDAwLCAxNiwgfSwKKwkJW0NJUF9TRkNfMTc2NDAwXSA9 IHsgMTc2NDAwLCAzMiwgfSwKKwkJW0NJUF9TRkNfMTkyMDAwXSA9IHsgMTkyMDAwLCAzMiwgfSwK Kwl9OworCXVuc2lnbmVkIGludCBzZmM7CisKKwlpZiAoV0FSTl9PTighSVNfRVJSKHMtPmNvbnRl eHQpKSkKKwkJcmV0dXJuOworCisJZm9yIChzZmMgPSAwOyBzZmMgPCBBUlJBWV9TSVpFKHJhdGVf aW5mbyk7ICsrc2ZjKQorCQlpZiAocmF0ZV9pbmZvW3NmY10ucmF0ZSA9PSByYXRlKSB7CisJCQlz LT5zZmMgPSBzZmM7CisJCQlzLT5zeXRfaW50ZXJ2YWwgPSByYXRlX2luZm9bc2ZjXS5zeXRfaW50 ZXJ2YWw7CisJCQlyZXR1cm47CisJCX0KKwlXQVJOX09OKDEpOworfQorRVhQT1JUX1NZTUJPTChh bWR0cF9vdXRfc3RyZWFtX3NldF9yYXRlKTsKKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX2dl dF9tYXhfcGF5bG9hZCAtIGdldCB0aGUgc3RyZWFtJ3MgcGFja2V0IHNpemUKKyAqIEBzOiB0aGUg QU1EVFAgb3V0cHV0IHN0cmVhbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2Fs bGVkIGJlZm9yZSB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbmZpZ3VyZWQKKyAqIHdpdGggYW1kdHBf b3V0X3N0cmVhbV9zZXRfcmF0ZSgpLCBhbWR0cF9vdXRfc3RyZWFtX3NldF9wY20oKSwgYW5kCisg KiBhbWR0cF9vdXRfc3RyZWFtX3NldF9taWRpKCkuCisgKi8KK3Vuc2lnbmVkIGludCBhbWR0cF9v dXRfc3RyZWFtX2dldF9tYXhfcGF5bG9hZChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykKK3sK KwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1heF9kYXRhX2Jsb2Nrc1tdID0geworCQlbQ0lQ X1NGQ18zMjAwMF0gID0gIDQsCisJCVtDSVBfU0ZDXzQ0MTAwXSAgPSAgNiwKKwkJW0NJUF9TRkNf NDgwMDBdICA9ICA2LAorCQlbQ0lQX1NGQ184ODIwMF0gID0gMTIsCisJCVtDSVBfU0ZDXzk2MDAw XSAgPSAxMiwKKwkJW0NJUF9TRkNfMTc2NDAwXSA9IDIzLAorCQlbQ0lQX1NGQ18xOTIwMDBdID0g MjQsCisJfTsKKworCXMtPmRhdGFfYmxvY2tfcXVhZGxldHMgPSBzLT5wY21fY2hhbm5lbHM7CisJ cy0+ZGF0YV9ibG9ja19xdWFkbGV0cyArPSBESVZfUk9VTkRfVVAocy0+bWlkaV9wb3J0cywgOCk7 CisKKwlyZXR1cm4gOCArIG1heF9kYXRhX2Jsb2Nrc1tzLT5zZmNdICogNCAqIHMtPmRhdGFfYmxv Y2tfcXVhZGxldHM7Cit9CitFWFBPUlRfU1lNQk9MKGFtZHRwX291dF9zdHJlYW1fZ2V0X21heF9w YXlsb2FkKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjdWxhdGVfZGF0YV9ibG9ja3Moc3Ry dWN0IGFtZHRwX291dF9zdHJlYW0gKnMpCit7CisJdW5zaWduZWQgaW50IHBoYXNlLCBkYXRhX2Js b2NrczsKKworCWlmICghY2lwX3NmY19pc19iYXNlXzQ0MTAwKHMtPnNmYykpIHsKKwkJLyogU2Ft cGxlX3JhdGUgLyA4MDAwIGlzIGFuIGludGVnZXIsIGFuZCBwcmVjb21wdXRlZC4gKi8KKwkJZGF0 YV9ibG9ja3MgPSBzLT5kYXRhX2Jsb2NrX3N0YXRlOworCX0gZWxzZSB7CisJCXBoYXNlID0gcy0+ ZGF0YV9ibG9ja19zdGF0ZTsKKworCQkvKgorCQkgKiBUaGlzIGNhbGN1bGF0ZXMgdGhlIG51bWJl ciBvZiBkYXRhIGJsb2NrcyBwZXIgcGFja2V0IHNvIHRoYXQKKwkJICogMSkgdGhlIG92ZXJhbGwg cmF0ZSBpcyBjb3JyZWN0IGFuZCBleGFjdGx5IHN5bmNocm9uaXplZCB0bworCQkgKiAgICB0aGUg YnVzIGNsb2NrLCBhbmQKKwkJICogMikgcGFja2V0cyB3aXRoIGEgcm91bmRlZC11cCBudW1iZXIg b2YgYmxvY2tzIG9jY3VyIGFzIGVhcmx5CisJCSAqICAgIGFzIHBvc3NpYmxlIGluIHRoZSBzZXF1 ZW5jZSAodG8gcHJldmVudCB1bmRlcnJ1bnMgb2YgdGhlCisJCSAqICAgIGRldmljZSdzIGJ1ZmZl cikuCisJCSAqLworCQlpZiAocy0+c2ZjID09IENJUF9TRkNfNDQxMDApCisJCQkvKiA2IDYgNSA2 IDUgNiA1IC4uLiAqLworCQkJZGF0YV9ibG9ja3MgPSA1ICsgKChwaGFzZSAmIDEpIF4KKwkJCQkJ ICAgKHBoYXNlID09IDAgfHwgcGhhc2UgPj0gNDApKTsKKwkJZWxzZQorCQkJLyogMTIgMTEgMTEg MTEgMTEgLi4uIG9yIDIzIDIyIDIyIDIyIDIyIC4uLiAqLworCQkJZGF0YV9ibG9ja3MgPSAxMSAq IChzLT5zZmMgPj4gMSkgKyAocGhhc2UgPT0gMCk7CisJCWlmICgrK3BoYXNlID49ICg4MCA+PiAo cy0+c2ZjID4+IDEpKSkKKwkJCXBoYXNlID0gMDsKKwkJcy0+ZGF0YV9ibG9ja19zdGF0ZSA9IHBo YXNlOworCX0KKworCXJldHVybiBkYXRhX2Jsb2NrczsKK30KKworc3RhdGljIHVuc2lnbmVkIGlu dCBjYWxjdWxhdGVfc3l0KHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzLCB1bnNpZ25lZCBpbnQg Y3ljbGUpCit7CisJdW5zaWduZWQgaW50IHN5dF9vZmZzZXQsIHBoYXNlLCBpbmRleCwgc3l0X2lu ZGV4LCB0aWNrX29mZnNldCwgc3l0OworCisJaWYgKHMtPmxhc3Rfc3l0X29mZnNldCA8IFRJQ0tT X1BFUl9DWUNMRSkgeworCQlpZiAoIWNpcF9zZmNfaXNfYmFzZV80NDEwMChzLT5zZmMpKQorCQkJ c3l0X29mZnNldCA9IHMtPmxhc3Rfc3l0X29mZnNldCArIHMtPnN5dF9vZmZzZXRfc3RhdGU7CisJ CWVsc2UgeworCQkvKgorCQkgKiBUaGUgdGltZSwgaW4gdGlja3MsIG9mIHRoZSBuJ3RoIFNZVF9J TlRFUlZBTCBzYW1wbGUgaXM6CisJCSAqICAgbiAqIFNZVF9JTlRFUlZBTCAqIDI0NTc2MDAwIC8g c2FtcGxlX3JhdGUKKwkJICogTW9kdWxvIFRJQ0tTX1BFUl9DWUNMRSwgdGhlIGRpZmZlcmVuY2Ug YmV0d2VlbiBzdWNjZXNzaXZlCisJCSAqIGVsZW1lbnRzIGlzIGFib3V0IDEzODYuMjMuICBSb3Vu ZGluZyB0aGUgcmVzdWx0cyBvZiB0aGlzCisJCSAqIGZvcm11bGEgdG8gdGhlIFNZVCBwcmVjaXNp b24gcmVzdWx0cyBpbiBhIHNlcXVlbmNlIG9mCisJCSAqIGRpZmZlcmVuY2VzIHRoYXQgYmVnaW5z IHdpdGg6CisJCSAqICAgMTM4NiAxMzg2IDEzODcgMTM4NiAxMzg2IDEzODYgMTM4NyAxMzg2IDEz ODYgMTM4NiAxMzg3IC4uLgorCQkgKiBUaGlzIGNvZGUgZ2VuZXJhdGVzIF9leGFjdGx5XyB0aGUg c2FtZSBzZXF1ZW5jZS4KKwkJICovCisJCQlwaGFzZSA9IHMtPnN5dF9vZmZzZXRfc3RhdGU7CisJ CQlpbmRleCA9IHBoYXNlICUgMTM7CisJCQlzeXRfb2Zmc2V0ID0gcy0+bGFzdF9zeXRfb2Zmc2V0 OworCQkJc3l0X29mZnNldCArPSAxMzg2ICsgKChpbmRleCAmJiAhKGluZGV4ICYgMykpIHx8CisJ CQkJCSAgICAgIHBoYXNlID09IDE0Nik7CisJCQlpZiAoKytwaGFzZSA+PSAxNDcpCisJCQkJcGhh c2UgPSAwOworCQkJcy0+c3l0X29mZnNldF9zdGF0ZSA9IHBoYXNlOworCQl9CisJfSBlbHNlCisJ CXN5dF9vZmZzZXQgPSBzLT5sYXN0X3N5dF9vZmZzZXQgLSBUSUNLU19QRVJfQ1lDTEU7CisJcy0+ bGFzdF9zeXRfb2Zmc2V0ID0gc3l0X29mZnNldDsKKworCXN5dF9pbmRleCA9IC1zLT5kYXRhX2Js b2NrX2NvdW50ZXIgJiAocy0+c3l0X2ludGVydmFsIC0gMSk7CisJdGlja19vZmZzZXQgPSBUUkFO U0ZFUl9ERUxBWV9USUNLUyAtIFRJQ0tTX1BFUl9DWUNMRSArIHN5dF9vZmZzZXQ7CisJc3l0ID0g KGN5Y2xlICsgdGlja19vZmZzZXQgLyBUSUNLU19QRVJfQ1lDTEUpIDw8IDEyOworCXN5dCArPSB0 aWNrX29mZnNldCAlIFRJQ0tTX1BFUl9DWUNMRTsKKworCXJldHVybiBzeXQgJiAweGZmZmY7Cit9 CisKK3N0YXRpYyBib29sIGFtZHRwX2ZpbGxfcGNtKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpz LAorCQkJICAgX19iZTMyICpidWZmZXIsIHVuc2lnbmVkIGludCBmcmFtZXMpCit7CisJc3RydWN0 IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHMtPnBjbS0+cnVudGltZTsKKwl1bnNpZ25lZCBp bnQgY2hhbm5lbHMsIHJlbWFpbmluZ19mcmFtZXMsIGZyYW1lX3N0ZXAsIGksIGMsIHB0cjsKKwlj b25zdCB2b2lkICpzcmM7CisKKwljaGFubmVscyA9IHMtPnBjbV9jaGFubmVsczsKKwlzcmMgPSBy dW50aW1lLT5kbWFfYXJlYSArCisJCQlzLT5wY21fYnVmZmVyX3BvaW50ZXIgKiAocnVudGltZS0+ ZnJhbWVfYml0cyAvIDgpOworCXJlbWFpbmluZ19mcmFtZXMgPSBydW50aW1lLT5idWZmZXJfc2l6 ZSAtIHMtPnBjbV9idWZmZXJfcG9pbnRlcjsKKwlmcmFtZV9zdGVwID0gcy0+ZGF0YV9ibG9ja19x dWFkbGV0cyAtIGNoYW5uZWxzOworCisJc3dpdGNoIChydW50aW1lLT5mb3JtYXQpIHsKKwljYXNl IFNORFJWX1BDTV9GT1JNQVRfUzMyOgorCQlmb3IgKGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsK KwkJCWZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgKytjKSB7CisJCQkJKmJ1ZmZlciA9IGNwdV90 b19iZTMyKCgqKGNvbnN0IHUzMiAqKXNyYyA+PiA4KSB8CisJCQkJCQkgICAgICAweDQwMDAwMDAw KTsKKwkJCQlzcmMgKz0gNDsKKwkJCQlidWZmZXIrKzsKKwkJCX0KKwkJCWJ1ZmZlciArPSBmcmFt ZV9zdGVwOworCQkJaWYgKC0tcmVtYWluaW5nX2ZyYW1lcyA9PSAwKQorCQkJCXNyYyA9IHJ1bnRp bWUtPmRtYV9hcmVhOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1Mx NjoKKwkJZm9yIChpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisJCQlmb3IgKGMgPSAwOyBjIDwg Y2hhbm5lbHM7ICsrYykgeworCQkJCSpidWZmZXIgPSBjcHVfdG9fYmUzMigoKihjb25zdCB1MTYg KilzcmMgPDwgOCkgfAorCQkJCQkJICAgICAgMHg0MDAwMDAwMCk7CisJCQkJc3JjICs9IDI7CisJ CQkJYnVmZmVyKys7CisJCQl9CisJCQlidWZmZXIgKz0gZnJhbWVfc3RlcDsKKwkJCWlmICgtLXJl bWFpbmluZ19mcmFtZXMgPT0gMCkKKwkJCQlzcmMgPSBydW50aW1lLT5kbWFfYXJlYTsKKwkJfQor CQlicmVhazsKKwl9CisKKwlwdHIgPSBzLT5wY21fYnVmZmVyX3BvaW50ZXIgKyBmcmFtZXM7CisJ aWYgKHB0ciA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJcHRyIC09IHJ1bnRpbWUtPmJ1ZmZl cl9zaXplOworCUFDQ0VTU19PTkNFKHMtPnBjbV9idWZmZXJfcG9pbnRlcikgPSBwdHI7CisKKwlz LT5wY21fcGVyaW9kX3BvaW50ZXIgKz0gZnJhbWVzOworCWlmIChzLT5wY21fcGVyaW9kX3BvaW50 ZXIgPj0gcnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJcy0+cGNtX3BlcmlvZF9wb2ludGVyIC09 IHJ1bnRpbWUtPnBlcmlvZF9zaXplOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UKKwkJcmV0dXJu IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBhbWR0cF9maWxsX3BjbV9zaWxlbmNlKHN0cnVjdCBh bWR0cF9vdXRfc3RyZWFtICpzLAorCQkJCSAgIF9fYmUzMiAqYnVmZmVyLCB1bnNpZ25lZCBpbnQg ZnJhbWVzKQoreworCXVuc2lnbmVkIGludCBpLCBjOworCisJZm9yIChpID0gMDsgaSA8IGZyYW1l czsgKytpKSB7CisJCWZvciAoYyA9IDA7IGMgPCBzLT5wY21fY2hhbm5lbHM7ICsrYykKKwkJCWJ1 ZmZlcltjXSA9IGNwdV90b19iZTMyKDB4NDAwMDAwMDApOworCQlidWZmZXIgKz0gcy0+ZGF0YV9i bG9ja19xdWFkbGV0czsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtZHRwX2ZpbGxfbWlkaShzdHJ1 Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywKKwkJCSAgICBfX2JlMzIgKmJ1ZmZlciwgdW5zaWduZWQg aW50IGZyYW1lcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmcmFt ZXM7ICsraSkKKwkJYnVmZmVyW3MtPnBjbV9jaGFubmVscyArIGkgKiBzLT5kYXRhX2Jsb2NrX3F1 YWRsZXRzXSA9CisJCQkJCQljcHVfdG9fYmUzMigweDgwMDAwMDAwKTsKK30KKworc3RhdGljIHZv aWQgcXVldWVfb3V0X3BhY2tldChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywgdW5zaWduZWQg aW50IGN5Y2xlKQoreworCV9fYmUzMiAqYnVmZmVyOworCXVuc2lnbmVkIGludCBkYXRhX2Jsb2Nr cywgc3l0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtOworCWJvb2wgcGNtX3Blcmlv ZF9lbGFwc2VkOworCXN0cnVjdCBmd19pc29fcGFja2V0IHBhY2tldDsKKwlpbnQgZXJyOworCisJ ZGF0YV9ibG9ja3MgPSBjYWxjdWxhdGVfZGF0YV9ibG9ja3Mocyk7CisJc3l0ID0gY2FsY3VsYXRl X3N5dChzLCBjeWNsZSk7CisKKwlidWZmZXIgPSBzLT5idWZmZXIucGFja2V0c1tzLT5wYWNrZXRf Y291bnRlcl0uYnVmZmVyOworCWJ1ZmZlclswXSA9IGNwdV90b19iZTMyKEFDQ0VTU19PTkNFKHMt PnNvdXJjZV9ub2RlX2lkX2ZpZWxkKSB8CisJCQkJKHMtPmRhdGFfYmxvY2tfcXVhZGxldHMgPDwg MTYpIHwKKwkJCQlzLT5kYXRhX2Jsb2NrX2NvdW50ZXIpOworCWJ1ZmZlclsxXSA9IGNwdV90b19i ZTMyKENJUF9FT0ggfCBDSVBfRk1UX0FNIHwgQU1EVFBfRkRGX0FNODI0IHwKKwkJCQkocy0+c2Zj IDw8IEFNRFRQX0ZERl9TRkNfU0hJRlQpIHwgc3l0KTsKKwlidWZmZXIgKz0gMjsKKworCXBjbSA9 IEFDQ0VTU19PTkNFKHMtPnBjbSk7CisJaWYgKHBjbSkKKwkJcGNtX3BlcmlvZF9lbGFwc2VkID0g YW1kdHBfZmlsbF9wY20ocywgYnVmZmVyLCBkYXRhX2Jsb2Nrcyk7CisJZWxzZSB7CisJCWFtZHRw X2ZpbGxfcGNtX3NpbGVuY2UocywgYnVmZmVyLCBkYXRhX2Jsb2Nrcyk7CisJCXBjbV9wZXJpb2Rf ZWxhcHNlZCA9IGZhbHNlOworCX0KKwlpZiAocy0+bWlkaV9wb3J0cykKKwkJYW1kdHBfZmlsbF9t aWRpKHMsIGJ1ZmZlciwgZGF0YV9ibG9ja3MpOworCisJcy0+ZGF0YV9ibG9ja19jb3VudGVyID0g KHMtPmRhdGFfYmxvY2tfY291bnRlciArIGRhdGFfYmxvY2tzKSAmIDB4ZmY7CisKKwlwYWNrZXQu cGF5bG9hZF9sZW5ndGggPSA4ICsgZGF0YV9ibG9ja3MgKiA0ICogcy0+ZGF0YV9ibG9ja19xdWFk bGV0czsKKwlwYWNrZXQuaW50ZXJydXB0ID0gSVNfQUxJR05FRChzLT5wYWNrZXRfY291bnRlciAr IDEsCisJCQkJICAgICAgSU5URVJSVVBUX0lOVEVSVkFMKTsKKwlwYWNrZXQuc2tpcCA9IDA7CisJ cGFja2V0LnRhZyA9IFRBR19DSVA7CisJcGFja2V0LnN5ID0gMDsKKwlwYWNrZXQuaGVhZGVyX2xl bmd0aCA9IDA7CisKKwllcnIgPSBmd19pc29fY29udGV4dF9xdWV1ZShzLT5jb250ZXh0LCAmcGFj a2V0LCAmcy0+YnVmZmVyLmlzb19idWZmZXIsCisJCQkJICAgcy0+YnVmZmVyLnBhY2tldHNbcy0+ cGFja2V0X2NvdW50ZXJdLm9mZnNldCk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoJnMtPnVu aXQtPmRldmljZSwgInF1ZXVlaW5nIGVycm9yOiAlZFxuIiwgZXJyKTsKKworCWlmICgrK3MtPnBh Y2tldF9jb3VudGVyID49IFFVRVVFX0xFTkdUSCkKKwkJcy0+cGFja2V0X2NvdW50ZXIgPSAwOwor CisJaWYgKHBjbV9wZXJpb2RfZWxhcHNlZCkKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChwY20p OworfQorCitzdGF0aWMgdm9pZCBvdXRfcGFja2V0X2NhbGxiYWNrKHN0cnVjdCBmd19pc29fY29u dGV4dCAqY29udGV4dCwgdTMyIGN5Y2xlLAorCQkJCXNpemVfdCBoZWFkZXJfbGVuZ3RoLCB2b2lk ICpoZWFkZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMgPSBk YXRhOworCXVuc2lnbmVkIGludCBpLCBwYWNrZXRzID0gaGVhZGVyX2xlbmd0aCAvIDQ7CisKKwkv KgorCSAqIENvbXB1dGUgdGhlIGN5Y2xlIG9mIHRoZSBsYXN0IHF1ZXVlZCBwYWNrZXQuCisJICog KFdlIG5lZWQgb25seSB0aGUgZm91ciBsb3dlc3QgYml0cyBmb3IgdGhlIFNZVCwgc28gd2UgY2Fu IGlnbm9yZQorCSAqIHRoYXQgYml0cyAwLTExIG11c3Qgd3JhcCBhcm91bmQgYXQgMzA3Mi4pCisJ ICovCisJY3ljbGUgKz0gUVVFVUVfTEVOR1RIIC0gcGFja2V0czsKKworCWZvciAoaSA9IDA7IGkg PCBwYWNrZXRzOyArK2kpCisJCXF1ZXVlX291dF9wYWNrZXQocywgKytjeWNsZSk7Cit9CisKK3N0 YXRpYyBpbnQgcXVldWVfaW5pdGlhbF9za2lwX3BhY2tldHMoc3RydWN0IGFtZHRwX291dF9zdHJl YW0gKnMpCit7CisJc3RydWN0IGZ3X2lzb19wYWNrZXQgc2tpcF9wYWNrZXQgPSB7CisJCS5za2lw ID0gMSwKKwl9OworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlmb3IgKGkgPSAwOyBp IDwgUVVFVUVfTEVOR1RIOyArK2kpIHsKKwkJc2tpcF9wYWNrZXQuaW50ZXJydXB0ID0gSVNfQUxJ R05FRChzLT5wYWNrZXRfY291bnRlciArIDEsCisJCQkJCQkgICBJTlRFUlJVUFRfSU5URVJWQUwp OworCQllcnIgPSBmd19pc29fY29udGV4dF9xdWV1ZShzLT5jb250ZXh0LCAmc2tpcF9wYWNrZXQs IE5VTEwsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmICgrK3MtPnBh Y2tldF9jb3VudGVyID49IFFVRVVFX0xFTkdUSCkKKwkJCXMtPnBhY2tldF9jb3VudGVyID0gMDsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3N0YXJ0IC0g c3RhcnQgc2VuZGluZyBwYWNrZXRzCisgKiBAczogdGhlIEFNRFRQIG91dHB1dCBzdHJlYW0gdG8g c3RhcnQKKyAqIEBjaGFubmVsOiB0aGUgaXNvY2hyb25vdXMgY2hhbm5lbCBvbiB0aGUgYnVzCisg KiBAc3BlZWQ6IGZpcmV3aXJlIHNwZWVkIGNvZGUKKyAqCisgKiBUaGUgc3RyZWFtIGNhbm5vdCBi ZSBzdGFydGVkIHVudGlsIGl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aAorICogYW1kdHBfb3V0 X3N0cmVhbV9zZXRfcmF0ZSgpLCBhbWR0cF9vdXRfc3RyZWFtX3NldF9wY20oKSwgYW5kCisgKiBh bWR0cF9vdXRfc3RyZWFtX3NldF9taWRpKCk7IGFuZCBpdCBtdXN0IGJlIHN0YXJ0ZWQgYmVmb3Jl IGFueQorICogUENNIG9yIE1JREkgZGV2aWNlIGNhbiBiZSBzdGFydGVkLgorICovCitpbnQgYW1k dHBfb3V0X3N0cmVhbV9zdGFydChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcywgaW50IGNoYW5u ZWwsIGludCBzcGVlZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdW5zaWduZWQgaW50 IGRhdGFfYmxvY2s7CisJCXVuc2lnbmVkIGludCBzeXRfb2Zmc2V0OworCX0gaW5pdGlhbF9zdGF0 ZVtdID0geworCQlbQ0lQX1NGQ18zMjAwMF0gID0geyAgNCwgMzA3MiB9LAorCQlbQ0lQX1NGQ180 ODAwMF0gID0geyAgNiwgMTAyNCB9LAorCQlbQ0lQX1NGQ185NjAwMF0gID0geyAxMiwgMTAyNCB9 LAorCQlbQ0lQX1NGQ18xOTIwMDBdID0geyAyNCwgMTAyNCB9LAorCQlbQ0lQX1NGQ180NDEwMF0g ID0geyAgMCwgICA2NyB9LAorCQlbQ0lQX1NGQ184ODIwMF0gID0geyAgMCwgICA2NyB9LAorCQlb Q0lQX1NGQ18xNzY0MDBdID0geyAgMCwgICA2NyB9LAorCX07CisJaW50IGVycjsKKworCW11dGV4 X2xvY2soJnMtPm11dGV4KTsKKworCWlmIChXQVJOX09OKCFJU19FUlIocy0+Y29udGV4dCkgfHwK KwkJICAgICghcy0+cGNtX2NoYW5uZWxzICYmICFzLT5taWRpX3BvcnRzKSkpIHsKKwkJZXJyID0g LUVCQURGRDsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCXMtPmRhdGFfYmxvY2tfc3RhdGUg PSBpbml0aWFsX3N0YXRlW3MtPnNmY10uZGF0YV9ibG9jazsKKwlzLT5zeXRfb2Zmc2V0X3N0YXRl ID0gaW5pdGlhbF9zdGF0ZVtzLT5zZmNdLnN5dF9vZmZzZXQ7CisJcy0+bGFzdF9zeXRfb2Zmc2V0 ID0gVElDS1NfUEVSX0NZQ0xFOworCisJZXJyID0gaXNvX3BhY2tldHNfYnVmZmVyX2luaXQoJnMt PmJ1ZmZlciwgcy0+dW5pdCwgUVVFVUVfTEVOR1RILAorCQkJCSAgICAgIGFtZHRwX291dF9zdHJl YW1fZ2V0X21heF9wYXlsb2FkKHMpLAorCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCWlmIChl cnIgPCAwKQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlzLT5jb250ZXh0ID0gZndfaXNvX2NvbnRl eHRfY3JlYXRlKGZ3X3BhcmVudF9kZXZpY2Uocy0+dW5pdCktPmNhcmQsCisJCQkJCSAgIEZXX0lT T19DT05URVhUX1RSQU5TTUlULAorCQkJCQkgICBjaGFubmVsLCBzcGVlZCwgMCwKKwkJCQkJICAg b3V0X3BhY2tldF9jYWxsYmFjaywgcyk7CisJaWYgKElTX0VSUihzLT5jb250ZXh0KSkgeworCQll cnIgPSBQVFJfRVJSKHMtPmNvbnRleHQpOworCQlpZiAoZXJyID09IC1FQlVTWSkKKwkJCWRldl9l cnIoJnMtPnVuaXQtPmRldmljZSwKKwkJCQkibm8gZnJlZSBvdXRwdXQgc3RyZWFtIG9uIHRoaXMg Y29udHJvbGxlclxuIik7CisJCWdvdG8gZXJyX2J1ZmZlcjsKKwl9CisKKwlhbWR0cF9vdXRfc3Ry ZWFtX3VwZGF0ZShzKTsKKworCXMtPnBhY2tldF9jb3VudGVyID0gMDsKKwlzLT5kYXRhX2Jsb2Nr X2NvdW50ZXIgPSAwOworCWVyciA9IHF1ZXVlX2luaXRpYWxfc2tpcF9wYWNrZXRzKHMpOworCWlm IChlcnIgPCAwKQorCQlnb3RvIGVycl9jb250ZXh0OworCisJZXJyID0gZndfaXNvX2NvbnRleHRf c3RhcnQocy0+Y29udGV4dCwgLTEsIDAsIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycl9j b250ZXh0OworCisJbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKKworZXJy X2NvbnRleHQ6CisJZndfaXNvX2NvbnRleHRfZGVzdHJveShzLT5jb250ZXh0KTsKKwlzLT5jb250 ZXh0ID0gRVJSX1BUUigtMSk7CitlcnJfYnVmZmVyOgorCWlzb19wYWNrZXRzX2J1ZmZlcl9kZXN0 cm95KCZzLT5idWZmZXIsIHMtPnVuaXQpOworZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJnMt Pm11dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGFtZHRwX291dF9zdHJl YW1fc3RhcnQpOworCisvKioKKyAqIGFtZHRwX291dF9zdHJlYW1fdXBkYXRlIC0gdXBkYXRlIHRo ZSBzdHJlYW0gYWZ0ZXIgYSBidXMgcmVzZXQKKyAqIEBzOiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVh bQorICovCit2b2lkIGFtZHRwX291dF9zdHJlYW1fdXBkYXRlKHN0cnVjdCBhbWR0cF9vdXRfc3Ry ZWFtICpzKQoreworCUFDQ0VTU19PTkNFKHMtPnNvdXJjZV9ub2RlX2lkX2ZpZWxkKSA9CisJCShm d19wYXJlbnRfZGV2aWNlKHMtPnVuaXQpLT5jYXJkLT5ub2RlX2lkICYgMHgzZikgPDwgMjQ7Cit9 CitFWFBPUlRfU1lNQk9MKGFtZHRwX291dF9zdHJlYW1fdXBkYXRlKTsKKworLyoqCisgKiBhbWR0 cF9vdXRfc3RyZWFtX3N0b3AgLSBzdG9wIHNlbmRpbmcgcGFja2V0cworICogQHM6IHRoZSBBTURU UCBvdXRwdXQgc3RyZWFtIHRvIHN0b3AKKyAqCisgKiBBbGwgUENNIGFuZCBNSURJIGRldmljZXMg b2YgdGhlIHN0cmVhbSBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoZSBzdHJlYW0KKyAqIGl0c2Vs ZiBjYW4gYmUgc3RvcHBlZC4KKyAqLwordm9pZCBhbWR0cF9vdXRfc3RyZWFtX3N0b3Aoc3RydWN0 IGFtZHRwX291dF9zdHJlYW0gKnMpCit7CisJbXV0ZXhfbG9jaygmcy0+bXV0ZXgpOworCisJaWYg KElTX0VSUihzLT5jb250ZXh0KSkgeworCQltdXRleF91bmxvY2soJnMtPm11dGV4KTsKKwkJcmV0 dXJuOworCX0KKworCWZ3X2lzb19jb250ZXh0X3N0b3Aocy0+Y29udGV4dCk7CisJZndfaXNvX2Nv bnRleHRfZGVzdHJveShzLT5jb250ZXh0KTsKKwlzLT5jb250ZXh0ID0gRVJSX1BUUigtMSk7CisJ aXNvX3BhY2tldHNfYnVmZmVyX2Rlc3Ryb3koJnMtPmJ1ZmZlciwgcy0+dW5pdCk7CisKKwltdXRl eF91bmxvY2soJnMtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woYW1kdHBfb3V0X3N0cmVhbV9z dG9wKTsKKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydCAtIGFib3J0IHRoZSBy dW5uaW5nIFBDTSBkZXZpY2UKKyAqIEBzOiB0aGUgQU1EVFAgc3RyZWFtIGFib3V0IHRvIGJlIHN0 b3BwZWQKKyAqCisgKiBJZiB0aGUgaXNvY2hyb25vdXMgc3RyZWFtIG5lZWRzIHRvIGJlIHN0b3Bw ZWQgYXN5bmNocm9ub3VzbHksIGNhbGwgdGhpcworICogZnVuY3Rpb24gZmlyc3QgdG8gc3RvcCB0 aGUgUENNIGRldmljZS4KKyAqLwordm9pZCBhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydChzdHJ1 Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBj bTsKKworCXBjbSA9IEFDQ0VTU19PTkNFKHMtPnBjbSk7CisJaWYgKHBjbSkgeworCQlzbmRfcGNt X3N0cmVhbV9sb2NrX2lycShwY20pOworCQlpZiAoc25kX3BjbV9ydW5uaW5nKHBjbSkpCisJCQlz bmRfcGNtX3N0b3AocGNtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7CisJCXNuZF9wY21fc3RyZWFt X3VubG9ja19pcnEocGNtKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFtZHRwX291dF9zdHJlYW1f cGNtX2Fib3J0KTsKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9hbWR0cC5oCkBA IC0wLDAgKzEsMTUxIEBACisjaWZuZGVmIFNPVU5EX0ZJUkVXSVJFX0FNRFRQX0hfSU5DTFVERUQK KyNkZWZpbmUgU09VTkRfRklSRVdJUkVfQU1EVFBfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGlu dXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInBhY2tl dHMtYnVmZmVyLmgiCisKKy8qKgorICogZW51bSBjaXBfb3V0X2ZsYWdzIC0gZGVzY3JpYmVzIGRl dGFpbHMgb2YgdGhlIHN0cmVhbWluZyBwcm90b2NvbAorICogQENJUF9OT05CTE9DS0lORzogSW4g bm9uLWJsb2NraW5nIG1vZGUsIGVhY2ggcGFja2V0IGNvbnRhaW5zCisgKglzYW1wbGVfcmF0ZS84 MDAwIHNhbXBsZXMsIHdpdGggcm91bmRpbmcgdXAgb3IgZG93biB0byBhZGp1c3QKKyAqCWZvciBj bG9jayBza2V3IGFuZCBsZWZ0LW92ZXIgZnJhY3Rpb25hbCBzYW1wbGVzLiAgVGhpcyBzaG91bGQK KyAqCWJlIHVzZWQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuCisgKi8KK2VudW0gY2lwX291 dF9mbGFncyB7CisJQ0lQX05PTkJMT0NLSU5HID0gMCwKK307CisKKy8qKgorICogZW51bSBjaXBf c2ZjIC0gYSBzdHJlYW0ncyBzYW1wbGUgcmF0ZQorICovCitlbnVtIGNpcF9zZmMgeworCUNJUF9T RkNfMzIwMDAgID0gMCwKKwlDSVBfU0ZDXzQ0MTAwICA9IDEsCisJQ0lQX1NGQ180ODAwMCAgPSAy LAorCUNJUF9TRkNfODgyMDAgID0gMywKKwlDSVBfU0ZDXzk2MDAwICA9IDQsCisJQ0lQX1NGQ18x NzY0MDAgPSA1LAorCUNJUF9TRkNfMTkyMDAwID0gNiwKK307CisKKyNkZWZpbmUgQU1EVFBfT1VU X1BDTV9GT1JNQVRfQklUUwkoU05EUlZfUENNX0ZNVEJJVF9TMTYgfCBcCisJCQkJCSBTTkRSVl9Q Q01fRk1UQklUX1MzMikKKworc3RydWN0IGZ3X3VuaXQ7CitzdHJ1Y3QgZndfaXNvX2NvbnRleHQ7 CitzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW07CisKK3N0cnVjdCBhbWR0cF9vdXRfc3RyZWFtIHsK KwlzdHJ1Y3QgZndfdW5pdCAqdW5pdDsKKwllbnVtIGNpcF9vdXRfZmxhZ3MgZmxhZ3M7CisJc3Ry dWN0IGZ3X2lzb19jb250ZXh0ICpjb250ZXh0OworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCWVu dW0gY2lwX3NmYyBzZmM7CisJdW5zaWduZWQgaW50IGRhdGFfYmxvY2tfcXVhZGxldHM7CisJdW5z aWduZWQgaW50IHBjbV9jaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgbWlkaV9wb3J0czsKKworCXVu c2lnbmVkIGludCBzeXRfaW50ZXJ2YWw7CisJdW5zaWduZWQgaW50IHNvdXJjZV9ub2RlX2lkX2Zp ZWxkOworCXN0cnVjdCBpc29fcGFja2V0c19idWZmZXIgYnVmZmVyOworCisJc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpwY207CisKKwl1bnNpZ25lZCBpbnQgcGFja2V0X2NvdW50ZXI7CisJdW5z aWduZWQgaW50IGRhdGFfYmxvY2tfY291bnRlcjsKKworCXVuc2lnbmVkIGludCBkYXRhX2Jsb2Nr X3N0YXRlOworCisJdW5zaWduZWQgaW50IGxhc3Rfc3l0X29mZnNldDsKKwl1bnNpZ25lZCBpbnQg c3l0X29mZnNldF9zdGF0ZTsKKworCXVuc2lnbmVkIGludCBwY21fYnVmZmVyX3BvaW50ZXI7CisJ dW5zaWduZWQgaW50IHBjbV9wZXJpb2RfcG9pbnRlcjsKK307CisKK2ludCBhbWR0cF9vdXRfc3Ry ZWFtX2luaXQoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMsIHN0cnVjdCBmd191bml0ICp1bml0 LAorCQkJICBlbnVtIGNpcF9vdXRfZmxhZ3MgZmxhZ3MpOwordm9pZCBhbWR0cF9vdXRfc3RyZWFt X2Rlc3Ryb3koc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMpOworCit2b2lkIGFtZHRwX291dF9z dHJlYW1fc2V0X3JhdGUoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMsIHVuc2lnbmVkIGludCBy YXRlKTsKK3Vuc2lnbmVkIGludCBhbWR0cF9vdXRfc3RyZWFtX2dldF9tYXhfcGF5bG9hZChzdHJ1 Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcyk7CisKK2ludCBhbWR0cF9vdXRfc3RyZWFtX3N0YXJ0KHN0 cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzLCBpbnQgY2hhbm5lbCwgaW50IHNwZWVkKTsKK3ZvaWQg YW1kdHBfb3V0X3N0cmVhbV91cGRhdGUoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMpOwordm9p ZCBhbWR0cF9vdXRfc3RyZWFtX3N0b3Aoc3RydWN0IGFtZHRwX291dF9zdHJlYW0gKnMpOwordm9p ZCBhbWR0cF9vdXRfc3RyZWFtX3BjbV9hYm9ydChzdHJ1Y3QgYW1kdHBfb3V0X3N0cmVhbSAqcyk7 CisKKy8qKgorICogYW1kdHBfb3V0X3N0cmVhbV9zZXRfcGNtIC0gY29uZmlndXJlIGZvcm1hdCBv ZiBQQ00gc2FtcGxlcworICogQHM6IHRoZSBBTURUUCBvdXRwdXQgc3RyZWFtIHRvIGJlIGNvbmZp Z3VyZWQKKyAqIEBwY21fY2hhbm5lbHM6IHRoZSBudW1iZXIgb2YgUENNIHNhbXBsZXMgaW4gZWFj aCBkYXRhIGJsb2NrLCB0byBiZSBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICBhcyBBTTgyNCBt dWx0aS1iaXQgbGluZWFyIGF1ZGlvCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBj YWxsZWQgd2hpbGUgdGhlIHN0cmVhbSBpcyBydW5uaW5nLgorICovCitzdGF0aWMgaW5saW5lIHZv aWQgYW1kdHBfb3V0X3N0cmVhbV9zZXRfcGNtKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzLAor CQkJCQkgICAgdW5zaWduZWQgaW50IHBjbV9jaGFubmVscykKK3sKKwlzLT5wY21fY2hhbm5lbHMg PSBwY21fY2hhbm5lbHM7Cit9CisKKy8qKgorICogYW1kdHBfb3V0X3N0cmVhbV9zZXRfbWlkaSAt IGNvbmZpZ3VyZSBmb3JtYXQgb2YgTUlESSBkYXRhCisgKiBAczogdGhlIEFNRFRQIG91dHB1dCBz dHJlYW0gdG8gYmUgY29uZmlndXJlZAorICogQG1pZGlfcG9ydHM6IHRoZSBudW1iZXIgb2YgTUlE SSBwb3J0cyAoaS5lLiwgTVBYLU1JREkgRGF0YSBDaGFubmVscykKKyAqCisgKiBUaGlzIGZ1bmN0 aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSB0aGUgc3RyZWFtIGlzIHJ1bm5pbmcuCisgKi8K K3N0YXRpYyBpbmxpbmUgdm9pZCBhbWR0cF9vdXRfc3RyZWFtX3NldF9taWRpKHN0cnVjdCBhbWR0 cF9vdXRfc3RyZWFtICpzLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBtaWRpX3BvcnRzKQorewor CXMtPm1pZGlfcG9ydHMgPSBtaWRpX3BvcnRzOworfQorCisvKioKKyAqIGFtZHRwX291dF9zdHJl YW1fcGNtX3ByZXBhcmUgLSBwcmVwYXJlIFBDTSBkZXZpY2UgZm9yIHJ1bm5pbmcKKyAqIEBzOiB0 aGUgQU1EVFAgb3V0cHV0IHN0cmVhbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNh bGxlZCBmcm9tIHRoZSBQQ00gZGV2aWNlJ3MgLnByZXBhcmUgY2FsbGJhY2suCisgKi8KK3N0YXRp YyBpbmxpbmUgdm9pZCBhbWR0cF9vdXRfc3RyZWFtX3BjbV9wcmVwYXJlKHN0cnVjdCBhbWR0cF9v dXRfc3RyZWFtICpzKQoreworCXMtPnBjbV9idWZmZXJfcG9pbnRlciA9IDA7CisJcy0+cGNtX3Bl cmlvZF9wb2ludGVyID0gMDsKK30KKworLyoqCisgKiBhbWR0cF9vdXRfc3RyZWFtX3BjbV90cmln Z2VyIC0gc3RhcnQvc3RvcCBwbGF5YmFjayBmcm9tIGEgUENNIGRldmljZQorICogQHM6IHRoZSBB TURUUCBvdXRwdXQgc3RyZWFtCisgKiBAcGNtOiB0aGUgUENNIGRldmljZSB0byBiZSBzdGFydGVk LCBvciAlTlVMTCB0byBzdG9wIHRoZSBjdXJyZW50IGRldmljZQorICoKKyAqIENhbGwgdGhpcyBm dW5jdGlvbiBvbiBhIHJ1bm5pbmcgaXNvY2hyb25vdXMgc3RyZWFtIHRvIGVuYWJsZSB0aGUgYWN0 dWFsCisgKiB0cmFuc21pc3Npb24gb2YgUENNIGRhdGEuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBi ZSBjYWxsZWQgZnJvbSB0aGUgUENNCisgKiBkZXZpY2UncyAudHJpZ2dlciBjYWxsYmFjay4KKyAq Lworc3RhdGljIGlubGluZSB2b2lkIGFtZHRwX291dF9zdHJlYW1fcGNtX3RyaWdnZXIoc3RydWN0 IGFtZHRwX291dF9zdHJlYW0gKnMsCisJCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBj bSkKK3sKKwlBQ0NFU1NfT05DRShzLT5wY20pID0gcGNtOworfQorCisvKioKKyAqIGFtZHRwX291 dF9zdHJlYW1fcGNtX3BvaW50ZXIgLSBnZXQgdGhlIFBDTSBidWZmZXIgcG9zaXRpb24KKyAqIEBz OiB0aGUgQU1EVFAgb3V0cHV0IHN0cmVhbSB0aGF0IHRyYW5zcG9ydHMgdGhlIFBDTSBkYXRhCisg KgorICogUmV0dXJucyB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24sIGluIGZyYW1lcy4KKyAq Lworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCithbWR0cF9vdXRfc3RyZWFtX3BjbV9wb2lu dGVyKHN0cnVjdCBhbWR0cF9vdXRfc3RyZWFtICpzKQoreworCXJldHVybiBBQ0NFU1NfT05DRShz LT5wY21fYnVmZmVyX3BvaW50ZXIpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY2lwX3NmY19p c19iYXNlXzQ0MTAwKGVudW0gY2lwX3NmYyBzZmMpCit7CisJcmV0dXJuIHNmYyAmIDE7Cit9CisK KyNlbmRpZgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoZSBtb2Rlcm4gZGF0YWNlbnRlciBkZXBl bmRzIG9uIG5ldHdvcmsgY29ubmVjdGl2aXR5IHRvIGFjY2VzcyByZXNvdXJjZXMKYW5kIHByb3Zp ZGUgc2VydmljZXMuIFRoZSBiZXN0IHByYWN0aWNlcyBmb3IgbWF4aW1pemluZyBhIHBoeXNpY2Fs IHNlcnZlcidzCmNvbm5lY3Rpdml0eSB0byBhIHBoeXNpY2FsIG5ldHdvcmsgYXJlIHdlbGwgdW5k ZXJzdG9vZCAtIHNlZSBob3cgdGhlc2UKcnVsZXMgdHJhbnNsYXRlIGludG8gdGhlIHZpcnR1YWwg d29ybGQ/IApodHRwOi8vcC5zZi5uZXQvc2Z1L29yYWNsZS1zZmRldm5sZmIKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbWFpbGluZyBsaXN0IGxpbnV4MTM5 NC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5u ZXQvbGlzdHMvbGlzdGluZm8vbGludXgxMzk0LWRldmVsCg==