From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 58C481B2A9 for ; Thu, 21 Dec 2017 18:27:54 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Dec 2017 09:27:53 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.45,436,1508828400"; d="scan'208";a="3800111" Received: from silpixa00398162.ir.intel.com (HELO silpixa00398162.ger.corp.intel.com) ([10.237.223.171]) by fmsmga002.fm.intel.com with ESMTP; 21 Dec 2017 09:27:51 -0800 From: Liang Ma To: jerin.jacob@caviumnetworks.com Cc: dev@dpdk.org, harry.van.haaren@intel.com, bruce.richardson@intel.com, deepak.k.jain@intel.com, john.geary@intel.com, peter.mccarthy@intel.com, seanbh@gmail.com Date: Thu, 21 Dec 2017 17:27:43 +0000 Message-Id: <1513877270-194773-2-git-send-email-liang.j.ma@intel.com> X-Mailer: git-send-email 2.7.5 In-Reply-To: <1513877270-194773-1-git-send-email-liang.j.ma@intel.com> References: <1513877270-194773-1-git-send-email-liang.j.ma@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Subject: [dpdk-dev] [PATCH v3 1/8] event/opdl: add the opdl ring infrastructure library X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Dec 2017 17:27:56 -0000 T1BETCByaW5nIGlzIHRoZSBjb3JlIGluZnJhc3RydWN0dXJlIG9mIE9QREwgUE1ELiBPUERMIHJp bmcgbGlicmFyeQpwcm92aWRlIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlIGFuZCBjb3JlIGhlbHBl ciBmdW5jdGlvbiBzZXQuIFRoZSBSaW5nCmltcGxlbWVudHMgYSBzaW5nbGUgcmluZyBtdWx0aS1w b3J0L3N0YWdlIHBpcGVsaW5lZCBwYWNrZXQgZGlzdHJpYnV0aW9uCm1lY2hhbmlzbS4gVGhpcyBt ZWNoYW5pc20gaGFzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOgoK4oCiIE5vIG11bHRp cGxlIHF1ZXVlIGNvc3QsIHRoZXJlZm9yZSwgbGF0ZW5jeSBpcyBzaWduaWZpY2FudCByZWR1Y2Vk LgrigKIgRml4ZWQgZGVwZW5kZW5jaWVzIGJldHdlZW4gcXVldWUvcG9ydHMgaXMgbW9yZSBzdWl0 YWJsZSBmb3IgY29tcGxleC4KICBmaXhlZCBwaXBlbGluZXMgb2Ygc3RhdGVsZXNzIHBhY2tldCBw cm9jZXNzaW5nIChzdGF0aWMgcGlwZWxpbmUpLgrigKIgSGFzIGRlY2VudHJhbGl6ZWQgZGlzdHJp YnV0aW9uIChubyBzY2hlZHVsaW5nIGNvcmUpLgrigKIgUGFja2V0cyByZW1haW4gaW4gb3JkZXIg KG5vIHJlb3JkZXIgY29yZShzKSkuCiogVXBkYXRlIGJ1aWxkIHN5c3RlbSB0byBlbmFibGUgY29t cGlsYXRpb24uCgpTaWduZWQtb2ZmLWJ5OiBMaWFuZyBNYSA8bGlhbmcuai5tYUBpbnRlbC5jb20+ ClNpZ25lZC1vZmYtYnk6IFBldGVyIE1jY2FydGh5IDxwZXRlci5tY2NhcnRoeUBpbnRlbC5jb20+ Ci0tLQogY29uZmlnL2NvbW1vbl9iYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDYgKwogZHJpdmVycy9ldmVudC9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgIDEgKwogZHJpdmVycy9ldmVudC9vcGRsL01ha2VmaWxlICAgICAgICAgICAgICAgICAg ICAgICB8ICAgNjIgKwogZHJpdmVycy9ldmVudC9vcGRsL29wZGxfbG9nLmggICAgICAgICAgICAg ICAgICAgICB8ICAgNTkgKwogZHJpdmVycy9ldmVudC9vcGRsL29wZGxfcmluZy5jICAgICAgICAg ICAgICAgICAgICB8IDEyNTAgKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2V2ZW50L29w ZGwvb3BkbF9yaW5nLmggICAgICAgICAgICAgICAgICAgIHwgIDYyOCArKysrKysrKysrKwogZHJp dmVycy9ldmVudC9vcGRsL3J0ZV9wbWRfZXZkZXZfb3BkbF92ZXJzaW9uLm1hcCB8ICAgIDMgKwog bWsvcnRlLmFwcC5tayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEg KwogbWsvdG9vbGNoYWluL2djYy9ydGUudG9vbGNoYWluLWNvbXBhdC5tayAgICAgICAgICB8ICAg IDYgKwogbWsvdG9vbGNoYWluL2ljYy9ydGUudG9vbGNoYWluLWNvbXBhdC5tayAgICAgICAgICB8 ICAgIDYgKwogMTAgZmlsZXMgY2hhbmdlZCwgMjAyMiBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9ldmVudC9vcGRsL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9ldmVudC9vcGRsL29wZGxfbG9nLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2V2ZW50L29wZGwvb3BkbF9yaW5nLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2V2ZW50 L29wZGwvb3BkbF9yaW5nLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2V2ZW50L29wZGwv cnRlX3BtZF9ldmRldl9vcGRsX3ZlcnNpb24ubWFwCgpkaWZmIC0tZ2l0IGEvY29uZmlnL2NvbW1v bl9iYXNlIGIvY29uZmlnL2NvbW1vbl9iYXNlCmluZGV4IGU3NGZlYmUuLjY3YWRhYmEgMTAwNjQ0 Ci0tLSBhL2NvbmZpZy9jb21tb25fYmFzZQorKysgYi9jb25maWcvY29tbW9uX2Jhc2UKQEAgLTU5 NCw2ICs1OTQsMTIgQEAgQ09ORklHX1JURV9MSUJSVEVfUE1EX09DVEVPTlRYX1NTT1ZGPXkKIENP TkZJR19SVEVfTElCUlRFX1BNRF9PQ1RFT05UWF9TU09WRl9ERUJVRz1uCiAKICMKKyMgQ29tcGls ZSBQTUQgZm9yIE9QREwgZXZlbnQgZGV2aWNlCisjCitDT05GSUdfUlRFX0xJQlJURV9QTURfT1BE TF9FVkVOVERFVj15CitDT05GSUdfUlRFX0xJQlJURV9QTURfT1BETF9FVkVOVERFVl9ERUJVRz1u CisKKyMKICMgQ29tcGlsZSBsaWJydGVfcmluZwogIwogQ09ORklHX1JURV9MSUJSVEVfUklORz15 CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V2ZW50L01ha2VmaWxlIGIvZHJpdmVycy9ldmVudC9NYWtl ZmlsZQppbmRleCAxZjljMGJhLi5kNjI2NjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V2ZW50L01h a2VmaWxlCisrKyBiL2RyaXZlcnMvZXZlbnQvTWFrZWZpbGUKQEAgLTM1LDUgKzM1LDYgQEAgRElS Uy0kKENPTkZJR19SVEVfTElCUlRFX1BNRF9TS0VMRVRPTl9FVkVOVERFVikgKz0gc2tlbGV0b24K IERJUlMtJChDT05GSUdfUlRFX0xJQlJURV9QTURfU1dfRVZFTlRERVYpICs9IHN3CiBESVJTLSQo Q09ORklHX1JURV9MSUJSVEVfUE1EX09DVEVPTlRYX1NTT1ZGKSArPSBvY3Rlb250eAogRElSUy0k KENPTkZJR19SVEVfTElCUlRFX1BNRF9EUEFBMl9FVkVOVERFVikgKz0gZHBhYTIKK0RJUlMtJChD T05GSUdfUlRFX0xJQlJURV9QTURfT1BETF9FVkVOVERFVikgKz0gb3BkbAogCiBpbmNsdWRlICQo UlRFX1NESykvbWsvcnRlLnN1YmRpci5tawpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ldmVudC9vcGRs L01ha2VmaWxlIGIvZHJpdmVycy9ldmVudC9vcGRsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjgyNzdlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2V2 ZW50L29wZGwvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIyAgIEJTRCBMSUNFTlNFCisjCisj ICAgQ29weXJpZ2h0KGMpIDIwMTYtMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KKyMKKyMgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0 ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgICBhcmUgbWV0Ogor IworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl IGFib3ZlIGNvcHlyaWdodAorIyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAg IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh aW1lciBpbgorIyAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkIHdpdGggdGhlCisjICAgICAgIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhl ciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyAg ICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1 Y3RzIGRlcml2ZWQKKyMgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklE RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgICAiQVMgSVMi IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P VAorIyAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZIEFORCBGSVRORVNTIEZPUgorIyAgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjICAgT1dORVIgT1IgQ09OVFJJ QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisj ICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO RywgQlVUIE5PVAorIyAgIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyAgIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyAgIFRIRU9S WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S IFRPUlQKKyMgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgICBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbmNsdWRlICQoUlRF X1NESykvbWsvcnRlLnZhcnMubWsKKworIyBsaWJyYXJ5IG5hbWUKK0xJQiA9IGxpYnJ0ZV9wbWRf b3BkbF9ldmVudC5hCisKKyMgYnVpbGQgZmxhZ3MKK0NGTEFHUyArPSAtTzMKK0NGTEFHUyArPSAk KFdFUlJPUl9GTEFHUykKKyMgZm9yIG9sZGVyIEdDQyB2ZXJzaW9ucywgYWxsb3cgdXMgdG8gaW5p dGlhbGl6ZSBhbiBldmVudCB1c2luZworIyBkZXNpZ25hdGVkIGluaXRpYWxpemVycy4KK2lmZXEg KCQoQ09ORklHX1JURV9UT09MQ0hBSU5fR0NDKSx5KQoraWZlcSAoJChzaGVsbCB0ZXN0ICQoR0ND X1ZFUlNJT04pIC1sZSA1MCAmJiBlY2hvIDEpLCAxKQorQ0ZMQUdTICs9IC1Xbm8tbWlzc2luZy1m aWVsZC1pbml0aWFsaXplcnMKK2VuZGlmCitlbmRpZgorCitMRExJQlMgKz0gLWxydGVfZWFsIC1s cnRlX2V2ZW50ZGV2IC1scnRlX2t2YXJncworTERMSUJTICs9IC1scnRlX2J1c192ZGV2IC1scnRl X21idWYgLWxydGVfbWVtcG9vbAorCisjIGxpYnJhcnkgdmVyc2lvbgorTElCQUJJVkVSIDo9IDEK KworIyB2ZXJzaW9uaW5nIGV4cG9ydCBtYXAKK0VYUE9SVF9NQVAgOj0gcnRlX3BtZF9ldmRldl9v cGRsX3ZlcnNpb24ubWFwCisKKyMgbGlicmFyeSBzb3VyY2UgZmlsZXMKK1NSQ1MtJChDT05GSUdf UlRFX0xJQlJURV9QTURfT1BETF9FVkVOVERFVikgKz0gb3BkbF9yaW5nLmMKKworIyBleHBvcnQg aW5jbHVkZSBmaWxlcworU1lNTElOSy15LWluY2x1ZGUgKz0KKworaW5jbHVkZSAkKFJURV9TREsp L21rL3J0ZS5saWIubWsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXZlbnQvb3BkbC9vcGRsX2xvZy5o IGIvZHJpdmVycy9ldmVudC9vcGRsL29wZGxfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uODMzNjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZXZlbnQvb3Bk bC9vcGRsX2xvZy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qLQorICogICBCU0QgTElDRU5TRQorICoK KyAqICAgQ29weXJpZ2h0KGMpIDIwMTAtMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFJlZGlzdHJp YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91 dAorICogICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnMKKyAqICAgYXJlIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog ICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgICAg dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo ZQorICogICAgICAgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJ bnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0 b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg KiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu IHBlcm1pc3Npb24uCisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBF WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJ TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG SVRORVNTIEZPUgorICogICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogICBPV05FUiBPUiBDT05UUklCVVRPUlMg QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgU1BF Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU IE5PVAorICogICBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgIFRIRU9SWSBP RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP UlQKKyAqICAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBf T1BETF9MT0dTX0hfCisjZGVmaW5lIF9PUERMX0xPR1NfSF8KKworI2luY2x1ZGUgPHJ0ZV9sb2cu aD4KKworaW50IG9wZGxfbG9ndHlwZV9kcml2ZXI7CisKKyNkZWZpbmUgUE1EX0RSVl9MT0dfUkFX KGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwlydGVfbG9nKFJURV9MT0dfICMjIGxldmVsLCBvcGRs X2xvZ3R5cGVfZHJpdmVyLCAiJXMoKTogIiBmbXQsIFwKKwkJCV9fZnVuY19fLCAjIyBhcmdzKQor CisjZGVmaW5lIFBNRF9EUlZfTE9HKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwlQTURfRFJWX0xP R19SQVcobGV2ZWwsIGZtdCAiXG4iLCAjIyBhcmdzKQorCisjaWZkZWYgUlRFX0xJQlJURV9QTURf RVZERVZfT1BETF9ERUJVRworCisjZGVmaW5lIE9QRExfTE9HX0RCRyhmbXQsIGFyZ3MuLi4pIFwK KwlSVEVfTE9HKERFQlVHLCBFVkVOVERFViwgIlslc10gJXMoKSBsaW5lICV1OiAiIGZtdCAiXG4i LCBcCisJCU9QRExfUE1EX05BTUUsIFwKKwkJX19mdW5jX18sIF9fTElORV9fLCAjIyBhcmdzKQor I2Vsc2UKKyNkZWZpbmUgT1BETF9MT0dfREJHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisKKyNl bmRpZiAvKiBfT1BETF9MT0dTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V2ZW50L29wZGwv b3BkbF9yaW5nLmMgYi9kcml2ZXJzL2V2ZW50L29wZGwvb3BkbF9yaW5nLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3ZDFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvZXZlbnQvb3BkbC9vcGRsX3JpbmcuYwpAQCAtMCwwICsxLDEyNTAgQEAKKy8qLQorICogICBC U0QgTElDRU5TRQorICoKKyAqICAgQ29weXJpZ2h0KGMpIDIwMTYtMjAxNyBJbnRlbCBDb3Jwb3Jh dGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1 c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogICBtb2Rp ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnMKKyAqICAgYXJlIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291 cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNl LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgICAgdGhlIGRvY3VtZW50 YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgICAg ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3Jh dGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1 c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9t IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u CisgKgorICogICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRI RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor ICogICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB TEwgVEhFIENPUFlSSUdIVAorICogICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgU1BFQ0lBTCwgRVhFTVBM QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogICBM SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM T1NTIE9GIFVTRSwKKyAqICAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgIFRIRU9SWSBPRiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAgKElO Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP RiBUSEUgVVNFCisgKiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4K KyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRp by5oPgorCisjaW5jbHVkZSA8cnRlX2JyYW5jaF9wcmVkaWN0aW9uLmg+CisjaW5jbHVkZSA8cnRl X2RlYnVnLmg+CisjaW5jbHVkZSA8cnRlX2xjb3JlLmg+CisjaW5jbHVkZSA8cnRlX2xvZy5oPgor I2luY2x1ZGUgPHJ0ZV9tYWxsb2MuaD4KKyNpbmNsdWRlIDxydGVfbWVtY3B5Lmg+CisjaW5jbHVk ZSA8cnRlX21lbW9yeS5oPgorI2luY2x1ZGUgPHJ0ZV9tZW16b25lLmg+CisjaW5jbHVkZSA8cnRl X2VhbF9tZW1jb25maWcuaD4KKworI2luY2x1ZGUgIm9wZGxfcmluZy5oIgorI2luY2x1ZGUgIm9w ZGxfbG9nLmgiCisKKyNkZWZpbmUgTElCX05BTUUgIm9wZGxfcmluZyIKKworI2RlZmluZSBPUERM X05BTUVfU0laRSA2NAorCisKKyNkZWZpbmUgT1BETF9FVkVOVF9NQVNLICAoMHhGRkZGMDAwMDAw MEZGRkZGVUxMKQorCisvKiBUeXBlcyBvZiBkZXBlbmRlbmN5IGJldHdlZW4gc3RhZ2VzICovCitl bnVtIGRlcF90eXBlIHsKKwlERVBfTk9ORSA9IDAsICAvKiBubyBkZXBlbmRlbmN5ICovCisJREVQ X0RJUkVDVCwgIC8qIHN0YWdlIGhhcyBkaXJlY3QgZGVwZW5kZW5jeSAqLworCURFUF9JTkRJUkVD VCwgIC8qIGluLWRpcmVjdCBkZXBlbmRlbmN5IHRocm91Z2ggb3RoZXIgc3RhZ2UocykgKi8KKwlE RVBfU0VMRiwgIC8qIHN0YWdlIGRlcGVuZGVuY3kgb24gaXRzZWxmLCB1c2VkIHRvIGRldGVjdCBs b29wcyAqLworfTsKKworLyogU2hhcmVkIHNlY3Rpb24gb2Ygc3RhZ2Ugc3RhdGUuCisgKiBDYXJl IGlzIG5lZWRlZCB3aGVuIGFjY2Vzc2luZyBhbmQgdGhlIGxheW91dCBpcyBpbXBvcnRhbnQsIGVz cGVjaWFsbHkgdG8KKyAqIGxpbWl0IHRoZSBhZGphY2VudCBjYWNoZS1saW5lIEhXIHByZWZldGNo ZXIgZnJvbSBpbXBhY3RpbmcgcGVyZm9ybWFuY2UuCisgKi8KK3N0cnVjdCBzaGFyZWRfc3RhdGUg eworCS8qIExhc3Qga25vd24gbWluaW11bSBzZXF1ZW5jZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVz LCB1c2VkIGZvciBtdWx0aQorCSAqIHRocmVhZCBvcGVyYXRpb24KKwkgKi8KKwl1aW50MzJfdCBh dmFpbGFibGVfc2VxOworCWNoYXIgX3BhZDFbUlRFX0NBQ0hFX0xJTkVfU0laRSAqIDNdOworCXVp bnQzMl90IGhlYWQ7ICAvKiBIZWFkIHNlcXVlbmNlIG51bWJlciAoZm9yIG11bHRpIHRocmVhZCBv cGVyYXRpb24pICovCisJY2hhciBfcGFkMltSVEVfQ0FDSEVfTElORV9TSVpFICogM107CisJc3Ry dWN0IG9wZGxfc3RhZ2UgKnN0YWdlOyAgLyogYmFjayBwb2ludGVyICovCisJdWludDMyX3QgdGFp bDsgIC8qIFRhaWwgc2VxdWVuY2UgbnVtYmVyICovCisJY2hhciBfcGFkM1tSVEVfQ0FDSEVfTElO RV9TSVpFICogMl07Cit9IF9fcnRlX2NhY2hlX2FsaWduZWQ7CisKKy8qIEEgc3RydWN0dXJlIHRv IGtlZXAgdHJhY2sgb2YgInVuZmluaXNoZWQiIGNsYWltcy4gVGhpcyBpcyBvbmx5IHVzZWQgZm9y CisgKiBzdGFnZXMgdGhhdCBhcmUgdGhyZWFkc2FmZS4gRWFjaCBsY29yZSBhY2Nlc3NlcyBpdHMg b3duIGluc3RhbmNlIG9mIHRoaXMKKyAqIHN0cnVjdHVyZSB0byByZWNvcmQgdGhlIGVudHJpZXMg aXQgaGFzIGNsYWltZWQuIFRoaXMgYWxsb3dzIG9uZSBsY29yZSB0byBtYWtlCisgKiBtdWx0aXBs ZSBjbGFpbXMgd2l0aG91dCBiZWluZyBibG9ja2VkIGJ5IGFub3RoZXIuIFdoZW4gZGlzY2xhaW1p bmcgaXQgbW92ZXMKKyAqIGZvcndhcmQgdGhlIHNoYXJlZCB0YWlsIHdoZW4gdGhlIHNoYXJlZCB0 YWlsIG1hdGNoZXMgdGhlIHRhaWwgdmFsdWUgcmVjb3JkZWQKKyAqIGhlcmUuCisgKi8KK3N0cnVj dCBjbGFpbV9tYW5hZ2VyIHsKKwl1aW50MzJfdCBudW1fdG9fZGlzY2xhaW07CisJdWludDMyX3Qg bnVtX2NsYWltZWQ7CisJdWludDMyX3QgbWdyX2hlYWQ7CisJdWludDMyX3QgbWdyX3RhaWw7CisJ c3RydWN0IHsKKwkJdWludDMyX3QgaGVhZDsKKwkJdWludDMyX3QgdGFpbDsKKwl9IGNsYWltc1tP UERMX0RJU0NMQUlNU19QRVJfTENPUkVdOworfSBfX3J0ZV9jYWNoZV9hbGlnbmVkOworCisvKiBD b250ZXh0IGZvciBlYWNoIHN0YWdlIG9mIG9wZGxfcmluZy4KKyAqIENhbGN1bGF0aW9ucyBvbiBz ZXF1ZW5jZSBudW1iZXJzIG5lZWQgdG8gYmUgZG9uZSB3aXRoIG90aGVyIHVpbnQzMl90IHZhbHVl cworICogc28gdGhhdCByZXN1bHRzIGFyZSBtb2R1bHVzIDJeMzIsIGFuZCBub3QgdW5kZWZpbmVk LgorICovCitzdHJ1Y3Qgb3BkbF9zdGFnZSB7CisJc3RydWN0IG9wZGxfcmluZyAqdDsgIC8qIGJh Y2sgcG9pbnRlciwgc2V0IGF0IGluaXQgKi8KKwl1aW50MzJfdCBudW1fc2xvdHM7ICAvKiBOdW1i ZXIgb2Ygc2xvdHMgZm9yIGVudHJpZXMsIHNldCBhdCBpbml0ICovCisJdWludDMyX3QgaW5kZXg7 ICAvKiBJRCBmb3IgdGhpcyBzdGFnZSwgc2V0IGF0IGluaXQgKi8KKwlib29sIHRocmVhZHNhZmU7 ICAvKiBTZXQgdG8gMSBpZiB0aGlzIHN0YWdlIHN1cHBvcnRzIHRocmVhZHNhZmUgdXNlICovCisJ LyogTGFzdCBrbm93biBtaW4gc2VxIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgZm9yIHVzZWQgZm9y IHNpbmdsZSB0aHJlYWQKKwkgKiBvcGVyYXRpb24KKwkgKi8KKwl1aW50MzJfdCBhdmFpbGFibGVf c2VxOworCXVpbnQzMl90IGhlYWQ7ICAvKiBDdXJyZW50IGhlYWQgZm9yIHNpbmdsZS10aHJlYWQg b3BlcmF0aW9uICovCisJdWludDMyX3Qgc2hhZG93X2hlYWQ7ICAvKiBTaGFkb3cgaGVhZCBmb3Ig c2luZ2xlLXRocmVhZCBvcGVyYXRpb24gKi8KKwl1aW50MzJfdCBuYl9pbnN0YW5jZTsgIC8qIE51 bWJlciBvZiBpbnN0YW5jZXMgKi8KKwl1aW50MzJfdCBpbnN0YW5jZV9pZDsgIC8qIElEIG9mIHRo aXMgc3RhZ2UgaW5zdGFuY2UgKi8KKwl1aW50MTZfdCBudW1fY2xhaW1lZDsgIC8qIE51bWJlciBv ZiBzbG90cyBjbGFpbWVkICovCisJdWludDE2X3QgbnVtX2V2ZW50OwkJLyogTnVtYmVyIG9mIGV2 ZW50cyAqLworCXVpbnQzMl90IHNlcTsJCQkvKiBzZXF1ZW5jZSBudW1iZXIgICovCisJdWludDMy X3QgbnVtX2RlcHM7ICAvKiBOdW1iZXIgb2YgZGlyZWN0IGRlcGVuZGVuY2llcyAqLworCS8qIEtl ZXAgdHJhY2sgb2YgYWxsIGRlcGVuZGVuY2llcywgdXNlZCBkdXJpbmcgaW5pdCBvbmx5ICovCisJ ZW51bSBkZXBfdHlwZSAqZGVwX3RyYWNraW5nOworCS8qIERpcmVjdCBkZXBlbmRlbmNpZXMgb2Yg dGhpcyBzdGFnZSAqLworCXN0cnVjdCBzaGFyZWRfc3RhdGUgKipkZXBzOworCS8qIE90aGVyIHN0 YWdlcyByZWFkIHRoaXMhICovCisJc3RydWN0IHNoYXJlZF9zdGF0ZSBzaGFyZWQgX19ydGVfY2Fj aGVfYWxpZ25lZDsKKwkvKiBGb3IgbWFuYWdpbmcgZGlzY2xhaW1zIGluIG11bHRpLXRocmVhZGVk IHByb2Nlc3Npbmcgc3RhZ2VzICovCisJc3RydWN0IGNsYWltX21hbmFnZXIgcGVuZGluZ19kaXNj bGFpbXNbUlRFX01BWF9MQ09SRV0KKwkJCQkJICAgICAgIF9fcnRlX2NhY2hlX2FsaWduZWQ7Cit9 IF9fcnRlX2NhY2hlX2FsaWduZWQ7CisKKy8qIENvbnRleHQgZm9yIG9wZGxfcmluZyAqLworc3Ry dWN0IG9wZGxfcmluZyB7CisJY2hhciBuYW1lW09QRExfTkFNRV9TSVpFXTsgIC8qIE9QREwgcXVl dWUgaW5zdGFuY2UgbmFtZSAqLworCWludCBzb2NrZXQ7ICAvKiBOVU1BIHNvY2tldCB0aGF0IG1l bW9yeSBpcyBhbGxvY2F0ZWQgb24gKi8KKwl1aW50MzJfdCBudW1fc2xvdHM7ICAvKiBOdW1iZXIg b2Ygc2xvdHMgZm9yIGVudHJpZXMgKi8KKwl1aW50MzJfdCBtYXNrOyAgLyogTWFzayBmb3Igc2Vx dWVuY2UgbnVtYmVycyAobnVtX3Nsb3RzIC0gMSkgKi8KKwl1aW50MzJfdCBzbG90X3NpemU7ICAv KiBTaXplIG9mIGVhY2ggc2xvdCBpbiBieXRlcyAqLworCXVpbnQzMl90IG51bV9zdGFnZXM7ICAv KiBOdW1iZXIgb2Ygc3RhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkICovCisJdWludDMyX3QgbWF4 X251bV9zdGFnZXM7ICAvKiBNYXggbnVtYmVyIG9mIHN0YWdlcyAqLworCS8qIFN0YWdlcyBpbmRl eGVkIGJ5IElEICovCisJc3RydWN0IG9wZGxfc3RhZ2UgKnN0YWdlczsKKwkvKiBNZW1vcnkgZm9y IHN0b3Jpbmcgc2xvdCBkYXRhICovCisJdWludDhfdCBzbG90c1swXSBfX3J0ZV9jYWNoZV9hbGln bmVkOworfTsKKworCisvKiBSZXR1cm4gaW5wdXQgc3RhZ2Ugb2YgYSBvcGRsX3JpbmcgKi8KK3N0 YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHN0cnVjdCBvcGRsX3N0YWdlICoKK2lucHV0X3N0YWdl KGNvbnN0IHN0cnVjdCBvcGRsX3JpbmcgKnQpCit7CisJcmV0dXJuICZ0LT5zdGFnZXNbMF07Cit9 CisKKy8qIENoZWNrIGlmIGEgc3RhZ2UgaXMgdGhlIGlucHV0IHN0YWdlICovCitzdGF0aWMgX19y dGVfYWx3YXlzX2lubGluZSBib29sCitpc19pbnB1dF9zdGFnZShjb25zdCBzdHJ1Y3Qgb3BkbF9z dGFnZSAqcykKK3sKKwlyZXR1cm4gcy0+aW5kZXggPT0gMDsKK30KKworLyogR2V0IHNsb3QgcG9p bnRlciBmcm9tIHNlcXVlbmNlIG51bWJlciAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUg dm9pZCAqCitnZXRfc2xvdChjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0LCB1aW50MzJfdCBuKQor eworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpJnQtPnNsb3RzWyhuICYgdC0+bWFzaykgKiB0 LT5zbG90X3NpemVdOworfQorCisvKiBGaW5kIGhvdyBtYW55IGVudHJpZXMgYXJlIGF2YWlsYWJs ZSBmb3IgcHJvY2Vzc2luZyAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdWludDMyX3QK K2F2YWlsYWJsZShjb25zdCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcykKK3sKKwlpZiAocy0+dGhyZWFk c2FmZSA9PSB0cnVlKSB7CisJCXVpbnQzMl90IG4gPSBfX2F0b21pY19sb2FkX24oJnMtPnNoYXJl ZC5hdmFpbGFibGVfc2VxLAorCQkJCV9fQVRPTUlDX0FDUVVJUkUpIC0KKwkJCQlfX2F0b21pY19s b2FkX24oJnMtPnNoYXJlZC5oZWFkLAorCQkJCV9fQVRPTUlDX0FDUVVJUkUpOworCisJCS8qIFJl dHVybiAwIGlmIGF2YWlsYWJsZV9zZXEgbmVlZHMgdG8gYmUgdXBkYXRlZCAqLworCQlyZXR1cm4g KG4gPD0gcy0+bnVtX3Nsb3RzKSA/IG4gOiAwOworCX0KKworCS8qIFNpbmdsZSB0aHJlYWRlZCAq LworCXJldHVybiBzLT5hdmFpbGFibGVfc2VxIC0gcy0+aGVhZDsKK30KKworLyogUmVhZCBzZXF1 ZW5jZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIGFuZCBmaW5kIG1pbmltdW0gKi8KK3N0YXRpYyBf X3J0ZV9hbHdheXNfaW5saW5lIHZvaWQKK3VwZGF0ZV9hdmFpbGFibGVfc2VxKHN0cnVjdCBvcGRs X3N0YWdlICpzKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgdGhpc190YWlsID0gcy0+c2hh cmVkLnRhaWw7CisJdWludDMyX3QgbWluX3NlcSA9IF9fYXRvbWljX2xvYWRfbigmcy0+ZGVwc1sw XS0+dGFpbCwgX19BVE9NSUNfQUNRVUlSRSk7CisJLyogSW5wdXQgc3RhZ2Ugc2VxdWVuY2UgbnVt YmVycyBhcmUgZ3JlYXRlciB0aGFuIHRoZSBzZXF1ZW5jZSBudW1iZXJzIG9mCisJICogaXRzIGRl cGVuZGVuY2llcyBzbyBhbiBvZmZzZXQgb2YgdC0+bnVtX3Nsb3RzIGlzIG5lZWRlZCB3aGVuCisJ ICogY2FsY3VsYXRpbmcgYXZhaWxhYmxlIHNsb3RzIGFuZCBhbHNvIHRoZSBjb25kaXRpb24gd2hp Y2ggaXMgdXNlZCB0bworCSAqIGRldGVybWluZSB0aGUgZGVwZW5kZW5jaWVzIG1pbmltdW0gc2Vx dWVuY2UgbnVtYmVyIG11c3QgYmUgcmV2ZXJ0ZWQuCisJICovCisJdWludDMyX3Qgd3JhcDsKKwor CWlmIChpc19pbnB1dF9zdGFnZShzKSkgeworCQl3cmFwID0gcy0+bnVtX3Nsb3RzOworCQlmb3Ig KGkgPSAxOyBpIDwgcy0+bnVtX2RlcHM7IGkrKykgeworCQkJdWludDMyX3Qgc2VxID0gX19hdG9t aWNfbG9hZF9uKCZzLT5kZXBzW2ldLT50YWlsLAorCQkJCQlfX0FUT01JQ19BQ1FVSVJFKTsKKwkJ CWlmICgodGhpc190YWlsIC0gc2VxKSA+ICh0aGlzX3RhaWwgLSBtaW5fc2VxKSkKKwkJCQltaW5f c2VxID0gc2VxOworCQl9CisJfSBlbHNlIHsKKwkJd3JhcCA9IDA7CisJCWZvciAoaSA9IDE7IGkg PCBzLT5udW1fZGVwczsgaSsrKSB7CisJCQl1aW50MzJfdCBzZXEgPSBfX2F0b21pY19sb2FkX24o JnMtPmRlcHNbaV0tPnRhaWwsCisJCQkJCV9fQVRPTUlDX0FDUVVJUkUpOworCQkJaWYgKChzZXEg LSB0aGlzX3RhaWwpIDwgKG1pbl9zZXEgLSB0aGlzX3RhaWwpKQorCQkJCW1pbl9zZXEgPSBzZXE7 CisJCX0KKwl9CisKKwlpZiAocy0+dGhyZWFkc2FmZSA9PSBmYWxzZSkKKwkJcy0+YXZhaWxhYmxl X3NlcSA9IG1pbl9zZXEgKyB3cmFwOworCWVsc2UKKwkJX19hdG9taWNfc3RvcmVfbigmcy0+c2hh cmVkLmF2YWlsYWJsZV9zZXEsIG1pbl9zZXEgKyB3cmFwLAorCQkJCV9fQVRPTUlDX1JFTEVBU0Up OworfQorCisvKiBXYWl0IHVudGlsIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNsb3RzIHJlYWNo ZXMgbnVtYmVyIHJlcXVlc3RlZCAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZAor d2FpdF9mb3JfYXZhaWxhYmxlKHN0cnVjdCBvcGRsX3N0YWdlICpzLCB1aW50MzJfdCBuKQorewor CXdoaWxlIChhdmFpbGFibGUocykgPCBuKSB7CisJCXJ0ZV9wYXVzZSgpOworCQl1cGRhdGVfYXZh aWxhYmxlX3NlcShzKTsKKwl9Cit9CisKKy8qIFJldHVybiBudW1iZXIgb2Ygc2xvdHMgdG8gcHJv Y2VzcyBiYXNlZCBvbiBudW1iZXIgcmVxdWVzdGVkIGFuZCBtb2RlICovCitzdGF0aWMgX19ydGVf YWx3YXlzX2lubGluZSB1aW50MzJfdAorbnVtX3RvX3Byb2Nlc3Moc3RydWN0IG9wZGxfc3RhZ2Ug KnMsIHVpbnQzMl90IG4sIGJvb2wgYmxvY2spCit7CisJLyogRG9uJ3QgcmVhZCB0YWlsIHNlcXVl bmNlcyBvZiBkZXBlbmRlbmNpZXMgaWYgbm90IG5lZWRlZCAqLworCWlmIChhdmFpbGFibGUocykg Pj0gbikKKwkJcmV0dXJuIG47CisKKwl1cGRhdGVfYXZhaWxhYmxlX3NlcShzKTsKKworCWlmIChi bG9jayA9PSBmYWxzZSkgeworCQl1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZShzKTsKKworCQlp ZiAoYXZhaWwgPT0gMCkgeworCQkJcnRlX3BhdXNlKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQly ZXR1cm4gKGF2YWlsIDw9IG4pID8gYXZhaWwgOiBuOworCX0KKworCWlmICh1bmxpa2VseShuID4g cy0+bnVtX3Nsb3RzKSkgeworCQlQTURfRFJWX0xPRyhFUlIsICIldSBlbnRyaWVzIGlzIG1vcmUg dGhhbiBtYXggKCV1KSIsIG4sIHMtPm51bV9zbG90cyk7CisJCXJldHVybiAwOyAgLyogQXZvaWQg aW5maW5pdGUgbG9vcCAqLworCX0KKwkvKiBibG9ja2luZyAqLworCXdhaXRfZm9yX2F2YWlsYWJs ZShzLCBuKTsKKwlyZXR1cm4gbjsKK30KKworLyogQ29weSBlbnRyaWVzIGluIHRvIHNsb3RzIHdp dGggd3JhcC1hcm91bmQgKi8KK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQKK2NvcHlf ZW50cmllc19pbihzdHJ1Y3Qgb3BkbF9yaW5nICp0LCB1aW50MzJfdCBzdGFydCwgY29uc3Qgdm9p ZCAqZW50cmllcywKKwkJdWludDMyX3QgbnVtX2VudHJpZXMpCit7CisJdWludDMyX3Qgc2xvdF9z aXplID0gdC0+c2xvdF9zaXplOworCXVpbnQzMl90IHNsb3RfaW5kZXggPSBzdGFydCAmIHQtPm1h c2s7CisKKwlpZiAoc2xvdF9pbmRleCArIG51bV9lbnRyaWVzIDw9IHQtPm51bV9zbG90cykgewor CQlydGVfbWVtY3B5KGdldF9zbG90KHQsIHN0YXJ0KSwgZW50cmllcywKKwkJCQludW1fZW50cmll cyAqIHNsb3Rfc2l6ZSk7CisJfSBlbHNlIHsKKwkJdWludDMyX3Qgc3BsaXQgPSB0LT5udW1fc2xv dHMgLSBzbG90X2luZGV4OworCisJCXJ0ZV9tZW1jcHkoZ2V0X3Nsb3QodCwgc3RhcnQpLCBlbnRy aWVzLCBzcGxpdCAqIHNsb3Rfc2l6ZSk7CisJCXJ0ZV9tZW1jcHkoZ2V0X3Nsb3QodCwgMCksCisJ CQkJUlRFX1BUUl9BREQoZW50cmllcywgc3BsaXQgKiBzbG90X3NpemUpLAorCQkJCShudW1fZW50 cmllcyAtIHNwbGl0KSAqIHNsb3Rfc2l6ZSk7CisJfQorfQorCisvKiBDb3B5IGVudHJpZXMgb3V0 IGZyb20gc2xvdHMgd2l0aCB3cmFwLWFyb3VuZCAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxp bmUgdm9pZAorY29weV9lbnRyaWVzX291dChzdHJ1Y3Qgb3BkbF9yaW5nICp0LCB1aW50MzJfdCBz dGFydCwgdm9pZCAqZW50cmllcywKKwkJdWludDMyX3QgbnVtX2VudHJpZXMpCit7CisJdWludDMy X3Qgc2xvdF9zaXplID0gdC0+c2xvdF9zaXplOworCXVpbnQzMl90IHNsb3RfaW5kZXggPSBzdGFy dCAmIHQtPm1hc2s7CisKKwlpZiAoc2xvdF9pbmRleCArIG51bV9lbnRyaWVzIDw9IHQtPm51bV9z bG90cykgeworCQlydGVfbWVtY3B5KGVudHJpZXMsIGdldF9zbG90KHQsIHN0YXJ0KSwKKwkJCQlu dW1fZW50cmllcyAqIHNsb3Rfc2l6ZSk7CisJfSBlbHNlIHsKKwkJdWludDMyX3Qgc3BsaXQgPSB0 LT5udW1fc2xvdHMgLSBzbG90X2luZGV4OworCisJCXJ0ZV9tZW1jcHkoZW50cmllcywgZ2V0X3Ns b3QodCwgc3RhcnQpLCBzcGxpdCAqIHNsb3Rfc2l6ZSk7CisJCXJ0ZV9tZW1jcHkoUlRFX1BUUl9B REQoZW50cmllcywgc3BsaXQgKiBzbG90X3NpemUpLAorCQkJCWdldF9zbG90KHQsIDApLAorCQkJ CShudW1fZW50cmllcyAtIHNwbGl0KSAqIHNsb3Rfc2l6ZSk7CisJfQorfQorCisvKiBJbnB1dCBm dW5jdGlvbiBvcHRpbWlzZWQgZm9yIHNpbmdsZSB0aHJlYWQgKi8KK3N0YXRpYyBfX3J0ZV9hbHdh eXNfaW5saW5lIHVpbnQzMl90CitvcGRsX3JpbmdfaW5wdXRfc2luZ2xldGhyZWFkKHN0cnVjdCBv cGRsX3JpbmcgKnQsIGNvbnN0IHZvaWQgKmVudHJpZXMsCisJCXVpbnQzMl90IG51bV9lbnRyaWVz LCBib29sIGJsb2NrKQoreworCXN0cnVjdCBvcGRsX3N0YWdlICpzID0gaW5wdXRfc3RhZ2UodCk7 CisJdWludDMyX3QgaGVhZCA9IHMtPmhlYWQ7CisKKwludW1fZW50cmllcyA9IG51bV90b19wcm9j ZXNzKHMsIG51bV9lbnRyaWVzLCBibG9jayk7CisJaWYgKG51bV9lbnRyaWVzID09IDApCisJCXJl dHVybiAwOworCisJY29weV9lbnRyaWVzX2luKHQsIGhlYWQsIGVudHJpZXMsIG51bV9lbnRyaWVz KTsKKworCXMtPmhlYWQgKz0gbnVtX2VudHJpZXM7CisJX19hdG9taWNfc3RvcmVfbigmcy0+c2hh cmVkLnRhaWwsIHMtPmhlYWQsIF9fQVRPTUlDX1JFTEVBU0UpOworCisJcmV0dXJuIG51bV9lbnRy aWVzOworfQorCisvKiBDb252ZXJ0IGhlYWQgYW5kIHRhaWwgb2YgY2xhaW1fbWFuYWdlciBpbnRv IHZhbGlkIGluZGV4ICovCitzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1aW50MzJfdAorY2xh aW1fbWdyX2luZGV4KHVpbnQzMl90IG4pCit7CisJcmV0dXJuIG4gJiAoT1BETF9ESVNDTEFJTVNf UEVSX0xDT1JFIC0gMSk7Cit9CisKKy8qIENoZWNrIGlmIHRoZXJlIGFyZSBhdmFpbGFibGUgc2xv dHMgaW4gY2xhaW1fbWFuYWdlciAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgYm9vbAor Y2xhaW1fbWdyX2F2YWlsYWJsZShzdHJ1Y3QgY2xhaW1fbWFuYWdlciAqbWdyKQoreworCXJldHVy biAobWdyLT5tZ3JfaGVhZCA8IChtZ3ItPm1ncl90YWlsICsgT1BETF9ESVNDTEFJTVNfUEVSX0xD T1JFKSkgPworCQkJdHJ1ZSA6IGZhbHNlOworfQorCisvKiBSZWNvcmQgYSBuZXcgY2xhaW0uIE9u bHkgdXNlIGFmdGVyIGZpcnN0IGNoZWNraW5nIGFuIGVudHJ5IGlzIGF2YWlsYWJsZSAqLworc3Rh dGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZAorY2xhaW1fbWdyX2FkZChzdHJ1Y3QgY2xhaW1f bWFuYWdlciAqbWdyLCB1aW50MzJfdCB0YWlsLCB1aW50MzJfdCBoZWFkKQoreworCWlmICgobWdy LT5tZ3JfaGVhZCAhPSBtZ3ItPm1ncl90YWlsKSAmJgorCQkJKG1nci0+Y2xhaW1zW2NsYWltX21n cl9pbmRleChtZ3ItPm1ncl9oZWFkIC0gMSldLmhlYWQgPT0KKwkJCXRhaWwpKSB7CisJCS8qIENv bWJpbmUgd2l0aCBwcmV2aW91cyBjbGFpbSAqLworCQltZ3ItPmNsYWltc1tjbGFpbV9tZ3JfaW5k ZXgobWdyLT5tZ3JfaGVhZCAtIDEpXS5oZWFkID0gaGVhZDsKKwl9IGVsc2UgeworCQltZ3ItPmNs YWltc1tjbGFpbV9tZ3JfaW5kZXgobWdyLT5tZ3JfaGVhZCldLmhlYWQgPSBoZWFkOworCQltZ3It PmNsYWltc1tjbGFpbV9tZ3JfaW5kZXgobWdyLT5tZ3JfaGVhZCldLnRhaWwgPSB0YWlsOworCQlt Z3ItPm1ncl9oZWFkKys7CisJfQorCisJbWdyLT5udW1fY2xhaW1lZCArPSAoaGVhZCAtIHRhaWwp OworfQorCisvKiBSZWFkIHRoZSBvbGRlc3QgcmVjb3JkZWQgY2xhaW0gKi8KK3N0YXRpYyBfX3J0 ZV9hbHdheXNfaW5saW5lIGJvb2wKK2NsYWltX21ncl9yZWFkKHN0cnVjdCBjbGFpbV9tYW5hZ2Vy ICptZ3IsIHVpbnQzMl90ICp0YWlsLCB1aW50MzJfdCAqaGVhZCkKK3sKKwlpZiAobWdyLT5tZ3Jf aGVhZCA9PSBtZ3ItPm1ncl90YWlsKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqaGVhZCA9IG1nci0+ Y2xhaW1zW2NsYWltX21ncl9pbmRleChtZ3ItPm1ncl90YWlsKV0uaGVhZDsKKwkqdGFpbCA9IG1n ci0+Y2xhaW1zW2NsYWltX21ncl9pbmRleChtZ3ItPm1ncl90YWlsKV0udGFpbDsKKwlyZXR1cm4g dHJ1ZTsKK30KKworLyogUmVtb3ZlIHRoZSBvbGRlc3QgcmVjb3JkZWQgY2xhaW0uIE9ubHkgdXNl IGFmdGVyIGZpcnN0IHJlYWRpbmcgdGhlIGVudHJ5ICovCitzdGF0aWMgX19ydGVfYWx3YXlzX2lu bGluZSB2b2lkCitjbGFpbV9tZ3JfcmVtb3ZlKHN0cnVjdCBjbGFpbV9tYW5hZ2VyICptZ3IpCit7 CisJbWdyLT5udW1fY2xhaW1lZCAtPSAobWdyLT5jbGFpbXNbY2xhaW1fbWdyX2luZGV4KG1nci0+ bWdyX3RhaWwpXS5oZWFkIC0KKwkJCW1nci0+Y2xhaW1zW2NsYWltX21ncl9pbmRleChtZ3ItPm1n cl90YWlsKV0udGFpbCk7CisJbWdyLT5tZ3JfdGFpbCsrOworfQorCisvKiBVcGRhdGUgdGFpbCBp biB0aGUgb2xkZXN0IGNsYWltLiBPbmx5IHVzZSBhZnRlciBmaXJzdCByZWFkaW5nIHRoZSBlbnRy eSAqLworc3RhdGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZAorY2xhaW1fbWdyX21vdmVfdGFp bChzdHJ1Y3QgY2xhaW1fbWFuYWdlciAqbWdyLCB1aW50MzJfdCBudW1fZW50cmllcykKK3sKKwlt Z3ItPm51bV9jbGFpbWVkIC09IG51bV9lbnRyaWVzOworCW1nci0+Y2xhaW1zW2NsYWltX21ncl9p bmRleChtZ3ItPm1ncl90YWlsKV0udGFpbCArPSBudW1fZW50cmllczsKK30KKworc3RhdGljIF9f cnRlX2Fsd2F5c19pbmxpbmUgdm9pZAorb3BkbF9zdGFnZV9kaXNjbGFpbV9tdWx0aXRocmVhZF9u KHN0cnVjdCBvcGRsX3N0YWdlICpzLAorCQl1aW50MzJfdCBudW1fZW50cmllcywgYm9vbCBibG9j aykKK3sKKwlzdHJ1Y3QgY2xhaW1fbWFuYWdlciAqZGlzY2xhaW1zID0gJnMtPnBlbmRpbmdfZGlz Y2xhaW1zW3J0ZV9sY29yZV9pZCgpXTsKKwl1aW50MzJfdCBoZWFkOworCXVpbnQzMl90IHRhaWw7 CisKKwl3aGlsZSAobnVtX2VudHJpZXMpIHsKKwkJYm9vbCByZXQgPSBjbGFpbV9tZ3JfcmVhZChk aXNjbGFpbXMsICZ0YWlsLCAmaGVhZCk7CisKKwkJaWYgKHJldCA9PSBmYWxzZSkKKwkJCWJyZWFr OyAgLyogbm90aGluZyBpcyBjbGFpbWVkICovCisJCS8qIFRoZXJlIHNob3VsZCBiZSBubyByYWNl IGNvbmRpdGlvbiBoZXJlLiBJZiBzaGFyZWQudGFpbAorCQkgKiBtYXRjaGVzLCBubyBvdGhlciBj b3JlIGNhbiB1cGRhdGUgaXQgdW50aWwgdGhpcyBvbmUgZG9lcy4KKwkJICovCisJCWlmIChfX2F0 b21pY19sb2FkX24oJnMtPnNoYXJlZC50YWlsLCBfX0FUT01JQ19BQ1FVSVJFKSA9PQorCQkJCXRh aWwpIHsKKwkJCWlmIChudW1fZW50cmllcyA+PSAoaGVhZCAtIHRhaWwpKSB7CisJCQkJY2xhaW1f bWdyX3JlbW92ZShkaXNjbGFpbXMpOworCQkJCV9fYXRvbWljX3N0b3JlX24oJnMtPnNoYXJlZC50 YWlsLCBoZWFkLAorCQkJCQkJX19BVE9NSUNfUkVMRUFTRSk7CisJCQkJbnVtX2VudHJpZXMgLT0g KGhlYWQgLSB0YWlsKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xhaW1fbWdyX21vdmVfdGFpbChkaXNj bGFpbXMsIG51bV9lbnRyaWVzKTsKKwkJCQlfX2F0b21pY19zdG9yZV9uKCZzLT5zaGFyZWQudGFp bCwKKwkJCQkJCW51bV9lbnRyaWVzICsgdGFpbCwKKwkJCQkJCV9fQVRPTUlDX1JFTEVBU0UpOwor CQkJCW51bV9lbnRyaWVzID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChibG9jayA9PSBmYWxzZSkK KwkJCWJyZWFrOyAgLyogYmxvY2tlZCBieSBvdGhlciB0aHJlYWQgKi8KKwkJLyogS2VlcCBnb2lu ZyB1bnRpbCBudW1fZW50cmllcyBhcmUgZGlzY2xhaW1lZC4gKi8KKwkJcnRlX3BhdXNlKCk7CisJ fQorCisJZGlzY2xhaW1zLT5udW1fdG9fZGlzY2xhaW0gPSBudW1fZW50cmllczsKK30KKworLyog TW92ZSBoZWFkIGF0b21pY2FsbHksIHJldHVybmluZyBudW1iZXIgb2YgZW50cmllcyBhdmFpbGFi bGUgdG8gcHJvY2VzcyBhbmQKKyAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBoZWFkLiBGb3Igbm9u LWlucHV0IHN0YWdlcywgdGhlIGNsYWltIGlzIHJlY29yZGVkCisgKiBzbyB0aGF0IHRoZSB0YWls IGNhbiBiZSB1cGRhdGVkIGxhdGVyIGJ5IG9wZGxfc3RhZ2VfZGlzY2xhaW0oKS4KKyAqLworc3Rh dGljIF9fcnRlX2Fsd2F5c19pbmxpbmUgdm9pZAorbW92ZV9oZWFkX2F0b21pY2FsbHkoc3RydWN0 IG9wZGxfc3RhZ2UgKnMsIHVpbnQzMl90ICpudW1fZW50cmllcywKKwkJdWludDMyX3QgKm9sZF9o ZWFkLCBib29sIGJsb2NrLCBib29sIGNsYWltX2Z1bmMpCit7CisJdWludDMyX3Qgb3JpZ19udW1f ZW50cmllcyA9ICpudW1fZW50cmllczsKKwl1aW50MzJfdCByZXQ7CisJc3RydWN0IGNsYWltX21h bmFnZXIgKmRpc2NsYWltcyA9ICZzLT5wZW5kaW5nX2Rpc2NsYWltc1tydGVfbGNvcmVfaWQoKV07 CisKKwkvKiBBdHRlbXB0IHRvIGRpc2NsYWltIGFueSBvdXRzdGFuZGluZyBjbGFpbXMgKi8KKwlv cGRsX3N0YWdlX2Rpc2NsYWltX211bHRpdGhyZWFkX24ocywgZGlzY2xhaW1zLT5udW1fdG9fZGlz Y2xhaW0sCisJCQlmYWxzZSk7CisKKwkqb2xkX2hlYWQgPSBfX2F0b21pY19sb2FkX24oJnMtPnNo YXJlZC5oZWFkLCBfX0FUT01JQ19BQ1FVSVJFKTsKKwl3aGlsZSAodHJ1ZSkgeworCQlib29sIHN1 Y2Nlc3M7CisJCS8qIElmIGNhbGxlZCBieSBvcGRsX3JpbmdfaW5wdXQoKSwgY2xhaW0gZG9lcyBu b3QgbmVlZCB0byBiZQorCQkgKiByZWNvcmRlZCwgYXMgdGhlcmUgd2lsbCBiZSBubyBkaXNjbGFp bS4KKwkJICovCisJCWlmIChjbGFpbV9mdW5jKSB7CisJCQkvKiBDaGVjayB0aGF0IHRoZSBjbGFp bSBjYW4gYmUgcmVjb3JkZWQgKi8KKwkJCXJldCA9IGNsYWltX21ncl9hdmFpbGFibGUoZGlzY2xh aW1zKTsKKwkJCWlmIChyZXQgPT0gZmFsc2UpIHsKKwkJCQkvKiBleGl0IG91dCBpZiBjbGFpbSBj YW4ndCBiZSByZWNvcmRlZCAqLworCQkJCSpudW1fZW50cmllcyA9IDA7CisJCQkJcmV0dXJuOwor CQkJfQorCQl9CisKKwkJKm51bV9lbnRyaWVzID0gbnVtX3RvX3Byb2Nlc3Mocywgb3JpZ19udW1f ZW50cmllcywgYmxvY2spOworCQlpZiAoKm51bV9lbnRyaWVzID09IDApCisJCQlyZXR1cm47CisK KwkJc3VjY2VzcyA9IF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfbigmcy0+c2hhcmVkLmhlYWQs IG9sZF9oZWFkLAorCQkJCSpvbGRfaGVhZCArICpudW1fZW50cmllcywKKwkJCQl0cnVlLCAgLyog bWF5IGZhaWwgc3B1cmlvdXNseSAqLworCQkJCV9fQVRPTUlDX1JFTEVBU0UsICAvKiBtZW1vcnkg b3JkZXIgb24gc3VjY2VzcyAqLworCQkJCV9fQVRPTUlDX0FDUVVJUkUpOyAgLyogbWVtb3J5IG9y ZGVyIG9uIGZhaWwgKi8KKwkJaWYgKGxpa2VseShzdWNjZXNzKSkKKwkJCWJyZWFrOworCQlydGVf cGF1c2UoKTsKKwl9CisKKwlpZiAoY2xhaW1fZnVuYykKKwkJLyogU3RvcmUgdGhlIGNsYWltIHJl Y29yZCAqLworCQljbGFpbV9tZ3JfYWRkKGRpc2NsYWltcywgKm9sZF9oZWFkLCAqb2xkX2hlYWQg KyAqbnVtX2VudHJpZXMpOworfQorCisvKiBJbnB1dCBmdW5jdGlvbiB0aGF0IHN1cHBvcnRzIG11 bHRpcGxlIHRocmVhZHMgKi8KK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVpbnQzMl90Citv cGRsX3JpbmdfaW5wdXRfbXVsdGl0aHJlYWQoc3RydWN0IG9wZGxfcmluZyAqdCwgY29uc3Qgdm9p ZCAqZW50cmllcywKKwkJdWludDMyX3QgbnVtX2VudHJpZXMsIGJvb2wgYmxvY2spCit7CisJc3Ry dWN0IG9wZGxfc3RhZ2UgKnMgPSBpbnB1dF9zdGFnZSh0KTsKKwl1aW50MzJfdCBvbGRfaGVhZDsK KworCW1vdmVfaGVhZF9hdG9taWNhbGx5KHMsICZudW1fZW50cmllcywgJm9sZF9oZWFkLCBibG9j aywgZmFsc2UpOworCWlmIChudW1fZW50cmllcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWNvcHlf ZW50cmllc19pbih0LCBvbGRfaGVhZCwgZW50cmllcywgbnVtX2VudHJpZXMpOworCisJLyogSWYg YW5vdGhlciB0aHJlYWQgc3RhcnRlZCBpbnB1dHRpbmcgYmVmb3JlIHRoaXMgb25lLCBidXQgaGFz bid0CisJICogZmluaXNoZWQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgdG8g dXBkYXRlIHRoZSB0YWlsLgorCSAqLworCXdoaWxlICh1bmxpa2VseShfX2F0b21pY19sb2FkX24o JnMtPnNoYXJlZC50YWlsLCBfX0FUT01JQ19BQ1FVSVJFKSAhPQorCQkJb2xkX2hlYWQpKQorCQly dGVfcGF1c2UoKTsKKworCV9fYXRvbWljX3N0b3JlX24oJnMtPnNoYXJlZC50YWlsLCBvbGRfaGVh ZCArIG51bV9lbnRyaWVzLAorCQkJX19BVE9NSUNfUkVMRUFTRSk7CisKKwlyZXR1cm4gbnVtX2Vu dHJpZXM7Cit9CisKK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHVpbnQzMl90CitvcGRsX2Zp cnN0X2VudHJ5X2lkKHVpbnQzMl90IHN0YXJ0X3NlcSwgdWludDhfdCBuYl9wX2xjb3JlcywKKwkJ dWludDhfdCB0aGlzX2xjb3JlKQoreworCXJldHVybiAoKG5iX3BfbGNvcmVzIDw9IDEpID8gMCA6 CisJCQkobmJfcF9sY29yZXMgLSAoc3RhcnRfc2VxICUgbmJfcF9sY29yZXMpICsgdGhpc19sY29y ZSkgJQorCQkJbmJfcF9sY29yZXMpOworfQorCisvKiBDbGFpbSBzbG90cyB0byBwcm9jZXNzLCBv cHRpbWlzZWQgZm9yIHNpbmdsZS10aHJlYWQgb3BlcmF0aW9uICovCitzdGF0aWMgX19ydGVfYWx3 YXlzX2lubGluZSB1aW50MzJfdAorb3BkbF9zdGFnZV9jbGFpbV9zaW5nbGV0aHJlYWQoc3RydWN0 IG9wZGxfc3RhZ2UgKnMsIHZvaWQgKmVudHJpZXMsCisJCXVpbnQzMl90IG51bV9lbnRyaWVzLCB1 aW50MzJfdCAqc2VxLCBib29sIGJsb2NrLCBib29sIGF0b21pYykKK3sKKwl1aW50MzJfdCBpID0g MCwgaiA9IDAsICBvZmZzZXQ7CisJdm9pZCAqZ2V0X3Nsb3RzOworCXN0cnVjdCBydGVfZXZlbnQg KmV2OworCVJURV9TRVRfVVNFRChzZXEpOworCXN0cnVjdCBvcGRsX3JpbmcgKnQgPSBzLT50Owor CXVpbnQ4X3QgKmVudHJpZXNfb2Zmc2V0ID0gKHVpbnQ4X3QgKillbnRyaWVzOworCisJaWYgKCFh dG9taWMpIHsKKworCQlvZmZzZXQgPSBvcGRsX2ZpcnN0X2VudHJ5X2lkKHMtPnNlcSwgcy0+bmJf aW5zdGFuY2UsCisJCQkJcy0+aW5zdGFuY2VfaWQpOworCisJCW51bV9lbnRyaWVzID0gcy0+bmJf aW5zdGFuY2UgKiBudW1fZW50cmllczsKKworCQludW1fZW50cmllcyA9IG51bV90b19wcm9jZXNz KHMsIG51bV9lbnRyaWVzLCBibG9jayk7CisKKwkJZm9yICg7IG9mZnNldCA8IG51bV9lbnRyaWVz OyBvZmZzZXQgKz0gcy0+bmJfaW5zdGFuY2UpIHsKKwkJCWdldF9zbG90cyA9IGdldF9zbG90KHQs IHMtPmhlYWQgKyBvZmZzZXQpOworCQkJbWVtY3B5KGVudHJpZXNfb2Zmc2V0LCBnZXRfc2xvdHMs IHQtPnNsb3Rfc2l6ZSk7CisJCQllbnRyaWVzX29mZnNldCArPSB0LT5zbG90X3NpemU7CisJCQlp Kys7CisJCX0KKwl9IGVsc2UgeworCQludW1fZW50cmllcyA9IG51bV90b19wcm9jZXNzKHMsIG51 bV9lbnRyaWVzLCBibG9jayk7CisKKwkJZm9yIChqID0gMDsgaiA8IG51bV9lbnRyaWVzOyBqKysp IHsKKwkJCWV2ID0gKHN0cnVjdCBydGVfZXZlbnQgKilnZXRfc2xvdCh0LCBzLT5oZWFkK2opOwor CQkJaWYgKChldi0+Zmxvd19pZCVzLT5uYl9pbnN0YW5jZSkgPT0gcy0+aW5zdGFuY2VfaWQpIHsK KwkJCQltZW1jcHkoZW50cmllc19vZmZzZXQsIGV2LCB0LT5zbG90X3NpemUpOworCQkJCWVudHJp ZXNfb2Zmc2V0ICs9IHQtPnNsb3Rfc2l6ZTsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisJcy0+ c2hhZG93X2hlYWQgPSBzLT5oZWFkOworCXMtPmhlYWQgKz0gbnVtX2VudHJpZXM7CisJcy0+bnVt X2NsYWltZWQgPSBudW1fZW50cmllczsKKwlzLT5udW1fZXZlbnQgPSBpOworCisJLyogYXV0b21h dGljYWxseSBkaXNjbGFpbSBlbnRyaWVzIGlmIG51bWJlciBvZiBydGVfZXZlbnRzIGlzIHplcm8g Ki8KKwlpZiAodW5saWtlbHkoaSA9PSAwKSkKKwkJb3BkbF9zdGFnZV9kaXNjbGFpbShzLCAwLCBm YWxzZSk7CisKKwlyZXR1cm4gaTsKK30KKworLyogVGhyZWFkLXNhZmUgdmVyc2lvbiBvZiBmdW5j dGlvbiB0byBjbGFpbSBzbG90cyBmb3IgcHJvY2Vzc2luZyAqLworc3RhdGljIF9fcnRlX2Fsd2F5 c19pbmxpbmUgdWludDMyX3QKK29wZGxfc3RhZ2VfY2xhaW1fbXVsdGl0aHJlYWQoc3RydWN0IG9w ZGxfc3RhZ2UgKnMsIHZvaWQgKmVudHJpZXMsCisJCXVpbnQzMl90IG51bV9lbnRyaWVzLCB1aW50 MzJfdCAqc2VxLCBib29sIGJsb2NrKQoreworCXVpbnQzMl90IG9sZF9oZWFkOworCXN0cnVjdCBv cGRsX3JpbmcgKnQgPSBzLT50OworCXVpbnQzMl90IGkgPSAwLCBvZmZzZXQ7CisJdWludDhfdCAq ZW50cmllc19vZmZzZXQgPSAodWludDhfdCAqKWVudHJpZXM7CisKKwlvZmZzZXQgPSBvcGRsX2Zp cnN0X2VudHJ5X2lkKCpzZXEsIHMtPm5iX2luc3RhbmNlLCBzLT5pbnN0YW5jZV9pZCk7CisJbnVt X2VudHJpZXMgPSBvZmZzZXQgKyAocy0+bmJfaW5zdGFuY2UgKiBudW1fZW50cmllcyk7CisKKwlt b3ZlX2hlYWRfYXRvbWljYWxseShzLCAmbnVtX2VudHJpZXMsICZvbGRfaGVhZCwgYmxvY2ssIHRy dWUpOworCisJZm9yICg7IG9mZnNldCA8IG51bV9lbnRyaWVzOyBvZmZzZXQgKz0gcy0+bmJfaW5z dGFuY2UpIHsKKwkJbWVtY3B5KGVudHJpZXNfb2Zmc2V0LCBnZXRfc2xvdCh0LCBzLT5oZWFkICsg b2Zmc2V0KSwKKwkJCXQtPnNsb3Rfc2l6ZSk7CisJCWVudHJpZXNfb2Zmc2V0ICs9IHQtPnNsb3Rf c2l6ZTsKKwkJaSsrOworCX0KKwlpZiAoc2VxICE9IE5VTEwpCisJCSpzZXEgPSBvbGRfaGVhZDsK KworCXJldHVybiBpOworfQorCisvKiBDbGFpbSBhbmQgY29weSBzbG90IHBvaW50ZXJzLCBvcHRp bWlzZWQgZm9yIHNpbmdsZS10aHJlYWQgb3BlcmF0aW9uICovCitzdGF0aWMgX19ydGVfYWx3YXlz X2lubGluZSB1aW50MzJfdAorb3BkbF9zdGFnZV9jbGFpbV9jb3B5X3NpbmdsZXRocmVhZChzdHJ1 Y3Qgb3BkbF9zdGFnZSAqcywgdm9pZCAqZW50cmllcywKKwkJdWludDMyX3QgbnVtX2VudHJpZXMs IHVpbnQzMl90ICpzZXEsIGJvb2wgYmxvY2spCit7CisJbnVtX2VudHJpZXMgPSBudW1fdG9fcHJv Y2VzcyhzLCBudW1fZW50cmllcywgYmxvY2spOworCWlmIChudW1fZW50cmllcyA9PSAwKQorCQly ZXR1cm4gMDsKKwljb3B5X2VudHJpZXNfb3V0KHMtPnQsIHMtPmhlYWQsIGVudHJpZXMsIG51bV9l bnRyaWVzKTsKKwlpZiAoc2VxICE9IE5VTEwpCisJCSpzZXEgPSBzLT5oZWFkOworCXMtPmhlYWQg Kz0gbnVtX2VudHJpZXM7CisJcmV0dXJuIG51bV9lbnRyaWVzOworfQorCisvKiBUaHJlYWQtc2Fm ZSB2ZXJzaW9uIG9mIGZ1bmN0aW9uIHRvIGNsYWltIGFuZCBjb3B5IHBvaW50ZXJzIHRvIHNsb3Rz ICovCitzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1aW50MzJfdAorb3BkbF9zdGFnZV9jbGFp bV9jb3B5X211bHRpdGhyZWFkKHN0cnVjdCBvcGRsX3N0YWdlICpzLCB2b2lkICplbnRyaWVzLAor CQl1aW50MzJfdCBudW1fZW50cmllcywgdWludDMyX3QgKnNlcSwgYm9vbCBibG9jaykKK3sKKwl1 aW50MzJfdCBvbGRfaGVhZDsKKworCW1vdmVfaGVhZF9hdG9taWNhbGx5KHMsICZudW1fZW50cmll cywgJm9sZF9oZWFkLCBibG9jaywgdHJ1ZSk7CisJaWYgKG51bV9lbnRyaWVzID09IDApCisJCXJl dHVybiAwOworCWNvcHlfZW50cmllc19vdXQocy0+dCwgb2xkX2hlYWQsIGVudHJpZXMsIG51bV9l bnRyaWVzKTsKKwlpZiAoc2VxICE9IE5VTEwpCisJCSpzZXEgPSBvbGRfaGVhZDsKKwlyZXR1cm4g bnVtX2VudHJpZXM7Cit9CisKK3N0YXRpYyBfX3J0ZV9hbHdheXNfaW5saW5lIHZvaWQKK29wZGxf c3RhZ2VfZGlzY2xhaW1fc2luZ2xldGhyZWFkX24oc3RydWN0IG9wZGxfc3RhZ2UgKnMsCisJCXVp bnQzMl90IG51bV9lbnRyaWVzKQoreworCXVpbnQzMl90IG9sZF90YWlsID0gcy0+c2hhcmVkLnRh aWw7CisKKwlpZiAodW5saWtlbHkobnVtX2VudHJpZXMgPiAocy0+aGVhZCAtIG9sZF90YWlsKSkp IHsKKwkJUE1EX0RSVl9MT0coV0FSTklORywgIkF0dGVtcHQgdG8gZGlzY2xhaW0gKCV1KSBtb3Jl IHRoYW4gY2xhaW1lZCAoJXUpIiwKKwkJCQludW1fZW50cmllcywgcy0+aGVhZCAtIG9sZF90YWls KTsKKwkJbnVtX2VudHJpZXMgPSBzLT5oZWFkIC0gb2xkX3RhaWw7CisJfQorCV9fYXRvbWljX3N0 b3JlX24oJnMtPnNoYXJlZC50YWlsLCBudW1fZW50cmllcyArIG9sZF90YWlsLAorCQkJX19BVE9N SUNfUkVMRUFTRSk7Cit9CisKK3VpbnQzMl90CitvcGRsX3JpbmdfaW5wdXQoc3RydWN0IG9wZGxf cmluZyAqdCwgY29uc3Qgdm9pZCAqZW50cmllcywgdWludDMyX3QgbnVtX2VudHJpZXMsCisJCWJv b2wgYmxvY2spCit7CisJaWYgKGlucHV0X3N0YWdlKHQpLT50aHJlYWRzYWZlID09IGZhbHNlKQor CQlyZXR1cm4gb3BkbF9yaW5nX2lucHV0X3NpbmdsZXRocmVhZCh0LCBlbnRyaWVzLCBudW1fZW50 cmllcywKKwkJCQlibG9jayk7CisJZWxzZQorCQlyZXR1cm4gb3BkbF9yaW5nX2lucHV0X211bHRp dGhyZWFkKHQsIGVudHJpZXMsIG51bV9lbnRyaWVzLAorCQkJCWJsb2NrKTsKK30KKwordWludDMy X3QKK29wZGxfcmluZ19jb3B5X2Zyb21fYnVyc3Qoc3RydWN0IG9wZGxfcmluZyAqdCwgc3RydWN0 IG9wZGxfc3RhZ2UgKnMsCisJCWNvbnN0IHZvaWQgKmVudHJpZXMsIHVpbnQzMl90IG51bV9lbnRy aWVzLCBib29sIGJsb2NrKQoreworCXVpbnQzMl90IGhlYWQgPSBzLT5oZWFkOworCisJbnVtX2Vu dHJpZXMgPSBudW1fdG9fcHJvY2VzcyhzLCBudW1fZW50cmllcywgYmxvY2spOworCisJaWYgKG51 bV9lbnRyaWVzID09IDApCisJCXJldHVybiAwOworCisJY29weV9lbnRyaWVzX2luKHQsIGhlYWQs IGVudHJpZXMsIG51bV9lbnRyaWVzKTsKKworCXMtPmhlYWQgKz0gbnVtX2VudHJpZXM7CisJX19h dG9taWNfc3RvcmVfbigmcy0+c2hhcmVkLnRhaWwsIHMtPmhlYWQsIF9fQVRPTUlDX1JFTEVBU0Up OworCisJcmV0dXJuIG51bV9lbnRyaWVzOworCit9CisKK3VpbnQzMl90CitvcGRsX3JpbmdfY29w eV90b19idXJzdChzdHJ1Y3Qgb3BkbF9yaW5nICp0LCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywKKwkJ dm9pZCAqZW50cmllcywgdWludDMyX3QgbnVtX2VudHJpZXMsIGJvb2wgYmxvY2spCit7CisJdWlu dDMyX3QgaGVhZCA9IHMtPmhlYWQ7CisKKwludW1fZW50cmllcyA9IG51bV90b19wcm9jZXNzKHMs IG51bV9lbnRyaWVzLCBibG9jayk7CisJaWYgKG51bV9lbnRyaWVzID09IDApCisJCXJldHVybiAw OworCisJY29weV9lbnRyaWVzX291dCh0LCBoZWFkLCBlbnRyaWVzLCBudW1fZW50cmllcyk7CisK KwlzLT5oZWFkICs9IG51bV9lbnRyaWVzOworCV9fYXRvbWljX3N0b3JlX24oJnMtPnNoYXJlZC50 YWlsLCBzLT5oZWFkLCBfX0FUT01JQ19SRUxFQVNFKTsKKworCXJldHVybiBudW1fZW50cmllczsK K30KKwordWludDMyX3QKK29wZGxfc3RhZ2VfZmluZF9udW1fYXZhaWxhYmxlKHN0cnVjdCBvcGRs X3N0YWdlICpzLCB1aW50MzJfdCBudW1fZW50cmllcykKK3sKKwkvKiByZXR1cm4gKG51bV90b19w cm9jZXNzKHMsIG51bV9lbnRyaWVzLCBmYWxzZSkpOyAqLworCisJaWYgKGF2YWlsYWJsZShzKSA+ PSBudW1fZW50cmllcykKKwkJcmV0dXJuIG51bV9lbnRyaWVzOworCisJdXBkYXRlX2F2YWlsYWJs ZV9zZXEocyk7CisKKwl1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZShzKTsKKworCWlmIChhdmFp bCA9PSAwKSB7CisJCXJ0ZV9wYXVzZSgpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIChhdmFp bCA8PSBudW1fZW50cmllcykgPyBhdmFpbCA6IG51bV9lbnRyaWVzOworfQorCit1aW50MzJfdAor b3BkbF9zdGFnZV9jbGFpbShzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywgdm9pZCAqZW50cmllcywKKwkJ dWludDMyX3QgbnVtX2VudHJpZXMsIHVpbnQzMl90ICpzZXEsIGJvb2wgYmxvY2ssIGJvb2wgYXRv bWljKQoreworCWlmIChzLT50aHJlYWRzYWZlID09IGZhbHNlKQorCQlyZXR1cm4gb3BkbF9zdGFn ZV9jbGFpbV9zaW5nbGV0aHJlYWQocywgZW50cmllcywgbnVtX2VudHJpZXMsCisJCQkJc2VxLCBi bG9jaywgYXRvbWljKTsKKwllbHNlCisJCXJldHVybiBvcGRsX3N0YWdlX2NsYWltX211bHRpdGhy ZWFkKHMsIGVudHJpZXMsIG51bV9lbnRyaWVzLAorCQkJCXNlcSwgYmxvY2spOworfQorCit1aW50 MzJfdAorb3BkbF9zdGFnZV9jbGFpbV9jb3B5KHN0cnVjdCBvcGRsX3N0YWdlICpzLCB2b2lkICpl bnRyaWVzLAorCQl1aW50MzJfdCBudW1fZW50cmllcywgdWludDMyX3QgKnNlcSwgYm9vbCBibG9j aykKK3sKKwlpZiAocy0+dGhyZWFkc2FmZSA9PSBmYWxzZSkKKwkJcmV0dXJuIG9wZGxfc3RhZ2Vf Y2xhaW1fY29weV9zaW5nbGV0aHJlYWQocywgZW50cmllcywKKwkJCQludW1fZW50cmllcywgc2Vx LCBibG9jayk7CisJZWxzZQorCQlyZXR1cm4gb3BkbF9zdGFnZV9jbGFpbV9jb3B5X211bHRpdGhy ZWFkKHMsIGVudHJpZXMsCisJCQkJbnVtX2VudHJpZXMsIHNlcSwgYmxvY2spOworfQorCit2b2lk CitvcGRsX3N0YWdlX2Rpc2NsYWltX24oc3RydWN0IG9wZGxfc3RhZ2UgKnMsIHVpbnQzMl90IG51 bV9lbnRyaWVzLAorCQlib29sIGJsb2NrKQoreworCisJaWYgKHMtPnRocmVhZHNhZmUgPT0gZmFs c2UpIHsKKwkJb3BkbF9zdGFnZV9kaXNjbGFpbV9zaW5nbGV0aHJlYWRfbihzLCBzLT5udW1fY2xh aW1lZCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGNsYWltX21hbmFnZXIgKmRpc2NsYWltcyA9CisJ CQkmcy0+cGVuZGluZ19kaXNjbGFpbXNbcnRlX2xjb3JlX2lkKCldOworCisJCWlmICh1bmxpa2Vs eShudW1fZW50cmllcyA+IHMtPm51bV9zbG90cykpIHsKKwkJCVBNRF9EUlZfTE9HKFdBUk5JTkcs ICJBdHRlbXB0IHRvIGRpc2NsYWltICgldSkgbW9yZSB0aGFuIGNsYWltZWQgKCV1KSIsCisJCQkJ CW51bV9lbnRyaWVzLCBkaXNjbGFpbXMtPm51bV9jbGFpbWVkKTsKKwkJCW51bV9lbnRyaWVzID0g ZGlzY2xhaW1zLT5udW1fY2xhaW1lZDsKKwkJfQorCisJCW51bV9lbnRyaWVzID0gUlRFX01JTihu dW1fZW50cmllcyArIGRpc2NsYWltcy0+bnVtX3RvX2Rpc2NsYWltLAorCQkJCWRpc2NsYWltcy0+ bnVtX2NsYWltZWQpOworCQlvcGRsX3N0YWdlX2Rpc2NsYWltX211bHRpdGhyZWFkX24ocywgbnVt X2VudHJpZXMsIGJsb2NrKTsKKwl9Cit9CisKK2ludAorb3BkbF9zdGFnZV9kaXNjbGFpbShzdHJ1 Y3Qgb3BkbF9zdGFnZSAqcywgdWludDMyX3QgbnVtX2VudHJpZXMsIGJvb2wgYmxvY2spCit7CisJ aWYgKG51bV9lbnRyaWVzICE9IHMtPm51bV9ldmVudCkgeworCQlydGVfZXJybm8gPSAtRUlOVkFM OworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHMtPnRocmVhZHNhZmUgPT0gZmFsc2UpIHsKKwkJX19h dG9taWNfc3RvcmVfbigmcy0+c2hhcmVkLnRhaWwsIHMtPmhlYWQsIF9fQVRPTUlDX1JFTEVBU0Up OworCQlzLT5zZXEgKz0gcy0+bnVtX2NsYWltZWQ7CisJCXMtPnNoYWRvd19oZWFkID0gcy0+aGVh ZDsKKwkJcy0+bnVtX2NsYWltZWQgPSAwOworCX0gZWxzZSB7CisJCXN0cnVjdCBjbGFpbV9tYW5h Z2VyICpkaXNjbGFpbXMgPQorCQkJCSZzLT5wZW5kaW5nX2Rpc2NsYWltc1tydGVfbGNvcmVfaWQo KV07CisJCW9wZGxfc3RhZ2VfZGlzY2xhaW1fbXVsdGl0aHJlYWRfbihzLCBkaXNjbGFpbXMtPm51 bV9jbGFpbWVkLAorCQkJCWJsb2NrKTsKKwl9CisJcmV0dXJuIG51bV9lbnRyaWVzOworfQorCit1 aW50MzJfdAorb3BkbF9yaW5nX2F2YWlsYWJsZShzdHJ1Y3Qgb3BkbF9yaW5nICp0KQoreworCXJl dHVybiBvcGRsX3N0YWdlX2F2YWlsYWJsZSgmdC0+c3RhZ2VzWzBdKTsKK30KKwordWludDMyX3QK K29wZGxfc3RhZ2VfYXZhaWxhYmxlKHN0cnVjdCBvcGRsX3N0YWdlICpzKQoreworCXVwZGF0ZV9h dmFpbGFibGVfc2VxKHMpOworCXJldHVybiBhdmFpbGFibGUocyk7Cit9CisKK3ZvaWQKK29wZGxf cmluZ19mbHVzaChzdHJ1Y3Qgb3BkbF9yaW5nICp0KQoreworCXN0cnVjdCBvcGRsX3N0YWdlICpz ID0gaW5wdXRfc3RhZ2UodCk7CisKKwl3YWl0X2Zvcl9hdmFpbGFibGUocywgcy0+bnVtX3Nsb3Rz KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqIE5vbiBwZXJmb3JtYW5jZSBzZW5zaXRpdmUg ZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqLworCisvKiBJbml0aWFsIHNldHVwIG9mIGEg bmV3IHN0YWdlJ3MgY29udGV4dCAqLworc3RhdGljIGludAoraW5pdF9zdGFnZShzdHJ1Y3Qgb3Bk bF9yaW5nICp0LCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywgYm9vbCB0aHJlYWRzYWZlLAorCQlib29s IGlzX2lucHV0KQoreworCXVpbnQzMl90IGF2YWlsYWJsZSA9IChpc19pbnB1dCkgPyB0LT5udW1f c2xvdHMgOiAwOworCisJcy0+dCA9IHQ7CisJcy0+bnVtX3Nsb3RzID0gdC0+bnVtX3Nsb3RzOwor CXMtPmluZGV4ID0gdC0+bnVtX3N0YWdlczsKKwlzLT50aHJlYWRzYWZlID0gdGhyZWFkc2FmZTsK KwlzLT5zaGFyZWQuc3RhZ2UgPSBzOworCisJLyogQWxsb2MgbWVtb3J5IGZvciBkZXBzICovCisJ cy0+ZGVwX3RyYWNraW5nID0gcnRlX3ptYWxsb2Nfc29ja2V0KExJQl9OQU1FLAorCQkJdC0+bWF4 X251bV9zdGFnZXMgKiBzaXplb2YoZW51bSBkZXBfdHlwZSksCisJCQkwLCB0LT5zb2NrZXQpOwor CWlmIChzLT5kZXBfdHJhY2tpbmcgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzLT5k ZXBzID0gcnRlX3ptYWxsb2Nfc29ja2V0KExJQl9OQU1FLAorCQkJdC0+bWF4X251bV9zdGFnZXMg KiBzaXplb2Yoc3RydWN0IHNoYXJlZF9zdGF0ZSAqKSwKKwkJCTAsIHQtPnNvY2tldCk7CisJaWYg KHMtPmRlcHMgPT0gTlVMTCkgeworCQlydGVfZnJlZShzLT5kZXBfdHJhY2tpbmcpOworCQlyZXR1 cm4gLUVOT01FTTsKKwl9CisKKwlzLT5kZXBfdHJhY2tpbmdbcy0+aW5kZXhdID0gREVQX1NFTEY7 CisKKwlpZiAodGhyZWFkc2FmZSA9PSB0cnVlKQorCQlzLT5zaGFyZWQuYXZhaWxhYmxlX3NlcSA9 IGF2YWlsYWJsZTsKKwllbHNlCisJCXMtPmF2YWlsYWJsZV9zZXEgPSBhdmFpbGFibGU7CisKKwly ZXR1cm4gMDsKK30KKworLyogQWRkIGRpcmVjdCBvciBpbmRpcmVjdCBkZXBlbmRlbmNpZXMgYmV0 d2VlbiBzdGFnZXMgKi8KK3N0YXRpYyBpbnQKK2FkZF9kZXAoc3RydWN0IG9wZGxfc3RhZ2UgKmRl cGVuZGVudCwgY29uc3Qgc3RydWN0IG9wZGxfc3RhZ2UgKmRlcGVuZGVuY3ksCisJCWVudW0gZGVw X3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgb3BkbF9yaW5nICp0ID0gZGVwZW5kZW50LT50OworCXVp bnQzMl90IGk7CisKKwkvKiBBZGQgbmV3IGRpcmVjdCBkZXBlbmRlbmN5ICovCisJaWYgKCh0eXBl ID09IERFUF9ESVJFQ1QpICYmCisJCQkoZGVwZW5kZW50LT5kZXBfdHJhY2tpbmdbZGVwZW5kZW5j eS0+aW5kZXhdID09CisJCQkJCURFUF9OT05FKSkgeworCQlQTURfRFJWX0xPRyhERUJVRywgIiVz OiV1IGRpcmVjdCBkZXBlbmRlbmN5IG9uICV1IiwKKwkJCQl0LT5uYW1lLCBkZXBlbmRlbnQtPmlu ZGV4LCBkZXBlbmRlbmN5LT5pbmRleCk7CisJCWRlcGVuZGVudC0+ZGVwX3RyYWNraW5nW2RlcGVu ZGVuY3ktPmluZGV4XSA9IERFUF9ESVJFQ1Q7CisJfQorCisJLyogQWRkIG5ldyBpbmRpcmVjdCBk ZXBlbmRlbmN5IG9yIGNoYW5nZSBkaXJlY3QgdG8gaW5kaXJlY3QgKi8KKwlpZiAoKHR5cGUgPT0g REVQX0lORElSRUNUKSAmJgorCQkJKChkZXBlbmRlbnQtPmRlcF90cmFja2luZ1tkZXBlbmRlbmN5 LT5pbmRleF0gPT0KKwkJCURFUF9OT05FKSB8fAorCQkJKGRlcGVuZGVudC0+ZGVwX3RyYWNraW5n W2RlcGVuZGVuY3ktPmluZGV4XSA9PQorCQkJREVQX0RJUkVDVCkpKSB7CisJCVBNRF9EUlZfTE9H KERFQlVHLCAiJXM6JXUgaW5kaXJlY3QgZGVwZW5kZW5jeSBvbiAldSIsCisJCQkJdC0+bmFtZSwg ZGVwZW5kZW50LT5pbmRleCwgZGVwZW5kZW5jeS0+aW5kZXgpOworCQlkZXBlbmRlbnQtPmRlcF90 cmFja2luZ1tkZXBlbmRlbmN5LT5pbmRleF0gPSBERVBfSU5ESVJFQ1Q7CisJfQorCisJLyogU2hv dWxkbid0IGhhcHBlbi4uLiAqLworCWlmICgoZGVwZW5kZW50LT5kZXBfdHJhY2tpbmdbZGVwZW5k ZW5jeS0+aW5kZXhdID09IERFUF9TRUxGKSAmJgorCQkJKGRlcGVuZGVudCAhPSBpbnB1dF9zdGFn ZSh0KSkpIHsKKwkJUE1EX0RSVl9MT0coRVJSLCAiTG9vcCBpbiBkZXBlbmRlbmN5IGdyYXBoICVz OiV1IiwKKwkJCQl0LT5uYW1lLCBkZXBlbmRlbnQtPmluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJLyogS2VlcCBnb2luZyB0byBkZXBlbmRlbmNpZXMgb2YgdGhlIGRlcGVuZGVuY3ks IHVudGlsIGlucHV0IHN0YWdlICovCisJaWYgKGRlcGVuZGVuY3kgIT0gaW5wdXRfc3RhZ2UodCkp CisJCWZvciAoaSA9IDA7IGkgPCBkZXBlbmRlbmN5LT5udW1fZGVwczsgaSsrKSB7CisJCQlpbnQg cmV0ID0gYWRkX2RlcChkZXBlbmRlbnQsIGRlcGVuZGVuY3ktPmRlcHNbaV0tPnN0YWdlLAorCQkJ CQlERVBfSU5ESVJFQ1QpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9 CisKKwkvKiBNYWtlIGxpc3Qgb2Ygc2VxdWVuY2UgbnVtYmVycyBmb3IgZGlyZWN0IGRlcGVuZGVu Y2llcyBvbmx5ICovCisJaWYgKHR5cGUgPT0gREVQX0RJUkVDVCkKKwkJZm9yIChpID0gMCwgZGVw ZW5kZW50LT5udW1fZGVwcyA9IDA7IGkgPCB0LT5udW1fc3RhZ2VzOyBpKyspCisJCQlpZiAoZGVw ZW5kZW50LT5kZXBfdHJhY2tpbmdbaV0gPT0gREVQX0RJUkVDVCkgeworCQkJCWlmICgoaSA9PSAw KSAmJiAoZGVwZW5kZW50LT5udW1fZGVwcyA+IDEpKQorCQkJCQlydGVfcGFuaWMoIiVzOiV1IGRl cGVuZHMgb24gPiBpbnB1dCIsCisJCQkJCQkJdC0+bmFtZSwKKwkJCQkJCQlkZXBlbmRlbnQtPmlu ZGV4KTsKKwkJCQlkZXBlbmRlbnQtPmRlcHNbZGVwZW5kZW50LT5udW1fZGVwcysrXSA9CisJCQkJ CQkmdC0+c3RhZ2VzW2ldLnNoYXJlZDsKKwkJCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qg b3BkbF9yaW5nICoKK29wZGxfcmluZ19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qg bnVtX3Nsb3RzLCB1aW50MzJfdCBzbG90X3NpemUsCisJCXVpbnQzMl90IG1heF9udW1fc3RhZ2Vz LCBpbnQgc29ja2V0KQoreworCXN0cnVjdCBvcGRsX3JpbmcgKnQ7CisJY2hhciBtel9uYW1lW1JU RV9NRU1aT05FX05BTUVTSVpFXTsKKwlpbnQgbXpfZmxhZ3MgPSAwOworCXN0cnVjdCBvcGRsX3N0 YWdlICpzdCA9IE5VTEw7CisJY29uc3Qgc3RydWN0IHJ0ZV9tZW16b25lICpteiA9IE5VTEw7CisJ c2l6ZV90IGFsbG9jX3NpemUgPSBSVEVfQ0FDSEVfTElORV9ST1VORFVQKHNpemVvZigqdCkgKwor CQkJKG51bV9zbG90cyAqIHNsb3Rfc2l6ZSkpOworCisJLyogQ29tcGlsZSB0aW1lIGNoZWNraW5n ICovCisJUlRFX0JVSUxEX0JVR19PTigoc2l6ZW9mKHN0cnVjdCBzaGFyZWRfc3RhdGUpICYgUlRF X0NBQ0hFX0xJTkVfTUFTSykgIT0KKwkJCTApOworCVJURV9CVUlMRF9CVUdfT04oKG9mZnNldG9m KHN0cnVjdCBvcGRsX3N0YWdlLCBzaGFyZWQpICYKKwkJCVJURV9DQUNIRV9MSU5FX01BU0spICE9 IDApOworCVJURV9CVUlMRF9CVUdfT04oKG9mZnNldG9mKHN0cnVjdCBvcGRsX3JpbmcsIHNsb3Rz KSAmCisJCQlSVEVfQ0FDSEVfTElORV9NQVNLKSAhPSAwKTsKKwlSVEVfQlVJTERfQlVHX09OKCFy dGVfaXNfcG93ZXJfb2ZfMihPUERMX0RJU0NMQUlNU19QRVJfTENPUkUpKTsKKworCS8qIFBhcmFt ZXRlciBjaGVja2luZyAqLworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJUE1EX0RSVl9MT0coRVJS LCAibmFtZSBwYXJhbSBpcyBOVUxMIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIXJ0ZV9p c19wb3dlcl9vZl8yKG51bV9zbG90cykpIHsKKwkJUE1EX0RSVl9MT0coRVJSLCAibnVtX3Nsb3Rz ICgldSkgZm9yICVzIGlzIG5vdCBwb3dlciBvZiAyIiwKKwkJCQludW1fc2xvdHMsIG5hbWUpOwor CQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBBbGxvYyBtZW1vcnkgZm9yIHN0YWdlcyAqLworCXN0 ID0gcnRlX3ptYWxsb2Nfc29ja2V0KExJQl9OQU1FLAorCQltYXhfbnVtX3N0YWdlcyAqIHNpemVv ZihzdHJ1Y3Qgb3BkbF9zdGFnZSksCisJCVJURV9DQUNIRV9MSU5FX1NJWkUsIHNvY2tldCk7CisJ aWYgKHN0ID09IE5VTEwpCisJCWdvdG8gZXhpdF9mYWlsOworCisJc25wcmludGYobXpfbmFtZSwg c2l6ZW9mKG16X25hbWUpLCAiJXMlcyIsIExJQl9OQU1FLCBuYW1lKTsKKworCS8qIEFsbG9jIG1l bW9yeSBmb3IgbWVtem9uZSAqLworCW16ID0gcnRlX21lbXpvbmVfcmVzZXJ2ZShtel9uYW1lLCBh bGxvY19zaXplLCBzb2NrZXQsIG16X2ZsYWdzKTsKKwlpZiAobXogPT0gTlVMTCkKKwkJZ290byBl eGl0X2ZhaWw7CisKKwl0ID0gbXotPmFkZHI7CisKKwkvKiBJbml0aWFsaXNlIG9wZGxfcmluZyBx dWV1ZSAqLworCW1lbXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKwlzbnByaW50Zih0LT5uYW1lLCBz aXplb2YodC0+bmFtZSksICIlcyIsIG5hbWUpOworCXQtPnNvY2tldCA9IHNvY2tldDsKKwl0LT5u dW1fc2xvdHMgPSBudW1fc2xvdHM7CisJdC0+bWFzayA9IG51bV9zbG90cyAtIDE7CisJdC0+c2xv dF9zaXplID0gc2xvdF9zaXplOworCXQtPm1heF9udW1fc3RhZ2VzID0gbWF4X251bV9zdGFnZXM7 CisJdC0+c3RhZ2VzID0gc3Q7CisKKwlQTURfRFJWX0xPRyhERUJVRywgIkNyZWF0ZWQgJXMgYXQg JXAgKG51bV9zbG90cz0ldSxzb2NrZXQ9JWksc2xvdF9zaXplPSV1KSIsCisJCQl0LT5uYW1lLCB0 LCBudW1fc2xvdHMsIHNvY2tldCwgc2xvdF9zaXplKTsKKworCXJldHVybiB0OworCitleGl0X2Zh aWw6CisJUE1EX0RSVl9MT0coRVJSLCAiQ2Fubm90IHJlc2VydmUgbWVtb3J5Iik7CisJcnRlX2Zy ZWUoc3QpOworCXJ0ZV9tZW16b25lX2ZyZWUobXopOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3Zv aWQgKgorb3BkbF9yaW5nX2dldF9zbG90KGNvbnN0IHN0cnVjdCBvcGRsX3JpbmcgKnQsIHVpbnQz Ml90IGluZGV4KQoreworCXJldHVybiBnZXRfc2xvdCh0LCBpbmRleCk7Cit9CisKK2Jvb2wKK29w ZGxfcmluZ19jYXNfc2xvdChjb25zdCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywgY29uc3Qgc3RydWN0 IHJ0ZV9ldmVudCAqZXYsCisJCXVpbnQzMl90IGluZGV4LCBib29sIGF0b21pYykKK3sKKwl1aW50 MzJfdCBpID0gMCwgaiA9IDAsIG9mZnNldDsKKwlzdHJ1Y3Qgb3BkbF9yaW5nICp0ID0gcy0+dDsK KwlzdHJ1Y3QgcnRlX2V2ZW50ICpldl9vcmlnID0gTlVMTDsKKwlib29sIGV2X3VwZGF0ZWQgPSBm YWxzZTsKKwl1aW50NjRfdCAgZXZfdGVtcCA9IDA7CisKKwlpZiAoaW5kZXggPiBzLT5udW1fZXZl bnQpIHsKKwkJUE1EX0RSVl9MT0coRVJSLCAiaW5kZXggaXMgb3ZlcmZsb3ciKTsKKwkJcmV0dXJu IGV2X3VwZGF0ZWQ7CisJfQorCisJZXZfdGVtcCA9IGV2LT5ldmVudCZPUERMX0VWRU5UX01BU0s7 CisKKwlpZiAoIWF0b21pYykgeworCQlvZmZzZXQgPSBvcGRsX2ZpcnN0X2VudHJ5X2lkKHMtPnNl cSwgcy0+bmJfaW5zdGFuY2UsCisJCQkJcy0+aW5zdGFuY2VfaWQpOworCQlvZmZzZXQgKz0gaW5k ZXgqcy0+bmJfaW5zdGFuY2U7CisJCWV2X29yaWcgPSBnZXRfc2xvdCh0LCBzLT5zaGFkb3dfaGVh ZCtvZmZzZXQpOworCQlpZiAoKGV2X29yaWctPmV2ZW50Jk9QRExfRVZFTlRfTUFTSykgIT0gZXZf dGVtcCkgeworCQkJZXZfb3JpZy0+ZXZlbnQgPSBldi0+ZXZlbnQ7CisJCQlldl91cGRhdGVkID0g dHJ1ZTsKKwkJfQorCQlpZiAoZXZfb3JpZy0+dTY0ICE9IGV2LT51NjQpIHsKKwkJCWV2X29yaWct PnU2NCA9IGV2LT51NjQ7CisJCQlldl91cGRhdGVkID0gdHJ1ZTsKKwkJfQorCisJfSBlbHNlIHsK KwkJZm9yIChpID0gMDsgaSA8IHMtPm51bV9jbGFpbWVkOyBpKyspIHsKKwkJCWV2X29yaWcgPSAo c3RydWN0IHJ0ZV9ldmVudCAqKWdldF9zbG90KHQsIHMtPnNoYWRvd19oZWFkK2kpOworCQkJaWYg KChldl9vcmlnLT5mbG93X2lkJXMtPm5iX2luc3RhbmNlKSA9PSBzLT5pbnN0YW5jZV9pZCkgewor CisJCQkJaWYgKGogPT0gaW5kZXgpIHsKKwkJCQkJaWYgKChldl9vcmlnLT5ldmVudCZPUERMX0VW RU5UX01BU0spICE9IGV2X3RlbXApIHsKKwkJCQkJCWV2X29yaWctPmV2ZW50ID0gZXYtPmV2ZW50 OworCQkJCQkJZXZfdXBkYXRlZCA9IHRydWU7CisJCQkJCX0KKwkJCQkJaWYgKGV2X29yaWctPnU2 NCAhPSBldi0+dTY0KSB7CisJCQkJCQlldl9vcmlnLT51NjQgPSBldi0+dTY0OworCQkJCQkJZXZf dXBkYXRlZCA9IHRydWU7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaisrOwor CQkJfQorCQl9CisKKwl9CisKKwlyZXR1cm4gZXZfdXBkYXRlZDsKK30KKworaW50CitvcGRsX3Jp bmdfZ2V0X3NvY2tldChjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0KQoreworCXJldHVybiB0LT5z b2NrZXQ7Cit9CisKK3VpbnQzMl90CitvcGRsX3JpbmdfZ2V0X251bV9zbG90cyhjb25zdCBzdHJ1 Y3Qgb3BkbF9yaW5nICp0KQoreworCXJldHVybiB0LT5udW1fc2xvdHM7Cit9CisKK2NvbnN0IGNo YXIgKgorb3BkbF9yaW5nX2dldF9uYW1lKGNvbnN0IHN0cnVjdCBvcGRsX3JpbmcgKnQpCit7CisJ cmV0dXJuIHQtPm5hbWU7Cit9CisKKy8qIENoZWNrIGRlcGVuZGVuY3kgbGlzdCBpcyB2YWxpZCBm b3IgYSBnaXZlbiBvcGRsX3JpbmcgKi8KK3N0YXRpYyBpbnQKK2NoZWNrX2RlcHMoc3RydWN0IG9w ZGxfcmluZyAqdCwgc3RydWN0IG9wZGxfc3RhZ2UgKmRlcHNbXSwKKwkJdWludDMyX3QgbnVtX2Rl cHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RlcHM7ICsr aSkgeworCQlpZiAoIWRlcHNbaV0pIHsKKwkJCVBNRF9EUlZfTE9HKEVSUiwgImRlcHNbJXVdIGlz IE5VTEwiLCBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0ICE9IGRlcHNbaV0t PnQpIHsKKwkJCVBNRF9EUlZfTE9HKEVSUiwgImRlcHNbJXVdIGlzIGluIG9wZGxfcmluZyAlcywg bm90ICVzIiwKKwkJCQkJaSwgZGVwc1tpXS0+dC0+bmFtZSwgdC0+bmFtZSk7CisJCQlyZXR1cm4g LUVJTlZBTDsKKwkJfQorCX0KKwlpZiAobnVtX2RlcHMgPiB0LT5udW1fc3RhZ2VzKSB7CisJCVBN RF9EUlZfTE9HKEVSUiwgIm51bV9kZXBzICgldSkgPiBudW1iZXIgc3RhZ2VzICgldSkiLAorCQkJ CW51bV9kZXBzLCB0LT5udW1fc3RhZ2VzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVy biAwOworfQorCitzdHJ1Y3Qgb3BkbF9zdGFnZSAqCitvcGRsX3N0YWdlX2FkZChzdHJ1Y3Qgb3Bk bF9yaW5nICp0LCBib29sIHRocmVhZHNhZmUsIGJvb2wgaXNfaW5wdXQpCit7CisJc3RydWN0IG9w ZGxfc3RhZ2UgKnM7CisKKwkvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgKi8KKwlpZiAoIXQpIHsKKwkJ UE1EX0RSVl9MT0coRVJSLCAib3BkbF9yaW5nIGlzIE5VTEwiKTsKKwkJcmV0dXJuIE5VTEw7CisJ fQorCWlmICh0LT5udW1fc3RhZ2VzID09IHQtPm1heF9udW1fc3RhZ2VzKSB7CisJCVBNRF9EUlZf TE9HKEVSUiwgIiVzIGhhcyBtYXggbnVtYmVyIG9mIHN0YWdlcyAoJXUpIiwKKwkJCQl0LT5uYW1l LCB0LT5tYXhfbnVtX3N0YWdlcyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXMgPSAmdC0+c3Rh Z2VzW3QtPm51bV9zdGFnZXNdOworCisJaWYgKCgodWludHB0cl90KSZzLT5zaGFyZWQgJiBSVEVf Q0FDSEVfTElORV9NQVNLKSAhPSAwKQorCQlQTURfRFJWX0xPRyhXQVJOSU5HLCAiVGFpbCBzZXEg bnVtICglcCkgb2YgJXMgc3RhZ2Ugbm90IGNhY2hlIGFsaWduZWQiLAorCQkJCSZzLT5zaGFyZWQs IHQtPm5hbWUpOworCisJaWYgKGluaXRfc3RhZ2UodCwgcywgdGhyZWFkc2FmZSwgaXNfaW5wdXQp IDwgMCkgeworCQlQTURfRFJWX0xPRyhFUlIsICJDYW5ub3QgcmVzZXJ2ZSBtZW1vcnkiKTsKKwkJ cmV0dXJuIE5VTEw7CisJfQorCXQtPm51bV9zdGFnZXMrKzsKKworCXJldHVybiBzOworfQorCit1 aW50MzJfdAorb3BkbF9zdGFnZV9kZXBzX2FkZChzdHJ1Y3Qgb3BkbF9yaW5nICp0LCBzdHJ1Y3Qg b3BkbF9zdGFnZSAqcywKKwkJdWludDMyX3QgbmJfaW5zdGFuY2UsIHVpbnQzMl90IGluc3RhbmNl X2lkLAorCQlzdHJ1Y3Qgb3BkbF9zdGFnZSAqZGVwc1tdLAorCQl1aW50MzJfdCBudW1fZGVwcykK K3sKKwl1aW50MzJfdCBpOworCWludCByZXQgPSAwOworCisJaWYgKChudW1fZGVwcyA+IDApICYm ICghZGVwcykpIHsKKwkJUE1EX0RSVl9MT0coRVJSLCAiJXMgc3RhZ2UgaGFzIE5VTEwgZGVwZW5k ZW5jaWVzIiwgdC0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0ID0gY2hlY2tfZGVwcyh0 LCBkZXBzLCBudW1fZGVwcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3Ig KGkgPSAwOyBpIDwgbnVtX2RlcHM7IGkrKykgeworCQlyZXQgPSBhZGRfZGVwKHMsIGRlcHNbaV0s IERFUF9ESVJFQ1QpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcy0+ bmJfaW5zdGFuY2UgPSBuYl9pbnN0YW5jZTsKKwlzLT5pbnN0YW5jZV9pZCA9IGluc3RhbmNlX2lk OworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IG9wZGxfc3RhZ2UgKgorb3BkbF9yaW5nX2dl dF9pbnB1dF9zdGFnZShjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0KQoreworCXJldHVybiBpbnB1 dF9zdGFnZSh0KTsKK30KKworaW50CitvcGRsX3N0YWdlX3NldF9kZXBzKHN0cnVjdCBvcGRsX3N0 YWdlICpzLCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqZGVwc1tdLAorCQl1aW50MzJfdCBudW1fZGVwcykK K3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKChudW1fZGVwcyA9PSAwKSB8 fCAoIWRlcHMpKSB7CisJCVBNRF9EUlZfTE9HKEVSUiwgImNhbm5vdCBzZXQgTlVMTCBkZXBlbmRl bmNpZXMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY2hlY2tfZGVwcyhzLT50 LCBkZXBzLCBudW1fZGVwcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBV cGRhdGUgZGVwcyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZGVwczsgaSsrKQorCQlzLT5kZXBz W2ldID0gJmRlcHNbaV0tPnNoYXJlZDsKKwlzLT5udW1fZGVwcyA9IG51bV9kZXBzOworCisJcmV0 dXJuIDA7Cit9CisKK3N0cnVjdCBvcGRsX3JpbmcgKgorb3BkbF9zdGFnZV9nZXRfb3BkbF9yaW5n KGNvbnN0IHN0cnVjdCBvcGRsX3N0YWdlICpzKQoreworCXJldHVybiBzLT50OworfQorCit2b2lk CitvcGRsX3JpbmdfZHVtcChjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0LCBGSUxFICpmKQorewor CXVpbnQzMl90IGk7CisKKwlpZiAodCA9PSBOVUxMKSB7CisJCWZwcmludGYoZiwgIk5VTEwgT1BE TCFcbiIpOworCQlyZXR1cm47CisJfQorCWZwcmludGYoZiwgIk9QREwgXCIlc1wiOiBudW1fc2xv dHM9JXU7IG1hc2s9JSN4OyBzbG90X3NpemU9JXU7IG51bV9zdGFnZXM9JXU7IHNvY2tldD0laVxu IiwKKwkJCXQtPm5hbWUsIHQtPm51bV9zbG90cywgdC0+bWFzaywgdC0+c2xvdF9zaXplLAorCQkJ dC0+bnVtX3N0YWdlcywgdC0+c29ja2V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgdC0+bnVtX3N0YWdl czsgaSsrKSB7CisJCXVpbnQzMl90IGo7CisJCWNvbnN0IHN0cnVjdCBvcGRsX3N0YWdlICpzID0g JnQtPnN0YWdlc1tpXTsKKworCQlmcHJpbnRmKGYsICIgICVzWyV1XTogdGhyZWFkc2FmZT0lczsg aGVhZD0ldTsgYXZhaWxhYmxlX3NlcT0ldTsgdGFpbD0ldTsgZGVwcz0ldSIsCisJCQkJdC0+bmFt ZSwgaSwgKHMtPnRocmVhZHNhZmUpID8gInRydWUiIDogImZhbHNlIiwKKwkJCQkocy0+dGhyZWFk c2FmZSkgPyBzLT5zaGFyZWQuaGVhZCA6IHMtPmhlYWQsCisJCQkJKHMtPnRocmVhZHNhZmUpID8g cy0+c2hhcmVkLmF2YWlsYWJsZV9zZXEgOgorCQkJCXMtPmF2YWlsYWJsZV9zZXEsCisJCQkJcy0+ c2hhcmVkLnRhaWwsIChzLT5udW1fZGVwcyA+IDApID8KKwkJCQlzLT5kZXBzWzBdLT5zdGFnZS0+ aW5kZXggOiAwKTsKKwkJZm9yIChqID0gMTsgaiA8IHMtPm51bV9kZXBzOyBqKyspCisJCQlmcHJp bnRmKGYsICIsJXUiLCBzLT5kZXBzW2pdLT5zdGFnZS0+aW5kZXgpOworCQlmcHJpbnRmKGYsICJc biIpOworCX0KKwlmZmx1c2goZik7Cit9CisKK3ZvaWQKK29wZGxfcmluZ19mcmVlKHN0cnVjdCBv cGRsX3JpbmcgKnQpCit7CisJdWludDMyX3QgaTsKKwljb25zdCBzdHJ1Y3QgcnRlX21lbXpvbmUg Km16OworCWNoYXIgbXpfbmFtZVtSVEVfTUVNWk9ORV9OQU1FU0laRV07CisKKwlpZiAodCA9PSBO VUxMKSB7CisJCVBNRF9EUlZfTE9HKERFQlVHLCAiRnJlZWluZyBOVUxMIE9QREwgUmluZyEiKTsK KwkJcmV0dXJuOworCX0KKworCVBNRF9EUlZfTE9HKERFQlVHLCAiRnJlZWluZyAlcyBvcGRsX3Jp bmcgYXQgJXAiLCB0LT5uYW1lLCB0KTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5udW1fc3RhZ2Vz OyArK2kpIHsKKwkJcnRlX2ZyZWUodC0+c3RhZ2VzW2ldLmRlcHMpOworCQlydGVfZnJlZSh0LT5z dGFnZXNbaV0uZGVwX3RyYWNraW5nKTsKKwl9CisKKwlydGVfZnJlZSh0LT5zdGFnZXMpOworCisJ c25wcmludGYobXpfbmFtZSwgc2l6ZW9mKG16X25hbWUpLCAiJXMlcyIsIExJQl9OQU1FLCB0LT5u YW1lKTsKKwlteiA9IHJ0ZV9tZW16b25lX2xvb2t1cChtel9uYW1lKTsKKwlpZiAocnRlX21lbXpv bmVfZnJlZShteikgIT0gMCkKKwkJUE1EX0RSVl9MT0coRVJSLCAiQ2Fubm90IGZyZWUgbWVtem9u ZSBmb3IgJXMiLCB0LT5uYW1lKTsKK30KKworLyogc2VhcmNoIGEgb3BkbF9yaW5nIGZyb20gaXRz IG5hbWUgKi8KK3N0cnVjdCBvcGRsX3JpbmcgKgorb3BkbF9yaW5nX2xvb2t1cChjb25zdCBjaGFy ICpuYW1lKQoreworCWNvbnN0IHN0cnVjdCBydGVfbWVtem9uZSAqbXo7CisJY2hhciBtel9uYW1l W1JURV9NRU1aT05FX05BTUVTSVpFXTsKKworCXNucHJpbnRmKG16X25hbWUsIHNpemVvZihtel9u YW1lKSwgIiVzJXMiLCBMSUJfTkFNRSwgbmFtZSk7CisKKwlteiA9IHJ0ZV9tZW16b25lX2xvb2t1 cChtel9uYW1lKTsKKwlpZiAobXogPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4g bXotPmFkZHI7Cit9CisKK3ZvaWQKK29wZGxfcmluZ19zZXRfc3RhZ2VfdGhyZWFkc2FmZShzdHJ1 Y3Qgb3BkbF9zdGFnZSAqcywgYm9vbCB0aHJlYWRzYWZlKQoreworCXMtPnRocmVhZHNhZmUgPSB0 aHJlYWRzYWZlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ldmVudC9vcGRsL29wZGxfcmluZy5o IGIvZHJpdmVycy9ldmVudC9vcGRsL29wZGxfcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjA1YmFhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2V2ZW50L29w ZGwvb3BkbF9yaW5nLmgKQEAgLTAsMCArMSw2MjggQEAKKy8qLQorICogICBCU0QgTElDRU5TRQor ICoKKyAqICAgQ29weXJpZ2h0KGMpIDIwMTYtMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogICBtb2RpZmljYXRpb24sIGFy ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICAg YXJlIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qg b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5 cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm b2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29y IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgICAgZGlzdHJpYnV0aW9u LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhl IG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdh cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogICBU SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O VFJJQlVUT1JTCisgKiAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogICBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS SUdIVAorICogICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogICBMSU1JVEVEIFRPLCBQ Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK KyAqICAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS IENBVVNFRCBBTkQgT04gQU5ZCisgKiAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAgKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg KiAgIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfT1BETF9IXworI2RlZmluZSBfT1BETF9I XworCisvKioKKyAqIEBmaWxlCisgKiBUaGUgIm9wZGxfcmluZyIgaXMgYSBkYXRhIHN0cnVjdHVy ZSB0aGF0IGNvbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIHNsb3RzLAorICogd2l0aCBlYWNoIHNs b3QgaGF2aW5nIHRoZSBzYW1lLCBidXQgY29uZmlndXJhYmxlLCBzaXplLiBFbnRyaWVzIGFyZSBp bnB1dAorICogaW50byB0aGUgb3BkbF9yaW5nIGJ5IGNvcHlpbmcgaW50byBhdmFpbGFibGUgc2xv dHMuIE9uY2UgaW4gdGhlIG9wZGxfcmluZywKKyAqIGFuIGVudHJ5IGlzIHByb2Nlc3NlZCBieSBh IG51bWJlciBvZiBzdGFnZXMsIHdpdGggdGhlIG9yZGVyaW5nIG9mIHN0YWdlCisgKiBwcm9jZXNz aW5nIGNvbnRyb2xsZWQgYnkgbWFraW5nIHN0YWdlcyBkZXBlbmRlbnQgb24gb25lIG9yIG1vcmUg b3RoZXIgc3RhZ2VzLgorICogQW4gZW50cnkgaXMgbm90IGF2YWlsYWJsZSBmb3IgYSBzdGFnZSB0 byBwcm9jZXNzIHVudGlsIGl0IGhhcyBiZWVuIHByb2Nlc3NlZAorICogYnkgdGhhdCBzdGFnZXMg ZGVwZW5kZW5jaWVzLiBFbnRyaWVzIGFyZSBhbHdheXMgbWFkZSBhdmFpbGFibGUgZm9yCisgKiBw cm9jZXNzaW5nIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGlucHV0IGluIHRvIHRo ZSBvcGRsX3JpbmcuCisgKiBJbnB1dHRpbmcgaXMgY29uc2lkZXJlZCBhcyBhIHN0YWdlIHRoYXQg ZGVwZW5kcyBvbiBhbGwgb3RoZXIgc3RhZ2VzLAorICogYW5kIGlzIGFsc28gYSBkZXBlbmRlbmN5 IG9mIGFsbCBzdGFnZXMuCisgKgorICogSW5wdXR0aW5nIGFuZCBwcm9jZXNzaW5nIGluIGEgc3Rh Z2UgY2FuIHN1cHBvcnQgbXVsdGktdGhyZWFkaW5nLiBOb3RlIHRoYXQKKyAqIG11bHRpLXRocmVh ZCBwcm9jZXNzaW5nIGNhbiBhbHNvIGJlIGRvbmUgYnkgbWFraW5nIHN0YWdlcyBjby1vcGVyYXRl IGUuZy4gdHdvCisgKiBzdGFnZXMgd2hlcmUgb25lIHByb2Nlc3NlcyB0aGUgZXZlbiBwYWNrZXRz IGFuZCB0aGUgb3RoZXIgcHJvY2Vzc2VzIG9kZAorICogcGFja2V0cy4KKyAqCisgKiBBIG9wZGxf cmluZyBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzaXMgZm9yIHBpcGVsaW5lIGJhc2VkIGFwcGxpY2F0 aW9ucy4gSW5zdGVhZAorICogb2YgZWFjaCBzdGFnZSBpbiBhIHBpcGVsaW5lIGRlcXVldWVpbmcg ZnJvbSBhIHJpbmcsIHByb2Nlc3NpbmcgYW5kIGVucXVldWVpbmcKKyAqIHRvIGFub3RoZXIgcmlu ZywgaXQgY2FuIHByb2Nlc3MgZW50cmllcyBpbi1wbGFjZSBvbiB0aGUgcmluZy4gSWYgc3RhZ2Vz IGRvCisgKiBub3QgZGVwZW5kIG9uIGVhY2ggb3RoZXIsIHRoZXkgY2FuIHJ1biBpbiBwYXJhbGxl bC4KKyAqCisgKiBUaGUgb3BkbF9yaW5nIHdvcmtzIHdpdGggZW50cmllcyBvZiBjb25maWd1cmFi bGUgc2l6ZSwgdGhlc2UgY291bGQgYmUKKyAqIHBvaW50ZXJzIHRvIG1idWZzLCBwb2ludGVycyB0 byBtYnVmcyB3aXRoIGFwcGxpY2F0aW9uIHNwZWNpZmljIG1ldGEtZGF0YSwKKyAqIHRhc2tzIGV0 Yy4KKyAqLworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2lu Y2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxydGVfZXZlbnRkZXYuaD4KKyNpZmRlZiBfX2Nw bHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUERMX0RJU0NMQUlNU19Q RVJfTENPUkUKKy8qKiBNdWx0aS10aHJlYWRlZCBwcm9jZXNzaW5nIGFsbG93cyBvbmUgdGhyZWFk IHRvIHByb2Nlc3MgbXVsdGlwbGUgYmF0Y2hlcyBpbiBhCisgKiBzdGFnZSwgd2hpbGUgYW5vdGhl ciB0aHJlYWQgaXMgcHJvY2Vzc2luZyBhIHNpbmdsZSBsYXJnZSBiYXRjaC4gVGhpcyBudW1iZXIK KyAqIGNvbnRyb2xzIGhvdyBtYW55IG5vbi1jb250aWd1b3VzIGJhdGNoZXMgb25lIHN0YWdlIGNh biBwcm9jZXNzIGJlZm9yZSBiZWluZworICogYmxvY2tlZCBieSB0aGUgb3RoZXIgc3RhZ2UuCisg Ki8KKyNkZWZpbmUgT1BETF9ESVNDTEFJTVNfUEVSX0xDT1JFIDgKKyNlbmRpZgorCisvKiogT3Bh cXVlIGhhbmRsZSB0byBhIG9wZGxfcmluZyBpbnN0YW5jZSAqLworc3RydWN0IG9wZGxfcmluZzsK KworLyoqIE9wYXF1ZSBoYW5kbGUgdG8gYSBzaW5nbGUgc3RhZ2UgaW4gYSBvcGRsX3JpbmcgKi8K K3N0cnVjdCBvcGRsX3N0YWdlOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBh IG9wZGxfcmluZy4KKyAqCisgKiBAcGFyYW0gbmFtZQorICogICBTdHJpbmcgY29udGFpbmluZyB0 aGUgbmFtZSB0byBnaXZlIHRoZSBuZXcgb3BkbF9yaW5nIGluc3RhbmNlLgorICogQHBhcmFtIG51 bV9zbG90cworICogICBIb3cgbWFueSBzbG90cyB0aGUgb3BkbF9yaW5nIGNvbnRhaW5zLiBNdXN0 IGJlIGEgcG93ZXIgYSAyIQorICogQHBhcmFtIHNsb3Rfc2l6ZQorICogICBIb3cgbWFueSBieXRl cyBpbiBlYWNoIHNsb3QuCisgKiBAcGFyYW0gbWF4X251bV9zdGFnZXMKKyAqICAgTWF4aW11bSBu dW1iZXIgb2Ygc3RhZ2VzLgorICogQHBhcmFtIHNvY2tldAorICogICBUaGUgTlVNQSBzb2NrZXQg KG9yIFNPQ0tFVF9JRF9BTlkpIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBmb3IgdGhpcwor ICogICBvcGRsX3JpbmcgaW5zdGFuY2UuCisgKiBAcGFyYW0gdGhyZWFkc2FmZQorICogICBXaGV0 aGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgdGhyZWFkcyBpbnB1dHRpbmcgdG8gdGhlIG9wZGxfcmlu ZyBvciBub3QuCisgKiAgIEVuYWJsaW5nIHRoaXMgbWF5IGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qg b24gcGVyZm9ybWFuY2UgaWYgb25seSBvbmUgdGhyZWFkCisgKiAgIHdpbGwgYmUgaW5wdXR0aW5n LgorICoKKyAqIEByZXR1cm4KKyAqICAgQSBwb2ludGVyIHRvIGEgbmV3IG9wZGxfcmluZyBpbnN0 YW5jZSwgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RydWN0IG9wZGxfcmluZyAqCitvcGRsX3Jp bmdfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IG51bV9zbG90cywgdWludDMyX3Qg c2xvdF9zaXplLAorCQl1aW50MzJfdCBtYXhfbnVtX3N0YWdlcywgaW50IHNvY2tldCk7CisKKy8q KgorICogR2V0IHBvaW50ZXIgdG8gaW5kaXZpZHVhbCBzbG90IGluIGEgb3BkbF9yaW5nLgorICoK KyAqIEBwYXJhbSB0CisgKiAgIFRoZSBvcGRsX3JpbmcuCisgKiBAcGFyYW0gaW5kZXgKKyAqICAg SW5kZXggb2Ygc2xvdC4gSWYgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2Ygc2xvdHMgaXQgd2ls bCBiZSBtYXNrZWQgdG8gYmUKKyAqICAgd2l0aGluIGNvcnJlY3QgcmFuZ2UuCisgKgorICogQHJl dHVybgorICogICBBIHBvaW50ZXIgdG8gdGhhdCBzbG90LgorICovCit2b2lkICoKK29wZGxfcmlu Z19nZXRfc2xvdChjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0LCB1aW50MzJfdCBpbmRleCk7CisK Ky8qKgorICogR2V0IE5VTUEgc29ja2V0IHVzZWQgYnkgYSBvcGRsX3JpbmcuCisgKgorICogQHBh cmFtIHQKKyAqICAgVGhlIG9wZGxfcmluZy4KKyAqCisgKiBAcmV0dXJuCisgKiAgIE5VTUEgc29j a2V0LgorICovCitpbnQKK29wZGxfcmluZ19nZXRfc29ja2V0KGNvbnN0IHN0cnVjdCBvcGRsX3Jp bmcgKnQpOworCisvKioKKyAqIEdldCBudW1iZXIgb2Ygc2xvdHMgaW4gYSBvcGRsX3JpbmcuCisg KgorICogQHBhcmFtIHQKKyAqICAgVGhlIG9wZGxfcmluZy4KKyAqCisgKiBAcmV0dXJuCisgKiAg IE51bWJlciBvZiBzbG90cy4KKyAqLwordWludDMyX3QKK29wZGxfcmluZ19nZXRfbnVtX3Nsb3Rz KGNvbnN0IHN0cnVjdCBvcGRsX3JpbmcgKnQpOworCisvKioKKyAqIEdldCBuYW1lIG9mIGEgb3Bk bF9yaW5nLgorICoKKyAqIEBwYXJhbSB0CisgKiAgIFRoZSBvcGRsX3JpbmcuCisgKgorICogQHJl dHVybgorICogICBOYW1lIHN0cmluZy4KKyAqLworY29uc3QgY2hhciAqCitvcGRsX3JpbmdfZ2V0 X25hbWUoY29uc3Qgc3RydWN0IG9wZGxfcmluZyAqdCk7CisKKy8qKgorICogQWRkcyBhIG5ldyBw cm9jZXNzaW5nIHN0YWdlIHRvIGEgc3BlY2lmaWVkIG9wZGxfcmluZyBpbnN0YW5jZS4gQWRkaW5n IGEgc3RhZ2UKKyAqIHdoaWxlIHRoZXJlIGFyZSBlbnRyaWVzIGluIHRoZSBvcGRsX3JpbmcgYmVp bmcgcHJvY2Vzc2VkIHdpbGwgY2F1c2UgdW5kZWZpbmVkCisgKiBiZWhhdmlvdXIuCisgKgorICog QHBhcmFtIHQKKyAqICAgVGhlIG9wZGxfcmluZyB0byBhZGQgdGhlIHN0YWdlIHRvLgorICogQHBh cmFtIGRlcHMKKyAqICAgQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3RoZXIgc3RhZ2VzIHRoYXQg dGhpcyBzdGFnZSBkZXBlbmRzIG9uLiBUaGUgb3RoZXIKKyAqICAgc3RhZ2VzIG11c3QgYmUgcGFy dCBvZiB0aGUgc2FtZSBvcGRsX3JpbmchIE5vdGUgdGhhdCBpbnB1dCBpcyBhbiBpbXBsaWVkCisg KiAgIGRlcGVuZGVuY3kuIFRoaXMgY2FuIGJlIE5VTEwgaWYgbnVtX2RlcHMgaXMgMC4KKyAqIEBw YXJhbSBudW1fZGVwcworICogICBUaGUgc2l6ZSBvZiB0aGUgZGVwcyBhcnJheS4KKyAqIEBwYXJh bSB0aHJlYWRzYWZlCisgKiAgIFdoZXRoZXIgdG8gc3VwcG9ydCBtdWx0aXBsZSB0aHJlYWRzIHBy b2Nlc3NpbmcgdGhpcyBzdGFnZSBvciAgbm90LgorICogICBFbmFibGluZyB0aGlzIG1heSBoYXZl IGEgbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlIGlmIG9ubHkgb25lIHRocmVhZAorICog ICB3aWxsIGJlIHByb2Nlc3NpbmcgdGhpcyBzdGFnZS4KKyAqIEBwYXJhbSBpc19pbnB1dAorICog ICBJbmRpY2F0aW9uIHRvIG5pdGlhbGlzZSB0aGUgc3RhZ2Ugd2l0aCBhbGwgc2xvdHMgYXZhaWxh YmxlIG9yIG5vbmUKKyAqCisgKiBAcmV0dXJuCisgKiAgIEEgcG9pbnRlciB0byB0aGUgbmV3IHN0 YWdlLCBvciBOVUxMIG9uIGVycm9yLgorICovCitzdHJ1Y3Qgb3BkbF9zdGFnZSAqCitvcGRsX3N0 YWdlX2FkZChzdHJ1Y3Qgb3BkbF9yaW5nICp0LCBib29sIHRocmVhZHNhZmUsIGJvb2wgaXNfaW5w dXQpOworCisvKioKKyAqIFJldHVybnMgdGhlIGlucHV0IHN0YWdlIG9mIGEgb3BkbF9yaW5nIHRv IGJlIHVzZWQgYnkgb3RoZXIgQVBJIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gdAorICogICBU aGUgb3BkbF9yaW5nLgorICoKKyAqIEByZXR1cm4KKyAqICAgQSBwb2ludGVyIHRvIHRoZSBpbnB1 dCBzdGFnZS4KKyAqLworc3RydWN0IG9wZGxfc3RhZ2UgKgorb3BkbF9yaW5nX2dldF9pbnB1dF9z dGFnZShjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5nICp0KTsKKworLyoqCisgKiBTZXRzIHRoZSBkZXBl bmRlbmNpZXMgZm9yIGEgc3RhZ2UgKGNsZWFycyBhbGwgdGhlIHByZXZpb3VzIGRlcHMhKS4gQ2hh bmdpbmcKKyAqIGRlcGVuZGVuY2llcyB3aGlsZSB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUgb3Bk bF9yaW5nIGJlaW5nIHByb2Nlc3NlZCB3aWxsCisgKiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Vy LgorICoKKyAqIEBwYXJhbSBzCisgKiAgIFRoZSBzdGFnZSB0byBzZXQgdGhlIGRlcGVuZGVuY2ll cyBmb3IuCisgKiBAcGFyYW0gZGVwcworICogICBBbiBhcnJheSBvZiBwb2ludGVycyB0byBvdGhl ciBzdGFnZXMgdGhhdCB0aGlzIHN0YWdlIHdpbGwgZGVwZW5kcyBvbi4gVGhlCisgKiAgIG90aGVy IHN0YWdlcyBtdXN0IGJlIHBhcnQgb2YgdGhlIHNhbWUgb3BkbF9yaW5nIQorICogQHBhcmFtIG51 bV9kZXBzCisgKiAgIFRoZSBzaXplIG9mIHRoZSBkZXBzIGFycmF5LiBUaGlzIG11c3QgYmUgPiAw LgorICoKKyAqIEByZXR1cm4KKyAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIG9u IGVycm9yLgorICovCitpbnQKK29wZGxfc3RhZ2Vfc2V0X2RlcHMoc3RydWN0IG9wZGxfc3RhZ2Ug KnMsIHN0cnVjdCBvcGRsX3N0YWdlICpkZXBzW10sCisJCXVpbnQzMl90IG51bV9kZXBzKTsKKwor LyoqCisgKiBSZXR1cm5zIHRoZSBvcGRsX3JpbmcgdGhhdCBhIHN0YWdlIGJlbG9uZ3MgdG8uCisg KgorICogQHBhcmFtIHMKKyAqICAgVGhlIHN0YWdlCisgKgorICogQHJldHVybgorICogICBBIHBv aW50ZXIgdG8gdGhlIG9wZGxfcmluZyB0aGF0IHRoZSBzdGFnZSBiZWxvbmdzIHRvLgorICovCitz dHJ1Y3Qgb3BkbF9yaW5nICoKK29wZGxfc3RhZ2VfZ2V0X29wZGxfcmluZyhjb25zdCBzdHJ1Y3Qg b3BkbF9zdGFnZSAqcyk7CisKKy8qKgorICogSW5wdXRzIGEgbmV3IGJhdGNoIG9mIGVudHJpZXMg aW50byB0aGUgb3BkbF9yaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkKKyAqIHRocmVhZHNhZmUg KHdpdGggdGhlIHNhbWUgb3BkbF9yaW5nIHBhcmFtZXRlcikgaWYgdGhlIHRocmVhZHNhZmUgcGFy YW1ldGVyIG9mCisgKiBvcGRsX3JpbmdfY3JlYXRlKCkgd2FzIHRydWUuIEZvciBwZXJmb3JtYW5j ZSByZWFzb25zLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90CisgKiBjaGVjayBpbnB1dCBwYXJhbWV0 ZXJzLgorICoKKyAqIEBwYXJhbSB0CisgKiAgIFRoZSBvcGRsX3JpbmcgdG8gaW5wdXQgZW50cmll cyBpbiB0by4KKyAqIEBwYXJhbSBlbnRyaWVzCisgKiAgIEFuIGFycmF5IG9mIGVudHJpZXMgdGhh dCB3aWxsIGJlIGNvcGllZCBpbiB0byB0aGUgb3BkbF9yaW5nLgorICogQHBhcmFtIG51bV9lbnRy aWVzCisgKiAgIFRoZSBzaXplIG9mIHRoZSBlbnRyaWVzIGFycmF5LgorICogQHBhcmFtIGJsb2Nr CisgKiAgIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCBlbm91Z2gg c2xvdHMgYXJlIGF2YWlsYWJsZSB0bworICogICBpbnB1dCBhbGwgdGhlIHJlcXVlc3RlZCBlbnRy aWVzLiBJZiBmYWxzZSwgdGhlbiB0aGUgZnVuY3Rpb24gaW5wdXRzIGFzCisgKiAgIG1hbnkgZW50 cmllcyBhcyBjdXJyZW50bHkgcG9zc2libGUuCisgKgorICogQHJldHVybgorICogICBUaGUgbnVt YmVyIG9mIGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGlucHV0LgorICovCit1aW50MzJfdAorb3BkbF9y aW5nX2lucHV0KHN0cnVjdCBvcGRsX3JpbmcgKnQsIGNvbnN0IHZvaWQgKmVudHJpZXMsIHVpbnQz Ml90IG51bV9lbnRyaWVzLAorCQlib29sIGJsb2NrKTsKKworLyoqCisgKiBJbnB1dHMgYSBuZXcg YmF0Y2ggb2YgZW50cmllcyBpbnRvIGEgb3BkbCBzdGFnZS4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5 CisgKiB0aHJlYWRzYWZlICh3aXRoIHRoZSBzYW1lIG9wZGwgcGFyYW1ldGVyKSBpZiB0aGUgdGhy ZWFkc2FmZSBwYXJhbWV0ZXIgb2YKKyAqIG9wZGxfY3JlYXRlKCkgd2FzIHRydWUuIEZvciBwZXJm b3JtYW5jZSByZWFzb25zLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90CisgKiBjaGVjayBpbnB1dCBw YXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSB0CisgKiAgIFRoZSBvcGRsIHJpbmcgdG8gaW5wdXQg ZW50cmllcyBpbiB0by4KKyAqIEBwYXJhbSBzCisgKiAgIFRoZSBzdGFnZSB0byBjb3B5IGVudHJp ZXMgdG8uCisgKiBAcGFyYW0gZW50cmllcworICogICBBbiBhcnJheSBvZiBlbnRyaWVzIHRoYXQg d2lsbCBiZSBjb3BpZWQgaW4gdG8gdGhlIG9wZGwgcmluZy4KKyAqIEBwYXJhbSBudW1fZW50cmll cworICogICBUaGUgc2l6ZSBvZiB0aGUgZW50cmllcyBhcnJheS4KKyAqIEBwYXJhbSBibG9jawor ICogICBJZiB0aGlzIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBibG9ja3MgdW50aWwgZW5vdWdoIHNs b3RzIGFyZSBhdmFpbGFibGUgdG8KKyAqICAgaW5wdXQgYWxsIHRoZSByZXF1ZXN0ZWQgZW50cmll cy4gSWYgZmFsc2UsIHRoZW4gdGhlIGZ1bmN0aW9uIGlucHV0cyBhcworICogICBtYW55IGVudHJp ZXMgYXMgY3VycmVudGx5IHBvc3NpYmxlLgorICoKKyAqIEByZXR1cm4KKyAqICAgVGhlIG51bWJl ciBvZiBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnB1dC4KKyAqLwordWludDMyX3QKK29wZGxfcmlu Z19jb3B5X2Zyb21fYnVyc3Qoc3RydWN0IG9wZGxfcmluZyAqdCwgc3RydWN0IG9wZGxfc3RhZ2Ug KnMsCisJCQljb25zdCB2b2lkICplbnRyaWVzLCB1aW50MzJfdCBudW1fZW50cmllcywgYm9vbCBi bG9jayk7CisKKy8qKgorICogQ29weSBhIGJhdGNoIG9mIGVudHJpZXMgZnJvbSB0aGUgb3BkbCBy aW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkKKyAqIHRocmVhZHNhZmUgKHdpdGggdGhlIHNhbWUg b3BkbCBwYXJhbWV0ZXIpIGlmIHRoZSB0aHJlYWRzYWZlIHBhcmFtZXRlciBvZgorICogb3BkbF9j cmVhdGUoKSB3YXMgdHJ1ZS4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoaXMgZnVuY3Rpb24g ZG9lcyBub3QKKyAqIGNoZWNrIGlucHV0IHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHQKKyAq ICAgVGhlIG9wZGwgcmluZyB0byBjb3B5IGVudHJpZXMgZnJvbS4KKyAqIEBwYXJhbSBzCisgKiAg IFRoZSBzdGFnZSB0byBjb3B5IGVudHJpZXMgZnJvbS4KKyAqIEBwYXJhbSBlbnRyaWVzCisgKiAg IEFuIGFycmF5IG9mIGVudHJpZXMgdGhhdCB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBvcGRsIHJp bmcuCisgKiBAcGFyYW0gbnVtX2VudHJpZXMKKyAqICAgVGhlIHNpemUgb2YgdGhlIGVudHJpZXMg YXJyYXkuCisgKiBAcGFyYW0gYmxvY2sKKyAqICAgSWYgdGhpcyBpcyB0cnVlLCB0aGUgZnVuY3Rp b24gYmxvY2tzIHVudGlsIGVub3VnaCBzbG90cyBhcmUgYXZhaWxhYmxlIHRvCisgKiAgIGlucHV0 IGFsbCB0aGUgcmVxdWVzdGVkIGVudHJpZXMuIElmIGZhbHNlLCB0aGVuIHRoZSBmdW5jdGlvbiBp bnB1dHMgYXMKKyAqICAgbWFueSBlbnRyaWVzIGFzIGN1cnJlbnRseSBwb3NzaWJsZS4KKyAqCisg KiBAcmV0dXJuCisgKiAgIFRoZSBudW1iZXIgb2YgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5wdXQu CisgKi8KK3VpbnQzMl90CitvcGRsX3JpbmdfY29weV90b19idXJzdChzdHJ1Y3Qgb3BkbF9yaW5n ICp0LCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywKKwkJdm9pZCAqZW50cmllcywgdWludDMyX3QgbnVt X2VudHJpZXMsIGJvb2wgYmxvY2spOworCisvKioKKyAqIEJlZm9yZSBwcm9jZXNzaW5nIGEgYmF0 Y2ggb2YgZW50cmllcywgYSBzdGFnZSBtdXN0IGZpcnN0IGNsYWltIHRoZW0gdG8gZ2V0CisgKiBh Y2Nlc3MuIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkc2FmZSB1c2luZyBzYW1lIG9wZGxfc3RhZ2Ug cGFyYW1ldGVyIGlmCisgKiB0aGUgc3RhZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aHJlYWRzYWZlIHNl dCB0byB0cnVlLCBvdGhlcndpc2UgaXQgaXMgb25seQorICogdGhyZWFkc2FmZSB3aXRoIGEgZGlm ZmVyZW50IG9wZGxfc3RhZ2UgcGVyIHRocmVhZC4gRm9yIHBlcmZvcm1hbmNlCisgKiByZWFzb25z LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIGlucHV0IHBhcmFtZXRlcnMuCisgKgorICog QHBhcmFtIHMKKyAqICAgVGhlIG9wZGxfcmluZyBzdGFnZSB0byByZWFkIGVudHJpZXMgaW4uCisg KiBAcGFyYW0gZW50cmllcworICogICBBbiBhcnJheSBvZiBwb2ludGVycyB0byBlbnRyaWVzIHRo YXQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhpcyBmdW5jdGlvbi4KKyAqIEBwYXJhbSBudW1fZW50 cmllcworICogICBUaGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gYXR0ZW1wdCB0byBjbGFpbSBmb3Ig cHJvY2Vzc2luZyAoYW5kIHRoZSBzaXplIG9mCisgKiAgIHRoZSBlbnRyaWVzIGFycmF5KS4KKyAq IEBwYXJhbSBzZXEKKyAqICAgSWYgbm90IE5VTEwsIHRoaXMgaXMgc2V0IHRvIHRoZSB2YWx1ZSBv ZiB0aGUgaW50ZXJuYWwgc3RhZ2Ugc2VxdWVuY2UgbnVtYmVyCisgKiAgIGFzc29jaWF0ZWQgd2l0 aCB0aGUgZmlyc3QgZW50cnkgcmV0dXJuZWQuCisgKiBAcGFyYW0gYmxvY2sKKyAqICAgSWYgdGhp cyBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gYmxvY2tzIHVudGlsIG51bV9lbnRyaWVzIHNsb3RzIGFy ZSBhdmFpbGFibGUKKyAqICAgdG8gcHJvY2Vzcy4gSWYgZmFsc2UsIHRoZW4gdGhlIGZ1bmN0aW9u IGNsYWltcyBhcyBtYW55IGVudHJpZXMgYXMKKyAqICAgY3VycmVudGx5IHBvc3NpYmxlLgorICoK KyAqIEBwYXJhbSBhdG9taWMKKyAqICAgaWYgdGhpcyBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gd2ls bCByZXR1cm4gZXZlbnQgYWNjb3JkaW5nIHRvIGV2ZW50IGZsb3cgaWQKKyAqIEByZXR1cm4KKyAq ICAgVGhlIG51bWJlciBvZiBwb2ludGVycyB0byBlbnRyaWVzIGZpbGxlZCBpbiB0byB0aGUgZW50 cmllcyBhcnJheS4KKyAqLwordWludDMyX3QKK29wZGxfc3RhZ2VfY2xhaW0oc3RydWN0IG9wZGxf c3RhZ2UgKnMsIHZvaWQgKmVudHJpZXMsCisJCXVpbnQzMl90IG51bV9lbnRyaWVzLCB1aW50MzJf dCAqc2VxLCBib29sIGJsb2NrLCBib29sIGF0b21pYyk7CisKK3VpbnQzMl90CitvcGRsX3N0YWdl X2RlcHNfYWRkKHN0cnVjdCBvcGRsX3JpbmcgKnQsIHN0cnVjdCBvcGRsX3N0YWdlICpzLAorCQl1 aW50MzJfdCBuYl9pbnN0YW5jZSwgdWludDMyX3QgaW5zdGFuY2VfaWQsCisJCXN0cnVjdCBvcGRs X3N0YWdlICpkZXBzW10sIHVpbnQzMl90IG51bV9kZXBzKTsKKworLyoqCisgKiBBIGZ1bmN0aW9u IHRvIGNoZWNrIGhvdyBtYW55IGVudHJpZXMgYXJlIHJlYWR5IHRvIGJlIGNsYWltZWQuCisgKgor ICogQHBhcmFtIGVudHJpZXMKKyAqICAgQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZW50cmllcy4K KyAqIEBwYXJhbSBudW1fZW50cmllcworICogICBOdW1iZXIgb2YgZW50cmllcyBpbiBhbiBhcnJh eS4KKyAqIEBwYXJhbSBhcmcKKyAqICAgQW4gb3BhcXVlIHBvaW50ZXIgdG8gZGF0YSBwYXNzZWQg dG8gdGhlIGNsYWltIGZ1bmN0aW9uLgorICogQHBhcmFtIGJsb2NrCisgKiAgIFdoZW4gc2V0IHRv IHRydWUsIHRoZSBmdW5jdGlvbiBzaG91bGQgd2FpdCB1bnRpbCBudW1fZW50cmllcyBhcmUgcmVh ZHkgdG8KKyAqICAgYmUgcHJvY2Vzc2VkLiBPdGhlcndpc2UgaXQgc2hvdWxkIHJldHVybiBpbW1l ZGlhdGVseS4KKyAqCisgKiBAcmV0dXJuCisgKiAgIE51bWJlciBvZiBlbnRyaWVzIHJlYWR5IHRv IGJlIGNsYWltZWQuCisgKi8KK3R5cGVkZWYgdWludDMyX3QgKG9wZGxfcmluZ19jaGVja19lbnRy aWVzX3QpKHZvaWQgKmVudHJpZXNbXSwKKwkJdWludDMyX3QgbnVtX2VudHJpZXMsIHZvaWQgKmFy ZywgYm9vbCBibG9jayk7CisKKy8qKgorICogQmVmb3JlIHByb2Nlc3NpbmcgYSBiYXRjaCBvZiBl bnRyaWVzLCBhIHN0YWdlIG11c3QgZmlyc3QgY2xhaW0gdGhlbSB0byBnZXQKKyAqIGFjY2Vzcy4g RWFjaCBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBwYXNzZWQgY2hlY2soKSBmdW5jdGlvbiBhbmQg ZGVwZW5kaW5nCisgKiBvbiBibG9jayB2YWx1ZSwgaXQgd2FpdHMgdW50aWwgbnVtX2VudHJpZXMg YXJlIHJlYWR5IG9yIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9u bHkgdGhyZWFkc2FmZSB3aXRoIGEgZGlmZmVyZW50IG9wZGxfc3RhZ2UgcGVyIHRocmVhZC4KKyAq CisgKiBAcGFyYW0gcworICogICBUaGUgb3BkbF9yaW5nIHN0YWdlIHRvIHJlYWQgZW50cmllcyBp bi4KKyAqIEBwYXJhbSBlbnRyaWVzCisgKiAgIEFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGVudHJp ZXMgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGlzIGZ1bmN0aW9uLgorICogQHBhcmFtIG51 bV9lbnRyaWVzCisgKiAgIFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBhdHRlbXB0IHRvIGNsYWlt IGZvciBwcm9jZXNzaW5nIChhbmQgdGhlIHNpemUgb2YKKyAqICAgdGhlIGVudHJpZXMgYXJyYXkp LgorICogQHBhcmFtIHNlcQorICogICBJZiBub3QgTlVMTCwgdGhpcyBpcyBzZXQgdG8gdGhlIHZh bHVlIG9mIHRoZSBpbnRlcm5hbCBzdGFnZSBzZXF1ZW5jZSBudW1iZXIKKyAqICAgYXNzb2NpYXRl ZCB3aXRoIHRoZSBmaXJzdCBlbnRyeSByZXR1cm5lZC4KKyAqIEBwYXJhbSBibG9jaworICogICBJ ZiB0aGlzIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBibG9ja3MgdW50aWwgbnVtX2VudHJpZXMgcmVh ZHkgc2xvdHMgYXJlCisgKiAgIGF2YWlsYWJsZSB0byBwcm9jZXNzLiBJZiBmYWxzZSwgdGhlbiB0 aGUgZnVuY3Rpb24gY2xhaW1zIGFzIG1hbnkgcmVhZHkKKyAqICAgZW50cmllcyBhcyBjdXJyZW50 bHkgcG9zc2libGUuCisgKiBAcGFyYW0gY2hlY2sKKyAqICAgUG9pbnRlciB0byBhIGZ1bmN0aW9u IGNhbGxlZCB0byBjaGVjayBlbnRyaWVzLgorICogQHBhcmFtIGFyZworICogICBPcGFxdWUgZGF0 YSBwYXNzZWQgdG8gY2hlY2soKSBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuCisgKiAgIFRoZSBu dW1iZXIgb2YgcG9pbnRlcnMgdG8gcmVhZHkgZW50cmllcyBmaWxsZWQgaW4gdG8gdGhlIGVudHJp ZXMgYXJyYXkuCisgKi8KK3VpbnQzMl90CitvcGRsX3N0YWdlX2NsYWltX2NoZWNrKHN0cnVjdCBv cGRsX3N0YWdlICpzLCB2b2lkICoqZW50cmllcywKKwkJdWludDMyX3QgbnVtX2VudHJpZXMsIHVp bnQzMl90ICpzZXEsIGJvb2wgYmxvY2ssCisJCW9wZGxfcmluZ19jaGVja19lbnRyaWVzX3QgKmNo ZWNrLCB2b2lkICphcmcpOworCisvKioKKyAqIEJlZm9yZSBwcm9jZXNzaW5nIGEgYmF0Y2ggb2Yg ZW50cmllcywgYSBzdGFnZSBtdXN0IGZpcnN0IGNsYWltIHRoZW0gdG8gZ2V0CisgKiBhY2Nlc3Mu IFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkc2FmZSB1c2luZyBzYW1lIG9wZGxfc3RhZ2UgcGFyYW1l dGVyIGlmCisgKiB0aGUgc3RhZ2Ugd2FzIGNyZWF0ZWQgd2l0aCB0aHJlYWRzYWZlIHNldCB0byB0 cnVlLCBvdGhlcndpc2UgaXQgaXMgb25seQorICogdGhyZWFkc2FmZSB3aXRoIGEgZGlmZmVyZW50 IG9wZGxfc3RhZ2UgcGVyIHRocmVhZC4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRo aXMgZnVuY3Rpb24gYW5kIG9wZGxfc3RhZ2VfY2xhaW0oKSBpcyB0aGF0IHRoaXMKKyAqIGZ1bmN0 aW9uIGNvcGllcyB0aGUgZW50cmllcyBmcm9tIHRoZSBvcGRsX3JpbmcuIE5vdGUgdGhhdCBhbnkg Y2hhbmdlcyBtYWRlIHRvCisgKiB0aGUgY29waWVkIGVudHJpZXMgd2lsbCBub3QgYmUgcmVmbGVj dGVkIGJhY2sgaW4gdG8gdGhlIGVudHJpZXMgaW4gdGhlCisgKiBvcGRsX3JpbmcsIHNvIHRoaXMg ZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgZW50cmllcyBhcmUKKyAq IHBvaW50ZXJzIHRvIG90aGVyIGRhdGEuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGlzIGZ1 bmN0aW9uIGRvZXMgbm90IGNoZWNrCisgKiBpbnB1dCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJh bSBzCisgKiAgIFRoZSBvcGRsX3Jpbmcgc3RhZ2UgdG8gcmVhZCBlbnRyaWVzIGluLgorICogQHBh cmFtIGVudHJpZXMKKyAqICAgQW4gYXJyYXkgb2YgZW50cmllcyB0aGF0IHdpbGwgYmUgZmlsbGVk IGluIGJ5IHRoaXMgZnVuY3Rpb24uCisgKiBAcGFyYW0gbnVtX2VudHJpZXMKKyAqICAgVGhlIG51 bWJlciBvZiBlbnRyaWVzIHRvIGF0dGVtcHQgdG8gY2xhaW0gZm9yIHByb2Nlc3NpbmcgKGFuZCB0 aGUgc2l6ZSBvZgorICogICB0aGUgZW50cmllcyBhcnJheSkuCisgKiBAcGFyYW0gc2VxCisgKiAg IElmIG5vdCBOVUxMLCB0aGlzIGlzIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGludGVybmFsIHN0 YWdlIHNlcXVlbmNlIG51bWJlcgorICogICBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IGVudHJ5 IHJldHVybmVkLgorICogQHBhcmFtIGJsb2NrCisgKiAgIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGZ1 bmN0aW9uIGJsb2NrcyB1bnRpbCBudW1fZW50cmllcyBzbG90cyBhcmUgYXZhaWxhYmxlCisgKiAg IHRvIHByb2Nlc3MuIElmIGZhbHNlLCB0aGVuIHRoZSBmdW5jdGlvbiBjbGFpbXMgYXMgbWFueSBl bnRyaWVzIGFzCisgKiAgIGN1cnJlbnRseSBwb3NzaWJsZS4KKyAqCisgKiBAcmV0dXJuCisgKiAg IFRoZSBudW1iZXIgb2YgZW50cmllcyBjb3BpZWQgaW4gdG8gdGhlIGVudHJpZXMgYXJyYXkuCisg Ki8KK3VpbnQzMl90CitvcGRsX3N0YWdlX2NsYWltX2NvcHkoc3RydWN0IG9wZGxfc3RhZ2UgKnMs IHZvaWQgKmVudHJpZXMsCisJCXVpbnQzMl90IG51bV9lbnRyaWVzLCB1aW50MzJfdCAqc2VxLCBi b29sIGJsb2NrKTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4g YSBzdGFnZSBoYXMgZmluaXNoZWQgaXRzIHByb2Nlc3Npbmcgb2YKKyAqIGVudHJpZXMsIHRvIG1h a2UgdGhlbSBhdmFpbGFibGUgdG8gYW55IGRlcGVuZGVudCBzdGFnZXMuIEFsbCBlbnRyaWVzIHRo YXQgYXJlCisgKiBjbGFpbWVkIGJ5IHRoZSBjYWxsaW5nIHRocmVhZCBpbiB0aGUgc3RhZ2Ugd2ls bCBiZSBkaXNjbGFpbWVkLiBJdCBpcyBwb3NzaWJsZQorICogdG8gY2xhaW0gbXVsdGlwbGUgYmF0 Y2hlcyBiZWZvcmUgZGlzY2xhaW1pbmcuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGlzCisg KiBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayBpbnB1dCBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJh bSBzCisgKiAgIFRoZSBvcGRsX3Jpbmcgc3RhZ2UgaW4gd2hpY2ggdG8gZGlzY2xhaW0gYWxsIGNs YWltZWQgZW50cmllcy4KKyAqCisgKiBAcGFyYW0gYmxvY2sKKyAqICAgRW50cmllcyBhcmUgYWx3 YXlzIG1hZGUgYXZhaWxhYmxlIHRvIGEgc3RhZ2UgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5 CisgKiAgIHdlcmUgaW5wdXQgaW4gdGhlIHN0YWdlLiBJZiBhIHN0YWdlIGlzIG11bHRpdGhyZWFk IHNhZmUsIHRoaXMgbWF5IG1lYW4gdGhhdAorICogICBmdWxsIGRpc2NsYWltaW5nIG9mIGEgYmF0 Y2ggb2YgZW50cmllcyBjYW4gbm90IGJlIGNvbnNpZGVyZWQgY29tcGxldGUgdW50aWwKKyAqICAg YWxsIGVhcmxpZXIgdGhyZWFkcyBpbiB0aGUgc3RhZ2UgaGF2ZSBkaXNjbGFpbWVkLiBJZiB0aGlz IHBhcmFtZXRlciBpcyB0cnVlCisgKiAgIHRoZW4gdGhlIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCBh bGwgZW50cmllcyBhcmUgZnVsbHkgZGlzY2xhaW1lZCwgb3RoZXJ3aXNlCisgKiAgIGl0IGRpc2Ns YWltcyBhcyBtYW55IGFzIGN1cnJlbnRseSBwb3NzaWJsZSwgd2l0aCBub24gZnVsbHkgZGlzY2xh aW1lZAorICogICBiYXRjaGVzIHN0b3JlZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGEgY2xhaW0g b3IgZGlzY2xhaW0gZnVuY3Rpb24gZm9yIHRoaXMKKyAqICAgc3RhZ2Ugb24gdGhpcyB0aHJlYWQu CisgKgorICogICBJZiBhIHRocmVhZCBpcyBub3QgZ29pbmcgdG8gcHJvY2VzcyBhbnkgbW9yZSBl bnRyaWVzIGluIHRoaXMgc3RhZ2UsIGl0CisgKiAgICptdXN0KiBmaXJzdCBjYWxsIHRoaXMgZnVu Y3Rpb24gd2l0aCB0aGlzIHBhcmFtZXRlciBzZXQgdG8gdHJ1ZSB0byBlbnN1cmUKKyAqICAgaXQg ZG9lcyBub3QgYmxvY2sgdGhlIGVudGlyZSBvcGRsX3JpbmcuCisgKgorICogICBJbiBhIHNpbmds ZSB0aHJlYWRlZCBzdGFnZSwgdGhpcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KKyAqLworaW50 CitvcGRsX3N0YWdlX2Rpc2NsYWltKHN0cnVjdCBvcGRsX3N0YWdlICpzLCB1aW50MzJfdCBudW1f ZW50cmllcywKKwkJYm9vbCBibG9jayk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUg Y2FsbGVkIHdoZW4gYSBzdGFnZSBoYXMgZmluaXNoZWQgaXRzIHByb2Nlc3Npbmcgb2YKKyAqIGVu dHJpZXMsIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8gYW55IGRlcGVuZGVudCBzdGFnZXMuIFRo ZSBkaWZmZXJlbmNlCisgKiBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kIG9wZGxfc3RhZ2VfZGlz Y2xhaW0oKSBpcyB0aGF0IGhlcmUgb25seSBhCisgKiBwb3J0aW9uIG9mIGVudHJpZXMgYXJlIGRp c2NsYWltZWQsIG5vdCBhbGwgb2YgdGhlbS4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCisgKiB0 aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIGlucHV0IHBhcmFtZXRlcnMuCisgKgorICogQHBh cmFtIHMKKyAqICAgVGhlIG9wZGxfcmluZyBzdGFnZSBpbiB3aGljaCB0byBkaXNjbGFpbSBlbnRy aWVzLgorICoKKyAqIEBwYXJhbSBudW1fZW50cmllcworICogICBUaGUgbnVtYmVyIG9mIGVudHJp ZXMgdG8gZGlzY2xhaW0uCisgKgorICogQHBhcmFtIGJsb2NrCisgKiAgIEVudHJpZXMgYXJlIGFs d2F5cyBtYWRlIGF2YWlsYWJsZSB0byBhIHN0YWdlIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhl eQorICogICB3ZXJlIGlucHV0IGluIHRoZSBzdGFnZS4gSWYgYSBzdGFnZSBpcyBtdWx0aXRocmVh ZCBzYWZlLCB0aGlzIG1heSBtZWFuIHRoYXQKKyAqICAgZnVsbCBkaXNjbGFpbWluZyBvZiBhIGJh dGNoIG9mIGVudHJpZXMgY2FuIG5vdCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlIHVudGlsCisgKiAg IGFsbCBlYXJsaWVyIHRocmVhZHMgaW4gdGhlIHN0YWdlIGhhdmUgZGlzY2xhaW1lZC4gSWYgdGhp cyBwYXJhbWV0ZXIgaXMgdHJ1ZQorICogICB0aGVuIHRoZSBmdW5jdGlvbiBibG9ja3MgdW50aWwg dGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBoYXMgYmVlbgorICogICBkaXNjbGFpbWVk IChvciB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIHRvIGRpc2NsYWltKS4gT3RoZXJ3aXNlIGl0 CisgKiAgIGRpc2NsYWltcyBhcyBtYW55IGNsYWltcyBhcyBjdXJyZW50bHkgcG9zc2libGUgYW5k IGFuIGF0dGVtcHQgdG8gZGlzY2xhaW0KKyAqICAgdGhlbSBpcyBtYWRlIHRoZSBuZXh0IHRpbWUg YSBjbGFpbSBvciBkaXNjbGFpbSBmdW5jdGlvbiBmb3IgdGhpcyBzdGFnZSBvbgorICogICB0aGlz IHRocmVhZCBpcyBjYWxsZWQuCisgKgorICogICBJbiBhIHNpbmdsZSB0aHJlYWRlZCBzdGFnZSwg dGhpcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KKyAqLwordm9pZAorb3BkbF9zdGFnZV9kaXNj bGFpbV9uKHN0cnVjdCBvcGRsX3N0YWdlICpzLCB1aW50MzJfdCBudW1fZW50cmllcywKKwkJYm9v bCBibG9jayk7CisKKy8qKgorICogQ2hlY2sgaG93IG1hbnkgZW50cmllcyBjYW4gYmUgaW5wdXQu CisgKgorICogQHBhcmFtIHQKKyAqICAgVGhlIG9wZGxfcmluZyBpbnN0YW5jZSB0byBjaGVjay4K KyAqCisgKiBAcmV0dXJuCisgKiAgIFRoZSBudW1iZXIgb2YgbmV3IGVudHJpZXMgY3VycmVudGx5 IGFsbG93ZWQgdG8gYmUgaW5wdXQuCisgKi8KK3VpbnQzMl90CitvcGRsX3JpbmdfYXZhaWxhYmxl KHN0cnVjdCBvcGRsX3JpbmcgKnQpOworCisvKioKKyAqIENoZWNrIGhvdyBtYW55IGVudHJpZXMg Y2FuIGJlIHByb2Nlc3NlZCBpbiBhIHN0YWdlLgorICoKKyAqIEBwYXJhbSBzCisgKiAgIFRoZSBz dGFnZSB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuCisgKiAgIFRoZSBudW1iZXIgb2YgZW50cmll cyBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIGJlIHByb2Nlc3NlZCBpbiB0aGlzIHN0YWdlLgorICov Cit1aW50MzJfdAorb3BkbF9zdGFnZV9hdmFpbGFibGUoc3RydWN0IG9wZGxfc3RhZ2UgKnMpOwor CisvKioKKyAqIENoZWNrIGhvdyBtYW55IGVudHJpZXMgYXJlIGF2YWlsYWJsZSB0byBiZSBwcm9j ZXNzZWQuCisgKgorICogTk9URSA6IERPRVMgTk9UIENIQU5HRSBBTlkgU1RBVEUgV0lUSElOIFRI RSBTVEFHRQorICoKKyAqIEBwYXJhbSBzCisgKiAgIFRoZSBzdGFnZSB0byBjaGVjay4KKyAqCisg KiBAcGFyYW0gbnVtX2VudHJpZXMKKyAqICAgVGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIGNoZWNr IGZvciBhdmFpbGFiaWxpdHkuCisgKgorICogQHJldHVybgorICogICBUaGUgbnVtYmVyIG9mIGVu dHJpZXMgY3VycmVudGx5IGF2YWlsYWJsZSB0byBiZSBwcm9jZXNzZWQgaW4gdGhpcyBzdGFnZS4K KyAqLwordWludDMyX3QKK29wZGxfc3RhZ2VfZmluZF9udW1fYXZhaWxhYmxlKHN0cnVjdCBvcGRs X3N0YWdlICpzLCB1aW50MzJfdCBudW1fZW50cmllcyk7CisKKy8qKgorICogQ3JlYXRlIGVtcHR5 IHN0YWdlIGluc3RhbmNlIGFuZCByZXR1cm4gdGhlIHBvaW50ZXIuCisgKgorICogQHBhcmFtIHQK KyAqICAgVGhlIHBvaW50ZXIgb2YgIG9wZGxfcmluZy4KKyAqCisgKiBAcGFyYW0gdGhyZWFkc2Fm ZQorICogICAgZW5hYmxlIG11bHRpcGxlIHRocmVhZCBvciBub3QuCisgKiBAcmV0dXJuCisgKiAg IFRoZSBwb2ludGVyIG9mIG9uZSBlbXB0eSBzdGFnZSBpbnN0YW5jZS4KKyAqLworc3RydWN0IG9w ZGxfc3RhZ2UgKgorb3BkbF9zdGFnZV9jcmVhdGUoc3RydWN0IG9wZGxfcmluZyAqdCwgIGJvb2wg dGhyZWFkc2FmZSk7CisKKy8qKgorICogUHJpbnRzIGluZm9ybWF0aW9uIG9uIG9wZGxfcmluZyBp bnN0YW5jZSBhbmQgYWxsIGl0cyBzdGFnZXMKKyAqCisgKiBAcGFyYW0gdAorICogICBUaGUgc3Rh Z2UgdG8gcHJpbnQgaW5mbyBvbi4KKyAqIEBwYXJhbSBmCisgKiAgIFdoZXJlIHRvIHByaW50IHRo ZSBpbmZvLgorICovCit2b2lkCitvcGRsX3JpbmdfZHVtcChjb25zdCBzdHJ1Y3Qgb3BkbF9yaW5n ICp0LCBGSUxFICpmKTsKKworLyoqCisgKiBCbG9ja3MgdW50aWwgYWxsIGVudHJpZXMgaW4gYSBv cGRsX3JpbmcgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSBhbGwgc3RhZ2VzLgorICoKKyAqIEBwYXJh bSB0CisgKiAgIFRoZSBvcGRsX3JpbmcgaW5zdGFuY2UgdG8gZmx1c2guCisgKi8KK3ZvaWQKK29w ZGxfcmluZ19mbHVzaChzdHJ1Y3Qgb3BkbF9yaW5nICp0KTsKKworLyoqCisgKiBEZWFsbG9jYXRl cyBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgYSBvcGRsX3JpbmcgaW5zdGFuY2UKKyAqCisgKiBAcGFy YW0gdAorICogICBUaGUgb3BkbF9yaW5nIGluc3RhbmNlIHRvIGZyZWUuCisgKi8KK3ZvaWQKK29w ZGxfcmluZ19mcmVlKHN0cnVjdCBvcGRsX3JpbmcgKnQpOworCisvKioKKyAqIFNlYXJjaCBmb3Ig YSBvcGRsX3JpbmcgYnkgaXRzIG5hbWUKKyAqCisgKiBAcGFyYW0gbmFtZQorICogICBUaGUgbmFt ZSBvZiB0aGUgb3BkbF9yaW5nLgorICogQHJldHVybgorICogICBUaGUgcG9pbnRlciB0byB0aGUg b3BkbF9yaW5nIG1hdGNoaW5nIHRoZSBuYW1lLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqCisg Ki8KK3N0cnVjdCBvcGRsX3JpbmcgKgorb3BkbF9yaW5nX2xvb2t1cChjb25zdCBjaGFyICpuYW1l KTsKKworLyoqCisgKiBTZXQgYSBvcGRsX3N0YWdlIHRvIHRocmVhZHNhZmUgdmFyaWFibGUuCisg KgorICogQHBhcmFtIHMKKyAqICAgVGhlIG9wZGxfc3RhZ2UuCisgKiBAcGFyYW0gdGhyZWFkc2Fm ZQorICogICBUaHJlYWRzYWZlIHZhbHVlLgorICovCit2b2lkCitvcGRsX3Jpbmdfc2V0X3N0YWdl X3RocmVhZHNhZmUoc3RydWN0IG9wZGxfc3RhZ2UgKnMsIGJvb2wgdGhyZWFkc2FmZSk7CisKKwor LyoqCisgKiBDb21wYXJlIHRoZSBldmVudCBkZXNjcmlwdG9yIHdpdGggb3JpZ2luYWwgdmVyc2lv biBpbiB0aGUgcmluZy4KKyAqIGlmIGtleSBmaWVsZCBldmVudCBkZXNjcmlwdG9yIGlzIGNoYW5n ZWQgYnkgYXBwbGljYXRpb24sIHRoZW4KKyAqIHVwZGF0ZSB0aGUgc2xvdCBpbiB0aGUgcmluZyBv dGhlcndpc2UgZG8gbm90aGluZyB3aXRoIGl0LgorICogdGhlIGtleSBmaWVsZCBpcyBmbG93X2lk LCBwcmlvaXJ0eSwgbWJ1ZiwgaW1wbF9vcGFxdWUKKyAqCisgKiBAcGFyYW0gcworICogICBUaGUg b3BkbF9zdGFnZS4KKyAqIEBwYXJhbSBldgorICogICBwb2ludGVyIG9mIHRoZSBldmVudCBkZXNj cmlwdG9yLgorICogQHBhcmFtIGluZGV4CisgKiAgIGluZGV4IG9mIHRoZSBldmVudCBkZXNjcmlw dG9yLgorICogQHBhcmFtIGF0b21pYworICogICBxdWV1ZSB0eXBlIGFzc29jaWF0ZSB3aXRoIHRo ZSBzdGFnZS4KKyAqIEByZXR1cm4KKyAqICAgaWYgdGhlIGV2ZXZudCBrZXkgZmllbGQgaXMgY2hh bmdlZCBjb21wYXJlIHdpdGggcHJldmlvdXMgcmVjb3JkLgorICovCisKK2Jvb2wKK29wZGxfcmlu Z19jYXNfc2xvdChjb25zdCBzdHJ1Y3Qgb3BkbF9zdGFnZSAqcywgY29uc3Qgc3RydWN0IHJ0ZV9l dmVudCAqZXYsCisJCXVpbnQzMl90IGluZGV4LCBib29sIGF0b21pYyk7CisKKyNpZmRlZiBfX2Nw bHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogX09QRExfSF8gKi8KZGlmZiAtLWdpdCBh L2RyaXZlcnMvZXZlbnQvb3BkbC9ydGVfcG1kX2V2ZGV2X29wZGxfdmVyc2lvbi5tYXAgYi9kcml2 ZXJzL2V2ZW50L29wZGwvcnRlX3BtZF9ldmRldl9vcGRsX3ZlcnNpb24ubWFwCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Yjk0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL2V2ZW50L29wZGwvcnRlX3BtZF9ldmRldl9vcGRsX3ZlcnNpb24ubWFwCkBAIC0wLDAgKzEs MyBAQAorRFBES18xOC4wMiB7CisJbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWsvcnRlLmFw cC5tayBiL21rL3J0ZS5hcHAubWsKaW5kZXggNmE2YTc0NS4uYTU1YTIxZCAxMDA2NDQKLS0tIGEv bWsvcnRlLmFwcC5taworKysgYi9tay9ydGUuYXBwLm1rCkBAIC0yMDAsNiArMjAwLDcgQEAgX0xE TElCUy0kKENPTkZJR19SVEVfTElCUlRFX1BNRF9PQ1RFT05UWF9TU09WRikgKz0gLWxydGVfcG1k X29jdGVvbnR4X3Nzb3ZmCiBfTERMSUJTLSQoQ09ORklHX1JURV9MSUJSVEVfUE1EX0RQQUEyX0VW RU5UREVWKSArPSAtbHJ0ZV9wbWRfZHBhYTJfZXZlbnQKIF9MRExJQlMtJChDT05GSUdfUlRFX0xJ QlJURV9PQ1RFT05UWF9NRU1QT09MKSArPSAtbHJ0ZV9tZW1wb29sX29jdGVvbnR4CiBfTERMSUJT LSQoQ09ORklHX1JURV9MSUJSVEVfT0NURU9OVFhfUE1EKSArPSAtbHJ0ZV9wbWRfb2N0ZW9udHgK K19MRExJQlMtJChDT05GSUdfUlRFX0xJQlJURV9QTURfT1BETF9FVkVOVERFVikgKz0gLWxydGVf cG1kX29wZGxfZXZlbnQKIGVuZGlmICMgQ09ORklHX1JURV9MSUJSVEVfRVZFTlRERVYKIAogaWZl cSAoJChDT05GSUdfUlRFX0xJQlJURV9EUEFBMl9QTUQpLHkpCmRpZmYgLS1naXQgYS9tay90b29s Y2hhaW4vZ2NjL3J0ZS50b29sY2hhaW4tY29tcGF0Lm1rIGIvbWsvdG9vbGNoYWluL2djYy9ydGUu dG9vbGNoYWluLWNvbXBhdC5tawppbmRleCAwMWFjN2UyLi44N2VkYmE5IDEwMDY0NAotLS0gYS9t ay90b29sY2hhaW4vZ2NjL3J0ZS50b29sY2hhaW4tY29tcGF0Lm1rCisrKyBiL21rL3Rvb2xjaGFp bi9nY2MvcnRlLnRvb2xjaGFpbi1jb21wYXQubWsKQEAgLTk1LDQgKzk1LDEwIEBAIGVsc2UKIAlp ZmVxICgkKHNoZWxsIHRlc3QgJChHQ0NfVkVSU0lPTikgLWx0IDQ3ICYmIGVjaG8gMSksIDEpCiAJ CUNPTkZJR19SVEVfTElCUlRFX1RIVU5ERVJYX05JQ1ZGX1BNRD1kCiAJZW5kaWYKKworCSMgRGlz YWJsZSBPUExEIFBNRCBmb3IgZ2NjIDwgNC43CisJaWZlcSAoJChzaGVsbCB0ZXN0ICQoR0NDX1ZF UlNJT04pIC1sdCA0NyAmJiBlY2hvIDEpLCAxKQorCQlDT05GSUdfUlRFX0xJQlJURV9QTURfT1BE TF9FVkVOVERFVj1kCisJZW5kaWYKKwogZW5kaWYKZGlmZiAtLWdpdCBhL21rL3Rvb2xjaGFpbi9p Y2MvcnRlLnRvb2xjaGFpbi1jb21wYXQubWsgYi9tay90b29sY2hhaW4vaWNjL3J0ZS50b29sY2hh aW4tY29tcGF0Lm1rCmluZGV4IDNjMjVkMTguLjIzOGVmM2IgMTAwNjQ0Ci0tLSBhL21rL3Rvb2xj aGFpbi9pY2MvcnRlLnRvb2xjaGFpbi1jb21wYXQubWsKKysrIGIvbWsvdG9vbGNoYWluL2ljYy9y dGUudG9vbGNoYWluLWNvbXBhdC5tawpAQCAtNzcsNCArNzcsMTAgQEAgZWxzZQogCWlmZXEgKCQo c2hlbGwgdGVzdCAkKElDQ19NQUpPUl9WRVJTSU9OKSAtbGUgMTYgJiYgZWNobyAxKSwgMSkKIAkJ Q09ORklHX1JURV9MSUJSVEVfVEhVTkRFUlhfTklDVkZfUE1EPWQKIAllbmRpZgorCisgICAgICAg ICMgRGlzYWJsZSBldmVudC9vcGRsICBQTUQgZm9yIGljYyA8PSAxNi4wCisJaWZlcSAoJChzaGVs bCB0ZXN0ICQoSUNDX01BSk9SX1ZFUlNJT04pIC1sZSAxNiAmJiBlY2hvIDEpLCAxKQorCQlDT05G SUdfUlRFX0xJQlJURV9QTURfT1BETF9FVkVOVERFVj1kCisJZW5kaWYKKwogZW5kaWYKLS0gCjIu Ny41CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpJbnRlbCBSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQgSXJlbGFuZCBMaW1pdGVk ClJlZ2lzdGVyZWQgaW4gSXJlbGFuZApSZWdpc3RlcmVkIE9mZmljZTogQ29sbGluc3Rvd24gSW5k dXN0cmlhbCBQYXJrLCBMZWl4bGlwLCBDb3VudHkgS2lsZGFyZQpSZWdpc3RlcmVkIE51bWJlcjog MzA4MjYzCgoKVGhpcyBlLW1haWwgYW5kIGFueSBhdHRhY2htZW50cyBtYXkgY29udGFpbiBjb25m aWRlbnRpYWwgbWF0ZXJpYWwgZm9yIHRoZSBzb2xlCnVzZSBvZiB0aGUgaW50ZW5kZWQgcmVjaXBp ZW50KHMpLiBBbnkgcmV2aWV3IG9yIGRpc3RyaWJ1dGlvbiBieSBvdGhlcnMgaXMKc3RyaWN0bHkg cHJvaGliaXRlZC4gSWYgeW91IGFyZSBub3QgdGhlIGludGVuZGVkIHJlY2lwaWVudCwgcGxlYXNl IGNvbnRhY3QgdGhlCnNlbmRlciBhbmQgZGVsZXRlIGFsbCBjb3BpZXMuCg==