From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH RFC 4/5] x86: split PVH dom0 builder to domain_build_pv.c Date: Fri, 3 Mar 2017 09:41:10 +0000 Message-ID: <20170303094111.12217-5-wei.liu2@citrix.com> References: <20170303094111.12217-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cjji8-0002Hs-Ow for xen-devel@lists.xenproject.org; Fri, 03 Mar 2017 09:41:17 +0000 In-Reply-To: <20170303094111.12217-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Andrew Cooper , Wei Liu , Jan Beulich , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= List-Id: xen-devel@lists.xenproject.org TG9uZyB0ZXJtIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBkaXNlbnRhbmdsZSBQViBhbmQgSFZNIGNv ZGUuIE1vdmUgdGhlClBWSCBkb21haW4gYnVpbGRlciB0byBhIGRlZGljYXRlZCBmaWxlLiBJdCB3 aWxsIGxhdGVyIGRlcGVuZHMgb24KQ09ORklHX0hWTSBvciBDT05GSUdfUFZILgoKVGhpcyBpbiB0 dXJuIHJlcXVpcmVzIGV4cG9zaW5nIGEgZmV3IGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHZpYQpk b21haW5fYnVpbGQuaC4KClNpZ25lZC1vZmYtYnk6IFdlaSBMaXUgPHdlaS5saXUyQGNpdHJpeC5j b20+Ci0tLQogeGVuL2FyY2gveDg2L01ha2VmaWxlICAgICAgICAgICB8ICAgIDEgKwogeGVuL2Fy Y2gveDg2L2RvbWFpbl9idWlsZC5jICAgICB8IDEwNjggKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogeGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZC5oICAgICB8ICAgIDggKwog eGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZF9wdmguYyB8IDEwOTcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDExMDggaW5zZXJ0aW9ucygr KSwgMTA2NiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB4ZW4vYXJjaC94ODYvZG9t YWluX2J1aWxkX3B2aC5jCgpkaWZmIC0tZ2l0IGEveGVuL2FyY2gveDg2L01ha2VmaWxlIGIveGVu L2FyY2gveDg2L01ha2VmaWxlCmluZGV4IGU0YzEzNGU2NmEuLjJhZDk0ZjUwYTggMTAwNjQ0Ci0t LSBhL3hlbi9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi94ZW4vYXJjaC94ODYvTWFrZWZpbGUKQEAg LTI1LDYgKzI1LDcgQEAgb2JqLXkgKz0gZG9tY3RsLm8KIG9iai15ICs9IGRvbWFpbi5vCiBvYmot YmluLXkgKz0gZG9tYWluX2J1aWxkLmluaXQubwogb2JqLWJpbi15ICs9IGRvbWFpbl9idWlsZF9w di5pbml0Lm8KK29iai1iaW4teSArPSBkb21haW5fYnVpbGRfcHZoLmluaXQubwogb2JqLXkgKz0g ZG9tYWluX3BhZ2Uubwogb2JqLXkgKz0gZTgyMC5vCiBvYmoteSArPSBleHRhYmxlLm8KZGlmZiAt LWdpdCBhL3hlbi9hcmNoL3g4Ni9kb21haW5fYnVpbGQuYyBiL3hlbi9hcmNoL3g4Ni9kb21haW5f YnVpbGQuYwppbmRleCA0Y2FiZTJmYjJlLi42NGE5Nzg0NzNkIDEwMDY0NAotLS0gYS94ZW4vYXJj aC94ODYvZG9tYWluX2J1aWxkLmMKKysrIGIveGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZC5jCkBA IC01MSwyNyArNTEsNiBAQCBzdGF0aWMgbG9uZyBfX2luaXRkYXRhIGRvbTBfbnJwYWdlczsKIHN0 YXRpYyBsb25nIF9faW5pdGRhdGEgZG9tMF9taW5fbnJwYWdlczsKIHN0YXRpYyBsb25nIF9faW5p dGRhdGEgZG9tMF9tYXhfbnJwYWdlcyA9IExPTkdfTUFYOwogCi0vKgotICogSGF2ZSB0aGUgVFNT IGNvdmVyIHRoZSBJU0EgcG9ydCByYW5nZSwgd2hpY2ggbWFrZXMgaXQKLSAqIC0gMTA0IGJ5dGVz IGJhc2Ugc3RydWN0dXJlCi0gKiAtIDMyIGJ5dGVzIGludGVycnVwdCByZWRpcmVjdGlvbiBiaXRt YXAKLSAqIC0gMTI4IGJ5dGVzIEkvTyBiaXRtYXAKLSAqIC0gb25lIHRyYWlsaW5nIGJ5dGUKLSAq IG9yIGEgdG90YWwgb2YgMjY1IGJ5dGVzLgotICoKLSAqIE5COiBhcyBQVkh2MiBEb20wIGRvZXNu J3QgaGF2ZSBsZWdhY3kgZGV2aWNlcyAoSVNBKSwgaXQgc2hvdWxkbid0IGhhdmUgYW55Ci0gKiBi dXNpbmVzcyBpbiBhY2Nlc3NpbmcgdGhlIElTQSBwb3J0IHJhbmdlLCBtdWNoIGxlc3MgaW4gcmVh bCBtb2RlLCBhbmQgZHVlIHRvCi0gKiB0aGUgbGFjayBvZiBmaXJtd2FyZSBpdCBzaG91bGRuJ3Qg YWxzbyBleGVjdXRlIGFueSBJTlQgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMKLSAqIGRvbmUganVzdCBm b3IgY29uc2lzdGVuY3kgd2l0aCB3aGF0IGh2bWxvYWRlciBkb2VzLgotICovCi0jZGVmaW5lIEhW TV9WTTg2X1RTU19TSVpFIDI2NQotCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgYWNw aV9pbnRyX292ZXJyaWRlczsKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9vdmVy cmlkZSBfX2luaXRkYXRhICppbnRzcmNvdnI7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0 ZGF0YSBhY3BpX25taV9zb3VyY2VzOwotc3RhdGljIHN0cnVjdCBhY3BpX21hZHRfbm1pX3NvdXJj ZSBfX2luaXRkYXRhICpubWlzcmM7Ci0KIC8qCiAgKiBkb20wX21lbT1bbWluOjxtaW5fYW10Pixd W21heDo8bWF4X2FtdD4sXVs8YW10Pl0KICAqIApAQCAtMjYyLDggKzI0MSw4IEBAIGJvb2xlYW5f cGFyYW0oInJvLWhwZXQiLCByb19ocGV0KTsKIAogdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbWVt ZmxhZ3MgPSBNRU1GX25vX2RtYXxNRU1GX2V4YWN0X25vZGU7CiAKLXN0YXRpYyB1bnNpZ25lZCBs b25nIF9faW5pdCBkb20wX3BhZ2luZ19wYWdlcyhjb25zdCBzdHJ1Y3QgZG9tYWluICpkLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcg bnJfcGFnZXMpCit1bnNpZ25lZCBsb25nIF9faW5pdCBkb20wX3BhZ2luZ19wYWdlcyhjb25zdCBz dHJ1Y3QgZG9tYWluICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgbG9uZyBucl9wYWdlcykKIHsKICAgICAvKiBDb3BpZWQgZnJvbTogbGlieGxfZ2V0 X3JlcXVpcmVkX3NoYWRvd19tZW1vcnkoKSAqLwogICAgIHVuc2lnbmVkIGxvbmcgbWVta2IgPSBu cl9wYWdlcyAqIChQQUdFX1NJWkUgLyAxMDI0KTsKQEAgLTQ5MiwxMDQ5ICs0NzEsNiBAQCBpbnQg X19pbml0IHNldHVwX3Blcm1pc3Npb25zKHN0cnVjdCBkb21haW4gKmQpCiAgICAgcmV0dXJuIHJj OwogfQogCi0KLXN0YXRpYyBpbnQgX19pbml0IG1vZGlmeV9pZGVudGl0eV9tbWlvKHN0cnVjdCBk b21haW4gKmQsIHVuc2lnbmVkIGxvbmcgcGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgY29uc3QgYm9vbCBtYXApCi17Ci0g ICAgaW50IHJjOwotCi0gICAgZm9yICggOyA7ICkKLSAgICB7Ci0gICAgICAgIHJjID0gKG1hcCA/ IG1hcF9tbWlvX3JlZ2lvbnMgOiB1bm1hcF9tbWlvX3JlZ2lvbnMpCi0gICAgICAgICAgICAgKGQs IF9nZm4ocGZuKSwgbnJfcGFnZXMsIF9tZm4ocGZuKSk7Ci0gICAgICAgIGlmICggcmMgPT0gMCAp Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCByYyA8IDAgKQotICAgICAgICB7Ci0g ICAgICAgICAgICBwcmludGsoWEVOTE9HX1dBUk5JTkcKLSAgICAgICAgICAgICAgICAgICAiRmFp bGVkIHRvIGlkZW50aXR5ICVzbWFwIFslI2x4LCUjbHgpIGZvciBkJWQ6ICVkXG4iLAotICAgICAg ICAgICAgICAgICAgIG1hcCA/ICIiIDogInVuIiwgcGZuLCBwZm4gKyBucl9wYWdlcywgZC0+ZG9t YWluX2lkLCByYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBucl9w YWdlcyAtPSByYzsKLSAgICAgICAgcGZuICs9IHJjOwotICAgICAgICBwcm9jZXNzX3BlbmRpbmdf c29mdGlycXMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLS8qIFBvcHVsYXRlIGEg SFZNIG1lbW9yeSByYW5nZSB1c2luZyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBvcmRlci4gKi8KLXN0 YXRpYyBpbnQgX19pbml0IHB2aF9wb3B1bGF0ZV9tZW1vcnlfcmFuZ2Uoc3RydWN0IGRvbWFpbiAq ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg bG9uZyBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgbG9uZyBucl9wYWdlcykKLXsKLSAgICB1bnNpZ25lZCBpbnQgb3JkZXIsIGkgPSAw OwotICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7Ci0gICAgaW50IHJjOwotI2RlZmluZSBNQVBf TUFYX0lURVIgNjQKLQotICAgIG9yZGVyID0gTUFYX09SREVSOwotICAgIHdoaWxlICggbnJfcGFn ZXMgIT0gMCApCi0gICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgcmFuZ2Vfb3JkZXIgPSBnZXRf b3JkZXJfZnJvbV9wYWdlcyhucl9wYWdlcyArIDEpOwotCi0gICAgICAgIG9yZGVyID0gbWluKHJh bmdlX29yZGVyID8gcmFuZ2Vfb3JkZXIgLSAxIDogMCwgb3JkZXIpOwotICAgICAgICBwYWdlID0g YWxsb2NfZG9taGVhcF9wYWdlcyhkLCBvcmRlciwgbWVtZmxhZ3MpOwotICAgICAgICBpZiAoIHBh Z2UgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCAmJiBt ZW1mbGFncyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJ5IGFnYWluIHdp dGhvdXQgYW55IG1lbWZsYWdzLiAqLwotICAgICAgICAgICAgICAgIG1lbWZsYWdzID0gMDsKLSAg ICAgICAgICAgICAgICBvcmRlciA9IE1BWF9PUkRFUjsKLSAgICAgICAgICAgICAgICBjb250aW51 ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggb3JkZXIgPT0gMCApCi0gICAgICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5 IHdpdGggb3JkZXIgMCFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAg ICAgICAgICAgfQotICAgICAgICAgICAgb3JkZXItLTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwot ICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBndWVzdF9waHlzbWFwX2FkZF9wYWdlKGQsIF9nZm4o c3RhcnQpLCBfbWZuKHBhZ2VfdG9fbWZuKHBhZ2UpKSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG9yZGVyKTsKLSAgICAgICAgaWYgKCByYyAhPSAwICkKLSAgICAgICAgewot ICAgICAgICAgICAgcHJpbnRrKCJGYWlsZWQgdG8gcG9wdWxhdGUgbWVtb3J5OiBbJSNseCwlbHgp OiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RhcnQgKyAoMVVMIDw8IG9yZGVy KSwgcmMpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLSAgICAgICAg c3RhcnQgKz0gMVVMIDw8IG9yZGVyOwotICAgICAgICBucl9wYWdlcyAtPSAxVUwgPDwgb3JkZXI7 Ci0gICAgICAgIGlmICggKCsraSAlIE1BUF9NQVhfSVRFUikgPT0gMCApCi0gICAgICAgICAgICBw cm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSN1bmRl ZiBNQVBfTUFYX0lURVIKLX0KLQotLyogU3RlYWwgUkFNIGZyb20gdGhlIGVuZCBvZiBhIG1lbW9y eSByZWdpb24uICovCi1zdGF0aWMgaW50IF9faW5pdCBwdmhfc3RlYWxfcmFtKHN0cnVjdCBkb21h aW4gKmQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgcGFkZHJfdCBsaW1pdCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGFkZHJfdCAqYWRkcikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSA9IGQt PmFyY2gubnJfZTgyMDsKLQotICAgIC8qCi0gICAgICogQWxpZ25tZW50IDAgc2hvdWxkIGJlIHNl dCB0byAxLCBzbyBpdCBkb2Vzbid0IHdyYXAgYXJvdW5kIGluIHRoZQotICAgICAqIGNhbGN1bGF0 aW9ucyBiZWxvdy4KLSAgICAgKi8KLSAgICBhbGlnbiA9IGFsaWduID8gOiAxOwotICAgIHdoaWxl ICggaS0tICkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmQtPmFy Y2guZTgyMFtpXTsKLQotICAgICAgICBpZiAoIGVudHJ5LT50eXBlICE9IEU4MjBfUkFNIHx8IGVu dHJ5LT5hZGRyICsgZW50cnktPnNpemUgPiBsaW1pdCB8fAotICAgICAgICAgICAgIGVudHJ5LT5h ZGRyIDwgTUIoMSkgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgKmFkZHIgPSAo ZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSAtIHNpemUpICYgfihhbGlnbiAtIDEpOwotICAgICAg ICBpZiAoICphZGRyIDwgZW50cnktPmFkZHIgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg ICAgICAgZW50cnktPnNpemUgPSAqYWRkciAtIGVudHJ5LT5hZGRyOwotICAgICAgICByZXR1cm4g MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gLUVOT01FTTsKLX0KLQotLyogTkI6IG1lbW9yeSBtYXAg bXVzdCBiZSBzb3J0ZWQgYXQgYWxsIHRpbWVzIGZvciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5LiAq Lwotc3RhdGljIGludCBfX2luaXQgcHZoX2FkZF9tZW1fcmFuZ2Uoc3RydWN0IGRvbWFpbiAqZCwg dWludDY0X3QgcywgdWludDY0X3QgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGludCB0eXBlKQotewotICAgIHN0cnVjdCBlODIwZW50cnkgKm1hcDsKLSAg ICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZC0+YXJjaC5ucl9lODIw OyBpKysgKQotICAgIHsKLSAgICAgICAgdWludDY0X3QgcnMgPSBkLT5hcmNoLmU4MjBbaV0uYWRk cjsKLSAgICAgICAgdWludDY0X3QgcmUgPSBycyArIGQtPmFyY2guZTgyMFtpXS5zaXplOwotCi0g ICAgICAgIGlmICggcnMgPT0gZSAmJiBkLT5hcmNoLmU4MjBbaV0udHlwZSA9PSB0eXBlICkKLSAg ICAgICAgewotICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLmFkZHIgPSBzOwotICAgICAgICAg ICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJlID09IHMgJiYgZC0+YXJj aC5lODIwW2ldLnR5cGUgPT0gdHlwZSAmJgotICAgICAgICAgICAgIChpICsgMSA9PSBkLT5hcmNo Lm5yX2U4MjAgfHwgZC0+YXJjaC5lODIwW2kgKyAxXS5hZGRyID49IGUpICkKLSAgICAgICAgewot ICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUgKz0gZSAtIHM7Ci0gICAgICAgICAgICBy ZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcnMgPj0gZSApCi0gICAgICAgICAg ICBicmVhazsKLQotICAgICAgICBpZiAoIHJlID4gcyApCi0gICAgICAgICAgICByZXR1cm4gLUVF WElTVDsKLSAgICB9Ci0KLSAgICBtYXAgPSB4emFsbG9jX2FycmF5KHN0cnVjdCBlODIwZW50cnks IGQtPmFyY2gubnJfZTgyMCArIDEpOwotICAgIGlmICggIW1hcCApCi0gICAgewotICAgICAgICBw cmludGsoWEVOTE9HX1dBUk5JTkcgIkU4MjA6IG91dCBvZiBtZW1vcnkgdG8gYWRkIHJlZ2lvblxu Iik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLQotICAgIG1lbWNweShtYXAsIGQt PmFyY2guZTgyMCwgaSAqIHNpemVvZigqZC0+YXJjaC5lODIwKSk7Ci0gICAgbWVtY3B5KG1hcCAr IGkgKyAxLCBkLT5hcmNoLmU4MjAgKyBpLAotICAgICAgICAgICAoZC0+YXJjaC5ucl9lODIwIC0g aSkgKiBzaXplb2YoKmQtPmFyY2guZTgyMCkpOwotICAgIG1hcFtpXS5hZGRyID0gczsKLSAgICBt YXBbaV0uc2l6ZSA9IGUgLSBzOwotICAgIG1hcFtpXS50eXBlID0gdHlwZTsKLSAgICB4ZnJlZShk LT5hcmNoLmU4MjApOwotICAgIGQtPmFyY2guZTgyMCA9IG1hcDsKLSAgICBkLT5hcmNoLm5yX2U4 MjArKzsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBf dm14X3JlYWxtb2RlX2hlbHBlcnMoc3RydWN0IGRvbWFpbiAqZCkKLXsKLSAgICBwMm1fdHlwZV90 IHAybXQ7Ci0gICAgdWludDMyX3QgcmMsICppZGVudF9wdDsKLSAgICBtZm5fdCBtZm47Ci0gICAg cGFkZHJfdCBnYWRkcjsKLSAgICBzdHJ1Y3QgdmNwdSAqdiA9IGQtPnZjcHVbMF07Ci0KLSAgICAv KgotICAgICAqIFN0ZWFsIHNvbWUgc3BhY2UgZnJvbSB0aGUgbGFzdCBSQU0gcmVnaW9uIGJlbG93 IDRHQiBhbmQgdXNlIGl0IHRvCi0gICAgICogc3RvcmUgdGhlIHJlYWwtbW9kZSBUU1MuIEl0IG5l ZWRzIHRvIGJlIGFsaWduZWQgdG8gMTI4IHNvIHRoYXQgdGhlCi0gICAgICogVFNTIHN0cnVjdHVy ZSAod2hpY2ggYWNjb3VudHMgZm9yIHRoZSBmaXJzdCAxMDRiKSBkb2Vzbid0IGNyb3NzCi0gICAg ICogYSBwYWdlIGJvdW5kYXJ5LgotICAgICAqLwotICAgIGlmICggIXB2aF9zdGVhbF9yYW0oZCwg SFZNX1ZNODZfVFNTX1NJWkUsIDEyOCwgR0IoNCksICZnYWRkcikgKQotICAgIHsKLSAgICAgICAg aWYgKCBodm1fY29weV90b19ndWVzdF9waHlzKGdhZGRyLCBOVUxMLCBIVk1fVk04Nl9UU1NfU0la RSwgdikgIT0KLSAgICAgICAgICAgICBIVk1DT1BZX29rYXkgKQotICAgICAgICAgICAgcHJpbnRr KCJVbmFibGUgdG8gemVybyBWTTg2IFRTUyBhcmVhXG4iKTsKLSAgICAgICAgZC0+YXJjaC5odm1f ZG9tYWluLnBhcmFtc1tIVk1fUEFSQU1fVk04Nl9UU1NfU0laRURdID0KLSAgICAgICAgICAgIFZN ODZfVFNTX1VQREFURUQgfCAoKHVpbnQ2NF90KUhWTV9WTTg2X1RTU19TSVpFIDw8IDMyKSB8IGdh ZGRyOwotICAgICAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIEhW TV9WTTg2X1RTU19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEU4MjBfUkVT RVJWRUQpICkKLSAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIHNldCBWTTg2IFRTUyBhcyBy ZXNlcnZlZCBpbiB0aGUgbWVtb3J5IG1hcFxuIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAg cHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgVk04NiBUU1MgYXJlYVxuIik7Ci0KLSAgICAvKiBT dGVhbCBzb21lIG1vcmUgUkFNIGZvciB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXMuICovCi0gICAg aWYgKCBwdmhfc3RlYWxfcmFtKGQsIFBBR0VfU0laRSwgUEFHRV9TSVpFLCBHQig0KSwgJmdhZGRy KSApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBmaW5kIG1lbW9yeSB0byBzdGFz aCB0aGUgaWRlbnRpdHkgcGFnZSB0YWJsZXNcbiIpOwotICAgICAgICByZXR1cm4gLUVOT01FTTsK LSAgICB9Ci0KLSAgICAvKgotICAgICAqIElkZW50aXR5LW1hcCBwYWdlIHRhYmxlIGlzIHJlcXVp cmVkIGZvciBydW5uaW5nIHdpdGggQ1IwLlBHPTAKLSAgICAgKiB3aGVuIHVzaW5nIEludGVsIEVQ VC4gQ3JlYXRlIGEgMzItYml0IG5vbi1QQUUgcGFnZSBkaXJlY3Rvcnkgb2YKLSAgICAgKiBzdXBl cnBhZ2VzLgotICAgICAqLwotICAgIGlkZW50X3B0ID0gbWFwX2RvbWFpbl9nZm4ocDJtX2dldF9o b3N0cDJtKGQpLCBfZ2ZuKFBGTl9ET1dOKGdhZGRyKSksCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAmbWZuLCAmcDJtdCwgMCwgJnJjKTsKLSAgICBpZiAoIGlkZW50X3B0ID09IE5VTEwg KQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gbWFwIGlkZW50aXR5IHBhZ2UgdGFi bGVzXG4iKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIHdyaXRlXzMyYml0 X3BzZV9pZGVudG1hcChpZGVudF9wdCk7Ci0gICAgdW5tYXBfZG9tYWluX3BhZ2UoaWRlbnRfcHQp OwotICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKG1mbl94KG1mbikpKTsKLSAgICBkLT5hcmNoLmh2 bV9kb21haW4ucGFyYW1zW0hWTV9QQVJBTV9JREVOVF9QVF0gPSBnYWRkcjsKLSAgICBpZiAoIHB2 aF9hZGRfbWVtX3JhbmdlKGQsIGdhZGRyLCBnYWRkciArIFBBR0VfU0laRSwgRTgyMF9SRVNFUlZF RCkgKQotICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0IGlkZW50aXR5IHBhZ2UgdGFi bGVzIGFzIHJlc2VydmVkIGluIHRoZSBtZW1vcnkgbWFwXG4iKTsKLQotICAgIHJldHVybiAwOwot fQotCi0vKiBBc3NpZ24gdGhlIGxvdyAxTUIgdG8gRG9tMC4gKi8KLXN0YXRpYyB2b2lkIF9faW5p dCBwdmhfc3RlYWxfbG93X3JhbShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIHN0YXJ0 LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnJf cGFnZXMpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBtZm47Ci0KLSAgICBBU1NFUlQoc3RhcnQgKyBu cl9wYWdlcyA8PSBQRk5fRE9XTihNQigxKSkpOwotCi0gICAgZm9yICggbWZuID0gc3RhcnQ7IG1m biA8IHN0YXJ0ICsgbnJfcGFnZXM7IG1mbisrICkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBwYWdl X2luZm8gKnBnID0gbWZuX3RvX3BhZ2UobWZuKTsKLSAgICAgICAgaW50IHJjOwotCi0gICAgICAg IHJjID0gdW5zaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBkb21faW8pOwotICAgICAgICBp ZiAoIHJjICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gdW5zaGFy ZSBYZW4gbWZuICUjbHg6ICVkXG4iLCBtZm4sIHJjKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwot ICAgICAgICB9Ci0KLSAgICAgICAgc2hhcmVfeGVuX3BhZ2Vfd2l0aF9ndWVzdChwZywgZCwgWEVO U0hBUkVfd3JpdGFibGUpOwotICAgICAgICByYyA9IGd1ZXN0X3BoeXNtYXBfYWRkX2VudHJ5KGQs IF9nZm4obWZuKSwgX21mbihtZm4pLCAwLCBwMm1fcmFtX3J3KTsKLSAgICAgICAgaWYgKCByYyAp Ci0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhZGQgbWZuICUjbHggdG8gcDJtOiAlZFxu IiwgbWZuLCByYyk7Ci0gICAgfQotfQotCi1zdGF0aWMgX19pbml0IHZvaWQgcHZoX3NldHVwX2U4 MjAoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKLXsKLSAgICBzdHJ1 Y3QgZTgyMGVudHJ5ICplbnRyeSwgKmVudHJ5X2d1ZXN0OwotICAgIHVuc2lnbmVkIGludCBpOwot ICAgIHVuc2lnbmVkIGxvbmcgcGFnZXMsIGN1cl9wYWdlcyA9IDA7Ci0gICAgdWludDY0X3Qgc3Rh cnQsIGVuZDsKLQotICAgIC8qCi0gICAgICogQ3JhZnQgdGhlIGU4MjAgbWVtb3J5IG1hcCBmb3Ig RG9tMCBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgZTgyMCBtYXAuCi0gICAgICovCi0gICAgZC0+YXJj aC5lODIwID0geHphbGxvY19hcnJheShzdHJ1Y3QgZTgyMGVudHJ5LCBlODIwLm5yX21hcCk7Ci0g ICAgaWYgKCAhZC0+YXJjaC5lODIwICkKLSAgICAgICAgcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0 ZSBtZW1vcnkgZm9yIERvbTAgZTgyMCBtYXAiKTsKLSAgICBlbnRyeV9ndWVzdCA9IGQtPmFyY2gu ZTgyMDsKLQotICAgIC8qIENsYW1wIGU4MjAgbWVtb3J5IG1hcCB0byBtYXRjaCB0aGUgbWVtb3J5 IGFzc2lnbmVkIHRvIERvbTAgKi8KLSAgICBmb3IgKCBpID0gMCwgZW50cnkgPSBlODIwLm1hcDsg aSA8IGU4MjAubnJfbWFwOyBpKyssIGVudHJ5KysgKQotICAgIHsKLSAgICAgICAgaWYgKCBlbnRy eS0+dHlwZSAhPSBFODIwX1JBTSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICplbnRyeV9ndWVz dCA9ICplbnRyeTsKLSAgICAgICAgICAgIGdvdG8gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAg IGlmICggbnJfcGFnZXMgPT0gY3VyX3BhZ2VzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoK LSAgICAgICAgICAgICAqIFdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGFzc2lnbmVkIG1lbW9yeSwK LSAgICAgICAgICAgICAqIHNraXAgdGhpcyBlbnRyeQotICAgICAgICAgICAgICovCi0gICAgICAg ICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1ha2Ug c3VyZSB0aGUgc3RhcnQgYW5kIGxlbmd0aCBhcmUgYWxpZ25lZCB0byBQQUdFX1NJWkUsIGJlY2F1 c2UKLSAgICAgICAgICogdGhhdCdzIHRoZSBtaW5pbXVtIGdyYW51bGFyaXR5IG9mIHRoZSAybmQg c3RhZ2UgdHJhbnNsYXRpb24uIFNpbmNlCi0gICAgICAgICAqIHRoZSBwMm0gY29kZSB1c2VzIFBB R0VfT1JERVJfNEsgaW50ZXJuYWxseSwgYWxzbyB1c2UgaXQgaGVyZSBpbgotICAgICAgICAgKiBv cmRlciB0byBwcmV2ZW50IHRoaXMgY29kZSBmcm9tIGdldHRpbmcgb3V0IG9mIHN5bmMuCi0gICAg ICAgICAqLwotICAgICAgICBzdGFydCA9IFJPVU5EVVAoZW50cnktPmFkZHIsIFBBR0VfU0laRSA8 PCBQQUdFX09SREVSXzRLKTsKLSAgICAgICAgZW5kID0gKGVudHJ5LT5hZGRyICsgZW50cnktPnNp emUpICYKLSAgICAgICAgICAgICAgfigoUEFHRV9TSVpFIDw8IFBBR0VfT1JERVJfNEspIC0gMSk7 Ci0gICAgICAgIGlmICggc3RhcnQgPj0gZW5kICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g ICAgICAgIGVudHJ5X2d1ZXN0LT50eXBlID0gRTgyMF9SQU07Ci0gICAgICAgIGVudHJ5X2d1ZXN0 LT5hZGRyID0gc3RhcnQ7Ci0gICAgICAgIGVudHJ5X2d1ZXN0LT5zaXplID0gZW5kIC0gc3RhcnQ7 Ci0gICAgICAgIHBhZ2VzID0gUEZOX0RPV04oZW50cnlfZ3Vlc3QtPnNpemUpOwotICAgICAgICBp ZiAoIChjdXJfcGFnZXMgKyBwYWdlcykgPiBucl9wYWdlcyApCi0gICAgICAgIHsKLSAgICAgICAg ICAgIC8qIFRydW5jYXRlIHJlZ2lvbiAqLwotICAgICAgICAgICAgZW50cnlfZ3Vlc3QtPnNpemUg PSAobnJfcGFnZXMgLSBjdXJfcGFnZXMpIDw8IFBBR0VfU0hJRlQ7Ci0gICAgICAgICAgICBjdXJf cGFnZXMgPSBucl9wYWdlczsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAg ICAgICAgICAgIGN1cl9wYWdlcyArPSBwYWdlczsKLSAgICAgICAgfQotIG5leHQ6Ci0gICAgICAg IGQtPmFyY2gubnJfZTgyMCsrOwotICAgICAgICBlbnRyeV9ndWVzdCsrOwotICAgIH0KLSAgICBB U1NFUlQoY3VyX3BhZ2VzID09IG5yX3BhZ2VzKTsKLSAgICBBU1NFUlQoZC0+YXJjaC5ucl9lODIw IDw9IGU4MjAubnJfbWFwKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX3NldHVwX3AybShz dHJ1Y3QgZG9tYWluICpkKQotewotICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAg ICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGludCBy YzsKLSAgICBib29sIHByZWVtcHRlZDsKLSNkZWZpbmUgTUIxX1BBR0VTIFBGTl9ET1dOKE1CKDEp KQotCi0gICAgbnJfcGFnZXMgPSBjb21wdXRlX2RvbTBfbnJfcGFnZXMoZCwgTlVMTCwgMCk7Ci0K LSAgICBwdmhfc2V0dXBfZTgyMChkLCBucl9wYWdlcyk7Ci0gICAgZG8gewotICAgICAgICBwcmVl bXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgcGFnaW5nX3NldF9hbGxvY2F0aW9uKGQsIGRvbTBfcGFn aW5nX3BhZ2VzKGQsIG5yX3BhZ2VzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZw cmVlbXB0ZWQpOwotICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29mdGlycXMoKTsKLSAgICB9IHdo aWxlICggcHJlZW1wdGVkICk7Ci0KLSAgICAvKgotICAgICAqIE1lbW9yeSBiZWxvdyAxTUIgaXMg aWRlbnRpdHkgbWFwcGVkLgotICAgICAqIE5COiB0aGlzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBi b290ZWQgZnJvbSBsZWdhY3kgQklPUy4KLSAgICAgKi8KLSAgICByYyA9IG1vZGlmeV9pZGVudGl0 eV9tbWlvKGQsIDAsIE1CMV9QQUdFUywgdHJ1ZSk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAg ICAgICBwcmludGsoIkZhaWxlZCB0byBpZGVudGl0eSBtYXAgbG93IDFNQjogJWRcbiIsIHJjKTsK LSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIC8qIFBvcHVsYXRlIG1lbW9yeSBtYXAu ICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5yX2U4MjA7IGkrKyApCi0gICAgewot ICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7Ci0KLSAgICAgICAgaWYgKCBkLT5hcmNo LmU4MjBbaV0udHlwZSAhPSBFODIwX1JBTSApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg ICAgICBhZGRyID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLmFkZHIpOwotICAgICAgICBzaXpl ID0gUEZOX0RPV04oZC0+YXJjaC5lODIwW2ldLnNpemUpOwotCi0gICAgICAgIGlmICggYWRkciA+ PSBNQjFfUEFHRVMgKQotICAgICAgICAgICAgcmMgPSBwdmhfcG9wdWxhdGVfbWVtb3J5X3Jhbmdl KGQsIGFkZHIsIHNpemUpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFT U0VSVChhZGRyICsgc2l6ZSA8IE1CMV9QQUdFUyk7Ci0gICAgICAgICAgICBwdmhfc3RlYWxfbG93 X3JhbShkLCBhZGRyLCBzaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcmMgKQotICAg ICAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIGlmICggY3B1X2hhc192bXggJiYgcGFn aW5nX21vZGVfaGFwKGQpICYmICF2bXhfdW5yZXN0cmljdGVkX2d1ZXN0KHYpICkKLSAgICB7Ci0g ICAgICAgIC8qCi0gICAgICAgICAqIFNpbmNlIERvbTAgY2Fubm90IGJlIG1pZ3JhdGVkLCB3ZSB3 aWxsIG9ubHkgc2V0dXAgdGhlCi0gICAgICAgICAqIHVucmVzdHJpY3RlZCBndWVzdCBoZWxwZXJz IGlmIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgY3VycmVudAotICAgICAgICAgKiBoYXJkd2FyZSB3 ZSBhcmUgcnVubmluZyBvbi4KLSAgICAgICAgICovCi0gICAgICAgIHJjID0gcHZoX3NldHVwX3Zt eF9yZWFsbW9kZV9oZWxwZXJzKGQpOwotICAgICAgICBpZiAoIHJjICkKLSAgICAgICAgICAgIHJl dHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSN1bmRlZiBNQjFfUEFHRVMKLX0KLQot c3RhdGljIGludCBfX2luaXQgcHZoX2xvYWRfa2VybmVsKHN0cnVjdCBkb21haW4gKmQsIGNvbnN0 IG1vZHVsZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBsb25nIGltYWdlX2hlYWRyb29tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG1vZHVsZV90ICppbml0cmQsIHZvaWQgKmltYWdlX2Jhc2UsCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY2hhciAqY21kbGluZSwgcGFkZHJfdCAqZW50cnksCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCAqc3RhcnRfaW5mb19hZGRyKQotewot ICAgIHZvaWQgKmltYWdlX3N0YXJ0ID0gaW1hZ2VfYmFzZSArIGltYWdlX2hlYWRyb29tOwotICAg IHVuc2lnbmVkIGxvbmcgaW1hZ2VfbGVuID0gaW1hZ2UtPm1vZF9lbmQ7Ci0gICAgc3RydWN0IGVs Zl9iaW5hcnkgZWxmOwotICAgIHN0cnVjdCBlbGZfZG9tX3Bhcm1zIHBhcm1zOwotICAgIHBhZGRy X3QgbGFzdF9hZGRyOwotICAgIHN0cnVjdCBodm1fc3RhcnRfaW5mbyBzdGFydF9pbmZvID0geyAw IH07Ci0gICAgc3RydWN0IGh2bV9tb2RsaXN0X2VudHJ5IG1vZCA9IHsgMCB9OwotICAgIHN0cnVj dCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAoIChyYyA9IGJ6 aW1hZ2VfcGFyc2UoaW1hZ2VfYmFzZSwgJmltYWdlX3N0YXJ0LCAmaW1hZ2VfbGVuKSkgIT0gMCAp Ci0gICAgewotICAgICAgICBwcmludGsoIkVycm9yIHRyeWluZyB0byBkZXRlY3QgYnogY29tcHJl c3NlZCBrZXJuZWxcbiIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgaWYgKCAo cmMgPSBlbGZfaW5pdCgmZWxmLCBpbWFnZV9zdGFydCwgaW1hZ2VfbGVuKSkgIT0gMCApCi0gICAg ewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBpbml0IEVMRlxuIik7Ci0gICAgICAgIHJldHVy biByYzsKLSAgICB9Ci0jaWZkZWYgVkVSQk9TRQotICAgIGVsZl9zZXRfdmVyYm9zZSgmZWxmKTsK LSNlbmRpZgotICAgIGVsZl9wYXJzZV9iaW5hcnkoJmVsZik7Ci0gICAgaWYgKCAocmMgPSBlbGZf eGVuX3BhcnNlKCZlbGYsICZwYXJtcykpICE9IDAgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJV bmFibGUgdG8gcGFyc2Uga2VybmVsIGZvciBFTEZOT1RFU1xuIik7Ci0gICAgICAgIHJldHVybiBy YzsKLSAgICB9Ci0KLSAgICBpZiAoIHBhcm1zLnBoeXNfZW50cnkgPT0gVU5TRVRfQUREUjMyICkK LSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgWEVOX0VMRk5PVEVfUEhZUzMy X0VOVFJZIGFkZHJlc3NcbiIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAg ICBwcmludGsoIk9TOiAlcyB2ZXJzaW9uOiAlcyBsb2FkZXI6ICVzIGJpdG5lc3M6ICVzXG4iLCBw YXJtcy5ndWVzdF9vcywKLSAgICAgICAgICAgcGFybXMuZ3Vlc3RfdmVyLCBwYXJtcy5sb2FkZXIs Ci0gICAgICAgICAgIGVsZl82NGJpdCgmZWxmKSA/ICI2NC1iaXQiIDogIjMyLWJpdCIpOwotCi0g ICAgLyogQ29weSB0aGUgT1MgaW1hZ2UgYW5kIGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KLSAg ICBlbGYuZGVzdF9iYXNlID0gKHZvaWQgKikocGFybXMudmlydF9rc3RhcnQgLSBwYXJtcy52aXJ0 X2Jhc2UpOwotICAgIGVsZi5kZXN0X3NpemUgPSBwYXJtcy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0 X2tzdGFydDsKLQotICAgIGVsZl9zZXRfdmNwdSgmZWxmLCB2KTsKLSAgICByYyA9IGVsZl9sb2Fk X2JpbmFyeSgmZWxmKTsKLSAgICBpZiAoIHJjIDwgMCApCi0gICAgewotICAgICAgICBwcmludGso IkZhaWxlZCB0byBsb2FkIGtlcm5lbDogJWRcbiIsIHJjKTsKLSAgICAgICAgcHJpbnRrKCJYZW4g ZG9tMCBrZXJuZWwgYnJva2VuIEVMRjogJXNcbiIsIGVsZl9jaGVja19icm9rZW4oJmVsZikpOwot ICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgbGFzdF9hZGRyID0gUk9VTkRVUChwYXJt cy52aXJ0X2tlbmQgLSBwYXJtcy52aXJ0X2Jhc2UsIFBBR0VfU0laRSk7Ci0KLSAgICBpZiAoIGlu aXRyZCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5 cyhsYXN0X2FkZHIsIG1mbl90b192aXJ0KGluaXRyZC0+bW9kX3N0YXJ0KSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRyZC0+bW9kX2VuZCwgdik7Ci0gICAgICAgIGlm ICggcmMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGlu aXRyZCB0byBndWVzdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLQot ICAgICAgICBtb2QucGFkZHIgPSBsYXN0X2FkZHI7Ci0gICAgICAgIG1vZC5zaXplID0gaW5pdHJk LT5tb2RfZW5kOwotICAgICAgICBsYXN0X2FkZHIgKz0gUk9VTkRVUChpbml0cmQtPm1vZF9lbmQs IFBBR0VfU0laRSk7Ci0gICAgfQotCi0gICAgLyogRnJlZSB0ZW1wb3JhcnkgYnVmZmVycy4gKi8K LSAgICBkaXNjYXJkX2luaXRpYWxfaW1hZ2VzKCk7Ci0KLSAgICBpZiAoIGNtZGxpbmUgIT0gTlVM TCApCi0gICAgewotICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMobGFzdF9hZGRy LCBjbWRsaW5lLCBzdHJsZW4oY21kbGluZSkgKyAxLCB2KTsKLSAgICAgICAgaWYgKCByYyApCi0g ICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgZ3Vlc3QgY29tbWFu ZCBsaW5lXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgfQotICAgICAgICBz dGFydF9pbmZvLmNtZGxpbmVfcGFkZHIgPSBsYXN0X2FkZHI7Ci0gICAgICAgIC8qCi0gICAgICAg ICAqIFJvdW5kIHVwIHRvIDMyLzY0IGJpdHMgKGRlcGVuZGluZyBvbiB0aGUgZ3Vlc3Qga2VybmVs IGJpdG5lc3MpIHNvCi0gICAgICAgICAqIHRoZSBtb2RsaXN0L3N0YXJ0X2luZm8gaXMgYWxpZ25l ZC4KLSAgICAgICAgICovCi0gICAgICAgIGxhc3RfYWRkciArPSBST1VORFVQKHN0cmxlbihjbWRs aW5lKSArIDEsIGVsZl82NGJpdCgmZWxmKSA/IDggOiA0KTsKLSAgICB9Ci0gICAgaWYgKCBpbml0 cmQgIT0gTlVMTCApCi0gICAgewotICAgICAgICByYyA9IGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMo bGFzdF9hZGRyLCAmbW9kLCBzaXplb2YobW9kKSwgdik7Ci0gICAgICAgIGlmICggcmMgKQotICAg ICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IGd1ZXN0IG1vZHVsZXNc biIpOwotICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0X2lu Zm8ubW9kbGlzdF9wYWRkciA9IGxhc3RfYWRkcjsKLSAgICAgICAgc3RhcnRfaW5mby5ucl9tb2R1 bGVzID0gMTsKLSAgICAgICAgbGFzdF9hZGRyICs9IHNpemVvZihtb2QpOwotICAgIH0KLQotICAg IHN0YXJ0X2luZm8ubWFnaWMgPSBYRU5fSFZNX1NUQVJUX01BR0lDX1ZBTFVFOwotICAgIHN0YXJ0 X2luZm8uZmxhZ3MgPSBTSUZfUFJJVklMRUdFRCB8IFNJRl9JTklURE9NQUlOOwotICAgIHJjID0g aHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0X2FkZHIsICZzdGFydF9pbmZvLCBzaXplb2Yoc3Rh cnRfaW5mbyksIHYpOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFi bGUgdG8gY29weSBzdGFydCBpbmZvIHRvIGd1ZXN0XG4iKTsKLSAgICAgICAgcmV0dXJuIHJjOwot ICAgIH0KLQotICAgICplbnRyeSA9IHBhcm1zLnBoeXNfZW50cnk7Ci0gICAgKnN0YXJ0X2luZm9f YWRkciA9IGxhc3RfYWRkcjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5p dCBwdmhfc2V0dXBfY3B1cyhzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IGVudHJ5LAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJfdCBzdGFydF9pbmZvKQotewotICAgIHN0 cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKLSAgICB1bnNpZ25lZCBpbnQgY3B1LCBpOwotICAg IGludCByYzsKLSAgICAvKiAKLSAgICAgKiBUaGlzIHNldHMgdGhlIHZDUFUgc3RhdGUgYWNjb3Jk aW5nIHRvIHRoZSBzdGF0ZSBkZXNjcmliZWQgaW4KLSAgICAgKiBkb2NzL21pc2MvaHZtbGl0ZS5t YXJrZG93bi4KLSAgICAgKi8KLSAgICB2Y3B1X2h2bV9jb250ZXh0X3QgY3B1X2N0eCA9IHsKLSAg ICAgICAgLm1vZGUgPSBWQ1BVX0hWTV9NT0RFXzMyQiwKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8z Mi5lYnggPSBzdGFydF9pbmZvLAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmVpcCA9IGVudHJ5 LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNyMCA9IFg4Nl9DUjBfUEUgfCBYODZfQ1IwX0VU LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLmNzX2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1 X3JlZ3MueDg2XzMyLmRzX2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnNz X2xpbWl0ID0gfjB1LAotICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnRyX2xpbWl0ID0gMHg2NywK LSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jc19hciA9IDB4YzliLAotICAgICAgICAuY3B1X3Jl Z3MueDg2XzMyLmRzX2FyID0gMHhjOTMsCi0gICAgICAgIC5jcHVfcmVncy54ODZfMzIuc3NfYXIg PSAweGM5MywKLSAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi50cl9hciA9IDB4OGIsCi0gICAgfTsK LQotICAgIGNwdSA9IHYtPnByb2Nlc3NvcjsKLSAgICBmb3IgKCBpID0gMTsgaSA8IGQtPm1heF92 Y3B1czsgaSsrICkKLSAgICB7Ci0gICAgICAgIGNwdSA9IGNwdW1hc2tfY3ljbGUoY3B1LCAmZG9t MF9jcHVzKTsKLSAgICAgICAgc2V0dXBfZG9tMF92Y3B1KGQsIGksIGNwdSk7Ci0gICAgfQotCi0g ICAgcmMgPSBhcmNoX3NldF9pbmZvX2h2bV9ndWVzdCh2LCAmY3B1X2N0eCk7Ci0gICAgaWYgKCBy YyApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBzZXR1cCBEb20wIEJTUCBjb250 ZXh0OiAlZFxuIiwgcmMpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBz ZXR1cF9wZXJtaXNzaW9ucyhkKTsKLSAgICBpZiAoIHJjICkKLSAgICB7Ci0gICAgICAgIHBhbmlj KCJVbmFibGUgdG8gc2V0dXAgRG9tMCBwZXJtaXNzaW9uczogJWRcbiIsIHJjKTsKLSAgICAgICAg cmV0dXJuIHJjOwotICAgIH0KLQotICAgIHVwZGF0ZV9kb21haW5fd2FsbGNsb2NrX3RpbWUoZCk7 Ci0KLSAgICBjbGVhcl9iaXQoX1ZQRl9kb3duLCAmdi0+cGF1c2VfZmxhZ3MpOwotCi0gICAgcmV0 dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfY291bnRfaW50cl9vdnIoc3RydWN0 IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0KLSAgICBhY3BpX2ludHJf b3ZlcnJpZGVzKys7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlf c2V0X2ludHJfb3ZyKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCi17 Ci0gICAgY29uc3Qgc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgKmludHIgPQot ICAgICAgICBjb250YWluZXJfb2YoaGVhZGVyLCBzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9v dmVycmlkZSwgaGVhZGVyKTsKLQotICAgICppbnRzcmNvdnIgPSAqaW50cjsKLSAgICBpbnRzcmNv dnIrKzsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2NvdW50 X25taV9zcmMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0K LSAgICBhY3BpX25taV9zb3VyY2VzKys7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQg X19pbml0IGFjcGlfc2V0X25taV9zcmMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFk ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxv bmcgZW5kKQotewotICAgIGNvbnN0IHN0cnVjdCBhY3BpX21hZHRfbm1pX3NvdXJjZSAqc3JjID0K LSAgICAgICAgY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNl LCBoZWFkZXIpOwotCi0gICAgKm5taXNyYyA9ICpzcmM7Ci0gICAgbm1pc3JjKys7Ci0KLSAgICBy ZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHZoX3NldHVwX2FjcGlfbWFkdChzdHJ1 Y3QgZG9tYWluICpkLCBwYWRkcl90ICphZGRyKQotewotICAgIHN0cnVjdCBhY3BpX3RhYmxlX21h ZHQgKm1hZHQ7Ci0gICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLSAgICBzdHJ1 Y3QgYWNwaV9tYWR0X2lvX2FwaWMgKmlvX2FwaWM7Ci0gICAgc3RydWN0IGFjcGlfbWFkdF9sb2Nh bF94MmFwaWMgKngyYXBpYzsKLSAgICBhY3BpX3N0YXR1cyBzdGF0dXM7Ci0gICAgdW5zaWduZWQg bG9uZyBzaXplOwotICAgIHVuc2lnbmVkIGludCBpLCBtYXhfdmNwdXM7Ci0gICAgaW50IHJjOwot Ci0gICAgLyogQ291bnQgbnVtYmVyIG9mIGludGVycnVwdCBvdmVycmlkZXMgaW4gdGhlIE1BRFQu ICovCi0gICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0lOVEVSUlVQVF9P VkVSUklERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb3VudF9pbnRyX292ciwg VUlOVF9NQVgpOwotCi0gICAgLyogQ291bnQgbnVtYmVyIG9mIE5NSSBzb3VyY2VzIGluIHRoZSBN QURULiAqLwotICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9OTUlfU09V UkNFLCBhY3BpX2NvdW50X25taV9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlRf TUFYKTsKLQotICAgIG1heF92Y3B1cyA9IGRvbTBfbWF4X3ZjcHVzKCk7Ci0gICAgLyogQ2FsY3Vs YXRlIHRoZSBzaXplIG9mIHRoZSBjcmFmdGVkIE1BRFQuICovCi0gICAgc2l6ZSA9IHNpemVvZigq bWFkdCk7Ci0gICAgLyoKLSAgICAgKiBGSVhNRTogdGhlIGN1cnJlbnQgdklPLUFQSUMgY29kZSBq dXN0IHN1cHBvcnRzIG9uZSBJTy1BUElDIGluc3RhbmNlCi0gICAgICogcGVyIGRvbWFpbi4gVGhp cyBtdXN0IGJlIGZpeGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHNhbWUgYW1vdW50IG9mCi0g ICAgICogSU8gQVBJQ3MgYXMgYXZhaWxhYmxlIG9uIGJhcmUgbWV0YWwuCi0gICAgICovCi0gICAg c2l6ZSArPSBzaXplb2YoKmlvX2FwaWMpOwotICAgIHNpemUgKz0gc2l6ZW9mKCppbnRzcmNvdnIp ICogYWNwaV9pbnRyX292ZXJyaWRlczsKLSAgICBzaXplICs9IHNpemVvZigqbm1pc3JjKSAqIGFj cGlfbm1pX3NvdXJjZXM7Ci0gICAgc2l6ZSArPSBzaXplb2YoKngyYXBpYykgKiBtYXhfdmNwdXM7 Ci0KLSAgICBtYWR0ID0geHphbGxvY19ieXRlcyhzaXplKTsKLSAgICBpZiAoICFtYWR0ICkKLSAg ICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUFEVCB0 YWJsZVxuIik7Ci0gICAgICAgIHJjID0gLUVOT01FTTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAg fQotCi0gICAgLyogQ29weSB0aGUgbmF0aXZlIE1BRFQgdGFibGUgaGVhZGVyLiAqLwotICAgIHN0 YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX01BRFQsIDAsICZ0YWJsZSk7Ci0gICAgaWYg KCAhQUNQSV9TVUNDRVNTKHN0YXR1cykgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJGYWlsZWQg dG8gZ2V0IE1BRFQgQUNQSSB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKLSAgICAgICAgcmMgPSAtRUlO VkFMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgbWFkdC0+aGVhZGVyID0gKnRhYmxl OwotICAgIG1hZHQtPmFkZHJlc3MgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwotICAgIC8qCi0g ICAgICogTkI6IHRoaXMgaXMgY3VycmVudGx5IHNldCB0byA0LCB3aGljaCBpcyB0aGUgcmV2aXNp b24gaW4gdGhlIEFDUEkKLSAgICAgKiBzcGVjIDYuMS4gU2FkbHkgQUNQSUNBIGRvZXNuJ3QgcHJv dmlkZSByZXZpc2lvbiBudW1iZXJzIGZvciB0aGUKLSAgICAgKiB0YWJsZXMgZGVzY3JpYmVkIGlu IHRoZSBoZWFkZXJzLgotICAgICAqLwotICAgIG1hZHQtPmhlYWRlci5yZXZpc2lvbiA9IG1pbl90 KHVuc2lnbmVkIGNoYXIsIHRhYmxlLT5yZXZpc2lvbiwgNCk7Ci0KLSAgICAvKgotICAgICAqIFNl dHVwIHRoZSBJTyBBUElDIGVudHJ5LgotICAgICAqIEZJWE1FOiB0aGUgY3VycmVudCB2SU8tQVBJ QyBjb2RlIGp1c3Qgc3VwcG9ydHMgb25lIElPLUFQSUMgaW5zdGFuY2UKLSAgICAgKiBwZXIgZG9t YWluLiBUaGlzIG11c3QgYmUgZml4ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgc2FtZSBhbW91 bnQgb2YKLSAgICAgKiBJTyBBUElDcyBhcyBhdmFpbGFibGUgb24gYmFyZSBtZXRhbCwgYW5kIHdp dGggdGhlIHNhbWUgSURzIGFzIGZvdW5kIGluCi0gICAgICogdGhlIG5hdGl2ZSBJTyBBUElDIE1B RFQgZW50cmllcy4KLSAgICAgKi8KLSAgICBpZiAoIG5yX2lvYXBpY3MgPiAxICkKLSAgICAgICAg cHJpbnRrKCJXQVJOSU5HOiBmb3VuZCAlZCBJTyBBUElDcywgRG9tMCB3aWxsIG9ubHkgaGF2ZSBh Y2Nlc3MgdG8gMSBlbXVsYXRlZCBJTyBBUElDXG4iLAotICAgICAgICAgICAgICAgbnJfaW9hcGlj cyk7Ci0gICAgaW9fYXBpYyA9ICh2b2lkICopKG1hZHQgKyAxKTsKLSAgICBpb19hcGljLT5oZWFk ZXIudHlwZSA9IEFDUElfTUFEVF9UWVBFX0lPX0FQSUM7Ci0gICAgaW9fYXBpYy0+aGVhZGVyLmxl bmd0aCA9IHNpemVvZigqaW9fYXBpYyk7Ci0gICAgaW9fYXBpYy0+aWQgPSBkb21haW5fdmlvYXBp YyhkKS0+aWQ7Ci0gICAgaW9fYXBpYy0+YWRkcmVzcyA9IFZJT0FQSUNfREVGQVVMVF9CQVNFX0FE RFJFU1M7Ci0KLSAgICB4MmFwaWMgPSAodm9pZCAqKShpb19hcGljICsgMSk7Ci0gICAgZm9yICgg aSA9IDA7IGkgPCBtYXhfdmNwdXM7IGkrKyApCi0gICAgewotICAgICAgICB4MmFwaWMtPmhlYWRl ci50eXBlID0gQUNQSV9NQURUX1RZUEVfTE9DQUxfWDJBUElDOwotICAgICAgICB4MmFwaWMtPmhl YWRlci5sZW5ndGggPSBzaXplb2YoKngyYXBpYyk7Ci0gICAgICAgIHgyYXBpYy0+dWlkID0gaTsK LSAgICAgICAgeDJhcGljLT5sb2NhbF9hcGljX2lkID0gaSAqIDI7Ci0gICAgICAgIHgyYXBpYy0+ bGFwaWNfZmxhZ3MgPSBBQ1BJX01BRFRfRU5BQkxFRDsKLSAgICAgICAgeDJhcGljKys7Ci0gICAg fQotCi0gICAgLyogU2V0dXAgaW50ZXJydXB0IG92ZXJyaWRlcy4gKi8KLSAgICBpbnRzcmNvdnIg PSAodm9pZCAqKXgyYXBpYzsKLSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZ UEVfSU5URVJSVVBUX09WRVJSSURFLCBhY3BpX3NldF9pbnRyX292ciwKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgYWNwaV9pbnRyX292ZXJyaWRlcyk7Ci0KLSAgICAvKiBTZXR1cCBOTUkgc291 cmNlcy4gKi8KLSAgICBubWlzcmMgPSAodm9pZCAqKWludHNyY292cjsKLSAgICBhY3BpX3RhYmxl X3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTk1JX1NPVVJDRSwgYWNwaV9zZXRfbm1pX3NyYywK LSAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9ubWlfc291cmNlcyk7Ci0KLSAgICBBU1NF UlQoKCh2b2lkICopbm1pc3JjIC0gKHZvaWQgKiltYWR0KSA9PSBzaXplKTsKLSAgICBtYWR0LT5o ZWFkZXIubGVuZ3RoID0gc2l6ZTsKLSAgICAvKgotICAgICAqIENhbGxpbmcgYWNwaV90Yl9jaGVj a3N1bSBoZXJlIGlzIGEgbGF5ZXJpbmcgdmlvbGF0aW9uLCBidXQKLSAgICAgKiBpbnRyb2R1Y2lu ZyBhIHdyYXBwZXIgZm9yIHN1Y2ggc2ltcGxlIHVzYWdlIHNlZW1zIG92ZXJraWxsLgotICAgICAq LwotICAgIG1hZHQtPmhlYWRlci5jaGVja3N1bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FT VF9QVFIodTgsIG1hZHQpLCBzaXplKTsKLQotICAgIC8qIFBsYWNlIHRoZSBuZXcgTUFEVCBpbiBn dWVzdCBtZW1vcnkgc3BhY2UuICovCi0gICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNpemUsIDAs IEdCKDQpLCBhZGRyKSApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJsZSB0byBmaW5kIGFs bG9jYXRlIGd1ZXN0IFJBTSBmb3IgTUFEVFxuIik7Ci0gICAgICAgIHJjID0gLUVOT01FTTsKLSAg ICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgLyogTWFyayB0aGlzIHJlZ2lvbiBhcyBFODIw X0FDUEkuICovCi0gICAgaWYgKCBwdmhfYWRkX21lbV9yYW5nZShkLCAqYWRkciwgKmFkZHIgKyBz aXplLCBFODIwX0FDUEkpICkKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWRkIE1BRFQgcmVn aW9uIHRvIG1lbW9yeSBtYXBcbiIpOwotCi0gICAgcmMgPSBodm1fY29weV90b19ndWVzdF9waHlz KCphZGRyLCBtYWR0LCBzaXplLCBkLT52Y3B1WzBdKTsKLSAgICBpZiAoIHJjICkKLSAgICB7Ci0g ICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgTUFEVCBpbnRvIGd1ZXN0IG1lbW9yeVxuIik7 Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIHJjID0gMDsKLQotIG91dDoKLSAgICB4 ZnJlZShtYWR0KTsKLQotICAgIHJldHVybiByYzsKLX0KLQotc3RhdGljIGJvb2wgX19pbml0IGFj cGlfbWVtb3J5X2Jhbm5lZCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgICB1bnNpZ25l ZCBsb25nIG1mbiwgbnJfcGFnZXMsIGk7Ci0KLSAgICBtZm4gPSBQRk5fRE9XTihhZGRyZXNzKTsK LSAgICBucl9wYWdlcyA9IFBGTl9VUCgoYWRkcmVzcyAmIH5QQUdFX01BU0spICsgc2l6ZSk7Ci0g ICAgZm9yICggaSA9IDAgOyBpIDwgbnJfcGFnZXM7IGkrKyApCi0gICAgICAgIGlmICggIXBhZ2Vf aXNfcmFtX3R5cGUobWZuICsgaSwgUkFNX1RZUEVfUkVTRVJWRUQpICYmCi0gICAgICAgICAgICAg IXBhZ2VfaXNfcmFtX3R5cGUobWZuICsgaSwgUkFNX1RZUEVfQUNQSSkgKQotICAgICAgICAgICAg cmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIF9faW5p dCBwdmhfYWNwaV90YWJsZV9hbGxvd2VkKGNvbnN0IGNoYXIgKnNpZykKLXsKLSAgICBzdGF0aWMg Y29uc3QgY2hhciBfX2luaXRjb25zdCBiYW5uZWRfdGFibGVzW11bQUNQSV9OQU1FX1NJWkVdID0g ewotICAgICAgICBBQ1BJX1NJR19IUEVULCBBQ1BJX1NJR19TTElULCBBQ1BJX1NJR19TUkFULCBB Q1BJX1NJR19NUFNULAotICAgICAgICBBQ1BJX1NJR19QTVRULCBBQ1BJX1NJR19NQURULCBBQ1BJ X1NJR19ETUFSfTsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIGZvciAoIGkgPSAwIDsgaSA8 IEFSUkFZX1NJWkUoYmFubmVkX3RhYmxlcyk7IGkrKyApCi0gICAgICAgIGlmICggc3RybmNtcChz aWcsIGJhbm5lZF90YWJsZXNbaV0sIEFDUElfTkFNRV9TSVpFKSA9PSAwICkKLSAgICAgICAgICAg IHJldHVybiBmYWxzZTsKLQotICAgIC8qIE1ha2Ugc3VyZSB0YWJsZSBkb2Vzbid0IHJlc2lkZSBp biBhIFJBTSByZWdpb24uICovCi0gICAgaWYgKCBhY3BpX21lbW9yeV9iYW5uZWQoYWNwaV9nYmxf cm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ubGVuZ3RoKSApCi0gICAg ewotICAgICAgICBwcmludGsoIlNraXBwaW5nIHRhYmxlICUuNHMgYmVjYXVzZSByZXNpZGVzIGlu IGEgbm9uLUFDUEksIG5vbi1yZXNlcnZlZCByZWdpb25cbiIsCi0gICAgICAgICAgICAgICBzaWcp OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K LXN0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF9hY3BpX3hzZHQoc3RydWN0IGRvbWFpbiAqZCwg cGFkZHJfdCBtYWR0X2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBhZGRyX3QgKmFkZHIpCi17Ci0gICAgc3RydWN0IGFjcGlfdGFibGVfeHNkdCAqeHNkdDsKLSAg ICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwotICAgIHN0cnVjdCBhY3BpX3RhYmxl X3JzZHAgKnJzZHA7Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplID0gc2l6ZW9mKCp4c2R0KTsKLSAg ICB1bnNpZ25lZCBpbnQgaSwgaiwgbnVtX3RhYmxlcyA9IDA7Ci0gICAgcGFkZHJfdCB4c2R0X3Bh ZGRyOwotICAgIGludCByYzsKLQotICAgIC8qCi0gICAgICogUmVzdG9yZSBvcmlnaW5hbCBETUFS IHRhYmxlIHNpZ25hdHVyZSwgd2UgYXJlIGdvaW5nIHRvIGZpbHRlciBpdCBmcm9tCi0gICAgICog dGhlIG5ldyBYU0RUIHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSBndWVzdCwgc28gaXQgaXMgbm8g bG9uZ2VyCi0gICAgICogbmVjZXNzYXJ5IHRvIGhhdmUgaXQncyBzaWduYXR1cmUgemFwcGVkLgot ICAgICAqLwotICAgIGFjcGlfZG1hcl9yZWluc3RhdGUoKTsKLQotICAgIC8qIENvdW50IHRoZSBu dW1iZXIgb2YgdGFibGVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgWFNEVC4gKi8KLSAgICBm b3IoIGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKysgKQotICAg IHsKLSAgICAgICAgY29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRh Ymxlc1tpXS5zaWduYXR1cmUuYXNjaWk7Ci0KLSAgICAgICAgaWYgKCBwdmhfYWNwaV90YWJsZV9h bGxvd2VkKHNpZykgKQotICAgICAgICAgICAgbnVtX3RhYmxlcysrOwotICAgIH0KLQotICAgIC8q Ci0gICAgICogTm8gbmVlZCB0byBhZGQgb3Igc3VidHJhY3QgYW55dGhpbmcgYmVjYXVzZSBzdHJ1 Y3QgYWNwaV90YWJsZV94c2R0Ci0gICAgICogaW5jbHVkZXMgb25lIGFycmF5IHNsb3QgYWxyZWFk eSwgYW5kIHdlIGhhdmUgZmlsdGVyZWQgb3V0IHRoZSBvcmlnaW5hbAotICAgICAqIE1BRFQgYW5k IHdlIGFyZSBnb2luZyB0byBhZGQgYSBjdXN0b20gYnVpbHQgTUFEVC4KLSAgICAgKi8KLSAgICBz aXplICs9IG51bV90YWJsZXMgKiBzaXplb2YoeHNkdC0+dGFibGVfb2Zmc2V0X2VudHJ5WzBdKTsK LQotICAgIHhzZHQgPSB4emFsbG9jX2J5dGVzKHNpemUpOwotICAgIGlmICggIXhzZHQgKQotICAg IHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBYU0RUIHRh YmxlXG4iKTsKLSAgICAgICAgcmMgPSAtRU5PTUVNOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9 Ci0KLSAgICAvKiBDb3B5IHRoZSBuYXRpdmUgWFNEVCB0YWJsZSBoZWFkZXIuICovCi0gICAgcnNk cCA9IGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX29zX2dldF9yb290X3BvaW50ZXIoKSwgc2l6ZW9m KCpyc2RwKSk7Ci0gICAgaWYgKCAhcnNkcCApCi0gICAgewotICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBtYXAgUlNEUFxuIik7Ci0gICAgICAgIHJjID0gLUVJTlZBTDsKLSAgICAgICAgZ290byBv dXQ7Ci0gICAgfQotICAgIHhzZHRfcGFkZHIgPSByc2RwLT54c2R0X3BoeXNpY2FsX2FkZHJlc3M7 Ci0gICAgYWNwaV9vc191bm1hcF9tZW1vcnkocnNkcCwgc2l6ZW9mKCpyc2RwKSk7Ci0gICAgdGFi bGUgPSBhY3BpX29zX21hcF9tZW1vcnkoeHNkdF9wYWRkciwgc2l6ZW9mKCp0YWJsZSkpOwotICAg IGlmICggIXRhYmxlICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIG1hcCBYU0RU XG4iKTsKLSAgICAgICAgcmMgPSAtRUlOVkFMOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0g ICAgeHNkdC0+aGVhZGVyID0gKnRhYmxlOwotICAgIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxl LCBzaXplb2YoKnRhYmxlKSk7Ci0KLSAgICAvKiBBZGQgdGhlIGN1c3RvbSBNQURULiAqLwotICAg IHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVswXSA9IG1hZHRfYWRkcjsKLQotICAgIC8qIENvcHkg dGhlIGFkZHJlc3NlcyBvZiB0aGUgcmVzdCBvZiB0aGUgYWxsb3dlZCB0YWJsZXMuICovCi0gICAg Zm9yKCBpID0gMCwgaiA9IDE7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkr KyApCi0gICAgewotICAgICAgICBjb25zdCBjaGFyICpzaWcgPSBhY3BpX2dibF9yb290X3RhYmxl X2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2NpaTsKLQotICAgICAgICBpZiAoIHB2aF9hY3Bp X3RhYmxlX2FsbG93ZWQoc2lnKSApCi0gICAgICAgICAgICB4c2R0LT50YWJsZV9vZmZzZXRfZW50 cnlbaisrXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX3Jvb3Rf dGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzczsKLSAgICB9Ci0KLSAgICB4c2R0LT5oZWFkZXIu cmV2aXNpb24gPSAxOwotICAgIHhzZHQtPmhlYWRlci5sZW5ndGggPSBzaXplOwotICAgIC8qCi0g ICAgICogQ2FsbGluZyBhY3BpX3RiX2NoZWNrc3VtIGhlcmUgaXMgYSBsYXllcmluZyB2aW9sYXRp b24sIGJ1dAotICAgICAqIGludHJvZHVjaW5nIGEgd3JhcHBlciBmb3Igc3VjaCBzaW1wbGUgdXNh Z2Ugc2VlbXMgb3ZlcmtpbGwuCi0gICAgICovCi0gICAgeHNkdC0+aGVhZGVyLmNoZWNrc3VtIC09 IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgeHNkdCksIHNpemUpOwotCi0gICAg LyogUGxhY2UgdGhlIG5ldyBYU0RUIGluIGd1ZXN0IG1lbW9yeSBzcGFjZS4gKi8KLSAgICBpZiAo IHB2aF9zdGVhbF9yYW0oZCwgc2l6ZSwgMCwgR0IoNCksIGFkZHIpICkKLSAgICB7Ci0gICAgICAg IHByaW50aygiVW5hYmxlIHRvIGZpbmQgZ3Vlc3QgUkFNIGZvciBYU0RUXG4iKTsKLSAgICAgICAg cmMgPSAtRU5PTUVNOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICAvKiBNYXJrIHRo aXMgcmVnaW9uIGFzIEU4MjBfQUNQSS4gKi8KLSAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQs ICphZGRyLCAqYWRkciArIHNpemUsIEU4MjBfQUNQSSkgKQotICAgICAgICBwcmludGsoIlVuYWJs ZSB0byBhZGQgWFNEVCByZWdpb24gdG8gbWVtb3J5IG1hcFxuIik7Ci0KLSAgICByYyA9IGh2bV9j b3B5X3RvX2d1ZXN0X3BoeXMoKmFkZHIsIHhzZHQsIHNpemUsIGQtPnZjcHVbMF0pOwotICAgIGlm ICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY29weSBYU0RUIGludG8g Z3Vlc3QgbWVtb3J5XG4iKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgcmMgPSAw OwotCi0gb3V0OgotICAgIHhmcmVlKHhzZHQpOwotCi0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0 aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfYWNwaShzdHJ1Y3QgZG9tYWluICpkLCBwYWRkcl90IHN0 YXJ0X2luZm8pCi17Ci0gICAgdW5zaWduZWQgbG9uZyBwZm4sIG5yX3BhZ2VzOwotICAgIHBhZGRy X3QgbWFkdF9wYWRkciwgeHNkdF9wYWRkciwgcnNkcF9wYWRkcjsKLSAgICB1bnNpZ25lZCBpbnQg aTsKLSAgICBpbnQgcmM7Ci0gICAgc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqbmF0aXZlX3JzZHAs IHJzZHAgPSB7Ci0gICAgICAgIC5zaWduYXR1cmUgPSBBQ1BJX1NJR19SU0RQLAotICAgICAgICAu cmV2aXNpb24gPSAyLAotICAgICAgICAubGVuZ3RoID0gc2l6ZW9mKHJzZHApLAotICAgIH07Ci0K LQotICAgIC8qIFNjYW4gdG9wLWxldmVsIHRhYmxlcyBhbmQgYWRkIHRoZWlyIHJlZ2lvbnMgdG8g dGhlIGd1ZXN0IG1lbW9yeSBtYXAuICovCi0gICAgZm9yKCBpID0gMDsgaSA8IGFjcGlfZ2JsX3Jv b3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnNp ZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlLmFzY2lpOwot ICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFi bGVzW2ldLmFkZHJlc3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGFjcGlfZ2JsX3Jv b3RfdGFibGVfbGlzdC50YWJsZXNbaV0ubGVuZ3RoOwotCi0gICAgICAgIC8qCi0gICAgICAgICAq IE1ha2Ugc3VyZSB0aGUgb3JpZ2luYWwgTUFEVCBpcyBhbHNvIG1hcHBlZCwgc28gdGhhdCBEb20w IGNhbgotICAgICAgICAgKiBwcm9wZXJseSBhY2Nlc3MgdGhlIGRhdGEgcmV0dXJuZWQgYnkgX01B VCBtZXRob2RzIGluIGNhc2UgaXQncwotICAgICAgICAgKiByZS11c2luZyBNQURUIG1lbW9yeS4K LSAgICAgICAgICovCi0gICAgICAgIGlmICggc3RybmNtcChzaWcsIEFDUElfU0lHX01BRFQsIEFD UElfTkFNRV9TSVpFKQotICAgICAgICAgICAgID8gcHZoX2FjcGlfdGFibGVfYWxsb3dlZChzaWcp Ci0gICAgICAgICAgICAgOiAhYWNwaV9tZW1vcnlfYmFubmVkKGFkZHIsIHNpemUpICkKLSAgICAg ICAgICAgICBwdmhfYWRkX21lbV9yYW5nZShkLCBhZGRyLCBhZGRyICsgc2l6ZSwgRTgyMF9BQ1BJ KTsKLSAgICB9Ci0KLSAgICAvKiBJZGVudGl0eSBtYXAgQUNQSSBlODIwIHJlZ2lvbnMuICovCi0g ICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5yX2U4MjA7IGkrKyApCi0gICAgewotICAgICAg ICBpZiAoIGQtPmFyY2guZTgyMFtpXS50eXBlICE9IEU4MjBfQUNQSSAmJgotICAgICAgICAgICAg IGQtPmFyY2guZTgyMFtpXS50eXBlICE9IEU4MjBfTlZTICkKLSAgICAgICAgICAgIGNvbnRpbnVl OwotCi0gICAgICAgIHBmbiA9IFBGTl9ET1dOKGQtPmFyY2guZTgyMFtpXS5hZGRyKTsKLSAgICAg ICAgbnJfcGFnZXMgPSBQRk5fVVAoKGQtPmFyY2guZTgyMFtpXS5hZGRyICYgflBBR0VfTUFTSykg KwotICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0uc2l6ZSk7Ci0KLSAg ICAgICAgcmMgPSBtb2RpZnlfaWRlbnRpdHlfbW1pbyhkLCBwZm4sIG5yX3BhZ2VzLCB0cnVlKTsK LSAgICAgICAgaWYgKCByYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygiRmFpbGVk IHRvIG1hcCBBQ1BJIHJlZ2lvbiBbJSNseCwgJSNseCkgaW50byBEb20wIG1lbW9yeSBtYXBcbiIs Ci0gICAgICAgICAgICAgICAgICAgcGZuLCBwZm4gKyBucl9wYWdlcyk7Ci0gICAgICAgICAgICBy ZXR1cm4gcmM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByYyA9IHB2aF9zZXR1cF9hY3BpX21h ZHQoZCwgJm1hZHRfcGFkZHIpOwotICAgIGlmICggcmMgKQotICAgICAgICByZXR1cm4gcmM7Ci0K LSAgICByYyA9IHB2aF9zZXR1cF9hY3BpX3hzZHQoZCwgbWFkdF9wYWRkciwgJnhzZHRfcGFkZHIp OwotICAgIGlmICggcmMgKQotICAgICAgICByZXR1cm4gcmM7Ci0KLSAgICAvKiBDcmFmdCBhIGN1 c3RvbSBSU0RQLiAqLwotICAgIG5hdGl2ZV9yc2RwID0gYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlf b3NfZ2V0X3Jvb3RfcG9pbnRlcigpLCBzaXplb2YocnNkcCkpOwotICAgIGlmICggIW5hdGl2ZV9y c2RwICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiRmFpbGVkIHRvIG1hcCBuYXRpdmUgUlNEUFxu Iik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLSAgICBtZW1jcHkocnNkcC5vZW1f aWQsIG5hdGl2ZV9yc2RwLT5vZW1faWQsIHNpemVvZihyc2RwLm9lbV9pZCkpOwotICAgIGFjcGlf b3NfdW5tYXBfbWVtb3J5KG5hdGl2ZV9yc2RwLCBzaXplb2YocnNkcCkpOwotICAgIHJzZHAueHNk dF9waHlzaWNhbF9hZGRyZXNzID0geHNkdF9wYWRkcjsKLSAgICAvKgotICAgICAqIENhbGxpbmcg YWNwaV90Yl9jaGVja3N1bSBoZXJlIGlzIGEgbGF5ZXJpbmcgdmlvbGF0aW9uLCBidXQKLSAgICAg KiBpbnRyb2R1Y2luZyBhIHdyYXBwZXIgZm9yIHN1Y2ggc2ltcGxlIHVzYWdlIHNlZW1zIG92ZXJr aWxsLgotICAgICAqLwotICAgIHJzZHAuY2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJ X0NBU1RfUFRSKHU4LCAmcnNkcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFDUElfUlNEUF9SRVYwX1NJWkUpOwotICAgIHJzZHAuZXh0ZW5kZWRfY2hlY2tzdW0gLT0g YWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1RfUFRSKHU4LCAmcnNkcCksCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyc2RwKSk7Ci0KLSAgICAv KgotICAgICAqIFBsYWNlIHRoZSBuZXcgUlNEUCBpbiBndWVzdCBtZW1vcnkgc3BhY2UuCi0gICAg ICoKLSAgICAgKiBOQjogdGhpcyBSU0RQIGlzIG5vdCBnb2luZyB0byByZXBsYWNlIHRoZSBvcmln aW5hbCBSU0RQLCB3aGljaCBzaG91bGQKLSAgICAgKiBzdGlsbCBiZSBhY2Nlc3NpYmxlIHRvIHRo ZSBndWVzdC4gSG93ZXZlciB0aGF0IFJTRFAgaXMgZ29pbmcgdG8gcG9pbnQgdG8KLSAgICAgKiB0 aGUgbmF0aXZlIFJTRFQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHRoZSBEb20wIGtlcm5l bCdzIGJvb3QKLSAgICAgKiBwdXJwb3NlcyAod2Uga2VlcCBpdCB2aXNpYmxlIGZvciBwb3N0IGJv b3QgYWNjZXNzKS4KLSAgICAgKi8KLSAgICBpZiAoIHB2aF9zdGVhbF9yYW0oZCwgc2l6ZW9mKHJz ZHApLCAwLCBHQig0KSwgJnJzZHBfcGFkZHIpICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5h YmxlIHRvIGFsbG9jYXRlIGd1ZXN0IFJBTSBmb3IgUlNEUFxuIik7Ci0gICAgICAgIHJldHVybiAt RU5PTUVNOwotICAgIH0KLQotICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMgRTgyMF9BQ1BJLiAq LwotICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgcnNkcF9wYWRkciwgcnNkcF9wYWRkciAr IHNpemVvZihyc2RwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEU4MjBfQUNQSSkgKQot ICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhZGQgUlNEUCByZWdpb24gdG8gbWVtb3J5IG1hcFxu Iik7Ci0KLSAgICAvKiBDb3B5IFJTRFAgaW50byBndWVzdCBtZW1vcnkuICovCi0gICAgcmMgPSBo dm1fY29weV90b19ndWVzdF9waHlzKHJzZHBfcGFkZHIsICZyc2RwLCBzaXplb2YocnNkcCksIGQt PnZjcHVbMF0pOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJVbmFibGUg dG8gY29weSBSU0RQIGludG8gZ3Vlc3QgbWVtb3J5XG4iKTsKLSAgICAgICAgcmV0dXJuIHJjOwot ICAgIH0KLQotICAgIC8qIENvcHkgUlNEUCBhZGRyZXNzIHRvIHN0YXJ0X2luZm8uICovCi0gICAg cmMgPSBodm1fY29weV90b19ndWVzdF9waHlzKHN0YXJ0X2luZm8gKwotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHZtX3N0YXJ0X2luZm8sIHJzZHBfcGFk ZHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnNkcF9wYWRkciwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCgoc3RydWN0IGh2bV9zdGFydF9pbmZv ICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCktPnJzZHBfcGFk ZHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT52Y3B1WzBdKTsKLSAgICBp ZiAoIHJjICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgUlNEUCBpbnRv IGd1ZXN0IG1lbW9yeVxuIik7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1 cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY29uc3RydWN0X2RvbTBfcHZoKHN0cnVjdCBk b21haW4gKmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV90ICppbml0cmQsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpib290c3RyYXBfbWFwKShjb25zdCBtb2R1 bGVfdCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjbWRs aW5lKQotewotICAgIHBhZGRyX3QgZW50cnksIHN0YXJ0X2luZm87Ci0gICAgaW50IHJjOwotCi0g ICAgcHJpbnRrKCIqKiBCdWlsZGluZyBhIFBWSCBEb20wICoqXG4iKTsKLQotICAgIGlvbW11X2h3 ZG9tX2luaXQoZCk7Ci0KLSAgICByYyA9IHB2aF9zZXR1cF9wMm0oZCk7Ci0gICAgaWYgKCByYyAp Ci0gICAgewotICAgICAgICBwcmludGsoIkZhaWxlZCB0byBzZXR1cCBEb20wIHBoeXNpY2FsIG1l bW9yeSBtYXBcbiIpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcmMgPSBwdmhf bG9hZF9rZXJuZWwoZCwgaW1hZ2UsIGltYWdlX2hlYWRyb29tLCBpbml0cmQsIGJvb3RzdHJhcF9t YXAoaW1hZ2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmUsICZlbnRyeSwgJnN0 YXJ0X2luZm8pOwotICAgIGlmICggcmMgKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJGYWlsZWQg dG8gbG9hZCBEb20wIGtlcm5lbFxuIik7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAg ICByYyA9IHB2aF9zZXR1cF9jcHVzKGQsIGVudHJ5LCBzdGFydF9pbmZvKTsKLSAgICBpZiAoIHJj ICkKLSAgICB7Ci0gICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNldHVwIERvbTAgQ1BVczogJWRc biIsIHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJjID0gcHZoX3NldHVw X2FjcGkoZCwgc3RhcnRfaW5mbyk7Ci0gICAgaWYgKCByYyApCi0gICAgewotICAgICAgICBwcmlu dGsoIkZhaWxlZCB0byBzZXR1cCBEb20wIEFDUEkgdGFibGVzOiAlZFxuIiwgcmMpOwotICAgICAg ICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcGFuaWMoIkJ1aWxkaW5nIGEgUFZIdjIgRG9tMCBp cyBub3QgeWV0IHN1cHBvcnRlZC4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQogaW50IF9faW5pdCBj b25zdHJ1Y3RfZG9tMChzdHJ1Y3QgZG9tYWluICpkLCBjb25zdCBtb2R1bGVfdCAqaW1hZ2UsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VfaGVhZHJvb20sIG1v ZHVsZV90ICppbml0cmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqYm9vdHN0 cmFwX21hcCkoY29uc3QgbW9kdWxlX3QgKiksCmRpZmYgLS1naXQgYS94ZW4vYXJjaC94ODYvZG9t YWluX2J1aWxkLmggYi94ZW4vYXJjaC94ODYvZG9tYWluX2J1aWxkLmgKaW5kZXggNDAzYjkwYjc3 ZS4uZThmYzBmZjRkNyAxMDA2NDQKLS0tIGEveGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZC5oCisr KyBiL3hlbi9hcmNoL3g4Ni9kb21haW5fYnVpbGQuaApAQCAtMTksNiArMTksMTQgQEAgaW50IGNv bnN0cnVjdF9kb20wX3B2KAogICAgIHZvaWQgKigqYm9vdHN0cmFwX21hcCkoY29uc3QgbW9kdWxl X3QgKiksCiAgICAgY2hhciAqY21kbGluZSk7CiAKK2ludCBjb25zdHJ1Y3RfZG9tMF9wdmgoc3Ry dWN0IGRvbWFpbiAqZCwgY29uc3QgbW9kdWxlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIGltYWdlX2hlYWRyb29tLAorICAgICAgICAgICAgICAgICAgICAg ICBtb2R1bGVfdCAqaW5pdHJkLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKmJvb3Rz dHJhcF9tYXApKGNvbnN0IG1vZHVsZV90ICopLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFy ICpjbWRsaW5lKTsKK3Vuc2lnbmVkIGxvbmcgZG9tMF9wYWdpbmdfcGFnZXMoY29uc3Qgc3RydWN0 IGRvbWFpbiAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBucl9wYWdlcyk7CisKICNlbmRpZgkvKiBfRE9NQUlOX0JVSUxEX0hfICovCiAKIC8qCmRpZmYg LS1naXQgYS94ZW4vYXJjaC94ODYvZG9tYWluX2J1aWxkX3B2aC5jIGIveGVuL2FyY2gveDg2L2Rv bWFpbl9idWlsZF9wdmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi42 Y2QzZmYyZWYyCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZF9w dmguYwpAQCAtMCwwICsxLDEwOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRvbWFp bl9idWlsZF9wdmguYworICovCisKKyNpbmNsdWRlIDx4ZW4vYWNwaS5oPgorI2luY2x1ZGUgPHhl bi9pbml0Lmg+CisjaW5jbHVkZSA8eGVuL2xpYmVsZi5oPgorI2luY2x1ZGUgPHhlbi9tdWx0aWJv b3QuaD4KKyNpbmNsdWRlIDx4ZW4vc29mdGlycS5oPgorCisjaW5jbHVkZSA8YWNwaS9hY3RhYmxl cy5oPgorCisjaW5jbHVkZSA8YXNtL2J6aW1hZ2UuaD4KKyNpbmNsdWRlIDxhc20vaHZtL3N1cHBv cnQuaD4KKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9wMm0uaD4KKyNp bmNsdWRlIDxhc20vcGFnaW5nLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRl IDxwdWJsaWMvYXJjaC14ODYvaHZtL3N0YXJ0X2luZm8uaD4KKyNpbmNsdWRlIDxwdWJsaWMvaHZt L2h2bV9pbmZvX3RhYmxlLmg+CisjaW5jbHVkZSA8cHVibGljL2h2bS9odm1fdmNwdS5oPgorCisj aW5jbHVkZSAiZG9tYWluX2J1aWxkLmgiCisKKy8qCisgKiBIYXZlIHRoZSBUU1MgY292ZXIgdGhl IElTQSBwb3J0IHJhbmdlLCB3aGljaCBtYWtlcyBpdAorICogLSAxMDQgYnl0ZXMgYmFzZSBzdHJ1 Y3R1cmUKKyAqIC0gMzIgYnl0ZXMgaW50ZXJydXB0IHJlZGlyZWN0aW9uIGJpdG1hcAorICogLSAx MjggYnl0ZXMgSS9PIGJpdG1hcAorICogLSBvbmUgdHJhaWxpbmcgYnl0ZQorICogb3IgYSB0b3Rh bCBvZiAyNjUgYnl0ZXMuCisgKgorICogTkI6IGFzIFBWSHYyIERvbTAgZG9lc24ndCBoYXZlIGxl Z2FjeSBkZXZpY2VzIChJU0EpLCBpdCBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAqIGJ1c2luZXNzIGlu IGFjY2Vzc2luZyB0aGUgSVNBIHBvcnQgcmFuZ2UsIG11Y2ggbGVzcyBpbiByZWFsIG1vZGUsIGFu ZCBkdWUgdG8KKyAqIHRoZSBsYWNrIG9mIGZpcm13YXJlIGl0IHNob3VsZG4ndCBhbHNvIGV4ZWN1 dGUgYW55IElOVCBpbnN0cnVjdGlvbi4gVGhpcyBpcworICogZG9uZSBqdXN0IGZvciBjb25zaXN0 ZW5jeSB3aXRoIHdoYXQgaHZtbG9hZGVyIGRvZXMuCisgKi8KKyNkZWZpbmUgSFZNX1ZNODZfVFNT X1NJWkUgMjY1CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBhY3BpX2ludHJfb3Zl cnJpZGVzOworc3RhdGljIHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlIF9faW5p dGRhdGEgKmludHNyY292cjsKKworc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIGFjcGlf bm1pX3NvdXJjZXM7CitzdGF0aWMgc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlIF9faW5pdGRh dGEgKm5taXNyYzsKKworc3RhdGljIGludCBfX2luaXQgbW9kaWZ5X2lkZW50aXR5X21taW8oc3Ry dWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBwZm4sCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBjb25zdCBib29sIG1hcCkK K3sKKyAgICBpbnQgcmM7CisKKyAgICBmb3IgKCA7IDsgKQorICAgIHsKKyAgICAgICAgcmMgPSAo bWFwID8gbWFwX21taW9fcmVnaW9ucyA6IHVubWFwX21taW9fcmVnaW9ucykKKyAgICAgICAgICAg ICAoZCwgX2dmbihwZm4pLCBucl9wYWdlcywgX21mbihwZm4pKTsKKyAgICAgICAgaWYgKCByYyA9 PSAwICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIHJjIDwgMCApCisgICAgICAg IHsKKyAgICAgICAgICAgIHByaW50ayhYRU5MT0dfV0FSTklORworICAgICAgICAgICAgICAgICAg ICJGYWlsZWQgdG8gaWRlbnRpdHkgJXNtYXAgWyUjbHgsJSNseCkgZm9yIGQlZDogJWRcbiIsCisg ICAgICAgICAgICAgICAgICAgbWFwID8gIiIgOiAidW4iLCBwZm4sIHBmbiArIG5yX3BhZ2VzLCBk LT5kb21haW5faWQsIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg IG5yX3BhZ2VzIC09IHJjOworICAgICAgICBwZm4gKz0gcmM7CisgICAgICAgIHByb2Nlc3NfcGVu ZGluZ19zb2Z0aXJxcygpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogUG9wdWxh dGUgYSBIVk0gbWVtb3J5IHJhbmdlIHVzaW5nIHRoZSBiaWdnZXN0IHBvc3NpYmxlIG9yZGVyLiAq Lworc3RhdGljIGludCBfX2luaXQgcHZoX3BvcHVsYXRlX21lbW9yeV9yYW5nZShzdHJ1Y3QgZG9t YWluICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp Z25lZCBsb25nIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoreworICAgIHVuc2lnbmVkIGludCBvcmRlciwg aSA9IDA7CisgICAgc3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsKKyAgICBpbnQgcmM7CisjZGVmaW5l IE1BUF9NQVhfSVRFUiA2NAorCisgICAgb3JkZXIgPSBNQVhfT1JERVI7CisgICAgd2hpbGUgKCBu cl9wYWdlcyAhPSAwICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCByYW5nZV9vcmRlciA9 IGdldF9vcmRlcl9mcm9tX3BhZ2VzKG5yX3BhZ2VzICsgMSk7CisKKyAgICAgICAgb3JkZXIgPSBt aW4ocmFuZ2Vfb3JkZXIgPyByYW5nZV9vcmRlciAtIDEgOiAwLCBvcmRlcik7CisgICAgICAgIHBh Z2UgPSBhbGxvY19kb21oZWFwX3BhZ2VzKGQsIG9yZGVyLCBtZW1mbGFncyk7CisgICAgICAgIGlm ICggcGFnZSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBvcmRlciA9PSAw ICYmIG1lbWZsYWdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgYWdh aW4gd2l0aG91dCBhbnkgbWVtZmxhZ3MuICovCisgICAgICAgICAgICAgICAgbWVtZmxhZ3MgPSAw OworICAgICAgICAgICAgICAgIG9yZGVyID0gTUFYX09SREVSOworICAgICAgICAgICAgICAgIGNv bnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBvcmRlciA9PSAwICkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBt ZW1vcnkgd2l0aCBvcmRlciAwIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07 CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcmRlci0tOworICAgICAgICAgICAgY29udGlu dWU7CisgICAgICAgIH0KKworICAgICAgICByYyA9IGd1ZXN0X3BoeXNtYXBfYWRkX3BhZ2UoZCwg X2dmbihzdGFydCksIF9tZm4ocGFnZV90b19tZm4ocGFnZSkpLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgb3JkZXIpOworICAgICAgICBpZiAoIHJjICE9IDAgKQorICAgICAg ICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWxlZCB0byBwb3B1bGF0ZSBtZW1vcnk6IFslI2x4 LCVseCk6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBzdGFydCArICgxVUwgPDwg b3JkZXIpLCByYyk7CisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAg ICAgICBzdGFydCArPSAxVUwgPDwgb3JkZXI7CisgICAgICAgIG5yX3BhZ2VzIC09IDFVTCA8PCBv cmRlcjsKKyAgICAgICAgaWYgKCAoKytpICUgTUFQX01BWF9JVEVSKSA9PSAwICkKKyAgICAgICAg ICAgIHByb2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOworICAgIH0KKworICAgIHJldHVybiAwOwor I3VuZGVmIE1BUF9NQVhfSVRFUgorfQorCisvKiBTdGVhbCBSQU0gZnJvbSB0aGUgZW5kIG9mIGEg bWVtb3J5IHJlZ2lvbi4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zdGVhbF9yYW0oc3RydWN0 IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1bnNpZ25lZCBsb25nIGFsaWduLCBwYWRkcl90IGxpbWl0LAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwYWRkcl90ICphZGRyKQoreworICAgIHVuc2lnbmVkIGludCBp ID0gZC0+YXJjaC5ucl9lODIwOworCisgICAgLyoKKyAgICAgKiBBbGlnbm1lbnQgMCBzaG91bGQg YmUgc2V0IHRvIDEsIHNvIGl0IGRvZXNuJ3Qgd3JhcCBhcm91bmQgaW4gdGhlCisgICAgICogY2Fs Y3VsYXRpb25zIGJlbG93LgorICAgICAqLworICAgIGFsaWduID0gYWxpZ24gPyA6IDE7CisgICAg d2hpbGUgKCBpLS0gKQorICAgIHsKKyAgICAgICAgc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAm ZC0+YXJjaC5lODIwW2ldOworCisgICAgICAgIGlmICggZW50cnktPnR5cGUgIT0gRTgyMF9SQU0g fHwgZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSA+IGxpbWl0IHx8CisgICAgICAgICAgICAgZW50 cnktPmFkZHIgPCBNQigxKSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAqYWRk ciA9IChlbnRyeS0+YWRkciArIGVudHJ5LT5zaXplIC0gc2l6ZSkgJiB+KGFsaWduIC0gMSk7Cisg ICAgICAgIGlmICggKmFkZHIgPCBlbnRyeS0+YWRkciApCisgICAgICAgICAgICBjb250aW51ZTsK KworICAgICAgICBlbnRyeS0+c2l6ZSA9ICphZGRyIC0gZW50cnktPmFkZHI7CisgICAgICAgIHJl dHVybiAwOworICAgIH0KKworICAgIHJldHVybiAtRU5PTUVNOworfQorCisvKiBOQjogbWVtb3J5 IG1hcCBtdXN0IGJlIHNvcnRlZCBhdCBhbGwgdGltZXMgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0 bHkuICovCitzdGF0aWMgaW50IF9faW5pdCBwdmhfYWRkX21lbV9yYW5nZShzdHJ1Y3QgZG9tYWlu ICpkLCB1aW50NjRfdCBzLCB1aW50NjRfdCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgaW50IHR5cGUpCit7CisgICAgc3RydWN0IGU4MjBlbnRyeSAqbWFw OworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yICggaSA9IDA7IGkgPCBkLT5hcmNoLm5y X2U4MjA7IGkrKyApCisgICAgeworICAgICAgICB1aW50NjRfdCBycyA9IGQtPmFyY2guZTgyMFtp XS5hZGRyOworICAgICAgICB1aW50NjRfdCByZSA9IHJzICsgZC0+YXJjaC5lODIwW2ldLnNpemU7 CisKKyAgICAgICAgaWYgKCBycyA9PSBlICYmIGQtPmFyY2guZTgyMFtpXS50eXBlID09IHR5cGUg KQorICAgICAgICB7CisgICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0uYWRkciA9IHM7CisgICAg ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcmUgPT0gcyAmJiBk LT5hcmNoLmU4MjBbaV0udHlwZSA9PSB0eXBlICYmCisgICAgICAgICAgICAgKGkgKyAxID09IGQt PmFyY2gubnJfZTgyMCB8fCBkLT5hcmNoLmU4MjBbaSArIDFdLmFkZHIgPj0gZSkgKQorICAgICAg ICB7CisgICAgICAgICAgICBkLT5hcmNoLmU4MjBbaV0uc2l6ZSArPSBlIC0gczsKKyAgICAgICAg ICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBycyA+PSBlICkKKyAgICAg ICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICggcmUgPiBzICkKKyAgICAgICAgICAgIHJldHVy biAtRUVYSVNUOworICAgIH0KKworICAgIG1hcCA9IHh6YWxsb2NfYXJyYXkoc3RydWN0IGU4MjBl bnRyeSwgZC0+YXJjaC5ucl9lODIwICsgMSk7CisgICAgaWYgKCAhbWFwICkKKyAgICB7CisgICAg ICAgIHByaW50ayhYRU5MT0dfV0FSTklORyAiRTgyMDogb3V0IG9mIG1lbW9yeSB0byBhZGQgcmVn aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgbWVtY3B5KG1h cCwgZC0+YXJjaC5lODIwLCBpICogc2l6ZW9mKCpkLT5hcmNoLmU4MjApKTsKKyAgICBtZW1jcHko bWFwICsgaSArIDEsIGQtPmFyY2guZTgyMCArIGksCisgICAgICAgICAgIChkLT5hcmNoLm5yX2U4 MjAgLSBpKSAqIHNpemVvZigqZC0+YXJjaC5lODIwKSk7CisgICAgbWFwW2ldLmFkZHIgPSBzOwor ICAgIG1hcFtpXS5zaXplID0gZSAtIHM7CisgICAgbWFwW2ldLnR5cGUgPSB0eXBlOworICAgIHhm cmVlKGQtPmFyY2guZTgyMCk7CisgICAgZC0+YXJjaC5lODIwID0gbWFwOworICAgIGQtPmFyY2gu bnJfZTgyMCsrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB2aF9z ZXR1cF92bXhfcmVhbG1vZGVfaGVscGVycyhzdHJ1Y3QgZG9tYWluICpkKQoreworICAgIHAybV90 eXBlX3QgcDJtdDsKKyAgICB1aW50MzJfdCByYywgKmlkZW50X3B0OworICAgIG1mbl90IG1mbjsK KyAgICBwYWRkcl90IGdhZGRyOworICAgIHN0cnVjdCB2Y3B1ICp2ID0gZC0+dmNwdVswXTsKKwor ICAgIC8qCisgICAgICogU3RlYWwgc29tZSBzcGFjZSBmcm9tIHRoZSBsYXN0IFJBTSByZWdpb24g YmVsb3cgNEdCIGFuZCB1c2UgaXQgdG8KKyAgICAgKiBzdG9yZSB0aGUgcmVhbC1tb2RlIFRTUy4g SXQgbmVlZHMgdG8gYmUgYWxpZ25lZCB0byAxMjggc28gdGhhdCB0aGUKKyAgICAgKiBUU1Mgc3Ry dWN0dXJlICh3aGljaCBhY2NvdW50cyBmb3IgdGhlIGZpcnN0IDEwNGIpIGRvZXNuJ3QgY3Jvc3MK KyAgICAgKiBhIHBhZ2UgYm91bmRhcnkuCisgICAgICovCisgICAgaWYgKCAhcHZoX3N0ZWFsX3Jh bShkLCBIVk1fVk04Nl9UU1NfU0laRSwgMTI4LCBHQig0KSwgJmdhZGRyKSApCisgICAgeworICAg ICAgICBpZiAoIGh2bV9jb3B5X3RvX2d1ZXN0X3BoeXMoZ2FkZHIsIE5VTEwsIEhWTV9WTTg2X1RT U19TSVpFLCB2KSAhPQorICAgICAgICAgICAgIEhWTUNPUFlfb2theSApCisgICAgICAgICAgICBw cmludGsoIlVuYWJsZSB0byB6ZXJvIFZNODYgVFNTIGFyZWFcbiIpOworICAgICAgICBkLT5hcmNo Lmh2bV9kb21haW4ucGFyYW1zW0hWTV9QQVJBTV9WTTg2X1RTU19TSVpFRF0gPQorICAgICAgICAg ICAgVk04Nl9UU1NfVVBEQVRFRCB8ICgodWludDY0X3QpSFZNX1ZNODZfVFNTX1NJWkUgPDwgMzIp IHwgZ2FkZHI7CisgICAgICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgZ2FkZHIsIGdhZGRy ICsgSFZNX1ZNODZfVFNTX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTgy MF9SRVNFUlZFRCkgKQorICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0IFZNODYgVFNT IGFzIHJlc2VydmVkIGluIHRoZSBtZW1vcnkgbWFwXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAg ICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBWTTg2IFRTUyBhcmVhXG4iKTsKKworICAg IC8qIFN0ZWFsIHNvbWUgbW9yZSBSQU0gZm9yIHRoZSBpZGVudGl0eSBwYWdlIHRhYmxlcy4gKi8K KyAgICBpZiAoIHB2aF9zdGVhbF9yYW0oZCwgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIEdCKDQpLCAm Z2FkZHIpICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGZpbmQgbWVtb3J5IHRv IHN0YXNoIHRoZSBpZGVudGl0eSBwYWdlIHRhYmxlc1xuIik7CisgICAgICAgIHJldHVybiAtRU5P TUVNOworICAgIH0KKworICAgIC8qCisgICAgICogSWRlbnRpdHktbWFwIHBhZ2UgdGFibGUgaXMg cmVxdWlyZWQgZm9yIHJ1bm5pbmcgd2l0aCBDUjAuUEc9MAorICAgICAqIHdoZW4gdXNpbmcgSW50 ZWwgRVBULiBDcmVhdGUgYSAzMi1iaXQgbm9uLVBBRSBwYWdlIGRpcmVjdG9yeSBvZgorICAgICAq IHN1cGVycGFnZXMuCisgICAgICovCisgICAgaWRlbnRfcHQgPSBtYXBfZG9tYWluX2dmbihwMm1f Z2V0X2hvc3RwMm0oZCksIF9nZm4oUEZOX0RPV04oZ2FkZHIpKSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZtZm4sICZwMm10LCAwLCAmcmMpOworICAgIGlmICggaWRlbnRfcHQgPT0g TlVMTCApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBtYXAgaWRlbnRpdHkgcGFn ZSB0YWJsZXNcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgd3JpdGVf MzJiaXRfcHNlX2lkZW50bWFwKGlkZW50X3B0KTsKKyAgICB1bm1hcF9kb21haW5fcGFnZShpZGVu dF9wdCk7CisgICAgcHV0X3BhZ2UobWZuX3RvX3BhZ2UobWZuX3gobWZuKSkpOworICAgIGQtPmFy Y2guaHZtX2RvbWFpbi5wYXJhbXNbSFZNX1BBUkFNX0lERU5UX1BUXSA9IGdhZGRyOworICAgIGlm ICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgZ2FkZHIsIGdhZGRyICsgUEFHRV9TSVpFLCBFODIwX1JF U0VSVkVEKSApCisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byBzZXQgaWRlbnRpdHkgcGFn ZSB0YWJsZXMgYXMgcmVzZXJ2ZWQgaW4gdGhlIG1lbW9yeSBtYXBcbiIpOworCisgICAgcmV0dXJu IDA7Cit9CisKKy8qIEFzc2lnbiB0aGUgbG93IDFNQiB0byBEb20wLiAqLworc3RhdGljIHZvaWQg X19pbml0IHB2aF9zdGVhbF9sb3dfcmFtKHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcg c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBucl9wYWdlcykKK3sKKyAgICB1bnNpZ25lZCBsb25nIG1mbjsKKworICAgIEFTU0VSVChzdGFy dCArIG5yX3BhZ2VzIDw9IFBGTl9ET1dOKE1CKDEpKSk7CisKKyAgICBmb3IgKCBtZm4gPSBzdGFy dDsgbWZuIDwgc3RhcnQgKyBucl9wYWdlczsgbWZuKysgKQorICAgIHsKKyAgICAgICAgc3RydWN0 IHBhZ2VfaW5mbyAqcGcgPSBtZm5fdG9fcGFnZShtZm4pOworICAgICAgICBpbnQgcmM7CisKKyAg ICAgICAgcmMgPSB1bnNoYXJlX3hlbl9wYWdlX3dpdGhfZ3Vlc3QocGcsIGRvbV9pbyk7CisgICAg ICAgIGlmICggcmMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlVuYWJsZSB0byB1 bnNoYXJlIFhlbiBtZm4gJSNseDogJWRcbiIsIG1mbiwgcmMpOworICAgICAgICAgICAgY29udGlu dWU7CisgICAgICAgIH0KKworICAgICAgICBzaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBk LCBYRU5TSEFSRV93cml0YWJsZSk7CisgICAgICAgIHJjID0gZ3Vlc3RfcGh5c21hcF9hZGRfZW50 cnkoZCwgX2dmbihtZm4pLCBfbWZuKG1mbiksIDAsIHAybV9yYW1fcncpOworICAgICAgICBpZiAo IHJjICkKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBtZm4gJSNseCB0byBwMm06 ICVkXG4iLCBtZm4sIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBwdmhfc2V0 dXBfZTgyMChzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoreworICAg IHN0cnVjdCBlODIwZW50cnkgKmVudHJ5LCAqZW50cnlfZ3Vlc3Q7CisgICAgdW5zaWduZWQgaW50 IGk7CisgICAgdW5zaWduZWQgbG9uZyBwYWdlcywgY3VyX3BhZ2VzID0gMDsKKyAgICB1aW50NjRf dCBzdGFydCwgZW5kOworCisgICAgLyoKKyAgICAgKiBDcmFmdCB0aGUgZTgyMCBtZW1vcnkgbWFw IGZvciBEb20wIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBlODIwIG1hcC4KKyAgICAgKi8KKyAgICBk LT5hcmNoLmU4MjAgPSB4emFsbG9jX2FycmF5KHN0cnVjdCBlODIwZW50cnksIGU4MjAubnJfbWFw KTsKKyAgICBpZiAoICFkLT5hcmNoLmU4MjAgKQorICAgICAgICBwYW5pYygiVW5hYmxlIHRvIGFs bG9jYXRlIG1lbW9yeSBmb3IgRG9tMCBlODIwIG1hcCIpOworICAgIGVudHJ5X2d1ZXN0ID0gZC0+ YXJjaC5lODIwOworCisgICAgLyogQ2xhbXAgZTgyMCBtZW1vcnkgbWFwIHRvIG1hdGNoIHRoZSBt ZW1vcnkgYXNzaWduZWQgdG8gRG9tMCAqLworICAgIGZvciAoIGkgPSAwLCBlbnRyeSA9IGU4MjAu bWFwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKywgZW50cnkrKyApCisgICAgeworICAgICAgICBpZiAo IGVudHJ5LT50eXBlICE9IEU4MjBfUkFNICkKKyAgICAgICAgeworICAgICAgICAgICAgKmVudHJ5 X2d1ZXN0ID0gKmVudHJ5OworICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICB9CisKKyAg ICAgICAgaWYgKCBucl9wYWdlcyA9PSBjdXJfcGFnZXMgKQorICAgICAgICB7CisgICAgICAgICAg ICAvKgorICAgICAgICAgICAgICogV2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgYXNzaWduZWQgbWVt b3J5LAorICAgICAgICAgICAgICogc2tpcCB0aGlzIGVudHJ5CisgICAgICAgICAgICAgKi8KKyAg ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICog TWFrZSBzdXJlIHRoZSBzdGFydCBhbmQgbGVuZ3RoIGFyZSBhbGlnbmVkIHRvIFBBR0VfU0laRSwg YmVjYXVzZQorICAgICAgICAgKiB0aGF0J3MgdGhlIG1pbmltdW0gZ3JhbnVsYXJpdHkgb2YgdGhl IDJuZCBzdGFnZSB0cmFuc2xhdGlvbi4gU2luY2UKKyAgICAgICAgICogdGhlIHAybSBjb2RlIHVz ZXMgUEFHRV9PUkRFUl80SyBpbnRlcm5hbGx5LCBhbHNvIHVzZSBpdCBoZXJlIGluCisgICAgICAg ICAqIG9yZGVyIHRvIHByZXZlbnQgdGhpcyBjb2RlIGZyb20gZ2V0dGluZyBvdXQgb2Ygc3luYy4K KyAgICAgICAgICovCisgICAgICAgIHN0YXJ0ID0gUk9VTkRVUChlbnRyeS0+YWRkciwgUEFHRV9T SVpFIDw8IFBBR0VfT1JERVJfNEspOworICAgICAgICBlbmQgPSAoZW50cnktPmFkZHIgKyBlbnRy eS0+c2l6ZSkgJgorICAgICAgICAgICAgICB+KChQQUdFX1NJWkUgPDwgUEFHRV9PUkRFUl80Sykg LSAxKTsKKyAgICAgICAgaWYgKCBzdGFydCA+PSBlbmQgKQorICAgICAgICAgICAgY29udGludWU7 CisKKyAgICAgICAgZW50cnlfZ3Vlc3QtPnR5cGUgPSBFODIwX1JBTTsKKyAgICAgICAgZW50cnlf Z3Vlc3QtPmFkZHIgPSBzdGFydDsKKyAgICAgICAgZW50cnlfZ3Vlc3QtPnNpemUgPSBlbmQgLSBz dGFydDsKKyAgICAgICAgcGFnZXMgPSBQRk5fRE9XTihlbnRyeV9ndWVzdC0+c2l6ZSk7CisgICAg ICAgIGlmICggKGN1cl9wYWdlcyArIHBhZ2VzKSA+IG5yX3BhZ2VzICkKKyAgICAgICAgeworICAg ICAgICAgICAgLyogVHJ1bmNhdGUgcmVnaW9uICovCisgICAgICAgICAgICBlbnRyeV9ndWVzdC0+ c2l6ZSA9IChucl9wYWdlcyAtIGN1cl9wYWdlcykgPDwgUEFHRV9TSElGVDsKKyAgICAgICAgICAg IGN1cl9wYWdlcyA9IG5yX3BhZ2VzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAg eworICAgICAgICAgICAgY3VyX3BhZ2VzICs9IHBhZ2VzOworICAgICAgICB9CisgbmV4dDoKKyAg ICAgICAgZC0+YXJjaC5ucl9lODIwKys7CisgICAgICAgIGVudHJ5X2d1ZXN0Kys7CisgICAgfQor ICAgIEFTU0VSVChjdXJfcGFnZXMgPT0gbnJfcGFnZXMpOworICAgIEFTU0VSVChkLT5hcmNoLm5y X2U4MjAgPD0gZTgyMC5ucl9tYXApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBf cDJtKHN0cnVjdCBkb21haW4gKmQpCit7CisgICAgc3RydWN0IHZjcHUgKnYgPSBkLT52Y3B1WzBd OworICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAg aW50IHJjOworICAgIGJvb2wgcHJlZW1wdGVkOworI2RlZmluZSBNQjFfUEFHRVMgUEZOX0RPV04o TUIoMSkpCisKKyAgICBucl9wYWdlcyA9IGNvbXB1dGVfZG9tMF9ucl9wYWdlcyhkLCBOVUxMLCAw KTsKKworICAgIHB2aF9zZXR1cF9lODIwKGQsIG5yX3BhZ2VzKTsKKyAgICBkbyB7CisgICAgICAg IHByZWVtcHRlZCA9IGZhbHNlOworICAgICAgICBwYWdpbmdfc2V0X2FsbG9jYXRpb24oZCwgZG9t MF9wYWdpbmdfcGFnZXMoZCwgbnJfcGFnZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnByZWVtcHRlZCk7CisgICAgICAgIHByb2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOworICAg IH0gd2hpbGUgKCBwcmVlbXB0ZWQgKTsKKworICAgIC8qCisgICAgICogTWVtb3J5IGJlbG93IDFN QiBpcyBpZGVudGl0eSBtYXBwZWQuCisgICAgICogTkI6IHRoaXMgb25seSBtYWtlcyBzZW5zZSB3 aGVuIGJvb3RlZCBmcm9tIGxlZ2FjeSBCSU9TLgorICAgICAqLworICAgIHJjID0gbW9kaWZ5X2lk ZW50aXR5X21taW8oZCwgMCwgTUIxX1BBR0VTLCB0cnVlKTsKKyAgICBpZiAoIHJjICkKKyAgICB7 CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIGlkZW50aXR5IG1hcCBsb3cgMU1COiAlZFxuIiwg cmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogUG9wdWxhdGUgbWVtb3J5 IG1hcC4gKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IGQtPmFyY2gubnJfZTgyMDsgaSsrICkKKyAg ICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZTsKKworICAgICAgICBpZiAoIGQt PmFyY2guZTgyMFtpXS50eXBlICE9IEU4MjBfUkFNICkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor CisgICAgICAgIGFkZHIgPSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uYWRkcik7CisgICAgICAg IHNpemUgPSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uc2l6ZSk7CisKKyAgICAgICAgaWYgKCBh ZGRyID49IE1CMV9QQUdFUyApCisgICAgICAgICAgICByYyA9IHB2aF9wb3B1bGF0ZV9tZW1vcnlf cmFuZ2UoZCwgYWRkciwgc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAg ICAgQVNTRVJUKGFkZHIgKyBzaXplIDwgTUIxX1BBR0VTKTsKKyAgICAgICAgICAgIHB2aF9zdGVh bF9sb3dfcmFtKGQsIGFkZHIsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCByYyAp CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKCBjcHVfaGFzX3ZteCAm JiBwYWdpbmdfbW9kZV9oYXAoZCkgJiYgIXZteF91bnJlc3RyaWN0ZWRfZ3Vlc3QodikgKQorICAg IHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2UgRG9tMCBjYW5ub3QgYmUgbWlncmF0ZWQs IHdlIHdpbGwgb25seSBzZXR1cCB0aGUKKyAgICAgICAgICogdW5yZXN0cmljdGVkIGd1ZXN0IGhl bHBlcnMgaWYgdGhleSBhcmUgbmVlZGVkIGJ5IHRoZSBjdXJyZW50CisgICAgICAgICAqIGhhcmR3 YXJlIHdlIGFyZSBydW5uaW5nIG9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmMgPSBwdmhfc2V0 dXBfdm14X3JlYWxtb2RlX2hlbHBlcnMoZCk7CisgICAgICAgIGlmICggcmMgKQorICAgICAgICAg ICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiAwOworI3VuZGVmIE1CMV9QQUdFUwor fQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhfbG9hZF9rZXJuZWwoc3RydWN0IGRvbWFpbiAqZCwg Y29uc3QgbW9kdWxlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGxvbmcgaW1hZ2VfaGVhZHJvb20sCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbW9kdWxlX3QgKmluaXRyZCwgdm9pZCAqaW1hZ2VfYmFzZSwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjbWRsaW5lLCBwYWRkcl90ICplbnRyeSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcl90ICpzdGFydF9pbmZvX2FkZHIp Cit7CisgICAgdm9pZCAqaW1hZ2Vfc3RhcnQgPSBpbWFnZV9iYXNlICsgaW1hZ2VfaGVhZHJvb207 CisgICAgdW5zaWduZWQgbG9uZyBpbWFnZV9sZW4gPSBpbWFnZS0+bW9kX2VuZDsKKyAgICBzdHJ1 Y3QgZWxmX2JpbmFyeSBlbGY7CisgICAgc3RydWN0IGVsZl9kb21fcGFybXMgcGFybXM7CisgICAg cGFkZHJfdCBsYXN0X2FkZHI7CisgICAgc3RydWN0IGh2bV9zdGFydF9pbmZvIHN0YXJ0X2luZm8g PSB7IDAgfTsKKyAgICBzdHJ1Y3QgaHZtX21vZGxpc3RfZW50cnkgbW9kID0geyAwIH07CisgICAg c3RydWN0IHZjcHUgKnYgPSBkLT52Y3B1WzBdOworICAgIGludCByYzsKKworICAgIGlmICggKHJj ID0gYnppbWFnZV9wYXJzZShpbWFnZV9iYXNlLCAmaW1hZ2Vfc3RhcnQsICZpbWFnZV9sZW4pKSAh PSAwICkKKyAgICB7CisgICAgICAgIHByaW50aygiRXJyb3IgdHJ5aW5nIHRvIGRldGVjdCBieiBj b21wcmVzc2VkIGtlcm5lbFxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBp ZiAoIChyYyA9IGVsZl9pbml0KCZlbGYsIGltYWdlX3N0YXJ0LCBpbWFnZV9sZW4pKSAhPSAwICkK KyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGluaXQgRUxGXG4iKTsKKyAgICAgICAg cmV0dXJuIHJjOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZWxmX3NldF92ZXJib3NlKCZl bGYpOworI2VuZGlmCisgICAgZWxmX3BhcnNlX2JpbmFyeSgmZWxmKTsKKyAgICBpZiAoIChyYyA9 IGVsZl94ZW5fcGFyc2UoJmVsZiwgJnBhcm1zKSkgIT0gMCApCisgICAgeworICAgICAgICBwcmlu dGsoIlVuYWJsZSB0byBwYXJzZSBrZXJuZWwgZm9yIEVMRk5PVEVTXG4iKTsKKyAgICAgICAgcmV0 dXJuIHJjOworICAgIH0KKworICAgIGlmICggcGFybXMucGh5c19lbnRyeSA9PSBVTlNFVF9BRERS MzIgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmluZCBYRU5fRUxGTk9URV9Q SFlTMzJfRU5UUlkgYWRkcmVzc1xuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0K KworICAgIHByaW50aygiT1M6ICVzIHZlcnNpb246ICVzIGxvYWRlcjogJXMgYml0bmVzczogJXNc biIsIHBhcm1zLmd1ZXN0X29zLAorICAgICAgICAgICBwYXJtcy5ndWVzdF92ZXIsIHBhcm1zLmxv YWRlciwKKyAgICAgICAgICAgZWxmXzY0Yml0KCZlbGYpID8gIjY0LWJpdCIgOiAiMzItYml0Iik7 CisKKyAgICAvKiBDb3B5IHRoZSBPUyBpbWFnZSBhbmQgZnJlZSB0ZW1wb3JhcnkgYnVmZmVyLiAq LworICAgIGVsZi5kZXN0X2Jhc2UgPSAodm9pZCAqKShwYXJtcy52aXJ0X2tzdGFydCAtIHBhcm1z LnZpcnRfYmFzZSk7CisgICAgZWxmLmRlc3Rfc2l6ZSA9IHBhcm1zLnZpcnRfa2VuZCAtIHBhcm1z LnZpcnRfa3N0YXJ0OworCisgICAgZWxmX3NldF92Y3B1KCZlbGYsIHYpOworICAgIHJjID0gZWxm X2xvYWRfYmluYXJ5KCZlbGYpOworICAgIGlmICggcmMgPCAwICkKKyAgICB7CisgICAgICAgIHBy aW50aygiRmFpbGVkIHRvIGxvYWQga2VybmVsOiAlZFxuIiwgcmMpOworICAgICAgICBwcmludGso IlhlbiBkb20wIGtlcm5lbCBicm9rZW4gRUxGOiAlc1xuIiwgZWxmX2NoZWNrX2Jyb2tlbigmZWxm KSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBsYXN0X2FkZHIgPSBST1VORFVQ KHBhcm1zLnZpcnRfa2VuZCAtIHBhcm1zLnZpcnRfYmFzZSwgUEFHRV9TSVpFKTsKKworICAgIGlm ICggaW5pdHJkICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcmMgPSBodm1fY29weV90b19ndWVz dF9waHlzKGxhc3RfYWRkciwgbWZuX3RvX3ZpcnQoaW5pdHJkLT5tb2Rfc3RhcnQpLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdHJkLT5tb2RfZW5kLCB2KTsKKyAgICAg ICAgaWYgKCByYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNv cHkgaW5pdHJkIHRvIGd1ZXN0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAg fQorCisgICAgICAgIG1vZC5wYWRkciA9IGxhc3RfYWRkcjsKKyAgICAgICAgbW9kLnNpemUgPSBp bml0cmQtPm1vZF9lbmQ7CisgICAgICAgIGxhc3RfYWRkciArPSBST1VORFVQKGluaXRyZC0+bW9k X2VuZCwgUEFHRV9TSVpFKTsKKyAgICB9CisKKyAgICAvKiBGcmVlIHRlbXBvcmFyeSBidWZmZXJz LiAqLworICAgIGRpc2NhcmRfaW5pdGlhbF9pbWFnZXMoKTsKKworICAgIGlmICggY21kbGluZSAh PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhsYXN0 X2FkZHIsIGNtZGxpbmUsIHN0cmxlbihjbWRsaW5lKSArIDEsIHYpOworICAgICAgICBpZiAoIHJj ICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY29weSBndWVzdCBj b21tYW5kIGxpbmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAg ICAgIHN0YXJ0X2luZm8uY21kbGluZV9wYWRkciA9IGxhc3RfYWRkcjsKKyAgICAgICAgLyoKKyAg ICAgICAgICogUm91bmQgdXAgdG8gMzIvNjQgYml0cyAoZGVwZW5kaW5nIG9uIHRoZSBndWVzdCBr ZXJuZWwgYml0bmVzcykgc28KKyAgICAgICAgICogdGhlIG1vZGxpc3Qvc3RhcnRfaW5mbyBpcyBh bGlnbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgbGFzdF9hZGRyICs9IFJPVU5EVVAoc3RybGVu KGNtZGxpbmUpICsgMSwgZWxmXzY0Yml0KCZlbGYpID8gOCA6IDQpOworICAgIH0KKyAgICBpZiAo IGluaXRyZCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3Rf cGh5cyhsYXN0X2FkZHIsICZtb2QsIHNpemVvZihtb2QpLCB2KTsKKyAgICAgICAgaWYgKCByYyAp CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgZ3Vlc3QgbW9k dWxlc1xuIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgc3Rh cnRfaW5mby5tb2RsaXN0X3BhZGRyID0gbGFzdF9hZGRyOworICAgICAgICBzdGFydF9pbmZvLm5y X21vZHVsZXMgPSAxOworICAgICAgICBsYXN0X2FkZHIgKz0gc2l6ZW9mKG1vZCk7CisgICAgfQor CisgICAgc3RhcnRfaW5mby5tYWdpYyA9IFhFTl9IVk1fU1RBUlRfTUFHSUNfVkFMVUU7CisgICAg c3RhcnRfaW5mby5mbGFncyA9IFNJRl9QUklWSUxFR0VEIHwgU0lGX0lOSVRET01BSU47CisgICAg cmMgPSBodm1fY29weV90b19ndWVzdF9waHlzKGxhc3RfYWRkciwgJnN0YXJ0X2luZm8sIHNpemVv ZihzdGFydF9pbmZvKSwgdik7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGso IlVuYWJsZSB0byBjb3B5IHN0YXJ0IGluZm8gdG8gZ3Vlc3RcbiIpOworICAgICAgICByZXR1cm4g cmM7CisgICAgfQorCisgICAgKmVudHJ5ID0gcGFybXMucGh5c19lbnRyeTsKKyAgICAqc3RhcnRf aW5mb19hZGRyID0gbGFzdF9hZGRyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg X19pbml0IHB2aF9zZXR1cF9jcHVzKHN0cnVjdCBkb21haW4gKmQsIHBhZGRyX3QgZW50cnksCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcl90IHN0YXJ0X2luZm8pCit7Cisg ICAgc3RydWN0IHZjcHUgKnYgPSBkLT52Y3B1WzBdOworICAgIHVuc2lnbmVkIGludCBjcHUsIGk7 CisgICAgaW50IHJjOworICAgIC8qCisgICAgICogVGhpcyBzZXRzIHRoZSB2Q1BVIHN0YXRlIGFj Y29yZGluZyB0byB0aGUgc3RhdGUgZGVzY3JpYmVkIGluCisgICAgICogZG9jcy9taXNjL2h2bWxp dGUubWFya2Rvd24uCisgICAgICovCisgICAgdmNwdV9odm1fY29udGV4dF90IGNwdV9jdHggPSB7 CisgICAgICAgIC5tb2RlID0gVkNQVV9IVk1fTU9ERV8zMkIsCisgICAgICAgIC5jcHVfcmVncy54 ODZfMzIuZWJ4ID0gc3RhcnRfaW5mbywKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5laXAgPSBl bnRyeSwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jcjAgPSBYODZfQ1IwX1BFIHwgWDg2X0NS MF9FVCwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi5jc19saW1pdCA9IH4wdSwKKyAgICAgICAg LmNwdV9yZWdzLng4Nl8zMi5kc19saW1pdCA9IH4wdSwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8z Mi5zc19saW1pdCA9IH4wdSwKKyAgICAgICAgLmNwdV9yZWdzLng4Nl8zMi50cl9saW1pdCA9IDB4 NjcsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIuY3NfYXIgPSAweGM5YiwKKyAgICAgICAgLmNw dV9yZWdzLng4Nl8zMi5kc19hciA9IDB4YzkzLAorICAgICAgICAuY3B1X3JlZ3MueDg2XzMyLnNz X2FyID0gMHhjOTMsCisgICAgICAgIC5jcHVfcmVncy54ODZfMzIudHJfYXIgPSAweDhiLAorICAg IH07CisKKyAgICBjcHUgPSB2LT5wcm9jZXNzb3I7CisgICAgZm9yICggaSA9IDE7IGkgPCBkLT5t YXhfdmNwdXM7IGkrKyApCisgICAgeworICAgICAgICBjcHUgPSBjcHVtYXNrX2N5Y2xlKGNwdSwg JmRvbTBfY3B1cyk7CisgICAgICAgIHNldHVwX2RvbTBfdmNwdShkLCBpLCBjcHUpOworICAgIH0K KworICAgIHJjID0gYXJjaF9zZXRfaW5mb19odm1fZ3Vlc3QodiwgJmNwdV9jdHgpOworICAgIGlm ICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gc2V0dXAgRG9tMCBCU1Ag Y29udGV4dDogJWRcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJj ID0gc2V0dXBfcGVybWlzc2lvbnMoZCk7CisgICAgaWYgKCByYyApCisgICAgeworICAgICAgICBw YW5pYygiVW5hYmxlIHRvIHNldHVwIERvbTAgcGVybWlzc2lvbnM6ICVkXG4iLCByYyk7CisgICAg ICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICB1cGRhdGVfZG9tYWluX3dhbGxjbG9ja190aW1l KGQpOworCisgICAgY2xlYXJfYml0KF9WUEZfZG93biwgJnYtPnBhdXNlX2ZsYWdzKTsKKworICAg IHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2NvdW50X2ludHJfb3ZyKHN0 cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCisgICAgYWNwaV9p bnRyX292ZXJyaWRlcysrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBh Y3BpX3NldF9pbnRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5k KQoreworICAgIGNvbnN0IHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICppbnRy ID0KKyAgICAgICAgY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1 cHRfb3ZlcnJpZGUsIGhlYWRlcik7CisKKyAgICAqaW50c3Jjb3ZyID0gKmludHI7CisgICAgaW50 c3Jjb3ZyKys7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNwaV9j b3VudF9ubWlfc3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQor eworCisgICAgYWNwaV9ubWlfc291cmNlcysrOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMg aW50IF9faW5pdCBhY3BpX3NldF9ubWlfc3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAq aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25l ZCBsb25nIGVuZCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UgKnNy YyA9CisgICAgICAgIGNvbnRhaW5lcl9vZihoZWFkZXIsIHN0cnVjdCBhY3BpX21hZHRfbm1pX3Nv dXJjZSwgaGVhZGVyKTsKKworICAgICpubWlzcmMgPSAqc3JjOworICAgIG5taXNyYysrOworCisg ICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHB2aF9zZXR1cF9hY3BpX21hZHQo c3RydWN0IGRvbWFpbiAqZCwgcGFkZHJfdCAqYWRkcikKK3sKKyAgICBzdHJ1Y3QgYWNwaV90YWJs ZV9tYWR0ICptYWR0OworICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisgICAg c3RydWN0IGFjcGlfbWFkdF9pb19hcGljICppb19hcGljOworICAgIHN0cnVjdCBhY3BpX21hZHRf bG9jYWxfeDJhcGljICp4MmFwaWM7CisgICAgYWNwaV9zdGF0dXMgc3RhdHVzOworICAgIHVuc2ln bmVkIGxvbmcgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgaSwgbWF4X3ZjcHVzOworICAgIGludCBy YzsKKworICAgIC8qIENvdW50IG51bWJlciBvZiBpbnRlcnJ1cHQgb3ZlcnJpZGVzIGluIHRoZSBN QURULiAqLworICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9JTlRFUlJV UFRfT1ZFUlJJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY291bnRfaW50cl9v dnIsIFVJTlRfTUFYKTsKKworICAgIC8qIENvdW50IG51bWJlciBvZiBOTUkgc291cmNlcyBpbiB0 aGUgTUFEVC4gKi8KKyAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTk1J X1NPVVJDRSwgYWNwaV9jb3VudF9ubWlfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBV SU5UX01BWCk7CisKKyAgICBtYXhfdmNwdXMgPSBkb20wX21heF92Y3B1cygpOworICAgIC8qIENh bGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY3JhZnRlZCBNQURULiAqLworICAgIHNpemUgPSBzaXpl b2YoKm1hZHQpOworICAgIC8qCisgICAgICogRklYTUU6IHRoZSBjdXJyZW50IHZJTy1BUElDIGNv ZGUganVzdCBzdXBwb3J0cyBvbmUgSU8tQVBJQyBpbnN0YW5jZQorICAgICAqIHBlciBkb21haW4u IFRoaXMgbXVzdCBiZSBmaXhlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoZSBzYW1lIGFtb3VudCBv ZgorICAgICAqIElPIEFQSUNzIGFzIGF2YWlsYWJsZSBvbiBiYXJlIG1ldGFsLgorICAgICAqLwor ICAgIHNpemUgKz0gc2l6ZW9mKCppb19hcGljKTsKKyAgICBzaXplICs9IHNpemVvZigqaW50c3Jj b3ZyKSAqIGFjcGlfaW50cl9vdmVycmlkZXM7CisgICAgc2l6ZSArPSBzaXplb2YoKm5taXNyYykg KiBhY3BpX25taV9zb3VyY2VzOworICAgIHNpemUgKz0gc2l6ZW9mKCp4MmFwaWMpICogbWF4X3Zj cHVzOworCisgICAgbWFkdCA9IHh6YWxsb2NfYnl0ZXMoc2l6ZSk7CisgICAgaWYgKCAhbWFkdCAp CisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1B RFQgdGFibGVcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gb3V0Owor ICAgIH0KKworICAgIC8qIENvcHkgdGhlIG5hdGl2ZSBNQURUIHRhYmxlIGhlYWRlci4gKi8KKyAg ICBzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19NQURULCAwLCAmdGFibGUpOworICAg IGlmICggIUFDUElfU1VDQ0VTUyhzdGF0dXMpICkKKyAgICB7CisgICAgICAgIHByaW50aygiRmFp bGVkIHRvIGdldCBNQURUIEFDUEkgdGFibGUsIGFib3J0aW5nLlxuIik7CisgICAgICAgIHJjID0g LUVJTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIG1hZHQtPmhlYWRlciA9ICp0 YWJsZTsKKyAgICBtYWR0LT5hZGRyZXNzID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKyAgICAv KgorICAgICAqIE5COiB0aGlzIGlzIGN1cnJlbnRseSBzZXQgdG8gNCwgd2hpY2ggaXMgdGhlIHJl dmlzaW9uIGluIHRoZSBBQ1BJCisgICAgICogc3BlYyA2LjEuIFNhZGx5IEFDUElDQSBkb2Vzbid0 IHByb3ZpZGUgcmV2aXNpb24gbnVtYmVycyBmb3IgdGhlCisgICAgICogdGFibGVzIGRlc2NyaWJl ZCBpbiB0aGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBtYWR0LT5oZWFkZXIucmV2aXNpb24gPSBt aW5fdCh1bnNpZ25lZCBjaGFyLCB0YWJsZS0+cmV2aXNpb24sIDQpOworCisgICAgLyoKKyAgICAg KiBTZXR1cCB0aGUgSU8gQVBJQyBlbnRyeS4KKyAgICAgKiBGSVhNRTogdGhlIGN1cnJlbnQgdklP LUFQSUMgY29kZSBqdXN0IHN1cHBvcnRzIG9uZSBJTy1BUElDIGluc3RhbmNlCisgICAgICogcGVy IGRvbWFpbi4gVGhpcyBtdXN0IGJlIGZpeGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHNhbWUg YW1vdW50IG9mCisgICAgICogSU8gQVBJQ3MgYXMgYXZhaWxhYmxlIG9uIGJhcmUgbWV0YWwsIGFu ZCB3aXRoIHRoZSBzYW1lIElEcyBhcyBmb3VuZCBpbgorICAgICAqIHRoZSBuYXRpdmUgSU8gQVBJ QyBNQURUIGVudHJpZXMuCisgICAgICovCisgICAgaWYgKCBucl9pb2FwaWNzID4gMSApCisgICAg ICAgIHByaW50aygiV0FSTklORzogZm91bmQgJWQgSU8gQVBJQ3MsIERvbTAgd2lsbCBvbmx5IGhh dmUgYWNjZXNzIHRvIDEgZW11bGF0ZWQgSU8gQVBJQ1xuIiwKKyAgICAgICAgICAgICAgIG5yX2lv YXBpY3MpOworICAgIGlvX2FwaWMgPSAodm9pZCAqKShtYWR0ICsgMSk7CisgICAgaW9fYXBpYy0+ aGVhZGVyLnR5cGUgPSBBQ1BJX01BRFRfVFlQRV9JT19BUElDOworICAgIGlvX2FwaWMtPmhlYWRl ci5sZW5ndGggPSBzaXplb2YoKmlvX2FwaWMpOworICAgIGlvX2FwaWMtPmlkID0gZG9tYWluX3Zp b2FwaWMoZCktPmlkOworICAgIGlvX2FwaWMtPmFkZHJlc3MgPSBWSU9BUElDX0RFRkFVTFRfQkFT RV9BRERSRVNTOworCisgICAgeDJhcGljID0gKHZvaWQgKikoaW9fYXBpYyArIDEpOworICAgIGZv ciAoIGkgPSAwOyBpIDwgbWF4X3ZjcHVzOyBpKysgKQorICAgIHsKKyAgICAgICAgeDJhcGljLT5o ZWFkZXIudHlwZSA9IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQzsKKyAgICAgICAgeDJhcGlj LT5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKCp4MmFwaWMpOworICAgICAgICB4MmFwaWMtPnVpZCA9 IGk7CisgICAgICAgIHgyYXBpYy0+bG9jYWxfYXBpY19pZCA9IGkgKiAyOworICAgICAgICB4MmFw aWMtPmxhcGljX2ZsYWdzID0gQUNQSV9NQURUX0VOQUJMRUQ7CisgICAgICAgIHgyYXBpYysrOwor ICAgIH0KKworICAgIC8qIFNldHVwIGludGVycnVwdCBvdmVycmlkZXMuICovCisgICAgaW50c3Jj b3ZyID0gKHZvaWQgKil4MmFwaWM7CisgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFE VF9UWVBFX0lOVEVSUlVQVF9PVkVSUklERSwgYWNwaV9zZXRfaW50cl9vdnIsCisgICAgICAgICAg ICAgICAgICAgICAgICAgIGFjcGlfaW50cl9vdmVycmlkZXMpOworCisgICAgLyogU2V0dXAgTk1J IHNvdXJjZXMuICovCisgICAgbm1pc3JjID0gKHZvaWQgKilpbnRzcmNvdnI7CisgICAgYWNwaV90 YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfc2V0X25taV9z cmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbm1pX3NvdXJjZXMpOworCisgICAg QVNTRVJUKCgodm9pZCAqKW5taXNyYyAtICh2b2lkICopbWFkdCkgPT0gc2l6ZSk7CisgICAgbWFk dC0+aGVhZGVyLmxlbmd0aCA9IHNpemU7CisgICAgLyoKKyAgICAgKiBDYWxsaW5nIGFjcGlfdGJf Y2hlY2tzdW0gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0CisgICAgICogaW50cm9k dWNpbmcgYSB3cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBvdmVya2lsbC4KKyAg ICAgKi8KKyAgICBtYWR0LT5oZWFkZXIuY2hlY2tzdW0gLT0gYWNwaV90Yl9jaGVja3N1bShBQ1BJ X0NBU1RfUFRSKHU4LCBtYWR0KSwgc2l6ZSk7CisKKyAgICAvKiBQbGFjZSB0aGUgbmV3IE1BRFQg aW4gZ3Vlc3QgbWVtb3J5IHNwYWNlLiAqLworICAgIGlmICggcHZoX3N0ZWFsX3JhbShkLCBzaXpl LCAwLCBHQig0KSwgYWRkcikgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gZmlu ZCBhbGxvY2F0ZSBndWVzdCBSQU0gZm9yIE1BRFRcbiIpOworICAgICAgICByYyA9IC1FTk9NRU07 CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIE1hcmsgdGhpcyByZWdpb24gYXMg RTgyMF9BQ1BJLiAqLworICAgIGlmICggcHZoX2FkZF9tZW1fcmFuZ2UoZCwgKmFkZHIsICphZGRy ICsgc2l6ZSwgRTgyMF9BQ1BJKSApCisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFkZCBNQURU IHJlZ2lvbiB0byBtZW1vcnkgbWFwXG4iKTsKKworICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3Rf cGh5cygqYWRkciwgbWFkdCwgc2l6ZSwgZC0+dmNwdVswXSk7CisgICAgaWYgKCByYyApCisgICAg eworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IE1BRFQgaW50byBndWVzdCBtZW1vcnlc biIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByYyA9IDA7CisKKyBvdXQ6Cisg ICAgeGZyZWUobWFkdCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIF9faW5p dCBhY3BpX21lbW9yeV9iYW5uZWQodW5zaWduZWQgbG9uZyBhZGRyZXNzLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdW5z aWduZWQgbG9uZyBtZm4sIG5yX3BhZ2VzLCBpOworCisgICAgbWZuID0gUEZOX0RPV04oYWRkcmVz cyk7CisgICAgbnJfcGFnZXMgPSBQRk5fVVAoKGFkZHJlc3MgJiB+UEFHRV9NQVNLKSArIHNpemUp OworICAgIGZvciAoIGkgPSAwIDsgaSA8IG5yX3BhZ2VzOyBpKysgKQorICAgICAgICBpZiAoICFw YWdlX2lzX3JhbV90eXBlKG1mbiArIGksIFJBTV9UWVBFX1JFU0VSVkVEKSAmJgorICAgICAgICAg ICAgICFwYWdlX2lzX3JhbV90eXBlKG1mbiArIGksIFJBTV9UWVBFX0FDUEkpICkKKyAgICAgICAg ICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBf X2luaXQgcHZoX2FjcGlfdGFibGVfYWxsb3dlZChjb25zdCBjaGFyICpzaWcpCit7CisgICAgc3Rh dGljIGNvbnN0IGNoYXIgX19pbml0Y29uc3QgYmFubmVkX3RhYmxlc1tdW0FDUElfTkFNRV9TSVpF XSA9IHsKKyAgICAgICAgQUNQSV9TSUdfSFBFVCwgQUNQSV9TSUdfU0xJVCwgQUNQSV9TSUdfU1JB VCwgQUNQSV9TSUdfTVBTVCwKKyAgICAgICAgQUNQSV9TSUdfUE1UVCwgQUNQSV9TSUdfTUFEVCwg QUNQSV9TSUdfRE1BUn07CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKCBpID0gMCA7 IGkgPCBBUlJBWV9TSVpFKGJhbm5lZF90YWJsZXMpOyBpKysgKQorICAgICAgICBpZiAoIHN0cm5j bXAoc2lnLCBiYW5uZWRfdGFibGVzW2ldLCBBQ1BJX05BTUVfU0laRSkgPT0gMCApCisgICAgICAg ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvKiBNYWtlIHN1cmUgdGFibGUgZG9lc24ndCByZXNp ZGUgaW4gYSBSQU0gcmVnaW9uLiAqLworICAgIGlmICggYWNwaV9tZW1vcnlfYmFubmVkKGFjcGlf Z2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzcywKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aCkgKQor ICAgIHsKKyAgICAgICAgcHJpbnRrKCJTa2lwcGluZyB0YWJsZSAlLjRzIGJlY2F1c2UgcmVzaWRl cyBpbiBhIG5vbi1BQ1BJLCBub24tcmVzZXJ2ZWQgcmVnaW9uXG4iLAorICAgICAgICAgICAgICAg c2lnKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwor fQorCitzdGF0aWMgaW50IF9faW5pdCBwdmhfc2V0dXBfYWNwaV94c2R0KHN0cnVjdCBkb21haW4g KmQsIHBhZGRyX3QgbWFkdF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwYWRkcl90ICphZGRyKQoreworICAgIHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKnhzZHQ7 CisgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKyAgICBzdHJ1Y3QgYWNwaV90 YWJsZV9yc2RwICpyc2RwOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHNpemVvZigqeHNkdCk7 CisgICAgdW5zaWduZWQgaW50IGksIGosIG51bV90YWJsZXMgPSAwOworICAgIHBhZGRyX3QgeHNk dF9wYWRkcjsKKyAgICBpbnQgcmM7CisKKyAgICAvKgorICAgICAqIFJlc3RvcmUgb3JpZ2luYWwg RE1BUiB0YWJsZSBzaWduYXR1cmUsIHdlIGFyZSBnb2luZyB0byBmaWx0ZXIgaXQgZnJvbQorICAg ICAqIHRoZSBuZXcgWFNEVCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgZ3Vlc3QsIHNvIGl0IGlz IG5vIGxvbmdlcgorICAgICAqIG5lY2Vzc2FyeSB0byBoYXZlIGl0J3Mgc2lnbmF0dXJlIHphcHBl ZC4KKyAgICAgKi8KKyAgICBhY3BpX2RtYXJfcmVpbnN0YXRlKCk7CisKKyAgICAvKiBDb3VudCB0 aGUgbnVtYmVyIG9mIHRhYmxlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIFhTRFQuICovCisg ICAgZm9yKCBpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrICkK KyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnNpZyA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlz dC50YWJsZXNbaV0uc2lnbmF0dXJlLmFzY2lpOworCisgICAgICAgIGlmICggcHZoX2FjcGlfdGFi bGVfYWxsb3dlZChzaWcpICkKKyAgICAgICAgICAgIG51bV90YWJsZXMrKzsKKyAgICB9CisKKyAg ICAvKgorICAgICAqIE5vIG5lZWQgdG8gYWRkIG9yIHN1YnRyYWN0IGFueXRoaW5nIGJlY2F1c2Ug c3RydWN0IGFjcGlfdGFibGVfeHNkdAorICAgICAqIGluY2x1ZGVzIG9uZSBhcnJheSBzbG90IGFs cmVhZHksIGFuZCB3ZSBoYXZlIGZpbHRlcmVkIG91dCB0aGUgb3JpZ2luYWwKKyAgICAgKiBNQURU IGFuZCB3ZSBhcmUgZ29pbmcgdG8gYWRkIGEgY3VzdG9tIGJ1aWx0IE1BRFQuCisgICAgICovCisg ICAgc2l6ZSArPSBudW1fdGFibGVzICogc2l6ZW9mKHhzZHQtPnRhYmxlX29mZnNldF9lbnRyeVsw XSk7CisKKyAgICB4c2R0ID0geHphbGxvY19ieXRlcyhzaXplKTsKKyAgICBpZiAoICF4c2R0ICkK KyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgWFNE VCB0YWJsZVxuIik7CisgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXQ7Cisg ICAgfQorCisgICAgLyogQ29weSB0aGUgbmF0aXZlIFhTRFQgdGFibGUgaGVhZGVyLiAqLworICAg IHJzZHAgPSBhY3BpX29zX21hcF9tZW1vcnkoYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCksIHNp emVvZigqcnNkcCkpOworICAgIGlmICggIXJzZHAgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJV bmFibGUgdG8gbWFwIFJTRFBcbiIpOworICAgICAgICByYyA9IC1FSU5WQUw7CisgICAgICAgIGdv dG8gb3V0OworICAgIH0KKyAgICB4c2R0X3BhZGRyID0gcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRy ZXNzOworICAgIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHJzZHAsIHNpemVvZigqcnNkcCkpOworICAg IHRhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KHhzZHRfcGFkZHIsIHNpemVvZigqdGFibGUpKTsK KyAgICBpZiAoICF0YWJsZSApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBtYXAg WFNEVFxuIik7CisgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBvdXQ7CisgICAg fQorICAgIHhzZHQtPmhlYWRlciA9ICp0YWJsZTsKKyAgICBhY3BpX29zX3VubWFwX21lbW9yeSh0 YWJsZSwgc2l6ZW9mKCp0YWJsZSkpOworCisgICAgLyogQWRkIHRoZSBjdXN0b20gTUFEVC4gKi8K KyAgICB4c2R0LT50YWJsZV9vZmZzZXRfZW50cnlbMF0gPSBtYWR0X2FkZHI7CisKKyAgICAvKiBD b3B5IHRoZSBhZGRyZXNzZXMgb2YgdGhlIHJlc3Qgb2YgdGhlIGFsbG93ZWQgdGFibGVzLiAqLwor ICAgIGZvciggaSA9IDAsIGogPSAxOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50 OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc2lnID0gYWNwaV9nYmxfcm9vdF90 YWJsZV9saXN0LnRhYmxlc1tpXS5zaWduYXR1cmUuYXNjaWk7CisKKyAgICAgICAgaWYgKCBwdmhf YWNwaV90YWJsZV9hbGxvd2VkKHNpZykgKQorICAgICAgICAgICAgeHNkdC0+dGFibGVfb2Zmc2V0 X2VudHJ5W2orK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9y b290X3RhYmxlX2xpc3QudGFibGVzW2ldLmFkZHJlc3M7CisgICAgfQorCisgICAgeHNkdC0+aGVh ZGVyLnJldmlzaW9uID0gMTsKKyAgICB4c2R0LT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKKyAgICAv KgorICAgICAqIENhbGxpbmcgYWNwaV90Yl9jaGVja3N1bSBoZXJlIGlzIGEgbGF5ZXJpbmcgdmlv bGF0aW9uLCBidXQKKyAgICAgKiBpbnRyb2R1Y2luZyBhIHdyYXBwZXIgZm9yIHN1Y2ggc2ltcGxl IHVzYWdlIHNlZW1zIG92ZXJraWxsLgorICAgICAqLworICAgIHhzZHQtPmhlYWRlci5jaGVja3N1 bSAtPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIodTgsIHhzZHQpLCBzaXplKTsKKwor ICAgIC8qIFBsYWNlIHRoZSBuZXcgWFNEVCBpbiBndWVzdCBtZW1vcnkgc3BhY2UuICovCisgICAg aWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNpemUsIDAsIEdCKDQpLCBhZGRyKSApCisgICAgeworICAg ICAgICBwcmludGsoIlVuYWJsZSB0byBmaW5kIGd1ZXN0IFJBTSBmb3IgWFNEVFxuIik7CisgICAg ICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogTWFy ayB0aGlzIHJlZ2lvbiBhcyBFODIwX0FDUEkuICovCisgICAgaWYgKCBwdmhfYWRkX21lbV9yYW5n ZShkLCAqYWRkciwgKmFkZHIgKyBzaXplLCBFODIwX0FDUEkpICkKKyAgICAgICAgcHJpbnRrKCJV bmFibGUgdG8gYWRkIFhTRFQgcmVnaW9uIHRvIG1lbW9yeSBtYXBcbiIpOworCisgICAgcmMgPSBo dm1fY29weV90b19ndWVzdF9waHlzKCphZGRyLCB4c2R0LCBzaXplLCBkLT52Y3B1WzBdKTsKKyAg ICBpZiAoIHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNvcHkgWFNEVCBp bnRvIGd1ZXN0IG1lbW9yeVxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJj ID0gMDsKKworIG91dDoKKyAgICB4ZnJlZSh4c2R0KTsKKworICAgIHJldHVybiByYzsKK30KKwor c3RhdGljIGludCBfX2luaXQgcHZoX3NldHVwX2FjcGkoc3RydWN0IGRvbWFpbiAqZCwgcGFkZHJf dCBzdGFydF9pbmZvKQoreworICAgIHVuc2lnbmVkIGxvbmcgcGZuLCBucl9wYWdlczsKKyAgICBw YWRkcl90IG1hZHRfcGFkZHIsIHhzZHRfcGFkZHIsIHJzZHBfcGFkZHI7CisgICAgdW5zaWduZWQg aW50IGk7CisgICAgaW50IHJjOworICAgIHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKm5hdGl2ZV9y c2RwLCByc2RwID0geworICAgICAgICAuc2lnbmF0dXJlID0gQUNQSV9TSUdfUlNEUCwKKyAgICAg ICAgLnJldmlzaW9uID0gMiwKKyAgICAgICAgLmxlbmd0aCA9IHNpemVvZihyc2RwKSwKKyAgICB9 OworCisKKyAgICAvKiBTY2FuIHRvcC1sZXZlbCB0YWJsZXMgYW5kIGFkZCB0aGVpciByZWdpb25z IHRvIHRoZSBndWVzdCBtZW1vcnkgbWFwLiAqLworICAgIGZvciggaSA9IDA7IGkgPCBhY3BpX2di bF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCBjaGFy ICpzaWcgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZS5hc2Np aTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0 LnRhYmxlc1tpXS5hZGRyZXNzOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUgPSBhY3BpX2di bF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aDsKKworICAgICAgICAvKgorICAgICAg ICAgKiBNYWtlIHN1cmUgdGhlIG9yaWdpbmFsIE1BRFQgaXMgYWxzbyBtYXBwZWQsIHNvIHRoYXQg RG9tMCBjYW4KKyAgICAgICAgICogcHJvcGVybHkgYWNjZXNzIHRoZSBkYXRhIHJldHVybmVkIGJ5 IF9NQVQgbWV0aG9kcyBpbiBjYXNlIGl0J3MKKyAgICAgICAgICogcmUtdXNpbmcgTUFEVCBtZW1v cnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoIHN0cm5jbXAoc2lnLCBBQ1BJX1NJR19NQURU LCBBQ1BJX05BTUVfU0laRSkKKyAgICAgICAgICAgICA/IHB2aF9hY3BpX3RhYmxlX2FsbG93ZWQo c2lnKQorICAgICAgICAgICAgIDogIWFjcGlfbWVtb3J5X2Jhbm5lZChhZGRyLCBzaXplKSApCisg ICAgICAgICAgICAgcHZoX2FkZF9tZW1fcmFuZ2UoZCwgYWRkciwgYWRkciArIHNpemUsIEU4MjBf QUNQSSk7CisgICAgfQorCisgICAgLyogSWRlbnRpdHkgbWFwIEFDUEkgZTgyMCByZWdpb25zLiAq LworICAgIGZvciAoIGkgPSAwOyBpIDwgZC0+YXJjaC5ucl9lODIwOyBpKysgKQorICAgIHsKKyAg ICAgICAgaWYgKCBkLT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX0FDUEkgJiYKKyAgICAgICAg ICAgICBkLT5hcmNoLmU4MjBbaV0udHlwZSAhPSBFODIwX05WUyApCisgICAgICAgICAgICBjb250 aW51ZTsKKworICAgICAgICBwZm4gPSBQRk5fRE9XTihkLT5hcmNoLmU4MjBbaV0uYWRkcik7Cisg ICAgICAgIG5yX3BhZ2VzID0gUEZOX1VQKChkLT5hcmNoLmU4MjBbaV0uYWRkciAmIH5QQUdFX01B U0spICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+YXJjaC5lODIwW2ldLnNpemUpOwor CisgICAgICAgIHJjID0gbW9kaWZ5X2lkZW50aXR5X21taW8oZCwgcGZuLCBucl9wYWdlcywgdHJ1 ZSk7CisgICAgICAgIGlmICggcmMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZh aWxlZCB0byBtYXAgQUNQSSByZWdpb24gWyUjbHgsICUjbHgpIGludG8gRG9tMCBtZW1vcnkgbWFw XG4iLAorICAgICAgICAgICAgICAgICAgIHBmbiwgcGZuICsgbnJfcGFnZXMpOworICAgICAgICAg ICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBwdmhfc2V0dXBfYWNw aV9tYWR0KGQsICZtYWR0X3BhZGRyKTsKKyAgICBpZiAoIHJjICkKKyAgICAgICAgcmV0dXJuIHJj OworCisgICAgcmMgPSBwdmhfc2V0dXBfYWNwaV94c2R0KGQsIG1hZHRfcGFkZHIsICZ4c2R0X3Bh ZGRyKTsKKyAgICBpZiAoIHJjICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgLyogQ3JhZnQg YSBjdXN0b20gUlNEUC4gKi8KKyAgICBuYXRpdmVfcnNkcCA9IGFjcGlfb3NfbWFwX21lbW9yeShh Y3BpX29zX2dldF9yb290X3BvaW50ZXIoKSwgc2l6ZW9mKHJzZHApKTsKKyAgICBpZiAoICFuYXRp dmVfcnNkcCApCisgICAgeworICAgICAgICBwcmludGsoIkZhaWxlZCB0byBtYXAgbmF0aXZlIFJT RFBcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgbWVtY3B5KHJzZHAu b2VtX2lkLCBuYXRpdmVfcnNkcC0+b2VtX2lkLCBzaXplb2YocnNkcC5vZW1faWQpKTsKKyAgICBh Y3BpX29zX3VubWFwX21lbW9yeShuYXRpdmVfcnNkcCwgc2l6ZW9mKHJzZHApKTsKKyAgICByc2Rw LnhzZHRfcGh5c2ljYWxfYWRkcmVzcyA9IHhzZHRfcGFkZHI7CisgICAgLyoKKyAgICAgKiBDYWxs aW5nIGFjcGlfdGJfY2hlY2tzdW0gaGVyZSBpcyBhIGxheWVyaW5nIHZpb2xhdGlvbiwgYnV0Cisg ICAgICogaW50cm9kdWNpbmcgYSB3cmFwcGVyIGZvciBzdWNoIHNpbXBsZSB1c2FnZSBzZWVtcyBv dmVya2lsbC4KKyAgICAgKi8KKyAgICByc2RwLmNoZWNrc3VtIC09IGFjcGlfdGJfY2hlY2tzdW0o QUNQSV9DQVNUX1BUUih1OCwgJnJzZHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBBQ1BJX1JTRFBfUkVWMF9TSVpFKTsKKyAgICByc2RwLmV4dGVuZGVkX2NoZWNrc3Vt IC09IGFjcGlfdGJfY2hlY2tzdW0oQUNQSV9DQVNUX1BUUih1OCwgJnJzZHApLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnNkcCkpOworCisg ICAgLyoKKyAgICAgKiBQbGFjZSB0aGUgbmV3IFJTRFAgaW4gZ3Vlc3QgbWVtb3J5IHNwYWNlLgor ICAgICAqCisgICAgICogTkI6IHRoaXMgUlNEUCBpcyBub3QgZ29pbmcgdG8gcmVwbGFjZSB0aGUg b3JpZ2luYWwgUlNEUCwgd2hpY2ggc2hvdWxkCisgICAgICogc3RpbGwgYmUgYWNjZXNzaWJsZSB0 byB0aGUgZ3Vlc3QuIEhvd2V2ZXIgdGhhdCBSU0RQIGlzIGdvaW5nIHRvIHBvaW50IHRvCisgICAg ICogdGhlIG5hdGl2ZSBSU0RULCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciB0aGUgRG9tMCBr ZXJuZWwncyBib290CisgICAgICogcHVycG9zZXMgKHdlIGtlZXAgaXQgdmlzaWJsZSBmb3IgcG9z dCBib290IGFjY2VzcykuCisgICAgICovCisgICAgaWYgKCBwdmhfc3RlYWxfcmFtKGQsIHNpemVv Zihyc2RwKSwgMCwgR0IoNCksICZyc2RwX3BhZGRyKSApCisgICAgeworICAgICAgICBwcmludGso IlVuYWJsZSB0byBhbGxvY2F0ZSBndWVzdCBSQU0gZm9yIFJTRFBcbiIpOworICAgICAgICByZXR1 cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICAvKiBNYXJrIHRoaXMgcmVnaW9uIGFzIEU4MjBfQUNQ SS4gKi8KKyAgICBpZiAoIHB2aF9hZGRfbWVtX3JhbmdlKGQsIHJzZHBfcGFkZHIsIHJzZHBfcGFk ZHIgKyBzaXplb2YocnNkcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFODIwX0FDUEkp ICkKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gYWRkIFJTRFAgcmVnaW9uIHRvIG1lbW9yeSBt YXBcbiIpOworCisgICAgLyogQ29weSBSU0RQIGludG8gZ3Vlc3QgbWVtb3J5LiAqLworICAgIHJj ID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhyc2RwX3BhZGRyLCAmcnNkcCwgc2l6ZW9mKHJzZHAp LCBkLT52Y3B1WzBdKTsKKyAgICBpZiAoIHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiVW5h YmxlIHRvIGNvcHkgUlNEUCBpbnRvIGd1ZXN0IG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiBy YzsKKyAgICB9CisKKyAgICAvKiBDb3B5IFJTRFAgYWRkcmVzcyB0byBzdGFydF9pbmZvLiAqLwor ICAgIHJjID0gaHZtX2NvcHlfdG9fZ3Vlc3RfcGh5cyhzdGFydF9pbmZvICsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh2bV9zdGFydF9pbmZvLCByc2Rw X3BhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJzZHBfcGFkZHIsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigoKHN0cnVjdCBodm1fc3RhcnRf aW5mbyAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLT5yc2Rw X3BhZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+dmNwdVswXSk7Cisg ICAgaWYgKCByYyApCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjb3B5IFJTRFAg aW50byBndWVzdCBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAg cmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgY29uc3RydWN0X2RvbTBfcHZoKHN0cnVjdCBkb21h aW4gKmQsIGNvbnN0IG1vZHVsZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VfaGVhZHJvb20sCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBtb2R1bGVfdCAqaW5pdHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dm9pZCAqKCpib290c3RyYXBfbWFwKShjb25zdCBtb2R1bGVfdCAqKSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNoYXIgKmNtZGxpbmUpCit7CisgICAgcGFkZHJfdCBlbnRyeSwgc3Rh cnRfaW5mbzsKKyAgICBpbnQgcmM7CisKKyAgICBwcmludGsoIioqIEJ1aWxkaW5nIGEgUFZIIERv bTAgKipcbiIpOworCisgICAgaW9tbXVfaHdkb21faW5pdChkKTsKKworICAgIHJjID0gcHZoX3Nl dHVwX3AybShkKTsKKyAgICBpZiAoIHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVk IHRvIHNldHVwIERvbTAgcGh5c2ljYWwgbWVtb3J5IG1hcFxuIik7CisgICAgICAgIHJldHVybiBy YzsKKyAgICB9CisKKyAgICByYyA9IHB2aF9sb2FkX2tlcm5lbChkLCBpbWFnZSwgaW1hZ2VfaGVh ZHJvb20sIGluaXRyZCwgYm9vdHN0cmFwX21hcChpbWFnZSksCisgICAgICAgICAgICAgICAgICAg ICAgICAgY21kbGluZSwgJmVudHJ5LCAmc3RhcnRfaW5mbyk7CisgICAgaWYgKCByYyApCisgICAg eworICAgICAgICBwcmludGsoIkZhaWxlZCB0byBsb2FkIERvbTAga2VybmVsXG4iKTsKKyAgICAg ICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gcHZoX3NldHVwX2NwdXMoZCwgZW50cnks IHN0YXJ0X2luZm8pOworICAgIGlmICggcmMgKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJGYWls ZWQgdG8gc2V0dXAgRG9tMCBDUFVzOiAlZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7Cisg ICAgfQorCisgICAgcmMgPSBwdmhfc2V0dXBfYWNwaShkLCBzdGFydF9pbmZvKTsKKyAgICBpZiAo IHJjICkKKyAgICB7CisgICAgICAgIHByaW50aygiRmFpbGVkIHRvIHNldHVwIERvbTAgQUNQSSB0 YWJsZXM6ICVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBwYW5p YygiQnVpbGRpbmcgYSBQVkh2MiBEb20wIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworICAgIHJl dHVybiAwOworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogbW9kZTogQworICogYy1m aWxlLXN0eWxlOiAiQlNEIgorICogYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIHRhYi13aWR0aDogNAor ICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKi8KLS0gCjIuMTEuMAoKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWls aW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hl bi1kZXZlbAo=