ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1YjAwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jCkBAIC0wLDAgKzEsMTc1IEBACisKKy8qCisgKiBJQk0gQVNNIFNlcnZpY2UgUHJvY2Vzc29yIERldmljZSBEcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CisgKgorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICoKKyAqLworCisjaW5jbHVkZSAiaWJtYXNtLmgiCisKK3N0YXRpYyB2b2lkIGV4ZWNfbmV4dF9jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOworc3RhdGljIHZvaWQgZnJlZV9jb21tYW5kKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaWJtYXNtX2NtZF9rb2JqX3R5cGUgPSB7CisJLnJlbGVhc2UgPSBmcmVlX2NvbW1hbmQsCit9OworCisKK3N0cnVjdCBjb21tYW5kICppYm1hc21fbmV3X2NvbW1hbmQoc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBjb21tYW5kICpjbWQ7CisKKwlpZiAoYnVmZmVyX3NpemUgPiBJQk1BU01fQ01EX01BWF9CVUZGRVJfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwljbWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJY21kLT5idWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kLT5idWZmZXIgPT0gTlVMTCkgeworCQlrZnJlZShjbWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGNtZC0+YnVmZmVyLCAwLCBidWZmZXJfc2l6ZSk7CisJY21kLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCisJa29iamVjdF9pbml0KCZjbWQtPmtvYmopOworCWNtZC0+a29iai5rdHlwZSA9ICZpYm1hc21fY21kX2tvYmpfdHlwZTsKKworCWNtZC0+c3RhdHVzID0gSUJNQVNNX0NNRF9QRU5ESU5HOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNtZC0+d2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNtZC0+cXVldWVfbm9kZSk7CisKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NvbW1hbmQoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHRvX2NvbW1hbmQoa29iaik7CisgCisJbGlzdF9kZWwoJmNtZC0+cXVldWVfbm9kZSk7CisJa2ZyZWUoY21kLT5idWZmZXIpOworCWtmcmVlKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGVucXVldWVfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKQoreworCWxpc3RfYWRkX3RhaWwoJmNtZC0+cXVldWVfbm9kZSwgJnNwLT5jb21tYW5kX3F1ZXVlKTsKK30KKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpkZXF1ZXVlX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlpZiAobGlzdF9lbXB0eSgmc3AtPmNvbW1hbmRfcXVldWUpKQorCQlyZXR1cm4gTlVMTDsKKworCW5leHQgPSBzcC0+Y29tbWFuZF9xdWV1ZS5uZXh0OworCWxpc3RfZGVsX2luaXQobmV4dCk7CisJY21kID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgY29tbWFuZCwgcXVldWVfbm9kZSk7CisKKwlyZXR1cm4gY21kOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApCit7CisJaWYgKGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHNwKSkgeworCQlzcC0+Y3VycmVudF9jb21tYW5kLT5zdGF0dXMgPSBJQk1BU01fQ01EX0ZBSUxFRDsKKwkJZXhlY19uZXh0X2NvbW1hbmQoc3ApOworCX0KK30KKwkKKy8qKgorICogZXhlY19jb21tYW5kCisgKiBzZW5kIGEgY29tbWFuZCB0byBhIHNlcnZpY2UgcHJvY2Vzc29yCisgKiBDb21tYW5kcyBhcmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LiBPbmUgY29tbWFuZCAoc3AtPmN1cnJlbnRfY29tbWFuZCkKKyAqIGlzIHNlbnQgdG8gdGhlIHNlcnZpY2UgcHJvY2Vzc29yLiBPbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBnZXRzIGEKKyAqIG1lc3NhZ2Ugb2YgdHlwZSBjb21tYW5kX3Jlc3BvbnNlLCB0aGUgbWVzc2FnZSBpcyBjb3BpZWQgaW50bworICogdGhlIGN1cnJlbnQgY29tbWFuZHMgYnVmZmVyLCAKKyAqLwordm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFzcC0+Y3VycmVudF9jb21tYW5kKSB7CisJCWNvbW1hbmRfZ2V0KGNtZCk7CisJCXNwLT5jdXJyZW50X2NvbW1hbmQgPSBjbWQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwkJZG9fZXhlY19jb21tYW5kKHNwKTsKKwl9IGVsc2UgeworCQllbnF1ZXVlX2NvbW1hbmQoc3AsIGNtZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGVjX25leHRfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3YWtlX3VwKCZzcC0+Y3VycmVudF9jb21tYW5kLT53YWl0KTsKKwljb21tYW5kX3B1dChzcC0+Y3VycmVudF9jb21tYW5kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCXNwLT5jdXJyZW50X2NvbW1hbmQgPSBkZXF1ZXVlX2NvbW1hbmQoc3ApOworCWlmIChzcC0+Y3VycmVudF9jb21tYW5kKSB7CisJCWNvbW1hbmRfZ2V0KHNwLT5jdXJyZW50X2NvbW1hbmQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCQlkb19leGVjX2NvbW1hbmQoc3ApOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJfQorfQorCisvKiogCisgKiBTbGVlcCB1bnRpbCBhIGNvbW1hbmQgaGFzIGZhaWxlZCBvciBhIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkCisgKiBhbmQgdGhlIGNvbW1hbmQgc3RhdHVzIGJlZW4gdXBkYXRlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAoc2VlIHJlY2VpdmVfcmVzcG9uc2UpLgorICovCit2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCkKK3sKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjbWQtPndhaXQsCisJCQkJY21kLT5zdGF0dXMgPT0gSUJNQVNNX0NNRF9DT01QTEVURSB8fAorCQkJCWNtZC0+c3RhdHVzID09IElCTUFTTV9DTURfRkFJTEVELAorCQkJCXRpbWVvdXQgKiBIWik7Cit9CisKKy8qKgorICogcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlCisgKiBjYWxsZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHdoZW4gYSBkb3QgY29tbWFuZCBvZiB0eXBlIGNvbW1hbmRfcmVzcG9uc2UKKyAqIHdhcyByZWNlaXZlZC4KKyAqLwordm9pZCBpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKnJlc3BvbnNlLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kID0gc3AtPmN1cnJlbnRfY29tbWFuZDsKKworCWlmICghc3AtPmN1cnJlbnRfY29tbWFuZCkgCisJCXJldHVybjsgCisKKwltZW1jcHkoY21kLT5idWZmZXIsIHJlc3BvbnNlLCBtaW4oc2l6ZSwgY21kLT5idWZmZXJfc2l6ZSkpOworCWNtZC0+c3RhdHVzID0gSUJNQVNNX0NNRF9DT01QTEVURTsKKwlleGVjX25leHRfY29tbWFuZChzcCk7Cit9Cg==