Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754760AbdLFJpn (ORCPT ); Wed, 6 Dec 2017 04:45:43 -0500 Received: from mail-he1eur01on0096.outbound.protection.outlook.com ([104.47.0.96]:35459 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754304AbdLFJpj (ORCPT ); Wed, 6 Dec 2017 04:45:39 -0500 From: "Zhang, Sean C. (NSB - CN/Hangzhou)" To: David Daney , Jan Glauber , "david.daney@cavium.com" CC: "wsa@the-dreams.de" , "linux-i2c@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: [Bug fix] octeon-i2c driver improvement [1/2] Thread-Topic: [Bug fix] octeon-i2c driver improvement [1/2] Thread-Index: AdNudda38oNkxDLkRjaXRzuSobKzdQ== Date: Wed, 6 Dec 2017 09:45:34 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [131.228.32.170] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;VI1SPR01MB327;6:n1NQenmmZW1BTvEtQ01b6ckA4aszQb4C8c+0WhlWeqHND8a6jug4/lHMOW3aNWPEk96wSasuuP+bCo09kiSwbnzO2Za2J0fXugFQJWSiU04PbrHTKSvtj6lDbPz8ZMipsdG8GzUmRnIxpdIbb5aejnRHj9HrmjSf79WJnRTNVdJ88hMe/jVd5INFx8ndvl/7/r7xO+n2ODo6VrlmR9ccknvb4PYQ3m1cthQW9wtFXLt3S7RRV16mBRKsdvNS4Ym7dEovsrSG2gA4sRRN9sF4b6LxFxUcrBu64xEEVkhz3iVxkXsD5wbvpB7HZi+vA/0LRbv6NuM6PZei25nOYZG9ETYBXX5IIXKAfAGsMg30aso=;5:ZnOseZsDNgWoKpOHDqPoGuCkBvgfVnYEB3+y6dCmV7ZkDHm3Rm3ZkUpqqH7YMf3yNbTz8w49b4wr2idzKCJTxeSazgnNjDi6S4V8q8+vtFojYXEJ9lcxed5y/mj/Wrs+8L+V+WVU3QL1aL1fuoz3AJnaacPK7tOqNwBM+IkDWAU=;24:cL0gMy8gQNAsUbSA7uEpqyFih4DAeS9EbXcUwxF2sP6GJ6F3MH9/DK0JYzIcrhXzVk71qBxf+EahpxNOvH56BVoAiPlGK0UHEcRjghQmZMA=;7:PFoTqJyoBvaXM9XIZDCKjpb7ohQtmUjeCjGME4To/GskEqR8tUw+8jmUTPFbf7tHRxIZxxUkXnAtcl/66BBveAY1RX/Dg6U46QB20p7FbuofLkE/6axWtgepGkFnR3lwWgJHotMA3eO5+/+DpKz0Hou6crVcdMtWIUti3pWn3PY5547qaHKqbZ+jNjz4ehioX/YihUf5zwNWqecWU0s09cnEuTa5h8ltAXtihyruuC6hL1QzAtE9MyHIqnyrBE+9 x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-correlation-id: 1e48cef4-8ab2-42be-777f-08d53c8e1925 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603286)(49563074);SRVR:VI1SPR01MB327; x-ms-traffictypediagnostic: VI1SPR01MB327: authentication-results: spf=none (sender IP is ) smtp.mailfrom=sean.c.zhang@nokia-sbell.com; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(102415395)(6040450)(2401047)(8121501046)(5005006)(3231022)(3002001)(93006095)(93001095)(10201501046)(6055026)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123555025)(20161123560025)(20161123564025)(6072148)(201708071742011);SRVR:VI1SPR01MB327;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:VI1SPR01MB327; x-forefront-prvs: 05134F8B4F x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(39860400002)(346002)(376002)(366004)(189003)(199004)(81156014)(81166006)(8676002)(68736007)(14454004)(86362001)(7696005)(478600001)(106356001)(105586002)(55016002)(25786009)(3846002)(6116002)(102836003)(5660300001)(9686003)(2501003)(5890100001)(110136005)(101416001)(5250100002)(97736004)(6436002)(33656002)(6506006)(54906003)(99936001)(53936002)(8936002)(2906002)(7736002)(3660700001)(2900100001)(316002)(3280700002)(305945005)(4326008)(74316002)(66066001)(99286004);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1SPR01MB327;H:VI1PR0702MB3615.eurprd07.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:0;LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/mixed; boundary="_003_VI1PR0702MB36153CFE29EF55B1EE8A05BD8E320VI1PR0702MB3615_" MIME-Version: 1.0 X-OriginatorOrg: nokia-sbell.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e48cef4-8ab2-42be-777f-08d53c8e1925 X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Dec 2017 09:45:34.6139 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1SPR01MB327 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 29872 Lines: 402 --_003_VI1PR0702MB36153CFE29EF55B1EE8A05BD8E320VI1PR0702MB3615_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgSmFuIGFuZCBEYXZpZCwNCg0KRm9yIG9jdGVvbi1pMmMgZHJpdmVyLCB0aGVyZSBvbmx5IGhh cyBidXMgcmVjb3ZlcnkgZm9yIG9jdGVvbiBUV1NJIGxvdyBsZXZlbCBjb250cm9sIG1vZGUsDQpu byByZWNvdmVyeSBmb3IgaGlnaCBsZXZlbCBjb250cm9sIG1vZGUsIGF0dGFjaGVkIHBhdGNoIGlz IHVzZWQgdG8gZXh0ZW5kIHRoZSByZWNvdmVyeSBzdGVwDQpmcm9tIG9jdGVvbl9pMmNfc3RhcnQo KSB0byBvY3Rlb25faTJjX3hmZXIoKSBmb3Igc29tZSBjYXNlIG9jdGVvbiBUV1NJIGhpZ2ggbGV2 ZWwgY29udHJvbA0KbW9kZSBnZXQgZmFpbHVyZS4NCg0KUGxlYXNlIGhhdmUgdGltZSB0byByZXZp ZXcgaXQuIFRoYW5rcy4NCg0KQlINClNlYW4gWmhhbmcNCg== --_003_VI1PR0702MB36153CFE29EF55B1EE8A05BD8E320VI1PR0702MB3615_ Content-Type: application/octet-stream; name="0001-i2c-octeon-driver-improvement.patch" Content-Description: 0001-i2c-octeon-driver-improvement.patch Content-Disposition: attachment; filename="0001-i2c-octeon-driver-improvement.patch"; size=1787; creation-date="Wed, 06 Dec 2017 09:16:38 GMT"; modification-date="Wed, 06 Dec 2017 09:16:38 GMT" Content-Transfer-Encoding: base64 RnJvbSBmODM2NmRkODZkOTdiMzA0ZjZlNjRkZGUxOTRmZGYzYjlmMDI3NDUyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBoZ3Q0NjMgPHNlYW4uYy56aGFuZ0Bub2tpYS5jb20+CkRhdGU6 IFdlZCwgNiBEZWMgMjAxNyAxNzowNTo0OCArMDgwMApTdWJqZWN0OiBbUEFUQ0hdIGkyYy1vY3Rl b24gZHJpdmVyIGltcHJvdmVtZW50OgogLSBleHRlbmQgaTJjIGJ1cyByZWNvdmVyeSBmcm9tIG9j dGVvbl9pMmNfc3RhcnQoKSB0byBvY3Rlb25faTJjX3hmZXIoKSwKICAgZm9yIHNvbWUgY2FzZSBv Y3Rlb24gVFdTSSBoaWdoIGxldmVsIGNvbnRyb2wgbWF5IGZhaWwuCgpTaWduZWQtb2ZmLWJ5OiBo Z3Q0NjMgPHNlYW4uYy56aGFuZ0Bub2tpYS5jb20+Ci0tLQogZHJpdmVycy9pMmMvYnVzc2VzL2ky Yy1vY3Rlb24tY29yZS5jIHwgICAxNyArKysrKysrKystLS0tLS0tLQogMSBmaWxlcyBjaGFuZ2Vk LCA5IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9p MmMvYnVzc2VzL2kyYy1vY3Rlb24tY29yZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rl b24tY29yZS5jCmluZGV4IDFkODc3NTcuLjRiYmFhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJj L2J1c3Nlcy9pMmMtb2N0ZW9uLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9j dGVvbi1jb3JlLmMKQEAgLTI3MSwxNyArMjcxLDEzIEBAIHN0YXRpYyBpbnQgb2N0ZW9uX2kyY19z dGFydChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQogCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywg VFdTSV9DVExfRU5BQiB8IFRXU0lfQ1RMX1NUQSk7CiAJcmV0ID0gb2N0ZW9uX2kyY193YWl0KGky Yyk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcjsKKwkJcmV0dXJuIHJldDsKIAogCXN0YXQgPSBv Y3Rlb25faTJjX3N0YXRfcmVhZChpMmMpOwogCWlmIChzdGF0ID09IFNUQVRfU1RBUlQgfHwgc3Rh dCA9PSBTVEFUX1JFUF9TVEFSVCkKIAkJLyogU1RBUlQgc3VjY2Vzc2Z1bCwgYmFpbCBvdXQgKi8K IAkJcmV0dXJuIDA7Ci0KLWVycm9yOgotCS8qIFNUQVJUIGZhaWxlZCwgdHJ5IHRvIHJlY292ZXIg Ki8KLQlyZXQgPSBvY3Rlb25faTJjX3JlY292ZXJ5KGkyYyk7Ci0JcmV0dXJuIChyZXQpID8gcmV0 IDogLUVBR0FJTjsKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyogc2VuZCBTVE9QIHRvIHRoZSBidXMg Ki8KQEAgLTYzOSw3ICs2MzUsNyBAQCBpbnQgb2N0ZW9uX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRh cHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCiAKIAkJcmV0ID0gb2N0 ZW9uX2kyY19zdGFydChpMmMpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8g b3V0OwogCiAJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEKQogCQkJcmV0ID0gb2N0ZW9uX2ky Y19yZWFkKGkyYywgcG1zZy0+YWRkciwgcG1zZy0+YnVmLApAQCAtNjUwLDcgKzY0NiwxMiBAQCBp bnQgb2N0ZW9uX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19t c2cgKm1zZ3MsIGludCBudW0pCiAJfQogCW9jdGVvbl9pMmNfc3RvcChpMmMpOwogb3V0OgotCXJl dHVybiAocmV0ICE9IDApID8gcmV0IDogbnVtOworCWlmIChyZXQgIT0gMCkgeworCQlyZXQgPSBv Y3Rlb25faTJjX3JlY292ZXJ5KGkyYyk7CisJCXJldHVybiAocmV0KSA/IHJldCA6IC1FQUdBSU47 CisJfQorCisJcmV0dXJuIG51bTsKIH0KIAogLyogY2FsY3VsYXRlIGFuZCBzZXQgY2xvY2sgZGl2 aXNvcnMgKi8KLS0gCjEuNy4xCgo= --_003_VI1PR0702MB36153CFE29EF55B1EE8A05BD8E320VI1PR0702MB3615_ Content-Type: text/plain; name="i2c-octeon-core.c" Content-Description: i2c-octeon-core.c Content-Disposition: attachment; filename="i2c-octeon-core.c"; size=19190; creation-date="Wed, 06 Dec 2017 09:16:38 GMT"; modification-date="Wed, 06 Dec 2017 09:16:38 GMT" Content-Transfer-Encoding: base64 LyoKICogKEMpIENvcHlyaWdodCAyMDA5LTIwMTAKICogTm9raWEgU2llbWVucyBOZXR3b3Jrcywg bWljaGFlbC5sYXduaWNrLmV4dEBuc24uY29tCiAqCiAqIFBvcnRpb25zIENvcHlyaWdodCAoQykg MjAxMCAtIDIwMTYgQ2F2aXVtLCBJbmMuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2hh cmVkIHBhcnQgb2YgdGhlIGRyaXZlciBmb3IgdGhlIGkyYyBhZGFwdGVyIGluCiAqIENhdml1bSBO ZXR3b3JrcycgT0NURU9OIHByb2Nlc3NvcnMgYW5kIFRodW5kZXJYIFNPQ3MuCiAqCiAqIFRoaXMg ZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YwogKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIg d2l0aG91dCBhbnkKICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBp bXBsaWVkLgogKi8KCiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvaTJj Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o PgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSAiaTJjLW9jdGVvbi1jb3JlLmgi CgovKiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCmlycXJldHVybl90IG9jdGVvbl9pMmNf aXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKewoJc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGRl dl9pZDsKCglpMmMtPmludF9kaXNhYmxlKGkyYyk7Cgl3YWtlX3VwKCZpMmMtPnF1ZXVlKTsKCgly ZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyBib29sIG9jdGVvbl9pMmNfdGVzdF9pZmxnKHN0 cnVjdCBvY3Rlb25faTJjICppMmMpCnsKCXJldHVybiAob2N0ZW9uX2kyY19jdGxfcmVhZChpMmMp ICYgVFdTSV9DVExfSUZMRyk7Cn0KCi8qKgogKiBvY3Rlb25faTJjX3dhaXQgLSB3YWl0IGZvciB0 aGUgSUZMRyB0byBiZSBzZXQKICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCiAqCiAqIFJl dHVybnMgMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJuby4KICovCnN0YXRp YyBpbnQgb2N0ZW9uX2kyY193YWl0KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCnsKCWxvbmcgdGlt ZV9sZWZ0OwoKCS8qCgkgKiBTb21lIGNoaXAgcmV2aXNpb25zIGRvbid0IGFzc2VydCB0aGUgaXJx IGluIHRoZSBpbnRlcnJ1cHQKCSAqIGNvbnRyb2xsZXIuIFNvIHdlIG11c3QgcG9sbCBmb3IgdGhl IElGTEcgY2hhbmdlLgoJICovCglpZiAoaTJjLT5icm9rZW5faXJxX21vZGUpIHsKCQl1NjQgZW5k ID0gZ2V0X2ppZmZpZXNfNjQoKSArIGkyYy0+YWRhcC50aW1lb3V0OwoKCQl3aGlsZSAoIW9jdGVv bl9pMmNfdGVzdF9pZmxnKGkyYykgJiYKCQkgICAgICAgdGltZV9iZWZvcmU2NChnZXRfamlmZmll c182NCgpLCBlbmQpKQoJCQl1c2xlZXBfcmFuZ2UoSTJDX09DVEVPTl9FVkVOVF9XQUlUIC8gMiwg STJDX09DVEVPTl9FVkVOVF9XQUlUKTsKCgkJcmV0dXJuIG9jdGVvbl9pMmNfdGVzdF9pZmxnKGky YykgPyAwIDogLUVUSU1FRE9VVDsKCX0KCglpMmMtPmludF9lbmFibGUoaTJjKTsKCXRpbWVfbGVm dCA9IHdhaXRfZXZlbnRfdGltZW91dChpMmMtPnF1ZXVlLCBvY3Rlb25faTJjX3Rlc3RfaWZsZyhp MmMpLAoJCQkJICAgICAgIGkyYy0+YWRhcC50aW1lb3V0KTsKCWkyYy0+aW50X2Rpc2FibGUoaTJj KTsKCglpZiAoaTJjLT5icm9rZW5faXJxX2NoZWNrICYmICF0aW1lX2xlZnQgJiYKCSAgICBvY3Rl b25faTJjX3Rlc3RfaWZsZyhpMmMpKSB7CgkJZGV2X2VycihpMmMtPmRldiwgImJyb2tlbiBpcnEg Y29ubmVjdGlvbiBkZXRlY3RlZCwgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZS5cbiIpOwoJCWky Yy0+YnJva2VuX2lycV9tb2RlID0gdHJ1ZTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoIXRpbWVfbGVm dCkKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGJvb2wgb2N0ZW9u X2kyY19obGNfdGVzdF92YWxpZChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQp7CglyZXR1cm4gKF9f cmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKSAmIFNXX1RXU0lfVikgPT0g MDsKfQoKc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfaW50X2NsZWFyKHN0cnVjdCBvY3Rlb25f aTJjICppMmMpCnsKCS8qIGNsZWFyIFNUL1RTIGV2ZW50cywgbGlzdGVuIGZvciBuZWl0aGVyICov CglvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIFRXU0lfSU5UX1NUX0lOVCB8IFRXU0lfSU5UX1RT X0lOVCk7Cn0KCi8qCiAqIENsZWFudXAgbG93LWxldmVsIHN0YXRlICYgZW5hYmxlIGhpZ2gtbGV2 ZWwgY29udHJvbGxlci4KICovCnN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaGxjX2VuYWJsZShzdHJ1 Y3Qgb2N0ZW9uX2kyYyAqaTJjKQp7CglpbnQgdHJ5ID0gMDsKCXU2NCB2YWw7CgoJaWYgKGkyYy0+ aGxjX2VuYWJsZWQpCgkJcmV0dXJuOwoJaTJjLT5obGNfZW5hYmxlZCA9IHRydWU7CgoJd2hpbGUg KDEpIHsKCQl2YWwgPSBvY3Rlb25faTJjX2N0bF9yZWFkKGkyYyk7CgkJaWYgKCEodmFsICYgKFRX U0lfQ1RMX1NUQSB8IFRXU0lfQ1RMX1NUUCkpKQoJCQlicmVhazsKCgkJLyogY2xlYXIgSUZMRyBl dmVudCAqLwoJCWlmICh2YWwgJiBUV1NJX0NUTF9JRkxHKQoJCQlvY3Rlb25faTJjX2N0bF93cml0 ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOwoKCQlpZiAodHJ5KysgPiAxMDApIHsKCQkJcHJfZXJyKCIl czogZ2l2aW5nIHVwXG4iLCBfX2Z1bmNfXyk7CgkJCWJyZWFrOwoJCX0KCgkJLyogc3BpbiB1bnRp bCBhbnkgc3RhcnQvc3RvcCBoYXMgZmluaXNoZWQgKi8KCQl1ZGVsYXkoMTApOwoJfQoJb2N0ZW9u X2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9DRSB8IFRXU0lfQ1RMX0FBSyB8IFRXU0lfQ1RM X0VOQUIpOwp9CgpzdGF0aWMgdm9pZCBvY3Rlb25faTJjX2hsY19kaXNhYmxlKHN0cnVjdCBvY3Rl b25faTJjICppMmMpCnsKCWlmICghaTJjLT5obGNfZW5hYmxlZCkKCQlyZXR1cm47CgoJaTJjLT5o bGNfZW5hYmxlZCA9IGZhbHNlOwoJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9F TkFCKTsKfQoKLyoqCiAqIG9jdGVvbl9pMmNfaGxjX3dhaXQgLSB3YWl0IGZvciBhbiBITEMgb3Bl cmF0aW9uIHRvIGNvbXBsZXRlCiAqIEBpMmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYwogKgogKiBS ZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIC1FVElNRURPVVQuCiAqLwpzdGF0aWMgaW50 IG9jdGVvbl9pMmNfaGxjX3dhaXQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKewoJaW50IHRpbWVf bGVmdDsKCgkvKgoJICogU29tZSBjbjM4eHggYm9hcmRzIGRvbid0IGFzc2VydCB0aGUgaXJxIGlu IHRoZSBpbnRlcnJ1cHQKCSAqIGNvbnRyb2xsZXIuIFNvIHdlIG11c3QgcG9sbCBmb3IgdGhlIHZh bGlkIGJpdCBjaGFuZ2UuCgkgKi8KCWlmIChpMmMtPmJyb2tlbl9pcnFfbW9kZSkgewoJCXU2NCBl bmQgPSBnZXRfamlmZmllc182NCgpICsgaTJjLT5hZGFwLnRpbWVvdXQ7CgoJCXdoaWxlICghb2N0 ZW9uX2kyY19obGNfdGVzdF92YWxpZChpMmMpICYmCgkJICAgICAgIHRpbWVfYmVmb3JlNjQoZ2V0 X2ppZmZpZXNfNjQoKSwgZW5kKSkKCQkJdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJ VCAvIDIsIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7CgoJCXJldHVybiBvY3Rlb25faTJjX2hsY190 ZXN0X3ZhbGlkKGkyYykgPyAwIDogLUVUSU1FRE9VVDsKCX0KCglpMmMtPmhsY19pbnRfZW5hYmxl KGkyYyk7Cgl0aW1lX2xlZnQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT5xdWV1ZSwKCQkJCSAg ICAgICBvY3Rlb25faTJjX2hsY190ZXN0X3ZhbGlkKGkyYyksCgkJCQkgICAgICAgaTJjLT5hZGFw LnRpbWVvdXQpOwoJaTJjLT5obGNfaW50X2Rpc2FibGUoaTJjKTsKCWlmICghdGltZV9sZWZ0KQoJ CW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOwoKCWlmIChpMmMtPmJyb2tlbl9pcnFfY2hl Y2sgJiYgIXRpbWVfbGVmdCAmJgoJICAgIG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSkg ewoJCWRldl9lcnIoaTJjLT5kZXYsICJicm9rZW4gaXJxIGNvbm5lY3Rpb24gZGV0ZWN0ZWQsIHN3 aXRjaGluZyB0byBwb2xsaW5nIG1vZGUuXG4iKTsKCQlpMmMtPmJyb2tlbl9pcnFfbW9kZSA9IHRy dWU7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKCF0aW1lX2xlZnQpCgkJcmV0dXJuIC1FVElNRURPVVQ7 CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBvY3Rlb25faTJjX2NoZWNrX3N0YXR1cyhzdHJ1Y3Qg b2N0ZW9uX2kyYyAqaTJjLCBpbnQgZmluYWxfcmVhZCkKewoJdTggc3RhdDsKCgkvKgoJICogVGhp cyBpcyB1Z2x5Li4uIGluIEhMQyBtb2RlIHRoZSBzdGF0dXMgaXMgbm90IGluIHRoZSBzdGF0dXMg cmVnaXN0ZXIKCSAqIGJ1dCBpbiB0aGUgbG93ZXIgOCBiaXRzIG9mIFNXX1RXU0kuCgkgKi8KCWlm IChpMmMtPmhsY19lbmFibGVkKQoJCXN0YXQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSAr IFNXX1RXU0koaTJjKSk7CgllbHNlCgkJc3RhdCA9IG9jdGVvbl9pMmNfc3RhdF9yZWFkKGkyYyk7 CgoJc3dpdGNoIChzdGF0KSB7CgkvKiBFdmVyeXRoaW5nIGlzIGZpbmUgKi8KCWNhc2UgU1RBVF9J RExFOgoJY2FzZSBTVEFUX0FEMldfQUNLOgoJY2FzZSBTVEFUX1JYQUREUl9BQ0s6CgljYXNlIFNU QVRfVFhBRERSX0FDSzoKCWNhc2UgU1RBVF9UWERBVEFfQUNLOgoJCXJldHVybiAwOwoKCS8qIEFD SyBhbGxvd2VkIG9uIHByZS10ZXJtaW5hbCBieXRlcyBvbmx5ICovCgljYXNlIFNUQVRfUlhEQVRB X0FDSzoKCQlpZiAoIWZpbmFsX3JlYWQpCgkJCXJldHVybiAwOwoJCXJldHVybiAtRUlPOwoKCS8q IE5BSyBhbGxvd2VkIG9uIHRlcm1pbmFsIGJ5dGUgb25seSAqLwoJY2FzZSBTVEFUX1JYREFUQV9O QUs6CgkJaWYgKGZpbmFsX3JlYWQpCgkJCXJldHVybiAwOwoJCXJldHVybiAtRUlPOwoKCS8qIEFy Yml0cmF0aW9uIGxvc3QgKi8KCWNhc2UgU1RBVF9MT1NUX0FSQl8zODoKCWNhc2UgU1RBVF9MT1NU X0FSQl82ODoKCWNhc2UgU1RBVF9MT1NUX0FSQl83ODoKCWNhc2UgU1RBVF9MT1NUX0FSQl9CMDoK CQlyZXR1cm4gLUVBR0FJTjsKCgkvKiBCZWluZyBhZGRyZXNzZWQgYXMgc2xhdmUsIHNob3VsZCBi YWNrIG9mZiAmIGxpc3RlbiAqLwoJY2FzZSBTVEFUX1NMQVZFXzYwOgoJY2FzZSBTVEFUX1NMQVZF XzcwOgoJY2FzZSBTVEFUX0dFTkRBVEFfQUNLOgoJY2FzZSBTVEFUX0dFTkRBVEFfTkFLOgoJCXJl dHVybiAtRU9QTk9UU1VQUDsKCgkvKiBDb3JlIGJ1c3kgYXMgc2xhdmUgKi8KCWNhc2UgU1RBVF9T TEFWRV84MDoKCWNhc2UgU1RBVF9TTEFWRV84ODoKCWNhc2UgU1RBVF9TTEFWRV9BMDoKCWNhc2Ug U1RBVF9TTEFWRV9BODoKCWNhc2UgU1RBVF9TTEFWRV9MT1NUOgoJY2FzZSBTVEFUX1NMQVZFX05B SzoKCWNhc2UgU1RBVF9TTEFWRV9BQ0s6CgkJcmV0dXJuIC1FT1BOT1RTVVBQOwoKCWNhc2UgU1RB VF9UWERBVEFfTkFLOgoJCXJldHVybiAtRUlPOwoJY2FzZSBTVEFUX1RYQUREUl9OQUs6CgljYXNl IFNUQVRfUlhBRERSX05BSzoKCWNhc2UgU1RBVF9BRDJXX05BSzoKCQlyZXR1cm4gLUVOWElPOwoJ ZGVmYXVsdDoKCQlkZXZfZXJyKGkyYy0+ZGV2LCAidW5oYW5kbGVkIHN0YXRlOiAlZFxuIiwgc3Rh dCk7CgkJcmV0dXJuIC1FSU87Cgl9Cn0KCnN0YXRpYyBpbnQgb2N0ZW9uX2kyY19yZWNvdmVyeShz dHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQp7CglpbnQgcmV0OwoKCXJldCA9IGkyY19yZWNvdmVyX2J1 cygmaTJjLT5hZGFwKTsKCWlmIChyZXQpCgkJLyogcmVjb3ZlciBmYWlsZWQsIHRyeSBoYXJkd2Fy ZSByZS1pbml0ICovCgkJcmV0ID0gb2N0ZW9uX2kyY19pbml0X2xvd2xldmVsKGkyYyk7CglyZXR1 cm4gcmV0Owp9CgovKioKICogb2N0ZW9uX2kyY19zdGFydCAtIHNlbmQgU1RBUlQgdG8gdGhlIGJ1 cwogKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKICoKICogUmV0dXJucyAwIG9uIHN1Y2Nl c3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vLgogKi8Kc3RhdGljIGludCBvY3Rlb25faTJj X3N0YXJ0KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCnsKCWludCByZXQ7Cgl1OCBzdGF0OwoKCW9j dGVvbl9pMmNfaGxjX2Rpc2FibGUoaTJjKTsKCglvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRX U0lfQ1RMX0VOQUIgfCBUV1NJX0NUTF9TVEEpOwoJcmV0ID0gb2N0ZW9uX2kyY193YWl0KGkyYyk7 CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJc3RhdCA9IG9jdGVvbl9pMmNfc3RhdF9yZWFkKGky Yyk7CglpZiAoc3RhdCA9PSBTVEFUX1NUQVJUIHx8IHN0YXQgPT0gU1RBVF9SRVBfU1RBUlQpCgkJ LyogU1RBUlQgc3VjY2Vzc2Z1bCwgYmFpbCBvdXQgKi8KCQlyZXR1cm4gMDsKCXJldHVybiAtRUlP Owp9CgovKiBzZW5kIFNUT1AgdG8gdGhlIGJ1cyAqLwpzdGF0aWMgdm9pZCBvY3Rlb25faTJjX3N0 b3Aoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKewoJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBU V1NJX0NUTF9FTkFCIHwgVFdTSV9DVExfU1RQKTsKfQoKLyoqCiAqIG9jdGVvbl9pMmNfcmVhZCAt IHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBidXMgdmlhIGxvdy1sZXZlbCBjb250cm9sbGVyCiAqIEBp MmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYwogKiBAdGFyZ2V0OiBUYXJnZXQgYWRkcmVzcwogKiBA ZGF0YTogUG9pbnRlciB0byB0aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGRhdGEKICogQHJsZW5n dGg6IExlbmd0aCBvZiB0aGUgZGF0YQogKiBAcmVjdl9sZW46IGZsYWcgZm9yIGxlbmd0aCBieXRl CiAqCiAqIFRoZSBhZGRyZXNzIGlzIHNlbnQgb3ZlciB0aGUgYnVzLCB0aGVuIHRoZSBkYXRhIGlz IHJlYWQuCiAqCiAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBl cnJuby4KICovCnN0YXRpYyBpbnQgb2N0ZW9uX2kyY19yZWFkKHN0cnVjdCBvY3Rlb25faTJjICpp MmMsIGludCB0YXJnZXQsCgkJCSAgIHU4ICpkYXRhLCB1MTYgKnJsZW5ndGgsIGJvb2wgcmVjdl9s ZW4pCnsKCWludCBpLCByZXN1bHQsIGxlbmd0aCA9ICpybGVuZ3RoOwoJYm9vbCBmaW5hbF9yZWFk ID0gZmFsc2U7CgoJb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgKHRhcmdldCA8PCAxKSB8IDEp OwoJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCKTsKCglyZXN1bHQgPSBv Y3Rlb25faTJjX3dhaXQoaTJjKTsKCWlmIChyZXN1bHQpCgkJcmV0dXJuIHJlc3VsdDsKCgkvKiBh ZGRyZXNzIE9LID8gKi8KCXJlc3VsdCA9IG9jdGVvbl9pMmNfY2hlY2tfc3RhdHVzKGkyYywgZmFs c2UpOwoJaWYgKHJlc3VsdCkKCQlyZXR1cm4gcmVzdWx0OwoKCWZvciAoaSA9IDA7IGkgPCBsZW5n dGg7IGkrKykgewoJCS8qCgkJICogRm9yIHRoZSBsYXN0IGJ5dGUgdG8gcmVjZWl2ZSBUV1NJX0NU TF9BQUsgbXVzdCBub3QgYmUgc2V0LgoJCSAqCgkJICogQSBzcGVjaWFsIGNhc2UgaXMgSTJDX01f UkVDVl9MRU4gd2hlcmUgd2UgZG9uJ3Qga25vdyB0aGUKCQkgKiBhZGRpdGlvbmFsIGxlbmd0aCB5 ZXQuIElmIHJlY3ZfbGVuIGlzIHNldCB3ZSBhc3N1bWUgd2UncmUKCQkgKiBub3QgcmVhZGluZyB0 aGUgZmluYWwgYnl0ZSBhbmQgdGhlcmVmb3JlIG5lZWQgdG8gc2V0CgkJICogVFdTSV9DVExfQUFL LgoJCSAqLwoJCWlmICgoaSArIDEgPT0gbGVuZ3RoKSAmJiAhKHJlY3ZfbGVuICYmIGkgPT0gMCkp CgkJCWZpbmFsX3JlYWQgPSB0cnVlOwoKCQkvKiBjbGVhciBpZmxnIHRvIGFsbG93IG5leHQgZXZl bnQgKi8KCQlpZiAoZmluYWxfcmVhZCkKCQkJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJ X0NUTF9FTkFCKTsKCQllbHNlCgkJCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgVFdTSV9DVExf RU5BQiB8IFRXU0lfQ1RMX0FBSyk7CgoJCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOwoJ CWlmIChyZXN1bHQpCgkJCXJldHVybiByZXN1bHQ7CgoJCWRhdGFbaV0gPSBvY3Rlb25faTJjX2Rh dGFfcmVhZChpMmMsICZyZXN1bHQpOwoJCWlmIChyZXN1bHQpCgkJCXJldHVybiByZXN1bHQ7CgkJ aWYgKHJlY3ZfbGVuICYmIGkgPT0gMCkgewoJCQlpZiAoZGF0YVtpXSA+IEkyQ19TTUJVU19CTE9D S19NQVggKyAxKQoJCQkJcmV0dXJuIC1FUFJPVE87CgkJCWxlbmd0aCArPSBkYXRhW2ldOwoJCX0K CgkJcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmaW5hbF9yZWFkKTsKCQlp ZiAocmVzdWx0KQoJCQlyZXR1cm4gcmVzdWx0OwoJfQoJKnJsZW5ndGggPSBsZW5ndGg7CglyZXR1 cm4gMDsKfQoKLyoqCiAqIG9jdGVvbl9pMmNfd3JpdGUgLSBzZW5kIGRhdGEgdG8gdGhlIGJ1cyB2 aWEgbG93LWxldmVsIGNvbnRyb2xsZXIKICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCiAq IEB0YXJnZXQ6IFRhcmdldCBhZGRyZXNzCiAqIEBkYXRhOiBQb2ludGVyIHRvIHRoZSBkYXRhIHRv IGJlIHNlbnQKICogQGxlbmd0aDogTGVuZ3RoIG9mIHRoZSBkYXRhCiAqCiAqIFRoZSBhZGRyZXNz IGlzIHNlbnQgb3ZlciB0aGUgYnVzLCB0aGVuIHRoZSBkYXRhLgogKgogKiBSZXR1cm5zIDAgb24g c3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCiAqLwpzdGF0aWMgaW50IG9jdGVv bl9pMmNfd3JpdGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgaW50IHRhcmdldCwKCQkJICAgIGNv bnN0IHU4ICpkYXRhLCBpbnQgbGVuZ3RoKQp7CglpbnQgaSwgcmVzdWx0OwoKCW9jdGVvbl9pMmNf ZGF0YV93cml0ZShpMmMsIHRhcmdldCA8PCAxKTsKCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywg VFdTSV9DVExfRU5BQik7CgoJcmVzdWx0ID0gb2N0ZW9uX2kyY193YWl0KGkyYyk7CglpZiAocmVz dWx0KQoJCXJldHVybiByZXN1bHQ7CgoJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJ cmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CgkJaWYgKHJlc3Vs dCkKCQkJcmV0dXJuIHJlc3VsdDsKCgkJb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgZGF0YVtp XSk7CgkJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCKTsKCgkJcmVzdWx0 ID0gb2N0ZW9uX2kyY193YWl0KGkyYyk7CgkJaWYgKHJlc3VsdCkKCQkJcmV0dXJuIHJlc3VsdDsK CX0KCglyZXR1cm4gMDsKfQoKLyogaGlnaC1sZXZlbC1jb250cm9sbGVyIHB1cmUgcmVhZCBvZiB1 cCB0byA4IGJ5dGVzICovCnN0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfcmVhZChzdHJ1Y3Qgb2N0 ZW9uX2kyYyAqaTJjLCBzdHJ1Y3QgaTJjX21zZyAqbXNncykKewoJaW50IGksIGosIHJldCA9IDA7 Cgl1NjQgY21kOwoKCW9jdGVvbl9pMmNfaGxjX2VuYWJsZShpMmMpOwoJb2N0ZW9uX2kyY19obGNf aW50X2NsZWFyKGkyYyk7CgoJY21kID0gU1dfVFdTSV9WIHwgU1dfVFdTSV9SIHwgU1dfVFdTSV9T T1ZSOwoJLyogU0laRSAqLwoJY21kIHw9ICh1NjQpKG1zZ3NbMF0ubGVuIC0gMSkgPDwgU1dfVFdT SV9TSVpFX1NISUZUOwoJLyogQSAqLwoJY21kIHw9ICh1NjQpKG1zZ3NbMF0uYWRkciAmIDB4N2Z1 bGwpIDw8IFNXX1RXU0lfQUREUl9TSElGVDsKCglpZiAobXNnc1swXS5mbGFncyAmIEkyQ19NX1RF TikKCQljbWQgfD0gU1dfVFdTSV9PUF8xMDsKCWVsc2UKCQljbWQgfD0gU1dfVFdTSV9PUF83OwoK CW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGNtZCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGky YykpOwoJcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOwoJaWYgKHJldCkKCQlnb3RvIGVy cjsKCgljbWQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7Cglp ZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKCQlyZXR1cm4gb2N0ZW9uX2kyY19jaGVja19zdGF0 dXMoaTJjLCBmYWxzZSk7CgoJZm9yIChpID0gMCwgaiA9IG1zZ3NbMF0ubGVuIC0gMTsgaSAgPCBt c2dzWzBdLmxlbiAmJiBpIDwgNDsgaSsrLCBqLS0pCgkJbXNnc1swXS5idWZbal0gPSAoY21kID4+ ICg4ICogaSkpICYgMHhmZjsKCglpZiAobXNnc1swXS5sZW4gPiA0KSB7CgkJY21kID0gX19yYXdf cmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVChpMmMpKTsKCQlmb3IgKGkgPSAwOyBp ICA8IG1zZ3NbMF0ubGVuIC0gNCAmJiBpIDwgNDsgaSsrLCBqLS0pCgkJCW1zZ3NbMF0uYnVmW2pd ID0gKGNtZCA+PiAoOCAqIGkpKSAmIDB4ZmY7Cgl9CgplcnI6CglyZXR1cm4gcmV0Owp9CgovKiBo aWdoLWxldmVsLWNvbnRyb2xsZXIgcHVyZSB3cml0ZSBvZiB1cCB0byA4IGJ5dGVzICovCnN0YXRp YyBpbnQgb2N0ZW9uX2kyY19obGNfd3JpdGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgc3RydWN0 IGkyY19tc2cgKm1zZ3MpCnsKCWludCBpLCBqLCByZXQgPSAwOwoJdTY0IGNtZDsKCglvY3Rlb25f aTJjX2hsY19lbmFibGUoaTJjKTsKCW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOwoKCWNt ZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfU09WUjsKCS8qIFNJWkUgKi8KCWNtZCB8PSAodTY0KSht c2dzWzBdLmxlbiAtIDEpIDw8IFNXX1RXU0lfU0laRV9TSElGVDsKCS8qIEEgKi8KCWNtZCB8PSAo dTY0KShtc2dzWzBdLmFkZHIgJiAweDdmdWxsKSA8PCBTV19UV1NJX0FERFJfU0hJRlQ7CgoJaWYg KG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCgkJY21kIHw9IFNXX1RXU0lfT1BfMTA7CgllbHNl CgkJY21kIHw9IFNXX1RXU0lfT1BfNzsKCglmb3IgKGkgPSAwLCBqID0gbXNnc1swXS5sZW4gLSAx OyBpICA8IG1zZ3NbMF0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKCQljbWQgfD0gKHU2NCltc2dz WzBdLmJ1ZltqXSA8PCAoOCAqIGkpOwoKCWlmIChtc2dzWzBdLmxlbiA+IDQpIHsKCQl1NjQgZXh0 ID0gMDsKCgkJZm9yIChpID0gMDsgaSA8IG1zZ3NbMF0ubGVuIC0gNCAmJiBpIDwgNDsgaSsrLCBq LS0pCgkJCWV4dCB8PSAodTY0KW1zZ3NbMF0uYnVmW2pdIDw8ICg4ICogaSk7CgkJb2N0ZW9uX2ky Y193cml0ZXFfZmx1c2goZXh0LCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0lfRVhUKGkyYykpOwoJ fQoKCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGNtZCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJ KGkyYykpOwoJcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOwoJaWYgKHJldCkKCQlnb3Rv IGVycjsKCgljbWQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7 CglpZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKCQlyZXR1cm4gb2N0ZW9uX2kyY19jaGVja19z dGF0dXMoaTJjLCBmYWxzZSk7CgplcnI6CglyZXR1cm4gcmV0Owp9CgovKiBoaWdoLWxldmVsLWNv bnRyb2xsZXIgY29tcG9zaXRlIHdyaXRlK3JlYWQsIG1zZzA9YWRkciwgbXNnMT1kYXRhICovCnN0 YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfY29tcF9yZWFkKHN0cnVjdCBvY3Rlb25faTJjICppMmMs IHN0cnVjdCBpMmNfbXNnICptc2dzKQp7CglpbnQgaSwgaiwgcmV0ID0gMDsKCXU2NCBjbWQ7CgoJ b2N0ZW9uX2kyY19obGNfZW5hYmxlKGkyYyk7CgoJY21kID0gU1dfVFdTSV9WIHwgU1dfVFdTSV9S IHwgU1dfVFdTSV9TT1ZSOwoJLyogU0laRSAqLwoJY21kIHw9ICh1NjQpKG1zZ3NbMV0ubGVuIC0g MSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOwoJLyogQSAqLwoJY21kIHw9ICh1NjQpKG1zZ3NbMF0u YWRkciAmIDB4N2Z1bGwpIDw8IFNXX1RXU0lfQUREUl9TSElGVDsKCglpZiAobXNnc1swXS5mbGFn cyAmIEkyQ19NX1RFTikKCQljbWQgfD0gU1dfVFdTSV9PUF8xMF9JQTsKCWVsc2UKCQljbWQgfD0g U1dfVFdTSV9PUF83X0lBOwoKCWlmIChtc2dzWzBdLmxlbiA9PSAyKSB7CgkJdTY0IGV4dCA9IDA7 CgoJCWNtZCB8PSBTV19UV1NJX0VJQTsKCQlleHQgPSAodTY0KW1zZ3NbMF0uYnVmWzBdIDw8IFNX X1RXU0lfSUFfU0hJRlQ7CgkJY21kIHw9ICh1NjQpbXNnc1swXS5idWZbMV0gPDwgU1dfVFdTSV9J QV9TSElGVDsKCQlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChleHQsIGkyYy0+dHdzaV9iYXNlICsg U1dfVFdTSV9FWFQoaTJjKSk7Cgl9IGVsc2UgewoJCWNtZCB8PSAodTY0KW1zZ3NbMF0uYnVmWzBd IDw8IFNXX1RXU0lfSUFfU0hJRlQ7Cgl9CgoJb2N0ZW9uX2kyY19obGNfaW50X2NsZWFyKGkyYyk7 CglvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChjbWQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShp MmMpKTsKCglyZXQgPSBvY3Rlb25faTJjX2hsY193YWl0KGkyYyk7CglpZiAocmV0KQoJCWdvdG8g ZXJyOwoKCWNtZCA9IF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKTsK CWlmICgoY21kICYgU1dfVFdTSV9SKSA9PSAwKQoJCXJldHVybiBvY3Rlb25faTJjX2NoZWNrX3N0 YXR1cyhpMmMsIGZhbHNlKTsKCglmb3IgKGkgPSAwLCBqID0gbXNnc1sxXS5sZW4gLSAxOyBpICA8 IG1zZ3NbMV0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKCQltc2dzWzFdLmJ1ZltqXSA9IChjbWQg Pj4gKDggKiBpKSkgJiAweGZmOwoKCWlmIChtc2dzWzFdLmxlbiA+IDQpIHsKCQljbWQgPSBfX3Jh d19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0lfRVhUKGkyYykpOwoJCWZvciAoaSA9IDA7 IGkgIDwgbXNnc1sxXS5sZW4gLSA0ICYmIGkgPCA0OyBpKyssIGotLSkKCQkJbXNnc1sxXS5idWZb al0gPSAoY21kID4+ICg4ICogaSkpICYgMHhmZjsKCX0KCmVycjoKCXJldHVybiByZXQ7Cn0KCi8q IGhpZ2gtbGV2ZWwtY29udHJvbGxlciBjb21wb3NpdGUgd3JpdGUrd3JpdGUsIG1bMF1sZW48PTIs IG1bMV1sZW48PTggKi8Kc3RhdGljIGludCBvY3Rlb25faTJjX2hsY19jb21wX3dyaXRlKHN0cnVj dCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQp7Cglib29sIHNldF9leHQg PSBmYWxzZTsKCWludCBpLCBqLCByZXQgPSAwOwoJdTY0IGNtZCwgZXh0ID0gMDsKCglvY3Rlb25f aTJjX2hsY19lbmFibGUoaTJjKTsKCgljbWQgPSBTV19UV1NJX1YgfCBTV19UV1NJX1NPVlI7Cgkv KiBTSVpFICovCgljbWQgfD0gKHU2NCkobXNnc1sxXS5sZW4gLSAxKSA8PCBTV19UV1NJX1NJWkVf U0hJRlQ7CgkvKiBBICovCgljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwg U1dfVFdTSV9BRERSX1NISUZUOwoKCWlmIChtc2dzWzBdLmZsYWdzICYgSTJDX01fVEVOKQoJCWNt ZCB8PSBTV19UV1NJX09QXzEwX0lBOwoJZWxzZQoJCWNtZCB8PSBTV19UV1NJX09QXzdfSUE7CgoJ aWYgKG1zZ3NbMF0ubGVuID09IDIpIHsKCQljbWQgfD0gU1dfVFdTSV9FSUE7CgkJZXh0IHw9ICh1 NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKCQlzZXRfZXh0ID0gdHJ1ZTsK CQljbWQgfD0gKHU2NCltc2dzWzBdLmJ1ZlsxXSA8PCBTV19UV1NJX0lBX1NISUZUOwoJfSBlbHNl IHsKCQljbWQgfD0gKHU2NCltc2dzWzBdLmJ1ZlswXSA8PCBTV19UV1NJX0lBX1NISUZUOwoJfQoK CWZvciAoaSA9IDAsIGogPSBtc2dzWzFdLmxlbiAtIDE7IGkgIDwgbXNnc1sxXS5sZW4gJiYgaSA8 IDQ7IGkrKywgai0tKQoJCWNtZCB8PSAodTY0KW1zZ3NbMV0uYnVmW2pdIDw8ICg4ICogaSk7CgoJ aWYgKG1zZ3NbMV0ubGVuID4gNCkgewoJCWZvciAoaSA9IDA7IGkgPCBtc2dzWzFdLmxlbiAtIDQg JiYgaSA8IDQ7IGkrKywgai0tKQoJCQlleHQgfD0gKHU2NCltc2dzWzFdLmJ1ZltqXSA8PCAoOCAq IGkpOwoJCXNldF9leHQgPSB0cnVlOwoJfQoJaWYgKHNldF9leHQpCgkJb2N0ZW9uX2kyY193cml0 ZXFfZmx1c2goZXh0LCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0lfRVhUKGkyYykpOwoKCW9jdGVv bl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOwoJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goY21kLCBp MmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CgoJcmV0ID0gb2N0ZW9uX2kyY19obGNfd2Fp dChpMmMpOwoJaWYgKHJldCkKCQlnb3RvIGVycjsKCgljbWQgPSBfX3Jhd19yZWFkcShpMmMtPnR3 c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CglpZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKCQly ZXR1cm4gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CgplcnI6CglyZXR1cm4g cmV0Owp9CgovKioKICogb2N0ZW9uX2kyY194ZmVyIC0gVGhlIGRyaXZlcidzIG1hc3Rlcl94ZmVy IGZ1bmN0aW9uCiAqIEBhZGFwOiBQb2ludGVyIHRvIHRoZSBpMmNfYWRhcHRlciBzdHJ1Y3R1cmUK ICogQG1zZ3M6IFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZAogKiBAbnVt OiBMZW5ndGggb2YgdGhlIE1TR1MgYXJyYXkKICoKICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1l c3NhZ2VzIHByb2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgogKi8KaW50 IG9jdGVvbl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNn ICptc2dzLCBpbnQgbnVtKQp7CglzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFw ZGF0YShhZGFwKTsKCWludCBpLCByZXQgPSAwOwoKCWlmIChudW0gPT0gMSkgewoJCWlmIChtc2dz WzBdLmxlbiA+IDAgJiYgbXNnc1swXS5sZW4gPD0gOCkgewoJCQlpZiAobXNnc1swXS5mbGFncyAm IEkyQ19NX1JEKQoJCQkJcmV0ID0gb2N0ZW9uX2kyY19obGNfcmVhZChpMmMsIG1zZ3MpOwoJCQll bHNlCgkJCQlyZXQgPSBvY3Rlb25faTJjX2hsY193cml0ZShpMmMsIG1zZ3MpOwoJCQlnb3RvIG91 dDsKCQl9Cgl9IGVsc2UgaWYgKG51bSA9PSAyKSB7CgkJaWYgKChtc2dzWzBdLmZsYWdzICYgSTJD X01fUkQpID09IDAgJiYKCQkgICAgKG1zZ3NbMV0uZmxhZ3MgJiBJMkNfTV9SRUNWX0xFTikgPT0g MCAmJgoJCSAgICBtc2dzWzBdLmxlbiA+IDAgJiYgbXNnc1swXS5sZW4gPD0gMiAmJgoJCSAgICBt c2dzWzFdLmxlbiA+IDAgJiYgbXNnc1sxXS5sZW4gPD0gOCAmJgoJCSAgICBtc2dzWzBdLmFkZHIg PT0gbXNnc1sxXS5hZGRyKSB7CgkJCWlmIChtc2dzWzFdLmZsYWdzICYgSTJDX01fUkQpCgkJCQly ZXQgPSBvY3Rlb25faTJjX2hsY19jb21wX3JlYWQoaTJjLCBtc2dzKTsKCQkJZWxzZQoJCQkJcmV0 ID0gb2N0ZW9uX2kyY19obGNfY29tcF93cml0ZShpMmMsIG1zZ3MpOwoJCQlnb3RvIG91dDsKCQl9 Cgl9CgoJZm9yIChpID0gMDsgcmV0ID09IDAgJiYgaSA8IG51bTsgaSsrKSB7CgkJc3RydWN0IGky Y19tc2cgKnBtc2cgPSAmbXNnc1tpXTsKCgkJLyogemVyby1sZW5ndGggbWVzc2FnZXMgYXJlIG5v dCBzdXBwb3J0ZWQgKi8KCQlpZiAoIXBtc2ctPmxlbikgewoJCQlyZXQgPSAtRU9QTk9UU1VQUDsK CQkJYnJlYWs7CgkJfQoKCQlyZXQgPSBvY3Rlb25faTJjX3N0YXJ0KGkyYyk7CgkJaWYgKHJldCkK CQkJZ290byBvdXQ7CgoJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEKQoJCQlyZXQgPSBvY3Rl b25faTJjX3JlYWQoaTJjLCBwbXNnLT5hZGRyLCBwbXNnLT5idWYsCgkJCQkJICAgICAgJnBtc2ct PmxlbiwgcG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRUNWX0xFTik7CgkJZWxzZQoJCQlyZXQgPSBvY3Rl b25faTJjX3dyaXRlKGkyYywgcG1zZy0+YWRkciwgcG1zZy0+YnVmLAoJCQkJCSAgICAgICBwbXNn LT5sZW4pOwoJfQoJb2N0ZW9uX2kyY19zdG9wKGkyYyk7Cm91dDoKCWlmIChyZXQgIT0gMCkgewoJ CXJldCA9IG9jdGVvbl9pMmNfcmVjb3ZlcnkoaTJjKTsKCQlyZXR1cm4gKHJldCkgPyByZXQgOiAt RUFHQUlOOwoJfQoKCXJldHVybiBudW07Cn0KCi8qIGNhbGN1bGF0ZSBhbmQgc2V0IGNsb2NrIGRp dmlzb3JzICovCnZvaWQgb2N0ZW9uX2kyY19zZXRfY2xvY2soc3RydWN0IG9jdGVvbl9pMmMgKmky YykKewoJaW50IHRjbGssIHRocF9iYXNlLCBpbmMsIHRocF9pZHgsIG1kaXZfaWR4LCBuZGl2X2lk eCwgZm9zY2wsIGRpZmY7CglpbnQgdGhwID0gMHgxOCwgbWRpdiA9IDIsIG5kaXYgPSAwLCBkZWx0 YV9oeiA9IDEwMDAwMDA7CgoJZm9yIChuZGl2X2lkeCA9IDA7IG5kaXZfaWR4IDwgOCAmJiBkZWx0 YV9oeiAhPSAwOyBuZGl2X2lkeCsrKSB7CgkJLyoKCQkgKiBBbiBtZGl2IHZhbHVlIG9mIGxlc3Mg dGhhbiAyIHNlZW1zIHRvIG5vdCB3b3JrIHdlbGwKCQkgKiB3aXRoIGRzMTMzNyBSVENzLCBzbyB3 ZSBjb25zdHJhaW4gaXQgdG8gbGFyZ2VyIHZhbHVlcy4KCQkgKi8KCQlmb3IgKG1kaXZfaWR4ID0g MTU7IG1kaXZfaWR4ID49IDIgJiYgZGVsdGFfaHogIT0gMDsgbWRpdl9pZHgtLSkgewoJCQkvKgoJ CQkgKiBGb3IgZ2l2ZW4gbmRpdiBhbmQgbWRpdiB2YWx1ZXMgY2hlY2sgdGhlCgkJCSAqIHR3byBj bG9zZXN0IHRocCB2YWx1ZXMuCgkJCSAqLwoJCQl0Y2xrID0gaTJjLT50d3NpX2ZyZXEgKiAobWRp dl9pZHggKyAxKSAqIDEwOwoJCQl0Y2xrICo9ICgxIDw8IG5kaXZfaWR4KTsKCQkJdGhwX2Jhc2Ug PSAoaTJjLT5zeXNfZnJlcSAvICh0Y2xrICogMikpIC0gMTsKCgkJCWZvciAoaW5jID0gMDsgaW5j IDw9IDE7IGluYysrKSB7CgkJCQl0aHBfaWR4ID0gdGhwX2Jhc2UgKyBpbmM7CgkJCQlpZiAodGhw X2lkeCA8IDUgfHwgdGhwX2lkeCA+IDB4ZmYpCgkJCQkJY29udGludWU7CgoJCQkJZm9zY2wgPSBp MmMtPnN5c19mcmVxIC8gKDIgKiAodGhwX2lkeCArIDEpKTsKCQkJCWZvc2NsID0gZm9zY2wgLyAo MSA8PCBuZGl2X2lkeCk7CgkJCQlmb3NjbCA9IGZvc2NsIC8gKG1kaXZfaWR4ICsgMSkgLyAxMDsK CQkJCWRpZmYgPSBhYnMoZm9zY2wgLSBpMmMtPnR3c2lfZnJlcSk7CgkJCQlpZiAoZGlmZiA8IGRl bHRhX2h6KSB7CgkJCQkJZGVsdGFfaHogPSBkaWZmOwoJCQkJCXRocCA9IHRocF9pZHg7CgkJCQkJ bWRpdiA9IG1kaXZfaWR4OwoJCQkJCW5kaXYgPSBuZGl2X2lkeDsKCQkJCX0KCQkJfQoJCX0KCX0K CW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9PUF9UV1NJX0NMSywgdGhwKTsKCW9j dGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DTEtDVEwsIChtZGl2IDw8 IDMpIHwgbmRpdik7Cn0KCmludCBvY3Rlb25faTJjX2luaXRfbG93bGV2ZWwoc3RydWN0IG9jdGVv bl9pMmMgKmkyYykKewoJdTggc3RhdHVzID0gMDsKCWludCB0cmllczsKCgkvKiByZXNldCBjb250 cm9sbGVyICovCglvY3Rlb25faTJjX3JlZ193cml0ZShpMmMsIFNXX1RXU0lfRU9QX1RXU0lfUlNU LCAwKTsKCglmb3IgKHRyaWVzID0gMTA7IHRyaWVzICYmIHN0YXR1cyAhPSBTVEFUX0lETEU7IHRy aWVzLS0pIHsKCQl1ZGVsYXkoMSk7CgkJc3RhdHVzID0gb2N0ZW9uX2kyY19zdGF0X3JlYWQoaTJj KTsKCQlpZiAoc3RhdHVzID09IFNUQVRfSURMRSkKCQkJYnJlYWs7Cgl9CgoJaWYgKHN0YXR1cyAh PSBTVEFUX0lETEUpIHsKCQlkZXZfZXJyKGkyYy0+ZGV2LCAiJXM6IFRXU0lfUlNUIGZhaWxlZCEg KDB4JXgpXG4iLAoJCQlfX2Z1bmNfXywgc3RhdHVzKTsKCQlyZXR1cm4gLUVJTzsKCX0KCgkvKiB0 b2dnbGUgdHdpY2UgdG8gZm9yY2UgYm90aCB0ZWFyZG93bnMgKi8KCW9jdGVvbl9pMmNfaGxjX2Vu YWJsZShpMmMpOwoJb2N0ZW9uX2kyY19obGNfZGlzYWJsZShpMmMpOwoJcmV0dXJuIDA7Cn0KCnN0 YXRpYyBpbnQgb2N0ZW9uX2kyY19nZXRfc2NsKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJ c3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Cgl1NjQgc3Rh dGU7CgoJc3RhdGUgPSBvY3Rlb25faTJjX3JlYWRfaW50KGkyYyk7CglyZXR1cm4gc3RhdGUgJiBU V1NJX0lOVF9TQ0w7Cn0KCnN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfc2V0X3NjbChzdHJ1Y3QgaTJj X2FkYXB0ZXIgKmFkYXAsIGludCB2YWwpCnsKCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBpMmNf Z2V0X2FkYXBkYXRhKGFkYXApOwoKCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgdmFsID8gMCA6 IFRXU0lfSU5UX1NDTF9PVlIpOwp9CgpzdGF0aWMgaW50IG9jdGVvbl9pMmNfZ2V0X3NkYShzdHJ1 Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBpMmNfZ2V0 X2FkYXBkYXRhKGFkYXApOwoJdTY0IHN0YXRlOwoKCXN0YXRlID0gb2N0ZW9uX2kyY19yZWFkX2lu dChpMmMpOwoJcmV0dXJuIHN0YXRlICYgVFdTSV9JTlRfU0RBOwp9CgpzdGF0aWMgdm9pZCBvY3Rl b25faTJjX3ByZXBhcmVfcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglzdHJ1 Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKCglvY3Rlb25faTJj X2hsY19kaXNhYmxlKGkyYyk7CglvY3Rlb25faTJjX3JlZ193cml0ZShpMmMsIFNXX1RXU0lfRU9Q X1RXU0lfUlNULCAwKTsKCS8qIHdhaXQgZm9yIHNvZnR3YXJlIHJlc2V0IHRvIHNldHRsZSAqLwoJ dWRlbGF5KDUpOwoKCS8qCgkgKiBCcmluZyBjb250cm9sIHJlZ2lzdGVyIHRvIGEgZ29vZCBzdGF0 ZSByZWdhcmRsZXNzCgkgKiBvZiBITEMgc3RhdGUuCgkgKi8KCW9jdGVvbl9pMmNfY3RsX3dyaXRl KGkyYywgVFdTSV9DVExfRU5BQik7CgoJb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCAwKTsKfQoK c3RhdGljIHZvaWQgb2N0ZW9uX2kyY191bnByZXBhcmVfcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFw dGVyICphZGFwKQp7CglzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShh ZGFwKTsKCgkvKgoJICogR2VuZXJhdGUgU1RPUCB0byBmaW5pc2ggdGhlIHVuZmluaXNoZWQgdHJh bnNhY3Rpb24uCgkgKiBDYW4ndCBnZW5lcmF0ZSBTVE9QIHZpYSB0aGUgVFdTSSBDVEwgcmVnaXN0 ZXIKCSAqIHNpbmNlIGl0IGNvdWxkIGJyaW5nIHRoZSBUV1NJIGNvbnRyb2xsZXIgaW50byBhbiBp bm9wZXJhYmxlIHN0YXRlLgoJICovCglvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIFRXU0lfSU5U X1NEQV9PVlIgfCBUV1NJX0lOVF9TQ0xfT1ZSKTsKCXVkZWxheSg1KTsKCW9jdGVvbl9pMmNfd3Jp dGVfaW50KGkyYywgVFdTSV9JTlRfU0RBX09WUik7Cgl1ZGVsYXkoNSk7CglvY3Rlb25faTJjX3dy aXRlX2ludChpMmMsIDApOwp9CgpzdHJ1Y3QgaTJjX2J1c19yZWNvdmVyeV9pbmZvIG9jdGVvbl9p MmNfcmVjb3ZlcnlfaW5mbyA9IHsKCS5yZWNvdmVyX2J1cyA9IGkyY19nZW5lcmljX3NjbF9yZWNv dmVyeSwKCS5nZXRfc2NsID0gb2N0ZW9uX2kyY19nZXRfc2NsLAoJLnNldF9zY2wgPSBvY3Rlb25f aTJjX3NldF9zY2wsCgkuZ2V0X3NkYSA9IG9jdGVvbl9pMmNfZ2V0X3NkYSwKCS5wcmVwYXJlX3Jl Y292ZXJ5ID0gb2N0ZW9uX2kyY19wcmVwYXJlX3JlY292ZXJ5LAoJLnVucHJlcGFyZV9yZWNvdmVy eSA9IG9jdGVvbl9pMmNfdW5wcmVwYXJlX3JlY292ZXJ5LAp9Owo= --_003_VI1PR0702MB36153CFE29EF55B1EE8A05BD8E320VI1PR0702MB3615_--