Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754735AbdFWWjv (ORCPT ); Fri, 23 Jun 2017 18:39:51 -0400 Received: from mail-oi0-f54.google.com ([209.85.218.54]:33028 "EHLO mail-oi0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752606AbdFWWjt (ORCPT ); Fri, 23 Jun 2017 18:39:49 -0400 MIME-Version: 1.0 In-Reply-To: <594A9FA5.1080003@iogearbox.net> References: <1495754003-21099-1-git-send-email-illusionist.neo@gmail.com> <593E6B0F.8070901@iogearbox.net> <59419D1E.2060303@iogearbox.net> <594813AA.5010001@iogearbox.net> <59495367.3080402@iogearbox.net> <594A9FA5.1080003@iogearbox.net> From: Shubham Bansal Date: Sat, 24 Jun 2017 04:09:47 +0530 Message-ID: Subject: Re: [PATCH v2] arm: eBPF JIT compiler To: Daniel Borkmann Cc: Kees Cook , Network Development , "David S. Miller" , Alexei Starovoitov , Russell King , "linux-arm-kernel@lists.infradead.org" , LKML , Andrew Lunn Content-Type: multipart/mixed; boundary="001a11403d745ad7f90552a84761" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 119512 Lines: 1568 --001a11403d745ad7f90552a84761 Content-Type: text/plain; charset="UTF-8" Hi Russell,Daniel and Kees, I am attaching the latest patch with this mail. It included support for BPF_CALL | BPF_JMP tested with and without constant blinding on ARMv7 machine. Due to the limitation on my machine I can't test the tail call. It would be a great help if any of you could help me with this. Its been a long time since this patch is in works, Russell, can you please help with sending this patch to ARM patch tracker? Thanks. Shubham --001a11403d745ad7f90552a84761 Content-Type: application/octet-stream; name="0001-Added-Support-for-BPF_CALL-BPF_JMP.patch" Content-Disposition: attachment; filename="0001-Added-Support-for-BPF_CALL-BPF_JMP.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j4aftl8n0 RnJvbSA1MDJkZDc3Nzc2NWE5ODJjZTFiNDc5ZWUwMTkxMWZhNmZlMDIzYTc2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTaHViaGFtIEJhbnNhbCA8aWxsdXNpb25pc3QubmVvQGdtYWls LmNvbT4KRGF0ZTogU2F0LCAyNCBKdW4gMjAxNyAwNDowMzozNyArMDUzMApTdWJqZWN0OiBbUEFU Q0hdIEFkZGVkIFN1cHBvcnQgZm9yIEJQRl9DQUxMIHwgQlBGX0pNUC4KCi0tLQogYXJjaC9hcm0v S2NvbmZpZyAgICAgICAgICB8ICAgIDIgKy0KIGFyY2gvYXJtL25ldC9icGZfaml0XzMyLmMgfCAy NDMwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQogYXJjaC9h cm0vbmV0L2JwZl9qaXRfMzIuaCB8ICAxMDggKy0KIDMgZmlsZXMgY2hhbmdlZCwgMTczNiBpbnNl cnRpb25zKCspLCA4MDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZp ZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggNGMxYTM1Zi4uNTNiZjExNiAxMDA2NDQKLS0tIGEv YXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC00OCw3ICs0OCw3IEBA IGNvbmZpZyBBUk0KIAlzZWxlY3QgSEFWRV9BUkNIX1NFQ0NPTVBfRklMVEVSIGlmIChBRUFCSSAm JiAhT0FCSV9DT01QQVQpCiAJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKIAlzZWxlY3QgSEFW RV9BUk1fU01DQ0MgaWYgQ1BVX1Y3Ci0Jc2VsZWN0IEhBVkVfQ0JQRl9KSVQKKwlzZWxlY3QgSEFW RV9FQlBGX0pJVAogCXNlbGVjdCBIQVZFX0NDX1NUQUNLUFJPVEVDVE9SCiAJc2VsZWN0IEhBVkVf Q09OVEVYVF9UUkFDS0lORwogCXNlbGVjdCBIQVZFX0NfUkVDT1JETUNPVU5UCmRpZmYgLS1naXQg YS9hcmNoL2FybS9uZXQvYnBmX2ppdF8zMi5jIGIvYXJjaC9hcm0vbmV0L2JwZl9qaXRfMzIuYwpp bmRleCBkNWI5ZmExLi44YjhkZGM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9uZXQvYnBmX2ppdF8z Mi5jCisrKyBiL2FyY2gvYXJtL25ldC9icGZfaml0XzMyLmMKQEAgLTEsMTMgKzEsMTUgQEAKIC8q Ci0gKiBKdXN0LUluLVRpbWUgY29tcGlsZXIgZm9yIEJQRiBmaWx0ZXJzIG9uIDMyYml0IEFSTQor ICogSnVzdC1Jbi1UaW1lIGNvbXBpbGVyIGZvciBlQlBGIGZpbHRlcnMgb24gMzJiaXQgQVJNCiAg KgogICogQ29weXJpZ2h0IChjKSAyMDExIE1pcmNlYSBHaGVyemFuIDxtZ2hlcnphbkBnbWFpbC5j b20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgU2h1YmhhbSBCYW5zYWwgPGlsbHVzaW9uaXN0Lm5l b0BnbWFpbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICog RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKi8K IAorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2lu Y2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTE4 LDUwICsyMCw5NiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAogI2luY2x1ZGUgPGFz bS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3NldF9tZW1vcnkuaD4KICNpbmNsdWRlIDxh c20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vb3Bjb2Rlcy5oPgogCiAjaW5jbHVkZSAiYnBmX2pp dF8zMi5oIgogCitpbnQgYnBmX2ppdF9lbmFibGUgX19yZWFkX21vc3RseTsKKworI2RlZmluZSBT VEFDS19PRkZTRVQoaykJKGspCisjZGVmaW5lIFRNUF9SRUdfMQkoTUFYX0JQRl9KSVRfUkVHICsg MCkJLyogVEVNUCBSZWdpc3RlciAxICovCisjZGVmaW5lIFRNUF9SRUdfMgkoTUFYX0JQRl9KSVRf UkVHICsgMSkJLyogVEVNUCBSZWdpc3RlciAyICovCisjZGVmaW5lIFRDQUxMX0NOVAkoTUFYX0JQ Rl9KSVRfUkVHICsgMikJLyogVGFpbCBDYWxsIENvdW50ICovCisKKy8qIEZsYWdzIHVzZWQgZm9y IEpJVCBvcHRpbWl6YXRpb24gKi8KKyNkZWZpbmUgU0VFTl9DQUxMCSgxIDw8IDApCisKKyNkZWZp bmUgRkxBR19JTU1fT1ZFUkZMT1cJKDEgPDwgMCkKKwogLyoKLSAqIEFCSToKKyAqIE1hcCBlQlBG IHJlZ2lzdGVycyB0byBBUk0gMzJiaXQgcmVnaXN0ZXJzIG9yIHN0YWNrIHNjcmF0Y2ggc3BhY2Uu CisgKgorICogMS4gRmlyc3QgYXJndW1lbnQgaXMgcGFzc2VkIHVzaW5nIHRoZSBhcm0gMzJiaXQg cmVnaXN0ZXJzIGFuZCByZXN0IG9mIHRoZQorICogYXJndW1lbnRzIGFyZSBwYXNzZWQgb24gc3Rh Y2sgc2NyYXRjaCBzcGFjZS4KKyAqIDIuIEZpcnN0IGNhbGxlZS1zYXZlZCBhcmVndW1lbnQgaXMg bWFwcGVkIHRvIGFybSAzMiBiaXQgcmVnaXN0ZXJzIGFuZCByZXN0CisgKiBhcmd1bWVudHMgYXJl IG1hcHBlZCB0byBzY3JhdGNoIHNwYWNlIG9uIHN0YWNrLgorICogMy4gV2UgbmVlZCB0d28gNjQg Yml0IHRlbXAgcmVnaXN0ZXJzIHRvIGRvIGNvbXBsZXggb3BlcmF0aW9ucyBvbiBlQlBGCisgKiBy ZWdpc3RlcnMuCisgKgorICogQXMgdGhlIGVCUEYgcmVnaXN0ZXJzIGFyZSBhbGwgNjQgYml0IHJl Z2lzdGVycyBhbmQgYXJtIGhhcyBvbmx5IDMyIGJpdAorICogcmVnaXN0ZXJzLCB3ZSBoYXZlIHRv IG1hcCBlYWNoIGVCUEYgcmVnaXN0ZXJzIHdpdGggdHdvIGFybSAzMiBiaXQgcmVncyBvcgorICog c2NyYXRjaCBtZW1vcnkgc3BhY2UgYW5kIHdlIGhhdmUgdG8gYnVpbGQgZUJQRiA2NCBiaXQgcmVn aXN0ZXIgZnJvbSB0aG9zZS4KICAqCi0gKiByMAlzY3JhdGNoIHJlZ2lzdGVyCi0gKiByNAlCUEYg cmVnaXN0ZXIgQQotICogcjUJQlBGIHJlZ2lzdGVyIFgKLSAqIHI2CXBvaW50ZXIgdG8gdGhlIHNr YgotICogcjcJc2tiLT5kYXRhCi0gKiByOAlza2JfaGVhZGxlbihza2IpCiAgKi8KK3N0YXRpYyBj b25zdCB1OCBicGYyYTMyW11bMl0gPSB7CisJLyogcmV0dXJuIHZhbHVlIGZyb20gaW4ta2VybmVs IGZ1bmN0aW9uLCBhbmQgZXhpdCB2YWx1ZSBmcm9tIGVCUEYgKi8KKwlbQlBGX1JFR18wXSA9IHtB Uk1fUjEsIEFSTV9SMH0sCisJLyogYXJndW1lbnRzIGZyb20gZUJQRiBwcm9ncmFtIHRvIGluLWtl cm5lbCBmdW5jdGlvbiAqLworCVtCUEZfUkVHXzFdID0ge0FSTV9SMywgQVJNX1IyfSwKKwkvKiBT dG9yZWQgb24gc3RhY2sgc2NyYXRjaCBzcGFjZSAqLworCVtCUEZfUkVHXzJdID0ge1NUQUNLX09G RlNFVCgwKSwgU1RBQ0tfT0ZGU0VUKDQpfSwKKwlbQlBGX1JFR18zXSA9IHtTVEFDS19PRkZTRVQo OCksIFNUQUNLX09GRlNFVCgxMil9LAorCVtCUEZfUkVHXzRdID0ge1NUQUNLX09GRlNFVCgxNiks IFNUQUNLX09GRlNFVCgyMCl9LAorCVtCUEZfUkVHXzVdID0ge1NUQUNLX09GRlNFVCgyNCksIFNU QUNLX09GRlNFVCgyOCl9LAorCS8qIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgdGhhdCBpbi1rZXJu ZWwgZnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSAqLworCVtCUEZfUkVHXzZdID0ge0FSTV9SNSwgQVJN X1I0fSwKKwkvKiBTdG9yZWQgb24gc3RhY2sgc2NyYXRjaCBzcGFjZSAqLworCVtCUEZfUkVHXzdd ID0ge1NUQUNLX09GRlNFVCgzMiksIFNUQUNLX09GRlNFVCgzNil9LAorCVtCUEZfUkVHXzhdID0g e1NUQUNLX09GRlNFVCg0MCksIFNUQUNLX09GRlNFVCg0NCl9LAorCVtCUEZfUkVHXzldID0ge1NU QUNLX09GRlNFVCg0OCksIFNUQUNLX09GRlNFVCg1Mil9LAorCS8qIFJlYWQgb25seSBGcmFtZSBQ b2ludGVyIHRvIGFjY2VzcyBTdGFjayAqLworCVtCUEZfUkVHX0ZQXSA9IHtTVEFDS19PRkZTRVQo NTYpLCBTVEFDS19PRkZTRVQoNjApfSwKKwkvKiBUZW1wb3JhcnkgUmVnaXN0ZXIgZm9yIGludGVy bmFsIEJQRiBKSVQsIGNhbiBiZSB1c2VkCisJICogZm9yIGNvbnN0YW50IGJsaW5kaW5ncyBhbmQg b3RoZXJzLgorCSAqLworCVtUTVBfUkVHXzFdID0ge0FSTV9SNywgQVJNX1I2fSwKKwlbVE1QX1JF R18yXSA9IHtBUk1fUjEwLCBBUk1fUjh9LAorCS8qIFRhaWwgY2FsbCBjb3VudC4gU3RvcmVkIG9u IHN0YWNrIHNjcmF0Y2ggc3BhY2UuICovCisJW1RDQUxMX0NOVF0gPSB7U1RBQ0tfT0ZGU0VUKDY0 KSwgU1RBQ0tfT0ZGU0VUKDY4KX0sCisJLyogdGVtcG9yYXJ5IHJlZ2lzdGVyIGZvciBibGluZGlu ZyBjb25zdGFudHMuCisJICogU3RvcmVkIG9uIHN0YWNrIHNjcmF0Y2ggc3BhY2UuCisJICovCisJ W0JQRl9SRUdfQVhdID0ge1NUQUNLX09GRlNFVCg3MiksIFNUQUNLX09GRlNFVCg3Nil9LAorfTsK IAotI2RlZmluZSByX3NjcmF0Y2gJQVJNX1IwCi0vKiByMS1yMyBhcmUgKGFsc28pIHVzZWQgZm9y IHRoZSB1bmFsaWduZWQgbG9hZHMgb24gdGhlIG5vbi1BUk12NyBzbG93cGF0aCAqLwotI2RlZmlu ZSByX29mZgkJQVJNX1IxCi0jZGVmaW5lIHJfQQkJQVJNX1I0Ci0jZGVmaW5lIHJfWAkJQVJNX1I1 Ci0jZGVmaW5lIHJfc2tiCQlBUk1fUjYKLSNkZWZpbmUgcl9za2JfZGF0YQlBUk1fUjcKLSNkZWZp bmUgcl9za2JfaGwJQVJNX1I4Ci0KLSNkZWZpbmUgU0NSQVRDSF9TUF9PRkZTRVQJMAotI2RlZmlu ZSBTQ1JBVENIX09GRihrKQkJKFNDUkFUQ0hfU1BfT0ZGU0VUICsgNCAqIChrKSkKLQotI2RlZmlu ZSBTRUVOX01FTQkJKCgxIDw8IEJQRl9NRU1XT1JEUykgLSAxKQotI2RlZmluZSBTRUVOX01FTV9X T1JEKGspCSgxIDw8IChrKSkKLSNkZWZpbmUgU0VFTl9YCQkJKDEgPDwgQlBGX01FTVdPUkRTKQot I2RlZmluZSBTRUVOX0NBTEwJCSgxIDw8IChCUEZfTUVNV09SRFMgKyAxKSkKLSNkZWZpbmUgU0VF Tl9TS0IJCSgxIDw8IChCUEZfTUVNV09SRFMgKyAyKSkKLSNkZWZpbmUgU0VFTl9EQVRBCQkoMSA8 PCAoQlBGX01FTVdPUkRTICsgMykpCisjZGVmaW5lCWRzdF9sbwlkc3RbMV0KKyNkZWZpbmUgZHN0 X2hpCWRzdFswXQorI2RlZmluZSBzcmNfbG8Jc3JjWzFdCisjZGVmaW5lIHNyY19oaQlzcmNbMF0K IAotI2RlZmluZSBGTEFHX05FRURfWF9SRVNFVAkoMSA8PCAwKQotI2RlZmluZSBGTEFHX0lNTV9P VkVSRkxPVwkoMSA8PCAxKQorLyoKKyAqIEpJVCBDb250ZXh0OgorICoKKyAqIHByb2cJCQk6CWJw Zl9wcm9nCisgKiBpZHgJCQk6CWluZGV4IG9mIGN1cnJlbnQgbGFzdCBKSVRlZCBpbnN0cnVjdGlv bi4KKyAqIHByb2xvZ3VlX2J5dGVzCToJYnl0ZXMgdXNlZCBpbiBwcm9sb2d1ZS4KKyAqIGVwaWxv Z3VlX29mZnNldAk6CW9mZnNldCBvZiBlcGlsb2d1ZSBzdGFydGluZy4KKyAqIHNlZW4JCQk6CWJp dCBtYXNrIHVzZWQgZm9yIEpJVCBvcHRpbWl6YXRpb24uCisgKiBvZmZzZXRzCQk6CWFycmF5IG9m IGVCUEYgaW5zdHJ1Y3Rpb24gb2Zmc2V0cyBpbgorICoJCQkJSklUZWQgY29kZS4KKyAqIHRhcmdl dAkJOglmaW5hbCBKSVRlZCBjb2RlLgorICogZXBpbG9ndWVfYnl0ZXMJOglubyBvZiBieXRlcyB1 c2VkIGluIGVwaWxvZ3VlLgorICogaW1tX2NvdW50CQk6CW5vIG9mIGltbWVkaWF0ZSBjb3VudHMg dXNlZCBmb3IgZ2xvYmFsCisgKgkJCQl2YXJpYWJsZXMuCisgKiBpbW1zCQkJOglhcnJheSBvZiBn bG9iYWwgdmFyaWFibGUgYWRkcmVzc2VzLgorICovCiAKIHN0cnVjdCBqaXRfY3R4IHsKLQljb25z dCBzdHJ1Y3QgYnBmX3Byb2cgKnNrZjsKLQl1bnNpZ25lZCBpZHg7Ci0JdW5zaWduZWQgcHJvbG9n dWVfYnl0ZXM7Ci0JaW50IHJldDBfZnBfaWR4OworCWNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJv ZzsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBwcm9sb2d1ZV9ieXRlczsKKwl1 bnNpZ25lZCBpbnQgZXBpbG9ndWVfb2Zmc2V0OwogCXUzMiBzZWVuOwogCXUzMiBmbGFnczsKIAl1 MzIgKm9mZnNldHM7CkBAIC03Myw2OCArMTIxLDE2IEBAIHN0cnVjdCBqaXRfY3R4IHsKICNlbmRp ZgogfTsKIAotaW50IGJwZl9qaXRfZW5hYmxlIF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyBpbmxp bmUgaW50IGNhbGxfbmVnX2hlbHBlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCB2 b2lkICpyZXQsCi0JCSAgICAgIHVuc2lnbmVkIGludCBzaXplKQotewotCXZvaWQgKnB0ciA9IGJw Zl9pbnRlcm5hbF9sb2FkX3BvaW50ZXJfbmVnX2hlbHBlcihza2IsIG9mZnNldCwgc2l6ZSk7Ci0K LQlpZiAoIXB0cikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbWVtY3B5KHJldCwgcHRyLCBzaXplKTsK LQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU2NCBqaXRfZ2V0X3NrYl9iKHN0cnVjdCBza19idWZm ICpza2IsIGludCBvZmZzZXQpCi17Ci0JdTggcmV0OwotCWludCBlcnI7Ci0KLQlpZiAob2Zmc2V0 IDwgMCkKLQkJZXJyID0gY2FsbF9uZWdfaGVscGVyKHNrYiwgb2Zmc2V0LCAmcmV0LCAxKTsKLQll bHNlCi0JCWVyciA9IHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZyZXQsIDEpOwotCi0JcmV0 dXJuICh1NjQpZXJyIDw8IDMyIHwgcmV0OwotfQotCi1zdGF0aWMgdTY0IGppdF9nZXRfc2tiX2go c3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCkKLXsKLQl1MTYgcmV0OwotCWludCBlcnI7 Ci0KLQlpZiAob2Zmc2V0IDwgMCkKLQkJZXJyID0gY2FsbF9uZWdfaGVscGVyKHNrYiwgb2Zmc2V0 LCAmcmV0LCAyKTsKLQllbHNlCi0JCWVyciA9IHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZy ZXQsIDIpOwotCi0JcmV0dXJuICh1NjQpZXJyIDw8IDMyIHwgbnRvaHMocmV0KTsKLX0KLQotc3Rh dGljIHU2NCBqaXRfZ2V0X3NrYl93KHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQpCi17 Ci0JdTMyIHJldDsKLQlpbnQgZXJyOwotCi0JaWYgKG9mZnNldCA8IDApCi0JCWVyciA9IGNhbGxf bmVnX2hlbHBlcihza2IsIG9mZnNldCwgJnJldCwgNCk7Ci0JZWxzZQotCQllcnIgPSBza2JfY29w eV9iaXRzKHNrYiwgb2Zmc2V0LCAmcmV0LCA0KTsKLQotCXJldHVybiAodTY0KWVyciA8PCAzMiB8 IG50b2hsKHJldCk7Ci19Ci0KIC8qCiAgKiBXcmFwcGVycyB3aGljaCBoYW5kbGUgYm90aCBPQUJJ IGFuZCBFQUJJIGFuZCBhc3N1cmVzIFRodW1iMiBpbnRlcndvcmtpbmcKICAqICh3aGVyZSB0aGUg YXNzZW1ibHkgcm91dGluZXMgbGlrZSBfX2FlYWJpX3VpZGl2IGNvdWxkIGNhdXNlIHByb2JsZW1z KS4KICAqLwotc3RhdGljIHUzMiBqaXRfdWRpdih1MzIgZGl2aWRlbmQsIHUzMiBkaXZpc29yKQor c3RhdGljIHUzMiBqaXRfdWRpdjMyKHUzMiBkaXZpZGVuZCwgdTMyIGRpdmlzb3IpCiB7CiAJcmV0 dXJuIGRpdmlkZW5kIC8gZGl2aXNvcjsKIH0KIAotc3RhdGljIHUzMiBqaXRfbW9kKHUzMiBkaXZp ZGVuZCwgdTMyIGRpdmlzb3IpCitzdGF0aWMgdTMyIGppdF9tb2QzMih1MzIgZGl2aWRlbmQsIHUz MiBkaXZpc29yKQogewogCXJldHVybiBkaXZpZGVuZCAlIGRpdmlzb3I7CiB9CkBAIC0xNTgsMzYg KzE1NCwyMiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZW1pdCh1MzIgaW5zdCwgc3RydWN0IGppdF9j dHggKmN0eCkKIAlfZW1pdChBUk1fQ09ORF9BTCwgaW5zdCwgY3R4KTsKIH0KIAotc3RhdGljIHUx NiBzYXZlZF9yZWdzKHN0cnVjdCBqaXRfY3R4ICpjdHgpCisvKgorICogQ2hlY2tzIGlmIGltbWVk aWF0ZSB2YWx1ZSBjYW4gYmUgY29udmVydGVkIHRvIGltbTEyKDEyIGJpdHMpIHZhbHVlLgorICov CitzdGF0aWMgaW50MTZfdCBpbW04bSh1MzIgeCkKIHsKLQl1MTYgcmV0ID0gMDsKLQotCWlmICgo Y3R4LT5za2YtPmxlbiA+IDEpIHx8Ci0JICAgIChjdHgtPnNrZi0+aW5zbnNbMF0uY29kZSA9PSAo QlBGX1JFVCB8IEJQRl9BKSkpCi0JCXJldCB8PSAxIDw8IHJfQTsKLQotI2lmZGVmIENPTkZJR19G UkFNRV9QT0lOVEVSCi0JcmV0IHw9ICgxIDw8IEFSTV9GUCkgfCAoMSA8PCBBUk1fSVApIHwgKDEg PDwgQVJNX0xSKSB8ICgxIDw8IEFSTV9QQyk7Ci0jZWxzZQotCWlmIChjdHgtPnNlZW4gJiBTRUVO X0NBTEwpCi0JCXJldCB8PSAxIDw8IEFSTV9MUjsKLSNlbmRpZgotCWlmIChjdHgtPnNlZW4gJiAo U0VFTl9EQVRBIHwgU0VFTl9TS0IpKQotCQlyZXQgfD0gMSA8PCByX3NrYjsKLQlpZiAoY3R4LT5z ZWVuICYgU0VFTl9EQVRBKQotCQlyZXQgfD0gKDEgPDwgcl9za2JfZGF0YSkgfCAoMSA8PCByX3Nr Yl9obCk7Ci0JaWYgKGN0eC0+c2VlbiAmIFNFRU5fWCkKLQkJcmV0IHw9IDEgPDwgcl9YOwotCi0J cmV0dXJuIHJldDsKLX0KKwl1MzIgcm90OwogCi1zdGF0aWMgaW5saW5lIGludCBtZW1fd29yZHNf dXNlZChzdHJ1Y3Qgaml0X2N0eCAqY3R4KQotewotCS8qIHllcywgd2UgZG8gd2FzdGUgc29tZSBz dGFjayBzcGFjZSBJRiB0aGVyZSBhcmUgImhvbGVzIiBpbiB0aGUgc2V0IiAqLwotCXJldHVybiBm bHMoY3R4LT5zZWVuICYgU0VFTl9NRU0pOworCWZvciAocm90ID0gMDsgcm90IDwgMTY7IHJvdCsr KQorCQlpZiAoKHggJiB+cm9yMzIoMHhmZiwgMiAqIHJvdCkpID09IDApCisJCQlyZXR1cm4gcm9s MzIoeCwgMiAqIHJvdCkgfCAocm90IDw8IDgpOworCXJldHVybiAtMTsKIH0KIAorLyoKKyAqIElu aXRpYWxpemVzIHRoZSBKSVQgc3BhY2Ugd2l0aCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLgorICov CiBzdGF0aWMgdm9pZCBqaXRfZmlsbF9ob2xlKHZvaWQgKmFyZWEsIHVuc2lnbmVkIGludCBzaXpl KQogewogCXUzMiAqcHRyOwpAQCAtMTk2LDg4ICsxNzgsMzQgQEAgc3RhdGljIHZvaWQgaml0X2Zp bGxfaG9sZSh2b2lkICphcmVhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIAkJKnB0cisrID0gX19vcGNv ZGVfdG9fbWVtX2FybShBUk1fSU5TVF9VREYpOwogfQogCi1zdGF0aWMgdm9pZCBidWlsZF9wcm9s b2d1ZShzdHJ1Y3Qgaml0X2N0eCAqY3R4KQotewotCXUxNiByZWdfc2V0ID0gc2F2ZWRfcmVncyhj dHgpOwotCXUxNiBvZmY7Ci0KLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCWVtaXQoQVJN X01PVl9SKEFSTV9JUCwgQVJNX1NQKSwgY3R4KTsKLQllbWl0KEFSTV9QVVNIKHJlZ19zZXQpLCBj dHgpOwotCWVtaXQoQVJNX1NVQl9JKEFSTV9GUCwgQVJNX0lQLCA0KSwgY3R4KTsKLSNlbHNlCi0J aWYgKHJlZ19zZXQpCi0JCWVtaXQoQVJNX1BVU0gocmVnX3NldCksIGN0eCk7Ci0jZW5kaWYKLQot CWlmIChjdHgtPnNlZW4gJiAoU0VFTl9EQVRBIHwgU0VFTl9TS0IpKQotCQllbWl0KEFSTV9NT1Zf UihyX3NrYiwgQVJNX1IwKSwgY3R4KTsKLQotCWlmIChjdHgtPnNlZW4gJiBTRUVOX0RBVEEpIHsK LQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpOwotCQllbWl0KEFSTV9MRFJf SShyX3NrYl9kYXRhLCByX3NrYiwgb2ZmKSwgY3R4KTsKLQkJLyogaGVhZGxlbiA9IGxlbiAtIGRh dGFfbGVuICovCi0JCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pOwotCQllbWl0 KEFSTV9MRFJfSShyX3NrYl9obCwgcl9za2IsIG9mZiksIGN0eCk7Ci0JCW9mZiA9IG9mZnNldG9m KHN0cnVjdCBza19idWZmLCBkYXRhX2xlbik7Ci0JCWVtaXQoQVJNX0xEUl9JKHJfc2NyYXRjaCwg cl9za2IsIG9mZiksIGN0eCk7Ci0JCWVtaXQoQVJNX1NVQl9SKHJfc2tiX2hsLCByX3NrYl9obCwg cl9zY3JhdGNoKSwgY3R4KTsKLQl9CisvKiBTdGFjayBtdXN0IGJlIG11bHRpcGxlcyBvZiAxNiBC eXRlcyAqLworI2RlZmluZSBTVEFDS19BTElHTihzeikgKCgoc3opICsgMTUpICYgfjE1KQogCi0J aWYgKGN0eC0+ZmxhZ3MgJiBGTEFHX05FRURfWF9SRVNFVCkKLQkJZW1pdChBUk1fTU9WX0kocl9Y LCAwKSwgY3R4KTsKLQotCS8qIGRvIG5vdCBsZWFrIGtlcm5lbCBkYXRhIHRvIHVzZXJzcGFjZSAq LwotCWlmIChicGZfbmVlZHNfY2xlYXJfYSgmY3R4LT5za2YtPmluc25zWzBdKSkKLQkJZW1pdChB Uk1fTU9WX0kocl9BLCAwKSwgY3R4KTsKLQotCS8qIHN0YWNrIHNwYWNlIGZvciB0aGUgQlBGX01F TSB3b3JkcyAqLwotCWlmIChjdHgtPnNlZW4gJiBTRUVOX01FTSkKLQkJZW1pdChBUk1fU1VCX0ko QVJNX1NQLCBBUk1fU1AsIG1lbV93b3Jkc191c2VkKGN0eCkgKiA0KSwgY3R4KTsKLX0KLQotc3Rh dGljIHZvaWQgYnVpbGRfZXBpbG9ndWUoc3RydWN0IGppdF9jdHggKmN0eCkKLXsKLQl1MTYgcmVn X3NldCA9IHNhdmVkX3JlZ3MoY3R4KTsKLQotCWlmIChjdHgtPnNlZW4gJiBTRUVOX01FTSkKLQkJ ZW1pdChBUk1fQUREX0koQVJNX1NQLCBBUk1fU1AsIG1lbV93b3Jkc191c2VkKGN0eCkgKiA0KSwg Y3R4KTsKLQotCXJlZ19zZXQgJj0gfigxIDw8IEFSTV9MUik7Ci0KLSNpZmRlZiBDT05GSUdfRlJB TUVfUE9JTlRFUgotCS8qIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGUgcHJvbG9ndWUgd2Fz OiBtb3YgaXAsIHNwICovCi0JcmVnX3NldCAmPSB+KDEgPDwgQVJNX0lQKTsKLQlyZWdfc2V0IHw9 ICgxIDw8IEFSTV9TUCk7Ci0JZW1pdChBUk1fTERNKEFSTV9TUCwgcmVnX3NldCksIGN0eCk7Ci0j ZWxzZQotCWlmIChyZWdfc2V0KSB7Ci0JCWlmIChjdHgtPnNlZW4gJiBTRUVOX0NBTEwpCi0JCQly ZWdfc2V0IHw9IDEgPDwgQVJNX1BDOwotCQllbWl0KEFSTV9QT1AocmVnX3NldCksIGN0eCk7Ci0J fQorLyogU3RhY2sgc3BhY2UgZm9yIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBCUEZfUkVHXzQsCisg KiBCUEZfUkVHXzUsIEJQRl9SRUdfNywgQlBGX1JFR184LCBCUEZfUkVHXzksCisgKiBCUEZfUkVH X0ZQIGFuZCBUYWlsIGNhbGwgY291bnRzLgorICovCisjZGVmaW5lIFNDUkFUQ0hfU0laRSA4MAog Ci0JaWYgKCEoY3R4LT5zZWVuICYgU0VFTl9DQUxMKSkKLQkJZW1pdChBUk1fQlgoQVJNX0xSKSwg Y3R4KTsKLSNlbmRpZgotfQorLyogdG90YWwgc3RhY2sgc2l6ZSB1c2VkIGluIEpJVGVkIGNvZGUg Ki8KKyNkZWZpbmUgX1NUQUNLX1NJWkUgXAorCShNQVhfQlBGX1NUQUNLICsgXAorCSArIFNDUkFU Q0hfU0laRSArIFwKKwkgKyA0IC8qIGV4dHJhIGZvciBza2JfY29weV9iaXRzIGJ1ZmZlciAqLykK IAotc3RhdGljIGludDE2X3QgaW1tOG0odTMyIHgpCi17Ci0JdTMyIHJvdDsKKyNkZWZpbmUgU1RB Q0tfU0laRSBTVEFDS19BTElHTihfU1RBQ0tfU0laRSkKIAotCWZvciAocm90ID0gMDsgcm90IDwg MTY7IHJvdCsrKQotCQlpZiAoKHggJiB+cm9yMzIoMHhmZiwgMiAqIHJvdCkpID09IDApCi0JCQly ZXR1cm4gcm9sMzIoeCwgMiAqIHJvdCkgfCAocm90IDw8IDgpOworLyogR2V0IHRoZSBvZmZzZXQg b2YgZUJQRiBSRUdJU1RFUnMgc3RvcmVkIG9uIHNjcmF0Y2ggc3BhY2UuICovCisjZGVmaW5lIFNU QUNLX1ZBUihvZmYpIChTVEFDS19TSVpFLW9mZi00KQogCi0JcmV0dXJuIC0xOwotfQorLyogT2Zm c2V0IG9mIHNrYl9jb3B5X2JpdHMgYnVmZmVyICovCisjZGVmaW5lIFNLQl9CVUZGRVIgU1RBQ0tf VkFSKFNDUkFUQ0hfU0laRSkKIAogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA8IDcKIAogc3RhdGlj IHUxNiBpbW1fb2Zmc2V0KHUzMiBrLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQogewotCXVuc2lnbmVk IGkgPSAwLCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGkgPSAwLCBvZmZzZXQ7CiAJdTE2IGltbTsK IAogCS8qIG9uIHRoZSAiZmFrZSIgcnVuIHdlIGp1c3QgY291bnQgdGhlbSAoZHVwbGljYXRlcyBp bmNsdWRlZCkgKi8KQEAgLTI5Niw3ICsyMjQsNyBAQCBzdGF0aWMgdTE2IGltbV9vZmZzZXQodTMy IGssIHN0cnVjdCBqaXRfY3R4ICpjdHgpCiAJCWN0eC0+aW1tc1tpXSA9IGs7CiAKIAkvKiBjb25z dGFudHMgZ28ganVzdCBhZnRlciB0aGUgZXBpbG9ndWUgKi8KLQlvZmZzZXQgPSAgY3R4LT5vZmZz ZXRzW2N0eC0+c2tmLT5sZW5dOworCW9mZnNldCA9ICBjdHgtPm9mZnNldHNbY3R4LT5wcm9nLT5s ZW4gLSAxXSAqIDQ7CiAJb2Zmc2V0ICs9IGN0eC0+cHJvbG9ndWVfYnl0ZXM7CiAJb2Zmc2V0ICs9 IGN0eC0+ZXBpbG9ndWVfYnl0ZXM7CiAJb2Zmc2V0ICs9IGkgKiA0OwpAQCAtMzIwLDEwICsyNDgs MjIgQEAgc3RhdGljIHUxNiBpbW1fb2Zmc2V0KHUzMiBrLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQog CiAjZW5kaWYgLyogX19MSU5VWF9BUk1fQVJDSF9fICovCiAKK3N0YXRpYyBpbmxpbmUgaW50IGJw ZjJhMzJfb2Zmc2V0KGludCBicGZfdG8sIGludCBicGZfZnJvbSwKKwkJCQkgY29uc3Qgc3RydWN0 IGppdF9jdHggKmN0eCkgeworCWludCB0bywgZnJvbTsKKworCWlmIChjdHgtPnRhcmdldCA9PSBO VUxMKQorCQlyZXR1cm4gMDsKKwl0byA9IGN0eC0+b2Zmc2V0c1ticGZfdG9dOworCWZyb20gPSBj dHgtPm9mZnNldHNbYnBmX2Zyb21dOworCisJcmV0dXJuIHRvIC0gZnJvbSAtIDE7Cit9CisKIC8q CiAgKiBNb3ZlIGFuIGltbWVkaWF0ZSB0aGF0J3Mgbm90IGFuIGltbThtIHRvIGEgY29yZSByZWdp c3Rlci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGVtaXRfbW92X2lfbm84bShpbnQgcmQsIHUz MiB2YWwsIHN0cnVjdCBqaXRfY3R4ICpjdHgpCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9tb3Zf aV9ubzhtKGNvbnN0IHU4IHJkLCB1MzIgdmFsLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQogewogI2lm IF9fTElOVVhfQVJNX0FSQ0hfXyA8IDcKIAllbWl0KEFSTV9MRFJfSShyZCwgQVJNX1BDLCBpbW1f b2Zmc2V0KHZhbCwgY3R4KSksIGN0eCk7CkBAIC0zMzQsNyArMjc0LDcgQEAgc3RhdGljIGlubGlu ZSB2b2lkIGVtaXRfbW92X2lfbm84bShpbnQgcmQsIHUzMiB2YWwsIHN0cnVjdCBqaXRfY3R4ICpj dHgpCiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVtaXRfbW92X2koaW50IHJkLCB1 MzIgdmFsLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQorc3RhdGljIGlubGluZSB2b2lkIGVtaXRfbW92 X2koY29uc3QgdTggcmQsIHUzMiB2YWwsIHN0cnVjdCBqaXRfY3R4ICpjdHgpCiB7CiAJaW50IGlt bTEyID0gaW1tOG0odmFsKTsKIApAQCAtMzQ0LDY3NiArMjg0LDE1NzggQEAgc3RhdGljIGlubGlu ZSB2b2lkIGVtaXRfbW92X2koaW50IHJkLCB1MzIgdmFsLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQog CQllbWl0X21vdl9pX25vOG0ocmQsIHZhbCwgY3R4KTsKIH0KIAotI2lmIF9fTElOVVhfQVJNX0FS Q0hfXyA8IDYKLQotc3RhdGljIHZvaWQgZW1pdF9sb2FkX2JlMzIodTggY29uZCwgdTggcl9yZXMs IHU4IHJfYWRkciwgc3RydWN0IGppdF9jdHggKmN0eCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0 X2JseF9yKHU4IHRndF9yZWcsIHN0cnVjdCBqaXRfY3R4ICpjdHgpCiB7Ci0JX2VtaXQoY29uZCwg QVJNX0xEUkJfSShBUk1fUjMsIHJfYWRkciwgMSksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX0xE UkJfSShBUk1fUjEsIHJfYWRkciwgMCksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX0xEUkJfSShB Uk1fUjIsIHJfYWRkciwgMyksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX0xTTF9JKEFSTV9SMywg QVJNX1IzLCAxNiksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX0xEUkJfSShBUk1fUjAsIHJfYWRk ciwgMiksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX09SUl9TKEFSTV9SMywgQVJNX1IzLCBBUk1f UjEsIFNSVFlQRV9MU0wsIDI0KSwgY3R4KTsKLQlfZW1pdChjb25kLCBBUk1fT1JSX1IoQVJNX1Iz LCBBUk1fUjMsIEFSTV9SMiksIGN0eCk7Ci0JX2VtaXQoY29uZCwgQVJNX09SUl9TKHJfcmVzLCBB Uk1fUjMsIEFSTV9SMCwgU1JUWVBFX0xTTCwgOCksIGN0eCk7CisJY3R4LT5zZWVuIHw9IFNFRU5f Q0FMTDsKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA1CisJZW1pdChBUk1fTU9WX1IoQVJNX0xS LCBBUk1fUEMpLCBjdHgpOworCisJaWYgKGVsZl9od2NhcCAmIEhXQ0FQX1RIVU1CKQorCQllbWl0 KEFSTV9CWCh0Z3RfcmVnKSwgY3R4KTsKKwllbHNlCisJCWVtaXQoQVJNX01PVl9SKEFSTV9QQywg dGd0X3JlZyksIGN0eCk7CisjZWxzZQorCWVtaXQoQVJNX0JMWF9SKHRndF9yZWcpLCBjdHgpOwor I2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZF9iZTE2KHU4IGNvbmQsIHU4IHJfcmVz LCB1OCByX2FkZHIsIHN0cnVjdCBqaXRfY3R4ICpjdHgpCitzdGF0aWMgaW5saW5lIGludCBlcGls b2d1ZV9vZmZzZXQoY29uc3Qgc3RydWN0IGppdF9jdHggKmN0eCkKIHsKLQlfZW1pdChjb25kLCBB Uk1fTERSQl9JKEFSTV9SMSwgcl9hZGRyLCAwKSwgY3R4KTsKLQlfZW1pdChjb25kLCBBUk1fTERS Ql9JKEFSTV9SMiwgcl9hZGRyLCAxKSwgY3R4KTsKLQlfZW1pdChjb25kLCBBUk1fT1JSX1Mocl9y ZXMsIEFSTV9SMiwgQVJNX1IxLCBTUlRZUEVfTFNMLCA4KSwgY3R4KTsKKwlpbnQgdG8sIGZyb207 CisJLyogTm8gbmVlZCBmb3IgMXN0IGR1bW15IHJ1biAqLworCWlmIChjdHgtPnRhcmdldCA9PSBO VUxMKQorCQlyZXR1cm4gMDsKKwl0byA9IGN0eC0+ZXBpbG9ndWVfb2Zmc2V0OworCWZyb20gPSBj dHgtPmlkeDsKKworCXJldHVybiB0byAtIGZyb20gLSAyOwogfQogCi1zdGF0aWMgaW5saW5lIHZv aWQgZW1pdF9zd2FwMTYodTggcl9kc3QsIHU4IHJfc3JjLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQor c3RhdGljIGlubGluZSB2b2lkIGVtaXRfdWRpdm1vZCh1OCByZCwgdTggcm0sIHU4IHJuLCBzdHJ1 Y3Qgaml0X2N0eCAqY3R4LCB1OCBvcCkKIHsKLQkvKiByX2RzdCA9IChyX3NyYyA8PCA4KSB8IChy X3NyYyA+PiA4KSAqLwotCWVtaXQoQVJNX0xTTF9JKEFSTV9SMSwgcl9zcmMsIDgpLCBjdHgpOwot CWVtaXQoQVJNX09SUl9TKHJfZHN0LCBBUk1fUjEsIHJfc3JjLCBTUlRZUEVfTFNSLCA4KSwgY3R4 KTsKKwljb25zdCB1OCAqdG1wID0gYnBmMmEzMltUTVBfUkVHXzFdOworCXMzMiBqbXBfb2Zmc2V0 OworCisJLyogY2hlY2tzIGlmIGRpdmlzb3IgaXMgemVybyBvciBub3QuIElmIGl0IGlzLCB0aGVu CisJICogZXhpdCBkaXJlY3RseS4KKwkgKi8KKwllbWl0KEFSTV9DTVBfSShybiwgMCksIGN0eCk7 CisJX2VtaXQoQVJNX0NPTkRfRVEsIEFSTV9NT1ZfSShBUk1fUjAsIDApLCBjdHgpOworCWptcF9v ZmZzZXQgPSBlcGlsb2d1ZV9vZmZzZXQoY3R4KTsKKwlfZW1pdChBUk1fQ09ORF9FUSwgQVJNX0Io am1wX29mZnNldCksIGN0eCk7CisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID09IDcKKwlpZiAoZWxm X2h3Y2FwICYgSFdDQVBfSURJVkEpIHsKKwkJaWYgKG9wID09IEJQRl9ESVYpCisJCQllbWl0KEFS TV9VRElWKHJkLCBybSwgcm4pLCBjdHgpOworCQllbHNlIHsKKwkJCWVtaXQoQVJNX1VESVYoQVJN X0lQLCBybSwgcm4pLCBjdHgpOworCQkJZW1pdChBUk1fTUxTKHJkLCBybiwgQVJNX0lQLCBybSks IGN0eCk7CisJCX0KKwkJcmV0dXJuOworCX0KKyNlbmRpZgogCiAJLyoKLQkgKiB3ZSBuZWVkIHRv IG1hc2sgb3V0IHRoZSBiaXRzIHNldCBpbiByX2RzdFsyMzoxNl0gZHVlIHRvCi0JICogdGhlIGZp cnN0IHNoaWZ0IGluc3RydWN0aW9uLgotCSAqCi0JICogbm90ZSB0aGF0IDB4OGZmIGlzIHRoZSBl bmNvZGVkIGltbWVkaWF0ZSAweDAwZmYwMDAwLgorCSAqIEZvciBCUEZfQUxVIHwgQlBGX0RJViB8 IEJQRl9LIGluc3RydWN0aW9ucworCSAqIEFzIEFSTV9SMSBhbmQgQVJNX1IwIGNvbnRhaW5zIDFz dCBhcmd1bWVudCBvZiBicGYKKwkgKiBmdW5jdGlvbiwgd2UgbmVlZCB0byBzYXZlIGl0IG9uIGNh bGxlciBzaWRlIHRvIHNhdmUKKwkgKiBpdCBmcm9tIGdldHRpbmcgZGVzdHJveWVkIHdpdGhpbiBj YWxsZWUuCisJICogQWZ0ZXIgdGhlIHJldHVybiBmcm9tIHRoZSBjYWxsZWUsIHdlIHJlc3RvcmUg QVJNX1IwCisJICogQVJNX1IxLgogCSAqLwotCWVtaXQoQVJNX0JJQ19JKHJfZHN0LCByX2RzdCwg MHg4ZmYpLCBjdHgpOwotfQorCWlmIChybiAhPSBBUk1fUjEpIHsKKwkJZW1pdChBUk1fTU9WX1Io dG1wWzBdLCBBUk1fUjEpLCBjdHgpOworCQllbWl0KEFSTV9NT1ZfUihBUk1fUjEsIHJuKSwgY3R4 KTsKKwl9CisJaWYgKHJtICE9IEFSTV9SMCkgeworCQllbWl0KEFSTV9NT1ZfUih0bXBbMV0sIEFS TV9SMCksIGN0eCk7CisJCWVtaXQoQVJNX01PVl9SKEFSTV9SMCwgcm0pLCBjdHgpOworCX0KKwor CS8qIENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKi8KKwljdHgtPnNlZW4gfD0gU0VFTl9DQUxM OworCWVtaXRfbW92X2koQVJNX0lQLCBvcCA9PSBCUEZfRElWID8KKwkJICAgKHUzMilqaXRfdWRp djMyIDogKHUzMilqaXRfbW9kMzIsIGN0eCk7CisJZW1pdF9ibHhfcihBUk1fSVAsIGN0eCk7CiAK LSNlbHNlICAvKiBBUk12NisgKi8KKwkvKiBTYXZlIHJldHVybiB2YWx1ZSAqLworCWlmIChyZCAh PSBBUk1fUjApCisJCWVtaXQoQVJNX01PVl9SKHJkLCBBUk1fUjApLCBjdHgpOwogCi1zdGF0aWMg dm9pZCBlbWl0X2xvYWRfYmUzMih1OCBjb25kLCB1OCByX3JlcywgdTggcl9hZGRyLCBzdHJ1Y3Qg aml0X2N0eCAqY3R4KQotewotCV9lbWl0KGNvbmQsIEFSTV9MRFJfSShyX3Jlcywgcl9hZGRyLCAw KSwgY3R4KTsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfZW1pdChjb25kLCBBUk1fUkVWKHJf cmVzLCByX3JlcyksIGN0eCk7Ci0jZW5kaWYKKwkvKiBSZXN0b3JlIEFSTV9SMCBhbmQgQVJNX1Ix ICovCisJaWYgKHJuICE9IEFSTV9SMSkKKwkJZW1pdChBUk1fTU9WX1IoQVJNX1IxLCB0bXBbMF0p LCBjdHgpOworCWlmIChybSAhPSBBUk1fUjApCisJCWVtaXQoQVJNX01PVl9SKEFSTV9SMCwgdG1w WzFdKSwgY3R4KTsKIH0KIAotc3RhdGljIHZvaWQgZW1pdF9sb2FkX2JlMTYodTggY29uZCwgdTgg cl9yZXMsIHU4IHJfYWRkciwgc3RydWN0IGppdF9jdHggKmN0eCkKKy8qIENoZWNrcyB3aGV0aGVy IEJQRiByZWdpc3RlciBpcyBvbiBzY3JhdGNoIHN0YWNrIHNwYWNlIG9yIG5vdC4gKi8KK3N0YXRp YyBpbmxpbmUgYm9vbCBpc19vbl9zdGFjayh1OCBicGZfcmVnKQogewotCV9lbWl0KGNvbmQsIEFS TV9MRFJIX0kocl9yZXMsIHJfYWRkciwgMCksIGN0eCk7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFO Ci0JX2VtaXQoY29uZCwgQVJNX1JFVjE2KHJfcmVzLCByX3JlcyksIGN0eCk7Ci0jZW5kaWYKKwlz dGF0aWMgdTggc3RhY2tfcmVnc1tdID0ge0JQRl9SRUdfQVgsIEJQRl9SRUdfMywgQlBGX1JFR180 LCBCUEZfUkVHXzUsCisJCQkJQlBGX1JFR183LCBCUEZfUkVHXzgsIEJQRl9SRUdfOSwgVENBTExf Q05ULAorCQkJCUJQRl9SRUdfMiwgQlBGX1JFR19GUH07CisJaW50IGksIHJlZ19sZW4gPSBzaXpl b2Yoc3RhY2tfcmVncyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IHJlZ19sZW4gOyBpKyspIHsKKwkJ aWYgKGJwZl9yZWcgPT0gc3RhY2tfcmVnc1tpXSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1 cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X3N3YXAxNih1OCByX2RzdCBf X21heWJlX3VudXNlZCwKLQkJCSAgICAgICB1OCByX3NyYyBfX21heWJlX3VudXNlZCwKLQkJCSAg ICAgICBzdHJ1Y3Qgaml0X2N0eCAqY3R4IF9fbWF5YmVfdW51c2VkKQorc3RhdGljIGlubGluZSB2 b2lkIGVtaXRfYTMyX21vdl9pKGNvbnN0IHU4IGRzdCwgY29uc3QgdTMyIHZhbCwKKwkJCQkgIGJv b2wgZHN0aywgc3RydWN0IGppdF9jdHggKmN0eCkKIHsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4K LQllbWl0KEFSTV9SRVYxNihyX2RzdCwgcl9zcmMpLCBjdHgpOwotI2VuZGlmCisJY29uc3QgdTgg KnRtcCA9IGJwZjJhMzJbVE1QX1JFR18xXTsKKworCWlmIChkc3RrKSB7CisJCWVtaXRfbW92X2ko dG1wWzFdLCB2YWwsIGN0eCk7CisJCWVtaXQoQVJNX1NUUl9JKHRtcFsxXSwgQVJNX1NQLCBTVEFD S19WQVIoZHN0KSksIGN0eCk7CisJfSBlbHNlIHsKKwkJZW1pdF9tb3ZfaShkc3QsIHZhbCwgY3R4 KTsKKwl9CiB9CiAKLSNlbmRpZiAvKiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2ICovCisvKiBTaWdu IGV4dGVuZGVkIG1vdmUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9tb3ZfaTY0KGNv bnN0IGJvb2wgaXM2NCwgY29uc3QgdTggZHN0W10sCisJCQkJICBjb25zdCB1MzIgdmFsLCBib29s IGRzdGssCisJCQkJICBzdHJ1Y3Qgaml0X2N0eCAqY3R4KSB7CisJdTMyIGhpID0gMDsKIAorCWlm IChpczY0ICYmICh2YWwgJiAoMTw8MzEpKSkKKwkJaGkgPSAodTMyKX4wOworCWVtaXRfYTMyX21v dl9pKGRzdF9sbywgdmFsLCBkc3RrLCBjdHgpOworCWVtaXRfYTMyX21vdl9pKGRzdF9oaSwgaGks IGRzdGssIGN0eCk7Cit9CiAKLS8qIENvbXB1dGUgdGhlIGltbWVkaWF0ZSB2YWx1ZSBmb3IgYSBQ Qy1yZWxhdGl2ZSBicmFuY2guICovCi1zdGF0aWMgaW5saW5lIHUzMiBiX2ltbSh1bnNpZ25lZCB0 Z3QsIHN0cnVjdCBqaXRfY3R4ICpjdHgpCi17Ci0JdTMyIGltbTsKK3N0YXRpYyBpbmxpbmUgdm9p ZCBlbWl0X2EzMl9hZGRfcihjb25zdCB1OCBkc3QsIGNvbnN0IHU4IHNyYywKKwkJCSAgICAgIGNv bnN0IGJvb2wgaXM2NCwgY29uc3QgYm9vbCBoaSwKKwkJCSAgICAgIHN0cnVjdCBqaXRfY3R4ICpj dHgpIHsKKwkvKiA2NCBiaXQgOgorCSAqCWFkZHMgZHN0X2xvLCBkc3RfbG8sIHNyY19sbworCSAq CWFkYyBkc3RfaGksIGRzdF9oaSwgc3JjX2hpCisJICogMzIgYml0IDoKKwkgKglhZGQgZHN0X2xv LCBkc3RfbG8sIHNyY19sbworCSAqLworCWlmICghaGkgJiYgaXM2NCkKKwkJZW1pdChBUk1fQURE U19SKGRzdCwgZHN0LCBzcmMpLCBjdHgpOworCWVsc2UgaWYgKGhpICYmIGlzNjQpCisJCWVtaXQo QVJNX0FEQ19SKGRzdCwgZHN0LCBzcmMpLCBjdHgpOworCWVsc2UKKwkJZW1pdChBUk1fQUREX1Io ZHN0LCBkc3QsIHNyYyksIGN0eCk7Cit9CiAKLQlpZiAoY3R4LT50YXJnZXQgPT0gTlVMTCkKLQkJ cmV0dXJuIDA7Ci0JLyoKLQkgKiBCUEYgYWxsb3dzIG9ubHkgZm9yd2FyZCBqdW1wcyBhbmQgdGhl IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGlzCi0JICogc3RpbGwgdGhlIG9uZSBjb21wdXRlZCBkdXJp bmcgdGhlIGZpcnN0IHBhc3MuCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9hMzJfc3ViX3IoY29u c3QgdTggZHN0LCBjb25zdCB1OCBzcmMsCisJCQkJICBjb25zdCBib29sIGlzNjQsIGNvbnN0IGJv b2wgaGksCisJCQkJICBzdHJ1Y3Qgaml0X2N0eCAqY3R4KSB7CisJLyogNjQgYml0IDoKKwkgKglz dWJzIGRzdF9sbywgZHN0X2xvLCBzcmNfbG8KKwkgKglzYmMgZHN0X2hpLCBkc3RfaGksIHNyY19o aQorCSAqIDMyIGJpdCA6CisJICoJc3ViIGRzdF9sbywgZHN0X2xvLCBzcmNfbG8KIAkgKi8KLQlp bW0gID0gY3R4LT5vZmZzZXRzW3RndF0gKyBjdHgtPnByb2xvZ3VlX2J5dGVzIC0gKGN0eC0+aWR4 ICogNCArIDgpOworCWlmICghaGkgJiYgaXM2NCkKKwkJZW1pdChBUk1fU1VCU19SKGRzdCwgZHN0 LCBzcmMpLCBjdHgpOworCWVsc2UgaWYgKGhpICYmIGlzNjQpCisJCWVtaXQoQVJNX1NCQ19SKGRz dCwgZHN0LCBzcmMpLCBjdHgpOworCWVsc2UKKwkJZW1pdChBUk1fU1VCX1IoZHN0LCBkc3QsIHNy YyksIGN0eCk7Cit9CiAKLQlyZXR1cm4gaW1tID4+IDI7CitzdGF0aWMgaW5saW5lIHZvaWQgZW1p dF9hbHVfcihjb25zdCB1OCBkc3QsIGNvbnN0IHU4IHNyYywgY29uc3QgYm9vbCBpczY0LAorCQkJ ICAgICAgY29uc3QgYm9vbCBoaSwgY29uc3QgdTggb3AsIHN0cnVjdCBqaXRfY3R4ICpjdHgpewor CXN3aXRjaCAoQlBGX09QKG9wKSkgeworCS8qIGRzdCA9IGRzdCArIHNyYyAqLworCWNhc2UgQlBG X0FERDoKKwkJZW1pdF9hMzJfYWRkX3IoZHN0LCBzcmMsIGlzNjQsIGhpLCBjdHgpOworCQlicmVh azsKKwkvKiBkc3QgPSBkc3QgLSBzcmMgKi8KKwljYXNlIEJQRl9TVUI6CisJCWVtaXRfYTMyX3N1 Yl9yKGRzdCwgc3JjLCBpczY0LCBoaSwgY3R4KTsKKwkJYnJlYWs7CisJLyogZHN0ID0gZHN0IHwg c3JjICovCisJY2FzZSBCUEZfT1I6CisJCWVtaXQoQVJNX09SUl9SKGRzdCwgZHN0LCBzcmMpLCBj dHgpOworCQlicmVhazsKKwkvKiBkc3QgPSBkc3QgJiBzcmMgKi8KKwljYXNlIEJQRl9BTkQ6CisJ CWVtaXQoQVJNX0FORF9SKGRzdCwgZHN0LCBzcmMpLCBjdHgpOworCQlicmVhazsKKwkvKiBkc3Qg PSBkc3QgXiBzcmMgKi8KKwljYXNlIEJQRl9YT1I6CisJCWVtaXQoQVJNX0VPUl9SKGRzdCwgZHN0 LCBzcmMpLCBjdHgpOworCQlicmVhazsKKwkvKiBkc3QgPSBkc3QgKiBzcmMgKi8KKwljYXNlIEJQ Rl9NVUw6CisJCWVtaXQoQVJNX01VTChkc3QsIGRzdCwgc3JjKSwgY3R4KTsKKwkJYnJlYWs7CisJ LyogZHN0ID0gZHN0IDw8IHNyYyAqLworCWNhc2UgQlBGX0xTSDoKKwkJZW1pdChBUk1fTFNMX1Io ZHN0LCBkc3QsIHNyYyksIGN0eCk7CisJCWJyZWFrOworCS8qIGRzdCA9IGRzdCA+PiBzcmMgKi8K KwljYXNlIEJQRl9SU0g6CisJCWVtaXQoQVJNX0xTUl9SKGRzdCwgZHN0LCBzcmMpLCBjdHgpOwor CQlicmVhazsKKwkvKiBkc3QgPSBkc3QgPj4gc3JjIChzaWduZWQpKi8KKwljYXNlIEJQRl9BUlNI OgorCQllbWl0KEFSTV9NT1ZfU1IoZHN0LCBkc3QsIFNSVFlQRV9BU1IsIHNyYyksIGN0eCk7CisJ CWJyZWFrOworCX0KIH0KIAotI2RlZmluZSBPUF9JTU0zKG9wLCByMSwgcjIsIGltbV92YWwsIGN0 eCkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaW1tMTIgPSBpbW04bShpbW1fdmFsKTsJCQkJCVwK LQkJaWYgKGltbTEyIDwgMCkgewkJCQkJXAotCQkJZW1pdF9tb3ZfaV9ubzhtKHJfc2NyYXRjaCwg aW1tX3ZhbCwgY3R4KTsJXAotCQkJZW1pdChvcCAjIyBfUigocjEpLCAocjIpLCByX3NjcmF0Y2gp LCBjdHgpOwlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJZW1pdChvcCAjIyBfSSgocjEpLCAocjIp LCBpbW0xMiksIGN0eCk7CQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyBp bmxpbmUgdm9pZCBlbWl0X2Vycl9yZXQodTggY29uZCwgc3RydWN0IGppdF9jdHggKmN0eCkKLXsK LQlpZiAoY3R4LT5yZXQwX2ZwX2lkeCA+PSAwKSB7Ci0JCV9lbWl0KGNvbmQsIEFSTV9CKGJfaW1t KGN0eC0+cmV0MF9mcF9pZHgsIGN0eCkpLCBjdHgpOwotCQkvKiBOT1AgdG8ga2VlcCB0aGUgc2l6 ZSBjb25zdGFudCBiZXR3ZWVuIHBhc3NlcyAqLwotCQllbWl0KEFSTV9NT1ZfUihBUk1fUjAsIEFS TV9SMCksIGN0eCk7CisvKiBBTFUgb3BlcmF0aW9uICgzMiBiaXQpCisgKiBkc3QgPSBkc3QgKG9w KSBzcmMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVtaXRfYTMyX2FsdV9yKGNvbnN0IHU4IGRz dCwgY29uc3QgdTggc3JjLAorCQkJCSAgYm9vbCBkc3RrLCBib29sIHNzdGssCisJCQkJICBzdHJ1 Y3Qgaml0X2N0eCAqY3R4LCBjb25zdCBib29sIGlzNjQsCisJCQkJICBjb25zdCBib29sIGhpLCBj b25zdCB1OCBvcCkgeworCWNvbnN0IHU4ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJdTgg cm4gPSBzc3RrID8gdG1wWzFdIDogc3JjOworCisJaWYgKHNzdGspCisJCWVtaXQoQVJNX0xEUl9J KHJuLCBBUk1fU1AsIFNUQUNLX1ZBUihzcmMpKSwgY3R4KTsKKworCS8qIEFMVSBvcGVyYXRpb24g Ki8KKwlpZiAoZHN0aykgeworCQllbWl0KEFSTV9MRFJfSSh0bXBbMF0sIEFSTV9TUCwgU1RBQ0tf VkFSKGRzdCkpLCBjdHgpOworCQllbWl0X2FsdV9yKHRtcFswXSwgcm4sIGlzNjQsIGhpLCBvcCwg Y3R4KTsKKwkJZW1pdChBUk1fU1RSX0kodG1wWzBdLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3QpKSwg Y3R4KTsKIAl9IGVsc2UgewotCQlfZW1pdChjb25kLCBBUk1fTU9WX0koQVJNX1IwLCAwKSwgY3R4 KTsKLQkJX2VtaXQoY29uZCwgQVJNX0IoYl9pbW0oY3R4LT5za2YtPmxlbiwgY3R4KSksIGN0eCk7 CisJCWVtaXRfYWx1X3IoZHN0LCBybiwgaXM2NCwgaGksIG9wLCBjdHgpOwogCX0KIH0KIAotc3Rh dGljIGlubGluZSB2b2lkIGVtaXRfYmx4X3IodTggdGd0X3JlZywgc3RydWN0IGppdF9jdHggKmN0 eCkKLXsKLSNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA1Ci0JZW1pdChBUk1fTU9WX1IoQVJNX0xS LCBBUk1fUEMpLCBjdHgpOworLyogQUxVIG9wZXJhdGlvbiAoNjQgYml0KSAqLworc3RhdGljIGlu bGluZSB2b2lkIGVtaXRfYTMyX2FsdV9yNjQoY29uc3QgYm9vbCBpczY0LCBjb25zdCB1OCBkc3Rb XSwKKwkJCQkgIGNvbnN0IHU4IHNyY1tdLCBib29sIGRzdGssCisJCQkJICBib29sIHNzdGssIHN0 cnVjdCBqaXRfY3R4ICpjdHgsCisJCQkJICBjb25zdCB1OCBvcCkgeworCWVtaXRfYTMyX2FsdV9y KGRzdF9sbywgc3JjX2xvLCBkc3RrLCBzc3RrLCBjdHgsIGlzNjQsIGZhbHNlLCBvcCk7CisJaWYg KGlzNjQpCisJCWVtaXRfYTMyX2FsdV9yKGRzdF9oaSwgc3JjX2hpLCBkc3RrLCBzc3RrLCBjdHgs IGlzNjQsIHRydWUsIG9wKTsKKwllbHNlCisJCWVtaXRfYTMyX21vdl9pKGRzdF9oaSwgMCwgZHN0 aywgY3R4KTsKK30KIAotCWlmIChlbGZfaHdjYXAgJiBIV0NBUF9USFVNQikKLQkJZW1pdChBUk1f QlgodGd0X3JlZyksIGN0eCk7CisvKiBkc3QgPSBpbW0gKDQgYnl0ZXMpKi8KK3N0YXRpYyBpbmxp bmUgdm9pZCBlbWl0X2EzMl9tb3Zfcihjb25zdCB1OCBkc3QsIGNvbnN0IHU4IHNyYywKKwkJCQkg IGJvb2wgZHN0aywgYm9vbCBzc3RrLAorCQkJCSAgc3RydWN0IGppdF9jdHggKmN0eCkgeworCWNv bnN0IHU4ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJdTggcnQgPSBzc3RrID8gdG1wWzBd IDogc3JjOworCisJaWYgKHNzdGspCisJCWVtaXQoQVJNX0xEUl9JKHRtcFswXSwgQVJNX1NQLCBT VEFDS19WQVIoc3JjKSksIGN0eCk7CisJaWYgKGRzdGspCisJCWVtaXQoQVJNX1NUUl9JKHJ0LCBB Uk1fU1AsIFNUQUNLX1ZBUihkc3QpKSwgY3R4KTsKIAllbHNlCi0JCWVtaXQoQVJNX01PVl9SKEFS TV9QQywgdGd0X3JlZyksIGN0eCk7Ci0jZWxzZQotCWVtaXQoQVJNX0JMWF9SKHRndF9yZWcpLCBj dHgpOwotI2VuZGlmCisJCWVtaXQoQVJNX01PVl9SKGRzdCwgcnQpLCBjdHgpOwogfQogCi1zdGF0 aWMgaW5saW5lIHZvaWQgZW1pdF91ZGl2bW9kKHU4IHJkLCB1OCBybSwgdTggcm4sIHN0cnVjdCBq aXRfY3R4ICpjdHgsCi0JCQkJaW50IGJwZl9vcCkKLXsKLSNpZiBfX0xJTlVYX0FSTV9BUkNIX18g PT0gNwotCWlmIChlbGZfaHdjYXAgJiBIV0NBUF9JRElWQSkgewotCQlpZiAoYnBmX29wID09IEJQ Rl9ESVYpCi0JCQllbWl0KEFSTV9VRElWKHJkLCBybSwgcm4pLCBjdHgpOwotCQllbHNlIHsKLQkJ CWVtaXQoQVJNX1VESVYoQVJNX1IzLCBybSwgcm4pLCBjdHgpOwotCQkJZW1pdChBUk1fTUxTKHJk LCBybiwgQVJNX1IzLCBybSksIGN0eCk7Ci0JCX0KLQkJcmV0dXJuOworLyogZHN0ID0gc3JjICov CitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9hMzJfbW92X3I2NChjb25zdCBib29sIGlzNjQsIGNv bnN0IHU4IGRzdFtdLAorCQkJCSAgY29uc3QgdTggc3JjW10sIGJvb2wgZHN0aywKKwkJCQkgIGJv b2wgc3N0aywgc3RydWN0IGppdF9jdHggKmN0eCkgeworCWVtaXRfYTMyX21vdl9yKGRzdF9sbywg c3JjX2xvLCBkc3RrLCBzc3RrLCBjdHgpOworCWlmIChpczY0KSB7CisJCS8qIGNvbXBsZXRlIDgg Ynl0ZSBtb3ZlICovCisJCWVtaXRfYTMyX21vdl9yKGRzdF9oaSwgc3JjX2hpLCBkc3RrLCBzc3Rr LCBjdHgpOworCX0gZWxzZSB7CisJCS8qIFplcm8gb3V0IGhpZ2ggNCBieXRlcyAqLworCQllbWl0 X2EzMl9tb3ZfaShkc3RfaGksIDAsIGRzdGssIGN0eCk7CiAJfQotI2VuZGlmCit9CiAKLQkvKgot CSAqIEZvciBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LIGluc3RydWN0aW9ucywgcm0gaXMgQVJN X1I0Ci0JICogKHJfQSkgYW5kIHJuIGlzIEFSTV9SMCAocl9zY3JhdGNoKSBzbyBsb2FkIHJuIGZp cnN0IGludG8KLQkgKiBBUk1fUjEgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIEFS TV9SMCB3aXRoIHJtCi0JICogYmVmb3JlIHVzaW5nIGl0IGFzIGEgc291cmNlIGZvciBBUk1fUjEu Ci0JICoKLQkgKiBGb3IgQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfWCBybSBpcyBBUk1fUjQgKHJf QSkgYW5kIHJuIGlzCi0JICogQVJNX1I1IChyX1gpIHNvIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIg cmVnaXN0ZXIgb3ZlcmxhcAotCSAqIGlzc3Vlcy4KLQkgKi8KLQlpZiAocm4gIT0gQVJNX1IxKQot CQllbWl0KEFSTV9NT1ZfUihBUk1fUjEsIHJuKSwgY3R4KTsKLQlpZiAocm0gIT0gQVJNX1IwKQot CQllbWl0KEFSTV9NT1ZfUihBUk1fUjAsIHJtKSwgY3R4KTsKKy8qIFNoaWZ0IG9wZXJhdGlvbnMg Ki8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9hbHVfaShjb25zdCB1OCBkc3QsIGNvbnN0 IHUzMiB2YWwsIGJvb2wgZHN0aywKKwkJCQlzdHJ1Y3Qgaml0X2N0eCAqY3R4LCBjb25zdCB1OCBv cCkgeworCWNvbnN0IHU4ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJdTggcmQgPSBkc3Rr ID8gdG1wWzBdIDogZHN0OworCisJaWYgKGRzdGspCisJCWVtaXQoQVJNX0xEUl9JKHJkLCBBUk1f U1AsIFNUQUNLX1ZBUihkc3QpKSwgY3R4KTsKKworCS8qIERvIHNoaWZ0IG9wZXJhdGlvbiAqLwor CXN3aXRjaCAob3ApIHsKKwljYXNlIEJQRl9MU0g6CisJCWVtaXQoQVJNX0xTTF9JKHJkLCByZCwg dmFsKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfUlNIOgorCQllbWl0KEFSTV9MU1JfSShy ZCwgcmQsIHZhbCksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX05FRzoKKwkJZW1pdChBUk1f UlNCX0kocmQsIHJkLCB2YWwpLCBjdHgpOworCQlicmVhazsKKwl9CisKKwlpZiAoZHN0aykKKwkJ ZW1pdChBUk1fU1RSX0kocmQsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdCkpLCBjdHgpOworfQogCisv KiBkc3QgPSB+ZHN0ICg2NCBiaXQpICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9hMzJfbmVn NjQoY29uc3QgdTggZHN0W10sIGJvb2wgZHN0aywKKwkJCQlzdHJ1Y3Qgaml0X2N0eCAqY3R4KXsK Kwljb25zdCB1OCAqdG1wID0gYnBmMmEzMltUTVBfUkVHXzFdOworCXU4IHJkID0gZHN0ayA/IHRt cFsxXSA6IGRzdFsxXTsKKwl1OCBybSA9IGRzdGsgPyB0bXBbMF0gOiBkc3RbMF07CisKKwkvKiBT ZXR1cCBPcGVyYW5kICovCisJaWYgKGRzdGspIHsKKwkJZW1pdChBUk1fTERSX0kocmQsIEFSTV9T UCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9MRFJfSShybSwgQVJNX1NQ LCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJfQorCisJLyogRG8gTmVnYXRlIE9wZXJhdGlv biAqLworCWVtaXQoQVJNX1JTQlNfSShyZCwgcmQsIDApLCBjdHgpOworCWVtaXQoQVJNX1JTQ19J KHJtLCBybSwgMCksIGN0eCk7CisKKwlpZiAoZHN0aykgeworCQllbWl0KEFSTV9TVFJfSShyZCwg QVJNX1NQLCBTVEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCWVtaXQoQVJNX1NUUl9JKHJtLCBB Uk1fU1AsIFNUQUNLX1ZBUihkc3RfaGkpKSwgY3R4KTsKKwl9Cit9CisKKy8qIGRzdCA9IGRzdCA8 PCBzcmMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9sc2hfcjY0KGNvbnN0IHU4IGRz dFtdLCBjb25zdCB1OCBzcmNbXSwgYm9vbCBkc3RrLAorCQkJCSAgICBib29sIHNzdGssIHN0cnVj dCBqaXRfY3R4ICpjdHgpIHsKKwljb25zdCB1OCAqdG1wID0gYnBmMmEzMltUTVBfUkVHXzFdOwor CWNvbnN0IHU4ICp0bXAyID0gYnBmMmEzMltUTVBfUkVHXzJdOworCisJLyogU2V0dXAgT3BlcmFu ZHMgKi8KKwl1OCBydCA9IHNzdGsgPyB0bXAyWzFdIDogc3JjX2xvOworCXU4IHJkID0gZHN0ayA/ IHRtcFsxXSA6IGRzdF9sbzsKKwl1OCBybSA9IGRzdGsgPyB0bXBbMF0gOiBkc3RfaGk7CisKKwlp ZiAoc3N0aykKKwkJZW1pdChBUk1fTERSX0kocnQsIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY19sbykp LCBjdHgpOworCWlmIChkc3RrKSB7CisJCWVtaXQoQVJNX0xEUl9JKHJkLCBBUk1fU1AsIFNUQUNL X1ZBUihkc3RfbG8pKSwgY3R4KTsKKwkJZW1pdChBUk1fTERSX0kocm0sIEFSTV9TUCwgU1RBQ0tf VkFSKGRzdF9oaSkpLCBjdHgpOworCX0KKworCS8qIERvIExTSCBvcGVyYXRpb24gKi8KKwllbWl0 KEFSTV9TVUJfSShBUk1fSVAsIHJ0LCAzMiksIGN0eCk7CisJZW1pdChBUk1fUlNCX0kodG1wMlsw XSwgcnQsIDMyKSwgY3R4KTsKKwkvKiBBcyB3ZSBhcmUgdXNpbmcgQVJNX0xSICovCiAJY3R4LT5z ZWVuIHw9IFNFRU5fQ0FMTDsKLQllbWl0X21vdl9pKEFSTV9SMywgYnBmX29wID09IEJQRl9ESVYg PyAodTMyKWppdF91ZGl2IDogKHUzMilqaXRfbW9kLAotCQkgICBjdHgpOwotCWVtaXRfYmx4X3Io QVJNX1IzLCBjdHgpOworCWVtaXQoQVJNX01PVl9TUihBUk1fTFIsIHJtLCBTUlRZUEVfQVNMLCBy dCksIGN0eCk7CisJZW1pdChBUk1fT1JSX1NSKEFSTV9MUiwgQVJNX0xSLCByZCwgU1JUWVBFX0FT TCwgQVJNX0lQKSwgY3R4KTsKKwllbWl0KEFSTV9PUlJfU1IoQVJNX0lQLCBBUk1fTFIsIHJkLCBT UlRZUEVfTFNSLCB0bXAyWzBdKSwgY3R4KTsKKwllbWl0KEFSTV9NT1ZfU1IoQVJNX0xSLCByZCwg U1JUWVBFX0FTTCwgcnQpLCBjdHgpOworCisJaWYgKGRzdGspIHsKKwkJZW1pdChBUk1fU1RSX0ko QVJNX0xSLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfbG8pKSwgY3R4KTsKKwkJZW1pdChBUk1fU1RS X0koQVJNX0lQLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfaGkpKSwgY3R4KTsKKwl9IGVsc2Ugewor CQllbWl0KEFSTV9NT1ZfUihyZCwgQVJNX0xSKSwgY3R4KTsKKwkJZW1pdChBUk1fTU9WX1Iocm0s IEFSTV9JUCksIGN0eCk7CisJfQorfQogCi0JaWYgKHJkICE9IEFSTV9SMCkKLQkJZW1pdChBUk1f TU9WX1IocmQsIEFSTV9SMCksIGN0eCk7CisvKiBkc3QgPSBkc3QgPj4gc3JjIChzaWduZWQpKi8K K3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9hcnNoX3I2NChjb25zdCB1OCBkc3RbXSwgY29u c3QgdTggc3JjW10sIGJvb2wgZHN0aywKKwkJCQkgICAgYm9vbCBzc3RrLCBzdHJ1Y3Qgaml0X2N0 eCAqY3R4KSB7CisJY29uc3QgdTggKnRtcCA9IGJwZjJhMzJbVE1QX1JFR18xXTsKKwljb25zdCB1 OCAqdG1wMiA9IGJwZjJhMzJbVE1QX1JFR18yXTsKKwkvKiBTZXR1cCBPcGVyYW5kcyAqLworCXU4 IHJ0ID0gc3N0ayA/IHRtcDJbMV0gOiBzcmNfbG87CisJdTggcmQgPSBkc3RrID8gdG1wWzFdIDog ZHN0X2xvOworCXU4IHJtID0gZHN0ayA/IHRtcFswXSA6IGRzdF9oaTsKKworCWlmIChzc3RrKQor CQllbWl0KEFSTV9MRFJfSShydCwgQVJNX1NQLCBTVEFDS19WQVIoc3JjX2xvKSksIGN0eCk7CisJ aWYgKGRzdGspIHsKKwkJZW1pdChBUk1fTERSX0kocmQsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9s bykpLCBjdHgpOworCQllbWl0KEFSTV9MRFJfSShybSwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2hp KSksIGN0eCk7CisJfQorCisJLyogRG8gdGhlIEFSU0ggb3BlcmF0aW9uICovCisJZW1pdChBUk1f UlNCX0koQVJNX0lQLCBydCwgMzIpLCBjdHgpOworCWVtaXQoQVJNX1NVQlNfSSh0bXAyWzBdLCBy dCwgMzIpLCBjdHgpOworCS8qIEFzIHdlIGFyZSB1c2luZyBBUk1fTFIgKi8KKwljdHgtPnNlZW4g fD0gU0VFTl9DQUxMOworCWVtaXQoQVJNX01PVl9TUihBUk1fTFIsIHJkLCBTUlRZUEVfTFNSLCBy dCksIGN0eCk7CisJZW1pdChBUk1fT1JSX1NSKEFSTV9MUiwgQVJNX0xSLCBybSwgU1JUWVBFX0FT TCwgQVJNX0lQKSwgY3R4KTsKKwlfZW1pdChBUk1fQ09ORF9NSSwgQVJNX0IoMCksIGN0eCk7CisJ ZW1pdChBUk1fT1JSX1NSKEFSTV9MUiwgQVJNX0xSLCBybSwgU1JUWVBFX0FTUiwgdG1wMlswXSks IGN0eCk7CisJZW1pdChBUk1fTU9WX1NSKEFSTV9JUCwgcm0sIFNSVFlQRV9BU1IsIHJ0KSwgY3R4 KTsKKwlpZiAoZHN0aykgeworCQllbWl0KEFSTV9TVFJfSShBUk1fTFIsIEFSTV9TUCwgU1RBQ0tf VkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9TVFJfSShBUk1fSVAsIEFSTV9TUCwgU1RB Q0tfVkFSKGRzdF9oaSkpLCBjdHgpOworCX0gZWxzZSB7CisJCWVtaXQoQVJNX01PVl9SKHJkLCBB Uk1fTFIpLCBjdHgpOworCQllbWl0KEFSTV9NT1ZfUihybSwgQVJNX0lQKSwgY3R4KTsKKwl9Cit9 CisKKy8qIGRzdCA9IGRzdCA+PiBzcmMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9s c3JfcjY0KGNvbnN0IHU4IGRzdFtdLCBjb25zdCB1OCBzcmNbXSwgYm9vbCBkc3RrLAorCQkJCSAg ICAgYm9vbCBzc3RrLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KSB7CisJY29uc3QgdTggKnRtcCA9IGJw ZjJhMzJbVE1QX1JFR18xXTsKKwljb25zdCB1OCAqdG1wMiA9IGJwZjJhMzJbVE1QX1JFR18yXTsK KwkvKiBTZXR1cCBPcGVyYW5kcyAqLworCXU4IHJ0ID0gc3N0ayA/IHRtcDJbMV0gOiBzcmNfbG87 CisJdTggcmQgPSBkc3RrID8gdG1wWzFdIDogZHN0X2xvOworCXU4IHJtID0gZHN0ayA/IHRtcFsw XSA6IGRzdF9oaTsKKworCWlmIChzc3RrKQorCQllbWl0KEFSTV9MRFJfSShydCwgQVJNX1NQLCBT VEFDS19WQVIoc3JjX2xvKSksIGN0eCk7CisJaWYgKGRzdGspIHsKKwkJZW1pdChBUk1fTERSX0ko cmQsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9MRFJfSShy bSwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJfQorCisJLyogRG8gTFNIIG9w ZXJhdGlvbiAqLworCWVtaXQoQVJNX1JTQl9JKEFSTV9JUCwgcnQsIDMyKSwgY3R4KTsKKwllbWl0 KEFSTV9TVUJTX0kodG1wMlswXSwgcnQsIDMyKSwgY3R4KTsKKwkvKiBBcyB3ZSBhcmUgdXNpbmcg QVJNX0xSICovCisJY3R4LT5zZWVuIHw9IFNFRU5fQ0FMTDsKKwllbWl0KEFSTV9NT1ZfU1IoQVJN X0xSLCByZCwgU1JUWVBFX0xTUiwgcnQpLCBjdHgpOworCWVtaXQoQVJNX09SUl9TUihBUk1fTFIs IEFSTV9MUiwgcm0sIFNSVFlQRV9BU0wsIEFSTV9JUCksIGN0eCk7CisJZW1pdChBUk1fT1JSX1NS KEFSTV9MUiwgQVJNX0xSLCBybSwgU1JUWVBFX0xTUiwgdG1wMlswXSksIGN0eCk7CisJZW1pdChB Uk1fTU9WX1NSKEFSTV9JUCwgcm0sIFNSVFlQRV9MU1IsIHJ0KSwgY3R4KTsKKwlpZiAoZHN0aykg eworCQllbWl0KEFSTV9TVFJfSShBUk1fTFIsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBj dHgpOworCQllbWl0KEFSTV9TVFJfSShBUk1fSVAsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9oaSkp LCBjdHgpOworCX0gZWxzZSB7CisJCWVtaXQoQVJNX01PVl9SKHJkLCBBUk1fTFIpLCBjdHgpOwor CQllbWl0KEFSTV9NT1ZfUihybSwgQVJNX0lQKSwgY3R4KTsKKwl9Cit9CisKKy8qIGRzdCA9IGRz dCA8PCB2YWwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9sc2hfaTY0KGNvbnN0IHU4 IGRzdFtdLCBib29sIGRzdGssCisJCQkJICAgICBjb25zdCB1MzIgdmFsLCBzdHJ1Y3Qgaml0X2N0 eCAqY3R4KXsKKwljb25zdCB1OCAqdG1wID0gYnBmMmEzMltUTVBfUkVHXzFdOworCWNvbnN0IHU4 ICp0bXAyID0gYnBmMmEzMltUTVBfUkVHXzJdOworCS8qIFNldHVwIG9wZXJhbmRzICovCisJdTgg cmQgPSBkc3RrID8gdG1wWzFdIDogZHN0X2xvOworCXU4IHJtID0gZHN0ayA/IHRtcFswXSA6IGRz dF9oaTsKKworCWlmIChkc3RrKSB7CisJCWVtaXQoQVJNX0xEUl9JKHJkLCBBUk1fU1AsIFNUQUNL X1ZBUihkc3RfbG8pKSwgY3R4KTsKKwkJZW1pdChBUk1fTERSX0kocm0sIEFSTV9TUCwgU1RBQ0tf VkFSKGRzdF9oaSkpLCBjdHgpOworCX0KKworCS8qIERvIExTSCBvcGVyYXRpb24gKi8KKwlpZiAo dmFsIDwgMzIpIHsKKwkJZW1pdChBUk1fTU9WX1NJKHRtcDJbMF0sIHJtLCBTUlRZUEVfQVNMLCB2 YWwpLCBjdHgpOworCQllbWl0KEFSTV9PUlJfU0kocm0sIHRtcDJbMF0sIHJkLCBTUlRZUEVfTFNS LCAzMiAtIHZhbCksIGN0eCk7CisJCWVtaXQoQVJNX01PVl9TSShyZCwgcmQsIFNSVFlQRV9BU0ws IHZhbCksIGN0eCk7CisJfSBlbHNlIHsKKwkJaWYgKHZhbCA9PSAzMikKKwkJCWVtaXQoQVJNX01P Vl9SKHJtLCByZCksIGN0eCk7CisJCWVsc2UKKwkJCWVtaXQoQVJNX01PVl9TSShybSwgcmQsIFNS VFlQRV9BU0wsIHZhbCAtIDMyKSwgY3R4KTsKKwkJZW1pdChBUk1fRU9SX1IocmQsIHJkLCByZCks IGN0eCk7CisJfQorCisJaWYgKGRzdGspIHsKKwkJZW1pdChBUk1fU1RSX0kocmQsIEFSTV9TUCwg U1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9TVFJfSShybSwgQVJNX1NQLCBT VEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJfQorfQorCisvKiBkc3QgPSBkc3QgPj4gdmFsICov CitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9hMzJfbHNyX2k2NChjb25zdCB1OCBkc3RbXSwgYm9v bCBkc3RrLAorCQkJCSAgICBjb25zdCB1MzIgdmFsLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KSB7CisJ Y29uc3QgdTggKnRtcCA9IGJwZjJhMzJbVE1QX1JFR18xXTsKKwljb25zdCB1OCAqdG1wMiA9IGJw ZjJhMzJbVE1QX1JFR18yXTsKKwkvKiBTZXR1cCBvcGVyYW5kcyAqLworCXU4IHJkID0gZHN0ayA/ IHRtcFsxXSA6IGRzdF9sbzsKKwl1OCBybSA9IGRzdGsgPyB0bXBbMF0gOiBkc3RfaGk7CisKKwlp ZiAoZHN0aykgeworCQllbWl0KEFSTV9MRFJfSShyZCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2xv KSksIGN0eCk7CisJCWVtaXQoQVJNX0xEUl9JKHJtLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfaGkp KSwgY3R4KTsKKwl9CisKKwkvKiBEbyBMU1Igb3BlcmF0aW9uICovCisJaWYgKHZhbCA8IDMyKSB7 CisJCWVtaXQoQVJNX01PVl9TSSh0bXAyWzFdLCByZCwgU1JUWVBFX0xTUiwgdmFsKSwgY3R4KTsK KwkJZW1pdChBUk1fT1JSX1NJKHJkLCB0bXAyWzFdLCBybSwgU1JUWVBFX0FTTCwgMzIgLSB2YWwp LCBjdHgpOworCQllbWl0KEFSTV9NT1ZfU0kocm0sIHJtLCBTUlRZUEVfTFNSLCB2YWwpLCBjdHgp OworCX0gZWxzZSBpZiAodmFsID09IDMyKSB7CisJCWVtaXQoQVJNX01PVl9SKHJkLCBybSksIGN0 eCk7CisJCWVtaXQoQVJNX01PVl9JKHJtLCAwKSwgY3R4KTsKKwl9IGVsc2UgeworCQllbWl0KEFS TV9NT1ZfU0kocmQsIHJtLCBTUlRZUEVfTFNSLCB2YWwgLSAzMiksIGN0eCk7CisJCWVtaXQoQVJN X01PVl9JKHJtLCAwKSwgY3R4KTsKKwl9CisKKwlpZiAoZHN0aykgeworCQllbWl0KEFSTV9TVFJf SShyZCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCWVtaXQoQVJNX1NUUl9J KHJtLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfaGkpKSwgY3R4KTsKKwl9CiB9CiAKLXN0YXRpYyBp bmxpbmUgdm9pZCB1cGRhdGVfb25feHJlYWQoc3RydWN0IGppdF9jdHggKmN0eCkKKy8qIGRzdCA9 IGRzdCA+PiB2YWwgKHNpZ25lZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbWl0X2EzMl9hcnNo X2k2NChjb25zdCB1OCBkc3RbXSwgYm9vbCBkc3RrLAorCQkJCSAgICAgY29uc3QgdTMyIHZhbCwg c3RydWN0IGppdF9jdHggKmN0eCl7CisJY29uc3QgdTggKnRtcCA9IGJwZjJhMzJbVE1QX1JFR18x XTsKKwljb25zdCB1OCAqdG1wMiA9IGJwZjJhMzJbVE1QX1JFR18yXTsKKwkgLyogU2V0dXAgb3Bl cmFuZHMgKi8KKwl1OCByZCA9IGRzdGsgPyB0bXBbMV0gOiBkc3RfbG87CisJdTggcm0gPSBkc3Rr ID8gdG1wWzBdIDogZHN0X2hpOworCisJaWYgKGRzdGspIHsKKwkJZW1pdChBUk1fTERSX0kocmQs IEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9MRFJfSShybSwg QVJNX1NQLCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJfQorCisJLyogRG8gQVJTSCBvcGVy YXRpb24gKi8KKwlpZiAodmFsIDwgMzIpIHsKKwkJZW1pdChBUk1fTU9WX1NJKHRtcDJbMV0sIHJk LCBTUlRZUEVfTFNSLCB2YWwpLCBjdHgpOworCQllbWl0KEFSTV9PUlJfU0kocmQsIHRtcDJbMV0s IHJtLCBTUlRZUEVfQVNMLCAzMiAtIHZhbCksIGN0eCk7CisJCWVtaXQoQVJNX01PVl9TSShybSwg cm0sIFNSVFlQRV9BU1IsIHZhbCksIGN0eCk7CisJfSBlbHNlIGlmICh2YWwgPT0gMzIpIHsKKwkJ ZW1pdChBUk1fTU9WX1IocmQsIHJtKSwgY3R4KTsKKwkJZW1pdChBUk1fTU9WX1NJKHJtLCBybSwg U1JUWVBFX0FTUiwgMzEpLCBjdHgpOworCX0gZWxzZSB7CisJCWVtaXQoQVJNX01PVl9TSShyZCwg cm0sIFNSVFlQRV9BU1IsIHZhbCAtIDMyKSwgY3R4KTsKKwkJZW1pdChBUk1fTU9WX1NJKHJtLCBy bSwgU1JUWVBFX0FTUiwgMzEpLCBjdHgpOworCX0KKworCWlmIChkc3RrKSB7CisJCWVtaXQoQVJN X1NUUl9JKHJkLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfbG8pKSwgY3R4KTsKKwkJZW1pdChBUk1f U1RSX0kocm0sIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9oaSkpLCBjdHgpOworCX0KK30KKworc3Rh dGljIGlubGluZSB2b2lkIGVtaXRfYTMyX211bF9yNjQoY29uc3QgdTggZHN0W10sIGNvbnN0IHU4 IHNyY1tdLCBib29sIGRzdGssCisJCQkJICAgIGJvb2wgc3N0aywgc3RydWN0IGppdF9jdHggKmN0 eCkgeworCWNvbnN0IHU4ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJY29uc3QgdTggKnRt cDIgPSBicGYyYTMyW1RNUF9SRUdfMl07CisJLyogU2V0dXAgb3BlcmFuZHMgZm9yIG11bHRpcGxp Y2F0aW9uICovCisJdTggcmQgPSBkc3RrID8gdG1wWzFdIDogZHN0X2xvOworCXU4IHJtID0gZHN0 ayA/IHRtcFswXSA6IGRzdF9oaTsKKwl1OCBydCA9IHNzdGsgPyB0bXAyWzFdIDogc3JjX2xvOwor CXU4IHJuID0gc3N0ayA/IHRtcDJbMF0gOiBzcmNfaGk7CisKKwlpZiAoZHN0aykgeworCQllbWl0 KEFSTV9MRFJfSShyZCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCWVtaXQo QVJNX0xEUl9JKHJtLCBBUk1fU1AsIFNUQUNLX1ZBUihkc3RfaGkpKSwgY3R4KTsKKwl9CisJaWYg KHNzdGspIHsKKwkJZW1pdChBUk1fTERSX0kocnQsIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY19sbykp LCBjdHgpOworCQllbWl0KEFSTV9MRFJfSShybiwgQVJNX1NQLCBTVEFDS19WQVIoc3JjX2hpKSks IGN0eCk7CisJfQorCisJLyogRG8gTXVsdGlwbGljYXRpb24gKi8KKwllbWl0KEFSTV9NVUwoQVJN X0lQLCByZCwgcm4pLCBjdHgpOworCWVtaXQoQVJNX01VTChBUk1fTFIsIHJtLCBydCksIGN0eCk7 CisJLyogQXMgd2UgYXJlIHVzaW5nIEFSTV9MUiAqLworCWN0eC0+c2VlbiB8PSBTRUVOX0NBTEw7 CisJZW1pdChBUk1fQUREX1IoQVJNX0xSLCBBUk1fSVAsIEFSTV9MUiksIGN0eCk7CisKKwllbWl0 KEFSTV9VTVVMTChBUk1fSVAsIHJtLCByZCwgcnQpLCBjdHgpOworCWVtaXQoQVJNX0FERF9SKHJt LCBBUk1fTFIsIHJtKSwgY3R4KTsKKwlpZiAoZHN0aykgeworCQllbWl0KEFSTV9TVFJfSShBUk1f SVAsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0KEFSTV9TVFJfSShy bSwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJfSBlbHNlIHsKKwkJZW1pdChB Uk1fTU9WX1IocmQsIEFSTV9JUCksIGN0eCk7CisJfQorfQorCisvKiAqKHNpemUgKikoZHN0ICsg b2ZmKSA9IHNyYyAqLworc3RhdGljIGlubGluZSB2b2lkIGVtaXRfc3RyX3IoY29uc3QgdTggZHN0 LCBjb25zdCB1OCBzcmMsIGJvb2wgZHN0aywKKwkJCSAgICAgIGNvbnN0IHMzMiBvZmYsIHN0cnVj dCBqaXRfY3R4ICpjdHgsIGNvbnN0IHU4IHN6KXsKKwljb25zdCB1OCAqdG1wID0gYnBmMmEzMltU TVBfUkVHXzFdOworCXU4IHJkID0gZHN0ayA/IHRtcFsxXSA6IGRzdDsKKworCWlmIChkc3RrKQor CQllbWl0KEFSTV9MRFJfSShyZCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0KSksIGN0eCk7CisJaWYg KG9mZikgeworCQllbWl0X2EzMl9tb3ZfaSh0bXBbMF0sIG9mZiwgZmFsc2UsIGN0eCk7CisJCWVt aXQoQVJNX0FERF9SKHRtcFswXSwgcmQsIHRtcFswXSksIGN0eCk7CisJCXJkID0gdG1wWzBdOwor CX0KKwlzd2l0Y2ggKHN6KSB7CisJY2FzZSBCUEZfVzoKKwkJLyogU3RvcmUgYSBXb3JkICovCisJ CWVtaXQoQVJNX1NUUl9JKHNyYywgcmQsIDApLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9I OgorCQkvKiBTdG9yZSBhIEhhbGZXb3JkICovCisJCWVtaXQoQVJNX1NUUkhfSShzcmMsIHJkLCAw KSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQjoKKwkJLyogU3RvcmUgYSBCeXRlICovCisJ CWVtaXQoQVJNX1NUUkJfSShzcmMsIHJkLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisJfQorfQorCisv KiBkc3QgPSAqKHNpemUqKShzcmMgKyBvZmYpICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9s ZHhfcihjb25zdCB1OCBkc3QsIGNvbnN0IHU4IHNyYywgYm9vbCBkc3RrLAorCQkJICAgICAgY29u c3QgczMyIG9mZiwgc3RydWN0IGppdF9jdHggKmN0eCwgY29uc3QgdTggc3opeworCWNvbnN0IHU4 ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJdTggcmQgPSBkc3RrID8gdG1wWzFdIDogZHN0 OworCXU4IHJtID0gc3JjOworCisJaWYgKG9mZikgeworCQllbWl0X2EzMl9tb3ZfaSh0bXBbMF0s IG9mZiwgZmFsc2UsIGN0eCk7CisJCWVtaXQoQVJNX0FERF9SKHRtcFswXSwgdG1wWzBdLCBzcmMp LCBjdHgpOworCQlybSA9IHRtcFswXTsKKwl9CisJc3dpdGNoIChzeikgeworCWNhc2UgQlBGX1c6 CisJCS8qIExvYWQgYSBXb3JkICovCisJCWVtaXQoQVJNX0xEUl9JKHJkLCBybSwgMCksIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX0g6CisJCS8qIExvYWQgYSBIYWxmV29yZCAqLworCQllbWl0 KEFSTV9MRFJIX0kocmQsIHJtLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQjoKKwkJ LyogTG9hZCBhIEJ5dGUgKi8KKwkJZW1pdChBUk1fTERSQl9JKHJkLCBybSwgMCksIGN0eCk7CisJ CWJyZWFrOworCX0KKwlpZiAoZHN0aykKKwkJZW1pdChBUk1fU1RSX0kocmQsIEFSTV9TUCwgU1RB Q0tfVkFSKGRzdCkpLCBjdHgpOworfQorCisvKiBBcml0aG1hdGljIE9wZXJhdGlvbiAqLworc3Rh dGljIGlubGluZSB2b2lkIGVtaXRfYXJfcihjb25zdCB1OCByZCwgY29uc3QgdTggcnQsIGNvbnN0 IHU4IHJtLAorCQkJICAgICBjb25zdCB1OCBybiwgc3RydWN0IGppdF9jdHggKmN0eCwgdTggb3Ap IHsKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBCUEZfSlNFVDoKKwkJY3R4LT5zZWVuIHw9IFNFRU5f Q0FMTDsKKwkJZW1pdChBUk1fQU5EX1IoQVJNX0lQLCBydCwgcm4pLCBjdHgpOworCQllbWl0KEFS TV9BTkRfUihBUk1fTFIsIHJkLCBybSksIGN0eCk7CisJCWVtaXQoQVJNX09SUlNfUihBUk1fSVAs IEFSTV9MUiwgQVJNX0lQKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkVROgorCWNhc2Ug QlBGX0pORToKKwljYXNlIEJQRl9KR1Q6CisJY2FzZSBCUEZfSkdFOgorCQllbWl0KEFSTV9DTVBf UihyZCwgcm0pLCBjdHgpOworCQlfZW1pdChBUk1fQ09ORF9FUSwgQVJNX0NNUF9SKHJ0LCBybiks IGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pTR1Q6CisJCWVtaXQoQVJNX0NNUF9SKHJuLCBy dCksIGN0eCk7CisJCWVtaXQoQVJNX1NCQ1NfUihBUk1fSVAsIHJtLCByZCksIGN0eCk7CisJCWJy ZWFrOworCWNhc2UgQlBGX0pTR0U6CisJCWVtaXQoQVJNX0NNUF9SKHJ0LCBybiksIGN0eCk7CisJ CWVtaXQoQVJNX1NCQ1NfUihBUk1fSVAsIHJkLCBybSksIGN0eCk7CisJCWJyZWFrOworCX0KK30K Kworc3RhdGljIGludCBvdXRfb2Zmc2V0ID0gLTE7IC8qIGluaXRpYWxpemVkIG9uIHRoZSBmaXJz dCBwYXNzIG9mIGJ1aWxkX2JvZHkoKSAqLworc3RhdGljIGludCBlbWl0X2JwZl90YWlsX2NhbGwo c3RydWN0IGppdF9jdHggKmN0eCkKIHsKLQlpZiAoIShjdHgtPnNlZW4gJiBTRUVOX1gpKQotCQlj dHgtPmZsYWdzIHw9IEZMQUdfTkVFRF9YX1JFU0VUOwogCi0JY3R4LT5zZWVuIHw9IFNFRU5fWDsK KwkvKiBicGZfdGFpbF9jYWxsKHZvaWQgKnByb2dfY3R4LCBzdHJ1Y3QgYnBmX2FycmF5ICphcnJh eSwgdTY0IGluZGV4KSAqLworCWNvbnN0IHU4ICpyMiA9IGJwZjJhMzJbQlBGX1JFR18yXTsKKwlj b25zdCB1OCAqcjMgPSBicGYyYTMyW0JQRl9SRUdfM107CisJY29uc3QgdTggKnRtcCA9IGJwZjJh MzJbVE1QX1JFR18xXTsKKwljb25zdCB1OCAqdG1wMiA9IGJwZjJhMzJbVE1QX1JFR18yXTsKKwlj b25zdCB1OCAqdGNjID0gYnBmMmEzMltUQ0FMTF9DTlRdOworCWNvbnN0IGludCBpZHgwID0gY3R4 LT5pZHg7CisjZGVmaW5lIGN1cl9vZmZzZXQgKGN0eC0+aWR4IC0gaWR4MCkKKyNkZWZpbmUgam1w X29mZnNldCAob3V0X29mZnNldCAtIChjdXJfb2Zmc2V0KSkKKwl1MzIgb2ZmLCBsbywgaGk7CisK KwkvKiBpZiAoaW5kZXggPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykKKwkgKglnb3RvIG91dDsK KwkgKi8KKwlvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgYnBmX2FycmF5LCBtYXAubWF4X2VudHJpZXMp OworCS8qIGFycmF5LT5tYXAubWF4X2VudHJpZXMgKi8KKwllbWl0X2EzMl9tb3ZfaSh0bXBbMV0s IG9mZiwgZmFsc2UsIGN0eCk7CisJZW1pdChBUk1fTERSX0kodG1wMlsxXSwgQVJNX1NQLCBTVEFD S19WQVIocjJbMV0pKSwgY3R4KTsKKwllbWl0KEFSTV9MRFJfUih0bXBbMV0sIHRtcDJbMV0sIHRt cFsxXSksIGN0eCk7CisJLyogaW5kZXggKDY0IGJpdCkgKi8KKwllbWl0KEFSTV9MRFJfSSh0bXAy WzFdLCBBUk1fU1AsIFNUQUNLX1ZBUihyM1sxXSkpLCBjdHgpOworCS8qIGluZGV4ID49IGFycmF5 LT5tYXAubWF4X2VudHJpZXMgKi8KKwllbWl0KEFSTV9DTVBfUih0bXAyWzFdLCB0bXBbMV0pLCBj dHgpOworCV9lbWl0KEFSTV9DT05EX0NTLCBBUk1fQihqbXBfb2Zmc2V0KSwgY3R4KTsKKworCS8q IGlmICh0YWlsX2NhbGxfY250ID4gTUFYX1RBSUxfQ0FMTF9DTlQpCisJICoJZ290byBvdXQ7CisJ ICogdGFpbF9jYWxsX2NudCsrOworCSAqLworCWxvID0gKHUzMilNQVhfVEFJTF9DQUxMX0NOVDsK KwloaSA9ICh1MzIpKCh1NjQpTUFYX1RBSUxfQ0FMTF9DTlQgPj4gMzIpOworCWVtaXQoQVJNX0xE Ul9JKHRtcFsxXSwgQVJNX1NQLCBTVEFDS19WQVIodGNjWzFdKSksIGN0eCk7CisJZW1pdChBUk1f TERSX0kodG1wWzBdLCBBUk1fU1AsIFNUQUNLX1ZBUih0Y2NbMF0pKSwgY3R4KTsKKwllbWl0KEFS TV9DTVBfSSh0bXBbMF0sIGhpKSwgY3R4KTsKKwlfZW1pdChBUk1fQ09ORF9FUSwgQVJNX0NNUF9J KHRtcFsxXSwgbG8pLCBjdHgpOworCV9lbWl0KEFSTV9DT05EX0hJLCBBUk1fQihqbXBfb2Zmc2V0 KSwgY3R4KTsKKwllbWl0KEFSTV9BRERTX0kodG1wWzFdLCB0bXBbMV0sIDEpLCBjdHgpOworCWVt aXQoQVJNX0FEQ19JKHRtcFswXSwgdG1wWzBdLCAwKSwgY3R4KTsKKwllbWl0KEFSTV9TVFJfSSh0 bXBbMV0sIEFSTV9TUCwgU1RBQ0tfVkFSKHRjY1sxXSkpLCBjdHgpOworCWVtaXQoQVJNX1NUUl9J KHRtcFswXSwgQVJNX1NQLCBTVEFDS19WQVIodGNjWzBdKSksIGN0eCk7CisKKwkvKiBwcm9nID0g YXJyYXktPnB0cnNbaW5kZXhdCisJICogaWYgKHByb2cgPT0gTlVMTCkKKwkgKglnb3RvIG91dDsK KwkgKi8KKwlvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgYnBmX2FycmF5LCBwdHJzKTsKKwllbWl0X2Ez Ml9tb3ZfaSh0bXBbMV0sIG9mZiwgZmFsc2UsIGN0eCk7CisJZW1pdChBUk1fTERSX0kodG1wMlsx XSwgQVJNX1NQLCBTVEFDS19WQVIocjJbMV0pKSwgY3R4KTsKKwllbWl0KEFSTV9BRERfUih0bXBb MV0sIHRtcDJbMV0sIHRtcFsxXSksIGN0eCk7CisJZW1pdChBUk1fTERSX0kodG1wMlsxXSwgQVJN X1NQLCBTVEFDS19WQVIocjNbMV0pKSwgY3R4KTsKKwllbWl0KEFSTV9NT1ZfU0kodG1wWzBdLCB0 bXAyWzFdLCBTUlRZUEVfQVNMLCAyKSwgY3R4KTsKKwllbWl0KEFSTV9MRFJfUih0bXBbMV0sIHRt cFsxXSwgdG1wWzBdKSwgY3R4KTsKKwllbWl0KEFSTV9DTVBfSSh0bXBbMV0sIDApLCBjdHgpOwor CV9lbWl0KEFSTV9DT05EX0VRLCBBUk1fQihqbXBfb2Zmc2V0KSwgY3R4KTsKKworCS8qIGdvdG8g Kihwcm9nLT5icGZfZnVuYyArIHByb2xvZ3VlX3NpemUpOyAqLworCW9mZiA9IG9mZnNldG9mKHN0 cnVjdCBicGZfcHJvZywgYnBmX2Z1bmMpOworCWVtaXRfYTMyX21vdl9pKHRtcDJbMV0sIG9mZiwg ZmFsc2UsIGN0eCk7CisJZW1pdChBUk1fTERSX1IodG1wWzFdLCB0bXBbMV0sIHRtcDJbMV0pLCBj dHgpOworCWVtaXQoQVJNX0FERF9JKHRtcFsxXSwgdG1wWzFdLCBjdHgtPnByb2xvZ3VlX2J5dGVz KSwgY3R4KTsKKwllbWl0KEFSTV9CWCh0bXBbMV0pLCBjdHgpOworCisJLyogb3V0OiAqLworCWlm IChvdXRfb2Zmc2V0ID09IC0xKQorCQlvdXRfb2Zmc2V0ID0gY3VyX29mZnNldDsKKwlpZiAoY3Vy X29mZnNldCAhPSBvdXRfb2Zmc2V0KSB7CisJCXByX2Vycl9vbmNlKCJ0YWlsX2NhbGwgb3V0X29m ZnNldCA9ICVkLCBleHBlY3RlZCAlZCFcbiIsCisJCQkgICAgY3VyX29mZnNldCwgb3V0X29mZnNl dCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7CisjdW5kZWYgY3VyX29mZnNldAorI3Vu ZGVmIGptcF9vZmZzZXQKIH0KIAotc3RhdGljIGludCBidWlsZF9ib2R5KHN0cnVjdCBqaXRfY3R4 ICpjdHgpCisvKiAweGFiY2QgPT4gMHhjZGFiICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9y ZXYxNihjb25zdCB1OCByZCwgY29uc3QgdTggcm4sIHN0cnVjdCBqaXRfY3R4ICpjdHgpCiB7Ci0J dm9pZCAqbG9hZF9mdW5jW10gPSB7aml0X2dldF9za2JfYiwgaml0X2dldF9za2JfaCwgaml0X2dl dF9za2Jfd307Ci0JY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nID0gY3R4LT5za2Y7Ci0JY29u c3Qgc3RydWN0IHNvY2tfZmlsdGVyICppbnN0OwotCXVuc2lnbmVkIGksIGxvYWRfb3JkZXIsIG9m ZiwgY29uZHQ7Ci0JaW50IGltbTEyOwotCXUzMiBrOworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA8 IDYKKwljb25zdCB1OCAqdG1wMiA9IGJwZjJhMzJbVE1QX1JFR18yXTsKKworCWVtaXQoQVJNX0FO RF9JKHRtcDJbMV0sIHJuLCAweGZmKSwgY3R4KTsKKwllbWl0KEFSTV9NT1ZfU0kodG1wMlswXSwg cm4sIFNSVFlQRV9MU1IsIDgpLCBjdHgpOworCWVtaXQoQVJNX0FORF9JKHRtcDJbMF0sIHRtcDJb MF0sIDB4ZmYpLCBjdHgpOworCWVtaXQoQVJNX09SUl9TSShyZCwgdG1wMlswXSwgdG1wMlsxXSwg U1JUWVBFX0xTTCwgOCksIGN0eCk7CisjZWxzZSAvKiBBUk12NisgKi8KKwllbWl0KEFSTV9SRVYx NihyZCwgcm4pLCBjdHgpOworI2VuZGlmCit9CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+bGVu OyBpKyspIHsKLQkJdTE2IGNvZGU7CisvKiAweGFiY2RlZmdoID0+IDB4Z2hlZmNkYWIgKi8KK3N0 YXRpYyBpbmxpbmUgdm9pZCBlbWl0X3JldjMyKGNvbnN0IHU4IHJkLCBjb25zdCB1OCBybiwgc3Ry dWN0IGppdF9jdHggKmN0eCkKK3sKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CisJY29uc3Qg dTggKnRtcDIgPSBicGYyYTMyW1RNUF9SRUdfMl07CisKKwllbWl0KEFSTV9BTkRfSSh0bXAyWzFd LCBybiwgMHhmZiksIGN0eCk7CisJZW1pdChBUk1fTU9WX1NJKHRtcDJbMF0sIHJuLCBTUlRZUEVf TFNSLCAyNCksIGN0eCk7CisJZW1pdChBUk1fT1JSX1NJKEFSTV9JUCwgdG1wMlswXSwgdG1wMlsx XSwgU1JUWVBFX0xTTCwgMjQpLCBjdHgpOworCisJZW1pdChBUk1fTU9WX1NJKHRtcDJbMV0sIHJu LCBTUlRZUEVfTFNSLCA4KSwgY3R4KTsKKwllbWl0KEFSTV9BTkRfSSh0bXAyWzFdLCB0bXAyWzFd LCAweGZmKSwgY3R4KTsKKwllbWl0KEFSTV9NT1ZfU0kodG1wMlswXSwgcm4sIFNSVFlQRV9MU1Is IDE2KSwgY3R4KTsKKwllbWl0KEFSTV9BTkRfSSh0bXAyWzBdLCB0bXAyWzBdLCAweGZmKSwgY3R4 KTsKKwllbWl0KEFSTV9NT1ZfU0kodG1wMlswXSwgdG1wMlswXSwgU1JUWVBFX0xTTCwgOCksIGN0 eCk7CisJZW1pdChBUk1fT1JSX1NJKHRtcDJbMF0sIHRtcDJbMF0sIHRtcDJbMV0sIFNSVFlQRV9M U0wsIDE2KSwgY3R4KTsKKwllbWl0KEFSTV9PUlJfUihyZCwgQVJNX0lQLCB0bXAyWzBdKSwgY3R4 KTsKKworI2Vsc2UgLyogQVJNdjYrICovCisJZW1pdChBUk1fUkVWKHJkLCBybiksIGN0eCk7Cisj ZW5kaWYKK30KKworLy8gcHVzaCB0aGUgc2NyYXRjaCBzdGFjayByZWdpc3RlciBvbiB0b3Agb2Yg dGhlIHN0YWNrCitzdGF0aWMgaW5saW5lIHZvaWQgZW1pdF9wdXNoX3I2NChjb25zdCB1OCBzcmNb XSwgY29uc3QgdTggc2hpZnQsCisJCXN0cnVjdCBqaXRfY3R4ICpjdHgpCit7CisJY29uc3QgdTgg KnRtcDIgPSBicGYyYTMyW1RNUF9SRUdfMl07CisJdTE2IHJlZ19zZXQgPSAwOwogCi0JCWluc3Qg PSAmKHByb2ctPmluc25zW2ldKTsKLQkJLyogSyBhcyBhbiBpbW1lZGlhdGUgdmFsdWUgb3BlcmFu ZCAqLwotCQlrID0gaW5zdC0+azsKLQkJY29kZSA9IGJwZl9hbmNfaGVscGVyKGluc3QpOworCWVt aXQoQVJNX0xEUl9JKHRtcDJbMV0sIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY1sxXStzaGlmdCkpLCBj dHgpOworCWVtaXQoQVJNX0xEUl9JKHRtcDJbMF0sIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY1swXStz aGlmdCkpLCBjdHgpOwogCi0JCS8qIGNvbXB1dGUgb2Zmc2V0cyBvbmx5IGluIHRoZSBmYWtlIHBh c3MgKi8KLQkJaWYgKGN0eC0+dGFyZ2V0ID09IE5VTEwpCi0JCQljdHgtPm9mZnNldHNbaV0gPSBj dHgtPmlkeCAqIDQ7CisJcmVnX3NldCA9ICgxIDw8IHRtcDJbMV0pIHwgKDEgPDwgdG1wMlswXSk7 CisJZW1pdChBUk1fUFVTSChyZWdfc2V0KSwgY3R4KTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRf cHJvbG9ndWUoc3RydWN0IGppdF9jdHggKmN0eCkKK3sKKwljb25zdCB1OCByMCA9IGJwZjJhMzJb QlBGX1JFR18wXVsxXTsKKwljb25zdCB1OCByMiA9IGJwZjJhMzJbQlBGX1JFR18xXVsxXTsKKwlj b25zdCB1OCByMyA9IGJwZjJhMzJbQlBGX1JFR18xXVswXTsKKwljb25zdCB1OCByNCA9IGJwZjJh MzJbQlBGX1JFR182XVsxXTsKKwljb25zdCB1OCByNSA9IGJwZjJhMzJbQlBGX1JFR182XVswXTsK Kwljb25zdCB1OCByNiA9IGJwZjJhMzJbVE1QX1JFR18xXVsxXTsKKwljb25zdCB1OCByNyA9IGJw ZjJhMzJbVE1QX1JFR18xXVswXTsKKwljb25zdCB1OCByOCA9IGJwZjJhMzJbVE1QX1JFR18yXVsx XTsKKwljb25zdCB1OCByMTAgPSBicGYyYTMyW1RNUF9SRUdfMl1bMF07CisJY29uc3QgdTggZnBs byA9IGJwZjJhMzJbQlBGX1JFR19GUF1bMV07CisJY29uc3QgdTggZnBoaSA9IGJwZjJhMzJbQlBG X1JFR19GUF1bMF07CisJY29uc3QgdTggc3AgPSBBUk1fU1A7CisJY29uc3QgdTggKnRjYyA9IGJw ZjJhMzJbVENBTExfQ05UXTsKKworCXUxNiByZWdfc2V0ID0gMDsKKworCS8qCisJICogZUJQRiBw cm9nIHN0YWNrIGxheW91dAorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgaGlnaAor CSAqIG9yaWdpbmFsIEFSTV9TUCA9PiAgICAgKy0tLS0tKyBlQlBGIHByb2xvZ3VlCisJICogICAg ICAgICAgICAgICAgICAgICAgICB8RlAvTFJ8CisJICogY3VycmVudCBBUk1fRlAgPT4gICAgICAr LS0tLS0rCisJICogICAgICAgICAgICAgICAgICAgICAgICB8IC4uLiB8IGNhbGxlZSBzYXZlZCBy ZWdpc3RlcnMKKwkgKiBlQlBGIGZwIHJlZ2lzdGVyID0+ICAgICstLS0tLSsgPD0gKEJQRl9GUCkK KwkgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgLi4uIHwgZUJQRiBKSVQgc2NyYXRjaCBzcGFj ZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlQlBGIHByb2cgc3RhY2sKKwkg KiAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLSsKKwkgKgkJCSAgfFJTVkQgfCBKSVQgc2Ny YXRjaHBhZAorCSAqIGN1cnJlbnQgQTY0X1NQID0+ICAgICAgKy0tLS0tKyA8PSAoQlBGX0ZQIC0g U1RBQ0tfU0laRSkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKwkgKiAgICAg ICAgICAgICAgICAgICAgICAgIHwgLi4uIHwgRnVuY3Rpb24gY2FsbCBzdGFjaworCSAqICAgICAg ICAgICAgICAgICAgICAgICAgfCAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgKy0t LS0tKworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsb3cKKwkgKi8KKworCS8qIFNhdmUg Y2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4gKi8KKwlyZWdfc2V0IHw9ICgxPDxyNCkgfCAoMTw8cjUp IHwgKDE8PHI2KSB8ICgxPDxyNykgfCAoMTw8cjgpIHwgKDE8PHIxMCk7CisjaWZkZWYgQ09ORklH X0ZSQU1FX1BPSU5URVIKKwlyZWdfc2V0IHw9ICgxPDxBUk1fRlApIHwgKDE8PEFSTV9JUCkgfCAo MTw8QVJNX0xSKSB8ICgxPDxBUk1fUEMpOworCWVtaXQoQVJNX01PVl9SKEFSTV9JUCwgc3ApLCBj dHgpOworCWVtaXQoQVJNX1BVU0gocmVnX3NldCksIGN0eCk7CisJZW1pdChBUk1fU1VCX0koQVJN X0ZQLCBBUk1fSVAsIDQpLCBjdHgpOworI2Vsc2UKKwkvKiBDaGVjayBpZiBjYWxsIGluc3RydWN0 aW9uIGV4aXN0cyBpbiBCUEYgYm9keSAqLworCWlmIChjdHgtPnNlZW4gJiBTRUVOX0NBTEwpCisJ CXJlZ19zZXQgfD0gKDE8PEFSTV9MUik7CisJZW1pdChBUk1fUFVTSChyZWdfc2V0KSwgY3R4KTsK KyNlbmRpZgorCS8qIFNhdmUgZnJhbWUgcG9pbnRlciBmb3IgbGF0ZXIgKi8KKwllbWl0KEFSTV9T VUJfSShBUk1fSVAsIHNwLCBTQ1JBVENIX1NJWkUpLCBjdHgpOworCisJLyogU2V0IHVwIGZ1bmN0 aW9uIGNhbGwgc3RhY2sgKi8KKwllbWl0KEFSTV9TVUJfSShBUk1fU1AsIEFSTV9TUCwgaW1tOG0o U1RBQ0tfU0laRSkpLCBjdHgpOworCisJLyogU2V0IHVwIEJQRiBwcm9nIHN0YWNrIGJhc2UgcmVn aXN0ZXIgKi8KKwllbWl0X2EzMl9tb3ZfcihmcGxvLCBBUk1fSVAsIHRydWUsIGZhbHNlLCBjdHgp OworCWVtaXRfYTMyX21vdl9pKGZwaGksIDAsIHRydWUsIGN0eCk7CisKKwkvKiBtb3YgcjQsIDAg Ki8KKwllbWl0KEFSTV9NT1ZfSShyNCwgMCksIGN0eCk7CisKKwkvKiBNb3ZlIEJQRl9DVFggdG8g QlBGX1IxICovCisJZW1pdChBUk1fTU9WX1IocjMsIHI0KSwgY3R4KTsKKwllbWl0KEFSTV9NT1Zf UihyMiwgcjApLCBjdHgpOworCS8qIEluaXRpYWxpemUgVGFpbCBDb3VudCAqLworCWVtaXQoQVJN X1NUUl9JKHI0LCBBUk1fU1AsIFNUQUNLX1ZBUih0Y2NbMF0pKSwgY3R4KTsKKwllbWl0KEFSTV9T VFJfSShyNCwgQVJNX1NQLCBTVEFDS19WQVIodGNjWzFdKSksIGN0eCk7CisJLyogZW5kIG9mIHBy b2xvZ3VlICovCit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2VwaWxvZ3VlKHN0cnVjdCBqaXRfY3R4 ICpjdHgpCit7CisJY29uc3QgdTggcjQgPSBicGYyYTMyW0JQRl9SRUdfNl1bMV07CisJY29uc3Qg dTggcjUgPSBicGYyYTMyW0JQRl9SRUdfNl1bMF07CisJY29uc3QgdTggcjYgPSBicGYyYTMyW1RN UF9SRUdfMV1bMV07CisJY29uc3QgdTggcjcgPSBicGYyYTMyW1RNUF9SRUdfMV1bMF07CisJY29u c3QgdTggcjggPSBicGYyYTMyW1RNUF9SRUdfMl1bMV07CisJY29uc3QgdTggcjEwID0gYnBmMmEz MltUTVBfUkVHXzJdWzBdOworCXUxNiByZWdfc2V0ID0gMDsKKworCS8qIHVud2luZCBmdW5jdGlv biBjYWxsIHN0YWNrICovCisJZW1pdChBUk1fQUREX0koQVJNX1NQLCBBUk1fU1AsIGltbThtKFNU QUNLX1NJWkUpKSwgY3R4KTsKKworCS8qIHJlc3RvcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4g Ki8KKwlyZWdfc2V0IHw9ICgxPDxyNCkgfCAoMTw8cjUpIHwgKDE8PHI2KSB8ICgxPDxyNykgfCAo MTw8cjgpIHwgKDE8PHIxMCk7CisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwkvKiB0aGUg Zmlyc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIHByb2xvZ3VlIHdhczogbW92IGlwLCBzcCAqLworCXJl Z19zZXQgfD0gKDE8PEFSTV9GUCkgfCAoMTw8QVJNX1NQKSB8ICgxPDxBUk1fUEMpOworCWVtaXQo QVJNX0xETShBUk1fU1AsIHJlZ19zZXQpLCBjdHgpOworI2Vsc2UKKwlpZiAoY3R4LT5zZWVuICYg U0VFTl9DQUxMKQorCQlyZWdfc2V0IHw9ICgxPDxBUk1fUEMpOworCS8qIFJlc3RvcmUgY2FsbGVl IHNhdmVkIHJlZ2lzdGVycy4gKi8KKwllbWl0KEFSTV9QT1AocmVnX3NldCksIGN0eCk7CisJLyog UmV0dXJuIGJhY2sgdG8gdGhlIGNhbGxlZSBmdW5jdGlvbiAqLworCWlmICghKGN0eC0+c2VlbiAm IFNFRU5fQ0FMTCkpCisJCWVtaXQoQVJNX0JYKEFSTV9MUiksIGN0eCk7CisjZW5kaWYKK30KIAot CQlzd2l0Y2ggKGNvZGUpIHsKLQkJY2FzZSBCUEZfTEQgfCBCUEZfSU1NOgotCQkJZW1pdF9tb3Zf aShyX0EsIGssIGN0eCk7CisvKgorICogQ29udmVydCBhbiBlQlBGIGluc3RydWN0aW9uIHRvIG5h dGl2ZSBpbnN0cnVjdGlvbiwgaS5lCisgKiBKSVRzIGFuIGVCUEYgaW5zdHJ1Y3Rpb24uCisgKiBS ZXR1cm5zIDoKKyAqCTAgIC0gU3VjY2Vzc2Z1bGx5IEpJVGVkIGFuIDgtYnl0ZSBlQlBGIGluc3Ry dWN0aW9uCisgKgk+MCAtIFN1Y2Nlc3NmdWxseSBKSVRlZCBhIDE2LWJ5dGUgZUJQRiBpbnN0cnVj dGlvbgorICoJPDAgLSBGYWlsZWQgdG8gSklULgorICovCitzdGF0aWMgaW50IGJ1aWxkX2luc24o Y29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuLCBzdHJ1Y3Qgaml0X2N0eCAqY3R4KQoreworCWNv bnN0IHU4IGNvZGUgPSBpbnNuLT5jb2RlOworCWNvbnN0IHU4ICpkc3QgPSBicGYyYTMyW2luc24t PmRzdF9yZWddOworCWNvbnN0IHU4ICpzcmMgPSBicGYyYTMyW2luc24tPnNyY19yZWddOworCWNv bnN0IHU4ICp0bXAgPSBicGYyYTMyW1RNUF9SRUdfMV07CisJY29uc3QgdTggKnRtcDIgPSBicGYy YTMyW1RNUF9SRUdfMl07CisJY29uc3QgczE2IG9mZiA9IGluc24tPm9mZjsKKwljb25zdCBzMzIg aW1tID0gaW5zbi0+aW1tOworCWNvbnN0IGludCBpID0gaW5zbiAtIGN0eC0+cHJvZy0+aW5zbnNp OworCWNvbnN0IGJvb2wgaXM2NCA9IEJQRl9DTEFTUyhjb2RlKSA9PSBCUEZfQUxVNjQ7CisJY29u c3QgYm9vbCBkc3RrID0gaXNfb25fc3RhY2soaW5zbi0+ZHN0X3JlZyk7CisJY29uc3QgYm9vbCBz c3RrID0gaXNfb25fc3RhY2soaW5zbi0+c3JjX3JlZyk7CisJdTggcmQsIHJ0LCBybSwgcm47CisJ czMyIGptcF9vZmZzZXQ7CisKKyNkZWZpbmUgY2hlY2tfaW1tKGJpdHMsIGltbSkgZG8gewkJCQlc CisJaWYgKCgoKGltbSkgPiAwKSAmJiAoKGltbSkgPj4gKGJpdHMpKSkgfHwJCVwKKwkgICAgKCgo aW1tKSA8IDApICYmICh+KGltbSkgPj4gKGJpdHMpKSkpIHsJCVwKKwkJcHJfaW5mbygiWyUyZF0g aW1tPSVkKDB4JXgpIG91dCBvZiByYW5nZVxuIiwJXAorCQkJaSwgaW1tLCBpbW0pOwkJCQlcCisJ CXJldHVybiAtRUlOVkFMOwkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUg Y2hlY2tfaW1tMjQoaW1tKSBjaGVja19pbW0oMjQsIGltbSkKKworCXN3aXRjaCAoY29kZSkgewor CS8qIEFMVSBvcGVyYXRpb25zICovCisKKwkvKiBkc3QgPSBzcmMgKi8KKwljYXNlIEJQRl9BTFUg fCBCUEZfTU9WIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9YOgorCWNh c2UgQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01P ViB8IEJQRl9YOgorCQlzd2l0Y2ggKEJQRl9TUkMoY29kZSkpIHsKKwkJY2FzZSBCUEZfWDoKKwkJ CWVtaXRfYTMyX21vdl9yNjQoaXM2NCwgZHN0LCBzcmMsIGRzdGssIHNzdGssIGN0eCk7CiAJCQli cmVhazsKLQkJY2FzZSBCUEZfTEQgfCBCUEZfVyB8IEJQRl9MRU46Ci0JCQljdHgtPnNlZW4gfD0g U0VFTl9TS0I7Ci0JCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBs ZW4pICE9IDQpOwotCQkJZW1pdChBUk1fTERSX0kocl9BLCByX3NrYiwKLQkJCQkgICAgICAgb2Zm c2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpLCBjdHgpOworCQljYXNlIEJQRl9LOgorCQkJLyog U2lnbi1leHRlbmQgaW1tZWRpYXRlIHZhbHVlIHRvIGRlc3RpbmF0aW9uIHJlZyAqLworCQkJZW1p dF9hMzJfbW92X2k2NChpczY0LCBkc3QsIGltbSwgZHN0aywgY3R4KTsKIAkJCWJyZWFrOwotCQlj YXNlIEJQRl9MRCB8IEJQRl9NRU06Ci0JCQkvKiBBID0gc2NyYXRjaFtrXSAqLwotCQkJY3R4LT5z ZWVuIHw9IFNFRU5fTUVNX1dPUkQoayk7Ci0JCQllbWl0KEFSTV9MRFJfSShyX0EsIEFSTV9TUCwg U0NSQVRDSF9PRkYoaykpLCBjdHgpOworCQl9CisJCWJyZWFrOworCS8qIGRzdCA9IGRzdCArIHNy Yy9pbW0gKi8KKwkvKiBkc3QgPSBkc3QgLSBzcmMvaW1tICovCisJLyogZHN0ID0gZHN0IHwgc3Jj L2ltbSAqLworCS8qIGRzdCA9IGRzdCAmIHNyYy9pbW0gKi8KKwkvKiBkc3QgPSBkc3QgXiBzcmMv aW1tICovCisJLyogZHN0ID0gZHN0ICogc3JjL2ltbSAqLworCS8qIGRzdCA9IGRzdCA8PCBzcmMg Ki8KKwkvKiBkc3QgPSBkc3QgPj4gc3JjICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQ Rl9LOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFUgfCBC UEZfU1VCIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgorCWNhc2Ug QlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9Y OgorCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFUgfCBCUEZf QU5EIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOgorCWNhc2UgQlBG X0FMVSB8IEJQRl9YT1IgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX0s6 CisJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9M U0ggfCBCUEZfWDoKKwljYXNlIEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1g6CisJY2FzZSBCUEZf QUxVIHwgQlBGX0FSU0ggfCBCUEZfSzoKKwljYXNlIEJQRl9BTFUgfCBCUEZfQVJTSCB8IEJQRl9Y OgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwg QlBGX0FERCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9LOgorCWNh c2UgQlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX09S IHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfT1IgfCBCUEZfWDoKKwljYXNlIEJQRl9B TFU2NCB8IEJQRl9BTkQgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9BTkQgfCBCUEZf WDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9YT1IgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8 IEJQRl9YT1IgfCBCUEZfWDoKKwkJc3dpdGNoIChCUEZfU1JDKGNvZGUpKSB7CisJCWNhc2UgQlBG X1g6CisJCQllbWl0X2EzMl9hbHVfcjY0KGlzNjQsIGRzdCwgc3JjLCBkc3RrLCBzc3RrLAorCQkJ CQkgY3R4LCBCUEZfT1AoY29kZSkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0xEIHwgQlBGX1cg fCBCUEZfQUJTOgotCQkJbG9hZF9vcmRlciA9IDI7Ci0JCQlnb3RvIGxvYWQ7Ci0JCWNhc2UgQlBG X0xEIHwgQlBGX0ggfCBCUEZfQUJTOgotCQkJbG9hZF9vcmRlciA9IDE7Ci0JCQlnb3RvIGxvYWQ7 Ci0JCWNhc2UgQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTOgotCQkJbG9hZF9vcmRlciA9IDA7Ci1s b2FkOgotCQkJZW1pdF9tb3ZfaShyX29mZiwgaywgY3R4KTsKLWxvYWRfY29tbW9uOgotCQkJY3R4 LT5zZWVuIHw9IFNFRU5fREFUQSB8IFNFRU5fQ0FMTDsKLQotCQkJaWYgKGxvYWRfb3JkZXIgPiAw KSB7Ci0JCQkJZW1pdChBUk1fU1VCX0kocl9zY3JhdGNoLCByX3NrYl9obCwKLQkJCQkJICAgICAg IDEgPDwgbG9hZF9vcmRlciksIGN0eCk7Ci0JCQkJZW1pdChBUk1fQ01QX1Iocl9zY3JhdGNoLCBy X29mZiksIGN0eCk7Ci0JCQkJY29uZHQgPSBBUk1fQ09ORF9HRTsKLQkJCX0gZWxzZSB7Ci0JCQkJ ZW1pdChBUk1fQ01QX1Iocl9za2JfaGwsIHJfb2ZmKSwgY3R4KTsKLQkJCQljb25kdCA9IEFSTV9D T05EX0hJOwotCQkJfQotCi0JCQkvKgotCQkJICogdGVzdCBmb3IgbmVnYXRpdmUgb2Zmc2V0LCBv bmx5IGlmIHdlIGFyZQotCQkJICogY3VycmVudGx5IHNjaGVkdWxlZCB0byB0YWtlIHRoZSBmYXN0 Ci0JCQkgKiBwYXRoLiB0aGlzIHdpbGwgdXBkYXRlIHRoZSBmbGFncyBzbyB0aGF0Ci0JCQkgKiB0 aGUgc2xvd3BhdGggaW5zdHJ1Y3Rpb24gYXJlIGlnbm9yZWQgaWYgdGhlCi0JCQkgKiBvZmZzZXQg aXMgbmVnYXRpdmUuCi0JCQkgKgotCQkJICogZm9yIGxvYXJkX29yZGVyID09IDAgdGhlIEhJIGNv bmRpdGlvbiB3aWxsCi0JCQkgKiBtYWtlIGxvYWRzIGF0IG9mZnNldCAwIHRha2UgdGhlIHNsb3cg cGF0aCB0b28uCisJCWNhc2UgQlBGX0s6CisJCQkvKiBNb3ZlIGltbWVkaWF0ZSB2YWx1ZSB0byB0 aGUgdGVtcG9yYXJ5IHJlZ2lzdGVyCisJCQkgKiBhbmQgdGhlbiBkbyB0aGUgQUxVIG9wZXJhdGlv biBvbiB0aGUgdGVtcG9yYXJ5CisJCQkgKiByZWdpc3RlciBhcyB0aGlzIHdpbGwgc2lnbi1leHRl bmQgdGhlIGltbWVkaWF0ZQorCQkJICogdmFsdWUgaW50byB0ZW1wb3JhcnkgcmVnIGFuZCB0aGVu IGl0IHdvdWxkIGJlCisJCQkgKiBzYWZlIHRvIGRvIHRoZSBvcGVyYXRpb24gb24gaXQuCiAJCQkg Ki8KLQkJCV9lbWl0KGNvbmR0LCBBUk1fQ01QX0kocl9vZmYsIDApLCBjdHgpOwotCi0JCQlfZW1p dChjb25kdCwgQVJNX0FERF9SKHJfc2NyYXRjaCwgcl9vZmYsIHJfc2tiX2RhdGEpLAotCQkJICAg ICAgY3R4KTsKLQotCQkJaWYgKGxvYWRfb3JkZXIgPT0gMCkKLQkJCQlfZW1pdChjb25kdCwgQVJN X0xEUkJfSShyX0EsIHJfc2NyYXRjaCwgMCksCi0JCQkJICAgICAgY3R4KTsKLQkJCWVsc2UgaWYg KGxvYWRfb3JkZXIgPT0gMSkKLQkJCQllbWl0X2xvYWRfYmUxNihjb25kdCwgcl9BLCByX3NjcmF0 Y2gsIGN0eCk7Ci0JCQllbHNlIGlmIChsb2FkX29yZGVyID09IDIpCi0JCQkJZW1pdF9sb2FkX2Jl MzIoY29uZHQsIHJfQSwgcl9zY3JhdGNoLCBjdHgpOwotCi0JCQlfZW1pdChjb25kdCwgQVJNX0Io Yl9pbW0oaSArIDEsIGN0eCkpLCBjdHgpOwotCi0JCQkvKiB0aGUgc2xvd3BhdGggKi8KLQkJCWVt aXRfbW92X2koQVJNX1IzLCAodTMyKWxvYWRfZnVuY1tsb2FkX29yZGVyXSwgY3R4KTsKLQkJCWVt aXQoQVJNX01PVl9SKEFSTV9SMCwgcl9za2IpLCBjdHgpOwotCQkJLyogdGhlIG9mZnNldCBpcyBh bHJlYWR5IGluIFIxICovCi0JCQllbWl0X2JseF9yKEFSTV9SMywgY3R4KTsKLQkJCS8qIGNoZWNr IHRoZSByZXN1bHQgb2Ygc2tiX2NvcHlfYml0cyAqLwotCQkJZW1pdChBUk1fQ01QX0koQVJNX1Ix LCAwKSwgY3R4KTsKLQkJCWVtaXRfZXJyX3JldChBUk1fQ09ORF9ORSwgY3R4KTsKLQkJCWVtaXQo QVJNX01PVl9SKHJfQSwgQVJNX1IwKSwgY3R4KTsKKwkJCWVtaXRfYTMyX21vdl9pNjQoaXM2NCwg dG1wMiwgaW1tLCBmYWxzZSwgY3R4KTsKKwkJCWVtaXRfYTMyX2FsdV9yNjQoaXM2NCwgZHN0LCB0 bXAyLCBkc3RrLCBmYWxzZSwKKwkJCQkJIGN0eCwgQlBGX09QKGNvZGUpKTsKIAkJCWJyZWFrOwot CQljYXNlIEJQRl9MRCB8IEJQRl9XIHwgQlBGX0lORDoKLQkJCWxvYWRfb3JkZXIgPSAyOwotCQkJ Z290byBsb2FkX2luZDsKLQkJY2FzZSBCUEZfTEQgfCBCUEZfSCB8IEJQRl9JTkQ6Ci0JCQlsb2Fk X29yZGVyID0gMTsKLQkJCWdvdG8gbG9hZF9pbmQ7Ci0JCWNhc2UgQlBGX0xEIHwgQlBGX0IgfCBC UEZfSU5EOgotCQkJbG9hZF9vcmRlciA9IDA7Ci1sb2FkX2luZDoKLQkJCXVwZGF0ZV9vbl94cmVh ZChjdHgpOwotCQkJT1BfSU1NMyhBUk1fQURELCByX29mZiwgcl9YLCBrLCBjdHgpOwotCQkJZ290 byBsb2FkX2NvbW1vbjsKLQkJY2FzZSBCUEZfTERYIHwgQlBGX0lNTToKLQkJCWN0eC0+c2VlbiB8 PSBTRUVOX1g7Ci0JCQllbWl0X21vdl9pKHJfWCwgaywgY3R4KTsKKwkJfQorCQlicmVhazsKKwkv KiBkc3QgPSBkc3QgLyBzcmMoaW1tKSAqLworCS8qIGRzdCA9IGRzdCAlIHNyYyhpbW0pICovCisJ Y2FzZSBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYg fCBCUEZfWDoKKwljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxV IHwgQlBGX01PRCB8IEJQRl9YOgorCQlydCA9IHNyY19sbzsKKwkJcmQgPSBkc3RrID8gdG1wMlsx XSA6IGRzdF9sbzsKKwkJaWYgKGRzdGspCisJCQllbWl0KEFSTV9MRFJfSShyZCwgQVJNX1NQLCBT VEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCXN3aXRjaCAoQlBGX1NSQyhjb2RlKSkgeworCQlj YXNlIEJQRl9YOgorCQkJcnQgPSBzc3RrID8gdG1wMlswXSA6IHJ0OworCQkJaWYgKHNzdGspCisJ CQkJZW1pdChBUk1fTERSX0kocnQsIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY19sbykpLAorCQkJCSAg ICAgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9MRFggfCBCUEZfVyB8IEJQRl9MRU46Ci0J CQljdHgtPnNlZW4gfD0gU0VFTl9YIHwgU0VFTl9TS0I7Ci0JCQllbWl0KEFSTV9MRFJfSShyX1gs IHJfc2tiLAotCQkJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbGVuKSksIGN0eCk7 CisJCWNhc2UgQlBGX0s6CisJCQlydCA9IHRtcDJbMF07CisJCQllbWl0X2EzMl9tb3ZfaShydCwg aW1tLCBmYWxzZSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9MRFggfCBCUEZfTUVNOgot CQkJY3R4LT5zZWVuIHw9IFNFRU5fWCB8IFNFRU5fTUVNX1dPUkQoayk7Ci0JCQllbWl0KEFSTV9M RFJfSShyX1gsIEFSTV9TUCwgU0NSQVRDSF9PRkYoaykpLCBjdHgpOworCQl9CisJCWVtaXRfdWRp dm1vZChyZCwgcmQsIHJ0LCBjdHgsIEJQRl9PUChjb2RlKSk7CisJCWlmIChkc3RrKQorCQkJZW1p dChBUk1fU1RSX0kocmQsIEFSTV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQllbWl0 X2EzMl9tb3ZfaShkc3RfaGksIDAsIGRzdGssIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FM VTY0IHwgQlBGX0RJViB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0RJViB8IEJQRl9Y OgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PRCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwg QlBGX01PRCB8IEJQRl9YOgorCQlnb3RvIG5vdHlldDsKKwkvKiBkc3QgPSBkc3QgPj4gaW1tICov CisJLyogZHN0ID0gZHN0IDw8IGltbSAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZf SzoKKwljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0s6CisJCWlmICh1bmxpa2VseShpbW0g PiAzMSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGltbSkKKwkJCWVtaXRfYTMyX2FsdV9p KGRzdF9sbywgaW1tLCBkc3RrLCBjdHgsIEJQRl9PUChjb2RlKSk7CisJCWVtaXRfYTMyX21vdl9p KGRzdF9oaSwgMCwgZHN0aywgY3R4KTsKKwkJYnJlYWs7CisJLyogZHN0ID0gZHN0IDw8IGltbSAq LworCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0xTSCB8IEJQRl9LOgorCQlpZiAodW5saWtlbHkoaW1t ID4gNjMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVtaXRfYTMyX2xzaF9pNjQoZHN0LCBkc3Rr LCBpbW0sIGN0eCk7CisJCWJyZWFrOworCS8qIGRzdCA9IGRzdCA+PiBpbW0gKi8KKwljYXNlIEJQ Rl9BTFU2NCB8IEJQRl9SU0ggfCBCUEZfSzoKKwkJaWYgKHVubGlrZWx5KGltbSA+IDYzKSkKKwkJ CXJldHVybiAtRUlOVkFMOworCQllbWl0X2EzMl9sc3JfaTY0KGRzdCwgZHN0aywgaW1tLCBjdHgp OworCQlicmVhazsKKwkvKiBkc3QgPSBkc3QgPDwgc3JjICovCisJY2FzZSBCUEZfQUxVNjQgfCBC UEZfTFNIIHwgQlBGX1g6CisJCWVtaXRfYTMyX2xzaF9yNjQoZHN0LCBzcmMsIGRzdGssIHNzdGss IGN0eCk7CisJCWJyZWFrOworCS8qIGRzdCA9IGRzdCA+PiBzcmMgKi8KKwljYXNlIEJQRl9BTFU2 NCB8IEJQRl9SU0ggfCBCUEZfWDoKKwkJZW1pdF9hMzJfbHNyX3I2NChkc3QsIHNyYywgZHN0aywg c3N0aywgY3R4KTsKKwkJYnJlYWs7CisJLyogZHN0ID0gZHN0ID4+IHNyYyAoc2lnbmVkKSAqLwor CWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FSU0ggfCBCUEZfWDoKKwkJZW1pdF9hMzJfYXJzaF9yNjQo ZHN0LCBzcmMsIGRzdGssIHNzdGssIGN0eCk7CisJCWJyZWFrOworCS8qIGRzdCA9IGRzdCA+PiBp bW0gKHNpZ25lZCkgKi8KKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9BUlNIIHwgQlBGX0s6CisJCWlm ICh1bmxpa2VseShpbW0gPiA2MykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZW1pdF9hMzJfYXJz aF9pNjQoZHN0LCBkc3RrLCBpbW0sIGN0eCk7CisJCWJyZWFrOworCS8qIGRzdCA9IH5kc3QgKi8K KwljYXNlIEJQRl9BTFUgfCBCUEZfTkVHOgorCQllbWl0X2EzMl9hbHVfaShkc3RfbG8sIDAsIGRz dGssIGN0eCwgQlBGX09QKGNvZGUpKTsKKwkJZW1pdF9hMzJfbW92X2koZHN0X2hpLCAwLCBkc3Rr LCBjdHgpOworCQlicmVhazsKKwkvKiBkc3QgPSB+ZHN0ICg2NCBiaXQpICovCisJY2FzZSBCUEZf QUxVNjQgfCBCUEZfTkVHOgorCQllbWl0X2EzMl9uZWc2NChkc3QsIGRzdGssIGN0eCk7CisJCWJy ZWFrOworCS8qIGRzdCA9IGRzdCAqIHNyYy9pbW0gKi8KKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9N VUwgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9NVUwgfCBCUEZfSzoKKwkJc3dpdGNo IChCUEZfU1JDKGNvZGUpKSB7CisJCWNhc2UgQlBGX1g6CisJCQllbWl0X2EzMl9tdWxfcjY0KGRz dCwgc3JjLCBkc3RrLCBzc3RrLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0xEWCB8IEJQ Rl9CIHwgQlBGX01TSDoKLQkJCS8qIHggPSAoKCooZnJhbWUgKyBrKSkgJiAweGYpIDw8IDI7ICov Ci0JCQljdHgtPnNlZW4gfD0gU0VFTl9YIHwgU0VFTl9EQVRBIHwgU0VFTl9DQUxMOwotCQkJLyog dGhlIGludGVycHJldGVyIHNob3VsZCBkZWFsIHdpdGggdGhlIG5lZ2F0aXZlIEsgKi8KLQkJCWlm ICgoaW50KWsgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCS8qIG9mZnNldCBpbiByMTogd2UgbWln aHQgaGF2ZSB0byB0YWtlIHRoZSBzbG93IHBhdGggKi8KLQkJCWVtaXRfbW92X2kocl9vZmYsIGss IGN0eCk7Ci0JCQllbWl0KEFSTV9DTVBfUihyX3NrYl9obCwgcl9vZmYpLCBjdHgpOwotCi0JCQkv KiBsb2FkIGluIHIwOiBjb21tb24gd2l0aCB0aGUgc2xvd3BhdGggKi8KLQkJCV9lbWl0KEFSTV9D T05EX0hJLCBBUk1fTERSQl9SKEFSTV9SMCwgcl9za2JfZGF0YSwKLQkJCQkJCSAgICAgIEFSTV9S MSksIGN0eCk7Ci0JCQkvKgotCQkJICogZW1pdF9tb3ZfaSgpIG1pZ2h0IGdlbmVyYXRlIG9uZSBv ciB0d28gaW5zdHJ1Y3Rpb25zLAotCQkJICogdGhlIHNhbWUgaG9sZHMgZm9yIGVtaXRfYmx4X3Io KQorCQljYXNlIEJQRl9LOgorCQkJLyogTW92ZSBpbW1lZGlhdGUgdmFsdWUgdG8gdGhlIHRlbXBv cmFyeSByZWdpc3RlcgorCQkJICogYW5kIHRoZW4gZG8gdGhlIG11bHRpcGxpY2F0aW9uIG9uIGl0 IGFzIHRoaXMKKwkJCSAqIHdpbGwgc2lnbi1leHRlbmQgdGhlIGltbWVkaWF0ZSB2YWx1ZSBpbnRv IHRlbXAKKwkJCSAqIHJlZyB0aGVuIGl0IHdvdWxkIGJlIHNhZmUgdG8gZG8gdGhlIG9wZXJhdGlv bgorCQkJICogb24gaXQuCiAJCQkgKi8KLQkJCV9lbWl0KEFSTV9DT05EX0hJLCBBUk1fQihiX2lt bShpICsgMSwgY3R4KSAtIDIpLCBjdHgpOwotCi0JCQllbWl0KEFSTV9NT1ZfUihBUk1fUjAsIHJf c2tiKSwgY3R4KTsKLQkJCS8qIHJfb2ZmIGlzIHIxICovCi0JCQllbWl0X21vdl9pKEFSTV9SMywg KHUzMilqaXRfZ2V0X3NrYl9iLCBjdHgpOwotCQkJZW1pdF9ibHhfcihBUk1fUjMsIGN0eCk7Ci0J CQkvKiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHNrYl9jb3B5X2JpdHMgKi8KLQkJCWVtaXQo QVJNX0NNUF9JKEFSTV9SMSwgMCksIGN0eCk7Ci0JCQllbWl0X2Vycl9yZXQoQVJNX0NPTkRfTkUs IGN0eCk7Ci0KLQkJCWVtaXQoQVJNX0FORF9JKHJfWCwgQVJNX1IwLCAweDAwZiksIGN0eCk7Ci0J CQllbWl0KEFSTV9MU0xfSShyX1gsIHJfWCwgMiksIGN0eCk7Ci0JCQlicmVhazsKLQkJY2FzZSBC UEZfU1Q6Ci0JCQljdHgtPnNlZW4gfD0gU0VFTl9NRU1fV09SRChrKTsKLQkJCWVtaXQoQVJNX1NU Ul9JKHJfQSwgQVJNX1NQLCBTQ1JBVENIX09GRihrKSksIGN0eCk7Ci0JCQlicmVhazsKLQkJY2Fz ZSBCUEZfU1RYOgotCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7Ci0JCQljdHgtPnNlZW4gfD0gU0VF Tl9NRU1fV09SRChrKTsKLQkJCWVtaXQoQVJNX1NUUl9JKHJfWCwgQVJNX1NQLCBTQ1JBVENIX09G RihrKSksIGN0eCk7Ci0JCQlicmVhazsKLQkJY2FzZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9L OgotCQkJLyogQSArPSBLICovCi0JCQlPUF9JTU0zKEFSTV9BREQsIHJfQSwgcl9BLCBrLCBjdHgp OwotCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWDoKLQkJCXVwZGF0 ZV9vbl94cmVhZChjdHgpOwotCQkJZW1pdChBUk1fQUREX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7 Ci0JCQlicmVhazsKLQkJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOgotCQkJLyogQSAt PSBLICovCi0JCQlPUF9JTU0zKEFSTV9TVUIsIHJfQSwgcl9BLCBrLCBjdHgpOwotCQkJYnJlYWs7 Ci0JCWNhc2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfWDoKLQkJCXVwZGF0ZV9vbl94cmVhZChj dHgpOwotCQkJZW1pdChBUk1fU1VCX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7Ci0JCQlicmVhazsK LQkJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOgotCQkJLyogQSAqPSBLICovCi0JCQll bWl0X21vdl9pKHJfc2NyYXRjaCwgaywgY3R4KTsKLQkJCWVtaXQoQVJNX01VTChyX0EsIHJfQSwg cl9zY3JhdGNoKSwgY3R4KTsKKwkJCWVtaXRfYTMyX21vdl9pNjQoaXM2NCwgdG1wMiwgaW1tLCBm YWxzZSwgY3R4KTsKKwkJCWVtaXRfYTMyX211bF9yNjQoZHN0LCB0bXAyLCBkc3RrLCBmYWxzZSwg Y3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX1g6Ci0JCQl1 cGRhdGVfb25feHJlYWQoY3R4KTsKLQkJCWVtaXQoQVJNX01VTChyX0EsIHJfQSwgcl9YKSwgY3R4 KTsKLQkJCWJyZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX0s6Ci0JCQlpZiAo ayA9PSAxKQotCQkJCWJyZWFrOwotCQkJZW1pdF9tb3ZfaShyX3NjcmF0Y2gsIGssIGN0eCk7Ci0J CQllbWl0X3VkaXZtb2Qocl9BLCByX0EsIHJfc2NyYXRjaCwgY3R4LCBCUEZfRElWKTsKLQkJCWJy ZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1g6Ci0JCQl1cGRhdGVfb25feHJl YWQoY3R4KTsKLQkJCWVtaXQoQVJNX0NNUF9JKHJfWCwgMCksIGN0eCk7Ci0JCQllbWl0X2Vycl9y ZXQoQVJNX0NPTkRfRVEsIGN0eCk7Ci0JCQllbWl0X3VkaXZtb2Qocl9BLCByX0EsIHJfWCwgY3R4 LCBCUEZfRElWKTsKLQkJCWJyZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX0s6 Ci0JCQlpZiAoayA9PSAxKSB7Ci0JCQkJZW1pdF9tb3ZfaShyX0EsIDAsIGN0eCk7Ci0JCQkJYnJl YWs7Ci0JCQl9Ci0JCQllbWl0X21vdl9pKHJfc2NyYXRjaCwgaywgY3R4KTsKLQkJCWVtaXRfdWRp dm1vZChyX0EsIHJfQSwgcl9zY3JhdGNoLCBjdHgsIEJQRl9NT0QpOwotCQkJYnJlYWs7Ci0JCWNh c2UgQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfWDoKLQkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwot CQkJZW1pdChBUk1fQ01QX0kocl9YLCAwKSwgY3R4KTsKLQkJCWVtaXRfZXJyX3JldChBUk1fQ09O RF9FUSwgY3R4KTsKLQkJCWVtaXRfdWRpdm1vZChyX0EsIHJfQSwgcl9YLCBjdHgsIEJQRl9NT0Qp OwotCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgotCQkJLyogQSB8 PSBLICovCi0JCQlPUF9JTU0zKEFSTV9PUlIsIHJfQSwgcl9BLCBrLCBjdHgpOworCQl9CisJCWJy ZWFrOworCS8qIGRzdCA9IGh0b2xlKGRzdCkgKi8KKwkvKiBkc3QgPSBodG9iZShkc3QpICovCisJ Y2FzZSBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9GUk9NX0xFOgorCWNhc2UgQlBGX0FMVSB8IEJQ Rl9FTkQgfCBCUEZfRlJPTV9CRToKKwkJcmQgPSBkc3RrID8gdG1wWzBdIDogZHN0X2hpOworCQly dCA9IGRzdGsgPyB0bXBbMV0gOiBkc3RfbG87CisJCWlmIChkc3RrKSB7CisJCQllbWl0KEFSTV9M RFJfSShydCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCQllbWl0KEFSTV9M RFJfSShyZCwgQVJNX1NQLCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJCX0KKwkJaWYgKEJQ Rl9TUkMoY29kZSkgPT0gQlBGX0ZST01fTEUpCisJCQlnb3RvIGVtaXRfYnN3YXBfdXh0OworCQlz d2l0Y2ggKGltbSkgeworCQljYXNlIDE2OgorCQkJZW1pdF9yZXYxNihydCwgcnQsIGN0eCk7CisJ CQlnb3RvIGVtaXRfYnN3YXBfdXh0OworCQljYXNlIDMyOgorCQkJZW1pdF9yZXYzMihydCwgcnQs IGN0eCk7CisJCQlnb3RvIGVtaXRfYnN3YXBfdXh0OworCQljYXNlIDY0OgorCQkJLyogQmVjYXVz ZSBvZiB0aGUgdXNhZ2Ugb2YgQVJNX0xSICovCisJCQljdHgtPnNlZW4gfD0gU0VFTl9DQUxMOwor CQkJZW1pdF9yZXYzMihBUk1fTFIsIHJ0LCBjdHgpOworCQkJZW1pdF9yZXYzMihydCwgcmQsIGN0 eCk7CisJCQllbWl0KEFSTV9NT1ZfUihyZCwgQVJNX0xSKSwgY3R4KTsKIAkJCWJyZWFrOwotCQlj YXNlIEJQRl9BTFUgfCBCUEZfT1IgfCBCUEZfWDoKLQkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwot CQkJZW1pdChBUk1fT1JSX1Iocl9BLCByX0EsIHJfWCksIGN0eCk7CisJCX0KKwkJZ290byBleGl0 OworZW1pdF9ic3dhcF91eHQ6CisJCXN3aXRjaCAoaW1tKSB7CisJCWNhc2UgMTY6CisJCQkvKiB6 ZXJvLWV4dGVuZCAxNiBiaXRzIGludG8gNjQgYml0cyAqLworI2lmIF9fTElOVVhfQVJNX0FSQ0hf XyA8IDYKKwkJCWVtaXRfYTMyX21vdl9pKHRtcDJbMV0sIDB4ZmZmZiwgZmFsc2UsIGN0eCk7CisJ CQllbWl0KEFSTV9BTkRfUihydCwgcnQsIHRtcDJbMV0pLCBjdHgpOworI2Vsc2UgLyogQVJNdjYr ICovCisJCQllbWl0KEFSTV9VWFRIKHJ0LCBydCksIGN0eCk7CisjZW5kaWYKKwkJCWVtaXQoQVJN X0VPUl9SKHJkLCByZCwgcmQpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FMVSB8IEJQ Rl9YT1IgfCBCUEZfSzoKLQkJCS8qIEEgXj0gSzsgKi8KLQkJCU9QX0lNTTMoQVJNX0VPUiwgcl9B LCByX0EsIGssIGN0eCk7CisJCWNhc2UgMzI6CisJCQkvKiB6ZXJvLWV4dGVuZCAzMiBiaXRzIGlu dG8gNjQgYml0cyAqLworCQkJZW1pdChBUk1fRU9SX1IocmQsIHJkLCByZCksIGN0eCk7CiAJCQli cmVhazsKLQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX0FMVV9YT1JfWDoKLQkJY2FzZSBCUEZfQUxV IHwgQlBGX1hPUiB8IEJQRl9YOgotCQkJLyogQSBePSBYICovCi0JCQl1cGRhdGVfb25feHJlYWQo Y3R4KTsKLQkJCWVtaXQoQVJNX0VPUl9SKHJfQSwgcl9BLCByX1gpLCBjdHgpOworCQljYXNlIDY0 OgorCQkJLyogbm9wICovCiAJCQlicmVhazsKLQkJY2FzZSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQ Rl9LOgotCQkJLyogQSAmPSBLICovCi0JCQlPUF9JTU0zKEFSTV9BTkQsIHJfQSwgcl9BLCBrLCBj dHgpOworCQl9CitleGl0OgorCQlpZiAoZHN0aykgeworCQkJZW1pdChBUk1fU1RSX0kocnQsIEFS TV9TUCwgU1RBQ0tfVkFSKGRzdF9sbykpLCBjdHgpOworCQkJZW1pdChBUk1fU1RSX0kocmQsIEFS TV9TUCwgU1RBQ0tfVkFSKGRzdF9oaSkpLCBjdHgpOworCQl9CisJCWJyZWFrOworCS8qIGRzdCA9 IGltbTY0ICovCisJY2FzZSBCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXOgorCXsKKwkJY29uc3Qg c3RydWN0IGJwZl9pbnNuIGluc24xID0gaW5zblsxXTsKKwkJdTMyIGhpLCBsbyA9IGltbTsKKwor CQloaSA9IGluc24xLmltbTsKKwkJZW1pdF9hMzJfbW92X2koZHN0X2xvLCBsbywgZHN0aywgY3R4 KTsKKwkJZW1pdF9hMzJfbW92X2koZHN0X2hpLCBoaSwgZHN0aywgY3R4KTsKKworCQlyZXR1cm4g MTsKKwl9CisJLyogTERYOiBkc3QgPSAqKHNpemUgKikoc3JjICsgb2ZmKSAqLworCWNhc2UgQlBG X0xEWCB8IEJQRl9NRU0gfCBCUEZfVzoKKwljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0g6 CisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9COgorCWNhc2UgQlBGX0xEWCB8IEJQRl9N RU0gfCBCUEZfRFc6CisJCXJuID0gc3N0ayA/IHRtcDJbMV0gOiBzcmNfbG87CisJCWlmIChzc3Rr KQorCQkJZW1pdChBUk1fTERSX0kocm4sIEFSTV9TUCwgU1RBQ0tfVkFSKHNyY19sbykpLCBjdHgp OworCQlzd2l0Y2ggKEJQRl9TSVpFKGNvZGUpKSB7CisJCWNhc2UgQlBGX1c6CisJCQkvKiBMb2Fk IGEgV29yZCAqLworCQljYXNlIEJQRl9IOgorCQkJLyogTG9hZCBhIEhhbGYtV29yZCAqLworCQlj YXNlIEJQRl9COgorCQkJLyogTG9hZCBhIEJ5dGUgKi8KKwkJCWVtaXRfbGR4X3IoZHN0X2xvLCBy biwgZHN0aywgb2ZmLCBjdHgsIEJQRl9TSVpFKGNvZGUpKTsKKwkJCWVtaXRfYTMyX21vdl9pKGRz dF9oaSwgMCwgZHN0aywgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfQU5E IHwgQlBGX1g6Ci0JCQl1cGRhdGVfb25feHJlYWQoY3R4KTsKLQkJCWVtaXQoQVJNX0FORF9SKHJf QSwgcl9BLCByX1gpLCBjdHgpOworCQljYXNlIEJQRl9EVzoKKwkJCS8qIExvYWQgYSBkb3VibGUg d29yZCAqLworCQkJZW1pdF9sZHhfcihkc3RfbG8sIHJuLCBkc3RrLCBvZmYsIGN0eCwgQlBGX1cp OworCQkJZW1pdF9sZHhfcihkc3RfaGksIHJuLCBkc3RrLCBvZmYrNCwgY3R4LCBCUEZfVyk7CiAJ CQlicmVhazsKLQkJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LOgotCQkJaWYgKHVubGlr ZWx5KGsgPiAzMSkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZW1pdChBUk1fTFNMX0kocl9BLCByX0Es IGspLCBjdHgpOworCQl9CisJCWJyZWFrOworCS8qIFIwID0gbnRvaHgoKihzaXplICopKCgoc3Ry dWN0IHNrX2J1ZmYgKilSNiktPmRhdGEgKyBpbW0pKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX0FC UyB8IEJQRl9XOgorCWNhc2UgQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9IOgorCWNhc2UgQlBGX0xE IHwgQlBGX0FCUyB8IEJQRl9COgorCS8qIFIwID0gbnRvaHgoKihzaXplICopKCgoc3RydWN0IHNr X2J1ZmYgKilSNiktPmRhdGEgKyBzcmMgKyBpbW0pKSAqLworCWNhc2UgQlBGX0xEIHwgQlBGX0lO RCB8IEJQRl9XOgorCWNhc2UgQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9IOgorCWNhc2UgQlBGX0xE IHwgQlBGX0lORCB8IEJQRl9COgorCXsKKwkJY29uc3QgdTggcjQgPSBicGYyYTMyW0JQRl9SRUdf Nl1bMV07IC8qIHI0ID0gcHRyIHRvIHNrX2J1ZmYgKi8KKwkJY29uc3QgdTggcjAgPSBicGYyYTMy W0JQRl9SRUdfMF1bMV07IC8qcjA6IHN0cnVjdCBza19idWZmICpza2IqLworCQkJCQkJICAgICAv KiBydG4gdmFsdWUgKi8KKwkJY29uc3QgdTggcjEgPSBicGYyYTMyW0JQRl9SRUdfMF1bMF07IC8q IHIxOiBpbnQgayAqLworCQljb25zdCB1OCByMiA9IGJwZjJhMzJbQlBGX1JFR18xXVsxXTsgLyog cjI6IHVuc2lnbmVkIGludCBzaXplICovCisJCWNvbnN0IHU4IHIzID0gYnBmMmEzMltCUEZfUkVH XzFdWzBdOyAvKiByMzogdm9pZCAqYnVmZmVyICovCisJCWNvbnN0IHU4IHI2ID0gYnBmMmEzMltU TVBfUkVHXzFdWzFdOyAvKiByNjogdm9pZCAqKCpmdW5jKSguLikgKi8KKwkJaW50IHNpemU7CisK KwkJLyogU2V0dGluZyB1cCBmaXJzdCBhcmd1bWVudCAqLworCQllbWl0KEFSTV9NT1ZfUihyMCwg cjQpLCBjdHgpOworCisJCS8qIFNldHRpbmcgdXAgc2Vjb25kIGFyZ3VtZW50ICovCisJCWVtaXRf YTMyX21vdl9pKHIxLCBpbW0sIGZhbHNlLCBjdHgpOworCQlpZiAoQlBGX01PREUoY29kZSkgPT0g QlBGX0lORCkKKwkJCWVtaXRfYTMyX2FsdV9yKHIxLCBzcmNfbG8sIGZhbHNlLCBzc3RrLCBjdHgs CisJCQkJICAgICAgIGZhbHNlLCBmYWxzZSwgQlBGX0FERCk7CisKKwkJLyogU2V0dGluZyB1cCB0 aGlyZCBhcmd1bWVudCAqLworCQlzd2l0Y2ggKEJQRl9TSVpFKGNvZGUpKSB7CisJCWNhc2UgQlBG X1c6CisJCQlzaXplID0gNDsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9BTFUgfCBCUEZfTFNIIHwg QlBGX1g6Ci0JCQl1cGRhdGVfb25feHJlYWQoY3R4KTsKLQkJCWVtaXQoQVJNX0xTTF9SKHJfQSwg cl9BLCByX1gpLCBjdHgpOworCQljYXNlIEJQRl9IOgorCQkJc2l6ZSA9IDI7CiAJCQlicmVhazsK LQkJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LOgotCQkJaWYgKHVubGlrZWx5KGsgPiAz MSkpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKGspCi0JCQkJZW1pdChBUk1fTFNSX0kocl9BLCBy X0EsIGspLCBjdHgpOworCQljYXNlIEJQRl9COgorCQkJc2l6ZSA9IDE7CiAJCQlicmVhazsKLQkJ Y2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9YOgotCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7 Ci0JCQllbWl0KEFSTV9MU1JfUihyX0EsIHJfQSwgcl9YKSwgY3R4KTsKKwkJZGVmYXVsdDoKKwkJ CXJldHVybiAtRUlOVkFMOworCQl9CisJCWVtaXRfYTMyX21vdl9pKHIyLCBzaXplLCBmYWxzZSwg Y3R4KTsKKworCQkvKiBTZXR0aW5nIHVwIGZvdXJ0aCBhcmd1bWVudCAqLworCQllbWl0KEFSTV9B RERfSShyMywgQVJNX1NQLCBpbW04bShTS0JfQlVGRkVSKSksIGN0eCk7CisKKwkJLyogU2V0dGlu ZyB1cCBmdW5jdGlvbiBwb2ludGVyIHRvIGNhbGwgKi8KKwkJZW1pdF9hMzJfbW92X2kocjYsICh1 bnNpZ25lZCBpbnQpYnBmX2xvYWRfcG9pbnRlciwgZmFsc2UsIGN0eCk7CisJCWVtaXRfYmx4X3Io cjYsIGN0eCk7CisKKwkJZW1pdChBUk1fRU9SX1IocjEsIHIxLCByMSksIGN0eCk7CisJCS8qIENo ZWNrIGlmIHJldHVybiBhZGRyZXNzIGlzIE5VTEwgb3Igbm90LgorCQkgKiBpZiBOVUxMIHRoZW4g anVtcCB0byBlcGlsb2d1ZQorCQkgKiBlbHNlIGNvbnRpbnVlIHRvIGxvYWQgdGhlIHZhbHVlIGZy b20gcmV0biBhZGRyZXNzCisJCSAqLworCQllbWl0KEFSTV9DTVBfSShyMCwgMCksIGN0eCk7CisJ CWptcF9vZmZzZXQgPSBlcGlsb2d1ZV9vZmZzZXQoY3R4KTsKKwkJY2hlY2tfaW1tMjQoam1wX29m ZnNldCk7CisJCV9lbWl0KEFSTV9DT05EX0VRLCBBUk1fQihqbXBfb2Zmc2V0KSwgY3R4KTsKKwor CQkvKiBMb2FkIHZhbHVlIGZyb20gdGhlIGFkZHJlc3MgKi8KKwkJc3dpdGNoIChCUEZfU0laRShj b2RlKSkgeworCQljYXNlIEJQRl9XOgorCQkJZW1pdChBUk1fTERSX0kocjAsIHIwLCAwKSwgY3R4 KTsKKwkJCWVtaXRfcmV2MzIocjAsIHIwLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FM VSB8IEJQRl9ORUc6Ci0JCQkvKiBBID0gLUEgKi8KLQkJCWVtaXQoQVJNX1JTQl9JKHJfQSwgcl9B LCAwKSwgY3R4KTsKKwkJY2FzZSBCUEZfSDoKKwkJCWVtaXQoQVJNX0xEUkhfSShyMCwgcjAsIDAp LCBjdHgpOworCQkJZW1pdF9yZXYxNihyMCwgcjAsIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBC UEZfSk1QIHwgQlBGX0pBOgotCQkJLyogcGMgKz0gSyAqLwotCQkJZW1pdChBUk1fQihiX2ltbShp ICsgayArIDEsIGN0eCkpLCBjdHgpOworCQljYXNlIEJQRl9COgorCQkJZW1pdChBUk1fTERSQl9J KHIwLCByMCwgMCksIGN0eCk7CisJCQkvKiBObyBuZWVkIHRvIHJldmVyc2UgKi8KIAkJCWJyZWFr OwotCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6Ci0JCQkvKiBwYyArPSAoQSA9PSBL KSA/IHBjLT5qdCA6IHBjLT5qZiAqLwotCQkJY29uZHQgID0gQVJNX0NPTkRfRVE7Ci0JCQlnb3Rv IGNtcF9pbW07Ci0JCWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSzoKLQkJCS8qIHBjICs9 IChBID4gSykgPyBwYy0+anQgOiBwYy0+amYgKi8KLQkJCWNvbmR0ICA9IEFSTV9DT05EX0hJOwot CQkJZ290byBjbXBfaW1tOwotCQljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0s6Ci0JCQkv KiBwYyArPSAoQSA+PSBLKSA/IHBjLT5qdCA6IHBjLT5qZiAqLwotCQkJY29uZHQgID0gQVJNX0NP TkRfSFM7Ci1jbXBfaW1tOgotCQkJaW1tMTIgPSBpbW04bShrKTsKLQkJCWlmIChpbW0xMiA8IDAp IHsKLQkJCQllbWl0X21vdl9pX25vOG0ocl9zY3JhdGNoLCBrLCBjdHgpOwotCQkJCWVtaXQoQVJN X0NNUF9SKHJfQSwgcl9zY3JhdGNoKSwgY3R4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZW1pdChBUk1f Q01QX0kocl9BLCBpbW0xMiksIGN0eCk7Ci0JCQl9Ci1jb25kX2p1bXA6Ci0JCQlpZiAoaW5zdC0+ anQpCi0JCQkJX2VtaXQoY29uZHQsIEFSTV9CKGJfaW1tKGkgKyBpbnN0LT5qdCArIDEsCi0JCQkJ CQkgICBjdHgpKSwgY3R4KTsKLQkJCWlmIChpbnN0LT5qZikKLQkJCQlfZW1pdChjb25kdCBeIDEs IEFSTV9CKGJfaW1tKGkgKyBpbnN0LT5qZiArIDEsCi0JCQkJCQkJICAgICBjdHgpKSwgY3R4KTsK KwkJfQorCQlicmVhazsKKwl9CisJLyogU1Q6ICooc2l6ZSAqKShkc3QgKyBvZmYpID0gaW1tICov CisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX1c6CisJY2FzZSBCUEZfU1QgfCBCUEZfTUVN IHwgQlBGX0g6CisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0I6CisJY2FzZSBCUEZfU1Qg fCBCUEZfTUVNIHwgQlBGX0RXOgorCQlzd2l0Y2ggKEJQRl9TSVpFKGNvZGUpKSB7CisJCWNhc2Ug QlBGX0RXOgorCQkJLyogU2lnbi1leHRlbmQgaW1tZWRpYXRlIHZhbHVlIGludG8gdGVtcCByZWcg Ki8KKwkJCWVtaXRfYTMyX21vdl9pNjQodHJ1ZSwgdG1wMiwgaW1tLCBmYWxzZSwgY3R4KTsKKwkJ CWVtaXRfc3RyX3IoZHN0X2xvLCB0bXAyWzFdLCBkc3RrLCBvZmYsIGN0eCwgQlBGX1cpOworCQkJ ZW1pdF9zdHJfcihkc3RfbG8sIHRtcDJbMF0sIGRzdGssIG9mZis0LCBjdHgsIEJQRl9XKTsKIAkJ CWJyZWFrOwotCQljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1g6Ci0JCQkvKiBwYyArPSAo QSA9PSBYKSA/IHBjLT5qdCA6IHBjLT5qZiAqLwotCQkJY29uZHQgICA9IEFSTV9DT05EX0VROwot CQkJZ290byBjbXBfeDsKLQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgotCQkJLyog cGMgKz0gKEEgPiBYKSA/IHBjLT5qdCA6IHBjLT5qZiAqLwotCQkJY29uZHQgICA9IEFSTV9DT05E X0hJOwotCQkJZ290byBjbXBfeDsKLQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YOgot CQkJLyogcGMgKz0gKEEgPj0gWCkgPyBwYy0+anQgOiBwYy0+amYgKi8KLQkJCWNvbmR0ICAgPSBB Uk1fQ09ORF9DUzsKLWNtcF94OgotCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7Ci0JCQllbWl0KEFS TV9DTVBfUihyX0EsIHJfWCksIGN0eCk7Ci0JCQlnb3RvIGNvbmRfanVtcDsKLQkJY2FzZSBCUEZf Sk1QIHwgQlBGX0pTRVQgfCBCUEZfSzoKLQkJCS8qIHBjICs9IChBICYgSykgPyBwYy0+anQgOiBw Yy0+amYgKi8KLQkJCWNvbmR0ICA9IEFSTV9DT05EX05FOwotCQkJLyogbm90IHNldCBpZmYgYWxs IHplcm9lcyBpZmYgWj09MSBpZmYgRVEgKi8KLQotCQkJaW1tMTIgPSBpbW04bShrKTsKLQkJCWlm IChpbW0xMiA8IDApIHsKLQkJCQllbWl0X21vdl9pX25vOG0ocl9zY3JhdGNoLCBrLCBjdHgpOwot CQkJCWVtaXQoQVJNX1RTVF9SKHJfQSwgcl9zY3JhdGNoKSwgY3R4KTsKLQkJCX0gZWxzZSB7Ci0J CQkJZW1pdChBUk1fVFNUX0kocl9BLCBpbW0xMiksIGN0eCk7Ci0JCQl9Ci0JCQlnb3RvIGNvbmRf anVtcDsKLQkJY2FzZSBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWDoKLQkJCS8qIHBjICs9IChB ICYgWCkgPyBwYy0+anQgOiBwYy0+amYgKi8KLQkJCXVwZGF0ZV9vbl94cmVhZChjdHgpOwotCQkJ Y29uZHQgID0gQVJNX0NPTkRfTkU7Ci0JCQllbWl0KEFSTV9UU1RfUihyX0EsIHJfWCksIGN0eCk7 Ci0JCQlnb3RvIGNvbmRfanVtcDsKLQkJY2FzZSBCUEZfUkVUIHwgQlBGX0E6Ci0JCQllbWl0KEFS TV9NT1ZfUihBUk1fUjAsIHJfQSksIGN0eCk7Ci0JCQlnb3RvIGJfZXBpbG9ndWU7Ci0JCWNhc2Ug QlBGX1JFVCB8IEJQRl9LOgotCQkJaWYgKChrID09IDApICYmIChjdHgtPnJldDBfZnBfaWR4IDwg MCkpCi0JCQkJY3R4LT5yZXQwX2ZwX2lkeCA9IGk7Ci0JCQllbWl0X21vdl9pKEFSTV9SMCwgaywg Y3R4KTsKLWJfZXBpbG9ndWU6Ci0JCQlpZiAoaSAhPSBjdHgtPnNrZi0+bGVuIC0gMSkKLQkJCQll bWl0KEFSTV9CKGJfaW1tKHByb2ctPmxlbiwgY3R4KSksIGN0eCk7CisJCWNhc2UgQlBGX1c6CisJ CWNhc2UgQlBGX0g6CisJCWNhc2UgQlBGX0I6CisJCQllbWl0X2EzMl9tb3ZfaSh0bXAyWzFdLCBp bW0sIGZhbHNlLCBjdHgpOworCQkJZW1pdF9zdHJfcihkc3RfbG8sIHRtcDJbMV0sIGRzdGssIG9m ZiwgY3R4LAorCQkJCSAgIEJQRl9TSVpFKGNvZGUpKTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9N SVNDIHwgQlBGX1RBWDoKLQkJCS8qIFggPSBBICovCi0JCQljdHgtPnNlZW4gfD0gU0VFTl9YOwot CQkJZW1pdChBUk1fTU9WX1Iocl9YLCByX0EpLCBjdHgpOworCQl9CisJCWJyZWFrOworCS8qIFNU WCBYQUREOiBsb2NrICoodTMyICopKGRzdCArIG9mZikgKz0gc3JjICovCisJY2FzZSBCUEZfU1RY IHwgQlBGX1hBREQgfCBCUEZfVzoKKwkvKiBTVFggWEFERDogbG9jayAqKHU2NCAqKShkc3QgKyBv ZmYpICs9IHNyYyAqLworCWNhc2UgQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX0RXOgorCQlnb3Rv IG5vdHlldDsKKwkvKiBTVFg6ICooc2l6ZSAqKShkc3QgKyBvZmYpID0gc3JjICovCisJY2FzZSBC UEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XOgorCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZf SDoKKwljYXNlIEJQRl9TVFggfCBCUEZfTUVNIHwgQlBGX0I6CisJY2FzZSBCUEZfU1RYIHwgQlBG X01FTSB8IEJQRl9EVzoKKwl7CisJCXU4IHN6ID0gQlBGX1NJWkUoY29kZSk7CisKKwkJcm4gPSBz c3RrID8gdG1wMlsxXSA6IHNyY19sbzsKKwkJcm0gPSBzc3RrID8gdG1wMlswXSA6IHNyY19oaTsK KwkJaWYgKCFzc3RrKQorCQkJZ290byBkb19zdG9yZTsKKwkJc3dpdGNoIChCUEZfU0laRShjb2Rl KSkgeworCQljYXNlIEJQRl9XOgorCQkJZW1pdChBUk1fTERSX0kocm4sIEFSTV9TUCwgU1RBQ0tf VkFSKHNyY19sbykpLCBjdHgpOworCQkJZ290byBlbXB0eV9oaTsKKwkJY2FzZSBCUEZfSDoKKwkJ CWVtaXQoQVJNX0xEUkhfSShybiwgQVJNX1NQLCBTVEFDS19WQVIoc3JjX2xvKSksIGN0eCk7CisJ CQlnb3RvIGVtcHR5X2hpOworCQljYXNlIEJQRl9COgorCQkJZW1pdChBUk1fTERSQl9JKHJuLCBB Uk1fU1AsIFNUQUNLX1ZBUihzcmNfbG8pKSwgY3R4KTsKKwkJCWdvdG8gZW1wdHlfaGk7CitlbXB0 eV9oaToKKwkJCWVtaXQoQVJNX0VPUl9SKHJtLCBybSwgcm0pLCBjdHgpOworCQljYXNlIEJQRl9E VzoKKwkJCWVtaXQoQVJNX0xEUl9JKHJuLCBBUk1fU1AsIFNUQUNLX1ZBUihzcmNfbG8pKSwgY3R4 KTsKKwkJCWVtaXQoQVJNX0xEUl9JKHJtLCBBUk1fU1AsIFNUQUNLX1ZBUihzcmNfaGkpKSwgY3R4 KTsKKwkJCXN6ID0gQlBGX1c7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfTUlTQyB8IEJQRl9UWEE6 Ci0JCQkvKiBBID0gWCAqLwotCQkJdXBkYXRlX29uX3hyZWFkKGN0eCk7Ci0JCQllbWl0KEFSTV9N T1ZfUihyX0EsIHJfWCksIGN0eCk7CisJCX0KKworZG9fc3RvcmU6CisJCS8qIENsZWFyIGhpZ2hl ciB3b3JkIGV4Y2VwdCBmb3IgQlBGX0RXICovCisJCWlmIChCUEZfU0laRShjb2RlKSAhPSBCUEZf RFcpCisJCQllbWl0KEFSTV9FT1JfUihybSwgcm0sIHJtKSwgY3R4KTsKKworCQkvKiBTdG9yZSB0 aGUgdmFsdWUgKi8KKwkJZW1pdF9zdHJfcihkc3RfbG8sIHJuLCBkc3RrLCBvZmYsIGN0eCwgc3op OworCQllbWl0X3N0cl9yKGRzdF9sbywgcm0sIGRzdGssIG9mZis0LCBjdHgsIEJQRl9XKTsKKwkJ YnJlYWs7CisJfQorCS8qIFBDICs9IG9mZiBpZiBkc3QgPT0gc3JjICovCisJLyogUEMgKz0gb2Zm IGlmIGRzdCA+IHNyYyAqLworCS8qIFBDICs9IG9mZiBpZiBkc3QgPj0gc3JjICovCisJLyogUEMg Kz0gb2ZmIGlmIGRzdCAhPSBzcmMgKi8KKwkvKiBQQyArPSBvZmYgaWYgZHN0ID4gc3JjIChzaWdu ZWQpICovCisJLyogUEMgKz0gb2ZmIGlmIGRzdCA+PSBzcmMgKHNpZ25lZCkgKi8KKwkvKiBQQyAr PSBvZmYgaWYgZHN0ICYgc3JjICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YOgor CWNhc2UgQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdF IHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9YOgorCWNhc2UgQlBGX0pN UCB8IEJQRl9KU0dUIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR0UgfCBCUEZfWDoK KwljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9YOgorCQkvKiBTZXR1cCBzb3VyY2UgcmVn aXN0ZXJzICovCisJCXJtID0gc3N0ayA/IHRtcDJbMF0gOiBzcmNfaGk7CisJCXJuID0gc3N0ayA/ IHRtcDJbMV0gOiBzcmNfbG87CisJCWlmIChzc3RrKSB7CisJCQllbWl0KEFSTV9MRFJfSShybiwg QVJNX1NQLCBTVEFDS19WQVIoc3JjX2xvKSksIGN0eCk7CisJCQllbWl0KEFSTV9MRFJfSShybSwg QVJNX1NQLCBTVEFDS19WQVIoc3JjX2hpKSksIGN0eCk7CisJCX0KKwkJZ290byBnb19qbXA7CisJ LyogUEMgKz0gb2ZmIGlmIGRzdCA9PSBpbW0gKi8KKwkvKiBQQyArPSBvZmYgaWYgZHN0ID4gaW1t ICovCisJLyogUEMgKz0gb2ZmIGlmIGRzdCA+PSBpbW0gKi8KKwkvKiBQQyArPSBvZmYgaWYgZHN0 ICE9IGltbSAqLworCS8qIFBDICs9IG9mZiBpZiBkc3QgPiBpbW0gKHNpZ25lZCkgKi8KKwkvKiBQ QyArPSBvZmYgaWYgZHN0ID49IGltbSAoc2lnbmVkKSAqLworCS8qIFBDICs9IG9mZiBpZiBkc3Qg JiBpbW0gKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6CisJY2FzZSBCUEZfSk1Q IHwgQlBGX0pHVCB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSzoKKwlj YXNlIEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0s6CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR1Qg fCBCUEZfSzoKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNHRSB8IEJQRl9LOgorCWNhc2UgQlBGX0pN UCB8IEJQRl9KU0VUIHwgQlBGX0s6CisJCWlmIChvZmYgPT0gMCkKIAkJCWJyZWFrOwotCQljYXNl IEJQRl9BTkMgfCBTS0ZfQURfUFJPVE9DT0w6Ci0JCQkvKiBBID0gbnRvaHMoc2tiLT5wcm90b2Nv bCkgKi8KLQkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKLQkJCUJVSUxEX0JVR19PTihGSUVMRF9T SVpFT0Yoc3RydWN0IHNrX2J1ZmYsCi0JCQkJCQkgIHByb3RvY29sKSAhPSAyKTsKLQkJCW9mZiA9 IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBwcm90b2NvbCk7Ci0JCQllbWl0KEFSTV9MRFJIX0ko cl9zY3JhdGNoLCByX3NrYiwgb2ZmKSwgY3R4KTsKLQkJCWVtaXRfc3dhcDE2KHJfQSwgcl9zY3Jh dGNoLCBjdHgpOworCQlybSA9IHRtcDJbMF07CisJCXJuID0gdG1wMlsxXTsKKwkJLyogU2lnbi1l eHRlbmQgaW1tZWRpYXRlIHZhbHVlICovCisJCWVtaXRfYTMyX21vdl9pNjQodHJ1ZSwgdG1wMiwg aW1tLCBmYWxzZSwgY3R4KTsKK2dvX2ptcDoKKwkJLyogU2V0dXAgZGVzdGluYXRpb24gcmVnaXN0 ZXIgKi8KKwkJcmQgPSBkc3RrID8gdG1wWzBdIDogZHN0X2hpOworCQlydCA9IGRzdGsgPyB0bXBb MV0gOiBkc3RfbG87CisJCWlmIChkc3RrKSB7CisJCQllbWl0KEFSTV9MRFJfSShydCwgQVJNX1NQ LCBTVEFDS19WQVIoZHN0X2xvKSksIGN0eCk7CisJCQllbWl0KEFSTV9MRFJfSShyZCwgQVJNX1NQ LCBTVEFDS19WQVIoZHN0X2hpKSksIGN0eCk7CisJCX0KKworCQkvKiBDaGVjayBmb3IgdGhlIGNv bmRpdGlvbiAqLworCQllbWl0X2FyX3IocmQsIHJ0LCBybSwgcm4sIGN0eCwgQlBGX09QKGNvZGUp KTsKKworCQkvKiBTZXR1cCBKVU1QIGluc3RydWN0aW9uICovCisJCWptcF9vZmZzZXQgPSBicGYy YTMyX29mZnNldChpK29mZiwgaSwgY3R4KTsKKwkJc3dpdGNoIChCUEZfT1AoY29kZSkpIHsKKwkJ Y2FzZSBCUEZfSk5FOgorCQljYXNlIEJQRl9KU0VUOgorCQkJX2VtaXQoQVJNX0NPTkRfTkUsIEFS TV9CKGptcF9vZmZzZXQpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FOQyB8IFNLRl9B RF9DUFU6Ci0JCQkvKiByX3NjcmF0Y2ggPSBjdXJyZW50X3RocmVhZF9pbmZvKCkgKi8KLQkJCU9Q X0lNTTMoQVJNX0JJQywgcl9zY3JhdGNoLCBBUk1fU1AsIFRIUkVBRF9TSVpFIC0gMSwgY3R4KTsK LQkJCS8qIEEgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSAqLwotCQkJQlVJTERfQlVHX09O KEZJRUxEX1NJWkVPRihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSkgIT0gNCk7Ci0JCQlvZmYgPSBv ZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSk7Ci0JCQllbWl0KEFSTV9MRFJfSShyX0Es IHJfc2NyYXRjaCwgb2ZmKSwgY3R4KTsKKwkJY2FzZSBCUEZfSkVROgorCQkJX2VtaXQoQVJNX0NP TkRfRVEsIEFSTV9CKGptcF9vZmZzZXQpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FO QyB8IFNLRl9BRF9JRklOREVYOgotCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfSEFUWVBFOgotCQkJ LyogQSA9IHNrYi0+ZGV2LT5pZmluZGV4ICovCi0JCQkvKiBBID0gc2tiLT5kZXYtPnR5cGUgKi8K LQkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKLQkJCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19i dWZmLCBkZXYpOwotCQkJZW1pdChBUk1fTERSX0kocl9zY3JhdGNoLCByX3NrYiwgb2ZmKSwgY3R4 KTsKLQotCQkJZW1pdChBUk1fQ01QX0kocl9zY3JhdGNoLCAwKSwgY3R4KTsKLQkJCWVtaXRfZXJy X3JldChBUk1fQ09ORF9FUSwgY3R4KTsKLQotCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihz dHJ1Y3QgbmV0X2RldmljZSwKLQkJCQkJCSAgaWZpbmRleCkgIT0gNCk7Ci0JCQlCVUlMRF9CVUdf T04oRklFTERfU0laRU9GKHN0cnVjdCBuZXRfZGV2aWNlLAotCQkJCQkJICB0eXBlKSAhPSAyKTsK LQotCQkJaWYgKGNvZGUgPT0gKEJQRl9BTkMgfCBTS0ZfQURfSUZJTkRFWCkpIHsKLQkJCQlvZmYg PSBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCk7Ci0JCQkJZW1pdChBUk1fTERS X0kocl9BLCByX3NjcmF0Y2gsIG9mZiksIGN0eCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJ ICogb2Zmc2V0IG9mIGZpZWxkICJ0eXBlIiBpbiAic3RydWN0Ci0JCQkJICogbmV0X2RldmljZSIg aXMgYWJvdmUgd2hhdCBjYW4gYmUKLQkJCQkgKiB1c2VkIGluIHRoZSBsZHJoIHJkLCBbcm4sICNp bW1dCi0JCQkJICogaW5zdHJ1Y3Rpb24sIHNvIGxvYWQgdGhlIG9mZnNldCBpbgotCQkJCSAqIGEg cmVnaXN0ZXIgYW5kIHVzZSBsZHJoIHJkLCBbcm4sIHJtXQotCQkJCSAqLwotCQkJCW9mZiA9IG9m ZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlLCB0eXBlKTsKLQkJCQllbWl0X21vdl9pKEFSTV9SMywg b2ZmLCBjdHgpOwotCQkJCWVtaXQoQVJNX0xEUkhfUihyX0EsIHJfc2NyYXRjaCwgQVJNX1IzKSwg Y3R4KTsKLQkJCX0KKwkJY2FzZSBCUEZfSkdUOgorCQkJX2VtaXQoQVJNX0NPTkRfSEksIEFSTV9C KGptcF9vZmZzZXQpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9N QVJLOgotCQkJY3R4LT5zZWVuIHw9IFNFRU5fU0tCOwotCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJ WkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykgIT0gNCk7Ci0JCQlvZmYgPSBvZmZzZXRvZihzdHJ1 Y3Qgc2tfYnVmZiwgbWFyayk7Ci0JCQllbWl0KEFSTV9MRFJfSShyX0EsIHJfc2tiLCBvZmYpLCBj dHgpOworCQljYXNlIEJQRl9KR0U6CisJCQlfZW1pdChBUk1fQ09ORF9DUywgQVJNX0Ioam1wX29m ZnNldCksIGN0eCk7CiAJCQlicmVhazsKLQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1JYSEFTSDoK LQkJCWN0eC0+c2VlbiB8PSBTRUVOX1NLQjsKLQkJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yo c3RydWN0IHNrX2J1ZmYsIGhhc2gpICE9IDQpOwotCQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHNr X2J1ZmYsIGhhc2gpOwotCQkJZW1pdChBUk1fTERSX0kocl9BLCByX3NrYiwgb2ZmKSwgY3R4KTsK KwkJY2FzZSBCUEZfSlNHVDoKKwkJCV9lbWl0KEFSTV9DT05EX0xULCBBUk1fQihqbXBfb2Zmc2V0 KSwgY3R4KTsKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfVkxBTl9UQUc6Ci0J CWNhc2UgQlBGX0FOQyB8IFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UOgotCQkJY3R4LT5zZWVuIHw9 IFNFRU5fU0tCOwotCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwg dmxhbl90Y2kpICE9IDIpOwotCQkJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5f dGNpKTsKLQkJCWVtaXQoQVJNX0xEUkhfSShyX0EsIHJfc2tiLCBvZmYpLCBjdHgpOwotCQkJaWYg KGNvZGUgPT0gKEJQRl9BTkMgfCBTS0ZfQURfVkxBTl9UQUcpKQotCQkJCU9QX0lNTTMoQVJNX0FO RCwgcl9BLCByX0EsIH5WTEFOX1RBR19QUkVTRU5ULCBjdHgpOwotCQkJZWxzZSB7Ci0JCQkJT1Bf SU1NMyhBUk1fTFNSLCByX0EsIHJfQSwgMTIsIGN0eCk7Ci0JCQkJT1BfSU1NMyhBUk1fQU5ELCBy X0EsIHJfQSwgMHgxLCBjdHgpOwotCQkJfQorCQljYXNlIEJQRl9KU0dFOgorCQkJX2VtaXQoQVJN X0NPTkRfR0UsIEFSTV9CKGptcF9vZmZzZXQpLCBjdHgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgQlBG X0FOQyB8IFNLRl9BRF9QS1RUWVBFOgotCQkJY3R4LT5zZWVuIHw9IFNFRU5fU0tCOwotCQkJQlVJ TERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwKLQkJCQkJCSAgX19wa3RfdHlw ZV9vZmZzZXRbMF0pICE9IDEpOwotCQkJb2ZmID0gUEtUX1RZUEVfT0ZGU0VUKCk7Ci0JCQllbWl0 KEFSTV9MRFJCX0kocl9BLCByX3NrYiwgb2ZmKSwgY3R4KTsKLQkJCWVtaXQoQVJNX0FORF9JKHJf QSwgcl9BLCBQS1RfVFlQRV9NQVgpLCBjdHgpOwotI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVM RAotCQkJZW1pdChBUk1fTFNSX0kocl9BLCByX0EsIDUpLCBjdHgpOwotI2VuZGlmCisJCX0KKwkJ YnJlYWs7CisJLyogSk1QIE9GRiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKKwl7CisJCWlm IChvZmYgPT0gMCkKIAkJCWJyZWFrOwotCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfUVVFVUU6Ci0J CQljdHgtPnNlZW4gfD0gU0VFTl9TS0I7Ci0JCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0 cnVjdCBza19idWZmLAotCQkJCQkJICBxdWV1ZV9tYXBwaW5nKSAhPSAyKTsKLQkJCUJVSUxEX0JV R19PTihvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwKLQkJCQkJICAgICAgcXVldWVfbWFwcGluZykg PiAweGZmKTsKLQkJCW9mZiA9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5n KTsKLQkJCWVtaXQoQVJNX0xEUkhfSShyX0EsIHJfc2tiLCBvZmYpLCBjdHgpOworCQlqbXBfb2Zm c2V0ID0gYnBmMmEzMl9vZmZzZXQoaStvZmYsIGksIGN0eCk7CisJCWNoZWNrX2ltbTI0KGptcF9v ZmZzZXQpOworCQllbWl0KEFSTV9CKGptcF9vZmZzZXQpLCBjdHgpOworCQlicmVhazsKKwl9CisJ LyogdGFpbCBjYWxsICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0NBTEwgfCBCUEZfWDoKKwkJaWYg KGVtaXRfYnBmX3RhaWxfY2FsbChjdHgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOwor CS8qIGZ1bmN0aW9uIGNhbGwgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfQ0FMTDoKKwl7CisJCWNv bnN0IHU4ICpyMCA9IGJwZjJhMzJbQlBGX1JFR18wXTsKKwkJY29uc3QgdTggKnIxID0gYnBmMmEz MltCUEZfUkVHXzFdOworCQljb25zdCB1OCAqcjIgPSBicGYyYTMyW0JQRl9SRUdfMl07CisJCWNv bnN0IHU4ICpyMyA9IGJwZjJhMzJbQlBGX1JFR18zXTsKKwkJY29uc3QgdTggKnI0ID0gYnBmMmEz MltCUEZfUkVHXzRdOworCQljb25zdCB1OCAqcjUgPSBicGYyYTMyW0JQRl9SRUdfNV07CisJCWNv bnN0IHUzMiBmdW5jID0gKHUzMilfX2JwZl9jYWxsX2Jhc2UgKyBpbW07CisKKwkJZW1pdF9hMzJf bW92X3I2NCh0cnVlLCByMCwgcjEsIGZhbHNlLCBmYWxzZSwgY3R4KTsKKwkJZW1pdF9hMzJfbW92 X3I2NCh0cnVlLCByMSwgcjIsIGZhbHNlLCB0cnVlLCBjdHgpOworCQllbWl0X3B1c2hfcjY0KHI1 LCAwLCBjdHgpOworCQllbWl0X3B1c2hfcjY0KHI0LCA4LCBjdHgpOworCQllbWl0X3B1c2hfcjY0 KHIzLCAxNiwgY3R4KTsKKworCQllbWl0X2EzMl9tb3ZfaSh0bXBbMV0sIGZ1bmMsIGZhbHNlLCBj dHgpOworCQllbWl0X2JseF9yKHRtcFsxXSwgY3R4KTsKKworCQllbWl0KEFSTV9BRERfSShBUk1f U1AsIEFSTV9TUCwgaW1tOG0oMjQpKSwgY3R4KTsgLy8gY2FsbGVlIGNsZWFuCisJCWJyZWFrOwor CX0KKwkvKiBmdW5jdGlvbiByZXR1cm4gKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfRVhJVDoKKwkJ LyogT3B0aW1pemF0aW9uOiB3aGVuIGxhc3QgaW5zdHJ1Y3Rpb24gaXMgRVhJVAorCQkgKiBzaW1w bHkgZmFsbHRocm91Z2ggdG8gZXBpbG9ndWUuCisJCSAqLworCQlpZiAoaSA9PSBjdHgtPnByb2ct PmxlbiAtIDEpCiAJCQlicmVhazsKLQkJY2FzZSBCUEZfQU5DIHwgU0tGX0FEX1BBWV9PRkZTRVQ6 Ci0JCQljdHgtPnNlZW4gfD0gU0VFTl9TS0IgfCBTRUVOX0NBTEw7CisJCWptcF9vZmZzZXQgPSBl cGlsb2d1ZV9vZmZzZXQoY3R4KTsKKwkJY2hlY2tfaW1tMjQoam1wX29mZnNldCk7CisJCWVtaXQo QVJNX0Ioam1wX29mZnNldCksIGN0eCk7CisJCWJyZWFrOworbm90eWV0OgorCQlwcl9pbmZvX29u Y2UoIioqKiBOT1QgWUVUOiBvcGNvZGUgJTAyeCAqKipcbiIsIGNvZGUpOworCQlyZXR1cm4gLUVG QVVMVDsKKwlkZWZhdWx0OgorCQlwcl9lcnJfb25jZSgidW5rbm93biBvcGNvZGUgJTAyeFxuIiwg Y29kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCQkJZW1pdChBUk1fTU9WX1IoQVJNX1Iw LCByX3NrYiksIGN0eCk7Ci0JCQllbWl0X21vdl9pKEFSTV9SMywgKHVuc2lnbmVkIGludClza2Jf Z2V0X3BvZmYsIGN0eCk7Ci0JCQllbWl0X2JseF9yKEFSTV9SMywgY3R4KTsKLQkJCWVtaXQoQVJN X01PVl9SKHJfQSwgQVJNX1IwKSwgY3R4KTsKLQkJCWJyZWFrOwotCQljYXNlIEJQRl9MRFggfCBC UEZfVyB8IEJQRl9BQlM6Ci0JCQkvKgotCQkJICogbG9hZCBhIDMyYml0IHdvcmQgZnJvbSBzdHJ1 Y3Qgc2VjY29tcF9kYXRhLgotCQkJICogc2VjY29tcF9jaGVja19maWx0ZXIoKSB3aWxsIGFscmVh ZHkgaGF2ZSBjaGVja2VkCi0JCQkgKiB0aGF0IGsgaXMgMzJiaXQgYWxpZ25lZCBhbmQgbGllcyB3 aXRoaW4gdGhlCi0JCQkgKiBzdHJ1Y3Qgc2VjY29tcF9kYXRhLgotCQkJICovCi0JCQljdHgtPnNl ZW4gfD0gU0VFTl9TS0I7Ci0JCQllbWl0KEFSTV9MRFJfSShyX0EsIHJfc2tiLCBrKSwgY3R4KTsK LQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOworCWlmIChjdHgtPmZsYWdzICYg RkxBR19JTU1fT1ZFUkZMT1cpCisJCS8qCisJCSAqIHRoaXMgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVk IGFuIG92ZXJmbG93IHdoZW4KKwkJICogdHJ5aW5nIHRvIGFjY2VzcyB0aGUgbGl0ZXJhbCBwb29s LCBzbworCQkgKiBkZWxlZ2F0ZSB0aGlzIGZpbHRlciB0byB0aGUga2VybmVsIGludGVycHJldGVy LgorCQkgKi8KKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxk X2JvZHkoc3RydWN0IGppdF9jdHggKmN0eCkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnBy b2cgPSBjdHgtPnByb2c7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJv Zy0+bGVuOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJihwcm9nLT5p bnNuc2lbaV0pOworCQlpbnQgcmV0OworCisJCXJldCA9IGJ1aWxkX2luc24oaW5zbiwgY3R4KTsK KworCQkvKiBJdCdzIHVzZWQgd2l0aCBsb2FkaW5nIHRoZSA2NCBiaXQgaW1tZWRpYXRlIHZhbHVl LiAqLworCQlpZiAocmV0ID4gMCkgeworCQkJaSsrOworCQkJaWYgKGN0eC0+dGFyZ2V0ID09IE5V TEwpCisJCQkJY3R4LT5vZmZzZXRzW2ldID0gY3R4LT5pZHg7CisJCQljb250aW51ZTsKIAkJfQog Ci0JCWlmIChjdHgtPmZsYWdzICYgRkxBR19JTU1fT1ZFUkZMT1cpCi0JCQkvKgotCQkJICogdGhp cyBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgYW4gb3ZlcmZsb3cgd2hlbgotCQkJICogdHJ5aW5nIHRv IGFjY2VzcyB0aGUgbGl0ZXJhbCBwb29sLCBzbwotCQkJICogZGVsZWdhdGUgdGhpcyBmaWx0ZXIg dG8gdGhlIGtlcm5lbCBpbnRlcnByZXRlci4KLQkJCSAqLwotCQkJcmV0dXJuIC0xOworCQlpZiAo Y3R4LT50YXJnZXQgPT0gTlVMTCkKKwkJCWN0eC0+b2Zmc2V0c1tpXSA9IGN0eC0+aWR4OworCisJ CS8qIElmIHVuc3VjY2VzZnVsbCwgcmV0dXJuIHdpdGggZXJyb3IgY29kZSAqLworCQlpZiAocmV0 KQorCQkJcmV0dXJuIHJldDsKIAl9CisJcmV0dXJuIDA7Cit9CiAKLQkvKiBjb21wdXRlIG9mZnNl dHMgb25seSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MgKi8KLQlpZiAoY3R4LT50YXJnZXQgPT0gTlVM TCkKLQkJY3R4LT5vZmZzZXRzW2ldID0gY3R4LT5pZHggKiA0Oworc3RhdGljIGludCB2YWxpZGF0 ZV9jb2RlKHN0cnVjdCBqaXRfY3R4ICpjdHgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgY3R4LT5pZHg7IGkrKykgeworCQlpZiAoY3R4LT50YXJnZXRbaV0gPT0gX19vcGNvZGVfdG9f bWVtX2FybShBUk1fSU5TVF9VREYpKQorCQkJcmV0dXJuIC0xOworCX0KIAogCXJldHVybiAwOwog fQogCit2b2lkIGJwZl9qaXRfY29tcGlsZShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJLyog Tm90aGluZyB0byBkbyBoZXJlLiBXZSBzdXBwb3J0IEludGVybmFsIEJQRi4gKi8KK30KIAotdm9p ZCBicGZfaml0X2NvbXBpbGUoc3RydWN0IGJwZl9wcm9nICpmcCkKK3N0cnVjdCBicGZfcHJvZyAq YnBmX2ludF9qaXRfY29tcGlsZShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiB7CisjaWZkZWYgX19M SVRUTEVfRU5ESUFOCisJc3RydWN0IGJwZl9wcm9nICp0bXAsICpvcmlnX3Byb2cgPSBwcm9nOwog CXN0cnVjdCBicGZfYmluYXJ5X2hlYWRlciAqaGVhZGVyOworCWJvb2wgdG1wX2JsaW5kZWQgPSBm YWxzZTsKIAlzdHJ1Y3Qgaml0X2N0eCBjdHg7Ci0JdW5zaWduZWQgdG1wX2lkeDsKLQl1bnNpZ25l ZCBhbGxvY19zaXplOwotCXU4ICp0YXJnZXRfcHRyOworCXVuc2lnbmVkIGludCB0bXBfaWR4Owor CXVuc2lnbmVkIGludCBpbWFnZV9zaXplOworCXU4ICppbWFnZV9wdHI7CiAKKwkvKiBJZiBCUEYg SklUIHdhcyBub3QgZW5hYmxlZCB0aGVuIHdlIG11c3QgZmFsbCBiYWNrIHRvCisJICogdGhlIGlu dGVycHJldGVyLgorCSAqLwogCWlmICghYnBmX2ppdF9lbmFibGUpCi0JCXJldHVybjsKKwkJcmV0 dXJuIG9yaWdfcHJvZzsKIAotCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7Ci0JY3R4LnNr ZgkJPSBmcDsKLQljdHgucmV0MF9mcF9pZHggPSAtMTsKKwkvKiBJZiBjb25zdGFudCBibGluZGlu ZyB3YXMgZW5hYmxlZCBhbmQgd2UgZmFpbGVkIGR1cmluZyBibGluZGluZworCSAqIHRoZW4gd2Ug bXVzdCBmYWxsIGJhY2sgdG8gdGhlIGludGVycHJldGVyLiBPdGhlcndpc2UsIHdlIHNhdmUKKwkg KiB0aGUgbmV3IEpJVGVkIGNvZGUuCisJICovCisJdG1wID0gYnBmX2ppdF9ibGluZF9jb25zdGFu dHMocHJvZyk7CiAKLQljdHgub2Zmc2V0cyA9IGt6YWxsb2MoNCAqIChjdHguc2tmLT5sZW4gKyAx KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGN0eC5vZmZzZXRzID09IE5VTEwpCi0JCXJldHVybjsKKwlp ZiAoSVNfRVJSKHRtcCkpCisJCXJldHVybiBvcmlnX3Byb2c7CisJaWYgKHRtcCAhPSBwcm9nKSB7 CisJCXRtcF9ibGluZGVkID0gdHJ1ZTsKKwkJcHJvZyA9IHRtcDsKKwl9CiAKLQkvKiBmYWtlIHBh c3MgdG8gZmlsbCBpbiB0aGUgY3R4LT5zZWVuICovCi0JaWYgKHVubGlrZWx5KGJ1aWxkX2JvZHko JmN0eCkpKQorCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7CisJY3R4LnByb2cgPSBwcm9n OworCisJLyogTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvZmZzZXRzW10gLCB0aGVu CisJICogd2UgbXVzdCBmYWxsIGJhY2sgdG8gdGhlIGludGVycHJldGVyCisJICovCisJY3R4Lm9m ZnNldHMgPSBrY2FsbG9jKHByb2ctPmxlbiwgc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlm IChjdHgub2Zmc2V0cyA9PSBOVUxMKSB7CisJCXByb2cgPSBvcmlnX3Byb2c7CiAJCWdvdG8gb3V0 OworCX0KKworCS8qIDEpIGZha2UgcGFzcyB0byBmaW5kIGluIHRoZSBsZW5ndGggb2YgdGhlIEpJ VGVkIGNvZGUsCisJICogdG8gY29tcHV0ZSBjdHgtPm9mZnNldHMgYW5kIG90aGVyIGNvbnRleHQg dmFyaWFibGVzCisJICogbmVlZGVkIHRvIGNvbXB1dGUgZmluYWwgSklUZWQgY29kZS4KKwkgKiBB bHNvLCBjYWxjdWxhdGUgcmFuZG9tIHN0YXJ0aW5nIHBvaW50ZXIvc3RhcnQgb2YgSklUZWQgY29k ZQorCSAqIHdoaWNoIGlzIHByZWZpeGVkIGJ5IHJhbmRvbSBudW1iZXIgb2YgZmF1bHQgaW5zdHJ1 Y3Rpb25zLgorCSAqCisJICogSWYgdGhlIGZpcnN0IHBhc3MgZmFpbHMgdGhlbiB0aGVyZSBpcyBu byBjaGFuY2Ugb2YgaXQKKwkgKiBiZWluZyBzdWNjZXNzZnVsIGluIHRoZSBzZWNvbmQgcGFzcywg c28ganVzdCBmYWxsIGJhY2sKKwkgKiB0byB0aGUgaW50ZXJwcmV0ZXIuCisJICovCisJaWYgKGJ1 aWxkX2JvZHkoJmN0eCkpIHsKKwkJcHJvZyA9IG9yaWdfcHJvZzsKKwkJZ290byBvdXRfb2ZmOwor CX0KIAogCXRtcF9pZHggPSBjdHguaWR4OwogCWJ1aWxkX3Byb2xvZ3VlKCZjdHgpOwogCWN0eC5w cm9sb2d1ZV9ieXRlcyA9IChjdHguaWR4IC0gdG1wX2lkeCkgKiA0OwogCisJY3R4LmVwaWxvZ3Vl X29mZnNldCA9IGN0eC5pZHg7CisKICNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA3CiAJdG1wX2lk eCA9IGN0eC5pZHg7CiAJYnVpbGRfZXBpbG9ndWUoJmN0eCk7CkBAIC0xMDIxLDY0ICsxODYzLDk2 IEBAIHZvaWQgYnBmX2ppdF9jb21waWxlKHN0cnVjdCBicGZfcHJvZyAqZnApCiAKIAljdHguaWR4 ICs9IGN0eC5pbW1fY291bnQ7CiAJaWYgKGN0eC5pbW1fY291bnQpIHsKLQkJY3R4LmltbXMgPSBr emFsbG9jKDQgKiBjdHguaW1tX2NvdW50LCBHRlBfS0VSTkVMKTsKLQkJaWYgKGN0eC5pbW1zID09 IE5VTEwpCi0JCQlnb3RvIG91dDsKKwkJY3R4LmltbXMgPSBrY2FsbG9jKGN0eC5pbW1fY291bnQs IHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGN0eC5pbW1zID09IE5VTEwpIHsKKwkJ CXByb2cgPSBvcmlnX3Byb2c7CisJCQlnb3RvIG91dF9vZmY7CisJCX0KIAl9CiAjZWxzZQotCS8q IHRoZXJlJ3Mgbm90aGluZyBhZnRlciB0aGUgZXBpbG9ndWUgb24gQVJNdjcgKi8KKwkvKiB0aGVy ZSdzIG5vdGhpbmcgYWJvdXQgdGhlIGVwaWxvZ3VlIG9uIEFSTXY3ICovCiAJYnVpbGRfZXBpbG9n dWUoJmN0eCk7CiAjZW5kaWYKLQlhbGxvY19zaXplID0gNCAqIGN0eC5pZHg7Ci0JaGVhZGVyID0g YnBmX2ppdF9iaW5hcnlfYWxsb2MoYWxsb2Nfc2l6ZSwgJnRhcmdldF9wdHIsCi0JCQkJICAgICAg NCwgaml0X2ZpbGxfaG9sZSk7Ci0JaWYgKGhlYWRlciA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkv KiBOb3cgd2UgY2FuIGdldCB0aGUgYWN0dWFsIGltYWdlIHNpemUgb2YgdGhlIEpJVGVkIGFybSBj b2RlLgorCSAqIEN1cnJlbnRseSwgd2UgYXJlIG5vdCBjb25zaWRlcmluZyB0aGUgVEhVTUItMiBp bnN0cnVjdGlvbnMKKwkgKiBmb3Igaml0LCBhbHRob3VnaCBpdCBjYW4gZGVjcmVhc2UgdGhlIHNp emUgb2YgdGhlIGltYWdlLgorCSAqCisJICogQXMgZWFjaCBhcm0gaW5zdHJ1Y3Rpb24gaXMgb2Yg bGVuZ3RoIDMyYml0LCB3ZSBhcmUgdHJhbnNsYXRpbmcKKwkgKiBudW1iZXIgb2YgSklUZWQgaW50 cnVjdGlvbnMgaW50byB0aGUgc2l6ZSByZXF1aXJlZCB0byBzdG9yZSB0aGVzZQorCSAqIEpJVGVk IGNvZGUuCisJICovCisJaW1hZ2Vfc2l6ZSA9IHNpemVvZih1MzIpICogY3R4LmlkeDsKKworCS8q IE5vdyB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gbWFrZSAqLworCWhlYWRl ciA9IGJwZl9qaXRfYmluYXJ5X2FsbG9jKGltYWdlX3NpemUsICZpbWFnZV9wdHIsCisJCQkJICAg ICAgc2l6ZW9mKHUzMiksIGppdF9maWxsX2hvbGUpOworCS8qIE5vdCBhYmxlIHRvIGFsbG9jYXRl IG1lbW9yeSBmb3IgdGhlIHN0cnVjdHVyZSB0aGVuCisJICogd2UgbXVzdCBmYWxsIGJhY2sgdG8g dGhlIGludGVycHJldGF0aW9uCisJICovCisJaWYgKGhlYWRlciA9PSBOVUxMKSB7CisJCXByb2cg PSBvcmlnX3Byb2c7CisJCWdvdG8gb3V0X2ltbXM7CisJfQogCi0JY3R4LnRhcmdldCA9ICh1MzIg KikgdGFyZ2V0X3B0cjsKKwkvKiAyLikgQWN0dWFsIHBhc3MgdG8gZ2VuZXJhdGUgZmluYWwgSklU IGNvZGUgKi8KKwljdHgudGFyZ2V0ID0gKHUzMiAqKSBpbWFnZV9wdHI7CiAJY3R4LmlkeCA9IDA7 CiAKIAlidWlsZF9wcm9sb2d1ZSgmY3R4KTsKKworCS8qIElmIGJ1aWxkaW5nIHRoZSBib2R5IG9m IHRoZSBKSVRlZCBjb2RlIGZhaWxzIHNvbWVob3csCisJICogd2UgZmFsbCBiYWNrIHRvIHRoZSBp bnRlcnByZXRhdGlvbi4KKwkgKi8KIAlpZiAoYnVpbGRfYm9keSgmY3R4KSA8IDApIHsKLSNpZiBf X0xJTlVYX0FSTV9BUkNIX18gPCA3Ci0JCWlmIChjdHguaW1tX2NvdW50KQotCQkJa2ZyZWUoY3R4 LmltbXMpOwotI2VuZGlmCisJCWltYWdlX3B0ciA9IE5VTEw7CiAJCWJwZl9qaXRfYmluYXJ5X2Zy ZWUoaGVhZGVyKTsKLQkJZ290byBvdXQ7CisJCXByb2cgPSBvcmlnX3Byb2c7CisJCWdvdG8gb3V0 X2ltbXM7CiAJfQogCWJ1aWxkX2VwaWxvZ3VlKCZjdHgpOwogCisJLyogMy4pIEV4dHJhIHBhc3Mg dG8gdmFsaWRhdGUgSklUZWQgQ29kZSAqLworCWlmICh2YWxpZGF0ZV9jb2RlKCZjdHgpKSB7CisJ CWltYWdlX3B0ciA9IE5VTEw7CisJCWJwZl9qaXRfYmluYXJ5X2ZyZWUoaGVhZGVyKTsKKwkJcHJv ZyA9IG9yaWdfcHJvZzsKKwkJZ290byBvdXRfaW1tczsKKwl9CiAJZmx1c2hfaWNhY2hlX3Jhbmdl KCh1MzIpaGVhZGVyLCAodTMyKShjdHgudGFyZ2V0ICsgY3R4LmlkeCkpOwogCi0jaWYgX19MSU5V WF9BUk1fQVJDSF9fIDwgNwotCWlmIChjdHguaW1tX2NvdW50KQotCQlrZnJlZShjdHguaW1tcyk7 Ci0jZW5kaWYKLQogCWlmIChicGZfaml0X2VuYWJsZSA+IDEpCiAJCS8qIHRoZXJlIGFyZSAyIHBh c3NlcyBoZXJlICovCi0JCWJwZl9qaXRfZHVtcChmcC0+bGVuLCBhbGxvY19zaXplLCAyLCBjdHgu dGFyZ2V0KTsKKwkJYnBmX2ppdF9kdW1wKHByb2ctPmxlbiwgaW1hZ2Vfc2l6ZSwgMiwgY3R4LnRh cmdldCk7CiAKIAlzZXRfbWVtb3J5X3JvKCh1bnNpZ25lZCBsb25nKWhlYWRlciwgaGVhZGVyLT5w YWdlcyk7Ci0JZnAtPmJwZl9mdW5jID0gKHZvaWQgKiljdHgudGFyZ2V0OwotCWZwLT5qaXRlZCA9 IDE7Ci1vdXQ6CisJcHJvZy0+YnBmX2Z1bmMgPSAodm9pZCAqKWN0eC50YXJnZXQ7CisJcHJvZy0+ aml0ZWQgPSAxOworb3V0X2ltbXM6CisjaWYgX19MSU5VWF9BUk1fQVJDSF9fIDwgNworCWlmIChj dHguaW1tX2NvdW50KQorCQlrZnJlZShjdHguaW1tcyk7CisjZW5kaWYKK291dF9vZmY6CiAJa2Zy ZWUoY3R4Lm9mZnNldHMpOwotCXJldHVybjsKK291dDoKKwlpZiAodG1wX2JsaW5kZWQpCisJCWJw Zl9qaXRfcHJvZ19yZWxlYXNlX290aGVyKHByb2csIHByb2cgPT0gb3JpZ19wcm9nID8KKwkJCQkJ ICAgdG1wIDogb3JpZ19wcm9nKTsKKyNlbmRpZiAvKiBfX0xJVFRMRV9FTkRJQU4gKi8KKwlyZXR1 cm4gcHJvZzsKIH0KIAotdm9pZCBicGZfaml0X2ZyZWUoc3RydWN0IGJwZl9wcm9nICpmcCkKK3Zv aWQgYnBmX2ppdF9mcmVlKHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKLQl1bnNpZ25lZCBsb25n IGFkZHIgPSAodW5zaWduZWQgbG9uZylmcC0+YnBmX2Z1bmMgJiBQQUdFX01BU0s7CisJdW5zaWdu ZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcHJvZy0+YnBmX2Z1bmMgJiBQQUdFX01BU0s7 CiAJc3RydWN0IGJwZl9iaW5hcnlfaGVhZGVyICpoZWFkZXIgPSAodm9pZCAqKWFkZHI7CiAKLQlp ZiAoIWZwLT5qaXRlZCkKKwlpZiAoIXByb2ctPmppdGVkKQogCQlnb3RvIGZyZWVfZmlsdGVyOwog CiAJc2V0X21lbW9yeV9ydyhhZGRyLCBoZWFkZXItPnBhZ2VzKTsKIAlicGZfaml0X2JpbmFyeV9m cmVlKGhlYWRlcik7CiAKIGZyZWVfZmlsdGVyOgotCWJwZl9wcm9nX3VubG9ja19mcmVlKGZwKTsK KwlicGZfcHJvZ191bmxvY2tfZnJlZShwcm9nKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL25l dC9icGZfaml0XzMyLmggYi9hcmNoL2FybS9uZXQvYnBmX2ppdF8zMi5oCmluZGV4IGM0NmZjYTIu LmQ1Y2Y1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL25ldC9icGZfaml0XzMyLmgKKysrIGIvYXJj aC9hcm0vbmV0L2JwZl9qaXRfMzIuaApAQCAtMTEsNiArMTEsNyBAQAogI2lmbmRlZiBQRklMVEVS X09QQ09ERVNfQVJNX0gKICNkZWZpbmUgUEZJTFRFUl9PUENPREVTX0FSTV9ICiAKKy8qIEFSTSAz MmJpdCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQVJNX1IwCTAKICNkZWZpbmUgQVJNX1IxCTEKICNk ZWZpbmUgQVJNX1IyCTIKQEAgLTIyLDM4ICsyMyw0MyBAQAogI2RlZmluZSBBUk1fUjgJOAogI2Rl ZmluZSBBUk1fUjkJOQogI2RlZmluZSBBUk1fUjEwCTEwCi0jZGVmaW5lIEFSTV9GUAkxMQotI2Rl ZmluZSBBUk1fSVAJMTIKLSNkZWZpbmUgQVJNX1NQCTEzCi0jZGVmaW5lIEFSTV9MUgkxNAotI2Rl ZmluZSBBUk1fUEMJMTUKLQotI2RlZmluZSBBUk1fQ09ORF9FUQkJMHgwCi0jZGVmaW5lIEFSTV9D T05EX05FCQkweDEKLSNkZWZpbmUgQVJNX0NPTkRfQ1MJCTB4MgorI2RlZmluZSBBUk1fRlAJMTEJ LyogRnJhbWUgUG9pbnRlciAqLworI2RlZmluZSBBUk1fSVAJMTIJLyogSW50cmEtcHJvY2VkdXJl IHNjcmF0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJNX1NQCTEzCS8qIFN0YWNrIHBvaW50ZXI6 IGFzIGxvYWQvc3RvcmUgYmFzZSByZWcgKi8KKyNkZWZpbmUgQVJNX0xSCTE0CS8qIExpbmsgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQVJNX1BDCTE1CS8qIFByb2dyYW0gY291bnRlciAqLworCisjZGVm aW5lIEFSTV9DT05EX0VRCQkweDAJLyogPT0gKi8KKyNkZWZpbmUgQVJNX0NPTkRfTkUJCTB4MQkv KiAhPSAqLworI2RlZmluZSBBUk1fQ09ORF9DUwkJMHgyCS8qIHVuc2lnbmVkID49ICovCiAjZGVm aW5lIEFSTV9DT05EX0hTCQlBUk1fQ09ORF9DUwotI2RlZmluZSBBUk1fQ09ORF9DQwkJMHgzCisj ZGVmaW5lIEFSTV9DT05EX0NDCQkweDMJLyogdW5zaWduZWQgPCAqLwogI2RlZmluZSBBUk1fQ09O RF9MTwkJQVJNX0NPTkRfQ0MKLSNkZWZpbmUgQVJNX0NPTkRfTUkJCTB4NAotI2RlZmluZSBBUk1f Q09ORF9QTAkJMHg1Ci0jZGVmaW5lIEFSTV9DT05EX1ZTCQkweDYKLSNkZWZpbmUgQVJNX0NPTkRf VkMJCTB4NwotI2RlZmluZSBBUk1fQ09ORF9ISQkJMHg4Ci0jZGVmaW5lIEFSTV9DT05EX0xTCQkw eDkKLSNkZWZpbmUgQVJNX0NPTkRfR0UJCTB4YQotI2RlZmluZSBBUk1fQ09ORF9MVAkJMHhiCi0j ZGVmaW5lIEFSTV9DT05EX0dUCQkweGMKLSNkZWZpbmUgQVJNX0NPTkRfTEUJCTB4ZAotI2RlZmlu ZSBBUk1fQ09ORF9BTAkJMHhlCisjZGVmaW5lIEFSTV9DT05EX01JCQkweDQJLyogPCAwICovCisj ZGVmaW5lIEFSTV9DT05EX1BMCQkweDUJLyogPj0gMCAqLworI2RlZmluZSBBUk1fQ09ORF9WUwkJ MHg2CS8qIFNpZ25lZCBPdmVyZmxvdyAqLworI2RlZmluZSBBUk1fQ09ORF9WQwkJMHg3CS8qIE5v IFNpZ25lZCBPdmVyZmxvdyAqLworI2RlZmluZSBBUk1fQ09ORF9ISQkJMHg4CS8qIHVuc2lnbmVk ID4gKi8KKyNkZWZpbmUgQVJNX0NPTkRfTFMJCTB4OQkvKiB1bnNpZ25lZCA8PSAqLworI2RlZmlu ZSBBUk1fQ09ORF9HRQkJMHhhCS8qIFNpZ25lZCA+PSAqLworI2RlZmluZSBBUk1fQ09ORF9MVAkJ MHhiCS8qIFNpZ25lZCA8ICovCisjZGVmaW5lIEFSTV9DT05EX0dUCQkweGMJLyogU2lnbmVkID4g Ki8KKyNkZWZpbmUgQVJNX0NPTkRfTEUJCTB4ZAkvKiBTaWduZWQgPD0gKi8KKyNkZWZpbmUgQVJN X0NPTkRfQUwJCTB4ZQkvKiBOb25lICovCiAKIC8qIHJlZ2lzdGVyIHNoaWZ0IHR5cGVzICovCiAj ZGVmaW5lIFNSVFlQRV9MU0wJCTAKICNkZWZpbmUgU1JUWVBFX0xTUgkJMQogI2RlZmluZSBTUlRZ UEVfQVNSCQkyCiAjZGVmaW5lIFNSVFlQRV9ST1IJCTMKKyNkZWZpbmUgU1JUWVBFX0FTTAkJKFNS VFlQRV9MU0wpCiAKICNkZWZpbmUgQVJNX0lOU1RfQUREX1IJCTB4MDA4MDAwMDAKKyNkZWZpbmUg QVJNX0lOU1RfQUREU19SCQkweDAwOTAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX0FEQ19SCQkweDAw YTAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX0FEQ19JCQkweDAyYTAwMDAwCiAjZGVmaW5lIEFSTV9J TlNUX0FERF9JCQkweDAyODAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX0FERFNfSQkJMHgwMjkwMDAw MAogCiAjZGVmaW5lIEFSTV9JTlNUX0FORF9SCQkweDAwMDAwMDAwCiAjZGVmaW5lIEFSTV9JTlNU X0FORF9JCQkweDAyMDAwMDAwCkBAIC03Niw4ICs4MiwxMCBAQAogI2RlZmluZSBBUk1fSU5TVF9M RFJIX0kJCTB4MDFkMDAwYjAKICNkZWZpbmUgQVJNX0lOU1RfTERSSF9SCQkweDAxOTAwMGIwCiAj ZGVmaW5lIEFSTV9JTlNUX0xEUl9JCQkweDA1OTAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX0xEUl9S CQkweDA3OTAwMDAwCiAKICNkZWZpbmUgQVJNX0lOU1RfTERNCQkweDA4OTAwMDAwCisjZGVmaW5l IEFSTV9JTlNUX0xETV9JQQkJMHgwOGIwMDAwMAogCiAjZGVmaW5lIEFSTV9JTlNUX0xTTF9JCQkw eDAxYTAwMDAwCiAjZGVmaW5lIEFSTV9JTlNUX0xTTF9SCQkweDAxYTAwMDEwCkBAIC04Niw2ICs5 NCw3IEBACiAjZGVmaW5lIEFSTV9JTlNUX0xTUl9SCQkweDAxYTAwMDMwCiAKICNkZWZpbmUgQVJN X0lOU1RfTU9WX1IJCTB4MDFhMDAwMDAKKyNkZWZpbmUgQVJNX0lOU1RfTU9WU19SCQkweDAxYjAw MDAwCiAjZGVmaW5lIEFSTV9JTlNUX01PVl9JCQkweDAzYTAwMDAwCiAjZGVmaW5lIEFSTV9JTlNU X01PVlcJCTB4MDMwMDAwMDAKICNkZWZpbmUgQVJNX0lOU1RfTU9WVAkJMHgwMzQwMDAwMApAQCAt OTYsMTcgKzEwNSwyOCBAQAogI2RlZmluZSBBUk1fSU5TVF9QVVNICQkweDA5MmQwMDAwCiAKICNk ZWZpbmUgQVJNX0lOU1RfT1JSX1IJCTB4MDE4MDAwMDAKKyNkZWZpbmUgQVJNX0lOU1RfT1JSU19S CQkweDAxOTAwMDAwCiAjZGVmaW5lIEFSTV9JTlNUX09SUl9JCQkweDAzODAwMDAwCiAKICNkZWZp bmUgQVJNX0lOU1RfUkVWCQkweDA2YmYwZjMwCiAjZGVmaW5lIEFSTV9JTlNUX1JFVjE2CQkweDA2 YmYwZmIwCiAKICNkZWZpbmUgQVJNX0lOU1RfUlNCX0kJCTB4MDI2MDAwMDAKKyNkZWZpbmUgQVJN X0lOU1RfUlNCU19JCQkweDAyNzAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX1JTQ19JCQkweDAyZTAw MDAwCiAKICNkZWZpbmUgQVJNX0lOU1RfU1VCX1IJCTB4MDA0MDAwMDAKKyNkZWZpbmUgQVJNX0lO U1RfU1VCU19SCQkweDAwNTAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX1JTQl9SCQkweDAwNjAwMDAw CiAjZGVmaW5lIEFSTV9JTlNUX1NVQl9JCQkweDAyNDAwMDAwCisjZGVmaW5lIEFSTV9JTlNUX1NV QlNfSQkJMHgwMjUwMDAwMAorI2RlZmluZSBBUk1fSU5TVF9TQkNfSQkJMHgwMmMwMDAwMAorI2Rl ZmluZSBBUk1fSU5TVF9TQkNfUgkJMHgwMGMwMDAwMAorI2RlZmluZSBBUk1fSU5TVF9TQkNTX1IJ CTB4MDBkMDAwMDAKIAogI2RlZmluZSBBUk1fSU5TVF9TVFJfSQkJMHgwNTgwMDAwMAorI2RlZmlu ZSBBUk1fSU5TVF9TVFJCX0kJCTB4MDVjMDAwMDAKKyNkZWZpbmUgQVJNX0lOU1RfU1RSSF9JCQkw eDAxYzAwMGIwCiAKICNkZWZpbmUgQVJNX0lOU1RfVFNUX1IJCTB4MDExMDAwMDAKICNkZWZpbmUg QVJNX0lOU1RfVFNUX0kJCTB4MDMxMDAwMDAKQEAgLTExNyw2ICsxMzcsOCBAQAogCiAjZGVmaW5l IEFSTV9JTlNUX01MUwkJMHgwMDYwMDA5MAogCisjZGVmaW5lIEFSTV9JTlNUX1VYVEgJCTB4MDZm ZjAwNzAKKwogLyoKICAqIFVzZSBhIHN1aXRhYmxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiB0byB1 c2UgZm9yIEFSTS9UaHVtYjIgZmF1bHRpbmcuCiAgKiBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgbm90 IHRvIGNvbmZsaWN0IHdpdGggdGhvc2UgdXNlZCBieSBvdGhlciBtb2R1bGVzCkBAIC0xMzUsOSAr MTU3LDE1IEBACiAjZGVmaW5lIF9BTDNfUihvcCwgcmQsIHJuLCBybSkJKChvcCAjIyBfUikgfCAo cmQpIDw8IDEyIHwgKHJuKSA8PCAxNiB8IChybSkpCiAvKiBpbW1lZGlhdGUgKi8KICNkZWZpbmUg X0FMM19JKG9wLCByZCwgcm4sIGltbSkJKChvcCAjIyBfSSkgfCAocmQpIDw8IDEyIHwgKHJuKSA8 PCAxNiB8IChpbW0pKQorLyogcmVnaXN0ZXIgd2l0aCByZWdpc3Rlci1zaGlmdCAqLworI2RlZmlu ZSBfQUwzX1NSKGluc3QpCShpbnN0IHwgKDEgPDwgNCkpCiAKICNkZWZpbmUgQVJNX0FERF9SKHJk LCBybiwgcm0pCV9BTDNfUihBUk1fSU5TVF9BREQsIHJkLCBybiwgcm0pCisjZGVmaW5lIEFSTV9B RERTX1IocmQsIHJuLCBybSkJX0FMM19SKEFSTV9JTlNUX0FERFMsIHJkLCBybiwgcm0pCiAjZGVm aW5lIEFSTV9BRERfSShyZCwgcm4sIGltbSkJX0FMM19JKEFSTV9JTlNUX0FERCwgcmQsIHJuLCBp bW0pCisjZGVmaW5lIEFSTV9BRERTX0kocmQsIHJuLCBpbW0pCV9BTDNfSShBUk1fSU5TVF9BRERT LCByZCwgcm4sIGltbSkKKyNkZWZpbmUgQVJNX0FEQ19SKHJkLCBybiwgcm0pCV9BTDNfUihBUk1f SU5TVF9BREMsIHJkLCBybiwgcm0pCisjZGVmaW5lIEFSTV9BRENfSShyZCwgcm4sIGltbSkJX0FM M19JKEFSTV9JTlNUX0FEQywgcmQsIHJuLCBpbW0pCiAKICNkZWZpbmUgQVJNX0FORF9SKHJkLCBy biwgcm0pCV9BTDNfUihBUk1fSU5TVF9BTkQsIHJkLCBybiwgcm0pCiAjZGVmaW5lIEFSTV9BTkRf SShyZCwgcm4sIGltbSkJX0FMM19JKEFSTV9JTlNUX0FORCwgcmQsIHJuLCBpbW0pCkBAIC0xNTYs NyArMTg0LDkgQEAKICNkZWZpbmUgQVJNX0VPUl9JKHJkLCBybiwgaW1tKQlfQUwzX0koQVJNX0lO U1RfRU9SLCByZCwgcm4sIGltbSkKIAogI2RlZmluZSBBUk1fTERSX0kocnQsIHJuLCBvZmYpCShB Uk1fSU5TVF9MRFJfSSB8IChydCkgPDwgMTIgfCAocm4pIDw8IDE2IFwKLQkJCQkgfCAob2ZmKSkK KwkJCQkgfCAoKG9mZikgJiAweGZmZikpCisjZGVmaW5lIEFSTV9MRFJfUihydCwgcm4sIHJtKQko QVJNX0lOU1RfTERSX1IgfCAocnQpIDw8IDEyIHwgKHJuKSA8PCAxNiBcCisJCQkJIHwgKHJtKSkK ICNkZWZpbmUgQVJNX0xEUkJfSShydCwgcm4sIG9mZikJKEFSTV9JTlNUX0xEUkJfSSB8IChydCkg PDwgMTIgfCAocm4pIDw8IDE2IFwKIAkJCQkgfCAob2ZmKSkKICNkZWZpbmUgQVJNX0xEUkJfUihy dCwgcm4sIHJtKQkoQVJNX0lOU1RfTERSQl9SIHwgKHJ0KSA8PCAxMiB8IChybikgPDwgMTYgXApA QCAtMTY3LDE1ICsxOTcsMjMgQEAKIAkJCQkgfCAocm0pKQogCiAjZGVmaW5lIEFSTV9MRE0ocm4s IHJlZ3MpCShBUk1fSU5TVF9MRE0gfCAocm4pIDw8IDE2IHwgKHJlZ3MpKQorI2RlZmluZSBBUk1f TERNX0lBKHJuLCByZWdzKQkoQVJNX0lOU1RfTERNX0lBIHwgKHJuKSA8PCAxNiB8IChyZWdzKSkK IAogI2RlZmluZSBBUk1fTFNMX1IocmQsIHJuLCBybSkJKF9BTDNfUihBUk1fSU5TVF9MU0wsIHJk LCAwLCBybikgfCAocm0pIDw8IDgpCiAjZGVmaW5lIEFSTV9MU0xfSShyZCwgcm4sIGltbSkJKF9B TDNfSShBUk1fSU5TVF9MU0wsIHJkLCAwLCBybikgfCAoaW1tKSA8PCA3KQogCiAjZGVmaW5lIEFS TV9MU1JfUihyZCwgcm4sIHJtKQkoX0FMM19SKEFSTV9JTlNUX0xTUiwgcmQsIDAsIHJuKSB8IChy bSkgPDwgOCkKICNkZWZpbmUgQVJNX0xTUl9JKHJkLCBybiwgaW1tKQkoX0FMM19JKEFSTV9JTlNU X0xTUiwgcmQsIDAsIHJuKSB8IChpbW0pIDw8IDcpCisjZGVmaW5lIEFSTV9BU1JfUihyZCwgcm4s IHJtKSAgIChfQUwzX1IoQVJNX0lOU1RfQVNSLCByZCwgMCwgcm4pIHwgKHJtKSA8PCA4KQorI2Rl ZmluZSBBUk1fQVNSX0kocmQsIHJuLCBpbW0pICAoX0FMM19JKEFSTV9JTlNUX0FTUiwgcmQsIDAs IHJuKSB8IChpbW0pIDw8IDcpCiAKICNkZWZpbmUgQVJNX01PVl9SKHJkLCBybSkJX0FMM19SKEFS TV9JTlNUX01PViwgcmQsIDAsIHJtKQorI2RlZmluZSBBUk1fTU9WU19SKHJkLCBybSkJX0FMM19S KEFSTV9JTlNUX01PVlMsIHJkLCAwLCBybSkKICNkZWZpbmUgQVJNX01PVl9JKHJkLCBpbW0pCV9B TDNfSShBUk1fSU5TVF9NT1YsIHJkLCAwLCBpbW0pCisjZGVmaW5lIEFSTV9NT1ZfU1IocmQsIHJt LCB0eXBlLCBycykJXAorCShfQUwzX1NSKEFSTV9NT1ZfUihyZCwgcm0pKSB8ICh0eXBlKSA8PCA1 IHwgKHJzKSA8PCA4KQorI2RlZmluZSBBUk1fTU9WX1NJKHJkLCBybSwgdHlwZSwgaW1tNikJXAor CShBUk1fTU9WX1IocmQsIHJtKSB8ICh0eXBlKSA8PCA1IHwgKGltbTYpIDw8IDcpCiAKICNkZWZp bmUgQVJNX01PVlcocmQsIGltbSkJXAogCShBUk1fSU5TVF9NT1ZXIHwgKChpbW0pID4+IDEyKSA8 PCAxNiB8IChyZCkgPDwgMTIgfCAoKGltbSkgJiAweDBmZmYpKQpAQCAtMTkwLDE5ICsyMjgsMzgg QEAKIAogI2RlZmluZSBBUk1fT1JSX1IocmQsIHJuLCBybSkJX0FMM19SKEFSTV9JTlNUX09SUiwg cmQsIHJuLCBybSkKICNkZWZpbmUgQVJNX09SUl9JKHJkLCBybiwgaW1tKQlfQUwzX0koQVJNX0lO U1RfT1JSLCByZCwgcm4sIGltbSkKLSNkZWZpbmUgQVJNX09SUl9TKHJkLCBybiwgcm0sIHR5cGUs IHJzKQlcCi0JKEFSTV9PUlJfUihyZCwgcm4sIHJtKSB8ICh0eXBlKSA8PCA1IHwgKHJzKSA8PCA3 KQorI2RlZmluZSBBUk1fT1JSX1NSKHJkLCBybiwgcm0sIHR5cGUsIHJzKQlcCisJKF9BTDNfU1Io QVJNX09SUl9SKHJkLCBybiwgcm0pKSB8ICh0eXBlKSA8PCA1IHwgKHJzKSA8PCA4KQorI2RlZmlu ZSBBUk1fT1JSU19SKHJkLCBybiwgcm0pCV9BTDNfUihBUk1fSU5TVF9PUlJTLCByZCwgcm4sIHJt KQorI2RlZmluZSBBUk1fT1JSU19TUihyZCwgcm4sIHJtLCB0eXBlLCBycykJXAorCShfQUwzX1NS KEFSTV9PUlJTX1IocmQsIHJuLCBybSkpIHwgKHR5cGUpIDw8IDUgfCAocnMpIDw8IDgpCisjZGVm aW5lIEFSTV9PUlJfU0kocmQsIHJuLCBybSwgdHlwZSwgaW1tNikJXAorCShBUk1fT1JSX1IocmQs IHJuLCBybSkgfCAodHlwZSkgPDwgNSB8IChpbW02KSA8PCA3KQorI2RlZmluZSBBUk1fT1JSU19T SShyZCwgcm4sIHJtLCB0eXBlLCBpbW02KQlcCisJKEFSTV9PUlJTX1IocmQsIHJuLCBybSkgfCAo dHlwZSkgPDwgNSB8IChpbW02KSA8PCA3KQogCiAjZGVmaW5lIEFSTV9SRVYocmQsIHJtKQkJKEFS TV9JTlNUX1JFViB8IChyZCkgPDwgMTIgfCAocm0pKQogI2RlZmluZSBBUk1fUkVWMTYocmQsIHJt KQkoQVJNX0lOU1RfUkVWMTYgfCAocmQpIDw8IDEyIHwgKHJtKSkKIAogI2RlZmluZSBBUk1fUlNC X0kocmQsIHJuLCBpbW0pCV9BTDNfSShBUk1fSU5TVF9SU0IsIHJkLCBybiwgaW1tKQorI2RlZmlu ZSBBUk1fUlNCU19JKHJkLCBybiwgaW1tKQlfQUwzX0koQVJNX0lOU1RfUlNCUywgcmQsIHJuLCBp bW0pCisjZGVmaW5lIEFSTV9SU0NfSShyZCwgcm4sIGltbSkJX0FMM19JKEFSTV9JTlNUX1JTQywg cmQsIHJuLCBpbW0pCiAKICNkZWZpbmUgQVJNX1NVQl9SKHJkLCBybiwgcm0pCV9BTDNfUihBUk1f SU5TVF9TVUIsIHJkLCBybiwgcm0pCisjZGVmaW5lIEFSTV9TVUJTX1IocmQsIHJuLCBybSkJX0FM M19SKEFSTV9JTlNUX1NVQlMsIHJkLCBybiwgcm0pCisjZGVmaW5lIEFSTV9SU0JfUihyZCwgcm4s IHJtKQlfQUwzX1IoQVJNX0lOU1RfUlNCLCByZCwgcm4sIHJtKQorI2RlZmluZSBBUk1fU0JDX1Io cmQsIHJuLCBybSkJX0FMM19SKEFSTV9JTlNUX1NCQywgcmQsIHJuLCBybSkKKyNkZWZpbmUgQVJN X1NCQ1NfUihyZCwgcm4sIHJtKQlfQUwzX1IoQVJNX0lOU1RfU0JDUywgcmQsIHJuLCBybSkKICNk ZWZpbmUgQVJNX1NVQl9JKHJkLCBybiwgaW1tKQlfQUwzX0koQVJNX0lOU1RfU1VCLCByZCwgcm4s IGltbSkKKyNkZWZpbmUgQVJNX1NVQlNfSShyZCwgcm4sIGltbSkJX0FMM19JKEFSTV9JTlNUX1NV QlMsIHJkLCBybiwgaW1tKQorI2RlZmluZSBBUk1fU0JDX0kocmQsIHJuLCBpbW0pCV9BTDNfSShB Uk1fSU5TVF9TQkMsIHJkLCBybiwgaW1tKQogCiAjZGVmaW5lIEFSTV9TVFJfSShydCwgcm4sIG9m ZikJKEFSTV9JTlNUX1NUUl9JIHwgKHJ0KSA8PCAxMiB8IChybikgPDwgMTYgXAotCQkJCSB8IChv ZmYpKQorCQkJCSB8ICgob2ZmKSAmIDB4ZmZmKSkKKyNkZWZpbmUgQVJNX1NUUkhfSShydCwgcm4s IG9mZikJKEFSTV9JTlNUX1NUUkhfSSB8IChydCkgPDwgMTIgfCAocm4pIDw8IDE2IFwKKwkJCQkg fCAoKChvZmYpICYgMHhmMCkgPDwgNCkgfCAoKG9mZikgJiAweGYpKQorI2RlZmluZSBBUk1fU1RS Ql9JKHJ0LCBybiwgb2ZmKQkoQVJNX0lOU1RfU1RSQl9JIHwgKHJ0KSA8PCAxMiB8IChybikgPDwg MTYgXAorCQkJCSB8ICgoKG9mZikgJiAweGYwKSA8PCA0KSB8ICgob2ZmKSAmIDB4ZikpCiAKICNk ZWZpbmUgQVJNX1RTVF9SKHJuLCBybSkJX0FMM19SKEFSTV9JTlNUX1RTVCwgMCwgcm4sIHJtKQog I2RlZmluZSBBUk1fVFNUX0kocm4sIGltbSkJX0FMM19JKEFSTV9JTlNUX1RTVCwgMCwgcm4sIGlt bSkKQEAgLTIxNCw1ICsyNzEsNiBAQAogCiAjZGVmaW5lIEFSTV9NTFMocmQsIHJuLCBybSwgcmEp CShBUk1fSU5TVF9NTFMgfCAocmQpIDw8IDE2IHwgKHJuKSB8IChybSkgPDwgOCBcCiAJCQkJIHwg KHJhKSA8PCAxMikKKyNkZWZpbmUgQVJNX1VYVEgocmQsIHJtKQkoQVJNX0lOU1RfVVhUSCB8IChy ZCkgPDwgMTIgfCAocm0pKQogCiAjZW5kaWYgLyogUEZJTFRFUl9PUENPREVTX0FSTV9IICovCi0t IAoyLjcuNAoK --001a11403d745ad7f90552a84761--