ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCmluZGV4IDQ0MjY4NDEuLmM0YjNkYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMjY1LDYgKzI2NSwxOSBAQAogCiAJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTiBoZXJlLgogCitjb25maWcgTElCRVJUQVNfVVNCCisJdHJpc3RhdGUgIk1hcnZlbGwgTGliZXJ0YXMgODM4OCA4MDIuMTFhL2IvZyBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBVU0IKKwlzZWxlY3QgRldfTE9BREVSCisJLS0taGVscC0tLQorCSAgQSBkcml2ZXIgZm9yIE1hcnZlbGwgTGliZXJ0YXMgODM4OCBVU0IgZGV2aWNlcy4KKworY29uZmlnIExJQkVSVEFTX1VTQl9ERUJVRworCWJvb2wgIkVuYWJsZSBmdWxsIGRlYnVnZ2luZyBvdXRwdXQgaW4gdGhlIExpYmVydGFzIFVTQiBtb2R1bGUuIgorCWRlcGVuZHMgb24gTElCRVJUQVNfVVNCCisJLS0taGVscC0tLQorCSAgRGVidWdnaW5nIHN1cHBvcnQuCisKIGNvbmZpZyBBSVJPCiAJdHJpc3RhdGUgIkNpc2NvL0Fpcm9uZXQgMzRYLzM1WC80NTAwLzQ4MDAgSVNBIGFuZCBQQ0kgY2FyZHMiCiAJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSSAmJiBXTEFOXzgwMjExICYmIChQQ0kgfHwgQlJPS0VOKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQppbmRleCBjNjEzYWYxLi5kMjEyNDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtNDMsMyArNDMsNCBAQAogb2JqLSQoQ09ORklHX1BDTUNJQV9XTDM1MDEpCSs9IHdsMzUwMV9jcy5vCiAKIG9iai0kKENPTkZJR19VU0JfWkQxMjAxKQkrPSB6ZDEyMDEubworb2JqLSQoQ09ORklHX0xJQkVSVEFTX1VTQikgICAgICs9IGxpYmVydGFzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvMTFkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy8xMWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGVjYzRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvMTFkLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIDgwMi4xMUQuCisgICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICIxMWQuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJ3ZXh0LmgiCisKKyNkZWZpbmUgVFhfUFdSX0RFRkFVTFQJMTAKKworc3RhdGljIHN0cnVjdCByZWdpb25fY29kZV9tYXBwaW5nIHJlZ2lvbl9jb2RlX21hcHBpbmdbXSA9IHsKKwl7IlVTICIsIDB4MTB9LAkJLyogVVMgRkNDICAgICAgKi8KKwl7IkNBICIsIDB4MTB9LAkJLyogSUMgQ2FuYWRhICAgKi8KKwl7IlNHICIsIDB4MTB9LAkJLyogU2luZ2Fwb3JlICAgKi8KKwl7IkVVICIsIDB4MzB9LAkJLyogRVRTSSAgICAgICAgKi8KKwl7IkFVICIsIDB4MzB9LAkJLyogQXVzdHJhbGlhICAgKi8KKwl7IktSICIsIDB4MzB9LAkJLyogUmVwdWJsaWMgT2YgS29yZWEgKi8KKwl7IkVTICIsIDB4MzF9LAkJLyogU3BhaW4gICAgICAgKi8KKwl7IkZSICIsIDB4MzJ9LAkJLyogRnJhbmNlICAgICAgKi8KKwl7IkpQICIsIDB4NDB9LAkJLyogSmFwYW4gICAgICAgKi8KK307CisKKy8qIEZvbGxvd2luZyAyIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbHMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CR1tdID0geworCXsxLCAyNDEyLCBUWF9QV1JfREVGQVVMVH0sCisJezIsIDI0MTcsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MywgMjQyMiwgVFhfUFdSX0RFRkFVTFR9LAorCXs0LCAyNDI3LCBUWF9QV1JfREVGQVVMVH0sCisJezUsIDI0MzIsIFRYX1BXUl9ERUZBVUxUfSwKKwl7NiwgMjQzNywgVFhfUFdSX0RFRkFVTFR9LAorCXs3LCAyNDQyLCBUWF9QV1JfREVGQVVMVH0sCisJezgsIDI0NDcsIFRYX1BXUl9ERUZBVUxUfSwKKwl7OSwgMjQ1MiwgVFhfUFdSX0RFRkFVTFR9LAorCXsxMCwgMjQ1NywgVFhfUFdSX0RFRkFVTFR9LAorCXsxMSwgMjQ2MiwgVFhfUFdSX0RFRkFVTFR9LAorCXsxMiwgMjQ2NywgVFhfUFdSX0RFRkFVTFR9LAorCXsxMywgMjQ3MiwgVFhfUFdSX0RFRkFVTFR9LAorCXsxNCwgMjQ4NCwgVFhfUFdSX0RFRkFVTFR9Cit9OworCitzdGF0aWMgdTggd2xhbl9yZWdpb25fMl9jb2RlKHU4ICogcmVnaW9uKQoreworCXU4IGk7CisJdTggc2l6ZSA9IHNpemVvZihyZWdpb25fY29kZV9tYXBwaW5nKS8KKwkJICBzaXplb2Yoc3RydWN0IHJlZ2lvbl9jb2RlX21hcHBpbmcpOworCisJZm9yIChpID0gMDsgcmVnaW9uW2ldICYmIGkgPCBDT1VOVFJZX0NPREVfTEVOOyBpKyspCisJCXJlZ2lvbltpXSA9IHRvdXBwZXIocmVnaW9uW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKCFtZW1jbXAocmVnaW9uLCByZWdpb25fY29kZV9tYXBwaW5nW2ldLnJlZ2lvbiwKKwkJCSAgICBDT1VOVFJZX0NPREVfTEVOKSkKKwkJCXJldHVybiAocmVnaW9uX2NvZGVfbWFwcGluZ1tpXS5jb2RlKTsKKwl9CisKKwkvKiBkZWZhdWx0IGlzIFVTICovCisJcmV0dXJuIChyZWdpb25fY29kZV9tYXBwaW5nWzBdLmNvZGUpOworfQorCitzdGF0aWMgdTggKndsYW5fY29kZV8yX3JlZ2lvbih1OCBjb2RlKQoreworCXU4IGk7CisJdTggc2l6ZSA9IHNpemVvZihyZWdpb25fY29kZV9tYXBwaW5nKQorCQkgIC8gc2l6ZW9mKHN0cnVjdCByZWdpb25fY29kZV9tYXBwaW5nKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChyZWdpb25fY29kZV9tYXBwaW5nW2ldLmNvZGUgPT0gY29kZSkKKwkJCXJldHVybiAocmVnaW9uX2NvZGVfbWFwcGluZ1tpXS5yZWdpb24pOworCX0KKwkvKiBkZWZhdWx0IGlzIFVTICovCisJcmV0dXJuIChyZWdpb25fY29kZV9tYXBwaW5nWzBdLnJlZ2lvbik7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBucmNoYW4tdGggY2hhbiBhZnRlciB0aGUgZmlyc3RjaGFuCisgKiAgQHBhcmFtIGJhbmQgICAgICAgYmFuZAorICogIEBwYXJhbSBmaXJzdGNoYW4gIGZpcnN0IGNoYW5uZWwgbnVtYmVyCisgKiAgQHBhcmFtIG5yY2hhbiAgIG51bWJlciBvZiBjaGFubmVscworICogIEByZXR1cm4gCSAgICAgIHRoZSBucmNoYW4tdGggY2hhbiBudW1iZXIKKyovCitzdGF0aWMgdTggd2xhbl9nZXRfY2hhbl8xMWQodTggYmFuZCwgdTggZmlyc3RjaGFuLCB1OCBucmNoYW4sIHU4ICogY2hhbikKKy8qZmluZCB0aGUgbnJjaGFuLXRoIGNoYW4gYWZ0ZXIgdGhlIGZpcnN0Y2hhbiovCit7CisJdTggaTsKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7CisJdTggY2ZwX25vOworCisJY2ZwID0gY2hhbm5lbF9mcmVxX3Bvd2VyX1VOX0JHOworCWNmcF9ubyA9IHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfVU5fQkcpIC8KKwkgICAgc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpOworCisJZm9yIChpID0gMDsgaSA8IGNmcF9ubzsgaSsrKSB7CisJCWlmICgoY2ZwICsgaSktPmNoYW5uZWwgPT0gZmlyc3RjaGFuKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgImZpcnN0Y2hhbiBmb3VuZFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgY2ZwX25vKSB7CisJCS8qaWYgYmV5b25kIHRoZSBib3VuZGFyeSAqLworCQlpZiAoaSArIG5yY2hhbiA8IGNmcF9ubykgeworCQkJKmNoYW4gPSAoY2ZwICsgaSArIG5yY2hhbiktPmNoYW5uZWw7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBDaGVja3MgaWYgY2hhbiB0eHB3ciBpcyBsZWFybmVkIGZyb20gQVAvSUJTUworICogIEBwYXJhbSBjaGFuICAgICAgICAgICAgICAgICBjaGFuIG51bWJlcgorICogIEBwYXJhbSBwYXJzZWRfcmVnaW9uX2NoYW4gICBwb2ludGVyIHRvIHBhcnNlZF9yZWdpb25fY2hhbl8xMWQKKyAqICBAcmV0dXJuIAkgICAgICAgICAgICAgICAgVFJVRTsgRkFMU0UKKyovCitzdGF0aWMgdTggd2xhbl9jaGFubmVsX2tub3duXzExZCh1OCBjaGFuLAorCQkJICBzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqIHBhcnNlZF9yZWdpb25fY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbl9wb3dlcl8xMWQgKmNoYW5wd3IgPSBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3I7CisJdTggbnJfY2hhbiA9IHBhcnNlZF9yZWdpb25fY2hhbi0+bnJfY2hhbjsKKwl1OCBpID0gMDsKKworCWxic19kYmdfaGV4KCIxMUQ6cGFyc2VkX3JlZ2lvbl9jaGFuOiIsIChjaGFyICopY2hhbnB3ciwKKwkJc2l6ZW9mKHN0cnVjdCBjaGFuX3Bvd2VyXzExZCkgKiBucl9jaGFuKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jaGFuOyBpKyspIHsKKwkJaWYgKGNoYW4gPT0gY2hhbnB3cltpXS5jaGFuKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDogRm91bmQgQ2hhbjolZFxuIiwgY2hhbik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBOb3QgRmluZCBDaGFuOiVkXG4iLCBjaGFuKTsKKwlyZXR1cm4gMDsKK30KKwordTMyIGxpYmVydGFzX2NoYW5fMl9mcmVxKHU4IGNoYW4sIHU4IGJhbmQpCit7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2Y7CisJdTE2IGNudDsKKwl1MTYgaTsKKwl1MzIgZnJlcSA9IDA7CisKKwljZiA9IGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CRzsKKwljbnQgPQorCSAgICBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX1VOX0JHKSAvCisJICAgIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlpZiAoY2hhbiA9PSBjZltpXS5jaGFubmVsKQorCQkJZnJlcSA9IGNmW2ldLmZyZXE7CisJfQorCisJcmV0dXJuIGZyZXE7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfZG9tYWluX2luZm9fMTFkKHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkCisJCQkJICAqcGFyc2VkX3JlZ2lvbl9jaGFuLAorCQkJCSAgc3RydWN0IHdsYW5fODAyXzExZF9kb21haW5fcmVnICogZG9tYWluaW5mbykKK3sKKwl1OCBucl9zdWJiYW5kID0gMDsKKworCXU4IG5yX2NoYW4gPSBwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW47CisJdTggbnJfcGFyc2VkY2hhbiA9IDA7CisKKwl1OCBmaXJzdGNoYW4gPSAwLCBuZXh0Y2hhbiA9IDAsIG1heHB3ciA9IDA7CisKKwl1OCBpLCBmbGFnID0gMDsKKworCW1lbWNweShkb21haW5pbmZvLT5jb3VudHJ5Y29kZSwgcGFyc2VkX3JlZ2lvbl9jaGFuLT5jb3VudHJ5Y29kZSwKKwkgICAgICAgQ09VTlRSWV9DT0RFX0xFTik7CisKKwlsYnNfcHJfZGVidWcoMSwgIjExRDpucmNoYW49JWRcbiIsIG5yX2NoYW4pOworCWxic19kYmdfaGV4KCIxMUQ6cGFyc2VkX3JlZ2lvbl9jaGFuOiIsIChjaGFyICopcGFyc2VkX3JlZ2lvbl9jaGFuLAorCQlzaXplb2Yoc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jaGFuOyBpKyspIHsKKwkJaWYgKCFmbGFnKSB7CisJCQlmbGFnID0gMTsKKwkJCW5leHRjaGFuID0gZmlyc3RjaGFuID0KKwkJCSAgICBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbjsKKwkJCW1heHB3ciA9IHBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5wd3I7CisJCQlucl9wYXJzZWRjaGFuID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5jaGFuID09IG5leHRjaGFuICsgMSAmJgorCQkgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLnB3ciA9PSBtYXhwd3IpIHsKKwkJCW5leHRjaGFuKys7CisJCQlucl9wYXJzZWRjaGFuKys7CisJCX0gZWxzZSB7CisJCQlkb21haW5pbmZvLT5zdWJiYW5kW25yX3N1YmJhbmRdLmZpcnN0Y2hhbiA9IGZpcnN0Y2hhbjsKKwkJCWRvbWFpbmluZm8tPnN1YmJhbmRbbnJfc3ViYmFuZF0ubnJjaGFuID0KKwkJCSAgICBucl9wYXJzZWRjaGFuOworCQkJZG9tYWluaW5mby0+c3ViYmFuZFtucl9zdWJiYW5kXS5tYXh0eHB3ciA9IG1heHB3cjsKKwkJCW5yX3N1YmJhbmQrKzsKKwkJCW5leHRjaGFuID0gZmlyc3RjaGFuID0KKwkJCSAgICBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbjsKKwkJCW1heHB3ciA9IHBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5wd3I7CisJCX0KKwl9CisKKwlpZiAoZmxhZykgeworCQlkb21haW5pbmZvLT5zdWJiYW5kW25yX3N1YmJhbmRdLmZpcnN0Y2hhbiA9IGZpcnN0Y2hhbjsKKwkJZG9tYWluaW5mby0+c3ViYmFuZFtucl9zdWJiYW5kXS5ucmNoYW4gPSBucl9wYXJzZWRjaGFuOworCQlkb21haW5pbmZvLT5zdWJiYW5kW25yX3N1YmJhbmRdLm1heHR4cHdyID0gbWF4cHdyOworCQlucl9zdWJiYW5kKys7CisJfQorCWRvbWFpbmluZm8tPm5yX3N1YmJhbmQgPSBucl9zdWJiYW5kOworCisJbGJzX3ByX2RlYnVnKDEsICJucl9zdWJiYW5kPSV4XG4iLCBkb21haW5pbmZvLT5ucl9zdWJiYW5kKTsKKwlsYnNfZGJnX2hleCgiMTFEOmRvbWFpbmluZm86IiwgKGNoYXIgKilkb21haW5pbmZvLAorCQlDT1VOVFJZX0NPREVfTEVOICsgMSArCisJCXNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQpICogbnJfc3ViYmFuZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBwYXJzZWRfcmVnaW9uX2NoYW4gZnJvbSBEb21haW4gSW5mbyBsZWFybmVkIGZyb20gQVAvSUJTUworICogIEBwYXJhbSByZWdpb25fY2hhbiAgICAgICAgICBwb2ludGVyIHRvIHN0cnVjdCByZWdpb25fY2hhbm5lbAorICogIEBwYXJhbSAqcGFyc2VkX3JlZ2lvbl9jaGFuICBwb2ludGVyIHRvIHBhcnNlZF9yZWdpb25fY2hhbl8xMWQKKyAqICBAcmV0dXJuIAkgICAgICAgICAgICAgICAgTi9BCisqLworc3RhdGljIHZvaWQgd2xhbl9nZW5lcmF0ZV9wYXJzZWRfcmVnaW9uX2NoYW5fMTFkKHN0cnVjdCByZWdpb25fY2hhbm5lbCAqIHJlZ2lvbl9jaGFuLAorCQkJCQkgIHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkICoKKwkJCQkJICBwYXJzZWRfcmVnaW9uX2NoYW4pCit7CisJdTggaTsKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7CisKKwlpZiAocmVnaW9uX2NoYW4gPT0gTlVMTCkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogcmVnaW9uX2NoYW4gaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwljZnAgPSByZWdpb25fY2hhbi0+Q0ZQOworCWlmIChjZnAgPT0gTlVMTCkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogY2ZwIGVxdWFsIE5VTEwgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBhcnNlZF9yZWdpb25fY2hhbi0+YmFuZCA9IHJlZ2lvbl9jaGFuLT5iYW5kOworCXBhcnNlZF9yZWdpb25fY2hhbi0+cmVnaW9uID0gcmVnaW9uX2NoYW4tPnJlZ2lvbjsKKwltZW1jcHkocGFyc2VkX3JlZ2lvbl9jaGFuLT5jb3VudHJ5Y29kZSwKKwkgICAgICAgd2xhbl9jb2RlXzJfcmVnaW9uKHJlZ2lvbl9jaGFuLT5yZWdpb24pLCBDT1VOVFJZX0NPREVfTEVOKTsKKworCWxic19wcl9kZWJ1ZygxLCAiMTFEOiByZWdpb25bMHgleF0gYmFuZFslZF1cbiIsIHBhcnNlZF9yZWdpb25fY2hhbi0+cmVnaW9uLAorCSAgICAgICBwYXJzZWRfcmVnaW9uX2NoYW4tPmJhbmQpOworCisJZm9yIChpID0gMDsgaSA8IHJlZ2lvbl9jaGFuLT5ucmNmcDsgaSsrLCBjZnArKykgeworCQlwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbiA9IGNmcC0+Y2hhbm5lbDsKKwkJcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLnB3ciA9IGNmcC0+bWF4dHhwb3dlcjsKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IENoYW5bJWRdIFB3clslZF1cbiIsCisJCSAgICAgICBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbiwKKwkJICAgICAgIHBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5wd3IpOworCX0KKwlwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW4gPSByZWdpb25fY2hhbi0+bnJjZnA7CisKKwlsYnNfcHJfZGVidWcoMSwgIjExRDogbnJjaGFuWyVkXVxuIiwgcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIGdlbmVyYXRlIHBhcnNlZF9yZWdpb25fY2hhbiBmcm9tIERvbWFpbiBJbmZvIGxlYXJuZWQgZnJvbSBBUC9JQlNTCisgKiAgQHBhcmFtIHJlZ2lvbiAgICAgICAgICAgICAgIHJlZ2lvbiBJRAorICogIEBwYXJhbSBiYW5kICAgICAgICAgICAgICAgICBiYW5kCisgKiAgQHBhcmFtIGNoYW4gICAgICAgICAgICAgICAgIGNoYW4KKyAqICBAcmV0dXJuIAkgICAgICAgICAgICAgICAgVFJVRTtGQUxTRQorKi8KK3N0YXRpYyB1OCB3bGFuX3JlZ2lvbl9jaGFuX3N1cHBvcnRlZF8xMWQodTggcmVnaW9uLCB1OCBiYW5kLCB1OCBjaGFuKQoreworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKKwlpbnQgY2ZwX25vOworCXU4IGlkeDsKKworCUVOVEVSKCk7CisKKwljZnAgPSBsaWJlcnRhc19nZXRfcmVnaW9uX2NmcF90YWJsZShyZWdpb24sIGJhbmQsICZjZnBfbm8pOworCWlmIChjZnAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNmcF9ubzsgaWR4KyspIHsKKwkJaWYgKGNoYW4gPT0gKGNmcCArIGlkeCktPmNoYW5uZWwpIHsKKwkJCS8qIElmIE1ydmwgQ2hpcCBTdXBwb3J0ZWQ/ICovCisJCQlpZiAoKGNmcCArIGlkeCktPnVuc3VwcG9ydGVkKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJLypjaGFuIGlzIG5vdCBpbiB0aGUgcmVnaW9uIHRhYmxlICovCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGNoYW4gdHhwd3IgaXMgbGVhcm5lZCBmcm9tIEFQL0lCU1MKKyAqICBAcGFyYW0gY2hhbiAgICAgICAgICAgICAgICAgY2hhbiBudW1iZXIKKyAqICBAcGFyYW0gcGFyc2VkX3JlZ2lvbl9jaGFuICAgcG9pbnRlciB0byBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkCisgKiAgQHJldHVybiAJICAgICAgICAgICAgICAgIDAKKyovCitzdGF0aWMgaW50IHBhcnNlX2RvbWFpbl9pbmZvXzExZChzdHJ1Y3QgaWVlZXR5cGVzX2NvdW50cnlpbmZvZnVsbHNldCoKKwkJCQkgY291bnRyeWluZm8sCisJCQkJIHU4IGJhbmQsCisJCQkJIHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkICoKKwkJCQkgcGFyc2VkX3JlZ2lvbl9jaGFuKQoreworCXU4IG5yX3N1YmJhbmQsIG5yY2hhbjsKKwl1OCBsYXN0Y2hhbiwgZmlyc3RjaGFuOworCXU4IHJlZ2lvbjsKKwl1OCBjdXJjaGFuID0gMDsKKworCXU4IGlkeCA9IDA7CQkvKmNoYW4gaW5kZXggaW4gcGFyc2VkX3JlZ2lvbl9jaGFuICovCisKKwl1OCBqLCBpOworCisJRU5URVIoKTsKKworCS8qdmFsaWRhdGlvbiBSdWxlczoKKwkgICAxLiB2YWxpZCByZWdpb24gQ29kZQorCSAgIDIuIEZpcnN0IENoYW4gaW5jcmVtZW50CisJICAgMy4gY2hhbm5lbCByYW5nZSBubyBvdmVybGFwCisJICAgNC4gY2hhbm5lbCBpcyB2YWxpZD8KKwkgICA1LiBjaGFubmVsIGlzIHN1cHBvcnRlZCBieSByZWdpb24/CisJICAgNi4gT3RoZXJzCisJICovCisKKwlsYnNfZGJnX2hleCgiQ291bnRyeUluZm86IiwgKHU4ICopIGNvdW50cnlpbmZvLCAzMCk7CisKKwlpZiAoKCooY291bnRyeWluZm8tPmNvdW50cnljb2RlKSkgPT0gMAorCSAgICB8fCAoY291bnRyeWluZm8tPmxlbiA8PSBDT1VOVFJZX0NPREVfTEVOKSkgeworCQkvKiBObyByZWdpb24gSW5mbyBvciBXcm9uZyByZWdpb24gaW5mbzogdHJlYXQgYXMgTm8gMTFEIGluZm8gKi8KKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLypTdGVwMTogY2hlY2sgcmVnaW9uX2NvZGUgKi8KKwlwYXJzZWRfcmVnaW9uX2NoYW4tPnJlZ2lvbiA9IHJlZ2lvbiA9CisJICAgIHdsYW5fcmVnaW9uXzJfY29kZShjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUpOworCisJbGJzX3ByX2RlYnVnKDEsICJyZWdpb25jb2RlPSV4XG4iLCAodTgpIHBhcnNlZF9yZWdpb25fY2hhbi0+cmVnaW9uKTsKKwlsYnNfZGJnX2hleCgiQ291bnRyeUNvZGU6IiwgKGNoYXIgKiljb3VudHJ5aW5mby0+Y291bnRyeWNvZGUsCisJCUNPVU5UUllfQ09ERV9MRU4pOworCisJcGFyc2VkX3JlZ2lvbl9jaGFuLT5iYW5kID0gYmFuZDsKKworCW1lbWNweShwYXJzZWRfcmVnaW9uX2NoYW4tPmNvdW50cnljb2RlLCBjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUsCisJICAgICAgIENPVU5UUllfQ09ERV9MRU4pOworCisJbnJfc3ViYmFuZCA9IChjb3VudHJ5aW5mby0+bGVuIC0gQ09VTlRSWV9DT0RFX0xFTikgLworCSAgICBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0KTsKKworCWZvciAoaiA9IDAsIGxhc3RjaGFuID0gMDsgaiA8IG5yX3N1YmJhbmQ7IGorKykgeworCisJCWlmIChjb3VudHJ5aW5mby0+c3ViYmFuZFtqXS5maXJzdGNoYW4gPD0gbGFzdGNoYW4pIHsKKwkJCS8qU3RlcDImMy4gQ2hlY2sgRmlyc3QgQ2hhbiBOdW0gaW5jcmVtZW50IGFuZCBubyBvdmVybGFwICovCisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDogQ2hhblslZD4lZF0gT3ZlcmxhcFxuIiwKKwkJCSAgICAgICBjb3VudHJ5aW5mby0+c3ViYmFuZFtqXS5maXJzdGNoYW4sIGxhc3RjaGFuKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmlyc3RjaGFuID0gY291bnRyeWluZm8tPnN1YmJhbmRbal0uZmlyc3RjaGFuOworCQlucmNoYW4gPSBjb3VudHJ5aW5mby0+c3ViYmFuZFtqXS5ucmNoYW47CisKKwkJZm9yIChpID0gMDsgaWR4IDwgTUFYX05PX09GX0NIQU4gJiYgaSA8IG5yY2hhbjsgaSsrKSB7CisJCQkvKnN0ZXA0OiBjaGFubmVsIGlzIHN1cHBvcnRlZD8gKi8KKworCQkJaWYgKCF3bGFuX2dldF9jaGFuXzExZChiYW5kLCBmaXJzdGNoYW4sIGksICZjdXJjaGFuKSkgeworCQkJCS8qIENoYW4gaXMgbm90IGZvdW5kIGluIFVOIHRhYmxlICovCisJCQkJbGJzX3ByX2RlYnVnKDEsICJjaGFuIGlzIG5vdCBzdXBwb3J0ZWQ6ICVkIFxuIiwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxhc3RjaGFuID0gY3VyY2hhbjsKKworCQkJaWYgKHdsYW5fcmVnaW9uX2NoYW5fc3VwcG9ydGVkXzExZAorCQkJICAgIChyZWdpb24sIGJhbmQsIGN1cmNoYW4pKSB7CisJCQkJLypzdGVwNTogQ2hlY2sgaWYgY3VyY2hhbiBpcyBzdXBwb3J0ZWQgYnkgbXJ2bCBpbiByZWdpb24gKi8KKwkJCQlwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaWR4XS5jaGFuID0gY3VyY2hhbjsKKwkJCQlwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaWR4XS5wd3IgPQorCQkJCSAgICBjb3VudHJ5aW5mby0+c3ViYmFuZFtqXS5tYXh0eHB3cjsKKwkJCQlpZHgrKzsKKwkJCX0gZWxzZSB7CisJCQkJLypub3Qgc3VwcG9ydGVkIGFuZCBpZ25vcmUgdGhlIGNoYW4gKi8KKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIjExRDppWyVkXSBjaGFuWyVkXSB1bnN1cHBvcnRlZCBpbiByZWdpb25bJXhdIGJhbmRbJWRdXG4iLAorCQkJCSAgICAgICBpLCBjdXJjaGFuLCByZWdpb24sIGJhbmQpOworCQkJfQorCQl9CisKKwkJLypTdGVwNjogQWRkIG90aGVyIGNoZWNraW5nIGlmIGFueSAqLworCisJfQorCisJcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuID0gaWR4OworCisJbGJzX3ByX2RlYnVnKDEsICJucmNoYW49JXhcbiIsIHBhcnNlZF9yZWdpb25fY2hhbi0+bnJfY2hhbik7CisJbGJzX2RiZ19oZXgoIjExRDpwYXJzZWRfcmVnaW9uX2NoYW46IiwgKHU4ICopIHBhcnNlZF9yZWdpb25fY2hhbiwKKwkJMiArIENPVU5UUllfQ09ERV9MRU4gKyBzaXplb2Yoc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQpICogaWR4KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNjYW4gdHlwZSBmb3IgY2hhbm5lbHMKKyAqICBAcGFyYW0gY2hhbiAgICAgICAgICAgICAgICAgY2hhbiBudW1iZXIKKyAqICBAcGFyYW0gcGFyc2VkX3JlZ2lvbl9jaGFuICAgcG9pbnRlciB0byBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkCisgKiAgQHJldHVybiAJICAgICAgICAgICAgICAgIFBBU1NJVkUgaWYgY2hhbiBpcyB1bmtub3duOyBBQ1RJVkUgaWYgY2hhbiBpcyBrbm93bgorKi8KK3U4IGxpYmVydGFzX2dldF9zY2FuX3R5cGVfMTFkKHU4IGNoYW4sCisJCQkgIHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkICogcGFyc2VkX3JlZ2lvbl9jaGFuKQoreworCXU4IHNjYW5fdHlwZSA9IGNtZF9zY2FuX3R5cGVfcGFzc2l2ZTsKKworCUVOVEVSKCk7CisKKwlpZiAod2xhbl9jaGFubmVsX2tub3duXzExZChjaGFuLCBwYXJzZWRfcmVnaW9uX2NoYW4pKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBGb3VuZCBhbmQgZG8gQWN0aXZlIFNjYW5cbiIpOworCQlzY2FuX3R5cGUgPSBjbWRfc2Nhbl90eXBlX2FjdGl2ZTsKKwl9IGVsc2UgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogTm90IEZpbmQgYW5kIGRvIFBhc3NpdmUgU2NhblxuIik7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gc2Nhbl90eXBlOworCit9CisKK3ZvaWQgbGliZXJ0YXNfaW5pdF8xMWQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQgPSAwOworCW1lbXNldCgmKHByaXYtPmFkYXB0ZXItPnBhcnNlZF9yZWdpb25fY2hhbiksIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCkpOworCXJldHVybjsKK30KKworc3RhdGljIGludCB3bGFuX2VuYWJsZV8xMWQod2xhbl9wcml2YXRlICogcHJpdiwgdTggZmxhZykKK3sKKwlpbnQgcmV0OworCisJcHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkID0gZmxhZzsKKworCS8qIHNlbmQgY21kIHRvIEZXIHRvIGVuYWJsZS9kaXNhYmxlIDExRCBmdW5jdGlvbiBpbiBGVyAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfODAyXzExX3NubXBfbWliLAorCQkJCSAgICBjbWRfYWN0X3NldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICBPSURfODAyXzExRF9FTkFCTEUsCisJCQkJICAgICZwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQpOworCWlmIChyZXQpCisJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBGYWlsIHRvIGVuYWJsZSAxMUQgXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBzZXRzIERPTUFJTiBJTkZPIHRvIEZXCisgKiAgQHBhcmFtIHByaXYgICAgICAgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcmV0dXJuIAkgICAgICAwOyAtMQorKi8KK3N0YXRpYyBpbnQgc2V0X2RvbWFpbl9pbmZvXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQ7CisKKwlpZiAoIXByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogZG5sZCBkb21haW4gSW5mbyB3aXRoIDExZCBkaXNhYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExZF9kb21haW5faW5mbywKKwkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisJaWYgKHJldCkKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IEZhaWwgdG8gZG5sZCBkb21haW4gSW5mb1xuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBzZXR1cHMgc2NhbiBjaGFubmVscworICogIEBwYXJhbSBwcml2ICAgICAgIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIGJhbmQgICAgICAgYmFuZAorICogIEByZXR1cm4gCSAgICAgIDAKKyovCitpbnQgbGliZXJ0YXNfc2V0X3VuaXZlcnNhbHRhYmxlKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IGJhbmQpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1MTYgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKTsKKwl1MTYgaSA9IDA7CisKKwltZW1zZXQoYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWwsIDAsCisJICAgICAgIHNpemVvZihhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbCkpOworCisJYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbaV0ubnJjZnAgPQorCSAgICBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX1VOX0JHKSAvIHNpemU7CisJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IEJHLWJhbmQgbnJjZnA9JWRcbiIsCisJICAgICAgIGFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2ldLm5yY2ZwKTsKKworCWFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2ldLkNGUCA9IGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CRzsKKwlhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtpXS52YWxpZCA9IDE7CisJYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbaV0ucmVnaW9uID0gVU5JVkVSU0FMX1JFR0lPTl9DT0RFOworCWFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2ldLmJhbmQgPSBiYW5kOworCWkrKzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGNvbW1hbmQgQ01EXzgwMl8xMURfRE9NQUlOX0lORk8KKyAqICBAcGFyYW0gcHJpdiAgICAgICBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEBwYXJhbSBjbWQgICAgICAgIHBvaW50ZXIgdG8gY21kIGJ1ZmZlcgorICogIEBwYXJhbSBjbWRubyAgICAgIGNtZCBJRAorICogIEBwYXJhbSBjbWRPcHRpb24gIGNtZCBhY3Rpb24KKyAqICBAcmV0dXJuIAkgICAgICAwCisqLworaW50IGxpYmVydGFzX2NtZF84MDJfMTFkX2RvbWFpbl9pbmZvKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB1MTYgY21kbm8sCisJCQkJIHUxNiBjbWRvcHRpb24pCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFkX2RvbWFpbl9pbmZvICpwZG9tYWluaW5mbyA9CisJICAgICZjbWQtPnBhcmFtcy5kb21haW5pbmZvOworCXN0cnVjdCBtcnZsaWV0eXBlc19kb21haW5wYXJhbXNldCAqZG9tYWluID0gJnBkb21haW5pbmZvLT5kb21haW47CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1OCBucl9zdWJiYW5kID0gYWRhcHRlci0+ZG9tYWlucmVnLm5yX3N1YmJhbmQ7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJucl9zdWJiYW5kPSV4XG4iLCBucl9zdWJiYW5kKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZG5vKTsKKwlwZG9tYWluaW5mby0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kb3B0aW9uKTsKKwlpZiAoY21kb3B0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCWNtZC0+c2l6ZSA9CisJCSAgICBjcHVfdG9fbGUxNihzaXplb2YocGRvbWFpbmluZm8tPmFjdGlvbikgKyBTX0RTX0dFTik7CisJCWxic19kYmdfaGV4KCIxMUQ6IDgwMl8xMURfRE9NQUlOX0lORk86IiwgKHU4ICopIGNtZCwKKwkJCShpbnQpKGNtZC0+c2l6ZSkpOworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkb21haW4tPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfRE9NQUlOKTsKKwltZW1jcHkoZG9tYWluLT5jb3VudHJ5Y29kZSwgYWRhcHRlci0+ZG9tYWlucmVnLmNvdW50cnljb2RlLAorCSAgICAgICBzaXplb2YoZG9tYWluLT5jb3VudHJ5Y29kZSkpOworCisJZG9tYWluLT5oZWFkZXIubGVuID0KKwkgICAgY3B1X3RvX2xlMTYobnJfc3ViYmFuZCAqIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQpICsKKwkJCSAgICAgc2l6ZW9mKGRvbWFpbi0+Y291bnRyeWNvZGUpKTsKKworCWlmIChucl9zdWJiYW5kKSB7CisJCW1lbWNweShkb21haW4tPnN1YmJhbmQsIGFkYXB0ZXItPmRvbWFpbnJlZy5zdWJiYW5kLAorCQkgICAgICAgbnJfc3ViYmFuZCAqIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQpKTsKKworCQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YocGRvbWFpbmluZm8tPmFjdGlvbikgKworCQkJCQkgICAgIGRvbWFpbi0+aGVhZGVyLmxlbiArCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlcikgKworCQkJCQkgICAgIFNfRFNfR0VOKTsKKwl9IGVsc2UgeworCQljbWQtPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHBkb21haW5pbmZvLT5hY3Rpb24pICsgU19EU19HRU4pOworCX0KKworCWxic19kYmdfaGV4KCIxMUQ6ODAyXzExRF9ET01BSU5fSU5GTzoiLCAodTggKikgY21kLCAoaW50KShjbWQtPnNpemUpKTsKKworCUxFQVZFKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBwcml2YXRlIGNtZDogZW5hYmxlL2Rpc2FibGUgMTFECisgKiAgQHBhcmFtIHByaXYgICAgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gd3JxICAgICBwb2ludGVyIHRvIHVzZXIgZGF0YQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX2NtZF9lbmFibGVfMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCBkYXRhID0gMDsKKwlpbnQgKnZhbDsKKworCUVOVEVSKCk7CisJZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CisKKwlsYnNfcHJfZGVidWcoMSwgImVuYWJsZSAxMUQ6ICVzXG4iLAorCSAgICAgICAoZGF0YSA9PSAxKSA/ICJlbmFibGUiIDogIkRpc2FibGUiKTsKKworCXdsYW5fZW5hYmxlXzExZChwcml2LCBkYXRhKTsKKwl2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJKnZhbCA9IHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZDsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBjb3VudHJ5aW5mbyBmcm9tIEFQIGFuZCBkb3dubG9hZCBjb3VudHJ5IGluZm8gdG8gRlcKKyAqICBAcGFyYW0gcHJpdiAgICBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEBwYXJhbSByZXNwICAgIHBvaW50ZXIgdG8gY29tbWFuZCByZXNwb25zZSBidWZmZXIKKyAqICBAcmV0dXJuIAkgICAwOyAtMQorICovCitpbnQgbGliZXJ0YXNfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbworCSpkb21haW5pbmZvID0gJnJlc3AtPnBhcmFtcy5kb21haW5pbmZvcmVzcDsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfZG9tYWlucGFyYW1zZXQgKmRvbWFpbiA9ICZkb21haW5pbmZvLT5kb21haW47CisJdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KGRvbWFpbmluZm8tPmFjdGlvbik7CisJczE2IHJldCA9IDA7CisJdTggbnJfc3ViYmFuZCA9IDA7CisKKwlFTlRFUigpOworCisJbGJzX2RiZ19oZXgoIjExRCBET01BSU4gSW5mbyBSc3AgRGF0YToiLCAodTggKikgcmVzcCwKKwkJKGludClsZTE2X3RvX2NwdShyZXNwLT5zaXplKSk7CisKKwlucl9zdWJiYW5kID0gKGRvbWFpbi0+aGVhZGVyLmxlbiAtIDMpIC8gc2l6ZW9mKHN0cnVjdCBpZWVldHlwZXNfc3ViYmFuZHNldCk7CisJLyogY291bnRyeWNvZGUgMyBieXRlcyAqLworCisJbGJzX3ByX2RlYnVnKDEsICIxMUQgRG9tYWluIEluZm8gUmVzcDogbnJfc3ViYmFuZD0lZFxuIiwgbnJfc3ViYmFuZCk7CisKKwlpZiAobnJfc3ViYmFuZCA+IE1SVkRSVl9NQVhfU1VCQkFORF84MDJfMTFEKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBOdW1yZXIgb2YgU3ViYmFuZCByZXR1cm5lZCEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBjbWRfYWN0X3NldDoJLypQcm9jIFNldCBhY3Rpb24gKi8KKwkJYnJlYWs7CisKKwljYXNlIGNtZF9hY3RfZ2V0OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgYWN0aW9uOiVkXG4iLCBkb21haW5pbmZvLT5hY3Rpb24pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwYXJzZXMgY291bnRyeWluZm8gZnJvbSBBUCBhbmQgZG93bmxvYWQgY291bnRyeSBpbmZvIHRvIEZXCisgKiAgQHBhcmFtIHByaXYgICAgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcmV0dXJuIAkgICAwOyAtMQorICovCitpbnQgbGliZXJ0YXNfcGFyc2VfZG5sZF9jb3VudHJ5aW5mb18xMWQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCWlmIChwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQpIHsKKwkJbWVtc2V0KCZhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQpKTsKKwkJcmV0ID0gcGFyc2VfZG9tYWluX2luZm9fMTFkKCZhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYy0+CisJCQkJCSAgICAgICBjb3VudHJ5aW5mbywgMCwKKwkJCQkJICAgICAgICZhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4pOworCisJCWlmIChyZXQgPT0gLTEpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBFcnIgUGFyc2UgZG9tYWluX2luZm8gZnJvbSBBUC4uXG4iKTsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbWVtc2V0KCZhZGFwdGVyLT5kb21haW5yZWcsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHdsYW5fODAyXzExZF9kb21haW5fcmVnKSk7CisJCWdlbmVyYXRlX2RvbWFpbl9pbmZvXzExZCgmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuLAorCQkJCSAgICAgICZhZGFwdGVyLT5kb21haW5yZWcpOworCisJCXJldCA9IHNldF9kb21haW5faW5mb18xMWQocHJpdik7CisKKwkJaWYgKHJldCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IEVyciBzZXQgZG9tYWluSW5mbyB0byBGV1xuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgMTFEIGluZm8gZnJvbSB1c2VyIHNwZWNpZmllZCByZWdpb25jb2RlIGFuZCBkb3dubG9hZCB0byBGVworICogIEBwYXJhbSBwcml2ICAgIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHJldHVybiAJICAgMDsgLTEKKyAqLworaW50IGxpYmVydGFzX2NyZWF0ZV9kbmxkX2NvdW50cnlpbmZvXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwgKnJlZ2lvbl9jaGFuOworCXU4IGo7CisKKwlFTlRFUigpOworCWxic19wcl9kZWJ1ZygxLCAiMTFEOmN1cmJzc3BhcmFtcy5iYW5kWyVkXVxuIiwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJhbmQpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQkvKiB1cGRhdGUgcGFyc2VkX3JlZ2lvbl9jaGFuXzExOyBkbmxkIGRvbWFpbmluZiB0byBGVyAqLworCisJCWZvciAoaiA9IDA7IGogPCBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWwpIC8KKwkJICAgICBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbMF0pOyBqKyspIHsKKwkJCXJlZ2lvbl9jaGFuID0gJmFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsW2pdOworCisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDpbJWRdIHJlZ2lvbl9jaGFuLT5iYW5kWyVkXVxuIiwgaiwKKwkJCSAgICAgICByZWdpb25fY2hhbi0+YmFuZCk7CisKKwkJCWlmICghcmVnaW9uX2NoYW4gfHwgIXJlZ2lvbl9jaGFuLT52YWxpZAorCQkJICAgIHx8ICFyZWdpb25fY2hhbi0+Q0ZQKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlZ2lvbl9jaGFuLT5iYW5kICE9IGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5iYW5kKQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaiA+PSBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWwpIC8KKwkJICAgIHNpemVvZihhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFswXSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiMTFEOnJlZ2lvbl9jaGFuIG5vdCBmb3VuZC4gYmFuZFslZF1cbiIsCisJCQkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJhbmQpOworCQkJTEVBVkUoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbXNldCgmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkKSk7CisJCXdsYW5fZ2VuZXJhdGVfcGFyc2VkX3JlZ2lvbl9jaGFuXzExZChyZWdpb25fY2hhbiwKKwkJCQkJCSAgICAgJmFkYXB0ZXItPgorCQkJCQkJICAgICBwYXJzZWRfcmVnaW9uX2NoYW4pOworCisJCW1lbXNldCgmYWRhcHRlci0+ZG9tYWlucmVnLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3bGFuXzgwMl8xMWRfZG9tYWluX3JlZykpOworCQlnZW5lcmF0ZV9kb21haW5faW5mb18xMWQoJmFkYXB0ZXItPnBhcnNlZF9yZWdpb25fY2hhbiwKKwkJCQkJICZhZGFwdGVyLT5kb21haW5yZWcpOworCisJCXJldCA9IHNldF9kb21haW5faW5mb18xMWQocHJpdik7CisKKwkJaWYgKHJldCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IEVyciBzZXQgZG9tYWluSW5mbyB0byBGV1xuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzLzExZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvMTFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyZWJlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy8xMWQuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqCisgICogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBkYXRhIHN0cnVjdHVyZXMgYW5kCisgICogZnVuY3Rpb24gZGVjbGFyYXRpb25zIG9mIDgwMi4xMWQKKyAgKi8KKyNpZm5kZWYgX1dMQU5fMTFEXworI2RlZmluZSBfV0xBTl8xMURfCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImRlZnMuaCIKKworI2RlZmluZSBVTklWRVJTQUxfUkVHSU9OX0NPREUJCQkweGZmCisKKy8qKiAoQmVhY29uc2l6ZSgyNTYpLTUoSUVJZCxsZW4sY29udHJ5c3RyKDMpKS8zKEZpcnN0Q2hhbixOb09mQ2hhbixNYXhQd3IpCisgKi8KKyNkZWZpbmUgTVJWRFJWX01BWF9TVUJCQU5EXzgwMl8xMUQJCTgzCisKKyNkZWZpbmUgQ09VTlRSWV9DT0RFX0xFTgkJCTMKKyNkZWZpbmUgTUFYX05PX09GX0NIQU4gCQkJCTQwCisKK3N0cnVjdCBjbWRfZHNfY29tbWFuZDsKKworLyoqIERhdGEgc3RydWN0dXJlIGZvciBDb3VudHJ5IElFKi8KK3N0cnVjdCBpZWVldHlwZXNfc3ViYmFuZHNldCB7CisJdTggZmlyc3RjaGFuOworCXU4IG5yY2hhbjsKKwl1OCBtYXh0eHB3cjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZXR5cGVzX2NvdW50cnlpbmZvc2V0IHsKKwl1OCBlbGVtZW50X2lkOworCXU4IGxlbjsKKwl1OCBjb3VudHJ5Y29kZVtDT1VOVFJZX0NPREVfTEVOXTsKKwlzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQgc3ViYmFuZFsxXTsKK307CisKK3N0cnVjdCBpZWVldHlwZXNfY291bnRyeWluZm9mdWxsc2V0IHsKKwl1OCBlbGVtZW50X2lkOworCXU4IGxlbjsKKwl1OCBjb3VudHJ5Y29kZVtDT1VOVFJZX0NPREVfTEVOXTsKKwlzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQgc3ViYmFuZFtNUlZEUlZfTUFYX1NVQkJBTkRfODAyXzExRF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX2RvbWFpbnBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IGNvdW50cnljb2RlW0NPVU5UUllfQ09ERV9MRU5dOworCXN0cnVjdCBpZWVldHlwZXNfc3ViYmFuZHNldCBzdWJiYW5kWzFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbyB7CisJdTE2IGFjdGlvbjsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfZG9tYWlucGFyYW1zZXQgZG9tYWluOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKiBkb21haW4gcmVndWxhdG9yeSBpbmZvcm1hdGlvbiAqLworc3RydWN0IHdsYW5fODAyXzExZF9kb21haW5fcmVnIHsKKwkvKiogY291bnRyeSBDb2RlKi8KKwl1OCBjb3VudHJ5Y29kZVtDT1VOVFJZX0NPREVfTEVOXTsKKwkvKiogTm8uIG9mIHN1YmJhbmQqLworCXU4IG5yX3N1YmJhbmQ7CisJc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0IHN1YmJhbmRbTVJWRFJWX01BWF9TVUJCQU5EXzgwMl8xMURdOworfTsKKworc3RydWN0IGNoYW5fcG93ZXJfMTFkIHsKKwl1OCBjaGFuOworCXU4IHB3cjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCB7CisJdTggYmFuZDsKKwl1OCByZWdpb247CisJczggY291bnRyeWNvZGVbQ09VTlRSWV9DT0RFX0xFTl07CisJc3RydWN0IGNoYW5fcG93ZXJfMTFkIGNoYW5wd3JbTUFYX05PX09GX0NIQU5dOworCXU4IG5yX2NoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJlZ2lvbl9jb2RlX21hcHBpbmcgeworCXU4IHJlZ2lvbltDT1VOVFJZX0NPREVfTEVOXTsKKwl1OCBjb2RlOworfTsKKwordTggbGliZXJ0YXNfZ2V0X3NjYW5fdHlwZV8xMWQodTggY2hhbiwKKwkJCSAgc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQgKnBhcnNlZF9yZWdpb25fY2hhbik7CisKK3UzMiBsaWJlcnRhc19jaGFuXzJfZnJlcSh1OCBjaGFuLCB1OCBiYW5kKTsKKworZW51bSBzdGF0ZV8xMWQgbGliZXJ0YXNfZ2V0X3N0YXRlXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKKwordm9pZCBsaWJlcnRhc19pbml0XzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKKworaW50IGxpYmVydGFzX3NldF91bml2ZXJzYWx0YWJsZSh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCBiYW5kKTsKKworaW50IGxpYmVydGFzX2NtZF84MDJfMTFkX2RvbWFpbl9pbmZvKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB1MTYgY21kbm8sCisJCQkJIHUxNiBjbWRPcHRpb24pOworCitpbnQgbGliZXJ0YXNfY21kX2VuYWJsZV8xMWQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpOworCitpbnQgbGliZXJ0YXNfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKKworaW50IGxpYmVydGFzX3BhcnNlX2RubGRfY291bnRyeWluZm9fMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitpbnQgbGliZXJ0YXNfY3JlYXRlX2RubGRfY291bnRyeWluZm9fMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCisjZW5kaWYJCQkJLyogX1dMQU5fMTFEXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvTElDRU5TRSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2Mjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL0xJQ0VOU0UKQEAgLTAsMCArMSwxNiBAQAorICBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljOTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgRVhUUkFfQ0ZMQUdTICs9IC1XcGFja2VkCisKK3VzYjh4eHgtb2JqcyA6PSBtYWluLm8gZncubyB3ZXh0Lm8gXAorCQlyeC5vIHR4Lm8gY21kLm8gCSAgXAorCQljbWRyZXNwLm8gc2Nhbi5vCSAgXAorCQlqb2luLm8gMTFkLm8gCQkgIFwKKwkJaW9jdGwubyBkZWJ1Z2ZzLm8JICBcCisJCWV0aHRvb2wubyBhc3NvYy5vCisKK2lmZXEgKCQoQ09ORklHX0xJQkVSVEFTX1VTQl9ERUJVRyksIHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRyAtRFBST0NfREVCVUcKK2VuZGlmCisKKworIyBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXdlciBib290MiBib290bG9hZGVyICh2ID49IDMxMDQpCitFWFRSQV9DRkxBR1MgKz0gLURTVVBQT1JUX0JPT1RfQ09NTUFORAordXNiOHh4eC1vYmpzICs9IGlmX2Jvb3RjbWQubwordXNiOHh4eC1vYmpzICs9IGlmX3VzYi5vCisKK29iai0kKENPTkZJR19MSUJFUlRBU19VU0IpICs9IHVzYjh4eHgubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9SRUFETUUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4ZGE0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL1JFQURNRQpAQCAtMCwwICsxLDEwNDQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQlSRUFETUUgZm9yIFVTQjgzODgKKworIChjKSBDb3B5cmlnaHQgqSAyMDAzLTIwMDYsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwKKyBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKyAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluCisgYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoCisgaXMgYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0bworIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgMDIxMTEtMTMwNyBvciBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KKworIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFCisgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dAorIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz09PT09PT09PT09PT09PT09PT09PQorRFJJVkVSIExPQURJTkcKKz09PT09PT09PT09PT09PT09PT09PQorCisJby4gQ29weSB0aGUgZmlybXdhcmUgaW1hZ2UgKGUuZy4gdXNiODM4OC5iaW4pIHRvIC9saWIvZmlybXdhcmUvCisKKwlvLiBMb2FkIGRyaXZlciBieSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKwkJaW5zbW9kIHVzYjgzODgua28gW2Z3X25hbWU9dXNiODM4OC5iaW5dCisKKz09PT09PT09PT09PT09PT09PT09PQorSVdQUklWIENPTU1BTkQKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCisJVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSB1c2FnZSBvZiBwcml2YXRlIGNvbW1hbmRzIHVzZWQgaW4gTWFydmVsbCBXTEFOCisJTGludXggRHJpdmVyLiBBbGwgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSBpbiBXbGFuY29uZmlnIHdpbGwgbm90IGJlIGF2YWlsYWJsZQorCWluIHRoZSBpd3ByaXYuCisKK1NZTk9QU0lTCisJaXdwcml2IDxldGhYPiA8Y29tbWFuZD4gW3N1Yi1jb21tYW5kXSAuLi4KKworCWl3cHJpdiBldGhYIHZlcnNpb24KKwlpd3ByaXYgZXRoWCBzY2FudHlwZSBbc3ViLWNvbW1hbmRdCisJaXdwcml2IGV0aFggZ2V0U05SIDxuPgorCWl3cHJpdiBldGhYIGdldE5GIDxuPgorCWl3cHJpdiBldGhYIGdldFJTU0kgPG4+CisJaXdwcml2IGV0aFggc2V0cnhhbnQgPG4+CisJaXdwcml2IGV0aFggZ2V0cnhhbnQKKwlpd3ByaXYgZXRoWCBzZXR0eGFudCA8bj4KKwlpd3ByaXYgZXRoWCBnZXR0eGFudAorCWl3cHJpdiBldGhYIGF1dGhhbGdzIDxuPgorCWl3cHJpdiBldGhYIHByZS1UQlRUIDxuPgorCWl3cHJpdiBldGhYIDgwMjF4YXV0aGFsZ3MgPG4+CisJaXdwcml2IGV0aFggZW5jcnlwdGlvbm1vZGUgPG4+CisJaXdwcml2IGV0aFggc2V0cmVnaW9uY29kZSA8bj4KKwlpd3ByaXYgZXRoWCBnZXRyZWdpb25jb2RlCisJaXdwcml2IGV0aFggc2V0YmNuYXZnIDxuPgorCWl3cHJpdiBldGhYIGdldGJjbmF2ZworCWl3cHJpdiBldGhYIHNldGRhdGFhdmcgPG4+CisJaXdwcml2IGV0aFggc2V0bGlzdGVuaW50ZXIgPG4+CisJaXdwcml2IGV0aFggZ2V0bGlzdGVuaW50ZXIKKwlpd3ByaXYgZXRoWCBzZXRtdWx0aXBsZWR0aW0gPG4+CisJaXdwcml2IGV0aFggZ2V0bXVsdGlwbGVkdGltCisJaXdwcml2IGV0aFggYXRpbXdpbmRvdyA8bj4KKwlpd3ByaXYgZXRoWCBkZWF1dGgKKwlpd3ByaXYgZXRoWCBhZGhvY3N0b3AKKwlpd3ByaXYgZXRoWCByYWRpb29uCisJaXdwcml2IGV0aFggcmFkaW9vZmYKKwlpd3ByaXYgZXRoWCByZWFzc28tb24KKwlpd3ByaXYgZXRoWCByZWFzc28tb2ZmCisJaXdwcml2IGV0aFggc2Nhbm1vZGUgIFtzdWItY29tbWFuZF0KKwlpd3ByaXYgZXRoWCBzZXR3cGFpZSA8bj4KKwlpd3ByaXYgZXRoWCB3bGFuaWRsZS1vZmYKKwlpd3ByaXYgZXRoWCB3bGFuaWRsZS1vbgorCWl3cHJpdiBldGhYIGdldGNpcworCWl3cHJpdiBldGhYIGdldGxvZworCWl3cHJpdiBldGhYIGdldGFkaG9jc3RhdHVzCisJaXdwcml2IGV0aFggYWRob2NncmF0ZSA8bj4KKworVmVyc2lvbiA0IENvbW1hbmQ6CisJaXdwcml2IGV0aFggaW5hY3R2aXR5dG8gPG4+CisJaXdwcml2IGV0aFggc2xlZXBwZCA8bj4KKwlpd3ByaXYgZXRoWCBlbmFibGUxMWQgPG4+CisJaXdwcml2IGV0aFggdHBjY2ZnIDxuPgorCWl3cHJpdiBldGhYIHBvd2VyY2ZnIDxuPgorCWl3cHJpdiBldGhYIHNldGFmYyA8bj4KKwlpd3ByaXYgZXRoWCBnZXRhZmMKKworVmVyc2lvbiA1IENvbW1hbmQ6CisJaXdwcml2IGV0aFggbGVkZ3BpbyA8bj4KKwlpd3ByaXYgZXRoWCBzY2FucHJvYmVzIDxuPgorCWl3cHJpdiBldGhYIGxvbGlzdGVuaW50ZXIgPG4+CisJaXdwcml2IGV0aFggcmF0ZWFkYXB0IDxuPiA8bT4KKwlpd3ByaXYgZXRoWCB0eGNvbnRyb2wgPG4+CisJaXdwcml2IGV0aFggcHNudWxsaW50ZXJ2YWwgPG4+CisJaXdwcml2IGV0aFggcHJlc2NhbiA8bj4KKwlpd3ByaXYgZXRoWCBnZXRyeGluZm8KKwlpd3ByaXYgZXRoWCBnZXR0eHJhdGUKKwlpd3ByaXYgZXRoWCBiZWFjb25pbnRlcnZhbAorCitCVCBDb21tYW5kczoKKwlUaGUgYmxpbmRpbmcgdGFibGUgKEJUKSBjb250YWlucyBhIGxpc3Qgb2YgbWFjIGFkZHJlc3NlcyB0aGF0IHNob3VsZCBiZQorCWlnbm9yZWQgYnkgdGhlIGZpcm13YXJlLiAgSXQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQKKwl0ZXN0aW5nIG5ldHdvcmtzLiAgSXQgY2FuIGJlIGVkaXRlZCBhbmQgaW5zcGVjdGVkIHdpdGggdGhlIGZvbGxvd2luZworCWNvbW1hbmRzOgorCisJaXdwcml2IGV0aFggYnRfcmVzZXQKKwlpd3ByaXYgZXRoWCBidF9hZGQgPG1hY19hZGRyZXNzPgorCWl3cHJpdiBldGhYIGJ0X2RlbCA8bWFjX2FkZHJlc3M+CisJaXdwcml2IGV0aFggYnRfbGlzdCA8aWQ+CisKK0ZXVCBDb21tYW5kczoKKwlUaGUgZm9yd2FyZGluZyB0YWJsZSAoRldUKSBpcyBhIGZlYXR1cmUgdXNlZCB0byBtYW5hZ2UgbWVzaCBuZXR3b3JrCisJcm91dGluZyBpbiB0aGUgZmlybXdhcmUuICBUaGUgRldUIGlzIGVzc2VudGlhbGx5IGEgcm91dGluZyB0YWJsZSB0aGF0CisJYXNzb2NpYXRlcyBhIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIChkYSkgd2l0aCBhIG5leHQgaG9wIHJlY2VpdmVyCisJYWRkcmVzcyAocmEpLiAgVGhlIEZXVCBjYW4gYmUgaW5zcGVjdGVkIGFuZCBlZGl0ZWQgd2l0aCB0aGUgZm9sbG93aW5nCisJaXdwcml2IGNvbW1hbmRzLCB3aGljaCBhcmUgZGVzY3JpYmVkIGluIGdyZWF0ZXIgZGV0YWlsIGJlbG93LgorCUV2ZW50dWFsbHksIHRoZSB0YWJsZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5lZCBieSBhIGN1c3RvbQorCXJvdXRpbmcgcHJvdG9jb2wuCisKKwlOT1RFOiBGV1QgY29tbWFuZHMgcmVwbGFjZSB0aGUgcHJldmlvdXMgREZUIGNvbW1hbmRzLiAgV2hhdCB3ZXJlIHRoZSBERlQKKwljb21tYW5kcz8sIHlvdSBtaWdodCBhc2suICBUaGV5IHdlcmUgYW4gZWFybGllciBBUEkgdG8gdGhlIGZpcm13YXJlIHRoYXQKKwlpbXBsZW1lbnRlZCBhIHNpbXBsZSBNQUMtbGF5ZXIgZm9yd2FyZGluZyBtZWNoYW5pc20uICBJbiB0aGUgdW5saWtlbHkKKwlldmVudCB0aGF0IHlvdSB3ZXJlIHVzaW5nIHRoZXNlIGNvbW1hbmRzLCB5b3UgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcKKwlGV1QgY29tbWFuZHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorCisJaXdwcml2IGV0aFggZnd0X2FkZCBbcGFyYW1ldGVyc10KKwlpd3ByaXYgZXRoWCBmd3RfZGVsIFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9sb29rdXAgW3BhcmFtZXRlcnNdCisJaXdwcml2IGV0aFggZnd0X2xpc3QgW3BhcmFtZXRlcnNdCisJaXdwcml2IGV0aFggZnd0X2xpc3Rfcm91dGUgW3BhcmFtZXRlcnNdCisJaXdwcml2IGV0aFggZnd0X2xpc3RfbmVpZ2ggW3BhcmFtZXRlcnNdCisJaXdwcml2IGV0aFggZnd0X3Jlc2V0IFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9jbGVhbnVwCisJaXdwcml2IGV0aFggZnd0X3RpbWUKKworTUVTSCBDb21tYW5kczoKKworCVRoZSBNRVNIIGNvbW1hbmRzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBtZXNoCisJcm91dGluZyBwcm90b2NvbC4gIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHN1cHBvcnRlZDoKKworCWl3cHJpdiBldGhYIG1lc2hfZ2V0X3R0bAorCWl3cHJpdiBldGhYIG1lc2hfc2V0X3R0bCB0dGwKKworREVTQ1JJUFRJT04KKwlUaG9zZSBjb21tYW5kcyBhcmUgdXNlZCB0byBzZW5kIGFkZGl0aW9uYWwgY29tbWFuZHMgdG8gdGhlIE1hcnZlbGwgV0xBTgorCWNhcmQgdmlhIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyLgorCisJVGhlIGV0aFggcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdGhhdCBpcyB0byBiZSB1c2VkIHRvCisJCXBlcmZvcm0gdGhpcyBjb21tYW5kIG9uLiBpdCBjb3VsZCBiZSBldGgwLCBldGgxIGV0Yy4KKwordmVyc2lvbgorCVRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFuZCB0aGUgZmlybXdhcmUuCisKK3NjYW50eXBlCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBzY2FuIHR5cGUgdG8gYmUgdXNlZCBieSB0aGUgZHJpdmVyIGluCisJdGhlIHNjYW4gY29tbWFuZC4gVGhpcyBzZXR0aW5nIHdpbGwgbm90IGJlIHVzZWQgd2hpbGUgcGVyZm9ybWluZyBhIHNjYW4KKwlmb3IgYSBzcGVjaWZpYyBTU0lELCBhcyBpdCBpcyBhbHdheXMgZG9uZSB3aXRoIHNjYW4gdHlwZSBiZWluZyBhY3RpdmUuCisKKwl3aGVyZSB0aGUgc3ViLWNvbW1hbmRzIGFyZTogLQorCQkJYWN0aXZlIAktLSB0byBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUKKwkJCXBhc3NpdmUgLS0gdG8gc2V0IHRoZSBzY2FuIHR5cGUgdG8gcGFzc2l2ZQorCQkJZ2V0IAktLSB0byBnZXQgdGhlIHNjYW4gdHlwZSBzZXQgaW4gdGhlIGRyaXZlcgorCitnZXRTTlIKKwlUaGlzIGNvbW1hbmQgZ2V0cyB0aGUgYXZlcmFnZSBhbmQgbm9uIGF2ZXJhZ2UgdmFsdWUgb2YgU2lnbmFsIHRvIE5vaXNlCisJUmF0aW8gb2YgQmVhY29uIGFuZCBEYXRhLgorCisJd2hlcmUgdmFsdWUgaXM6LQorCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgorCQkJMSAJLS0gQmVhY29uIGF2ZXJhZ2UuCisJCQkyIAktLSBEYXRhIG5vbi1hdmVyYWdlLgorCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgorCisJSWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIGFsbCBmb3VyIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIG1lbnRpb25lZAorCWFib3ZlLgorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKworZ2V0UlNTSQorCVRoaXMgY29tbWFuZCBnZXRzIHRoZSBhdmVyYWdlIGFuZCBub24gYXZlcmFnZSB2YWx1ZSBvcyBSZWNlaXZlIFNpZ25hbAorCVN0cmVuZ3RoIG9mIEJlYWNvbiBhbmQgRGF0YS4KKworCXdoZXJlIHZhbHVlIGlzOi0KKwkJCTAgCS0tIEJlYWNvbiBub24tYXZlcmFnZS4KKwkJCTEgCS0tIEJlYWNvbiBhdmVyYWdlLgorCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KKwkJCTMgCS0tIERhdGEgYXZlcmFnZS4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK2dldE5GCisJVGhpcyBjb21tYW5kIGdldHMgdGhlIGF2ZXJhZ2UgYW5kIG5vbiBhdmVyYWdlIHZhbHVlIG9mIE5vaXNlIEZsb29yIG9mCisJQmVhY29uIGFuZCBEYXRhLgorCisJd2hlcmUgdmFsdWUgaXM6LQorCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgorCQkJMSAJLS0gQmVhY29uIGF2ZXJhZ2UuCisJCQkyIAktLSBEYXRhIG5vbi1hdmVyYWdlLgorCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKworc2V0cnhhbnQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIG1vZGUgZm9yIFJ4IGFudGVubmEuCisKKwlUaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZW50IGFyZTotCisJCQkxIAktLSBBbnRlbm5hIDEuCisJCQkyIAktLSBBbnRlbm5hIDIuCisJCQkweEZGRkYgCS0tIERpdmVyc2l0eS4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBzZXRyeGFudCAweDAxOiBzZWxlY3QgQW50ZW5uYSAxLgorCitnZXRyeGFudAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgbW9kZSBmb3IgUnggYW50ZW5uYS4KKworCitzZXR0eGFudAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgbW9kZSBmb3IgVHggYW50ZW5uYS4KKwkJVGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2VudCBhcmU6LQorCQkJMSAJLS0gQW50ZW5uYSAxLgorCQkJMiAJLS0gQW50ZW5uYSAyLgorCQkJMHhGRkZGIAktLSBEaXZlcnNpdHkuCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIHNldHR4YW50IDB4MDE6IHNlbGVjdCBBbnRlbm5hIDEuCisKK2dldHR4YW50CisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBtb2RlIGZvciBUeCBhbnRlbm5hLgorCithdXRoYWxncworCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudCB0byBzZXQgdGhlIGF1dGhlbnRpY2F0aW9uCisJYWxnb3JpdGhtcyBpbiB0aGUgc3RhdGlvbi4KKworODAyMXhhdXRoYWxncworCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudCB0byBzZXQgdGhlIDgwMjEueCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gdHlwZQorCXN0YXRpb24uCisKKwl3aGVyZSB2YWx1ZXMgY2FuIGJlOi0KKwkJCTEgCS0tIE5vbmUKKwkJCTIgCS0tIExFQVAKKwkJCTQgCS0tIFRMUworCQkJOCAJLS0gVFRMcworCQkJMTYJLS0gTUQ1CisKKworZW5jcnlwdGlvbm1vZGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKworCXdoZXJlIHZhbHVlcyBjYW4gYmU6LQorCQkJMCAJLS0gTk9ORQorCQkJMSAJLS0gV0VQNDAKKwkJCTIgCS0tIFRLSVAKKwkJCTMgCS0tIENDTVAKKwkJCTQgCS0tIFdFUDEwNAorCitwcmUtVEJUVAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBwcmUtVEJUVCB0aW1lIHBlcmlvZCB3aGVyZSB2YWx1ZSBpcyBpbiBtaWNyb3NlY29uZHMuCisKK3NldHJlZ2lvbmNvZGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIHJlZ2lvbiBjb2RlIGluIHRoZSBzdGF0aW9uLgorCXdoZXJlIHZhbHVlIGlzICdyZWdpb24gY29kZScgZm9yIHZhcmlvdXMgcmVnaW9ucyBsaWtlCisJVVNBIEZDQywgQ2FuYWRhIElDLCBTcGFpbiwgRnJhbmNlLCBFdXJvcGUgRVRTSSwJSmFwYW4gLi4uCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aFggc2V0cmVnaW9uY29kZSAweDEwOiBzZXQgcmVnaW9uIGNvZGUgdG8gVVNBICgweDEwKS4KKworZ2V0cmVnaW9uY29kZQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgcmVnaW9uIGNvZGUgaW5mb3JtYXRpb24gc2V0IGluIHRoZQorCXN0YXRpb24uCisKK3NldGJjbmF2ZworCVNldCB0aGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgY2FsY3VsYXRpbmcgUlNTSS4KKworZ2V0YmNuYXZnCisJR2V0IHdlaWdodGluZyBmYWN0b3IgZm9yIGNhbGN1bGF0aW5nIFJTU0kuCisKK3NldGRhdGFhdmcKKwlTZXQgdGhlIHdlaWdodGluZyBmYWN0b3IgZm9yIGNhbGN1bGF0aW5nIFNOUi4KKworc2V0bGlzdGVuaW50ZXIKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIGxpc3RlbiBpbnRlcnZhbCBpbiB0aGUKKwlzdGF0aW9uLgorCisJd2hlcmUgdGhlIHZhbHVlIHJhbmdlcyBiZXR3ZWVuIDEgLSAyNTUKKworZ2V0bGlzdGVuaW50ZXIKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGxpc3RlbiBpbnRlcnZhbCB2YWx1ZSBzZXQgaW4gdGhlCisJc3RhdGlvbi4KKworc2V0bXVsdGlwbGVkdGltCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBtdWx0aXBsZSBkdGltIHZhbHVlIGluIHRoZQorCXN0YXRpb24uCisJCXdoZXJlIHRoZSB2YWx1ZSBpcyAxLDIsMyw0LDUsMHhmZmZlCisJCTB4ZmZmZSBtZWFucyB0aGUgZmlybXdhcmUgd2lsbCB1c2UgbGlzdGVuIGludGVydmFsIGluIGFzc29jaWF0aW9uCisJCWNvbW1hbmQgZm9yIHdha2luZyB1cAorCitnZXRtdWx0aXBsZWR0aW0KKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIG11bHRpcGxlIGR0aW0gdmFsdWUgc2V0IGluIHRoZSBzdGF0aW9uLgorCithdGltd2luZG93CisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBhdGltIHZhbHVlIGluIHRoZQorCXN0YXRpb24uCisKKwl3aGVyZSB0aGUgdmFsdWUgcmFuZ2VzIGJldHdlZW4gMCAtIDUwCisKK2RlYXV0aAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgdGhlIGRlLWF1dGhlbnRpY2F0aW9uIHRvIHRoZSBBUCB3aXRoIHdoaWNoCisJdGhlIHN0YXRpb24gaXMgYXNzb2NpYXRlZC4gVGhpcyBjb21tYW5kIGlzIHZhbGlkIG9ubHkgd2hlbgorCXN0YXRpb24gaXMgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZS4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK2FkaG9jc3RvcAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSBzdGF0aW9uIGFuZAorCWdvIGludG8gaWRsZSBzdGF0ZSBpbiBhZC1ob2MgbW9kZS4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK3JhZGlvb24KKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byB0dXJuIG9uIHRoZSBSRiBhbnRlbm5hLgorCityYWRpb29mZgorCVRoaXMgY29tbWFuZCBpcyBzdWVkIHRvIHR1cm4gb2ZmIHRoZSBSRiBhbnRlbm5hLgorCitzY2FubW9kZQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc3RhdGlvbiB0byBzY2FuIGZvciBlaXRoZXIgSUJTUworCW5ldHdvcmtzIG9yIEJTUyBuZXR3b3JrcyBvciBib3RoIEJTUyBhbmQgSUJTUyBuZXR3b3Jrcy4gVGhpcworCWNvbW1hbmQgY2FuIGJlIHVzZWQgd2l0aCBzdWIgY29tbWFuZHMsCisKKwl3aGVyZSB0aGUgdmFsdWUgZm9yCisJCQlic3MgCS0tIFNjYW4gQWxsIHRoZSBCU1MgbmV0d29ya3MuCisJCQlpYnNzIAktLSBTY2FuIEFsbCB0aGUgSUJTUyBuZXR3b3Jrcy4KKwkJCWFueSAJLS0gU2NhbiBib3RoIEJTUyBhbmQgSUJTUyBuZXR3b3Jrcy4KKworCisKK3NldHdwYWllCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgYnkgV1BBIHN1cHBsaWNhbnQgdG8gc2VuZCB0aGUgV1BBLUlFIHRvIHRoZSBkcml2ZXIuCisKK3dsYW5pZGxlLW9mZgorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCBpbnRvIGlkbGUgc3RhdGUuCisKKwlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgorCit3bGFuaWRsZS1vbgorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCBvZmYgdGhlIGlkbGUgc3RhdGUuCisKKwlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgorCisKK2dldGxvZworCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgODAyLjExIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIHRoZQorCQlzdGF0aW9uLgorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKworZ2V0YWRob2NzdGF0dXMKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGFkLWhvYyBOZXR3b3JrIFN0YXR1cy4KKworCVRoZSB2YXJpb3VzIHN0YXR1cyBjb2RlcyBhcmU6CisJCUFkaG9jU3RhcnRlZAorCQlBZGhvY0pvaW5lZAorCQlBZGhvY0lkbGUKKwkJSW5mcmFNb2RlCisJCUF1dG9Vbmtub3duTW9kZQorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKworYWRob2NncmF0ZQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVuYWJsZSgxKSBnX3JhdGUsIERpc2FibGUoMCkgZ19yYXRlCisJYW5kIHJlcXVlc3QoMikgdGhlIHN0YXR1cyB3aGljaCBnX3JhdGUgaXMgZGlzYWJsZWQvZW5hYmxlZCwKKwlmb3IgQWQtaG9jIGNyZWF0b3IuCisKKwl3aGVyZSB2YWx1ZSBpczotCisJCTAJLS0gRGlzYWJsZWQKKwkJMQktLSBFbmFibGVkCisJCTIJLS0gR2V0CisKK2xlZGdwaW8KKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQvZ2V0IExFRHMuCisKKwlpd3ByaXYgZXRoWCBsZWRncGlvIDxMRURzPgorCQl3aWxsIHNldCB0aGUgY29ycmVzcG9uZGluZyBMRUQgZm9yIHRoZSBHUElPIExpbmUuCisKKwlpd3ByaXYgZXRoWCBsZWRncGlvCisJCXdpbGwgZ2l2ZSB1IHdoaWNoIExFRHMgYXJlIEVuYWJsZWQuCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aDEgbGVkZ3BpbyAxIDAgMiAxIDMgNAorCQkJd2lsbCBlbmFibGUKKwkJCUxFRCAxIC0+IEdQSU8gMAorCQkJTEVEIDIgLT4gR1BJTyAxCisJCQlMRUQgMyAtPiBHUElPIDQKKworCQlpd3ByaXYgZXRoMSBsZWRncGlvCisJCQlzaG93cyBMRUQgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm1hdCBhcyBtZW50aW9uZWQgYWJvdmUuCisKKwlOb3RlOiBMRUQwIGlzIGludmFsaWQKKwlOb3RlOiBNYXhpbXVtIE51bWJlciBvZiBMRURzIGFyZSAxNi4KKworaW5hY3Rpdml0eXRvCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgYnkgdGhlIGhvc3QgdG8gc2V0L2dldCB0aGUgaW5hY3Rpdml0eSB0aW1lb3V0IHZhbHVlLAorCXdoaWNoIHNwZWNpZmllcyB3aGVuIFdMQU4gZGV2aWNlIGlzIHB1dCB0byBzbGVlcC4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBpbmFjdGl2aXR5dG8gWzx0aW1lb3V0Pl0KKworCXdoZXJlIHRoZSBwYXJhbWV0ZXIgYXJlOgorCQl0aW1lb3V0OiB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKworCUV4YW1wbGU6CisJCWl3cHJpdiBldGgxIGluYWN0aXZpdHl0bworCQkJImdldCB0aGUgdGltZW91dCB2YWx1ZSIKKworCQlpd3ByaXYgZXRoMSBpbmFjdGl2aXR5dG8gWAorCQkJInNldCB0aW1lb3V0IHZhbHVlIHRvIFggbXMiCisKKworc2xlZXBwZAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc2xlZXAgcGVyaW9kIG9mIHRoZSBXTEFOIGRldmljZS4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBzbGVlcHBkIFs8c2xlZXAgcGVyaW9kPl0KKworCXdoZXJlIHRoZSBwYXJhbWV0ZXIgYXJlOgorCQlQZXJpb2Q6IHNsZWVwIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuIFJhbmdlIDEwfjYwLgorCisJRXhhbXBsZToKKwkJaXdwcml2IGV0aDEgc2xlZXBwZCAxMAorCQkJInNldCBwZXJpb2QgYXMgMTAgbXMiCisJCWl3cHJpdiBldGgxIHNsZWVwcGQKKwkJCSJnZXQgdGhlIHNsZWVwIHBlcmlvZCBjb25maWd1cmF0aW9uIgorCitlbmFibGUxMWQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjb250cm9sIDExZAorCXdoZXJlIHZhbHVlIGlzOi0KKwkJMQktLSBFbmFibGVkCisJCTAJLS0gRGlzYWJsZWQKKwkJMgktLSBHZXQKKworCisKKwordHBjY2ZnCisJRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgdHJhbnNtaXQgcG93ZXIgY29udHJvbC4KKworCVRoZSBmaXJzdCBwYXJhbWV0ZXIgdHVybnMgdGhpcyBmZWF0dXJlIG9uICgxKSBvciBvZmYgKDApLiAgV2hlbiB0dXJuaW5nCisJb24sIHRoZSB1c2VyIG11c3QgYWxzbyBzdXBwbHkgZm91ciBtb3JlIHBhcmFtZXRlcnMgaW4gdGhlIGZvbGxvd2luZworCW9yZGVyOgorCQktVXNlU05SIChVc2UgU05SIChpbiBhZGRpdGlvbiB0byBQRVIpIGZvciBUUEMgYWxnb3JpdGhtKSwKKwkJLVAwIChQMCBwb3dlciBsZXZlbCBmb3IgVFBDKSwKKwkJLVAxIChQMSBwb3dlciBsZXZlbCBmb3IgVFBDKSwKKwkJLVAyIChQMiBwb3dlciBsZXZlbCBmb3IgVFBDKS4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCB0cGNjZmc6IEdldCBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKwkJaXdwcml2IGV0aFggdHBjY2ZnIDA6IGRpc2FibGUgYXV0byBUUEMKKwkJaXdwcml2IGV0aFggdHBjY2ZnIDB4MDEgMHgwMCAweDA1IDB4MGEgMHgwZDogZW5hYmxlIGF1dG8gVFBDOyBkbyBub3QgdXNlIFNOUjsKKwkJCQkJCQkgICAgIFAwPTB4MDU7IFAxPTB4MGE7IFAyPTB4MGQ7CisJCWl3cHJpdiBldGhYIHRwY2NmZyAweDAxIDB4MDEgMHgwNSAweDBhIDB4MGQ6IGVuYWJsZSBhdXRvIFRQQzsgdXNlIFNOUjsKKwkJCQkJCQkgICAgIFAwPTB4MDU7IFAxPTB4MGE7IFAyPTB4MGQuCisKK3Bvd2VyY2ZnCisJRW5hYmxlcyBvciBkaXNhYmxlcyBwb3dlciBhZGFwdGF0aW9uLgorCisJVGhlIGZpcnN0IHBhcmFtZXRlciB0dXJucyB0aGlzIGZlYXR1cmUgb24gKDEpIG9yIG9mZiAoMCkuICBXaGVuIHR1cm5pbmcKKwlvbiwgdGhlIHVzZXIgbXVzdCBhbHNvIHN1cHBseSB0aHJlZSBtb3JlIHBhcmFtZXRlcnMgaW4gdGhlIGZvbGxvd2luZworCW9yZGVyOgorCQktUDAgKFAwIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKSwKKwkJLVAxIChQMSBwb3dlciBsZXZlbCBmb3IgUG93ZXIgQWRhcHRhdGlvbiksCisJCS1QMiAoUDIgcG93ZXIgbGV2ZWwgZm9yIFBvd2VyIEFkYXB0YXRpb24pLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIHBvd2VyY2ZnOiBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCisJCWl3cHJpdiBldGhYIHBvd2VyY2ZnIDA6IGRpc2FibGUgcG93ZXIgYWRhcHRhdGlvbgorCQlpd3ByaXYgZXRoWCBwb3dlcmNmZyAxIDB4MGQgMHgwZiAweDEyOiBlbmFibGUgcG93ZXIgYWRhcHRhdGlvbjsKKwkJCQkJCSAgICAgICBQMD0weDBkOyBQMT0weDBmOyBQMj0weDEyLgorCitnZXRhZmMKKwlUaGlzIGNvbW1hbmQgcmV0dXJucyBhdXRvbWF0aWMgZnJlcXVlbmN5IGNvbnRyb2wgcGFyYW1ldGVycy4gIEl0IHJldHVybnMKKwl0aHJlZSBpbnRlZ2VyczoKKwkJLVAwOiBhdXRvbWF0aWMgaXMgb24gKDEpLCBvciBvZmYgKDApLAorCQktUDE6IGN1cnJlbnQgdGltaW5nIG9mZnNldCBpbiBQUE0gKHBhcnQgcGVyIG1pbGxpb24pLCBhbmQKKwkJLVAyOiBjdXJyZW50IGZyZXF1ZW5jeSBvZmZzZXQgaW4gUFBNLgorCitzZXRhZmMKKwlTZXQgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIG9wdGlvbnMuCisKKwlUaGUgZmlyc3QgcGFyYW1ldGVyIHR1cm5zIGF1dG9tYXRpYyBvbiAoMSkgb3Igb2ZmICgwKS4KKwlUaGUgdXNlciBtdXN0IHN1cHBseSB0d28gbW9yZSBwYXJhbWV0ZXJzIGluIGVpdGhlciBjYXNlLCBpbiB0aGUgZm9sbG93aW5nCisgIG9yZGVyOgorCisgIFdoZW4gYXV0byBpcyBvbjoKKworCQktUDAgKGF1dG9tYXRpYyBhZGp1c3RtZW50IGZyZXF1ZW5jeSB0aHJlc2hvbGQgaW4gUFBNKSwKKwkJLVAxIChhdXRvbWF0aWMgYWRqdXN0bWVudCBwZXJpb2QgaW4gYmVhY29uIHBlcmlvZCksCisKKyAgV2hlbiBhdXRvIGlzIG9mZjoKKworCQktUDAgKG1hbnVhbCBhZGp1c3RtZW50IHRpbWluZyBvZmZzZXQgaW4gUFBNKSwgYW5kCisJCS1QMSAobWFudWFsIGFkanVzdG1lbnQgZnJlcXVlbmN5IG9mZnNldCBpbiBQUE0pLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIHNldGFmYyAwIDEwIDEwOiBtYW51YWwgYWRqdXN0bWVudCwgYm90aCB0aW1pbmcgYW5kIGZyZXF1Y25jeQorICAgIG9mZnNldCBhcmUgMTAgUFBNLgorCisJCWl3cHJpdiBldGhYIHNldGFmYyAxIDEwIDEwIGVuYWJsZSBhZmMsIGF1dG9tYXRpYyBhZGp1c3RtZW50LAorICAgIGZyZXF1ZW5jeSB0aHJlc2hvbGQgMTAgUFBNLCBmb3IgZXZlcnkgMTAgYmVhY29uIHBlcmlvZHMuCisKKworCitzY2FucHJvYmVzCisJVGhpcyBjb21tYW5kIHNldHMgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHBlciBjaGFubmVsLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIHNjYW5wcm9iZXMgMyAoc2V0IHNjYW4gcHJvYmVzIHRvIDMpCisJCWl3cHJpdiBldGhYIHNjYW5wcm9iZXMgICAoZ2V0IHNjYW4gcHJvYmVzKQorCitsb2xpc3RlbmludGVyCisJVGhpcyBjb21tYW5kIHNldHMgdGhlIHZhbHVlIG9mIGxpc3RlbiBpbnRlcnZhbC4KKworCVVzYWdlOgorCWl3cHJpdiBldGhYIGxvbGlzdGVuaW50ZXIgMjM0IChzZXQgdGhlIGxvbGlzdGVuaW50ZXIgdG8gMjM0KQorCWl3cHJpdiBldGhYIGxvbGlzdGVuaW50ZXIgICAgIChnZXQgdGhlIGxvbGlzdGVuaW50ZXIgdmFsdWUpCisKK3JhdGVhZGFwdAorCVRoaXMgY29tbWFuZCBzZXRzIHRoZSBkYXRhIHJhdGVzIGJpdG1hcC4KKwlXaGVyZSA8bj4KKwkJMDogRGlzYWJsZSBhdXRvIHJhdGUgYWRhcHQKKwkJMTogRW5hYmxlIGF1dG8gcmF0ZSBhZGFwdAorCisJICAgICAgPG0+CisJCSBkYXRhIHJhdGUgYml0bWFwCisJCQlCaXQJRGF0YSByYXRlCisJCQkwCTEgTWJwcworCQkJMQkyIE1icHMKKwkJCTIJNS41IE1icHMKKwkJCTMJMTEgTWJwcworCQkJNAlSZXNlcnZlZAorCQkJNQk2IE1icHMKKwkJCTYJOSBNYnBzCisJCQk3CTEyIE1icHMKKwkJCTgJMTggTWJwcworCQkJOQkyNCBNYnBzCisJCQkxMAkzNiBNYnBzCisJCQkxMQk0OCBNYnBzCisJCQkxMgk1NCBNYnBzCisJCQkxMi0xNQlSZXNlcnZlZAorCisJVXNhZ2U6CisJaXdwcml2IGV0aFggcmF0ZWFkYXB0CisJCQlyZWFkIHRoZSBjdXJyZWN0IGRhdGEgcmF0ZSBzZXR0aW5nCisJaXdwcml2IGV0aFggcmF0ZWFkYXB0IDEgMHgwNworCQkJZW5hYmxlIGF1dG8gZGF0YSByYXRlIGFkYXB0IGFuZAorCQkJZGF0YSByYXRlcyBhcmUgMU1icHMsIDJNYnNwIGFuZCA1LjVNYnBzCisKKwordHhjb250cm9sCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBUeCByYXRlLCBhY2sgcG9saWN5LCBhbmQgcmV0cnkgbGltaXQgb24gYSBwZXIgcGFja2V0IGJhc2lzLgorCisJV2hlcmUgdmFsdWUgPG4+IGlzOgorCSAgICBpZiBiaXRbNF0gPT0gMToKKwkJYml0WzM6MF0gICAgICAgIC0tIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICAxMCAgIDExICAgMTIgICAxMy0xNgorCQlEYXRhIFJhdGUoTWJwcykgLS0gMSAgIDIgICA1LjUgMTEgIFJzdiA2ICAgOSAgIDEyICAxOCAgMjQgIDM2ICAgNDggICA1NCAgIFJzdgorCisJICAgIGJpdFsxMjo4XQorCQlpZiBiaXRbMTJdID09IDEsIGJpdFsxMTo4XSBzcGVjaWZpZXMgdGhlIFR4IHJldHJ5IGxpbWl0LgorCisJICAgIGJpdFsxNDoxM10gc3BlY2lmaWVzIHBlciBwYWNrZXQgYWNrIHBvbGljeToKKwkJYml0WzE0OjEzXQorCQkgICAgIDEgIDAJdXNlIGltbWVkaWF0ZSBhY2sgcG9saWN5IGZvciB0aGlzIHBhY2tldAorCQkgICAgIDEgIDEgICAgICAgdXNlIG5vIGFjayBwb2xpY3kgZm9yIHRoaXMgcGFja2V0CisJCSAgICAgMCAgeAl1c2UgdGhlIHBlci1wYWNrZXQgYWNrIHBvbGljeSBzZXR0aW5nCisKKwlVc2FnZToKKwlpd3ByaXYgZXRoWCB0eGNvbnRyb2wgMHg3NTEzCisJCQlVc2Ugbm8tYWNrIHBvbGljeSwgNSByZXRpcmVzIGZvciBUeCwgMTFNYnBzIHJhdGUKKworCisKK3BzbnVsbGludGVydmFsCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0L3JlcXVlc3QgTlVMTCBwYWNrYWdlIGludGVydmFsIGZvciBQb3dlciBTYXZlCisJdW5kZXIgaW5mcmFzdHJ1Y3R1cmUgbW9kZS4KKworCXdoZXJlIHZhbHVlIGlzOi0KKwkJLTEJLS0gRGlzYWJsZWQKKwkJbj4wCS0tIFNldCBpbnRlcnZhbCBhcyBuIChzZWNvbmRzKQorCitwcmVzY2FuCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZW5hYmxlICgxKS9kaXNhYmxlKDApIGF1dG8gcHJlc2NhbiBiZWZvcmUgYXNzb2ljYXRlIHRvIHRoZSBhcAorCisJd2hlcmUgdmFsdWUgaXM6LQorCQkwCS0tIERpc2FibGVkCisJCTEJLS0gRW5hYmxlZAorCQkyICAgICAgIC0tIEdldAorCitnZXRyeGluZm8KKwlUaGlzIGNvbW1hbmQgZ2V0cyBub24gYXZlcmFnZSB2YWx1ZSBvZiBTaWduYWwgdG8gTm9pc2UgUmF0aW8gb2YgRGF0YSBhbmQgcmF0ZSBpbmRleC4KKworCVRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgUmF0ZUluZGV4IGFuZCBSYXRlCisKKwkJICAgICBSYXRlSW5kZXgJRGF0YSByYXRlCisJCQkwCTEgTWJwcworCQkJMQkyIE1icHMKKwkJCTIJNS41IE1icHMKKwkJCTMJMTEgTWJwcworCQkJNAlSZXNlcnZlZAorCQkJNQk2IE1icHMKKwkJCTYJOSBNYnBzCisJCQk3CTEyIE1icHMKKwkJCTgJMTggTWJwcworCQkJOQkyNCBNYnBzCisJCQkxMAkzNiBNYnBzCisJCQkxMQk0OCBNYnBzCisJCQkxMgk1NCBNYnBzCisJCQkxMy0xNQlSZXNlcnZlZAorCitnZXR0eHJhdGUKKwlUaGlzIGNvbW1hbmQgZ2V0cyBjdXJyZW50IFR4IHJhdGUgaW5kZXggb2YgdGhlIGZpcnN0IHBhY2tldCBhc3NvY2lhdGVkIHdpdGggUmF0ZSBBZGFwdGF0aW9uLgorCisJVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyBSYXRlSW5kZXggYW5kIFJhdGUKKworCQkgICAgIFJhdGVJbmRleAlEYXRhIHJhdGUKKwkJCTAJMSBNYnBzCisJCQkxCTIgTWJwcworCQkJMgk1LjUgTWJwcworCQkJMwkxMSBNYnBzCisJCQk0CVJlc2VydmVkCisJCQk1CTYgTWJwcworCQkJNgk5IE1icHMKKwkJCTcJMTIgTWJwcworCQkJOAkxOCBNYnBzCisJCQk5CTI0IE1icHMKKwkJCTEwCTM2IE1icHMKKwkJCTExCTQ4IE1icHMKKwkJCTEyCTU0IE1icHMKKwkJCTEzLTE1CVJlc2VydmVkCisKK2JjbmludGVydmFsCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0cyBiZWFjb24gaW50ZXJ2YWwgaW4gYWRob2MgbW9kZSB3aGVuIGFuIGFyZ3VtZW50IGlzIGdpdmVuLCBhbmQgZ2V0cyBjdXJyZW50IGFkaG9jCisJYmVhY29uIGludGVydmFsIHdoZW4gbm8gYXJndW1lbnQgaXMgZ2l2ZW4uIFRoZSB2YWxpZCBiZWFjb24gaW50ZXJ2YWwgaXMgYmV0d2VlbiAyMCAtIDEwMDAsCisJZGVmYXVsdCBiZWFjb24gaW50ZXJ2YWwgaXMgMTAwLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIGJjbmludGVydmFsIDEwMCAgKHNldCBhZGhvYyBiZWFjb24gaW50ZXJ2YWwgdG8gMTAwKQorCQlpd3ByaXYgZXRoWCBiY25pbnRlcnZhbCAgICAgIChnZXQgYWRob2MgYmVhY29uIGludGVydmFsKQorCitmd3RfYWRkCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIEZXVCB0YWJsZS4gVGhlIGxpc3Qgb2YKKwlwYXJhbWV0ZXJzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisJaXdwcml2IGV0aFggZnd0X2FkZCBkYSByYSBbbWV0cmljIGRpciBzc24gZHNuIGhvcGNvdW50IHR0bCBleHBpcmF0aW9uIHNsZWVwbW9kZSBzbnJdCisKKwlUaGUgcGFyYW1ldGVycyBiZXR3ZWVuIGJyYWNrZXRzIGFyZSBvcHRpb25hbCwgYnV0IHRoZXkgbXVzdCBhcHBlYXIgaW4KKwl0aGUgb3JkZXIgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG1ldHJpYywKKwl5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIGRpciwgc3NuLCBhbmQgZHNuIGJ1dCB5b3UgbmVlZCBub3Qgc3BlY2lmeSB0aGUKKwlob3Bjb3VudCwgZXhwaXJhdGlvbiwgc2xlZXBtb2RlLCBvciBzbnIuICBBbnkgdW5zcGVjaWZpZWQgcGFyYW1ldGVycworCXdpbGwgYmUgYXNzaWduZWQgdGhlIGRlZmF1bHRzIHNwZWNpZmllZCBiZWxvdy4KKworCVRoZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBhcmU6LQorCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgaW4gdGhlIGZvcm0gMDA6MTE6MjI6MzM6NDQ6NTUKKwkJcmEJCS0tIFJBIE1BQyBhZGRyZXNzIGluIHRoZSBmb3JtIDAwOjExOjIyOjMzOjQ0OjU1CisJCW1ldHJpYwkJLS0gcm91dGUgbWV0cmljIChjb3N0OiBzbWFsbGVyLW1ldHJpYyByb3V0ZXMgYXJlCisJCQkJICAgcHJlZmVycmVkLCBkZWZhdWx0IGlzIDApCisJCWRpcgkJLS0gZGlyZWN0aW9uICgxIGZvciBkaXJlY3QsIDAgZm9yIHJldmVyc2UsCisJCQkJICAgZGVmYXVsdCBpcyAxKQorCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvcgorCQkJCSAgIHJldmVyc2Ugcm91dGVzLiAgRGVmYXVsdCBpcyAwKQorCQlkc24JCS0tIERlc3RpbmF0aW9uIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgREEKKwkJCQkgICBmb3IgZGlyZWN0IHJvdXRlcy4gIERlZmF1bHQgaXMgMCkKKwkJaG9wY291bnQJLS0gaG9wIGNvdW50IChjdXJyZW50bHkgdW51c2VkLCBkZWZhdWx0IGlzIDApCisJCXR0bAkJLS0gVFRMIChPbmx5IHVzZWQgaW4gcmV2ZXJzZSBlbnRyaWVzKQorCQlleHBpcmF0aW9uCS0tIGVudHJ5IGV4cGlyYXRpb24gKGluIHRpY2tzLCB3aGVyZSBhIHRpY2sgaXMKKwkJCQkgICAxMDI0dXMsIG9yIH4gMW1zLiBVc2UgMCBmb3IgYW4gaW5kZWZpbml0ZQorCQkJCSAgIGVudHJ5LCBkZWZhdWx0IGlzIDApCisJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQsIGRlZmF1bHQgaXMKKwkJCQkgICAwKQorCQlzbnIJCS0tIFNOUiBpbiB0aGUgbGluayB0byBSQSAoY3VycmVudGx5IHVudXNlZCwKKwkJCQkgICBkZWZhdWx0IGlzIDApCisKKwlUaGUgY29tbWFuZCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCisKK2Z3dF9kZWwKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYW4gZW50cnkgdG8gdGhlIEZXVCB0YWJsZS4gVGhlIGxpc3Qgb2YKKwlwYXJhbWV0ZXJzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisJCWl3cHJpdiBldGhYIGZ3dF9kZWwgZGEgcmEgW2Rpcl0KKworCXdoZXJlIHRoZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBhcmU6LQorCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCisJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKKwkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSwKKwkJCQkgICBkZWZhdWx0IGlzIDEpCisKKwlUaGUgY29tbWFuZCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCisKK2Z3dF9sb29rdXAKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGJlc3Qgcm91dGUgaW4gdGhlIEZXVCB0YWJsZSB0byBhIGdpdmVuCisJaG9zdC4gVGhlIG9ubHkgcGFyYW1ldGVyIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IGlzIGJlaW5nCisJbG9va2VkIGZvci4KKworCQlpd3ByaXYgZXRoWCBmd3RfbG9va3VwIGRhCisKKwl3aGVyZTotCisJCWRhCQktLSBEQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKKworCVRoZSBjb21tYW5kIHJldHVybnMgYW4gb3V0cHV0IHN0cmluZyBpZGVudGljYWwgdG8gdGhlIG9uZSByZXR1cm5lZCBieQorCWZ3dF9saXN0IGRlc2NyaWJlZCBiZWxvdy4KKworCitmd3RfbGlzdAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSByb3V0ZSBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CisJcGFyYW1ldGVyIGlzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZS4gSWYgeW91IHdhbnQgdG8gbGlzdCBhbGwgdGhlCisJcm91dGVzIGluIGEgdGFibGUsIHN0YXJ0IHdpdGggaW5kZXg9MCwgYW5kIGtlZXAgbGlzdGluZyB1bnRpbCB5b3UgZ2V0IGEKKwkiKG51bGwpIiBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIGluZGljaWVzIG1heSBjaGFuZ2UgYXMgdGhlIGZ3dCBpcworCXVwZGF0ZWQuICBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QgdXNlcnMgd2lsbCBub3QgdXNlIGZ3dF9saXN0IGRpcmVjdGx5LAorCWJ1dCB0aGF0IGEgdXRpbGl0eSBzaW1pbGFyIHRvIHRoZSB0cmFkaXRpb25hbCByb3V0ZSBjb21tYW5kIHdpbGwgYmUgdXNlZAorCXRvIGludm9rZSBmd3RfbGlzdCBvdmVyIGFuZCBvdmVyLgorCisJCWl3cHJpdiBldGhYIGZ3dF9saXN0IGluZGV4CisKKwlUaGUgb3V0cHV0IGlzIGEgc3RyaW5nIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKKworCQlkYSByYSBtZXRyaWMgZGlyIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24gc2xlZXBtb2RlIHNucgorCisJd2hlcmUgdGhlIGRpZmZlcmVudCBmaWVsZHMgYXJlOi0KKwkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQorCQlyYQkJLS0gUkEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCisJCW1ldHJpYwkJLS0gcm91dGUgbWV0cmljIChjb3N0OiBzbWFsbGVyLW1ldHJpYyByb3V0ZXMgYXJlIHByZWZlcnJlZCkKKwkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSkKKwkJc3NuCQktLSBTb3VyY2UgU2VxdWVuY2UgTnVtYmVyICh0aW1lIGF0IHRoZSBSQSBmb3IgcmV2ZXJzZSByb3V0ZXMpCisJCWRzbgkJLS0gRGVzdGluYXRpb24gU2VxdWVuY2UgTnVtYmVyICh0aW1lIGF0IHRoZSBEQSBmb3IgZGlyZWN0IHJvdXRlcykKKwkJaG9wY291bnQJLS0gaG9wIGNvdW50IChjdXJyZW50bHkgdW51c2VkKQorCQl0dGwJCS0tIFRUTCAob25seSB1c2VkIGluIHJldmVyc2UgZW50cmllcykKKwkJZXhwaXJhdGlvbgktLSBlbnRyeSBleHBpcmF0aW9uIChpbiB0aWNrcywgd2hlcmUgYSB0aWNrIGlzIDEwMjR1cywgb3IgfiAxbXMuIFVzZSAwIGZvciBhbiBpbmRlZmluaXRlIGVudHJ5KQorCQlzbGVlcG1vZGUJLS0gUkEncyBzbGVlcCBtb2RlIChjdXJyZW50bHkgdW51c2VkKQorCQlzbnIJCS0tIFNOUiBpbiB0aGUgbGluayB0byBSQSAoY3VycmVudGx5IHVudXNlZCkKKworZnd0X2xpc3Rfcm91dGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBsaXN0IGEgcm91dGUgZnJvbSB0aGUgRldUIHRhYmxlLiBUaGUgb25seQorCXBhcmFtZXRlciBpcyB0aGUgcm91dGUgSUQuIElmIHlvdSB3YW50IHRvIGxpc3QgYWxsIHRoZSByb3V0ZXMgaW4gYQorCXRhYmxlLCBzdGFydCB3aXRoIHJpZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgcmlkIHVudGlsIHlvdSBnZXQgYQorCSIobnVsbCkiIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGZ3dF9saXN0LiBUaGUgb25seQorCWRpZmZlcmVuY2UgaXMgdGhlIG91dHB1dCBmb3JtYXQuICBBbHNvIG5vdGUgdGhhdCB0aGlzIGNvbW1hbmQgaXMgbWVhbnQKKwlmb3IgZGVidWdnaW5nLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB1c2VycyB3aWxsIHVzZSBmd3RfbG9va3VwIGFuZAorCWZ3dF9saXN0LiAgT25lIGltcG9ydGFudCByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgcm91dGUgaWQgbWF5IGNoYW5nZQorCWFzIHRoZSByb3V0ZSB0YWJsZSBpcyBhbHRlcmVkLgorCisJCWl3cHJpdiBldGhYIGZ3dF9saXN0X3JvdXRlIHJpZAorCisJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKKwkJZGEgbWV0cmljIGRpciBuaWQgc3NuIGRzbiBob3Bjb3VudCB0dGwgZXhwaXJhdGlvbgorCisJd2hlcmUgdGhlIGRpZmZlcmVudCBmaWVsZHMgYXJlOi0KKwkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQorCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCisJCWRpcgkJLS0gZGlyZWN0aW9uICgxIGZvciBkaXJlY3QsIDAgZm9yIHJldmVyc2UpCisJCW5pZAkJLS0gTmV4dC1ob3AgKG5laWdoYm9yKSBob3N0IElEIChuaWQpCisJCXNzbgkJLS0gU291cmNlIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgUkEgZm9yIHJldmVyc2Ugcm91dGVzKQorCQlkc24JCS0tIERlc3RpbmF0aW9uIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgREEgZm9yIGRpcmVjdCByb3V0ZXMpCisJCWhvcGNvdW50CS0tIGhvcCBjb3VudCAoY3VycmVudGx5IHVudXNlZCkKKwkJdHRsCQktLSBUVEwgY291bnQgKG9ubHkgdXNlZCBpbiByZXZlcnNlIGVudHJpZXMpCisJCWV4cGlyYXRpb24JLS0gZW50cnkgZXhwaXJhdGlvbiAoaW4gdGlja3MsIHdoZXJlIGEgdGljayBpcyAxMDI0dXMsIG9yIH4gMW1zLiBVc2UgMCBmb3IgYW4gaW5kZWZpbml0ZSBlbnRyeSkKKworZnd0X2xpc3RfbmVpZ2gKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBsaXN0IGEgbmVpZ2hib3IgZnJvbSB0aGUgRldUIHRhYmxlLiBUaGUgb25seQorCXBhcmFtZXRlciBpcyB0aGUgbmVpZ2hib3IgSUQuIElmIHlvdSB3YW50IHRvIGxpc3QgYWxsIHRoZSBuZWlnaGJvcnMgaW4gYQorCXRhYmxlLCBzdGFydCB3aXRoIG5pZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgbmlkIHVudGlsIHlvdSBnZXQgYQorCSIobnVsbCkiIHN0cmluZy4gIE5vdGUgdGhhdCB0aGUgbmlkIGZyb20gYSBmd3RfbGlzdF9yb3V0ZSBjb21tYW5kIGNhbiBiZQorCXVzZWQgYXMgYW4gaW5wdXQgdG8gdGhpcyBjb21tYW5kLiAgQWxzbyBub3RlIHRoYXQgdGhpcyBjb21tYW5kIGlzIG1lYW50CisJbW9zdGx5IGZvciBkZWJ1Z2dpbmcuICBJdCBpcyBleHBlY3RlZCB0aGF0IHVzZXJzIHdpbGwgdXNlIGZ3dF9sb29rdXAuCisJT25lIGltcG9ydGFudCByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgbmVpZ2hib3IgaWQgbWF5IGNoYW5nZSBhcyB0aGUKKwluZWlnaGJvciB0YWJsZSBpcyBhbHRlcmVkLgorCisJCWl3cHJpdiBldGhYIGZ3dF9saXN0X25laWdoIG5pZAorCisJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKKwkJcmEgc2xlZXBtb2RlIHNuciByZWZlcmVuY2VzCisKKwl3aGVyZSB0aGUgZGlmZmVyZW50IGZpZWxkcyBhcmU6LQorCQlyYQkJLS0gUkEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCisJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQpCisJCXNucgkJLS0gU05SIGluIHRoZSBsaW5rIHRvIFJBIChjdXJyZW50bHkgdW51c2VkKQorCQlyZWZlcmVuY2VzCS0tIFJBJ3MgcmVmZXJlbmNlIGNvdW50ZXIKKworZnd0X3Jlc2V0CisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVzZXQgdGhlIEZXVCB0YWJsZSwgZ2V0dGluZyByaWQgb2YgYWxsIHRoZQorCWVudHJpZXMuIFRoZXJlIGFyZSBubyBpbnB1dCBwYXJhbWV0ZXJzLgorCisJCWl3cHJpdiBldGhYIGZ3dF9yZXNldAorCisJVGhlIGNvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorCitmd3RfY2xlYW51cAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHBlcmZvcm0gdXNlci1iYXNlZCBnYXJiYWdlIHJlY29sbGVjdGlvbi4gVGhlCisJRldUIHRhYmxlIGlzIGNoZWNrZWQsIGFuZCBhbGwgdGhlIGVudHJpZXMgdGhhdCBhcmUgZXhwaXJlZCBvciBpbnZhbGlkCisJYXJlIGNsZWFuZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGV4cG9ydGVkIHRvIHRoZSBkcml2ZXIgZm9yIGRlYnVnZ2luZworCXB1cnBvc2VzLCBhcyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgYWxzbyBmaXJlZCBieSB0aGUgZmlybXdhcmUgd2hlbiBpbgorCXNwYWNlIHByb2JsZW1zLiBUaGVyZSBhcmUgbm8gaW5wdXQgcGFyYW1ldGVycy4KKworCQlpd3ByaXYgZXRoWCBmd3RfY2xlYW51cAorCisJVGhlIGNvbW1hbmQgZG9lcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW52YWxpZC9leHBpcmVkIHJvdXRlcyBkZWxldGVkLgorCitmd3RfdGltZQorCVRoaXMgY29tbWFuZCByZXR1cm5zIGEgY2FyZCdzIGludGVybmFsIHRpbWUgcmVwcmVzZW50YXRpb24uICBJdCBpcyB0aGlzCisJdGltZSB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBleHBpcmF0aW9uIHRpbWVzIG9mIEZXVCBlbnRyaWVzLiAgVGhlCisJbnVtYmVyIGlzIG5vdCBjb25zaXN0ZW50IGZyb20gY2FyZCB0byBjYXJkOyBpdCBpcyBzaW1wbHkgYSB0aW1lciBjb3VudC4KKwlUaGUgZnd0X3RpbWUgY29tbWFuZCBpcyB1c2VkIHRvIGluc3BlY3QgdGhlIHRpbWVyIHNvIHRoYXQgZXhwaXJhdGlvbgorCXRpbWVzIHJlcG9ydGVkIGJ5IGZ3dF9saXN0IGNhbiBiZSBwcm9wZXJseSBpbnRlcnByZXRlZC4KKworCQlpd3ByaXYgZXRoWCBmd3RfdGltZQorCittZXNoX2dldF90dGwKKworCVRoZSBtZXNoIHR0bCBpcyB0aGUgbnVtYmVyIG9mIGhvcHMgYSBtZXNoIHBhY2tldCBjYW4gdHJhdmVyc2UgYmVmb3JlIGl0CisJaXMgZHJvcHBlZC4gIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcyBpbiB0aGUKKwltZXNoIG5ldHdvcmsuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdHRsIGFzc2lnbmVkCisJdG8gYWxsIG1lc2ggcGFja2V0cy4gIEN1cnJlbnRseSB0aGVyZSBpcyBubyB3YXkgdG8gY29udHJvbCB0aGUgdHRsIG9uIGEKKwlwZXIgcGFja2V0IG9yIHBlciBzb2NrZXQgYmFzaXMuCisKKwlpd3ByaXYgZXRoWCBtZXNoX2dldF90dGwKKworbWVzaF9zZXRfdHRsIHR0bAorCisJU2V0IHRoZSB0dGwuICBUaGUgYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS4KKworCWl3cHJpdiBldGhYIG1lc2hfc2V0X3R0bCA8dHRsPgorCis9PT09PT09PT09PT09PT09PT09PT09PT09CitFVEhUT09MCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKworVXNlIHRoZSAtaSBvcHRpb24gdG8gcmV0cmlldmUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkcml2ZXIuCisKKyMgZXRodG9vbCAtaSBldGgwCitkcml2ZXI6IGxpYmVydGFzCit2ZXJzaW9uOiBDT01NLVVTQjgzODgtMzE4LnA0CitmaXJtd2FyZS12ZXJzaW9uOiA1LjExMC43CitidXMtaW5mbzoKKworVXNlIHRoZSAtZSBvcHRpb24gdG8gcmVhZCB0aGUgRUVQUk9NIGNvbnRlbnRzIG9mIHRoZSBjYXJkLgorCisJVXNhZ2U6CisJZXRodG9vbCAtZSBldGhYIFtyYXcgb258b2ZmXSBbb2Zmc2V0IE5dIFtsZW5ndGggTl0KKworICAgICAgIC1lICAgICByZXRyaWV2ZXMgYW5kIHByaW50cyBhbiBFRVBST00gZHVtcCBmb3IgdGhlICBzcGVjaWZpZWQgIGV0aGVybmV0CisgICAgICAgICAgICAgIGRldmljZS4gICBXaGVuIHJhdyBpcyBlbmFibGVkLCB0aGVuIGl0IGR1bXBzIHRoZSByYXcgRUVQUk9NIGRhdGEKKyAgICAgICAgICAgICAgdG8gc3Rkb3V0LiBUaGUgbGVuZ3RoIGFuZCBvZmZzZXQgcGFyYW1ldGVycyBhbGxvdyAgZHVtcGluZyAgY2VyLQorICAgICAgICAgICAgICB0YWluIHBvcnRpb25zIG9mIHRoZSBFRVBST00uICBEZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBFRVAtCisgICAgICAgICAgICAgIFJPTS4KKworIyBldGh0b29sIC1lIGV0aDAgb2Zmc2V0IDAgbGVuZ3RoIDE2CitPZmZzZXQgICAgICAgICAgVmFsdWVzCistLS0tLS0gICAgICAgICAgLS0tLS0tCisweDAwMDAgICAgICAgICAgMzggMzMgMzAgNTggMDAgMDAgMzQgZjQgMDAgMDAgMTAgMDAgMDAgYzQgMTcgMDAKKworPT09PT09PT09PT09PT09PT09PT09PT09CitERUJVR0ZTIENPTU1BTkRTCis9PT09PT09PT09PT09PT09PT09PT09PT0KKwordGhvc2UgY29tbWFuZHMgYXJlIHVzZWQgdmlhIGRlYnVnZnMgaW50ZXJmYWNlCisKKz09PT09PT09PT09CityZG1hYworcmRiYnAKK3JkcmYKKwlUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byByZWFkIHRoZSBNQUMsIEJCUCBhbmQgUkYgcmVnaXN0ZXJzIGZyb20gdGhlCisJY2FyZC4gIFRoZXNlIGNvbW1hbmRzIHRha2Ugb25lIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgb2Zmc2V0CisJbG9jYXRpb24gdGhhdCBpcyB0byBiZSByZWFkLiAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQgaW4KKwloZXhhZGVjaW1hbCAoaXRzIHBvc3NpYmxlIHRvIHByZWNlZWQgcHJlY2VkaW5nIHRoZSBudW1iZXIgd2l0aCBhICIweCIpLgorCisJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC9yZWdpc3RlcnMvCisKKwlVc2FnZToKKwkJZWNobyAiMHhhMTIzIiA+IHJkbWFjIDsgY2F0IHJkbWFjCisJCWVjaG8gIjB4YTEyMyIgPiByZGJicCA7IGNhdCByZGJicAorCQllY2hvICIweGExMjMiID4gcmRyZiA7IGNhdCByZHJmCit3cm1hYword3JiYnAKK3dycmYKKwlUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byB3cml0ZSB0aGUgTUFDLCBCQlAgYW5kIFJGIHJlZ2lzdGVycyBpbiB0aGUKKwljYXJkLiAgVGhlc2UgY29tbWFuZHMgdGFrZSB0d28gcGFyYW1ldGVycyB0aGF0IHNwZWNpZnkgdGhlIG9mZnNldAorCWxvY2F0aW9uIGFuZCB0aGUgdmFsdWUgdGhhdCBpcyB0byBiZSB3cml0dGVuLiBUaGlzIHBhcmFtZXRlcnMgbXVzdAorCWJlIHNwZWNpZmllZCBpbiBoZXhhZGVjaW1hbCAoaXRzIHBvc3NpYmxlIHRvIHByZWNlZWQgdGhlIG51bWJlcgorCXdpdGggYSAiMHgiKS4KKworCVVzYWdlOgorCQllY2hvICIweGExMjMgMHhhYSIgPiB3cm1hYworCQllY2hvICIweGExMjMgMHhhYSIgPiB3cmJicAorCQllY2hvICIweGExMjMgMHhhYSIgPiB3cnJmCisKK3NsZWVwcGFyYW1zCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBzbGVlcGNsb2NrIGNvbmZpZ3VyYXRpb25zCisKKwlQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLworCisJVXNhZ2U6CisJCWNhdCBzbGVlcHBhcmFtczogcmVhZHMgdGhlIGN1cnJlbnQgc2xlZXBjbG9jayBjb25maWd1cmF0aW9uCisKKwkJZWNobyAicDEgcDIgcDMgcDQgcDUgcDYiID4gc2xlZXBwYXJhbXM6IHdyaXRlcyB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9uLgorCisJCXdoZXJlOgorCQkJcDEgaXMgU2xlZXAgY2xvY2sgZXJyb3IgaW4gcHBtICgwLTY1NTM1KQorCQkJcDIgaXMgV2FrZXVwIG9mZnNldCBpbiB1c2VjICgwLTY1NTM1KQorCQkJcDMgaXMgQ2xvY2sgc3RhYmlsaXphdGlvbiB0aW1lIGluIHVzZWMgKDAtNjU1MzUpCisJCQlwNCBpcyBDb250cm9sIHBlcmlvZGljIGNhbGlicmF0aW9uICgwLTIpCisJCQlwNSBpcyBDb250cm9sIHRoZSB1c2Ugb2YgZXh0ZXJuYWwgc2xlZXAgY2xvY2sgKDAtMikKKwkJCXA2IGlzIHJlc2VydmVkIGZvciBkZWJ1ZyAoMC02NTUzNSkKKworc3Vic2NyaWJlZF9ldmVudHMKKworCVRoZSBzdWJzY3JpYmVkX2V2ZW50cyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGludGVyZmFjZSBmb3IgdGhlCisJc3Vic2NyaWJlZCBldmVudHMgQVBJLgorCisJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC9zdWJzY3JpYmVkX2V2ZW50cy8KKworCUVhY2ggZXZlbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSBmaWxlbmFtZS4gRWFjaCBmaWxlbmFtZSBjb25zaXN0cyBvZiB0aGUKKwlmb2xsb3dpbmcgdGhyZWUgZmllbGRzOgorCVZhbHVlIEZyZXF1ZW5jeSBTdWJzY3JpYmVkCisKKwlUbyByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBmb3IgYSBnaXZlbiBldmVudCwgZG86CisJCWNhdCBldmVudAorCVRvIHNldCB0aGUgY3VycmVudCB2YWx1ZXMsIGRvOgorCQllY2hvICI2MCAyIDEiID4gZXZlbnQKKworCUZyZXF1ZW5jeSBmaWVsZCBzcGVjaWZpZXMgdGhlIHJlcG9ydGluZyBmcmVxdWVuY3kgZm9yIHRoaXMgZXZlbnQuCisJSWYgaXQgaXMgc2V0IHRvIDAsIHRoZW4gdGhlIGV2ZW50IGlzIHJlcG9ydGVkIG9ubHkgb25jZSwgYW5kIHRoZW4KKwlhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlZC4gSWYgaXQgaXMgc2V0IHRvIDEsIHRoZW4gdGhlIGV2ZW50IGlzCisJcmVwb3J0ZWQgZXZlcnkgdGltZSBpdCBvY2N1cnMuIElmIGl0IGlzIHNldCB0byBOLCB0aGVuIHRoZSBldmVudCBpcworCXJlcG9ydGVkIGV2ZXJ5IE50aCB0aW1lIGl0IG9jY3Vycy4KKworCWJlYWNvbl9taXNzZWQKKwlWYWx1ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBtaXNzaW5nIGJlYWNvbnMgd2hpY2gKKwl0cmlnZ2VycyB0aGUgTElOS19MT1NTIGV2ZW50LiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgYWZ0ZXIKKwl3aGljaCB0aGUgZmlybXdhcmUgcmVzZXRzIGl0cyBzdGF0ZS4gQXQgaW5pdGlhbGl6YXRpb24sIHRoZSBMSU5LX0xPU1MKKwlldmVudCBpcyBzdWJzY3JpYmVkIGJ5IGRlZmF1bHQuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIE1pc3NlZEJlYWNvbnMgaXMKKwk2MC4KKworCWZhaWx1cmVfY291bnQKKwlWYWx1ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIGNvbnNlY3V0aXZlIGZhaWx1cmUgY291bnQgdGhyZXNob2xkIHdoaWNoCisJdHJpZ2dlcnMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE1BWF9GQUlMIGV2ZW50LiBPbmNlIHRoaXMgZXZlbnQgaXMKKwlnZW5lcmF0ZWQsIHRoZSBjb25zZWN1dGl2ZSBmYWlsdXJlIGNvdW50IGlzIHJlc2V0IHRvIDAuCisJQXQgaW5pdGlhbGl6YXRpb24sIHRoZSBNQVhfRkFJTCBldmVudCBpcyBOT1Qgc3Vic2NyaWJlZCBieQorCWRlZmF1bHQuCisKKwloaWdoX3Jzc2kKKwlUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBhdmVyYWdlIHJlY2VpdmVkIFJTU0kgaW4gYmVhY29ucyBnb2VzCisJYWJvdmUgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KKworCWxvd19yc3NpCisJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcworCWJlbG93IGEgdGhyZXNob2xkLCBzcGVjaWZpZWQgYnkgVmFsdWUuCisKKwloaWdoX3NucgorCVRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQgU05SIGluIGJlYWNvbnMgZ29lcworCWFib3ZlIGEgdGhyZXNob2xkLCBzcGVjaWZpZWQgYnkgVmFsdWUuCisKKwlsb3dfc25yCisJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBTTlIgaW4gYmVhY29ucyBnb2VzCisJYmVsb3cgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KKworZXh0c2NhbgorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGRvIGEgc3BlY2lmaWMgc2Nhbi4KKworCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCisKKwlVc2FnZTogZWNobyAiU1NJRCIgPiBleHRzY2FuCisKKwlFeGFtcGxlOgorCQllY2hvICJMSU5LU1lTLUFQIiA+IGV4dHNjYW4KKworCVRvIHNlZSB0aGUgcmVzdWx0cyBvZiB1c2UgZ2V0c2NhbnRhYmxlIGNvbW1hbmQuCisKK2dldHNjYW50YWJsZQorCisJRGlzcGxheSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZHJpdmVyIHNjYW4gdGFibGUgKGllLiBnZXQgdGhlCisJc2NhbiByZXN1bHRzKS4KKworCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCisKKwlVc2FnZToKKwkJY2F0IGdldHNjYW50YWJsZQorCitzZXR1c2Vyc2NhbgorCUluaXRpYXRlIGEgY3VzdG9taXplZCBzY2FuIGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0cworCisKKwlQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLworCisgICAgVXNhZ2U6CisgICAgICAgZWNobyAiW0FSR1NdIiA+IHNldHVzZXJzY2FuCisKKyAgICAgICAgIHdoZXJlIFtBUkdTXToKKworICAgICAgY2hhbj1bY2hhbiNdW2JhbmRdW21vZGVdIHdoZXJlIGJhbmQgaXMgW2EsYixnXSBhbmQgbW9kZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rIGZvciBhY3RpdmUgb3IgJ3AnIGZvciBwYXNzaXZlCisgICAgICBic3NpZD14eDp4eDp4eDp4eDp4eDp4eCAgc3BlY2lmeSBhIEJTU0lEIGZpbHRlciBmb3IgdGhlIHNjYW4KKyAgICAgIHNzaWQ9IltTU0lEXSIgICAgICAgICAgICBzcGVjaWZ5IGEgU1NJRCBmaWx0ZXIgZm9yIHRoZSBzY2FuCisgICAgICBrZWVwPVswIG9yIDFdICAgICAgICAgICAga2VlcCB0aGUgcHJldmlvdXMgc2NhbiByZXN1bHRzICgxKSwgZGlzY2FyZCAoMCkKKyAgICAgIGR1cj1bc2NhbiB0aW1lXSAgICAgICAgICB0aW1lIHRvIHNjYW4gZm9yIGVhY2ggY2hhbm5lbCBpbiBtaWxsaXNlY29uZHMKKyAgICAgIHByb2Jlcz1bI10gICAgICAgICAgICAgICBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgdG8gc2VuZCBvbiBlYWNoIGNoYW4KKyAgICAgIHR5cGU9WzEsMiwzXSAgICAgICAgICAgICBCU1MgdHlwZTogMSAoSW5mcmEpLCAyKEFkaG9jKSwgMyhBbnkpCisKKyAgICBBbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIGFyZ3VtZW50cyBjYW4gYmUgc3VwcGxpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgIElmIHRoZSBjaGFuIHRva2VuIGlzIGFic2VudCwgYSBmdWxsIGNoYW5uZWwgc2NhbiB3aWxsIGJlIGNvbXBsZXRlZCBieQorICAgICAgdGhlIGRyaXZlci4gIElmIHRoZSBkdXIgb3IgcHJvYmVzIHRva2VucyBhcmUgYWJzZW50LCB0aGUgZHJpdmVyIGRlZmF1bHQKKyAgICAgIHNldHRpbmcgd2lsbCBiZSB1c2VkLiAgVGhlIGJzc2lkIGFuZCBzc2lkIGZpZWxkcywgaWYgYmxhbmssCisgICAgICB3aWxsIHByb2R1Y2UgYW4gdW5maWx0ZXJlZCBzY2FuLiBUaGUgdHlwZSBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gMyAoQW55KQorICAgICAgYW5kIHRoZSBrZWVwIGZpZWxkIHdpbGwgZGVmYXVsdCB0byAwIChEaXNjYXJkKS4KKworICAgIEV4YW1wbGVzOgorICAgIDEpIFBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gb24gY2hhbm5lbHMgMSwgNiwgYW5kIDExIGluIHRoZSAnZycgYmFuZDoKKyAgICAgICAgICAgIGVjaG8gImNoYW49MWcsNmcsMTFnIiA+IHNldHVzZXJzY2FuCisKKyAgICAyKSBQZXJmb3JtIGEgcGFzc2l2ZSBzY2FuIG9uIGNoYW5uZWwgMTEgZm9yIDIwIG1zOgorICAgICAgICAgICAgZWNobyAiY2hhbj0xMWdwIGR1cj0yMCIgPiBzZXR1c2Vyc2NhbgorCisgICAgMykgUGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBvbiBjaGFubmVscyAxLCA2LCBhbmQgMTE7IGFuZCBhIHBhc3NpdmUgc2NhbiBvbgorICAgICAgIGNoYW5uZWwgMzYgaW4gdGhlICdhJyBiYW5kOgorCisgICAgICAgICAgICBlY2hvICJjaGFuPTFnLDZnLDExZywzNmFwIiA+IHNldHVzZXJzY2FuCisKKyAgICA0KSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWwgNiBhbmQgMzYgZm9yIGEgc3BlY2lmaWMgU1NJRDoKKyAgICAgICAgICAgIGVjaG8gImNoYW49NmcsMzZhIHNzaWQ9IlRlc3RBUCIiID4gc2V0dXNlcnNjYW4KKworICAgIDUpIFNjYW4gYWxsIGF2YWlsYWJsZSBjaGFubmVscyAoQi9HLCBBIGJhbmRzKSBmb3IgYSBzcGVjaWZpYyBCU1NJRCwga2VlcAorICAgICAgIHRoZSBjdXJyZW50IHNjYW4gdGFibGUgaW50YWN0LCB1cGRhdGUgZXhpc3Rpbmcgb3IgYXBwZW5kIG5ldyBzY2FuIGRhdGE6CisgICAgICAgICAgICBlY2hvICJic3NpZD0wMDo1MDo0MzoyMDoxMjo4MiBrZWVwPTEiID4gc2V0dXNlcnNjYW4KKworICAgIDYpIFNjYW4gY2hhbm5lbCA2LCBmb3IgYWxsIGluZnJhc3RydWN0dXJlIG5ldHdvcmtzLCBzZW5kaW5nIHR3byBwcm9iZQorICAgICAgIHJlcXVlc3RzLiAgS2VlcCB0aGUgcHJldmlvdXMgc2NhbiB0YWJsZSBpbnRhY3QuIFVwZGF0ZSBhbnkgZHVwbGljYXRlCisgICAgICAgQlNTSUQvU1NJRCBtYXRjaGVzIHdpdGggdGhlIG5ldyBzY2FuIGRhdGE6CisgICAgICAgICAgICBlY2hvICJjaGFuPTZnIHR5cGU9MSBwcm9iZXM9MiBrZWVwPTEiID4gc2V0dXNlcnNjYW4KKworICAgIEFsbCBlbnRyaWVzIGluIHRoZSBzY2FuIHRhYmxlIChub3QganVzdCB0aGUgbmV3IHNjYW4gZGF0YSB3aGVuIGtlZXA9MSkKKyAgICB3aWxsIGJlIGRpc3BsYXllZCB1cG9uIGNvbXBsZXRpb24gYnkgdXNlIG9mIHRoZSBnZXRzY2FudGFibGUgaW9jdGwuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvYXNzb2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YzdmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgorCisjaW5jbHVkZSAiYXNzb2MuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImhvc3RjbWQuaCIKKyNpbmNsdWRlICJob3N0LmgiCisKKworc3RhdGljIGNvbnN0IHU4IGJzc2lkX2FueVtFVEhfQUxFTl0gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKK3N0YXRpYyBjb25zdCB1OCBic3NpZF9vZmZbRVRIX0FMRU5dID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX2Vzc2lkKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJOZXcgU1NJRCByZXF1ZXN0ZWQ6ICVzXG4iLCBhc3NvY19yZXEtPnNzaWQuc3NpZCk7CisJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJaWYgKGFkYXB0ZXItPnByZXNjYW4pIHsKKwkJCWxpYmVydGFzX3NlbmRfc3BlY2lmaWNfU1NJRF9zY2FuKHByaXYsICZhc3NvY19yZXEtPnNzaWQsIDEpOworCQl9CisKKwkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsICZhc3NvY19yZXEtPnNzaWQsCisJCQkJTlVMTCwgd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKTsKKwkJaWYgKGkgPj0gMCkgeworCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgIlNTSUQgZm91bmQgaW4gc2NhbiBsaXN0IC4uLiBhc3NvY2lhdGluZy4uLlxuIik7CisKKwkJCXJldCA9IHdsYW5fYXNzb2NpYXRlKHByaXYsICZhZGFwdGVyLT5zY2FudGFibGVbaV0pOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJbWVtY3B5KCZhc3NvY19yZXEtPmJzc2lkLAorCQkJCSAgICAgICAmYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3MsCisJCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCAnJXMnIG5vdCBmb3VuZDsgY2Fubm90IGFzc29jaWF0ZVxuIiwKKwkJCQlhc3NvY19yZXEtPnNzaWQuc3NpZCk7CisJCX0KKwl9IGVsc2UgaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkvKiBTY2FuIGZvciB0aGUgbmV0d29yaywgZG8gbm90IHNhdmUgcHJldmlvdXMgcmVzdWx0cy4gIFN0YWxlCisJCSAqICAgc2NhbiBkYXRhIHdpbGwgY2F1c2UgdXMgdG8gam9pbiBhIG5vbi1leGlzdGFudCBhZGhvYyBuZXR3b3JrCisJCSAqLworCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmYXNzb2NfcmVxLT5zc2lkLCAwKTsKKworCQkvKiBTZWFyY2ggZm9yIHRoZSByZXF1ZXN0ZWQgU1NJRCBpbiB0aGUgc2NhbiB0YWJsZSAqLworCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwgJmFzc29jX3JlcS0+c3NpZCwgTlVMTCwKKwkJCQl3bGFuODAyXzExaWJzcyk7CisJCWlmIChpID49IDApIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCBmb3VuZCBhdCAlZCBpbiBMaXN0LCBzbyBqb2luXG4iLCByZXQpOworCQkJbGliZXJ0YXNfam9pbl9hZGhvY19uZXR3b3JrKHByaXYsICZhZGFwdGVyLT5zY2FudGFibGVbaV0pOworCQl9IGVsc2UgeworCQkJLyogZWxzZSBzZW5kIFNUQVJUIGNvbW1hbmQgKi8KKwkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCBub3QgZm91bmQgaW4gbGlzdCwgc28gY3JlYXRpbmcgYWRob2MiCisJCQkJIiB3aXRoIFNTSUQgJyVzJ1xuIiwgYXNzb2NfcmVxLT5zc2lkLnNzaWQpOworCQkJbGliZXJ0YXNfc3RhcnRfYWRob2NfbmV0d29yayhwcml2LCAmYXNzb2NfcmVxLT5zc2lkKTsKKwkJfQorCQltZW1jcHkoJmFzc29jX3JlcS0+YnNzaWQsICZhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhc3NvY19oZWxwZXJfYnNzaWQod2xhbl9wcml2YXRlICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgaSwgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBXQVA6IEJTU0lEID0gIiBNQUNfRk1UICJcbiIsCisJCU1BQ19BUkcoYXNzb2NfcmVxLT5ic3NpZCkpOworCisJLyogU2VhcmNoIGZvciBpbmRleCBwb3NpdGlvbiBpbiBsaXN0IGZvciByZXF1ZXN0ZWQgTUFDICovCisJaSA9IGxpYmVydGFzX2ZpbmRfQlNTSURfaW5fbGlzdChhZGFwdGVyLCBhc3NvY19yZXEtPmJzc2lkLAorCQkJICAgIGFzc29jX3JlcS0+bW9kZSk7CisJaWYgKGkgPCAwKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IFdBUDogQlNTSUQgIiBNQUNfRk1UICIgbm90IGZvdW5kLCAiCisJCQkiY2Fubm90IGFzc29jaWF0ZS5cbiIsIE1BQ19BUkcoYXNzb2NfcmVxLT5ic3NpZCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXNzb2NfcmVxLT5tb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworCQlyZXQgPSB3bGFuX2Fzc29jaWF0ZShwcml2LCAmYWRhcHRlci0+c2NhbnRhYmxlW2ldKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJBU1NPQzogcmV0dXJuIGZyb20gd2xhbl9hc3NvY2lhdGUoYnNzZCkgd2FzICVkXG4iLCByZXQpOworCX0gZWxzZSBpZiAoYXNzb2NfcmVxLT5tb2RlID09IHdsYW44MDJfMTFpYnNzKSB7CisJCWxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayhwcml2LCAmYWRhcHRlci0+c2NhbnRhYmxlW2ldKTsKKwl9CisJbWVtY3B5KCZhc3NvY19yZXEtPnNzaWQsICZhZGFwdGVyLT5zY2FudGFibGVbaV0uc3NpZCwKKwkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhc3NvY19oZWxwZXJfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwlpbnQgcmV0ID0gMCwgZG9uZSA9IDA7CisKKwkvKiBJZiB3ZSdyZSBnaXZlbiBhbmQgJ2FueScgQlNTSUQsIHRyeSBhc3NvY2lhdGluZyBiYXNlZCBvbiBTU0lEICovCisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWlmIChtZW1jbXAoYnNzaWRfYW55LCBhc3NvY19yZXEtPmJzc2lkLCBFVEhfQUxFTikKKwkJICAgICYmIG1lbWNtcChic3NpZF9vZmYsIGFzc29jX3JlcS0+YnNzaWQsIEVUSF9BTEVOKSkgeworCQkJcmV0ID0gYXNzb2NfaGVscGVyX2Jzc2lkKHByaXYsIGFzc29jX3JlcSk7CisJCQlkb25lID0gMTsKKwkJCWlmIChyZXQpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBic3NpZDogcmV0ID0gJWRcbiIsIHJldCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWRvbmUgJiYgdGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJcmV0ID0gYXNzb2NfaGVscGVyX2Vzc2lkKHByaXYsIGFzc29jX3JlcSk7CisJCWlmIChyZXQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IGJzc2lkOiByZXQgPSAlZFxuIiwgcmV0KTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhc3NvY19oZWxwZXJfbW9kZSh3bGFuX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBhZGFwdGVyLT5pbmZyYW1vZGUpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikKKwkJCWxpYmVydGFzX3BzX3dha2V1cChwcml2LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3ApOworCQlhZGFwdGVyLT5wc21vZGUgPSB3bGFuODAyXzExcG93ZXJtb2RlY2FtOworCX0KKworCWFkYXB0ZXItPmluZnJhbW9kZSA9IGFzc29jX3JlcS0+bW9kZTsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUsCisJCQkJICAgICh2b2lkICopIGFzc29jX3JlcS0+bW9kZSk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhc3NvY19oZWxwZXJfd2VwX2tleXMod2xhbl9wcml2YXRlICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwkvKiBTZXQgb3IgcmVtb3ZlIFdFUCBrZXlzICovCisJaWYgKCAgIGFzc29jX3JlcS0+d2VwX2tleXNbMF0ubGVuCisJICAgIHx8IGFzc29jX3JlcS0+d2VwX2tleXNbMV0ubGVuCisJICAgIHx8IGFzc29jX3JlcS0+d2VwX2tleXNbMl0ubGVuCisJICAgIHx8IGFzc29jX3JlcS0+d2VwX2tleXNbM10ubGVuKSB7CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9zZXRfd2VwLAorCQkJCQkgICAgY21kX2FjdF9hZGQsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCSAgICAwLCBhc3NvY19yZXEpOworCX0gZWxzZSB7CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9zZXRfd2VwLAorCQkJCQkgICAgY21kX2FjdF9yZW1vdmUsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCSAgICAwLCBOVUxMKTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIGVuYWJsZS9kaXNhYmxlIHRoZSBNQUMncyBXRVAgcGFja2V0IGZpbHRlciAqLworCWlmIChhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKQorCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyIHw9IGNtZF9hY3RfbWFjX3dlcF9lbmFibGU7CisJZWxzZQorCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9IH5jbWRfYWN0X21hY193ZXBfZW5hYmxlOworCXJldCA9IGxpYmVydGFzX3NldF9tYWNfcGFja2V0X2ZpbHRlcihwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCisJLyogQ29weSBXRVAga2V5cyBpbnRvIGFkYXB0ZXIgd2VwIGtleSBmaWVsZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCW1lbWNweSgmYWRhcHRlci0+d2VwX2tleXNbaV0sICZhc3NvY19yZXEtPndlcF9rZXlzW2ldLAorCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkpKTsKKwl9CisJYWRhcHRlci0+d2VwX3R4X2tleWlkeCA9IGFzc29jX3JlcS0+d2VwX3R4X2tleWlkeDsKKworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX3NlY2luZm8od2xhbl9wcml2YXRlICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCW1lbWNweSgmYWRhcHRlci0+c2VjaW5mbywgJmFzc29jX3JlcS0+c2VjaW5mbywKKwkJc2l6ZW9mKHN0cnVjdCB3bGFuXzgwMl8xMV9zZWN1cml0eSkpOworCisJcmV0ID0gbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHByaXYpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX3dwYV9rZXlzKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQoreworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCS8qIGVuYWJsZS9EaXNhYmxlIFJTTiAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfODAyXzExX2VuYWJsZV9yc24sCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIDAsIGFzc29jX3JlcSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9rZXlfbWF0ZXJpYWwsCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIDAsIGFzc29jX3JlcSk7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBhc3NvY19oZWxwZXJfd3BhX2llKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCB8fCBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKKwkJbWVtY3B5KCZhZGFwdGVyLT53cGFfaWUsICZhc3NvY19yZXEtPndwYV9pZSwgYXNzb2NfcmVxLT53cGFfaWVfbGVuKTsKKwkJYWRhcHRlci0+d3BhX2llX2xlbiA9IGFzc29jX3JlcS0+d3BhX2llX2xlbjsKKwl9IGVsc2UgeworCQltZW1zZXQoJmFkYXB0ZXItPndwYV9pZSwgMCwgTUFYX1dQQV9JRV9MRU4pOworCQlhZGFwdGVyLT53cGFfaWVfbGVuID0gMDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBzaG91bGRfZGVhdXRoX2luZnJhc3RydWN0dXJlKHdsYW5fYWRhcHRlciAqYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgIT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIG5ldyBTU0lEIGluICIKKwkJCSIgY29uZmlndXJhdGlvbiByZXF1ZXN0LlxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpZiAoYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSAhPQorCQkgICAgYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIHVwZGF0ZWQgc2VjdXJpdHkgIgorCQkJCSJpbmZvIGluIGNvbmZpZ3VyYXRpb24gcmVxdWVzdC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRGVhdXRoZW50aWNhdGluZyBkdWUgdG8gbmV3IEJTU0lEIGluICIKKwkJCSIgY29uZmlndXJhdGlvbiByZXF1ZXN0LlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIEZJWE1FOiBkZWFsIHdpdGggJ2F1dG8nIG1vZGUgc29tZWhvdyAqLworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpZiAoYXNzb2NfcmVxLT5tb2RlICE9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2hvdWxkX3N0b3BfYWRob2Mod2xhbl9hZGFwdGVyICphZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgIT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoICE9IGFzc29jX3JlcS0+c3NpZC5zc2lkbGVuZ3RoKQorCQlyZXR1cm4gMTsKKwlpZiAobWVtY21wKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQsIGFzc29jX3JlcS0+c3NpZC5zc2lkLAorCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSkpCisJCXJldHVybiAxOworCisJLyogRklYTUU6IGRlYWwgd2l0aCAnYXV0bycgbW9kZSBzb21laG93ICovCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWlmIChhc3NvY19yZXEtPm1vZGUgIT0gd2xhbjgwMl8xMWlic3MpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIHdsYW5fYXNzb2NpYXRpb25fd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgd2xhbl9wcml2YXRlLCBhc3NvY193b3JrLndvcmspOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBmaW5kX2FueV9zc2lkID0gMDsKKworCUVOVEVSKCk7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhc3NvY19yZXEgPSBhZGFwdGVyLT5hc3NvY19yZXE7CisJYWRhcHRlci0+YXNzb2NfcmVxID0gTlVMTDsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJaWYgKCFhc3NvY19yZXEpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IHN0YXJ0aW5nIG5ldyBhc3NvY2lhdGlvbiByZXF1ZXN0OiBmbGFncyA9IDB4JWxYXG4iLAorCQlhc3NvY19yZXEtPmZsYWdzKTsKKworCS8qIElmICdhbnknIFNTSUQgd2FzIHNwZWNpZmllZCwgZmluZCBhbiBTU0lEIHRvIGFzc29jaWF0ZSB3aXRoICovCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpCisJICAgICYmICFhc3NvY19yZXEtPnNzaWQuc3NpZGxlbmd0aCkKKwkJZmluZF9hbnlfc3NpZCA9IDE7CisKKwkvKiBCdXQgZG9uJ3QgdXNlICdhbnknIFNTSUQgaWYgdGhlcmUncyBhIHZhbGlkIGxvY2tlZCBCU1NJRCB0byB1c2UgKi8KKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWlmIChtZW1jbXAoJmFzc29jX3JlcS0+YnNzaWQsIGJzc2lkX2FueSwgRVRIX0FMRU4pCisJCSAgICAmJiBtZW1jbXAoJmFzc29jX3JlcS0+YnNzaWQsIGJzc2lkX29mZiwgRVRIX0FMRU4pKQorCQkJZmluZF9hbnlfc3NpZCA9IDA7CisJfQorCisJaWYgKGZpbmRfYW55X3NzaWQpIHsKKwkJZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG5ld19tb2RlOworCisJCXJldCA9IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQocHJpdiwgJmFzc29jX3JlcS0+c3NpZCwKKwkJCQlhc3NvY19yZXEtPm1vZGUsICZuZXdfbW9kZSk7CisJCWlmIChyZXQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ291bGQgbm90IGZpbmQgYmVzdCBuZXR3b3JrXG4iKTsKKwkJCXJldCA9IC1FTkVUVU5SRUFDSDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogRW5zdXJlIHdlIHN3aXRjaCB0byB0aGUgbW9kZSBvZiB0aGUgQVAgKi8KKwkJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExYXV0b3Vua25vd24pIHsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCQlhc3NvY19yZXEtPm1vZGUgPSBuZXdfbW9kZTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgY2hhbmdpbmcgcmVxdWlyZSBkZWF1dGhlbnRpY2F0aW9uCisJICogZnJvbSB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgaW5mcmFzdHJ1Y3R1cmUgYWNjZXNzIHBvaW50LgorCSAqLworCWlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKSB7CisJCWlmIChzaG91bGRfZGVhdXRoX2luZnJhc3RydWN0dXJlKGFkYXB0ZXIsIGFzc29jX3JlcSkpIHsKKwkJCXJldCA9IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aGVudGljYXRpb24gZHVlIHRvIG5ldyAiCisJCQkJCSJjb25maWd1cmF0aW9uIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpYnNzKSB7CisJCWlmIChzaG91bGRfc3RvcF9hZGhvYyhhZGFwdGVyLCBhc3NvY19yZXEpKSB7CisJCQlyZXQgPSBsaWJlcnRhc19zdG9wX2FkaG9jX25ldHdvcmsocHJpdik7CisJCQlpZiAocmV0KSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsICJUZWFyZG93biBvZiBBZEhvYyBuZXR3b3JrIGR1ZSB0byAiCisJCQkJCSJuZXcgY29uZmlndXJhdGlvbiByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCisJCQkJCXJldCk7CisJCQl9CisKKwkJfQorCX0KKworCS8qIFNlbmQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBiaXRzIHRvIHRoZSBmaXJtd2FyZSAqLworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlyZXQgPSBhc3NvY19oZWxwZXJfbW9kZShwcml2LCBhc3NvY19yZXEpOworCQlpZiAocmV0KSB7CitsYnNfcHJfZGVidWcoMSwgIkFTU09DKDolZCkgbW9kZTogcmV0ID0gJWRcbiIsIF9fTElORV9fLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoICAgdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfS0VZUywgJmFzc29jX3JlcS0+ZmxhZ3MpCisJICAgIHx8IHRlc3RfYml0KEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCXJldCA9IGFzc29jX2hlbHBlcl93ZXBfa2V5cyhwcml2LCBhc3NvY19yZXEpOworCQlpZiAocmV0KSB7CitsYnNfcHJfZGVidWcoMSwgIkFTU09DKDolZCkgd2VwX2tleXM6IHJldCA9ICVkXG4iLCBfX0xJTkVfXywgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCXJldCA9IGFzc29jX2hlbHBlcl9zZWNpbmZvKHByaXYsIGFzc29jX3JlcSk7CisJCWlmIChyZXQpIHsKK2xic19wcl9kZWJ1ZygxLCAiQVNTT0MoOiVkKSBzZWNpbmZvOiByZXQgPSAlZFxuIiwgX19MSU5FX18sIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9JRSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCXJldCA9IGFzc29jX2hlbHBlcl93cGFfaWUocHJpdiwgYXNzb2NfcmVxKTsKKwkJaWYgKHJldCkgeworbGJzX3ByX2RlYnVnKDEsICJBU1NPQyg6JWQpIHdwYV9pZTogcmV0ID0gJWRcbiIsIF9fTElORV9fLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncykKKwkgICAgfHwgdGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJcmV0ID0gYXNzb2NfaGVscGVyX3dwYV9rZXlzKHByaXYsIGFzc29jX3JlcSk7CisJCWlmIChyZXQpIHsKK2xic19wcl9kZWJ1ZygxLCAiQVNTT0MoOiVkKSB3cGFfa2V5czogcmV0ID0gJWRcbiIsIF9fTElORV9fLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBTU0lEL0JTU0lEIHNob3VsZCBiZSB0aGUgX2xhc3RfIGNvbmZpZyBvcHRpb24gc2V0LCBiZWNhdXNlIHRoZXkKKwkgKiB0cmlnZ2VyIHRoZSBhc3NvY2lhdGlvbiBhdHRlbXB0LgorCSAqLworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX0JTU0lELCAmYXNzb2NfcmVxLT5mbGFncykKKwkgICAgfHwgdGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJaW50IHN1Y2Nlc3MgPSAxOworCisJCXJldCA9IGFzc29jX2hlbHBlcl9hc3NvY2lhdGUocHJpdiwgYXNzb2NfcmVxKTsKKwkJaWYgKHJldCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJBU1NPQzogYXNzb2NpYXRpb24gYXR0ZW1wdCB1bnN1Y2Nlc3NmdWw6ICVkXG4iLAorCQkJCXJldCk7CisJCQlzdWNjZXNzID0gMDsKKwkJfQorCisJCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IGFzc29pY2F0aW9uIGF0dGVtcHQgdW5zdWNjZXNzZnVsLCAiCisJCQkJIm5vdCBjb25uZWN0ZWQuXG4iKTsKKwkJCXN1Y2Nlc3MgPSAwOworCQl9CisKKwkJaWYgKHN1Y2Nlc3MpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IGFzc29jaWF0aW9uIGF0dGVtcHQgc3VjY2Vzc2Z1bC4gIgorCQkJCSJBc3NvY2lhdGVkIHRvICclcycgKCIgTUFDX0ZNVCAiKVxuIiwKKwkJCQlhc3NvY19yZXEtPnNzaWQuc3NpZCwgTUFDX0FSRyhhc3NvY19yZXEtPmJzc2lkKSk7CisJCQlsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfODAyXzExX3Jzc2ksCisJCQkJMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCQkJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kXzgwMl8xMV9nZXRfbG9nLAorCQkJCTAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisJCX0gZWxzZSB7CisKKwkJCXJldCA9IC0xOworCQl9CisJfQorCitvdXQ6CisJaWYgKHJldCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiByZWNvbmZpZ3VyYXRpb24gYXR0ZW1wdCB1bnN1Y2Nlc3NmdWw6ICVkXG4iLAorCQkJcmV0KTsKKwl9CisJa2ZyZWUoYXNzb2NfcmVxKTsKKwlMRUFWRSgpOworfQorCisKKy8qCisgKiBDYWxsZXIgTVVTVCBob2xkIGFueSBuZWNlc3NhcnkgbG9ja3MKKyAqLworc3RydWN0IGFzc29jX3JlcXVlc3QgKiB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHdsYW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKKworCWlmICghYWRhcHRlci0+YXNzb2NfcmVxKSB7CisJCWFkYXB0ZXItPmFzc29jX3JlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19yZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYWRhcHRlci0+YXNzb2NfcmVxKSB7CisJCQlsYnNfcHJfaW5mbygiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYXNzb2NpYXRpb24iCisJCQkJIiByZXF1ZXN0IVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIENvcHkgY3VycmVudCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QsCisJICogYnV0IGRvbid0IG92ZXJ3cml0ZSBhbnkgdGhhdCBhcmUgYWxyZWFkeSBzZXQuCisJICovCisJYXNzb2NfcmVxID0gYWRhcHRlci0+YXNzb2NfcmVxOworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJbWVtY3B5KCZhc3NvY19yZXEtPnNzaWQsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQsCisJCQlhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfQ0hBTk5FTCwgJmFzc29jX3JlcS0+ZmxhZ3MpKQorCQlhc3NvY19yZXEtPmNoYW5uZWwgPSBhZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbDsKKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncykpCisJCWFzc29jX3JlcS0+bW9kZSA9IGFkYXB0ZXItPmluZnJhbW9kZTsKKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCW1lbWNweSgmYXNzb2NfcmVxLT5ic3NpZCwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLAorCQkJRVRIX0FMRU4pOworCX0KKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfS0VZUywgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQltZW1jcHkoJmFzc29jX3JlcS0+d2VwX2tleXNbaV0sICZhZGFwdGVyLT53ZXBfa2V5c1tpXSwKKwkJCQlzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCQl9CisJfQorCisJaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX1dFUF9UWF9LRVlJRFgsICZhc3NvY19yZXEtPmZsYWdzKSkKKwkJYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4ID0gYWRhcHRlci0+d2VwX3R4X2tleWlkeDsKKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJbWVtY3B5KCZhc3NvY19yZXEtPndwYV9tY2FzdF9rZXksICZhZGFwdGVyLT53cGFfbWNhc3Rfa2V5LAorCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkpKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCW1lbWNweSgmYXNzb2NfcmVxLT53cGFfdW5pY2FzdF9rZXksICZhZGFwdGVyLT53cGFfdW5pY2FzdF9rZXksCisJCQlzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCX0KKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJbWVtY3B5KCZhc3NvY19yZXEtPnNlY2luZm8sICZhZGFwdGVyLT5zZWNpbmZvLAorCQkJc2l6ZW9mKHN0cnVjdCB3bGFuXzgwMl8xMV9zZWN1cml0eSkpOworCX0KKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfSUUsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQltZW1jcHkoJmFzc29jX3JlcS0+d3BhX2llLCAmYWRhcHRlci0+d3BhX2llLAorCQkJTUFYX1dQQV9JRV9MRU4pOworCQlhc3NvY19yZXEtPndwYV9pZV9sZW4gPSBhZGFwdGVyLT53cGFfaWVfbGVuOworCX0KKworCXJldHVybiBhc3NvY19yZXE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvYXNzb2MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZDgyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2LCBSZWQgSGF0LCBJbmMuICovCisKKyNpZm5kZWYgX1dMQU5fQVNTT0NfSF8KKyNkZWZpbmUgX1dMQU5fQVNTT0NfSF8KKworI2luY2x1ZGUgImRldi5oIgorCit2b2lkIHdsYW5fYXNzb2NpYXRpb25fd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3N0cnVjdCBhc3NvY19yZXF1ZXN0ICogd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdCh3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIpOworCisjZGVmaW5lIEFTU09DX0RFTEFZIChIWiAvIDIpCitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKQorCQlyZXR1cm47CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YXNzb2Nfd29yayk7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmFzc29jX3RocmVhZCwgJnByaXYtPmFzc29jX3dvcmssIEFTU09DX0RFTEFZKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsod2xhbl9wcml2YXRlICpwcml2KQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmFzc29jX3dvcmspOworCWlmIChwcml2LT5hZGFwdGVyLT5hc3NvY19yZXEpIHsKKwkJa2ZyZWUocHJpdi0+YWRhcHRlci0+YXNzb2NfcmVxKTsKKwkJcHJpdi0+YWRhcHRlci0+YXNzb2NfcmVxID0gTlVMTDsKKwl9Cit9CisKKyNlbmRpZiAvKiBfV0xBTl9BU1NPQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGFjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpAQCAtMCwwICsxLDE5NTggQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZC4KKyAgKiBJdCBwcmVwYXJlcyBjb21tYW5kIGFuZCBzZW5kcyBpdCB0byBmaXJtd2FyZSB3aGVuIGl0IGlzIHJlYWR5LgorICAqLworCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiaG9zdGNtZC5oIgorI2luY2x1ZGUgInNiaS5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiam9pbi5oIgorI2luY2x1ZGUgIndleHQuaCIKKworc3RhdGljIHZvaWQgY2xlYW51cF9jbWRub2RlKHN0cnVjdCBjbWRfY3RybF9ub2RlICpwdGVtcG5vZGUpOworCitzdGF0aWMgdTE2IGNvbW1hbmRzX2FsbG93ZWRfaW5fcHNbXSA9IHsKKwljbWRfODAyXzExX3Jzc2ksCit9OworCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGNvbW1hbnMgaXMgYWxsb3dlZAorICogIGluIFBTIG1vZGUgbm90LgorICoKKyAqICBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCBJRAorICogIEByZXR1cm4gCSAgIFRSVUUgb3IgRkFMU0UKKyAqLworc3RhdGljIHU4IGlzX2NvbW1hbmRfYWxsb3dlZF9pbl9wcyh1MTYgY29tbWFuZCkKK3sKKwlpbnQgY291bnQgPSBzaXplb2YoY29tbWFuZHNfYWxsb3dlZF9pbl9wcykKKwkgICAgLyBzaXplb2YoY29tbWFuZHNfYWxsb3dlZF9pbl9wc1swXSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoY29tbWFuZCA9PSBjcHVfdG9fbGUxNihjb21tYW5kc19hbGxvd2VkX2luX3BzW2ldKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kX2h3X3NwZWMod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJc3RydWN0IGNtZF9kc19nZXRfaHdfc3BlYyAqaHdzcGVjID0gJmNtZC0+cGFyYW1zLmh3c3BlYzsKKworCUVOVEVSKCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfZ2V0X2h3X3NwZWMpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2dldF9od19zcGVjKSArIFNfRFNfR0VOKTsKKwltZW1jcHkoaHdzcGVjLT5wZXJtYW5lbnRhZGRyLCBwcml2LT5hZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3BzX21vZGUod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICB1MTYgY21kX2FjdGlvbikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc20gPSAmY21kLT5wYXJhbXMucHNtb2RlOworCXUxNiBhY3Rpb24gPSBjbWRfYWN0aW9uOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9wc19tb2RlKTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcHNfbW9kZSkgKworCQkJICAgICBTX0RTX0dFTik7CisJcHNtLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwlwc20tPm11bHRpcGxlZHRpbSA9IDA7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIGNtZF9zdWJjbWRfZW50ZXJfcHM6CisJCWxic19wcl9kZWJ1ZygxLCAiUFMgY29tbWFuZDoiICJTdWJDb2RlLSBFbnRlciBQU1xuIik7CisJCWxic19wcl9kZWJ1ZygxLCAibG9jYWxsaXN0ZW5pbnRlcnZhbCA9ICVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+bG9jYWxsaXN0ZW5pbnRlcnZhbCk7CisKKwkJcHNtLT5sb2NhbGxpc3RlbmludGVydmFsID0KKwkJICAgIGNwdV90b19sZTE2KGFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWwpOworCQlwc20tPm51bGxwa3RpbnRlcnZhbCA9CisJCSAgICBjcHVfdG9fbGUxNihhZGFwdGVyLT5udWxscGt0aW50ZXJ2YWwpOworCQlwc20tPm11bHRpcGxlZHRpbSA9CisJCSAgICBjcHVfdG9fbGUxNihwcml2LT5hZGFwdGVyLT5tdWx0aXBsZWR0aW0pOworCQlicmVhazsKKworCWNhc2UgY21kX3N1YmNtZF9leGl0X3BzOgorCQlsYnNfcHJfZGVidWcoMSwgIlBTIGNvbW1hbmQ6IiAiU3ViQ29kZS0gRXhpdCBQU1xuIik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfc3ViY21kX3NsZWVwX2NvbmZpcm1lZDoKKwkJbGJzX3ByX2RlYnVnKDEsICJQUyBjb21tYW5kOiBTdWJDb2RlLSBzbGVlcCBjb25maXJtXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJdTE2ICp0aW1lb3V0ID0gcGRhdGFfYnVmOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQpCisJCQkgICAgICsgU19EU19HRU4pOworCisJY21kLT5wYXJhbXMuaW5hY3Rpdml0eV90aW1lb3V0LmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJaWYgKGNtZF9hY3Rpb24pCisJCWNtZC0+cGFyYW1zLmluYWN0aXZpdHlfdGltZW91dC50aW1lb3V0ID0KKwkJICAgIGNwdV90b19sZTE2KCp0aW1lb3V0KTsKKwllbHNlCisJCWNtZC0+cGFyYW1zLmluYWN0aXZpdHlfdGltZW91dC50aW1lb3V0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9zbGVlcF9wYXJhbXMod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCXUxNiBjbWRfYWN0aW9uKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2xlZXBfcGFyYW1zICpzcCA9ICZjbWQtPnBhcmFtcy5zbGVlcF9wYXJhbXM7CisKKwlFTlRFUigpOworCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMpKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3NsZWVwX3BhcmFtcyk7CisKKwlpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X2dldCkgeworCQltZW1zZXQoJmFkYXB0ZXItPnNwLCAwLCBzaXplb2Yoc3RydWN0IHNsZWVwX3BhcmFtcykpOworCQltZW1zZXQoc3AsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMpKTsKKwkJc3AtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQlzcC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisJCXNwLT5lcnJvciA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnNwLnNwX2Vycm9yKTsKKwkJc3AtPm9mZnNldCA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnNwLnNwX29mZnNldCk7CisJCXNwLT5zdGFibGV0aW1lID0gY3B1X3RvX2xlMTYoYWRhcHRlci0+c3Auc3Bfc3RhYmxldGltZSk7CisJCXNwLT5jYWxjb250cm9sID0gKHU4KSBhZGFwdGVyLT5zcC5zcF9jYWxjb250cm9sOworCQlzcC0+ZXh0ZXJuYWxzbGVlcGNsayA9ICh1OCkgYWRhcHRlci0+c3Auc3BfZXh0c2xlZXBjbGs7CisJCXNwLT5yZXNlcnZlZCA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnNwLnNwX3Jlc2VydmVkKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9zZXRfd2VwKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY21kX2FjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBkYXRhX2J1ZikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zZXRfd2VwICp3ZXAgPSAmY21kLT5wYXJhbXMud2VwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEgPSBwZGF0YV9idWY7CisKKwlFTlRFUigpOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9zZXRfd2VwKTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNigoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3NldF93ZXApKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTX0RTX0dFTik7CisKKwlpZiAoY21kX2FjdCA9PSBjbWRfYWN0X2FkZCkgeworCQlpbnQgaTsKKworCQlpZiAoIWFzc29jX3JlcSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGFzc29jaWF0aW9uIHJlcXVlc3QhIik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXdlcC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdF9hZGQpOworCisJCS8qIGRlZmF1bHQgdHgga2V5IGluZGV4ICovCisJCXdlcC0+a2V5aW5kZXggPSBjcHVfdG9fbGUxNigodTE2KQorCQkJCSAgICAgICAgICAgICAgICAgKGFzc29jX3JlcS0+d2VwX3R4X2tleWlkeCAmCisJCQkJICAgICAgICAgICAgICAgICAodTMyKWNtZF9XRVBfS0VZX0lOREVYX01BU0spKTsKKworCQlsYnNfcHJfZGVidWcoMSwgIlR4IGtleSBJbmRleDogJXVcbiIsIHdlcC0+a2V5aW5kZXgpOworCisJCS8qIENvcHkga2V5IHR5cGVzIGFuZCBtYXRlcmlhbCB0byBob3N0IGNvbW1hbmQgc3RydWN0dXJlICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgKiBwa2V5ID0gJmFzc29jX3JlcS0+d2VwX2tleXNbaV07CisKKwkJCXN3aXRjaCAocGtleS0+bGVuKSB7CisJCQljYXNlIEtFWV9MRU5fV0VQXzQwOgorCQkJCXdlcC0+a2V5dHlwZVtpXSA9IGNtZF90eXBlX3dlcF80MF9iaXQ7CisJCQkJbWVtbW92ZSgmd2VwLT5rZXltYXRlcmlhbFtpXSwgcGtleS0+a2V5LAorCQkJCSAgICAgICAgcGtleS0+bGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgS0VZX0xFTl9XRVBfMTA0OgorCQkJCXdlcC0+a2V5dHlwZVtpXSA9IGNtZF90eXBlX3dlcF8xMDRfYml0OworCQkJCW1lbW1vdmUoJndlcC0+a2V5bWF0ZXJpYWxbaV0sIHBrZXktPmtleSwKKwkJCQkgICAgICAgIHBrZXktPmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBXRVAga2V5ICVkIGxlbmd0aCBvZiAlZFxuIiwKKwkJCQkgICAgICAgaSwgcGtleS0+bGVuKTsKKwkJCQlyZXQgPSAtMTsKKwkJCQlnb3RvIGRvbmU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGNtZF9hY3QgPT0gY21kX2FjdF9yZW1vdmUpIHsKKwkJLyogQUNUX1JFTU9WRSBjbGVhcnMgX2FsbF8gV0VQIGtleXMgKi8KKwkJd2VwLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0X3JlbW92ZSk7CisKKwkJLyogZGVmYXVsdCB0eCBrZXkgaW5kZXggKi8KKwkJd2VwLT5rZXlpbmRleCA9IGNwdV90b19sZTE2KCh1MTYpCisJCQkJICAgICAgICAgICAgICAgICAoYWRhcHRlci0+d2VwX3R4X2tleWlkeCAmCisJCQkJICAgICAgICAgICAgICAgICAodTMyKWNtZF9XRVBfS0VZX0lOREVYX01BU0spKTsKKwl9CisKKwlyZXQgPSAwOworCitkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfZW5hYmxlX3Jzbih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2VuYWJsZV9yc24gKnBlbmFibGVSU04gPSAmY21kLT5wYXJhbXMuZW5icnNuOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2VuYWJsZV9yc24pOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lbmFibGVfcnNuKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwlwZW5hYmxlUlNOLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwlpZiAoYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKKwkJcGVuYWJsZVJTTi0+ZW5hYmxlID0gY3B1X3RvX2xlMTYoY21kX2VuYWJsZV9yc24pOworCX0gZWxzZSB7CisJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9kaXNhYmxlX3Jzbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X29uZV93cGFfa2V5KHN0cnVjdCBNcnZsSUV0eXBlX2tleVBhcmFtU2V0ICogcGtleXBhcmFtc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgKiBwa2V5KQoreworCXBrZXlwYXJhbXNldC0+a2V5dHlwZWlkID0gY3B1X3RvX2xlMTYocGtleS0+dHlwZSk7CisKKwlpZiAocGtleS0+ZmxhZ3MgJiBLRVlfSU5GT19XUEFfRU5BQkxFRCkgeworCQlwa2V5cGFyYW1zZXQtPmtleWluZm8gPSBjcHVfdG9fbGUxNihLRVlfSU5GT19XUEFfRU5BQkxFRCk7CisJfSBlbHNlIHsKKwkJcGtleXBhcmFtc2V0LT5rZXlpbmZvID0gY3B1X3RvX2xlMTYoIUtFWV9JTkZPX1dQQV9FTkFCTEVEKTsKKwl9CisKKwlpZiAocGtleS0+ZmxhZ3MgJiBLRVlfSU5GT19XUEFfVU5JQ0FTVCkgeworCQlwa2V5cGFyYW1zZXQtPmtleWluZm8gfD0gY3B1X3RvX2xlMTYoS0VZX0lORk9fV1BBX1VOSUNBU1QpOworCX0gZWxzZSBpZiAocGtleS0+ZmxhZ3MgJiBLRVlfSU5GT19XUEFfTUNBU1QpIHsKKwkJcGtleXBhcmFtc2V0LT5rZXlpbmZvIHw9IGNwdV90b19sZTE2KEtFWV9JTkZPX1dQQV9NQ0FTVCk7CisJfQorCisJcGtleXBhcmFtc2V0LT50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfS0VZX01BVEVSSUFMKTsKKwlwa2V5cGFyYW1zZXQtPmtleWxlbiA9IGNwdV90b19sZTE2KHBrZXktPmxlbik7CisJbWVtY3B5KHBrZXlwYXJhbXNldC0+a2V5LCBwa2V5LT5rZXksIHBrZXktPmxlbik7CisJcGtleXBhcmFtc2V0LT5sZW5ndGggPSBjcHVfdG9fbGUxNiggIHNpemVvZihwa2V5cGFyYW1zZXQtPmtleXR5cGVpZCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YocGtleXBhcmFtc2V0LT5rZXlpbmZvKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihwa2V5cGFyYW1zZXQtPmtleWxlbikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YocGtleXBhcmFtc2V0LT5rZXkpKTsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfa2V5X21hdGVyaWFsKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQl1MTYgY21kX2FjdGlvbiwKKwkJCQkJdTMyIGNtZF9vaWQsIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCAqcGtleW1hdGVyaWFsID0KKwkgICAgJmNtZC0+cGFyYW1zLmtleW1hdGVyaWFsOworCWludCByZXQgPSAwOworCWludCBpbmRleCA9IDA7CisKKwlFTlRFUigpOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9rZXlfbWF0ZXJpYWwpOworCXBrZXltYXRlcmlhbC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X2dldCkgeworCQljbWQtPnNpemUgPSBjcHVfdG9fbGUxNiggIFNfRFNfR0VOCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgKHBrZXltYXRlcmlhbC0+YWN0aW9uKSk7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltZW1zZXQoJnBrZXltYXRlcmlhbC0+a2V5UGFyYW1TZXQsIDAsIHNpemVvZihwa2V5bWF0ZXJpYWwtPmtleVBhcmFtU2V0KSk7CisKKwlpZiAoYWRhcHRlci0+d3BhX3VuaWNhc3Rfa2V5LmxlbikgeworCQlzZXRfb25lX3dwYV9rZXkoJnBrZXltYXRlcmlhbC0+a2V5UGFyYW1TZXRbaW5kZXhdLAorCQkgICAgICAgICAgICAgICAgJmFkYXB0ZXItPndwYV91bmljYXN0X2tleSk7CisJCWluZGV4Kys7CisJfQorCisJaWYgKGFkYXB0ZXItPndwYV9tY2FzdF9rZXkubGVuKSB7CisJCXNldF9vbmVfd3BhX2tleSgmcGtleW1hdGVyaWFsLT5rZXlQYXJhbVNldFtpbmRleF0sCisJCSAgICAgICAgICAgICAgICAmYWRhcHRlci0+d3BhX21jYXN0X2tleSk7CisJCWluZGV4Kys7CisJfQorCisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoICBTX0RTX0dFTgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgKHBrZXltYXRlcmlhbC0+YWN0aW9uKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmRleCAqIHNpemVvZihzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCkpOworCisJcmV0ID0gMDsKKworZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3Jlc2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCBpbnQgY21kX2FjdGlvbikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZXNldCAqcmVzZXQgPSAmY21kLT5wYXJhbXMucmVzZXQ7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3Jlc2V0KTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQpICsgU19EU19HRU4pOworCXJlc2V0LT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9nZXRfbG9nKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9nZXRfbG9nKTsKKwljbWQtPnNpemUgPQorCQljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X2xvZykgKyBTX0RTX0dFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfZ2V0X3N0YXQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9nZXRfc3RhdCk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9zdGF0KSArCisJCQkgICAgIFNfRFNfR0VOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9zbm1wX21pYih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgaW50IGNtZF9hY3Rpb24sCisJCQkJICAgIGludCBjbWRfb2lkLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgKnBTTk1QTUlCID0gJmNtZC0+cGFyYW1zLnNtaWI7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1OCB1Y1RlbXA7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJTTk1QX0NNRDogY21kX29pZCA9IDB4JXhcbiIsIGNtZF9vaWQpOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9zbm1wX21pYik7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKworCXN3aXRjaCAoY21kX29pZCkgeworCWNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorCXsKKwkJZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG1vZGUgPQorCQkJKGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkgcGRhdGFfYnVmOworCQlwU05NUE1JQi0+cXVlcnl0eXBlID0gY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQlwU05NUE1JQi0+b2lkID0gY3B1X3RvX2xlMTYoKHUxNikgZGVzaXJlZF9ic3N0eXBlX2kpOworCQlwU05NUE1JQi0+YnVmc2l6ZSA9IHNpemVvZih1OCk7CisJCWlmIChtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkKKwkJCXVjVGVtcCA9IFNOTVBfTUlCX1ZBTFVFX0lORlJBOworCQllbHNlCisJCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9BREhPQzsKKworCQltZW1tb3ZlKHBTTk1QTUlCLT52YWx1ZSwgJnVjVGVtcCwgc2l6ZW9mKHU4KSk7CisKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPSURfODAyXzExRF9FTkFCTEU6CisJCXsKKwkJCXUzMiB1bFRlbXA7CisKKwkJCXBTTk1QTUlCLT5vaWQgPSBjcHVfdG9fbGUxNigodTE2KSBkb3QxMWRfaSk7CisKKwkJCWlmIChjbWRfYWN0aW9uID09IGNtZF9hY3Rfc2V0KSB7CisJCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNtZF9hY3Rfc2V0OworCQkJCXBTTk1QTUlCLT5idWZzaXplID0gc2l6ZW9mKHUxNik7CisJCQkJdWxUZW1wID0gKih1MzIgKilwZGF0YV9idWY7CisJCQkJKigodW5zaWduZWQgc2hvcnQgKikocFNOTVBNSUItPnZhbHVlKSkgPQorCQkJCSAgICBjcHVfdG9fbGUxNigodTE2KSB1bFRlbXApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKwkJeworCQkJdTMyIHVsVGVtcDsKKworCQkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIGZyYWd0aHJlc2hfaSk7CisKKwkJCWlmIChjbWRfYWN0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9CisJCQkJICAgIGNwdV90b19sZTE2KGNtZF9hY3RfZ2V0KTsKKwkJCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X3NldCk7CisJCQkJcFNOTVBNSUItPmJ1ZnNpemUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YodTE2KSk7CisJCQkJdWxUZW1wID0gKigodTMyICopIHBkYXRhX2J1Zik7CisJCQkJKigodW5zaWduZWQgc2hvcnQgKikocFNOTVBNSUItPnZhbHVlKSkgPQorCQkJCSAgICBjcHVfdG9fbGUxNigodTE2KSB1bFRlbXApOworCisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKwkJeworCisJCQl1MzIgdWxUZW1wOworCQkJcFNOTVBNSUItPm9pZCA9IGxlMTZfdG9fY3B1KCh1MTYpIHJ0c3RocmVzaF9pKTsKKworCQkJaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9nZXQpIHsKKwkJCQlwU05NUE1JQi0+cXVlcnl0eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoY21kX2FjdF9nZXQpOworCQkJfSBlbHNlIGlmIChjbWRfYWN0aW9uID09IGNtZF9hY3Rfc2V0KSB7CisJCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9CisJCQkJICAgIGNwdV90b19sZTE2KGNtZF9hY3Rfc2V0KTsKKwkJCQlwU05NUE1JQi0+YnVmc2l6ZSA9CisJCQkJICAgIGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKKwkJCQl1bFRlbXAgPSAqKCh1MzIgKikKKwkJCQkJICAgcGRhdGFfYnVmKTsKKwkJCQkqKHVuc2lnbmVkIHNob3J0ICopKHBTTk1QTUlCLT52YWx1ZSkgPQorCQkJCSAgICBjcHVfdG9fbGUxNigodTE2KSB1bFRlbXApOworCisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5UOgorCQlwU05NUE1JQi0+b2lkID0gY3B1X3RvX2xlMTYoKHUxNikgc2hvcnRfcmV0cnlsaW1faSk7CisKKwkJaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9nZXQpIHsKKwkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPQorCQkJICAgIGNwdV90b19sZTE2KGNtZF9hY3RfZ2V0KTsKKwkJfSBlbHNlIGlmIChjbWRfYWN0aW9uID09IGNtZF9hY3Rfc2V0KSB7CisJCQlwU05NUE1JQi0+cXVlcnl0eXBlID0KKwkJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X3NldCk7CisJCQlwU05NUE1JQi0+YnVmc2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZih1MTYpKTsKKwkJCSooKHVuc2lnbmVkIHNob3J0ICopKHBTTk1QTUlCLT52YWx1ZSkpID0KKwkJCSAgICBjcHVfdG9fbGUxNigodTE2KSBhZGFwdGVyLT50eHJldHJ5Y291bnQpOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsCisJICAgICAgICJTTk1QX0NNRDogY29tbWFuZD0weCV4LCBzaXplPTB4JXgsIHNlcW51bT0weCV4LCByZXN1bHQ9MHgleFxuIiwKKwkgICAgICAgY21kLT5jb21tYW5kLCBjbWQtPnNpemUsIGNtZC0+c2VxbnVtLCBjbWQtPnJlc3VsdCk7CisKKwlsYnNfcHJfZGVidWcoMSwKKwkgICAgICAgIlNOTVBfQ01EOiBhY3Rpb249MHgleCwgb2lkPTB4JXgsIG9pZHNpemU9MHgleCwgdmFsdWU9MHgleFxuIiwKKwkgICAgICAgcFNOTVBNSUItPnF1ZXJ5dHlwZSwgcFNOTVBNSUItPm9pZCwgcFNOTVBNSUItPmJ1ZnNpemUsCisJICAgICAgICoodTE2ICopIHBTTk1QTUlCLT52YWx1ZSk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9yYWRpb19jb250cm9sKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkJIGludCBjbWRfYWN0aW9uKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmFkaW9fY29udHJvbCAqcHJhZGlvY29udHJvbCA9CisJICAgICZjbWQtPnBhcmFtcy5yYWRpbzsKKworCUVOVEVSKCk7CisKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNigoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3JhZGlvX2NvbnRyb2wpKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wpOworCisJcHJhZGlvY29udHJvbC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPnByZWFtYmxlKSB7CisJY2FzZSBjbWRfdHlwZV9zaG9ydF9wcmVhbWJsZToKKwkJcHJhZGlvY29udHJvbC0+Y29udHJvbCA9IGNwdV90b19sZTE2KFNFVF9TSE9SVF9QUkVBTUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfdHlwZV9sb25nX3ByZWFtYmxlOgorCQlwcmFkaW9jb250cm9sLT5jb250cm9sID0gY3B1X3RvX2xlMTYoU0VUX0xPTkdfUFJFQU1CTEUpOworCQlicmVhazsKKworCWNhc2UgY21kX3R5cGVfYXV0b19wcmVhbWJsZToKKwlkZWZhdWx0OgorCQlwcmFkaW9jb250cm9sLT5jb250cm9sID0gY3B1X3RvX2xlMTYoU0VUX0FVVE9fUFJFQU1CTEUpOworCQlicmVhazsKKwl9CisKKwlpZiAoYWRhcHRlci0+cmFkaW9vbikKKwkJcHJhZGlvY29udHJvbC0+Y29udHJvbCB8PSBjcHVfdG9fbGUxNihUVVJOX09OX1JGKTsKKwllbHNlCisJCXByYWRpb2NvbnRyb2wtPmNvbnRyb2wgJj0gY3B1X3RvX2xlMTYoflRVUk5fT05fUkYpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfcmZfdHhfcG93ZXIod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl90eF9wb3dlciAqcHJ0cCA9ICZjbWQtPnBhcmFtcy50eHA7CisKKwlFTlRFUigpOworCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl90eF9wb3dlcikpICsKKwkJCSAgICAgU19EU19HRU4pOworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfcmZfdHhfcG93ZXIpOworCXBydHAtPmFjdGlvbiA9IGNtZF9hY3Rpb247CisKKwlsYnNfcHJfZGVidWcoMSwgIlJGX1RYX1BPV0VSX0NNRDogc2l6ZTolZCBjbWQ6MHgleCBBY3Q6JWRcbiIsIGNtZC0+c2l6ZSwKKwkgICAgICAgY21kLT5jb21tYW5kLCBwcnRwLT5hY3Rpb24pOworCisJc3dpdGNoIChjbWRfYWN0aW9uKSB7CisJY2FzZSBjbWRfYWN0X3R4X3Bvd2VyX29wdF9nZXQ6CisJCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3RfZ2V0KTsKKwkJcHJ0cC0+Y3VycmVudGxldmVsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9oaWdoOgorCQlwcnRwLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0X3NldCk7CisJCXBydHAtPmN1cnJlbnRsZXZlbCA9CisJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X3R4X3Bvd2VyX2luZGV4X2hpZ2gpOworCQlicmVhazsKKworCWNhc2UgY21kX2FjdF90eF9wb3dlcl9vcHRfc2V0X21pZDoKKwkJcHJ0cC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQlwcnRwLT5jdXJyZW50bGV2ZWwgPQorCQkgICAgY3B1X3RvX2xlMTYoY21kX2FjdF90eF9wb3dlcl9pbmRleF9taWQpOworCQlicmVhazsKKworCWNhc2UgY21kX2FjdF90eF9wb3dlcl9vcHRfc2V0X2xvdzoKKwkJcHJ0cC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQlwcnRwLT5jdXJyZW50bGV2ZWwgPSBjcHVfdG9fbGUxNigqKCh1MTYgKikgcGRhdGFfYnVmKSk7CisJCWJyZWFrOworCX0KKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9yZl9hbnRlbm5hKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9hbnRlbm5hICpyYW50ID0gJmNtZC0+cGFyYW1zLnJhbnQ7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3JmX2FudGVubmEpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9hbnRlbm5hKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKworCXJhbnQtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCWlmICgoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldF9yeCkgfHwKKwkgICAgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9zZXRfdHgpKSB7CisJCXJhbnQtPmFudGVubmFtb2RlID0KKwkJICAgIGNwdV90b19sZTE2KCh1MTYpICgqKHUzMiAqKSBwZGF0YV9idWYpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQkgICAgICB1MTYgY21kX2FjdGlvbikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQKKwkqcmF0ZWFkYXB0ID0gJmNtZC0+cGFyYW1zLnJhdGVzZXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQpCisJCQkgICAgICsgU19EU19HRU4pOworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0KTsKKworCUVOVEVSKCk7CisKKwlyYXRlYWRhcHQtPmFjdGlvbiA9IGNtZF9hY3Rpb247CisJcmF0ZWFkYXB0LT5lbmFibGVod2F1dG8gPSBhZGFwdGVyLT5lbmFibGVod2F1dG87CisJcmF0ZWFkYXB0LT5iaXRtYXAgPSBhZGFwdGVyLT5yYXRlYml0bWFwOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfZGF0YV9yYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgIHUxNiBjbWRfYWN0aW9uKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2RhdGFfcmF0ZSAqcGRhdGFyYXRlID0gJmNtZC0+cGFyYW1zLmRyYXRlOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTE2IGFjdGlvbiA9IGNtZF9hY3Rpb247CisKKwlFTlRFUigpOworCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2RhdGFfcmF0ZSkgKworCQkJICAgICBTX0RTX0dFTik7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2RhdGFfcmF0ZSk7CisKKwltZW1zZXQocGRhdGFyYXRlLCAwLCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlKSk7CisKKwlwZGF0YXJhdGUtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJaWYgKGFjdGlvbiA9PSBjbWRfYWN0X3NldF90eF9maXhfcmF0ZSkgeworCQlwZGF0YXJhdGUtPmRhdGFyYXRlWzBdID0gbGliZXJ0YXNfZGF0YV9yYXRlX3RvX2luZGV4KGFkYXB0ZXItPmRhdGFyYXRlKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJTZXR0aW5nIEZXIGZvciBmaXhlZCByYXRlIDB4JTAyWFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmRhdGFyYXRlKTsKKwl9IGVsc2UgaWYgKGFjdGlvbiA9PSBjbWRfYWN0X3NldF90eF9hdXRvKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiU2V0dGluZyBGVyBmb3IgQVVUTyByYXRlXG4iKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kX21hY19tdWx0aWNhc3RfYWRyKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgdTE2IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGNtZF9kc19tYWNfbXVsdGljYXN0X2FkciAqcE1DYXN0QWRyID0gJmNtZC0+cGFyYW1zLm1hZHI7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX21hY19tdWx0aWNhc3RfYWRyKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfbWFjX211bHRpY2FzdF9hZHIpOworCisJcE1DYXN0QWRyLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwlwTUNhc3RBZHItPm5yX29mX2FkcnMgPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBhZGFwdGVyLT5ucl9vZl9tdWx0aWNhc3RtYWNhZGRyKTsKKwltZW1jcHkocE1DYXN0QWRyLT5tYWNsaXN0LCBhZGFwdGVyLT5tdWx0aWNhc3RsaXN0LAorCSAgICAgICBhZGFwdGVyLT5ucl9vZl9tdWx0aWNhc3RtYWNhZGRyICogRVRIX0FMRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3JmX2NoYW5uZWwod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgICBpbnQgb3B0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCAqcmZjaGFuID0gJmNtZC0+cGFyYW1zLnJmY2hhbm5lbDsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfcmZfY2hhbm5lbCk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3JmX2NoYW5uZWwpCisJCQkJICAgICArIFNfRFNfR0VOKTsKKworCWlmIChvcHRpb24gPT0gY21kX29wdF84MDJfMTFfcmZfY2hhbm5lbF9zZXQpIHsKKwkJcmZjaGFuLT5jdXJyZW50Y2hhbm5lbCA9IGNwdV90b19sZTE2KCooKHUxNiAqKSBwZGF0YV9idWYpKTsKKwl9CisKKwlyZmNoYW4tPmFjdGlvbiA9IGNwdV90b19sZTE2KG9wdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfcnNzaSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3Jzc2kpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yc3NpKSArIFNfRFNfR0VOKTsKKwljbWQtPnBhcmFtcy5yc3NpLk4gPSBwcml2LT5hZGFwdGVyLT5iY25fYXZnX2ZhY3RvcjsKKworCS8qIHJlc2V0IEJlYWNvbiBTTlIvTkYvUlNTSSB2YWx1ZXMgKi8KKwlhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddID0gMDsKKwlhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9IDA7CisJYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddID0gMDsKKwlhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9BVkddID0gMDsKKwlhZGFwdGVyLT5SU1NJW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IDA7CisJYWRhcHRlci0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9BVkddID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kX3JlZ19hY2Nlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZHB0ciwKKwkJCSAgICAgICB1OCBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlICpvZmZ2YWw7CisKKwlFTlRFUigpOworCisJb2ZmdmFsID0gKHN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSAqKXBkYXRhX2J1ZjsKKworCXN3aXRjaCAoY21kcHRyLT5jb21tYW5kKSB7CisJY2FzZSBjbWRfbWFjX3JlZ19hY2Nlc3M6CisJCXsKKwkJCXN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKm1hY3JlZzsKKworCQkJY21kcHRyLT5zaXplID0KKwkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YKKwkJCQkJICAgICAoc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcykKKwkJCQkJICAgICArIFNfRFNfR0VOKTsKKwkJCW1hY3JlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKikmY21kcHRyLT5wYXJhbXMuCisJCQkgICAgbWFjcmVnOworCisJCQltYWNyZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCQkJbWFjcmVnLT5vZmZzZXQgPSBjcHVfdG9fbGUxNigodTE2KSBvZmZ2YWwtPm9mZnNldCk7CisJCQltYWNyZWctPnZhbHVlID0gY3B1X3RvX2xlMzIob2ZmdmFsLT52YWx1ZSk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGNtZF9iYnBfcmVnX2FjY2VzczoKKwkJeworCQkJc3RydWN0IGNtZF9kc19iYnBfcmVnX2FjY2VzcyAqYmJwcmVnOworCisJCQljbWRwdHItPnNpemUgPQorCQkJICAgIGNwdV90b19sZTE2KHNpemVvZgorCQkJCQkgICAgIChzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzKQorCQkJCQkgICAgICsgU19EU19HRU4pOworCQkJYmJwcmVnID0KKwkJCSAgICAoc3RydWN0IGNtZF9kc19iYnBfcmVnX2FjY2VzcyAqKSZjbWRwdHItPnBhcmFtcy4KKwkJCSAgICBiYnByZWc7CisKKwkJCWJicHJlZy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisJCQliYnByZWctPm9mZnNldCA9IGNwdV90b19sZTE2KCh1MTYpIG9mZnZhbC0+b2Zmc2V0KTsKKwkJCWJicHJlZy0+dmFsdWUgPSAodTgpIG9mZnZhbC0+dmFsdWU7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGNtZF9yZl9yZWdfYWNjZXNzOgorCQl7CisJCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgKnJmcmVnOworCisJCQljbWRwdHItPnNpemUgPQorCQkJICAgIGNwdV90b19sZTE2KHNpemVvZgorCQkJCQkgICAgIChzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MpICsKKwkJCQkJICAgICBTX0RTX0dFTik7CisJCQlyZnJlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfcmZfcmVnX2FjY2VzcyAqKSZjbWRwdHItPnBhcmFtcy4KKwkJCSAgICByZnJlZzsKKworCQkJcmZyZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCQkJcmZyZWctPm9mZnNldCA9IGNwdV90b19sZTE2KCh1MTYpIG9mZnZhbC0+b2Zmc2V0KTsKKwkJCXJmcmVnLT52YWx1ZSA9ICh1OCkgb2ZmdmFsLT52YWx1ZTsKKworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX21hY19hZGRyZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSAgICAgICB1MTYgY21kX2FjdGlvbikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9tYWNfYWRkcmVzcyk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX21hY19hZGRyZXNzKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwljbWQtPnBhcmFtcy5tYWNhZGQuYWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQltZW1jcHkoY21kLT5wYXJhbXMubWFjYWRkLm1hY2FkZCwKKwkJICAgICAgIGFkYXB0ZXItPmN1cnJlbnRfYWRkciwgRVRIX0FMRU4pOworCQlsYnNfZGJnX2hleCgiU0VUX0NNRDogTUFDIEFERFJFU1MtIiwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCA2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfZWVwcm9tX2FjY2Vzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCSBpbnQgY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCB3bGFuX2lvY3RsX3JlZ3Jkd3IgKmVhID0gcGRhdGFfYnVmOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfZWVwcm9tX2FjY2Vzcyk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2VlcHJvbV9hY2Nlc3MpICsKKwkJCSAgICAgU19EU19HRU4pOworCWNtZC0+cmVzdWx0ID0gMDsKKworCWNtZC0+cGFyYW1zLnJkZWVwcm9tLmFjdGlvbiA9IGNwdV90b19sZTE2KGVhLT5hY3Rpb24pOworCWNtZC0+cGFyYW1zLnJkZWVwcm9tLm9mZnNldCA9IGNwdV90b19sZTE2KGVhLT5vZmZzZXQpOworCWNtZC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCA9IGNwdV90b19sZTE2KGVhLT5OT0IpOworCWNtZC0+cGFyYW1zLnJkZWVwcm9tLnZhbHVlID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kX2J0X2FjY2Vzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgKmJ0X2FjY2VzcyA9ICZjbWQtPnBhcmFtcy5idDsKKwlsYnNfcHJfZGVidWcoMSwgIkJUIENNRCglZClcbiIsIGNtZF9hY3Rpb24pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX2J0X2FjY2Vzcyk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisJY21kLT5yZXN1bHQgPSAwOworCWJ0X2FjY2Vzcy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlzd2l0Y2ggKGNtZF9hY3Rpb24pIHsKKwljYXNlIGNtZF9hY3RfYnRfYWNjZXNzX2FkZDoKKwkJbWVtY3B5KGJ0X2FjY2Vzcy0+YWRkcjEsIHBkYXRhX2J1ZiwgMiAqIEVUSF9BTEVOKTsKKwkJbGJzX2RiZ19oZXgoIkJUX0FERDogYmxpbmRlZCBtYWMgYWRkcmVzcy0iLCBidF9hY2Nlc3MtPmFkZHIxLCA2KTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfYWN0X2J0X2FjY2Vzc19kZWw6CisJCW1lbWNweShidF9hY2Nlc3MtPmFkZHIxLCBwZGF0YV9idWYsIDEgKiBFVEhfQUxFTik7CisJCWxic19kYmdfaGV4KCJCVF9ERUw6IGJsaW5kZWQgbWFjIGFkZHJlc3MtIiwgYnRfYWNjZXNzLT5hZGRyMSwgNik7CisJCWJyZWFrOworCWNhc2UgY21kX2FjdF9idF9hY2Nlc3NfbGlzdDoKKwkJYnRfYWNjZXNzLT5pZCA9IGNwdV90b19sZTMyKCoodTMyICopIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCWNhc2UgY21kX2FjdF9idF9hY2Nlc3NfcmVzZXQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9md3RfYWNjZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkgICAgICAgdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwlzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgKmZ3dF9hY2Nlc3MgPSAmY21kLT5wYXJhbXMuZnd0OworCWxic19wcl9kZWJ1ZygxLCAiRldUIENNRCglZClcbiIsIGNtZF9hY3Rpb24pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX2Z3dF9hY2Nlc3MpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MpCisJCQkJICAgICArIFNfRFNfR0VOKTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwlpZiAocGRhdGFfYnVmKQorCQltZW1jcHkoZnd0X2FjY2VzcywgcGRhdGFfYnVmLCBzaXplb2YoKmZ3dF9hY2Nlc3MpKTsKKwllbHNlCisJCW1lbXNldChmd3RfYWNjZXNzLCAwLCBzaXplb2YoKmZ3dF9hY2Nlc3MpKTsKKworCWZ3dF9hY2Nlc3MtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfbWVzaF9hY2Nlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQl1MTYgY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgKm1lc2hfYWNjZXNzID0gJmNtZC0+cGFyYW1zLm1lc2g7CisJbGJzX3ByX2RlYnVnKDEsICJGV1QgQ01EKCVkKVxuIiwgY21kX2FjdGlvbik7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfbWVzaF9hY2Nlc3MpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX21lc2hfYWNjZXNzKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisJY21kLT5yZXN1bHQgPSAwOworCisJaWYgKHBkYXRhX2J1ZikKKwkJbWVtY3B5KG1lc2hfYWNjZXNzLCBwZGF0YV9idWYsIHNpemVvZigqbWVzaF9hY2Nlc3MpKTsKKwllbHNlCisJCW1lbXNldChtZXNoX2FjY2VzcywgMCwgc2l6ZW9mKCptZXNoX2FjY2VzcykpOworCisJbWVzaF9hY2Nlc3MtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbGliZXJ0YXNfcXVldWVfY21kKHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlLCB1OCBhZGR0YWlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHI7CisKKwlFTlRFUigpOworCisJaWYgKCFjbWRub2RlKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUVVFVUVfQ01EOiBjbWRub2RlIGlzIE5VTExcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJY21kcHRyID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKWNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyOworCWlmICghY21kcHRyKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUVVFVUVfQ01EOiBjbWRwdHIgaXMgTlVMTFxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBFeGl0X1BTIGNvbW1hbmQgbmVlZHMgdG8gYmUgcXVldWVkIGluIHRoZSBoZWFkZXIgYWx3YXlzLiAqLworCWlmIChjbWRwdHItPmNvbW1hbmQgPT0gY21kXzgwMl8xMV9wc19tb2RlKSB7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUgKnBzbSA9ICZjbWRwdHItPnBhcmFtcy5wc21vZGU7CisJCWlmIChwc20tPmFjdGlvbiA9PSBjbWRfc3ViY21kX2V4aXRfcHMpIHsKKwkJCWlmIChhZGFwdGVyLT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpCisJCQkJYWRkdGFpbCA9IDA7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChhZGR0YWlsKQorCQlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopY21kbm9kZSwKKwkJCSAgICAgICZhZGFwdGVyLT5jbWRwZW5kaW5ncSk7CisJZWxzZQorCQlsaXN0X2FkZCgoc3RydWN0IGxpc3RfaGVhZCAqKWNtZG5vZGUsICZhZGFwdGVyLT5jbWRwZW5kaW5ncSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJbGJzX3ByX2RlYnVnKDEsICJRVUVVRV9DTUQ6IEluc2VydGVkIG5vZGU9MHgleCwgY21kPTB4JXggaW4gY21kcGVuZGluZ3FcbiIsCisJICAgICAgICh1MzIpIGNtZG5vZGUsCisJICAgICAgICgoc3RydWN0IGNtZF9kc19nZW4qKWNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyKS0+Y29tbWFuZCk7CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUT0RPOiBGaXggdGhlIGlzc3VlIHdoZW4gRG93bmxvYWRjb21tYW5kVG9TdGF0aW9uIGlzIGJlaW5nIGNhbGxlZCB0aGUKKyAqIHNlY29uZCB0aW1lIHdoZW4gdGhlIGNvbW1hbmQgdGltZXNvdXQuIEFsbCB0aGUgY21kcHRyLT54eHggYXJlIGluIGxpdHRsZQorICogZW5kaWFuIGFuZCB0aGVyZWZvcmUgYWxsIHRoZSBjb21wYXJpc3Npb25zIHdpbGwgZmFpbC4KKyAqIEZvciBub3cgLSB3ZSBhcmUgbm90IHBlcmZvcm1pbmcgdGhlIGVuZGlhbiBjb252ZXJzaW9uIHRoZSBzZWNvbmQgdGltZSAtIGJ1dAorICogZm9yIFBTIGFuZCBERUVQX1NMRUVQIHdlIG5lZWQgdG8gd29ycnkKKyAqLworc3RhdGljIGludCBEb3dubG9hZGNvbW1hbmRUb1N0YXRpb24od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZHB0cjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXUxNiBjbWRzaXplOworCXUxNiBjb21tYW5kOworCisJRU5URVIoKTsKKworCWlmICghYWRhcHRlciB8fCAhY21kbm9kZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBhZGFwdGVyID0gJSN4LCBjbWRub2RlID0gJSN4XG4iLAorCQkgICAgICAgKGludClhZGFwdGVyLCAoaW50KWNtZG5vZGUpOworCQlpZiAoY21kbm9kZSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgY21kbm9kZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQl9CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJY21kcHRyID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKWNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWNtZHB0ciB8fCAhY21kcHRyLT5zaXplKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRE5MRF9DTUQ6IGNtZHB0ciBpcyBOdWxsIG9yIGNtZCBzaXplIGlzIFplcm8sICIKKwkJICAgICAgICJOb3Qgc2VuZGluZ1xuIik7CisJCV9fbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWRub2RlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZGFwdGVyLT5jdXJfY21kID0gY21kbm9kZTsKKwlhZGFwdGVyLT5jdXJfY21kX3JldGNvZGUgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJbGJzX3ByX2RlYnVnKDEsICJETkxEX0NNRDo6IEJlZm9yZSBkb3dubG9hZCwgc2l6ZSBvZiBjbWQgPSAlZFxuIiwKKwkgICAgICAgY21kcHRyLT5zaXplKTsKKworCWNtZHNpemUgPSBjbWRwdHItPnNpemU7CisKKwljb21tYW5kID0gY3B1X3RvX2xlMTYoY21kcHRyLT5jb21tYW5kKTsKKworCWNtZG5vZGUtPmNtZHdhaXRxd29rZW4gPSAwOworCWNtZHNpemUgPSBjcHVfdG9fbGUxNihjbWRzaXplKTsKKworCXJldCA9IGxpYmVydGFzX3NiaV9ob3N0X3RvX2NhcmQocHJpdiwgTVZNU19DTUQsICh1OCAqKSBjbWRwdHIsIGNtZHNpemUpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRE5MRF9DTUQ6IEhvc3QgdG8gQ2FyZCBmYWlsZWRcbiIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGFkYXB0ZXItPmN1cl9jbWQpOworCQlhZGFwdGVyLT5jdXJfY21kID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBTZW50IGNvbW1hbmQgMHgleCBAICVsdVxuIiwgY29tbWFuZCwgamlmZmllcyk7CisJbGJzX2RiZ19oZXgoIkROTERfQ01EOiBjb21tYW5kIiwgY21kbm9kZS0+YnVmdmlydHVhbGFkZHIsIGNtZHNpemUpOworCisJLyogU2V0dXAgdGhlIHRpbWVyIGFmdGVyIHRyYW5zbWl0IGNvbW1hbmQgKi8KKwlpZiAoY29tbWFuZCA9PSBjbWRfODAyXzExX3NjYW4KKwkgICAgfHwgY29tbWFuZCA9PSBjbWRfODAyXzExX2F1dGhlbnRpY2F0ZQorCSAgICB8fCBjb21tYW5kID09IGNtZF84MDJfMTFfYXNzb2NpYXRlKQorCQltb2RfdGltZXIoJmFkYXB0ZXItPmNvbW1hbmRfdGltZXIsIGppZmZpZXMgKyAoMTAqSFopKTsKKwllbHNlCisJCW1vZF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lciwgamlmZmllcyArICg1KkhaKSk7CisKKwlyZXQgPSAwOworCisgICAgICBkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9tYWNfY29udHJvbCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQoreworCXN0cnVjdCBjbWRfZHNfbWFjX2NvbnRyb2wgKm1hYyA9ICZjbWQtPnBhcmFtcy5tYWNjdHJsOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9tYWNfY29udHJvbCk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfbWFjX2NvbnRyb2wpICsgU19EU19HRU4pOworCW1hYy0+YWN0aW9uID0gY3B1X3RvX2xlMTYocHJpdi0+YWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlcik7CisKKwlsYnNfcHJfZGVidWcoMSwgIndsYW5fY21kX21hY19jb250cm9sKCk6IGFjdGlvbj0weCVYIHNpemU9JWRcbiIsCisJICAgICAgIG1hYy0+YWN0aW9uLCBjbWQtPnNpemUpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGNvbW1hbmQgbm9kZSB0byBjbWRmcmVlcQorICogIGFmdGVyIGNsZWFucyBpdC4gUmVxdWlyZXMgYWRhcHRlci0+ZHJpdmVyX2xvY2sgaGVsZC4KKyAqLwordm9pZCBfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wY21kKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlpZiAoIXB0ZW1wY21kKQorCQlnb3RvIGRvbmU7CisKKwljbGVhbnVwX2NtZG5vZGUocHRlbXBjbWQpOworCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKilwdGVtcGNtZCwgJmFkYXB0ZXItPmNtZGZyZWVxKTsKK2RvbmU6CisJcmV0dXJuOworfQorCit2b2lkIGxpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgcHRlbXBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBsaWJlcnRhc19zZXRfcmFkaW9fY29udHJvbCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wsCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJbGJzX3ByX2RlYnVnKDEsICJSQURJT19TRVQ6IG9uIG9yIG9mZjogMHglWCwgcHJlYW1ibGUgPSAweCVYXG4iLAorCSAgICAgICBwcml2LT5hZGFwdGVyLT5yYWRpb29uLCBwcml2LT5hZGFwdGVyLT5wcmVhbWJsZSk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19zZXRfbWFjX3BhY2tldF9maWx0ZXIod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgImxpYmVydGFzX3NldF9tYWNfcGFja2V0X2ZpbHRlciB2YWx1ZSA9ICV4XG4iLAorCSAgICAgICBwcml2LT5hZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyKTsKKworCS8qIFNlbmQgTUFDIGNvbnRyb2wgY29tbWFuZCB0byBzdGF0aW9uICovCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF9tYWNfY29udHJvbCwgMCwgMCwgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIGNvbW1hbmQgYmVmb3JlIHNlbmQgdG8gZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2CQlBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBjbWRfbm8JY29tbWFuZCBudW1iZXIKKyAqICBAcGFyYW0gY21kX2FjdGlvbgljb21tYW5kIGFjdGlvbjogR0VUIG9yIFNFVAorICogIEBwYXJhbSB3YWl0X29wdGlvbgl3YWl0IG9wdGlvbjogd2FpdCByZXNwb25zZSBvciBub3QKKyAqICBAcGFyYW0gY21kX29pZAljbWQgb2lkOiB0cmVhdGVkIGFzIHN1YiBjb21tYW5kCisgKiAgQHBhcmFtIHBkYXRhX2J1ZglBIHBvaW50ZXIgdG8gaW5mb3JtYWlvbiBidWZmZXIKKyAqICBAcmV0dXJuIAkJMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgIHUxNiBjbWRfbm8sCisJCQkgIHUxNiBjbWRfYWN0aW9uLAorCQkJICB1MTYgd2FpdF9vcHRpb24sIHUzMiBjbWRfb2lkLCB2b2lkICpwZGF0YV9idWYpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZHB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRU5URVIoKTsKKworCWlmICghYWRhcHRlcikgeworCQlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiBhZGFwdGVyIGlzIE51bGxcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogQ2FyZCBpcyBSZW1vdmVkXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWRub2RlID0gbGliZXJ0YXNfZ2V0X2ZyZWVfY21kX2N0cmxfbm9kZShwcml2KTsKKworCWlmIChjbWRub2RlID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogTm8gZnJlZSBjbWRub2RlXG4iKTsKKworCQkvKiBXYWtlIHVwIG1haW4gdGhyZWFkIHRvIGV4ZWN1dGUgbmV4dCBjb21tYW5kICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGliZXJ0YXNfc2V0X2NtZF9jdHJsX25vZGUocHJpdiwgY21kbm9kZSwgY21kX29pZCwgd2FpdF9vcHRpb24sIHBkYXRhX2J1Zik7CisKKwljbWRwdHIgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopY21kbm9kZS0+YnVmdmlydHVhbGFkZHI7CisKKwlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiBWYWwgb2YgY21kIHB0ciA9MHgleCwgY29tbWFuZD0weCVYXG4iLAorCSAgICAgICAodTMyKSBjbWRwdHIsIGNtZF9ubyk7CisKKwlpZiAoIWNtZHB0cikgeworCQlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiBidWZ2aXJ0dWFsYWRkciBvZiBjbWRub2RlIGlzIE5VTExcbiIpOworCQlsaWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFNldCBzZXF1ZW5jZSBudW1iZXIsIGNvbW1hbmQgYW5kIElOVCBvcHRpb24gKi8KKwlhZGFwdGVyLT5zZXFudW0rKzsKKwljbWRwdHItPnNlcW51bSA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnNlcW51bSk7CisKKwljbWRwdHItPmNvbW1hbmQgPSBjbWRfbm87CisJY21kcHRyLT5yZXN1bHQgPSAwOworCisJc3dpdGNoIChjbWRfbm8pIHsKKwljYXNlIGNtZF9nZXRfaHdfc3BlYzoKKwkJcmV0ID0gd2xhbl9jbWRfaHdfc3BlYyhwcml2LCBjbWRwdHIpOworCQlicmVhazsKKwljYXNlIGNtZF84MDJfMTFfcHNfbW9kZToKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3BzX21vZGUocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfc2NhbjoKKwkJcmV0ID0gbGliZXJ0YXNfY21kXzgwMjExX3NjYW4ocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kX21hY19jb250cm9sOgorCQlyZXQgPSB3bGFuX2NtZF9tYWNfY29udHJvbChwcml2LCBjbWRwdHIpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9hc3NvY2lhdGU6CisJY2FzZSBjbWRfODAyXzExX3JlYXNzb2NpYXRlOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyMTFfYXNzb2NpYXRlKHByaXYsIGNtZHB0ciwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGU6CisJCXJldCA9IGxpYmVydGFzX2NtZF84MDIxMV9kZWF1dGhlbnRpY2F0ZShwcml2LCBjbWRwdHIpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9zZXRfd2VwOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfc2V0X3dlcChwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2FkX2hvY19zdGFydDoKKwkJcmV0ID0gbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdGFydChwcml2LCBjbWRwdHIsIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCWNhc2UgY21kX2NvZGVfZG5sZDoKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfcmVzZXQ6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9yZXNldChwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24pOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9nZXRfbG9nOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfZ2V0X2xvZyhwcml2LCBjbWRwdHIpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9hdXRoZW50aWNhdGU6CisJCXJldCA9IGxpYmVydGFzX2NtZF84MDIxMV9hdXRoZW50aWNhdGUocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9nZXRfc3RhdDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2dldF9zdGF0KHByaXYsIGNtZHB0cik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3NubXBfbWliOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfc25tcF9taWIocHJpdiwgY21kcHRyLAorCQkJCQkgICAgICAgY21kX2FjdGlvbiwgY21kX29pZCwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9tYWNfcmVnX2FjY2VzczoKKwljYXNlIGNtZF9iYnBfcmVnX2FjY2VzczoKKwljYXNlIGNtZF9yZl9yZWdfYWNjZXNzOgorCQlyZXQgPSB3bGFuX2NtZF9yZWdfYWNjZXNzKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfcmZfY2hhbm5lbDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3JmX2NoYW5uZWwocHJpdiwgY21kcHRyLAorCQkJCQkJIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3JmX3R4X3Bvd2VyOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcmZfdHhfcG93ZXIocHJpdiwgY21kcHRyLAorCQkJCQkJICBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9yYWRpb19jb250cm9sOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcmFkaW9fY29udHJvbChwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24pOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9yZl9hbnRlbm5hOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcmZfYW50ZW5uYShwcml2LCBjbWRwdHIsCisJCQkJCQkgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZGF0YV9yYXRlOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfZGF0YV9yYXRlKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCWNhc2UgY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQ6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQocHJpdiwKKwkJCQkJCQkgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9tYWNfbXVsdGljYXN0X2FkcjoKKwkJcmV0ID0gd2xhbl9jbWRfbWFjX211bHRpY2FzdF9hZHIocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfYWRfaG9jX2pvaW46CisJCXJldCA9IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfam9pbihwcml2LCBjbWRwdHIsIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3Jzc2k6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9yc3NpKHByaXYsIGNtZHB0cik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2FkX2hvY19zdG9wOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX3N0b3AocHJpdiwgY21kcHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZW5hYmxlX3JzbjoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2VuYWJsZV9yc24ocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfa2V5X21hdGVyaWFsOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfa2V5X21hdGVyaWFsKHByaXYsIGNtZHB0ciwKKwkJCQkJCSAgIGNtZF9hY3Rpb24sIGNtZF9vaWQsCisJCQkJCQkgICBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9wYWlyd2lzZV90c2M6CisJCWJyZWFrOworCWNhc2UgY21kXzgwMl8xMV9ncm91cF90c2M6CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX21hY19hZGRyZXNzOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfbWFjX2FkZHJlc3MocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZWVwcm9tX2FjY2VzczoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2VlcHJvbV9hY2Nlc3MocHJpdiwgY21kcHRyLAorCQkJCQkJICAgIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3NldF9hZmM6CisJY2FzZSBjbWRfODAyXzExX2dldF9hZmM6CisKKwkJY21kcHRyLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX25vKTsKKwkJY21kcHRyLT5zaXplID0KKwkJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMpICsKKwkJCQkgICAgIFNfRFNfR0VOKTsKKworCQltZW1tb3ZlKCZjbWRwdHItPnBhcmFtcy5hZmMsCisJCQlwZGF0YV9idWYsIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMpKTsKKworCQlyZXQgPSAwOworCQlnb3RvIGRvbmU7CisKKwljYXNlIGNtZF84MDJfMTFkX2RvbWFpbl9pbmZvOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyXzExZF9kb21haW5faW5mbyhwcml2LCBjbWRwdHIsCisJCQkJCQkgICBjbWRfbm8sIGNtZF9hY3Rpb24pOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9zbGVlcF9wYXJhbXM6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9zbGVlcF9wYXJhbXMocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfODAyXzExX2luYWN0aXZpdHlfdGltZW91dDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2luYWN0aXZpdHlfdGltZW91dChwcml2LCBjbWRwdHIsCisJCQkJCQkJIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHByaXYsIGNtZG5vZGUsIDAsIDAsIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3RwY19jZmc6CisJCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfdHBjX2NmZyk7CisJCWNtZHB0ci0+c2l6ZSA9CisJCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZykgKworCQkJCSAgICAgU19EU19HRU4pOworCisJCW1lbW1vdmUoJmNtZHB0ci0+cGFyYW1zLnRwY2NmZywKKwkJCXBkYXRhX2J1Ziwgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcpKTsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIGNtZF84MDJfMTFfbGVkX2dwaW9fY3RybDoKKwkJeworCQkJc3RydWN0IG1ydmxpZXR5cGVzX2xlZGdwaW8gKmdwaW8gPQorCQkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyopCisJCQkgICAgY21kcHRyLT5wYXJhbXMubGVkZ3Bpby5kYXRhOworCisJCQltZW1tb3ZlKCZjbWRwdHItPnBhcmFtcy5sZWRncGlvLAorCQkJCXBkYXRhX2J1ZiwKKwkJCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwpKTsKKworCQkJY21kcHRyLT5jb21tYW5kID0KKwkJCSAgICBjcHVfdG9fbGUxNihjbWRfODAyXzExX2xlZF9ncGlvX2N0cmwpOworCisjZGVmaW5lIEFDVElPTl9OVU1MRURfVExWVFlQRV9MRU5fRklFTERTX0xFTiA4CisJCQljbWRwdHItPnNpemUgPQorCQkJICAgIGNwdV90b19sZTE2KGdwaW8tPmhlYWRlci5sZW4gKyBTX0RTX0dFTiArCisJCQkJCSAgICAgQUNUSU9OX05VTUxFRF9UTFZUWVBFX0xFTl9GSUVMRFNfTEVOKTsKKwkJCWdwaW8tPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihncGlvLT5oZWFkZXIubGVuKTsKKworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBjbWRfODAyXzExX3B3cl9jZmc6CisJCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfcHdyX2NmZyk7CisJCWNtZHB0ci0+c2l6ZSA9CisJCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZykgKworCQkJCSAgICAgU19EU19HRU4pOworCQltZW1tb3ZlKCZjbWRwdHItPnBhcmFtcy5wd3JjZmcsIHBkYXRhX2J1ZiwKKwkJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wd3JfY2ZnKSk7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBjbWRfYnRfYWNjZXNzOgorCQlyZXQgPSB3bGFuX2NtZF9idF9hY2Nlc3MocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kX2Z3dF9hY2Nlc3M6CisJCXJldCA9IHdsYW5fY21kX2Z3dF9hY2Nlc3MocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kX21lc2hfYWNjZXNzOgorCQlyZXQgPSB3bGFuX2NtZF9tZXNoX2FjY2Vzcyhwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfZ2V0X3RzZjoKKwkJY21kcHRyLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX2dldF90c2YpOworCQljbWRwdHItPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfZ2V0X3RzZikKKwkJCQkgICAgICsgU19EU19HRU4pOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIGNtZF84MDJfMTFfdHhfcmF0ZV9xdWVyeToKKwkJY21kcHRyLT5jb21tYW5kID0KKwkJICAgIGNwdV90b19sZTE2KGNtZF84MDJfMTFfdHhfcmF0ZV9xdWVyeSk7CisJCWNtZHB0ci0+c2l6ZSA9CisJCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF90eF9yYXRlX3F1ZXJ5KSArCisJCQkJICAgICBTX0RTX0dFTik7CisJCWFkYXB0ZXItPnR4cmF0ZSA9IDA7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IHVua25vd24gY29tbWFuZC0gJSN4XG4iLCBjbWRfbm8pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJLyogcmV0dXJuIGVycm9yLCBzaW5jZSB0aGUgY29tbWFuZCBwcmVwYXJhdGlvbiBmYWlsZWQgKi8KKwlpZiAocmV0ICE9IDApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogY29tbWFuZCBwcmVwYXJhdGlvbiBmYWlsZWRcbiIpOworCQlsaWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWNtZG5vZGUtPmNtZHdhaXRxd29rZW4gPSAwOworCisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIGNtZG5vZGUsIDEpOworCWFkYXB0ZXItPm5yX2NtZF9wZW5kaW5nKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCWlmICh3YWl0X29wdGlvbiAmIGNtZF9vcHRpb25fd2FpdGZvcnJzcCkgeworCQlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiBXYWl0IGZvciBDTUQgcmVzcG9uc2VcbiIpOworCQltaWdodF9zbGVlcCgpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCQkgY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKGFkYXB0ZXItPmN1cl9jbWRfcmV0Y29kZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiBjb21tYW5kIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlPSVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+Y3VyX2NtZF9yZXRjb2RlKTsKKwkJYWRhcHRlci0+Y3VyX2NtZF9yZXRjb2RlID0gMDsKKwkJcmV0ID0gLTE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIGNvbW1hbmQgYnVmZmVyIGFuZCBsaW5rCisgKiAgaXQgdG8gY29tbWFuZCBmcmVlIHF1ZXVlLgorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkJMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfYWxsb2NhdGVfY21kX2J1ZmZlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQgPSAwOworCXUzMiB1bGJ1ZnNpemU7CisJdTMyIGk7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnRlbXBjbWRfYXJyYXk7CisJdTggKnB0ZW1wdmlydHVhbGFkZHI7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjbWRDdHJsTm9kZSAqLworCXVsYnVmc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21kX2N0cmxfbm9kZSkgKiBNUlZEUlZfTlVNX09GX0NNRF9CVUZGRVI7CisKKwlpZiAoISh0ZW1wY21kX2FycmF5ID0ga21hbGxvYyh1bGJ1ZnNpemUsIEdGUF9LRVJORUwpKSkgeworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJBTExPQ19DTURfQlVGOiBmYWlsZWQgdG8gYWxsb2NhdGUgdGVtcGNtZF9hcnJheVxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJYWRhcHRlci0+Y21kX2FycmF5ID0gdGVtcGNtZF9hcnJheTsKKwltZW1zZXQoYWRhcHRlci0+Y21kX2FycmF5LCAwLCB1bGJ1ZnNpemUpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY29tbWFuZCBidWZmZXJzICovCisJdWxidWZzaXplID0gTVJWRFJWX1NJWkVfT0ZfQ01EX0JVRkZFUjsKKwlmb3IgKGkgPSAwOyBpIDwgTVJWRFJWX05VTV9PRl9DTURfQlVGRkVSOyBpKyspIHsKKwkJaWYgKCEocHRlbXB2aXJ0dWFsYWRkciA9IGttYWxsb2ModWxidWZzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJBTExPQ19DTURfQlVGOiBwdGVtcHZpcnR1YWxhZGRyOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisKKwkJbWVtc2V0KHB0ZW1wdmlydHVhbGFkZHIsIDAsIHVsYnVmc2l6ZSk7CisKKwkJLyogVXBkYXRlIGNvbW1hbmQgYnVmZmVyIHZpcnR1YWwgKi8KKwkJdGVtcGNtZF9hcnJheVtpXS5idWZ2aXJ0dWFsYWRkciA9IHB0ZW1wdmlydHVhbGFkZHI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1SVkRSVl9OVU1fT0ZfQ01EX0JVRkZFUjsgaSsrKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRlbXBjbWRfYXJyYXlbaV0uY21kd2FpdF9xKTsKKwkJbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCAmdGVtcGNtZF9hcnJheVtpXSk7CisJfQorCisJcmV0ID0gMDsKKyAgICAgIGRvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgY29tbWFuZCBidWZmZXIuCisgKgorICogIEBwYXJhbSBwcml2CQlBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCQkwIG9yIC0xCisgKi8KK2ludCBsaWJlcnRhc19mcmVlX2NtZF9idWZmZXIod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl1MzIgdWxidWZzaXplOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICp0ZW1wY21kX2FycmF5OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyogbmVlZCB0byBjaGVjayBpZiBjbWQgYXJyYXkgaXMgYWxsb2NhdGVkIG9yIG5vdCAqLworCWlmIChhZGFwdGVyLT5jbWRfYXJyYXkgPT0gTlVMTCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkZSRUVfQ01EX0JVRjogY21kX2FycmF5IGlzIE51bGxcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJdGVtcGNtZF9hcnJheSA9IGFkYXB0ZXItPmNtZF9hcnJheTsKKworCS8qIFJlbGVhc2Ugc2hhcmVkIG1lbW9yeSBidWZmZXJzICovCisJdWxidWZzaXplID0gTVJWRFJWX1NJWkVfT0ZfQ01EX0JVRkZFUjsKKwlmb3IgKGkgPSAwOyBpIDwgTVJWRFJWX05VTV9PRl9DTURfQlVGRkVSOyBpKyspIHsKKwkJaWYgKHRlbXBjbWRfYXJyYXlbaV0uYnVmdmlydHVhbGFkZHIpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiRnJlZSBhbGwgdGhlIGFycmF5XG4iKTsKKwkJCWtmcmVlKHRlbXBjbWRfYXJyYXlbaV0uYnVmdmlydHVhbGFkZHIpOworCQkJdGVtcGNtZF9hcnJheVtpXS5idWZ2aXJ0dWFsYWRkciA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIGNtZF9jdHJsX25vZGUgKi8KKwlpZiAoYWRhcHRlci0+Y21kX2FycmF5KSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRnJlZSBjbWRfYXJyYXlcbiIpOworCQlrZnJlZShhZGFwdGVyLT5jbWRfYXJyYXkpOworCQlhZGFwdGVyLT5jbWRfYXJyYXkgPSBOVUxMOworCX0KKworZG9uZToKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBnZXRzIGEgZnJlZSBjb21tYW5kIG5vZGUgaWYgYXZhaWxhYmxlIGluCisgKiAgY29tbWFuZCBmcmVlIHF1ZXVlLgorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIGNtZF9jdHJsX25vZGUgQSBwb2ludGVyIHRvIGNtZF9jdHJsX25vZGUgc3RydWN0dXJlIG9yIE5VTEwKKyAqLworc3RydWN0IGNtZF9jdHJsX25vZGUgKmxpYmVydGFzX2dldF9mcmVlX2NtZF9jdHJsX25vZGUod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqdGVtcG5vZGU7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhZGFwdGVyKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKCFsaXN0X2VtcHR5KCZhZGFwdGVyLT5jbWRmcmVlcSkpIHsKKwkJdGVtcG5vZGUgPSAoc3RydWN0IGNtZF9jdHJsX25vZGUgKilhZGFwdGVyLT5jbWRmcmVlcS5uZXh0OworCQlsaXN0X2RlbCgoc3RydWN0IGxpc3RfaGVhZCAqKXRlbXBub2RlKTsKKwl9IGVsc2UgeworCQlsYnNfcHJfZGVidWcoMSwgIkdFVF9DTURfTk9ERTogY21kX2N0cmxfbm9kZSBpcyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJdGVtcG5vZGUgPSBOVUxMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAodGVtcG5vZGUpIHsKKwkJbGJzX3ByX2RlYnVnKDMsICJHRVRfQ01EX05PREU6IGNtZEN0cmxOb2RlIGF2YWlsYWJsZVxuIik7CisJCWxic19wcl9kZWJ1ZygzLCAiR0VUX0NNRF9OT0RFOiBjbWRDdHJsTm9kZSBBZGRyZXNzID0gJXBcbiIsCisJCSAgICAgICB0ZW1wbm9kZSk7CisJCWNsZWFudXBfY21kbm9kZSh0ZW1wbm9kZSk7CisJfQorCisJcmV0dXJuIHRlbXBub2RlOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjbGVhbnMgY29tbWFuZCBub2RlLgorICoKKyAqICBAcGFyYW0gcHRlbXBub2RlCUEgcG9pbnRlciB0byBjbWRDdHJsTm9kZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkJbi9hCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfY21kbm9kZShzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBub2RlKQoreworCWlmICghcHRlbXBub2RlKQorCQlyZXR1cm47CisJcHRlbXBub2RlLT5jbWR3YWl0cXdva2VuID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnB0ZW1wbm9kZS0+Y21kd2FpdF9xKTsKKwlwdGVtcG5vZGUtPnN0YXR1cyA9IDA7CisJcHRlbXBub2RlLT5jbWRfb2lkID0gKHUzMikgMDsKKwlwdGVtcG5vZGUtPndhaXRfb3B0aW9uID0gMDsKKwlwdGVtcG5vZGUtPnBkYXRhX2J1ZiA9IE5VTEw7CisKKwlpZiAocHRlbXBub2RlLT5idWZ2aXJ0dWFsYWRkciAhPSBOVUxMKQorCQltZW1zZXQocHRlbXBub2RlLT5idWZ2aXJ0dWFsYWRkciwgMCwgTVJWRFJWX1NJWkVfT0ZfQ01EX0JVRkZFUik7CisJcmV0dXJuOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgY29tbWFuZCBub2RlLgorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHRlbXBub2RlCUEgcG9pbnRlciB0byBjbWRfY3RybF9ub2RlIHN0cnVjdHVyZQorICogIEBwYXJhbSBjbWRfb2lkCWNtZCBvaWQ6IHRyZWF0ZWQgYXMgc3ViIGNvbW1hbmQKKyAqICBAcGFyYW0gd2FpdF9vcHRpb24Jd2FpdCBvcHRpb246IHdhaXQgcmVzcG9uc2Ugb3Igbm90CisgKiAgQHBhcmFtIHBkYXRhX2J1ZglBIHBvaW50ZXIgdG8gaW5mb3JtYWlvbiBidWZmZXIKKyAqICBAcmV0dXJuIAkJMCBvciAtMQorICovCit2b2lkIGxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCSAgICBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBub2RlLAorCQkgICAgdTMyIGNtZF9vaWQsIHUxNiB3YWl0X29wdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCUVOVEVSKCk7CisKKwlpZiAoIXB0ZW1wbm9kZSkKKwkJcmV0dXJuOworCisJcHRlbXBub2RlLT5jbWRfb2lkID0gY21kX29pZDsKKwlwdGVtcG5vZGUtPndhaXRfb3B0aW9uID0gd2FpdF9vcHRpb247CisJcHRlbXBub2RlLT5wZGF0YV9idWYgPSBwZGF0YV9idWY7CisKKwlMRUFWRSgpOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBuZXh0IGNvbW1hbmQgaW4gY29tbWFuZAorICogIHBlbmRpbmcgcXVldWUuIEl0IHdpbGwgcHV0IGZpbXdhcmUgYmFjayB0byBQUyBtb2RlCisgKiAgaWYgYXBwbGljYWJsZS4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfZXhlY3V0ZV9uZXh0X2NvbW1hbmQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZHB0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19leGVjdXRlX25leHRfY29tbWFuZFxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChhZGFwdGVyLT5jdXJfY21kKSB7CisJCWxic19wcl9hbGVydCggIkVYRUNfTkVYVF9DTUQ6IHRoZXJlIGlzIGNvbW1hbmQgaW4gcHJvY2Vzc2luZyFcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmYWRhcHRlci0+Y21kcGVuZGluZ3EpKSB7CisJCWNtZG5vZGUgPSAoc3RydWN0IGNtZF9jdHJsX25vZGUgKikKKwkJICAgIGFkYXB0ZXItPmNtZHBlbmRpbmdxLm5leHQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChjbWRub2RlKSB7CisJCWxic19wcl9kZWJ1ZygxLAorCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IEdvdCBuZXh0IGNvbW1hbmQgZnJvbSBjbWRwZW5kaW5ncVxuIik7CisJCWNtZHB0ciA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKiljbWRub2RlLT5idWZ2aXJ0dWFsYWRkcjsKKworCQlpZiAoaXNfY29tbWFuZF9hbGxvd2VkX2luX3BzKGNtZHB0ci0+Y29tbWFuZCkpIHsKKwkJCWlmICgoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9TTEVFUCkKKwkJCSAgICB8fCAoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9QUkVfU0xFRVApCisJCQkgICAgKSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICJFWEVDX05FWFRfQ01EOiBDYW5ub3Qgc2VuZCBjbWQgMHgleCBpbiBwc3N0YXRlICVkXG4iLAorCQkJCSAgICAgICBjbWRwdHItPmNvbW1hbmQsIGFkYXB0ZXItPnBzc3RhdGUpOworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWxic19wcl9kZWJ1ZygxLCAiRVhFQ19ORVhUX0NNRDogT0sgdG8gc2VuZCBjb21tYW5kICIKKwkJCSAgICAgICAiMHgleCBpbiBwc3N0YXRlICVkXG4iLAorCQkJICAgICAgIGNtZHB0ci0+Y29tbWFuZCwgYWRhcHRlci0+cHNzdGF0ZSk7CisJCX0gZWxzZSBpZiAoYWRhcHRlci0+cHNzdGF0ZSAhPSBQU19TVEFURV9GVUxMX1BPV0VSKSB7CisJCQkvKgorCQkJICogMS4gTm9uLVBTIGNvbW1hbmQ6CisJCQkgKiBRdWV1ZSBpdC4gc2V0IG5lZWR0b3dha2V1cCB0byBUUlVFIGlmIGN1cnJlbnQgc3RhdGUKKwkJCSAqIGlzIFNMRUVQLCBvdGhlcndpc2UgY2FsbCBsaWJlcnRhc19wc193YWtldXAgdG8gc2VuZCBFeGl0X1BTLgorCQkJICogMi4gUFMgY29tbWFuZCBidXQgbm90IEV4aXRfUFM6CisJCQkgKiBJZ25vcmUgaXQuCisJCQkgKiAzLiBQUyBjb21tYW5kIEV4aXRfUFM6CisJCQkgKiBTZXQgbmVlZHRvd2FrZXVwIHRvIFRSVUUgaWYgY3VycmVudCBzdGF0ZSBpcyBTTEVFUCwKKwkJCSAqIG90aGVyd2lzZSBzZW5kIHRoaXMgY29tbWFuZCBkb3duIHRvIGZpcm13YXJlCisJCQkgKiBpbW1lZGlhdGVseS4KKwkJCSAqLworCQkJaWYgKGNtZHB0ci0+Y29tbWFuZCAhPQorCQkJICAgIGNwdV90b19sZTE2KGNtZF84MDJfMTFfcHNfbW9kZSkpIHsKKwkJCQkvKiAgUHJlcGFyZSB0byBzZW5kIEV4aXQgUFMsCisJCQkJICogIHRoaXMgbm9uIFBTIGNvbW1hbmQgd2lsbCBiZSBzZW50IGxhdGVyICovCisJCQkJaWYgKChhZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKQorCQkJCSAgICB8fCAoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9QUkVfU0xFRVApCisJCQkJICAgICkgeworCQkJCQkvKiB3LyBuZXcgc2NoZW1lLCBpdCB3aWxsIG5vdCByZWFjaCBoZXJlLgorCQkJCQkgICBzaW5jZSBpdCBpcyBibG9ja2VkIGluIG1haW5fdGhyZWFkLiAqLworCQkJCQlhZGFwdGVyLT5uZWVkdG93YWtldXAgPSAxOworCQkJCX0gZWxzZQorCQkJCQlsaWJlcnRhc19wc193YWtldXAocHJpdiwgMCk7CisKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gZG9uZTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBQUyBjb21tYW5kLiBJZ25vcmUgaXQgaWYgaXQgaXMgbm90IEV4aXRfUFMuCisJCQkJICogb3RoZXJ3aXNlIHNlbmQgaXQgZG93biBpbW1lZGlhdGVseS4KKwkJCQkgKi8KKwkJCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc20gPQorCQkJCSAgICAmY21kcHRyLT5wYXJhbXMucHNtb2RlOworCisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICJFWEVDX05FWFRfQ01EOiBQUyBjbWQtIGFjdGlvbj0weCV4XG4iLAorCQkJCSAgICAgICBwc20tPmFjdGlvbik7CisJCQkJaWYgKHBzbS0+YWN0aW9uICE9CisJCQkJICAgIGNwdV90b19sZTE2KGNtZF9zdWJjbWRfZXhpdF9wcykpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogSWdub3JlIEVudGVyIFBTIGNtZFxuIik7CisJCQkJCWxpc3RfZGVsKChzdHJ1Y3QgbGlzdF9oZWFkICopY21kbm9kZSk7CisJCQkJCWxpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgY21kbm9kZSk7CisKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKworCQkJCWlmICgoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9TTEVFUCkKKwkJCQkgICAgfHwgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKQorCQkJCSAgICApIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogSWdub3JlIEV4aXRQUyBjbWQgaW4gc2xlZXBcbiIpOworCQkJCQlsaXN0X2RlbCgoc3RydWN0IGxpc3RfaGVhZCAqKWNtZG5vZGUpOworCQkJCQlsaWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCQkJCQlhZGFwdGVyLT5uZWVkdG93YWtldXAgPSAxOworCisJCQkJCXJldCA9IDA7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisKKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IFNlbmRpbmcgRXhpdF9QUyBkb3duLi4uXG4iKTsKKwkJCX0KKwkJfQorCQlsaXN0X2RlbCgoc3RydWN0IGxpc3RfaGVhZCAqKWNtZG5vZGUpOworCQlsYnNfcHJfZGVidWcoMSwgIkVYRUNfTkVYVF9DTUQ6IFNlbmRpbmcgMHglMDRYIGNvbW1hbmRcbiIsCisJCSAgICAgICBjbWRwdHItPmNvbW1hbmQpOworCQlEb3dubG9hZGNvbW1hbmRUb1N0YXRpb24ocHJpdiwgY21kbm9kZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogY2hlY2sgaWYgaW4gcG93ZXIgc2F2ZSBtb2RlLCBpZiB5ZXMsIHB1dCB0aGUgZGV2aWNlIGJhY2sKKwkJICogdG8gUFMgbW9kZQorCQkgKi8KKwkJaWYgKChhZGFwdGVyLT5wc21vZGUgIT0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbSkgJiYKKwkJICAgIChhZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX0ZVTExfUE9XRVIpICYmCisJCSAgICAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSkgeworCQkJaWYgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKKwkJCQkvKiBjaGVjayBmb3IgdmFsaWQgV1BBIGdyb3VwIGtleXMgKi8KKwkJCQlpZiAoYWRhcHRlci0+d3BhX21jYXN0X2tleS5sZW4KKwkJCQkgICAgfHwgYWRhcHRlci0+d3BhX3VuaWNhc3Rfa2V5LmxlbikgeworCQkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkJICAgICAgICJFWEVDX05FWFRfQ01EOiBXUEEgZW5hYmxlZCBhbmQgR1RLX1NFVCIKKwkJCQkJICAgICAgICIgZ28gYmFjayB0byBQU19TTEVFUCIpOworCQkJCQlsaWJlcnRhc19wc19zbGVlcChwcml2LCAwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogY29tbWFuZCBQZW5kUSBpcyBlbXB0eSwiCisJCQkJICAgICAgICIgZ28gYmFjayB0byBQU19TTEVFUCIpOworCQkJCWxpYmVydGFzX3BzX3NsZWVwKHByaXYsIDApOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gMDsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBsaWJlcnRhc19zZW5kX2l3ZXZjdXN0b21fZXZlbnQod2xhbl9wcml2YXRlICogcHJpdiwgczggKiBzdHIpCit7CisJdW5pb24gaXdyZXFfZGF0YSBpd3JxOworCXU4IGJ1Zls1MF07CisKKwlFTlRFUigpOworCisJbWVtc2V0KCZpd3JxLCAwLCBzaXplb2YodW5pb24gaXdyZXFfZGF0YSkpOworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiJXMiLCBzdHIpOworCisJaXdycS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpICsgMSArIElXX0VWX0xDUF9MRU47CisKKwkvKiBTZW5kIEV2ZW50IHRvIHVwcGVyIGxheWVyICovCisJbGJzX3ByX2RlYnVnKDEsICJFdmVudCBJbmRpY2F0aW9uIHN0cmluZyA9ICVzXG4iLAorCSAgICAgICAoY2hhciAqKWJ1Zik7CisJbGJzX3ByX2RlYnVnKDEsICJFdmVudCBJbmRpY2F0aW9uIFN0cmluZyBsZW5ndGggPSAlZFxuIiwgaXdycS5kYXRhLmxlbmd0aCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlNlbmRpbmcgd2lyZWxlc3MgZXZlbnQgSVdFVkNVU1RPTSBmb3IgJXNcbiIsIHN0cik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT53bGFuX2Rldi5uZXRkZXYsIElXRVZDVVNUT00sICZpd3JxLCBidWYpOworCisJTEVBVkUoKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgc2VuZGNvbmZpcm1zbGVlcCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCAqIGNtZHB0ciwgdTE2IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiU0VORF9TTEVFUENfQ01EOiBCZWZvcmUgZG93bmxvYWQsIHNpemUgb2YgY21kID0gJWRcbiIsCisJICAgICAgIHNpemUpOworCisJbGJzX2RiZ19oZXgoIlNFTkRfU0xFRVBDX0NNRDogU2xlZXAgY29uZmlybSBjb21tYW5kIiwgY21kcHRyLCBzaXplKTsKKworCXJldCA9IGxpYmVydGFzX3NiaV9ob3N0X3RvX2NhcmQocHJpdiwgTVZNU19DTUQsIGNtZHB0ciwgc2l6ZSk7CisJcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50ID0gRE5MRF9SRVNfUkVDRUlWRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoYWRhcHRlci0+aW50Y291bnRlciB8fCBhZGFwdGVyLT5jdXJyZW50dHhza2IpCisJCWxic19wcl9kZWJ1ZygxLCAiU0VORF9TTEVFUENfQ01EOiBpbnRjb3VudGVyPSVkIGN1cnJlbnR0eHNrYj0lcFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmludGNvdW50ZXIsIGFkYXB0ZXItPmN1cnJlbnR0eHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZXQpIHsKKwkJbGJzX3ByX2FsZXJ0KAorCQkgICAgICAgIlNFTkRfU0xFRVBDX0NNRDogSG9zdCB0byBDYXJkIGZhaWxlZCBmb3IgQ29uZmlybSBTbGVlcFxuIik7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWlmICghYWRhcHRlci0+aW50Y291bnRlcikgeworCQkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX1NMRUVQOworCQl9IGVsc2UgeworCQkJbGJzX3ByX2RlYnVnKDEsICJTRU5EX1NMRUVQQ19DTUQ6IEFmdGVyIHNlbnQsSW50Qz0lZFxuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5pbnRjb3VudGVyKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJCWxic19wcl9kZWJ1ZygxLCAiU0VORF9TTEVFUENfQ01EOiBTZW50IENvbmZpcm0gU2xlZXAgY29tbWFuZFxuIik7CisJCWxic19wcl9kZWJ1ZygxLCAiKyIpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBsaWJlcnRhc19wc19zbGVlcCh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgd2FpdF9vcHRpb24pCit7CisKKwlFTlRFUigpOworCisJLyoKKwkgKiBQUyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIG9ubHkgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZQorCSAqIFJlbW92ZSB0aGlzIGNoZWNrIGlmIGl0IGlzIHRvIGJlIHN1cHBvcnRlZCBpbiBJQlNTIG1vZGUgYWxzbworCSAqLworCisJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcHNfbW9kZSwKKwkJCSAgICAgIGNtZF9zdWJjbWRfZW50ZXJfcHMsIHdhaXRfb3B0aW9uLCAwLCBOVUxMKTsKKworCUxFQVZFKCk7CisJcmV0dXJuOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBzZW5kcyBFaXh0X1BTIGNvbW1hbmQgdG8gZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2ICAgIAlBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSB3YWl0X29wdGlvbgl3YWl0IHJlc3BvbnNlIG9yIG5vdAorICogIEByZXR1cm4gCSAgIAluL2EKKyAqLwordm9pZCBsaWJlcnRhc19wc193YWtldXAod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHdhaXRfb3B0aW9uKQoreworCWVudW0gV0xBTl84MDJfMTFfUE9XRVJfTU9ERSBMb2NhbHBzbW9kZTsKKworCUVOVEVSKCk7CisKKwlMb2NhbHBzbW9kZSA9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW07CisKKwlsYnNfcHJfZGVidWcoMSwgIkV4aXRfUFM6IExvY2FscHNtb2RlID0gJWRcbiIsIExvY2FscHNtb2RlKTsKKworCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3BzX21vZGUsCisJCQkgICAgICBjbWRfc3ViY21kX2V4aXRfcHMsCisJCQkgICAgICB3YWl0X29wdGlvbiwgMCwgJkxvY2FscHNtb2RlKTsKKworCUxFQVZFKCk7CisJcmV0dXJuOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjaGVja3MgY29uZGl0aW9uIGFuZCBwcmVwYXJlcyB0bworICogIHNlbmQgc2xlZXAgY29uZmlybSBjb21tYW5kIHRvIGZpcm13YXJlIGlmIG9rLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICAJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHNtb2RlICAJUG93ZXIgU2F2aW5nIG1vZGUKKyAqICBAcmV0dXJuIAkgICAJbi9hCisgKi8KK3ZvaWQgbGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1MTYgcHNtb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPTA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1OCBhbGxvd2VkID0gMTsKKworCUVOVEVSKCk7CisKKwlpZiAocHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50KSB7CisJCWFsbG93ZWQgPSAwOworCQlsYnNfcHJfZGVidWcoMSwgIkQiKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoYWRhcHRlci0+Y3VyX2NtZCkgeworCQlhbGxvd2VkID0gMDsKKwkJbGJzX3ByX2RlYnVnKDEsICJDIik7CisJfQorCWlmIChhZGFwdGVyLT5pbnRjb3VudGVyID4gMCkgeworCQlhbGxvd2VkID0gMDsKKwkJbGJzX3ByX2RlYnVnKDEsICJJJWQiLCBhZGFwdGVyLT5pbnRjb3VudGVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmIChhbGxvd2VkKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiU2VuZGluZyBsaWJlcnRhc19wc19jb25maXJtX3NsZWVwXG4iKTsKKwkJc2VuZGNvbmZpcm1zbGVlcChwcml2LCAodTggKikgJiBhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLAorCQkJCSBzaXplb2Yoc3RydWN0IFBTX0NNRF9Db25maXJtU2xlZXApKTsKKwl9IGVsc2UgeworCQlsYnNfcHJfZGVidWcoMSwgIlNsZWVwIENvbmZpcm0gaGFzIGJlZW4gZGVsYXllZFxuIik7CisJfQorCisJTEVBVkUoKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIwMTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCkBAIC0wLDAgKzEsMTAzMSBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYW5kbGluZyBvZiBjb21tYW5kCisgICogcmVzcG9uc2VzIGFzIHdlbGwgYXMgZXZlbnRzIGdlbmVyYXRlZCBieSBmaXJtd2FyZS4KKyAgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJzYmkuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImpvaW4uaCIKKyNpbmNsdWRlICJ3ZXh0LmgiCisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgZGlzY29ubmVjdCBldmVudC4gaXQKKyAqICByZXBvcnRzIGRpc2Nvbm5lY3QgdG8gdXBwZXIgbGF5ZXIsIGNsZWFuIHR4L3J4IHBhY2tldHMsCisgKiAgcmVzZXQgbGluayBzdGF0ZSBldGMuCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3ZvaWQgbGliZXJ0YXNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkKKwkJcmV0dXJuOworCisJbGJzX3ByX2RlYnVnKDEsICJIYW5kbGVzIGRpc2Nvbm5lY3QgZXZlbnQuXG4iKTsKKworCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMHgwMCwgRVRIX0FMRU4pOworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkvKgorCSAqIENpc2NvIEFQIHNlbmRzIEVBUCBmYWlsdXJlIGFuZCBkZS1hdXRoIGluIGxlc3MgdGhhbiAwLjUgbXMuCisJICogSXQgY2F1c2VzIHByb2JsZW0gaW4gdGhlIFN1cHBsaWNhbnQKKwkgKi8KKworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+d2xhbl9kZXYubmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworCS8qIEZyZWUgVHggYW5kIFJ4IHBhY2tldHMgKi8KKwlrZnJlZV9za2IocHJpdi0+YWRhcHRlci0+Y3VycmVudHR4c2tiKTsKKwlwcml2LT5hZGFwdGVyLT5jdXJyZW50dHhza2IgPSBOVUxMOworCisJLyogcmVwb3J0IGRpc2Nvbm5lY3QgdG8gdXBwZXIgbGF5ZXIgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKworCS8qIHJlc2V0IFNOUi9ORi9SU1NJIHZhbHVlcyAqLworCW1lbXNldChhZGFwdGVyLT5TTlIsIDB4MDAsIHNpemVvZihhZGFwdGVyLT5TTlIpKTsKKwltZW1zZXQoYWRhcHRlci0+TkYsIDB4MDAsIHNpemVvZihhZGFwdGVyLT5ORikpOworCW1lbXNldChhZGFwdGVyLT5SU1NJLCAweDAwLCBzaXplb2YoYWRhcHRlci0+UlNTSSkpOworCW1lbXNldChhZGFwdGVyLT5yYXdTTlIsIDB4MDAsIHNpemVvZihhZGFwdGVyLT5yYXdTTlIpKTsKKwltZW1zZXQoYWRhcHRlci0+cmF3TkYsIDB4MDAsIHNpemVvZihhZGFwdGVyLT5yYXdORikpOworCWFkYXB0ZXItPm5leHRTTlJORiA9IDA7CisJYWRhcHRlci0+bnVtU05STkYgPSAwOworCWFkYXB0ZXItPnJ4cGRfcmF0ZSA9IDA7CisJbGJzX3ByX2RlYnVnKDEsICJDdXJyZW50IFNTSUQ9JXMsIHNzaWQgbGVuZ3RoPSV1XG4iLAorCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkLAorCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoKTsKKwlsYnNfcHJfZGVidWcoMSwgIlByZXZpb3VzIFNTSUQ9JXMsIHNzaWQgbGVuZ3RoPSV1XG4iLAorCSAgICAgICBhZGFwdGVyLT5wcmV2aW91c3NzaWQuc3NpZCwgYWRhcHRlci0+cHJldmlvdXNzc2lkLnNzaWRsZW5ndGgpOworCisJLyogcmVzZXQgaW50ZXJuYWwgZmxhZ3MgKi8KKwlhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOworCWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAwOworCWFkYXB0ZXItPndwYV9pZV9sZW4gPSAwOworCWFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gV0xBTl8xWF9BVVRIX0FMR19OT05FOworCWFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgPSBDSVBIRVJfTk9ORTsKKworCWFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID0gbGliZXJ0YXNfZGlzY29ubmVjdGVkOworCisJLyoKKwkgKiBtZW1vcml6ZSB0aGUgcHJldmlvdXMgU1NJRCBhbmQgQlNTSUQKKwkgKiBpdCBjb3VsZCBiZSB1c2VkIGZvciByZS1hc3NvYworCSAqLworCW1lbWNweSgmYWRhcHRlci0+cHJldmlvdXNzc2lkLAorCSAgICAgICAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCW1lbWNweShhZGFwdGVyLT5wcmV2aW91c2Jzc2lkLAorCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzaWQsIEVUSF9BTEVOKTsKKworCS8qIG5lZWQgdG8gZXJhc2UgdGhlIGN1cnJlbnQgU1NJRCBhbmQgQlNTSUQgaW5mbyAqLworCWFkYXB0ZXItPnBhdHRlbXB0ZWRic3NkZXNjID0gTlVMTDsKKwltZW1zZXQoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcywgMCwgc2l6ZW9mKGFkYXB0ZXItPmN1cmJzc3BhcmFtcykpOworCisJaWYgKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkvKiBtYWtlIGZpcm13YXJlIHRvIGV4aXQgUFMgbW9kZSAqLworCQlsYnNfcHJfZGVidWcoMSwgIkRpc2Nvbm5lY3RlZCwgc28gZXhpdCBQUyBtb2RlLlxuIik7CisJCWxpYmVydGFzX3BzX3dha2V1cChwcml2LCAwKTsKKwl9Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgTUlDIGZhaWx1cmUgZXZlbnQuCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmEgIGV2ZW50ICAgdGhlIGV2ZW50IGlkCisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9taWNfZmFpbHVyZWV2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHUzMiBldmVudCkKK3sKKwljaGFyIGJ1Zls1MF07CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlzcHJpbnRmKGJ1ZiwgIiVzIiwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiAiKTsKKworCWlmIChldmVudCA9PSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9VTklDQVNUKSB7CisJCXN0cmNhdChidWYsICJ1bmljYXN0ICIpOworCX0gZWxzZSB7CisJCXN0cmNhdChidWYsICJtdWx0aWNhc3QgIik7CisJfQorCisJbGliZXJ0YXNfc2VuZF9pd2V2Y3VzdG9tX2V2ZW50KHByaXYsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfcmVnX2FjY2Vzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgICAgIHUxNiB0eXBlLCBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGNtZF9yZXRfbWFjX3JlZ19hY2Nlc3M6CisJCXsKKwkJCXN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKnJlZzsKKworCQkJcmVnID0KKwkJCSAgICAoc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcyAqKSZyZXNwLT5wYXJhbXMuCisJCQkgICAgbWFjcmVnOworCisJCQlhZGFwdGVyLT5vZmZzZXR2YWx1ZS5vZmZzZXQgPSByZWctPm9mZnNldDsKKwkJCWFkYXB0ZXItPm9mZnNldHZhbHVlLnZhbHVlID0gcmVnLT52YWx1ZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGNtZF9yZXRfYmJwX3JlZ19hY2Nlc3M6CisJCXsKKwkJCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKnJlZzsKKwkJCXJlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKikmcmVzcC0+cGFyYW1zLgorCQkJICAgIGJicHJlZzsKKworCQkJYWRhcHRlci0+b2Zmc2V0dmFsdWUub2Zmc2V0ID0gcmVnLT5vZmZzZXQ7CisJCQlhZGFwdGVyLT5vZmZzZXR2YWx1ZS52YWx1ZSA9IHJlZy0+dmFsdWU7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBjbWRfcmV0X3JmX3JlZ19hY2Nlc3M6CisJCXsKKwkJCXN0cnVjdCBjbWRfZHNfcmZfcmVnX2FjY2VzcyAqcmVnOworCQkJcmVnID0KKwkJCSAgICAoc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzICopJnJlc3AtPnBhcmFtcy4KKwkJCSAgICByZnJlZzsKKworCQkJYWRhcHRlci0+b2Zmc2V0dmFsdWUub2Zmc2V0ID0gcmVnLT5vZmZzZXQ7CisJCQlhZGFwdGVyLT5vZmZzZXR2YWx1ZS52YWx1ZSA9IHJlZy0+dmFsdWU7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfZ2V0X2h3X3NwZWMod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJdTMyIGk7CisJc3RydWN0IGNtZF9kc19nZXRfaHdfc3BlYyAqaHdzcGVjID0gJnJlc3AtPnBhcmFtcy5od3NwZWM7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5md2NhcGluZm8gPSBsZTMyX3RvX2NwdShod3NwZWMtPmZ3Y2FwaW5mbyk7CisKKwlhZGFwdGVyLT5md3JlbGVhc2VudW1iZXIgPSBod3NwZWMtPmZ3cmVsZWFzZW51bWJlcjsKKworCWxic19wcl9kZWJ1ZygxLCAiR0VUX0hXX1NQRUM6IEZXUmVsZWFzZVZlcnNpb24tIDB4JVhcbiIsCisJICAgICAgIGFkYXB0ZXItPmZ3cmVsZWFzZW51bWJlcik7CisJbGJzX3ByX2RlYnVnKDEsICJHRVRfSFdfU1BFQzogUGVybWFuZW50IGFkZHItICUyeDolMng6JTJ4OiUyeDolMng6JTJ4XG4iLAorCSAgICAgICBod3NwZWMtPnBlcm1hbmVudGFkZHJbMF0sIGh3c3BlYy0+cGVybWFuZW50YWRkclsxXSwKKwkgICAgICAgaHdzcGVjLT5wZXJtYW5lbnRhZGRyWzJdLCBod3NwZWMtPnBlcm1hbmVudGFkZHJbM10sCisJICAgICAgIGh3c3BlYy0+cGVybWFuZW50YWRkcls0XSwgaHdzcGVjLT5wZXJtYW5lbnRhZGRyWzVdKTsKKwlsYnNfcHJfZGVidWcoMSwgIkdFVF9IV19TUEVDOiBod2lmdmVyc2lvbj0weCVYICB2ZXJzaW9uPTB4JVhcbiIsCisJICAgICAgIGh3c3BlYy0+aHdpZnZlcnNpb24sIGh3c3BlYy0+dmVyc2lvbik7CisKKwlhZGFwdGVyLT5yZWdpb25jb2RlID0gbGUxNl90b19jcHUoaHdzcGVjLT5yZWdpb25jb2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBNUlZEUlZfTUFYX1JFR0lPTl9DT0RFOyBpKyspIHsKKwkJLyogdXNlIHRoZSByZWdpb24gY29kZSB0byBzZWFyY2ggZm9yIHRoZSBpbmRleCAqLworCQlpZiAoYWRhcHRlci0+cmVnaW9uY29kZSA9PSBsaWJlcnRhc19yZWdpb25fY29kZV90b19pbmRleFtpXSkgeworCQkJYWRhcHRlci0+cmVnaW9udGFibGVpbmRleCA9ICh1MTYpIGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGlmIGl0J3MgdW5pZGVudGlmaWVkIHJlZ2lvbiBjb2RlLCB1c2UgdGhlIGRlZmF1bHQgKFVTQSkgKi8KKwlpZiAoaSA+PSBNUlZEUlZfTUFYX1JFR0lPTl9DT0RFKSB7CisJCWFkYXB0ZXItPnJlZ2lvbmNvZGUgPSAweDEwOworCQlhZGFwdGVyLT5yZWdpb250YWJsZWluZGV4ID0gMDsKKwkJbGJzX3ByX2luZm8oCisJCSAgICAgICAidW5pZGVudGlmaWVkIHJlZ2lvbiBjb2RlLCB1c2UgdGhlIGRlZmF1bHQgKFVTQSlcbiIpOworCX0KKworCWlmIChhZGFwdGVyLT5jdXJyZW50X2FkZHJbMF0gPT0gMHhmZikgeworCQltZW1tb3ZlKGFkYXB0ZXItPmN1cnJlbnRfYWRkciwgaHdzcGVjLT5wZXJtYW5lbnRhZGRyLAorCQkJRVRIX0FMRU4pOworCX0KKworCW1lbWNweShwcml2LT53bGFuX2Rldi5uZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkocHJpdi0+bWVzaF9kZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKworCWlmIChsaWJlcnRhc19zZXRfcmVnaW9udGFibGUocHJpdiwgYWRhcHRlci0+cmVnaW9uY29kZSwgMCkpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAobGliZXJ0YXNfc2V0X3VuaXZlcnNhbHRhYmxlKHByaXYsIDApKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisgICAgICBkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfc2xlZXBfcGFyYW1zKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMgKnNwID0gJnJlc3AtPnBhcmFtcy5zbGVlcF9wYXJhbXM7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgImVycm9yPSV4IG9mZnNldD0leCBzdGFibGV0aW1lPSV4IGNhbGNvbnRyb2w9JXhcbiIKKwkgICAgICAgIiBleHRzbGVlcGNsaz0leFxuIiwgc3AtPmVycm9yLCBzcC0+b2Zmc2V0LAorCSAgICAgICBzcC0+c3RhYmxldGltZSwgc3AtPmNhbGNvbnRyb2wsIHNwLT5leHRlcm5hbHNsZWVwY2xrKTsKKwlhZGFwdGVyLT5zcC5zcF9lcnJvciA9IGxlMTZfdG9fY3B1KHNwLT5lcnJvcik7CisJYWRhcHRlci0+c3Auc3Bfb2Zmc2V0ID0gbGUxNl90b19jcHUoc3AtPm9mZnNldCk7CisJYWRhcHRlci0+c3Auc3Bfc3RhYmxldGltZSA9IGxlMTZfdG9fY3B1KHNwLT5zdGFibGV0aW1lKTsKKwlhZGFwdGVyLT5zcC5zcF9jYWxjb250cm9sID0gbGUxNl90b19jcHUoc3AtPmNhbGNvbnRyb2wpOworCWFkYXB0ZXItPnNwLnNwX2V4dHNsZWVwY2xrID0gbGUxNl90b19jcHUoc3AtPmV4dGVybmFsc2xlZXBjbGspOworCWFkYXB0ZXItPnNwLnNwX3Jlc2VydmVkID0gbGUxNl90b19jcHUoc3AtPnJlc2VydmVkKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3N0YXQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisvKgljdXJyZW50bHkgYWRhcHRlci0+d2xhbjgwMl8xMVN0YXQgaXMgdW51c2VkCisKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfc3RhdCAqcDExU3RhdCA9ICZyZXNwLT5wYXJhbXMuZ3N0YXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCS8vIFRPRE8gQ29udmVydCBpdCB0byBCaWcgZW5kaWFuIGJlZm9yIGNvcHkKKwltZW1jcHkoJmFkYXB0ZXItPndsYW44MDJfMTFTdGF0LAorCSAgICAgICBwMTFTdGF0LCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X3N0YXQpKTsKKyovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3NubXBfbWliKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbm1wX21pYiAqc21pYiA9ICZyZXNwLT5wYXJhbXMuc21pYjsKKwl1MTYgb2lkID0gbGUxNl90b19jcHUoc21pYi0+b2lkKTsKKwl1MTYgcXVlcnl0eXBlID0gbGUxNl90b19jcHUoc21pYi0+cXVlcnl0eXBlKTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlNOTVBfUkVTUDogdmFsdWUgb2YgdGhlIG9pZCA9ICV4LCBxdWVyeXR5cGU9JXhcbiIsIG9pZCwKKwkgICAgICAgcXVlcnl0eXBlKTsKKwlsYnNfcHJfZGVidWcoMSwgIlNOTVBfUkVTUDogQnVmIHNpemUgID0gJXhcbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KHNtaWItPmJ1ZnNpemUpKTsKKworCWlmIChxdWVyeXR5cGUgPT0gY21kX2FjdF9nZXQpIHsKKwkJc3dpdGNoIChvaWQpIHsKKwkJY2FzZSBmcmFndGhyZXNoX2k6CisJCQlwcml2LT5hZGFwdGVyLT5mcmFndGhzZCA9CisJCQkgICAgbGUxNl90b19jcHUoKgorCQkJCQkgICAgICgodW5zaWduZWQgc2hvcnQgKikoc21pYi0+dmFsdWUpKSk7CisJCQlsYnNfcHJfZGVidWcoMSwgIlNOTVBfUkVTUDogZnJhZ3Roc2QgPSV1XG4iLAorCQkJICAgICAgIHByaXYtPmFkYXB0ZXItPmZyYWd0aHNkKTsKKwkJCWJyZWFrOworCQljYXNlIHJ0c3RocmVzaF9pOgorCQkJcHJpdi0+YWRhcHRlci0+cnRzdGhzZCA9CisJCQkgICAgbGUxNl90b19jcHUoKgorCQkJCQkgICAgICgodW5zaWduZWQgc2hvcnQgKikoc21pYi0+dmFsdWUpKSk7CisJCQlsYnNfcHJfZGVidWcoMSwgIlNOTVBfUkVTUDogcnRzdGhzZCA9JXVcbiIsCisJCQkgICAgICAgcHJpdi0+YWRhcHRlci0+cnRzdGhzZCk7CisJCQlicmVhazsKKwkJY2FzZSBzaG9ydF9yZXRyeWxpbV9pOgorCQkJcHJpdi0+YWRhcHRlci0+dHhyZXRyeWNvdW50ID0KKwkJCSAgICBsZTE2X3RvX2NwdSgqCisJCQkJCSAgICAgKCh1bnNpZ25lZCBzaG9ydCAqKShzbWliLT52YWx1ZSkpKTsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU05NUF9SRVNQOiB0eHJldHJ5Y291bnQgPSV1XG4iLAorCQkJICAgICAgIHByaXYtPmFkYXB0ZXItPnJ0c3Roc2QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX2tleV9tYXRlcmlhbCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfa2V5X21hdGVyaWFsICpwa2V5bWF0ZXJpYWwgPQorCSAgICAmcmVzcC0+cGFyYW1zLmtleW1hdGVyaWFsOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBrZXltYXRlcmlhbC0+YWN0aW9uKTsKKworCUVOVEVSKCk7CisKKwkvKiBDb3B5IHRoZSByZXR1cm5lZCBrZXkgdG8gZHJpdmVyIHByaXZhdGUgZGF0YSAqLworCWlmIChhY3Rpb24gPT0gY21kX2FjdF9nZXQpIHsKKwkJdTggKiBidWZfcHRyID0gKHU4ICopICZwa2V5bWF0ZXJpYWwtPmtleVBhcmFtU2V0OworCQl1OCAqIHJlc3BfZW5kID0gKHU4ICopIChyZXNwICsgbGUxNl90b19jcHUocmVzcC0+c2l6ZSkpOworCisJCXdoaWxlIChidWZfcHRyIDwgcmVzcF9lbmQpIHsKKwkJCXN0cnVjdCBNcnZsSUV0eXBlX2tleVBhcmFtU2V0ICogcGtleXBhcmFtc2V0ID0KKwkJCSAgICAoc3RydWN0IE1ydmxJRXR5cGVfa2V5UGFyYW1TZXQgKikgYnVmX3B0cjsKKwkJCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgKiBwa2V5OworCQkJdTE2IGtleV9pbmZvID0gbGUxNl90b19jcHUocGtleXBhcmFtc2V0LT5rZXlpbmZvKTsKKwkJCXUxNiBwYXJhbV9zZXRfbGVuID0gbGUxNl90b19jcHUocGtleXBhcmFtc2V0LT5sZW5ndGgpOworCQkJdTggKiBlbmQ7CisJCQl1MTYga2V5X2xlbiA9IGxlMTZfdG9fY3B1KHBrZXlwYXJhbXNldC0+a2V5bGVuKTsKKworCQkJZW5kID0gKHU4ICopIHBrZXlwYXJhbXNldCArIHNpemVvZiAocGtleXBhcmFtc2V0LT50eXBlKQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZiAocGtleXBhcmFtc2V0LT5sZW5ndGgpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1fc2V0X2xlbjsKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBhY2Nlc3MgcGFzdCB0aGUgZW5kIG9mIHRoZSBJRXMgKi8KKwkJCWlmIChlbmQgPiByZXNwX2VuZCkKKwkJCQlicmVhazsKKworCQkJaWYgKGtleV9pbmZvICYgS0VZX0lORk9fV1BBX1VOSUNBU1QpCisJCQkJcGtleSA9ICZhZGFwdGVyLT53cGFfdW5pY2FzdF9rZXk7CisJCQllbHNlIGlmIChrZXlfaW5mbyAmIEtFWV9JTkZPX1dQQV9NQ0FTVCkKKwkJCQlwa2V5ID0gJmFkYXB0ZXItPndwYV9tY2FzdF9rZXk7CisJCQllbHNlCisJCQkJYnJlYWs7CisKKwkJCS8qIENvcHkgcmV0dXJuZWQga2V5IGludG8gZHJpdmVyICovCisJCQltZW1zZXQocGtleSwgMCwgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkpKTsKKwkJCWlmIChrZXlfbGVuID4gc2l6ZW9mKHBrZXktPmtleSkpCisJCQkJYnJlYWs7CisJCQlwa2V5LT50eXBlID0gbGUxNl90b19jcHUocGtleXBhcmFtc2V0LT5rZXl0eXBlaWQpOworCQkJcGtleS0+ZmxhZ3MgPSBsZTE2X3RvX2NwdShwa2V5cGFyYW1zZXQtPmtleWluZm8pOworCQkJcGtleS0+bGVuID0gbGUxNl90b19jcHUocGtleXBhcmFtc2V0LT5rZXlsZW4pOworCQkJbWVtY3B5KHBrZXktPmtleSwgcGtleXBhcmFtc2V0LT5rZXksIHBrZXktPmxlbik7CisKKwkJCWJ1Zl9wdHIgPSBlbmQgKyAxOworCQl9CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfbWFjX2FkZHJlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX21hY19hZGRyZXNzICptYWNhZGQgPSAmcmVzcC0+cGFyYW1zLm1hY2FkZDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCW1lbWNweShhZGFwdGVyLT5jdXJyZW50X2FkZHIsIG1hY2FkZC0+bWFjYWRkLCBFVEhfQUxFTik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9yZl90eF9wb3dlcih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIgKnJ0cCA9ICZyZXNwLT5wYXJhbXMudHhwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJYWRhcHRlci0+dHhwb3dlcmxldmVsID0gbGUxNl90b19jcHUocnRwLT5jdXJyZW50bGV2ZWwpOworCisJbGJzX3ByX2RlYnVnKDEsICJDdXJyZW50IFR4UG93ZXIgTGV2ZWwgPSAlZFxuIiwgYWRhcHRlci0+dHhwb3dlcmxldmVsKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3JmX2FudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSAqcEFudGVubmEgPSAmcmVzcC0+cGFyYW1zLnJhbnQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1MTYgYWN0aW9uID0gbGUxNl90b19jcHUocEFudGVubmEtPmFjdGlvbik7CisKKwlpZiAoYWN0aW9uID09IGNtZF9hY3RfZ2V0X3J4KQorCQlhZGFwdGVyLT5yeGFudGVubmFtb2RlID0KKwkJICAgIGxlMTZfdG9fY3B1KHBBbnRlbm5hLT5hbnRlbm5hbW9kZSk7CisKKwlpZiAoYWN0aW9uID09IGNtZF9hY3RfZ2V0X3R4KQorCQlhZGFwdGVyLT50eGFudGVubmFtb2RlID0KKwkJICAgIGxlMTZfdG9fY3B1KHBBbnRlbm5hLT5hbnRlbm5hbW9kZSk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlJGX0FOVF9SRVNQOiBhY3Rpb24gPSAweCV4LCBtb2RlID0gMHglMDR4XG4iLAorCSAgICAgICBhY3Rpb24sIGxlMTZfdG9fY3B1KHBBbnRlbm5hLT5hbnRlbm5hbW9kZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0ICpyYXRlcyA9CisJICAgICZyZXNwLT5wYXJhbXMucmF0ZXNldDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWlmIChyYXRlcy0+YWN0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCWFkYXB0ZXItPmVuYWJsZWh3YXV0byA9IHJhdGVzLT5lbmFibGVod2F1dG87CisJCWFkYXB0ZXItPnJhdGViaXRtYXAgPSByYXRlcy0+Yml0bWFwOworCX0KKworCUxFQVZFKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfZGF0YV9yYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlICpwZGF0YXJhdGUgPSAmcmVzcC0+cGFyYW1zLmRyYXRlOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggZG90MTFkYXRhcmF0ZTsKKworCUVOVEVSKCk7CisKKwlsYnNfZGJnX2hleCgiREFUQV9SQVRFX1JFU1A6IGRhdGFfcmF0ZS0gIiwKKwkJKHU4ICopIHBkYXRhcmF0ZSwgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2RhdGFfcmF0ZSkpOworCisJZG90MTFkYXRhcmF0ZSA9IHBkYXRhcmF0ZS0+ZGF0YXJhdGVbMF07CisJaWYgKHBkYXRhcmF0ZS0+YWN0aW9uID09IGNtZF9hY3RfZ2V0X3R4X3JhdGUpIHsKKwkJbWVtY3B5KGFkYXB0ZXItPmxpYmVydGFzX3N1cHBvcnRlZF9yYXRlcywgcGRhdGFyYXRlLT5kYXRhcmF0ZSwKKwkJICAgICAgIHNpemVvZihhZGFwdGVyLT5saWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpKTsKKwl9CisJYWRhcHRlci0+ZGF0YXJhdGUgPSBsaWJlcnRhc19pbmRleF90b19kYXRhX3JhdGUoZG90MTFkYXRhcmF0ZSk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9yZl9jaGFubmVsKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX2NoYW5uZWwgKnJmY2hhbm5lbCA9CisJICAgICZyZXNwLT5wYXJhbXMucmZjaGFubmVsOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHJmY2hhbm5lbC0+YWN0aW9uKTsKKwl1MTYgbmV3Y2hhbm5lbCA9IGxlMTZfdG9fY3B1KHJmY2hhbm5lbC0+Y3VycmVudGNoYW5uZWwpOworCisJRU5URVIoKTsKKworCWlmIChhY3Rpb24gPT0gY21kX29wdF84MDJfMTFfcmZfY2hhbm5lbF9nZXQKKwkgICAgJiYgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgIT0gbmV3Y2hhbm5lbCkgeworCQlsYnNfcHJfZGVidWcoMSwgImNoYW5uZWwgU3dpdGNoOiAlZCB0byAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsLCBuZXdjaGFubmVsKTsKKworCQkvKiBVcGRhdGUgdGhlIGNoYW5uZWwgYWdhaW4gKi8KKwkJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPSBuZXdjaGFubmVsOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3Jzc2kod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaV9yc3AgKnJzc2lyc3AgPSAmcmVzcC0+cGFyYW1zLnJzc2lyc3A7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCS8qIHN0b3JlIHRoZSBub24gYXZlcmFnZSB2YWx1ZSAqLworCWFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPSBsZTE2X3RvX2NwdShyc3NpcnNwLT5TTlIpOworCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9CisJICAgIGxlMTZfdG9fY3B1KHJzc2lyc3AtPm5vaXNlZmxvb3IpOworCisJYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gPSBsZTE2X3RvX2NwdShyc3NpcnNwLT5hdmdTTlIpOworCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gPQorCSAgICBsZTE2X3RvX2NwdShyc3NpcnNwLT5hdmdub2lzZWZsb29yKTsKKworCWFkYXB0ZXItPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddID0KKwkgICAgQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSwKKwkJICAgICBhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOworCisJYWRhcHRlci0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9BVkddID0KKwkgICAgQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUsCisJCSAgICAgYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkJlYWNvbiBSU1NJIHZhbHVlID0gMHgleFxuIiwKKwkgICAgICAgYWRhcHRlci0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9BVkddKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9lZXByb21fYWNjZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3Qgd2xhbl9pb2N0bF9yZWdyZHdyICpwYnVmOworCXBidWYgPSAoc3RydWN0IHdsYW5faW9jdGxfcmVncmR3ciAqKSBhZGFwdGVyLT5wcmRlZXByb207CisKKwlsYnNfcHJfZGVidWcoMSwgImVlcHJvbSByZWFkIGxlbj0leFxuIiwKKwkgICAgICAgbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCkpOworCWlmIChwYnVmLT5OT0IgPCBsZTE2X3RvX2NwdShyZXNwLT5wYXJhbXMucmRlZXByb20uYnl0ZWNvdW50KSkgeworCQlwYnVmLT5OT0IgPSAwOworCQlsYnNfcHJfZGVidWcoMSwgImVlcHJvbSByZWFkIHJldHVybiBsZW5ndGggaXMgdG9vIGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJcGJ1Zi0+Tk9CID0gbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCk7CisJaWYgKHBidWYtPk5PQiA+IDApIHsKKworCQltZW1jcHkoJnBidWYtPnZhbHVlLCAodTggKikgJiByZXNwLT5wYXJhbXMucmRlZXByb20udmFsdWUsCisJCSAgICAgICBsZTE2X3RvX2NwdShyZXNwLT5wYXJhbXMucmRlZXByb20uYnl0ZWNvdW50KSk7CisJCWxic19kYmdfaGV4KCJhZGFwdGVyIiwgKGNoYXIgKikmcGJ1Zi0+dmFsdWUsCisJCQlsZTE2X3RvX2NwdShyZXNwLT5wYXJhbXMucmRlZXByb20uYnl0ZWNvdW50KSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0X2dldF9sb2cod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X2xvZyAqbG9nbWVzc2FnZSA9CisJICAgIChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfbG9nICopJnJlc3AtPnBhcmFtcy5nbG9nOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyogVE9ETyBDb252ZXJ0IGl0IHRvIEJpZyBFbmRpYW4gYmVmb3JlIGNvcHkgKi8KKwltZW1jcHkoJmFkYXB0ZXItPmxvZ21zZywgbG9nbWVzc2FnZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cpKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9jbWRfcmVzcG9uc2UodTE2IHJlc3BjbWQsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwLAorCQkJCSAgICAgIHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlzd2l0Y2ggKHJlc3BjbWQpIHsKKwljYXNlIGNtZF9yZXRfbWFjX3JlZ19hY2Nlc3M6CisJY2FzZSBjbWRfcmV0X2JicF9yZWdfYWNjZXNzOgorCWNhc2UgY21kX3JldF9yZl9yZWdfYWNjZXNzOgorCQlyZXQgPSB3bGFuX3JldF9yZWdfYWNjZXNzKHByaXYsIHJlc3BjbWQsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF9od19zcGVjX2luZm86CisJCXJldCA9IHdsYW5fcmV0X2dldF9od19zcGVjKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfc2NhbjoKKwkJcmV0ID0gbGliZXJ0YXNfcmV0XzgwMjExX3NjYW4ocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9nZXRfbG9nOgorCQlyZXQgPSB3bGFuX3JldF9nZXRfbG9nKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfYXNzb2NpYXRlOgorCWNhc2UgY21kX3JldF84MDJfMTFfcmVhc3NvY2lhdGU6CisJCXJldCA9IGxpYmVydGFzX3JldF84MDIxMV9hc3NvY2lhdGUocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9kaXNhc3NvY2lhdGU6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9kZWF1dGhlbnRpY2F0ZToKKwkJcmV0ID0gbGliZXJ0YXNfcmV0XzgwMjExX2Rpc2Fzc29jaWF0ZShwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX2FkX2hvY19zdGFydDoKKwljYXNlIGNtZF9yZXRfODAyXzExX2FkX2hvY19qb2luOgorCQlyZXQgPSBsaWJlcnRhc19yZXRfODAyMTFfYWRfaG9jX3N0YXJ0KHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfc3RhdDoKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX3N0YXQocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9zbm1wX21pYjoKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX3NubXBfbWliKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfcmZfdHhfcG93ZXI6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9yZl90eF9wb3dlcihwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3NldF9hZmM6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9nZXRfYWZjOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJbWVtbW92ZShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCQkmcmVzcC0+cGFyYW1zLmFmYywKKwkJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfODAyXzExX3JmX2FudGVubmE6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9yZl9hbnRlbm5hKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF9tYWNfbXVsdGljYXN0X2FkcjoKKwljYXNlIGNtZF9yZXRfbWFjX2NvbnRyb2w6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9zZXRfd2VwOgorCWNhc2UgY21kX3JldF84MDJfMTFfcmVzZXQ6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9hdXRoZW50aWNhdGU6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9yYWRpb19jb250cm9sOgorCWNhc2UgY21kX3JldF84MDJfMTFfYmVhY29uX3N0b3A6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9lbmFibGVfcnNuOgorCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfZGF0YV9yYXRlOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfZGF0YV9yYXRlKHByaXYsIHJlc3ApOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldDoKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldChwcml2LCByZXNwKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9yZl9jaGFubmVsOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfcmZfY2hhbm5lbChwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3Jzc2k6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9yc3NpKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfbWFjX2FkZHJlc3M6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9tYWNfYWRkcmVzcyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX2FkX2hvY19zdG9wOgorCQlyZXQgPSBsaWJlcnRhc19yZXRfODAyMTFfYWRfaG9jX3N0b3AocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9rZXlfbWF0ZXJpYWw6CisJCWxic19wcl9kZWJ1ZygxLCAiQ01EX1JFU1A6IEtFWV9NQVRFUklBTCBjb21tYW5kIHJlc3BvbnNlXG4iKTsKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX2tleV9tYXRlcmlhbChwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX2VlcHJvbV9hY2Nlc3M6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9lZXByb21fYWNjZXNzKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFkX2RvbWFpbl9pbmZvOgorCQlyZXQgPSBsaWJlcnRhc19yZXRfODAyXzExZF9kb21haW5faW5mbyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3NsZWVwX3BhcmFtczoKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX3NsZWVwX3BhcmFtcyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkqKCh1MTYgKikgYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmKSA9CisJCSAgICBsZTE2X3RvX2NwdShyZXNwLT5wYXJhbXMuaW5hY3Rpdml0eV90aW1lb3V0LnRpbWVvdXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfdHBjX2NmZzoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCW1lbW1vdmUoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmLAorCQkJJnJlc3AtPnBhcmFtcy50cGNjZmcsCisJCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfdHBjX2NmZykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfODAyXzExX2xlZF9ncGlvX2N0cmw6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQltZW1tb3ZlKGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJCSZyZXNwLT5wYXJhbXMubGVkZ3BpbywKKwkJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9sZWRfY3RybCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfODAyXzExX3B3cl9jZmc6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQltZW1tb3ZlKGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJCSZyZXNwLT5wYXJhbXMucHdyY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3B3cl9jZmcpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCQlicmVhazsKKworCWNhc2UgY21kX3JldF9nZXRfdHNmOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJbWVtY3B5KHByaXYtPmFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJICAgICAgICZyZXNwLT5wYXJhbXMuZ2V0dHNmLnRzZnZhbHVlLCBzaXplb2YodTY0KSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgY21kX3JldF9idF9hY2Nlc3M6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmKQorCQkJbWVtY3B5KGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJCSAgICAgICAmcmVzcC0+cGFyYW1zLmJ0LmFkZHIxLCAyICogRVRIX0FMRU4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfZnd0X2FjY2VzczoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWlmIChhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYpCisJCQltZW1jcHkoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmLAorCQkJICAgICAgICZyZXNwLT5wYXJhbXMuZnd0LAorCQkJCXNpemVvZihyZXNwLT5wYXJhbXMuZnd0KSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgY21kX3JldF9tZXNoX2FjY2VzczoKKwkJaWYgKGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZikKKwkJCW1lbWNweShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCQkgICAgICAgJnJlc3AtPnBhcmFtcy5tZXNoLAorCQkJICAgICAgIHNpemVvZihyZXNwLT5wYXJhbXMubWVzaCkpOworCQlicmVhazsKKwljYXNlIGNtZF9ydGVfODAyXzExX3R4X3JhdGVfcXVlcnk6CisJCXByaXYtPmFkYXB0ZXItPnR4cmF0ZSA9IHJlc3AtPnBhcmFtcy50eHJhdGUudHhyYXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBVbmtub3duIGNvbW1hbmQgcmVzcG9uc2UgJSN4XG4iLAorCQkgICAgICAgcmVzcC0+Y29tbWFuZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19yeF9jb21tYW5kKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJdTE2IHJlc3BjbWQ7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJdWxvbmcgZmxhZ3M7CisJdTE2IHJlc3VsdDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBAICVsdVxuIiwgamlmZmllcyk7CisKKwkvKiBOb3cgd2UgZ290IHJlc3BvbnNlIGZyb20gRlcsIGNhbmNlbCB0aGUgY29tbWFuZCB0aW1lciAqLworCWRlbF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lcik7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmICghYWRhcHRlci0+Y3VyX2NtZCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBOVUxMIGN1cl9jbWQ9JXBcbiIsIGFkYXB0ZXItPmN1cl9jbWQpOworCQlyZXQgPSAtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJZ290byBkb25lOworCX0KKwlyZXNwID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKShhZGFwdGVyLT5jdXJfY21kLT5idWZ2aXJ0dWFsYWRkcik7CisKKwlsYnNfZGJnX2hleCgiQ01EX1JFU1A6IiwgYWRhcHRlci0+Y3VyX2NtZC0+YnVmdmlydHVhbGFkZHIsCisJCXByaXYtPndsYW5fZGV2LnVwbGRfbGVuKTsKKworCXJlc3BjbWQgPSBsZTE2X3RvX2NwdShyZXNwLT5jb21tYW5kKTsKKworCXJlc3VsdCA9IGxlMTZfdG9fY3B1KHJlc3AtPnJlc3VsdCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiAleCByZXN1bHQ6ICVkIGxlbmd0aDogJWRcbiIsIHJlc3BjbWQsCisJICAgICAgIHJlc3VsdCwgcHJpdi0+d2xhbl9kZXYudXBsZF9sZW4pOworCisJaWYgKCEocmVzcGNtZCAmIDB4ODAwMCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIHJlc3BvbnNlIHRvIGNvbW1hbmQhIik7CisJCWFkYXB0ZXItPmN1cl9jbWRfcmV0Y29kZSA9IC0xOworCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgYWRhcHRlci0+Y3VyX2NtZCk7CisJCWFkYXB0ZXItPm5yX2NtZF9wZW5kaW5nLS07CisJCWFkYXB0ZXItPmN1cl9jbWQgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCS8qIFN0b3JlIHRoZSByZXNwb25zZSBjb2RlIHRvIGN1cl9jbWRfcmV0Y29kZS4gKi8KKwlhZGFwdGVyLT5jdXJfY21kX3JldGNvZGUgPSBsZTE2X3RvX2NwdShyZXNwLT5yZXN1bHQpOworCisJaWYgKHJlc3BjbWQgPT0gY21kX3JldF84MDJfMTFfcHNfbW9kZSkgeworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc21vZGU7CisKKwkJcHNtb2RlID0gJnJlc3AtPnBhcmFtcy5wc21vZGU7CisJCWxic19wcl9kZWJ1ZygxLAorCQkgICAgICAgIkNNRF9SRVNQOiBQU19NT0RFIGNtZCByZXBseSByZXN1bHQ9JSN4IGFjdGlvbj0weCVYXG4iLAorCQkgICAgICAgcmVzcC0+cmVzdWx0LCBwc21vZGUtPmFjdGlvbik7CisJCXBzbW9kZS0+YWN0aW9uID0gY3B1X3RvX2xlMTYocHNtb2RlLT5hY3Rpb24pOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ01EX1JFU1A6IFBTIGNvbW1hbmQgZmFpbGVkLSAlI3ggXG4iLAorCQkJICAgICAgIHJlc3AtPnJlc3VsdCk7CisJCQlpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpYnNzKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBzaG91bGQgbm90IHJlLXRyeSBlbnRlci1wcyBjb21tYW5kIGluCisJCQkJICogYWQtaG9jIG1vZGUuIEl0IHRha2VzIHBsYWNlIGluCisJCQkJICogbGliZXJ0YXNfZXhlY3V0ZV9uZXh0X2NvbW1hbmQoKS4KKwkJCQkgKi8KKwkJCQlpZiAocHNtb2RlLT5hY3Rpb24gPT0gY21kX3N1YmNtZF9lbnRlcl9wcykKKwkJCQkJYWRhcHRlci0+cHNtb2RlID0KKwkJCQkJICAgIHdsYW44MDJfMTFwb3dlcm1vZGVjYW07CisJCQl9CisJCX0gZWxzZSBpZiAocHNtb2RlLT5hY3Rpb24gPT0gY21kX3N1YmNtZF9lbnRlcl9wcykgeworCQkJYWRhcHRlci0+bmVlZHRvd2FrZXVwID0gMDsKKwkJCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9BV0FLRTsKKworCQkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogRW50ZXJfUFMgY29tbWFuZCByZXNwb25zZVxuIik7CisJCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgIT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQkJLyoKKwkJCQkgKiBXaGVuIERlYXV0aCBFdmVudCByZWNlaXZlZCBiZWZvcmUgRW50ZXJfUFMgY29tbWFuZAorCQkJCSAqIHJlc3BvbnNlLCBXZSBuZWVkIHRvIHdha2UgdXAgdGhlIGZpcm13YXJlLgorCQkJCSAqLworCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCSAgICAgICAiRGlzY29ubmVjdGVkLCBHb2luZyB0byBpbnZva2UgbGliZXJ0YXNfcHNfd2FrZXVwXG4iKTsKKworCQkJCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJCQlsaWJlcnRhc19wc193YWtldXAocHJpdiwgMCk7CisJCQkJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAocHNtb2RlLT5hY3Rpb24gPT0gY21kX3N1YmNtZF9leGl0X3BzKSB7CisJCQlhZGFwdGVyLT5uZWVkdG93YWtldXAgPSAwOworCQkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX0ZVTExfUE9XRVI7CisJCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBFeGl0X1BTIGNvbW1hbmQgcmVzcG9uc2VcbiIpOworCQl9IGVsc2UgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogUFMtIGFjdGlvbj0weCVYXG4iLAorCQkJICAgICAgIHBzbW9kZS0+YWN0aW9uKTsKKwkJfQorCisJCV9fbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBhZGFwdGVyLT5jdXJfY21kKTsKKwkJYWRhcHRlci0+bnJfY21kX3BlbmRpbmctLTsKKwkJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChhZGFwdGVyLT5jdXJfY21kLT5jbWRmbGFncyAmIENNRF9GX0hPU1RDTUQpIHsKKwkJLyogQ29weSB0aGUgcmVzcG9uc2UgYmFjayB0byByZXNwb25zZSBidWZmZXIgKi8KKwkJbWVtY3B5KGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwgcmVzcCwgcmVzcC0+c2l6ZSk7CisKKwkJYWRhcHRlci0+Y3VyX2NtZC0+Y21kZmxhZ3MgJj0gfkNNRF9GX0hPU1RDTUQ7CisJfQorCisJLyogSWYgdGhlIGNvbW1hbmQgaXMgbm90IHN1Y2Nlc3NmdWwsIGNsZWFudXAgYW5kIHJldHVybiBmYWlsdXJlICovCisJaWYgKChyZXN1bHQgIT0gMCB8fCAhKHJlc3BjbWQgJiAweDgwMDApKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBjb21tYW5kIHJlcGx5ICUjeCByZXN1bHQ9JSN4XG4iLAorCQkgICAgICAgcmVzcC0+Y29tbWFuZCwgcmVzcC0+cmVzdWx0KTsKKwkJLyoKKwkJICogSGFuZGxpbmcgZXJyb3JzIGhlcmUKKwkJICovCisJCXN3aXRjaCAocmVzcGNtZCkgeworCQljYXNlIGNtZF9yZXRfaHdfc3BlY19pbmZvOgorCQljYXNlIGNtZF9yZXRfODAyXzExX3Jlc2V0OgorCQkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogUmVzZXQgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJYnJlYWs7CisKKwkJfQorCisJCV9fbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBhZGFwdGVyLT5jdXJfY21kKTsKKwkJYWRhcHRlci0+bnJfY21kX3BlbmRpbmctLTsKKwkJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJcmV0ID0gaGFuZGxlX2NtZF9yZXNwb25zZShyZXNwY21kLCByZXNwLCBwcml2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWlmIChhZGFwdGVyLT5jdXJfY21kKSB7CisJCS8qIENsZWFuIHVwIGFuZCBQdXQgY3VycmVudCBjb21tYW5kIGJhY2sgdG8gY21kZnJlZXEgKi8KKwkJX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGFkYXB0ZXItPmN1cl9jbWQpOworCQlhZGFwdGVyLT5ucl9jbWRfcGVuZGluZy0tOworCQlXQVJOX09OKGFkYXB0ZXItPm5yX2NtZF9wZW5kaW5nID4gMTI4KTsKKwkJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19wcm9jZXNzX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1MzIgZXZlbnRjYXVzZTsKKworCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwlldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRjYXVzZTsKKwlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkVWRU5UIENhdXNlICV4XG4iLCBldmVudGNhdXNlKTsKKworCXN3aXRjaCAoZXZlbnRjYXVzZSA+PiBTQklfRVZFTlRfQ0FVU0VfU0hJRlQpIHsKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9MSU5LX1NFTlNFRDoKKwkJbGJzX3ByX2RlYnVnKDEsICJFVkVOVDogTUFDUkVHX0lOVF9DT0RFX0xJTktfU0VOU0VEXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9ERUFVVEhFTlRJQ0FURUQ6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IERlYXV0aGVudGljYXRlZFxuIik7CisJCWxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfRElTQVNTT0NJQVRFRDoKKwkJbGJzX3ByX2RlYnVnKDEsICJFVkVOVDogRGlzYXNzb2NpYXRlZFxuIik7CisJCWxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTElOS19MT1NFX05PX1NDQU46CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IExpbmsgbG9zdFxuIik7CisJCWxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfUFNfU0xFRVA6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IFNMRUVQXG4iKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJfIik7CisKKwkJLyogaGFuZGxlIHVuZXhwZWN0ZWQgUFMgU0xFRVAgZXZlbnQgKi8KKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgIkVWRU5UOiBJbiBGVUxMIFBPV0VSIG1vZGUgLSBpZ25vcmUgUFMgU0xFRVBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX1BSRV9TTEVFUDsKKworCQlsaWJlcnRhc19wc19jb25maXJtX3NsZWVwKHByaXYsICh1MTYpIGFkYXB0ZXItPnBzbW9kZSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9QU19BV0FLRToKKwkJbGJzX3ByX2RlYnVnKDEsICJFVkVOVDogQVdBS0UgXG4iKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJ8Iik7CisKKwkJLyogaGFuZGxlIHVuZXhwZWN0ZWQgUFMgQVdBS0UgZXZlbnQgKi8KKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgIkVWRU5UOiBJbiBGVUxMIFBPV0VSIG1vZGUgLSBpZ25vcmUgUFMgQVdBS0VcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlhZGFwdGVyLT5wc3N0YXRlID0gUFNfU1RBVEVfQVdBS0U7CisKKwkJaWYgKGFkYXB0ZXItPm5lZWR0b3dha2V1cCkgeworCQkJLyoKKwkJCSAqIHdhaXQgZm9yIHRoZSBjb21tYW5kIHByb2Nlc3NpbmcgdG8gZmluaXNoCisJCQkgKiBiZWZvcmUgcmVzdW1pbmcgc2VuZGluZworCQkJICogYWRhcHRlci0+bmVlZHRvd2FrZXVwIHdpbGwgYmUgc2V0IHRvIEZBTFNFCisJCQkgKiBpbiBsaWJlcnRhc19wc193YWtldXAoKQorCQkJICovCisJCQlsYnNfcHJfZGVidWcoMSwgIldha2luZyB1cC4uLlxuIik7CisJCQlsaWJlcnRhc19wc193YWtldXAocHJpdiwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9NSUNfRVJSX1VOSUNBU1Q6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IFVOSUNBU1QgTUlDIEVSUk9SXG4iKTsKKwkJaGFuZGxlX21pY19mYWlsdXJlZXZlbnQocHJpdiwgTUFDUkVHX0lOVF9DT0RFX01JQ19FUlJfVU5JQ0FTVCk7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9NVUxUSUNBU1Q6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IE1VTFRJQ0FTVCBNSUMgRVJST1JcbiIpOworCQloYW5kbGVfbWljX2ZhaWx1cmVldmVudChwcml2LCBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9NVUxUSUNBU1QpOworCQlicmVhazsKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9NSUJfQ0hBTkdFRDoKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9JTklUX0RPTkU6CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfQURIT0NfQkNOX0xPU1Q6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IEhXQUMgLSBBREhPQyBCQ04gTE9TVFxuIik7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfUlNTSV9MT1c6CisJCWxic19wcl9hbGVydCggIkVWRU5UOiBSU1NJX0xPV1xuIik7CisJCWJyZWFrOworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX1NOUl9MT1c6CisJCWxic19wcl9hbGVydCggIkVWRU5UOiBTTlJfTE9XXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTUFYX0ZBSUw6CisJCWxic19wcl9hbGVydCggIkVWRU5UOiBNQVhfRkFJTFxuIik7CisJCWJyZWFrOworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX1JTU0lfSElHSDoKKwkJbGJzX3ByX2FsZXJ0KCAiRVZFTlQ6IFJTU0lfSElHSFxuIik7CisJCWJyZWFrOworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX1NOUl9ISUdIOgorCQlsYnNfcHJfYWxlcnQoICJFVkVOVDogU05SX0hJR0hcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxic19wcl9hbGVydCggIkVWRU5UOiB1bmtub3duIGV2ZW50IGlkOiAlI3hcbiIsCisJCSAgICAgICBldmVudGNhdXNlID4+IFNCSV9FVkVOVF9DQVVTRV9TSElGVCk7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwlhZGFwdGVyLT5ldmVudGNhdXNlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkMWUwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYwpAQCAtMCwwICsxLDE5NjggQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImhvc3QuaCIKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmxpYmVydGFzX2RpciA9IE5VTEw7CitzdGF0aWMgY2hhciAqc3pTdGF0ZXNbXSA9IHsKKwkiQ29ubmVjdGVkIiwKKwkiRGlzY29ubmVjdGVkIgorfTsKKwordm9pZCBsaWJlcnRhc19kZWJ1Z19pbml0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IG9wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVfZHVtbXkoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworICAgICAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHNpemVfdCBsZW4gPSBQQUdFX1NJWkU7CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2Rldl9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCXNzaXplX3QgcmVzOworCisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICJzdGF0ZSA9ICVzXG4iLAorCQkJCXN6U3RhdGVzW3ByaXYtPmFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzXSk7CisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICJyZWdpb25fY29kZSA9ICUwMnhcbiIsCisJCQkJKHUzMikgcHJpdi0+YWRhcHRlci0+cmVnaW9uY29kZSk7CisKKwlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfZ2V0c2NhbnRhYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3QgcG9zID0gMDsKKwlpbnQgbnVtc2NhbnNkb25lID0gMCwgcmVzOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLAorCQkiIyB8IGNoICB8IHNzICB8ICAgICAgIGJzc2lkICAgICAgIHwgICBjYXAgICAgfCAgICBUU0YgICB8IFF1YWwgfCBTU0lEIFxuIik7CisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwl3aGlsZSAobnVtc2NhbnNkb25lIDwgcHJpdi0+YWRhcHRlci0+bnVtaW5zY2FudGFibGUpIHsKKwkJc3RydWN0IGJzc19kZXNjcmlwdG9yICpwYnNzaW5mbzsKKwkJdTE2IGNhcDsKKworCQlwYnNzaW5mbyA9ICZwcml2LT5hZGFwdGVyLT5zY2FudGFibGVbbnVtc2NhbnNkb25lXTsKKwkJbWVtY3B5KCZjYXAsICZwYnNzaW5mby0+Y2FwLCBzaXplb2YoY2FwKSk7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLAorCQkJIiUwMnV8ICUwM2QgfCAlMDNsZCB8ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHwiLAorCQkJbnVtc2NhbnNkb25lLCBwYnNzaW5mby0+Y2hhbm5lbCwgcGJzc2luZm8tPnJzc2ksCisJCQlwYnNzaW5mby0+bWFjYWRkcmVzc1swXSwgcGJzc2luZm8tPm1hY2FkZHJlc3NbMV0sCisJCQlwYnNzaW5mby0+bWFjYWRkcmVzc1syXSwgcGJzc2luZm8tPm1hY2FkZHJlc3NbM10sCisJCQlwYnNzaW5mby0+bWFjYWRkcmVzc1s0XSwgcGJzc2luZm8tPm1hY2FkZHJlc3NbNV0pOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiAlMDR4LSIsIGNhcCk7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWMlYyVjIHwiLAorCQkJCXBic3NpbmZvLT5jYXAuaWJzcyA/ICdBJyA6ICdJJywKKwkJCQlwYnNzaW5mby0+Y2FwLnByaXZhY3kgPyAnUCcgOiAnICcsCisJCQkJcGJzc2luZm8tPmNhcC5zcGVjdHJ1bW1nbXQgPyAnUycgOiAnICcpOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiAlMDhsbHggfCIsIHBic3NpbmZvLT5uZXR3b3JrdHNmKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIgJWQgfCIsCisJCQlTQ0FOX1JTU0kocHJpdi0+YWRhcHRlci0+c2NhbnRhYmxlW251bXNjYW5zZG9uZV0ucnNzaSkpOworCisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiICVzXG4iLCBwYnNzaW5mby0+c3NpZC5zc2lkKTsKKworCQludW1zY2Fuc2RvbmUrKzsKKwl9CisKKwlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3NsZWVwcGFyYW1zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCWxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCBidWZfc2l6ZSwgcmVzOworCWludCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2OworCXN0cnVjdCBzbGVlcF9wYXJhbXMgc3A7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkICVkICVkICVkIiwgJnAxLCAmcDIsICZwMywgJnA0LCAmcDUsICZwNik7CisJaWYgKHJlcyAhPSA2KSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJc3Auc3BfZXJyb3IgPSBwMTsKKwlzcC5zcF9vZmZzZXQgPSBwMjsKKwlzcC5zcF9zdGFibGV0aW1lID0gcDM7CisJc3Auc3BfY2FsY29udHJvbCA9IHA0OworCXNwLnNwX2V4dHNsZWVwY2xrID0gcDU7CisJc3Auc3BfcmVzZXJ2ZWQgPSBwNjsKKworCW1lbWNweSgmcHJpdi0+YWRhcHRlci0+c3AsICZzcCwgc2l6ZW9mKHN0cnVjdCBzbGVlcF9wYXJhbXMpKTsKKworICAgICAgICByZXMgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfODAyXzExX3NsZWVwX3BhcmFtcywKKwkJCQljbWRfYWN0X3NldCwKKwkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKCFyZXMpCisJCXJlcyA9IGNvdW50OworCWVsc2UKKwkJcmVzID0gLUVJTlZBTDsKKworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfc2xlZXBwYXJhbXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzc2l6ZV90IHJlczsKKwlzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisgICAgICAgIHJlcyA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF84MDJfMTFfc2xlZXBfcGFyYW1zLAorCQkJCWNtZF9hY3RfZ2V0LAorCQkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisJaWYgKHJlcykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJcG9zICs9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiJWQgJWQgJWQgJWQgJWQgJWRcbiIsIGFkYXB0ZXItPnNwLnNwX2Vycm9yLAorCQkJYWRhcHRlci0+c3Auc3Bfb2Zmc2V0LCBhZGFwdGVyLT5zcC5zcF9zdGFibGV0aW1lLAorCQkJYWRhcHRlci0+c3Auc3BfY2FsY29udHJvbCwgYWRhcHRlci0+c3Auc3BfZXh0c2xlZXBjbGssCisJCQlhZGFwdGVyLT5zcC5zcF9yZXNlcnZlZCk7CisKKwlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19leHRzY2FuKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgZXh0c2Nhbl9zc2lkOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbWVtY3B5KCZleHRzY2FuX3NzaWQuc3NpZCwgYnVmLCBzdHJsZW4oYnVmKS0xKTsKKwlleHRzY2FuX3NzaWQuc3NpZGxlbmd0aCA9IHN0cmxlbihidWYpLTE7CisKKwlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmZXh0c2Nhbl9zc2lkLCAxKTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHVuaW9uIGl3cmVxX2RhdGEpKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKKworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX3BhcnNlX2NoYW4oY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQlzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZywgaW50IGR1cikKK3sKKwljaGFyICpzdGFydCwgKmVuZCwgKmhvbGQsICpzdHI7CisJaW50IGkgPSAwOworCisJc3RhcnQgPSBzdHJzdHIoYnVmLCAiY2hhbj0iKTsKKwlpZiAoIXN0YXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdGFydCArPSA1OworCWVuZCA9IHN0cnN0cihzdGFydCwgIiAiKTsKKwlpZiAoIWVuZCkKKwkJZW5kID0gYnVmICsgY291bnQ7CisJaG9sZCA9IGt6YWxsb2MoKGVuZCAtIHN0YXJ0KSsxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybiAtRU5PTUVNOworCXN0cm5jcHkoaG9sZCwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKwlob2xkWyhlbmQtc3RhcnQpKzFdID0gJ1wwJzsKKwl3aGlsZShob2xkICYmIChzdHIgPSBzdHJzZXAoJmhvbGQsICIsIikpKSB7CisJCWludCBjaGFuOworCQljaGFyIGJhbmQsIHBhc3NpdmUgPSAwOworCQlzc2NhbmYoc3RyLCAiJWQlYyVjIiwgJmNoYW4sICZiYW5kLCAmcGFzc2l2ZSk7CisJCXNjYW5fY2ZnLT5jaGFubGlzdFtpXS5jaGFubnVtYmVyID0gY2hhbjsKKwkJc2Nhbl9jZmctPmNoYW5saXN0W2ldLnNjYW50eXBlID0gcGFzc2l2ZSA/IDEgOiAwOworCQlpZiAoYmFuZCA9PSAnYicgfHwgYmFuZCA9PSAnZycpCisJCQlzY2FuX2NmZy0+Y2hhbmxpc3RbaV0ucmFkaW90eXBlID0gMDsKKwkJZWxzZSBpZiAoYmFuZCA9PSAnYScpCisJCQlzY2FuX2NmZy0+Y2hhbmxpc3RbaV0ucmFkaW90eXBlID0gMTsKKworCQlzY2FuX2NmZy0+Y2hhbmxpc3RbaV0uc2NhbnRpbWUgPSBkdXI7CisJCWkrKzsKKwl9CisKKwlrZnJlZShob2xkKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgbGliZXJ0YXNfcGFyc2VfYnNzaWQoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkOworCXVuc2lnbmVkIGludCBtYWNbRVRIX0FMRU5dOworCWludCBpOworCisJaG9sZCA9IHN0cnN0cihidWYsICJic3NpZD0iKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybjsKKwlob2xkICs9IDY7CisJc3NjYW5mKGhvbGQsICIlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCIsIG1hYywgbWFjKzEsIG1hYysyLCBtYWMrMywKKwkJCW1hYys0LCBtYWMrNSk7CisJZm9yKGk9MDtpPEVUSF9BTEVOO2krKykKKwkJc2Nhbl9jZmctPnNwZWNpZmljQlNTSURbaV0gPSBtYWNbaV07Cit9CisKK3N0YXRpYyB2b2lkIGxpYmVydGFzX3BhcnNlX3NzaWQoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkLCAqZW5kOworCXNzaXplX3Qgc2l6ZTsKKworCWhvbGQgPSBzdHJzdHIoYnVmLCAic3NpZD0iKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybjsKKwlob2xkICs9IDU7CisJZW5kID0gc3Ryc3RyKGhvbGQsICIgIik7CisJaWYgKCFlbmQpCisJCWVuZCA9IGJ1ZiArIGNvdW50IC0gMTsKKworCXNpemUgPSBtaW4oSVdfRVNTSURfTUFYX1NJWkUsIGVuZCAtIGhvbGQpOworCXN0cm5jcHkoc2Nhbl9jZmctPnNwZWNpZmljU1NJRCwgaG9sZCwgc2l6ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGxpYmVydGFzX3BhcnNlX2tlZXAoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkOworCWludCB2YWw7CisKKwlob2xkID0gc3Ryc3RyKGJ1ZiwgImtlZXA9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm47CisJaG9sZCArPSA1OworCXNzY2FuZihob2xkLCAiJWQiLCAmdmFsKTsKKworCWlmICh2YWwgIT0gMCkKKwkJdmFsID0gMTsKKworCXNjYW5fY2ZnLT5rZWVwcHJldmlvdXNzY2FuID0gdmFsOworCXJldHVybjsKK30KKworc3RhdGljIGludCBsaWJlcnRhc19wYXJzZV9kdXIoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkOworCWludCB2YWw7CisKKwlob2xkID0gc3Ryc3RyKGJ1ZiwgImR1cj0iKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybiAwOworCWhvbGQgKz0gNDsKKwlzc2NhbmYoaG9sZCwgIiVkIiwgJnZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBsaWJlcnRhc19wYXJzZV9wcm9iZXMoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkOworCWludCB2YWw7CisKKwlob2xkID0gc3Ryc3RyKGJ1ZiwgInByb2Jlcz0iKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybjsKKwlob2xkICs9IDc7CisJc3NjYW5mKGhvbGQsICIlZCIsICZ2YWwpOworCisJc2Nhbl9jZmctPm51bXByb2JlcyA9IHZhbDsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbGliZXJ0YXNfcGFyc2VfdHlwZShjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKnNjYW5fY2ZnKQoreworCWNoYXIgKmhvbGQ7CisJaW50IHZhbDsKKworCWhvbGQgPSBzdHJzdHIoYnVmLCAidHlwZT0iKTsKKwlpZiAoIWhvbGQpCisJCXJldHVybjsKKwlob2xkICs9IDU7CisJc3NjYW5mKGhvbGQsICIlZCIsICZ2YWwpOworCisJLyogdHlwZT0xLDIgb3IgMyAqLworCWlmICh2YWwgPCAxIHx8IHZhbCA+IDMpCisJCXJldHVybjsKKworCXNjYW5fY2ZnLT5ic3N0eXBlID0gdmFsOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19zZXR1c2Vyc2NhbihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmc7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCBkdXI7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXNjYW5fY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyksIEdGUF9LRVJORUwpOworCWlmICghc2Nhbl9jZmcpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJc2Nhbl9jZmctPmJzc3R5cGUgPSBXTEFOX1NDQU5fQlNTX1RZUEVfQU5ZOworCisJZHVyID0gbGliZXJ0YXNfcGFyc2VfZHVyKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKwlsaWJlcnRhc19wYXJzZV9jaGFuKGJ1ZiwgY291bnQsIHNjYW5fY2ZnLCBkdXIpOworCWxpYmVydGFzX3BhcnNlX2Jzc2lkKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKwlsaWJlcnRhc19wYXJzZV9zc2lkKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKwlsaWJlcnRhc19wYXJzZV9rZWVwKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKwlsaWJlcnRhc19wYXJzZV9wcm9iZXMoYnVmLCBjb3VudCwgc2Nhbl9jZmcpOworCWxpYmVydGFzX3BhcnNlX3R5cGUoYnVmLCBjb3VudCwgc2Nhbl9jZmcpOworCisJd2xhbl9zY2FuX25ldHdvcmtzKHByaXYsIHNjYW5fY2ZnKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocHJpdi0+YWRhcHRlci0+Y21kX3BlbmRpbmcsCisJCQkJICFwcml2LT5hZGFwdGVyLT5ucl9jbWRfcGVuZGluZyk7CisKKwltZW1zZXQoJndycXUsIDB4MDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT53bGFuX2Rldi5uZXRkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CisKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCWtmcmVlKHNjYW5fY2ZnKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfZXZlbnRfaW5pdGNtZCh3bGFuX3ByaXZhdGUgKnByaXYsIHZvaWQgKipyZXNwb25zZV9idWYsCisJCQlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqKmNtZG5vZGUsCisJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKipjbWQpCit7CisJdTE2IHdhaXRfb3B0aW9uID0gY21kX29wdGlvbl93YWl0Zm9ycnNwOworCisJaWYgKCEoKmNtZG5vZGUgPSBsaWJlcnRhc19nZXRfZnJlZV9jbWRfY3RybF9ub2RlKHByaXYpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCBsaWJlcnRhc19nZXRfZnJlZV9jbWRfY3RybF9ub2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICghKCpyZXNwb25zZV9idWYgPSBrbWFsbG9jKDMwMDAsIEdGUF9LRVJORUwpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCB0byBhbGxvY2F0ZSByZXNwb25zZSBidWZmZXIhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHByaXYsICpjbWRub2RlLCAwLCB3YWl0X29wdGlvbiwgTlVMTCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmKCpjbWRub2RlKS0+Y21kd2FpdF9xKTsKKwkoKmNtZG5vZGUpLT5wZGF0YV9idWYgPSAqcmVzcG9uc2VfYnVmOworCSgqY21kbm9kZSktPmNtZGZsYWdzIHw9IENNRF9GX0hPU1RDTUQ7CisJKCpjbWRub2RlKS0+Y21kd2FpdHF3b2tlbiA9IDA7CisJKmNtZCA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKikoKmNtZG5vZGUpLT5idWZ2aXJ0dWFsYWRkcjsKKwkoKmNtZCktPmNvbW1hbmQgPSBjbWRfODAyXzExX3N1YnNjcmliZV9ldmVudDsKKwkoKmNtZCktPnNlcW51bSA9ICsrcHJpdi0+YWRhcHRlci0+c2VxbnVtOworCSgqY21kKS0+cmVzdWx0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfbG93cnNzaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJaW50IHJlcywgY21kX2xlbjsKKwlzc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApIHsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gcmVzOworCX0KKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3RfZ2V0OworCXBjbWRwdHItPnNpemUgPQorCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsgU19EU19HRU4pOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCWV2ZW50ID0gKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqKShyZXNwb25zZV9idWYgKyBTX0RTX0dFTik7CisJd2hpbGUgKGNtZF9sZW4gPCBwY21kcHRyLT5zaXplKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJc3dpdGNoKGhlYWRlci0+dHlwZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAgKkxvd3Jzc2k7CisJCWNhc2UgVExWX1RZUEVfUlNTSV9MT1c6CisJCUxvd3Jzc2kgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWQgJWQgJWRcbiIsCisJCQkJTG93cnNzaS0+cnNzaXZhbHVlLAorCQkJCUxvd3Jzc2ktPnJzc2lmcmVxLAorCQkJCShldmVudC0+ZXZlbnRzICYgMHgwMDAxKT8xOjApOworCQlkZWZhdWx0OgorCQkJY21kX2xlbiArPSBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHUxNiBsaWJlcnRhc19nZXRfZXZlbnRzX2JpdG1hcCh3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCWludCByZXM7CisJdTE2IGV2ZW50X2JpdG1hcDsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X2dldDsKKwlwY21kcHRyLT5zaXplID0KKwljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArIFNfRFNfR0VOKTsKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXZlbnQgPSAoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICopKHJlc3BvbnNlX2J1ZiArIFNfRFNfR0VOKTsKKwlldmVudF9iaXRtYXAgPSBldmVudC0+ZXZlbnRzOworCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJcmV0dXJuIGV2ZW50X2JpdG1hcDsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfbG93cnNzaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICpyc3NpX3RocmVzaG9sZDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJdTE2IGV2ZW50X2JpdG1hcDsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkIiwgJnZhbHVlLCAmZnJlcSwgJnN1YnNjcmliZWQpOworCWlmIChyZXMgIT0gMykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnRfYml0bWFwID0gbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAocHJpdik7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X3NldDsKKwlwY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4gKworCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArCisJCXNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCkpOworCisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJcHRyID0gKHU4KikgcGNtZHB0citjbWRfbGVuOworCXJzc2lfdGhyZXNob2xkID0gKHN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICopKHB0cik7CisJcnNzaV90aHJlc2hvbGQtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoMHgwMTA0KTsKKwlyc3NpX3RocmVzaG9sZC0+aGVhZGVyLmxlbiA9IDI7CisJcnNzaV90aHJlc2hvbGQtPnJzc2l2YWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlyc3NpX3RocmVzaG9sZC0+cnNzaWZyZXEgPSBjcHVfdG9fbGUxNihmcmVxKTsKKwlldmVudF9iaXRtYXAgfD0gc3Vic2NyaWJlZCA/IDB4MDAwMSA6IDB4MDsKKwlldmVudC0+ZXZlbnRzID0gZXZlbnRfYml0bWFwOworCisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2xvd3Nucl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJaW50IHJlcywgY21kX2xlbjsKKwlzc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApIHsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gcmVzOworCX0KKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3RfZ2V0OworCXBjbWRwdHItPnNpemUgPQorCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsgU19EU19HRU4pOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJZXZlbnQgPSAoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICopKHJlc3BvbnNlX2J1ZiArIFNfRFNfR0VOKTsKKwl3aGlsZSAoY21kX2xlbiA8IHBjbWRwdHItPnNpemUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlzd2l0Y2goaGVhZGVyLT50eXBlKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKkxvd1NucjsKKwkJY2FzZSBUTFZfVFlQRV9TTlJfTE9XOgorCQlMb3dTbnIgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIlZCAlZCAlZFxuIiwKKwkJCQlMb3dTbnItPnNucnZhbHVlLAorCQkJCUxvd1Nuci0+c25yZnJlcSwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAwMik/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfbG93c25yX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCWludCB2YWx1ZSwgZnJlcSwgc3Vic2NyaWJlZCwgY21kX2xlbjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCAqc25yX3RocmVzaG9sZDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJdTE2IGV2ZW50X2JpdG1hcDsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkIiwgJnZhbHVlLCAmZnJlcSwgJnN1YnNjcmliZWQpOworCWlmIChyZXMgIT0gMykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnRfYml0bWFwID0gbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAocHJpdik7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X3NldDsKKwlwY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4gKworCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArCisJCXNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkKSk7CisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJcHRyID0gKHU4KikgcGNtZHB0citjbWRfbGVuOworCXNucl90aHJlc2hvbGQgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCAqKShwdHIpOworCXNucl90aHJlc2hvbGQtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfU05SX0xPVyk7CisJc25yX3RocmVzaG9sZC0+aGVhZGVyLmxlbiA9IDI7CisJc25yX3RocmVzaG9sZC0+c25ydmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJc25yX3RocmVzaG9sZC0+c25yZnJlcSA9IGNwdV90b19sZTE2KGZyZXEpOworCWV2ZW50X2JpdG1hcCB8PSBzdWJzY3JpYmVkID8gMHgwMDAyIDogMHgwOworCWV2ZW50LT5ldmVudHMgPSBldmVudF9iaXRtYXA7CisKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCXJlcyA9IGNvdW50OworCitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19mYWlsY291bnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCWludCByZXMsIGNtZF9sZW47CisJc3NpemVfdCBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X2dldDsKKwlwY21kcHRyLT5zaXplID0KKwljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArIFNfRFNfR0VOKTsKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCWV2ZW50ID0gKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqKShyZXNwb25zZV9idWYgKyBTX0RTX0dFTik7CisJd2hpbGUgKGNtZF9sZW4gPCBwY21kcHRyLT5zaXplKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJc3dpdGNoKGhlYWRlci0+dHlwZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfZmFpbHVyZWNvdW50ICpmYWlsY291bnQ7CisJCWNhc2UgVExWX1RZUEVfRkFJTENPVU5UOgorCQlmYWlsY291bnQgPSAoc3RydWN0IG1ydmxpZXR5cGVzX2ZhaWx1cmVjb3VudCAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIlZCAlZCAlZFxuIiwKKwkJCQlmYWlsY291bnQtPmZhaWx2YWx1ZSwKKwkJCQlmYWlsY291bnQtPkZhaWxmcmVxLAorCQkJCShldmVudC0+ZXZlbnRzICYgMHgwMDA0KT8xOjApOworCQlkZWZhdWx0OgorCQkJY21kX2xlbiArPSBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX2ZhaWx1cmVjb3VudCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfZmFpbGNvdW50X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCWludCB2YWx1ZSwgZnJlcSwgc3Vic2NyaWJlZCwgY21kX2xlbjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJc3RydWN0IG1ydmxpZXR5cGVzX2ZhaWx1cmVjb3VudCAqZmFpbGNvdW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwl1MTYgZXZlbnRfYml0bWFwOworCXU4ICpwdHI7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJWQgJWQgJWQiLCAmdmFsdWUsICZmcmVxLCAmc3Vic2NyaWJlZCk7CisJaWYgKHJlcyAhPSAzKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlldmVudF9iaXRtYXAgPSBsaWJlcnRhc19nZXRfZXZlbnRzX2JpdG1hcChwcml2KTsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3Rfc2V0OworCXBjbWRwdHItPnNpemUgPSBjcHVfdG9fbGUxNihTX0RTX0dFTiArCisJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsKKwkJc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19mYWlsdXJlY291bnQpKTsKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlwdHIgPSAodTgqKSBwY21kcHRyK2NtZF9sZW47CisJZmFpbGNvdW50ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19mYWlsdXJlY291bnQgKikocHRyKTsKKwlmYWlsY291bnQtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfRkFJTENPVU5UKTsKKwlmYWlsY291bnQtPmhlYWRlci5sZW4gPSAyOworCWZhaWxjb3VudC0+ZmFpbHZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCWZhaWxjb3VudC0+RmFpbGZyZXEgPSBjcHVfdG9fbGUxNihmcmVxKTsKKwlldmVudF9iaXRtYXAgfD0gc3Vic2NyaWJlZCA/IDB4MDAwNCA6IDB4MDsKKwlldmVudC0+ZXZlbnRzID0gZXZlbnRfYml0bWFwOworCisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKilyZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19iY25taXNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwlpbnQgcmVzLCBjbWRfbGVuOworCXNzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkgeworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiByZXM7CisJfQorCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9nZXQ7CisJcGNtZHB0ci0+c2l6ZSA9CisJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKyBTX0RTX0dFTik7CisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlldmVudCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKikocmVzcG9uc2VfYnVmICsgU19EU19HRU4pOworCXdoaWxlIChjbWRfbGVuIDwgcGNtZHB0ci0+c2l6ZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXN3aXRjaChoZWFkZXItPnR5cGUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzX2JlYWNvbnNtaXNzZWQgKmJjbm1pc3M7CisJCWNhc2UgVExWX1RZUEVfQkNOTUlTUzoKKwkJYmNubWlzcyA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfYmVhY29uc21pc3NlZCAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIlZCBOL0EgJWRcbiIsCisJCQkJYmNubWlzcy0+YmVhY29ubWlzc2VkLAorCQkJCShldmVudC0+ZXZlbnRzICYgMHgwMDA4KT8xOjApOworCQlkZWZhdWx0OgorCQkJY21kX2xlbiArPSBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX2JlYWNvbnNtaXNzZWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfYmNubWlzc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19iZWFjb25zbWlzc2VkICpiY25taXNzOworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwl1MTYgZXZlbnRfYml0bWFwOworCXU4ICpwdHI7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJWQgJWQgJWQiLCAmdmFsdWUsICZmcmVxLCAmc3Vic2NyaWJlZCk7CisJaWYgKHJlcyAhPSAzKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlldmVudF9iaXRtYXAgPSBsaWJlcnRhc19nZXRfZXZlbnRzX2JpdG1hcChwcml2KTsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3Rfc2V0OworCXBjbWRwdHItPnNpemUgPSBjcHVfdG9fbGUxNihTX0RTX0dFTiArCisJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsKKwkJc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19iZWFjb25zbWlzc2VkKSk7CisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJcHRyID0gKHU4KikgcGNtZHB0citjbWRfbGVuOworCWJjbm1pc3MgPSAoc3RydWN0IG1ydmxpZXR5cGVzX2JlYWNvbnNtaXNzZWQgKikocHRyKTsKKwliY25taXNzLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0JDTk1JU1MpOworCWJjbm1pc3MtPmhlYWRlci5sZW4gPSAyOworCWJjbm1pc3MtPmJlYWNvbm1pc3NlZCA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlldmVudF9iaXRtYXAgfD0gc3Vic2NyaWJlZCA/IDB4MDAwOCA6IDB4MDsKKwlldmVudC0+ZXZlbnRzID0gZXZlbnRfYml0bWFwOworCisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2hpZ2hyc3NpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwlpbnQgcmVzLCBjbWRfbGVuOworCXNzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkgeworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiByZXM7CisJfQorCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9nZXQ7CisJcGNtZHB0ci0+c2l6ZSA9CisJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKyBTX0RTX0dFTik7CisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlldmVudCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKikocmVzcG9uc2VfYnVmICsgU19EU19HRU4pOworCXdoaWxlIChjbWRfbGVuIDwgcGNtZHB0ci0+c2l6ZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXN3aXRjaChoZWFkZXItPnR5cGUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgICpIaWdocnNzaTsKKwkJY2FzZSBUTFZfVFlQRV9SU1NJX0hJR0g6CisJCUhpZ2hyc3NpID0gKHN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiVkICVkICVkXG4iLAorCQkJCUhpZ2hyc3NpLT5yc3NpdmFsdWUsCisJCQkJSGlnaHJzc2ktPnJzc2lmcmVxLAorCQkJCShldmVudC0+ZXZlbnRzICYgMHgwMDEwKT8xOjApOworCQlkZWZhdWx0OgorCQkJY21kX2xlbiArPSBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisKKwlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19oaWdocnNzaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICpyc3NpX3RocmVzaG9sZDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJdTE2IGV2ZW50X2JpdG1hcDsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkIiwgJnZhbHVlLCAmZnJlcSwgJnN1YnNjcmliZWQpOworCWlmIChyZXMgIT0gMykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnRfYml0bWFwID0gbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAocHJpdik7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X3NldDsKKwlwY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4gKworCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArCisJCXNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCkpOworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCXB0ciA9ICh1OCopIHBjbWRwdHIrY21kX2xlbjsKKwlyc3NpX3RocmVzaG9sZCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAqKShwdHIpOworCXJzc2lfdGhyZXNob2xkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1JTU0lfSElHSCk7CisJcnNzaV90aHJlc2hvbGQtPmhlYWRlci5sZW4gPSAyOworCXJzc2lfdGhyZXNob2xkLT5yc3NpdmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJcnNzaV90aHJlc2hvbGQtPnJzc2lmcmVxID0gY3B1X3RvX2xlMTYoZnJlcSk7CisJZXZlbnRfYml0bWFwIHw9IHN1YnNjcmliZWQgPyAweDAwMTAgOiAweDA7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50X2JpdG1hcDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2hpZ2hzbnJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCWludCByZXMsIGNtZF9sZW47CisJc3NpemVfdCBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X2dldDsKKwlwY21kcHRyLT5zaXplID0KKwljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArIFNfRFNfR0VOKTsKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCWV2ZW50ID0gKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqKShyZXNwb25zZV9idWYgKyBTX0RTX0dFTik7CisJd2hpbGUgKGNtZF9sZW4gPCBwY21kcHRyLT5zaXplKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJc3dpdGNoKGhlYWRlci0+dHlwZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkICpIaWdoU25yOworCQljYXNlIFRMVl9UWVBFX1NOUl9ISUdIOgorCQlIaWdoU25yID0gKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWQgJWQgJWRcbiIsCisJCQkJSGlnaFNuci0+c25ydmFsdWUsCisJCQkJSGlnaFNuci0+c25yZnJlcSwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAyMCk/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfaGlnaHNucl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKnNucl90aHJlc2hvbGQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCXUxNiBldmVudF9iaXRtYXA7CisJdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIlZCAlZCAlZCIsICZ2YWx1ZSwgJmZyZXEsICZzdWJzY3JpYmVkKTsKKwlpZiAocmVzICE9IDMpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWV2ZW50X2JpdG1hcCA9IGxpYmVydGFzX2dldF9ldmVudHNfYml0bWFwKHByaXYpOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9zZXQ7CisJcGNtZHB0ci0+c2l6ZSA9IGNwdV90b19sZTE2KFNfRFNfR0VOICsKKwkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKworCQlzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCkpOworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCXB0ciA9ICh1OCopIHBjbWRwdHIrY21kX2xlbjsKKwlzbnJfdGhyZXNob2xkID0gKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKikocHRyKTsKKwlzbnJfdGhyZXNob2xkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1NOUl9ISUdIKTsKKwlzbnJfdGhyZXNob2xkLT5oZWFkZXIubGVuID0gMjsKKwlzbnJfdGhyZXNob2xkLT5zbnJ2YWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlzbnJfdGhyZXNob2xkLT5zbnJmcmVxID0gY3B1X3RvX2xlMTYoZnJlcSk7CisJZXZlbnRfYml0bWFwIHw9IHN1YnNjcmliZWQgPyAweDAwMjAgOiAweDA7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50X2JpdG1hcDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZG1hY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJc3NpemVfdCBwb3MgPSAwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCW9mZnZhbC5vZmZzZXQgPSBwcml2LT5tYWNfb2Zmc2V0OworCW9mZnZhbC52YWx1ZSA9IDA7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfbWFjX3JlZ19hY2Nlc3MsIDAsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmb2ZmdmFsKTsKKwltZGVsYXkoMTApOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiTUFDWzB4JXhdID0gMHglMDh4XG4iLAorCQkJCXByaXYtPm1hY19vZmZzZXQsIGFkYXB0ZXItPm9mZnNldHZhbHVlLnZhbHVlKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3JkbWFjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXByaXYtPm1hY19vZmZzZXQgPSBzaW1wbGVfc3RydG91bCgoY2hhciAqKWJ1ZiwgTlVMTCwgMTYpOworCXJlcyA9IGNvdW50Oworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfd3JtYWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJdTMyIG9mZnNldCwgdmFsdWU7CisJc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIleCAleCIsICZvZmZzZXQsICZ2YWx1ZSk7CisJaWYgKHJlcyAhPSAyKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlvZmZ2YWwub2Zmc2V0ID0gb2Zmc2V0OworCW9mZnZhbC52YWx1ZSA9IHZhbHVlOworCXJlcyA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF9tYWNfcmVnX2FjY2VzcywgMSwKKwkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsICZvZmZ2YWwpOworCW1kZWxheSgxMCk7CisKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3JkYmJwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKKwlzc2l6ZV90IHBvcyA9IDA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJb2ZmdmFsLm9mZnNldCA9IHByaXYtPmJicF9vZmZzZXQ7CisJb2ZmdmFsLnZhbHVlID0gMDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF9iYnBfcmVnX2FjY2VzcywgMCwKKwkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsICZvZmZ2YWwpOworCW1kZWxheSgxMCk7CisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICJCQlBbMHgleF0gPSAweCUwOHhcbiIsCisJCQkJcHJpdi0+YmJwX29mZnNldCwgYWRhcHRlci0+b2Zmc2V0dmFsdWUudmFsdWUpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZGJicF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlwcml2LT5iYnBfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoKGNoYXIgKilidWYsIE5VTEwsIDE2KTsKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3dyYmJwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXUzMiBvZmZzZXQsIHZhbHVlOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmb2Zmc2V0LCAmdmFsdWUpOworCWlmIChyZXMgIT0gMikgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJb2ZmdmFsLm9mZnNldCA9IG9mZnNldDsKKwlvZmZ2YWwudmFsdWUgPSB2YWx1ZTsKKwlyZXMgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfYmJwX3JlZ19hY2Nlc3MsIDEsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmb2ZmdmFsKTsKKwltZGVsYXkoMTApOworCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZHJmX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKKwlzc2l6ZV90IHBvcyA9IDA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJb2ZmdmFsLm9mZnNldCA9IHByaXYtPnJmX29mZnNldDsKKwlvZmZ2YWwudmFsdWUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kX3JmX3JlZ19hY2Nlc3MsIDAsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmb2ZmdmFsKTsKKwltZGVsYXkoMTApOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiUkZbMHgleF0gPSAweCUwOHhcbiIsCisJCQkJcHJpdi0+cmZfb2Zmc2V0LCBhZGFwdGVyLT5vZmZzZXR2YWx1ZS52YWx1ZSk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWZyZWVfcGFnZShhZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3JkcmZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcHJpdi0+cmZfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoKGNoYXIgKilidWYsIE5VTEwsIDE2KTsKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3dycmZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJdTMyIG9mZnNldCwgdmFsdWU7CisJc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIG9mZnZhbDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIleCAleCIsICZvZmZzZXQsICZ2YWx1ZSk7CisJaWYgKHJlcyAhPSAyKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlvZmZ2YWwub2Zmc2V0ID0gb2Zmc2V0OworCW9mZnZhbC52YWx1ZSA9IHZhbHVlOworCXJlcyA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF9yZl9yZWdfYWNjZXNzLCAxLAorCQkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJm9mZnZhbCk7CisJbWRlbGF5KDEwKTsKKworCXJlcyA9IGNvdW50Oworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBGT1BTKGZyZWFkLCBmd3JpdGUpIHsgXAorCS5vd25lciA9IFRISVNfTU9EVUxFLCBcCisJLm9wZW4gPSBvcGVuX2ZpbGVfZ2VuZXJpYywgXAorCS5yZWFkID0gKGZyZWFkKSwgXAorCS53cml0ZSA9IChmd3JpdGUpLCBcCit9CisKK3N0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIHsKKwljaGFyICpuYW1lOworCWludCBwZXJtOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKK307CisKK3N0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfZmlsZXNbXSA9IHsKKwl7ICJpbmZvIiwgMDQ0NCwgRk9QUyhsaWJlcnRhc19kZXZfaW5mbywgd3JpdGVfZmlsZV9kdW1teSksIH0sCisJeyAiZ2V0c2NhbnRhYmxlIiwgMDQ0NCwgRk9QUyhsaWJlcnRhc19nZXRzY2FudGFibGUsCisJCQkJCXdyaXRlX2ZpbGVfZHVtbXkpLCB9LAorCXsgInNsZWVwcGFyYW1zIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19zbGVlcHBhcmFtc19yZWFkLAorCQkJCWxpYmVydGFzX3NsZWVwcGFyYW1zX3dyaXRlKSwgfSwKKwl7ICJleHRzY2FuIiwgMDYwMCwgRk9QUyhOVUxMLCBsaWJlcnRhc19leHRzY2FuKSwgfSwKKwl7ICJzZXR1c2Vyc2NhbiIsIDA2MDAsIEZPUFMoTlVMTCwgbGliZXJ0YXNfc2V0dXNlcnNjYW4pLCB9LAorfTsKKworc3RydWN0IGxpYmVydGFzX2RlYnVnZnNfZmlsZXMgZGVidWdmc19ldmVudHNfZmlsZXNbXSA9IHsKKwl7Imxvd19yc3NpIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19sb3dyc3NpX3JlYWQsCisJCQkJbGliZXJ0YXNfbG93cnNzaV93cml0ZSksIH0sCisJeyJsb3dfc25yIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19sb3dzbnJfcmVhZCwKKwkJCQlsaWJlcnRhc19sb3dzbnJfd3JpdGUpLCB9LAorCXsiZmFpbHVyZV9jb3VudCIsIDA2NDQsIEZPUFMobGliZXJ0YXNfZmFpbGNvdW50X3JlYWQsCisJCQkJbGliZXJ0YXNfZmFpbGNvdW50X3dyaXRlKSwgfSwKKwl7ImJlYWNvbl9taXNzZWQiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX2Jjbm1pc3NfcmVhZCwKKwkJCQlsaWJlcnRhc19iY25taXNzX3dyaXRlKSwgfSwKKwl7ImhpZ2hfcnNzaSIsIDA2NDQsIEZPUFMobGliZXJ0YXNfaGlnaHJzc2lfcmVhZCwKKwkJCQlsaWJlcnRhc19oaWdocnNzaV93cml0ZSksIH0sCisJeyJoaWdoX3NuciIsIDA2NDQsIEZPUFMobGliZXJ0YXNfaGlnaHNucl9yZWFkLAorCQkJCWxpYmVydGFzX2hpZ2hzbnJfd3JpdGUpLCB9LAorfTsKKworc3RydWN0IGxpYmVydGFzX2RlYnVnZnNfZmlsZXMgZGVidWdmc19yZWdzX2ZpbGVzW10gPSB7CisJeyJyZG1hYyIsIDA2NDQsIEZPUFMobGliZXJ0YXNfcmRtYWNfcmVhZCwgbGliZXJ0YXNfcmRtYWNfd3JpdGUpLCB9LAorCXsid3JtYWMiLCAwNjAwLCBGT1BTKE5VTEwsIGxpYmVydGFzX3dybWFjX3dyaXRlKSwgfSwKKwl7InJkYmJwIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19yZGJicF9yZWFkLCBsaWJlcnRhc19yZGJicF93cml0ZSksIH0sCisJeyJ3cmJicCIsIDA2MDAsIEZPUFMoTlVMTCwgbGliZXJ0YXNfd3JiYnBfd3JpdGUpLCB9LAorCXsicmRyZiIsIDA2NDQsIEZPUFMobGliZXJ0YXNfcmRyZl9yZWFkLCBsaWJlcnRhc19yZHJmX3dyaXRlKSwgfSwKKwl7IndycmYiLCAwNjAwLCBGT1BTKE5VTEwsIGxpYmVydGFzX3dycmZfd3JpdGUpLCB9LAorfTsKKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlpZiAoIWxpYmVydGFzX2RpcikKKwkJbGliZXJ0YXNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJsaWJlcnRhc193aXJlbGVzcyIsIE5VTEwpOworCisJcmV0dXJuOworfQorCit2b2lkIGxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlKHZvaWQpCit7CisJaWYgKGxpYmVydGFzX2RpcikKKwkJIGRlYnVnZnNfcmVtb3ZlKGxpYmVydGFzX2Rpcik7CisJcmV0dXJuOworfQorCit2b2lkIGxpYmVydGFzX2RlYnVnZnNfaW5pdF9vbmUod2xhbl9wcml2YXRlICpwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzICpmaWxlczsKKwlpZiAoIWxpYmVydGFzX2RpcikKKwkJZ290byBleGl0OworCisJcHJpdi0+ZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGV2LT5uYW1lLCBsaWJlcnRhc19kaXIpOworCWlmICghcHJpdi0+ZGVidWdmc19kaXIpCisJCWdvdG8gZXhpdDsKKworCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZGVidWdmc19maWxlcyk7IGkrKykgeworCQlmaWxlcyA9ICZkZWJ1Z2ZzX2ZpbGVzW2ldOworCQlwcml2LT5kZWJ1Z2ZzX2ZpbGVzW2ldID0gZGVidWdmc19jcmVhdGVfZmlsZShmaWxlcy0+bmFtZSwKKwkJCQkJCQkgICAgIGZpbGVzLT5wZXJtLAorCQkJCQkJCSAgICAgcHJpdi0+ZGVidWdmc19kaXIsCisJCQkJCQkJICAgICBwcml2LAorCQkJCQkJCSAgICAgJmZpbGVzLT5mb3BzKTsKKwl9CisKKwlwcml2LT5ldmVudHNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJzdWJzY3JpYmVkX2V2ZW50cyIsIHByaXYtPmRlYnVnZnNfZGlyKTsKKwlpZiAoIXByaXYtPmV2ZW50c19kaXIpCisJCWdvdG8gZXhpdDsKKworCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZGVidWdmc19ldmVudHNfZmlsZXMpOyBpKyspIHsKKwkJZmlsZXMgPSAmZGVidWdmc19ldmVudHNfZmlsZXNbaV07CisJCXByaXYtPmRlYnVnZnNfZXZlbnRzX2ZpbGVzW2ldID0gZGVidWdmc19jcmVhdGVfZmlsZShmaWxlcy0+bmFtZSwKKwkJCQkJCQkgICAgIGZpbGVzLT5wZXJtLAorCQkJCQkJCSAgICAgcHJpdi0+ZXZlbnRzX2RpciwKKwkJCQkJCQkgICAgIHByaXYsCisJCQkJCQkJICAgICAmZmlsZXMtPmZvcHMpOworCX0KKworCXByaXYtPnJlZ3NfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJyZWdpc3RlcnMiLCBwcml2LT5kZWJ1Z2ZzX2Rpcik7CisJaWYgKCFwcml2LT5yZWdzX2RpcikKKwkJZ290byBleGl0OworCisJZm9yIChpPTA7IGk8QVJSQVlfU0laRShkZWJ1Z2ZzX3JlZ3NfZmlsZXMpOyBpKyspIHsKKwkJZmlsZXMgPSAmZGVidWdmc19yZWdzX2ZpbGVzW2ldOworCQlwcml2LT5kZWJ1Z2ZzX3JlZ3NfZmlsZXNbaV0gPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZpbGVzLT5uYW1lLAorCQkJCQkJCSAgICAgZmlsZXMtPnBlcm0sCisJCQkJCQkJICAgICBwcml2LT5yZWdzX2RpciwKKwkJCQkJCQkgICAgIHByaXYsCisJCQkJCQkJICAgICAmZmlsZXMtPmZvcHMpOworCX0KKworI2lmZGVmIFBST0NfREVCVUcKKwlsaWJlcnRhc19kZWJ1Z19pbml0KHByaXYsIGRldik7CisjZW5kaWYKK2V4aXQ6CisJcmV0dXJuOworfQorCit2b2lkIGxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlX29uZSh3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoZGVidWdmc19yZWdzX2ZpbGVzKTsgaSsrKQorCQlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2ZzX3JlZ3NfZmlsZXNbaV0pOworCisJZGVidWdmc19yZW1vdmUocHJpdi0+cmVnc19kaXIpOworCisJZm9yKGk9MDsgaTxBUlJBWV9TSVpFKGRlYnVnZnNfZmlsZXMpOyBpKyspCisJCWRlYnVnZnNfcmVtb3ZlKHByaXYtPmRlYnVnZnNfZXZlbnRzX2ZpbGVzW2ldKTsKKworCWRlYnVnZnNfcmVtb3ZlKHByaXYtPmV2ZW50c19kaXIpOworI2lmZGVmIFBST0NfREVCVUcKKwlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2ZzX2RlYnVnKTsKKyNlbmRpZgorCWZvcihpPTA7IGk8QVJSQVlfU0laRShkZWJ1Z2ZzX2ZpbGVzKTsgaSsrKQorCQlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2ZzX2ZpbGVzW2ldKTsKK30KKworLyogZGVidWcgZW50cnkgKi8KKworI2RlZmluZSBpdGVtX3NpemUobikgKHNpemVvZiAoKHdsYW5fYWRhcHRlciAqKTApLT5uKQorI2RlZmluZSBpdGVtX2FkZHIobikgKCh1MzIpICYoKHdsYW5fYWRhcHRlciAqKTApLT5uKQorCitzdHJ1Y3QgZGVidWdfZGF0YSB7CisJY2hhciBuYW1lWzMyXTsKKwl1MzIgc2l6ZTsKKwl1MzIgYWRkcjsKK307CisKKy8qIFRvIGRlYnVnIGFueSBtZW1iZXIgb2Ygd2xhbl9hZGFwdGVyLCBzaW1wbHkgYWRkIG9uZSBsaW5lIGhlcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfZGF0YSBpdGVtc1tdID0geworCXsiaW50Y291bnRlciIsIGl0ZW1fc2l6ZShpbnRjb3VudGVyKSwgaXRlbV9hZGRyKGludGNvdW50ZXIpfSwKKwl7InBzbW9kZSIsIGl0ZW1fc2l6ZShwc21vZGUpLCBpdGVtX2FkZHIocHNtb2RlKX0sCisJeyJwc3N0YXRlIiwgaXRlbV9zaXplKHBzc3RhdGUpLCBpdGVtX2FkZHIocHNzdGF0ZSl9LAorfTsKKworc3RhdGljIGludCBudW1fb2ZfaXRlbXMgPSBzaXplb2YoaXRlbXMpIC8gc2l6ZW9mKGl0ZW1zWzBdKTsKKworLyoqCisgKiAgQGJyaWVmIGNvbnZlcnQgc3RyaW5nIHRvIG51bWJlcgorICoKKyAqICBAcGFyYW0gcyAgIAkgICBwb2ludGVyIHRvIG51bWJlcmVkIHN0cmluZworICogIEByZXR1cm4gCSAgIGNvbnZlcnRlZCBudW1iZXIgZnJvbSBzdHJpbmcgcworICovCitzdGF0aWMgaW50IHN0cmluZ190b19udW1iZXIoY2hhciAqcykKK3sKKwlpbnQgciA9IDA7CisJaW50IGJhc2UgPSAwOworCisJaWYgKChzdHJuY21wKHMsICIweCIsIDIpID09IDApIHx8IChzdHJuY21wKHMsICIwWCIsIDIpID09IDApKQorCQliYXNlID0gMTY7CisJZWxzZQorCQliYXNlID0gMTA7CisKKwlpZiAoYmFzZSA9PSAxNikKKwkJcyArPSAyOworCisJZm9yIChzID0gczsgKnMgIT0gMDsgcysrKSB7CisJCWlmICgoKnMgPj0gNDgpICYmICgqcyA8PSA1NykpCisJCQlyID0gKHIgKiBiYXNlKSArICgqcyAtIDQ4KTsKKwkJZWxzZSBpZiAoKCpzID49IDY1KSAmJiAoKnMgPD0gNzApKQorCQkJciA9IChyICogYmFzZSkgKyAoKnMgLSA1NSk7CisJCWVsc2UgaWYgKCgqcyA+PSA5NykgJiYgKCpzIDw9IDEwMikpCisJCQlyID0gKHIgKiBiYXNlKSArICgqcyAtIDg3KTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8qKgorICogIEBicmllZiBwcm9jIHJlYWQgZnVuY3Rpb24KKyAqCisgKiAgQHBhcmFtIHBhZ2UJICAgcG9pbnRlciB0byBidWZmZXIKKyAqICBAcGFyYW0gcyAgICAgICByZWFkIGRhdGEgc3RhcnRpbmcgcG9zaXRpb24KKyAqICBAcGFyYW0gb2ZmICAgICBvZmZzZXQKKyAqICBAcGFyYW0gY250ICAgICBjb3VudGVyCisgKiAgQHBhcmFtIGVvZiAgICAgZW5kIG9mIGZpbGUgZmxhZworICogIEBwYXJhbSBkYXRhICAgIGRhdGEgdG8gb3V0cHV0CisgKiAgQHJldHVybiAJICAgbnVtYmVyIG9mIG91dHB1dCBkYXRhCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdsYW5fZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCB2YWwgPSAwOworCXNpemVfdCBwb3MgPSAwOworCXNzaXplX3QgcmVzOworCWNoYXIgKnA7CisJaW50IGk7CisJc3RydWN0IGRlYnVnX2RhdGEgKmQ7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXAgPSBidWY7CisKKwlkID0gKHN0cnVjdCBkZWJ1Z19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZm9yIChpID0gMDsgaSA8IG51bV9vZl9pdGVtczsgaSsrKSB7CisJCWlmIChkW2ldLnNpemUgPT0gMSkKKwkJCXZhbCA9ICooKHU4ICopIGRbaV0uYWRkcik7CisJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSAyKQorCQkJdmFsID0gKigodTE2ICopIGRbaV0uYWRkcik7CisJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSA0KQorCQkJdmFsID0gKigodTMyICopIGRbaV0uYWRkcik7CisKKwkJcG9zICs9IHNwcmludGYocCArIHBvcywgIiVzPSVkXG4iLCBkW2ldLm5hbWUsIHZhbCk7CisJfQorCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIHAsIHBvcyk7CisKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiAgQGJyaWVmIHByb2Mgd3JpdGUgZnVuY3Rpb24KKyAqCisgKiAgQHBhcmFtIGYJICAgZmlsZSBwb2ludGVyCisgKiAgQHBhcmFtIGJ1ZiAgICAgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICogIEBwYXJhbSBjbnQgICAgIGRhdGEgbnVtYmVyIHRvIHdyaXRlCisgKiAgQHBhcmFtIGRhdGEgICAgZGF0YSB0byB3cml0ZQorICogIEByZXR1cm4gCSAgIG51bWJlciBvZiBkYXRhCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9kZWJ1Z2ZzX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgciwgaTsKKwljaGFyICpwZGF0YTsKKwljaGFyICpwOworCWNoYXIgKnAwOworCWNoYXIgKnAxOworCWNoYXIgKnAyOworCXN0cnVjdCBkZWJ1Z19kYXRhICpkID0gKHN0cnVjdCBkZWJ1Z19kYXRhICopZi0+cHJpdmF0ZV9kYXRhOworCisJcGRhdGEgPSAoY2hhciAqKWttYWxsb2MoY250LCBHRlBfS0VSTkVMKTsKKwlpZiAocGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIocGRhdGEsIGJ1ZiwgY250KSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCWtmcmVlKHBkYXRhKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcDAgPSBwZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2l0ZW1zOyBpKyspIHsKKwkJZG8geworCQkJcCA9IHN0cnN0cihwMCwgZFtpXS5uYW1lKTsKKwkJCWlmIChwID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlwMSA9IHN0cmNocihwLCAnXG4nKTsKKwkJCWlmIChwMSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJcDAgPSBwMSsrOworCQkJcDIgPSBzdHJjaHIocCwgJz0nKTsKKwkJCWlmICghcDIpCisJCQkJYnJlYWs7CisJCQlwMisrOworCQkJciA9IHN0cmluZ190b19udW1iZXIocDIpOworCQkJaWYgKGRbaV0uc2l6ZSA9PSAxKQorCQkJCSooKHU4ICopIGRbaV0uYWRkcikgPSAodTgpIHI7CisJCQllbHNlIGlmIChkW2ldLnNpemUgPT0gMikKKwkJCQkqKCh1MTYgKikgZFtpXS5hZGRyKSA9ICh1MTYpIHI7CisJCQllbHNlIGlmIChkW2ldLnNpemUgPT0gNCkKKwkJCQkqKCh1MzIgKikgZFtpXS5hZGRyKSA9ICh1MzIpIHI7CisJCQlicmVhazsKKwkJfSB3aGlsZSAoMSk7CisJfQorCWtmcmVlKHBkYXRhKTsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpYmVydGFzX2RlYnVnX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBvcGVuX2ZpbGVfZ2VuZXJpYywKKwkud3JpdGUgPSB3bGFuX2RlYnVnZnNfd3JpdGUsCisJLnJlYWQgPSB3bGFuX2RlYnVnZnNfcmVhZCwKK307CisKKy8qKgorICogIEBicmllZiBjcmVhdGUgZGVidWcgcHJvYyBmaWxlCisgKgorICogIEBwYXJhbSBwcml2CSAgIHBvaW50ZXIgd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIGRldiAgICAgcG9pbnRlciBuZXRfZGV2aWNlCisgKiAgQHJldHVybiAJICAgTi9BCisgKi8KK3ZvaWQgbGliZXJ0YXNfZGVidWdfaW5pdCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX2RpcikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IG51bV9vZl9pdGVtczsgaSsrKQorCQlpdGVtc1tpXS5hZGRyICs9ICh1MzIpIHByaXYtPmFkYXB0ZXI7CisKKwlwcml2LT5kZWJ1Z2ZzX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCAwNjQ0LAorCQkJCQkJICBwcml2LT5kZWJ1Z2ZzX2RpciwgJml0ZW1zWzBdLAorCQkJCQkJICAmbGliZXJ0YXNfZGVidWdfZm9wcyk7Cit9CisKKy8qKgorICogIEBicmllZiByZW1vdmUgcHJvYyBmaWxlCisgKgorICogIEBwYXJhbSBwcml2CSAgIHBvaW50ZXIgd2xhbl9wcml2YXRlCisgKiAgQHJldHVybiAJICAgTi9BCisgKi8KK3ZvaWQgbGliZXJ0YXNfZGVidWdfcmVtb3ZlKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19kZWJ1Zyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwYTExYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuaApAQCAtMCwwICsxLDYgQEAKK3ZvaWQgbGliZXJ0YXNfZGVidWdmc19pbml0KHZvaWQpOwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX3JlbW92ZSh2b2lkKTsKKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX2luaXRfb25lKHdsYW5fcHJpdmF0ZSAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlX29uZSh3bGFuX3ByaXZhdGUgKnByaXYpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2YmRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlY2wuaApAQCAtMCwwICsxLDgzIEBACisvKioKKyAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9uIHJlZmVycmluZyB0bworICAqICBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvdGhlciBzb3VyY2UgZmlsZXMKKyAgKi8KKworI2lmbmRlZiBfV0xBTl9ERUNMX0hfCisjZGVmaW5lIF9XTEFOX0RFQ0xfSF8KKworI2luY2x1ZGUgImRlZnMuaCIKKworLyoqIEZ1bmN0aW9uIFByb3RvdHlwZSBEZWNsYXJhdGlvbiAqLworc3RydWN0IHdsYW5fcHJpdmF0ZTsKK3N0cnVjdCBza19idWZmOworc3RydWN0IG5ldF9kZXZpY2U7CisKK2V4dGVybiBjaGFyICpsaWJlcnRhc19md19uYW1lOworCit2b2lkIGxpYmVydGFzX2ZyZWVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19zZXRfbWFjX3BhY2tldF9maWx0ZXIod2xhbl9wcml2YXRlICogcHJpdik7CisKK2ludCBsaWJlcnRhc19zZW5kX251bGxfcGFja2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IHB3cl9tZ210KTsKK3ZvaWQgbGliZXJ0YXNfc2VuZF90eF9mZWVkYmFjayh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK3U4IGxpYmVydGFzX2NoZWNrX2xhc3RfcGFja2V0X2luZGljYXRpb24od2xhbl9wcml2YXRlICogcHJpdik7CisKK2ludCBsaWJlcnRhc19mcmVlX2NtZF9idWZmZXIod2xhbl9wcml2YXRlICogcHJpdik7CitzdHJ1Y3QgY21kX2N0cmxfbm9kZTsKK3N0cnVjdCBjbWRfY3RybF9ub2RlICpsaWJlcnRhc19nZXRfZnJlZV9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCit2b2lkIGxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCSAgICBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBub2RlLAorCQkgICAgdTMyIGNtZF9vaWQsIHUxNiB3YWl0X29wdGlvbiwgdm9pZCAqcGRhdGFfYnVmKTsKKworaW50IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICB1MTYgY21kX25vLAorCQkJICB1MTYgY21kX2FjdGlvbiwKKwkJCSAgdTE2IHdhaXRfb3B0aW9uLCB1MzIgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKTsKKwordm9pZCBsaWJlcnRhc19xdWV1ZV9jbWQod2xhbl9hZGFwdGVyICogYWRhcHRlciwgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGUsIHU4IGFkZHRhaWwpOworCitpbnQgbGliZXJ0YXNfYWxsb2NhdGVfY21kX2J1ZmZlcih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19leGVjdXRlX25leHRfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19wcm9jZXNzX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYpOwordm9pZCBsaWJlcnRhc19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgbGliZXJ0YXNfc2V0X3JhZGlvX2NvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdik7Cit1MzIgbGliZXJ0YXNfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4KTsKK3U4IGxpYmVydGFzX2RhdGFfcmF0ZV90b19pbmRleCh1MzIgcmF0ZSk7Cit2b2lkIGxpYmVydGFzX2dldF9md3ZlcnNpb24od2xhbl9hZGFwdGVyICogYWRhcHRlciwgY2hhciAqZnd2ZXJzaW9uLCBpbnQgbWF4bGVuKTsKKworaW50IGxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qKiBUaGUgcHJvYyBmcyBpbnRlcmZhY2UgKi8KK2ludCBsaWJlcnRhc19wcm9jZXNzX3J4X2NvbW1hbmQod2xhbl9wcml2YXRlICogcHJpdik7CitpbnQgbGliZXJ0YXNfcHJvY2Vzc190eCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBjbWQpOwordm9pZCBfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wY21kKTsKKworaW50IGxpYmVydGFzX3NldF9yZWdpb250YWJsZSh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCByZWdpb24sIHU4IGJhbmQpOworCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19yeGVkX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwordm9pZCBsaWJlcnRhc19wc19zbGVlcCh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgd2FpdF9vcHRpb24pOwordm9pZCBsaWJlcnRhc19wc19jb25maXJtX3NsZWVwKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHUxNiBwc21vZGUpOwordm9pZCBsaWJlcnRhc19wc193YWtldXAod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHdhaXRfb3B0aW9uKTsKKwordm9pZCBsaWJlcnRhc190eF9ydW5xdWV1ZSh3bGFuX3ByaXZhdGUgKnByaXYpOworCitleHRlcm4gc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbCgKKwkJCQl3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCBiYW5kLCB1MTYgY2hhbm5lbCk7CisKK2V4dGVybiB2b2lkIGxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQod2xhbl9wcml2YXRlICogcHJpdik7CisKK3ZvaWQgbGliZXJ0YXNfc2VuZF9pd2V2Y3VzdG9tX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHM4ICogc3RyKTsKKworaW50IHJlc2V0X2RldmljZSh3bGFuX3ByaXZhdGUgKnByaXYpOworLyogbWFpbi5jICovCitleHRlcm4gc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGliZXJ0YXNfZ2V0X3JlZ2lvbl9jZnBfdGFibGUodTggcmVnaW9uLCB1OCBiYW5kLAorCQkJCQkJICAgICAgICAgICAgIGludCAqY2ZwX25vKTsKK3dsYW5fcHJpdmF0ZSAqd2xhbl9hZGRfY2FyZCh2b2lkICpjYXJkKTsKK2ludCB3bGFuX3JlbW92ZV9jYXJkKHZvaWQgKmNhcmQpOworCisjZW5kaWYJCQkJLyogX1dMQU5fREVDTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTQ3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qKgorICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgZ2xvYmFsIGNvbnN0YW50L2VudW0gZGVmaW5pdGlvbnMsCisgICogZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAqLworI2lmbmRlZiBfV0xBTl9ERUZTX0hfCisjZGVmaW5lIF9XTEFOX0RFRlNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGliZXJ0YXNfZGVidWc7CisKKyNkZWZpbmUgRFJWX05BTUUJCSJ1c2I4eHh4IgorCisjZGVmaW5lIGxic19wcl9pbmZvKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUiOiAiIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgbGJzX3ByX2Vycihmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUiOiAiIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgbGJzX3ByX2FsZXJ0KGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0FMRVJUIERSVl9OQU1FIjogIiBmb3JtYXQsICMjIGFyZ3MpCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBsYnNfcHJfZGVidWcobGV2ZWwsIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgaWYgKGxpYmVydGFzX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSI6ICIgZm9ybWF0LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBsYnNfZGV2X2RiZyhsZXZlbCwgZGV2aWNlLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgICAgICAgbGJzX3ByX2RlYnVnKGxldmVsLCAiJXM6ICIgZm9ybWF0LCBcCisgICAgICAgIChkZXZpY2UpLT5idXNfaWQgLCAjIyBhcmdzKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGJzX2RiZ19oZXgoY2hhciAqcHJvbXB0LCB1OCAqIGJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWxpYmVydGFzX2RlYnVnKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIsIHByb21wdCk7CisJZm9yIChpID0gMTsgaSA8PSBsZW47IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAiLCAodTgpICogYnVmKTsKKwkJYnVmKys7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGxic19wcl9kZWJ1ZyhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxic19kZXZfZGJnKGxldmVsLCBkZXZpY2UsIGZvcm1hdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxic19kYmdfaGV4KHgseSx6KQkJCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lCUVOVEVSKCkJCQlsYnNfcHJfZGVidWcoMSwgIkVudGVyOiAlcywgJXM6JWlcbiIsIFwKKwkJCQkJX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lCUxFQVZFKCkJCQlsYnNfcHJfZGVidWcoMSwgIkxlYXZlOiAlcywgJXM6JWlcbiIsIFwKKwkJCQkJX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qKiBCdWZmZXIgQ29uc3RhbnRzICovCisKKy8qCVRoZSBzaXplIG9mIFNRIG1lbW9yeSBQUEEsIERQQSBhcmUgOCBEV09SRHMsIHRoYXQga2VlcCB0aGUgcGh5c2ljYWwKKyoJYWRkcmVzc2VzIG9mIFR4UEQgYnVmZmVycy4gU3RhdGlvbiBoYXMgb25seSA4IFR4UEQgYXZhaWxhYmxlLCBXaGVyZWFzCisqCWRyaXZlciBoYXMgbW9yZSBsb2NhbCBUeFBEcy4gRWFjaCBUeFBEIG9uIHRoZSBob3N0IG1lbW9yeSBpcyBhc3NvY2lhdGVkCisqCXdpdGggYSBUeCBjb250cm9sIG5vZGUuIFRoZSBkcml2ZXIgbWFpbnRhaW5zIDggUnhQRCBkZXNjcmlwdG9ycyBmb3IKKyoJc3RhdGlvbiBmaXJtd2FyZSB0byBzdG9yZSBSeCBwYWNrZXQgaW5mb3JtYXRpb24uCisqCisqCUN1cnJlbnQgdmVyc2lvbiBvZiBNQUMgaGFzIGEgMzJ4NiBtdWx0aWNhc3QgYWRkcmVzcyBidWZmZXIuCisqCisqCTgwMi4xMWIgY2FuIGhhdmUgdXAgdG8gIDE0IGNoYW5uZWxzLCB0aGUgZHJpdmVyIGtlZXBzIHRoZQorKglCU1NJRChNQUMgYWRkcmVzcykgb2YgZWFjaCBBUHMgb3IgQWQgaG9jIHN0YXRpb25zIGl0IGhhcyBzZW5zZWQuCisqLworCisjZGVmaW5lIE1SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRQkzMgorI2RlZmluZSBNUlZEUlZfTlVNX09GX0NNRF9CVUZGRVIgICAgICAgIDEwCisjZGVmaW5lIE1SVkRSVl9TSVpFX09GX0NNRF9CVUZGRVIgICAgICAgKDIgKiAxMDI0KQorI2RlZmluZSBNUlZEUlZfTUFYX0NIQU5ORUxfU0laRQkJMTQKKyNkZWZpbmUgTVJWRFJWX01BWF9CU1NJRF9MSVNUCQk2NAorI2RlZmluZSBNUlZEUlZfQVNTT0NJQVRJT05fVElNRV9PVVQJMjU1CisjZGVmaW5lIE1SVkRSVl9TTkFQX0hFQURFUl9MRU4gICAgICAgICAgOAorCisjZGVmaW5lCVdMQU5fVVBMRF9TSVpFCQkJMjMxMgorI2RlZmluZSBERVZfTkFNRV9MRU4JCQkzMgorCisvKiogTWlzYyBjb25zdGFudHMgKi8KKy8qIFRoaXMgc2VjdGlvbiBkZWZpbmVzIDgwMi4xMSBzcGVjaWZpYyBjb250YW50cyAqLworCisjZGVmaW5lIE1SVkRSVl9NQVhfQlNTX0RFU0NSSVBUUwkJMTYKKyNkZWZpbmUgTVJWRFJWX01BWF9SRUdJT05fQ09ERQkJCTYKKworI2RlZmluZSBNUlZEUlZfSUdOT1JFX01VTFRJUExFX0RUSU0JCTB4ZmZmZQorI2RlZmluZSBNUlZEUlZfTUlOX01VTFRJUExFX0RUSU0JCTEKKyNkZWZpbmUgTVJWRFJWX01BWF9NVUxUSVBMRV9EVElNCQk1CisjZGVmaW5lIE1SVkRSVl9ERUZBVUxUX01VTFRJUExFX0RUSU0JCTEKKworI2RlZmluZSBNUlZEUlZfREVGQVVMVF9MSVNURU5fSU5URVJWQUwJCTEwCisKKyNkZWZpbmUJTVJWRFJWX0NIQU5ORUxTX1BFUl9TQ0FOCQk0CisjZGVmaW5lCU1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4JCTE0CisKKyNkZWZpbmUgTVJWRFJWX0RFQlVHX1JYX1BBVEgJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVJWRFJWX0RFQlVHX1RYX1BBVEgJCTB4MDAwMDAwMDIKKworI2RlZmluZSBNUlZEUlZfTUlOX0JFQUNPTl9JTlRFUlZBTAkJMjAKKyNkZWZpbmUgTVJWRFJWX01BWF9CRUFDT05fSU5URVJWQUwJCTEwMDAKKyNkZWZpbmUgTVJWRFJWX0JFQUNPTl9JTlRFUlZBTAkJCTEwMAorCisvKiogVHhQRCBzdGF0dXMgKi8KKworLyoJU3RhdGlvbiBmaXJtd2FyZSB1c2UgVHhQRCBzdGF0dXMgZmllbGQgdG8gcmVwb3J0IGZpbmFsIFR4IHRyYW5zbWl0CisqCXJlc3VsdCwgQml0IG1hc2tzIGFyZSB1c2VkIHRvIHByZXNlbnQgY29tYmluZWQgc2l0dWF0aW9ucy4KKyovCisKKyNkZWZpbmUgTVJWRFJWX1R4UERfUE9XRVJfTUdNVF9OVUxMX1BBQ0tFVCAweDAxCisjZGVmaW5lIE1SVkRSVl9UeFBEX1BPV0VSX01HTVRfTEFTVF9QQUNLRVQgMHgwOAorCisvKiogVHggbWVzaCBmbGFnICovCisvKiBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG5vcm1hbCBXRFMgZmxhZyBhcyBtZXNoIGZsYWcuCisgKiBUT0RPOiBjaGFuZ2UgdG8gcHJvcGVyIG1lc2ggZmxhZyB3aGVuIE1BQyB1bmRlcnN0YW5kcyBpdC4KKyAqLworI2RlZmluZSBUeFBEX0NPTlRST0xfV0RTX0ZSQU1FICgxPDwxNykKKyNkZWZpbmUgVHhQRF9NRVNIX0ZSQU1FIFR4UERfQ09OVFJPTF9XRFNfRlJBTUUKKworLyoqIFJ4UEQgc3RhdHVzICovCisKKyNkZWZpbmUgTVJWRFJWX1JYUERfU1RBVFVTX09LICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKiogUnhQRCBzdGF0dXMgLSBSZWNlaXZlZCBwYWNrZXQgdHlwZXMgKi8KKy8qKiBSeCBtZXNoIGZsYWcgKi8KKy8qIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgbm9ybWFsIFdEUyBmbGFnIGFzIG1lc2ggZmxhZy4KKyAqIFRPRE86IGNoYW5nZSB0byBwcm9wZXIgbWVzaCBmbGFnIHdoZW4gTUFDIHVuZGVyc3RhbmRzIGl0LgorICovCisjZGVmaW5lIFJ4UERfQ09OVFJPTF9XRFNfRlJBTUUgKDB4NDApCisjZGVmaW5lIFJ4UERfTUVTSF9GUkFNRSBSeFBEX0NPTlRST0xfV0RTX0ZSQU1FCisKKy8qKiBSU1NJLXJlbGF0ZWQgZGVmaW5lcyAqLworLyoJUlNTSSBjb25zdGFudHMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IDgwMi4xMSBSU1NJIHRocmVzaG9sZAorKglpbmRpY2F0aW9uLiBpZiB0aGUgUnggcGFja2V0IHNpZ25hbCBnb3QgdG9vIHdlYWsgZm9yIDUgY29uc2VjdXRpdmUKKyoJdGltZXMsIG1pbmlwb3J0IGRyaXZlciAoZHJpdmVyKSB3aWxsIHJlcG9ydCB0aGlzIGV2ZW50IHRvIHdyYXBwZXIKKyovCisKKyNkZWZpbmUgTVJWRFJWX05GX0RFRkFVTFRfU0NBTl9WQUxVRQkJKC05NikKKworLyoqIFJUUy9GUkFHIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBNUlZEUlZfUlRTX01JTl9WQUxVRQkJMAorI2RlZmluZSBNUlZEUlZfUlRTX01BWF9WQUxVRQkJMjM0NworI2RlZmluZSBNUlZEUlZfRlJBR19NSU5fVkFMVUUJCTI1NgorI2RlZmluZSBNUlZEUlZfRlJBR19NQVhfVkFMVUUJCTIzNDYKKworLyogVGhpcyBpcyBmb3IgZmlybXdhcmUgc3BlY2lmaWMgbGVuZ3RoICovCisjZGVmaW5lIEVYVFJBX0xFTgkzNgorCisjZGVmaW5lIE1SVkRSVl9FVEhfVFhfUEFDS0VUX0JVRkZFUl9TSVpFIFwKKwkoRVRIX0ZSQU1FX0xFTiArIHNpemVvZihzdHJ1Y3QgdHhwZCkgKyBFWFRSQV9MRU4pCisKKyNkZWZpbmUgTVJWRFJWX0VUSF9SWF9QQUNLRVRfQlVGRkVSX1NJWkUgXAorCShFVEhfRlJBTUVfTEVOICsgc2l6ZW9mKHN0cnVjdCByeHBkKSBcCisJICsgTVJWRFJWX1NOQVBfSEVBREVSX0xFTiArIEVYVFJBX0xFTikKKworI2RlZmluZQlDTURfRl9IT1NUQ01ECQkoMSA8PCAwKQorI2RlZmluZSBGV19DQVBJTkZPX1dQQSAgCSgxIDw8IDApCisKKy8qKiBXUEEga2V5IExFTkdUSCovCisjZGVmaW5lIE1SVkxfTUFYX0tFWV9XUEFfS0VZX0xFTkdUSCAgICAgMzIKKworI2RlZmluZSBLRVlfTEVOX1dQQV9BRVMJCQkxNgorI2RlZmluZSBLRVlfTEVOX1dQQV9US0lQCQkzMgorI2RlZmluZSBLRVlfTEVOX1dFUF8xMDQJCQkxMworI2RlZmluZSBLRVlfTEVOX1dFUF80MAkJCTUKKworI2RlZmluZSBSRl9BTlRFTk5BXzEJCTB4MQorI2RlZmluZSBSRl9BTlRFTk5BXzIJCTB4MgorI2RlZmluZSBSRl9BTlRFTk5BX0FVVE8JCTB4RkZGRgorCisjZGVmaW5lCUJBTkRfQgkJCSgweDAxKQorI2RlZmluZQlCQU5EX0cJCQkoMHgwMikKKyNkZWZpbmUgQUxMXzgwMl8xMV9CQU5EUwkoQkFORF9CIHwgQkFORF9HKQorCisvKiogTUFDUk8gREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgQ0FMX05GKE5GKQkJCSgoczMyKSgtKHMzMikoTkYpKSkKKyNkZWZpbmUgQ0FMX1JTU0koU05SLCBORikgCQkoKHMzMikoKHMzMikoU05SKSArIENBTF9ORihORikpKQorI2RlZmluZSBTQ0FOX1JTU0koUlNTSSkJCQkoMHgxMDAgLSAoKHU4KShSU1NJKSkpCisKKyNkZWZpbmUgREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUgkJOAorI2RlZmluZSBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUgkJOAorI2RlZmluZSBBVkdfU0NBTEUJCQkxMDAKKyNkZWZpbmUgQ0FMX0FWR19TTlJfTkYoQVZHLCBTTlJORiwgTikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKChBVkcpID09IDApID8gKCh1MTYpKFNOUk5GKSAqIEFWR19TQ0FMRSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KShBVkcpICogKE4gLTEpKSArICgodTE2KShTTlJORikgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVkdfU0NBTEUpKSAgLyBOKSkKKworI2RlZmluZSBCX1NVUFBPUlRFRF9SQVRFUwkJOAorI2RlZmluZSBHX1NVUFBPUlRFRF9SQVRFUwkJMTQKKworI2RlZmluZQlXTEFOX1NVUFBPUlRFRF9SQVRFUwkJMTQKKworI2RlZmluZQlNQVhfTEVEUwkJCTgKKworI2RlZmluZSBJU19NRVNIX0ZSQU1FKHgpICh4LT5jYls2XSkKKyNkZWZpbmUgU0VUX01FU0hfRlJBTUUoeCkgKHgtPmNiWzZdPTEpCisjZGVmaW5lIFVOU0VUX01FU0hfRlJBTUUoeCkgKHgtPmNiWzZdPTApCisKKy8qKiBHbG9iYWwgVmFyaWFibGUgRGVjbGFyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IF93bGFuX3ByaXZhdGUgd2xhbl9wcml2YXRlOwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fYWRhcHRlciB3bGFuX2FkYXB0ZXI7CitleHRlcm4gY29uc3QgY2hhciBsaWJlcnRhc19kcml2ZXJfdmVyc2lvbltdOworZXh0ZXJuIHUxNiBsaWJlcnRhc19yZWdpb25fY29kZV90b19pbmRleFtNUlZEUlZfTUFYX1JFR0lPTl9DT0RFXTsKKworZXh0ZXJuIHU4IGxpYmVydGFzX3dsYW5fZGF0YV9yYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107CisKK2V4dGVybiB1OCBsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXNbR19TVVBQT1JURURfUkFURVNdOworCitleHRlcm4gdTggbGliZXJ0YXNfYWRob2NfcmF0ZXNfZ1tHX1NVUFBPUlRFRF9SQVRFU107CisKK2V4dGVybiB1OCBsaWJlcnRhc19hZGhvY19yYXRlc19iWzRdOworCisvKiogRU5VTSBkZWZpbml0aW9uKi8KKy8qKiBTTlJORl9UWVBFICovCitlbnVtIFNOUk5GX1RZUEUgeworCVRZUEVfQkVBQ09OID0gMCwKKwlUWVBFX1JYUEQsCisJTUFYX1RZUEVfQgorfTsKKworLyoqIFNOUk5GX0RBVEEqLworZW51bSBTTlJORl9EQVRBIHsKKwlUWVBFX05PQVZHID0gMCwKKwlUWVBFX0FWRywKKwlNQVhfVFlQRV9BVkcKK307CisKKy8qKiBXTEFOXzgwMl8xMV9BVVRIX0FMRyovCitlbnVtIFdMQU5fODAyXzExX0FVVEhfQUxHIHsKKwlBVVRIX0FMR19PUEVOX1NZU1RFTSA9IDEsCisJQVVUSF9BTEdfU0hBUkVEX0tFWSA9IDIsCisJQVVUSF9BTEdfTkVUV09SS19FQVAgPSA4LAorfTsKKworLyoqIFdMQU5fODAyXzFYX0FVVEhfQUxHICovCitlbnVtIFdMQU5fODAyXzFYX0FVVEhfQUxHIHsKKwlXTEFOXzFYX0FVVEhfQUxHX05PTkUgPSAxLAorCVdMQU5fMVhfQVVUSF9BTEdfTEVBUCA9IDIsCisJV0xBTl8xWF9BVVRIX0FMR19UTFMgPSA0LAorCVdMQU5fMVhfQVVUSF9BTEdfVFRMUyA9IDgsCisJV0xBTl8xWF9BVVRIX0FMR19NRDUgPSAxNiwKK307CisKKy8qKiBXTEFOXzgwMl8xMV9FTkNSWVBUSU9OX01PREUgKi8KK2VudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIHsKKwlDSVBIRVJfTk9ORSwKKwlDSVBIRVJfV0VQNDAsCisJQ0lQSEVSX1RLSVAsCisJQ0lQSEVSX0NDTVAsCisJQ0lQSEVSX1dFUDEwNCwKK307CisKKy8qKiBXTEFOXzgwMl8xMV9QT1dFUl9NT0RFICovCitlbnVtIFdMQU5fODAyXzExX1BPV0VSX01PREUgeworCXdsYW44MDJfMTFwb3dlcm1vZGVjYW0sCisJd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3AsCisJd2xhbjgwMl8xMVBvd2VybW9kZWZhc3RfcHNwLAorCS8qbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCisJd2xhbjgwMl8xMXBvd2Vtb2RlbWF4Cit9OworCisvKiogUFNfU1RBVEUgKi8KK2VudW0gUFNfU1RBVEUgeworCVBTX1NUQVRFX0ZVTExfUE9XRVIsCisJUFNfU1RBVEVfQVdBS0UsCisJUFNfU1RBVEVfUFJFX1NMRUVQLAorCVBTX1NUQVRFX1NMRUVQCit9OworCisvKiogRE5MRF9TVEFURSAqLworZW51bSBETkxEX1NUQVRFIHsKKwlETkxEX1JFU19SRUNFSVZFRCwKKwlETkxEX0RBVEFfU0VOVCwKKwlETkxEX0NNRF9TRU5UCit9OworCisvKiogV0xBTl9NRURJQV9TVEFURSAqLworZW51bSBXTEFOX01FRElBX1NUQVRFIHsKKwlsaWJlcnRhc19jb25uZWN0ZWQsCisJbGliZXJ0YXNfZGlzY29ubmVjdGVkCit9OworCisvKiogV0xBTl84MDJfMTFfUFJJVkFDWV9GSUxURVIgKi8KK2VudW0gV0xBTl84MDJfMTFfUFJJVkFDWV9GSUxURVIgeworCXdsYW44MDJfMTFwcml2ZmlsdGVyYWNjZXB0YWxsLAorCXdsYW44MDJfMTFwcml2ZmlsdGVyODAyMXhXRVAKK307CisKKy8qKiBtdl9tc190eXBlICovCitlbnVtIG12X21zX3R5cGUgeworCU1WTVNfREFUID0gMCwKKwlNVk1TX0NNRCA9IDEsCisJTVZNU19UWERPTkUgPSAyLAorCU1WTVNfRVZFTlQKK307CisKKy8qKiBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICovCitlbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgeworCXdsYW44MDJfMTFpYnNzLAorCXdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSwKKwl3bGFuODAyXzExYXV0b3Vua25vd24sCisJLypkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCisJd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlbWF4Cit9OworCisvKiogV0xBTl84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAqLworZW51bSBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIHsKKwl3bGFuODAyXzExYXV0aG1vZGVvcGVuID0gMHgwMCwKKwl3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQgPSAweDAxLAorCXdsYW44MDJfMTFhdXRobW9kZW5ldHdvcmtFQVAgPSAweDgwLAorfTsKKworLyoqIFdMQU5fODAyXzExX1dFUF9TVEFUVVMgKi8KK2VudW0gV0xBTl84MDJfMTFfV0VQX1NUQVRVUyB7CisJd2xhbjgwMl8xMVdFUGVuYWJsZWQsCisJd2xhbjgwMl8xMVdFUGRpc2FibGVkLAorfTsKKworLyoqIFNOTVBfTUlCX0lOREVYX2UgKi8KK2VudW0gU05NUF9NSUJfSU5ERVhfZSB7CisJZGVzaXJlZF9ic3N0eXBlX2kgPSAwLAorCW9wX3JhdGVzZXRfaSwKKwliY25wZXJpb2RfaSwKKwlkdGltcGVyaW9kX2ksCisJYXNzb2Nyc3BfdGltZW91dF9pLAorCXJ0c3RocmVzaF9pLAorCXNob3J0X3JldHJ5bGltX2ksCisJbG9uZ19yZXRyeWxpbV9pLAorCWZyYWd0aHJlc2hfaSwKKwlkb3QxMWRfaSwKKwlkb3QxMWhfaSwKKwltYW51ZmlkX2ksCisJcHJvZElEX2ksCisJbWFudWZfb3VpX2ksCisJbWFudWZfbmFtZV9pLAorCW1hbnVmX3Byb2RuYW1lX2ksCisJbWFudWZfcHJvZHZlcl9pLAorfTsKKworLyoqIEtFWV9UWVBFX0lEICovCitlbnVtIEtFWV9UWVBFX0lEIHsKKwlLRVlfVFlQRV9JRF9XRVAgPSAwLAorCUtFWV9UWVBFX0lEX1RLSVAsCisJS0VZX1RZUEVfSURfQUVTCit9OworCisvKiogS0VZX0lORk9fV1BBIChhcHBsaWVzIHRvIGJvdGggVEtJUCBhbmQgQUVTL0NDTVApICovCitlbnVtIEtFWV9JTkZPX1dQQSB7CisJS0VZX0lORk9fV1BBX01DQVNUID0gMHgwMSwKKwlLRVlfSU5GT19XUEFfVU5JQ0FTVCA9IDB4MDIsCisJS0VZX0lORk9fV1BBX0VOQUJMRUQgPSAweDA0Cit9OworCisvKiogU05NUF9NSUJfVkFMVUVfZSAqLworZW51bSBTTk1QX01JQl9WQUxVRV9lIHsKKwlTTk1QX01JQl9WQUxVRV9JTkZSQSA9IDEsCisJU05NUF9NSUJfVkFMVUVfQURIT0MKK307CisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciBmd3QgY29tbWFuZHMuICovCisjZGVmaW5lIEZXVF9ERUZBVUxUX01FVFJJQyAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX0RJUiAxCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NTTiAweGZmZmZmZmZmCisjZGVmaW5lIEZXVF9ERUZBVUxUX0RTTiAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX0hPUENPVU5UIDAKKyNkZWZpbmUgRldUX0RFRkFVTFRfVFRMIDAKKyNkZWZpbmUgRldUX0RFRkFVTFRfRVhQSVJBVElPTiAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NMRUVQTU9ERSAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NOUiAwCisKKyNlbmRpZgkJCQkvKiBfV0xBTl9ERUZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjg3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaApAQCAtMCwwICsxLDQwMyBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgc3BlY2lmaWMKKyAgKiB0byBNYXJ2ZWxsIDgwMi4xMSBOSUMuIEl0IGNvbnRhaW5zIHRoZSBEZXZpY2UgSW5mb3JtYXRpb24KKyAgKiBzdHJ1Y3R1cmUgd2xhbl9hZGFwdGVyLgorICAqLworI2lmbmRlZiBfV0xBTl9ERVZfSF8KKyNkZWZpbmUgX1dMQU5fREVWX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic2Nhbi5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitleHRlcm4gc3RydWN0IGV0aHRvb2xfb3BzIGxpYmVydGFzX2V0aHRvb2xfb3BzOworCisjZGVmaW5lCU1BWF9CU1NJRF9QRVJfQ0hBTk5FTAkJMTYKKworI2RlZmluZSBOUl9UWF9RVUVVRQkJCTMKKworLyogRm9yIHRoZSBleHRlbmRlZCBTY2FuICovCisjZGVmaW5lIE1BWF9FWFRFTkRFRF9TQ0FOX0JTU0lEX0xJU1QgICAgTUFYX0JTU0lEX1BFUl9DSEFOTkVMICogXAorCQkJCQkJTVJWRFJWX01BWF9DSEFOTkVMX1NJWkUgKyAxCisKKyNkZWZpbmUJTUFYX1JFR0lPTl9DSEFOTkVMX05VTQkyCisKKy8qKiBDaGFuLWZyZXEtVHhQb3dlciBtYXBwaW5nIHRhYmxlKi8KK3N0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgeworCS8qKiBjaGFubmVsIE51bWJlcgkJKi8KKwl1MTYgY2hhbm5lbDsKKwkvKiogZnJlcXVlbmN5IG9mIHRoaXMgY2hhbm5lbAkqLworCXUzMiBmcmVxOworCS8qKiBNYXggYWxsb3dlZCBUeCBwb3dlciBsZXZlbAkqLworCXUxNiBtYXh0eHBvd2VyOworCS8qKiBUUlVFOmNoYW5uZWwgdW5zdXBwb3J0ZWQ7ICBGTEFTRTpzdXBwb3J0ZWQqLworCXU4IHVuc3VwcG9ydGVkOworfTsKKworLyoqIHJlZ2lvbi1iYW5kIG1hcHBpbmcgdGFibGUqLworc3RydWN0IHJlZ2lvbl9jaGFubmVsIHsKKwkvKiogVFJVRSBpZiB0aGlzIGVudHJ5IGlzIHZhbGlkCQkgICAgICovCisJdTggdmFsaWQ7CisJLyoqIHJlZ2lvbiBjb2RlIGZvciBVUywgSmFwYW4gLi4uCSAgICAgKi8KKwl1OCByZWdpb247CisJLyoqIGJhbmQgQi9HL0EsIHVzZWQgZm9yIEJBTkRfQ09ORklHIGNtZAkgICAgICovCisJdTggYmFuZDsKKwkvKiogQWN0dWFsIE5vLiBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYmVsb3cgKi8KKwl1OCBucmNmcDsKKwkvKiogY2hhbi1mcmVxLXR4cG93ZXIgbWFwcGluZyB0YWJsZSovCisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqQ0ZQOworfTsKKworc3RydWN0IHdsYW5fODAyXzExX3NlY3VyaXR5IHsKKwl1OCBXUEFlbmFibGVkOworCXU4IFdQQTJlbmFibGVkOworCWVudW0gV0xBTl84MDJfMTFfV0VQX1NUQVRVUyBXRVBzdGF0dXM7CisJZW51bSBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhtb2RlOworCWVudW0gV0xBTl84MDJfMVhfQVVUSF9BTEcgYXV0aDF4YWxnOworCWVudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIEVuY3J5cHRpb25tb2RlOworfTsKKworLyoqIEN1cnJlbnQgQmFzaWMgU2VydmljZSBTZXQgU3RhdGUgU3RydWN0dXJlICovCitzdHJ1Y3QgY3VycmVudF9ic3NfcGFyYW1zIHsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgYnNzZGVzY3JpcHRvcjsKKwkvKiogYnNzaWQgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJLyoqIHNzaWQgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCBzc2lkOworCisJLyoqIGJhbmQgKi8KKwl1OCBiYW5kOworCS8qKiBjaGFubmVsICovCisJdTggY2hhbm5lbDsKKwkvKiogbnVtYmVyIG9mIHJhdGVzIHN1cHBvcnRlZCAqLworCWludCBudW1vZnJhdGVzOworCS8qKiBzdXBwb3J0ZWQgcmF0ZXMqLworCXU4IGRhdGFyYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107Cit9OworCisvKiogc2xlZXBfcGFyYW1zICovCitzdHJ1Y3Qgc2xlZXBfcGFyYW1zIHsKKwl1MTYgc3BfZXJyb3I7CisJdTE2IHNwX29mZnNldDsKKwl1MTYgc3Bfc3RhYmxldGltZTsKKwl1OCBzcF9jYWxjb250cm9sOworCXU4IHNwX2V4dHNsZWVwY2xrOworCXUxNiBzcF9yZXNlcnZlZDsKK307CisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIE1hcnZlbGwgV0xBTiBkZXZpY2UgKi8KK3R5cGVkZWYgc3RydWN0IF93bGFuX2RldiB7CisJLyoqIGRldmljZSBuYW1lICovCisJY2hhciBuYW1lW0RFVl9OQU1FX0xFTl07CisJLyoqIGNhcmQgcG9pbnRlciAqLworCXZvaWQgKmNhcmQ7CisJLyoqIElPIHBvcnQgKi8KKwl1MzIgaW9wb3J0OworCS8qKiBVcGxvYWQgcmVjZWl2ZWQgKi8KKwl1MzIgdXBsZF9yY3Y7CisJLyoqIFVwbG9hZCB0eXBlICovCisJdTMyIHVwbGRfdHlwOworCS8qKiBVcGxvYWQgbGVuZ3RoICovCisJdTMyIHVwbGRfbGVuOworCS8qKiBuZXRkZXYgcG9pbnRlciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJLyogVXBsb2FkIGJ1ZmZlciAqLworCXU4IHVwbGRfYnVmW1dMQU5fVVBMRF9TSVpFXTsKKwkvKiBEb3dubG9hZCBzZW50OgorCSAgIGJpdDAgMS8wPWRhdGFfc2VudC9kYXRhX3R4X2RvbmUsCisJICAgYml0MSAxLzA9Y21kX3NlbnQvY21kX3R4X2RvbmUsCisJICAgYWxsIG90aGVyIGJpdHMgcmVzZXJ2ZWQgMCAqLworCXU4IGRubGRfc2VudDsKK30gd2xhbl9kZXZfdCwgKnB3bGFuX2Rldl90OworCisvKiBNZXNoIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCB3bGFuX21lc2hfc3RhdHMgeworCXUzMglmd2RfYmNhc3RfY250OwkJLyogRndkOiBCcm9hZGNhc3QgY291bnRlciAqLworCXUzMglmd2RfdW5pY2FzdF9jbnQ7CS8qIEZ3ZDogVW5pY2FzdCBjb3VudGVyICovCisJdTMyCWZ3ZF9kcm9wX3R0bDsJCS8qIEZ3ZDogVFRMIHplcm8gKi8KKwl1MzIJZndkX2Ryb3BfcmJ0OwkJLyogRndkOiBSZWNlbnRseSBCcm9hZGNhc3RlZCAqLworCXUzMglmd2RfZHJvcF9ub3JvdXRlOyAJLyogRndkOiBObyByb3V0ZSB0byBEZXN0aW5hdGlvbiAqLworCXUzMglmd2RfZHJvcF9ub2J1ZjsJCS8qIEZ3ZDogUnVuIG91dCBvZiBpbnRlcm5hbCBidWZmZXJzICovCisJdTMyCWRyb3BfYmxpbmQ7CQkvKiBSeDogIERyb3BwZWQgYnkgYmxpbmRpbmcgdGFibGUgKi8KK307CisKKy8qKiBQcml2YXRlIHN0cnVjdHVyZSBmb3IgdGhlIE1WIGRldmljZSAqLworc3RydWN0IF93bGFuX3ByaXZhdGUgeworCWludCBvcGVuOworCWludCBtZXNoX29wZW47CisJaW50IGluZnJhX29wZW47CisKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXI7CisJd2xhbl9kZXZfdCB3bGFuX2RldjsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldiA7IC8qIFZpcnR1YWwgZGV2aWNlICovCisKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IHdsYW5fbWVzaF9zdGF0cyBtc3RhdHM7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZWJ1ZzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2ZpbGVzWzZdOworCisJc3RydWN0IGRlbnRyeSAqZXZlbnRzX2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2V2ZW50c19maWxlc1s2XTsKKworCXN0cnVjdCBkZW50cnkgKnJlZ3NfZGlyOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcmVnc19maWxlc1s2XTsKKworCXUzMiBtYWNfb2Zmc2V0OworCXUzMiBiYnBfb2Zmc2V0OworCXUzMiByZl9vZmZzZXQ7CisKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCXN0cnVjdCBkZXZpY2UgKmhvdHBsdWdfZGV2aWNlOworCisJLyoqIHRocmVhZCB0byBzZXJ2aWNlIGludGVycnVwdHMgKi8KKwlzdHJ1Y3Qgd2xhbl90aHJlYWQgbWFpbnRocmVhZDsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgYXNzb2Nfd29yazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXNzb2NfdGhyZWFkOworfTsKKworLyoqIEFzc29jaWF0aW9uIHJlcXVlc3QKKyAqCisgKiBFbmNhcHN1bGF0ZXMgYWxsIHRoZSBvcHRpb25zIHRoYXQgZGVzY3JpYmUgYSBzcGVjaWZpYyBhc3NvY2F0aW9uIHJlcXVlc3QKKyAqIG9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHdpcmVsZXNzIGNhcmQncyByYWRpbywgbW9kZSwgYW5kIHNlY3VyaXR5IHNldHRpbmdzLgorICovCitzdHJ1Y3QgYXNzb2NfcmVxdWVzdCB7CisjZGVmaW5lIEFTU09DX0ZMQUdfU1NJRAkJCTEKKyNkZWZpbmUgQVNTT0NfRkxBR19DSEFOTkVMCQkyCisjZGVmaW5lIEFTU09DX0ZMQUdfTU9ERQkJCTMKKyNkZWZpbmUgQVNTT0NfRkxBR19CU1NJRAkJNAorI2RlZmluZSBBU1NPQ19GTEFHX1dFUF9LRVlTCQk1CisjZGVmaW5lIEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWAk2CisjZGVmaW5lIEFTU09DX0ZMQUdfV1BBX01DQVNUX0tFWQk3CisjZGVmaW5lIEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWQk4CisjZGVmaW5lIEFTU09DX0ZMQUdfU0VDSU5GTwkJOQorI2RlZmluZSBBU1NPQ19GTEFHX1dQQV9JRQkJMTAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgc3NpZDsKKwl1OCBjaGFubmVsOworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qKiBXRVAga2V5cyAqLworCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgd2VwX2tleXNbNF07CisJdTE2IHdlcF90eF9rZXlpZHg7CisKKwkvKiogV1BBIGtleXMgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHdwYV9tY2FzdF9rZXk7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSB3cGFfdW5pY2FzdF9rZXk7CisKKwlzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkgc2VjaW5mbzsKKworCS8qKiBXUEEgSW5mb3JtYXRpb24gRWxlbWVudHMqLworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJdTggd3BhX2llX2xlbjsKK307CisKKy8qKiBXbGFuIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUqLworc3RydWN0IF93bGFuX2FkYXB0ZXIgeworCS8qKiBTVEFUVVMgdmFyaWFibGVzICovCisJdTMyIGZ3cmVsZWFzZW51bWJlcjsKKwl1MzIgZndjYXBpbmZvOworCS8qIHByb3RlY3RlZCB3aXRoIGJpZyBsb2NrICovCisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXU4IHRtcHR4YnVmW1dMQU5fVVBMRF9TSVpFXTsKKwkvKiBwcm90ZWN0ZWQgYnkgaGFyZF9zdGFydF94bWl0IHNlcmlhbGl6YXRpb24gKi8KKworCS8qKiBjb21tYW5kLXJlbGF0ZWQgdmFyaWFibGVzICovCisJdTE2IHNlcW51bTsKKwkvKiBwcm90ZWN0ZWQgYnkgYmlnIGxvY2sgKi8KKworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRfYXJyYXk7CisJLyoqIEN1cnJlbnQgY29tbWFuZCAqLworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjdXJfY21kOworCWludCBjdXJfY21kX3JldGNvZGU7CisJLyoqIGNvbW1hbmQgUXVldWVzICovCisJLyoqIEZyZWUgY29tbWFuZCBidWZmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCBjbWRmcmVlcTsKKwkvKiogUGVuZGluZyBjb21tYW5kIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNtZHBlbmRpbmdxOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgY21kX3BlbmRpbmc7CisJdTggbnJfY21kX3BlbmRpbmc7CisJLyogY29tbWFuZCByZWxhdGVkIHZhcmlhYmxlcyBwcm90ZWN0ZWQgYnkgYWRhcHRlci0+ZHJpdmVyX2xvY2sgKi8KKworCS8qKiBBc3luYyBhbmQgU3luYyBFdmVudCB2YXJpYWJsZXMgKi8KKwl1MzIgaW50Y291bnRlcjsKKwl1MzIgZXZlbnRjYXVzZTsKKwl1OCBub2RlbmFtZVsxNl07CS8qIG5pY2tuYW1lICovCisKKwkvKiogc3BpbiBsb2NrcyAqLworCXNwaW5sb2NrX3QgZHJpdmVyX2xvY2s7CisKKwkvKiogVGltZXJzICovCisJc3RydWN0IHRpbWVyX2xpc3QgY29tbWFuZF90aW1lcjsKKworCS8qIFRYIHF1ZXVlIHVzZWQgaW4gUFMgbW9kZSAqLworCXNwaW5sb2NrX3QgdHhxdWV1ZV9sb2NrOworCXN0cnVjdCBza19idWZmICp0eF9xdWV1ZV9wc1tOUl9UWF9RVUVVRV07CisJdW5zaWduZWQgaW50IHR4X3F1ZXVlX2lkeDsKKworCXU4IGhpc3JlZ2NweTsKKworCS8qKiBjdXJyZW50IHNzaWQvYnNzaWQgcmVsYXRlZCBwYXJhbWV0ZXJzKi8KKwlzdHJ1Y3QgY3VycmVudF9ic3NfcGFyYW1zIGN1cmJzc3BhcmFtczsKKworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBpbmZyYW1vZGU7CisKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBhdHRlbXB0ZWRic3NkZXNjOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgcHJldmlvdXNzc2lkOworCXU4IHByZXZpb3VzYnNzaWRbRVRIX0FMRU5dOworCisJc3RydWN0IGJzc19kZXNjcmlwdG9yICpzY2FudGFibGU7CisJdTMyIG51bWluc2NhbnRhYmxlOworCisJdTggc2NhbnR5cGU7CisJdTMyIHNjYW5tb2RlOworCisJdTE2IGJlYWNvbnBlcmlvZDsKKwl1OCBhZGhvY2NyZWF0ZTsKKworCS8qKiBjYXBhYmlsaXR5IEluZm8gdXNlZCBpbiBBc3NvY2lhdGlvbiwgc3RhcnQsIGpvaW4gKi8KKwlzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8gY2FwaW5mbzsKKworCS8qKiBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworCXU4IGN1cnJlbnRfYWRkcltFVEhfQUxFTl07CisJdTggbXVsdGljYXN0bGlzdFtNUlZEUlZfTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkVdW0VUSF9BTEVOXTsKKwl1MzIgbnJfb2ZfbXVsdGljYXN0bWFjYWRkcjsKKworCS8qKiA4MDIuMTEgc3RhdGlzdGljcyAqLworLy8Jc3RydWN0IGNtZF9EU184MDJfMTFfR0VUX1NUQVQgd2xhbjgwMl8xMVN0YXQ7CisKKwl1MTYgZW5hYmxlaHdhdXRvOworCXUxNiByYXRlYml0bWFwOworCS8qKiBjb250cm9sIEcgcmF0ZXMgKi8KKwl1OCBhZGhvY19ncmF0ZV9lbmFibGVkOworCisJdTMyIHR4YW50ZW5uYTsKKwl1MzIgcnhhbnRlbm5hOworCisJdTggYWRob2NjaGFubmVsOworCXUzMiBmcmFndGhzZDsKKwl1MzIgcnRzdGhzZDsKKworCXUzMiBkYXRhcmF0ZTsKKwl1OCBpc19kYXRhcmF0ZV9hdXRvOworCisJdTE2IGxpc3RlbmludGVydmFsOworCXUxNiBwcmVzY2FuOworCXU4IHR4cmV0cnljb3VudDsKKworCS8qKiBUeC1yZWxhdGVkIHZhcmlhYmxlcyAoZm9yIHNpbmdsZSBwYWNrZXQgdHgpICovCisJc3RydWN0IHNrX2J1ZmYgKmN1cnJlbnR0eHNrYjsKKwl1MTYgVHhMb2NrRmxhZzsKKworCS8qKiBOSUMgT3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljcyAqLworCXUxNiBjdXJyZW50cGFja2V0ZmlsdGVyOworCXUzMiBjb25uZWN0X3N0YXR1czsKKwl1MTYgcmVnaW9uY29kZTsKKwl1MTYgcmVnaW9udGFibGVpbmRleDsKKwl1MTYgdHhwb3dlcmxldmVsOworCisJLyoqIFBPV0VSIE1BTkFHRU1FTlQgQU5EIFBuUCBTVVBQT1JUICovCisJdTggc3VycHJpc2VyZW1vdmVkOworCXUxNiBhdGltd2luZG93OworCisJdTE2IHBzbW9kZTsJCS8qIFdsYW44MDJfMTFQb3dlcm1vZGVDQU09ZGlzYWJsZQorCQkJCSAgIFdsYW44MDJfMTFQb3dlcm1vZGVNQVhfUFNQPWVuYWJsZSAqLworCXUxNiBtdWx0aXBsZWR0aW07CisJdTMyIHBzc3RhdGU7CisJdTggbmVlZHRvd2FrZXVwOworCisJc3RydWN0IFBTX0NNRF9Db25maXJtU2xlZXAgbGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcDsKKwl1MTYgbG9jYWxsaXN0ZW5pbnRlcnZhbDsKKwl1MTYgbnVsbHBrdGludGVydmFsOworCisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7CisKKwkvKiogRW5jcnlwdGlvbiBwYXJhbWV0ZXIgKi8KKwlzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkgc2VjaW5mbzsKKworCS8qKiBXRVAga2V5cyAqLworCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgd2VwX2tleXNbNF07CisJdTE2IHdlcF90eF9rZXlpZHg7CisKKwkvKiogV1BBIGtleXMgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHdwYV9tY2FzdF9rZXk7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSB3cGFfdW5pY2FzdF9rZXk7CisKKwkvKiogV1BBIEluZm9ybWF0aW9uIEVsZW1lbnRzKi8KKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXU4IHdwYV9pZV9sZW47CisKKwl1MTYgcnhhbnRlbm5hbW9kZTsKKwl1MTYgdHhhbnRlbm5hbW9kZTsKKworCS8qKiBSZXF1ZXN0ZWQgU2lnbmFsIFN0cmVuZ3RoKi8KKwl1MTYgYmNuX2F2Z19mYWN0b3I7CisJdTE2IGRhdGFfYXZnX2ZhY3RvcjsKKwl1MTYgU05SW01BWF9UWVBFX0JdW01BWF9UWVBFX0FWR107CisJdTE2IE5GW01BWF9UWVBFX0JdW01BWF9UWVBFX0FWR107CisJdTggUlNTSVtNQVhfVFlQRV9CXVtNQVhfVFlQRV9BVkddOworCXU4IHJhd1NOUltERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUl07CisJdTggcmF3TkZbREVGQVVMVF9EQVRBX0FWR19GQUNUT1JdOworCXUxNiBuZXh0U05STkY7CisJdTE2IG51bVNOUk5GOworCXUxNiByeHBkX3JhdGU7CisKKwl1OCByYWRpb29uOworCXUzMiBwcmVhbWJsZTsKKworCS8qKiBNdWx0aSBiYW5kcyBQYXJhbWV0ZXIqLworCXU4IGxpYmVydGFzX3N1cHBvcnRlZF9yYXRlc1tHX1NVUFBPUlRFRF9SQVRFU107CisKKwkvKiogQmx1ZSBUb290aCBDby1leGlzdGVuY2UgQXJiaXRyYXRpb24gKi8KKworCS8qKiBzbGVlcF9wYXJhbXMgKi8KKwlzdHJ1Y3Qgc2xlZXBfcGFyYW1zIHNwOworCisJLyoqIFJGIGNhbGlicmF0aW9uIGRhdGEgKi8KKworI2RlZmluZQlNQVhfUkVHSU9OX0NIQU5ORUxfTlVNCTIKKwkvKiogcmVnaW9uIGNoYW5uZWwgZGF0YSAqLworCXN0cnVjdCByZWdpb25fY2hhbm5lbCByZWdpb25fY2hhbm5lbFtNQVhfUkVHSU9OX0NIQU5ORUxfTlVNXTsKKworCXN0cnVjdCByZWdpb25fY2hhbm5lbCB1bml2ZXJzYWxfY2hhbm5lbFtNQVhfUkVHSU9OX0NIQU5ORUxfTlVNXTsKKworCS8qKiAxMUQgYW5kIERvbWFpbiBSZWd1bGF0b3J5IERhdGEgKi8KKwlzdHJ1Y3Qgd2xhbl84MDJfMTFkX2RvbWFpbl9yZWcgZG9tYWlucmVnOworCXN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkIHBhcnNlZF9yZWdpb25fY2hhbjsKKworCS8qKiBGU00gdmFyaWFibGUgZm9yIDExZCBzdXBwb3J0ICovCisJdTMyIGVuYWJsZTExZDsKKworCS8qKglNSVNDRUxMQU5FT1VTICovCisJdTggKnByZGVlcHJvbTsKKwlzdHJ1Y3Qgd2xhbl9vZmZzZXRfdmFsdWUgb2Zmc2V0dmFsdWU7CisKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfbG9nIGxvZ21zZzsKKwl1MTYgc2NhbnByb2JlczsKKworCXUzMiBwa3R0eGN0cmw7CisKKwl1MTYgdHhyYXRlOworCXUzMiBsaW5rbW9kZTsKKwl1MzIgcmFkaW9tb2RlOworCXUzMiBkZWJ1Z21vZGU7CisJdTggZndfcmVhZHk7Cit9OworCisjZW5kaWYJCQkJLyogX1dMQU5fREVWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NGRlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwpAQCAtMCwwICsxLDE4NCBAQAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2JpLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAid2V4dC5oIgorc3RhdGljIGNvbnN0IGNoYXIgKiBtZXNoX3N0YXRfc3RyaW5nc1tdPSB7CisJCQkiZHJvcF9kdXBsaWNhdGVfYmNhc3QiLAorCQkJImRyb3BfdHRsX3plcm8iLAorCQkJImRyb3Bfbm9fZndkX3JvdXRlIiwKKwkJCSJkcm9wX25vX2J1ZmZlcnMiLAorCQkJImZ3ZGVkX3VuaWNhc3RfY250IiwKKwkJCSJmd2RlZF9iY2FzdF9jbnQiLAorCQkJImRyb3BfYmxpbmRfdGFibGUiCit9OworCitzdGF0aWMgdm9pZCBsaWJlcnRhc19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWNoYXIgZnd2ZXJbMzJdOworCisJbGliZXJ0YXNfZ2V0X2Z3dmVyc2lvbihwcml2LT5hZGFwdGVyLCBmd3Zlciwgc2l6ZW9mKGZ3dmVyKSAtIDEpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgImxpYmVydGFzIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgZnd2ZXIpOworfQorCisvKiBBbGwgODM4OCBwYXJ0cyBoYXZlIDE2S2lCIEVFUFJPTSBzaXplIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuCisgKiBJbiBjYXNlIHRoYXQgY2hhbmdlcyB0aGlzIG5lZWRzIGZpeGluZy4KKyAqLworI2RlZmluZSBMSUJFUlRBU19FRVBST01fTEVOIDE2Mzg0CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfZXRodG9vbF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBMSUJFUlRBU19FRVBST01fTEVOOworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX2V0aHRvb2xfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqIGJ5dGVzKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHdsYW5faW9jdGxfcmVncmR3ciByZWdjdHJsOworCWNoYXIgKnB0cjsKKwlpbnQgcmV0OworCisJcmVnY3RybC5hY3Rpb24gPSAwOworCXJlZ2N0cmwub2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJcmVnY3RybC5OT0IgPSBlZXByb20tPmxlbjsKKworCWlmIChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuID4gTElCRVJUQVNfRUVQUk9NX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKy8vICAgICAgbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCisJYWRhcHRlci0+cHJkZWVwcm9tID0KKwkJICAgIChjaGFyICopa21hbGxvYyhlZXByb20tPmxlbitzaXplb2YocmVnY3RybCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+cHJkZWVwcm9tKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoYWRhcHRlci0+cHJkZWVwcm9tLCAmcmVnY3RybCwgc2l6ZW9mKHJlZ2N0cmwpKTsKKworCS8qICsxNCBpcyBmb3IgYWN0aW9uLCBvZmZzZXQsIGFuZCBOT0IgaW4KKwkgKiByZXNwb25zZSAqLworCWxic19wcl9kZWJ1ZygxLCAiYWN0aW9uOiVkIG9mZnNldDogJXggTk9COiAlMDJ4XG4iLAorCSAgICAgICByZWdjdHJsLmFjdGlvbiwgcmVnY3RybC5vZmZzZXQsIHJlZ2N0cmwuTk9CKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfODAyXzExX2VlcHJvbV9hY2Nlc3MsCisJCQkJICAgIHJlZ2N0cmwuYWN0aW9uLAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJICAgICZyZWdjdHJsKTsKKworCWlmIChyZXQpIHsKKwkJaWYgKGFkYXB0ZXItPnByZGVlcHJvbSkKKwkJCWtmcmVlKGFkYXB0ZXItPnByZGVlcHJvbSk7CisJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCX0KKworCW1kZWxheSgxMCk7CisKKwlwdHIgPSAoY2hhciAqKWFkYXB0ZXItPnByZGVlcHJvbTsKKworCS8qIHNraXAgdGhlIGNvbW1hbmQgaGVhZGVyLCBidXQgaW5jbHVkZSB0aGUgInZhbHVlIiB1MzIgdmFyaWFibGUgKi8KKwlwdHIgPSBwdHIgKyBzaXplb2Yoc3RydWN0IHdsYW5faW9jdGxfcmVncmR3cikgLSA0OworCisJLyoKKwkgKiBSZXR1cm4gdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSB1c2VyCisJICovCisJbWVtY3B5KGJ5dGVzLCBwdHIsIGVlcHJvbS0+bGVuKTsKKworCWlmIChhZGFwdGVyLT5wcmRlZXByb20pCisJCWtmcmVlKGFkYXB0ZXItPnByZGVlcHJvbSk7CisvLwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGliZXJ0YXNfZXRodG9vbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKiBzdGF0cywgdTY0ICogZGF0YSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlFTlRFUigpOworCisJc3RhdHMtPmNtZCA9IEVUSFRPT0xfR1NUQVRTOworCUJVR19PTihzdGF0cy0+bl9zdGF0cyAhPSBNRVNIX1NUQVRTX05VTSk7CisKKyAgICAgICAgZGF0YVswXSA9IHByaXYtPm1zdGF0cy5md2RfZHJvcF9yYnQ7CisgICAgICAgIGRhdGFbMV0gPSBwcml2LT5tc3RhdHMuZndkX2Ryb3BfdHRsOworICAgICAgICBkYXRhWzJdID0gcHJpdi0+bXN0YXRzLmZ3ZF9kcm9wX25vcm91dGU7CisgICAgICAgIGRhdGFbM10gPSBwcml2LT5tc3RhdHMuZndkX2Ryb3Bfbm9idWY7CisgICAgICAgIGRhdGFbNF0gPSBwcml2LT5tc3RhdHMuZndkX3VuaWNhc3RfY250OworICAgICAgICBkYXRhWzVdID0gcHJpdi0+bXN0YXRzLmZ3ZF9iY2FzdF9jbnQ7CisgICAgICAgIGRhdGFbNl0gPSBwcml2LT5tc3RhdHMuZHJvcF9ibGluZDsKKworCUxFQVZFKCk7Cit9CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfZXRodG9vbF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJaW50IHJldDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKKworCUVOVEVSKCk7CisJLyogR2V0IE1lc2ggU3RhdGlzdGljcyAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJY21kX21lc2hfYWNjZXNzLCBjbWRfYWN0X21lc2hfZ2V0X3N0YXRzLAorCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmbWVzaF9hY2Nlc3MpOworCisJaWYgKHJldCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgcHJpdi0+bXN0YXRzLmZ3ZF9kcm9wX3JidCA9IG1lc2hfYWNjZXNzLmRhdGFbMF07CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfZHJvcF90dGwgPSBtZXNoX2FjY2Vzcy5kYXRhWzFdOworICAgICAgICBwcml2LT5tc3RhdHMuZndkX2Ryb3Bfbm9yb3V0ZSA9IG1lc2hfYWNjZXNzLmRhdGFbMl07CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfZHJvcF9ub2J1ZiA9IG1lc2hfYWNjZXNzLmRhdGFbM107CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfdW5pY2FzdF9jbnQgPSBtZXNoX2FjY2Vzcy5kYXRhWzRdOworICAgICAgICBwcml2LT5tc3RhdHMuZndkX2JjYXN0X2NudCA9IG1lc2hfYWNjZXNzLmRhdGFbNV07CisgICAgICAgIHByaXYtPm1zdGF0cy5kcm9wX2JsaW5kID0gbWVzaF9hY2Nlc3MuZGF0YVs2XTsKKworCUxFQVZFKCk7CisJcmV0dXJuIE1FU0hfU1RBVFNfTlVNOworfQorCitzdGF0aWMgdm9pZCBsaWJlcnRhc19ldGh0b29sX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKwkJCQkJICB1MzIgc3RyaW5nc2V0LAorCQkJCQkgIHU4ICogcykKK3sKKwlpbnQgaTsKKworCUVOVEVSKCk7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKyAgICAgICAgY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaT0wOyBpIDwgTUVTSF9TVEFUU19OVU07IGkrKykgeworCQkJbWVtY3B5KHMgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJCQltZXNoX3N0YXRfc3RyaW5nc1tpXSwKKwkJCQkJRVRIX0dTVFJJTkdfTEVOKTsKKwkJfQorCQlicmVhazsKKyAgICAgICAgfQorCUxFQVZFKCk7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBsaWJlcnRhc19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBsaWJlcnRhc19ldGh0b29sX2dldF9kcnZpbmZvLAorCS5nZXRfZWVwcm9tID0gIGxpYmVydGFzX2V0aHRvb2xfZ2V0X2VlcHJvbSwKKwkuZ2V0X2VlcHJvbV9sZW4gPSBsaWJlcnRhc19ldGh0b29sX2dldF9lZXByb21fbGVuLAorCS5nZXRfc3RhdHNfY291bnQgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdGF0cywKKwkuZ2V0X3N0cmluZ3MgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdHJpbmdzLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5NGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW5pdGlhbGl6YXRpb24gZm9yIEZXIGFuZCBIVworICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2JpLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmdy5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJpZl91c2IuaCIKKworY2hhciAqbGliZXJ0YXNfZndfbmFtZSA9IE5VTEw7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndfbmFtZSwgbGliZXJ0YXNfZndfbmFtZSwgY2hhcnAsIDA2NDQpOworCit1bnNpZ25lZCBpbnQgbGliZXJ0YXNfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGxpYmVydGFzX2RlYnVnLCBpbnQsIDApOworCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIEJvb3QyL0ZXIGltYWdlLgorICoKKyAqICBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgcG9pbnRlciB0byBpbWFnZQorICogICAgICAgICBsZW4gICAgICAgICAgICAgICBpbWFnZSBsZW5ndGgKKyAqICBAcmV0dXJuICAgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZndmaWxlX2Zvcm1hdCh1OCAqZGF0YSwgdTMyIHRvdGxlbikKK3sKKwl1OCAgYmluY21kLCBleGl0OworCXUzMiBibGtzaXplLCBvZmZzZXQsIGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gMTsKKwlleGl0ID0gbGVuID0gMDsKKworCWRvIHsKKwkJYmluY21kID0gKmRhdGE7CisJCWJsa3NpemUgPSAqKHUzMiopKGRhdGEgKyBvZmZzZXRvZihzdHJ1Y3QgZndoZWFkZXIsIGRhdGFsZW5ndGgpKTsKKwkJc3dpdGNoIChiaW5jbWQpIHsKKwkJY2FzZSBGV19IQVNfREFUQV9UT19SRUNWOgorCQkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBmd2hlYWRlcikgKyBibGtzaXplOworCQkJZGF0YSArPSBvZmZzZXQ7CisJCQlsZW4gKz0gb2Zmc2V0OworCQkJaWYgKGxlbiA+PSB0b3RsZW4pCisJCQkJZXhpdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBGV19IQVNfTEFTVF9CTE9DSzoKKwkJCWV4aXQgPSAxOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXhpdCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCFleGl0KTsKKworCWlmIChyZXQpCisJCWxic19wcl9lcnIoImJpbiBmaWxlIGZvcm1hdCBjaGVjayBGQUlMLi4uXG4iKTsKKwllbHNlCisJCWxic19wcl9kZWJ1ZygxLCAiYmluIGZpbGUgZm9ybWF0IGNoZWNrIFBBU1MuLi5cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZG93bmxvYWRzIGZpcm13YXJlIGltYWdlLCBnZXRzCisgKiAgSFcgc3BlYyBmcm9tIGZpcm13YXJlIGFuZCBzZXQgYmFzaWMgcGFyYW1ldGVycyB0bworICogIGZpcm13YXJlLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCB3bGFuX3NldHVwX3N0YXRpb25faHcod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnByaXYtPmZpcm13YXJlLCBsaWJlcnRhc19md19uYW1lLAorCQkJCSAgICBwcml2LT5ob3RwbHVnX2RldmljZSkpIDwgMCkgeworCQlsYnNfcHJfZXJyKCJyZXF1ZXN0X2Zpcm13YXJlKCkgZmFpbGVkLCBlcnJvciBjb2RlID0gJSN4XG4iLAorCQkgICAgICAgcmV0KTsKKwkJbGJzX3ByX2VycigiJXMgbm90IGZvdW5kIGluIC9saWIvZmlybXdhcmVcbiIsIGxpYmVydGFzX2Z3X25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYoY2hlY2tfZndmaWxlX2Zvcm1hdChwcml2LT5maXJtd2FyZS0+ZGF0YSwgcHJpdi0+ZmlybXdhcmUtPnNpemUpKSB7CisJCXJlbGVhc2VfZmlybXdhcmUocHJpdi0+ZmlybXdhcmUpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfc2JpX3Byb2dfZmlybXdhcmUocHJpdik7CisKKwlyZWxlYXNlX2Zpcm13YXJlKHByaXYtPmZpcm13YXJlKTsKKworCWlmIChyZXQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJCb290bG9hZGVyIGluIGludmFsaWQgc3RhdGUhXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFJlYWQgTUFDIGFkZHJlc3MgZnJvbSBIVworCSAqLworCW1lbXNldChhZGFwdGVyLT5jdXJyZW50X2FkZHIsIDB4ZmYsIEVUSF9BTEVOKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZ2V0X2h3X3NwZWMsCisJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHByaXYpOworCisJLyogR2V0IHRoZSBzdXBwb3J0ZWQgRGF0YSByYXRlcyAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2RhdGFfcmF0ZSwKKwkJCQkgICAgY21kX2FjdF9nZXRfdHhfcmF0ZSwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWlmIChyZXQpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSAwOworZG9uZToKKwlMRUFWRSgpOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW50IHdsYW5fYWxsb2NhdGVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXUzMiB1bGJ1ZnNpemU7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcHRlbXBzY2FudGFibGU7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgdG8gc3RvcmUgdGhlIEJTU0lEIGxpc3QgKi8KKwl1bGJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSAqIE1SVkRSVl9NQVhfQlNTSURfTElTVDsKKwlpZiAoIShwdGVtcHNjYW50YWJsZSA9IGttYWxsb2ModWxidWZzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJbGliZXJ0YXNfZnJlZV9hZGFwdGVyKHByaXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJYWRhcHRlci0+c2NhbnRhYmxlID0gcHRlbXBzY2FudGFibGU7CisJbWVtc2V0KGFkYXB0ZXItPnNjYW50YWJsZSwgMCwgdWxidWZzaXplKTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tYW5kIGJ1ZmZlcnMgKi8KKwlsaWJlcnRhc19hbGxvY2F0ZV9jbWRfYnVmZmVyKHByaXYpOworCisJbWVtc2V0KCZhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLCAwLCBzaXplb2Yoc3RydWN0IFBTX0NNRF9Db25maXJtU2xlZXApKTsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLnNlcW51bSA9IGNwdV90b19sZTE2KCsrYWRhcHRlci0+c2VxbnVtKTsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLmNvbW1hbmQgPQorCSAgICBjcHVfdG9fbGUxNihjbWRfODAyXzExX3BzX21vZGUpOworCWFkYXB0ZXItPmxpYmVydGFzX3BzX2NvbmZpcm1fc2xlZXAuc2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgUFNfQ01EX0NvbmZpcm1TbGVlcCkpOworCWFkYXB0ZXItPmxpYmVydGFzX3BzX2NvbmZpcm1fc2xlZXAucmVzdWx0ID0gMDsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLmFjdGlvbiA9CisJICAgIGNwdV90b19sZTE2KGNtZF9zdWJjbWRfc2xlZXBfY29uZmlybWVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bGFuX2luaXRfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGk7CisKKwlhZGFwdGVyLT5zY2FucHJvYmVzID0gMDsKKworCWFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID0gREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUjsKKwlhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPSBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUjsKKworCS8qIEFUSU0gcGFyYW1zICovCisJYWRhcHRlci0+YXRpbXdpbmRvdyA9IDA7CisKKwlhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9IGxpYmVydGFzX2Rpc2Nvbm5lY3RlZDsKKwltZW1zZXQoYWRhcHRlci0+Y3VycmVudF9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisKKwkvKiBzY2FuIHR5cGUgKi8KKwlhZGFwdGVyLT5zY2FudHlwZSA9IGNtZF9zY2FuX3R5cGVfYWN0aXZlOworCisJLyogc2NhbiBtb2RlICovCisJYWRhcHRlci0+c2Nhbm1vZGUgPSBjbWRfYnNzX3R5cGVfYW55OworCisJLyogODAyLjExIHNwZWNpZmljICovCisJYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPSB3bGFuODAyXzExV0VQZGlzYWJsZWQ7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGFwdGVyLT53ZXBfa2V5cykgLyBzaXplb2YoYWRhcHRlci0+d2VwX2tleXNbMF0pOworCSAgICAgaSsrKQorCQltZW1zZXQoJmFkYXB0ZXItPndlcF9rZXlzW2ldLCAwLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCWFkYXB0ZXItPndlcF90eF9rZXlpZHggPSAwOworCWFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCWFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gV0xBTl8xWF9BVVRIX0FMR19OT05FOworCWFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgPSBDSVBIRVJfTk9ORTsKKwlhZGFwdGVyLT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU7CisKKwlhZGFwdGVyLT5hc3NvY19yZXEgPSBOVUxMOworCisJYWRhcHRlci0+bnVtaW5zY2FudGFibGUgPSAwOworCWFkYXB0ZXItPnBhdHRlbXB0ZWRic3NkZXNjID0gTlVMTDsKKwltdXRleF9pbml0KCZhZGFwdGVyLT5sb2NrKTsKKworCWFkYXB0ZXItPnByZXNjYW4gPSAxOworCisJbWVtc2V0KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMsIDAsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMpKTsKKworCS8qIFBuUCBhbmQgcG93ZXIgcHJvZmlsZSAqLworCWFkYXB0ZXItPnN1cnByaXNlcmVtb3ZlZCA9IDA7CisKKwlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyID0KKwkgICAgY21kX2FjdF9tYWNfcnhfb24gfCBjbWRfYWN0X21hY190eF9vbjsKKworCWFkYXB0ZXItPnJhZGlvb24gPSBSQURJT19PTjsKKwlhZGFwdGVyLT50eGFudGVubmEgPSBSRl9BTlRFTk5BXzI7CisJYWRhcHRlci0+cnhhbnRlbm5hID0gUkZfQU5URU5OQV9BVVRPOworCisJYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0byA9IDE7CisJYWRhcHRlci0+YmVhY29ucGVyaW9kID0gTVJWRFJWX0JFQUNPTl9JTlRFUlZBTDsKKworCS8vIHNldCBkZWZhdWx0IHZhbHVlIG9mIGNhcGluZm8uCisjZGVmaW5lIFNIT1JUX1BSRUFNQkxFX0FMTE9XRUQJCTEKKwltZW1zZXQoJmFkYXB0ZXItPmNhcGluZm8sIDAsIHNpemVvZihhZGFwdGVyLT5jYXBpbmZvKSk7CisJYWRhcHRlci0+Y2FwaW5mby5zaG9ydHByZWFtYmxlID0gU0hPUlRfUFJFQU1CTEVfQUxMT1dFRDsKKworCWFkYXB0ZXItPmFkaG9jY2hhbm5lbCA9IERFRkFVTFRfQURfSE9DX0NIQU5ORUw7CisKKwlhZGFwdGVyLT5wc21vZGUgPSB3bGFuODAyXzExcG93ZXJtb2RlY2FtOworCWFkYXB0ZXItPm11bHRpcGxlZHRpbSA9IE1SVkRSVl9ERUZBVUxUX01VTFRJUExFX0RUSU07CisKKwlhZGFwdGVyLT5saXN0ZW5pbnRlcnZhbCA9IE1SVkRSVl9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKKworCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9GVUxMX1BPV0VSOworCWFkYXB0ZXItPm5lZWR0b3dha2V1cCA9IDA7CisJYWRhcHRlci0+bG9jYWxsaXN0ZW5pbnRlcnZhbCA9IDA7CS8qIGRlZmF1bHQgdmFsdWUgaW4gZmlybXdhcmUgd2lsbCBiZSB1c2VkICovCisKKwlhZGFwdGVyLT5kYXRhcmF0ZSA9IDA7CS8vIEluaXRpYWxseSBpbmRpY2F0ZSB0aGUgcmF0ZSBhcyBhdXRvCisKKwlhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkID0gMDsKKworCWFkYXB0ZXItPmludGNvdW50ZXIgPSAwOworCisJYWRhcHRlci0+Y3VycmVudHR4c2tiID0gTlVMTDsKKwlhZGFwdGVyLT5wa3R0eGN0cmwgPSAwOworCisJbWVtc2V0KCZhZGFwdGVyLT50eF9xdWV1ZV9wcywgMCwgTlJfVFhfUVVFVUUqc2l6ZW9mKHN0cnVjdCBza19idWZmKikpOworCWFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKTsKKworaW50IGxpYmVydGFzX2luaXRfZncod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwkvKiBBbGxvY2F0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLworCWlmICgocmV0ID0gd2xhbl9hbGxvY2F0ZV9hZGFwdGVyKHByaXYpKSAhPSAwKQorCQlnb3RvIGRvbmU7CisKKwkvKiBpbml0IGFkYXB0ZXIgc3RydWN0dXJlICovCisJd2xhbl9pbml0X2FkYXB0ZXIocHJpdik7CisKKwkvKiBpbml0IHRpbWVyIGV0Yy4gKi8KKwlzZXR1cF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lciwgY29tbWFuZF90aW1lcl9mbiwKKwkJCSh1bnNpZ25lZCBsb25nKXByaXYpOworCisJLyogZG93bmxvYWQgZmltcndhcmUgZXRjLiAqLworCWlmICgocmV0ID0gd2xhbl9zZXR1cF9zdGF0aW9uX2h3KHByaXYpKSAhPSAwKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5jb21tYW5kX3RpbWVyKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIGluaXQgODAyLjExZCAqLworCWxpYmVydGFzX2luaXRfMTFkKHByaXYpOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGxpYmVydGFzX2ZyZWVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJXaHkgZG91YmxlIGZyZWUgYWRhcHRlcj86KVxuIik7CisJCXJldHVybjsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIkZyZWUgY29tbWFuZCBidWZmZXJcbiIpOworCWxpYmVydGFzX2ZyZWVfY21kX2J1ZmZlcihwcml2KTsKKworCWxic19wcl9kZWJ1ZygxLCAiRnJlZSBjb21tYW5kVGltZXJcbiIpOworCWRlbF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lcik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZyZWUgc2NhbnRhYmxlXG4iKTsKKwlpZiAoYWRhcHRlci0+c2NhbnRhYmxlKSB7CisJCWtmcmVlKGFkYXB0ZXItPnNjYW50YWJsZSk7CisJCWFkYXB0ZXItPnNjYW50YWJsZSA9IE5VTEw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJGcmVlIGFkYXB0ZXJcbiIpOworCisJLyogRnJlZSB0aGUgYWRhcHRlciBvYmplY3QgaXRzZWxmICovCisJa2ZyZWUoYWRhcHRlcik7CisJcHJpdi0+YWRhcHRlciA9IE5VTEw7Cit9CisKKy8qKgorICogIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdGltZW91dCBvZiBjb21tYW5kIHNlbmRpbmcuCisgKiAgSXQgd2lsbCByZS1zZW5kIHRoZSBzYW1lIGNvbW1hbmQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGNvbW1hbmRfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKilkYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHRlbXBub2RlID0gYWRhcHRlci0+Y3VyX2NtZDsKKwljbWQgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopcHRlbXBub2RlLT5idWZ2aXJ0dWFsYWRkcjsKKworCWxic19wcl9pbmZvKCJjb21tYW5kX3RpbWVyX2ZuIGZpcmVkICgleClcbiIsIGNtZC0+Y29tbWFuZCk7CisKKwlpZiAoIWFkYXB0ZXItPmZ3X3JlYWR5KQorCQlyZXR1cm47CisKKwlpZiAocHRlbXBub2RlID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQVGVtcG5vZGUgRW1wdHlcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWxic19wcl9kZWJ1ZygxLCAiUmUtc2VuZGluZyBzYW1lIGNvbW1hbmQgYXMgaXQgdGltZW91dC4uLiFcbiIpOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwdGVtcG5vZGUsIDApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOWFlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qKgorICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgRlcgaW50ZXJmYWNlIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCisgICovCisjaWZuZGVmIF9XTEFOX0ZXX0hfCisjZGVmaW5lIF9XTEFOX0ZXX0hfCisKKyNpZm5kZWYgREVWX05BTUVfTEVOCisjZGVmaW5lIERFVl9OQU1FX0xFTiAgICAgICAgICAgIDMyCisjZW5kaWYKKworaW50IGxpYmVydGFzX2luaXRfZncod2xhbl9wcml2YXRlICogcHJpdik7CisKKyNlbmRpZgkJCQkvKiBfV0xBTl9GV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmgKQEAgLTAsMCArMSwzMzggQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBXTEFOIGNvbW1hbmRzLgorICAqLworCisjaWZuZGVmIF9IT1NUX0hfCisjZGVmaW5lIF9IT1NUX0hfCisKKy8qKiBQVUJMSUMgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgREVGQVVMVF9BRF9IT0NfQ0hBTk5FTCAgICAgICA2CisjZGVmaW5lIERFRkFVTFRfQURfSE9DX0NIQU5ORUxfQSAgICAzNgorCisvKiogSUVFRSA4MDIuMTEgb2lkcyAqLworI2RlZmluZSBPSURfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDIKKyNkZWZpbmUgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICAgICAgICAweDAwMDA4MDA4CisjZGVmaW5lIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgMHgwMDAwODAwOQorI2RlZmluZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgIDB4MDAwMDgwMEEKKyNkZWZpbmUgT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVEICAgICAgICAweDAwMDA4MDBECisjZGVmaW5lIE9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTICAgICAgICAgICAgMHgwMDAwODAwRQorI2RlZmluZSBPSURfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgIDB4MDAwMDgwMTIKKyNkZWZpbmUgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5UICAgICAgICAgICAgICAweDAwMDA4MDFECisjZGVmaW5lIE9JRF84MDJfMTFEX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAyMAorCisjZGVmaW5lIGNtZF9vcHRpb25fd2FpdGZvcnJzcCAgICAgICAgICAgICAweDAwMDIKKworLyoqIEhvc3QgY29tbWFuZCBJRCAqLworI2RlZmluZSBjbWRfY29kZV9kbmxkICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2dldF9od19zcGVjICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIGNtZF9lZXByb21fdXBkYXRlICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfODAyXzExX3Jlc2V0ICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgY21kXzgwMl8xMV9zY2FuICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIGNtZF84MDJfMTFfZ2V0X2xvZyAgICAgICAgICAgIDB4MDAwYgorI2RlZmluZSBjbWRfbWFjX211bHRpY2FzdF9hZHIgICAgICAgICAweDAwMTAKKyNkZWZpbmUgY21kXzgwMl8xMV9hdXRoZW50aWNhdGUgICAgICAgMHgwMDExCisjZGVmaW5lIGNtZF84MDJfMTFfZWVwcm9tX2FjY2VzcyAgICAgIDB4MDA1OQorI2RlZmluZSBjbWRfODAyXzExX2Fzc29jaWF0ZSAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgY21kXzgwMl8xMV9zZXRfd2VwICAgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIGNtZF84MDJfMTFfZ2V0X3N0YXQgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBjbWRfODAyXzNfZ2V0X3N0YXQgICAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgY21kXzgwMl8xMV9zbm1wX21pYiAgICAgICAgICAgMHgwMDE2CisjZGVmaW5lIGNtZF9tYWNfcmVnX21hcCAgICAgICAgICAgICAgIDB4MDAxNworI2RlZmluZSBjbWRfYmJwX3JlZ19tYXAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgY21kX21hY19yZWdfYWNjZXNzICAgICAgICAgICAgMHgwMDE5CisjZGVmaW5lIGNtZF9iYnBfcmVnX2FjY2VzcyAgICAgICAgICAgIDB4MDAxYQorI2RlZmluZSBjbWRfcmZfcmVnX2FjY2VzcyAgICAgICAgICAgICAweDAwMWIKKyNkZWZpbmUgY21kXzgwMl8xMV9yYWRpb19jb250cm9sICAgICAgMHgwMDFjCisjZGVmaW5lIGNtZF84MDJfMTFfcmZfY2hhbm5lbCAgICAgICAgIDB4MDAxZAorI2RlZmluZSBjbWRfODAyXzExX3JmX3R4X3Bvd2VyICAgICAgICAweDAwMWUKKyNkZWZpbmUgY21kXzgwMl8xMV9yc3NpICAgICAgICAgICAgICAgMHgwMDFmCisjZGVmaW5lIGNtZF84MDJfMTFfcmZfYW50ZW5uYSAgICAgICAgIDB4MDAyMAorCisjZGVmaW5lIGNtZF84MDJfMTFfcHNfbW9kZQkgICAgICAweDAwMjEKKworI2RlZmluZSBjbWRfODAyXzExX2RhdGFfcmF0ZSAgICAgICAgICAweDAwMjIKKyNkZWZpbmUgY21kX3JmX3JlZ19tYXAgICAgICAgICAgICAgICAgMHgwMDIzCisjZGVmaW5lIGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUgICAgIDB4MDAyNAorI2RlZmluZSBjbWRfODAyXzExX3JlYXNzb2NpYXRlICAgICAgICAweDAwMjUKKyNkZWZpbmUgY21kXzgwMl8xMV9kaXNhc3NvY2lhdGUgICAgICAgMHgwMDI2CisjZGVmaW5lIGNtZF9tYWNfY29udHJvbCAgICAgICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBjbWRfODAyXzExX2FkX2hvY19zdGFydCAgICAgICAweDAwMmIKKyNkZWZpbmUgY21kXzgwMl8xMV9hZF9ob2Nfam9pbiAgICAgICAgMHgwMDJjCisKKyNkZWZpbmUgY21kXzgwMl8xMV9xdWVyeV90a2lwX3JlcGx5X2NudHJzICAweDAwMmUKKyNkZWZpbmUgY21kXzgwMl8xMV9lbmFibGVfcnNuICAgICAgICAgICAgICAweDAwMmYKKyNkZWZpbmUgY21kXzgwMl8xMV9wYWlyd2lzZV90c2MgICAgICAgMHgwMDM2CisjZGVmaW5lIGNtZF84MDJfMTFfZ3JvdXBfdHNjICAgICAgICAgIDB4MDAzNworI2RlZmluZSBjbWRfODAyXzExX2tleV9tYXRlcmlhbCAgICAgICAweDAwNWUKKworI2RlZmluZSBjbWRfODAyXzExX3NldF9hZmMgICAgICAgICAgICAweDAwM2MKKyNkZWZpbmUgY21kXzgwMl8xMV9nZXRfYWZjICAgICAgICAgICAgMHgwMDNkCisKKyNkZWZpbmUgY21kXzgwMl8xMV9hZF9ob2Nfc3RvcCAgICAgICAgMHgwMDQwCisKKyNkZWZpbmUgY21kXzgwMl8xMV9iZWFjb25fc3RvcCAgICAgICAgMHgwMDQ5CisKKyNkZWZpbmUgY21kXzgwMl8xMV9tYWNfYWRkcmVzcyAgICAgICAgMHgwMDRECisjZGVmaW5lIGNtZF84MDJfMTFfZWVwcm9tX2FjY2VzcyAgICAgIDB4MDA1OQorCisjZGVmaW5lIGNtZF84MDJfMTFfYmFuZF9jb25maWcgICAgICAgIDB4MDA1OAorCisjZGVmaW5lIGNtZF84MDJfMTFkX2RvbWFpbl9pbmZvICAgICAgIDB4MDA1YgorCisjZGVmaW5lIGNtZF84MDJfMTFfc2xlZXBfcGFyYW1zICAgICAgICAgIDB4MDA2NgorCisjZGVmaW5lIGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0ICAgIDB4MDA2NworCisjZGVmaW5lIGNtZF84MDJfMTFfdHBjX2NmZyAgICAgICAgICAgICAgIDB4MDA3MgorI2RlZmluZSBjbWRfODAyXzExX3B3cl9jZmcgICAgICAgICAgICAgICAweDAwNzMKKworI2RlZmluZSBjbWRfODAyXzExX2xlZF9ncGlvX2N0cmwgICAgICAgICAweDAwNGUKKworI2RlZmluZSBjbWRfODAyXzExX3N1YnNjcmliZV9ldmVudCAgICAgICAweDAwNzUKKworI2RlZmluZSBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCAgICAweDAwNzYKKworI2RlZmluZSBjbWRfODAyXzExX3R4X3JhdGVfcXVlcnkJMHgwMDdmCisKKyNkZWZpbmUgY21kX2dldF90c2YgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgY21kX2J0X2FjY2VzcyAgICAgICAgICAgICAgICAgMHgwMDg3CisjZGVmaW5lIGNtZF9yZXRfYnRfYWNjZXNzICAgICAgICAgICAgICAgICAweDgwODcKKworI2RlZmluZSBjbWRfZnd0X2FjY2VzcyAgICAgICAgICAgICAgICAweDAwODgKKyNkZWZpbmUgY21kX3JldF9md3RfYWNjZXNzICAgICAgICAgICAgICAgIDB4ODA4OAorCisjZGVmaW5lIGNtZF9tZXNoX2FjY2VzcyAgICAgICAgICAgICAgIDB4MDA5MAorI2RlZmluZSBjbWRfcmV0X21lc2hfYWNjZXNzICAgICAgICAgICAgICAgMHg4MDkwCisKKy8qIEZvciB0aGUgSUVFRSBQb3dlciBTYXZlICovCisjZGVmaW5lIGNtZF9zdWJjbWRfZW50ZXJfcHMgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgY21kX3N1YmNtZF9leGl0X3BzICAgICAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBjbWRfc3ViY21kX3NsZWVwX2NvbmZpcm1lZCAgICAgICAgMHgwMDM0CisjZGVmaW5lIGNtZF9zdWJjbWRfZnVsbF9wb3dlcmRvd24gICAgICAgICAweDAwMzUKKyNkZWZpbmUgY21kX3N1YmNtZF9mdWxsX3Bvd2VydXAgICAgICAgICAgIDB4MDAzNgorCisvKiBjb21tYW5kIFJFVCBjb2RlLCBNU0IgaXMgc2V0IHRvIDEgKi8KKyNkZWZpbmUgY21kX3JldF9od19zcGVjX2luZm8gICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBjbWRfcmV0X2VlcHJvbV91cGRhdGUgICAgICAgICAgICAgMHg4MDA0CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3Jlc2V0ICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2NhbiAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9nZXRfbG9nICAgICAgICAgICAgMHg4MDBiCisjZGVmaW5lIGNtZF9yZXRfbWFjX2NvbnRyb2wgICAgICAgICAgICAgICAweDgwMjgKKyNkZWZpbmUgY21kX3JldF9tYWNfbXVsdGljYXN0X2FkciAgICAgICAgIDB4ODAxMAorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9hdXRoZW50aWNhdGUgICAgICAgMHg4MDExCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2RlYXV0aGVudGljYXRlICAgICAweDgwMjQKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYXNzb2NpYXRlICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yZWFzc29jaWF0ZSAgICAgICAgMHg4MDI1CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2Rpc2Fzc29jaWF0ZSAgICAgICAweDgwMjYKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2V0X3dlcCAgICAgICAgICAgIDB4ODAxMworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9zdGF0ICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIGNtZF9yZXRfODAyXzNfc3RhdCAgICAgICAgICAgICAgICAweDgwMTUKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc25tcF9taWIgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBjbWRfcmV0X21hY19yZWdfbWFwICAgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIGNtZF9yZXRfYmJwX3JlZ19tYXAgICAgICAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgY21kX3JldF9yZl9yZWdfbWFwICAgICAgICAgICAgICAgIDB4ODAyMworI2RlZmluZSBjbWRfcmV0X21hY19yZWdfYWNjZXNzICAgICAgICAgICAgMHg4MDE5CisjZGVmaW5lIGNtZF9yZXRfYmJwX3JlZ19hY2Nlc3MgICAgICAgICAgICAweDgwMWEKKyNkZWZpbmUgY21kX3JldF9yZl9yZWdfYWNjZXNzICAgICAgICAgICAgIDB4ODAxYgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yYWRpb19jb250cm9sICAgICAgMHg4MDFjCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JmX2NoYW5uZWwgICAgICAgICAweDgwMWQKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcnNzaSAgICAgICAgICAgICAgIDB4ODAxZgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yZl90eF9wb3dlciAgICAgICAgMHg4MDFlCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JmX2FudGVubmEgICAgICAgICAweDgwMjAKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcHNfbW9kZSAgICAgICAgICAgIDB4ODAyMQorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9kYXRhX3JhdGUgICAgICAgICAgMHg4MDIyCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYWRfaG9jX3N0YXJ0ICAgICAgIDB4ODAyQgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfam9pbiAgICAgICAgMHg4MDJDCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcXVlcnlfdGtpcF9yZXBseV9jbnRycyAgMHg4MDJlCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2VuYWJsZV9yc24gICAgICAgICAgICAgIDB4ODAyZgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9wYWlyd2lzZV90c2MgICAgICAgMHg4MDM2CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2dyb3VwX3RzYyAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfa2V5X21hdGVyaWFsICAgICAgIDB4ODA1ZQorCisjZGVmaW5lIGNtZF9lbmFibGVfcnNuICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2Rpc2FibGVfcnNuICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIGNtZF9hY3Rfc2V0ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2FjdF9nZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIGNtZF9hY3RfZ2V0X0FFUyAgICAgICAgICAgICAgICAgICAoY21kX2FjdF9nZXQgKyAyKQorI2RlZmluZSBjbWRfYWN0X3NldF9BRVMgICAgICAgICAgICAgICAgICAgKGNtZF9hY3Rfc2V0ICsgMikKKyNkZWZpbmUgY21kX2FjdF9yZW1vdmVfYWVzICAgICAgICAgICAgICAgIChjbWRfYWN0X3NldCArIDMpCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2V0X2FmYyAgICAgICAgICAgIDB4ODAzYworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9nZXRfYWZjICAgICAgICAgICAgMHg4MDNkCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYWRfaG9jX3N0b3AgICAgICAgIDB4ODA0MAorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2JlYWNvbl9zdG9wICAgICAgICAweDgwNDkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9tYWNfYWRkcmVzcyAgICAgICAgMHg4MDRECisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2VlcHJvbV9hY2Nlc3MgICAgICAweDgwNTkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9iYW5kX2NvbmZpZyAgICAgICAgMHg4MDU4CisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2xlZXBfcGFyYW1zICAgICAgICAgIDB4ODA2NgorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2luYWN0aXZpdHlfdGltZW91dCAgICAweDgwNjcKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8gICAgICAoMHg4MDAwIHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kXzgwMl8xMWRfZG9tYWluX2luZm8pCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfdHBjX2NmZyAgICAgICAgKGNtZF84MDJfMTFfdHBjX2NmZyB8IDB4ODAwMCkKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcHdyX2NmZyAgICAgICAgKGNtZF84MDJfMTFfcHdyX2NmZyB8IDB4ODAwMCkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9sZWRfZ3Bpb19jdHJsICAgICAweDgwNGUKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQJKGNtZF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50IHwgMHg4MDAwKQorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldAkoY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQgfCAweDgwMDApCisKKyNkZWZpbmUgY21kX3J0ZV84MDJfMTFfdHhfcmF0ZV9xdWVyeSAJKGNtZF84MDJfMTFfdHhfcmF0ZV9xdWVyeSB8IDB4ODAwMCkKKworI2RlZmluZSBjbWRfcmV0X2dldF90c2YgICAgICAgICAgICAgMHg4MDgwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3NldF93ZXAgKi8KKyNkZWZpbmUgY21kX2FjdF9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIGNtZF9hY3RfcmVtb3ZlICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfYWN0X3VzZV9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDgKKworI2RlZmluZSBjbWRfdHlwZV93ZXBfNDBfYml0ICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX3R5cGVfd2VwXzEwNF9iaXQgICAgICAgICAgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgY21kX05VTV9PRl9XRVBfS0VZUyAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIGNtZF9XRVBfS0VZX0lOREVYX01BU0sgICAgICAgICAgICAgIDB4M2ZmZgorCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kXzgwMl8xMV9yZXNldCAqLworI2RlZmluZSBjbWRfYWN0X2hhbHQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKworLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIGNtZF84MDJfMTFfc2NhbiAqLworI2RlZmluZSBjbWRfYnNzX3R5cGVfYnNzICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2Jzc190eXBlX2lic3MgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIGNtZF9ic3NfdHlwZV9hbnkgICAgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kXzgwMl8xMV9zY2FuICovCisjZGVmaW5lIGNtZF9zY2FuX3R5cGVfYWN0aXZlICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBjbWRfc2Nhbl90eXBlX3Bhc3NpdmUgICAgICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBjbWRfc2Nhbl9yYWRpb190eXBlX2JnCQkwCisKKyNkZWZpbmUgY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSAgICAgICAgICAgMAorCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kX21hY19jb250cm9sICovCisjZGVmaW5lIGNtZF9hY3RfbWFjX3J4X29uICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfYWN0X21hY190eF9vbiAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2FjdF9tYWNfbG9vcGJhY2tfb24gICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIGNtZF9hY3RfbWFjX3dlcF9lbmFibGUgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBjbWRfYWN0X21hY19pbnRfZW5hYmxlICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgY21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZSAgICAgICAgMHgwMDIwCisjZGVmaW5lIGNtZF9hY3RfbWFjX2Jyb2FkY2FzdF9lbmFibGUgICAgICAgIDB4MDA0MAorI2RlZmluZSBjbWRfYWN0X21hY19wcm9taXNjdW91c19lbmFibGUgICAgICAweDAwODAKKyNkZWZpbmUgY21kX2FjdF9tYWNfYWxsX211bHRpY2FzdF9lbmFibGUgICAgMHgwMTAwCisjZGVmaW5lIGNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZSAgMHgwNDAwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wgKi8KKyNkZWZpbmUgY21kX3R5cGVfYXV0b19wcmVhbWJsZSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIGNtZF90eXBlX3Nob3J0X3ByZWFtYmxlICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBjbWRfdHlwZV9sb25nX3ByZWFtYmxlICAgICAgICAgICAgICAweDAwMDMKKworI2RlZmluZSBUVVJOX09OX1JGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSQURJT19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSQURJT19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFNFVF9BVVRPX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFNFVF9TSE9SVF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFNFVF9MT05HX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAweDAxCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JGX0NIQU5ORUwgKi8KKyNkZWZpbmUgY21kX29wdF84MDJfMTFfcmZfY2hhbm5lbF9nZXQgICAgICAgMHgwMAorI2RlZmluZSBjbWRfb3B0XzgwMl8xMV9yZl9jaGFubmVsX3NldCAgICAgICAweDAxCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3JmX3R4X3Bvd2VyICovCisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfb3B0X2dldCAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBjbWRfYWN0X3R4X3Bvd2VyX29wdF9zZXRfaGlnaCAgICAgICAweDgwMDcKKyNkZWZpbmUgY21kX2FjdF90eF9wb3dlcl9vcHRfc2V0X21pZCAgICAgICAgMHg4MDA0CisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9sb3cgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfaW5kZXhfaGlnaCAgICAgICAgIDB4MDAwNworI2RlZmluZSBjbWRfYWN0X3R4X3Bvd2VyX2luZGV4X21pZCAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgY21kX2FjdF90eF9wb3dlcl9pbmRleF9sb3cgICAgICAgICAgMHgwMDAwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX2RhdGFfcmF0ZSAqLworI2RlZmluZSBjbWRfYWN0X3NldF90eF9hdXRvICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgY21kX2FjdF9zZXRfdHhfZml4X3JhdGUgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIGNtZF9hY3RfZ2V0X3R4X3JhdGUgICAgICAgICAgICAgICAgIDB4MDAwMgorCisjZGVmaW5lIGNtZF9hY3Rfc2V0X3J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfYWN0X3NldF90eCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2FjdF9zZXRfYm90aCAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIGNtZF9hY3RfZ2V0X3J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfYWN0X2dldF90eCAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgY21kX2FjdF9nZXRfYm90aCAgICAgICAgICAgICAgICAgICAgMHgwMDBjCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3BzX21vZGUgKi8KKyNkZWZpbmUgY21kX3R5cGVfY2FtICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIGNtZF90eXBlX21heF9wc3AgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfdHlwZV9mYXN0X3BzcCAgICAgICAgICAgICAgICAgICAweDAwMDIKKworLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIGNtZF9idF9hY2Nlc3MgKi8KK2VudW0gY21kX2J0X2FjY2Vzc19vcHRzIHsKKwkvKiBUaGUgYnQgY29tbWFuZHMgc3RhcnQgYXQgNSBpbnN0ZWFkIG9mIDEgYmVjYXVzZSB0aGUgb2xkIGRmdCBjb21tYW5kcworCSAqIGFyZSBtYXBwZWQgdG8gMS00LiAgVGhlc2Ugb2xkIGNvbW1hbmRzIGFyZSBubyBsb25nZXIgbWFpbnRhaW5lZCBhbmQKKwkgKiBzaG91bGQgbm90IGJlIGNhbGxlZC4KKwkgKi8KKwljbWRfYWN0X2J0X2FjY2Vzc19hZGQgPSA1LAorCWNtZF9hY3RfYnRfYWNjZXNzX2RlbCwKKwljbWRfYWN0X2J0X2FjY2Vzc19saXN0LAorCWNtZF9hY3RfYnRfYWNjZXNzX3Jlc2V0Cit9OworCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kX2Z3dF9hY2Nlc3MgKi8KK2VudW0gY21kX2Z3dF9hY2Nlc3Nfb3B0cyB7CisJY21kX2FjdF9md3RfYWNjZXNzX2FkZCA9IDEsCisJY21kX2FjdF9md3RfYWNjZXNzX2RlbCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfbG9va3VwLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0LAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0X3JvdXRlLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0X25laWdoYm9yLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19yZXNldCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfY2xlYW51cCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfdGltZSwKK307CisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfbWVzaF9hY2Nlc3MgKi8KK2VudW0gY21kX21lc2hfYWNjZXNzX29wdHMgeworCWNtZF9hY3RfbWVzaF9nZXRfdHRsID0gMSwKKwljbWRfYWN0X21lc2hfc2V0X3R0bCwKKwljbWRfYWN0X21lc2hfZ2V0X3N0YXRzLAorCWNtZF9hY3RfbWVzaF9nZXRfbXBwLAorCWNtZF9hY3RfbWVzaF9zZXRfbXBwLAorfTsKKworLyoqIENhcmQgRXZlbnQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfVFhfUFBBX0ZSRUUgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfVFhfRE1BX0RPTkUgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19MT1NFX1dfU0NBTiAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19MT1NFX05PX1NDQU4gICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19TRU5TRUQgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfQ01EX0ZJTklTSEVEICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlCX0NIQU5HRUQgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfSU5JVF9ET05FICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfREVBVVRIRU5USUNBVEVEICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfRElTQVNTT0NJQVRFRCAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUFNfQVdBS0UgICAgICAgICAgICAgICAgMHgwMDAwMDAwYQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUFNfU0xFRVAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9NVUxUSUNBU1QgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9VTklDQVNUICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfV01fQVdBS0UgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfQURIT0NfQkNOX0xPU1QgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUlNTSV9MT1cJCTB4MDAwMDAwMTkKKyNkZWZpbmUgTUFDUkVHX0lOVF9DT0RFX1NOUl9MT1cJCQkweDAwMDAwMDFhCisjZGVmaW5lIE1BQ1JFR19JTlRfQ09ERV9NQVhfRkFJTAkJMHgwMDAwMDAxYgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUlNTSV9ISUdICQkweDAwMDAwMDFjCisjZGVmaW5lIE1BQ1JFR19JTlRfQ09ERV9TTlJfSElHSAkJMHgwMDAwMDAxZAorCisjZW5kaWYJCQkJLyogX0hPU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3RjbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3RjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM5ZTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdGNtZC5oCkBAIC0wLDAgKzEsNjkzIEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzLCBkYXRhIHN0cnVjdHVyZQorICogYW5kIGRlZmluZXMgZm9yIGFsbCB0aGUgaG9zdC9zdGF0aW9uIGNvbW1hbmRzCisgKi8KKyNpZm5kZWYgX19IT1NUQ01EX19ICisjZGVmaW5lIF9fSE9TVENNRF9fSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICIxMWQuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKiA4MDIuMTEtcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisvKiBUeFBEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB0eHBkIHsKKwkvKiBDdXJyZW50IFR4IHBhY2tldCBzdGF0dXMgKi8KKwl1MzIgdHhfc3RhdHVzOworCS8qIFR4IGNvbnRyb2wgKi8KKwl1MzIgdHhfY29udHJvbDsKKwl1MzIgdHhfcGFja2V0X2xvY2F0aW9uOworCS8qIFR4IHBhY2tldCBsZW5ndGggKi8KKwl1MTYgdHhfcGFja2V0X2xlbmd0aDsKKwkvKiBGaXJzdCAyIGJ5dGUgb2YgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKwl1OCB0eF9kZXN0X2FkZHJfaGlnaFsyXTsKKwkvKiBMYXN0IDQgYnl0ZSBvZiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IHR4X2Rlc3RfYWRkcl9sb3dbNF07CisJLyogUGt0IFByaW9yaXR5ICovCisJdTggcHJpb3JpdHk7CisJLyogUGt0IFRyYXNuaXQgUG93ZXIgY29udHJvbCAqLworCXU4IHBvd2VybWdtdDsKKwkvKiBBbW91bnQgb2YgdGltZSB0aGUgcGFja2V0IGhhcyBiZWVuIHF1ZXVlZCBpbiB0aGUgZHJpdmVyICh1bml0cyA9IDJtcykgKi8KKwl1OCBwa3RkZWxheV8ybXM7CisJLyogcmVzZXJ2ZWQgKi8KKwl1OCByZXNlcnZlZDE7Cit9OworCisvKiBSeFBEIERlc2NyaXB0b3IgKi8KK3N0cnVjdCByeHBkIHsKKwkvKiBDdXJyZW50IFJ4IHBhY2tldCBzdGF0dXMgKi8KKwl1MTYgc3RhdHVzOworCisJLyogU05SICovCisJdTggc25yOworCisJLyogVHggY29udHJvbCAqLworCXU4IHJ4X2NvbnRyb2w7CisKKwkvKiBQa3QgbGVuZ3RoICovCisJdTE2IHBrdF9sZW47CisKKwkvKiBOb2lzZSBGbG9vciAqLworCXU4IG5mOworCisJLyogUnggUGFja2V0IFJhdGUgKi8KKwl1OCByeF9yYXRlOworCisJLyogUGt0IGFkZHIgKi8KKwl1MzIgcGt0X3B0cjsKKworCS8qIE5leHQgUnggUnhQRCBhZGRyICovCisJdTMyIG5leHRfcnhwZF9wdHI7CisKKwkvKiBQa3QgUHJpb3JpdHkgKi8KKwl1OCBwcmlvcml0eTsKKwl1OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBjbWRfY3RybF9ub2RlIHsKKwkvKiBDTUQgbGluayBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBzdGF0dXM7CisJLyogQ01EIElEICovCisJdTMyIGNtZF9vaWQ7CisJLypDTUQgd2FpdCBvcHRpb246IHdhaXQgZm9yIGZpbmlzaCBvciBubyB3YWl0ICovCisJdTE2IHdhaXRfb3B0aW9uOworCS8qIGNvbW1hbmQgcGFyYW1ldGVyICovCisJdm9pZCAqcGRhdGFfYnVmOworCS8qY29tbWFuZCBkYXRhICovCisJdTggKmJ1ZnZpcnR1YWxhZGRyOworCXUxNiBjbWRmbGFnczsKKwkvKiB3YWl0IHF1ZXVlICovCisJdTE2IGNtZHdhaXRxd29rZW47CisJd2FpdF9xdWV1ZV9oZWFkX3QgY21kd2FpdF9xOworfTsKKworLyogV0xBTl84MDJfMTFfS0VZCisgKgorICogR2VuZXJpYyBzdHJ1Y3R1cmUgdG8gaG9sZCBhbGwga2V5IHR5cGVzLiAga2V5IHR5cGUgKFdFUDQwLCBXRVAxMDQsIFRLSVAsIEFFUykKKyAqIGlzIGRldGVybWluZWQgZnJvbSB0aGUga2V5bGVuZ3RoIGZpZWxkLgorICovCitzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHsKKwl1MzIgbGVuOworCXUzMiBmbGFnczsgIC8qIEtFWV9JTkZPXyogZnJvbSB3bGFuX2RlZnMuaCAqLworCXU4IGtleVtNUlZMX01BWF9LRVlfV1BBX0tFWV9MRU5HVEhdOworCXUxNiB0eXBlOyAvKiBLRVlfVFlQRV8qIGZyb20gd2xhbl9kZWZzLmggKi8KK307CisKK3N0cnVjdCBJRV9XUEEgeworCXU4IGVsZW1lbnRpZDsKKwl1OCBsZW47CisJdTggb3VpWzRdOworCXUxNiB2ZXJzaW9uOworfTsKKworc3RydWN0IFdMQU5fODAyXzExX1NTSUQgeworCS8qIFNTSUQgbGVuZ3RoICovCisJdTMyIHNzaWRsZW5ndGg7CisKKwkvKiBTU0lEIGluZm9ybWF0aW9uIGZpZWxkICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRV07Cit9OworCitzdHJ1Y3QgV1BBX1NVUFBMSUNBTlQgeworCXU4IHdwYV9pZVsyNTZdOworCXU4IHdwYV9pZV9sZW47Cit9OworCisvKiB3bGFuX29mZnNldF92YWx1ZSAqLworc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIHsKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKK307CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9GSVhFRF9JRXMgeworCXU4IHRpbWVzdGFtcFs4XTsKKwl1MTYgYmVhY29uaW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdGllczsKK307CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9WQVJJQUJMRV9JRXMgeworCXU4IGVsZW1lbnRpZDsKKwl1OCBsZW5ndGg7CisJdTggZGF0YVsxXTsKK307CisKKy8qIERlZmluZSBnZW5lcmFsIGRhdGEgc3RydWN0dXJlICovCisvKiBjbWRfRFNfR0VOICovCitzdHJ1Y3QgY21kX2RzX2dlbiB7CisJdTE2IGNvbW1hbmQ7CisJdTE2IHNpemU7CisJdTE2IHNlcW51bTsKKwl1MTYgcmVzdWx0OworfTsKKworI2RlZmluZSBTX0RTX0dFTiBzaXplb2Yoc3RydWN0IGNtZF9kc19nZW4pCisvKgorICogRGVmaW5lIGRhdGEgc3RydWN0dXJlIGZvciBjbWRfZ2V0X2h3X3NwZWMKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHJlc3BvbnNlIGZvciB0aGUgR0VUX0hXX1NQRUMgY29tbWFuZAorICovCitzdHJ1Y3QgY21kX2RzX2dldF9od19zcGVjIHsKKwkvKiBIVyBJbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIgKi8KKwl1MTYgaHdpZnZlcnNpb247CisJLyogSFcgdmVyc2lvbiBudW1iZXIgKi8KKwl1MTYgdmVyc2lvbjsKKwkvKiBNYXggbnVtYmVyIG9mIFR4UEQgRlcgY2FuIGhhbmRsZSAqLworCXUxNiBucl90eHBkOworCS8qIE1heCBubyBvZiBNdWx0aWNhc3QgYWRkcmVzcyAqLworCXUxNiBucl9tY2FzdF9hZHI7CisJLyogTUFDIGFkZHJlc3MgKi8KKwl1OCBwZXJtYW5lbnRhZGRyWzZdOworCisJLyogcmVnaW9uIENvZGUgKi8KKwl1MTYgcmVnaW9uY29kZTsKKworCS8qIE51bWJlciBvZiBhbnRlbm5hIHVzZWQgKi8KKwl1MTYgbnJfYW50ZW5uYTsKKworCS8qIEZXIHJlbGVhc2UgbnVtYmVyLCBleGFtcGxlIDB4MTIzND0xLjIuMy40ICovCisJdTMyIGZ3cmVsZWFzZW51bWJlcjsKKworCS8qIEJhc2UgQWRkcmVzcyBvZiBUeFBEIHF1ZXVlICovCisJdTMyIHdjYl9iYXNlOworCS8qIFJlYWQgUG9pbnRlciBvZiBSeFBkIHF1ZXVlICovCisJdTMyIHJ4cGRfcmRwdHI7CisKKwkvKiBXcml0ZSBQb2ludGVyIG9mIFJ4UGQgcXVldWUgKi8KKwl1MzIgcnhwZF93cnB0cjsKKworCS8qRlcvSFcgY2FwYWJpbGl0eSAqLworCXUzMiBmd2NhcGluZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQgeworCXUxNiBhY3Rpb247Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgeworCXUxNiBhY3Rpb247CisJdTE2IGV2ZW50czsKK307CisKKy8qCisgKiBUaGlzIHNjYW4gaGFuZGxlIENvdW50cnkgSW5mb3JtYXRpb24gSUUoODAyLjExZCBjb21wbGlhbnQpCisgKiBEZWZpbmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNtZF84MDJfMTFfc2NhbgorICovCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuIHsKKwl1OCBic3N0eXBlOworCXU4IEJTU0lEW0VUSF9BTEVOXTsKKwl1OCB0bHZidWZmZXJbMV07CisjaWYgMAorCW1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldF90IHNzaWRQYXJhbVNldDsKKwltcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0X3QgQ2hhbkxpc3RQYXJhbVNldDsKKwltcnZsaWV0eXBlc19yYXRlc3BhcmFtc2V0X3QgT3BSYXRlU2V0OworI2VuZGlmCit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCB7CisJdTE2IGJzc2Rlc2NyaXB0c2l6ZTsKKwl1OCBucl9zZXRzOworCXU4IGJzc2Rlc2NfYW5kX3RsdmJ1ZmZlclsxXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgeworCXUzMiBtY2FzdHR4ZnJhbWU7CisJdTMyIGZhaWxlZDsKKwl1MzIgcmV0cnk7CisJdTMyIG11bHRpcmV0cnk7CisJdTMyIGZyYW1lZHVwOworCXUzMiBydHNzdWNjZXNzOworCXUzMiBydHNmYWlsdXJlOworCXUzMiBhY2tmYWlsdXJlOworCXUzMiByeGZyYWc7CisJdTMyIG1jYXN0cnhmcmFtZTsKKwl1MzIgZmNzZXJyb3I7CisJdTMyIHR4ZnJhbWU7CisJdTMyIHdlcHVuZGVjcnlwdGFibGU7Cit9OworCitzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sIHsKKwl1MTYgYWN0aW9uOworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBjbWRfZHNfbWFjX211bHRpY2FzdF9hZHIgeworCXUxNiBhY3Rpb247CisJdTE2IG5yX29mX2FkcnM7CisJdTggbWFjbGlzdFtFVEhfQUxFTiAqIE1SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRV07Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgeworCXU4IG1hY2FkZHJbRVRIX0FMRU5dOworCXU4IGF1dGh0eXBlOworCXU4IHJlc2VydmVkWzEwXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2RlYXV0aGVudGljYXRlIHsKKwl1OCBtYWNhZGRyWzZdOworCXUxNiByZWFzb25jb2RlOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfYXNzb2NpYXRlIHsKKwl1OCBwZWVyc3RhYWRkcls2XTsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8gY2FwaW5mbzsKKwl1MTYgbGlzdGVuaW50ZXJ2YWw7CisJdTE2IGJjbnBlcmlvZDsKKwl1OCBkdGltcGVyaW9kOworCisjaWYgMAorCW1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldF90IHNzaWRQYXJhbVNldDsKKwltcnZsaWV0eXBlc19waHlwYXJhbXNldF90IHBoeXBhcmFtc2V0OworCW1ydmxpZXR5cGVzX3NzcGFyYW1zZXRfdCBzc3BhcmFtc2V0OworCW1ydmxpZXR5cGVzX3JhdGVzcGFyYW1zZXRfdCByYXRlc1BhcmFtU2V0OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZGlzYXNzb2NpYXRlIHsKKwl1OCBkZXN0bWFjYWRkcls2XTsKKwl1MTYgcmVhc29uY29kZTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZV9yc3AgeworCXN0cnVjdCBpZWVldHlwZXNfYXNzb2Nyc3AgYXNzb2NSc3A7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHsKKwl1OCBQQURbM107CisJdTggQlNTSURbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCB7CisJLyogQUNUX0FERCwgQUNUX1JFTU9WRSBvciBBQ1RfRU5BQkxFICovCisJdTE2IGFjdGlvbjsKKworCS8qIGtleSBJbmRleCBzZWxlY3RlZCBmb3IgVHggKi8KKwl1MTYga2V5aW5kZXg7CisKKwkvKiA0MCwgMTI4Yml0IG9yIFRYV0VQICovCisJdTgga2V5dHlwZVs0XTsKKwl1OCBrZXltYXRlcmlhbFs0XVsxNl07Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8zX2dldF9zdGF0IHsKKwl1MzIgeG1pdG9rOworCXUzMiByY3ZvazsKKwl1MzIgeG1pdGVycm9yOworCXUzMiByY3ZlcnJvcjsKKwl1MzIgcmN2bm9idWZmZXI7CisJdTMyIHJjdmNyY2Vycm9yOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X3N0YXQgeworCXUzMiB0eGZyYWdtZW50Y250OworCXUzMiBtY2FzdHR4ZnJhbWVjbnQ7CisJdTMyIGZhaWxlZGNudDsKKwl1MzIgcmV0cnljbnQ7CisJdTMyIE11bHRpcGxlcmV0cnljbnQ7CisJdTMyIHJ0c3N1Y2Nlc3NjbnQ7CisJdTMyIHJ0c2ZhaWx1cmVjbnQ7CisJdTMyIGFja2ZhaWx1cmVjbnQ7CisJdTMyIGZyYW1lZHVwbGljYXRlY250OworCXUzMiByeGZyYWdtZW50Y250OworCXUzMiBtY2FzdHJ4ZnJhbWVjbnQ7CisJdTMyIGZjc2Vycm9yY250OworCXUzMiBiY2FzdHR4ZnJhbWVjbnQ7CisJdTMyIGJjYXN0cnhmcmFtZWNudDsKKwl1MzIgdHhiZWFjb247CisJdTMyIHJ4YmVhY29uOworCXUzMiB3ZXB1bmRlY3J5cHRhYmxlOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgeworCXUxNiBxdWVyeXR5cGU7CisJdTE2IG9pZDsKKwl1MTYgYnVmc2l6ZTsKKwl1OCB2YWx1ZVsxMjhdOworfTsKKworc3RydWN0IGNtZF9kc19tYWNfcmVnX21hcCB7CisJdTE2IGJ1ZmZlcnNpemU7CisJdTggcmVnbWFwWzEyOF07CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGNtZF9kc19iYnBfcmVnX21hcCB7CisJdTE2IGJ1ZmZlcnNpemU7CisJdTggcmVnbWFwWzEyOF07CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGNtZF9kc19yZl9yZWdfbWFwIHsKKwl1MTYgYnVmZmVyc2l6ZTsKKwl1OCByZWdtYXBbNjRdOworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTE2IG9mZnNldDsKKwl1MzIgdmFsdWU7Cit9OworCitzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzIHsKKwl1MTYgYWN0aW9uOworCXUxNiBvZmZzZXQ7CisJdTggdmFsdWU7CisJdTggcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTE2IG9mZnNldDsKKwl1OCB2YWx1ZTsKKwl1OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JhZGlvX2NvbnRyb2wgeworCXUxNiBhY3Rpb247CisJdTE2IGNvbnRyb2w7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMgeworCS8qIEFDVF9HRVQvQUNUX1NFVCAqLworCXUxNiBhY3Rpb247CisKKwkvKiBTbGVlcCBjbG9jayBlcnJvciBpbiBwcG0gKi8KKwl1MTYgZXJyb3I7CisKKwkvKiBXYWtldXAgb2Zmc2V0IGluIHVzZWMgKi8KKwl1MTYgb2Zmc2V0OworCisJLyogQ2xvY2sgc3RhYmlsaXphdGlvbiB0aW1lIGluIHVzZWMgKi8KKwl1MTYgc3RhYmxldGltZTsKKworCS8qIGNvbnRyb2wgcGVyaW9kaWMgY2FsaWJyYXRpb24gKi8KKwl1OCBjYWxjb250cm9sOworCisJLyogY29udHJvbCB0aGUgdXNlIG9mIGV4dGVybmFsIHNsZWVwIGNsb2NrICovCisJdTggZXh0ZXJuYWxzbGVlcGNsazsKKworCS8qIHJlc2VydmVkIGZpZWxkLCBzaG91bGQgYmUgc2V0IHRvIHplcm8gKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQgeworCS8qIEFDVF9HRVQvQUNUX1NFVCAqLworCXUxNiBhY3Rpb247CisKKwkvKiBJbmFjdGl2aXR5IHRpbWVvdXQgaW4gbXNlYyAqLworCXUxNiB0aW1lb3V0OworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCB7CisJdTE2IGFjdGlvbjsKKwl1MTYgY3VycmVudGNoYW5uZWw7CisJdTE2IHJmdHlwZTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTggY2hhbm5lbGxpc3RbMzJdOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaSB7CisJLyogd2VpZ2h0aW5nIGZhY3RvciAqLworCXUxNiBOOworCisJdTE2IHJlc2VydmVkXzA7CisJdTE2IHJlc2VydmVkXzE7CisJdTE2IHJlc2VydmVkXzI7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yc3NpX3JzcCB7CisJdTE2IFNOUjsKKwl1MTYgbm9pc2VmbG9vcjsKKwl1MTYgYXZnU05SOworCXUxNiBhdmdub2lzZWZsb29yOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfbWFjX2FkZHJlc3MgeworCXUxNiBhY3Rpb247CisJdTggbWFjYWRkW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIHsKKwl1MTYgYWN0aW9uOworCXUxNiBjdXJyZW50bGV2ZWw7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9hbnRlbm5hIHsKKwl1MTYgYWN0aW9uOworCisJLyogTnVtYmVyIG9mIGFudGVubmFzIG9yIDB4ZmZmZihkaXZlcnNpdHkpICovCisJdTE2IGFudGVubmFtb2RlOworCit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlIHsKKwl1MTYgYWN0aW9uOworCXUxNiBudWxscGt0aW50ZXJ2YWw7CisJdTE2IG11bHRpcGxlZHRpbTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGxvY2FsbGlzdGVuaW50ZXJ2YWw7Cit9OworCitzdHJ1Y3QgUFNfQ01EX0NvbmZpcm1TbGVlcCB7CisJdTE2IGNvbW1hbmQ7CisJdTE2IHNpemU7CisJdTE2IHNlcW51bTsKKwl1MTYgcmVzdWx0OworCisJdTE2IGFjdGlvbjsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBtdWx0aXBsZWR0aW07CisJdTE2IHJlc2VydmVkOworCXUxNiBsb2NhbGxpc3RlbmludGVydmFsOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlIHsKKwl1MTYgYWN0aW9uOworCXUxNiByZXNlcnZlcmQ7CisJdTggZGF0YXJhdGVbR19TVVBQT1JURURfUkFURVNdOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0IHsKKwl1MTYgYWN0aW9uOworCXUxNiBlbmFibGVod2F1dG87CisJdTE2IGJpdG1hcDsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCB7CisJdTggU1NJRFtJV19FU1NJRF9NQVhfU0laRV07CisJdTggYnNzdHlwZTsKKwl1MTYgYmVhY29ucGVyaW9kOworCXU4IGR0aW1wZXJpb2Q7CisJdW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQgc3NwYXJhbXNldDsKKwl1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQgcGh5cGFyYW1zZXQ7CisJdTE2IHByb2JlZGVsYXk7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvIGNhcDsKKwl1OCBkYXRhcmF0ZVtHX1NVUFBPUlRFRF9SQVRFU107CisJdTggdGx2X21lbW9yeV9zaXplX3BhZFsxMDBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBhZGhvY19ic3NkZXNjIHsKKwl1OCBCU1NJRFs2XTsKKwl1OCBTU0lEWzMyXTsKKwl1OCBic3N0eXBlOworCXUxNiBiZWFjb25wZXJpb2Q7CisJdTggZHRpbXBlcmlvZDsKKwl1OCB0aW1lc3RhbXBbOF07CisJdTggbG9jYWx0aW1lWzhdOworCXVuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCBwaHlwYXJhbXNldDsKKwl1bmlvbiBJRUVFdHlwZXNfc3NwYXJhbXNldCBzc3BhcmFtc2V0OworCXN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyBjYXA7CisJdTggZGF0YXJhdGVzW0dfU1VQUE9SVEVEX1JBVEVTXTsKKworCS8qIERPIE5PVCBBREQgQU5ZIEZJRUxEUyBUTyBUSElTIFNUUlVDVFVSRS4gSXQgaXMgdXNlZCBiZWxvdyBpbiB0aGUKKwkgKiBBZGhvYyBqb2luIGNvbW1hbmQgYW5kIHdpbGwgY2F1c2UgYSBiaW5hcnkgbGF5b3V0IG1pc21hdGNoIHdpdGgKKwkgKiB0aGUgZmlybXdhcmUKKwkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbiB7CisJc3RydWN0IGFkaG9jX2Jzc2Rlc2MgYnNzZGVzY3JpcHRvcjsKKwl1MTYgZmFpbHRpbWVvdXQ7CisJdTE2IHByb2JlZGVsYXk7CisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lbmFibGVfcnNuIHsKKwl1MTYgYWN0aW9uOworCXUxNiBlbmFibGU7Cit9OworCitzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCB7CisJLyogdHlwZSBJRCAqLworCXUxNiB0eXBlOworCisJLyogbGVuZ3RoIG9mIFBheWxvYWQgKi8KKwl1MTYgbGVuZ3RoOworCisJLyogdHlwZSBvZiBrZXk6IFdFUD0wLCBUS0lQPTEsIEFFUz0yICovCisJdTE2IGtleXR5cGVpZDsKKworCS8qIGtleSBjb250cm9sIEluZm8gc3BlY2lmaWMgdG8gYSBrZXl0eXBlaWQgKi8KKwl1MTYga2V5aW5mbzsKKworCS8qIGxlbmd0aCBvZiBrZXkgKi8KKwl1MTYga2V5bGVuOworCisJLyoga2V5IG1hdGVyaWFsIG9mIHNpemUga2V5bGVuICovCisJdTgga2V5WzMyXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCB7CisJdTE2IGFjdGlvbjsKKwlzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCBrZXlQYXJhbVNldFsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lZXByb21fYWNjZXNzIHsKKwl1MTYgYWN0aW9uOworCisJLyogbXVsdGlwbGUgNCAqLworCXUxNiBvZmZzZXQ7CisJdTE2IGJ5dGVjb3VudDsKKwl1OCB2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnIHsKKwl1MTYgYWN0aW9uOworCXU4IGVuYWJsZTsKKwlzOCBQMDsKKwlzOCBQMTsKKwlzOCBQMjsKKwl1OCB1c2VzbnI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwgeworCXUxNiBhY3Rpb247CisJdTE2IG51bWxlZDsKKwl1OCBkYXRhWzI1Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyB7CisJdTE2IGFjdGlvbjsKKwl1OCBlbmFibGU7CisJczggUEFfUDA7CisJczggUEFfUDE7CisJczggUEFfUDI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfYWZjIHsKKwl1MTYgYWZjX2F1dG87CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTE2IHRocmVzaG9sZDsKKwkJCXUxNiBwZXJpb2Q7CisJCX07CisJCXN0cnVjdCB7CisJCQlzMTYgdGltaW5nX29mZnNldDsKKwkJCXMxNiBjYXJyaWVyX29mZnNldDsKKwkJfTsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjbWRfdHhfcmF0ZV9xdWVyeSB7CisJdTE2IHR4cmF0ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2dldF90c2YgeworCV9fbGU2NCB0c2Z2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2J0X2FjY2VzcyB7CisJdTE2IGFjdGlvbjsKKwl1MzIgaWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTMyIGlkOworCXU4IGRhW0VUSF9BTEVOXTsKKwl1OCBkaXI7CisJdTggcmFbRVRIX0FMRU5dOworCXUzMiBzc247CisJdTMyIGRzbjsKKwl1MzIgbWV0cmljOworCXU4IGhvcGNvdW50OworCXU4IHR0bDsKKwl1MzIgZXhwaXJhdGlvbjsKKwl1OCBzbGVlcG1vZGU7CisJdTMyIHNucjsKKwl1MzIgcmVmZXJlbmNlczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIE1FU0hfU1RBVFNfTlVNIDcKK3N0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTMyIGRhdGFbTUVTSF9TVEFUU19OVU0gKyAxXTsJLyogbGFzdCBwb3NpdGlvbiByZXNlcnZlZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjbWRfZHNfY29tbWFuZCB7CisJLyogY29tbWFuZCBoZWFkZXIgKi8KKwl1MTYgY29tbWFuZDsKKwl1MTYgc2l6ZTsKKwl1MTYgc2VxbnVtOworCXUxNiByZXN1bHQ7CisKKwkvKiBjb21tYW5kIEJvZHkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBjbWRfZHNfZ2V0X2h3X3NwZWMgaHdzcGVjOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlIHBzbW9kZTsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfc2NhbiBzY2FuOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCBzY2FucmVzcDsKKwkJc3RydWN0IGNtZF9kc19tYWNfY29udHJvbCBtYWNjdHJsOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgYXNzb2NpYXRlOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBkZWF1dGg7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3NldF93ZXAgd2VwOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgYWRzOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZXNldCByZXNldDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3Jlc3VsdCByZXN1bHQ7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgZ2xvZzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfYXV0aGVudGljYXRlIGF1dGg7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9zdGF0IGdzdGF0OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8zX2dldF9zdGF0IGdzdGF0XzgwMjM7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliIHNtaWI7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIHR4cDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSByYW50OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kYXRhX3JhdGUgZHJhdGU7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCByYXRlc2V0OworCQlzdHJ1Y3QgY21kX2RzX21hY19tdWx0aWNhc3RfYWRyIG1hZHI7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19qb2luIGFkajsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmFkaW9fY29udHJvbCByYWRpbzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCByZmNoYW5uZWw7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kgcnNzaTsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaV9yc3AgcnNzaXJzcDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfZGlzYXNzb2NpYXRlIGRhc3NvY2lhdGU7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX21hY19hZGRyZXNzIG1hY2FkZDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfZW5hYmxlX3JzbiBlbmJyc247CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCBrZXltYXRlcmlhbDsKKwkJc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcyBtYWNyZWc7CisJCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgYmJwcmVnOworCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgcmZyZWc7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2VlcHJvbV9hY2Nlc3MgcmRlZXByb207CisKKwkJc3RydWN0IGNtZF9kc184MDJfMTFkX2RvbWFpbl9pbmZvIGRvbWFpbmluZm87CisJCXN0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbyBkb21haW5pbmZvcmVzcDsKKworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMgc2xlZXBfcGFyYW1zOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQgaW5hY3Rpdml0eV90aW1lb3V0OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnIHRwY2NmZzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyBwd3JjZmc7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2xlZF9jdHJsIGxlZGdwaW87CisKKwkJc3RydWN0IGNtZF90eF9yYXRlX3F1ZXJ5IHR4cmF0ZTsKKwkJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgYnQ7CisJCXN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3Q7CisJCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgbWVzaDsKKwkJc3RydWN0IGNtZF9kc19nZXRfdHNmIGdldHRzZjsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50IHN1YnNjcmliZV9ldmVudDsKKwl9IHBhcmFtczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2Jvb3RjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2Jvb3RjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcwMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfYm9vdGNtZC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdXNlZCBpbiBVU0IgQm9vdCBjb21tYW5kCisgICogYW5kIEJvb3QyL0ZXIHVwZGF0ZQorICAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImlmX3VzYi5oIgorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpc3N1ZXMgQm9vdCBjb21tYW5kIHRvIHRoZSBCb290MiBjb2RlCisgKiAgQHBhcmFtIGl2YWx1ZSAgIDE6Qm9vdCBmcm9tIEZXIGJ5IFVTQi1Eb3dubG9hZAorICogICAgICAgICAgICAgICAgICAyOkJvb3QgZnJvbSBGVyBpbiBFRVBST00KKyAqICBAcmV0dXJuIAkgICAJMAorICovCitpbnQgaWZfdXNiX2lzc3VlX2Jvb3RfY29tbWFuZCh3bGFuX3ByaXZhdGUgKnByaXYsIGludCBpdmFsdWUpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYwkqY2FyZHAgPSBwcml2LT53bGFuX2Rldi5jYXJkOworCXN0cnVjdCBib290Y21kc3RyCXNib290Y21kOworCWludCBpOworCisJLyogUHJlcGFyZSBjb21tYW5kICovCisJc2Jvb3RjbWQudTMybWFnaWNudW1iZXIgPSBCT09UX0NNRF9NQUdJQ19OVU1CRVI7CisJc2Jvb3RjbWQudThjbWRfdGFnID0gaXZhbHVlOworCWZvciAoaT0wOyBpPDExOyBpKyspCisJCXNib290Y21kLmF1OGR1bXlbaV09MHgwMDsKKwltZW1jcHkoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgJnNib290Y21kLCBzaXplb2Yoc3RydWN0IGJvb3RjbWRzdHIpKTsKKworCS8qIElzc3VlIGNvbW1hbmQgKi8KKwl1c2JfdHhfYmxvY2socHJpdiwgY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgc2l6ZW9mKHN0cnVjdCBib290Y21kc3RyKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCkBAIC0wLDAgKzEsOTUyIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHVzZWQgaW4gVVNCIGludGVyZmFjZSBtb2R1bGUuCisgICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInNiaS5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiaWZfdXNiLmgiCisKKyNkZWZpbmUgTUVTU0FHRV9IRUFERVJfTEVOCTQKKworc3RhdGljIGNvbnN0IGNoYXIgdXNiZHJpdmVyX25hbWVbXSA9ICJ1c2I4eHh4IjsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlmX3VzYl90YWJsZVtdID0geworCS8qIEVudGVyIHRoZSBkZXZpY2Ugc2lnbmF0dXJlIGluc2lkZSAqLworCXsKKwkJVVNCX0RFVklDRShVU0I4Mzg4X1ZJRF8xLCBVU0I4Mzg4X1BJRF8xKSwKKwl9LAorCXsKKwkJVVNCX0RFVklDRShVU0I4Mzg4X1ZJRF8yLCBVU0I4Mzg4X1BJRF8yKSwKKwl9LAorCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWZfdXNiX3RhYmxlKTsKKworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyB2b2lkIGlmX3VzYl9yZWNlaXZlX2Z3bG9hZChzdHJ1Y3QgdXJiICp1cmIpOworCisvKioKKyAqICBAYnJpZWYgIGNhbGwgYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHN0YXR1cyBvZiB0aGUgVVJCCisgKiAgQHBhcmFtIHVyYiAJCXBvaW50ZXIgdG8gdXJiIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAlOL0EKKyAqLworc3RhdGljIHZvaWQgaWZfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgKHVyYi0+Y29udGV4dCk7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+d2xhbl9kZXYubmV0ZGV2OworCisJLyogaGFuZGxlIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGUgdmFsaWRhdGlvbnMgKi8KKworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCS8qIHByaW50IHRoZSBmYWlsdXJlIHN0YXR1cyBudW1iZXIgZm9yIGRlYnVnICovCisJCWxic19wcl9pbmZvKCJVUkIgaW4gZmFpbHVyZSBzdGF0dXNcbiIpOworCX0gZWxzZSB7CisJCWxic19kZXZfZGJnKDIsICZ1cmItPmRldi0+ZGV2LCAiVVJCIHN0YXR1cyBpcyBzdWNjZXNzZnVsbFxuIik7CisJCWxic19kZXZfZGJnKDIsICZ1cmItPmRldi0+ZGV2LCAiQWN0dWFsIGxlbmd0aCB0cmFuc21pdHRlZCAlZFxuIiwKKwkJICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXByaXYtPndsYW5fZGV2LmRubGRfc2VudCA9IEROTERfUkVTX1JFQ0VJVkVEOworCQkvKiBXYWtlIG1haW4gdGhyZWFkIGlmIGNvbW1hbmRzIGFyZSBwZW5kaW5nICovCisJCWlmICghYWRhcHRlci0+Y3VyX2NtZCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisJCWlmICgoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiAgZnJlZSB0eC9yeCB1cmIsIHNrYiBhbmQgcnggYnVmZmVyCisgKiAgQHBhcmFtIGNhcmRwCXBvaW50ZXIgdXNiX2NhcmRfcmVjCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCit2b2lkIGlmX3VzYl9mcmVlKHN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwKQoreworCUVOVEVSKCk7CisKKwkvKiBVbmxpbmsgdHggJiByeCB1cmIgKi8KKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnR4X3VyYik7CisJdXNiX2tpbGxfdXJiKGNhcmRwLT5yeF91cmIpOworCisJdXNiX2ZyZWVfdXJiKGNhcmRwLT50eF91cmIpOworCWNhcmRwLT50eF91cmIgPSBOVUxMOworCisJdXNiX2ZyZWVfdXJiKGNhcmRwLT5yeF91cmIpOworCWNhcmRwLT5yeF91cmIgPSBOVUxMOworCisJa2ZyZWUoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlcik7CisJY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CisKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIHNldHMgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzCisgKiAgQHBhcmFtIGlmbnVtCWludGVyZmFjZSBudW1iZXIKKyAqICBAcGFyYW0gaWQJCXBvaW50ZXIgdG8gdXNiX2RldmljZV9pZAorICogIEByZXR1cm4gCSAgIAkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlmX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJd2xhbl9wcml2YXRlICpwd2xhbnByaXY7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqdXNiX2NhcmRwOworCWludCBpOworCisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwl1c2JfY2FyZHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2NhcmRfcmVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JfY2FyZHApIHsKKwkJbGJzX3ByX2VycigiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHByaXZhdGUgZGF0YS5cbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXVzYl9jYXJkcC0+dWRldiA9IHVkZXY7CisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwgImJjZFVTQiA9IDB4JVggYkRldmljZUNsYXNzID0gMHglWCIKKwkgICAgICAgIiBiRGV2aWNlU3ViQ2xhc3MgPSAweCVYLCBiRGV2aWNlUHJvdG9jb2wgPSAweCVYXG4iLAorCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJjZFVTQiwKKwkgICAgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MsCisJICAgICAgIHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZVN1YkNsYXNzLAorCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKwkJICAgICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKKwkJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLworCQkJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwgIkJ1bGsgaW4gc2l6ZSBpcyAlZFxuIiwKKwkJCSAgICAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJaWYgKCEKKwkJCSAgICAodXNiX2NhcmRwLT5yeF91cmIgPQorCQkJICAgICB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkgeworCQkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgICJSeCBVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZGVhbGxvYzsKKwkJCX0KKwkJCXVzYl9jYXJkcC0+cnhfdXJiX3JlY2FsbCA9IDA7CisKKwkJCXVzYl9jYXJkcC0+YnVsa19pbl9zaXplID0KKwkJCSAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemU7CisJCQl1c2JfY2FyZHAtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0KKwkJCSAgICAoZW5kcG9pbnQtPgorCQkJICAgICBiRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsICJpbl9lbmRwb2ludCA9ICVkXG4iLAorCQkJICAgICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJfQorCisJCWlmICgoKGVuZHBvaW50LT4KKwkJICAgICAgYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0KKwkJICAgICBVU0JfRElSX09VVCkKKwkJICAgICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKKwkJCS8qIFdlIGZvdW5kIGJ1bGsgb3V0IGVuZHBvaW50ICovCisJCQlpZiAoIQorCQkJICAgICh1c2JfY2FyZHAtPnR4X3VyYiA9CisJCQkgICAgIHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKSB7CisJCQkJbGJzX2Rldl9kYmcoMSwmdWRldi0+ZGV2LAorCQkJCSAgICAgICAiVHggVVJCIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGRlYWxsb2M7CisJCQl9CisKKwkJCXVzYl9jYXJkcC0+YnVsa19vdXRfc2l6ZSA9CisJCQkgICAgZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplOworCQkJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwKKwkJCQkgICAgIkJ1bGsgb3V0IHNpemUgaXMgJWRcbiIsCisJCQkJICAgIGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQl1c2JfY2FyZHAtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9CisJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlsYnNfZGV2X2RiZygxLCAmdWRldi0+ZGV2LCAib3V0X2VuZHBvaW50ID0gJWRcbiIsCisJCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCXVzYl9jYXJkcC0+YnVsa19vdXRfYnVmZmVyID0KKwkJCSAgICBrbWFsbG9jKE1SVkRSVl9FVEhfVFhfUEFDS0VUX0JVRkZFUl9TSVpFLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKworCQkJaWYgKCF1c2JfY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlcikgeworCQkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKwkJCQlnb3RvIGRlYWxsb2M7CisJCQl9CisJCX0KKwl9CisKKworCS8qIEF0IHRoaXMgcG9pbnQgd2xhbl9hZGRfY2FyZCgpIHdpbGwgYmUgY2FsbGVkLiAgRG9uJ3Qgd29ycnkKKwkgKiBhYm91dCBrZWVwaW5nIHB3bGFucHJpdiBhcm91bmQgc2luY2UgaXQgd2lsbCBiZSBzZXQgb24gb3VyCisJICogdXNiIGRldmljZSBkYXRhIGluIC0+IGFkZCgpIC0+IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYoKS4KKwkgKi8KKwlpZiAoIShwd2xhbnByaXYgPSB3bGFuX2FkZF9jYXJkKHVzYl9jYXJkcCkpKQorCQlnb3RvIGRlYWxsb2M7CisKKwl1c2JfZ2V0X2Rldih1ZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHVzYl9jYXJkcCk7CisKKwkvKgorCSAqIHJldHVybiBjYXJkIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIGdvdCBiYWNrIGluIHRoZQorCSAqIGRpY29ubmVjdCBmdW5jdGlvbiBhcyB0aGUgcHRyCisJICogYXJndW1lbnQuCisJICovCisJcmV0dXJuIDA7CisKK2RlYWxsb2M6CisJaWZfdXNiX2ZyZWUodXNiX2NhcmRwKTsKKworZXJyb3I6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogIEBicmllZiBmcmVlIHJlc291cmNlIGFuZCBjbGVhbnVwCisgKiAgQHBhcmFtIHVkZXYJCXBvaW50ZXIgdG8gdXNiX2RldmljZQorICogIEBwYXJhbSBwdHIJCXBvaW50ZXIgdG8gdXNiX2NhcmRwCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCitzdGF0aWMgdm9pZCBpZl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSBjYXJkcC0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCisJYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvKgorCSAqIFVwZGF0ZSBTdXJwcmlzZSByZW1vdmVkIHRvIFRSVUUKKwkgKi8KKwlhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQgPSAxOworCisJLyogY2FyZCBpcyByZW1vdmVkIGFuZCB3ZSBjYW4gY2FsbCB3bGFuX3JlbW92ZV9jYXJkICovCisJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJjYWxsIHJlbW92ZSBjYXJkXG4iKTsKKwl3bGFuX3JlbW92ZV9jYXJkKGNhcmRwKTsKKworCS8qIFVubGluayBhbmQgZnJlZSB1cmIgKi8KKwlpZl91c2JfZnJlZShjYXJkcCk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworCisJcmV0dXJuOworfQorCisvKioKKyAqICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gZG93bmxvYWQgRlcKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcmV0dXJuIAkgICAJMAorICovCitzdGF0aWMgaW50IGlmX3Byb2dfZmlybXdhcmUod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisJc3RydWN0IEZXRGF0YSAqZndkYXRhOworCXN0cnVjdCBmd2hlYWRlciAqZndoZWFkZXI7CisJdTggKmZpcm13YXJlID0gcHJpdi0+ZmlybXdhcmUtPmRhdGE7CisKKwlmd2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgRldEYXRhKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWZ3ZGF0YSkKKwkJcmV0dXJuIC0xOworCisJZndoZWFkZXIgPSAmZndkYXRhLT5md2hlYWRlcjsKKworCWlmICghY2FyZHAtPkNSQ19PSykgeworCQljYXJkcC0+dG90YWxieXRlcyA9IGNhcmRwLT5md2xhc3RibGtzZW50OworCQljYXJkcC0+ZndzZXFudW0gPSBjYXJkcC0+bGFzdHNlcW51bSAtIDE7CisJfQorCisJbGJzX2Rldl9kYmcoMiwgJmNhcmRwLT51ZGV2LT5kZXYsICJ0b3RhbGJ5dGVzID0gJWRcbiIsCisJCSAgICBjYXJkcC0+dG90YWxieXRlcyk7CisKKwltZW1jcHkoZndoZWFkZXIsICZmaXJtd2FyZVtjYXJkcC0+dG90YWxieXRlc10sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZndoZWFkZXIpKTsKKworCWNhcmRwLT5md2xhc3RibGtzZW50ID0gY2FyZHAtPnRvdGFsYnl0ZXM7CisJY2FyZHAtPnRvdGFsYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBmd2hlYWRlcik7CisKKwlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwiQ29weSBEYXRhXG4iKTsKKwltZW1jcHkoZndkYXRhLT5kYXRhLCAmZmlybXdhcmVbY2FyZHAtPnRvdGFsYnl0ZXNdLAorCSAgICAgICBmd2RhdGEtPmZ3aGVhZGVyLmRhdGFsZW5ndGgpOworCisJbGJzX2Rldl9kYmcoMiwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCSAgICAiRGF0YSBsZW5ndGggPSAlZFxuIiwgZndkYXRhLT5md2hlYWRlci5kYXRhbGVuZ3RoKTsKKworCWNhcmRwLT5md3NlcW51bSA9IGNhcmRwLT5md3NlcW51bSArIDE7CisKKwlmd2RhdGEtPnNlcW51bSA9IGNhcmRwLT5md3NlcW51bTsKKwljYXJkcC0+bGFzdHNlcW51bSA9IGZ3ZGF0YS0+c2VxbnVtOworCWNhcmRwLT50b3RhbGJ5dGVzICs9IGZ3ZGF0YS0+ZndoZWFkZXIuZGF0YWxlbmd0aDsKKworCWlmIChmd2hlYWRlci0+ZG5sZGNtZCA9PSBGV19IQVNfREFUQV9UT19SRUNWKSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAiVGhlcmUgaXMgZGF0YSB0byBmb2xsb3dcbiIpOworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAic2VxbnVtID0gJWQgdG90YWxieXRlcyA9ICVkXG4iLCBjYXJkcC0+ZndzZXFudW0sCisJCQkgICAgY2FyZHAtPnRvdGFsYnl0ZXMpOworCQltZW1jcHkoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgZndoZWFkZXIsIEZXX0RBVEFfWE1JVF9TSVpFKTsKKwkJdXNiX3R4X2Jsb2NrKHByaXYsIGNhcmRwLT5idWxrX291dF9idWZmZXIsIEZXX0RBVEFfWE1JVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZndkYXRhLT5md2hlYWRlci5kbmxkY21kID09IEZXX0hBU19MQVNUX0JMT0NLKSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJIb3N0IGhhcyBmaW5pc2hlZCBGVyBkb3dubG9hZGluZ1xuIik7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJEb253bG9hZGluZyBGVyBKVU1QIEJMT0NLXG4iKTsKKwkJbWVtY3B5KGNhcmRwLT5idWxrX291dF9idWZmZXIsIGZ3aGVhZGVyLCBGV19EQVRBX1hNSVRfU0laRSk7CisJCXVzYl90eF9ibG9jayhwcml2LCBjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCBGV19EQVRBX1hNSVRfU0laRSk7CisJCWNhcmRwLT5md2ZpbmFsYmxrID0gMTsKKwl9CisKKwlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJICAgICJUaGUgZmlybXdhcmUgZG93bmxvYWQgaXMgZG9uZSBzaXplIGlzICVkXG4iLAorCQkgICAgY2FyZHAtPnRvdGFsYnl0ZXMpOworCisJa2ZyZWUoZndkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX2RvX3Jlc2V0KHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKworCXJldCA9IHVzYl9yZXNldF9kZXZpY2UoY2FyZHAtPnVkZXYpOworCWlmICghcmV0KSB7CisJCW1zbGVlcCgxMCk7CisJCXJlc2V0X2RldmljZShwcml2KTsKKwkJbXNsZWVwKDEwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gdHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIGRldmljZS4KKyAqICBAcGFyYW0gcHJpdiAJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gcGF5bG9hZAlwb2ludGVyIHRvIHBheWxvYWQgZGF0YQorICogIEBwYXJhbSBuYgkJZGF0YSBsZW5ndGgKKyAqICBAcmV0dXJuIAkgICAJMCBvciAtMQorICovCitpbnQgdXNiX3R4X2Jsb2NrKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogcGF5bG9hZCwgdTE2IG5iKQoreworCS8qIHBvaW50ZXIgdG8gY2FyZCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisJaW50IHJldCA9IC0xOworCisJLyogY2hlY2sgaWYgZGV2aWNlIGlzIHJlbW92ZWQgKi8KKwlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKSB7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiRGV2aWNlIHJlbW92ZWRcbiIpOworCQlnb3RvIHR4X3JldDsKKwl9CisKKwl1c2JfZmlsbF9idWxrX3VyYihjYXJkcC0+dHhfdXJiLCBjYXJkcC0+dWRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKGNhcmRwLT51ZGV2LAorCQkJCQkgIGNhcmRwLT5idWxrX291dF9lbmRwb2ludEFkZHIpLAorCQkJICBwYXlsb2FkLCBuYiwgaWZfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIHByaXYpOworCisJY2FyZHAtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworCisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihjYXJkcC0+dHhfdXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJLyogIHRyYW5zZmVyIGZhaWxlZCAqLworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgc3VjY2Vzc1xuIik7CisJCXJldCA9IDA7CisJfQorCit0eF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2lmX3VzYl9zdWJtaXRfcnhfdXJiKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICB2b2lkICgqY2FsbGJhY2tmbikKKwkJCQkgIChzdHJ1Y3QgdXJiICp1cmIpKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByZWFkX2NiX2luZm8gKnJpbmZvID0gJmNhcmRwLT5yaW5mbzsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFKSkpIHsKKwkJbGJzX3ByX2VycigiTm8gZnJlZSBza2JcbiIpOworCQlnb3RvIHJ4X3JldDsKKwl9CisKKwlyaW5mby0+c2tiID0gc2tiOworCisJLyogRmlsbCB0aGUgcmVjZWl2ZSBjb25maWd1cmF0aW9uIFVSQiBhbmQgaW5pdGlhbGlzZSB0aGUgUnggY2FsbCBiYWNrICovCisJdXNiX2ZpbGxfYnVsa191cmIoY2FyZHAtPnJ4X3VyYiwgY2FyZHAtPnVkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShjYXJkcC0+dWRldiwKKwkJCQkJICBjYXJkcC0+YnVsa19pbl9lbmRwb2ludEFkZHIpLAorCQkJICBza2ItPnRhaWwgKyBJUEZJRUxEX0FMSUdOX09GRlNFVCwKKwkJCSAgTVJWRFJWX0VUSF9SWF9QQUNLRVRfQlVGRkVSX1NJWkUsIGNhbGxiYWNrZm4sCisJCQkgIHJpbmZvKTsKKworCWNhcmRwLT5yeF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKworCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAiUG9pbnRlciBmb3IgcnhfdXJiICVwXG4iLCBjYXJkcC0+cnhfdXJiKTsKKwlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKGNhcmRwLT5yeF91cmIsIEdGUF9BVE9NSUMpKSkgeworCQkvKiBoYW5kbGUgZmFpbHVyZSBjb25kaXRpb25zICovCisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiU3VibWl0IFJ4IFVSQiBmYWlsZWRcbiIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwgIlN1Ym1pdCBSeCBVUkIgc3VjY2Vzc1xuIik7CisJCXJldCA9IDA7CisJfQorCityeF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIF9faWZfdXNiX3N1Ym1pdF9yeF91cmIocHJpdiwgJmlmX3VzYl9yZWNlaXZlX2Z3bG9hZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlmX3VzYl9zdWJtaXRfcnhfdXJiKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIF9faWZfdXNiX3N1Ym1pdF9yeF91cmIocHJpdiwgJmlmX3VzYl9yZWNlaXZlKTsKK30KKworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmVfZndsb2FkKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgcmVhZF9jYl9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgcmVhZF9jYl9pbmZvICopdXJiLT5jb250ZXh0OworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IHJpbmZvLT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSByaW5mby0+c2tiOworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gKHN0cnVjdCB1c2JfY2FyZF9yZWMgKilwcml2LT53bGFuX2Rldi5jYXJkOworCXN0cnVjdCBmd3N5bmNoZWFkZXIgKnN5bmNmd2hlYWRlcjsKKwlzdHJ1Y3QgYm9vdGNtZHJlc3BTdHIgYm9vdGNtZHJlc3A7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlVSQiBzdGF0dXMgaXMgZmFpbGVkIGR1cmluZyBmdyBsb2FkXG4iKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDApIHsKKwkJbWVtY3B5ICgmYm9vdGNtZHJlc3AsIHNrYi0+ZGF0YSArIElQRklFTERfQUxJR05fT0ZGU0VULAorCQkJc2l6ZW9mKGJvb3RjbWRyZXNwKSk7CisJCWlmIChjYXJkcC0+dWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UgPCAweDMxMDYpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKHByaXYpOworCQkJY2FyZHAtPmJvb3RjbWRyZXNwID0gMTsKKwkJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJCSAgICAiUmVjZWl2ZWQgdmFsaWQgYm9vdCBjb21tYW5kIHJlc3BvbnNlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYm9vdGNtZHJlc3AudTMybWFnaWNudW1iZXIgIT0gQk9PVF9DTURfTUFHSUNfTlVNQkVSKSB7CisJCQlsYnNfcHJfaW5mbygKKwkJCQkiYm9vdCBjbWQgcmVzcG9uc2Ugd3JvbmcgbWFnaWMgbnVtYmVyICgweCV4KVxuIiwKKwkJCQlib290Y21kcmVzcC51MzJtYWdpY251bWJlcik7CisJCX0gZWxzZSBpZiAoYm9vdGNtZHJlc3AudThjbWRfdGFnICE9IEJPT1RfQ01EX0ZXX0JZX1VTQikgeworCQkJbGJzX3ByX2luZm8oCisJCQkJImJvb3QgY21kIHJlc3BvbnNlIGNtZF90YWcgZXJyb3IgKCVkKVxuIiwKKwkJCQlib290Y21kcmVzcC51OGNtZF90YWcpOworCQl9IGVsc2UgaWYgKGJvb3RjbWRyZXNwLnU4cmVzdWx0ICE9IEJPT1RfQ01EX1JFU1BfT0spIHsKKwkJCWxic19wcl9pbmZvKAorCQkJCSJib290IGNtZCByZXNwb25zZSByZXN1bHQgZXJyb3IgKCVkKVxuIiwKKwkJCQlib290Y21kcmVzcC51OHJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQljYXJkcC0+Ym9vdGNtZHJlc3AgPSAxOworCQkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkJICAgICJSZWNlaXZlZCB2YWxpZCBib290IGNvbW1hbmQgcmVzcG9uc2VcbiIpOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQocHJpdik7CisJCXJldHVybjsKKwl9CisKKwlzeW5jZndoZWFkZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZndzeW5jaGVhZGVyKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzeW5jZndoZWFkZXIpIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jYXRlIHN5bmNmd2hlYWRlclxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHN5bmNmd2hlYWRlciwgc2tiLT5kYXRhICsgSVBGSUVMRF9BTElHTl9PRkZTRVQsCisJCQlzaXplb2Yoc3RydWN0IGZ3c3luY2hlYWRlcikpOworCisJaWYgKCFzeW5jZndoZWFkZXItPmNtZCkgeworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHdpdGggY29ycmVjdCBDUkNcbiIpOworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHNlcW51bSA9ICVkXG4iLAorCQkgICAgICAgc3luY2Z3aGVhZGVyLT5zZXFudW0pOworCQljYXJkcC0+Q1JDX09LID0gMTsKKwl9IGVsc2UgeworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHdpdGggQ1JDIGVycm9yXG4iKTsKKwkJY2FyZHAtPkNSQ19PSyA9IDA7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlpZiAoY2FyZHAtPmZ3ZmluYWxibGspIHsKKwkJY2FyZHAtPmZ3ZG5sZG92ZXIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWZfcHJvZ19maXJtd2FyZShwcml2KTsKKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiX2Z3bG9hZChwcml2KTsKK2V4aXQ6CisJa2ZyZWUoc3luY2Z3aGVhZGVyKTsKKworCXJldHVybjsKKworfQorCisjZGVmaW5lIE1SVkRSVl9NSU5fUEtUX0xFTgkzMAorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19jbWR0eXBlZGF0YShpbnQgcmVjdmxlbmd0aCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAsCisJCQkJICAgICAgIHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpZiAocmVjdmxlbmd0aCA+IE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFICsKKwkgICAgTUVTU0FHRV9IRUFERVJfTEVOIHx8IHJlY3ZsZW5ndGggPCBNUlZEUlZfTUlOX1BLVF9MRU4pIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlBhY2tldCBsZW5ndGggaXMgSW52YWxpZFxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBJUEZJRUxEX0FMSUdOX09GRlNFVCk7CisJc2tiX3B1dChza2IsIHJlY3ZsZW5ndGgpOworCXNrYl9wdWxsKHNrYiwgTUVTU0FHRV9IRUFERVJfTEVOKTsKKwlsaWJlcnRhc19wcm9jZXNzX3J4ZWRfcGFja2V0KHByaXYsIHNrYik7CisJcHJpdi0+d2xhbl9kZXYudXBsZF9sZW4gPSAocmVjdmxlbmd0aCAtIE1FU1NBR0VfSEVBREVSX0xFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2NtZHJlcXVlc3QoaW50IHJlY3ZsZW5ndGgsIHU4ICpyZWN2YnVmZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwLAorCQkJCSAgICAgIHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwl1OCAqY21kYnVmOworCWlmIChyZWN2bGVuZ3RoID4gTVJWRFJWX1NJWkVfT0ZfQ01EX0JVRkZFUikgeworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiVGhlIHJlY2VpdmUgYnVmZmVyIGlzIHRvbyBsYXJnZVxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkvKiB0YWtlIGNhcmUgb2YgY3VyX2NtZCA9IE5VTEwgY2FzZSBieSByZWFkaW5nIHRoZQorCSAqIGRhdGEgdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLworCWlmICghcHJpdi0+YWRhcHRlci0+Y3VyX2NtZCkgeworCQljbWRidWYgPSBwcml2LT53bGFuX2Rldi51cGxkX2J1ZjsKKwkJcHJpdi0+YWRhcHRlci0+aGlzcmVnY3B5ICY9IH5oaXNfY21kdXBsZHJkeTsKKwl9IGVsc2UKKwkJY21kYnVmID0gcHJpdi0+YWRhcHRlci0+Y3VyX2NtZC0+YnVmdmlydHVhbGFkZHI7CisKKwljYXJkcC0+dXNiX2ludF9jYXVzZSB8PSBoaXNfY21kdXBsZHJkeTsKKwlwcml2LT53bGFuX2Rldi51cGxkX2xlbiA9IChyZWN2bGVuZ3RoIC0gTUVTU0FHRV9IRUFERVJfTEVOKTsKKwltZW1jcHkoY21kYnVmLCByZWN2YnVmZiArIE1FU1NBR0VfSEVBREVSX0xFTiwKKwkgICAgICAgcHJpdi0+d2xhbl9kZXYudXBsZF9sZW4pOworCisJa2ZyZWVfc2tiKHNrYik7CisJbGliZXJ0YXNfaW50ZXJydXB0KHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJc3Bpbl91bmxvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkgICAgIldha2UgdXAgbWFpbiB0aHJlYWQgdG8gaGFuZGxlIGNtZCByZXNwb25zZVxuIik7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHJlYWRzIG9mIHRoZSBwYWNrZXQgaW50byB0aGUgdXBsb2FkIGJ1ZmYsCisgKiAgd2FrZSB1cCB0aGUgbWFpbiB0aHJlYWQgYW5kIGluaXRpYWxpc2UgdGhlIFJ4IGNhbGxhY2suCisgKgorICogIEBwYXJhbSB1cmIJCXBvaW50ZXIgdG8gc3RydWN0IHVyYgorICogIEByZXR1cm4gCSAgIAlOL0EKKyAqLworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCByZWFkX2NiX2luZm8gKnJpbmZvID0gKHN0cnVjdCByZWFkX2NiX2luZm8gKil1cmItPmNvbnRleHQ7CisJd2xhbl9wcml2YXRlICpwcml2ID0gcmluZm8tPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJpbmZvLT5za2I7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSAoc3RydWN0IHVzYl9jYXJkX3JlYyAqKXByaXYtPndsYW5fZGV2LmNhcmQ7CisKKwlpbnQgcmVjdmxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwl1OCAqcmVjdmJ1ZmYgPSBOVUxMOworCXUzMiByZWN2dHlwZTsKKworCUVOVEVSKCk7CisKKwlpZiAocmVjdmxlbmd0aCkgeworCQlpZiAodXJiLT5zdGF0dXMpIHsKKwkJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJCSAgICAiVVJCIHN0YXR1cyBpcyBmYWlsZWRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlnb3RvIHNldHVwX2Zvcl9uZXh0OworCQl9CisKKwkJcmVjdmJ1ZmYgPSBza2ItPmRhdGEgKyBJUEZJRUxEX0FMSUdOX09GRlNFVDsKKwkJbWVtY3B5KCZyZWN2dHlwZSwgcmVjdmJ1ZmYsIHNpemVvZih1MzIpKTsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlJlY3YgbGVuZ3RoID0gMHgleFxuIiwgcmVjdmxlbmd0aCk7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJSZWNlaXZlIHR5cGUgPSAweCVYXG4iLCByZWN2dHlwZSk7CisJCXJlY3Z0eXBlID0gbGUzMl90b19jcHUocmVjdnR5cGUpOworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiUmVjZWl2ZSB0eXBlIGFmdGVyID0gMHglWFxuIiwgcmVjdnR5cGUpOworCX0gZWxzZSBpZiAodXJiLT5zdGF0dXMpCisJCWdvdG8gcnhfZXhpdDsKKworCisJc3dpdGNoIChyZWN2dHlwZSkgeworCWNhc2UgQ01EX1RZUEVfREFUQToKKwkJcHJvY2Vzc19jbWR0eXBlZGF0YShyZWN2bGVuZ3RoLCBza2IsIGNhcmRwLCBwcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9UWVBFX1JFUVVFU1Q6CisJCXByb2Nlc3NfY21kcmVxdWVzdChyZWN2bGVuZ3RoLCByZWN2YnVmZiwgc2tiLCBjYXJkcCwgcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBDTURfVFlQRV9JTkRJQ0FUSU9OOgorCQkvKiBFdmVudCBjYXVzZSBoYW5kbGluZyAqLworCQlzcGluX2xvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJY2FyZHAtPnVzYl9ldmVudF9jYXVzZSA9ICoodTMyICopIChyZWN2YnVmZiArIE1FU1NBR0VfSEVBREVSX0xFTik7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCIqKkVWRU5UKiogMHglWFxuIiwKKwkJCSAgICBjYXJkcC0+dXNiX2V2ZW50X2NhdXNlKTsKKwkJaWYgKGNhcmRwLT51c2JfZXZlbnRfY2F1c2UgJiAweGZmZmYwMDAwKSB7CisJCQlsaWJlcnRhc19zZW5kX3R4X2ZlZWRiYWNrKHByaXYpOworCQkJYnJlYWs7CisJCX0KKwkJY2FyZHAtPnVzYl9ldmVudF9jYXVzZSA9IGxlMzJfdG9fY3B1KGNhcmRwLT51c2JfZXZlbnRfY2F1c2UpIDw8IDM7CisJCWNhcmRwLT51c2JfaW50X2NhdXNlIHw9IGhpc19jYXJkZXZlbnQ7CisJCWtmcmVlX3NrYihza2IpOworCQlsaWJlcnRhc19pbnRlcnJ1cHQocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJZ290byByeF9leGl0OworCWRlZmF1bHQ6CisJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9CisKK3NldHVwX2Zvcl9uZXh0OgorCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworcnhfZXhpdDoKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZG93bmxvYWRzIGRhdGEgdG8gRlcKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHR5cGUJCXR5cGUgb2YgZGF0YQorICogIEBwYXJhbSBidWYJCXBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAqICBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0ZXMKKyAqICBAcmV0dXJuIAkgICAJMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCB0eXBlLCB1OCAqIHBheWxvYWQsIHUxNiBuYikKK3sKKwlpbnQgcmV0ID0gLTE7CisJdTMyIHRtcDsKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IChzdHJ1Y3QgdXNiX2NhcmRfcmVjICopcHJpdi0+d2xhbl9kZXYuY2FyZDsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCIqKiogdHlwZSA9ICV1XG4iLCB0eXBlKTsKKwlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwic2l6ZSBhZnRlciA9ICVkXG4iLCBuYik7CisKKwlpZiAodHlwZSA9PSBNVk1TX0NNRCkgeworCQl0bXAgPSBjcHVfdG9fbGUzMihDTURfVFlQRV9SRVFVRVNUKTsKKwkJcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50ID0gRE5MRF9DTURfU0VOVDsKKwkJbWVtY3B5KGNhcmRwLT5idWxrX291dF9idWZmZXIsICh1OCAqKSAmIHRtcCwKKwkJICAgICAgIE1FU1NBR0VfSEVBREVSX0xFTik7CisKKwl9IGVsc2UgeworCQl0bXAgPSBjcHVfdG9fbGUzMihDTURfVFlQRV9EQVRBKTsKKwkJcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50ID0gRE5MRF9EQVRBX1NFTlQ7CisJCW1lbWNweShjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCAodTggKikgJiB0bXAsCisJCSAgICAgICBNRVNTQUdFX0hFQURFUl9MRU4pOworCX0KKworCW1lbWNweSgoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciArIE1FU1NBR0VfSEVBREVSX0xFTiksIHBheWxvYWQsIG5iKTsKKworCXJldCA9CisJICAgIHVzYl90eF9ibG9jayhwcml2LCBjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCBuYiArIE1FU1NBR0VfSEVBREVSX0xFTik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsZWQgd2l0aCBhZGFwdGVyLT5kcml2ZXJfbG9jayBoZWxkICovCitpbnQgbGliZXJ0YXNfc2JpX2dldF9pbnRfc3RhdHVzKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogaXJlZykKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisKKwkqaXJlZyA9IGNhcmRwLT51c2JfaW50X2NhdXNlOworCWNhcmRwLT51c2JfaW50X2NhdXNlID0gMDsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCJJbnQgY2F1c2UgaXMgMHglWFxuIiwgKmlyZWcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsaWJlcnRhc19zYmlfcmVhZF9ldmVudF9jYXVzZSh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKwlwcml2LT5hZGFwdGVyLT5ldmVudGNhdXNlID0gY2FyZHAtPnVzYl9ldmVudF9jYXVzZTsKKwkvKiBSZS1zdWJtaXQgcnggdXJiIGhlcmUgdG8gYXZvaWQgZXZlbnQgbG9zdCBpc3N1ZSAqLworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworCXJldHVybiAwOworfQorCitpbnQgcmVzZXRfZGV2aWNlKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmVzZXQsCisJCQkJICAgIGNtZF9hY3RfaGFsdCwgMCwgMCwgTlVMTCk7CisJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGxpYmVydGFzX3NiaV91bnJlZ2lzdGVyX2Rldih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQgPSAwOworCisJLyogTmVlZCB0byBzZW5kIGEgUmVzZXQgY29tbWFuZCB0byBkZXZpY2UgYmVmb3JlIFVTQiByZXNvdXJjZXMgZnJlZWQKKwkgKiBhbmQgd2xhbl9yZW1vdmVfY2FyZCgpIGNhbGxlZCwgdGhlbiBkZXZpY2UgY2FuIGhhbmRsZSBGVyBkb3dubG9hZAorCSAqIGFnYWluLgorCSAqLworCWlmIChwcml2KQorCQlyZXNldF9kZXZpY2UocHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZWdpc3RlciB1c2IgZGV2aWNlIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcgorICogIEBwYXJhbQkJcHJpdiBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEByZXR1cm4JCTAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYod2xhbl9wcml2YXRlICogcHJpdikKK3sKKworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gKHN0cnVjdCB1c2JfY2FyZF9yZWMgKilwcml2LT53bGFuX2Rldi5jYXJkOworCUVOVEVSKCk7CisKKwljYXJkcC0+cHJpdiA9IHByaXY7CisJY2FyZHAtPmV0aF9kZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJcHJpdi0+aG90cGx1Z19kZXZpY2UgPSAmKGNhcmRwLT51ZGV2LT5kZXYpOworCisJU0VUX05FVERFVl9ERVYoY2FyZHAtPmV0aF9kZXYsICYoY2FyZHAtPnVkZXYtPmRldikpOworCisJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJ1ZGV2IHBvaW50ZXIgaXMgYXQgJXBcbiIsCisJCSAgICBjYXJkcC0+dWRldik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKKworaW50IGxpYmVydGFzX3NiaV9wcm9nX2Zpcm13YXJlKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSBwcml2LT53bGFuX2Rldi5jYXJkOworCWludCBpID0gMDsKKwlzdGF0aWMgaW50IHJlc2V0X2NvdW50ID0gMTA7CisKKwlFTlRFUigpOworCisJY2FyZHAtPnJpbmZvLnByaXYgPSBwcml2OworCityZXN0YXJ0OgorCWlmIChpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQocHJpdikgPCAwKSB7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiVVJCIHN1Ym1pc3Npb24gaXMgZmFpbGVkXG4iKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECisJY2FyZHAtPmJvb3RjbWRyZXNwID0gMDsKKwlkbyB7CisJCWludCBqID0gMDsKKwkJaSsrOworCQkvKiBJc3N1ZSBCb290IGNvbW1hbmQgPSAxLCBCb290IGZyb20gRG93bmxvYWQtRlcgKi8KKwkJaWZfdXNiX2lzc3VlX2Jvb3RfY29tbWFuZChwcml2LCBCT09UX0NNRF9GV19CWV9VU0IpOworCQkvKiB3YWl0IGZvciBjb21tYW5kIHJlc3BvbnNlICovCisJCWRvIHsKKwkJCWorKzsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJCX0gd2hpbGUgKGNhcmRwLT5ib290Y21kcmVzcCA9PSAwICYmIGogPCAxMCk7CisJfSB3aGlsZSAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDAgJiYgaSA8IDUpOworCisJaWYgKGNhcmRwLT5ib290Y21kcmVzcCA9PSAwKSB7CisJCWlmICgtLXJlc2V0X2NvdW50ID49IDApIHsKKwkJCWxpYmVydGFzX2RvX3Jlc2V0KHByaXYpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWkgPSAwOworCXByaXYtPmFkYXB0ZXItPmZ3X3JlYWR5ID0gMDsKKworCWNhcmRwLT50b3RhbGJ5dGVzID0gMDsKKwljYXJkcC0+ZndsYXN0Ymxrc2VudCA9IDA7CisJY2FyZHAtPkNSQ19PSyA9IDE7CisJY2FyZHAtPmZ3ZG5sZG92ZXIgPSAwOworCWNhcmRwLT5md3NlcW51bSA9IC0xOworCWNhcmRwLT50b3RhbGJ5dGVzID0gMDsKKwljYXJkcC0+ZndmaW5hbGJsayA9IDA7CisKKwlpZl9wcm9nX2Zpcm13YXJlKHByaXYpOworCisJZG8geworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwiV2xhbiBzY2hlZCB0aW1lb3V0XG4iKTsKKwkJaSsrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOworCQlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkIHx8IGkgPj0gMjApCisJCQlicmVhazsKKwl9IHdoaWxlICghY2FyZHAtPmZ3ZG5sZG92ZXIpOworCisJaWYgKCFjYXJkcC0+Zndkbmxkb3ZlcikgeworCQlsYnNfcHJfaW5mbygiZmFpbGVkIHRvIGxvYWQgZncsIHJlc2V0dGluZyBkZXZpY2UhXG4iKTsKKwkJaWYgKC0tcmVzZXRfY291bnQgPj0gMCkgeworCQkJbGliZXJ0YXNfZG9fcmVzZXQocHJpdik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKworCQlsYnNfcHJfaW5mbygiRlcgZG93bmxvYWQgZmFpbHVyZSwgdGltZSA9ICVkIG1zXG4iLCBpICogMTAwKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworCisJLyogRGVsYXkgMjAwIG1zIHRvIHdhaXRpbmcgZm9yIHRoZSBGVyByZWFkeSAqLworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCk7CisKKwlwcml2LT5hZGFwdGVyLT5md19yZWFkeSA9IDE7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgR2l2ZW4gYSB1c2JfY2FyZF9yZWMgcmV0dXJuIGl0cyB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gY2FyZAkJcG9pbnRlciB0byBhIHVzYl9jYXJkX3JlYworICogIEByZXR1cm4gCSAgIAlwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICovCit3bGFuX3ByaXZhdGUgKmxpYmVydGFzX3NiaV9nZXRfcHJpdih2b2lkICpjYXJkKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gY2FyZDsKKwlyZXR1cm4gY2FyZHAtPnByaXY7Cit9CisKKyNpZmRlZiBFTkFCTEVfUE0KK2ludCBsaWJlcnRhc19zYmlfc3VzcGVuZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfc2JpX3Jlc3VtZSh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaWZfdXNiX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBjYXJkcC0+cHJpdjsKKworCUVOVEVSKCk7CisKKwlpZiAocHJpdi0+YWRhcHRlci0+cHNzdGF0ZSAhPSBQU19TVEFURV9GVUxMX1BPV0VSKQorCQlyZXR1cm4gLTE7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGNhcmRwLT5ldGhfZGV2KTsKKworCS8qIFVubGluayB0eCAmIHJ4IHVyYiAqLworCXVzYl9raWxsX3VyYihjYXJkcC0+dHhfdXJiKTsKKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnJ4X3VyYik7CisKKwljYXJkcC0+cnhfdXJiX3JlY2FsbCA9IDE7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmX3VzYl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJRU5URVIoKTsKKworCWNhcmRwLT5yeF91cmJfcmVjYWxsID0gMDsKKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKGNhcmRwLT5wcml2KTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goY2FyZHAtPmV0aF9kZXYpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGlmX3VzYl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgaWZfdXNiX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGlmX3VzYl9kcml2ZXIgPSB7CisJLyogZHJpdmVyIG5hbWUgKi8KKwkubmFtZSA9IHVzYmRyaXZlcl9uYW1lLAorCS8qIHByb2JlIGZ1bmN0aW9uIG5hbWUgKi8KKwkucHJvYmUgPSBpZl91c2JfcHJvYmUsCisJLyogZGlzY29ubmVjdCBmdW5jdGlvbiAgbmFtZSAqLworCS5kaXNjb25uZWN0ID0gaWZfdXNiX2Rpc2Nvbm5lY3QsCisJLyogZGV2aWNlIHNpZ25hdHVyZSB0YWJsZSAqLworCS5pZF90YWJsZSA9IGlmX3VzYl90YWJsZSwKKwkuc3VzcGVuZCA9IGlmX3VzYl9zdXNwZW5kLAorCS5yZXN1bWUgPSBpZl91c2JfcmVzdW1lLAorfTsKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGRyaXZlci4KKyAqICBAcGFyYW0gYWRkCQlwb2ludGVyIHRvIGFkZF9jYXJkIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgQHBhcmFtIHJlbW92ZQlwb2ludGVyIHRvIHJlbW92ZSBjYXJkIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgQHBhcmFtIGFyZwkJcG9pbnRlciB0byBjYWxsIGJhY2sgZnVuY3Rpb24gcGFyYW1ldGVyCisgKiAgQHJldHVybiAJICAgCWR1bW15IHN1Y2Nlc3MgdmFyaWFibGUKKyAqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcih2b2lkKQoreworCS8qCisJICogQVBJIHJlZ2lzdGVycyB0aGUgTWFydmVsbCBVU0IgZHJpdmVyCisJICogdG8gdGhlIFVTQiBzeXN0ZW0KKwkgKi8KKwl1c2JfcmVnaXN0ZXIoJmlmX3VzYl9kcml2ZXIpOworCisJLyogUmV0dXJuIHN1Y2Nlc3MgdG8gd2xhbiBsYXllciAqLworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHVzYiBkcml2ZXIuCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCit2b2lkIGxpYmVydGFzX3NiaV91bnJlZ2lzdGVyKHZvaWQpCit7CisJLyogQVBJIHVucmVnaXN0ZXJzIHRoZSBkcml2ZXIgZnJvbSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmlmX3VzYl9kcml2ZXIpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1MTE2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbiBmb3IgVVNCIGludGVyZmFjZS4KKyAgKi8KKyNkZWZpbmUgQ01EX1RZUEVfUkVRVUVTVCAgICAgICAgICAgICAgICAweEYwMERGQUNFCisjZGVmaW5lIENNRF9UWVBFX0RBVEEgICAgICAgICAgICAgICAgICAgMHhCRUFEQzBERQorI2RlZmluZSBDTURfVFlQRV9JTkRJQ0FUSU9OICAgICAgICAgICAgIDB4QkVFRkZBQ0UKKworI2RlZmluZSBJUEZJRUxEX0FMSUdOX09GRlNFVAkyCisKKyNkZWZpbmUgVVNCODM4OF9WSURfMQkweDEyODYKKyNkZWZpbmUgVVNCODM4OF9QSURfMQkweDIwMDEKKyNkZWZpbmUgVVNCODM4OF9WSURfMgkweDA1YTMKKyNkZWZpbmUgVVNCODM4OF9QSURfMgkweDgzODgKKworI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECisjZGVmaW5lIEJPT1RfQ01EX0ZXX0JZX1VTQiAgICAgMHgwMQorI2RlZmluZSBCT09UX0NNRF9GV19JTl9FRVBST00gIDB4MDIKKyNkZWZpbmUgQk9PVF9DTURfVVBEQVRFX0JPT1QyICAweDAzCisjZGVmaW5lIEJPT1RfQ01EX1VQREFURV9GVyAgICAgMHgwNAorI2RlZmluZSBCT09UX0NNRF9NQUdJQ19OVU1CRVIgIDB4NEM1NjUyNEQgICAvKiBNPT4weDRELFI9PjB4NTIsVj0+MHg1NixMPT4weDRDICovCisKK3N0cnVjdCBib290Y21kc3RyCit7CisJdTMyIHUzMm1hZ2ljbnVtYmVyOworCXU4ICB1OGNtZF90YWc7CisJdTggIGF1OGR1bXlbMTFdOworfTsKKworI2RlZmluZSBCT09UX0NNRF9SRVNQX09LICAgICAweDAwMDEKKyNkZWZpbmUgQk9PVF9DTURfUkVTUF9GQUlMICAgMHgwMDAwCisKK3N0cnVjdCBib290Y21kcmVzcFN0cgoreworCXUzMiB1MzJtYWdpY251bWJlcjsKKwl1OCAgdThjbWRfdGFnOworCXU4ICB1OHJlc3VsdDsKKwl1OCAgYXU4ZHVteVsyXTsKK307CisjZW5kaWYgLyogU1VQUE9SVF9CT09UX0NPTU1BTkQgKi8KKworLyogcmVhZCBjYWxsYmFjayBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCByZWFkX2NiX2luZm8geworICAgICAgICB3bGFuX3ByaXZhdGUgKnByaXY7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7Cit9OworCisvKiogVVNCIGNhcmQgZGVzY3JpcHRpb24gc3RydWN0dXJlKi8KK3N0cnVjdCB1c2JfY2FyZF9yZWMgeworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1cmIgKnJ4X3VyYiwgKnR4X3VyYjsKKwl2b2lkICpwcml2OworCXN0cnVjdCByZWFkX2NiX2luZm8gcmluZm87CisKKwlpbnQgYnVsa19pbl9zaXplOworCXU4IGJ1bGtfaW5fZW5kcG9pbnRBZGRyOworCisJdTggKmJ1bGtfb3V0X2J1ZmZlcjsKKwlpbnQgYnVsa19vdXRfc2l6ZTsKKwl1OCBidWxrX291dF9lbmRwb2ludEFkZHI7CisKKwl1OCBDUkNfT0s7CisJdTMyIGZ3c2VxbnVtOworCXUzMiBsYXN0c2VxbnVtOworCXUzMiB0b3RhbGJ5dGVzOworCXUzMiBmd2xhc3RibGtzZW50OworCXU4IGZ3ZG5sZG92ZXI7CisJdTggZndmaW5hbGJsazsKKworCXUzMiB1c2JfZXZlbnRfY2F1c2U7CisJdTggdXNiX2ludF9jYXVzZTsKKworCXU4IHJ4X3VyYl9yZWNhbGw7CisKKwl1OCBib290Y21kcmVzcDsKK307CisKKy8qKiBmd2hlYWRlciAqLworc3RydWN0IGZ3aGVhZGVyIHsKKwl1MzIgZG5sZGNtZDsKKwl1MzIgYmFzZWFkZHI7CisJdTMyIGRhdGFsZW5ndGg7CisJdTMyIENSQzsKK307CisKKyNkZWZpbmUgRldfTUFYX0RBVEFfQkxLX1NJWkUJNjAwCisvKiogRldEYXRhICovCitzdHJ1Y3QgRldEYXRhIHsKKwlzdHJ1Y3QgZndoZWFkZXIgZndoZWFkZXI7CisJdTMyIHNlcW51bTsKKwl1OCBkYXRhW0ZXX01BWF9EQVRBX0JMS19TSVpFXTsKK307CisKKy8qKiBmd3N5bmNoZWFkZXIgKi8KK3N0cnVjdCBmd3N5bmNoZWFkZXIgeworCXUzMiBjbWQ7CisJdTMyIHNlcW51bTsKK307CisKKyNkZWZpbmUgRldfSEFTX0RBVEFfVE9fUkVDVgkJMHgwMDAwMDAwMQorI2RlZmluZSBGV19IQVNfTEFTVF9CTE9DSwkJMHgwMDAwMDAwNAorCisjZGVmaW5lIEZXX0RBVEFfWE1JVF9TSVpFIFwKKwlzaXplb2Yoc3RydWN0IGZ3aGVhZGVyKSArIGZ3ZGF0YS0+ZndoZWFkZXIuZGF0YWxlbmd0aCArIHNpemVvZih1MzIpCisKK2ludCB1c2JfdHhfYmxvY2sod2xhbl9wcml2YXRlICpwcml2LCB1OCAqcGF5bG9hZCwgdTE2IG5iKTsKK3ZvaWQgaWZfdXNiX2ZyZWUoc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHApOworaW50IGlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQod2xhbl9wcml2YXRlICpwcml2LCBpbnQgaXZhbHVlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lvY3RsLmMKQEAgLTAsMCArMSwyNTAwIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgaW9jdGwgZnVuY3Rpb25zCisgICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImpvaW4uaCIKKyNpbmNsdWRlICJ3ZXh0LmgiCisKKyNkZWZpbmUgTUFYX1NDQU5fQ0VMTF9TSVpFICAgICAgKElXX0VWX0FERFJfTEVOICsgXAorCQkJCUlXX0VTU0lEX01BWF9TSVpFICsgXAorCQkJCUlXX0VWX1VJTlRfTEVOICsgSVdfRVZfRlJFUV9MRU4gKyBcCisJCQkJSVdfRVZfUVVBTF9MRU4gKyBJV19FU1NJRF9NQVhfU0laRSArIFwKKwkJCQlJV19FVl9QQVJBTV9MRU4gKyA0MCkJLyogNDAgZm9yIFdQQUlFICovCisKKyNkZWZpbmUgV0FJVF9GT1JfU0NBTl9SUkVTVUxUX01BWF9USU1FICgxMCAqIEhaKQorCitzdGF0aWMgaW50IHNldHJ4YW50ZW5uYSh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKG1vZGUgIT0gUkZfQU5URU5OQV8xICYmIG1vZGUgIT0gUkZfQU5URU5OQV8yCisJICAgICYmIG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSBtb2RlOworCisJbGJzX3ByX2RlYnVnKDEsICJTRVQgUlggQW50ZW5uYSBtb2RlIHRvIDB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9yZl9hbnRlbm5hLAorCQkJCSAgICBjbWRfYWN0X3NldF9yeCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAmYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXR0eGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgaW50IG1vZGUpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWlmICgobW9kZSAhPSBSRl9BTlRFTk5BXzEpICYmIChtb2RlICE9IFJGX0FOVEVOTkFfMikKKwkgICAgJiYgKG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gbW9kZTsKKworCWxic19wcl9kZWJ1ZygxLCAiU0VUIFRYIEFudGVubmEgbW9kZSB0byAweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKKwkJCQkgICAgY21kX2FjdF9zZXRfdHgsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkgICAgJmFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRyeGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvLyBjbGVhciBpdCwgc28gd2Ugd2lsbCBrbm93IGlmIHRoZSB2YWx1ZQorCS8vIHJldHVybmVkIGJlbG93IGlzIGNvcnJlY3Qgb3Igbm90LgorCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKKwkJCQkgICAgY21kX2FjdF9nZXRfcngsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJHZXQgUnggQW50ZW5uYSBtb2RlOjB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNHgiLCBhZGFwdGVyLT5yeGFudGVubmFtb2RlKSArIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0dHhhbnRlbm5hKHdsYW5fcHJpdmF0ZSAqIHByaXYsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJLy8gY2xlYXIgaXQsIHNvIHdlIHdpbGwga25vdyBpZiB0aGUgdmFsdWUKKwkvLyByZXR1cm5lZCBiZWxvdyBpcyBjb3JyZWN0IG9yIG5vdC4KKwlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gMDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3JmX2FudGVubmEsCisJCQkJICAgIGNtZF9hY3RfZ2V0X3R4LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiR2V0IFR4IEFudGVubmEgbW9kZToweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDR4IiwgYWRhcHRlci0+dHhhbnRlbm5hbW9kZSkgKyAxOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X3JlZ2lvbih3bGFuX3ByaXZhdGUgKiBwcml2LCB1MTYgcmVnaW9uX2NvZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVJWRFJWX01BWF9SRUdJT05fQ09ERTsgaSsrKSB7CisJCS8vIHVzZSB0aGUgcmVnaW9uIGNvZGUgdG8gc2VhcmNoIGZvciB0aGUgaW5kZXgKKwkJaWYgKHJlZ2lvbl9jb2RlID09IGxpYmVydGFzX3JlZ2lvbl9jb2RlX3RvX2luZGV4W2ldKSB7CisJCQlwcml2LT5hZGFwdGVyLT5yZWdpb250YWJsZWluZGV4ID0gKHUxNikgaTsKKwkJCXByaXYtPmFkYXB0ZXItPnJlZ2lvbmNvZGUgPSByZWdpb25fY29kZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gaWYgaXQncyB1bmlkZW50aWZpZWQgcmVnaW9uIGNvZGUKKwlpZiAoaSA+PSBNUlZEUlZfTUFYX1JFR0lPTl9DT0RFKSB7CisJCWxic19wcl9kZWJ1ZygxLCAicmVnaW9uIENvZGUgbm90IGlkZW50aWZpZWRcbiIpOworCQlMRUFWRSgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxpYmVydGFzX3NldF9yZWdpb250YWJsZShwcml2LCBwcml2LT5hZGFwdGVyLT5yZWdpb25jb2RlLCAwKSkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgRmlybXdhcmUgd2FrZXVwIG1ldGhvZAorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCSAgIAlBIHBvaW50ZXIgdG8gdXNlciBkYXRhCisgKiAgQHJldHVybiAJICAgCTAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl90eGNvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YTsKKwlFTlRFUigpOworCisJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhZGFwdGVyLT5wa3R0eGN0cmwsIHNpemVvZih1MzIpKSkgeworCQkJbGJzX3ByX2FsZXJ0KCJjb3B5X3RvX3VzZXIgZmFpbGVkIVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaW50KXdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIHsKKwkJCWxic19wcl9hbGVydCgiaW9jdGwgdG9vIG1hbnkgYXJncyFcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9hbGVydCgiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJYWRhcHRlci0+cGt0dHhjdHJsID0gKHUzMikgZGF0YTsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgTlVMTCBQYWNrYWdlIGdlbmVyYXRpb24gaW50ZXJ2YWwKKyAqCisgKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkgICAJQSBwb2ludGVyIHRvIHVzZXIgZGF0YQorICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fbnVsbF9wa3RfaW50ZXJ2YWwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YTsKKwlFTlRFUigpOworCisJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJZGF0YSA9IGFkYXB0ZXItPm51bGxwa3RpbnRlcnZhbDsKKworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkYXRhLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9hbGVydCggImNvcHlfdG9fdXNlciBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID4gMSkgeworCQkJbGJzX3ByX2FsZXJ0KCAiaW9jdGwgdG9vIG1hbnkgYXJncyFcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJYWRhcHRlci0+bnVsbHBrdGludGVydmFsID0gZGF0YTsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9yeGluZm8od2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YVsyXTsKKwlFTlRFUigpOworCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXTsKKwlkYXRhWzFdID0gYWRhcHRlci0+cnhwZF9yYXRlOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkgKiAyKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3Nucih3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBkYXRhWzRdOworCisJRU5URVIoKTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkgICAgIG1pbl90KHNpemVfdCwgd3JxLT51LmRhdGEubGVuZ3RoLCA0KSAqIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB8fCAoZGF0YVswXSA9PSAwKSB8fCAoZGF0YVswXSA9PSAxKSkgeworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJCSAgICBjbWRfODAyXzExX3Jzc2ksCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCQkgICAgMCwgTlVMTCk7CisKKwkJCWlmIChyZXQpIHsKKwkJCQlMRUFWRSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR107CisJCWRhdGFbMV0gPSBhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfQVZHXTsKKwkJZGF0YVsyXSA9IGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlkYXRhWzNdID0gYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gNDsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMCkgeworCQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXTsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMSkgeworCQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR107CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IDIpIHsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCX0gZWxzZSBpZiAoZGF0YVswXSA9PSAzKSB7CisJCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEU7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJfSBlbHNlCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fYmVhY29uX2ludGVydmFsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCBkYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWxic19wcl9kZWJ1ZygxLCAiV0xBTiBTRVQgQkVBQ09OIElOVEVSVkFMOiAlZFxuIiwgZGF0YSk7CisJCWlmICgoZGF0YSA+IE1SVkRSVl9NQVhfQkVBQ09OX0lOVEVSVkFMKQorCQkgICAgfHwgKGRhdGEgPCBNUlZEUlZfTUlOX0JFQUNPTl9JTlRFUlZBTCkpCisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQlhZGFwdGVyLT5iZWFjb25wZXJpb2QgPSBkYXRhOworCX0KKwlkYXRhID0gYWRhcHRlci0+YmVhY29ucGVyaW9kOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRhdGEsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcnNzaSh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCB0ZW1wOworCWludCBkYXRhID0gMDsKKwlpbnQgKnZhbDsKKworCUVOVEVSKCk7CisJZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CisJaWYgKChkYXRhID09IDApIHx8IChkYXRhID09IDEpKSB7CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9yc3NpLAorCQkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkgICAgMCwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAwOgorCisJCXRlbXAgPSBDQUxfUlNTSShhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdGVtcCA9IENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10pOworCQlicmVhazsKKwljYXNlIDI6CisJCXRlbXAgPSBDQUxfUlNTSShhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSwKKwkJCQlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfTk9BVkddKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0ZW1wID0gQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCSp2YWwgPSB0ZW1wOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9uZih3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCB0ZW1wOworCWludCBkYXRhID0gMDsKKwlpbnQgKnZhbDsKKworCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCWlmICgoZGF0YSA9PSAwKSB8fCAoZGF0YSA9PSAxKSkgeworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfcnNzaSwKKwkJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkJICAgIDAsIE5VTEwpOworCisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAwOgorCQl0ZW1wID0gYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddOworCQlicmVhazsKKwljYXNlIDE6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9BVkddOworCQlicmVhazsKKwljYXNlIDI6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlicmVhazsKKwljYXNlIDM6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwl0ZW1wID0gQ0FMX05GKHRlbXApOworCisJbGJzX3ByX2RlYnVnKDEsICIlczogdGVtcCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOworCXZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKwkqdmFsID0gdGVtcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF90eHJhdGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgKnBkYXRhOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwlpbnQgcmV0ID0gMDsKKwlhZGFwdGVyLT50eHJhdGUgPSAwOworCWxic19wcl9kZWJ1ZygxLCAid2xhbl9nZXRfdHhyYXRlX2lvY3RsXG4iKTsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV90eF9yYXRlX3F1ZXJ5LAorCQkJCSAgICBjbWRfYWN0X2dldCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGRhdGEgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJKnBkYXRhID0gKGludClhZGFwdGVyLT50eHJhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfYWRob2Nfc3RhdHVzX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWNoYXIgc3RhdHVzWzY0XTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCisJc3dpdGNoIChhZGFwdGVyLT5pbmZyYW1vZGUpIHsKKwljYXNlIHdsYW44MDJfMTFpYnNzOgorCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlpZiAoYWRhcHRlci0+YWRob2NjcmVhdGUpCisJCQkJbWVtY3B5KCZzdGF0dXMsICJBZGhvY1N0YXJ0ZWQiLCBzaXplb2Yoc3RhdHVzKSk7CisJCQllbHNlCisJCQkJbWVtY3B5KCZzdGF0dXMsICJBZGhvY0pvaW5lZCIsIHNpemVvZihzdGF0dXMpKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgmc3RhdHVzLCAiQWRob2NJZGxlIiwgc2l6ZW9mKHN0YXR1cykpOworCQl9CisJCWJyZWFrOworCWNhc2Ugd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlOgorCQltZW1jcHkoJnN0YXR1cywgIkluZnJhbW9kZSIsIHNpemVvZihzdGF0dXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWVtY3B5KCZzdGF0dXMsICJBdXRvVW5rbm93bm1vZGUiLCBzaXplb2Yoc3RhdHVzKSk7CisJCWJyZWFrOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAic3RhdHVzID0gJXNcbiIsIHN0YXR1cyk7CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHN0YXR1cykgKyAxOworCisJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAmc3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldC9HZXQgV1BBIElFCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0d3BhaWVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCkgeworCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gc2l6ZW9mKGFkYXB0ZXItPndwYV9pZSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiZmFpbGVkIHRvIGNvcHkgV1BBIElFLCB0b28gYmlnIFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoYWRhcHRlci0+d3BhX2llLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAgIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiZmFpbGVkIHRvIGNvcHkgV1BBIElFIFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhZGFwdGVyLT53cGFfaWVfbGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQlsYnNfcHJfZGVidWcoMSwgIlNldCB3cGFfaWVfbGVuPSVkIElFPSUjeFxuIiwgYWRhcHRlci0+d3BhX2llX2xlbiwKKwkJICAgICAgIGFkYXB0ZXItPndwYV9pZVswXSk7CisJCWxic19kYmdfaGV4KCJ3cGFfaWUiLCBhZGFwdGVyLT53cGFfaWUsIGFkYXB0ZXItPndwYV9pZV9sZW4pOworCQlpZiAoYWRhcHRlci0+d3BhX2llWzBdID09IFdQQV9JRSkKKwkJCWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA9IDE7CisJCWVsc2UgaWYgKGFkYXB0ZXItPndwYV9pZVswXSA9PSBXUEEyX0lFKQorCQkJYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCWVsc2UgeworCQkJYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKKwkJCWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJbWVtc2V0KGFkYXB0ZXItPndwYV9pZSwgMCwgc2l6ZW9mKGFkYXB0ZXItPndwYV9pZSkpOworCQlhZGFwdGVyLT53cGFfaWVfbGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQlsYnNfcHJfZGVidWcoMSwgIlJlc2V0IHdwYV9pZV9sZW49JWQgSUU9JSN4XG4iLAorCQkgICAgICAgYWRhcHRlci0+d3BhX2llX2xlbiwgYWRhcHRlci0+d3BhX2llWzBdKTsKKwkJYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKKwkJYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDA7CisJfQorCisJLy8gZW5hYmxlL2Rpc2FibGUgUlNOIGluIGZpcm13YXJlIGlmIFdQQSBpcyBlbmFibGVkL2Rpc2FibGVkCisJLy8gZGVwZW5kaW5nIG9uIHZhcmlhYmxlIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCBpcyBzZXQgb3Igbm90CisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZW5hYmxlX3JzbiwKKwkJCQkgICAgY21kX2FjdF9zZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgQXV0byBwcmVzY2FuCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkJCUEgcG9pbnRlciB0byBpd3JlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX3NldHByZXNjYW5faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJaW50IGRhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgKnZhbDsKKworCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCWxic19wcl9kZWJ1ZygxLCAiV0xBTl9TVUJDTURfU0VUX1BSRVNDQU4gJWRcbiIsIGRhdGEpOworCWFkYXB0ZXItPnByZXNjYW4gPSBkYXRhOworCisJdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCSp2YWwgPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X211bHRpcGxlX2R0aW1faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCXUzMiBtZHRpbTsKKwlpbnQgaWRhdGE7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlFTlRFUigpOworCisJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCW1kdGltID0gKHUzMikgaWRhdGE7CisJaWYgKCgobWR0aW0gPj0gTVJWRFJWX01JTl9NVUxUSVBMRV9EVElNKQorCSAgICAgJiYgKG1kdGltIDw9IE1SVkRSVl9NQVhfTVVMVElQTEVfRFRJTSkpCisJICAgIHx8IChtZHRpbSA9PSBNUlZEUlZfSUdOT1JFX01VTFRJUExFX0RUSU0pKSB7CisJCXByaXYtPmFkYXB0ZXItPm11bHRpcGxlZHRpbSA9IG1kdGltOworCQlyZXQgPSAwOworCX0KKwlpZiAocmV0KQorCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgcGFyYW1ldGVyLCBtdWx0aXBsZWR0aW0gbm90IGNoYW5nZWQuXG4iKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBhdXRoZW50aWNhdGlvbiBtb2RlCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0YXV0aGFsZ19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlpbnQgYWxnOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKHdycS0+dS5kYXRhLmZsYWdzID09IDApIHsKKwkJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKwkJYWxnID0gU1VCQ01EX0RBVEEod3JxKTsKKwl9IGVsc2UgeworCQkvL2Zyb20gd3BhX3N1cHBsaWNhbnQgc3ViY21kCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWxnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoYWxnKSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJhdXRoIGFsZyBpcyAlI3hcbiIsIGFsZyk7CisKKwlzd2l0Y2ggKGFsZykgeworCWNhc2UgQVVUSF9BTEdfU0hBUkVEX0tFWToKKwkJYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJYnJlYWs7CisJY2FzZSBBVVRIX0FMR19ORVRXT1JLX0VBUDoKKwkJYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSA9CisJCSAgICB3bGFuODAyXzExYXV0aG1vZGVuZXR3b3JrRUFQOworCQlicmVhazsKKwljYXNlIEFVVEhfQUxHX09QRU5fU1lTVEVNOgorCWRlZmF1bHQ6CisJCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgODAyLjF4IGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxCQkJQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXQ4MDIxeGF1dGhhbGdfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IGFsZzsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisKKwlpZiAod3JxLT51LmRhdGEuZmxhZ3MgPT0gMCkgeworCQkvL2Zyb20gaXdwcml2IHN1YmNtZAorCQlhbGcgPSBTVUJDTURfREFUQSh3cnEpOworCX0gZWxzZSB7CisJCS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJbGJzX3ByX2RlYnVnKDEsICI4MDIuMXggYXV0aCBhbGcgaXMgJSN4XG4iLCBhbGcpOworCXByaXYtPmFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gYWxnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0ZW5jcnlwdGlvbm1vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IG1vZGU7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJRU5URVIoKTsKKworCWlmICh3cnEtPnUuZGF0YS5mbGFncyA9PSAwKSB7CisJCS8vZnJvbSBpd3ByaXYgc3ViY21kCisJCW1vZGUgPSBTVUJDTURfREFUQSh3cnEpOworCX0gZWxzZSB7CisJCS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWxic19wcl9kZWJ1ZygxLCAiZW5jcnlwdGlvbiBtb2RlIGlzICUjeFxuIiwgbW9kZSk7CisJcHJpdi0+YWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSA9IG1vZGU7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RfbXR1KHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJaW50IG10dV9pbmNyZW1lbnQgPSAwOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmxpbmttb2RlID09IFdMQU5fTElOS01PREVfODAyXzExKQorCQltdHVfaW5jcmVtZW50ICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcik7CisKKwlpZiAocHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID09IFdMQU5fUkFESU9NT0RFX1JBRElPVEFQKQorCQltdHVfaW5jcmVtZW50ICs9IG1heChzaXplb2Yoc3RydWN0IHR4X3JhZGlvdGFwX2hkciksCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOworCXByaXYtPndsYW5fZGV2Lm5ldGRldi0+bXR1ID0gRVRIX0ZSQU1FX0xFTgorCSAgICAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKQorCSAgICArIG10dV9pbmNyZW1lbnQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgTGluay1MYXllciBMYXllciBtb2RlCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0X2xpbmttb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBtb2RlOworCisJbW9kZSA9IChpbnQpKChzdHJ1Y3QgaWZyZXEgKikoKHU4ICopIHJlcSArIDQpKS0+aWZyX2RhdGE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFdMQU5fTElOS01PREVfODAyXzM6CisJCXByaXYtPmFkYXB0ZXItPmxpbmttb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0xJTktNT0RFXzgwMl8xMToKKwkJcHJpdi0+YWRhcHRlci0+bGlua21vZGUgPSBtb2RlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfaW5mbygidXNiODM4OC01OiBpbnZhbGlkIGxpbmstbGF5ZXIgbW9kZSAoJSN4KVxuIiwKKwkJICAgICAgIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWxic19wcl9kZWJ1ZygxLCAidXNiODM4OC01OiBsaW5rLWxheWVyIG1vZGUgaXMgJSN4XG4iLCBtb2RlKTsKKworCWFkanVzdF9tdHUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBSYWRpbyBoZWFkZXIgbW9kZQorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX3NldF9yYWRpb21vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IG1vZGU7CisKKwltb2RlID0gKGludCkoKHN0cnVjdCBpZnJlcSAqKSgodTggKikgcmVxICsgNCkpLT5pZnJfZGF0YTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgV0xBTl9SQURJT01PREVfTk9ORToKKwkJcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUDoKKwkJcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJ1c2I4Mzg4LTU6IGludmFsaWQgcmFkaW8gaGVhZGVyIG1vZGUgKCUjeClcbiIsCisJCSAgICAgICBtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxic19wcl9kZWJ1ZygxLCAidXNiODM4OC01OiByYWRpby1oZWFkZXIgbW9kZSBpcyAlI3hcbiIsIG1vZGUpOworCisJYWRqdXN0X210dShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBEZWJ1ZyBoZWFkZXIgbW9kZQorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX3NldF9kZWJ1Z21vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJcHJpdi0+YWRhcHRlci0+ZGVidWdtb2RlID0gKGludCkoKHN0cnVjdCBpZnJlcSAqKQorCQkJCQkgKCh1OCAqKSByZXEgKyA0KSktPmlmcl9kYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX2dldHJ4YW50ZW5uYV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBsZW47CisJY2hhciBidWZbOF07CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJbGJzX3ByX2RlYnVnKDEsICJXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkFcbiIpOworCWxlbiA9IGdldHJ4YW50ZW5uYShwcml2LCBidWYpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gbGVuOworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmJ1ZiwgbGVuKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5VG9Vc2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX2dldHR4YW50ZW5uYV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBsZW47CisJY2hhciBidWZbOF07CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJbGJzX3ByX2RlYnVnKDEsICJXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkFcbiIpOworCWxlbiA9IGdldHR4YW50ZW5uYShwcml2LCBidWYpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gbGVuOworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmJ1ZiwgbGVuKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5VG9Vc2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldCB0aGUgTUFDIFRTRiB2YWx1ZSBmcm9tIHRoZSBmaXJtd2FyZQorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycSAgICAgICAgICBBIHBvaW50ZXIgdG8gaXdyZXEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBzcGFjZSB0byBzdG9yZSBhIFRTRiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZmlybXdhcmUKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAwIGlmIHN1Y2Nlc3NmdWw7IElPQ1RMIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9nZXRfdHNmX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXU2NCB0c2Z2YWw7CisJaW50IHJldDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfZ2V0X3RzZiwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmdHNmdmFsKTsKKworCWxic19wcl9kZWJ1ZygxLCAiSU9DVEw6IEdldCBUU0YgPSAweCUwMTZsbHhcbiIsIHRzZnZhbCk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJT0NUTDogR2V0IFRTRjsgY29tbWFuZCBleGVjIGZhaWxlZFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAmdHNmdmFsLAorCQkJCSBtaW5fdChzaXplX3QsIHdycS0+dS5kYXRhLmxlbmd0aCwKKwkJCQkgICAgIHNpemVvZih0c2Z2YWwpKSkgIT0gMCkgeworCisJCQlsYnNfcHJfZGVidWcoMSwgIklPQ1RMOiBHZXQgVFNGOyBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBHZXQvU2V0IGFkYXB0IHJhdGUKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCQkJQSBwb2ludGVyIHRvIGl3cmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9hZGFwdF9yYXRlc2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCByZXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YVsyXTsKKworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWlmICghd3JxLT51LmRhdGEubGVuZ3RoKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiR2V0IEFEQVBUIFJBVEUgU0VUXG4iKTsKKwkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCSAgICBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCwKKwkJCQkJICAgIGNtZF9hY3RfZ2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPmVuYWJsZWh3YXV0bzsKKwkJZGF0YVsxXSA9IGFkYXB0ZXItPnJhdGViaXRtYXA7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkgKiAyKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisjZGVmaW5lIEdFVF9UV09fSU5UCTIKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gR0VUX1RXT19JTlQ7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTZXQgQURBUFQgUkFURSBTRVRcbiIpOworCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkgICAgIHNpemVvZihpbnQpICogd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlhZGFwdGVyLT5lbmFibGVod2F1dG8gPSBkYXRhWzBdOworCQlhZGFwdGVyLT5yYXRlYml0bWFwID0gZGF0YVsxXTsKKwkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCSAgICBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCwKKwkJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgaW5hY3Rpdml0eSB0aW1lb3V0CisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkJCUEgcG9pbnRlciB0byBpd3JlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5faW5hY3Rpdml0eV90aW1lb3V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCByZXQ7CisJaW50IGRhdGEgPSAwOworCXUxNiB0aW1lb3V0ID0gMDsKKworCUVOVEVSKCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJLyogR2V0ICovCisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQsCisJCQkJCSAgICBjbWRfYWN0X2dldCwKKwkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkJICAgICZ0aW1lb3V0KTsKKwkJZGF0YSA9IHRpbWVvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRhdGEsIHNpemVvZihpbnQpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0ICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXRpbWVvdXQgPSBkYXRhOworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0LAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCSAgICAmdGltZW91dCk7CisJfQorCisJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2RvX2dldGxvZ19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0OworCWNoYXIgYnVmW0dFVExPR19CVUZTSVpFIC0gMV07CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWxic19wcl9kZWJ1ZygxLCAiIEdFVCBTVEFUU1xuIik7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9nZXRfbG9nLAorCQkJCSAgICAwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCXNwcmludGYoYnVmLCAiXG4gIG1jYXN0dHhmcmFtZSAldSBmYWlsZWQgJXUgcmV0cnkgJXUgIgorCQkJIm11bHRpcmV0cnkgJXUgZnJhbWVkdXAgJXUgIgorCQkJInJ0c3N1Y2Nlc3MgJXUgcnRzZmFpbHVyZSAldSBhY2tmYWlsdXJlICV1XG4iCisJCQkicnhmcmFnICV1IG1jYXN0cnhmcmFtZSAldSBmY3NlcnJvciAldSAiCisJCQkidHhmcmFtZSAldSB3ZXB1bmRlY3J5cHRhYmxlICV1ICIsCisJCQlhZGFwdGVyLT5sb2dtc2cubWNhc3R0eGZyYW1lLAorCQkJYWRhcHRlci0+bG9nbXNnLmZhaWxlZCwKKwkJCWFkYXB0ZXItPmxvZ21zZy5yZXRyeSwKKwkJCWFkYXB0ZXItPmxvZ21zZy5tdWx0aXJldHJ5LAorCQkJYWRhcHRlci0+bG9nbXNnLmZyYW1lZHVwLAorCQkJYWRhcHRlci0+bG9nbXNnLnJ0c3N1Y2Nlc3MsCisJCQlhZGFwdGVyLT5sb2dtc2cucnRzZmFpbHVyZSwKKwkJCWFkYXB0ZXItPmxvZ21zZy5hY2tmYWlsdXJlLAorCQkJYWRhcHRlci0+bG9nbXNnLnJ4ZnJhZywKKwkJCWFkYXB0ZXItPmxvZ21zZy5tY2FzdHJ4ZnJhbWUsCisJCQlhZGFwdGVyLT5sb2dtc2cuZmNzZXJyb3IsCisJCQlhZGFwdGVyLT5sb2dtc2cudHhmcmFtZSwKKwkJCWFkYXB0ZXItPmxvZ21zZy53ZXB1bmRlY3J5cHRhYmxlKTsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1ZikgKyAxOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGJ1Ziwgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zY2FuX3R5cGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJdTggYnVmWzEyXTsKKwl1OCAqb3B0aW9uW10gPSB7ICJhY3RpdmUiLCAicGFzc2l2ZSIsICJnZXQiLCB9OworCWludCBpLCBtYXhfb3B0aW9ucyA9IChzaXplb2Yob3B0aW9uKSAvIHNpemVvZihvcHRpb25bMF0pKTsKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogQ2Fubm90IHNldCBzY2FudHlwZSB3aGVuIDExRCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1Ziwgd3JxLT51LmRhdGEucG9pbnRlciwgbWluX3Qoc2l6ZV90LCBzaXplb2YoYnVmKSwKKwkJCQkJCQkgd3JxLT51LmRhdGEubGVuZ3RoKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGJzX3ByX2RlYnVnKDEsICJTY2FuIHR5cGUgT3B0aW9uID0gJXNcbiIsIGJ1Zik7CisKKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X29wdGlvbnM7IGkrKykgeworCQlpZiAoIXN0cmNtcChidWYsIG9wdGlvbltpXSkpCisJCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCWFkYXB0ZXItPnNjYW50eXBlID0gY21kX3NjYW5fdHlwZV9hY3RpdmU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYWRhcHRlci0+c2NhbnR5cGUgPSBjbWRfc2Nhbl90eXBlX3Bhc3NpdmU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG9wdGlvblthZGFwdGVyLT5zY2FudHlwZV0pICsgMTsKKworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJIG9wdGlvblthZGFwdGVyLT5zY2FudHlwZV0sCisJCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIFNjYW4gdHlwZSBJb2N0bCBPcHRpb25cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fc2Nhbl9tb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggYnVmWzEyXTsKKwl1OCAqb3B0aW9uW10gPSB7ICJic3MiLCAiaWJzcyIsICJhbnkiLCAiZ2V0IiB9OworCWludCBpLCBtYXhfb3B0aW9ucyA9IChzaXplb2Yob3B0aW9uKSAvIHNpemVvZihvcHRpb25bMF0pKTsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBtaW5fdChzaXplX3QsIHNpemVvZihidWYpLAorCQkJCQkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiU2NhbiBtb2RlIE9wdGlvbiA9ICVzXG4iLCBidWYpOworCisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworCisJZm9yIChpID0gMDsgaSA8IG1heF9vcHRpb25zOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYnVmLCBvcHRpb25baV0pKQorCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpKSB7CisKKwljYXNlIDA6CisJCWFkYXB0ZXItPnNjYW5tb2RlID0gY21kX2Jzc190eXBlX2JzczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhZGFwdGVyLT5zY2FubW9kZSA9IGNtZF9ic3NfdHlwZV9pYnNzOworCQlicmVhazsKKwljYXNlIDI6CisJCWFkYXB0ZXItPnNjYW5tb2RlID0gY21kX2Jzc190eXBlX2FueTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvcHRpb25bYWRhcHRlci0+c2Nhbm1vZGUgLSAxXSkgKyAxOworCisJCWxic19wcl9kZWJ1ZygxLCAiR2V0IFNjYW4gbW9kZSBPcHRpb24gPSAlc1xuIiwKKwkJICAgICAgIG9wdGlvblthZGFwdGVyLT5zY2FubW9kZSAtIDFdKTsKKworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gbW9kZSBsZW5ndGggJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSBvcHRpb25bYWRhcHRlci0+c2Nhbm1vZGUgLSAxXSwKKwkJCQkgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0KKwkJbGJzX3ByX2RlYnVnKDEsICJHRVQgU2NhbiB0eXBlIE9wdGlvbiBhZnRlciBjb3B5ID0gJXNcbiIsCisJCSAgICAgICAoY2hhciAqKXdycS0+dS5kYXRhLnBvaW50ZXIpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIFNjYW4gbW9kZSBJb2N0bCBPcHRpb25cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBHZXQvU2V0IEFkaG9jIEcgUmF0ZQorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCSAgIAlBIHBvaW50ZXIgdG8gdXNlciBkYXRhCisgKiAgQHJldHVybiAJICAgCTAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9kb19zZXRfZ3JhdGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YSwgZGF0YTE7CisJaW50ICp2YWw7CisKKwlFTlRFUigpOworCisJZGF0YTEgPSBTVUJDTURfREFUQSh3cnEpOworCXN3aXRjaCAoZGF0YTEpIHsKKwljYXNlIDA6CisJCWFkYXB0ZXItPmFkaG9jX2dyYXRlX2VuYWJsZWQgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCWFkYXB0ZXItPmFkaG9jX2dyYXRlX2VuYWJsZWQgPSAxOworCQlicmVhazsKKwljYXNlIDI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYXRhID0gYWRhcHRlci0+YWRob2NfZ3JhdGVfZW5hYmxlZDsKKwl2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJKnZhbCA9IGRhdGE7CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGV4MmludChjaGFyIGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gKGMgLSAnMCcpOworCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJcmV0dXJuIChjIC0gJ2EnICsgMTApOworCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJcmV0dXJuIChjIC0gJ0EnICsgMTApOworCXJldHVybiAtMTsKK30KKworLyogQ29udmVydCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIE1BQyBhZGRyZXNzICgieHg6eHg6eHg6eHg6eHg6eHgiKQorICAgaW50byBiaW5hcnkgZm9ybWF0ICg2IGJ5dGVzKS4KKworICAgVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgZWFjaCBieXRlIGlzIHJlcHJlc2VudGVkIHdpdGggMiBjaGFyYWN0ZXJzCisgICAoZS5nLiwgMTE6MjoxMToxMToxMToxMSBpcyBpbnZhbGlkKQorCisgKi8KK3N0YXRpYyBjaGFyICpldGhfc3RyMmFkZHIoY2hhciAqZXRoc3RyLCB1OCAqIGFkZHIpCit7CisJaW50IGksIHZhbCwgdmFsMjsKKwljaGFyICpwb3MgPSBldGhzdHI7CisKKwkvKiBnZXQgcmlkIG9mIGluaXRpYWwgYmxhbmtzICovCisJd2hpbGUgKCpwb3MgPT0gJyAnIHx8ICpwb3MgPT0gJ1x0JykKKwkJKytwb3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXZhbCA9IGhleDJpbnQoKnBvcysrKTsKKwkJaWYgKHZhbCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJdmFsMiA9IGhleDJpbnQoKnBvcysrKTsKKwkJaWYgKHZhbDIgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWFkZHJbaV0gPSAodmFsICogMTYgKyB2YWwyKSAmIDB4ZmY7CisKKwkJaWYgKGkgPCA1ICYmICpwb3MrKyAhPSAnOicpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHBvczsKK30KKworLyogdGhpcyB3cml0ZXMgeHg6eHg6eHg6eHg6eHg6eHggaW50byBldGhzdHIKKyAgIChldGhzdHIgbXVzdCBoYXZlIHNwYWNlIGZvciAxOCBjaGFycykgKi8KK3N0YXRpYyBpbnQgZXRoX2FkZHIyc3RyKHU4ICogYWRkciwgY2hhciAqZXRoc3RyKQoreworCWludCBpOworCWNoYXIgKnBvcyA9IGV0aHN0cjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJc3ByaW50Zihwb3MsICIlMDJ4IiwgYWRkcltpXSAmIDB4ZmYpOworCQlwb3MgKz0gMjsKKwkJaWYgKGkgPCA1KQorCQkJKnBvcysrID0gJzonOworCX0KKwlyZXR1cm4gMTc7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBBZGQgYW4gZW50cnkgdG8gdGhlIEJUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9idF9hZGRfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCWNoYXIgZXRoYWRkcnNfc3RyWzE4XTsKKwljaGFyICpwb3M7CisJdTggZXRoYWRkcltFVEhfQUxFTl07CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihldGhhZGRyc19zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICBzaXplb2YoZXRoYWRkcnNfc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwb3MgPSBldGhfc3RyMmFkZHIoZXRoYWRkcnNfc3RyLCBldGhhZGRyKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfaW5mbygiQlRfQUREOiBJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJCVDogYWRkaW5nICVzXG4iLCBldGhhZGRyc19zdHIpOworCUxFQVZFKCk7CisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX2J0X2FjY2VzcywKKwkJCQkgICAgICBjbWRfYWN0X2J0X2FjY2Vzc19hZGQsCisJCQkJICAgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBldGhhZGRyKSk7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgQlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X2RlbF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBldGhhZGRyc19zdHJbMThdOworCXU4IGV0aGFkZHJbRVRIX0FMRU5dOworCWNoYXIgKnBvczsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGV0aGFkZHJzX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwKKwkJCSAgIHNpemVvZihldGhhZGRyc19zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKHBvcyA9IGV0aF9zdHIyYWRkcihldGhhZGRyc19zdHIsIGV0aGFkZHIpKSA9PSBOVUxMKSB7CisJCWxic19wcl9pbmZvKCJJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJCVDogZGVsZXRpbmcgJXNcbiIsIGV0aGFkZHJzX3N0cik7CisKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICAgIGNtZF9idF9hY2Nlc3MsCisJCQkJICAgICAgY21kX2FjdF9idF9hY2Nlc3NfZGVsLAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgZXRoYWRkcikpOworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBSZXNldCBhbGwgZW50cmllcyBmcm9tIHRoZSBCVCB0YWJsZQorICogIEBwYXJhbSBwcml2ICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X3Jlc2V0X2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJRU5URVIoKTsKKworCWxic19wcl9hbGVydCggIkJUOiByZXNldHRpbmdcbiIpOworCisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgICBjbWRfYnRfYWNjZXNzLAorCQkJCSAgICAgIGNtZF9hY3RfYnRfYWNjZXNzX3Jlc2V0LAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCkpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgQlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X2xpc3RfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IHBvczsKKwljaGFyICphZGRyMTsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJLyogdXNlZCB0byBwYXNzIGlkIGFuZCBzdG9yZSB0aGUgYnQgZW50cnkgcmV0dXJuZWQgYnkgdGhlIEZXICovCisJdW5pb24geworCQlpbnQgaWQ7CisJCWNoYXIgYWRkcjFhZGRyMlsyICogRVRIX0FMRU5dOworCX0gcGFyYW07CisJc3RhdGljIGNoYXIgb3V0c3RyWzY0XTsKKwljaGFyICpwYnVmID0gb3V0c3RyOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKG91dHN0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKG91dHN0cikpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYXJhbS5pZCA9IHNpbXBsZV9zdHJ0b3VsKG91dHN0ciwgTlVMTCwgMTApOworCXBvcyA9IHNwcmludGYocGJ1ZiwgIiVkOiAiLCBwYXJhbS5pZCk7CisJcGJ1ZiArPSBwb3M7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX2J0X2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9idF9hY2Nlc3NfbGlzdCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAoY2hhciAqKSZwYXJhbSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJYWRkcjEgPSBwYXJhbS5hZGRyMWFkZHIyOworCisJCXBvcyA9IHNwcmludGYocGJ1ZiwgImlnbm9yaW5nIHRyYWZmaWMgZnJvbSAiKTsKKwkJcGJ1ZiArPSBwb3M7CisJCXBvcyA9IGV0aF9hZGRyMnN0cihhZGRyMSwgcGJ1Zik7CisJCXBidWYgKz0gcG9zOworCX0gZWxzZSB7CisJCXNwcmludGYocGJ1ZiwgIihudWxsKSIpOworCQlwYnVmICs9IHBvczsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4ob3V0c3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0c3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJCVF9MSVNUOiBDb3B5IHRvIHVzZXIgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBGaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBpbiBhbiBpbnB1dCBzdHJpbmcKKyAqICBAcGFyYW0gcHRyICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbnB1dCBwYXJhbWV0ZXIgc3RyaW5nCisgKiAgQHJldHVybiAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbmV4dCBwYXJhbWV0ZXIsIG9yIDAgaWYgbm8gcGFyYW1ldGVycyBsZWZ0LgorICovCitzdGF0aWMgY2hhciAqIG5leHRfcGFyYW0oY2hhciAqIHB0cikKK3sKKwlpZiAoIXB0cikgcmV0dXJuIE5VTEw7CisJd2hpbGUgKCpwdHIgPT0gJyAnIHx8ICpwdHIgPT0gJ1x0JykgKytwdHI7CisJcmV0dXJuICgqcHRyID09ICdcMCcpID8gTlVMTCA6IHB0cjsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIEFkZCBhbiBlbnRyeSB0byB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfYWRkX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0clsxMjhdOworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwljaGFyICpwdHI7CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihpbl9zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbl9zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKHB0ciA9IGV0aF9zdHIyYWRkcihpbl9zdHIsIGZ3dF9hY2Nlc3MuZGEpKSA9PSBOVUxMKSB7CisJCWxic19wcl9hbGVydCggIkZXVF9BREQ6IEludmFsaWQgTUFDIGFkZHJlc3MgMVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgocHRyID0gZXRoX3N0cjJhZGRyKHB0ciwgZnd0X2FjY2Vzcy5yYSkpID09IE5VTEwpIHsKKwkJbGJzX3ByX2FsZXJ0KCAiRldUX0FERDogSW52YWxpZCBNQUMgYWRkcmVzcyAyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwdHIgPSBuZXh0X3BhcmFtKHB0cikpKQorCQlmd3RfYWNjZXNzLm1ldHJpYyA9CisJCQljcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisJZWxzZQorCQlmd3RfYWNjZXNzLm1ldHJpYyA9IEZXVF9ERUZBVUxUX01FVFJJQzsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5kaXIgPSAodTgpc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLmRpciA9IEZXVF9ERUZBVUxUX0RJUjsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5zc24gPQorCQkJY3B1X3RvX2xlMzIoc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCkpOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5zc24gPSBGV1RfREVGQVVMVF9TU047CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MuZHNuID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3MuZHNuID0gRldUX0RFRkFVTFRfRFNOOworCisJaWYgKChwdHIgPSBuZXh0X3BhcmFtKHB0cikpKQorCQlmd3RfYWNjZXNzLmhvcGNvdW50ID0gc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLmhvcGNvdW50ID0gRldUX0RFRkFVTFRfSE9QQ09VTlQ7CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MudHRsID0gc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLnR0bCA9IEZXVF9ERUZBVUxUX1RUTDsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5leHBpcmF0aW9uID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3MuZXhwaXJhdGlvbiA9IEZXVF9ERUZBVUxUX0VYUElSQVRJT047CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3Muc2xlZXBtb2RlID0gKHU4KXNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5zbGVlcG1vZGUgPSBGV1RfREVGQVVMVF9TTEVFUE1PREU7CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3Muc25yID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3Muc25yID0gRldUX0RFRkFVTFRfU05SOworCisjaWZkZWYgREVCVUcKKwl7CisJCWNoYXIgZXRoYWRkcjFfc3RyWzE4XSwgZXRoYWRkcjJfc3RyWzE4XTsKKwkJZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIGV0aGFkZHIxX3N0cik7CisJCWV0aF9hZGRyMnN0cihmd3RfYWNjZXNzLnJhLCBldGhhZGRyMl9zdHIpOworCQlsYnNfcHJfZGVidWcoMSwgIkZXVF9BREQ6IGFkZGluZyAoZGE6JXMsJWkscmE6JXMpXG4iLCBldGhhZGRyMV9zdHIsCisJCSAgICAgICBmd3RfYWNjZXNzLmRpciwgZXRoYWRkcjJfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfQUREOiBzc246JXUgZHNuOiV1IG1ldDoldSBob3A6JXUgdHRsOiV1IGV4cDoldSBzbHA6JXUgc25yOiV1XG4iLAorCQkgICAgICAgZnd0X2FjY2Vzcy5zc24sIGZ3dF9hY2Nlc3MuZHNuLCBmd3RfYWNjZXNzLm1ldHJpYywKKwkJICAgICAgIGZ3dF9hY2Nlc3MuaG9wY291bnQsIGZ3dF9hY2Nlc3MudHRsLCBmd3RfYWNjZXNzLmV4cGlyYXRpb24sCisJCSAgICAgICBmd3RfYWNjZXNzLnNsZWVwbW9kZSwgZnd0X2FjY2Vzcy5zbnIpOworCX0KKyNlbmRpZgorCisJTEVBVkUoKTsKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZnd0X2FjY2VzcywKKwkJCQkJCSAgY21kX2FjdF9md3RfYWNjZXNzX2FkZCwKKwkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCQkJICAodm9pZCAqKSZmd3RfYWNjZXNzKSk7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfZGVsX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0cls2NF07CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCWNoYXIgKnB0cjsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGluX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGluX3N0cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgocHRyID0gZXRoX3N0cjJhZGRyKGluX3N0ciwgZnd0X2FjY2Vzcy5kYSkpID09IE5VTEwpIHsKKwkJbGJzX3ByX2FsZXJ0KCAiRldUX0RFTDogSW52YWxpZCBNQUMgYWRkcmVzcyAxXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwdHIgPSBldGhfc3RyMmFkZHIocHRyLCBmd3RfYWNjZXNzLnJhKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfYWxlcnQoICJGV1RfREVMOiBJbnZhbGlkIE1BQyBhZGRyZXNzIDJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MuZGlyID0gKHU4KXNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5kaXIgPSBGV1RfREVGQVVMVF9ESVI7CisKKyNpZmRlZiBERUJVRworCXsKKwkJY2hhciBldGhhZGRyMV9zdHJbMThdLCBldGhhZGRyMl9zdHJbMThdOworCQlsYnNfcHJfZGVidWcoMSwgIkZXVF9ERUw6IGxpbmUgaXMgJXNcbiIsIGluX3N0cik7CisJCWV0aF9hZGRyMnN0cihmd3RfYWNjZXNzLmRhLCBldGhhZGRyMV9zdHIpOworCQlldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgZXRoYWRkcjJfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfREVMOiByZW1vdmluZyAoZGE6JXMscmE6JXMsZGlyOiVkKVxuIiwgZXRoYWRkcjFfc3RyLAorCQkgICAgICAgZXRoYWRkcjJfc3RyLCBmd3RfYWNjZXNzLmRpcik7CisJfQorI2VuZGlmCisKKwlMRUFWRSgpOworCXJldHVybiAobGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkgIGNtZF9md3RfYWNjZXNzLAorCQkJCQkJICBjbWRfYWN0X2Z3dF9hY2Nlc3NfZGVsLAorCQkJCQkJICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkgICh2b2lkICopJmZ3dF9hY2Nlc3MpKTsKK30KKworCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgICAgUHJpbnQgcm91dGUgcGFyYW1ldGVycworICogIEBwYXJhbSBmd3RfYWNjZXNzICBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3Mgd2l0aCByb3V0ZSBpbmZvCisgKiAgQHBhcmFtIGJ1ZiAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3Igcm91dGUgaW5mbworICovCitzdGF0aWMgdm9pZCBwcmludF9yb3V0ZShzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzcywgY2hhciAqYnVmKQoreworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAiKTsKKwlidWYgKz0gZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIGJ1Zik7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICIpOworCWJ1ZiArPSBldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgYnVmKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLm1ldHJpYykpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGZ3dF9hY2Nlc3MuZGlyKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNzbikpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuZHNuKSk7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy5ob3Bjb3VudCk7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy50dGwpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuZXhwaXJhdGlvbikpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGZ3dF9hY2Nlc3Muc2xlZXBtb2RlKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNucikpOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgTG9va3VwIGFuIGVudHJ5IGluIHRoZSBGV1QgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF9sb29rdXBfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCWNoYXIgaW5fc3RyWzY0XTsKKwljaGFyICpwdHI7CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCXN0YXRpYyBjaGFyIG91dF9zdHJbMTI4XTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5fc3RyLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW5fc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwdHIgPSBldGhfc3RyMmFkZHIoaW5fc3RyLCBmd3RfYWNjZXNzLmRhKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfYWxlcnQoICJGV1RfTE9PS1VQOiBJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgREVCVUcKKwl7CisJCWNoYXIgZXRoYWRkcjFfc3RyWzE4XTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTE9PS1VQOiBsaW5lIGlzICVzXG4iLCBpbl9zdHIpOworCQlldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5kYSwgZXRoYWRkcjFfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTE9PS1VQOiBsb29raW5nIGZvciAoZGE6JXMpXG4iLCBldGhhZGRyMV9zdHIpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQljbWRfZnd0X2FjY2VzcywKKwkJCQkJCWNtZF9hY3RfZnd0X2FjY2Vzc19sb29rdXAsCisJCQkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRfcm91dGUoZnd0X2FjY2Vzcywgb3V0X3N0cik7CisJZWxzZQorCQlzcHJpbnRmKG91dF9zdHIsICIobnVsbCkiKTsKKworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvdXRfc3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0X3N0ciwKKwkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xPT0tVUDogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgUmVzZXQgYWxsIGVudHJpZXMgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fZnd0X3Jlc2V0X2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJbGJzX3ByX2RlYnVnKDEsICJGV1Q6IHJlc2V0dGluZ1xuIik7CisKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICAgIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICAgIGNtZF9hY3RfZnd0X2FjY2Vzc19yZXNldCwKKwkJCQkgICAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpKTsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfbGlzdF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBpbl9zdHJbOF07CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCWNoYXIgKnB0ciA9IGluX3N0cjsKKwlzdGF0aWMgY2hhciBvdXRfc3RyWzEyOF07CisJY2hhciAqcGJ1ZiA9IG91dF9zdHI7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGluX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGluX3N0cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZ3dF9hY2Nlc3MuaWQgPSBjcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisKKyNpZmRlZiBERUJVRworCXsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVDogbGluZSBpcyAlc1xuIiwgaW5fc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVDogbGlzdGluZyBpZDolaVxuIiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5pZCkpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfbGlzdCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRfcm91dGUoZnd0X2FjY2VzcywgcGJ1Zik7CisJZWxzZQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAobnVsbCkiKTsKKworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvdXRfc3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0X3N0ciwKKwkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1Q6IENvcHkgdG8gdXNlciBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgRlJUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfbGlzdF9yb3V0ZV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBpbl9zdHJbNjRdOworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwljaGFyICpwdHIgPSBpbl9zdHI7CisJc3RhdGljIGNoYXIgb3V0X3N0clsxMjhdOworCWNoYXIgKnBidWYgPSBvdXRfc3RyOworCWludCByZXQ7CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihpbl9zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbl9zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmd3RfYWNjZXNzLmlkID0gY3B1X3RvX2xlMzIoc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCkpOworCisjaWZkZWYgREVCVUcKKwl7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1RfUk9VVEU6IGxpbmUgaXMgJXNcbiIsIGluX3N0cik7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1RfUk9VVEU6IGxpc3RpbmcgaWQ6JWlcbiIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuaWQpKTsKKwl9CisjZW5kaWYKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZnd0X2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9md3RfYWNjZXNzX2xpc3Rfcm91dGUsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgKHZvaWQgKikmZnd0X2FjY2Vzcyk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgIik7CisJCXBidWYgKz0gZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIHBidWYpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MubWV0cmljKSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy5kaXIpOworCQkvKiBub3RlIHRoYXQgdGhlIGZpcm13YXJlIHJldHVybnMgdGhlIG5pZCBpbiB0aGUgaWQgZmllbGQgKi8KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLmlkKSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5zc24pKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLmRzbikpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAgaG9wICV1IiwgZnd0X2FjY2Vzcy5ob3Bjb3VudCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICB0dGwgJXUiLCBmd3RfYWNjZXNzLnR0bCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5leHBpcmF0aW9uKSk7CisJfSBlbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiIChudWxsKSIpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG91dF9zdHIpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgKGNoYXIgKilvdXRfc3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ST1VURTogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgTGlzdCBhbiBlbnRyeSBmcm9tIHRoZSBGTlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF9saXN0X25laWdoYm9yX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0cls4XTsKKwlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CisJY2hhciAqcHRyID0gaW5fc3RyOworCXN0YXRpYyBjaGFyIG91dF9zdHJbMTI4XTsKKwljaGFyICpwYnVmID0gb3V0X3N0cjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5fc3RyLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW5fc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCWZ3dF9hY2Nlc3MuaWQgPSBjcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisKKyNpZmRlZiBERUJVRworCXsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogbGluZSBpcyAlc1xuIiwgaW5fc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogbGlzdGluZyBpZDolaVxuIiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5pZCkpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfbGlzdF9uZWlnaGJvciwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiByYSAiKTsKKwkJcGJ1ZiArPSBldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgcGJ1Zik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICBzbHAgJXUiLCBmd3RfYWNjZXNzLnNsZWVwbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICBzbnIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNucikpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAgcmVmICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5yZWZlcmVuY2VzKSk7CisJfSBlbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiIChudWxsKSIpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG91dF9zdHIpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgKGNoYXIgKilvdXRfc3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgQ2xlYW5zIHVwIHRoZSByb3V0ZSAoRlJUKSBhbmQgbmVpZ2hib3IgKEZOVCkgdGFibGVzCisgKiAgICAgICAgICAgICAgICAgIChHYXJiYWdlIENvbGxlY3Rpb24pCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfY2xlYW51cF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZXVDogY2xlYW5pbmcgdXBcbiIpOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfY2xlYW51cCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBmaXJtd2FyZSBpbnRlcm5hbCB0aW1lIChkZWJ1ZyBwdXJwb3NlcykKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF90aW1lX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiRldUOiBnZXR0aW5nIHRpbWVcbiIpOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfdGltZSwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBtZXNoIHR0bCBmcm9tIGZpcm13YXJlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9tZXNoX2dldF90dGxfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9tZXNoX2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9tZXNoX2dldF90dGwsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkgICAgKHZvaWQgKikmbWVzaF9hY2Nlc3MpOworCisJaWYgKHJldCA9PSAwKSB7CisJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKShsZTMyX3RvX2NwdShtZXNoX2FjY2Vzcy5kYXRhWzBdKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBtZXNoIHR0bCBmcm9tIGZpcm13YXJlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHR0bCAgICAgIE5ldyB0dGwgdmFsdWUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9tZXNoX3NldF90dGxfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHR0bCkKK3sKKwlzdHJ1Y3QgY21kX2RzX21lc2hfYWNjZXNzIG1lc2hfYWNjZXNzOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaWYoICh0dGwgPiAweGZmKSB8fCAodHRsIDwgMCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCW1lc2hfYWNjZXNzLmRhdGFbMF0gPSB0dGw7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX21lc2hfYWNjZXNzLAorCQkJCQkJY21kX2FjdF9tZXNoX3NldF90dGwsCisJCQkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkodm9pZCAqKSZtZXNoX2FjY2Vzcyk7CisKKwlpZiAocmV0ICE9IDApCisJCXJldCA9IC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBpb2N0bCBmdW5jdGlvbiAtIGVudHJ5IHBvaW50CisgKgorICogIEBwYXJhbSBkZXYJCUEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJICAgCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gY21kIAkJY29tbWFuZAorICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpyZXEsIGludCBjbWQpCit7CisJaW50IHN1YmNtZCA9IDA7CisJaW50IGlkYXRhID0gMDsKKwlpbnQgKnBkYXRhOworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgImxpYmVydGFzX2RvX2lvY3RsOiBpb2N0bCBjbWQgPSAweCV4XG4iLCBjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXTEFOU0NBTl9UWVBFOgorCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gdHlwZSBJb2N0bFxuIik7CisJCXJldCA9IHdsYW5fc2Nhbl90eXBlX2lvY3RsKHByaXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVE5PTkVfR0VUTk9ORToJLyogc2V0IFdQQSBtb2RlIG9uL29mZiBpb2N0bCAjMjAgKi8KKwkJc3dpdGNoICh3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5ERUFVVEg6CisJCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aFxuIik7CisJCQlsaWJlcnRhc19zZW5kX2RlYXV0aChwcml2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTkFESE9DU1RPUDoKKwkJCWxic19wcl9kZWJ1ZygxLCAiQWRob2Mgc3RvcFxuIik7CisJCQlyZXQgPSBsaWJlcnRhc19kb19hZGhvY3N0b3BfaW9jdGwocHJpdik7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5SQURJT09OOgorCQkJd2xhbl9yYWRpb19pb2N0bChwcml2LCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlJBRElPT0ZGOgorCQkJd2xhbl9yYWRpb19pb2N0bChwcml2LCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5XTEFOSURMRU9OOgorCQkJbGliZXJ0YXNfaWRsZV9vbihwcml2KTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5XTEFOSURMRU9GRjoKKwkJCWxpYmVydGFzX2lkbGVfb2ZmKHByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfQlRfUkVTRVQ6CS8qIGJ0X3Jlc2V0ICovCisJCQl3bGFuX2J0X3Jlc2V0X2lvY3RsKHByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX1JFU0VUOgkvKiBmd3RfcmVzZXQgKi8KKwkJCXdsYW5fZnd0X3Jlc2V0X2lvY3RsKHByaXYpOworCQkJYnJlYWs7CisJCX0JCS8qIEVuZCBvZiBzd2l0Y2ggKi8KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5TRVRXUEFJRToKKwkJcmV0ID0gd2xhbl9zZXR3cGFpZV9pb2N0bChwcml2LCByZXEpOworCQlicmVhazsKKwljYXNlIFdMQU5fU0VUSU5UX0dFVElOVDoKKwkJLyogVGhlIGZpcnN0IDQgYnl0ZXMgb2YgcmVxLT5pZnJfZGF0YSBpcyBzdWItaW9jdGwgbnVtYmVyCisJCSAqIGFmdGVyIDQgYnl0ZXMgc2l0cyB0aGUgcGF5bG9hZC4KKwkJICovCisJCXN1YmNtZCA9IChpbnQpcmVxLT5pZnJfZGF0YTsJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKwkJc3dpdGNoIChzdWJjbWQpIHsKKwkJY2FzZSBXTEFOTkY6CisJCQlyZXQgPSB3bGFuX2dldF9uZihwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTlJTU0k6CisJCQlyZXQgPSB3bGFuX2dldF9yc3NpKHByaXYsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFORU5BQkxFMTFEOgorCQkJcmV0ID0gbGliZXJ0YXNfY21kX2VuYWJsZV8xMWQocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5BREhPQ0dSQVRFOgorCQkJcmV0ID0gd2xhbl9kb19zZXRfZ3JhdGVfaW9jdGwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX1NFVF9QUkVTQ0FOOgorCQkJcmV0ID0gd2xhbl9zdWJjbWRfc2V0cHJlc2Nhbl9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUT05FSU5UX0dFVE9ORUlOVDoKKwkJc3dpdGNoICh3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5fQkVBQ09OX0lOVEVSVkFMOgorCQkJcmV0ID0gd2xhbl9iZWFjb25faW50ZXJ2YWwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9MSVNURU5JTlRSVkw6CisJCQlpZiAoIXdycS0+dS5kYXRhLmxlbmd0aCkgeworCQkJCWludCBkYXRhOworCQkJCWxic19wcl9kZWJ1ZygxLCAiR2V0IGxvY2FsbGlzdGVuaW50ZXJ2YWwgdmFsdWVcbiIpOworI2RlZmluZSBHRVRfT05FX0lOVAkxCisJCQkJZGF0YSA9IGFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWw7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJICZkYXRhLCBzaXplb2YoaW50KSkpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gR0VUX09ORV9JTlQ7CisJCQl9IGVsc2UgeworCQkJCWludCBkYXRhOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSAgICAoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWxic19wcl9kZWJ1ZygxLCAiU2V0IGxvY2FsbGlzdGVuaW50ZXJ2YWwgPSAlZFxuIiwKKwkJCQkgICAgICAgZGF0YSk7CisjZGVmaW5lIE1BWF9VMTZfVkFMCTY1NTM1CisJCQkJaWYgKGRhdGEgPiBNQVhfVTE2X1ZBTCkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkV4Y2VlZHMgVTE2IHZhbHVlXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWwgPSBkYXRhOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9UWENPTlRST0w6CisJCQlyZXQgPSB3bGFuX3R4Y29udHJvbChwcml2LCB3cnEpOwkvL2FkZHMgZm9yIHR4Y29udHJvbCBpb2N0bAorCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX05VTExQS1RJTlRFUlZBTDoKKwkJCXJldCA9IHdsYW5fbnVsbF9wa3RfaW50ZXJ2YWwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVE9ORUlOVF9HRVROT05FOgorCQkvKiBUaGUgZmlyc3QgNCBieXRlcyBvZiByZXEtPmlmcl9kYXRhIGlzIHN1Yi1pb2N0bCBudW1iZXIKKwkJICogYWZ0ZXIgNCBieXRlcyBzaXRzIHRoZSBwYXlsb2FkLgorCQkgKi8KKwkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKworCQlpZiAoIXN1YmNtZCkKKwkJCXN1YmNtZCA9IChpbnQpcmVxLT5pZnJfZGF0YTsJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKworCQlzd2l0Y2ggKHN1YmNtZCkgeworCQljYXNlIFdMQU5fU1VCQ01EX1NFVFJYQU5URU5OQToJLyogU0VUUlhBTlRFTk5BICovCisJCQlpZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CisJCQlyZXQgPSBzZXRyeGFudGVubmEocHJpdiwgaWRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BOgkvKiBTRVRUWEFOVEVOTkEgKi8KKwkJCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKKwkJCXJldCA9IHNldHR4YW50ZW5uYShwcml2LCBpZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NFVF9BVElNX1dJTkRPVzoKKwkJCWFkYXB0ZXItPmF0aW13aW5kb3cgPSBTVUJDTURfREFUQSh3cnEpOworCQkJYWRhcHRlci0+YXRpbXdpbmRvdyA9IG1pbl90KF9fdTE2LCBhZGFwdGVyLT5hdGltd2luZG93LCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUQkNOQVZHOgorCQkJYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPSBTVUJDTURfREFUQSh3cnEpOworCQkJaWYgKGFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID09IDApCisJCQkJYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPQorCQkJCSAgICBERUZBVUxUX0JDTl9BVkdfRkFDVE9SOworCQkJaWYgKGFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID4gREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUikKKwkJCQlhZGFwdGVyLT5iY25fYXZnX2ZhY3RvciA9CisJCQkJICAgIERFRkFVTFRfQkNOX0FWR19GQUNUT1I7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUREFUQUFWRzoKKwkJCWFkYXB0ZXItPmRhdGFfYXZnX2ZhY3RvciA9IFNVQkNNRF9EQVRBKHdycSk7CisJCQlpZiAoYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID09IDApCisJCQkJYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID0KKwkJCQkgICAgREVGQVVMVF9EQVRBX0FWR19GQUNUT1I7CisJCQlpZiAoYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID4gREVGQVVMVF9EQVRBX0FWR19GQUNUT1IpCisJCQkJYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID0KKwkJCQkgICAgREVGQVVMVF9EQVRBX0FWR19GQUNUT1I7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUUkVHSU9OOgorCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCQkJcmV0ID0gd2xhbl9zZXRfcmVnaW9uKHByaXYsICh1MTYpIGlkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTElTVEVOX0lOVEVSVkFMOgorCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCQkJYWRhcHRlci0+bGlzdGVuaW50ZXJ2YWwgPSAodTE2KSBpZGF0YTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTVVMVElQTEVfRFRJTToKKwkJCXJldCA9IHdsYW5fc2V0X211bHRpcGxlX2R0aW1faW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlNFVEFVVEhBTEc6CisJCQlyZXQgPSB3bGFuX3NldGF1dGhhbGdfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlNFVDgwMjFYQVVUSEFMRzoKKwkJCXJldCA9IHdsYW5fc2V0ODAyMXhhdXRoYWxnX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5TRVRFTkNSWVBUSU9OTU9ERToKKwkJCXJldCA9IHdsYW5fc2V0ZW5jcnlwdGlvbm1vZGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTElOS01PREU6CisJCQlyZXQgPSB3bGFuX3NldF9saW5rbW9kZV9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1NFVF9SQURJT01PREU6CisJCQlyZXQgPSB3bGFuX3NldF9yYWRpb21vZGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfREVCVUdNT0RFOgorCQkJcmV0ID0gd2xhbl9zZXRfZGVidWdtb2RlX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fU1VCQ01EX01FU0hfU0VUX1RUTDoKKwkJCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKKwkJCXJldCA9IHdsYW5fbWVzaF9zZXRfdHRsX2lvY3RsKHByaXYsIGlkYXRhKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUTk9ORV9HRVRUV0VMVkVfQ0hBUjoJLyogR2V0IEFudGVubmEgc2V0dGluZ3MgKi8KKwkJLyoKKwkJICogV2UndmUgbm90IHVzZWQgSVdfUFJJVl9UWVBFX0ZJWEVEIHNvIHN1Yi1pb2N0bCBudW1iZXIgaXMKKwkJICogaW4gZmxhZ3Mgb2YgaXdyZXEgc3RydWN0dXJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBpbgorCQkgKiBtb2RlIG1lbWJlciBvZiBpd3JlcSBzdHJ1Y3R1cmUuCisJCSAqLworCQlzd2l0Y2ggKChpbnQpd3JxLT51LmRhdGEuZmxhZ3MpIHsKKwkJY2FzZSBXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkE6CS8qIEdldCBSeCBBbnRlbm5hICovCisJCQlyZXQgPSB3bGFuX3N1YmNtZF9nZXRyeGFudGVubmFfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TVUJDTURfR0VUVFhBTlRFTk5BOgkvKiBHZXQgVHggQW50ZW5uYSAqLworCQkJcmV0ID0gd2xhbl9zdWJjbWRfZ2V0dHhhbnRlbm5hX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX1RTRjoKKwkJCXJldCA9IHdsYW5fZ2V0X3RzZl9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUMTI4Q0hBUl9HRVQxMjhDSEFSOgorCQlzd2l0Y2ggKChpbnQpd3JxLT51LmRhdGEuZmxhZ3MpIHsKKworCQljYXNlIFdMQU5TQ0FOX01PREU6CisJCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gbW9kZSBJb2N0bFxuIik7CisJCQlyZXQgPSB3bGFuX3NjYW5fbW9kZV9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9BREhPQ19TVEFUVVM6CisJCQlyZXQgPSB3bGFuX2dldF9hZGhvY19zdGF0dXNfaW9jdGwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0JUX0FERDoKKwkJCXJldCA9IHdsYW5fYnRfYWRkX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NVQkNNRF9CVF9ERUw6CisJCQlyZXQgPSB3bGFuX2J0X2RlbF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfQlRfTElTVDoKKwkJCXJldCA9IHdsYW5fYnRfbGlzdF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0FERDoKKwkJCXJldCA9IHdsYW5fZnd0X2FkZF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0RFTDoKKwkJCXJldCA9IHdsYW5fZnd0X2RlbF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0xPT0tVUDoKKwkJCXJldCA9IHdsYW5fZnd0X2xvb2t1cF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0xJU1RfTkVJR0hCT1I6CisJCQlyZXQgPSB3bGFuX2Z3dF9saXN0X25laWdoYm9yX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NVQkNNRF9GV1RfTElTVDoKKwkJCXJldCA9IHdsYW5fZnd0X2xpc3RfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0ZXVF9MSVNUX1JPVVRFOgorCQkJcmV0ID0gd2xhbl9md3RfbGlzdF9yb3V0ZV9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQ6CisJCXN3aXRjaCAoKGludClyZXEtPmlmcl9kYXRhKSB7CisJCWNhc2UgV0xBTkdFVEJDTkFWRzoKKwkJCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOworCQkJKnBkYXRhID0gKGludClhZGFwdGVyLT5iY25fYXZnX2ZhY3RvcjsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTkdFVFJFR0lPTjoKKwkJCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOworCQkJKnBkYXRhID0gKGludClhZGFwdGVyLT5yZWdpb25jb2RlOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9MSVNURU5fSU5URVJWQUw6CisJCQlwZGF0YSA9IChpbnQgKil3cnEtPnUubmFtZTsKKwkJCSpwZGF0YSA9IChpbnQpYWRhcHRlci0+bGlzdGVuaW50ZXJ2YWw7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX0xJTktNT0RFOgorCQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKCh1MzIpIGFkYXB0ZXItPmxpbmttb2RlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9HRVRfUkFESU9NT0RFOgorCQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKCh1MzIpIGFkYXB0ZXItPnJhZGlvbW9kZSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX0RFQlVHTU9ERToKKwkJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKSgodTMyKSBhZGFwdGVyLT5kZWJ1Z21vZGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9NVUxUSVBMRV9EVElNOgorCQkJcGRhdGEgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJCQkqcGRhdGEgPSAoaW50KWFkYXB0ZXItPm11bHRpcGxlZHRpbTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fR0VUX1RYX1JBVEU6CisJCQlyZXQgPSB3bGFuX2dldF90eHJhdGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQOgkvKiBmd3RfY2xlYW51cCAqLworCQkJcmV0ID0gd2xhbl9md3RfY2xlYW51cF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1NVQkNNRF9GV1RfVElNRToJLyogZnd0X3RpbWUgKi8KKwkJCXJldCA9IHdsYW5fZnd0X3RpbWVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TVUJDTURfTUVTSF9HRVRfVFRMOgorCQkJcmV0ID0gd2xhbl9tZXNoX2dldF90dGxfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5HRVRMT0c6CisJCXJldCA9IHdsYW5fZG9fZ2V0bG9nX2lvY3RsKHByaXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVF9HRVRfU0lYVEVFTl9JTlQ6CisJCXN3aXRjaCAoKGludCl3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5fVFBDQ0ZHOgorCQkJeworCQkJCWludCBkYXRhWzVdOworCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcgY2ZnOworCQkJCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7CisJCQkJaWYgKCh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKQorCQkJCSAgICAmJiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDUpKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJCQkJY2ZnLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIHNpemVvZihpbnQpICogNSkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljZmcuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9zZXQpOworCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKKwkJCQkJY2ZnLnVzZXNuciA9IGRhdGFbMV07CisJCQkJCWNmZy5QMCA9IGRhdGFbMl07CisJCQkJCWNmZy5QMSA9IGRhdGFbM107CisJCQkJCWNmZy5QMiA9IGRhdGFbNF07CisJCQkJfQorCisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3RwY19jZmcsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKKworCQkJCWRhdGFbMF0gPSBjZmcuZW5hYmxlOworCQkJCWRhdGFbMV0gPSBjZmcudXNlc25yOworCQkJCWRhdGFbMl0gPSBjZmcuUDA7CisJCQkJZGF0YVszXSA9IGNmZy5QMTsKKwkJCQlkYXRhWzRdID0gY2ZnLlAyOworCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDUpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fUE9XRVJDRkc6CisJCQl7CisJCQkJaW50IGRhdGFbNF07CisJCQkJc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyBjZmc7CisJCQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKKwkJCQlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpCisJCQkJICAgICYmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gNCkpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJCQkJY2ZnLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIHNpemVvZihpbnQpICogNCkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljZmcuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9zZXQpOworCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKKwkJCQkJY2ZnLlBBX1AwID0gZGF0YVsxXTsKKwkJCQkJY2ZnLlBBX1AxID0gZGF0YVsyXTsKKwkJCQkJY2ZnLlBBX1AyID0gZGF0YVszXTsKKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3B3cl9jZmcsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKKwkJCQlkYXRhWzBdID0gY2ZnLmVuYWJsZTsKKwkJCQlkYXRhWzFdID0gY2ZnLlBBX1AwOworCQkJCWRhdGFbMl0gPSBjZmcuUEFfUDE7CisJCQkJZGF0YVszXSA9IGNmZy5QQV9QMjsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLAorCQkJCSAgICAgc2l6ZW9mKGludCkgKiA0KSkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9BVVRPX0ZSRVFfU0VUOgorCQkJeworCQkJCWludCBkYXRhWzNdOworCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7CisJCQkJbWVtc2V0KCZhZmMsIDAsIHNpemVvZihhZmMpKTsKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDMpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKGRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWFmYy5hZmNfYXV0byA9IGRhdGFbMF07CisKKwkJCQlpZiAoYWZjLmFmY19hdXRvICE9IDApIHsKKwkJCQkJYWZjLnRocmVzaG9sZCA9IGRhdGFbMV07CisJCQkJCWFmYy5wZXJpb2QgPSBkYXRhWzJdOworCQkJCX0gZWxzZSB7CisJCQkJCWFmYy50aW1pbmdfb2Zmc2V0ID0gZGF0YVsxXTsKKwkJCQkJYWZjLmNhcnJpZXJfb2Zmc2V0ID0gZGF0YVsyXTsKKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3NldF9hZmMsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fQVVUT19GUkVRX0dFVDoKKwkJCXsKKwkJCQlpbnQgZGF0YVszXTsKKwkJCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMgYWZjOworCQkJCW1lbXNldCgmYWZjLCAwLCBzaXplb2YoYWZjKSk7CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX2dldF9hZmMsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKKwkJCQlkYXRhWzBdID0gYWZjLmFmY19hdXRvOworCQkJCWRhdGFbMV0gPSBhZmMudGltaW5nX29mZnNldDsKKwkJCQlkYXRhWzJdID0gYWZjLmNhcnJpZXJfb2Zmc2V0OworCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NDQU5QUk9CRVM6CisJCQl7CisJCQkJaW50IGRhdGE7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDApIHsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJCSAgICAoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgc2l6ZW9mKGludCkpKSB7CisJCQkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkJCSAgICAgICAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisKKwkJCQkJYWRhcHRlci0+c2NhbnByb2JlcyA9IGRhdGE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGF0YSA9IGFkYXB0ZXItPnNjYW5wcm9iZXM7CisJCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCAmZGF0YSwKKwkJCQkJICAgICBzaXplb2YoaW50KSkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0xFRF9HUElPX0NUUkw6CisJCQl7CisJCQkJaW50IGk7CisJCQkJaW50IGRhdGFbMTZdOworCisJCQkJc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwgY3RybDsKKwkJCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyAqZ3BpbyA9CisJCQkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyAqKSBjdHJsLmRhdGE7CisKKwkJCQltZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IE1BWF9MRURTICogMikKKwkJCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJCQlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCAlIDIpICE9IDApCisJCQkJCXJldHVybiAtRU5PVFNVUFA7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7CisJCQkJCWN0cmwuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9nZXQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCQkgICAgKGRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgc2l6ZW9mKGludCkgKgorCQkJCQkgICAgIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljdHJsLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3Rfc2V0KTsKKwkJCQkJY3RybC5udW1sZWQgPSBjcHVfdG9fbGUxNigwKTsKKwkJCQkJZ3Bpby0+aGVhZGVyLnR5cGUgPQorCQkJCQkgICAgY3B1X3RvX2xlMTYoVExWX1RZUEVfTEVEX0dQSU8pOworCQkJCQlncGlvLT5oZWFkZXIubGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgd3JxLT51LmRhdGEubGVuZ3RoOworCQkJCQkgICAgIGkgKz0gMikgeworCQkJCQkJZ3Bpby0+bGVkcGluW2kgLyAyXS5sZWQgPQorCQkJCQkJICAgIGRhdGFbaV07CisJCQkJCQlncGlvLT5sZWRwaW5baSAvIDJdLnBpbiA9CisJCQkJCQkgICAgZGF0YVtpICsgMV07CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX2xlZF9ncGlvX2N0cmwsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY3RybCk7CisJCQkJZm9yIChpID0gMDsgaSA8IGdwaW8tPmhlYWRlci5sZW47IGkgKz0gMikgeworCQkJCQlkYXRhW2ldID0gZ3Bpby0+bGVkcGluW2kgLyAyXS5sZWQ7CisJCQkJCWRhdGFbaSArIDFdID0gZ3Bpby0+bGVkcGluW2kgLyAyXS5waW47CisJCQkJfQorCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwKKwkJCQkJCSBzaXplb2YoaW50KSAqCisJCQkJCQkgZ3Bpby0+aGVhZGVyLmxlbikpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gZ3Bpby0+aGVhZGVyLmxlbjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fQURBUFRfUkFURVNFVDoKKwkJCXJldCA9IHdsYW5fYWRhcHRfcmF0ZXNldChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9JTkFDVElWSVRZX1RJTUVPVVQ6CisJCQlyZXQgPSB3bGFuX2luYWN0aXZpdHlfdGltZW91dChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTlNOUjoKKwkJCXJldCA9IHdsYW5fZ2V0X3Nucihwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9HRVRfUlhJTkZPOgorCQkJcmV0ID0gd2xhbl9nZXRfcnhpbmZvKHByaXYsIHdycSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY4MmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvam9pbi5jCkBAIC0wLDAgKzEsMTA1NSBAQAorLyoqCisgICogIEZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgd2xhbiBpbmZyYXN0cnVjdHVyZSBhbmQgYWRob2Mgam9pbiByb3V0aW5lcywKKyAgKiAgSU9DVEwgaGFuZGxlcnMgYXMgd2VsbCBhcyBjb21tYW5kIHByZXBlcmF0aW9uIGFuZCByZXNwb25zZSByb3V0aW5lcworICAqICBmb3Igc2VuZGluZyBhZGhvYyBzdGFydCwgYWRob2Mgam9pbiwgYW5kIGFzc29jaWF0aW9uIGNvbW1hbmRzCisgICogIHRvIHRoZSBmaXJtd2FyZS4KKyAgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiam9pbi5oIgorI2luY2x1ZGUgImRldi5oIgorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgdGhlIGNvbW1vbiByYXRlcyBiZXR3ZWVuIHJhdGUxIGFuZCByYXRlMi4KKyAqCisgKiBJdCB3aWxsIGZpbGwgY29tbW9uIHJhdGVzIGluIHJhdGUxIGFzIG91dHB1dCBpZiBmb3VuZC4KKyAqCisgKiBOT1RFOiBTZXR0aW5nIHRoZSBNU0Igb2YgdGhlIGJhc2ljIHJhdGVzIG5lZWQgdG8gYmUgdGFrZW4KKyAqICAgY2FyZSwgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgICAgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJhdGUxICAgICAgIHRoZSBidWZmZXIgd2hpY2gga2VlcHMgaW5wdXQgYW5kIG91dHB1dAorICogIEBwYXJhbSByYXRlMV9zaXplICB0aGUgc2l6ZSBvZiByYXRlMSBidWZmZXIKKyAqICBAcGFyYW0gcmF0ZTIgICAgICAgdGhlIGJ1ZmZlciB3aGljaCBrZWVwcyByYXRlMgorICogIEBwYXJhbSByYXRlMl9zaXplICB0aGUgc2l6ZSBvZiByYXRlMiBidWZmZXIuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbW1vbl9yYXRlcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCAqIHJhdGUxLAorCQkJICAgIGludCByYXRlMV9zaXplLCB1OCAqIHJhdGUyLCBpbnQgcmF0ZTJfc2l6ZSkKK3sKKwl1OCAqcHRyID0gcmF0ZTE7CisJaW50IHJldCA9IDA7CisJdTggdG1wWzMwXTsKKwlpbnQgaTsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJbWVtY3B5KCZ0bXAsIHJhdGUxLCBtaW5fdChzaXplX3QsIHJhdGUxX3NpemUsIHNpemVvZih0bXApKSk7CisJbWVtc2V0KHJhdGUxLCAwLCByYXRlMV9zaXplKTsKKworCS8qIE1hc2sgdGhlIHRvcCBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IHRtcFtpXSAmJiBpIDwgc2l6ZW9mKHRtcCk7IGkrKykKKwkJdG1wW2ldICY9IDB4N0Y7CisKKwlmb3IgKGkgPSAwOyByYXRlMltpXSAmJiBpIDwgcmF0ZTJfc2l6ZTsgaSsrKSB7CisJCS8qIENoZWNrIGZvciBDYXJkIFJhdGUgaW4gdG1wLCBleGNsdWRpbmcgdGhlIHRvcCBiaXQgKi8KKwkJaWYgKHN0cmNocih0bXAsIHJhdGUyW2ldICYgMHg3RikpIHsKKwkJCS8qIHZhbHVlcyBtYXRjaCwgc28gY29weSB0aGUgQ2FyZCBSYXRlIHRvIHJhdGUxICovCisJCQkqcmF0ZTErKyA9IHJhdGUyW2ldOworCQl9CisJfQorCisJbGJzX2RiZ19oZXgoInJhdGUxIChBUCkgcmF0ZXM6IiwgdG1wLCBzaXplb2YodG1wKSk7CisJbGJzX2RiZ19oZXgoInJhdGUyIChDYXJkKSByYXRlczoiLCByYXRlMiwgcmF0ZTJfc2l6ZSk7CisJbGJzX2RiZ19oZXgoIkNvbW1vbiByYXRlczoiLCBwdHIsIHJhdGUxX3NpemUpOworCWxic19wcl9kZWJ1ZygxLCAiVHggZGF0YXJhdGUgaXMgc2V0IHRvIDB4JVhcbiIsIGFkYXB0ZXItPmRhdGFyYXRlKTsKKworCWlmICghYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0bykgeworCQl3aGlsZSAoKnB0cikgeworCQkJaWYgKCgqcHRyICYgMHg3ZikgPT0gYWRhcHRlci0+ZGF0YXJhdGUpIHsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCXB0cisrOworCQl9CisJCWxic19wcl9hbGVydCggIlByZXZpb3VzbHkgc2V0IGZpeGVkIGRhdGEgcmF0ZSAlI3ggaXNuJ3QgIgorCQkgICAgICAgImNvbXBhdGlibGUgd2l0aCB0aGUgbmV0d29yay5cbiIsIGFkYXB0ZXItPmRhdGFyYXRlKTsKKworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19zZW5kX2RlYXV0aCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCXJldCA9IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKKwllbHNlCisJCXJldCA9IC1FTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19kb19hZGhvY3N0b3BfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcyAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCXJldCA9IGxpYmVydGFzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKwllbHNlCisJCXJldCA9IC1FTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBBc3NvY2lhdGUgdG8gYSBzcGVjaWZpYyBCU1MgZGlzY292ZXJlZCBpbiBhIHNjYW4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwYnNzZGVzYyAgUG9pbnRlciB0byB0aGUgQlNTIGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIHdpdGguCisgKgorICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgd2xhbl9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGJzc19kZXNjcmlwdG9yICogcGJzc2Rlc2MpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2F1dGhlbnRpY2F0ZSwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBwYnNzZGVzYy0+bWFjYWRkcmVzcyk7CisKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IHByZWFtYmxlIHRvIGZpcm13YXJlICovCisJaWYgKGFkYXB0ZXItPmNhcGluZm8uc2hvcnRwcmVhbWJsZSAmJiBwYnNzZGVzYy0+Y2FwLnNob3J0cHJlYW1ibGUpCisJCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfc2hvcnRfcHJlYW1ibGU7CisJZWxzZQorCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisKKwlsaWJlcnRhc19zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2Fzc29jaWF0ZSwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBwYnNzZGVzYyk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTdGFydCBhbiBBZGhvYyBOZXR3b3JrCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYWRob2Nzc2lkICAgIFRoZSBzc2lkIG9mIHRoZSBBZGhvYyBOZXR3b3JrCisgKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCAtMS0tZmFpbAorICovCitpbnQgbGliZXJ0YXNfc3RhcnRfYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqYWRob2Nzc2lkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlhZGFwdGVyLT5hZGhvY2NyZWF0ZSA9IDE7CisKKwlpZiAoIWFkYXB0ZXItPmNhcGluZm8uc2hvcnRwcmVhbWJsZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFkaG9jU3RhcnQ6IExvbmcgcHJlYW1ibGVcbiIpOworCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY1N0YXJ0OiBTaG9ydCBwcmVhbWJsZVxuIik7CisJCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfc2hvcnRfcHJlYW1ibGU7CisJfQorCisJbGliZXJ0YXNfc2V0X3JhZGlvX2NvbnRyb2wocHJpdik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFkaG9jIGNoYW5uZWwgPSAlZFxuIiwgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKwlsYnNfcHJfZGVidWcoMSwgImN1cmJzc3BhcmFtcy5jaGFubmVsID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsKTsKKwlsYnNfcHJfZGVidWcoMSwgImN1cmJzc3BhcmFtcy5iYW5kID0gJWRcbiIsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5iYW5kKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2FkX2hvY19zdGFydCwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBhZGhvY3NzaWQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEpvaW4gYW4gYWRob2MgbmV0d29yayBmb3VuZCBpbiBhIHByZXZpb3VzIHNjYW4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwYnNzZGVzYyAgICAgUG9pbnRlciB0byBhIEJTUyBkZXNjcmlwdG9yIGZvdW5kIGluIGEgcHJldmlvdXMgc2NhbgorICogICAgICAgICAgICAgICAgICAgICAgdG8gYXR0ZW1wdCB0byBqb2luCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgMC0tc3VjY2VzcywgLTEtLWZhaWwKKyAqLworaW50IGxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKiBwYnNzZGVzYykKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IEN1ckJzcy5zc2lkID0lc1xuIiwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZCk7CisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IEN1ckJzcy5zc2lkX2xlbiA9JXVcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWRsZW5ndGgpOworCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfam9pbl9hZGhvY19uZXR3b3JrOiBzc2lkID0lc1xuIiwgcGJzc2Rlc2MtPnNzaWQuc3NpZCk7CisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IHNzaWQgbGVuID0ldVxuIiwKKwkgICAgICAgcGJzc2Rlc2MtPnNzaWQuc3NpZGxlbmd0aCk7CisKKwkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIFNTSUQgaXMgYWxyZWFkeSBqb2luZWQgKi8KKwlpZiAoYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aAorCSAgICAmJiAhbGliZXJ0YXNfU1NJRF9jbXAoJnBic3NkZXNjLT5zc2lkLCAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQpCisJICAgICYmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvci5pbmZyYW1vZGUgPT0KKwkJd2xhbjgwMl8xMWlic3MpKSB7CisKKyAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCSAgICAgICAiQURIT0NfSl9DTUQ6IE5ldyBhZC1ob2MgU1NJRCBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCAiCisJCSAgICAgICAibm90IGF0dGVtcHRpbmcgdG8gcmUtam9pbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKlVzZSBzaG9ydHByZWFtYmxlIG9ubHkgd2hlbiBib3RoIGNyZWF0b3IgYW5kIGNhcmQgc3VwcG9ydHMKKwkgICBzaG9ydCBwcmVhbWJsZSAqLworCWlmICghcGJzc2Rlc2MtPmNhcC5zaG9ydHByZWFtYmxlIHx8ICFhZGFwdGVyLT5jYXBpbmZvLnNob3J0cHJlYW1ibGUpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY0pvaW46IExvbmcgcHJlYW1ibGVcbiIpOworCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY0pvaW46IFNob3J0IHByZWFtYmxlXG4iKTsKKwkJYWRhcHRlci0+cHJlYW1ibGUgPSBjbWRfdHlwZV9zaG9ydF9wcmVhbWJsZTsKKwl9CisKKwlsaWJlcnRhc19zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKworCWxic19wcl9kZWJ1ZygxLCAiY3VyYnNzcGFyYW1zLmNoYW5uZWwgPSAlZFxuIiwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCWxic19wcl9kZWJ1ZygxLCAiY3VyYnNzcGFyYW1zLmJhbmQgPSAlY1xuIiwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJhbmQpOworCisJYWRhcHRlci0+YWRob2NjcmVhdGUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfYWRfaG9jX2pvaW4sCisJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9TU0lELCBwYnNzZGVzYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2FkX2hvY19zdG9wLAorCQkJCSAgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBSZXF1ZXN0CisgKgorICogIEBwYXJhbSBwcml2ICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgIDAtLXN1Y2Nlc3MsIC0xLS1mYWlsCisgKi8KK2ludCBsaWJlcnRhc19zZW5kX2RlYXV0aGVudGljYXRpb24od2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlyZXR1cm4gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUsCisJCQkJICAgICAwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworfQorCisvKioKKyAqICBAYnJpZWYgU2V0IElkbGUgT2ZmCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfaWRsZV9vZmYod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCWNvbnN0IHU4IHplcm9tYWNbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCWludCBpOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19kaXNjb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCWlmIChtZW1jbXAoYWRhcHRlci0+cHJldmlvdXNic3NpZCwgemVyb21hYywKKwkJCQkgICBzaXplb2YoemVyb21hYykpICE9IDApIHsKKworCQkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAorCQkJCSAgICAgICBhZGFwdGVyLT5wcmV2aW91c3NzaWQuc3NpZCk7CisJCQkJbGJzX3ByX2RlYnVnKDEsICJQcmV2aW91cyBCU1NJRCA9ICIKKwkJCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OlxuIiwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFswXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsxXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsyXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFszXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs0XSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs1XSk7CisKKwkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKKwkJCQkJCSAgICZhZGFwdGVyLT5wcmV2aW91c3NzaWQsCisJCQkJCQkgICBhZGFwdGVyLT5wcmV2aW91c2Jzc2lkLAorCQkJCQkJICAgYWRhcHRlci0+aW5mcmFtb2RlKTsKKworCQkJCWlmIChpIDwgMCkgeworCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX0JTU0lEX3NjYW4ocHJpdiwKKwkJCQkJCQkgICAgICBhZGFwdGVyLT4KKwkJCQkJCQkgICAgICBwcmV2aW91c2Jzc2lkLAorCQkJCQkJCSAgICAgIDEpOworCQkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKKwkJCQkJCQkgICAmYWRhcHRlci0+CisJCQkJCQkJICAgcHJldmlvdXNzc2lkLAorCQkJCQkJCSAgIGFkYXB0ZXItPgorCQkJCQkJCSAgIHByZXZpb3VzYnNzaWQsCisJCQkJCQkJICAgYWRhcHRlci0+CisJCQkJCQkJICAgaW5mcmFtb2RlKTsKKwkJCQl9CisKKwkJCQlpZiAoaSA8IDApIHsKKwkJCQkJLyogSWYgdGhlIEJTU0lEIGNvdWxkIG5vdCBiZSBmb3VuZCwgdHJ5IGp1c3QgdGhlIFNTSUQgKi8KKwkJCQkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsCisJCQkJCQkJICAgJmFkYXB0ZXItPgorCQkJCQkJCSAgIHByZXZpb3Vzc3NpZCwgTlVMTCwKKwkJCQkJCQkgICBhZGFwdGVyLT4KKwkJCQkJCQkgICBpbmZyYW1vZGUpOworCQkJCX0KKworCQkJCWlmIChpIDwgMCkgeworCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LAorCQkJCQkJCSAgICAgJmFkYXB0ZXItPgorCQkJCQkJCSAgICAgcHJldmlvdXNzc2lkLAorCQkJCQkJCSAgICAgMSk7CisJCQkJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBwcmV2aW91c3NzaWQsIE5VTEwsCisJCQkJCQkJICAgYWRhcHRlci0+CisJCQkJCQkJICAgaW5mcmFtb2RlKTsKKwkJCQl9CisKKwkJCQlpZiAoaSA+PSAwKSB7CisJCQkJCXJldCA9CisJCQkJCSAgICB3bGFuX2Fzc29jaWF0ZShwcml2LAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBzY2FudGFibGVbaV0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKKwkJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkJICAgIGNtZF84MDJfMTFfYWRfaG9jX3N0YXJ0LAorCQkJCQkJICAgIDAsCisJCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJICAgIDAsICZhZGFwdGVyLT5wcmV2aW91c3NzaWQpOworCQl9CisJfQorCS8qIGVsc2UgaXQgaXMgY29ubmVjdGVkICovCisKKwlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb2ZmIik7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgU2V0IElkbGUgT24KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK2ludCBsaWJlcnRhc19pZGxlX29uKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPnByZXZpb3Vzc3NpZC5zc2lkKTsKKwkJCW1lbW1vdmUoJmFkYXB0ZXItPnByZXZpb3Vzc3NpZCwKKwkJCQkmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsCisJCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisJCQlsaWJlcnRhc19zZW5kX2RlYXV0aChwcml2KTsKKworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkJcmV0ID0gbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHByaXYpOworCQl9CisKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb24iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGNvbW1hbmQgb2YgYXV0aGVudGljYXRlLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGNtZCAgICAgICBBIHBvaW50ZXIgdG8gY21kX2RzX2NvbW1hbmQgc3RydWN0dXJlCisgKiAgQHBhcmFtIHBkYXRhX2J1ZiBWb2lkIGNhc3Qgb2YgcG9pbnRlciB0byBhIEJTU0lEIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCisgKgorICogIEByZXR1cm4gICAgICAgICAwIG9yIC0xCisgKi8KK2ludCBsaWJlcnRhc19jbWRfODAyMTFfYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSB2b2lkICpwZGF0YV9idWYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgKnBhdXRoZW50aWNhdGUgPQorCSAgICAmY21kLT5wYXJhbXMuYXV0aDsKKwl1OCAqYnNzaWQgPSBwZGF0YV9idWY7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2F1dGhlbnRpY2F0ZSk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2F1dGhlbnRpY2F0ZSkKKwkJCSAgICAgKyBTX0RTX0dFTik7CisKKwlwYXV0aGVudGljYXRlLT5hdXRodHlwZSA9IGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGU7CisJbWVtY3B5KHBhdXRoZW50aWNhdGUtPm1hY2FkZHIsIGJzc2lkLCBFVEhfQUxFTik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFVVEhfQ01EOiBCc3NpZCBpcyA6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCSAgICAgICBic3NpZFswXSwgYnNzaWRbMV0sIGJzc2lkWzJdLCBic3NpZFszXSwgYnNzaWRbNF0sIGJzc2lkWzVdKTsKKworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSAqZGF1dGggPSAmY21kLT5wYXJhbXMuZGVhdXRoOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSkgKworCQkJICAgICBTX0RTX0dFTik7CisKKwkvKiBzZXQgQVAgTUFDIGFkZHJlc3MgKi8KKwltZW1tb3ZlKGRhdXRoLT5tYWNhZGRyLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCUVUSF9BTEVOKTsKKworCS8qIFJlYXNvbiBjb2RlIDMgPSBTdGF0aW9uIGlzIGxlYXZpbmcgKi8KKyNkZWZpbmUgUkVBU09OX0NPREVfU1RBX0xFQVZJTkcgMworCWRhdXRoLT5yZWFzb25jb2RlID0gY3B1X3RvX2xlMTYoUkVBU09OX0NPREVfU1RBX0xFQVZJTkcpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxpYmVydGFzX2NtZF84MDIxMV9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpwZGF0YV9idWYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgKnBhc3NvID0gJmNtZC0+cGFyYW1zLmFzc29jaWF0ZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBic3NkZXNjOworCXU4ICpjYXJkX3JhdGVzOworCXU4ICpwb3M7CisJaW50IGNhcmRfcmF0ZXNfc2l6ZTsKKwl1MTYgdG1wY2FwOworCXN0cnVjdCBtcnZsaWV0eXBlc19zc2lkcGFyYW1zZXQgKnNzaWQ7CisJc3RydWN0IG1ydmxpZXR5cGVzX3BoeXBhcmFtc2V0ICpwaHk7CisJc3RydWN0IG1ydmxpZXR5cGVzX3NzcGFyYW1zZXQgKnNzOworCXN0cnVjdCBtcnZsaWV0eXBlc19yYXRlc3BhcmFtc2V0ICpyYXRlczsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNucGFyYW1zZXQgKnJzbjsKKworCUVOVEVSKCk7CisKKwlwYnNzZGVzYyA9IHBkYXRhX2J1ZjsKKwlwb3MgPSAodTggKikgcGFzc287CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2Fzc29jaWF0ZSk7CisKKwkvKiBTYXZlIHNvIHdlIGtub3cgd2hpY2ggQlNTIERlc2MgdG8gdXNlIGluIHRoZSByZXNwb25zZSBoYW5kbGVyICovCisJYWRhcHRlci0+cGF0dGVtcHRlZGJzc2Rlc2MgPSBwYnNzZGVzYzsKKworCW1lbWNweShwYXNzby0+cGVlcnN0YWFkZHIsCisJICAgICAgIHBic3NkZXNjLT5tYWNhZGRyZXNzLCBzaXplb2YocGFzc28tPnBlZXJzdGFhZGRyKSk7CisJcG9zICs9IHNpemVvZihwYXNzby0+cGVlcnN0YWFkZHIpOworCisJLyogc2V0IHRoZSBsaXN0ZW4gaW50ZXJ2YWwgKi8KKwlwYXNzby0+bGlzdGVuaW50ZXJ2YWwgPSBhZGFwdGVyLT5saXN0ZW5pbnRlcnZhbDsKKworCXBvcyArPSBzaXplb2YocGFzc28tPmNhcGluZm8pOworCXBvcyArPSBzaXplb2YocGFzc28tPmxpc3RlbmludGVydmFsKTsKKwlwb3MgKz0gc2l6ZW9mKHBhc3NvLT5iY25wZXJpb2QpOworCXBvcyArPSBzaXplb2YocGFzc28tPmR0aW1wZXJpb2QpOworCisJc3NpZCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0ICopIHBvczsKKwlzc2lkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1NTSUQpOworCXNzaWQtPmhlYWRlci5sZW4gPSBwYnNzZGVzYy0+c3NpZC5zc2lkbGVuZ3RoOworCW1lbWNweShzc2lkLT5zc2lkLCBwYnNzZGVzYy0+c3NpZC5zc2lkLCBzc2lkLT5oZWFkZXIubGVuKTsKKwlwb3MgKz0gc2l6ZW9mKHNzaWQtPmhlYWRlcikgKyBzc2lkLT5oZWFkZXIubGVuOworCXNzaWQtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzc2lkLT5oZWFkZXIubGVuKTsKKworCXBoeSA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcGh5cGFyYW1zZXQgKikgcG9zOworCXBoeS0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9QSFlfRFMpOworCXBoeS0+aGVhZGVyLmxlbiA9IHNpemVvZihwaHktPmZoX2RzLmRzcGFyYW1zZXQpOworCW1lbWNweSgmcGh5LT5maF9kcy5kc3BhcmFtc2V0LAorCSAgICAgICAmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQuY3VycmVudGNoYW4sCisJICAgICAgIHNpemVvZihwaHktPmZoX2RzLmRzcGFyYW1zZXQpKTsKKwlwb3MgKz0gc2l6ZW9mKHBoeS0+aGVhZGVyKSArIHBoeS0+aGVhZGVyLmxlbjsKKwlwaHktPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihwaHktPmhlYWRlci5sZW4pOworCisJc3MgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3NzcGFyYW1zZXQgKikgcG9zOworCXNzLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0NGKTsKKwlzcy0+aGVhZGVyLmxlbiA9IHNpemVvZihzcy0+Y2ZfaWJzcy5jZnBhcmFtc2V0KTsKKwlwb3MgKz0gc2l6ZW9mKHNzLT5oZWFkZXIpICsgc3MtPmhlYWRlci5sZW47CisJc3MtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzcy0+aGVhZGVyLmxlbik7CisKKwlyYXRlcyA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcmF0ZXNwYXJhbXNldCAqKSBwb3M7CisJcmF0ZXMtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfUkFURVMpOworCisJbWVtY3B5KCZyYXRlcy0+cmF0ZXMsICZwYnNzZGVzYy0+bGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzLCBXTEFOX1NVUFBPUlRFRF9SQVRFUyk7CisKKwljYXJkX3JhdGVzID0gbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzOworCWNhcmRfcmF0ZXNfc2l6ZSA9IHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpOworCisJaWYgKGdldF9jb21tb25fcmF0ZXMoYWRhcHRlciwgcmF0ZXMtPnJhdGVzLCBXTEFOX1NVUFBPUlRFRF9SQVRFUywKKwkJCSAgICAgY2FyZF9yYXRlcywgY2FyZF9yYXRlc19zaXplKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXJhdGVzLT5oZWFkZXIubGVuID0gbWluX3Qoc2l6ZV90LCBzdHJsZW4ocmF0ZXMtPnJhdGVzKSwgV0xBTl9TVVBQT1JURURfUkFURVMpOworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5udW1vZnJhdGVzID0gcmF0ZXMtPmhlYWRlci5sZW47CisKKwlwb3MgKz0gc2l6ZW9mKHJhdGVzLT5oZWFkZXIpICsgcmF0ZXMtPmhlYWRlci5sZW47CisJcmF0ZXMtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihyYXRlcy0+aGVhZGVyLmxlbik7CisKKwlpZiAoYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKKwkJcnNuID0gKHN0cnVjdCBtcnZsaWV0eXBlc19yc25wYXJhbXNldCAqKSBwb3M7CisJCXJzbi0+aGVhZGVyLnR5cGUgPSAodTE2KSBhZGFwdGVyLT53cGFfaWVbMF07CS8qIFdQQV9JRSBvciBXUEEyX0lFICovCisJCXJzbi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihyc24tPmhlYWRlci50eXBlKTsKKwkJcnNuLT5oZWFkZXIubGVuID0gKHUxNikgYWRhcHRlci0+d3BhX2llWzFdOworCQltZW1jcHkocnNuLT5yc25pZSwgJmFkYXB0ZXItPndwYV9pZVsyXSwgcnNuLT5oZWFkZXIubGVuKTsKKwkJbGJzX2RiZ19oZXgoIkFTU09DX0NNRDogUlNOIElFIiwgKHU4ICopIHJzbiwKKwkJCXNpemVvZihyc24tPmhlYWRlcikgKyByc24tPmhlYWRlci5sZW4pOworCQlwb3MgKz0gc2l6ZW9mKHJzbi0+aGVhZGVyKSArIHJzbi0+aGVhZGVyLmxlbjsKKwkJcnNuLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYocnNuLT5oZWFkZXIubGVuKTsKKwl9CisKKwkvKiB1cGRhdGUgY3VyYnNzcGFyYW1zICovCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPQorCSAgICAocGJzc2Rlc2MtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQuY3VycmVudGNoYW4pOworCisJLyogQ29weSB0aGUgaW5mcmEuIGFzc29jaWF0aW9uIHJhdGVzIGludG8gQ3VycmVudCBCU1Mgc3RhdGUgc3RydWN0dXJlICovCisJbWVtY3B5KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLCAmcmF0ZXMtPnJhdGVzLAorCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzKSwgcmF0ZXMtPmhlYWRlci5sZW4pKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQVNTT0NfQ01EOiByYXRlcy0+aGVhZGVyLmxlbiA9ICVkXG4iLCByYXRlcy0+aGVhZGVyLmxlbik7CisKKwkvKiBzZXQgSUJTUyBmaWVsZCAqLworCWlmIChwYnNzZGVzYy0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworI2RlZmluZSBDQVBJTkZPX0VTU19NT0RFIDEKKwkJcGFzc28tPmNhcGluZm8uZXNzID0gQ0FQSU5GT19FU1NfTU9ERTsKKwl9CisKKwlpZiAobGliZXJ0YXNfcGFyc2VfZG5sZF9jb3VudHJ5aW5mb18xMWQocHJpdikpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNigodTE2KSAocG9zIC0gKHU4ICopIHBhc3NvKSArIFNfRFNfR0VOKTsKKworCS8qIHNldCB0aGUgY2FwYWJpbGl0eSBpbmZvIGF0IGxhc3QgKi8KKwltZW1jcHkoJnRtcGNhcCwgJnBic3NkZXNjLT5jYXAsIHNpemVvZihwYXNzby0+Y2FwaW5mbykpOworCXRtcGNhcCAmPSBDQVBJTkZPX01BU0s7CisJbGJzX3ByX2RlYnVnKDEsICJBU1NPQ19DTUQ6IHRtcGNhcD0lNFggQ0FQSU5GT19NQVNLPSU0WFxuIiwKKwkgICAgICAgdG1wY2FwLCBDQVBJTkZPX01BU0spOworCXRtcGNhcCA9IGNwdV90b19sZTE2KHRtcGNhcCk7CisJbWVtY3B5KCZwYXNzby0+Y2FwaW5mbywgJnRtcGNhcCwgc2l6ZW9mKHBhc3NvLT5jYXBpbmZvKSk7CisKKyAgICAgIGRvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqcHNzaWQpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgKmFkaHMgPSAmY21kLT5wYXJhbXMuYWRzOworCWludCByZXQgPSAwOworCWludCBjbWRhcHBlbmRzaXplID0gMDsKKwlpbnQgaTsKKwl1MTYgdG1wY2FwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2M7CisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQgPSBwc3NpZDsKKworCUVOVEVSKCk7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2FkX2hvY19zdGFydCk7CisKKwlwYnNzZGVzYyA9ICZhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvcjsKKwlhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYyA9IHBic3NkZXNjOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciAyIGRhdGEgc3RydWN0dXJlczoKKwkgKiAgIDEuIGNtZF9kc184MDJfMTFfYWRfaG9jX3N0YXJ0IGNvbW1hbmQKKwkgKiAgIDIuIGFkYXB0ZXItPnNjYW50YWJsZVtpXQorCSAqCisJICogRHJpdmVyIHdpbGwgZmlsbCB1cCBTU0lELCBic3N0eXBlLElCU1MgcGFyYW0sIFBoeXNpY2FsIFBhcmFtLAorCSAqICAgcHJvYmUgZGVsYXksIGFuZCBjYXAgaW5mby4KKwkgKgorCSAqIEZpcm13YXJlIHdpbGwgZmlsbCB1cCBiZWFjb24gcGVyaW9kLCBEVElNLCBCYXNpYyByYXRlcworCSAqICAgYW5kIG9wZXJhdGlvbmFsIHJhdGVzLgorCSAqLworCisJbWVtc2V0KGFkaHMtPlNTSUQsIDAsIElXX0VTU0lEX01BWF9TSVpFKTsKKworCW1lbWNweShhZGhzLT5TU0lELCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkbGVuZ3RoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19DTUQ6IFNTSUQgPSAlc1xuIiwgYWRocy0+U1NJRCk7CisKKwltZW1zZXQocGJzc2Rlc2MtPnNzaWQuc3NpZCwgMCwgSVdfRVNTSURfTUFYX1NJWkUpOworCW1lbWNweShwYnNzZGVzYy0+c3NpZC5zc2lkLCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkbGVuZ3RoKTsKKworCXBic3NkZXNjLT5zc2lkLnNzaWRsZW5ndGggPSBzc2lkLT5zc2lkbGVuZ3RoOworCisJLyogc2V0IHRoZSBCU1MgdHlwZSAqLworCWFkaHMtPmJzc3R5cGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKKwlwYnNzZGVzYy0+aW5mcmFtb2RlID0gd2xhbjgwMl8xMWlic3M7CisJYWRocy0+YmVhY29ucGVyaW9kID0gYWRhcHRlci0+YmVhY29ucGVyaW9kOworCisJLyogc2V0IFBoeXNpY2FsIHBhcmFtIHNldCAqLworI2RlZmluZSBEU19QQVJBX0lFX0lEICAgMworI2RlZmluZSBEU19QQVJBX0lFX0xFTiAgMQorCisJYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5lbGVtZW50aWQgPSBEU19QQVJBX0lFX0lEOworCWFkaHMtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQubGVuID0gRFNfUEFSQV9JRV9MRU47CisKKwlXQVJOX09OKCFhZGFwdGVyLT5hZGhvY2NoYW5uZWwpOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogQ3JlYXRpbmcgQURIT0Mgb24gY2hhbm5lbCAlZFxuIiwKKwkgICAgICAgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsID0gYWRhcHRlci0+YWRob2NjaGFubmVsOworCisJcGJzc2Rlc2MtPmNoYW5uZWwgPSBhZGFwdGVyLT5hZGhvY2NoYW5uZWw7CisJYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5jdXJyZW50Y2hhbiA9IGFkYXB0ZXItPmFkaG9jY2hhbm5lbDsKKworCW1lbWNweSgmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LAorCSAgICAgICAmYWRocy0+cGh5cGFyYW1zZXQsIHNpemVvZih1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQpKTsKKworCS8qIHNldCBJQlNTIHBhcmFtIHNldCAqLworI2RlZmluZSBJQlNTX1BBUkFfSUVfSUQgICA2CisjZGVmaW5lIElCU1NfUEFSQV9JRV9MRU4gIDIKKworCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmVsZW1lbnRpZCA9IElCU1NfUEFSQV9JRV9JRDsKKwlhZGhzLT5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5sZW4gPSBJQlNTX1BBUkFfSUVfTEVOOworCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmF0aW13aW5kb3cgPSBhZGFwdGVyLT5hdGltd2luZG93OworCW1lbWNweSgmcGJzc2Rlc2MtPnNzcGFyYW1zZXQsCisJICAgICAgICZhZGhzLT5zc3BhcmFtc2V0LCBzaXplb2YodW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQpKTsKKworCS8qIHNldCBjYXBhYmlsaXR5IGluZm8gKi8KKwlhZGhzLT5jYXAuZXNzID0gMDsKKwlhZGhzLT5jYXAuaWJzcyA9IDE7CisJcGJzc2Rlc2MtPmNhcC5pYnNzID0gMTsKKworCS8qIHByb2JlZGVsYXkgKi8KKwlhZGhzLT5wcm9iZWRlbGF5ID0gY3B1X3RvX2xlMTYoY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSk7CisKKwkvKiBzZXQgdXAgcHJpdmFjeSBpbiBhZGFwdGVyLT5zY2FudGFibGVbaV0gKi8KKwlpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQpIHsKKworI2RlZmluZSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT04gMQorCQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiBXRVBzdGF0dXMgc2V0LCBwcml2YWN5IHRvIFdFUFxuIik7CisJCXBic3NkZXNjLT5wcml2YWN5ID0gd2xhbjgwMl8xMXByaXZmaWx0ZXI4MDIxeFdFUDsKKwkJYWRocy0+Y2FwLnByaXZhY3kgPSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT047CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogV0VQc3RhdHVzIE5PVCBzZXQsIFNldHRpbmcgIgorCQkgICAgICAgInByaXZhY3kgdG8gQUNDRVBUIEFMTFxuIik7CisJCXBic3NkZXNjLT5wcml2YWN5ID0gd2xhbjgwMl8xMXByaXZmaWx0ZXJhY2NlcHRhbGw7CisJfQorCisJbWVtc2V0KGFkaHMtPmRhdGFyYXRlLCAwLCBzaXplb2YoYWRocy0+ZGF0YXJhdGUpKTsKKworCWlmIChhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkKSB7CisJCW1lbWNweShhZGhzLT5kYXRhcmF0ZSwgbGliZXJ0YXNfYWRob2NfcmF0ZXNfZywKKwkJICAgICAgIG1pbihzaXplb2YoYWRocy0+ZGF0YXJhdGUpLCBzaXplb2YobGliZXJ0YXNfYWRob2NfcmF0ZXNfZykpKTsKKwl9IGVsc2UgeworCQltZW1jcHkoYWRocy0+ZGF0YXJhdGUsIGxpYmVydGFzX2FkaG9jX3JhdGVzX2IsCisJCSAgICAgICBtaW4oc2l6ZW9mKGFkaHMtPmRhdGFyYXRlKSwgc2l6ZW9mKGxpYmVydGFzX2FkaG9jX3JhdGVzX2IpKSk7CisJfQorCisJLyogRmluZCB0aGUgbGFzdCBub24gemVybyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYWRocy0+ZGF0YXJhdGUpICYmIGFkaHMtPmRhdGFyYXRlW2ldOyBpKyspIDsKKworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5udW1vZnJhdGVzID0gaTsKKworCS8qIENvcHkgdGhlIGFkLWhvYyBjcmVhdGluZyByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmRhdGFyYXRlcywKKwkgICAgICAgJmFkaHMtPmRhdGFyYXRlLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMubnVtb2ZyYXRlcyk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiByYXRlcz0lMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKKwkgICAgICAgYWRocy0+ZGF0YXJhdGVbMF0sIGFkaHMtPmRhdGFyYXRlWzFdLAorCSAgICAgICBhZGhzLT5kYXRhcmF0ZVsyXSwgYWRocy0+ZGF0YXJhdGVbM10pOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogQUQgSE9DIFN0YXJ0IGNvbW1hbmQgaXMgcmVhZHlcbiIpOworCisJaWYgKGxpYmVydGFzX2NyZWF0ZV9kbmxkX2NvdW50cnlpbmZvXzExZChwcml2KSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiBkbmxkX2NvdW50cnlpbmZvXzExZCBmYWlsZWRcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQpCisJCQkgICAgICsgU19EU19HRU4gKyBjbWRhcHBlbmRzaXplKTsKKworCW1lbWNweSgmdG1wY2FwLCAmYWRocy0+Y2FwLCBzaXplb2YodTE2KSk7CisJdG1wY2FwID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKKwltZW1jcHkoJmFkaHMtPmNhcCwgJnRtcGNhcCwgc2l6ZW9mKHUxNikpOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdG9wKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9hZF9ob2Nfc3RvcCk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX2pvaW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqcGRhdGFfYnVmKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX2pvaW4gKnBhZGhvY2pvaW4gPSAmY21kLT5wYXJhbXMuYWRqOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2MgPSBwZGF0YV9idWY7CisJaW50IGNtZGFwcGVuZHNpemUgPSAwOworCWludCByZXQgPSAwOworCXU4ICpjYXJkX3JhdGVzOworCWludCBjYXJkX3JhdGVzX3NpemU7CisJdTE2IHRtcGNhcDsKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYyA9IHBic3NkZXNjOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9hZF9ob2Nfam9pbik7CisKKwlwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmJzc3R5cGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKKworCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuYmVhY29ucGVyaW9kID0gcGJzc2Rlc2MtPmJlYWNvbnBlcmlvZDsKKworCW1lbWNweSgmcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRCwKKwkgICAgICAgJnBic3NkZXNjLT5tYWNhZGRyZXNzLCBFVEhfQUxFTik7CisKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuU1NJRCwKKwkgICAgICAgJnBic3NkZXNjLT5zc2lkLnNzaWQsIHBic3NkZXNjLT5zc2lkLnNzaWRsZW5ndGgpOworCisJbWVtY3B5KCZwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLnBoeXBhcmFtc2V0LAorCSAgICAgICAmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LCBzaXplb2YodW5pb24gaWVlZXR5cGVzX3BoeXBhcmFtc2V0KSk7CisKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3Iuc3NwYXJhbXNldCwKKwkgICAgICAgJnBic3NkZXNjLT5zc3BhcmFtc2V0LCBzaXplb2YodW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQpKTsKKworCW1lbWNweSgmdG1wY2FwLCAmcGJzc2Rlc2MtPmNhcCwgc2l6ZW9mKHN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbykpOworCXRtcGNhcCAmPSBDQVBJTkZPX01BU0s7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX0pfQ01EOiB0bXBjYXA9JTRYIENBUElORk9fTUFTSz0lNFhcbiIsCisJICAgICAgIHRtcGNhcCwgQ0FQSU5GT19NQVNLKTsKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLCAmdG1wY2FwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19jYXBpbmZvKSk7CisKKwkvKiBpbmZvcm1hdGlvbiBvbiBCU1NJRCBkZXNjcmlwdG9yIHBhc3NlZCB0byBGVyAqLworICAgIGxic19wcl9kZWJ1ZygxLAorCSAgICAgICAiQURIT0NfSl9DTUQ6IEJTU0lEID0gJTJ4LSUyeC0lMngtJTJ4LSUyeC0lMngsIFNTSUQgPSAlc1xuIiwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFswXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFsxXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFsyXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFszXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFs0XSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFs1XSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5TU0lEKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfSl9DTUQ6IERhdGEgUmF0ZSA9ICV4XG4iLAorCSAgICAgICAodTMyKSBwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcyk7CisKKwkvKiBmYWlsdGltZW91dCAqLworCXBhZGhvY2pvaW4tPmZhaWx0aW1lb3V0ID0gY3B1X3RvX2xlMTYoTVJWRFJWX0FTU09DSUFUSU9OX1RJTUVfT1VUKTsKKworCS8qIHByb2JlZGVsYXkgKi8KKwlwYWRob2Nqb2luLT5wcm9iZWRlbGF5ID0KKwkgICAgY3B1X3RvX2xlMTYoY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSk7CisKKwkvKiBDb3B5IERhdGEgcmF0ZXMgZnJvbSB0aGUgcmF0ZXMgcmVjb3JkZWQgaW4gc2NhbiByZXNwb25zZSAqLworCW1lbXNldChwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcywgMCwKKwkgICAgICAgc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKSk7CisJbWVtY3B5KHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzLCBwYnNzZGVzYy0+ZGF0YXJhdGVzLAorCSAgICAgICBtaW4oc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKSwKKwkJICAgc2l6ZW9mKHBic3NkZXNjLT5kYXRhcmF0ZXMpKSk7CisKKwljYXJkX3JhdGVzID0gbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzOworCWNhcmRfcmF0ZXNfc2l6ZSA9IHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpOworCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPSBwYnNzZGVzYy0+Y2hhbm5lbDsKKworCWlmIChnZXRfY29tbW9uX3JhdGVzKGFkYXB0ZXIsIHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzLAorCQkJICAgICBzaXplb2YocGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5kYXRhcmF0ZXMpLAorCQkJICAgICBjYXJkX3JhdGVzLCBjYXJkX3JhdGVzX3NpemUpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfSl9DTUQ6IGdldF9jb21tb25fcmF0ZXMgcmV0dXJucyBlcnJvci5cbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCS8qIEZpbmQgdGhlIGxhc3Qgbm9uIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKQorCSAgICAgJiYgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5kYXRhcmF0ZXNbaV07IGkrKykgOworCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMgPSBpOworCisJLyoKKwkgKiBDb3B5IHRoZSBhZGhvYyBqb2luaW5nIHJhdGVzIHRvIEN1cnJlbnQgQlNTIFN0YXRlIHN0cnVjdHVyZQorCSAqLworCW1lbWNweShhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLAorCSAgICAgICBwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcywKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMpOworCisJcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5hdGltd2luZG93ID0KKwkgICAgY3B1X3RvX2xlMTYocGJzc2Rlc2MtPmF0aW13aW5kb3cpOworCisJaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKSB7CisJCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLnByaXZhY3kgPSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT047CisJfQorCisJaWYgKGFkYXB0ZXItPnBzbW9kZSA9PSB3bGFuODAyXzExcG93ZXJtb2RlbWF4X3BzcCkgeworCQkvKiB3YWtlIHVwIGZpcnN0ICovCisJCWVudW0gV0xBTl84MDJfMTFfUE9XRVJfTU9ERSBMb2NhbHBzbW9kZTsKKworCQlMb2NhbHBzbW9kZSA9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW07CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9wc19tb2RlLAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICAwLCAwLCAmTG9jYWxwc21vZGUpOworCisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGxpYmVydGFzX3BhcnNlX2RubGRfY291bnRyeWluZm9fMTFkKHByaXYpKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19qb2luKQorCQkJICAgICArIFNfRFNfR0VOICsgY21kYXBwZW5kc2l6ZSk7CisKKwltZW1jcHkoJnRtcGNhcCwgJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19jYXBpbmZvKSk7CisJdG1wY2FwID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKKworCW1lbWNweSgmcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5jYXAsCisJICAgICAgICZ0bXBjYXAsIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8pKTsKKworICAgICAgZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19yZXRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGllZWV0eXBlc19hc3NvY3JzcCAqcGFzc29jcnNwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2M7CisKKwlFTlRFUigpOworCisJcGFzc29jcnNwID0gKHN0cnVjdCBpZWVldHlwZXNfYXNzb2Nyc3AgKikgJiByZXNwLT5wYXJhbXM7CisKKwlpZiAocGFzc29jcnNwLT5zdGF0dXNjb2RlKSB7CisKKwkJbGliZXJ0YXNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKKworICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJBU1NPQ19SRVNQOiBBc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyBjb2RlID0gJWRcbiIsCisJCSAgICAgICBwYXNzb2Nyc3AtPnN0YXR1c2NvZGUpOworCisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJzX2RiZ19oZXgoIkFTU09DX1JFU1A6IiwgKHZvaWQgKikmcmVzcC0+cGFyYW1zLAorCQlsZTE2X3RvX2NwdShyZXNwLT5zaXplKSAtIFNfRFNfR0VOKTsKKworCS8qIFNlbmQgYSBNZWRpYSBDb25uZWN0ZWQgZXZlbnQsIGFjY29yZGluZyB0byB0aGUgU3BlYyAqLworCWFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID0gbGliZXJ0YXNfY29ubmVjdGVkOworCisJLyogU2V0IHRoZSBhdHRlbXB0ZWQgQlNTSUQgSW5kZXggdG8gY3VycmVudCAqLworCXBic3NkZXNjID0gYWRhcHRlci0+cGF0dGVtcHRlZGJzc2Rlc2M7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6ICVzXG4iLCBwYnNzZGVzYy0+c3NpZC5zc2lkKTsKKworCS8qIFNldCB0aGUgbmV3IFNTSUQgdG8gY3VycmVudCBTU0lEICovCisJbWVtY3B5KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZCwKKwkgICAgICAgJnBic3NkZXNjLT5zc2lkLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX1NTSUQpKTsKKworCS8qIFNldCB0aGUgbmV3IEJTU0lEIChBUCdzIE1BQyBhZGRyZXNzKSB0byBjdXJyZW50IEJTU0lEICovCisJbWVtY3B5KGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwKKwkgICAgICAgcGJzc2Rlc2MtPm1hY2FkZHJlc3MsIEVUSF9BTEVOKTsKKworCS8qIE1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgQlNTSUQgZGVzY3JpcHRvciAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2Rlc2NyaXB0b3IsCisJICAgICAgIHBic3NkZXNjLCBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6IGN1cnJlbnRwYWNrZXRmaWx0ZXIgaXMgJXhcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIpOworCisJYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddID0gMDsKKwlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSA9IDA7CisKKwltZW1zZXQoYWRhcHRlci0+cmF3U05SLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3U05SKSk7CisJbWVtc2V0KGFkYXB0ZXItPnJhd05GLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3TkYpKTsKKwlhZGFwdGVyLT5uZXh0U05STkYgPSAwOworCWFkYXB0ZXItPm51bVNOUk5GID0gMDsKKworCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6IEFzc29jaWF0ZWQgXG4iKTsKKworCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgIGRvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2Rpc2Fzc29jaWF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJRU5URVIoKTsKKworCWxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgY29tbWFuZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmNvbW1hbmQpOworCXUxNiByZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwLT5yZXN1bHQpOworCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgKnBhZGhvY3Jlc3VsdDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGJzc19kZXNjcmlwdG9yICpwYnNzZGVzYzsKKworCUVOVEVSKCk7CisKKwlwYWRob2NyZXN1bHQgPSAmcmVzcC0+cGFyYW1zLnJlc3VsdDsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19SRVNQOiBzaXplID0gJWRcbiIsIGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpKTsKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfUkVTUDogY29tbWFuZCA9ICV4XG4iLCBjb21tYW5kKTsKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfUkVTUDogcmVzdWx0ID0gJXhcbiIsIHJlc3VsdCk7CisKKwlwYnNzZGVzYyA9IGFkYXB0ZXItPnBhdHRlbXB0ZWRic3NkZXNjOworCisJLyoKKwkgKiBKb2luIHJlc3VsdCBjb2RlIDAgLS0+IFNVQ0NFU1MKKwkgKi8KKwlpZiAocmVzdWx0KSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfUkVTUCBmYWlsZWRcbiIpOworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlsaWJlcnRhc19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCQl9CisKKwkJbWVtc2V0KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvciwKKwkJICAgICAgIDB4MDAsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvcikpOworCisJCUxFQVZFKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGUgam9pbiBjbWQgc2hvdWxkIGJlIHN1Y2Nlc3NmdWwKKwkgKiBJZiBCU1NJRCBoYXMgY2hhbmdlZCB1c2UgU1NJRCB0byBjb21wYXJlIGluc3RlYWQgb2YgQlNTSUQKKwkgKi8KKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX0pfUkVTUCAgJXNcbiIsIHBic3NkZXNjLT5zc2lkLnNzaWQpOworCisJLyogU2VuZCBhIE1lZGlhIENvbm5lY3RlZCBldmVudCwgYWNjb3JkaW5nIHRvIHRoZSBTcGVjICovCisJYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPSBsaWJlcnRhc19jb25uZWN0ZWQ7CisKKwlpZiAoY29tbWFuZCA9PSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfc3RhcnQpIHsKKwkJLyogVXBkYXRlIHRoZSBjcmVhdGVkIG5ldHdvcmsgZGVzY3JpcHRvciB3aXRoIHRoZSBuZXcgQlNTSUQgKi8KKwkJbWVtY3B5KHBic3NkZXNjLT5tYWNhZGRyZXNzLAorCQkgICAgICAgcGFkaG9jcmVzdWx0LT5CU1NJRCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisKKwkJLyogTWFrZSBhIGNvcHkgb2YgY3VycmVudCBCU1NJRCBkZXNjcmlwdG9yLCBvbmx5IG5lZWRlZCBmb3Igam9pbiBzaW5jZQorCQkgKiAgIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGZvciBhZGhvYyBzdGFydAorCQkgKi8KKwkJbWVtbW92ZSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2Rlc2NyaXB0b3IsCisJCQlwYnNzZGVzYywgc2l6ZW9mKHN0cnVjdCBic3NfZGVzY3JpcHRvcikpOworCX0KKworCS8qIFNldCB0aGUgQlNTSUQgZnJvbSB0aGUgam9pbmVkL3N0YXJ0ZWQgZGVzY3JpcHRvciAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLAorCSAgICAgICBwYnNzZGVzYy0+bWFjYWRkcmVzcywgRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSBuZXcgU1NJRCB0byBjdXJyZW50IFNTSUQgKi8KKwltZW1jcHkoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLAorCSAgICAgICAmcGJzc2Rlc2MtPnNzaWQsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCisJbmV0aWZfY2Fycmllcl9vbihwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwgRVRIX0FMRU4pOworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT53bGFuX2Rldi5uZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiAtIEpvaW5lZC9TdGFydGVkIEFkIEhvY1xuIik7CisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiBjaGFubmVsID0gJWRcbiIsIGFkYXB0ZXItPmFkaG9jY2hhbm5lbCk7CisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiBCU1NJRCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzBdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzFdLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzJdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzNdLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzRdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzVdKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGxpYmVydGFzX3JldF84MDIxMV9hZF9ob2Nfc3RvcCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlFTlRFUigpOworCisJbGliZXJ0YXNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmYTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uaApAQCAtMCwwICsxLDY0IEBACisvKiAtKi0gbW9kZTogQzsgdGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotICovCisvKiB2aTogc2V0IGV4cGFuZHRhYiBzaGlmdHdpZHRoPTQgdGFic3RvcD00IHRleHR3aWR0aD03ODogKi8KKworLyoqCisgICogSW50ZXJmYWNlIGZvciB0aGUgd2xhbiBpbmZyYXN0cnVjdHVyZSBhbmQgYWRob2Mgam9pbiByb3V0aW5lcworICAqCisgICogRHJpdmVyIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgam9pbiBtb2R1bGUKKyAgKiAgIGltcGxlbWVudGVkIGluIHdsYW5fam9pbi5jLiAgUHJvY2VzcyBhbGwgc3RhcnQvam9pbiByZXF1ZXN0cyBmb3IKKyAgKiAgIGJvdGggYWRob2MgYW5kIGluZnJhc3RydWN0dXJlIG5ldHdvcmtzCisgICovCisjaWZuZGVmIF9XTEFOX0pPSU5fSAorI2RlZmluZSBfV0xBTl9KT0lOX0gKKworI2luY2x1ZGUgImRlZnMuaCIKKworc3RydWN0IGNtZF9kc19jb21tYW5kOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQl2b2lkICpwZGF0YV9idWYpOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX2pvaW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgIHZvaWQgKnBkYXRhX2J1Zik7CitleHRlcm4gaW50IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfc3RvcCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCk7CitleHRlcm4gaW50IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfc3RhcnQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCXZvaWQgKnBzc2lkKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCSAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgIHZvaWQgKnBkYXRhX2J1Zik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworZXh0ZXJuIGludCBsaWJlcnRhc19yZXRfODAyMTFfYWRfaG9jX3N0b3Aod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2Rpc2Fzc29jaWF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworZXh0ZXJuIGludCBsaWJlcnRhc19yZXRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworCitleHRlcm4gaW50IGxpYmVydGFzX2lkbGVfb24od2xhbl9wcml2YXRlICogcHJpdik7CitleHRlcm4gaW50IGxpYmVydGFzX2lkbGVfb2ZmKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitleHRlcm4gaW50IGxpYmVydGFzX2RvX2FkaG9jc3RvcF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmVhc3NvY2lhdGlvbl90aHJlYWQodm9pZCAqZGF0YSk7CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9TU0lEOworc3RydWN0IGJzc19kZXNjcmlwdG9yOworCitleHRlcm4gaW50IGxpYmVydGFzX3N0YXJ0X2FkaG9jX25ldHdvcmsod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKmFkaG9jc3NpZCk7CitleHRlcm4gaW50IGxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBic3NkZXNjKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitleHRlcm4gaW50IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc2VuZF9kZWF1dGgod2xhbl9wcml2YXRlICogcHJpdik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfZG9fYWRob2NzdG9wX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitpbnQgd2xhbl9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGJzc19kZXNjcmlwdG9yICogcGJzc2Rlc2MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTcwNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC0wLDAgKzEsMTI1OCBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWpvciBmdW5jdGlvbnMgaW4gV0xBTgorICAqIGRyaXZlci4gSXQgaW5jbHVkZXMgaW5pdCwgZXhpdCwgb3BlbiwgY2xvc2UgYW5kIG1haW4KKyAgKiB0aHJlYWQgZXRjLi4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInNiaS5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmdy5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCisjaW5jbHVkZSAiYXNzb2MuaCIKKworI2lmZGVmIEVOQUJMRV9QTQorc3RhdGljIHN0cnVjdCBwbV9kZXYgKndsYW5fcG1fZGV2ID0gTlVMTDsKKyNlbmRpZgorCisjZGVmaW5lIFdMQU5fVFhfUFdSX0RFRkFVTFQJCTIwCS8qMTAwbVcgKi8KKyNkZWZpbmUgV0xBTl9UWF9QV1JfVVNfREVGQVVMVAkJMjAJLyoxMDBtVyAqLworI2RlZmluZSBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUCQkxNgkvKjUwbVcgKi8KKyNkZWZpbmUgV0xBTl9UWF9QV1JfRlJfREVGQVVMVAkJMjAJLyoxMDBtVyAqLworI2RlZmluZSBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFQJMjAJLyoxMDBtVyAqLworCisvKiBGb3JtYXQgeyBjaGFubmVsLCBmcmVxdWVuY3kgKE1IeiksIG1heHR4cG93ZXIgfSAqLworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogVVNBIEZDQy9DYW5hZGEgSUMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9VU19CR1tdID0geworCXsxLCAyNDEyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7MiwgMjQxNywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezMsIDI0MjIsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXs0LCAyNDI3LCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7NSwgMjQzMiwgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezYsIDI0MzcsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXs3LCAyNDQyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7OCwgMjQ0NywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezksIDI0NTIsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXsxMCwgMjQ1NywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezExLCAyNDYyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogRXVyb3BlIEVUU0kgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9FVV9CR1tdID0geworCXsxLCAyNDEyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsyLCAyNDE3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXszLCAyNDIyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs0LCAyNDI3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs1LCAyNDMyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs2LCAyNDM3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs3LCAyNDQyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs4LCAyNDQ3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs5LCAyNDUyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsxMCwgMjQ1NywgV0xBTl9UWF9QV1JfRU1FQV9ERUZBVUxUfSwKKwl7MTEsIDI0NjIsIFdMQU5fVFhfUFdSX0VNRUFfREVGQVVMVH0sCisJezEyLCAyNDY3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsxMywgMjQ3MiwgV0xBTl9UWF9QV1JfRU1FQV9ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogU3BhaW4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9TUE5fQkdbXSA9IHsKKwl7MTAsIDI0NTcsIFdMQU5fVFhfUFdSX0RFRkFVTFR9LAorCXsxMSwgMjQ2MiwgV0xBTl9UWF9QV1JfREVGQVVMVH0KK307CisKKy8qIGJhbmQ6ICdCL0cnLCByZWdpb246IEZyYW5jZSAqLworc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX0ZSX0JHW10gPSB7CisJezEwLCAyNDU3LCBXTEFOX1RYX1BXUl9GUl9ERUZBVUxUfSwKKwl7MTEsIDI0NjIsIFdMQU5fVFhfUFdSX0ZSX0RFRkFVTFR9LAorCXsxMiwgMjQ2NywgV0xBTl9UWF9QV1JfRlJfREVGQVVMVH0sCisJezEzLCAyNDcyLCBXTEFOX1RYX1BXUl9GUl9ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogSmFwYW4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9KUE5fQkdbXSA9IHsKKwl7MSwgMjQxMiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezIsIDI0MTcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXszLCAyNDIyLCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7NCwgMjQyNywgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezUsIDI0MzIsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXs2LCAyNDM3LCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7NywgMjQ0MiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezgsIDI0NDcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXs5LCAyNDUyLCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7MTAsIDI0NTcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXsxMSwgMjQ2MiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezEyLCAyNDY3LCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7MTMsIDI0NzIsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXsxNCwgMjQ4NCwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0KK307CisKKy8qKgorICogdGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCwgZnJlcXVlbmN5IGFuZCBwb3dlcgorICovCitzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSB7CisJdTggcmVnaW9uOworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcF9CRzsKKwlpbnQgY2ZwX25vX0JHOworfTsKKworLyoqCisgKiB0aGUgc3RydWN0dXJlIGZvciB0aGUgbWFwcGluZyBiZXR3ZWVuIHJlZ2lvbiBhbmQgQ0ZQCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSByZWdpb25fY2ZwX3RhYmxlW10gPSB7CisJezB4MTAsCQkJLypVUyBGQ0MgKi8KKwkgY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHLAorCSBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgyMCwJCQkvKkNBTkFEQSBJQyAqLworCSBjaGFubmVsX2ZyZXFfcG93ZXJfVVNfQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfVVNfQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorCXsweDMwLCAvKkVVKi8gY2hhbm5lbF9mcmVxX3Bvd2VyX0VVX0JHLAorCSBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX0VVX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgzMSwgLypTUEFJTiovIGNoYW5uZWxfZnJlcV9wb3dlcl9TUE5fQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfU1BOX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgzMiwgLypGUkFOQ0UqLyBjaGFubmVsX2ZyZXFfcG93ZXJfRlJfQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfRlJfQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorCXsweDQwLCAvKkpBUEFOKi8gY2hhbm5lbF9mcmVxX3Bvd2VyX0pQTl9CRywKKwkgc2l6ZW9mKGNoYW5uZWxfZnJlcV9wb3dlcl9KUE5fQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorLypBZGQgbmV3IHJlZ2lvbiBoZXJlICovCit9OworCisvKioKKyAqIHRoZSByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQKKyAqLwordTggbGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXSA9CisgICAgeyAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDAwLCAweDBDLCAweDEyLAorCTB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkMsIDB4MDAKK307CisKKy8qKgorICogdGhlIHJhdGVzIHN1cHBvcnRlZAorICovCit1OCBsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXNbR19TVVBQT1JURURfUkFURVNdID0KKyAgICB7IDB4ODIsIDB4ODQsIDB4OGIsIDB4OTYsIDB4MGMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NmMsCiswIH07CisKKy8qKgorICogdGhlIHJhdGVzIHN1cHBvcnRlZCBmb3IgYWQtaG9jIEcgbW9kZQorICovCit1OCBsaWJlcnRhc19hZGhvY19yYXRlc19nW0dfU1VQUE9SVEVEX1JBVEVTXSA9CisgICAgeyAweDgyLCAweDg0LCAweDhiLCAweDk2LCAweDBjLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZjLAorMCB9OworCisvKioKKyAqIHRoZSByYXRlcyBzdXBwb3J0ZWQgZm9yIGFkLWhvYyBCIG1vZGUKKyAqLwordTggbGliZXJ0YXNfYWRob2NfcmF0ZXNfYls0XSA9IHsgMHg4MiwgMHg4NCwgMHg4YiwgMHg5NiB9OworCisvKioKKyAqIHRoZSBnbG9iYWwgdmFyaWFibGUgb2YgYSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogc3RydWN0dXJlIHZhcmlhYmxlCisgKi8KK3N0YXRpYyB3bGFuX3ByaXZhdGUgKndsYW5wcml2ID0gTlVMTDsKKworI2RlZmluZSBNQVhfREVWUyA1CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmxpYmVydGFzX2RldnNbTUFYX0RFVlNdOworc3RhdGljIGludCBsaWJlcnRhc19mb3VuZCA9IDA7CisKKy8qKgorICogdGhlIHRhYmxlIHRvIGtlZXAgcmVnaW9uIGNvZGUKKyAqLwordTE2IGxpYmVydGFzX3JlZ2lvbl9jb2RlX3RvX2luZGV4W01SVkRSVl9NQVhfUkVHSU9OX0NPREVdID0KKyAgICB7IDB4MTAsIDB4MjAsIDB4MzAsIDB4MzEsIDB4MzIsIDB4NDAgfTsKKworc3RhdGljIHU4ICpkZWZhdWx0X2Z3X25hbWUgPSAidXNiODM4OC5iaW4iOworCisvKioKKyAqIEF0dHJpYnV0ZXMgZXhwb3J0ZWQgdGhyb3VnaCBzeXNmcworICovCisjZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKKworLyoqCisgKiBAYnJpZWYgR2V0IGZ1bmN0aW9uIGZvciBzeXNmcyBhdHRyaWJ1dGUgbGliZXJ0YXNfbXBwCisgKi8KK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX21wcF9nZXQoc3RydWN0IGNsYXNzX2RldmljZSAqIGRldiwgY2hhciAqIGJ1ZikgeworCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgbWVzaF9hY2Nlc3M7CisKKwltZW1zZXQoJm1lc2hfYWNjZXNzLCAwLCBzaXplb2YobWVzaF9hY2Nlc3MpKTsKKwlsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQodG9fbmV0X2RldihkZXYpLT5wcml2LAorCQkJY21kX21lc2hfYWNjZXNzLAorCQkJY21kX2FjdF9tZXNoX2dldF9tcHAsCisJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsICh2b2lkICopJm1lc2hfYWNjZXNzKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDMsICIlZFxuIiwgbWVzaF9hY2Nlc3MuZGF0YVswXSk7Cit9CisKKy8qKgorICogQGJyaWVmIFNldCBmdW5jdGlvbiBmb3Igc3lzZnMgYXR0cmlidXRlIGxpYmVydGFzX21wcAorICovCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19tcHBfc2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKiBkZXYsIGNvbnN0IGNoYXIgKiBidWYsCisJCXNpemVfdCBjb3VudCkgeworCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgbWVzaF9hY2Nlc3M7CisKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCXNzY2FuZihidWYsICIlZCIsICYobWVzaF9hY2Nlc3MuZGF0YVswXSkpOworCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCgodG9fbmV0X2RldihkZXYpKS0+cHJpdiwKKwkJCWNtZF9tZXNoX2FjY2VzcywKKwkJCWNtZF9hY3RfbWVzaF9zZXRfbXBwLAorCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAodm9pZCAqKSZtZXNoX2FjY2Vzcyk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCisvKioKKyAqIGxpYmVydGFzX21wcCBhdHRyaWJ1dGUgdG8gYmUgZXhwb3J0ZWQgcGVyIG1zaFggaW50ZXJmYWNlCisgKiB0aHJvdWdoIHN5c2ZzICgvc3lzL2NsYXNzL25ldC9tc2hYL2xpYmVydGFzLW1wcCkKKyAqLworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGxpYmVydGFzX21wcCwgMDY0NCwgbGliZXJ0YXNfbXBwX2dldCwKKwkJbGliZXJ0YXNfbXBwX3NldCApOworCisvKioKKyAqICBAYnJpZWYgQ2hlY2sgaWYgdGhlIGRldmljZSBjYW4gYmUgb3BlbiBhbmQgd2FpdCBpZiBuZWNlc3NhcnkuCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqCisgKiBGb3IgVVNCIGFkYXB0ZXIsIG9uIHNvbWUgc3lzdGVtcyB0aGUgZGV2aWNlIG9wZW4gaGFuZGxlciB3aWxsIGJlCisgKiBjYWxsZWQgYmVmb3JlIEZXIHJlYWR5LiBVc2UgdGhlIGZvbGxvd2luZyBmbGFnIGNoZWNrIGFuZCB3YWl0CisgKiBmdW5jdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUgaXNzdWUuCisgKgorICovCitzdGF0aWMgaW50IHByZV9vcGVuX2NoZWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBpID0gMDsKKworCXdoaWxlICghYWRhcHRlci0+ZndfcmVhZHkgJiYgaSA8IDIwKSB7CisJCWkrKzsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwl9CisJaWYgKCFhZGFwdGVyLT5md19yZWFkeSkgeworCQlsYnNfcHJfaW5mbygiRlcgbm90IHJlYWR5LCBwcmVfb3Blbl9jaGVjaygpIHJldHVybiBmYWlsdXJlXG4iKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZGV2aWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCB3bGFuX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKworCXByaXYtPm9wZW4gPSAxOworCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJfSBlbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIG1zaFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCBtZXNoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdiA7CisKKwlpZihwcmVfb3Blbl9jaGVjayhkZXYpID09IC0xKQorCQlyZXR1cm4gLTE7CisJcHJpdi0+bWVzaF9vcGVuID0gMSA7CisJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bWVzaF9kZXYpOworCWlmIChwcml2LT5pbmZyYV9vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9vcGVuKHByaXYtPndsYW5fZGV2Lm5ldGRldikgOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZXRoWCBpbnRlcmZhY2UKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgMAorICovCitzdGF0aWMgaW50IHdsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2IDsKKworCWlmKHByZV9vcGVuX2NoZWNrKGRldikgPT0gLTEpCisJCXJldHVybiAtMTsKKwlwcml2LT5pbmZyYV9vcGVuID0gMSA7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCWlmIChwcml2LT5vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9vcGVuKHByaXYtPndsYW5fZGV2Lm5ldGRldikgOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJcHJpdi0+b3BlbiA9IDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIG1zaFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCBtZXNoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSAoZGV2LT5wcml2KTsKKworCXByaXYtPm1lc2hfb3BlbiA9IDA7CisJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5tZXNoX2Rldik7CisJaWYgKHByaXYtPmluZnJhX29wZW4gPT0gMCkKKwkJcmV0dXJuIHdsYW5fZGV2X2Nsb3NlKCAoKHdsYW5fcHJpdmF0ZSAqKSBkZXYtPnByaXYpLT53bGFuX2Rldi5uZXRkZXYpIDsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIGV0aFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCB3bGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwlwcml2LT5pbmZyYV9vcGVuID0gMDsKKwlpZiAocHJpdi0+bWVzaF9vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9jbG9zZSggKCh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2KS0+d2xhbl9kZXYubmV0ZGV2KSA7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgRU5BQkxFX1BNCisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uIGl0IGlzIGNhbGxlZCBieQorICogIGtlcm5lbCB0byBlbnRlciBvciBleGl0IHBvd2VyIHNhdmluZyBtb2RlLgorICoKKyAqICBAcGFyYW0gcG1kZXYgICBBIHBvaW50ZXIgdG8gcG1fZGV2CisgKiAgQHBhcmFtIHBtcmVxICAgcG1fcmVxdWVzdF90CisgKiAgQHBhcmFtIHBtZGF0YSAgQSBwb2ludGVyIHRvIHBtZGF0YQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCB3bGFuX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBtZGV2LCBwbV9yZXF1ZXN0X3QgcG1yZXEsCisJCQkgICAgdm9pZCAqcG1kYXRhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IHdsYW5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPndsYW5fZGV2Lm5ldGRldjsKKworCWxic19wcl9kZWJ1ZygxLCAiV1BSTV9QTV9DQUxMQkFDSzogcG1yZXEgPSAlZC5cbiIsIHBtcmVxKTsKKworCXN3aXRjaCAocG1yZXEpIHsKKwljYXNlIFBNX1NVU1BFTkQ6CisJCWxic19wcl9kZWJ1ZygxLCAiV1BSTV9QTV9DQUxMQkFDSzogZW50ZXIgUE1fU1VTUEVORC5cbiIpOworCisJCS8qIGluIGFzc29jaWF0ZWQgbW9kZSAqLworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfU0xFRVApCisJCQkgICAgKSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICJ3bGFuX3BtX2NhbGxiYWNrOiBjYW4ndCBlbnRlciBzbGVlcCBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCisJCQkJLyoKKwkJCQkgKiBEZXRhY2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisJCQkJICogaWYgdGhlIG5ldHdvcmsgaXMgcnVubmluZworCQkJCSAqLworCQkJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkJICAgICAgICJuZXRpZl9kZXZpY2VfZGV0YWNoKCkuXG4iKTsKKwkJCQl9CisJCQkJbGliZXJ0YXNfc2JpX3N1c3BlbmQocHJpdik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGluIG5vbiBhc3NvY2lhdGVkIG1vZGUgKi8KKworCQkvKgorCQkgKiBEZXRhY2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisJCSAqIGlmIHRoZSBuZXR3b3JrIGlzIHJ1bm5pbmcKKwkJICovCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkJLyoKKwkJICogU3RvcmluZyBhbmQgcmVzdG9yaW5nIG9mIHRoZSByZWdzIGJlIHRha2VuIGNhcmUKKwkJICogYXQgdGhlIGRyaXZlciByZXN0IHdpbGwgYmUgZG9uZSBhdCB3bGFuIGRyaXZlcgorCQkgKiB0aGlzIG1ha2VzIGRyaXZlciBpbmRlcGVuZGVudCBvZiB0aGUgY2FyZAorCQkgKi8KKworCQlsaWJlcnRhc19zYmlfc3VzcGVuZChwcml2KTsKKworCQlicmVhazsKKworCWNhc2UgUE1fUkVTVU1FOgorCQkvKiBpbiBhc3NvY2lhdGVkIG1vZGUgKi8KKwkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQkJeworCQkJCS8qCisJCQkJICogQnJpbmcgdGhlIGludGVmYWNlIHVwIGZpcnN0CisJCQkJICogVGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuIHN0aWxsIC4uLgorCQkJCSAqLworCQkJCWxpYmVydGFzX3NiaV9yZXN1bWUocHJpdik7CisKKwkJCQkvKgorCQkJCSAqIEF0dGFjaCB0aGUgbmV0d29yayBpbnRlcmZhY2UKKwkJCQkgKiBpZiB0aGUgbmV0d29yayBpcyBydW5uaW5nCisJCQkJICovCisJCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkgICAgICAgImFmdGVyIG5ldGlmX2RldmljZV9hdHRhY2goKS5cbiIpOworCQkJCX0KKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIkFmdGVyIG5ldGlmIGF0dGFjaCwgaW4gYXNzb2NpYXRlZCBtb2RlLlxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGluIG5vbiBhc3NvY2lhdGVkIG1vZGUgKi8KKworCQkvKgorCQkgKiBCcmluZyB0aGUgaW50ZWZhY2UgdXAgZmlyc3QKKwkJICogVGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuIHN0aWxsIC4uLgorCQkgKi8KKworCQlsaWJlcnRhc19zYmlfcmVzdW1lKHByaXYpOworCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwkJbGJzX3ByX2RlYnVnKDEsICJhZnRlciBuZXRpZiBhdHRhY2gsIGluIE5PTiBhc3NvY2lhdGVkIG1vZGUuXG4iKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogRU5BQkxFX1BNICovCisKK3N0YXRpYyBpbnQgd2xhbl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlFTlRFUigpOworCisJaWYgKHByaXYtPndsYW5fZGV2LmRubGRfc2VudCB8fCBwcml2LT5hZGFwdGVyLT5UeExvY2tGbGFnKSB7CisJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZ290byBkb25lOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKworCWlmIChsaWJlcnRhc19wcm9jZXNzX3R4KHByaXYsIHNrYikgPT0gMCkKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Citkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgTWFyayBtZXNoIHBhY2tldHMgYW5kIGhhbmRvdmVyIHRoZW0gdG8gd2xhbl9oYXJkX3N0YXJ0X3htaXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgbWVzaF9wcmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwlFTlRFUigpOworCVNFVF9NRVNIX0ZSQU1FKHNrYik7CisJTEVBVkUoKTsKKworCXJldHVybiB3bGFuX2hhcmRfc3RhcnRfeG1pdChza2IsIHByaXYtPndsYW5fZGV2Lm5ldGRldik7Cit9CisKKy8qKgorICogQGJyaWVmIE1hcmsgbm9uLW1lc2ggcGFja2V0cyBhbmQgaGFuZG92ZXIgdGhlbSB0byB3bGFuX2hhcmRfc3RhcnRfeG1pdAorICoKKyAqLworc3RhdGljIGludCB3bGFuX3ByZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlFTlRFUigpOworCVVOU0VUX01FU0hfRlJBTUUoc2tiKTsKKwlMRUFWRSgpOworCXJldHVybiB3bGFuX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCWxic19wcl9lcnIoInR4IHdhdGNoIGRvZyB0aW1lb3V0IVxuIik7CisKKwlwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQgPSBETkxEX1JFU19SRUNFSVZFRDsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChwcml2LT5hZGFwdGVyLT5jdXJyZW50dHhza2IpIHsKKwkJaWYgKHByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSA9PSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUCkgeworCQkJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGhhdmUgbm90IHJlY2VpdmVkIGZlZWRiYWNrIGZyb20KKwkJCSAgIHRoZSBwcmV2aW91cyBwYWNrZXQuICBBc3N1bWUgVFhfRkFJTCBhbmQgbW92ZSBvbi4gKi8KKwkJCXByaXYtPmFkYXB0ZXItPmV2ZW50Y2F1c2UgPSAweDAxMDAwMDAwOworCQkJbGliZXJ0YXNfc2VuZF90eF9mZWVkYmFjayhwcml2KTsKKwkJfSBlbHNlCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCX0gZWxzZSBpZiAocHJpdi0+YWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlMRUFWRSgpOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXR3b3JrIHN0YXRpc3RpY3MKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHNvY2thZGRyICpwaHdhZGRyID0gYWRkcjsKKworCUVOVEVSKCk7CisKKwltZW1zZXQoYWRhcHRlci0+Y3VycmVudF9hZGRyLCAwLCBFVEhfQUxFTik7CisKKwkvKiBkZXYtPmRldl9hZGRyIGlzIDggYnl0ZXMgKi8KKwlsYnNfZGJnX2hleCgiZGV2LT5kZXZfYWRkcjoiLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlsYnNfZGJnX2hleCgiYWRkcjoiLCBwaHdhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJbWVtY3B5KGFkYXB0ZXItPmN1cnJlbnRfYWRkciwgcGh3YWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfbWFjX2FkZHJlc3MsCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlsYnNfcHJfZGVidWcoMSwgInNldCBtYWMgYWRkcmVzcyBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsYnNfZGJnX2hleCgiYWRhcHRlci0+bWFjYWRkcjoiLCBhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCgod2xhbl9wcml2YXRlICopIGRldi0+cHJpdiktPm1lc2hfZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fY29weV9tdWx0aWNhc3RfYWRkcmVzcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0ciA9IGRldi0+bWNfbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJbWVtY3B5KCZhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldLCBtY3B0ci0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKwkJbWNwdHIgPSBtY3B0ci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gaTsKKworfQorCitzdGF0aWMgdm9pZCB3bGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBvbGRwYWNrZXRmaWx0ZXI7CisKKwlFTlRFUigpOworCisJb2xkcGFja2V0ZmlsdGVyID0gYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlcjsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJlbmFibGUgUHJvbWlzY3VvdXMgbW9kZVxuIik7CisJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJICAgIGNtZF9hY3RfbWFjX3Byb21pc2N1b3VzX2VuYWJsZTsKKwkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciAmPQorCQkgICAgfihjbWRfYWN0X21hY19hbGxfbXVsdGljYXN0X2VuYWJsZSB8CisJCSAgICAgIGNtZF9hY3RfbWFjX211bHRpY2FzdF9lbmFibGUpOworCX0gZWxzZSB7CisJCS8qIE11bHRpY2FzdCAqLworCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCSAgICB+Y21kX2FjdF9tYWNfcHJvbWlzY3VvdXNfZW5hYmxlOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPgorCQkgICAgTVJWRFJWX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkVuYWJsaW5nIEFsbCBNdWx0aWNhc3QhXG4iKTsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCSAgICBjbWRfYWN0X21hY19hbGxfbXVsdGljYXN0X2VuYWJsZTsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgJj0KKwkJCSAgICB+Y21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgJj0KKwkJCSAgICB+Y21kX2FjdF9tYWNfYWxsX211bHRpY2FzdF9lbmFibGU7CisKKwkJCWlmICghZGV2LT5tY19jb3VudCkgeworCQkJCWxic19wcl9kZWJ1ZygxLCAiTm8gbXVsdGljYXN0IGFkZHJlc3NlcyAtICIKKwkJCQkgICAgICAgImRpc2FibGluZyBtdWx0aWNhc3QhXG4iKTsKKwkJCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCQkJICAgIH5jbWRfYWN0X21hY19tdWx0aWNhc3RfZW5hYmxlOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgaTsKKworCQkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCQkgICAgY21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZTsKKworCQkJCWFkYXB0ZXItPm5yX29mX211bHRpY2FzdG1hY2FkZHIgPQorCQkJCSAgICB3bGFuX2NvcHlfbXVsdGljYXN0X2FkZHJlc3MoYWRhcHRlciwgZGV2KTsKKworCQkJCWxic19wcl9kZWJ1ZygxLCAiTXVsdGljYXN0IGFkZHJlc3NlczogJWRcbiIsCisJCQkJICAgICAgIGRldi0+bWNfY291bnQpOworCisJCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIk11bHRpY2FzdCBhZGRyZXNzICVkOiIKKwkJCQkJICAgICAgICIleCAleCAleCAleCAleCAleFxuIiwgaSwKKwkJCQkJICAgICAgIGFkYXB0ZXItPm11bHRpY2FzdGxpc3RbaV1bMF0sCisJCQkJCSAgICAgICBhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldWzFdLAorCQkJCQkgICAgICAgYWRhcHRlci0+bXVsdGljYXN0bGlzdFtpXVsyXSwKKwkJCQkJICAgICAgIGFkYXB0ZXItPm11bHRpY2FzdGxpc3RbaV1bM10sCisJCQkJCSAgICAgICBhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldWzRdLAorCQkJCQkgICAgICAgYWRhcHRlci0+bXVsdGljYXN0bGlzdFtpXVs1XSk7CisJCQkJfQorCQkJCS8qIHNldCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpcm13YXJlICovCisJCQkJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkgICAgICBjbWRfbWFjX211bHRpY2FzdF9hZHIsCisJCQkJCQkgICAgICBjbWRfYWN0X3NldCwgMCwgMCwKKwkJCQkJCSAgICAgIE5VTEwpOworCQkJfQorCQl9CisJfQorCisJaWYgKGFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgIT0gb2xkcGFja2V0ZmlsdGVyKSB7CisJCWxpYmVydGFzX3NldF9tYWNfcGFja2V0X2ZpbHRlcihwcml2KTsKKwl9CisKKwlMRUFWRSgpOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5sZGVzIHRoZSBtYWpvciBqb2IgaW4gV0xBTiBkcml2ZXIuCisgKiAgaXQgaGFuZGxlcyB0aGUgZXZlbnQgZ2VuZXJhdGVkIGJ5IGZpcm13YXJlLCByeCBkYXRhIHJlY2VpdmVkCisgKiAgZnJvbSBmaXJtd2FyZSBhbmQgdHggZGF0YSBzZW50IGZyb20ga2VybmVsLgorICoKKyAqICBAcGFyYW0gZGF0YSAgICBBIHBvaW50ZXIgdG8gd2xhbl90aHJlYWQgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgMAorICovCitzdGF0aWMgaW50IHdsYW5fc2VydmljZV9tYWluX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bGFuX3RocmVhZCAqdGhyZWFkID0gZGF0YTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSB0aHJlYWQtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwl1OCBpcmVnID0gMDsKKworCUVOVEVSKCk7CisKKwl3bGFuX2FjdGl2YXRlX3RocmVhZCh0aHJlYWQpOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCisJZm9yICg7OykgeworCQlsYnNfcHJfZGVidWcoMSwgIm1haW4tdGhyZWFkIDExMTogaW50Y291bnRlcj0lZCAiCisJCSAgICAgICAiY3VycmVudHR4c2tiPSVwIGRubGRfc2VudD0lZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsIHByaXYtPndsYW5fZGV2LmRubGRfc2VudCk7CisKKwkJYWRkX3dhaXRfcXVldWUoJnRocmVhZC0+d2FpdHEsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApIHx8CisJCSAgICAoIWFkYXB0ZXItPmludGNvdW50ZXIKKwkJICAgICAmJiAocHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50IHx8IGFkYXB0ZXItPmN1cl9jbWQgfHwKKwkJCSBsaXN0X2VtcHR5KCZhZGFwdGVyLT5jbWRwZW5kaW5ncSkpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgIm1haW4tdGhyZWFkIHNsZWVwaW5nLi4uIENvbm49JWQgSW50Qz0lZCBQU19tb2RlPSVkIFBTX1N0YXRlPSVkXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzLCBhZGFwdGVyLT5pbnRjb3VudGVyLAorCQkJICAgICAgIGFkYXB0ZXItPnBzbW9kZSwgYWRhcHRlci0+cHNzdGF0ZSk7CisJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisKKworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJtYWluLXRocmVhZCAyMjIgKHdha2luZyB1cCk6IGludGNvdW50ZXI9JWQgY3VycmVudHR4c2tiPSVwICIKKwkJICAgICAgICJkbmxkX3NlbnQ9JWRcbiIsIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsIHByaXYtPndsYW5fZGV2LmRubGRfc2VudCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnRocmVhZC0+d2FpdHEsICZ3YWl0KTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCisJCWxic19wcl9kZWJ1ZygxLCAibWFpbi10aHJlYWQgMzMzOiBpbnRjb3VudGVyPSVkIGN1cnJlbnR0eHNrYj0lcCAiCisJCSAgICAgICAiZG5sZF9zZW50PSVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+aW50Y291bnRlciwKKwkJICAgICAgIGFkYXB0ZXItPmN1cnJlbnR0eHNrYiwgcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpCisJCSAgICB8fCBhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJtYWluLXRocmVhZDogYnJlYWsgZnJvbSBtYWluIHRocmVhZDogc3VycHJpc2VyZW1vdmVkPTB4JXhcbiIsCisJCQkgICAgICAgYWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKTsKKwkJCWJyZWFrOworCQl9CisKKworCQlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJCWlmIChhZGFwdGVyLT5pbnRjb3VudGVyKSB7CisJCQl1OCBpbnRfc3RhdHVzOworCQkJYWRhcHRlci0+aW50Y291bnRlciA9IDA7CisJCQlpbnRfc3RhdHVzID0gbGliZXJ0YXNfc2JpX2dldF9pbnRfc3RhdHVzKHByaXYsICZpcmVnKTsKKworCQkJaWYgKGludF9zdGF0dXMpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIm1haW4tdGhyZWFkOiByZWFkaW5nIEhPU1RfSU5UX1NUQVRVU19SRUcgZmFpbGVkXG4iKTsKKwkJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSB8PSBpcmVnOworCQl9CisKKwkJbGJzX3ByX2RlYnVnKDEsICJtYWluLXRocmVhZCA0NDQ6IGludGNvdW50ZXI9JWQgY3VycmVudHR4c2tiPSVwICIKKwkJICAgICAgICJkbmxkX3NlbnQ9JWRcbiIsCisJCSAgICAgICBhZGFwdGVyLT5pbnRjb3VudGVyLAorCQkgICAgICAgYWRhcHRlci0+Y3VycmVudHR4c2tiLCBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQpOworCisJCS8qIGNvbW1hbmQgcmVzcG9uc2U/ICovCisJCWlmIChhZGFwdGVyLT5oaXNyZWdjcHkgJiBoaXNfY21kdXBsZHJkeSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJtYWluLXRocmVhZDogY21kIHJlc3BvbnNlIHJlYWR5LlxuIik7CisKKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSAmPSB+aGlzX2NtZHVwbGRyZHk7CisJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCWxpYmVydGFzX3Byb2Nlc3NfcnhfY29tbWFuZChwcml2KTsKKwkJCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJfQorCisJCS8qIEFueSBDYXJkIEV2ZW50ICovCisJCWlmIChhZGFwdGVyLT5oaXNyZWdjcHkgJiBoaXNfY2FyZGV2ZW50KSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIm1haW4tdGhyZWFkOiBDYXJkIEV2ZW50IEFjdGl2aXR5LlxuIik7CisKKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSAmPSB+aGlzX2NhcmRldmVudDsKKworCQkJaWYgKGxpYmVydGFzX3NiaV9yZWFkX2V2ZW50X2NhdXNlKHByaXYpKSB7CisJCQkJbGJzX3ByX2FsZXJ0KAorCQkJCSAgICAgICAibWFpbi10aHJlYWQ6IGxpYmVydGFzX3NiaV9yZWFkX2V2ZW50X2NhdXNlIGZhaWxlZC5cbiIpOworCQkJCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJCQlsaWJlcnRhc19wcm9jZXNzX2V2ZW50KHByaXYpOworCQl9IGVsc2UKKwkJCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY29uZmlybSBTbGVlcCBSZXF1ZXN0IHJlY2VpdmVkIHByZXZpb3VzbHkgKi8KKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSB7CisJCQlpZiAoIXByaXYtPndsYW5fZGV2LmRubGRfc2VudCAmJiAhYWRhcHRlci0+Y3VyX2NtZCkgeworCQkJCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PQorCQkJCSAgICBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJCSAgICAgICAibWFpbl90aHJlYWQ6IFBSRV9TTEVFUC0taW50Y291bnRlcj0lZCBjdXJyZW50dHhza2I9JXAgIgorCQkJCQkgICAgICAgImRubGRfc2VudD0lZCBjdXJfY21kPSVwLCBjb25maXJtIG5vd1xuIiwKKwkJCQkJICAgICAgIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCQkJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsCisJCQkJCSAgICAgICBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQsCisJCQkJCSAgICAgICBhZGFwdGVyLT5jdXJfY21kKTsKKworCQkJCQlsaWJlcnRhc19wc19jb25maXJtX3NsZWVwKHByaXYsCisJCQkJCQkgICAgICAgKHUxNikgYWRhcHRlci0+cHNtb2RlKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3b3JrYXJvdW5kIGZvciBmaXJtd2FyZSBzZW5kaW5nCisJCQkJCSAqIGRlYXV0aC9saW5rbG9zcyBldmVudCBpbW1lZGlhdGVseQorCQkJCQkgKiBhZnRlciBzbGVlcCByZXF1ZXN0LCByZW1vdmUgdGhpcworCQkJCQkgKiBhZnRlciBmaXJtd2FyZSBmaXhlcyBpdAorCQkJCQkgKi8KKwkJCQkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX0FXQUtFOworCQkJCQlsYnNfcHJfYWxlcnQoCisJCQkJCSAgICAgICAibWFpbi10aHJlYWQ6IGlnbm9yZSBQU19TbGVlcENvbmZpcm0gaW4gbm9uLWNvbm5lY3RlZCBzdGF0ZVxuIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogVGhlIFBTIHN0YXRlIGlzIGNoYW5nZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgU2xlZXAgUmVxdWVzdAorCQkgKiBldmVudCBhYm92ZQorCQkgKi8KKwkJaWYgKChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB8fAorCQkgICAgKHByaXYtPmFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4ZWN1dGUgdGhlIG5leHQgY29tbWFuZCAqLworCQlpZiAoIXByaXYtPndsYW5fZGV2LmRubGRfc2VudCAmJiAhcHJpdi0+YWRhcHRlci0+Y3VyX2NtZCkKKwkJCWxpYmVydGFzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKHByaXYpOworCisJCS8qIFdha2UtdXAgY29tbWFuZCB3YWl0ZXJzIHdoaWNoIGNhbid0IHNsZWVwIGluCisJCSAqIGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZAorCQkgKi8KKwkJaWYgKCFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZykKKwkJCXdha2VfdXBfYWxsKCZhZGFwdGVyLT5jbWRfcGVuZGluZyk7CisKKwkJbGliZXJ0YXNfdHhfcnVucXVldWUocHJpdik7CisJfQorCisJZGVsX3RpbWVyKCZhZGFwdGVyLT5jb21tYW5kX3RpbWVyKTsKKwlhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyA9IDA7CisJd2FrZV91cF9hbGwoJmFkYXB0ZXItPmNtZF9wZW5kaW5nKTsKKwl3bGFuX2RlYWN0aXZhdGVfdGhyZWFkKHRocmVhZCk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGNhcmQuIGl0IHdpbGwgcHJvYmUgdGhlCisgKiBjYXJkLCBhbGxvY2F0ZSB0aGUgd2xhbl9wcml2IGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2UuCisgKgorICogIEBwYXJhbSBjYXJkICAgIEEgcG9pbnRlciB0byBjYXJkCisgKiAgQHJldHVybiAJICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLword2xhbl9wcml2YXRlICp3bGFuX2FkZF9jYXJkKHZvaWQgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1lc2hfZGV2ID0gTlVMTDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBOVUxMOworCisJRU5URVIoKTsKKworCS8qIEFsbG9jYXRlIGFuIEV0aGVybmV0IGRldmljZSBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlpZiAoIShkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yod2xhbl9wcml2YXRlKSkpKSB7CisJCWxic19wcl9hbGVydCggIkluaXQgZXRoZXJuZXQgZGV2aWNlIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcml2ID0gZGV2LT5wcml2OworCisJLyogYWxsb2NhdGUgYnVmZmVyIGZvciB3bGFuX2FkYXB0ZXIgKi8KKwlpZiAoIShwcml2LT5hZGFwdGVyID0ga21hbGxvYyhzaXplb2Yod2xhbl9hZGFwdGVyKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWxic19wcl9hbGVydCggIkFsbG9jYXRlIGJ1ZmZlciBmb3Igd2xhbl9hZGFwdGVyIGZhaWxlZCFcbiIpOworCQlnb3RvIGVycl9rbWFsbG9jOworCX0KKworCS8qIEFsbG9jYXRlIGEgdmlydHVhbCBtZXNoIGRldmljZSAqLworCWlmICghKG1lc2hfZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJtc2glZCIsIGV0aGVyX3NldHVwKSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJbml0IGV0aGVybmV0IGRldmljZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQm90aCBpbnRlcnZhY2VzIHNoYXJlIHRoZSBwcml2IHN0cnVjdHVyZSAqLworCW1lc2hfZGV2LT5wcml2ID0gcHJpdjsKKworCS8qIGluaXQgd2xhbl9hZGFwdGVyICovCisJbWVtc2V0KHByaXYtPmFkYXB0ZXIsIDAsIHNpemVvZih3bGFuX2FkYXB0ZXIpKTsKKworCXByaXYtPndsYW5fZGV2Lm5ldGRldiA9IGRldjsKKwlwcml2LT53bGFuX2Rldi5jYXJkID0gY2FyZDsKKwlwcml2LT5tZXNoX29wZW4gPSAwOworCXByaXYtPmluZnJhX29wZW4gPSAwOworCXByaXYtPm1lc2hfZGV2ID0gbWVzaF9kZXY7CisJd2xhbnByaXYgPSBwcml2OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9NT0RVTEVfT1dORVIobWVzaF9kZXYpOworCisJLyogU2V0dXAgdGhlIE9TIEludGVyZmFjZSB0byBvdXIgZnVuY3Rpb25zICovCisJZGV2LT5vcGVuID0gd2xhbl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gd2xhbl9wcmVfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSB3bGFuX2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSBsaWJlcnRhc19kb19pb2N0bDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHdsYW5fc2V0X21hY19hZGRyZXNzOworCW1lc2hfZGV2LT5vcGVuID0gbWVzaF9vcGVuOworCW1lc2hfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtZXNoX3ByZV9zdGFydF94bWl0OworCW1lc2hfZGV2LT5zdG9wID0gbWVzaF9jbG9zZTsKKwltZXNoX2Rldi0+ZG9faW9jdGwgPSBsaWJlcnRhc19kb19pb2N0bDsKKwltZW1jcHkobWVzaF9kZXYtPmRldl9hZGRyLCB3bGFucHJpdi0+d2xhbl9kZXYubmV0ZGV2LT5kZXZfYWRkciwKKwkJCXNpemVvZih3bGFucHJpdi0+d2xhbl9kZXYubmV0ZGV2LT5kZXZfYWRkcikpOworCisjZGVmaW5lCVdMQU5fV0FUQ0hET0dfVElNRU9VVAkoNSAqIEhaKQorCisJZGV2LT50eF90aW1lb3V0ID0gd2xhbl90eF90aW1lb3V0OworCWRldi0+Z2V0X3N0YXRzID0gd2xhbl9nZXRfc3RhdHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFdMQU5fV0FUQ0hET0dfVElNRU9VVDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmxpYmVydGFzX2V0aHRvb2xfb3BzOworCW1lc2hfZGV2LT5nZXRfc3RhdHMgPSB3bGFuX2dldF9zdGF0czsKKwltZXNoX2Rldi0+ZXRodG9vbF9vcHMgPSAmbGliZXJ0YXNfZXRodG9vbF9vcHM7CisKKyNpZmRlZglXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZsaWJlcnRhc19oYW5kbGVyX2RlZjsKKwltZXNoX2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJmxpYmVydGFzX2hhbmRsZXJfZGVmOworI2VuZGlmCisjZGVmaW5lIE5FVElGX0ZfRFlOQUxMT0MgMTYKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfRFlOQUxMT0M7CisJZGV2LT5mbGFncyB8PSBJRkZfQlJPQURDQVNUIHwgSUZGX01VTFRJQ0FTVDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHdsYW5fc2V0X211bHRpY2FzdF9saXN0OworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmFkYXB0ZXItPmNtZGZyZWVxKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+YWRhcHRlci0+Y21kcGVuZGluZ3EpOworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5hZGFwdGVyLT5jbWRfcGVuZGluZyk7CisJcHJpdi0+YWRhcHRlci0+bnJfY21kX3BlbmRpbmcgPSAwOworCisJbGJzX3ByX2RlYnVnKDEsICJTdGFydGluZyBrdGhyZWFkLi4uXG4iKTsKKwlwcml2LT5tYWludGhyZWFkLnByaXYgPSBwcml2OworCXdsYW5fY3JlYXRlX3RocmVhZCh3bGFuX3NlcnZpY2VfbWFpbl90aHJlYWQsCisJCQkgICAmcHJpdi0+bWFpbnRocmVhZCwgIndsYW5fbWFpbl9zZXJ2aWNlIik7CisKKwlwcml2LT5hc3NvY190aHJlYWQgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGliZXJ0YXNfYXNzb2MiKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+YXNzb2Nfd29yaywgd2xhbl9hc3NvY2lhdGlvbl93b3JrZXIpOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgZGV2aWNlLiBGaWxsdXAgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgd2l0aAorCSAqIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGNhcmQgYW5kIHJlcXVlc3QgZm9yIHRoZSByZXF1aXJlZAorCSAqIElSUS4KKwkgKi8KKwlpZiAobGliZXJ0YXNfc2JpX3JlZ2lzdGVyX2Rldihwcml2KSA8IDApIHsKKwkJbGJzX3ByX2luZm8oImZhaWxlZCB0byByZWdpc3RlciB3bGFuIGRldmljZSFcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKKwl9CisKKwkvKiBpbml0IEZXIGFuZCBIVyAqLworCWlmIChsaWJlcnRhc19pbml0X2Z3KHByaXYpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRmlybXdhcmUgSW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKKwl9CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJbGJzX3ByX2VycigiQ2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlIVxuIik7CisJCWdvdG8gZXJyX2luaXRfZnc7CisJfQorCisJLyogUmVnaXN0ZXIgdmlydHVhbCBtZXNoIGludGVyZmFjZSAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpKSB7CisJCWxic19wcl9pbmZvKCJDYW5ub3QgcmVnaXN0ZXIgbWVzaCB2aXJ0dWFsIGludGVyZmFjZSFcbiIpOworCQlnb3RvIGVycl9pbml0X2Z3OworCX0KKworCWxic19wcl9pbmZvKCIlczogTWFydmVsbCBXbGFuIDgwMi4xMSBhZGFwdGVyICIsIGRldi0+bmFtZSk7CisKKwlsaWJlcnRhc19kZWJ1Z2ZzX2luaXRfb25lKHByaXYsIGRldik7CisKKwlpZiAobGliZXJ0YXNfZm91bmQgPT0gTUFYX0RFVlMpCisJCWdvdG8gZXJyX2luaXRfZnc7CisJbGliZXJ0YXNfZGV2c1tsaWJlcnRhc19mb3VuZF0gPSBkZXY7CisJbGliZXJ0YXNfZm91bmQrKzsKKyNpZmRlZiBFTkFCTEVfUE0KKwlpZiAoISh3bGFuX3BtX2RldiA9IHBtX3JlZ2lzdGVyKFBNX1VOS05PV05fREVWLCAwLCB3bGFuX3BtX2NhbGxiYWNrKSkpCisJCWxic19wcl9hbGVydCggImZhaWxlZCB0byByZWdpc3RlciBQTSBjYWxsYmFja1xuIik7CisjZW5kaWYKKwlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCYobWVzaF9kZXYtPmNsYXNzX2RldiksICZjbGFzc19kZXZpY2VfYXR0cl9saWJlcnRhc19tcHApKQorCQlnb3RvIGVycl9jcmVhdGVfZmlsZTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHByaXY7CisKK2Vycl9jcmVhdGVfZmlsZToKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoJihtZXNoX2Rldi0+Y2xhc3NfZGV2KSwgJmNsYXNzX2RldmljZV9hdHRyX2xpYmVydGFzX21wcCk7CitlcnJfaW5pdF9mdzoKKwlsaWJlcnRhc19zYmlfdW5yZWdpc3Rlcl9kZXYocHJpdik7CitlcnJfcmVnaXN0ZXJkZXY6CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+YXNzb2NfdGhyZWFkKTsKKwkvKiBTdG9wIHRoZSB0aHJlYWQgc2VydmljaW5nIHRoZSBpbnRlcnJ1cHRzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKwl3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoJnByaXYtPm1haW50aHJlYWQpOworCWtmcmVlKHByaXYtPmFkYXB0ZXIpOworZXJyX2ttYWxsb2M6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisJd2xhbnByaXYgPSBOVUxMOworCisJTEVBVkUoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgd2FrZV9wZW5kaW5nX2NtZG5vZGVzKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRub2RlLCAmcHJpdi0+YWRhcHRlci0+Y21kcGVuZGluZ3EsIGxpc3QpIHsKKwkJY21kbm9kZS0+Y21kd2FpdHF3b2tlbiA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kbm9kZS0+Y21kd2FpdF9xKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKK30KKworCitpbnQgd2xhbl9yZW1vdmVfY2FyZCh2b2lkICpjYXJkKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGxpYmVydGFzX3NiaV9nZXRfcHJpdihjYXJkKTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWVzaF9kZXY7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCBpOworCisJRU5URVIoKTsKKworCWlmICghcHJpdikgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWlmICghYWRhcHRlcikgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJbWVzaF9kZXYgPSBwcml2LT5tZXNoX2RldjsKKworCW5ldGlmX3N0b3BfcXVldWUobWVzaF9kZXYpOworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCisJd2FrZV9wZW5kaW5nX2NtZG5vZGVzKHByaXYpOworCisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCYobWVzaF9kZXYtPmNsYXNzX2RldiksICZjbGFzc19kZXZpY2VfYXR0cl9saWJlcnRhc19tcHApOworCXVucmVnaXN0ZXJfbmV0ZGV2KG1lc2hfZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YXNzb2Nfd29yayk7CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+YXNzb2NfdGhyZWFkKTsKKworCWlmIChhZGFwdGVyLT5wc21vZGUgPT0gd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3ApIHsKKwkJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbTsKKwkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJfQorCisJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAweGFhLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyNpZmRlZiBFTkFCTEVfUE0KKwlwbV91bnJlZ2lzdGVyKHdsYW5fcG1fZGV2KTsKKyNlbmRpZgorCisJYWRhcHRlci0+c3VycHJpc2VyZW1vdmVkID0gMTsKKworCS8qIFN0b3AgdGhlIHRocmVhZCBzZXJ2aWNpbmcgdGhlIGludGVycnVwdHMgKi8KKwl3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoJnByaXYtPm1haW50aHJlYWQpOworCisJbGliZXJ0YXNfZGVidWdmc19yZW1vdmVfb25lKHByaXYpOworCisJbGJzX3ByX2RlYnVnKDEsICJGcmVlIGFkYXB0ZXJcbiIpOworCWxpYmVydGFzX2ZyZWVfYWRhcHRlcihwcml2KTsKKworCWZvciAoaSA9IDA7IGk8bGliZXJ0YXNfZm91bmQ7IGkrKykgeworCQlpZiAobGliZXJ0YXNfZGV2c1tpXT09cHJpdi0+d2xhbl9kZXYubmV0ZGV2KSB7CisJCQlsaWJlcnRhc19kZXZzW2ldID0gbGliZXJ0YXNfZGV2c1stLWxpYmVydGFzX2ZvdW5kXTsKKwkJCWxpYmVydGFzX2RldnNbbGliZXJ0YXNfZm91bmRdID0gTlVMTCA7CisJCQlicmVhayA7CisJCX0KKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlVucmVnaXN0ZXIgZmluaXNoXG4iKTsKKworCXByaXYtPndsYW5fZGV2Lm5ldGRldiA9IE5VTEw7CisJcHJpdi0+bWVzaF9kZXYgPSBOVUxMIDsKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwl3bGFucHJpdiA9IE5VTEw7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgQ0ZQIGluCisgKiAgcmVnaW9uX2NmcF90YWJsZSBiYXNlZCBvbiByZWdpb24gYW5kIGJhbmQgcGFyYW1ldGVyLgorICoKKyAqICBAcGFyYW0gcmVnaW9uICBUaGUgcmVnaW9uIGNvZGUKKyAqICBAcGFyYW0gYmFuZAkgICBUaGUgYmFuZAorICogIEBwYXJhbSBjZnBfbm8gIEEgcG9pbnRlciB0byBDRlAgbnVtYmVyCisgKiAgQHJldHVybiAJICAgQSBwb2ludGVyIHRvIENGUAorICovCitzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpsaWJlcnRhc19nZXRfcmVnaW9uX2NmcF90YWJsZSh1OCByZWdpb24sIHU4IGJhbmQsIGludCAqY2ZwX25vKQoreworCWludCBpLCBlbmQ7CisKKwlFTlRFUigpOworCisJZW5kID0gc2l6ZW9mKHJlZ2lvbl9jZnBfdGFibGUpL3NpemVvZihzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5kIDsgaSsrKSB7CisJCWxic19wcl9kZWJ1ZygxLCAicmVnaW9uX2NmcF90YWJsZVtpXS5yZWdpb249JWRcbiIsCisJCQlyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbik7CisJCWlmIChyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbiA9PSByZWdpb24pIHsKKwkJCSpjZnBfbm8gPSByZWdpb25fY2ZwX3RhYmxlW2ldLmNmcF9ub19CRzsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmVnaW9uX2NmcF90YWJsZVtpXS5jZnBfQkc7CisJCX0KKwl9CisKKwlMRUFWRSgpOworCXJldHVybiBOVUxMOworfQorCitpbnQgbGliZXJ0YXNfc2V0X3JlZ2lvbnRhYmxlKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IHJlZ2lvbiwgdTggYmFuZCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBpID0gMDsKKworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKKwlpbnQgY2ZwX25vOworCisJRU5URVIoKTsKKworCW1lbXNldChhZGFwdGVyLT5yZWdpb25fY2hhbm5lbCwgMCwgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSk7CisKKwl7CisJCWNmcCA9IGxpYmVydGFzX2dldF9yZWdpb25fY2ZwX3RhYmxlKHJlZ2lvbiwgYmFuZCwgJmNmcF9ubyk7CisJCWlmIChjZnAgIT0gTlVMTCkgeworCQkJYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbaV0ubnJjZnAgPSBjZnBfbm87CisJCQlhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtpXS5DRlAgPSBjZnA7CisJCX0gZWxzZSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIndyb25nIHJlZ2lvbiBjb2RlICUjeCBpbiBiYW5kIEItR1xuIiwKKwkJCSAgICAgICByZWdpb24pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsW2ldLnZhbGlkID0gMTsKKwkJYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbaV0ucmVnaW9uID0gcmVnaW9uOworCQlhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtpXS5iYW5kID0gYmFuZDsKKwkJaSsrOworCX0KKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpbnRlcnJ1cHQuIGl0IHdpbGwgY2hhbmdlIFBTCisgKiAgc3RhdGUgaWYgYXBwbGljYWJsZS4gaXQgd2lsbCB3YWtlIHVwIG1haW5fdGhyZWFkIHRvIGhhbmRsZQorICogIHRoZSBpbnRlcnJ1cHQgZXZlbnQgYXMgd2VsbC4KKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3ZvaWQgbGliZXJ0YXNfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfaW50ZXJydXB0OiBpbnRjb3VudGVyPSVkXG4iLAorCSAgICAgICBwcml2LT5hZGFwdGVyLT5pbnRjb3VudGVyKTsKKworCXByaXYtPmFkYXB0ZXItPmludGNvdW50ZXIrKzsKKworCWlmIChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB7CisJCXByaXYtPmFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9BV0FLRTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwlMRUFWRSgpOworfQorCitzdGF0aWMgaW50IHdsYW5faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlpZiAobGliZXJ0YXNfZndfbmFtZSA9PSBOVUxMKSB7CisJCWxpYmVydGFzX2Z3X25hbWUgPSBkZWZhdWx0X2Z3X25hbWU7CisJfQorCisJbGliZXJ0YXNfZGVidWdmc19pbml0KCk7CisKKwlpZiAobGliZXJ0YXNfc2JpX3JlZ2lzdGVyKCkpIHsKKwkJcmV0ID0gLTE7CisJCWxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlKCk7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3bGFuX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlFTlRFUigpOworCisJZm9yIChpID0gMDsgaTxsaWJlcnRhc19mb3VuZDsgaSsrKSB7CisJCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGxpYmVydGFzX2RldnNbaV0tPnByaXY7CisJCXJlc2V0X2RldmljZShwcml2KTsKKwl9CisKKwlsaWJlcnRhc19zYmlfdW5yZWdpc3RlcigpOworCWxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlKCk7CisKKwlMRUFWRSgpOworfQorCittb2R1bGVfaW5pdCh3bGFuX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHdsYW5fY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk0tV0xBTiBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yYWRpb3RhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcmFkaW90YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDExOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcmFkaW90YXAuaApAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorCitzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBoZHI7CisJdTggcmF0ZTsKKwl1OCB0eHBvd2VyOworCXU4IHJ0c19yZXRyaWVzOworCXU4IGRhdGFfcmV0cmllczsKKyNpZiAwCisJdTggcGFkW0lFRUU4MDIxMV9SQURJT1RBUF9IRFJMRU4gLSAxMl07CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFRYX1JBRElPVEFQX1BSRVNFTlQgKAkJCQlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpIHwJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUlRTX1JFVFJJRVMpIHwJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREFUQV9SRVRSSUVTKSAgfAlcCisJMCkKKworI2RlZmluZSBJRUVFODAyMTFfRkNfVkVSU0lPTl9NQVNLICAgIDB4MDAwMworI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9NQVNLICAgICAgIDB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9NR1QgICAgICAgIDB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9DVEwgICAgICAgIDB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9EQVRBICAgICAgIDB4MDAwOAorI2RlZmluZSBJRUVFODAyMTFfRkNfU1VCVFlQRV9NQVNLICAgIDB4MDBmMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9GUk9NRFNfTUFTSyAgIDB4MDMwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9EU19NQVNLICAgICAgIDB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRlJPTURTX01BU0sgICAgIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfTk9EUyAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9EUyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRlJPTURTICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRFNUT0RTICAgICAgICAgIDB4MDMwMAorCitzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBoZHI7CisJdTggZmxhZ3M7CisJdTggcmF0ZTsKKwl1MTYgY2hhbl9mcmVxOworCXUxNiBjaGFuX2ZsYWdzOworCXU4IGFudGVubmE7CisJdTggYW50c2lnbmFsOworCXUxNiByeF9mbGFnczsKKyNpZiAwCisJdTggcGFkW0lFRUU4MDIxMV9SQURJT1RBUF9IRFJMRU4gLSAxOF07CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFJYX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCkgfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwpIHxcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTKSB8CVwKKwkwKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNmNzhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpAQCAtMCwwICsxLDQ1OSBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYW5kbGluZyBvZiBSWCBpbiB3bGFuIGRyaXZlci4KKyAgKi8KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAid2V4dC5oIgorCitzdHJ1Y3QgZXRoODAzaGRyIHsKKwl1OCBkZXN0X2FkZHJbNl07CisJdTggc3JjX2FkZHJbNl07CisJdTE2IGg4MDNfbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByZmMxMDQyaGRyIHsKKwl1OCBsbGNfZHNhcDsKKwl1OCBsbGNfc3NhcDsKKwl1OCBsbGNfY3RybDsKKwl1OCBzbmFwX291aVszXTsKKwl1MTYgc25hcF90eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeHBhY2tldGhkciB7CisJc3RydWN0IHJ4cGQgcnhfcGQ7CisJc3RydWN0IGV0aDgwM2hkciBldGg4MDNfaGRyOworCXN0cnVjdCByZmMxMDQyaGRyIHJmYzEwNDJfaGRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeDgwMjExcGFja2V0aGRyIHsKKwlzdHJ1Y3QgcnhwZCByeF9wZDsKKwl2b2lkICpldGg4MDIxMV9oZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCBwcm9jZXNzX3J4ZWRfODAyXzExX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGF2Z1NOUiAuCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgYXZnU05SCisgKi8KK3N0YXRpYyB1OCB3bGFuX2dldGF2Z3Nucih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXU4IGk7CisJdTE2IHRlbXAgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GID09IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1TTlJORjsgaSsrKQorCQl0ZW1wICs9IGFkYXB0ZXItPnJhd1NOUltpXTsKKwlyZXR1cm4gKHU4KSAodGVtcCAvIGFkYXB0ZXItPm51bVNOUk5GKTsKKworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgQXZnTkYKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICBBdmdORgorICovCitzdGF0aWMgdTggd2xhbl9nZXRhdmduZih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXU4IGk7CisJdTE2IHRlbXAgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GID09IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1TTlJORjsgaSsrKQorCQl0ZW1wICs9IGFkYXB0ZXItPnJhd05GW2ldOworCXJldHVybiAodTgpICh0ZW1wIC8gYWRhcHRlci0+bnVtU05STkYpOworCit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHNhdmUgdGhlIHJhdyBTTlIvTkYgdG8gb3VyIGludGVybmVsIGJ1ZmZlcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwcnhwZCAgIEEgcG9pbnRlciB0byByeHBkIHN0cnVjdHVyZSBvZiByZWNlaXZlZCBwYWNrZXQKKyAqICBAcmV0dXJuIAkgICBuL2EKKyAqLworc3RhdGljIHZvaWQgd2xhbl9zYXZlX3Jhd1NOUk5GKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCByeHBkICpwX3J4X3BkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GIDwgYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yKQorCQlhZGFwdGVyLT5udW1TTlJORisrOworCWFkYXB0ZXItPnJhd1NOUlthZGFwdGVyLT5uZXh0U05STkZdID0gcF9yeF9wZC0+c25yOworCWFkYXB0ZXItPnJhd05GW2FkYXB0ZXItPm5leHRTTlJORl0gPSBwX3J4X3BkLT5uZjsKKwlhZGFwdGVyLT5uZXh0U05STkYrKzsKKwlpZiAoYWRhcHRlci0+bmV4dFNOUk5GID49IGFkYXB0ZXItPmRhdGFfYXZnX2ZhY3RvcikKKwkJYWRhcHRlci0+bmV4dFNOUk5GID0gMDsKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBSU1NJIGluIHJlY2VpdmVkIHBhY2tldC4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHJ4cGQgICBBIHBvaW50ZXIgdG8gcnhwZCBzdHJ1Y3R1cmUgb2YgcmVjZWl2ZWQgcGFja2V0CisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5fY29tcHV0ZV9yc3NpKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCByeHBkICpwX3J4X3BkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJyeHBkOiBTTlIgPSAlZCwgTkYgPSAlZFxuIiwgcF9yeF9wZC0+c25yLCBwX3J4X3BkLT5uZik7CisJbGJzX3ByX2RlYnVnKDEsICJCZWZvcmUgY29tcHV0aW5nIFNOUjogU05SLSBhdmcgPSAlZCwgTkYtYXZnID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKKwkgICAgICAgYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUpOworCisJYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10gPSBwX3J4X3BkLT5zbnI7CisJYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSA9IHBfcnhfcGQtPm5mOworCXdsYW5fc2F2ZV9yYXdTTlJORihwcml2LCBwX3J4X3BkKTsKKworCWFkYXB0ZXItPnJ4cGRfcmF0ZSA9IHBfcnhfcGQtPnJ4X3JhdGU7CisKKwlhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gPSB3bGFuX2dldGF2Z3Nucihwcml2KSAqIEFWR19TQ0FMRTsKKwlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSA9IHdsYW5fZ2V0YXZnbmYocHJpdikgKiBBVkdfU0NBTEU7CisJbGJzX3ByX2RlYnVnKDEsICJBZnRlciBjb21wdXRpbmcgU05SOiBTTlItYXZnID0gJWQsIE5GLWF2ZyA9ICVkXG4iLAorCSAgICAgICBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUsCisJICAgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFKTsKKworCWFkYXB0ZXItPlJTU0lbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddLAorCQkgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10pOworCisJYWRhcHRlci0+UlNTSVtUWVBFX1JYUERdW1RZUEVfQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKKwkJICAgICBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSk7CisKKwlMRUFWRSgpOworfQorCitpbnQgbGliZXJ0YXNfdXBsb2FkX3J4X3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxic19wcl9kZWJ1ZygxLCAic2tiLT5kYXRhPSVwXG4iLCBza2ItPmRhdGEpOworCisJaWYoSVNfTUVTSF9GUkFNRShza2IpKQorCQlza2ItPmRldiA9IHByaXYtPm1lc2hfZGV2OworCWVsc2UKKwkJc2tiLT5kZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgcmVjZWl2ZWQgcGFja2V0IGFuZCBmb3J3YXJkcyBpdAorICogIHRvIGtlcm5lbC91cHBlciBsYXllcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIHNrYiAgICAgQSBwb2ludGVyIHRvIHNrYiB3aGljaCBpbmNsdWRlcyB0aGUgcmVjZWl2ZWQgcGFja2V0CisgKiAgQHJldHVybiAJICAgMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19yeGVkX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgcnhwYWNrZXRoZHIgKnBfcnhfcGt0OworCXN0cnVjdCByeHBkICpwX3J4X3BkOworCisJaW50IGhkcmNob3A7CisJc3RydWN0IGV0aGhkciAqcF9ldGhoZHI7CisKKwljb25zdCB1OCByZmMxMDQyX2V0aF9oZHJbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJRU5URVIoKTsKKworCWlmIChwcml2LT5hZGFwdGVyLT5kZWJ1Z21vZGUgJiBNUlZEUlZfREVCVUdfUlhfUEFUSCkKKwkJbGJzX2RiZ19oZXgoIlJYIHBhY2tldDogIiwgc2tiLT5kYXRhLAorCQkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmxpbmttb2RlID09IFdMQU5fTElOS01PREVfODAyXzExKQorCQlyZXR1cm4gcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQocHJpdiwgc2tiKTsKKworCXBfcnhfcGt0ID0gKHN0cnVjdCByeHBhY2tldGhkciAqKSBza2ItPmRhdGE7CisJcF9yeF9wZCA9ICZwX3J4X3BrdC0+cnhfcGQ7CisJaWYgKHBfcnhfcGQtPnJ4X2NvbnRyb2wgJiBSeFBEX01FU0hfRlJBTUUpCisJCVNFVF9NRVNIX0ZSQU1FKHNrYik7CisJZWxzZQorCQlVTlNFVF9NRVNIX0ZSQU1FKHNrYik7CisKKwlsYnNfZGJnX2hleCgiUlggRGF0YTogQmVmb3JlIGNob3AgcnhwZCIsIHNrYi0+ZGF0YSwKKwkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKHNrYi0+bGVuIDwgKEVUSF9ITEVOICsgOCArIHNpemVvZihzdHJ1Y3QgcnhwZCkpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUlggZXJyb3I6IEZSQU1FIFJFQ0VJVkVEIFdJVEggQkFEIExFTkdUSFxuIik7CisJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJcmV0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogQ2hlY2sgcnhwZCBzdGF0dXMgYW5kIHVwZGF0ZSA4MDIuMyBzdGF0LAorCSAqLworCWlmICghKHBfcnhfcGQtPnN0YXR1cyAmIE1SVkRSVl9SWFBEX1NUQVRVU19PSykpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJSWCBlcnJvcjogZnJhbWUgcmVjZWl2ZWQgd2l0aCBiYWQgc3RhdHVzXG4iKTsKKwkJbGJzX3ByX2FsZXJ0KCJyeHBkIE5vdCBPS1xuIik7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlyZXQgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBza2ItPmxlbiAtIHNpemVvZihSeFBkKSA9ICVkIC0gJWQgPSAlZFxuIiwKKwkgICAgICAgc2tiLT5sZW4sIHNpemVvZihzdHJ1Y3QgcnhwZCksIHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHBkKSk7CisKKwlsYnNfZGJnX2hleCgiUlggRGF0YTogRGVzdCIsIHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkciwKKwkJc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkcikpOworCWxic19kYmdfaGV4KCJSWCBEYXRhOiBTcmMiLCBwX3J4X3BrdC0+ZXRoODAzX2hkci5zcmNfYWRkciwKKwkJc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLnNyY19hZGRyKSk7CisKKwlpZiAobWVtY21wKCZwX3J4X3BrdC0+cmZjMTA0Ml9oZHIsCisJCSAgIHJmYzEwNDJfZXRoX2hkciwgc2l6ZW9mKHJmYzEwNDJfZXRoX2hkcikpID09IDApIHsKKwkJLyoKKwkJICogIFJlcGxhY2UgdGhlIDgwMyBoZWFkZXIgYW5kIHJmYzEwNDIgaGVhZGVyIChsbGMvc25hcCkgd2l0aCBhbgorCQkgKiAgICBFdGhlcm5ldElJIGhlYWRlciwga2VlcCB0aGUgc3JjL2RzdCBhbmQgc25hcF90eXBlIChldGhlcnR5cGUpCisJCSAqCisJCSAqICBUaGUgZmlybXdhcmUgb25seSBwYXNzZXMgdXAgU05BUCBmcmFtZXMgY29udmVydGluZworCQkgKiAgICBhbGwgUlggRGF0YSBmcm9tIDgwMi4xMSB0byA4MDIuMi9MTEMvU05BUCBmcmFtZXMuCisJCSAqCisJCSAqICBUbyBjcmVhdGUgdGhlIEV0aGVybmV0IElJLCBqdXN0IG1vdmUgdGhlIHNyYywgZHN0IGFkZHJlc3MgcmlnaHQKKwkJICogICAgYmVmb3JlIHRoZSBzbmFwX3R5cGUuCisJCSAqLworCQlwX2V0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopCisJCSAgICAoKHU4ICopICYgcF9yeF9wa3QtPmV0aDgwM19oZHIKKwkJICAgICArIHNpemVvZihwX3J4X3BrdC0+ZXRoODAzX2hkcikgKyBzaXplb2YocF9yeF9wa3QtPnJmYzEwNDJfaGRyKQorCQkgICAgIC0gc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkcikKKwkJICAgICAtIHNpemVvZihwX3J4X3BrdC0+ZXRoODAzX2hkci5zcmNfYWRkcikKKwkJICAgICAtIHNpemVvZihwX3J4X3BrdC0+cmZjMTA0Ml9oZHIuc25hcF90eXBlKSk7CisKKwkJbWVtY3B5KHBfZXRoaGRyLT5oX3NvdXJjZSwgcF9yeF9wa3QtPmV0aDgwM19oZHIuc3JjX2FkZHIsCisJCSAgICAgICBzaXplb2YocF9ldGhoZHItPmhfc291cmNlKSk7CisJCW1lbWNweShwX2V0aGhkci0+aF9kZXN0LCBwX3J4X3BrdC0+ZXRoODAzX2hkci5kZXN0X2FkZHIsCisJCSAgICAgICBzaXplb2YocF9ldGhoZHItPmhfZGVzdCkpOworCisJCS8qIENob3Agb2ZmIHRoZSByeHBkICsgdGhlIGV4Y2VzcyBtZW1vcnkgZnJvbSB0aGUgODAyLjIvbGxjL3NuYXAgaGVhZGVyCisJCSAqICAgdGhhdCB3YXMgcmVtb3ZlZAorCQkgKi8KKwkJaGRyY2hvcCA9ICh1OCAqKSBwX2V0aGhkciAtICh1OCAqKSBwX3J4X3BrdDsKKwl9IGVsc2UgeworCQlsYnNfZGJnX2hleCgiUlggRGF0YTogTExDL1NOQVAiLAorCQkJKHU4ICopICYgcF9yeF9wa3QtPnJmYzEwNDJfaGRyLAorCQkJc2l6ZW9mKHBfcnhfcGt0LT5yZmMxMDQyX2hkcikpOworCisJCS8qIENob3Agb2ZmIHRoZSByeHBkICovCisJCWhkcmNob3AgPSAodTggKikgJiBwX3J4X3BrdC0+ZXRoODAzX2hkciAtICh1OCAqKSBwX3J4X3BrdDsKKwl9CisKKwkvKiBDaG9wIG9mZiB0aGUgbGVhZGluZyBoZWFkZXIgYnl0ZXMgc28gdGhlIHNrYiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mCisJICogICBlaXRoZXIgdGhlIHJlY29uc3RydWN0ZWQgRXRoSUkgZnJhbWUgb3IgdGhlIDgwMi4yL2xsYy9zbmFwIGZyYW1lCisJICovCisJc2tiX3B1bGwoc2tiLCBoZHJjaG9wKTsKKworCS8qIFRha2UgdGhlIGRhdGEgcmF0ZSBmcm9tIHRoZSByeHBkIHN0cnVjdHVyZQorCSAqIG9ubHkgaWYgdGhlIHJhdGUgaXMgYXV0bworCSAqLworCWlmIChhZGFwdGVyLT5pc19kYXRhcmF0ZV9hdXRvKQorCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IGxpYmVydGFzX2luZGV4X3RvX2RhdGFfcmF0ZShwX3J4X3BkLT5yeF9yYXRlKTsKKworCXdsYW5fY29tcHV0ZV9yc3NpKHByaXYsIHBfcnhfcGQpOworCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBzaXplIG9mIGFjdHVhbCBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOworCWlmIChsaWJlcnRhc191cGxvYWRfcnhfcGFja2V0KHByaXYsIHNrYikpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJSWCBlcnJvcjogbGliZXJ0YXNfdXBsb2FkX3J4X3BhY2tldCIKKwkJICAgICAgICIgcmV0dXJucyBmYWlsdXJlXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIFR4L1J4IHJhdGVzIGZyb20gdGhlIE1hcnZlbGwgV0xBTiBmb3JtYXQKKyAqICAoc2VlIFRhYmxlIDIgaW4gU2VjdGlvbiAzLjEpIHRvIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFIHVuaXRzICg1MDAgS2IvcykKKyAqCisgKiAgQHBhcmFtIHJhdGUgICAgSW5wdXQgcmF0ZQorICogIEByZXR1cm4gCSAgIE91dHB1dCBSYXRlICgwIGlmIGludmFsaWQpCisgKi8KK3N0YXRpYyB1OCBjb252ZXJ0X212X3JhdGVfdG9fcmFkaW90YXAodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDA6CQkvKiAgIDEgTWJwcyAqLworCQlyZXR1cm4gMjsKKwljYXNlIDE6CQkvKiAgIDIgTWJwcyAqLworCQlyZXR1cm4gNDsKKwljYXNlIDI6CQkvKiA1LjUgTWJwcyAqLworCQlyZXR1cm4gMTE7CisJY2FzZSAzOgkJLyogIDExIE1icHMgKi8KKwkJcmV0dXJuIDIyOworCWNhc2UgNDoJCS8qICAgNiBNYnBzICovCisJCXJldHVybiAxMjsKKwljYXNlIDU6CQkvKiAgIDkgTWJwcyAqLworCQlyZXR1cm4gMTg7CisJY2FzZSA2OgkJLyogIDEyIE1icHMgKi8KKwkJcmV0dXJuIDI0OworCWNhc2UgNzoJCS8qICAxOCBNYnBzICovCisJCXJldHVybiAzNjsKKwljYXNlIDg6CQkvKiAgMjQgTWJwcyAqLworCQlyZXR1cm4gNDg7CisJY2FzZSA5OgkJLyogIDM2IE1icHMgKi8KKwkJcmV0dXJuIDcyOworCWNhc2UgMTA6CQkvKiAgNDggTWJwcyAqLworCQlyZXR1cm4gOTY7CisJY2FzZSAxMToJCS8qICA1NCBNYnBzICovCisJCXJldHVybiAxMDg7CisJfQorCWxic19wcl9hbGVydCggIkludmFsaWQgTWFydmVsbCBXTEFOIHJhdGUgKCVpKVxuIiwgcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHJlY2VpdmVkIDgwMi4xMSBwYWNrZXQgYW5kIGZvcndhcmRzIGl0CisgKiAgdG8ga2VybmVsL3VwcGVyIGxheWVyCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gc2tiICAgICBBIHBvaW50ZXIgdG8gc2tiIHdoaWNoIGluY2x1ZGVzIHRoZSByZWNlaXZlZCBwYWNrZXQKKyAqICBAcmV0dXJuIAkgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJc3RydWN0IHJ4ODAyMTFwYWNrZXRoZHIgKnBfcnhfcGt0OworCXN0cnVjdCByeHBkICpwcnhwZDsKKwlzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyIHJhZGlvdGFwX2hkcjsKKwlzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyICpwcmFkaW90YXBfaGRyOworCisJRU5URVIoKTsKKworCXBfcnhfcGt0ID0gKHN0cnVjdCByeDgwMjExcGFja2V0aGRyICopIHNrYi0+ZGF0YTsKKwlwcnhwZCA9ICZwX3J4X3BrdC0+cnhfcGQ7CisKKwkvLyBsYnNfZGJnX2hleCgiUlggRGF0YTogQmVmb3JlIGNob3AgcnhwZCIsIHNrYi0+ZGF0YSwgbWluKHNrYi0+bGVuLCAxMDApKTsKKworCWlmIChza2ItPmxlbiA8IChFVEhfSExFTiArIDggKyBzaXplb2Yoc3RydWN0IHJ4cGQpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlJYIGVycm9yOiBGUkFNRSBSRUNFSVZFRCBXSVRIIEJBRCBMRU5HVEhcbiIpOworCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHJ4cGQgc3RhdHVzIGFuZCB1cGRhdGUgODAyLjMgc3RhdCwKKwkgKi8KKwlpZiAoIShwcnhwZC0+c3RhdHVzICYgTVJWRFJWX1JYUERfU1RBVFVTX09LKSkgeworCQkvL2xic19wcl9kZWJ1ZygxLCAiUlggZXJyb3I6IGZyYW1lIHJlY2VpdmVkIHdpdGggYmFkIHN0YXR1c1xuIik7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiUlggRGF0YTogc2tiLT5sZW4gLSBzaXplb2YoUnhQZCkgPSAlZCAtICVkID0gJWRcbiIsCisJICAgICAgIHNrYi0+bGVuLCBzaXplb2Yoc3RydWN0IHJ4cGQpLCBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCisJLyogY3JlYXRlIHRoZSBleHBvcnRlZCByYWRpbyBoZWFkZXIgKi8KKwlzd2l0Y2ggKHByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSkgeworCWNhc2UgV0xBTl9SQURJT01PREVfTk9ORToKKwkJLyogbm8gcmFkaW8gaGVhZGVyICovCisJCS8qIGNob3AgdGhlIHJ4cGQgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cGQpKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fUkFESU9NT0RFX1JBRElPVEFQOgorCQkvKiByYWRpb3RhcCBoZWFkZXIgKi8KKwkJcmFkaW90YXBfaGRyLmhkci5pdF92ZXJzaW9uID0gMDsKKwkJLyogWFhYIG11c3QgY2hlY2sgdGhpcyB2YWx1ZSBmb3IgcGFkICovCisJCXJhZGlvdGFwX2hkci5oZHIuaXRfcGFkID0gMDsKKwkJcmFkaW90YXBfaGRyLmhkci5pdF9sZW4gPSBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcik7CisJCXJhZGlvdGFwX2hkci5oZHIuaXRfcHJlc2VudCA9IFJYX1JBRElPVEFQX1BSRVNFTlQ7CisJCS8qIHVua25vd24gdmFsdWVzICovCisJCXJhZGlvdGFwX2hkci5mbGFncyA9IDA7CisJCXJhZGlvdGFwX2hkci5jaGFuX2ZyZXEgPSAwOworCQlyYWRpb3RhcF9oZHIuY2hhbl9mbGFncyA9IDA7CisJCXJhZGlvdGFwX2hkci5hbnRlbm5hID0gMDsKKwkJLyoga25vd24gdmFsdWVzICovCisJCXJhZGlvdGFwX2hkci5yYXRlID0gY29udmVydF9tdl9yYXRlX3RvX3JhZGlvdGFwKHByeHBkLT5yeF9yYXRlKTsKKwkJLyogWFhYIG11c3QgY2hlY2sgbm8gY2FycnlvdXQgKi8KKwkJcmFkaW90YXBfaGRyLmFudHNpZ25hbCA9IHByeHBkLT5zbnIgKyBwcnhwZC0+bmY7CisJCXJhZGlvdGFwX2hkci5yeF9mbGFncyA9IDA7CisJCWlmICghKHByeHBkLT5zdGF0dXMgJiBNUlZEUlZfUlhQRF9TVEFUVVNfT0spKQorCQkJcmFkaW90YXBfaGRyLnJ4X2ZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX1JYX0JBREZDUzsKKwkJLy9tZW1zZXQocmFkaW90YXBfaGRyLnBhZCwgMHgxMSwgSUVFRTgwMjExX1JBRElPVEFQX0hEUkxFTiAtIDE4KTsKKworCQkvLyBsYnNfZGJnX2hleDEoIlJYIHJhZGlvbW9kZSBwYWNrZXQgQkVGOiAiLCBza2ItPmRhdGEsIG1pbihza2ItPmxlbiwgMTAwKSk7CisKKwkJLyogY2hvcCB0aGUgcnhwZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCisJCS8qIGFkZCBzcGFjZSBmb3IgdGhlIG5ldyByYWRpbyBoZWFkZXIgKi8KKwkJaWYgKChza2JfaGVhZHJvb20oc2tiKSA8IHNpemVvZihzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyKSkgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkciksIDAsCisJCQkJICAgICBHRlBfQVRPTUlDKSkgeworCQkJbGJzX3ByX2FsZXJ0KCAiJXM6IGNvdWxkbid0IHBza2JfZXhwYW5kX2hlYWRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQl9CisKKwkJcHJhZGlvdGFwX2hkciA9CisJCSAgICAoc3RydWN0IHJ4X3JhZGlvdGFwX2hkciAqKXNrYl9wdXNoKHNrYiwKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgICByeF9yYWRpb3RhcF9oZHIpKTsKKwkJbWVtY3B5KHByYWRpb3RhcF9oZHIsICZyYWRpb3RhcF9oZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOworCQkvL2xic19kYmdfaGV4MSgiUlggcmFkaW9tb2RlIHBhY2tldCBBRlQ6ICIsIHNrYi0+ZGF0YSwgbWluKHNrYi0+bGVuLCAxMDApKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duIGhlYWRlciAqLworCQlsYnNfcHJfYWxlcnQoICJVbmtub3duIHJhZGlvbW9kZSAoJWkpXG4iLAorCQkgICAgICAgcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlKTsKKwkJLyogZG9uJ3QgZXhwb3J0IGFueSBoZWFkZXIgKi8KKwkJLyogY2hvcCB0aGUgcnhwZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCQlicmVhazsKKwl9CisKKwkvKiBUYWtlIHRoZSBkYXRhIHJhdGUgZnJvbSB0aGUgcnhwZCBzdHJ1Y3R1cmUKKwkgKiBvbmx5IGlmIHRoZSByYXRlIGlzIGF1dG8KKwkgKi8KKwlpZiAoYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0bykgeworCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IGxpYmVydGFzX2luZGV4X3RvX2RhdGFfcmF0ZShwcnhwZC0+cnhfcmF0ZSk7CisJfQorCisJd2xhbl9jb21wdXRlX3Jzc2kocHJpdiwgcHJ4cGQpOworCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBzaXplIG9mIGFjdHVhbCBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOworCisJaWYgKGxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQocHJpdiwgc2tiKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlJYIGVycm9yOiBsaWJlcnRhc191cGxvYWRfcnhfcGFja2V0ICIKKwkJCSJyZXR1cm5zIGZhaWx1cmVcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCXJldCA9IDA7Citkb25lOgorCUxFQVZFKCk7CisKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOwkvKiBFVEhfUF84MDIxMV9SQVcgKi8KKworCXJldHVybiAocmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NiaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2JpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkM2E1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zYmkuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgSUYgbGF5ZXIgZGVmaW5pdGlvbnMuCisgICovCisKKyNpZm5kZWYJX1NCSV9IXworI2RlZmluZQlfU0JJX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKworLyoqIElOVCBzdGF0dXMgQml0IERlZmluaXRpb24qLworI2RlZmluZSBoaXNfY21kZG5sZHJkeQkJCTB4MDEKKyNkZWZpbmUgaGlzX2NhcmRldmVudAkJCTB4MDIKKyNkZWZpbmUgaGlzX2NtZHVwbGRyZHkJCQkweDA0CisKKyNpZm5kZWYgREVWX05BTUVfTEVOCisjZGVmaW5lIERFVl9OQU1FX0xFTgkJCTMyCisjZW5kaWYKKworI2RlZmluZSBTQklfRVZFTlRfQ0FVU0VfU0hJRlQJCTMKKworLyogUHJvYmUgYW5kIENoZWNrIGlmIHRoZSBjYXJkIGlzIHByZXNlbnQqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYod2xhbl9wcml2YXRlICogcHJpdik7CitpbnQgbGliZXJ0YXNfc2JpX3VucmVnaXN0ZXJfZGV2KHdsYW5fcHJpdmF0ZSAqKTsKK2ludCBsaWJlcnRhc19zYmlfZ2V0X2ludF9zdGF0dXMod2xhbl9wcml2YXRlICogcHJpdiwgdTggKik7CitpbnQgbGliZXJ0YXNfc2JpX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBsaWJlcnRhc19zYmlfdW5yZWdpc3Rlcih2b2lkKTsKK2ludCBsaWJlcnRhc19zYmlfcHJvZ19maXJtd2FyZSh3bGFuX3ByaXZhdGUgKik7CisKK2ludCBsaWJlcnRhc19zYmlfcmVhZF9ldmVudF9jYXVzZSh3bGFuX3ByaXZhdGUgKik7CitpbnQgbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCB0eXBlLCB1OCAqIHBheWxvYWQsIHUxNiBuYik7Cit3bGFuX3ByaXZhdGUgKmxpYmVydGFzX3NiaV9nZXRfcHJpdih2b2lkICpjYXJkKTsKKworI2lmZGVmIEVOQUJMRV9QTQoraW50IGxpYmVydGFzX3NiaV9zdXNwZW5kKHdsYW5fcHJpdmF0ZSAqKTsKK2ludCBsaWJlcnRhc19zYmlfcmVzdW1lKHdsYW5fcHJpdmF0ZSAqKTsKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX1NCSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4NzA2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uYwpAQCAtMCwwICsxLDIwNDQgQEAKKy8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KKy8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLworCisvKioKKyAgKiBGdW5jdGlvbnMgaW1wbGVtZW50aW5nIHdsYW4gc2NhbiBJT0NUTCBhbmQgZmlybXdhcmUgY29tbWFuZCBBUElzCisgICoKKyAgKiBJT0NUTCBoYW5kbGVycyBhcyB3ZWxsIGFzIGNvbW1hbmQgcHJlcGVyYXRpb24gYW5kIHJlc3BvbnNlIHJvdXRpbmVzCisgICogIGZvciBzZW5kaW5nIHNjYW4gY29tbWFuZHMgdG8gdGhlIGZpcm13YXJlLgorICAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgInNjYW4uaCIKKworLy8hIEFwcHJveGltYXRlIGFtb3VudCBvZiBkYXRhIG5lZWRlZCB0byBwYXNzIGEgc2NhbiByZXN1bHQgYmFjayB0byBpd2xpc3QKKyNkZWZpbmUgTUFYX1NDQU5fQ0VMTF9TSVpFICAoSVdfRVZfQUREUl9MRU4gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElXX0VTU0lEX01BWF9TSVpFICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVZfVUlOVF9MRU4gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJV19FVl9GUkVRX0xFTiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElXX0VWX1FVQUxfTEVOICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVNTSURfTUFYX1NJWkUgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJV19FVl9QQVJBTV9MRU4gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQwKQkvKiA0MCBmb3IgV1BBSUUgKi8KKworLy8hIE1lbW9yeSBuZWVkZWQgdG8gc3RvcmUgYSBtYXggc2l6ZWQgY2hhbm5lbCBMaXN0IFRMViBmb3IgYSBmaXJtd2FyZSBzY2FuCisjZGVmaW5lIENIQU5fVExWX01BWF9TSVpFICAoc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlcikgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKE1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCkpKQorCisvLyEgTWVtb3J5IG5lZWRlZCB0byBzdG9yZSBhIG1heCBudW1iZXIvc2l6ZSBTU0lEIFRMViBmb3IgYSBmaXJtd2FyZSBzY2FuCisjZGVmaW5lIFNTSURfVExWX01BWF9TSVpFICAoMSAqIHNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0KSkKKworLy8hIE1heGltdW0gbWVtb3J5IG5lZWRlZCBmb3IgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyB3aXRoIGFsbCBUTFZzIGF0IG1heAorI2RlZmluZSBNQVhfU0NBTl9DRkdfQUxMT0MgKHNpemVvZihzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcykgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDSEFOX1RMVl9NQVhfU0laRSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU1NJRF9UTFZfTUFYX1NJWkUpCisKKy8vISBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlIGZpcm13YXJlIGNhbiBzY2FuIHBlciBjb21tYW5kCisjZGVmaW5lIE1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4gICAxNAorCisvKioKKyAqIEBicmllZiBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbiBwZXIgZmlybXdhcmUgc2NhbiBjb21tYW5kIGlzc3VhbmNlLgorICoKKyAqICBOdW1iZXIgcmVzdHJpY3RlZCB0byBwcmV2ZW50IGhpdHRpbmcgdGhlIGxpbWl0IG9uIHRoZSBhbW91bnQgb2Ygc2NhbiBkYXRhCisgKiAgcmV0dXJuZWQgaW4gYSBzaW5nbGUgZmlybXdhcmUgc2NhbiBjb21tYW5kLgorICovCisjZGVmaW5lIE1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTl9DTUQgICA0CisKKy8vISBTY2FuIHRpbWUgc3BlY2lmaWVkIGluIHRoZSBjaGFubmVsIFRMViBmb3IgZWFjaCBjaGFubmVsIGZvciBwYXNzaXZlIHNjYW5zCisjZGVmaW5lIE1SVkRSVl9QQVNTSVZFX1NDQU5fQ0hBTl9USU1FICAxMDAKKworLy8hIFNjYW4gdGltZSBzcGVjaWZpZWQgaW4gdGhlIGNoYW5uZWwgVExWIGZvciBlYWNoIGNoYW5uZWwgZm9yIGFjdGl2ZSBzY2FucworI2RlZmluZSBNUlZEUlZfQUNUSVZFX1NDQU5fQ0hBTl9USU1FICAgMTAwCisKKy8vISBNYWNybyB0byBlbmFibGUvZGlzYWJsZSBTU0lEIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nIGEgc2NhbiB0YWJsZQorI2lmZGVmIERJU0NBUkRfQkFEX1NTSUQKKyNkZWZpbmUgQ0hFQ0tfU1NJRF9JU19WQUxJRCh4KSBzc2lkX3ZhbGlkKCZic3NpZEVudHJ5LnNzaWQpCisjZWxzZQorI2RlZmluZSBDSEVDS19TU0lEX0lTX1ZBTElEKHgpIDEKKyNlbmRpZgorCisvKioKKyAqICBAYnJpZWYgQ2hlY2sgaWYgYSBzY2FubmVkIG5ldHdvcmsgY29tcGF0aWJsZSB3aXRoIHRoZSBkcml2ZXIgc2V0dGluZ3MKKyAqCisgKiAgIFdFUCAgICAgV1BBICAgICBXUEEyICAgIGFkLWhvYyAgZW5jcnlwdCAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrCisgKiBlbmFibGVkIGVuYWJsZWQgIGVuYWJsZWQgICBBRVMgICAgIG1vZGUgICBwcml2YWN5ICBXUEEgIFdQQTIgIENvbXBhdGlibGUKKyAqICAgIDAgICAgICAgMCAgICAgICAgMCAgICAgICAwICAgICAgTk9ORSAgICAgIDAgICAgICAwICAgIDAgICB5ZXMgTm8gc2VjdXJpdHkKKyAqICAgIDEgICAgICAgMCAgICAgICAgMCAgICAgICAwICAgICAgTk9ORSAgICAgIDEgICAgICAwICAgIDAgICB5ZXMgU3RhdGljIFdFUAorICogICAgMCAgICAgICAxICAgICAgICAwICAgICAgIDAgICAgICAgeCAgICAgICAgMXggICAgIDEgICAgeCAgIHllcyBXUEEKKyAqICAgIDAgICAgICAgMCAgICAgICAgMSAgICAgICAwICAgICAgIHggICAgICAgIDF4ICAgICB4ICAgIDEgICB5ZXMgV1BBMgorICogICAgMCAgICAgICAwICAgICAgICAwICAgICAgIDEgICAgICBOT05FICAgICAgMSAgICAgIDAgICAgMCAgIHllcyBBZC1ob2MgQUVTCisgKiAgICAwICAgICAgIDAgICAgICAgIDAgICAgICAgMCAgICAgIT1OT05FICAgICAxICAgICAgMCAgICAwICAgeWVzIER5bmFtaWMgV0VQCisgKgorICoKKyAqICBAcGFyYW0gYWRhcHRlciBBIHBvaW50ZXIgdG8gd2xhbl9hZGFwdGVyCisgKiAgQHBhcmFtIGluZGV4ICAgSW5kZXggaW4gc2NhbnRhYmxlIHRvIGNoZWNrIGFnYWluc3QgY3VycmVudCBkcml2ZXIgc2V0dGluZ3MKKyAqICBAcGFyYW0gbW9kZSAgICBOZXR3b3JrIG1vZGU6IEluZnJhc3RydWN0dXJlIG9yIElCU1MKKyAqCisgKiAgQHJldHVybiAgICAgICAgSW5kZXggaW4gc2NhbnRhYmxlLCBvciBlcnJvciBjb2RlIGlmIG5lZ2F0aXZlCisgKi8KK3N0YXRpYyBpbnQgaXNfbmV0d29ya19jb21wYXRpYmxlKHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIGludCBpbmRleCwgaW50IG1vZGUpCit7CisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLmluZnJhbW9kZSA9PSBtb2RlKSB7CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCisJCSAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LndwYV9pZVswXSAhPQorCQkgICAgV1BBX0lFCisJCSAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC53cGFfaWVbMF0gIT0KKwkJICAgIFdQQTJfSUUgJiYgYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSA9PSBDSVBIRVJfTk9ORQorCQkgICAgJiYgIWFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSkgeworCQkJLyogbm8gc2VjdXJpdHkgKi8KKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gaW5kZXg7CisJCX0gZWxzZSBpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQKKwkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCisJCQkgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kpIHsKKwkJCS8qIHN0YXRpYyBXRVAgZW5hYmxlZCAqLworCQkJTEVBVkUoKTsKKwkJCXJldHVybiBpbmRleDsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQKKwkJCSAgICYmIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgID09IFdQQV9JRSkKKwkJCSAgIC8qIHByaXZhY3kgYml0IG1heSBOT1QgYmUgc2V0IGluIHNvbWUgQVBzIGxpa2UgTGlua1N5cyBXUlQ1NEcKKwkJCSAgICAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSAqLworCQkgICAgKSB7CisJCQkvKiBXUEEgZW5hYmxlZCAqLworICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgImlzX25ldHdvcmtfY29tcGF0aWJsZSgpIFdQQTogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCAiCisJCQkgICAgICAgInByaXZhY3k9JSN4XG4iLCBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sCisJCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSk7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIGluZGV4OworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZAorCQkJICAgJiYgKGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhMl9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgID09IFdQQTJfSUUpCisJCQkgICAvKiBwcml2YWN5IGJpdCBtYXkgTk9UIGJlIHNldCBpbiBzb21lIEFQcyBsaWtlIExpbmtTeXMgV1JUNTRHCisJCQkgICAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kgKi8KKwkJICAgICkgeworCQkJLyogV1BBMiBlbmFibGVkICovCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgV1BBMjogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCAiCisJCQkgICAgICAgInByaXZhY3k9JSN4XG4iLCBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sCisJCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSk7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIGluZGV4OworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgICE9IFdQQV9JRSkKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0KKwkJCSAgICAgICAhPSBXUEEyX0lFKQorCQkJICAgJiYgYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSAhPSBDSVBIRVJfTk9ORQorCQkJICAgJiYgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KSB7CisJCQkvKiBkeW5hbWljIFdFUCBlbmFibGVkICovCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgZHluYW1pYyBXRVA6IGluZGV4PSVkICIKKwkJCSAgICAgICAid3BhX2llPSUjeCB3cGEyX2llPSUjeCBFbmNtb2RlPSUjeCBwcml2YWN5PSUjeFxuIiwKKwkJCSAgICAgICBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sIGFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUsCisJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gaW5kZXg7CisJCX0KKworCQkvKiBzZWN1cml0eSBkb2Vzbid0IG1hdGNoICovCisgICAgICAgIGxic19wcl9kZWJ1ZygxLAorCQkgICAgICAgImlzX25ldHdvcmtfY29tcGF0aWJsZSgpIEZBSUxFRDogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCSAgICAgICAid3BhMl9pZT0lI3ggV0VQPSVzIFdQQT0lcyBXUEEyPSVzIEVuY21vZGU9JSN4IHByaXZhY3k9JSN4XG4iLAorCQkgICAgICAgaW5kZXgsCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LndwYV9pZVswXSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhMl9zdXBwbGljYW50LndwYV9pZVswXSwKKwkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PQorCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCkgPyAiZSIgOiAiZCIsCisJCSAgICAgICAoYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgPyAiZSIgOiAiZCIsCisJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJLyogbW9kZSBkb2Vzbid0IG1hdGNoICovCisJTEVBVkUoKTsKKwlyZXR1cm4gLUVORVRVTlJFQUNIOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgYSBTU0lEIGFzIGJlaW5nIGFibGUgdG8gYmUgcHJpbnRlZAorICoKKyAqICBAcGFyYW0gcHNzaWQgICBTU0lEIHN0cnVjdHVyZSB0byB2YWxpZGF0ZQorICoKKyAqICBAcmV0dXJuICAgICAgICBUUlVFIG9yIEZBTFNFCisgKi8KK3N0YXRpYyB1OCBzc2lkX3ZhbGlkKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwc3NpZCkKK3sKKwlpbnQgc3NpZGlkeDsKKworCWZvciAoc3NpZGlkeCA9IDA7IHNzaWRpZHggPCBwc3NpZC0+c3NpZGxlbmd0aDsgc3NpZGlkeCsrKSB7CisJCWlmICghaXNwcmludChwc3NpZC0+c3NpZFtzc2lkaWR4XSkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogIEBicmllZiBQb3N0IHByb2Nlc3MgdGhlIHNjYW4gdGFibGUgYWZ0ZXIgYSBuZXcgc2NhbiBjb21tYW5kIGhhcyBjb21wbGV0ZWQKKyAqCisgKiAgSW5zcGVjdCBlYWNoIGVudHJ5IG9mIHRoZSBzY2FuIHRhYmxlIGFuZCB0cnkgdG8gZmluZCBhbiBlbnRyeSB0aGF0CisgKiAgICBtYXRjaGVzIG91ciBjdXJyZW50IGFzc29jaWF0ZWQvam9pbmVkIG5ldHdvcmsgZnJvbSB0aGUgc2Nhbi4gIElmCisgKiAgICBvbmUgaXMgZm91bmQsIHVwZGF0ZSB0aGUgc3RvcmVkIGNvcHkgb2YgdGhlIGJzc2Rlc2NyaXB0b3IgZm9yIG91cgorICogICAgY3VycmVudCBuZXR3b3JrLgorICoKKyAqICBEZWJ1ZyBkdW1wIHRoZSBjdXJyZW50IHNjYW4gdGFibGUgY29udGVudHMgaWYgY29tcGlsZWQgYWNjb3JkaW5nbHkuCisgKgorICogIEBwYXJhbSBwcml2ICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgQHJldHVybiAgICAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5fc2Nhbl9wcm9jZXNzX3Jlc3VsdHMod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBmb3VuZGN1cnJlbnQ7CisJaW50IGk7CisKKwlmb3VuZGN1cnJlbnQgPSAwOworCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQkvKiB0cnkgdG8gZmluZCB0aGUgY3VycmVudCBCU1NJRCBpbiB0aGUgbmV3IHNjYW4gbGlzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQkJaWYgKCFsaWJlcnRhc19TU0lEX2NtcCgmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQsCisJCQkJICAgICAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQpICYmCisJCQkgICAgIW1lbWNtcChhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCQkJICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLAorCQkJCSAgICBFVEhfQUxFTikpIHsKKwkJCQlmb3VuZGN1cnJlbnQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kY3VycmVudCkgeworCQkJLyogTWFrZSBhIGNvcHkgb2YgY3VycmVudCBCU1NJRCBkZXNjcmlwdG9yICovCisJCQltZW1jcHkoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NkZXNjcmlwdG9yLAorCQkJICAgICAgICZhZGFwdGVyLT5zY2FudGFibGVbaV0sCisJCQkgICAgICAgc2l6ZW9mKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NkZXNjcmlwdG9yKSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW46KCUwMmQpICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCAiCisJCSAgICAgICAiUlNTSVslMDNkXSwgU1NJRFslc11cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3NbMF0sCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0ubWFjYWRkcmVzc1sxXSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzWzJdLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3NbM10sCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0ubWFjYWRkcmVzc1s0XSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzWzVdLAorCQkgICAgICAgKHMzMikgYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2ksCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0uc3NpZC5zc2lkKTsKKwl9Cit9CisKKy8qKgorICogIEBicmllZiBDcmVhdGUgYSBjaGFubmVsIGxpc3QgZm9yIHRoZSBkcml2ZXIgdG8gc2NhbiBiYXNlZCBvbiByZWdpb24gaW5mbworICoKKyAqICBVc2UgdGhlIGRyaXZlciByZWdpb24vYmFuZCBpbmZvcm1hdGlvbiB0byBjb25zdHJ1Y3QgYSBjb21wcmVoZW5zaXZlIGxpc3QKKyAqICAgIG9mIGNoYW5uZWxzIHRvIHNjYW4uICBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgYW55IHNjYW4gdGhhdCBpcyBub3QKKyAqICAgIHByb3ZpZGVkIGEgc3BlY2lmaWMgY2hhbm5lbCBsaXN0IHRvIHNjYW4uCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHNjYW5jaGFubGlzdCAgT3V0cHV0IHBhcmFtZXRlcjogcmVzdWx0aW5nIGNoYW5uZWwgbGlzdCB0byBzY2FuCisgKiAgQHBhcmFtIGZpbHRlcmVkc2NhbiAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGEgQlNTSUQgb3IgU1NJRCBmaWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzZW50IGluIHRoZSBjb21tYW5kIHRvIGZpcm13YXJlLiAgVXNlZCB0bworICogICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgc2VudCBpbiBhIHNjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCB0byBkaXNhYmxlIHRoZSBmaXJtd2FyZSBjaGFubmVsIHNjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgd2xhbl9zY2FuX2NyZWF0ZV9jaGFubmVsX2xpc3Qod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJICBzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqIHNjYW5jaGFubGlzdCwKKwkJCQkJICB1OCBmaWx0ZXJlZHNjYW4pCit7CisKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCByZWdpb25fY2hhbm5lbCAqc2NhbnJlZ2lvbjsKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7CisJaW50IHJnbmlkeDsKKwlpbnQgY2hhbmlkeDsKKwlpbnQgbmV4dGNoYW47CisJdTggc2NhbnR5cGU7CisKKwljaGFuaWR4ID0gMDsKKworCS8qIFNldCB0aGUgZGVmYXVsdCBzY2FuIHR5cGUgdG8gdGhlIHVzZXIgc3BlY2lmaWVkIHR5cGUsIHdpbGwgbGF0ZXIKKwkgKiAgIGJlIGNoYW5nZWQgdG8gcGFzc2l2ZSBvbiBhIHBlciBjaGFubmVsIGJhc2lzIGlmIHJlc3RyaWN0ZWQgYnkKKwkgKiAgIHJlZ3VsYXRvcnkgcmVxdWlyZW1lbnRzICgxMWQgb3IgMTFoKQorCSAqLworCXNjYW50eXBlID0gYWRhcHRlci0+c2NhbnR5cGU7CisKKwlmb3IgKHJnbmlkeCA9IDA7IHJnbmlkeCA8IEFSUkFZX1NJWkUoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWwpOyByZ25pZHgrKykgeworCQlpZiAocHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkICYmCisJCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJCS8qIFNjYW4gYWxsIHRoZSBzdXBwb3J0ZWQgY2hhbiBmb3IgdGhlIGZpcnN0IHNjYW4gKi8KKwkJCWlmICghYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbcmduaWR4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCXNjYW5yZWdpb24gPSAmYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbcmduaWR4XTsKKworCQkJLyogY2xlYXIgdGhlIHBhcnNlZF9yZWdpb25fY2hhbiBmb3IgdGhlIGZpcnN0IHNjYW4gKi8KKwkJCW1lbXNldCgmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuLCAweDAwLAorCQkJICAgICAgIHNpemVvZihhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4pKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbcmduaWR4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCXNjYW5yZWdpb24gPSAmYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbcmduaWR4XTsKKwkJfQorCisJCWZvciAobmV4dGNoYW4gPSAwOworCQkgICAgIG5leHRjaGFuIDwgc2NhbnJlZ2lvbi0+bnJjZnA7IG5leHRjaGFuKyssIGNoYW5pZHgrKykgeworCisJCQljZnAgPSBzY2FucmVnaW9uLT5DRlAgKyBuZXh0Y2hhbjsKKworCQkJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQkJCXNjYW50eXBlID0KKwkJCQkgICAgbGliZXJ0YXNfZ2V0X3NjYW5fdHlwZV8xMWQoY2ZwLT5jaGFubmVsLAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBwYXJzZWRfcmVnaW9uX2NoYW4pOworCQkJfQorCisJCQlzd2l0Y2ggKHNjYW5yZWdpb24tPmJhbmQpIHsKKwkJCWNhc2UgQkFORF9COgorCQkJY2FzZSBCQU5EX0c6CisJCQlkZWZhdWx0OgorCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5yYWRpb3R5cGUgPQorCQkJCSAgICBjbWRfc2Nhbl9yYWRpb190eXBlX2JnOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoc2NhbnR5cGUgPT0gY21kX3NjYW5fdHlwZV9wYXNzaXZlKSB7CisJCQkJc2NhbmNoYW5saXN0W2NoYW5pZHhdLm1heHNjYW50aW1lID0KKwkJCQkgICAgY3B1X3RvX2xlMTYKKwkJCQkgICAgKE1SVkRSVl9QQVNTSVZFX1NDQU5fQ0hBTl9USU1FKTsKKwkJCQlzY2FuY2hhbmxpc3RbY2hhbmlkeF0uY2hhbnNjYW5tb2RlLnBhc3NpdmVzY2FuID0KKwkJCQkgICAgMTsKKwkJCX0gZWxzZSB7CisJCQkJc2NhbmNoYW5saXN0W2NoYW5pZHhdLm1heHNjYW50aW1lID0KKwkJCQkgICAgY3B1X3RvX2xlMTYKKwkJCQkgICAgKE1SVkRSVl9BQ1RJVkVfU0NBTl9DSEFOX1RJTUUpOworCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5jaGFuc2Nhbm1vZGUucGFzc2l2ZXNjYW4gPQorCQkJCSAgICAwOworCQkJfQorCisJCQlzY2FuY2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlciA9IGNmcC0+Y2hhbm5lbDsKKworCQkJaWYgKGZpbHRlcmVkc2NhbikgeworCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5jaGFuc2Nhbm1vZGUuCisJCQkJICAgIGRpc2FibGVjaGFuZmlsdCA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogIEBicmllZiBDb25zdHJ1Y3QgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyBzdHJ1Y3R1cmUgdG8gdXNlIGluIGlzc3VlIHNjYW4gY21kcworICoKKyAqICBBcHBsaWNhdGlvbiBsYXllciBvciBvdGhlciBmdW5jdGlvbnMgY2FuIGludm9rZSB3bGFuX3NjYW5fbmV0d29ya3MKKyAqICAgIHdpdGggYSBzY2FuIGNvbmZpZ3VyYXRpb24gc3VwcGxpZWQgaW4gYSB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgc3RydWN0LgorICogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgYmFzaXMgb2Ygb25lIG9yIG1hbnkgd2xhbl9zY2FuX2NtZF9jb25maWcKKyAqICAgIGNvbW1hbmRzIHRoYXQgYXJlIHNlbnQgdG8gdGhlIGNvbW1hbmQgcHJvY2Vzc2luZyBtb2R1bGUgYW5kIHNlbnQgdG8KKyAqICAgIGZpcm13YXJlLgorICoKKyAqICBDcmVhdGUgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHVzZXIgc3VwcGxpZWQKKyAqICAgIHBhcmFtZXRlcnMgKGlmIHByZXNlbnQpOgorICogICAgICAgICAgICAgLSBTU0lEIGZpbHRlcgorICogICAgICAgICAgICAgLSBCU1NJRCBmaWx0ZXIKKyAqICAgICAgICAgICAgIC0gTnVtYmVyIG9mIFByb2JlcyB0byBiZSBzZW50CisgKiAgICAgICAgICAgICAtIGNoYW5uZWwgbGlzdAorICoKKyAqICBJZiB0aGUgU1NJRCBvciBCU1NJRCBmaWx0ZXIgaXMgbm90IHByZXNlbnQsIGRpc2FibGUvY2xlYXIgdGhlIGZpbHRlci4KKyAqICBJZiB0aGUgbnVtYmVyIG9mIHByb2JlcyBpcyBub3Qgc2V0LCB1c2UgdGhlIGFkYXB0ZXIgZGVmYXVsdCBzZXR0aW5nCisgKiAgUXVhbGlmeSB0aGUgY2hhbm5lbAorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwdXNlcnNjYW5pbiAgICAgIE5VTEwgb3IgcG9pbnRlciB0byBzY2FuIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogIEBwYXJhbSBwcGNoYW50bHZvdXQgICAgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgVExWIHBvcnRpb24gb2YgdGhlIG91dHB1dCBzY2FuIGNvbmZpZworICogIEBwYXJhbSBwc2NhbmNoYW5saXN0ICAgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB0byBzY2FuCisgKiAgQHBhcmFtIHBtYXhjaGFucGVyc2NhbiAgT3V0cHV0IHBhcmFtZXRlcjogTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBpc3N1YW5jZSBvZiB0aGUgZmlybXdhcmUgc2NhbiBjb21tYW5kCisgKiAgQHBhcmFtIHBmaWx0ZXJlZHNjYW4gICAgT3V0cHV0IHBhcmFtZXRlcjogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYSBCU1NJRCBvciBTU0lEIGZpbHRlciBpcyBiZWluZyBzZW50IGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgdG8gZmlybXdhcmUuICBVc2VkIHRvIGluY3JlYXNlIHRoZSBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjaGFubmVscyBzZW50IGluIGEgc2NhbiBjb21tYW5kIGFuZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIGZpcm13YXJlIGNoYW5uZWwgc2NhbiBmaWx0ZXIuCisgKiAgQHBhcmFtIHBzY2FuY3VycmVudG9ubHkgT3V0cHV0IHBhcmFtZXRlcjogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgYXJlIG9ubHkgc2Nhbm5pbmcgb3VyIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAgICAgcmVzdWx0aW5nIHNjYW4gY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICoKK3dsYW5fc2Nhbl9zZXR1cF9zY2FuX2NvbmZpZyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgIGNvbnN0IHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKiBwdXNlcnNjYW5pbiwKKwkJCSAgICBzdHJ1Y3QgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldCAqKiBwcGNoYW50bHZvdXQsCisJCQkgICAgc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKiBwc2NhbmNoYW5saXN0LAorCQkJICAgIGludCAqcG1heGNoYW5wZXJzY2FuLAorCQkJICAgIHU4ICogcGZpbHRlcmVkc2NhbiwKKwkJCSAgICB1OCAqIHBzY2FuY3VycmVudG9ubHkpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwljb25zdCB1OCB6ZXJvbWFjW0VUSF9BTEVOXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCXN0cnVjdCBtcnZsaWV0eXBlc19udW1wcm9iZXMgKnBudW1wcm9iZXN0bHY7CisJc3RydWN0IG1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldCAqcHNzaWR0bHY7CisJc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICogcHNjYW5jZmdvdXQgPSBOVUxMOworCXU4ICpwdGx2cG9zOworCXUxNiBudW1wcm9iZXM7CisJdTE2IHNzaWRsZW47CisJaW50IGNoYW5pZHg7CisJaW50IHNjYW50eXBlOworCWludCBzY2FuZHVyOworCWludCBjaGFubmVsOworCWludCByYWRpb3R5cGU7CisKKwlwc2NhbmNmZ291dCA9IGt6YWxsb2MoTUFYX1NDQU5fQ0ZHX0FMTE9DLCBHRlBfS0VSTkVMKTsKKwlpZiAocHNjYW5jZmdvdXQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgdGx2YnVmZmVybGVuIGlzIGNhbGN1bGF0ZWQgZm9yIGVhY2ggc2NhbiBjb21tYW5kLiAgVGhlIFRMVnMgYWRkZWQKKwkgKiAgIGluIHRoaXMgcm91dGluZSB3aWxsIGJlIHByZXNlcnZlZCBzaW5jZSB0aGUgcm91dGluZSB0aGF0IHNlbmRzCisJICogICB0aGUgY29tbWFuZCB3aWxsIGFwcGVuZCBjaGFubmVsVExWcyBhdCAqcHBjaGFudGx2b3V0LiAgVGhlIGRpZmZlcmVuY2UKKwkgKiAgIGJldHdlZW4gdGhlICpwcGNoYW50bHZvdXQgYW5kIHRoZSB0bHZidWZmZXIgc3RhcnQgd2lsbCBiZSB1c2VkCisJICogICB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYW55dGhpbmcgd2UgYWRkIGluIHRoaXMgcm91dGluZS4KKwkgKi8KKwlwc2NhbmNmZ291dC0+dGx2YnVmZmVybGVuID0gMDsKKworCS8qIFJ1bm5pbmcgdGx2IHBvaW50ZXIuICBBc3NpZ25lZCB0byBwcGNoYW50bHZvdXQgYXQgZW5kIG9mIGZ1bmN0aW9uCisJICogIHNvIGxhdGVyIHJvdXRpbmVzIGtub3cgd2hlcmUgY2hhbm5lbHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21tYW5kIGJ1ZgorCSAqLworCXB0bHZwb3MgPSBwc2NhbmNmZ291dC0+dGx2YnVmZmVyOworCisJLyoKKwkgKiBTZXQgdGhlIGluaXRpYWwgc2NhbiBwYXJhbXRlcnMgZm9yIHByb2dyZXNzaXZlIHNjYW5uaW5nLiAgSWYgYSBzcGVjaWZpYworCSAqICAgQlNTSUQgb3IgU1NJRCBpcyB1c2VkLCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzY2FuIGNvbW1hbmQKKwkgKiAgIHdpbGwgYmUgaW5jcmVhc2VkIHRvIHRoZSBhYnNvbHV0ZSBtYXhpbXVtCisJICovCisJKnBtYXhjaGFucGVyc2NhbiA9IE1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTl9DTUQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzY2FuIGFzIHVuLWZpbHRlcmVkIGJ5IGZpcm13YXJlLCBzZXQgdG8gVFJVRSBiZWxvdyBpZgorCSAqICAgYSBTU0lEIG9yIEJTU0lEIGZpbHRlciBpcyBzZW50IGluIHRoZSBjb21tYW5kCisJICovCisJKnBmaWx0ZXJlZHNjYW4gPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2NhbiBhcyBub3QgYmVpbmcgb25seSBvbiB0aGUgY3VycmVudCBjaGFubmVsLiAgSWYKKwkgKiAgIHRoZSBjaGFubmVsIGxpc3QgaXMgY3VzdG9taXplZCwgb25seSBjb250YWlucyBvbmUgY2hhbm5lbCwgYW5kCisJICogICBpcyB0aGUgYWN0aXZlIGNoYW5uZWwsIHRoaXMgaXMgc2V0IHRydWUgYW5kIGRhdGEgZmxvdyBpcyBub3QgaGFsdGVkLgorCSAqLworCSpwc2NhbmN1cnJlbnRvbmx5ID0gMDsKKworCWlmIChwdXNlcnNjYW5pbikgeworCisJCS8qIFNldCB0aGUgYnNzIHR5cGUgc2NhbiBmaWx0ZXIsIHVzZSBhZGFwdGVyIHNldHRpbmcgaWYgdW5zZXQgKi8KKwkJcHNjYW5jZmdvdXQtPmJzc3R5cGUgPQorCQkgICAgKHB1c2Vyc2NhbmluLT5ic3N0eXBlID8gcHVzZXJzY2FuaW4tPmJzc3R5cGUgOiBhZGFwdGVyLT4KKwkJICAgICBzY2FubW9kZSk7CisKKwkJLyogU2V0IHRoZSBudW1iZXIgb2YgcHJvYmVzIHRvIHNlbmQsIHVzZSBhZGFwdGVyIHNldHRpbmcgaWYgdW5zZXQgKi8KKwkJbnVtcHJvYmVzID0gKHB1c2Vyc2NhbmluLT5udW1wcm9iZXMgPyBwdXNlcnNjYW5pbi0+bnVtcHJvYmVzIDoKKwkJCSAgICAgYWRhcHRlci0+c2NhbnByb2Jlcyk7CisKKwkJLyoKKwkJICogU2V0IHRoZSBCU1NJRCBmaWx0ZXIgdG8gdGhlIGluY29taW5nIGNvbmZpZ3VyYXRpb24sCisJCSAqICAgaWYgbm9uLXplcm8uICBJZiBub3Qgc2V0LCBpdCB3aWxsIHJlbWFpbiBkaXNhYmxlZCAoYWxsIHplcm9zKS4KKwkJICovCisJCW1lbWNweShwc2NhbmNmZ291dC0+c3BlY2lmaWNCU1NJRCwKKwkJICAgICAgIHB1c2Vyc2NhbmluLT5zcGVjaWZpY0JTU0lELAorCQkgICAgICAgc2l6ZW9mKHBzY2FuY2Znb3V0LT5zcGVjaWZpY0JTU0lEKSk7CisKKwkJc3NpZGxlbiA9IHN0cmxlbihwdXNlcnNjYW5pbi0+c3BlY2lmaWNTU0lEKTsKKworCQlpZiAoc3NpZGxlbikgeworCQkJcHNzaWR0bHYgPQorCQkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0ICopIHBzY2FuY2Znb3V0LT4KKwkJCSAgICB0bHZidWZmZXI7CisJCQlwc3NpZHRsdi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9TU0lEKTsKKwkJCXBzc2lkdGx2LT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoc3NpZGxlbik7CisJCQltZW1jcHkocHNzaWR0bHYtPnNzaWQsIHB1c2Vyc2NhbmluLT5zcGVjaWZpY1NTSUQsCisJCQkgICAgICAgc3NpZGxlbik7CisJCQlwdGx2cG9zICs9IHNpemVvZihwc3NpZHRsdi0+aGVhZGVyKSArIHNzaWRsZW47CisJCX0KKworCQkvKgorCQkgKiAgVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNoYW5uZWxzIHNlbnQgaW4gdGhlIGNvbW1hbmQgaXMgbG93IHRvCisJCSAqICAgIGVuc3VyZSB0aGUgcmVzcG9uc2UgYnVmZmVyIGZyb20gdGhlIGZpcm13YXJlIGRvZXMgbm90IHRydW5jYXRlCisJCSAqICAgIHNjYW4gcmVzdWx0cy4gIFRoYXQgaXMgbm90IGFuIGlzc3VlIHdpdGggYW4gU1NJRCBvciBCU1NJRAorCQkgKiAgICBmaWx0ZXIgYXBwbGllZCB0byB0aGUgc2NhbiByZXN1bHRzIGluIHRoZSBmaXJtd2FyZS4KKwkJICovCisJCWlmIChzc2lkbGVuIHx8IChtZW1jbXAocHNjYW5jZmdvdXQtPnNwZWNpZmljQlNTSUQsCisJCQkJICAgICAgICZ6ZXJvbWFjLCBzaXplb2YoemVyb21hYykpICE9IDApKSB7CisJCQkqcG1heGNoYW5wZXJzY2FuID0gTVJWRFJWX01BWF9DSEFOTkVMU19QRVJfU0NBTjsKKwkJCSpwZmlsdGVyZWRzY2FuID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXBzY2FuY2Znb3V0LT5ic3N0eXBlID0gYWRhcHRlci0+c2Nhbm1vZGU7CisJCW51bXByb2JlcyA9IGFkYXB0ZXItPnNjYW5wcm9iZXM7CisJfQorCisJLyogSWYgdGhlIGlucHV0IGNvbmZpZyBvciBhZGFwdGVyIGhhcyB0aGUgbnVtYmVyIG9mIFByb2JlcyBzZXQsIGFkZCB0bHYgKi8KKwlpZiAobnVtcHJvYmVzKSB7CisJCXBudW1wcm9iZXN0bHYgPSAoc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcyAqKSBwdGx2cG9zOworCQlwbnVtcHJvYmVzdGx2LT5oZWFkZXIudHlwZSA9CisJCSAgICBjcHVfdG9fbGUxNihUTFZfVFlQRV9OVU1QUk9CRVMpOworCQlwbnVtcHJvYmVzdGx2LT5oZWFkZXIubGVuID0gc2l6ZW9mKHBudW1wcm9iZXN0bHYtPm51bXByb2Jlcyk7CisJCXBudW1wcm9iZXN0bHYtPm51bXByb2JlcyA9IGNwdV90b19sZTE2KG51bXByb2Jlcyk7CisKKwkJcHRsdnBvcyArPQorCQkgICAgc2l6ZW9mKHBudW1wcm9iZXN0bHYtPmhlYWRlcikgKyBwbnVtcHJvYmVzdGx2LT5oZWFkZXIubGVuOworCisJCXBudW1wcm9iZXN0bHYtPmhlYWRlci5sZW4gPQorCQkgICAgY3B1X3RvX2xlMTYocG51bXByb2Jlc3Rsdi0+aGVhZGVyLmxlbik7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIG91dHB1dCBmb3IgdGhlIGNoYW5uZWwgVExWIHRvIHRoZSBhZGRyZXNzIGluIHRoZSB0bHYgYnVmZmVyCisJICogICBwYXN0IGFueSBUTFZzIHRoYXQgd2VyZSBhZGRlZCBpbiB0aGlzIGZ1Y3Rpb24gKFNTSUQsIG51bXByb2JlcykuCisJICogICBjaGFubmVsIFRMVnMgd2lsbCBiZSBhZGRlZCBwYXN0IHRoaXMgZm9yIGVhY2ggc2NhbiBjb21tYW5kLCBwcmVzZXJ2aW5nCisJICogICB0aGUgVExWcyB0aGF0IHdlcmUgcHJldmlvdXNseSBhZGRlZC4KKwkgKi8KKwkqcHBjaGFudGx2b3V0ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0ICopIHB0bHZwb3M7CisKKwlpZiAocHVzZXJzY2FuaW4gJiYgcHVzZXJzY2FuaW4tPmNoYW5saXN0WzBdLmNoYW5udW1iZXIpIHsKKworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW46IFVzaW5nIHN1cHBsaWVkIGNoYW5uZWwgbGlzdFxuIik7CisKKwkJZm9yIChjaGFuaWR4ID0gMDsKKwkJICAgICBjaGFuaWR4IDwgV0xBTl9JT0NUTF9VU0VSX1NDQU5fQ0hBTl9NQVgKKwkJICAgICAmJiBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlcjsgY2hhbmlkeCsrKSB7CisKKwkJCWNoYW5uZWwgPSBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlcjsKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPmNoYW5udW1iZXIgPSBjaGFubmVsOworCisJCQlyYWRpb3R5cGUgPSBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0ucmFkaW90eXBlOworCQkJKHBzY2FuY2hhbmxpc3QgKyBjaGFuaWR4KS0+cmFkaW90eXBlID0gcmFkaW90eXBlOworCisJCQlzY2FudHlwZSA9IHB1c2Vyc2NhbmluLT5jaGFubGlzdFtjaGFuaWR4XS5zY2FudHlwZTsKKworCQkJaWYgKHNjYW50eXBlID09IGNtZF9zY2FuX3R5cGVfcGFzc2l2ZSkgeworCQkJCShwc2NhbmNoYW5saXN0ICsKKwkJCQkgY2hhbmlkeCktPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDE7CisJCQl9IGVsc2UgeworCQkJCShwc2NhbmNoYW5saXN0ICsKKwkJCQkgY2hhbmlkeCktPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDA7CisJCQl9CisKKwkJCWlmIChwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uc2NhbnRpbWUpIHsKKwkJCQlzY2FuZHVyID0KKwkJCQkgICAgcHVzZXJzY2FuaW4tPmNoYW5saXN0W2NoYW5pZHhdLnNjYW50aW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2NhbnR5cGUgPT0gY21kX3NjYW5fdHlwZV9wYXNzaXZlKSB7CisJCQkJCXNjYW5kdXIgPSBNUlZEUlZfUEFTU0lWRV9TQ0FOX0NIQU5fVElNRTsKKwkJCQl9IGVsc2UgeworCQkJCQlzY2FuZHVyID0gTVJWRFJWX0FDVElWRV9TQ0FOX0NIQU5fVElNRTsKKwkJCQl9CisJCQl9CisKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPm1pbnNjYW50aW1lID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2FuZHVyKTsKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPm1heHNjYW50aW1lID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2FuZHVyKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHdlIGFyZSBvbmx5IHNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KKwkJaWYgKChjaGFuaWR4ID09IDEpICYmIChwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbMF0uY2hhbm51bWJlcgorCQkJCSAgICAgICA9PQorCQkJCSAgICAgICBwcml2LT5hZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbCkpIHsKKwkJCSpwc2NhbmN1cnJlbnRvbmx5ID0gMTsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU2NhbjogU2Nhbm5pbmcgY3VycmVudCBjaGFubmVsIG9ubHkiKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBDcmVhdGluZyBmdWxsIHJlZ2lvbiBjaGFubmVsIGxpc3RcbiIpOworCQl3bGFuX3NjYW5fY3JlYXRlX2NoYW5uZWxfbGlzdChwcml2LCBwc2NhbmNoYW5saXN0LAorCQkJCQkgICAgICAqcGZpbHRlcmVkc2Nhbik7CisJfQorCitvdXQ6CisJcmV0dXJuIHBzY2FuY2Znb3V0OworfQorCisvKioKKyAqICBAYnJpZWYgQ29uc3RydWN0IGFuZCBzZW5kIG11bHRpcGxlIHNjYW4gY29uZmlnIGNvbW1hbmRzIHRvIHRoZSBmaXJtd2FyZQorICoKKyAqICBQcmV2aW91cyByb3V0aW5lcyBoYXZlIGNyZWF0ZWQgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyB3aXRoIGFueSByZXF1ZXN0ZWQKKyAqICAgVExWcy4gIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSBjaGFubmVsIFRMViBpbnRvIG1heGNoYW5wZXJzY2FuIGxpc3RzCisgKiAgIGFuZCBzZW5kcyB0aGUgcG9ydGlvbiBvZiB0aGUgY2hhbm5lbCBUTFYgYWxvbmcgd2l0aCB0aGUgb3RoZXIgVExWcworICogICB0byB0aGUgd2xhbl9jbWQgcm91dGluZXMgZm9yIGV4ZWN1dGlvbiBpbiB0aGUgZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gbWF4Y2hhbnBlcnNjYW4gIE1heGltdW0gbnVtYmVyIGNoYW5uZWxzIHRvIGJlIGluY2x1ZGVkIGluIGVhY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKiAgQHBhcmFtIGZpbHRlcmVkc2NhbiAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYSBCU1NJRCBvciBTU0lECisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgaXMgYmVpbmcgdXNlZCBmb3IgdGhlIGZpcm13YXJlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKiAgQHBhcmFtIHBzY2FuY2Znb3V0ICAgICBTY2FuIGNvbmZpZ3VyYXRpb24gdXNlZCBmb3IgdGhpcyBzY2FuLgorICogIEBwYXJhbSBwY2hhbnRsdm91dCAgICAgUG9pbnRlciBpbiB0aGUgcHNjYW5jZmdvdXQgd2hlcmUgdGhlIGNoYW5uZWwgVExWCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgc3RhcnQuICBUaGlzIGlzIHBhc3QgYW55IG90aGVyIFRMVnMgdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzZW50IGRvd24gaW4gZWFjaCBmaXJtd2FyZSBjb21tYW5kLgorICogIEBwYXJhbSBwc2NhbmNoYW5saXN0ICAgTGlzdCBvZiBjaGFubmVscyB0byBzY2FuIGluIG1heGNoYW5wZXJzY2FuIHNlZ21lbnRzCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvciBlcnJvciByZXR1cm4gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zY2FuX2NoYW5uZWxfbGlzdCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgaW50IG1heGNoYW5wZXJzY2FuLAorCQkJCSAgdTggZmlsdGVyZWRzY2FuLAorCQkJCSAgc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICogcHNjYW5jZmdvdXQsCisJCQkJICBzdHJ1Y3QgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldCAqIHBjaGFudGx2b3V0LAorCQkJCSAgc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKiBwc2NhbmNoYW5saXN0KQoreworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICpwdG1wY2hhbjsKKwlzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqcHN0YXJ0Y2hhbjsKKwl1OCBzY2FuYmFuZDsKKwlpbnQgZG9uZWVhcmx5OworCWludCB0bHZpZHg7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKHBzY2FuY2Znb3V0ID09IDAgfHwgcGNoYW50bHZvdXQgPT0gMCB8fCBwc2NhbmNoYW5saXN0ID09IDApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBOdWxsIGRldGVjdDogJXAsICVwLCAlcFxuIiwKKwkJICAgICAgIHBzY2FuY2Znb3V0LCBwY2hhbnRsdm91dCwgcHNjYW5jaGFubGlzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwY2hhbnRsdm91dC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9DSEFOTElTVCk7CisKKwkvKiBTZXQgdGhlIHRlbXAgY2hhbm5lbCBzdHJ1Y3QgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGRlc2lyZWQgbGlzdCAqLworCXB0bXBjaGFuID0gcHNjYW5jaGFubGlzdDsKKworCS8qIExvb3AgdGhyb3VnaCB0aGUgZGVzaXJlZCBjaGFubmVsIGxpc3QsIHNlbmRpbmcgYSBuZXcgZmlybXdhcmUgc2NhbgorCSAqICAgY29tbWFuZHMgZm9yIGVhY2ggbWF4Y2hhbnBlcnNjYW4gY2hhbm5lbHMgKG9yIGZvciAxLDYsMTEgaW5kaXZpZHVhbGx5CisJICogICBpZiBjb25maWd1cmVkIGFjY29yZGluZ2x5KQorCSAqLworCXdoaWxlIChwdG1wY2hhbi0+Y2hhbm51bWJlcikgeworCisJCXRsdmlkeCA9IDA7CisJCXBjaGFudGx2b3V0LT5oZWFkZXIubGVuID0gMDsKKwkJc2NhbmJhbmQgPSBwdG1wY2hhbi0+cmFkaW90eXBlOworCQlwc3RhcnRjaGFuID0gcHRtcGNoYW47CisJCWRvbmVlYXJseSA9IDA7CisKKwkJLyogQ29uc3RydWN0IHRoZSBjaGFubmVsIFRMViBmb3IgdGhlIHNjYW4gY29tbWFuZC4gIENvbnRpbnVlIHRvCisJCSAqICBpbnNlcnQgY2hhbm5lbCBUTFZzIHVudGlsOgorCQkgKiAgICAtIHRoZSB0bHZpZHggaGl0cyB0aGUgbWF4aW11bSBjb25maWd1cmVkIHBlciBzY2FuIGNvbW1hbmQKKwkJICogICAgLSB0aGUgbmV4dCBjaGFubmVsIHRvIGluc2VydCBpcyAwIChlbmQgb2YgZGVzaXJlZCBjaGFubmVsIGxpc3QpCisJCSAqICAgIC0gZG9uZWVhcmx5IGlzIHNldCAoY29udHJvbGxpbmcgaW5kaXZpZHVhbCBzY2FubmluZyBvZiAxLDYsMTEpCisJCSAqLworCQl3aGlsZSAodGx2aWR4IDwgbWF4Y2hhbnBlcnNjYW4gJiYgcHRtcGNoYW4tPmNoYW5udW1iZXIKKwkJICAgICAgICYmICFkb25lZWFybHkpIHsKKworICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisgICAgICAgICAgICAgICAgICAgICJTY2FuOiBDaGFuKCUzZCksIFJhZGlvKCVkKSwgbW9kZSglZCwlZCksIER1ciglZClcbiIsCisgICAgICAgICAgICAgICAgcHRtcGNoYW4tPmNoYW5udW1iZXIsIHB0bXBjaGFuLT5yYWRpb3R5cGUsCisgICAgICAgICAgICAgICAgcHRtcGNoYW4tPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiwKKyAgICAgICAgICAgICAgICBwdG1wY2hhbi0+Y2hhbnNjYW5tb2RlLmRpc2FibGVjaGFuZmlsdCwKKyAgICAgICAgICAgICAgICBwdG1wY2hhbi0+bWF4c2NhbnRpbWUpOworCisJCQkvKiBDb3B5IHRoZSBjdXJyZW50IGNoYW5uZWwgVExWIHRvIHRoZSBjb21tYW5kIGJlaW5nIHByZXBhcmVkICovCisJCQltZW1jcHkocGNoYW50bHZvdXQtPmNoYW5zY2FucGFyYW0gKyB0bHZpZHgsCisJCQkgICAgICAgcHRtcGNoYW4sIHNpemVvZihwY2hhbnRsdm91dC0+Y2hhbnNjYW5wYXJhbSkpOworCisJCQkvKiBJbmNyZW1lbnQgdGhlIFRMViBoZWFkZXIgbGVuZ3RoIGJ5IHRoZSBzaXplIGFwcGVuZGVkICovCisJCQlwY2hhbnRsdm91dC0+aGVhZGVyLmxlbiArPQorCQkJICAgIHNpemVvZihwY2hhbnRsdm91dC0+Y2hhbnNjYW5wYXJhbSk7CisKKwkJCS8qCisJCQkgKiAgVGhlIHRsdiBidWZmZXIgbGVuZ3RoIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZQorCQkJICogICAgYmV0d2VlbiB0aGUgY2hhbm5lbCB0bHYgcG9pbnRlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZQorCQkJICogICAgdGx2IGJ1ZmZlci4gIFRoaXMgY29tcGVuc2F0ZXMgZm9yIGFueSBUTFZzIHRoYXQgd2VyZSBhcHBlbmRlZAorCQkJICogICAgYmVmb3JlIHRoZSBjaGFubmVsIGxpc3QuCisJCQkgKi8KKwkJCXBzY2FuY2Znb3V0LT50bHZidWZmZXJsZW4gPSAoKHU4ICopIHBjaGFudGx2b3V0CisJCQkJCQkgICAgIC0gcHNjYW5jZmdvdXQtPnRsdmJ1ZmZlcik7CisKKwkJCS8qICBBZGQgdGhlIHNpemUgb2YgdGhlIGNoYW5uZWwgdGx2IGhlYWRlciBhbmQgdGhlIGRhdGEgbGVuZ3RoICovCisJCQlwc2NhbmNmZ291dC0+dGx2YnVmZmVybGVuICs9CisJCQkgICAgKHNpemVvZihwY2hhbnRsdm91dC0+aGVhZGVyKQorCQkJICAgICArIHBjaGFudGx2b3V0LT5oZWFkZXIubGVuKTsKKworCQkJLyogSW5jcmVtZW50IHRoZSBpbmRleCB0byB0aGUgY2hhbm5lbCB0bHYgd2UgYXJlIGNvbnN0cnVjdGluZyAqLworCQkJdGx2aWR4Kys7CisKKwkJCWRvbmVlYXJseSA9IDA7CisKKwkJCS8qIFN0b3AgdGhlIGxvb3AgaWYgdGhlICpjdXJyZW50KiBjaGFubmVsIGlzIGluIHRoZSAxLDYsMTEgc2V0CisJCQkgKiAgIGFuZCB3ZSBhcmUgbm90IGZpbHRlcmluZyBvbiBhIEJTU0lEIG9yIFNTSUQuCisJCQkgKi8KKwkJCWlmICghZmlsdGVyZWRzY2FuICYmIChwdG1wY2hhbi0+Y2hhbm51bWJlciA9PSAxCisJCQkJCSAgICAgIHx8IHB0bXBjaGFuLT5jaGFubnVtYmVyID09IDYKKwkJCQkJICAgICAgfHwgcHRtcGNoYW4tPmNoYW5udW1iZXIgPT0gMTEpKSB7CisJCQkJZG9uZWVhcmx5ID0gMTsKKwkJCX0KKworCQkJLyogSW5jcmVtZW50IHRoZSB0bXAgcG9pbnRlciB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KKwkJCXB0bXBjaGFuKys7CisKKwkJCS8qIFN0b3AgdGhlIGxvb3AgaWYgdGhlICpuZXh0KiBjaGFubmVsIGlzIGluIHRoZSAxLDYsMTEgc2V0LgorCQkJICogIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBiZSB0aGUgb25seSBjaGFubmVsIHNjYW5uZWQgb24gdGhlIG5leHQKKwkJCSAqICBpbnRlcmF0aW9uCisJCQkgKi8KKwkJCWlmICghZmlsdGVyZWRzY2FuICYmIChwdG1wY2hhbi0+Y2hhbm51bWJlciA9PSAxCisJCQkJCSAgICAgIHx8IHB0bXBjaGFuLT5jaGFubnVtYmVyID09IDYKKwkJCQkJICAgICAgfHwgcHRtcGNoYW4tPmNoYW5udW1iZXIgPT0gMTEpKSB7CisJCQkJZG9uZWVhcmx5ID0gMTsKKwkJCX0KKwkJfQorCisJCS8qIFNlbmQgdGhlIHNjYW4gY29tbWFuZCB0byB0aGUgZmlybXdhcmUgd2l0aCB0aGUgc3BlY2lmaWVkIGNmZyAqLworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zY2FuLCAwLAorCQkJCQkgICAgMCwgMCwgcHNjYW5jZmdvdXQpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gc3RhcnQgYSBzY2FuIGJhc2VkIG9uIGFuIGlucHV0IGNvbmZpZworICoKKyAqICBVc2UgdGhlIGlucHV0IHVzZXIgc2NhbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gcHJvdmlkZWQgaW4KKyAqICAgIG9yZGVyIHRvIHNlbmQgdGhlIGFwcHJvcHJpYXRlIHNjYW4gY29tbWFuZHMgdG8gZmlybXdhcmUgdG8gcG9wdWxhdGUgb3IKKyAqICAgIHVwZGF0ZSB0aGUgaW50ZXJuYWwgZHJpdmVyIHNjYW4gdGFibGUKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHVzZXJzY2FuaW4gICBQb2ludGVyIHRvIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAgMCBvciA8IDAgaWYgZXJyb3IKKyAqLworaW50IHdsYW5fc2Nhbl9uZXR3b3Jrcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqIHB1c2Vyc2NhbmluKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IG1ydmxpZXR5cGVzX2NoYW5saXN0cGFyYW1zZXQgKnBjaGFudGx2b3V0OworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICogc2Nhbl9jaGFuX2xpc3QgPSBOVUxMOworCXN0cnVjdCB3bGFuX3NjYW5fY21kX2NvbmZpZyAqIHNjYW5fY2ZnID0gTlVMTDsKKwl1OCBrZWVwcHJldmlvdXNzY2FuOworCXU4IGZpbHRlcmVkc2NhbjsKKwl1OCBzY2FuY3VycmVudGNoYW5vbmx5OworCWludCBtYXhjaGFucGVyc2NhbjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXNjYW5fY2hhbl9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5zY2FucGFyYW1zZXQpICoKKwkJCQlXTEFOX0lPQ1RMX1VTRVJfU0NBTl9DSEFOX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjYW5fY2hhbl9saXN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc2Nhbl9jZmcgPSB3bGFuX3NjYW5fc2V0dXBfc2Nhbl9jb25maWcocHJpdiwKKwkJCQkJICAgICAgIHB1c2Vyc2NhbmluLAorCQkJCQkgICAgICAgJnBjaGFudGx2b3V0LAorCQkJCQkgICAgICAgc2Nhbl9jaGFuX2xpc3QsCisJCQkJCSAgICAgICAmbWF4Y2hhbnBlcnNjYW4sCisJCQkJCSAgICAgICAmZmlsdGVyZWRzY2FuLAorCQkJCQkgICAgICAgJnNjYW5jdXJyZW50Y2hhbm9ubHkpOworCWlmIChzY2FuX2NmZyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWtlZXBwcmV2aW91c3NjYW4gPSAwOworCisJaWYgKHB1c2Vyc2NhbmluKSB7CisJCWtlZXBwcmV2aW91c3NjYW4gPSBwdXNlcnNjYW5pbi0+a2VlcHByZXZpb3Vzc2NhbjsKKwl9CisKKwlpZiAoIWtlZXBwcmV2aW91c3NjYW4pIHsKKwkJbWVtc2V0KGFkYXB0ZXItPnNjYW50YWJsZSwgMHgwMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IpICogTVJWRFJWX01BWF9CU1NJRF9MSVNUKTsKKwkJYWRhcHRlci0+bnVtaW5zY2FudGFibGUgPSAwOworCX0KKworCS8qIEtlZXAgdGhlIGRhdGEgcGF0aCBhY3RpdmUgaWYgd2UgYXJlIG9ubHkgc2Nhbm5pbmcgb3VyIGN1cnJlbnQgY2hhbm5lbCAqLworCWlmICghc2NhbmN1cnJlbnRjaGFub25seSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJfQorCisJcmV0ID0gd2xhbl9zY2FuX2NoYW5uZWxfbGlzdChwcml2LAorCQkJCSAgICAgbWF4Y2hhbnBlcnNjYW4sCisJCQkJICAgICBmaWx0ZXJlZHNjYW4sCisJCQkJICAgICBzY2FuX2NmZywKKwkJCQkgICAgIHBjaGFudGx2b3V0LAorCQkJCSAgICAgc2Nhbl9jaGFuX2xpc3QpOworCisJLyogIFByb2Nlc3MgdGhlIHJlc3VsdGluZyBzY2FuIHRhYmxlOgorCSAqICAgIC0gUmVtb3ZlIGFueSBiYWQgc3NpZHMKKwkgKiAgICAtIFVwZGF0ZSBvdXIgY3VycmVudCBCU1MgaW5mb3JtYXRpb24gZnJvbSBzY2FuIGRhdGEKKwkgKi8KKwl3bGFuX3NjYW5fcHJvY2Vzc19yZXN1bHRzKHByaXYpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwl9CisKK291dDoKKwlpZiAoc2Nhbl9jZmcpCisJCWtmcmVlKHNjYW5fY2ZnKTsKKworCWlmIChzY2FuX2NoYW5fbGlzdCkKKwkJa2ZyZWUoc2Nhbl9jaGFuX2xpc3QpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgSW5zcGVjdCB0aGUgc2NhbiByZXNwb25zZSBidWZmZXIgZm9yIHBvaW50ZXJzIHRvIGV4cGVjdGVkIFRMVnMKKyAqCisgKiAgVExWcyBjYW4gYmUgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiByZXNwb25zZSBCU1MgaW5mb3JtYXRpb24uCisgKiAgICBQYXJzZSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyIGZvciBwb2ludGVycyB0byBUTFZzIHRoYXQgY2FuIHBvdGVudGlhbGx5CisgKiAgICBiZSBwYXNzZWQgYmFjayBpbiB0aGUgcmVzcG9uc2UKKyAqCisgKiAgQHBhcmFtIHB0bHYgICAgICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBUTFYgYnVmZmVyIHRvIHBhcnNlCisgKiAgQHBhcmFtIHRsdmJ1ZnNpemUgIHNpemUgb2YgdGhlIFRMViBidWZmZXIKKyAqICBAcGFyYW0gcHRzZnRsdiAgICAgT3V0cHV0IHBhcmFtZXRlcjogUG9pbnRlciB0byB0aGUgVFNGIFRMViBpZiBmb3VuZAorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgdm9pZAorICovCitzdGF0aWMKK3ZvaWQgd2xhbl9yZXRfODAyXzExX3NjYW5fZ2V0X3Rsdl9wdHJzKHN0cnVjdCBtcnZsaWV0eXBlc19kYXRhICogcHRsdiwKKwkJCQkgICAgICAgaW50IHRsdmJ1ZnNpemUsCisJCQkJICAgICAgIHN0cnVjdCBtcnZsaWV0eXBlc190c2Z0aW1lc3RhbXAgKiogcHRzZnRsdikKK3sKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfZGF0YSAqcGN1cnJlbnR0bHY7CisJaW50IHRsdmJ1ZmxlZnQ7CisJdTE2IHRsdnR5cGU7CisJdTE2IHRsdmxlbjsKKworCXBjdXJyZW50dGx2ID0gcHRsdjsKKwl0bHZidWZsZWZ0ID0gdGx2YnVmc2l6ZTsKKwkqcHRzZnRsdiA9IE5VTEw7CisKKwlsYnNfcHJfZGVidWcoMSwgIlNDQU5fUkVTUDogdGx2YnVmc2l6ZSA9ICVkXG4iLCB0bHZidWZzaXplKTsKKwlsYnNfZGJnX2hleCgiU0NBTl9SRVNQOiBUTFYgQnVmIiwgKHU4ICopIHB0bHYsIHRsdmJ1ZnNpemUpOworCisJd2hpbGUgKHRsdmJ1ZmxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlcikpIHsKKwkJdGx2dHlwZSA9IGxlMTZfdG9fY3B1KHBjdXJyZW50dGx2LT5oZWFkZXIudHlwZSk7CisJCXRsdmxlbiA9IGxlMTZfdG9fY3B1KHBjdXJyZW50dGx2LT5oZWFkZXIubGVuKTsKKworCQlzd2l0Y2ggKHRsdnR5cGUpIHsKKwkJY2FzZSBUTFZfVFlQRV9UU0ZUSU1FU1RBTVA6CisJCQkqcHRzZnRsdiA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfdHNmdGltZXN0YW1wICopIHBjdXJyZW50dGx2OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBVbmhhbmRsZWQgVExWID0gJWRcbiIsCisJCQkgICAgICAgdGx2dHlwZSk7CisJCQkvKiBHaXZlIHVwLCB0aGlzIHNlZW1zIGNvcnJ1cHRlZCAqLworCQkJcmV0dXJuOworCQl9CQkvKiBzd2l0Y2ggKi8KKworCQl0bHZidWZsZWZ0IC09IChzaXplb2YocHRsdi0+aGVhZGVyKSArIHRsdmxlbik7CisJCXBjdXJyZW50dGx2ID0KKwkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfZGF0YSAqKSAocGN1cnJlbnR0bHYtPkRhdGEgKyB0bHZsZW4pOworCX0JCQkvKiB3aGlsZSAqLworfQorCisvKioKKyAqICBAYnJpZWYgSW50ZXJwcmV0IGEgQlNTIHNjYW4gcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSB0aGUgZmlybXdhcmUKKyAqCisgKiAgUGFyc2UgdGhlIHZhcmlvdXMgZml4ZWQgZmllbGRzIGFuZCBJRXMgcGFzc2VkIGJhY2sgZm9yIGEgYSBCU1MgcHJvYmUKKyAqICAgcmVzcG9uc2Ugb3IgYmVhY29uIGZyb20gdGhlIHNjYW4gY29tbWFuZC4gIFJlY29yZCBpbmZvcm1hdGlvbiBhcyBuZWVkZWQKKyAqICAgaW4gdGhlIHNjYW4gdGFibGUgc3RydWN0IGJzc19kZXNjcmlwdG9yIGZvciB0aGF0IGVudHJ5LgorICoKKyAqICBAcGFyYW0gcEJTU0lERW50cnkgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIEJTUyBFbnRyeQorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCBJbnRlcnByZXRCU1NEZXNjcmlwdGlvbldpdGhJRShzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKiBwQlNTRW50cnksCisJCQkJCSB1OCAqKiBwYmVhY29uaW5mbywgaW50ICpieXRlc2xlZnQpCit7CisJZW51bSBpZWVldHlwZXNfZWxlbWVudGlkIGVsZW1JRDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2ZocGFyYW1zZXQgKnBGSDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2RzcGFyYW1zZXQgKnBEUzsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQgKnBDRjsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCAqcGlic3M7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvICpwY2FwOworCXN0cnVjdCBXTEFOXzgwMl8xMV9GSVhFRF9JRXMgZml4ZWRpZTsKKwl1OCAqcGN1cnJlbnRwdHI7CisJdTggKnBSYXRlOworCXU4IGVsZW1sZW47CisJdTggYnl0ZXN0b2NvcHk7CisJdTggcmF0ZXNpemU7CisJdTE2IGJlYWNvbnNpemU7CisJdTggZm91bmRkYXRhcmF0ZWllOworCWludCBieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uOworCisJc3RydWN0IFdQQV9TVVBQTElDQU5UICpwd3BhX3N1cHBsaWNhbnQ7CisJc3RydWN0IFdQQV9TVVBQTElDQU5UICpwd3BhMl9zdXBwbGljYW50OworCXN0cnVjdCBJRV9XUEEgKnBJZTsKKwljb25zdCB1OCBvdWkwMVs0XSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSB9OworCisJc3RydWN0IGllZWV0eXBlc19jb3VudHJ5aW5mb3NldCAqcGNvdW50cnlpbmZvOworCisJRU5URVIoKTsKKworCWZvdW5kZGF0YXJhdGVpZSA9IDA7CisJcmF0ZXNpemUgPSAwOworCWJlYWNvbnNpemUgPSAwOworCisJaWYgKCpieXRlc2xlZnQgPj0gc2l6ZW9mKGJlYWNvbnNpemUpKSB7CisJCS8qIEV4dHJhY3QgJiBjb252ZXJ0IGJlYWNvbiBzaXplIGZyb20gdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCW1lbWNweSgmYmVhY29uc2l6ZSwgKnBiZWFjb25pbmZvLCBzaXplb2YoYmVhY29uc2l6ZSkpOworCQliZWFjb25zaXplID0gbGUxNl90b19jcHUoYmVhY29uc2l6ZSk7CisJCSpieXRlc2xlZnQgLT0gc2l6ZW9mKGJlYWNvbnNpemUpOworCQkqcGJlYWNvbmluZm8gKz0gc2l6ZW9mKGJlYWNvbnNpemUpOworCX0KKworCWlmIChiZWFjb25zaXplID09IDAgfHwgYmVhY29uc2l6ZSA+ICpieXRlc2xlZnQpIHsKKworCQkqcGJlYWNvbmluZm8gKz0gKmJ5dGVzbGVmdDsKKwkJKmJ5dGVzbGVmdCA9IDA7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgd29ya2luZyBiZWFjb24gcG9pbnRlciBmb3IgdGhpcyBCU1MgaXRlcmF0aW9uICovCisJcGN1cnJlbnRwdHIgPSAqcGJlYWNvbmluZm87CisKKwkvKiBBZHZhbmNlIHRoZSByZXR1cm4gYmVhY29uIHBvaW50ZXIgcGFzdCB0aGUgY3VycmVudCBiZWFjb24gKi8KKwkqcGJlYWNvbmluZm8gKz0gYmVhY29uc2l6ZTsKKwkqYnl0ZXNsZWZ0IC09IGJlYWNvbnNpemU7CisKKwlieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uID0gYmVhY29uc2l6ZTsKKworCXB3cGFfc3VwcGxpY2FudCA9ICZwQlNTRW50cnktPndwYV9zdXBwbGljYW50OworCXB3cGEyX3N1cHBsaWNhbnQgPSAmcEJTU0VudHJ5LT53cGEyX3N1cHBsaWNhbnQ7CisKKwltZW1jcHkocEJTU0VudHJ5LT5tYWNhZGRyZXNzLCBwY3VycmVudHB0ciwgRVRIX0FMRU4pOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IEFQIE1BQyBBZGRyLSV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCSAgICAgICBwQlNTRW50cnktPm1hY2FkZHJlc3NbMF0sIHBCU1NFbnRyeS0+bWFjYWRkcmVzc1sxXSwKKwkgICAgICAgcEJTU0VudHJ5LT5tYWNhZGRyZXNzWzJdLCBwQlNTRW50cnktPm1hY2FkZHJlc3NbM10sCisJICAgICAgIHBCU1NFbnRyeS0+bWFjYWRkcmVzc1s0XSwgcEJTU0VudHJ5LT5tYWNhZGRyZXNzWzVdKTsKKworCXBjdXJyZW50cHRyICs9IEVUSF9BTEVOOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gRVRIX0FMRU47CisKKwlpZiAoYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA8IDEyKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IE5vdCBlbm91Z2ggYnl0ZXMgbGVmdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIG5leHQgNCBmaWVsZHMgYXJlIFJTU0ksIHRpbWUgc3RhbXAsIGJlYWNvbiBpbnRlcnZhbCwKKwkgKiAgIGFuZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uCisJICovCisKKwkvKiBSU1NJIGlzIDEgYnl0ZSBsb25nICovCisJcEJTU0VudHJ5LT5yc3NpID0gbGUzMl90b19jcHUoKGxvbmcpKCpwY3VycmVudHB0cikpOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IFJTU0k9JTAyWFxuIiwgKnBjdXJyZW50cHRyKTsKKwlwY3VycmVudHB0ciArPSAxOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMTsKKworCS8qIHRpbWUgc3RhbXAgaXMgOCBieXRlcyBsb25nICovCisJbWVtY3B5KGZpeGVkaWUudGltZXN0YW1wLCBwY3VycmVudHB0ciwgOCk7CisJbWVtY3B5KHBCU1NFbnRyeS0+dGltZXN0YW1wLCBwY3VycmVudHB0ciwgOCk7CisJcGN1cnJlbnRwdHIgKz0gODsKKwlieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uIC09IDg7CisKKwkvKiBiZWFjb24gaW50ZXJ2YWwgaXMgMiBieXRlcyBsb25nICovCisJbWVtY3B5KCZmaXhlZGllLmJlYWNvbmludGVydmFsLCBwY3VycmVudHB0ciwgMik7CisJcEJTU0VudHJ5LT5iZWFjb25wZXJpb2QgPSBsZTE2X3RvX2NwdShmaXhlZGllLmJlYWNvbmludGVydmFsKTsKKwlwY3VycmVudHB0ciArPSAyOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMjsKKworCS8qIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gaXMgMiBieXRlcyBsb25nICovCisJbWVtY3B5KCZmaXhlZGllLmNhcGFiaWxpdGllcywgcGN1cnJlbnRwdHIsIDIpOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IGZpeGVkaWUuY2FwYWJpbGl0aWVzPTB4JVhcbiIsCisJICAgICAgIGZpeGVkaWUuY2FwYWJpbGl0aWVzKTsKKwlmaXhlZGllLmNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGZpeGVkaWUuY2FwYWJpbGl0aWVzKTsKKwlwY2FwID0gKHN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyAqKSAmIGZpeGVkaWUuY2FwYWJpbGl0aWVzOworCW1lbWNweSgmcEJTU0VudHJ5LT5jYXAsIHBjYXAsIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8pKTsKKwlwY3VycmVudHB0ciArPSAyOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMjsKKworCS8qIHJlc3Qgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGFyZSBJRSdzICovCisJbGJzX3ByX2RlYnVnKDEsICJJbnRlcnByZXRJRTogSUVsZW5ndGggZm9yIHRoaXMgQVAgPSAlZFxuIiwKKwkgICAgICAgYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbik7CisKKwlsYnNfZGJnX2hleCgiSW50ZXJwcmV0SUU6IElFIGluZm8iLCAodTggKikgcGN1cnJlbnRwdHIsCisJCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24pOworCisJaWYgKHBjYXAtPnByaXZhY3kpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnRlcnByZXRJRTogQVAgV0VQIGVuYWJsZWRcbiIpOworCQlwQlNTRW50cnktPnByaXZhY3kgPSB3bGFuODAyXzExcHJpdmZpbHRlcjgwMjF4V0VQOworCX0gZWxzZSB7CisJCXBCU1NFbnRyeS0+cHJpdmFjeSA9IHdsYW44MDJfMTFwcml2ZmlsdGVyYWNjZXB0YWxsOworCX0KKworCWlmIChwY2FwLT5pYnNzID09IDEpIHsKKwkJcEJTU0VudHJ5LT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaWJzczsKKwl9IGVsc2UgeworCQlwQlNTRW50cnktPmluZnJhbW9kZSA9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZTsKKwl9CisKKwkvKiBwcm9jZXNzIHZhcmlhYmxlIElFICovCisJd2hpbGUgKGJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gPj0gMikgeworCQllbGVtSUQgPSAoZW51bSBpZWVldHlwZXNfZWxlbWVudGlkKSAoKigodTggKikgcGN1cnJlbnRwdHIpKTsKKwkJZWxlbWxlbiA9ICooKHU4ICopIHBjdXJyZW50cHRyICsgMSk7CisKKwkJaWYgKGJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gPCBlbGVtbGVuKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiBlcnJvciBpbiBwcm9jZXNzaW5nIElFLCAiCisJCQkgICAgICAgImJ5dGVzIGxlZnQgPCBJRSBsZW5ndGhcbiIpOworCQkJYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoZWxlbUlEKSB7CisKKwkJY2FzZSBTU0lEOgorCQkJcEJTU0VudHJ5LT5zc2lkLnNzaWRsZW5ndGggPSBlbGVtbGVuOworCQkJbWVtY3B5KHBCU1NFbnRyeS0+c3NpZC5zc2lkLCAocGN1cnJlbnRwdHIgKyAyKSwKKwkJCSAgICAgICBlbGVtbGVuKTsKKwkJCWxic19wcl9kZWJ1ZygxLCAic3NpZDogJTMycyIsIHBCU1NFbnRyeS0+c3NpZC5zc2lkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1VQUE9SVEVEX1JBVEVTOgorCQkJbWVtY3B5KHBCU1NFbnRyeS0+ZGF0YXJhdGVzLCAocGN1cnJlbnRwdHIgKyAyKSwKKwkJCSAgICAgICBlbGVtbGVuKTsKKwkJCW1lbW1vdmUocEJTU0VudHJ5LT5saWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMsIChwY3VycmVudHB0ciArIDIpLAorCQkJCWVsZW1sZW4pOworCQkJcmF0ZXNpemUgPSBlbGVtbGVuOworCQkJZm91bmRkYXRhcmF0ZWllID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhUUkFfSUU6CisJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiBFWFRSQV9JRSBGb3VuZCFcbiIpOworCQkJcEJTU0VudHJ5LT5leHRyYV9pZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEZIX1BBUkFNX1NFVDoKKwkJCXBGSCA9IChzdHJ1Y3QgaWVlZXR5cGVzX2ZocGFyYW1zZXQgKikgcGN1cnJlbnRwdHI7CisJCQltZW1tb3ZlKCZwQlNTRW50cnktPnBoeXBhcmFtc2V0LmZocGFyYW1zZXQsIHBGSCwKKwkJCQlzaXplb2Yoc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0KSk7CisJCQlwQlNTRW50cnktPnBoeXBhcmFtc2V0LmZocGFyYW1zZXQuZHdlbGx0aW1lCisJCQkgICAgPQorCQkJICAgIGxlMTZfdG9fY3B1KHBCU1NFbnRyeS0+cGh5cGFyYW1zZXQuZmhwYXJhbXNldC4KKwkJCQkJICAgICBkd2VsbHRpbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU19QQVJBTV9TRVQ6CisJCQlwRFMgPSAoc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0ICopIHBjdXJyZW50cHRyOworCisJCQlwQlNTRW50cnktPmNoYW5uZWwgPSBwRFMtPmN1cnJlbnRjaGFuOworCisJCQltZW1jcHkoJnBCU1NFbnRyeS0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldCwgcERTLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2RzcGFyYW1zZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0ZfUEFSQU1fU0VUOgorCQkJcENGID0gKHN0cnVjdCBpZWVldHlwZXNfY2ZwYXJhbXNldCAqKSBwY3VycmVudHB0cjsKKworCQkJbWVtY3B5KCZwQlNTRW50cnktPnNzcGFyYW1zZXQuY2ZwYXJhbXNldCwgcENGLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUJTU19QQVJBTV9TRVQ6CisJCQlwaWJzcyA9IChzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCAqKSBwY3VycmVudHB0cjsKKwkJCXBCU1NFbnRyeS0+YXRpbXdpbmRvdyA9CisJCQkgICAgbGUzMl90b19jcHUocGlic3MtPmF0aW13aW5kb3cpOworCisJCQltZW1tb3ZlKCZwQlNTRW50cnktPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LCBwaWJzcywKKwkJCQlzaXplb2Yoc3RydWN0IGllZWV0eXBlc19pYnNzcGFyYW1zZXQpKTsKKworCQkJcEJTU0VudHJ5LT5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5hdGltd2luZG93CisJCQkgICAgPQorCQkJICAgIGxlMTZfdG9fY3B1KHBCU1NFbnRyeS0+c3NwYXJhbXNldC5pYnNzcGFyYW1zZXQuCisJCQkJCSAgICAgYXRpbXdpbmRvdyk7CisJCQlicmVhazsKKworCQkJLyogSGFuZGxlIENvdW50cnkgSW5mbyBJRSAqLworCQljYXNlIENPVU5UUllfSU5GTzoKKwkJCXBjb3VudHJ5aW5mbyA9CisJCQkgICAgKHN0cnVjdCBpZWVldHlwZXNfY291bnRyeWluZm9zZXQgKikgcGN1cnJlbnRwdHI7CisKKwkJCWlmIChwY291bnRyeWluZm8tPmxlbiA8CisJCQkgICAgc2l6ZW9mKHBjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUpCisJCQkgICAgfHwgcGNvdW50cnlpbmZvLT5sZW4gPiAyNTQpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiAxMUQtIEVyciAiCisJCQkJICAgICAgICJDb3VudHJ5SW5mbyBsZW4gPSVkIG1pbj0lZCBtYXg9MjU0XG4iLAorCQkJCSAgICAgICBwY291bnRyeWluZm8tPmxlbiwKKwkJCQkgICAgICAgc2l6ZW9mKHBjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUpKTsKKwkJCQlMRUFWRSgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJbWVtY3B5KCZwQlNTRW50cnktPmNvdW50cnlpbmZvLAorCQkJICAgICAgIHBjb3VudHJ5aW5mbywgcGNvdW50cnlpbmZvLT5sZW4gKyAyKTsKKwkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogMTFELSBDb3VudHJ5SW5mbzoiLAorCQkJCSh1OCAqKSBwY291bnRyeWluZm8sCisJCQkJKHUzMikgKHBjb3VudHJ5aW5mby0+bGVuICsgMikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9TVVBQT1JURURfUkFURVM6CisJCQkvKgorCQkJICogb25seSBwcm9jZXNzIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlCisJCQkgKiBpZiBkYXRhIHJhdGUgaXMgYWxyZWFkeSBmb3VuZC4KKwkJCSAqIGRhdGEgcmF0ZSBJRSBzaG91bGQgY29tZSBiZWZvcmUKKwkJCSAqIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlIElFCisJCQkgKi8KKwkJCWlmIChmb3VuZGRhdGFyYXRlaWUpIHsKKwkJCQlpZiAoKGVsZW1sZW4gKyByYXRlc2l6ZSkgPiBXTEFOX1NVUFBPUlRFRF9SQVRFUykgeworCQkJCQlieXRlc3RvY29weSA9CisJCQkJCSAgICAoV0xBTl9TVVBQT1JURURfUkFURVMgLSByYXRlc2l6ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnl0ZXN0b2NvcHkgPSBlbGVtbGVuOworCQkJCX0KKworCQkJCXBSYXRlID0gKHU4ICopIHBCU1NFbnRyeS0+ZGF0YXJhdGVzOworCQkJCXBSYXRlICs9IHJhdGVzaXplOworCQkJCW1lbW1vdmUocFJhdGUsIChwY3VycmVudHB0ciArIDIpLCBieXRlc3RvY29weSk7CisKKwkJCQlwUmF0ZSA9ICh1OCAqKSBwQlNTRW50cnktPmxpYmVydGFzX3N1cHBvcnRlZF9yYXRlczsKKworCQkJCXBSYXRlICs9IHJhdGVzaXplOworCQkJCW1lbW1vdmUocFJhdGUsIChwY3VycmVudHB0ciArIDIpLCBieXRlc3RvY29weSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFZFTkRPUl9TUEVDSUZJQ18yMjE6CisjZGVmaW5lIElFX0lEX0xFTl9GSUVMRFNfQllURVMgMgorCQkJcEllID0gKHN0cnVjdCBJRV9XUEEgKilwY3VycmVudHB0cjsKKworCQkJaWYgKCFtZW1jbXAocEllLT5vdWksIG91aTAxLCBzaXplb2Yob3VpMDEpKSkgeworCQkJCXB3cGFfc3VwcGxpY2FudC0+d3BhX2llX2xlbgorCQkJCSAgICA9IG1pbl90KHNpemVfdCwgZWxlbWxlbiArIElFX0lEX0xFTl9GSUVMRFNfQllURVMsCisJCQkJCSAgc2l6ZW9mKHB3cGFfc3VwcGxpY2FudC0+d3BhX2llKSk7CisJCQkJbWVtY3B5KHB3cGFfc3VwcGxpY2FudC0+d3BhX2llLAorCQkJCSAgICAgICBwY3VycmVudHB0ciwKKwkJCQkgICAgICAgcHdwYV9zdXBwbGljYW50LT53cGFfaWVfbGVuKTsKKwkJCQlsYnNfZGJnX2hleCgiSW50ZXJwcmV0SUU6IFJlc3AgV1BBX0lFIiwKKwkJCQkJcHdwYV9zdXBwbGljYW50LT53cGFfaWUsIGVsZW1sZW4pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV1BBMl9JRToKKwkJCXBJZSA9IChzdHJ1Y3QgSUVfV1BBICopcGN1cnJlbnRwdHI7CisJCQlwd3BhMl9zdXBwbGljYW50LT53cGFfaWVfbGVuCisJCQkgICAgPSBtaW5fdChzaXplX3QsIGVsZW1sZW4gKyBJRV9JRF9MRU5fRklFTERTX0JZVEVTLAorCQkJCSAgc2l6ZW9mKHB3cGEyX3N1cHBsaWNhbnQtPndwYV9pZSkpOworCQkJbWVtY3B5KHB3cGEyX3N1cHBsaWNhbnQtPndwYV9pZSwKKwkJCSAgICAgICBwY3VycmVudHB0ciwgcHdwYTJfc3VwcGxpY2FudC0+d3BhX2llX2xlbik7CisKKwkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogUmVzcCBXUEEyX0lFIiwKKwkJCQlwd3BhMl9zdXBwbGljYW50LT53cGFfaWUsIGVsZW1sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgVElNOgorCQkJYnJlYWs7CisKKwkJY2FzZSBDSEFMTEVOR0VfVEVYVDoKKwkJCWJyZWFrOworCQl9CisKKwkJcGN1cnJlbnRwdHIgKz0gZWxlbWxlbiArIDI7CisKKwkJLyogbmVlZCB0byBhY2NvdW50IGZvciBJRSBJRCBhbmQgSUUgbGVuICovCisJCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gKGVsZW1sZW4gKyAyKTsKKworCX0JCQkvKiB3aGlsZSAoYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA+IDIpICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIENvbXBhcmUgdHdvIFNTSURzCisgKgorICogIEBwYXJhbSBzc2lkMSAgICBBIHBvaW50ZXIgdG8gc3NpZCB0byBjb21wYXJlCisgKiAgQHBhcmFtIHNzaWQyICAgIEEgcG9pbnRlciB0byBzc2lkIHRvIGNvbXBhcmUKKyAqCisgKiAgQHJldHVybiAgICAgICAgIDAtLXNzaWQgaXMgc2FtZSwgb3RoZXJ3aXNlIGlzIGRpZmZlcmVudAorICovCitpbnQgbGliZXJ0YXNfU1NJRF9jbXAoc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQxLCBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZDIpCit7CisJaWYgKCFzc2lkMSB8fCAhc3NpZDIpCisJCXJldHVybiAtMTsKKworCWlmIChzc2lkMS0+c3NpZGxlbmd0aCAhPSBzc2lkMi0+c3NpZGxlbmd0aCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG1lbWNtcChzc2lkMS0+c3NpZCwgc3NpZDItPnNzaWQsIHNzaWQxLT5zc2lkbGVuZ3RoKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBzcGVjaWZpYyBjb21wYXRpYmxlIEJTU0lEIGluIHRoZSBzY2FuIGxpc3QKKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIKKyAqICBAcGFyYW0gYnNzaWQgICAgQlNTSUQgdG8gZmluZCBpbiB0aGUgc2NhbiBsaXN0CisgKiAgQHBhcmFtIG1vZGUgICAgIE5ldHdvcmsgbW9kZTogSW5mcmFzdHJ1Y3R1cmUgb3IgSUJTUworICoKKyAqICBAcmV0dXJuICAgICAgICAgaW5kZXggaW4gQlNTSUQgbGlzdCwgb3IgZXJyb3IgcmV0dXJuIGNvZGUgKDwgMCkKKyAqLworaW50IGxpYmVydGFzX2ZpbmRfQlNTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCAqIGJzc2lkLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gLUVORVRVTlJFQUNIOworCWludCBpOworCisJaWYgKCFic3NpZCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZpbmRCU1NJRDogTnVtIG9mIEJTU0lEcyA9ICVkXG4iLAorCSAgICAgICBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSk7CisKKwkvKiBMb29rIHRocm91Z2ggdGhlIHNjYW4gdGFibGUgZm9yIGEgY29tcGF0aWJsZSBtYXRjaC4gVGhlIHJldCByZXR1cm4KKwkgKiAgIHZhcmlhYmxlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIGluZGV4IGluIHRoZSBzY2FuIHRhYmxlIChncmVhdGVyCisJICogICB0aGFuIHplcm8pIGlmIHRoZSBuZXR3b3JrIGlzIGNvbXBhdGlibGUuICBUaGUgbG9vcCB3aWxsIGNvbnRpbnVlCisJICogICBwYXN0IGEgbWF0Y2hlZCBic3NpZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIGluIGNhc2UgdGhlcmUgaXMgYW4KKwkgKiAgIEFQIHdpdGggbXVsdGlwbGUgU1NJRHMgYXNzaWduZWQgdG8gdGhlIHNhbWUgQlNTSUQKKwkgKi8KKwlmb3IgKGkgPSAwOyByZXQgPCAwICYmIGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICghbWVtY21wKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSB7CisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2Ugd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlOgorCQkJY2FzZSB3bGFuODAyXzExaWJzczoKKwkJCQlyZXQgPSBpc19uZXR3b3JrX2NvbXBhdGlibGUoYWRhcHRlciwgaSwgbW9kZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBzc2lkIGluIHNzaWQgbGlzdC4KKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIKKyAqICBAcGFyYW0gc3NpZCAgICAgU1NJRCB0byBmaW5kIGluIHRoZSBsaXN0CisgKiAgQHBhcmFtIGJzc2lkICAgIEJTU0lEIHRvIHF1YWxpZnkgdGhlIFNTSUQgc2VsZWN0aW9uIChpZiBwcm92aWRlZCkKKyAqICBAcGFyYW0gbW9kZSAgICAgTmV0d29yayBtb2RlOiBJbmZyYXN0cnVjdHVyZSBvciBJQlNTCisgKgorICogIEByZXR1cm4gICAgICAgICBpbmRleCBpbiBCU1NJRCBsaXN0CisgKi8KK2ludCBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkgICBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZCwgdTggKiBic3NpZCwgaW50IG1vZGUpCit7CisJaW50IG5ldCA9IC1FTkVUVU5SRUFDSDsKKwl1OCBiZXN0cnNzaSA9IDA7CisJaW50IGk7CisJaW50IGo7CisKKwlsYnNfcHJfZGVidWcoMSwgIk51bSBvZiBFbnRyaWVzIGluIFRhYmxlID0gJWRcbiIsIGFkYXB0ZXItPm51bWluc2NhbnRhYmxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICghbGliZXJ0YXNfU1NJRF9jbXAoJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkLCBzc2lkKSAmJgorCQkgICAgKCFic3NpZCB8fAorCQkgICAgICFtZW1jbXAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLgorCQkJICAgICBtYWNhZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSkgeworCQkJc3dpdGNoIChtb2RlKSB7CisJCQljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKKwkJCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCQkJaiA9IGlzX25ldHdvcmtfY29tcGF0aWJsZShhZGFwdGVyLCBpLCBtb2RlKTsKKworCQkJCWlmIChqID49IDApIHsKKwkJCQkJaWYgKGJzc2lkKSB7CisJCQkJCQlyZXR1cm4gaTsKKwkJCQkJfQorCisJCQkJCWlmIChTQ0FOX1JTU0kKKwkJCQkJICAgIChhZGFwdGVyLT5zY2FudGFibGVbaV0ucnNzaSkKKwkJCQkJICAgID4gYmVzdHJzc2kpIHsKKwkJCQkJCWJlc3Ryc3NpID0KKwkJCQkJCSAgICBTQ0FOX1JTU0koYWRhcHRlci0+CisJCQkJCQkJICAgICAgc2NhbnRhYmxlW2ldLgorCQkJCQkJCSAgICAgIHJzc2kpOworCQkJCQkJbmV0ID0gaTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChuZXQgPT0gLUVORVRVTlJFQUNIKSB7CisJCQkJCQluZXQgPSBqOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246CisJCQlkZWZhdWx0OgorCQkJCWlmIChTQ0FOX1JTU0koYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2kpCisJCQkJICAgID4gYmVzdHJzc2kpIHsKKwkJCQkJYmVzdHJzc2kgPQorCQkJCQkgICAgU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KKwkJCQkJCSAgICAgIHJzc2kpOworCQkJCQluZXQgPSBpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBuZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBiZXN0IFNTSUQgaW4gdGhlIFNjYW4gTGlzdAorICoKKyAqICBTZWFyY2ggdGhlIHNjYW4gdGFibGUgZm9yIHRoZSBiZXN0IFNTSUQgdGhhdCBhbHNvIG1hdGNoZXMgdGhlIGN1cnJlbnQKKyAqICAgYWRhcHRlciBuZXR3b3JrIHByZWZlcmVuY2UgKGluZnJhc3RydWN0dXJlIG9yIGFkaG9jKQorICoKKyAqICBAcGFyYW0gYWRhcHRlciAgQSBwb2ludGVyIHRvIHdsYW5fYWRhcHRlcgorICoKKyAqICBAcmV0dXJuICAgICAgICAgaW5kZXggaW4gQlNTSUQgbGlzdAorICovCitpbnQgbGliZXJ0YXNfZmluZF9iZXN0X1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG1vZGUpCit7CisJaW50IGJlc3RuZXQgPSAtRU5FVFVOUkVBQ0g7CisJdTggYmVzdHJzc2kgPSAwOworCWludCBpOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiTnVtIG9mIEJTU0lEcyA9ICVkXG4iLCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU6CisJCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCQlpZiAoaXNfbmV0d29ya19jb21wYXRpYmxlKGFkYXB0ZXIsIGksIG1vZGUpID49IDApIHsKKwkJCQlpZiAoU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKSA+CisJCQkJICAgIGJlc3Ryc3NpKSB7CisJCQkJCWJlc3Ryc3NpID0KKwkJCQkJICAgIFNDQU5fUlNTSShhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCQkgICAgICByc3NpKTsKKwkJCQkJYmVzdG5ldCA9IGk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugd2xhbjgwMl8xMWF1dG91bmtub3duOgorCQlkZWZhdWx0OgorCQkJaWYgKFNDQU5fUlNTSShhZGFwdGVyLT5zY2FudGFibGVbaV0ucnNzaSkgPiBiZXN0cnNzaSkgeworCQkJCWJlc3Ryc3NpID0KKwkJCQkgICAgU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKTsKKwkJCQliZXN0bmV0ID0gaTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gYmVzdG5ldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEZpbmQgdGhlIEFQIHdpdGggc3BlY2lmaWMgc3NpZCBpbiB0aGUgc2NhbiBsaXN0CisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcFNTSUQgICAgICAgIEEgcG9pbnRlciB0byBBUCdzIHNzaWQKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCBvdGhlcndpc2UtLWZhaWwKKyAqLworaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQod2xhbl9wcml2YXRlICogcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBwcmVmZXJyZWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAqb3V0X21vZGUpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnByZXFic3NpZDsKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwltZW1zZXQocFNTSUQsIDAsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCisJd2xhbl9zY2FuX25ldHdvcmtzKHByaXYsIE5VTEwpOworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+Y21kX3BlbmRpbmcsICFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyk7CisKKwlpID0gbGliZXJ0YXNfZmluZF9iZXN0X1NTSURfaW5fbGlzdChhZGFwdGVyLCBwcmVmZXJyZWRfbW9kZSk7CisJaWYgKGkgPCAwKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmVxYnNzaWQgPSAmYWRhcHRlci0+c2NhbnRhYmxlW2ldOworCW1lbWNweShwU1NJRCwgJnByZXFic3NpZC0+c3NpZCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisJKm91dF9tb2RlID0gcHJlcWJzc2lkLT5pbmZyYW1vZGU7CisKKwlpZiAoIXBTU0lELT5zc2lkbGVuZ3RoKSB7CisJCXJldCA9IC0xOworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNjYW4gTmV0d29yaworICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAgICAgICAgIEEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEgICAgICAgIEEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCUVOVEVSKCk7CisKKwlpZiAoIXdsYW5fc2Nhbl9uZXR3b3Jrcyhwcml2LCBOVUxMKSkgeworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+d2xhbl9kZXYubmV0ZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsCisJCQkJICAgIE5VTEwpOworCX0KKworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZW5kIGEgc2NhbiBjb21tYW5kIGZvciBhbGwgYXZhaWxhYmxlIGNoYW5uZWxzIGZpbHRlcmVkIG9uIGEgc3BlYworICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwcmVxdWVzdGVkc3NpZCAgIEEgcG9pbnRlciB0byBBUCdzIHNzaWQKKyAqICBAcGFyYW0ga2VlcHByZXZpb3Vzc2NhbiBGbGFnIHVzZWQgdG8gc2F2ZS9jbGVhciBzY2FuIHRhYmxlIGJlZm9yZSBzY2FuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19TU0lEX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqcHJlcXVlc3RlZHNzaWQsCisJCQkgdTgga2VlcHByZXZpb3Vzc2NhbikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgc2NhbmNmZzsKKworCUVOVEVSKCk7CisKKwlpZiAocHJlcXVlc3RlZHNzaWQgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZzY2FuY2ZnLCAweDAwLCBzaXplb2Yoc2NhbmNmZykpOworCisJbWVtY3B5KHNjYW5jZmcuc3BlY2lmaWNTU0lELCBwcmVxdWVzdGVkc3NpZC0+c3NpZCwKKwkgICAgICAgcHJlcXVlc3RlZHNzaWQtPnNzaWRsZW5ndGgpOworCXNjYW5jZmcua2VlcHByZXZpb3Vzc2NhbiA9IGtlZXBwcmV2aW91c3NjYW47CisKKwl3bGFuX3NjYW5fbmV0d29ya3MocHJpdiwgJnNjYW5jZmcpOworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+Y21kX3BlbmRpbmcsICFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgc2NhbiBhbiBBUCB3aXRoIHNwZWNpZmljIEJTU0lECisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGJzc2lkICAgICAgICAgICAgQSBwb2ludGVyIHRvIEFQJ3MgYnNzaWQKKyAqICBAcGFyYW0ga2VlcHByZXZpb3Vzc2NhbiBGbGFnIHVzZWQgdG8gc2F2ZS9jbGVhciBzY2FuIHRhYmxlIGJlZm9yZSBzY2FuCisgKgorICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19CU1NJRF9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogYnNzaWQsIHU4IGtlZXBwcmV2aW91c3NjYW4pCit7CisJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyBzY2FuY2ZnOworCisJRU5URVIoKTsKKworCWlmIChic3NpZCA9PSBOVUxMKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJnNjYW5jZmcsIDB4MDAsIHNpemVvZihzY2FuY2ZnKSk7CisJbWVtY3B5KHNjYW5jZmcuc3BlY2lmaWNCU1NJRCwgYnNzaWQsIHNpemVvZihzY2FuY2ZnLnNwZWNpZmljQlNTSUQpKTsKKwlzY2FuY2ZnLmtlZXBwcmV2aW91c3NjYW4gPSBrZWVwcHJldmlvdXNzY2FuOworCisJd2xhbl9zY2FuX25ldHdvcmtzKHByaXYsICZzY2FuY2ZnKTsKKwlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKQorCQlyZXR1cm4gLTE7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHByaXYtPmFkYXB0ZXItPmNtZF9wZW5kaW5nLAorCQkhcHJpdi0+YWRhcHRlci0+bnJfY21kX3BlbmRpbmcpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICBSZXRyaWV2ZSB0aGUgc2NhbiB0YWJsZSBlbnRyaWVzIHZpYSB3aXJlbGVzcyB0b29scyBJT0NUTCBjYWxsCisgKgorICogIEBwYXJhbSBkZXYgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHBhcmFtIGluZm8gICAgICAgICBBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQorICogIEBwYXJhbSBkd3JxICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3BvaW50IHN0cnVjdHVyZQorICogIEBwYXJhbSBleHRyYSAgICAgICAgQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK2ludCBsaWJlcnRhc19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcHNjYW50YWJsZTsKKwljaGFyICpjdXJyZW50X3ZhbDsJLyogRm9yIHJhdGVzICovCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworCWludCBpOworCWludCBqOworCWludCByYXRlOworI2RlZmluZSBQRVJGRUNUX1JTU0kgKCh1OCk1MCkKKyNkZWZpbmUgV09SU1RfUlNTSSAgICgodTgpMCkKKyNkZWZpbmUgUlNTSV9ESUZGICAgICgodTgpKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpKQorCXU4IHJzc2k7CisKKwl1OCBidWZbMTYgKyAyNTYgKiAyXTsKKwl1OCAqcHRyOworCisJRU5URVIoKTsKKworCS8qCisJICogaWYgdGhlcmUncyBlaXRoZXIgY29tbWFuZHMgaW4gdGhlIHF1ZXVlIG9yIG9uZSBiZWluZworCSAqIHByb2Nlc3NlZCByZXR1cm4gLUVBR0FJTiBmb3IgaXdsaXN0IHRvIHJldHJ5IGxhdGVyLgorCSAqLworICAgIGlmIChhZGFwdGVyLT5ucl9jbWRfcGVuZGluZykKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQlsYnNfcHJfZGVidWcoMSwgIkN1cnJlbnQgc3NpZDogJTMyc1xuIiwKKwkJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQpOworCisJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBHZXQ6IG51bWluc2NhbnRhYmxlID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPm51bWluc2NhbnRhYmxlKTsKKworCS8qIFRoZSBvbGQgQVBJIHVzaW5nIFNJT0NHSVdBUExJU1QgaGFkIGEgaGFyZCBsaW1pdCBvZiBJV19NQVhfQVAuCisJICogVGhlIG5ldyBBUEkgdXNpbmcgU0lPQ0dJV1NDQU4gaXMgb25seSBsaW1pdGVkIGJ5IGJ1ZmZlciBzaXplCisJICogV0UtMTQgLT4gV0UtMTYgdGhlIGJ1ZmZlciBpcyBsaW1pdGVkIHRvIElXX1NDQU5fTUFYX0RBVEEgYnl0ZXMKKwkgKiB3aGljaCBpcyA0MDk2LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICgoY3VycmVudF9ldiArIE1BWF9TQ0FOX0NFTExfU0laRSkgPj0gZW5kX2J1ZikgeworCQkJbGJzX3ByX2RlYnVnKDEsICJpPSVkIGJyZWFrIG91dDogY3VycmVudF9ldj0lcCBlbmRfYnVmPSVwICIKKwkJCSAgICAgICAiTUFYX1NDQU5fQ0VMTF9TSVpFPSVkXG4iLAorCQkJICAgICAgIGksIGN1cnJlbnRfZXYsIGVuZF9idWYsIE1BWF9TQ0FOX0NFTExfU0laRSk7CisJCQlicmVhazsKKwkJfQorCisJCXBzY2FudGFibGUgPSAmYWRhcHRlci0+c2NhbnRhYmxlW2ldOworCisJCWxic19wcl9kZWJ1ZygxLCAiaT0lZCAgc3NpZDogJTMyc1xuIiwgaSwgcHNjYW50YWJsZS0+c3NpZC5zc2lkKTsKKworCQljZnAgPQorCQkgICAgbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbChhZGFwdGVyLCAwLAorCQkJCQkJIHBzY2FudGFibGUtPmNoYW5uZWwpOworCQlpZiAoIWNmcCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyICVkXG4iLAorCQkJICAgICAgIHBzY2FudGFibGUtPmNoYW5uZWwpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXNzaWRfdmFsaWQoJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLAorCQkgICAgICAgJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLCBFVEhfQUxFTik7CisKKwkJaXdlLmxlbiA9IElXX0VWX0FERFJfTEVOOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCS8vQWRkIHRoZSBFU1NJRAorCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkLnNzaWRsZW5ndGg7CisKKwkJaWYgKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpIHsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJCX0KKworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQuCisJCQkJCQkgIHNzaWQpOworCisJCS8vQWRkIG1vZGUKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpd2UudS5tb2RlID0gYWRhcHRlci0+c2NhbnRhYmxlW2ldLmluZnJhbW9kZSArIDE7CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKKworCQkvL2ZyZXF1ZW5jeQorCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS51LmZyZXEubSA9IChsb25nKWNmcC0+ZnJlcSAqIDEwMDAwMDsKKwkJaXdlLnUuZnJlcS5lID0gMTsKKwkJaXdlLmxlbiA9IElXX0VWX0ZSRVFfTEVOOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkJaXdlLmNtZCA9IElXRVZRVUFMOworCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEOworCQlpd2UudS5xdWFsLmxldmVsID0gU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKTsKKworCQlyc3NpID0gaXdlLnUucXVhbC5sZXZlbCAtIE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7CisJCWl3ZS51LnF1YWwucXVhbCA9CisJCSAgICAoMTAwICogUlNTSV9ESUZGICogUlNTSV9ESUZGIC0gKFBFUkZFQ1RfUlNTSSAtIHJzc2kpICoKKwkJICAgICAoMTUgKiAoUlNTSV9ESUZGKSArIDYyICogKFBFUkZFQ1RfUlNTSSAtIHJzc2kpKSkgLworCQkgICAgKFJTU0lfRElGRiAqIFJTU0lfRElGRik7CisJCWlmIChpd2UudS5xdWFsLnF1YWwgPiAxMDApCisJCQlpd2UudS5xdWFsLnF1YWwgPSAxMDA7CisJCWVsc2UgaWYgKGl3ZS51LnF1YWwucXVhbCA8IDEpCisJCQlpd2UudS5xdWFsLnF1YWwgPSAwOworCisJCWlmIChhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPT0gMCkgeworCQkJaXdlLnUucXVhbC5ub2lzZSA9IE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7CisJCX0gZWxzZSB7CisJCQlpd2UudS5xdWFsLm5vaXNlID0KKwkJCSAgICBDQUxfTkYoYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKKwkJfQorCQlpZiAoKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgJiYKKwkJICAgICFsaWJlcnRhc19TU0lEX2NtcCgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsCisJCQkgICAgICZhZGFwdGVyLT5zY2FudGFibGVbaV0uc3NpZCkKKwkJICAgICYmIGFkYXB0ZXItPmFkaG9jY3JlYXRlKSB7CisJCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJCSAgICBjbWRfODAyXzExX3Jzc2ksCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCQkgICAgMCwgTlVMTCk7CisKKwkJCWlmICghcmV0KSB7CisJCQkJaXdlLnUucXVhbC5sZXZlbCA9CisJCQkJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvCisJCQkJCSAgICAgQVZHX1NDQUxFLAorCQkJCQkgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8KKwkJCQkJICAgICBBVkdfU0NBTEUpOworCQkJfQorCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9RVUFMX0xFTjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKKworCQkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLnByaXZhY3kpIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJfSBlbHNlIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCX0KKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCQlpd2UubGVuID0gSVdfRVZfUE9JTlRfTEVOICsgaXdlLnUuZGF0YS5sZW5ndGg7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJICBhZGFwdGVyLT5zY2FudGFibGUtPnNzaWQuCisJCQkJCQkgIHNzaWQpOworCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCisJCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSAwOworCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDA7CisKKwkJLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNpemVvZihhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzKTsKKwkJICAgICBqKyspIHsKKwkJCWlmIChhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW2pdID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJhdGUgPQorCQkJICAgIChhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW2pdICYgMHg3RikgKgorCQkJICAgIDUwMDAwMDsKKwkJCWlmIChyYXRlID4gaXdlLnUuYml0cmF0ZS52YWx1ZSkgeworCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSByYXRlOworCQkJfQorCisJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0KKwkJCSAgICAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLmxpYmVydGFzX3N1cHBvcnRlZF9yYXRlc1tqXQorCQkJICAgICAmIDB4N2YpICogNTAwMDAwOworCQkJaXdlLmxlbiA9IElXX0VWX1BBUkFNX0xFTjsKKwkJCWN1cnJlbnRfZXYgPQorCQkJICAgIGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLAorCQkJCQkJIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCX0KKwkJaWYgKChhZGFwdGVyLT5zY2FudGFibGVbaV0uaW5mcmFtb2RlID09IHdsYW44MDJfMTFpYnNzKQorCQkgICAgJiYgIWxpYmVydGFzX1NTSURfY21wKCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZCwKKwkJCQkmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQpCisJCSAgICAmJiBhZGFwdGVyLT5hZGhvY2NyZWF0ZSkgeworCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDIyICogNTAwMDAwOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9QQVJBTV9MRU47CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfdmFsdWUoY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisJCQkJCSBpd2UubGVuKTsKKworCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGEyX3N1cHBsaWNhbnQud3BhX2llWzBdID09IFdQQTJfSUUpIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCQltZW1jcHkoYnVmLCBhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCQl3cGEyX3N1cHBsaWNhbnQud3BhX2llLAorCQkJCQlhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhMl9zdXBwbGljYW50LgorCQkJCQkJd3BhX2llX2xlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCXdwYTJfc3VwcGxpY2FudC53cGFfaWVfbGVuOworCQkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSZpd2UsIGJ1Zik7CisJCX0KKwkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGFfc3VwcGxpY2FudC53cGFfaWVbMF0gPT0gV1BBX0lFKSB7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQkJbWVtY3B5KGJ1ZiwgYWRhcHRlci0+c2NhbnRhYmxlW2ldLgorCQkJCQkJd3BhX3N1cHBsaWNhbnQud3BhX2llLAorCQkJCQlhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhX3N1cHBsaWNhbnQuCisJCQkJCQl3cGFfaWVfbGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KKwkJCQkJd3BhX3N1cHBsaWNhbnQud3BhX2llX2xlbjsKKwkJCWl3ZS5sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UudS5kYXRhLmxlbmd0aDsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkmaXdlLCBidWYpOworCQl9CisKKworCQlpZiAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLmV4dHJhX2llICE9IDApIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCQlwdHIgPSBidWY7CisJCQlwdHIgKz0gc3ByaW50ZihwdHIsICJleHRyYV9pZSIpOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKworCQkJbGJzX3ByX2RlYnVnKDEsICJpd2UudS5kYXRhLmxlbmd0aCAlZFxuIiwKKwkJCSAgICAgICBpd2UudS5kYXRhLmxlbmd0aCk7CisJCQlsYnNfcHJfZGVidWcoMSwgIkJVRjogJXMgXG4iLCBidWYpOworCisJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJCWl3ZS5sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UudS5kYXRhLmxlbmd0aDsKKwkJCWN1cnJlbnRfZXYgPQorCQkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCQkgYnVmKTsKKwkJfQorCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50CisJCSAqLworCQlpZiAoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCX0KKworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBQcmVwYXJlIGEgc2NhbiBjb21tYW5kIHRvIGJlIHNlbnQgdG8gdGhlIGZpcm13YXJlCisgKgorICogIFVzZSB0aGUgd2xhbl9zY2FuX2NtZF9jb25maWcgc2VudCB0byB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIG1vZHVsZSBpbgorICogICB0aGUgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kIHRvIGNvbmZpZ3VyZSBhIGNtZF9kc184MDJfMTFfc2NhbiBjb21tYW5kCisgKiAgIHN0cnVjdCB0byBzZW5kIHRvIGZpcm13YXJlLgorICoKKyAqICBUaGUgZml4ZWQgZmllbGRzIHNwZWNpZnlpbmcgdGhlIEJTUyB0eXBlIGFuZCBCU1NJRCBmaWx0ZXJzIGFzIHdlbGwgYXMgYQorICogICB2YXJpYWJsZSBudW1iZXIvbGVuZ3RoIG9mIFRMVnMgYXJlIHNlbnQgaW4gdGhlIGNvbW1hbmQgdG8gZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGNtZCAgICAgICAgQSBwb2ludGVyIHRvIGNtZF9kc19jb21tYW5kIHN0cnVjdHVyZSB0byBiZSBzZW50IHRvCisgKiAgICAgICAgICAgICAgICAgICAgZmlybXdhcmUgd2l0aCB0aGUgY21kX0RTXzgwMV8xMV9TQ0FOIHN0cnVjdHVyZQorICogIEBwYXJhbSBwZGF0YV9idWYgIFZvaWQgcG9pbnRlciBjYXN0IG9mIGEgd2xhbl9zY2FuX2NtZF9jb25maWcgc3RydWN0IHVzZWQKKyAqICAgICAgICAgICAgICAgICAgICB0byBzZXQgdGhlIGZpZWxkcy9UTFZzIGZvciB0aGUgY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKgorICogIEByZXR1cm4gICAgICAgICAgIDAgb3IgLTEKKyAqCisgKiAgQHNhIHdsYW5fc2Nhbl9jcmVhdGVfY2hhbm5lbF9saXN0CisgKi8KK2ludCBsaWJlcnRhc19jbWRfODAyMTFfc2Nhbih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2NhbiAqcHNjYW4gPSAmY21kLT5wYXJhbXMuc2NhbjsKKwlzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcgKnBzY2FuY2ZnOworCisJRU5URVIoKTsKKworCXBzY2FuY2ZnID0gcGRhdGFfYnVmOworCisJLyogU2V0IGZpeGVkIGZpZWxkIHZhcmlhYmxlcyBpbiBzY2FuIGNvbW1hbmQgKi8KKwlwc2Nhbi0+YnNzdHlwZSA9IHBzY2FuY2ZnLT5ic3N0eXBlOworCW1lbWNweShwc2Nhbi0+QlNTSUQsIHBzY2FuY2ZnLT5zcGVjaWZpY0JTU0lELCBzaXplb2YocHNjYW4tPkJTU0lEKSk7CisJbWVtY3B5KHBzY2FuLT50bHZidWZmZXIsIHBzY2FuY2ZnLT50bHZidWZmZXIsIHBzY2FuY2ZnLT50bHZidWZmZXJsZW4pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9zY2FuKTsKKworCS8qIHNpemUgaXMgZXF1YWwgdG8gdGhlIHNpemVvZihmaXhlZCBwb3J0aW9ucykgKyB0aGUgVExWIGxlbiArIGhlYWRlciAqLworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihwc2Nhbi0+YnNzdHlwZSkKKwkJCQkgICAgICsgc2l6ZW9mKHBzY2FuLT5CU1NJRCkKKwkJCQkgICAgICsgcHNjYW5jZmctPnRsdmJ1ZmZlcmxlbiArIFNfRFNfR0VOKTsKKworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9DTUQ6IGNvbW1hbmQ9JXgsIHNpemU9JXgsIHNlcW51bT0leFxuIiwKKwkgICAgICAgY21kLT5jb21tYW5kLCBjbWQtPnNpemUsIGNtZC0+c2VxbnVtKTsKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlIG9mIHNjYW4KKyAqCisgKiAgIFRoZSByZXNwb25zZSBidWZmZXIgZm9yIHRoZSBzY2FuIGNvbW1hbmQgaGFzIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgbWVtb3J5IGxheW91dDoKKyAqCisgKiAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogICAgIHwgIGhlYWRlciAoNCAqIHNpemVvZih1MTYpKTogIFN0YW5kYXJkIGNvbW1hbmQgcmVzcG9uc2UgaGRyIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiAgICAgfCAgYnVmc2l6ZSAodTE2KSA6IHNpemVvZiB0aGUgQlNTIERlc2NyaXB0aW9uIGRhdGEgICAgICAgICAgfAorICogICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqICAgICB8ICBOdW1PZlNldCAodTgpIDogTnVtYmVyIG9mIEJTUyBEZXNjcyByZXR1cm5lZCAgICAgICAgICAgICB8CisgKiAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogICAgIHwgIEJTU0Rlc2NyaXB0aW9uIGRhdGEgKHZhcmlhYmxlLCBzaXplIGdpdmVuIGluIGJ1ZnNpemUpICAgIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiAgICAgfCAgVExWIGRhdGEgKHZhcmlhYmxlLCBzaXplIGNhbGN1bGF0ZWQgdXNpbmcgaGVhZGVyLT5zaXplLCAgfAorICogICAgIHwgICAgICAgICAgICBidWZzaXplIGFuZCBzaXplb2YgdGhlIGZpeGVkIGZpZWxkcyBhYm92ZSkgICAgIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlc3AgICAgQSBwb2ludGVyIHRvIGNtZF9kc19jb21tYW5kCisgKgorICogIEByZXR1cm4gICAgICAgIDAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX3JldF84MDIxMV9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NjYW5fcnNwICpwc2NhbjsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgbmV3YnNzZW50cnk7CisJc3RydWN0IG1ydmxpZXR5cGVzX2RhdGEgKnB0bHY7CisJc3RydWN0IG1ydmxpZXR5cGVzX3RzZnRpbWVzdGFtcCAqcHRzZnRsdjsKKwl1OCAqcGJzc2luZm87CisJdTE2IHNjYW5yZXNwc2l6ZTsKKwlpbnQgYnl0ZXNsZWZ0OworCWludCBudW1pbnRhYmxlOworCWludCBic3NJZHg7CisJaW50IGlkeDsKKwlpbnQgdGx2YnVmc2l6ZTsKKwl1NjQgdHNmdmFsOworCisJRU5URVIoKTsKKworCXBzY2FuID0gJnJlc3AtPnBhcmFtcy5zY2FucmVzcDsKKworCWlmIChwc2Nhbi0+bnJfc2V0cyA+IE1SVkRSVl9NQVhfQlNTSURfTElTVCkgeworICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJTQ0FOX1JFU1A6IEludmFsaWQgbnVtYmVyIG9mIEFQIHJldHVybmVkICglZCkhIVxuIiwKKwkJICAgICAgIHBzY2FuLT5ucl9zZXRzKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ5dGVzbGVmdCA9IGxlMTZfdG9fY3B1KHBzY2FuLT5ic3NkZXNjcmlwdHNpemUpOworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBic3NkZXNjcmlwdHNpemUgJWRcbiIsIGJ5dGVzbGVmdCk7CisKKwlzY2FucmVzcHNpemUgPSBsZTE2X3RvX2NwdShyZXNwLT5zaXplKTsKKwlsYnNfcHJfZGVidWcoMSwgIlNDQU5fUkVTUDogcmV0dXJuZWQgJWQgQVAgYmVmb3JlIHBhcnNpbmdcbiIsCisJICAgICAgIHBzY2FuLT5ucl9zZXRzKTsKKworCW51bWludGFibGUgPSBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsKKwlwYnNzaW5mbyA9IHBzY2FuLT5ic3NkZXNjX2FuZF90bHZidWZmZXI7CisKKwkvKiBUaGUgc2l6ZSBvZiB0aGUgVExWIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgZW50aXJlIGNvbW1hbmQgcmVzcG9uc2UKKwkgKiAgIHNpemUgKHNjYW5yZXNwc2l6ZSkgbWludXMgdGhlIGZpeGVkIGZpZWxkcyAoc2l6ZW9mKCkncyksIHRoZQorCSAqICAgQlNTIERlc2NyaXB0aW9ucyAoYnNzZGVzY3JpcHRzaXplIGFzIGJ5dGVzTGVmKSBhbmQgdGhlIGNvbW1hbmQKKwkgKiAgIHJlc3BvbnNlIGhlYWRlciAoU19EU19HRU4pCisJICovCisJdGx2YnVmc2l6ZSA9IHNjYW5yZXNwc2l6ZSAtIChieXRlc2xlZnQgKyBzaXplb2YocHNjYW4tPmJzc2Rlc2NyaXB0c2l6ZSkKKwkJCQkgICAgICsgc2l6ZW9mKHBzY2FuLT5ucl9zZXRzKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisKKwlwdGx2ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19kYXRhICopIChwc2Nhbi0+YnNzZGVzY19hbmRfdGx2YnVmZmVyICsgYnl0ZXNsZWZ0KTsKKworCS8qIFNlYXJjaCB0aGUgVExWIGJ1ZmZlciBzcGFjZSBpbiB0aGUgc2NhbiByZXNwb25zZSBmb3IgYW55IHZhbGlkIFRMVnMgKi8KKwl3bGFuX3JldF84MDJfMTFfc2Nhbl9nZXRfdGx2X3B0cnMocHRsdiwgdGx2YnVmc2l6ZSwgJnB0c2Z0bHYpOworCisJLyoKKwkgKiAgUHJvY2VzcyBlYWNoIHNjYW4gcmVzcG9uc2UgcmV0dXJuZWQgKHBzY2FuLT5ucl9zZXRzKS4gIFNhdmUKKwkgKiAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG5ld2Jzc2VudHJ5IGFuZCB0aGVuIGluc2VydCBpbnRvIHRoZQorCSAqICAgIGRyaXZlciBzY2FuIHRhYmxlIGVpdGhlciBhcyBhbiB1cGRhdGUgdG8gYW4gZXhpc3RpbmcgZW50cnkKKwkgKiAgICBvciBhcyBhbiBhZGRpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQorCSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcHNjYW4tPm5yX3NldHMgJiYgYnl0ZXNsZWZ0OyBpZHgrKykgeworCQkvKiBaZXJvIG91dCB0aGUgbmV3YnNzZW50cnkgd2UgYXJlIGFib3V0IHRvIHN0b3JlIGluZm8gaW4gKi8KKwkJbWVtc2V0KCZuZXdic3NlbnRyeSwgMHgwMCwgc2l6ZW9mKG5ld2Jzc2VudHJ5KSk7CisKKwkJLyogUHJvY2VzcyB0aGUgZGF0YSBmaWVsZHMgYW5kIElFcyByZXR1cm5lZCBmb3IgdGhpcyBCU1MgKi8KKwkJaWYgKChJbnRlcnByZXRCU1NEZXNjcmlwdGlvbldpdGhJRSgmbmV3YnNzZW50cnksCisJCQkJCQkgICAmcGJzc2luZm8sCisJCQkJCQkgICAmYnl0ZXNsZWZ0KSA9PQorCQkgICAgIDApCisJCSAgICAmJiBDSEVDS19TU0lEX0lTX1ZBTElEKCZuZXdic3NlbnRyeS5zc2lkKSkgeworCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiU0NBTl9SRVNQOiBCU1NJRCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgIG5ld2Jzc2VudHJ5Lm1hY2FkZHJlc3NbMF0sCisJCQkgICAgICAgbmV3YnNzZW50cnkubWFjYWRkcmVzc1sxXSwKKwkJCSAgICAgICBuZXdic3NlbnRyeS5tYWNhZGRyZXNzWzJdLAorCQkJICAgICAgIG5ld2Jzc2VudHJ5Lm1hY2FkZHJlc3NbM10sCisJCQkgICAgICAgbmV3YnNzZW50cnkubWFjYWRkcmVzc1s0XSwKKwkJCSAgICAgICBuZXdic3NlbnRyeS5tYWNhZGRyZXNzWzVdKTsKKworCQkJLyoKKwkJCSAqIFNlYXJjaCB0aGUgc2NhbiB0YWJsZSBmb3IgdGhlIHNhbWUgYnNzaWQKKwkJCSAqLworCQkJZm9yIChic3NJZHggPSAwOyBic3NJZHggPCBudW1pbnRhYmxlOyBic3NJZHgrKykgeworCQkJCWlmIChtZW1jbXAobmV3YnNzZW50cnkubWFjYWRkcmVzcywKKwkJCQkJICAgYWRhcHRlci0+c2NhbnRhYmxlW2Jzc0lkeF0uCisJCQkJCSAgIG1hY2FkZHJlc3MsCisJCQkJCSAgIHNpemVvZihuZXdic3NlbnRyeS5tYWNhZGRyZXNzKSkgPT0KKwkJCQkgICAgMCkgeworCQkJCQkvKgorCQkJCQkgKiBJZiB0aGUgU1NJRCBtYXRjaGVzIGFzIHdlbGwsIGl0IGlzIGEgZHVwbGljYXRlIG9mCisJCQkJCSAqICAgdGhpcyBlbnRyeS4gIEtlZXAgdGhlIGJzc0lkeCBzZXQgdG8gdGhpcworCQkJCQkgKiAgIGVudHJ5IHNvIHdlIHJlcGxhY2UgdGhlIG9sZCBjb250ZW50cyBpbiB0aGUgdGFibGUKKwkJCQkJICovCisJCQkJCWlmICgobmV3YnNzZW50cnkuc3NpZC5zc2lkbGVuZ3RoID09CisJCQkJCSAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2Jzc0lkeF0uc3NpZC4KKwkJCQkJICAgICBzc2lkbGVuZ3RoKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChtZW1jbXAKKwkJCQkJICAgICAobmV3YnNzZW50cnkuc3NpZC5zc2lkLAorCQkJCQkgICAgICBhZGFwdGVyLT5zY2FudGFibGVbYnNzSWR4XS5zc2lkLgorCQkJCQkgICAgICBzc2lkLAorCQkJCQkgICAgICBuZXdic3NlbnRyeS5zc2lkLnNzaWRsZW5ndGgpID09CisJCQkJCSAgICAgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJTQ0FOX1JFU1A6IER1cGxpY2F0ZSBvZiBpbmRleDogJWRcbiIsCisJCQkJCQkgICAgICAgYnNzSWR4KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZSBic3NJZHggaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSwKKwkJCSAqICAgdGhlIG5ldyBlbnRyeSB3YXMgbm90IGEgZHVwbGljYXRlOyBhcHBlbmQgaXQgdG8gdGhlIHNjYW4KKwkJCSAqICAgdGFibGUKKwkJCSAqLworCQkJaWYgKGJzc0lkeCA9PSBudW1pbnRhYmxlKSB7CisJCQkJLyogUmFuZ2UgY2hlY2sgdGhlIGJzc0lkeCwga2VlcCBpdCBsaW1pdGVkIHRvIHRoZSBsYXN0IGVudHJ5ICovCisJCQkJaWYgKGJzc0lkeCA9PSBNUlZEUlZfTUFYX0JTU0lEX0xJU1QpIHsKKwkJCQkJYnNzSWR4LS07CisJCQkJfSBlbHNlIHsKKwkJCQkJbnVtaW50YWJsZSsrOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZSBUU0YgVExWIHdhcyBhcHBlbmRlZCB0byB0aGUgc2NhbiByZXN1bHRzLCBzYXZlIHRoZQorCQkJICogICB0aGlzIGVudHJpZXMgVFNGIHZhbHVlIGluIHRoZSBuZXR3b3JrdHNmIGZpZWxkLiAgVGhlCisJCQkgKiAgIG5ldHdvcmt0c2YgaXMgdGhlIGZpcm13YXJlJ3MgVFNGIHZhbHVlIGF0IHRoZSB0aW1lIHRoZQorCQkJICogICBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLgorCQkJICovCisJCQlpZiAocHRzZnRsdikgeworCQkJCW1lbWNweSgmdHNmdmFsLCAmcHRzZnRsdi0+dHNmdGFibGVbaWR4XSwKKwkJCQkgICAgICAgc2l6ZW9mKHRzZnZhbCkpOworCQkJCXRzZnZhbCA9IGxlNjRfdG9fY3B1KHRzZnZhbCk7CisKKwkJCQltZW1jcHkoJm5ld2Jzc2VudHJ5Lm5ldHdvcmt0c2YsCisJCQkJICAgICAgICZ0c2Z2YWwsIHNpemVvZihuZXdic3NlbnRyeS5uZXR3b3JrdHNmKSk7CisJCQl9CisKKwkJCS8qIENvcHkgdGhlIGxvY2FsbHkgY3JlYXRlZCBuZXdic3NlbnRyeSB0byB0aGUgc2NhbiB0YWJsZSAqLworCQkJbWVtY3B5KCZhZGFwdGVyLT5zY2FudGFibGVbYnNzSWR4XSwKKwkJCSAgICAgICAmbmV3YnNzZW50cnksCisJCQkgICAgICAgc2l6ZW9mKGFkYXB0ZXItPnNjYW50YWJsZVtic3NJZHhdKSk7CisKKwkJfSBlbHNlIHsKKworCQkJLyogZXJyb3IgcGFyc2luZy9pbnRlcnByZXRpbmcgdGhlIHNjYW4gcmVzcG9uc2UsIHNraXBwZWQgKi8KKwkJCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiAiCisJCQkgICAgICAgIkludGVycHJldEJTU0Rlc2NyaXB0aW9uV2l0aElFIHJldHVybmVkIEVSUk9SXG4iKTsKKwkJfQorCX0KKworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBTY2FubmVkICUyZCBBUHMsICVkIHZhbGlkLCAlZCB0b3RhbFxuIiwKKwkgICAgICAgcHNjYW4tPm5yX3NldHMsIG51bWludGFibGUgLSBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSwKKwkgICAgICAgbnVtaW50YWJsZSk7CisKKwkvKiBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBCU1NJRHMgaW4gdGhlIHNjYW4gdGFibGUgKi8KKwlhZGFwdGVyLT5udW1pbnNjYW50YWJsZSA9IG51bWludGFibGU7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2FhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KKy8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLworCisvKioKKyAgKiBJbnRlcmZhY2UgZm9yIHRoZSB3bGFuIG5ldHdvcmsgc2NhbiByb3V0aW5lcworICAqCisgICogRHJpdmVyIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgc2NhbiBtb2R1bGUKKyAgKiAgIGltcGxlbWVudGVkIGluIHdsYW5fc2Nhbi5jLgorICAqLworI2lmbmRlZiBfV0xBTl9TQ0FOX0gKKyNkZWZpbmUgX1dMQU5fU0NBTl9ICisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisKKy8qKgorICogIEBicmllZiBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBzZW50IGluIGEgc2V0dXNlcnNjYW4gaW9jdGwKKyAqCisgKiAgQHNhIHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZworICovCisjZGVmaW5lIFdMQU5fSU9DVExfVVNFUl9TQ0FOX0NIQU5fTUFYICA1MAorCisvLyEgSW5mcmFzdHJ1Y3R1cmUgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZworI2RlZmluZSBXTEFOX1NDQU5fQlNTX1RZUEVfQlNTICAgICAgICAgMQorCisvLyEgQWRob2MgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZworI2RlZmluZSBXTEFOX1NDQU5fQlNTX1RZUEVfSUJTUyAgICAgICAgMgorCisvLyEgQWRob2Mgb3IgSW5mcmFzdHJ1Y3R1cmUgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZywgbm8gZmlsdGVyCisjZGVmaW5lIFdMQU5fU0NBTl9CU1NfVFlQRV9BTlkgICAgICAgICAzCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSB1c2VkIGludGVybmFsbHkgaW4gdGhlIHdsYW4gZHJpdmVyIHRvIGNvbmZpZ3VyZSBhIHNjYW4uCisgKgorICogU2VudCB0byB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIG1vZHVsZSB0byBjb25maWd1cmUgdGhlIGZpcm13YXJlCisgKiAgIHNjYW4gY29tbWFuZCBwcmVwYXJlZCBieSBsaWJlcnRhc19jbWRfODAyMTFfc2Nhbi4KKyAqCisgKiBAc2Egd2xhbl9zY2FuX25ldHdvcmtzCisgKgorICovCitzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcgeworICAgIC8qKgorICAgICAqICBAYnJpZWYgQlNTIHR5cGUgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEZpZWxkIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSB0eXBlcyBvZiBuZXR3b3JrcyByZXR1cm5lZCBpbiB0aGUKKyAgICAgKiAgICBzY2FuLiAgdmFsaWQgc2V0dGluZ3MgYXJlOgorICAgICAqCisgICAgICogICAtIFdMQU5fU0NBTl9CU1NfVFlQRV9CU1MgIChpbmZyYXN0cnVjdHVyZSkKKyAgICAgKiAgIC0gV0xBTl9TQ0FOX0JTU19UWVBFX0lCU1MgKGFkaG9jKQorICAgICAqICAgLSBXTEFOX1NDQU5fQlNTX1RZUEVfQU5ZICAodW5yZXN0cmljdGVkLCBhZGhvYyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCisgICAgICovCisJdTggYnNzdHlwZTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgU3BlY2lmaWMgQlNTSUQgdXNlZCB0byBmaWx0ZXIgc2NhbiByZXN1bHRzIGluIHRoZSBmaXJtd2FyZQorICAgICAqLworCXU4IHNwZWNpZmljQlNTSURbRVRIX0FMRU5dOworCisgICAgLyoqCisgICAgICogIEBicmllZiBsZW5ndGggb2YgVExWcyBzZW50IGluIGNvbW1hbmQgc3RhcnRpbmcgYXQgdGx2QnVmZmVyCisgICAgICovCisJaW50IHRsdmJ1ZmZlcmxlbjsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgU1NJRCBUTFYocykgYW5kIENoYW5MaXN0IFRMVnMgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEBzYSBUTFZfVFlQRV9DSEFOTElTVCwgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldF90CisgICAgICogIEBzYSBUTFZfVFlQRV9TU0lELCBtcnZsaWV0eXBlc19zc2lkcGFyYW1zZXRfdAorICAgICAqLworCXU4IHRsdmJ1ZmZlclsxXTsJLy8hPCBTU0lEIFRMVihzKSBhbmQgQ2hhbkxpc3QgVExWcyBhcmUgc3RvcmVkIGhlcmUKK307CisKKy8qKgorICogIEBicmllZiBJT0NUTCBjaGFubmVsIHN1Yi1zdHJ1Y3R1cmUgc2VudCBpbiB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcKKyAqCisgKiAgTXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBpbmNsdWRlZCBpbiB0aGUgSU9DVEwgY29tbWFuZAorICogICB0byBjb25maWd1cmUgYSBpbnN0YW5jZSBvZiBhIHNjYW4gb24gdGhlIHNwZWNpZmljIGNoYW5uZWwuCisgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jaGFuIHsKKwl1OCBjaGFubnVtYmVyOwkJLy8hPCBjaGFubmVsIE51bWJlciB0byBzY2FuCisJdTggcmFkaW90eXBlOwkJLy8hPCBSYWRpbyB0eXBlOiAnQi9HJyBiYW5kID0gMCwgJ0EnIGJhbmQgPSAxCisJdTggc2NhbnR5cGU7CQkvLyE8IFNjYW4gdHlwZTogQWN0aXZlID0gMCwgUGFzc2l2ZSA9IDEKKwl1MTYgc2NhbnRpbWU7CQkvLyE8IFNjYW4gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzOyBpZiAwIGRlZmF1bHQgdXNlZAorfTsKKworLyoqCisgKiAgQGJyaWVmIElPQ1RMIGlucHV0IHN0cnVjdHVyZSB0byBjb25maWd1cmUgYW4gaW1tZWRpYXRlIHNjYW4gY21kIHRvIGZpcm13YXJlCisgKgorICogIFVzZWQgaW4gdGhlIHNldHVzZXJzY2FuIChXTEFOX1NFVF9VU0VSX1NDQU4pIHByaXZhdGUgaW9jdGwuICBTcGVjaWZpZXMKKyAqICAgYSBudW1iZXIgb2YgcGFyYW1ldGVycyB0byBiZSB1c2VkIGluIGdlbmVyYWwgZm9yIHRoZSBzY2FuIGFzIHdlbGwKKyAqICAgYXMgYSBjaGFubmVsIGxpc3QgKHdsYW5faW9jdGxfdXNlcl9zY2FuX2NoYW4pIGZvciBlYWNoIHNjYW4gcGVyaW9kCisgKiAgIGRlc2lyZWQuCisgKgorICogIEBzYSBsaWJlcnRhc19zZXRfdXNlcl9zY2FuX2lvY3RsCisgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgeworCisgICAgLyoqCisgICAgICogIEBicmllZiBGbGFnIHNldCB0byBrZWVwIHRoZSBwcmV2aW91cyBzY2FuIHRhYmxlIGludGFjdAorICAgICAqCisgICAgICogIElmIHNldCwgdGhlIHNjYW4gcmVzdWx0cyB3aWxsIGFjY3VtdWxhdGUsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMKKyAgICAgKiAgIG1hdGNoZWQgZW50cmllcyBmb3IgYSBCU1Mgd2l0aCB0aGUgbmV3IHNjYW4gZGF0YQorICAgICAqLworCXU4IGtlZXBwcmV2aW91c3NjYW47CS8vITwgRG8gbm90IGVyYXNlIHRoZSBleGlzdGluZyBzY2FuIHJlc3VsdHMKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgQlNTIHR5cGUgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEZpZWxkIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSB0eXBlcyBvZiBuZXR3b3JrcyByZXR1cm5lZCBpbiB0aGUKKyAgICAgKiAgICBzY2FuLiAgdmFsaWQgc2V0dGluZ3MgYXJlOgorICAgICAqCisgICAgICogICAtIFdMQU5fU0NBTl9CU1NfVFlQRV9CU1MgIChpbmZyYXN0cnVjdHVyZSkKKyAgICAgKiAgIC0gV0xBTl9TQ0FOX0JTU19UWVBFX0lCU1MgKGFkaG9jKQorICAgICAqICAgLSBXTEFOX1NDQU5fQlNTX1RZUEVfQU5ZICAodW5yZXN0cmljdGVkLCBhZGhvYyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCisgICAgICovCisJdTggYnNzdHlwZTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgQ29uZmlndXJlIHRoZSBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgZm9yIGFjdGl2ZSBjaGFuIHNjYW5zCisgICAgICovCisJdTggbnVtcHJvYmVzOworCisgICAgLyoqCisgICAgICogIEBicmllZiBCU1NJRCBmaWx0ZXIgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZCB0byBsaW1pdCB0aGUgcmVzdWx0cworICAgICAqLworCXU4IHNwZWNpZmljQlNTSURbRVRIX0FMRU5dOworCisgICAgLyoqCisgICAgICogIEBicmllZiBTU0lEIGZpbHRlciBzZW50IGluIHRoZSBmaXJtd2FyZSBjb21tYW5kIHRvIGxpbWl0IHRoZSByZXN1bHRzCisgICAgICovCisJY2hhciBzcGVjaWZpY1NTSURbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgVmFyaWFibGUgbnVtYmVyIChmaXhlZCBtYXhpbXVtKSBvZiBjaGFubmVscyB0byBzY2FuIHVwCisgICAgICovCisJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NoYW4gY2hhbmxpc3RbV0xBTl9JT0NUTF9VU0VSX1NDQU5fQ0hBTl9NQVhdOworfTsKKworLyoqCisgKiAgQGJyaWVmIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZvciBlYWNoIGJlYWNvbi9wcm9iZSByZXNwb25zZQorICovCitzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgeworCXU4IG1hY2FkZHJlc3NbRVRIX0FMRU5dOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgc3NpZDsKKworCS8qIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50ICovCisJdTMyIHByaXZhY3k7CisKKwkvKiByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0gKi8KKwlsb25nIHJzc2k7CisKKwl1MzIgY2hhbm5lbDsKKworCXUxNiBiZWFjb25wZXJpb2Q7CisKKwl1MzIgYXRpbXdpbmRvdzsKKworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBpbmZyYW1vZGU7CisJdTggbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKworCWludCBleHRyYV9pZTsKKworCXU4IHRpbWVzdGFtcFs4XTsJLy8hPCBUU0YgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIGJlYWNvbi9wcm9iZSByZXNwb25zZQorCXVuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCBwaHlwYXJhbXNldDsKKwl1bmlvbiBJRUVFdHlwZXNfc3NwYXJhbXNldCBzc3BhcmFtc2V0OworCXN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyBjYXA7CisJdTggZGF0YXJhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKworCV9fbGU2NCBuZXR3b3JrdHNmOwkJLy8hPCBUU0YgdGltZXN0YW1wIGZyb20gdGhlIGN1cnJlbnQgZmlybXdhcmUgVFNGCisKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NvdW50cnlpbmZvZnVsbHNldCBjb3VudHJ5aW5mbzsKKworCXN0cnVjdCBXUEFfU1VQUExJQ0FOVCB3cGFfc3VwcGxpY2FudDsKKwlzdHJ1Y3QgV1BBX1NVUFBMSUNBTlQgd3BhMl9zdXBwbGljYW50OworCit9OworCitleHRlcm4gaW50IGxpYmVydGFzX1NTSURfY21wKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpzc2lkMSwKKwkJICAgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQyKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQsCisJCQkgIHU4ICogYnNzaWQsIGludCBtb2RlKTsKK2ludCBsaWJlcnRhc19maW5kX2Jlc3RfU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZmluZF9CU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIHU4ICogYnNzaWQsIGludCBtb2RlKTsKKworaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCXN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwU1NJRCwKKwkJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBwcmVmZXJyZWRfbW9kZSwKKwkJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAqb3V0X21vZGUpOworCitleHRlcm4gaW50IGxpYmVydGFzX3NlbmRfc3BlY2lmaWNfU1NJRF9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnByZXF1ZXN0ZWRzc2lkLAorCQkJCXU4IGtlZXBwcmV2aW91c3NjYW4pOworZXh0ZXJuIGludCBsaWJlcnRhc19zZW5kX3NwZWNpZmljX0JTU0lEX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgdTggKiBic3NpZCwgdTgga2VlcHByZXZpb3Vzc2Nhbik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfY21kXzgwMjExX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQl2b2lkICpwZGF0YV9idWYpOworCitleHRlcm4gaW50IGxpYmVydGFzX3JldF84MDIxMV9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKKworaW50IHdsYW5fc2Nhbl9uZXR3b3Jrcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKiBwdXNlcnNjYW5pbik7CisKK3N0cnVjdCBpZnJlcTsKKworc3RydWN0IGl3X3BvaW50Oworc3RydWN0IGl3X3BhcmFtOworc3RydWN0IGl3X3JlcXVlc3RfaW5mbzsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKTsKKworI2VuZGlmCQkJCS8qIF9XTEFOX1NDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdGhyZWFkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdiOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdGhyZWFkLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZglfX1dMQU5fVEhSRUFEX0hfCisjZGVmaW5lCV9fV0xBTl9USFJFQURfSF8KKworI2luY2x1ZGUJPGxpbnV4L2t0aHJlYWQuaD4KKworc3RydWN0IHdsYW5fdGhyZWFkIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJcGlkX3QgcGlkOworCXZvaWQgKnByaXY7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl9hY3RpdmF0ZV90aHJlYWQoc3RydWN0IHdsYW5fdGhyZWFkICogdGhyKQoreworCS8qKiBSZWNvcmQgdGhlIHRocmVhZCBwaWQgKi8KKwl0aHItPnBpZCA9IGN1cnJlbnQtPnBpZDsKKworCS8qKiBJbml0aWFsaXplIHRoZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhyLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2RlYWN0aXZhdGVfdGhyZWFkKHN0cnVjdCB3bGFuX3RocmVhZCAqIHRocikKK3sKKwlFTlRFUigpOworCisJdGhyLT5waWQgPSAwOworCisJTEVBVkUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsYW5fY3JlYXRlX3RocmVhZChpbnQgKCp3bGFuZnVuYykgKHZvaWQgKiksCisJCQkJICAgICAgc3RydWN0IHdsYW5fdGhyZWFkICogdGhyLCBjaGFyICpuYW1lKQoreworCXRoci0+dGFzayA9IGt0aHJlYWRfcnVuKHdsYW5mdW5jLCB0aHIsICIlcyIsIG5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoc3RydWN0IHdsYW5fdGhyZWFkICogdGhyKQoreworCUVOVEVSKCk7CisKKwkvKiBDaGVjayBpZiB0aGUgdGhyZWFkIGlzIGFjdGl2ZSBvciBub3QgKi8KKwlpZiAoIXRoci0+cGlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhyZWFkIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrdGhyZWFkX3N0b3AodGhyLT50YXNrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMDYyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKQEAgLTAsMCArMSwyODUgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFuZGxpbmcgb2YgVFggaW4gd2xhbiBkcml2ZXIuCisgICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJzYmkuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgIndleHQuaCIKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY29udmVydHMgVHgvUnggcmF0ZXMgZnJvbSBJRUVFODAyMTFfUkFESU9UQVBfUkFURQorICogIHVuaXRzICg1MDAgS2IvcykgaW50byBNYXJ2ZWxsIFdMQU4gZm9ybWF0IChzZWUgVGFibGUgOCBpbiBTZWN0aW9uIDMuMi4xKQorICoKKyAqICBAcGFyYW0gcmF0ZSAgICBJbnB1dCByYXRlCisgKiAgQHJldHVybiAgICAgIE91dHB1dCBSYXRlICgwIGlmIGludmFsaWQpCisgKi8KK3N0YXRpYyB1MzIgY29udmVydF9yYWRpb3RhcF9yYXRlX3RvX212KHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAyOgkJLyogICAxIE1icHMgKi8KKwkJcmV0dXJuIDAgfCAoMSA8PCA0KTsKKwljYXNlIDQ6CQkvKiAgIDIgTWJwcyAqLworCQlyZXR1cm4gMSB8ICgxIDw8IDQpOworCWNhc2UgMTE6CQkvKiA1LjUgTWJwcyAqLworCQlyZXR1cm4gMiB8ICgxIDw8IDQpOworCWNhc2UgMjI6CQkvKiAgMTEgTWJwcyAqLworCQlyZXR1cm4gMyB8ICgxIDw8IDQpOworCWNhc2UgMTI6CQkvKiAgIDYgTWJwcyAqLworCQlyZXR1cm4gNCB8ICgxIDw8IDQpOworCWNhc2UgMTg6CQkvKiAgIDkgTWJwcyAqLworCQlyZXR1cm4gNSB8ICgxIDw8IDQpOworCWNhc2UgMjQ6CQkvKiAgMTIgTWJwcyAqLworCQlyZXR1cm4gNiB8ICgxIDw8IDQpOworCWNhc2UgMzY6CQkvKiAgMTggTWJwcyAqLworCQlyZXR1cm4gNyB8ICgxIDw8IDQpOworCWNhc2UgNDg6CQkvKiAgMjQgTWJwcyAqLworCQlyZXR1cm4gOCB8ICgxIDw8IDQpOworCWNhc2UgNzI6CQkvKiAgMzYgTWJwcyAqLworCQlyZXR1cm4gOSB8ICgxIDw8IDQpOworCWNhc2UgOTY6CQkvKiAgNDggTWJwcyAqLworCQlyZXR1cm4gMTAgfCAoMSA8PCA0KTsKKwljYXNlIDEwODoJCS8qICA1NCBNYnBzICovCisJCXJldHVybiAxMSB8ICgxIDw8IDQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgc2luZ2xlIHBhY2tldCBhbmQgc2VuZHMKKyAqICB0byBJRiBsYXllcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBza2IgICAgIEEgcG9pbnRlciB0byBza2Igd2hpY2ggaW5jbHVkZXMgVFggcGFja2V0CisgKiAgQHJldHVybiAJICAgMCBvciAtMQorICovCitzdGF0aWMgaW50IFNlbmRTaW5nbGVQYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXN0cnVjdCB0eHBkIGxvY2FsdHhwZDsKKwlzdHJ1Y3QgdHhwZCAqcGxvY2FsdHhwZCA9ICZsb2NhbHR4cGQ7CisJdTggKnA4MDJ4X2hkcjsKKwlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpwcmFkaW90YXBfaGRyOworCXUzMiBuZXdfcmF0ZTsKKwl1OCAqcHRyID0gcHJpdi0+YWRhcHRlci0+dG1wdHhidWY7CisKKwlFTlRFUigpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPnN1cnByaXNlcmVtb3ZlZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKChwcml2LT5hZGFwdGVyLT5kZWJ1Z21vZGUgJiBNUlZEUlZfREVCVUdfVFhfUEFUSCkgIT0gMCkKKwkJbGJzX2RiZ19oZXgoIlRYIHBhY2tldDogIiwgc2tiLT5kYXRhLAorCQkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKCFza2ItPmxlbiB8fCAoc2tiLT5sZW4gPiBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJUeCBlcnJvcjogQmFkIHNrYiBsZW5ndGggJWQgOiAlZFxuIiwKKwkJICAgICAgIHNrYi0+bGVuLCBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtc2V0KHBsb2NhbHR4cGQsIDAsIHNpemVvZihzdHJ1Y3QgdHhwZCkpOworCisJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCA9IHNrYi0+bGVuOworCisJLyogb2Zmc2V0IG9mIGFjdHVhbCBkYXRhICovCisJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xvY2F0aW9uID0gc2l6ZW9mKHN0cnVjdCB0eHBkKTsKKworCS8qIFR4Q3RybCBzZXQgYnkgdXNlciBvciBkZWZhdWx0ICovCisJcGxvY2FsdHhwZC0+dHhfY29udHJvbCA9IGFkYXB0ZXItPnBrdHR4Y3RybDsKKworCXA4MDJ4X2hkciA9IHNrYi0+ZGF0YTsKKwlpZiAocHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID09IFdMQU5fUkFESU9NT0RFX1JBRElPVEFQKSB7CisKKwkJLyogbG9jYXRlIHJhZGlvdGFwIGhlYWRlciAqLworCQlwcmFkaW90YXBfaGRyID0gKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIgKilza2ItPmRhdGE7CisKKwkJLyogc2V0IHR4cGQgZmllbGRzIGZyb20gdGhlIHJhZGlvdGFwIGhlYWRlciAqLworCQluZXdfcmF0ZSA9IGNvbnZlcnRfcmFkaW90YXBfcmF0ZV90b19tdihwcmFkaW90YXBfaGRyLT5yYXRlKTsKKwkJaWYgKG5ld19yYXRlICE9IDApIHsKKwkJCS8qIGVyYXNlIHR4X2NvbnRyb2xbNDowXSAqLworCQkJcGxvY2FsdHhwZC0+dHhfY29udHJvbCAmPSB+MHgxZjsKKwkJCS8qIHdyaXRlIG5ldyB0eF9jb250cm9sWzQ6MF0gKi8KKwkJCXBsb2NhbHR4cGQtPnR4X2NvbnRyb2wgfD0gbmV3X3JhdGU7CisJCX0KKworCQkvKiBza2lwIHRoZSByYWRpb3RhcCBoZWFkZXIgKi8KKwkJcDgwMnhfaGRyICs9IHNpemVvZihzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyKTsKKwkJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCAtPSBzaXplb2Yoc3RydWN0IHR4X3JhZGlvdGFwX2hkcik7CisKKwl9CisJLyogY29weSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZyb20gODAyLjMgb3IgODAyLjExIGhlYWRlciAqLworCWlmIChwcml2LT5hZGFwdGVyLT5saW5rbW9kZSA9PSBXTEFOX0xJTktNT0RFXzgwMl8xMSkKKwkJbWVtY3B5KHBsb2NhbHR4cGQtPnR4X2Rlc3RfYWRkcl9oaWdoLCBwODAyeF9oZHIgKyA0LCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkocGxvY2FsdHhwZC0+dHhfZGVzdF9hZGRyX2hpZ2gsIHA4MDJ4X2hkciwgRVRIX0FMRU4pOworCisJbGJzX2RiZ19oZXgoInR4cGQiLCAodTggKikgcGxvY2FsdHhwZCwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CisKKwlpZiAoSVNfTUVTSF9GUkFNRShza2IpKSB7CisJCXBsb2NhbHR4cGQtPnR4X2NvbnRyb2wgfD0gVHhQRF9NRVNIX0ZSQU1FOworCX0KKworCW1lbWNweShwdHIsIHBsb2NhbHR4cGQsIHNpemVvZihzdHJ1Y3QgdHhwZCkpOworCisJcHRyICs9IHNpemVvZihzdHJ1Y3QgdHhwZCk7CisKKwlsYnNfZGJnX2hleCgiVHggRGF0YSIsICh1OCAqKSBwODAyeF9oZHIsIHBsb2NhbHR4cGQtPnR4X3BhY2tldF9sZW5ndGgpOworCW1lbWNweShwdHIsIHA4MDJ4X2hkciwgcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCk7CisJcmV0ID0gbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZChwcml2LCBNVk1TX0RBVCwKKwkJCSAgICAgICBwcml2LT5hZGFwdGVyLT50bXB0eGJ1ZiwKKwkJCSAgICAgICBwbG9jYWx0eHBkLT50eF9wYWNrZXRfbGVuZ3RoICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHR4cGQpKTsKKworCWlmIChyZXQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJUeCBlcnJvcjogbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCBmYWlsZWQ6IDB4JVhcbiIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlNlbmRTaW5nbGVQYWNrZXQgc3VjY2VlZHNcbiIpOworCisgICAgICBkb25lOgorCWlmICghcmV0KSB7CisJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfSBlbHNlIHsKKwkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisKKwlpZiAoIXJldCAmJiBwcml2LT5hZGFwdGVyLT5yYWRpb21vZGUgPT0gV0xBTl9SQURJT01PREVfUkFESU9UQVApIHsKKwkJLyogS2VlcCB0aGUgc2tiIHRvIGVjaG8gaXQgYmFjayBvbmNlIFR4IGZlZWRiYWNrIGlzCisJCSAgIHJlY2VpdmVkIGZyb20gRlcgKi8KKwkJc2tiX29ycGhhbihza2IpOworCQkvKiBzdG9wIHByb2Nlc3Npbmcgb3V0Z29pbmcgcGt0cyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCS8qIGZyZWV6ZSBhbnkgcGFja2V0cyBhbHJlYWR5IGluIG91ciBxdWV1ZXMgKi8KKwkJcHJpdi0+YWRhcHRlci0+VHhMb2NrRmxhZyA9IDE7CisJfSBlbHNlIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcHJpdi0+YWRhcHRlci0+Y3VycmVudHR4c2tiID0gTlVMTDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKwordm9pZCBsaWJlcnRhc190eF9ydW5xdWV1ZSh3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dHhfcXVldWVfaWR4OyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFkYXB0ZXItPnR4X3F1ZXVlX3BzW2ldOworCQlzcGluX3VubG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKKwkJU2VuZFNpbmdsZVBhY2tldChwcml2LCBza2IpOworCQlzcGluX2xvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisJfQorCWFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA9IDA7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5fdHhfcXVldWUod2xhbl9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisKKwlXQVJOX09OKHByaXYtPmFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA+PSBOUl9UWF9RVUVVRSk7CisJYWRhcHRlci0+dHhfcXVldWVfcHNbYWRhcHRlci0+dHhfcXVldWVfaWR4KytdID0gc2tiOworCWlmIChhZGFwdGVyLT50eF9xdWV1ZV9pZHggPT0gTlJfVFhfUVVFVUUpCisJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBjb25kaXRpb25zIGFuZCBzZW5kcyBwYWNrZXQgdG8gSUYKKyAqICBsYXllciBpZiBldmVyeXRoaW5nIGlzIG9rLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIG4vYQorICovCitpbnQgbGliZXJ0YXNfcHJvY2Vzc190eCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByZXQgPSAtMTsKKworCUVOVEVSKCk7CisKKwlsYnNfZGJnX2hleCgiVFggRGF0YSIsIHNrYi0+ZGF0YSwgbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgMTAwKSk7CisKKwlpZiAocHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50KSB7CisJCWxic19wcl9hbGVydCggIlRYIGVycm9yOiBkbmxkX3NlbnQgPSAlZCwgbm90IHNlbmRpbmdcbiIsCisJCSAgICAgICBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB8fAorCSAgICAocHJpdi0+YWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9QUkVfU0xFRVApKSB7CisJCXdsYW5fdHhfcXVldWUocHJpdiwgc2tiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcml2LT5hZGFwdGVyLT5jdXJyZW50dHhza2IgPSBza2I7CisKKwlyZXQgPSBTZW5kU2luZ2xlUGFja2V0KHByaXYsIHNrYik7Citkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gc2VuZHMgdG8gdGhlIGhvc3QgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgcGFja2V0LAorICogIGZpbGxpbmcgdGhlIHJhZGlvdGFwIGhlYWRlcnMgd2l0aCB0cmFuc21pc3Npb24gaW5mb3JtYXRpb24uCisgKgorICogIEBwYXJhbSBwcml2ICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBzdGF0dXMgICBBIDMyIGJpdCB2YWx1ZSBjb250YWluaW5nIHRyYW5zbWlzc2lvbiBzdGF0dXMuCisgKgorICogIEByZXR1cm5zIHZvaWQKKyAqLwordm9pZCBsaWJlcnRhc19zZW5kX3R4X2ZlZWRiYWNrKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpyYWRpb3RhcF9oZHI7CisJdTMyIHN0YXR1cyA9IGFkYXB0ZXItPmV2ZW50Y2F1c2U7CisJaW50IHR4ZmFpbDsKKwlpbnQgdHJ5X2NvdW50OworCisJaWYgKGFkYXB0ZXItPnJhZGlvbW9kZSAhPSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUCB8fAorCSAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmFkaW90YXBfaGRyID0gKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIgKilhZGFwdGVyLT5jdXJyZW50dHhza2ItPmRhdGE7CisKKwlpZiAoKGFkYXB0ZXItPmRlYnVnbW9kZSAmIE1SVkRSVl9ERUJVR19UWF9QQVRIKSAhPSAwKQorCQlsYnNfZGJnX2hleCgiVFggZmVlZGJhY2s6ICIsICh1OCAqKSByYWRpb3RhcF9oZHIsCisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGFkYXB0ZXItPmN1cnJlbnR0eHNrYi0+bGVuLCAxMDApKTsKKworCXR4ZmFpbCA9IChzdGF0dXMgPj4gMjQpOworCisjaWYgMAorCS8qIFRoZSB2ZXJzaW9uIG9mIHJvb2ZuZXQgdGhhdCB3ZSd2ZSB0ZXN0ZWQgZG9lcyBub3QgdXNlIHRoaXMgeWV0CisJICogQnV0IGl0IG1heSBiZSB1c2VkIGluIHRoZSBmdXR1cmUuCisJICovCisJaWYgKHR4ZmFpbCkKKwkJcmFkaW90YXBfaGRyLT5mbGFncyAmPSBJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9GQUlMOworI2VuZGlmCisJdHJ5X2NvdW50ID0gKHN0YXR1cyA+PiAxNikgJiAweGZmOworCXJhZGlvdGFwX2hkci0+ZGF0YV9yZXRyaWVzID0gKHRyeV9jb3VudCkgPworCSAgICAoMSArIGFkYXB0ZXItPnR4cmV0cnljb3VudCAtIHRyeV9jb3VudCkgOiAwOworCWxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQocHJpdiwgYWRhcHRlci0+Y3VycmVudHR4c2tiKTsKKwlhZGFwdGVyLT5jdXJyZW50dHhza2IgPSBOVUxMOworCXByaXYtPmFkYXB0ZXItPlR4TG9ja0ZsYWcgPSAwOworCWlmIChwcml2LT5hZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R5cGVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDYyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eXBlcy5oCkBAIC0wLDAgKzEsMjg5IEBACisvKioKKyAgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb24gZm9yIGdsb2JhbCB0eXBlcworICAqLworI2lmbmRlZiBfV0xBTl9UWVBFU18KKyNkZWZpbmUgX1dMQU5fVFlQRVNfCisKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisvKiogSUVFRSB0eXBlIGRlZmluaXRpb25zICAqLworZW51bSBpZWVldHlwZXNfZWxlbWVudGlkIHsKKwlTU0lEID0gMCwKKwlTVVBQT1JURURfUkFURVMsCisJRkhfUEFSQU1fU0VULAorCURTX1BBUkFNX1NFVCwKKwlDRl9QQVJBTV9TRVQsCisJVElNLAorCUlCU1NfUEFSQU1fU0VULAorCUNPVU5UUllfSU5GTyA9IDcsCisKKwlDSEFMTEVOR0VfVEVYVCA9IDE2LAorCisJRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTID0gNTAsCisKKwlWRU5ET1JfU1BFQ0lGSUNfMjIxID0gMjIxLAorCisJV1BBX0lFID0gMjIxLAorCVdQQTJfSUUgPSA0OCwKKworCUVYVFJBX0lFID0gMTMzLAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQ0FQSU5GT19NQVNLCSh+KDB4ZGEwMCkpCisKK3N0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyB7CisJdTggZXNzOjE7CisJdTggaWJzczoxOworCXU4IGNmcG9sbGFibGU6MTsKKwl1OCBjZnBvbGxycXN0OjE7CisJdTggcHJpdmFjeToxOworCXU4IHNob3J0cHJlYW1ibGU6MTsKKwl1OCBwYmNjOjE7CisJdTggY2hhbmFnaWxpdHk6MTsKKwl1OCBzcGVjdHJ1bW1nbXQ6MTsKKwl1OCByc3J2ZDM6MTsKKwl1OCBzaG9ydHNsb3R0aW1lOjE7CisJdTggYXBzZDoxOworCXU4IHJzdnJkMjoxOworCXU4IGRzc3NvZmRtOjE7CisJdTggcnNydmQxOjI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19jZnBhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXU4IGNmcGNudDsKKwl1OCBjZnBwZXJpb2Q7CisJdTE2IGNmcG1heGR1cmF0aW9uOworCXUxNiBjZnBkdXJhdGlvbnJlbWFpbmluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3N0cnVjdCBpZWVldHlwZXNfaWJzc3BhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXUxNiBhdGltd2luZG93OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3VuaW9uIElFRUV0eXBlc19zc3BhcmFtc2V0IHsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQgY2ZwYXJhbXNldDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCBpYnNzcGFyYW1zZXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXUxNiBkd2VsbHRpbWU7CisJdTggaG9wc2V0OworCXU4IGhvcHBhdHRlcm47CisJdTggaG9waW5kZXg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXU4IGN1cnJlbnRjaGFuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3VuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCB7CisJc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0IGZocGFyYW1zZXQ7CisJc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0IGRzcGFyYW1zZXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19hc3NvY3JzcCB7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvIGNhcGFiaWxpdHk7CisJdTE2IHN0YXR1c2NvZGU7CisJdTE2IGFpZDsKKwl1OCBpZWJ1ZmZlclsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogVExWICB0eXBlIElEIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgUFJPUFJJRVRBUllfVExWX0JBU0VfSUQJCTB4MDEwMAorCisvKiBUZXJtaW5hdGluZyBUTFYgdHlwZSAqLworI2RlZmluZSBNUlZMX1RFUk1JTkFURV9UTFZfSUQJCTB4ZmZmZgorCisjZGVmaW5lIFRMVl9UWVBFX1NTSUQJCQkJMHgwMDAwCisjZGVmaW5lIFRMVl9UWVBFX1JBVEVTCQkJCTB4MDAwMQorI2RlZmluZSBUTFZfVFlQRV9QSFlfRkgJCQkJMHgwMDAyCisjZGVmaW5lIFRMVl9UWVBFX1BIWV9EUwkJCQkweDAwMDMKKyNkZWZpbmUgVExWX1RZUEVfQ0YJCQkJICAgIDB4MDAwNAorI2RlZmluZSBUTFZfVFlQRV9JQlNTCQkJCTB4MDAwNgorCisjZGVmaW5lIFRMVl9UWVBFX0RPTUFJTgkJCQkweDAwMDcKKworI2RlZmluZSBUTFZfVFlQRV9QT1dFUl9DQVBBQklMSVRZCTB4MDAyMQorCisjZGVmaW5lIFRMVl9UWVBFX0tFWV9NQVRFUklBTCAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAwKQorI2RlZmluZSBUTFZfVFlQRV9DSEFOTElTVCAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMSkKKyNkZWZpbmUgVExWX1RZUEVfTlVNUFJPQkVTICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIpCisjZGVmaW5lIFRMVl9UWVBFX1JTU0lfTE9XICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyA0KQorI2RlZmluZSBUTFZfVFlQRV9TTlJfTE9XICAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgNSkKKyNkZWZpbmUgVExWX1RZUEVfRkFJTENPVU5UICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDYpCisjZGVmaW5lIFRMVl9UWVBFX0JDTk1JU1MgICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyA3KQorI2RlZmluZSBUTFZfVFlQRV9MRURfR1BJTyAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgOCkKKyNkZWZpbmUgVExWX1RZUEVfTEVEQkVIQVZJT1IgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDkpCisjZGVmaW5lIFRMVl9UWVBFX1BBU1NUSFJPVUdIICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxMCkKKyNkZWZpbmUgVExWX1RZUEVfUkVBU1NPQ0FQICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDExKQorI2RlZmluZSBUTFZfVFlQRV9QT1dFUl9UQkxfMl80R0haICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTIpCisjZGVmaW5lIFRMVl9UWVBFX1BPV0VSX1RCTF81R0haICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxMykKKyNkZWZpbmUgVExWX1RZUEVfQkNBU1RQUk9CRQkgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTQpCisjZGVmaW5lIFRMVl9UWVBFX05VTVNTSURfUFJPQkUJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE1KQorI2RlZmluZSBUTFZfVFlQRV9XTU1RU1RBVFVTICAgCSAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNikKKyNkZWZpbmUgVExWX1RZUEVfQ1JZUFRPX0RBVEEJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE3KQorI2RlZmluZSBUTFZfVFlQRV9XSUxEQ0FSRFNTSUQJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE4KQorI2RlZmluZSBUTFZfVFlQRV9UU0ZUSU1FU1RBTVAJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE5KQorI2RlZmluZSBUTFZfVFlQRV9SU1NJX0hJR0ggICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMjIpCisjZGVmaW5lIFRMVl9UWVBFX1NOUl9ISUdIICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMykKKworLyoqIFRMViByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyovCitzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgeworCXUxNiB0eXBlOworCXUxNiBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX2RhdGEgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggRGF0YVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfcmF0ZXNwYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCByYXRlc1sxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IHNzaWRbMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3dpbGRjYXJkc3NpZHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IE1heFNzaWRsZW5ndGg7CisJdTggc3NpZFsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY2hhbnNjYW5tb2RlIHsKKwl1OCBwYXNzaXZlc2NhbjoxOworCXU4IGRpc2FibGVjaGFuZmlsdDoxOworCXU4IHJlc2VydmVkXzJfNzo2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjaGFuc2NhbnBhcmFtc2V0IHsKKwl1OCByYWRpb3R5cGU7CisJdTggY2hhbm51bWJlcjsKKwlzdHJ1Y3QgY2hhbnNjYW5tb2RlIGNoYW5zY2FubW9kZTsKKwl1MTYgbWluc2NhbnRpbWU7CisJdTE2IG1heHNjYW50aW1lOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0IGNoYW5zY2FucGFyYW1bMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNmcGFyYW1zZXQgeworCXU4IGNmcGNudDsKKwl1OCBjZnBwZXJpb2Q7CisJdTE2IGNmcG1heGR1cmF0aW9uOworCXUxNiBjZnBkdXJhdGlvbnJlbWFpbmluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWJzc3BhcmFtc2V0IHsKKwl1MTYgYXRpbXdpbmRvdzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NwYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBjZnBhcmFtc2V0IGNmcGFyYW1zZXRbMV07CisJCXN0cnVjdCBpYnNzcGFyYW1zZXQgaWJzc3BhcmFtc2V0WzFdOworCX0gY2ZfaWJzczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZmhwYXJhbXNldCB7CisJdTE2IGR3ZWxsdGltZTsKKwl1OCBob3BzZXQ7CisJdTggaG9wcGF0dGVybjsKKwl1OCBob3BpbmRleDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZHNwYXJhbXNldCB7CisJdTggY3VycmVudGNoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3BoeXBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXVuaW9uIHsKKwkJc3RydWN0IGZocGFyYW1zZXQgZmhwYXJhbXNldFsxXTsKKwkJc3RydWN0IGRzcGFyYW1zZXQgZHNwYXJhbXNldFsxXTsKKwl9IGZoX2RzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19yc25wYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCByc25pZVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfdHNmdGltZXN0YW1wIHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCV9fbGU2NCB0c2Z0YWJsZVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogIExvY2FsIFBvd2VyIGNhcGFiaWxpdHkgKi8KK3N0cnVjdCBtcnZsaWV0eXBlc19wb3dlcmNhcGFiaWxpdHkgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJczggbWlucG93ZXI7CisJczggbWF4cG93ZXI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggcnNzaXZhbHVlOworCXU4IHJzc2lmcmVxOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggc25ydmFsdWU7CisJdTggc25yZnJlcTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfZmFpbHVyZWNvdW50IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IGZhaWx2YWx1ZTsKKwl1OCBGYWlsZnJlcTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfYmVhY29uc21pc3NlZCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCBiZWFjb25taXNzZWQ7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcyB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1MTYgbnVtcHJvYmVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19iY2FzdHByb2JlIHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXUxNiBiY2FzdHByb2JlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19udW1zc2lkcHJvYmUgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTE2IG51bXNzaWRwcm9iZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbGVkX3BpbiB7CisJdTggbGVkOworCXU4IHBpbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3QgbGVkX3BpbiBsZWRwaW5bMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmCQkJCS8qIF9XTEFOX1RZUEVTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmY2NWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBEUklWRVJfUkVMRUFTRV9WRVJTSU9OICIzMjAucDAiCitjb25zdCBjaGFyIGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uW10gPSAiQ09NTS1VU0I4Mzg4LSIgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTgorI2lmZGVmICBERUJVRworICAgICItZGJnIgorI2VuZGlmCisgICAgIiI7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTIzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKQEAgLTAsMCArMSwyNzY5IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgaW9jdGwgZnVuY3Rpb25zCisgICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInJhZGlvdGFwLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJhc3NvYy5oIgorCisKKy8qKgorICogIEBicmllZiBDb252ZXJ0IG13IHZhbHVlIHRvIGRibSB2YWx1ZQorICoKKyAqICBAcGFyYW0gbXcJICAgdGhlIHZhbHVlIG9mIG13CisgKiAgQHJldHVybiAJICAgdGhlIHZhbHVlIG9mIGRibQorICovCitzdGF0aWMgaW50IG13X3RvX2RibShpbnQgbXcpCit7CisJaWYgKG13IDwgMikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobXcgPCAzKQorCQlyZXR1cm4gMzsKKwllbHNlIGlmIChtdyA8IDQpCisJCXJldHVybiA1OworCWVsc2UgaWYgKG13IDwgNikKKwkJcmV0dXJuIDc7CisJZWxzZSBpZiAobXcgPCA3KQorCQlyZXR1cm4gODsKKwllbHNlIGlmIChtdyA8IDgpCisJCXJldHVybiA5OworCWVsc2UgaWYgKG13IDwgMTApCisJCXJldHVybiAxMDsKKwllbHNlIGlmIChtdyA8IDEzKQorCQlyZXR1cm4gMTE7CisJZWxzZSBpZiAobXcgPCAxNikKKwkJcmV0dXJuIDEyOworCWVsc2UgaWYgKG13IDwgMjApCisJCXJldHVybiAxMzsKKwllbHNlIGlmIChtdyA8IDI1KQorCQlyZXR1cm4gMTQ7CisJZWxzZSBpZiAobXcgPCAzMikKKwkJcmV0dXJuIDE1OworCWVsc2UgaWYgKG13IDwgNDApCisJCXJldHVybiAxNjsKKwllbHNlIGlmIChtdyA8IDUwKQorCQlyZXR1cm4gMTc7CisJZWxzZSBpZiAobXcgPCA2MykKKwkJcmV0dXJuIDE4OworCWVsc2UgaWYgKG13IDwgNzkpCisJCXJldHVybiAxOTsKKwllbHNlIGlmIChtdyA8IDEwMCkKKwkJcmV0dXJuIDIwOworCWVsc2UKKwkJcmV0dXJuIDIxOworfQorCisvKioKKyAqICBAYnJpZWYgRmluZCB0aGUgY2hhbm5lbCBmcmVxdWVuY3kgcG93ZXIgaW5mbyB3aXRoIHNwZWNpZmljIGNoYW5uZWwKKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgCUEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIgc3RydWN0dXJlCisgKiAgQHBhcmFtIGJhbmQJCWl0IGNhbiBiZSBCQU5EX0EsIEJBTkRfRyBvciBCQU5EX0IKKyAqICBAcGFyYW0gY2hhbm5lbCAgICAgIHRoZSBjaGFubmVsIGZvciBsb29raW5nCisgKiAgQHJldHVybiAJICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmaW5kLgorICovCitzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpsaWJlcnRhc19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsKHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsCisJCQkJCQkgdTggYmFuZCwgdTE2IGNoYW5uZWwpCit7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwID0gTlVMTDsKKwlzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwgKnJjOworCWludCBjb3VudCA9IHNpemVvZihhZGFwdGVyLT5yZWdpb25fY2hhbm5lbCkgLworCSAgICBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbMF0pOworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgIWNmcCAmJiAoaiA8IGNvdW50KTsgaisrKSB7CisJCXJjID0gJmFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsW2pdOworCisJCWlmIChhZGFwdGVyLT5lbmFibGUxMWQpCisJCQlyYyA9ICZhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtqXTsKKwkJaWYgKCFyYy0+dmFsaWQgfHwgIXJjLT5DRlApCisJCQljb250aW51ZTsKKwkJaWYgKHJjLT5iYW5kICE9IGJhbmQpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHJjLT5ucmNmcDsgaSsrKSB7CisJCQlpZiAocmMtPkNGUFtpXS5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJCQljZnAgPSAmcmMtPkNGUFtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghY2ZwICYmIGNoYW5uZWwpCisJCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbCgpOiBjYW5ub3QgZmluZCAiCisJCSAgICAgICAiY2ZwIGJ5IGJhbmQgJWQgJiBjaGFubmVsICVkXG4iLCBiYW5kLCBjaGFubmVsKTsKKworCXJldHVybiBjZnA7Cit9CisKKy8qKgorICogIEBicmllZiBGaW5kIHRoZSBjaGFubmVsIGZyZXF1ZW5jeSBwb3dlciBpbmZvIHdpdGggc3BlY2lmaWMgZnJlcXVlbmN5CisgKgorICogIEBwYXJhbSBhZGFwdGVyIAlBIHBvaW50ZXIgdG8gd2xhbl9hZGFwdGVyIHN0cnVjdHVyZQorICogIEBwYXJhbSBiYW5kCQlpdCBjYW4gYmUgQkFORF9BLCBCQU5EX0cgb3IgQkFORF9CCisgKiAgQHBhcmFtIGZyZXEJICAgICAgICB0aGUgZnJlcXVlbmN5IGZvciBsb29raW5nCisgKiAgQHJldHVybiAJICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmaW5kLgorICovCitzdGF0aWMgc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqZmluZF9jZnBfYnlfYmFuZF9hbmRfZnJlcSh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCQkJICAgICB1OCBiYW5kLCB1MzIgZnJlcSkKK3sKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnAgPSBOVUxMOworCXN0cnVjdCByZWdpb25fY2hhbm5lbCAqcmM7CisJaW50IGNvdW50ID0gc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSAvCisJICAgIHNpemVvZihhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFswXSk7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyAhY2ZwICYmIChqIDwgY291bnQpOyBqKyspIHsKKwkJcmMgPSAmYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbal07CisKKwkJaWYgKGFkYXB0ZXItPmVuYWJsZTExZCkKKwkJCXJjID0gJmFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2pdOworCQlpZiAoIXJjLT52YWxpZCB8fCAhcmMtPkNGUCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmMtPmJhbmQgIT0gYmFuZCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgcmMtPm5yY2ZwOyBpKyspIHsKKwkJCWlmIChyYy0+Q0ZQW2ldLmZyZXEgPT0gZnJlcSkgeworCQkJCWNmcCA9ICZyYy0+Q0ZQW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFjZnAgJiYgZnJlcSkKKwkJbGJzX3ByX2RlYnVnKDEsICJmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxbCgpOiBjYW5ub3QgZmluZCBjZnAgYnkgIgorCQkgICAgICAgImJhbmQgJWQgJiBmcmVxICVkXG4iLCBiYW5kLCBmcmVxKTsKKworCXJldHVybiBjZnA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlY3VycmVudGNoYW5uZWwod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiogdGhlIGNoYW5uZWwgaW4gZi93IGNvdWxkIGJlIG91dCBvZiBzeW5jLCBnZXQgdGhlIGN1cnJlbnQgY2hhbm5lbAorCSAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3JmX2NoYW5uZWwsCisJCQkJICAgIGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfZ2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJbGJzX3ByX2RlYnVnKDEsICJDdXJyZW50IGNoYW5uZWwgPSAlZFxuIiwKKwkgICAgICAgcHJpdi0+YWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRjdXJyZW50Y2hhbm5lbCh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgY2hhbm5lbCkKK3sKKwlsYnNfcHJfZGVidWcoMSwgIlNldCBjaGFubmVsID0gJWRcbiIsIGNoYW5uZWwpOworCisJLyoKKwkgKiogIEN1cnJlbnQgY2hhbm5lbCBpcyBub3Qgc2V0IHRvIGFkaG9jY2hhbm5lbCByZXF1ZXN0ZWQsIHNldCBjaGFubmVsCisJICovCisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9yZl9jaGFubmVsLAorCQkJCSAgICAgIGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfc2V0LAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJmNoYW5uZWwpKTsKK30KKworc3RhdGljIGludCBjaGFuZ2VhZGhvY2NoYW5uZWwod2xhbl9wcml2YXRlICogcHJpdiwgaW50IGNoYW5uZWwpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWFkYXB0ZXItPmFkaG9jY2hhbm5lbCA9IGNoYW5uZWw7CisKKwl1cGRhdGVjdXJyZW50Y2hhbm5lbChwcml2KTsKKworCWlmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbCA9PSBhZGFwdGVyLT5hZGhvY2NoYW5uZWwpIHsKKwkJLyogYWRob2NjaGFubmVsIGlzIHNldCB0byB0aGUgY3VycmVudCBjaGFubmVsIGFscmVhZHkgKi8KKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJVcGRhdGluZyBjaGFubmVsIGZyb20gJWQgdG8gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsLCBhZGFwdGVyLT5hZGhvY2NoYW5uZWwpOworCisJc2V0Y3VycmVudGNoYW5uZWwocHJpdiwgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKworCXVwZGF0ZWN1cnJlbnRjaGFubmVsKHByaXYpOworCisJaWYgKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsICE9IGFkYXB0ZXItPmFkaG9jY2hhbm5lbCkgeworCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCB0byB1cGRhdGVkIGNoYW5uZWwgdG8gJWQsIGNoYW5uZWwgPSAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmFkaG9jY2hhbm5lbCwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCQlMRUFWRSgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQlpbnQgaTsKKwkJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgY3VyYWRob2Nzc2lkOworCisJCWxic19wcl9kZWJ1ZygxLCAiY2hhbm5lbCBDaGFuZ2VkIHdoaWxlIGluIGFuIElCU1NcbiIpOworCisJCS8qIENvcHkgdGhlIGN1cnJlbnQgc3NpZCAqLworCQltZW1jcHkoJmN1cmFkaG9jc3NpZCwgJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisKKwkJLyogRXhpdCBBZGhvYyBtb2RlICovCisJCWxic19wcl9kZWJ1ZygxLCAiSW4gY2hhbmdlYWRob2NjaGFubmVsKCk6IFNlbmRpbmcgQWRob2MgU3RvcFxuIik7CisJCXJldCA9IGxpYmVydGFzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKworCQlpZiAocmV0KSB7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBTY2FuIGZvciB0aGUgbmV0d29yaywgZG8gbm90IHNhdmUgcHJldmlvdXMgcmVzdWx0cy4gIFN0YWxlCisJCSAqICAgc2NhbiBkYXRhIHdpbGwgY2F1c2UgdXMgdG8gam9pbiBhIG5vbi1leGlzdGFudCBhZGhvYyBuZXR3b3JrCisJCSAqLworCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmY3VyYWRob2Nzc2lkLCAwKTsKKworCQkvLyBmaW5kIG91dCB0aGUgQlNTSUQgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IFNTSUQKKwkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsICZjdXJhZGhvY3NzaWQsIE5VTEwsCisJCQkJICAgd2xhbjgwMl8xMWlic3MpOworCisJCWlmIChpID49IDApIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCBmb3VuZCBhdCAlZCBpbiBMaXN0LCIKKwkJCSAgICAgICAic28gam9pblxuIiwgaSk7CisJCQlsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcmsocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CisJCX0gZWxzZSB7CisJCQkvLyBlbHNlIHNlbmQgU1RBUlQgY29tbWFuZAorCQkJbGJzX3ByX2RlYnVnKDEsICJTU0lEIG5vdCBmb3VuZCBpbiBsaXN0LCAiCisJCQkgICAgICAgInNvIGNyZWF0aW5nIGFkaG9jIHdpdGggc3NpZCA9ICVzXG4iLAorCQkJICAgICAgIGN1cmFkaG9jc3NpZC5zc2lkKTsKKwkJCWxpYmVydGFzX3N0YXJ0X2FkaG9jX25ldHdvcmsocHJpdiwgJmN1cmFkaG9jc3NpZCk7CisJCX0JCS8vIGVuZCBvZiBlbHNlIChTVEFSVCBjb21tYW5kKQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgUmFkaW8gT24vT0ZGCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBvcHRpb24gCQkJUmFkaW8gT3B0aW9uCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworaW50IHdsYW5fcmFkaW9faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgdTggb3B0aW9uKQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJaWYgKGFkYXB0ZXItPnJhZGlvb24gIT0gb3B0aW9uKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiU3dpdGNoaW5nICVzIHRoZSBSYWRpb1xuIiwgb3B0aW9uID8gIk9uIiA6ICJPZmYiKTsKKwkJYWRhcHRlci0+cmFkaW9vbiA9IG9wdGlvbjsKKworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfcmFkaW9fY29udHJvbCwKKwkJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBDb3B5IHJhdGVzCisgKgorICogIEBwYXJhbSBkZXN0ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gRGVzdCBCdWYKKyAqICBAcGFyYW0gc3JjCQkgICAgICAgIEEgcG9pbnRlciB0byBTcmMgQnVmCisgKiAgQHBhcmFtIGxlbiAgICAgICAgICAgICAgICAgIFRoZSBsZW4gb2YgU3JjIEJ1ZgorICogIEByZXR1cm4gCSAgIAkgICAgICAgIE51bWJlciBvZiByYXRlcyBjb3B5ZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29weXJhdGVzKHU4ICogZGVzdCwgaW50IHBvcywgdTggKiBzcmMsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHNyY1tpXTsgaSsrLCBwb3MrKykgeworCQlpZiAocG9zID49IHNpemVvZih1OCkgKiBXTEFOX1NVUFBPUlRFRF9SQVRFUykKKwkJCWJyZWFrOworCQlkZXN0W3Bvc10gPSBzcmNbaV07CisJfQorCisJcmV0dXJuIHBvczsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldCBhY3RpdmUgZGF0YSByYXRlcworICoKKyAqICBAcGFyYW0gYWRhcHRlciAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmF0ZQkJICAgICAgICBUaGUgYnVmIHRvIHJldHVybiB0aGUgYWN0aXZlIHJhdGVzCisgKiAgQHJldHVybiAJICAgCSAgICAgICAgVGhlIG51bWJlciBvZiByYXRlcworICovCitzdGF0aWMgaW50IGdldF9hY3RpdmVfZGF0YV9yYXRlcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCSB1OCogcmF0ZXMpCit7CisJaW50IGsgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCS8vSW5mcmEuIG1vZGUKKwkJCWxic19wcl9kZWJ1ZygxLCAiSW5mcmFcbiIpOworCQkJayA9IGNvcHlyYXRlcyhyYXRlcywgaywgbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzLAorCQkJCSAgICAgIHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpKTsKKwkJfSBlbHNlIHsKKwkJCS8vYWQtaG9jIG1vZGUKKwkJCWxic19wcl9kZWJ1ZygxLCAiQWRob2MgR1xuIik7CisJCQlrID0gY29weXJhdGVzKHJhdGVzLCBrLCBsaWJlcnRhc19hZGhvY19yYXRlc19nLAorCQkJCSAgICAgIHNpemVvZihsaWJlcnRhc19hZGhvY19yYXRlc19nKSk7CisJCX0KKwl9IGVsc2UgeworCQlrID0gY29weXJhdGVzKHJhdGVzLCAwLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLAorCQkJICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMpOworCX0KKworCUxFQVZFKCk7CisKKwlyZXR1cm4gazsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgY2hhciAqY3dycSwgY2hhciAqZXh0cmEpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciBjb21tWzZdID0geyAiQ09NTS0iIH07CisJY2hhciBtcnZsWzZdID0geyAiTVJWTC0iIH07CisJaW50IGNudDsKKworCUVOVEVSKCk7CisKKwlzdHJjcHkoY3dycSwgbXJ2bCk7CisKKwljcCA9IHN0cnN0cihsaWJlcnRhc19kcml2ZXJfdmVyc2lvbiwgY29tbSk7CisJaWYgKGNwID09IGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uKQkvL3NraXAgbGVhZGluZyAiQ09NTS0iCisJCWNwID0gbGliZXJ0YXNfZHJpdmVyX3ZlcnNpb24gKyBzdHJsZW4oY29tbSk7CisJZWxzZQorCQljcCA9IGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uOworCisJY250ID0gc3RybGVuKG1ydmwpOworCWN3cnEgKz0gY250OworCXdoaWxlIChjbnQgPCAxNiAmJiAoKmNwICE9ICctJykpIHsKKwkJKmN3cnErKyA9IHRvdXBwZXIoKmNwKyspOworCQljbnQrKzsKKwl9CisJKmN3cnEgPSAnXDAnOworCisJTEVBVkUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCisJRU5URVIoKTsKKworCWNmcCA9IGxpYmVydGFzX2ZpbmRfY2ZwX2J5X2JhbmRfYW5kX2NoYW5uZWwoYWRhcHRlciwgMCwKKwkJCQkJICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCisJaWYgKCFjZnApIHsKKwkJaWYgKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsKQorCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGNoYW5uZWw9JWRcbiIsCisJCQkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmd3JxLT5tID0gKGxvbmcpY2ZwLT5mcmVxICogMTAwMDAwOworCWZ3cnEtPmUgPSAxOworCisJbGJzX3ByX2RlYnVnKDEsICJmcmVxPSV1XG4iLCBmd3JxLT5tKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJfQorCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyoKKwkgKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCisJICovCisKKwlpZiAoZHdycS0+bGVuZ3RoID4gMTYpIHsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwltZW1zZXQoYWRhcHRlci0+bm9kZW5hbWUsIDAsIHNpemVvZihhZGFwdGVyLT5ub2RlbmFtZSkpOworCW1lbWNweShhZGFwdGVyLT5ub2RlbmFtZSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyoKKwkgKiBHZXQgdGhlIE5pY2sgTmFtZSBzYXZlZAorCSAqLworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJc3RybmNweShleHRyYSwgYWRhcHRlci0+bm9kZW5hbWUsIDE2KTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJZXh0cmFbMTZdID0gJ1wwJzsKKworCS8qCisJICogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0CisJICovCisKKwkvKgorCSAqIFB1c2ggaXQgb3V0ICEKKwkgKi8KKwlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBydGhyID0gdndycS0+dmFsdWU7CisKKwlFTlRFUigpOworCisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCWFkYXB0ZXItPnJ0c3Roc2QgPSBydGhyID0gTVJWRFJWX1JUU19NQVhfVkFMVUU7CisJfSBlbHNlIHsKKwkJaWYgKHJ0aHIgPCBNUlZEUlZfUlRTX01JTl9WQUxVRSB8fCBydGhyID4gTVJWRFJWX1JUU19NQVhfVkFMVUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRhcHRlci0+cnRzdGhzZCA9IHJ0aHI7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfc25tcF9taWIsCisJCQkJICAgIGNtZF9hY3Rfc2V0LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCwgJnJ0aHIpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5ydHN0aHNkID0gMDsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9nZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xELCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdndycS0+dmFsdWUgPSBhZGFwdGVyLT5ydHN0aHNkOworCXZ3cnEtPmRpc2FibGVkID0gKCh2d3JxLT52YWx1ZSA8IE1SVkRSVl9SVFNfTUlOX1ZBTFVFKQorCQkJICB8fCAodndycS0+dmFsdWUgPiBNUlZEUlZfUlRTX01BWF9WQUxVRSkpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGZ0aHIgPSB2d3JxLT52YWx1ZTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJYWRhcHRlci0+ZnJhZ3Roc2QgPSBmdGhyID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOworCX0gZWxzZSB7CisJCWlmIChmdGhyIDwgTVJWRFJWX0ZSQUdfTUlOX1ZBTFVFCisJCSAgICB8fCBmdGhyID4gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFkYXB0ZXItPmZyYWd0aHNkID0gZnRocjsKKwl9CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9zZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgJmZ0aHIpOworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5mcmFndGhzZCA9IDA7CisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfc25tcF9taWIsCisJCQkJICAgIGNtZF9hY3RfZ2V0LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IGFkYXB0ZXItPmZyYWd0aHNkOworCXZ3cnEtPmRpc2FibGVkID0gKCh2d3JxLT52YWx1ZSA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSkKKwkJCSAgfHwgKHZ3cnEtPnZhbHVlID4gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFKSk7CisJdndycS0+Zml4ZWQgPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCB1MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmluZnJhbW9kZSkgeworCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKKwkJYnJlYWs7CisKKwljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKKwkJKnV3cnEgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246CisJCSp1d3JxID0gSVdfTU9ERV9BVVRPOworCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfcmZfdHhfcG93ZXIsCisJCQkJICAgIGNtZF9hY3RfdHhfcG93ZXJfb3B0X2dldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWlmIChyZXQpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlRYUE9XRVIgR0VUICVkIGRibS5cbiIsIGFkYXB0ZXItPnR4cG93ZXJsZXZlbCk7CisJdndycS0+dmFsdWUgPSBhZGFwdGVyLT50eHBvd2VybGV2ZWw7CisJdndycS0+Zml4ZWQgPSAxOworCWlmIChhZGFwdGVyLT5yYWRpb29uKSB7CisJCXZ3cnEtPmRpc2FibGVkID0gMDsKKwkJdndycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07CisJfSBlbHNlIHsKKwkJdndycS0+ZGlzYWJsZWQgPSAxOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAodndycS0+ZmxhZ3MgPT0gSVdfUkVUUllfTElNSVQpIHsKKwkJLyogVGhlIE1BQyBoYXMgYSA0LWJpdCBUb3RhbF9UeF9Db3VudCByZWdpc3RlcgorCQkgICBUb3RhbF9UeF9Db3VudCA9IDEgKyBUeF9SZXRyeV9Db3VudCAqLworI2RlZmluZSBUWF9SRVRSWV9NSU4gMAorI2RlZmluZSBUWF9SRVRSWV9NQVggMTQKKwkJaWYgKHZ3cnEtPnZhbHVlIDwgVFhfUkVUUllfTUlOIHx8IHZ3cnEtPnZhbHVlID4gVFhfUkVUUllfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQWRkaW5nIDEgdG8gY29udmVydCByZXRyeSBjb3VudCB0byB0cnkgY291bnQgKi8KKwkJYWRhcHRlci0+dHhyZXRyeWNvdW50ID0gdndycS0+dmFsdWUgKyAxOworCisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3NubXBfbWliLAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCSAgICBPSURfODAyXzExX1RYX1JFVFJZQ09VTlQsIE5VTEwpOworCisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisJYWRhcHRlci0+dHhyZXRyeWNvdW50ID0gMDsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9nZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5ULCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCXZ3cnEtPmRpc2FibGVkID0gMDsKKwlpZiAoIXZ3cnEtPmZsYWdzKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCS8qIFN1YnRyYWN0IDEgdG8gY29udmVydCB0cnkgY291bnQgdG8gcmV0cnkgY291bnQgKi8KKwkJdndycS0+dmFsdWUgPSBhZGFwdGVyLT50eHJldHJ5Y291bnQgLSAxOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3J0X2NoYW5uZWxzKHN0cnVjdCBpd19mcmVxICpmcmVxLCBpbnQgbnVtKQoreworCWludCBpLCBqOworCXN0cnVjdCBpd19mcmVxIHRlbXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWZvciAoaiA9IGkgKyAxOyBqIDwgbnVtOyBqKyspCisJCQlpZiAoZnJlcVtpXS5pID4gZnJlcVtqXS5pKSB7CisJCQkJdGVtcC5pID0gZnJlcVtpXS5pOworCQkJCXRlbXAubSA9IGZyZXFbaV0ubTsKKworCQkJCWZyZXFbaV0uaSA9IGZyZXFbal0uaTsKKwkJCQlmcmVxW2ldLm0gPSBmcmVxW2pdLm07CisKKwkJCQlmcmVxW2pdLmkgPSB0ZW1wLmk7CisJCQkJZnJlcVtqXS5tID0gdGVtcC5tOworCQkJfQorfQorCisvKiBkYXRhIHJhdGUgbGlzdGluZworCU1VTFRJX0JBTkRTOgorCQlhYmcJCWEJYgliL2cKKyAgIEluZnJhIAlHKDEyKQkJQSg4KQlCKDQpCUcoMTIpCisgICBBZGhvYyAJQStCKDEyKQkJQSg4KQlCKDQpCUIoNCkKKworCW5vbi1NVUxUSV9CQU5EUzoKKwkJCQkJYgliL2cKKyAgIEluZnJhIAkgICAgIAkJICAgIAlCKDQpCUcoMTIpCisgICBBZGhvYyAJICAgICAgCQkgICAgCUIoNCkJQig0KQorICovCisvKioKKyAqICBAYnJpZWYgR2V0IFJhbmdlIEluZm8KKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgaSwgajsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKKwl1OCByYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107CisKKwl1OCBmbGFnID0gMDsKKworCUVOVEVSKCk7CisKKwlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT5taW5fbndpZCA9IDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMDsKKworCW1lbXNldChyYXRlcywgMCwgc2l6ZW9mKHJhdGVzKSk7CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGdldF9hY3RpdmVfZGF0YV9yYXRlcyhhZGFwdGVyLCByYXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWluX3QoX191OCwgcmFuZ2UtPm51bV9iaXRyYXRlcywgSVdfTUFYX0JJVFJBVEVTKSAmJiByYXRlc1tpXTsKKwkgICAgIGkrKykgeworCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IChyYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwOworCX0KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKKwlsYnNfcHJfZGVidWcoMSwgIklXX01BWF9CSVRSQVRFUz0lZCBudW1fYml0cmF0ZXM9JWRcbiIsIElXX01BWF9CSVRSQVRFUywKKwkgICAgICAgcmFuZ2UtPm51bV9iaXRyYXRlcyk7CisKKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJdTggY2hhbl9ubzsKKwkJdTggYmFuZDsKKworCQlzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqcGFyc2VkX3JlZ2lvbl9jaGFuID0KKwkJICAgICZhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW47CisKKwkJaWYgKHBhcnNlZF9yZWdpb25fY2hhbiA9PSBOVUxMKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDpwYXJzZWRfcmVnaW9uX2NoYW4gaXMgTlVMTFxuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmFuZCA9IHBhcnNlZF9yZWdpb25fY2hhbi0+YmFuZDsKKwkJbGJzX3ByX2RlYnVnKDEsICJiYW5kPSVkIE5vT2ZDaGFuPSVkXG4iLCBiYW5kLAorCQkgICAgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuKTsKKworCQlmb3IgKGkgPSAwOyAocmFuZ2UtPm51bV9mcmVxdWVuY3kgPCBJV19NQVhfRlJFUVVFTkNJRVMpCisJCSAgICAgJiYgKGkgPCBwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW4pOyBpKyspIHsKKwkJCWNoYW5fbm8gPSBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbjsKKwkJCWxic19wcl9kZWJ1ZygxLCAiY2hhbl9ubz0lZFxuIiwgY2hhbl9ubyk7CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0uaSA9IChsb25nKWNoYW5fbm87CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0ubSA9CisJCQkgICAgKGxvbmcpbGliZXJ0YXNfY2hhbl8yX2ZyZXEoY2hhbl9ubywgYmFuZCkgKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0uZSA9IDE7CisJCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSsrOworCQl9CisJCWZsYWcgPSAxOworCX0KKwlpZiAoIWZsYWcpIHsKKwkJZm9yIChqID0gMDsgKHJhbmdlLT5udW1fZnJlcXVlbmN5IDwgSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkgICAgICYmIChqIDwgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKQorCQkJIC8gc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsWzBdKSk7IGorKykgeworCQkJY2ZwID0gYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbal0uQ0ZQOworCQkJZm9yIChpID0gMDsgKHJhbmdlLT5udW1fZnJlcXVlbmN5IDwgSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJICAgICAmJiBhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtqXS52YWxpZAorCQkJICAgICAmJiBjZnAKKwkJCSAgICAgJiYgKGkgPCBhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtqXS5ucmNmcCk7IGkrKykgeworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5pID0KKwkJCQkgICAgKGxvbmcpY2ZwLT5jaGFubmVsOworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5tID0KKwkJCQkgICAgKGxvbmcpY2ZwLT5mcmVxICogMTAwMDAwOworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5lID0gMTsKKwkJCQljZnArKzsKKwkJCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSsrOworCQkJfQorCQl9CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJJV19NQVhfRlJFUVVFTkNJRVM9JWQgbnVtX2ZyZXF1ZW5jeT0lZFxuIiwKKwkgICAgICAgSVdfTUFYX0ZSRVFVRU5DSUVTLCByYW5nZS0+bnVtX2ZyZXF1ZW5jeSk7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3k7CisKKwlzb3J0X2NoYW5uZWxzKCZyYW5nZS0+ZnJlcVswXSwgcmFuZ2UtPm51bV9mcmVxdWVuY3kpOworCisJLyoKKwkgKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0IGluIGJpdC9zIHRoYXQgd2UgY2FuCisJICogZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlCisJICovCisJaWYgKGkgPiAyKQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDUwMDAgKiAxMDAwOworCWVsc2UKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSAxNTAwICogMTAwMDsKKworCXJhbmdlLT5taW5fcnRzID0gTVJWRFJWX1JUU19NSU5fVkFMVUU7CisJcmFuZ2UtPm1heF9ydHMgPSBNUlZEUlZfUlRTX01BWF9WQUxVRTsKKwlyYW5nZS0+bWluX2ZyYWcgPSBNUlZEUlZfRlJBR19NSU5fVkFMVUU7CisJcmFuZ2UtPm1heF9mcmFnID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOworCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCisJcmFuZ2UtPm1pbl9wbXAgPSAxMDAwMDAwOworCXJhbmdlLT5tYXhfcG1wID0gMTIwMDAwMDAwOworCXJhbmdlLT5taW5fcG10ID0gMTAwMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDEwMDAwMDA7CisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCS8qCisJICogTWluaW11bSB2ZXJzaW9uIHdlIHJlY29tbWVuZAorCSAqLworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE1OworCisJLyoKKwkgKiBWZXJzaW9uIHdlIGFyZSBjb21waWxlZCB3aXRoCisJICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCisJcmFuZ2UtPm1pbl9yZXRyeSA9IFRYX1JFVFJZX01JTjsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gVFhfUkVUUllfTUFYOworCisJLyoKKwkgKiBTZXQgdGhlIHF1YWwsIGxldmVsIGFuZCBub2lzZSByYW5nZSB2YWx1ZXMKKwkgKi8KKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDcwOworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKKworCS8qCisJICogU2V0dXAgdGhlIHN1cHBvcnRlZCBwb3dlciBsZXZlbCByYW5nZXMKKwkgKi8KKwltZW1zZXQocmFuZ2UtPnR4cG93ZXIsIDAsIHNpemVvZihyYW5nZS0+dHhwb3dlcikpOworCXJhbmdlLT50eHBvd2VyWzBdID0gNTsKKwlyYW5nZS0+dHhwb3dlclsxXSA9IDc7CisJcmFuZ2UtPnR4cG93ZXJbMl0gPSA5OworCXJhbmdlLT50eHBvd2VyWzNdID0gMTE7CisJcmFuZ2UtPnR4cG93ZXJbNF0gPSAxMzsKKwlyYW5nZS0+dHhwb3dlcls1XSA9IDE1OworCXJhbmdlLT50eHBvd2VyWzZdID0gMTc7CisJcmFuZ2UtPnR4cG93ZXJbN10gPSAxOTsKKworCXJhbmdlLT5udW1fdHhwb3dlciA9IDg7CisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKwlyYW5nZS0+dHhwb3dlcl9jYXBhIHw9IElXX1RYUE9XX1JBTkdFOworCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJaWYgKGFkYXB0ZXItPmZ3Y2FwaW5mbyAmIEZXX0NBUElORk9fV1BBKSB7CisJCXJhbmdlLT5lbmNfY2FwYSA9ICAgSVdfRU5DX0NBUEFfV1BBCisJCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfV1BBMgorCQkgICAgICAgICAgICAgICAgICB8IElXX0VOQ19DQVBBX0NJUEhFUl9US0lQCisJCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCS8qIFBTIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlCisJICogUmVtb3ZlIHRoaXMgY2hlY2sgaWYgaXQgaXMgdG8gYmUgc3VwcG9ydGVkIGluIElCU1MgbW9kZSBhbHNvCisJICovCisKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbTsKKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJTZXR0aW5nIHBvd2VyIHRpbWVvdXQgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9QRVJJT0QpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTZXR0aW5nIHBvd2VyIHBlcmlvZCBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+cHNtb2RlICE9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW0pIHsKKwkJcmV0dXJuIDA7CisJfQorCisJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3A7CisKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCWxpYmVydGFzX3BzX3NsZWVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBtb2RlOworCisJRU5URVIoKTsKKworCW1vZGUgPSBhZGFwdGVyLT5wc21vZGU7CisKKwlpZiAoKHZ3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbSkpCisJICAgIHx8IGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Rpc2Nvbm5lY3RlZCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKgorICogaXdwcml2IHNldHRhYmxlIGNhbGxiYWNrcworICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdsYW5fcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisJTlVMTCwJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdsYW5fcHJpdmF0ZV9hcmdzW10gPSB7CisJLyoKKwkgKiB7IGNtZCwgc2V0X2FyZ3MsIGdldF9hcmdzLCBuYW1lIH0KKwkgKi8KKwl7CisJIFdMQU5TQ0FOX1RZUEUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCA4LAorCSAic2NhbnR5cGUifSwKKworCXsKKwkgV0xBTl9TRVRJTlRfR0VUSU5ULAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICIifSwKKwl7CisJIFdMQU5ORiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0TkYifSwKKwl7CisJIFdMQU5SU1NJLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRSU1NJIn0sCisJeworCSBXTEFORU5BQkxFMTFELAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJlbmFibGUxMWQifSwKKwl7CisJIFdMQU5BREhPQ0dSQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJhZGhvY2dyYXRlIn0sCisKKwl7CisJIFdMQU5fU1VCQ01EX1NFVF9QUkVTQ0FOLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJwcmVzY2FuIn0sCisJeworCSBXTEFOX1NFVE9ORUlOVF9HRVRPTkVJTlQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgIiJ9LAorCXsKKwkgV0xBTl9CRUFDT05fSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgImJjbmludGVydmFsIn0sCisJeworCSBXTEFOX0xJU1RFTklOVFJWTCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSAibG9saXN0ZW5pbnRlciJ9LAorCXsKKwkgV0xBTl9UWENPTlRST0wsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgInR4Y29udHJvbCJ9LAorCXsKKwkgV0xBTl9OVUxMUEtUSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgInBzbnVsbGludGVydmFsIn0sCisJLyogVXNpbmcgaXdwcml2IHN1Yi1jb21tYW5kIGZlYXR1cmUgKi8KKwl7CisJIFdMQU5fU0VUT05FSU5UX0dFVE5PTkUsCS8qIElPQ1RMOiAyNCAqLworCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICIifSwKKworCXsKKwkgV0xBTl9TVUJDTURfU0VUUlhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRyeGFudCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXR0eGFudCJ9LAorCXsKKwkgV0xBTlNFVEFVVEhBTEcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImF1dGhhbGdzIiwKKwkgfSwKKwl7CisJIFdMQU5TRVQ4MDIxWEFVVEhBTEcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIjgwMjF4YXV0aGFsZ3MiLAorCSB9LAorCXsKKwkgV0xBTlNFVEVOQ1JZUFRJT05NT0RFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJlbmNyeXB0aW9ubW9kZSIsCisJIH0sCisJeworCSBXTEFOU0VUUkVHSU9OLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRyZWdpb25jb2RlIn0sCisJeworCSBXTEFOX1NFVF9MSVNURU5fSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgInNldGxpc3RlbmludGVyIn0sCisJeworCSBXTEFOX1NFVF9NVUxUSVBMRV9EVElNLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRtdWx0aXBsZWR0aW0ifSwKKwl7CisJIFdMQU5fU0VUX0FUSU1fV0lORE9XLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJhdGltd2luZG93In0sCisJeworCSBXTEFOU0VUQkNOQVZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRiY25hdmcifSwKKwl7CisJIFdMQU5TRVREQVRBQVZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRkYXRhYXZnIn0sCisJeworCSBXTEFOX1NFVF9MSU5LTU9ERSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAibGlua21vZGUifSwKKwl7CisJIFdMQU5fU0VUX1JBRElPTU9ERSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAicmFkaW9tb2RlIn0sCisJeworCSBXTEFOX1NFVF9ERUJVR01PREUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImRlYnVnbW9kZSJ9LAorCXsKKwkgV0xBTl9TVUJDTURfTUVTSF9TRVRfVFRMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJtZXNoX3NldF90dGwifSwKKwl7CisJIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIiJ9LAorCXsKKwkgV0xBTkdFVFJFR0lPTiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0cmVnaW9uY29kZSJ9LAorCXsKKwkgV0xBTl9HRVRfTElTVEVOX0lOVEVSVkFMLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRsaXN0ZW5pbnRlciJ9LAorCXsKKwkgV0xBTl9HRVRfTVVMVElQTEVfRFRJTSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0bXVsdGlwbGVkdGltIn0sCisJeworCSBXTEFOX0dFVF9UWF9SQVRFLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXR0eHJhdGUifSwKKwl7CisJIFdMQU5HRVRCQ05BVkcsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldGJjbmF2ZyJ9LAorCXsKKwkgV0xBTl9HRVRfTElOS01PREUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9saW5rbW9kZSJ9LAorCXsKKwkgV0xBTl9HRVRfUkFESU9NT0RFLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfcmFkaW9tb2RlIn0sCisJeworCSBXTEFOX0dFVF9ERUJVR01PREUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9kZWJ1Z21vZGUifSwKKwl7CisJIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJmd3RfY2xlYW51cCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX1RJTUUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImZ3dF90aW1lIn0sCisJeworCSBXTEFOX1NVQkNNRF9NRVNIX0dFVF9UVEwsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIm1lc2hfZ2V0X3R0bCJ9LAorCXsKKwkgV0xBTl9TRVROT05FX0dFVFRXRUxWRV9DSEFSLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKKwkgIiJ9LAorCXsKKwkgV0xBTl9TVUJDTURfR0VUUlhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKKwkgImdldHJ4YW50In0sCisJeworCSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyLAorCSAiZ2V0dHhhbnQifSwKKwl7CisJIFdMQU5fR0VUX1RTRiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsCisJICJnZXR0c2YifSwKKwl7CisJIFdMQU5fU0VUTk9ORV9HRVROT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICIifSwKKwl7CisJIFdMQU5ERUFVVEgsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImRlYXV0aCJ9LAorCXsKKwkgV0xBTkFESE9DU1RPUCwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAiYWRob2NzdG9wIn0sCisJeworCSBXTEFOUkFESU9PTiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAicmFkaW9vbiJ9LAorCXsKKwkgV0xBTlJBRElPT0ZGLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJyYWRpb29mZiJ9LAorCXsKKwkgV0xBTldMQU5JRExFT04sCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIndsYW5pZGxlLW9uIn0sCisJeworCSBXTEFOV0xBTklETEVPRkYsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIndsYW5pZGxlLW9mZiJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX1JFU0VULAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJmd3RfcmVzZXQifSwKKwl7CisJIFdMQU5fU1VCQ01EX0JUX1JFU0VULAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJidF9yZXNldCJ9LAorCXsKKwkgV0xBTl9TRVQxMjhDSEFSX0dFVDEyOENIQVIsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgIiJ9LAorCS8qIEJUIE1hbmFnZW1lbnQgKi8KKwl7CisJIFdMQU5fU1VCQ01EX0JUX0FERCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiYnRfYWRkIn0sCisJeworCSBXTEFOX1NVQkNNRF9CVF9ERUwsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgImJ0X2RlbCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfQlRfTElTVCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiYnRfbGlzdCJ9LAorCS8qIEZXVCBNYW5hZ2VtZW50ICovCisJeworCSBXTEFOX1NVQkNNRF9GV1RfQURELAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfYWRkIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfREVMLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfZGVsIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfTE9PS1VQLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfbG9va3VwIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfTElTVF9ORUlHSEJPUiwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiZnd0X2xpc3RfbmVpZ2gifSwKKwl7CisJIFdMQU5fU1VCQ01EX0ZXVF9MSVNULAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfbGlzdCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX0xJU1RfUk9VVEUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgImZ3dF9saXN0X3JvdXRlIn0sCisJeworCSBXTEFOU0NBTl9NT0RFLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJzY2FubW9kZSJ9LAorCXsKKwkgV0xBTl9HRVRfQURIT0NfU1RBVFVTLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJnZXRhZGhvY3N0YXR1cyJ9LAorCXsKKwkgV0xBTl9TRVROT05FX0dFVFdPUkRDSEFSLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICIifSwKKwl7CisJIFdMQU5TRVRXUEFJRSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyNCwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXR3cGFpZSJ9LAorCXsKKwkgV0xBTkdFVExPRywKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgR0VUTE9HX0JVRlNJWkUsCisJICJnZXRsb2cifSwKKwl7CisJIFdMQU5fU0VUX0dFVF9TSVhURUVOX0lOVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICIifSwKKwl7CisJIFdMQU5fVFBDQ0ZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInRwY2NmZyJ9LAorCXsKKwkgV0xBTl9QT1dFUkNGRywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJwb3dlcmNmZyJ9LAorCXsKKwkgV0xBTl9BVVRPX0ZSRVFfU0VULAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInNldGFmYyJ9LAorCXsKKwkgV0xBTl9BVVRPX0ZSRVFfR0VULAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgImdldGFmYyJ9LAorCXsKKwkgV0xBTl9TQ0FOUFJPQkVTLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInNjYW5wcm9iZXMifSwKKwl7CisJIFdMQU5fTEVEX0dQSU9fQ1RSTCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJsZWRncGlvIn0sCisJeworCSBXTEFOX0FEQVBUX1JBVEVTRVQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSAicmF0ZWFkYXB0In0sCisJeworCSBXTEFOX0lOQUNUSVZJVFlfVElNRU9VVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJpbmFjdGl2aXR5dG8ifSwKKwl7CisJIFdMQU5TTlIsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSAiZ2V0U05SIn0sCisJeworCSBXTEFOX0dFVF9SQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgImdldHJhdGUifSwKKwl7CisJIFdMQU5fR0VUX1JYSU5GTywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJnZXRyeGluZm8ifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd2xhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbnVtIHsKKwkJUE9PUiA9IDMwLAorCQlGQUlSID0gNjAsCisJCUdPT0QgPSA4MCwKKwkJVkVSWV9HT09EID0gOTAsCisJCUVYQ0VMTEVOVCA9IDk1LAorCQlQRVJGRUNUID0gMTAwCisJfTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1MzIgcnNzaV9xdWFsOworCXUzMiB0eF9xdWFsOworCXUzMiBxdWFsaXR5ID0gMDsKKwlpbnQgc3RhdHNfdmFsaWQgPSAwOworCXU4IHJzc2k7CisJdTMyIHR4X3JldHJpZXM7CisKKwlFTlRFUigpOworCisJcHJpdi0+d3N0YXRzLnN0YXR1cyA9IGFkYXB0ZXItPmluZnJhbW9kZTsKKworCS8qIElmIHdlJ3JlIG5vdCBhc3NvY2lhdGVkLCBhbGwgcXVhbGl0eSB2YWx1ZXMgYXJlIG1lYW5pbmdsZXNzICovCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkKKwkJZ290byBvdXQ7CisKKwkvKiBRdWFsaXR5IGJ5IFJTU0kgKi8KKwlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10sCisJICAgICBhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOworCisJaWYgKGFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9PSAwKSB7CisJCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gTVJWRFJWX05GX0RFRkFVTFRfU0NBTl9WQUxVRTsKKwl9IGVsc2UgeworCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9CisJCSAgICBDQUxfTkYoYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlNpZ25hbCBMZXZlbCA9ICUjeFxuIiwgcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwpOworCWxic19wcl9kZWJ1ZygxLCAiTm9pc2UgPSAlI3hcbiIsIHByaXYtPndzdGF0cy5xdWFsLm5vaXNlKTsKKworCXJzc2kgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbCAtIHByaXYtPndzdGF0cy5xdWFsLm5vaXNlOworCWlmIChyc3NpIDwgMTUpCisJCXJzc2lfcXVhbCA9IHJzc2kgKiBQT09SIC8gMTA7CisJZWxzZSBpZiAocnNzaSA8IDIwKQorCQlyc3NpX3F1YWwgPSAocnNzaSAtIDE1KSAqIChGQUlSIC0gUE9PUikgLyA1ICsgUE9PUjsKKwllbHNlIGlmIChyc3NpIDwgMzApCisJCXJzc2lfcXVhbCA9IChyc3NpIC0gMjApICogKEdPT0QgLSBGQUlSKSAvIDUgKyBGQUlSOworCWVsc2UgaWYgKHJzc2kgPCA0MCkKKwkJcnNzaV9xdWFsID0gKHJzc2kgLSAzMCkgKiAoVkVSWV9HT09EIC0gR09PRCkgLworCQkgICAgMTAgKyBHT09EOworCWVsc2UKKwkJcnNzaV9xdWFsID0gKHJzc2kgLSA0MCkgKiAoUEVSRkVDVCAtIFZFUllfR09PRCkgLworCQkgICAgMTAgKyBWRVJZX0dPT0Q7CisJcXVhbGl0eSA9IHJzc2lfcXVhbDsKKworCS8qIFF1YWxpdHkgYnkgVFggZXJyb3JzICovCisJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHByaXYtPnN0YXRzLnR4X2Vycm9yczsKKworCXR4X3JldHJpZXMgPSBhZGFwdGVyLT5sb2dtc2cucmV0cnk7CisKKwlpZiAodHhfcmV0cmllcyA+IDc1KQorCQl0eF9xdWFsID0gKDkwIC0gdHhfcmV0cmllcykgKiBQT09SIC8gMTU7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDcwKQorCQl0eF9xdWFsID0gKDc1IC0gdHhfcmV0cmllcykgKiAoRkFJUiAtIFBPT1IpIC8gNSArIFBPT1I7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDY1KQorCQl0eF9xdWFsID0gKDcwIC0gdHhfcmV0cmllcykgKiAoR09PRCAtIEZBSVIpIC8gNSArIEZBSVI7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDUwKQorCQl0eF9xdWFsID0gKDY1IC0gdHhfcmV0cmllcykgKiAoVkVSWV9HT09EIC0gR09PRCkgLworCQkgICAgMTUgKyBHT09EOworCWVsc2UKKwkJdHhfcXVhbCA9ICg1MCAtIHR4X3JldHJpZXMpICoKKwkJICAgIChQRVJGRUNUIC0gVkVSWV9HT09EKSAvIDUwICsgVkVSWV9HT09EOworCXF1YWxpdHkgPSBtaW4ocXVhbGl0eSwgdHhfcXVhbCk7CisKKwlwcml2LT53c3RhdHMuZGlzY2FyZC5jb2RlID0gYWRhcHRlci0+bG9nbXNnLndlcHVuZGVjcnlwdGFibGU7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQuZnJhZ21lbnQgPSBhZGFwdGVyLT5sb2dtc2cuZmNzZXJyb3I7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHR4X3JldHJpZXM7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQubWlzYyA9IGFkYXB0ZXItPmxvZ21zZy5hY2tmYWlsdXJlOworCisJLyogQ2FsY3VsYXRlIHF1YWxpdHkgKi8KKwlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gbWF4KHF1YWxpdHksICh1MzIpMTAwKTsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOworCXN0YXRzX3ZhbGlkID0gMTsKKworCS8qIHVwZGF0ZSBzdGF0cyBhc3luY2hyb25vdXNseSBmb3IgZnV0dXJlIGNhbGxzICovCisJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcnNzaSwgMCwKKwkJCQkJMCwgMCwgTlVMTCk7CisJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZ2V0X2xvZywgMCwKKwkJCQkJMCwgMCwgTlVMTCk7CitvdXQ6CisJaWYgKCFzdGF0c192YWxpZCkgeworCQlwcml2LT53c3RhdHMubWlzcy5iZWFjb24gPSAwOworCQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOworCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQgfAorCQkgICAgSVdfUVVBTF9RVUFMX0lOVkFMSUQgfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJfQorCisJTEVBVkUgKCk7CisJcmV0dXJuICZwcml2LT53c3RhdHM7CisKKworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCisJRU5URVIoKTsKKworCS8qCisJICogSWYgc2V0dGluZyBieSBmcmVxdWVuY3ksIGNvbnZlcnQgdG8gYSBjaGFubmVsCisJICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCisJCWxvbmcgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCWludCBjID0gMDsKKworCQljZnAgPSBmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxKGFkYXB0ZXIsIDAsIGYpOworCQlpZiAoIWNmcCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGZyZXE9JWxkXG4iLCBmKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYyA9IChpbnQpY2ZwLT5jaGFubmVsOworCisJCWlmIChjIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWZ3cnEtPmUgPSAwOworCQlmd3JxLT5tID0gYzsKKwl9CisKKwkvKgorCSAqIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwkgKi8KKwlpZiAoZndycS0+bSA+IDEwMDAgfHwgZndycS0+ZSA+IDApIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CisKKwkJY2ZwID0gbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbChhZGFwdGVyLCAwLCBjaGFubmVsKTsKKwkJaWYgKCFjZnApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKKwkJCQlyYyA9IGNoYW5nZWFkaG9jY2hhbm5lbChwcml2LCBjaGFubmVsKTsKKwkJCQkvKiAgSWYgc3RhdGlvbiBpcyBXRVAgZW5hYmxlZCwgc2VuZCB0aGUKKwkJCQkgKiAgY29tbWFuZCB0byBzZXQgV0VQIGluIGZpcm13YXJlCisJCQkJICovCisJCQkJaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJICAgIHdsYW44MDJfMTFXRVBlbmFibGVkKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAic2V0X2ZyZXE6IFdFUCBlbmFibGVkXG4iKTsKKwkJCQkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJCSAgICBjbWRfODAyXzExX3NldF93ZXAsCisJCQkJCQkJCSAgICBjbWRfYWN0X2FkZCwKKwkJCQkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkJCQkJICAgIDAsCisJCQkJCQkJCSAgICBOVUxMKTsKKworCQkJCQlpZiAocmV0KSB7CisJCQkJCQlMRUFWRSgpOworCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJfQorCisJCQkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCQkJICAgIGNtZF9hY3RfbWFjX3dlcF9lbmFibGU7CisKKwkJCQkJbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHByaXYpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqICBAYnJpZWYgdXNlIGluZGV4IHRvIGdldCB0aGUgZGF0YSByYXRlCisgKgorICogIEBwYXJhbSBpbmRleCAgICAgICAgICAgICAgICBUaGUgaW5kZXggb2YgZGF0YSByYXRlCisgKiAgQHJldHVybiAJICAgCQlkYXRhIHJhdGUgb3IgMAorICovCit1MzIgbGliZXJ0YXNfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4KQoreworCWlmIChpbmRleCA+PSBzaXplb2YobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzKSkKKwkJaW5kZXggPSAwOworCisJcmV0dXJuIGxpYmVydGFzX3dsYW5fZGF0YV9yYXRlc1tpbmRleF07Cit9CisKKy8qKgorICogIEBicmllZiB1c2UgcmF0ZSB0byBnZXQgdGhlIGluZGV4CisgKgorICogIEBwYXJhbSByYXRlICAgICAgICAgICAgICAgICBkYXRhIHJhdGUKKyAqICBAcmV0dXJuIAkgICAJCWluZGV4IG9yIDAKKyAqLwordTggbGliZXJ0YXNfZGF0YV9yYXRlX3RvX2luZGV4KHUzMiByYXRlKQoreworCXU4ICpwdHI7CisKKwlpZiAocmF0ZSkKKwkJaWYgKChwdHIgPSBtZW1jaHIobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzLCAodTgpIHJhdGUsCisJCQkJICBzaXplb2YobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzKSkpKQorCQkJcmV0dXJuIChwdHIgLSBsaWJlcnRhc193bGFuX2RhdGFfcmF0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTMyIGRhdGFfcmF0ZTsKKwl1MTYgYWN0aW9uOworCWludCByZXQgPSAwOworCXU4IHJhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCAqcmF0ZTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlZ3cnEtPnZhbHVlID0gJWRcbiIsIHZ3cnEtPnZhbHVlKTsKKworCWlmICh2d3JxLT52YWx1ZSA9PSAtMSkgeworCQlhY3Rpb24gPSBjbWRfYWN0X3NldF90eF9hdXRvOwkvLyBBdXRvCisJCWFkYXB0ZXItPmlzX2RhdGFyYXRlX2F1dG8gPSAxOworCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHZ3cnEtPnZhbHVlICUgMTAwMDAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRhdGFfcmF0ZSA9IHZ3cnEtPnZhbHVlIC8gNTAwMDAwOworCisJCW1lbXNldChyYXRlcywgMCwgc2l6ZW9mKHJhdGVzKSk7CisJCWdldF9hY3RpdmVfZGF0YV9yYXRlcyhhZGFwdGVyLCByYXRlcyk7CisJCXJhdGUgPSByYXRlczsKKwkJd2hpbGUgKCpyYXRlKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIlJhdGU9MHglWCAgV2FudGVkPTB4JVhcbiIsICpyYXRlLAorCQkJICAgICAgIGRhdGFfcmF0ZSk7CisJCQlpZiAoKCpyYXRlICYgMHg3ZikgPT0gKGRhdGFfcmF0ZSAmIDB4N2YpKQorCQkJCWJyZWFrOworCQkJcmF0ZSsrOworCQl9CisJCWlmICghKnJhdGUpIHsKKwkJCWxic19wcl9hbGVydCggIlRoZSBmaXhlZCBkYXRhIHJhdGUgMHglWCBpcyBvdXQgIgorCQkJICAgICAgICJvZiByYW5nZS5cbiIsIGRhdGFfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWFkYXB0ZXItPmRhdGFyYXRlID0gZGF0YV9yYXRlOworCQlhY3Rpb24gPSBjbWRfYWN0X3NldF90eF9maXhfcmF0ZTsKKwkJYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0byA9IDA7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZGF0YV9yYXRlLAorCQkJCSAgICBhY3Rpb24sIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJaWYgKGFkYXB0ZXItPmlzX2RhdGFyYXRlX2F1dG8pIHsKKwkJdndycS0+Zml4ZWQgPSAwOworCX0gZWxzZSB7CisJCXZ3cnEtPmZpeGVkID0gMTsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IGFkYXB0ZXItPmRhdGFyYXRlICogNTAwMDAwOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7CisJZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG5ld19tb2RlOworCisJRU5URVIoKTsKKworCXN3aXRjaCAoKnV3cnEpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgYWQtaG9jOiBjdXJyZW50IGRhdGFyYXRlPSUjeFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmRhdGFyYXRlKTsKKwkJbmV3X21vZGUgPSB3bGFuODAyXzExaWJzczsKKwkJYWRhcHRlci0+YWRob2NjaGFubmVsID0gREVGQVVMVF9BRF9IT0NfQ0hBTk5FTDsKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgSW5mcmFzdHJ1Y3R1cmVcbiIpOworCQluZXdfbW9kZSA9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZTsKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfQVVUTzoKKwkJbGJzX3ByX2RlYnVnKDEsICJXYW50ZWQgbW9kZSBpcyBBdXRvXG4iKTsKKwkJbmV3X21vZGUgPSB3bGFuODAyXzExYXV0b3Vua25vd247CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJXYW50ZWQgbW9kZSBpcyBVbmtub3duOiAweCV4XG4iLCAqdXdycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFzc29jX3JlcSA9IHdsYW5fZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QoYWRhcHRlcik7CisJaWYgKCFhc3NvY19yZXEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQlhc3NvY19yZXEtPm1vZGUgPSBuZXdfbW9kZTsKKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiAgQGJyaWVmIEdldCBFbmNyeXB0aW9uIGtleQorICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHBhcmFtIGluZm8JCQlBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQorICogIEBwYXJhbSB2d3JxIAkJQSBwb2ludGVyIHRvIGl3X3BhcmFtIHN0cnVjdHVyZQorICogIEBwYXJhbSBleHRyYQkJQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIHU4ICogZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJmbGFncz0weCV4IGluZGV4PSVkIGxlbmd0aD0lZCB3ZXBfdHhfa2V5aWR4PSVkXG4iLAorCSAgICAgICBkd3JxLT5mbGFncywgaW5kZXgsIGR3cnEtPmxlbmd0aCwgYWRhcHRlci0+d2VwX3R4X2tleWlkeCk7CisKKwlkd3JxLT5mbGFncyA9IDA7CisKKwkvKiBBdXRoZW50aWNhdGlvbiBtZXRob2QgKi8KKwlzd2l0Y2ggKGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUpIHsKKwljYXNlIHdsYW44MDJfMTFhdXRobW9kZW9wZW46CisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCWJyZWFrOworCisJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ6CisJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVuZXR3b3JrRUFQOgorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRCB8IElXX0VOQ09ERV9PUEVOOworCQlicmVhazsKKwl9CisKKwlpZiAoKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKQorCSAgICB8fCBhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgeworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCisJLyogRGVmYXVsdCB0byByZXR1cm5pbmcgY3VycmVudCB0cmFuc21pdCBrZXkgKi8KKwlpZiAoaW5kZXggPCAwKQorCQlpbmRleCA9IGFkYXB0ZXItPndlcF90eF9rZXlpZHg7CisKKwlpZiAoKGFkYXB0ZXItPndlcF9rZXlzW2luZGV4XS5sZW4pICYmCisJICAgIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkpIHsKKwkJbWVtY3B5KGV4dHJhLCBhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ua2V5LAorCQkgICAgICAgYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbik7CisJCWR3cnEtPmxlbmd0aCA9IGFkYXB0ZXItPndlcF9rZXlzW2luZGV4XS5sZW47CisKKwkJZHdycS0+ZmxhZ3MgfD0gKGluZGV4ICsgMSk7CisJCS8qIFJldHVybiBXRVAgZW5hYmxlZCAqLworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSBpZiAoKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCkKKwkJICAgfHwgKGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpKSB7CisJCS8qIHJldHVybiBXUEEgZW5hYmxlZCAqLworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworCisJbGJzX3ByX2RlYnVnKDEsICJrZXk6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngga2V5bGVuPSVkXG4iLAorCSAgICAgICBleHRyYVswXSwgZXh0cmFbMV0sIGV4dHJhWzJdLAorCSAgICAgICBleHRyYVszXSwgZXh0cmFbNF0sIGV4dHJhWzVdLCBkd3JxLT5sZW5ndGgpOworCisJbGJzX3ByX2RlYnVnKDEsICJSZXR1cm4gZmxhZ3M9MHgleFxuIiwgZHdycS0+ZmxhZ3MpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBFbmNyeXB0aW9uIGtleSAoaW50ZXJuYWwpCisgKgorICogIEBwYXJhbSBwcml2CQkJQSBwb2ludGVyIHRvIHByaXZhdGUgY2FyZCBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0ga2V5X21hdGVyaWFsCQlBIHBvaW50ZXIgdG8ga2V5IG1hdGVyaWFsCisgKiAgQHBhcmFtIGtleV9sZW5ndGgJCWxlbmd0aCBvZiBrZXkgbWF0ZXJpYWwKKyAqICBAcGFyYW0gaW5kZXgJCWtleSBpbmRleCB0byBzZXQKKyAqICBAcGFyYW0gc2V0X3R4X2tleQkJRm9yY2Ugc2V0IFRYIGtleSAoMSA9IHllcywgMCA9IG5vKQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfd2VwX2tleShzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxLAorCQkJICAgIGNvbnN0IGNoYXIgKmtleV9tYXRlcmlhbCwKKwkJCSAgICB1MTYga2V5X2xlbmd0aCwKKwkJCSAgICB1MTYgaW5kZXgsCisJCQkgICAgaW50IHNldF90eF9rZXkpCit7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSAqcGtleTsKKworCUVOVEVSKCk7CisKKwkvKiBQYXJhbm9pZCB2YWxpZGF0aW9uIG9mIGtleSBpbmRleCAqLworCWlmIChpbmRleCA+IDMpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdmFsaWRhdGUgbWF4IGtleSBsZW5ndGggKi8KKwlpZiAoa2V5X2xlbmd0aCA+IEtFWV9MRU5fV0VQXzEwNCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwa2V5ID0gJmFzc29jX3JlcS0+d2VwX2tleXNbaW5kZXhdOworCisJaWYgKGtleV9sZW5ndGggPiAwKSB7CisJCW1lbXNldChwa2V5LCAwLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfV0VQOworCisJCS8qIFN0YW5kYXJkaXplIHRoZSBrZXkgbGVuZ3RoICovCisJCXBrZXktPmxlbiA9IChrZXlfbGVuZ3RoID4gS0VZX0xFTl9XRVBfNDApID8KKwkJICAgICAgICAgICAgICAgIEtFWV9MRU5fV0VQXzEwNCA6IEtFWV9MRU5fV0VQXzQwOworCQltZW1jcHkocGtleS0+a2V5LCBrZXlfbWF0ZXJpYWwsIGtleV9sZW5ndGgpOworCX0KKworCWlmIChzZXRfdHhfa2V5KSB7CisJCS8qIEVuc3VyZSB0aGUgY2hvc2VuIGtleSBpcyB2YWxpZCAqLworCQlpZiAoIXBrZXktPmxlbikgeworCQkJbGJzX3ByX2RlYnVnKDEsICJrZXkgbm90IHNldCwgc28gY2Fubm90IGVuYWJsZSBpdFxuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4ID0gaW5kZXg7CisJfQorCisJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBlbmFibGVkOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9rZXlfaW5kZXgodTE2IGRlZl9pbmRleCwgdTE2IHJhd19pbmRleCwKKwkJCSAgICAgIHUxNiAqb3V0X2luZGV4LCB1MTYgKmlzX2RlZmF1bHQpCit7CisJaWYgKCFvdXRfaW5kZXggfHwgIWlzX2RlZmF1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmVyaWZ5IGluZGV4IGlmIHByZXNlbnQsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KKwlpZiAocmF3X2luZGV4ID4gMCkgeworCQlpZiAocmF3X2luZGV4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqb3V0X2luZGV4ID0gcmF3X2luZGV4IC0gMTsKKwl9IGVsc2UgeworCQkqb3V0X2luZGV4ID0gZGVmX2luZGV4OworCQkqaXNfZGVmYXVsdCA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3dlcChzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQoreworCWludCBpOworCisJLyogU2V0IE9wZW4gU3lzdGVtIGF1dGggbW9kZSAqLworCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisKKwkvKiBDbGVhciBXRVAga2V5cyBhbmQgbWFyayBXRVAgYXMgZGlzYWJsZWQgKi8KKwlhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWFzc29jX3JlcS0+d2VwX2tleXNbaV0ubGVuID0gMDsKKworCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgRW5jcnlwdGlvbiBrZXkKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKKwl1MTYgaXNfZGVmYXVsdCA9IDAsIGluZGV4ID0gMCwgc2V0X3R4X2tleSA9IDA7CisKKwlFTlRFUigpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJYXNzb2NfcmVxID0gd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdChhZGFwdGVyKTsKKwlpZiAoIWFzc29jX3JlcSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJZGlzYWJsZV93ZXAgKGFzc29jX3JlcSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHZhbGlkYXRlX2tleV9pbmRleChhc3NvY19yZXEtPndlcF90eF9rZXlpZHgsCisJICAgICAgICAgICAgICAgICAgICAgICAgIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmlzX2RlZmF1bHQpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCisJICogaW5kZXgsIHNldCB0aGUgVFgga2V5LgorCSAqLworCWlmICgoYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyAhPSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkgICAgfHwgKGR3cnEtPmxlbmd0aCA9PSAwICYmICFpc19kZWZhdWx0KSkKKwkJc2V0X3R4X2tleSA9IDE7CisKKwlyZXQgPSB3bGFuX3NldF93ZXBfa2V5KGFzc29jX3JlcSwgZXh0cmEsIGR3cnEtPmxlbmd0aCwgaW5kZXgsIHNldF90eF9rZXkpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGR3cnEtPmxlbmd0aCkKKwkJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJaWYgKHNldF90eF9rZXkpCisJCXNldF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncyk7CisKKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkgeworCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ7CisJfSBlbHNlIGlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisJfQorCitvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCXdsYW5fcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9IGVsc2UgeworCQl3bGFuX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0KKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgR2V0IEV4dGVuZGVkIEVuY3J5cHRpb24ga2V5IChXUEEvODAyLjF4IGFuZCBXRVApCisgKgorICogIEBwYXJhbSBkZXYgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gaW5mbwkJCUEgcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCisgKiAgQHBhcmFtIHZ3cnEgCQlBIHBvaW50ZXIgdG8gaXdfcGFyYW0gc3RydWN0dXJlCisgKiAgQHBhcmFtIGV4dHJhCQlBIHBvaW50ZXIgdG8gZXh0cmEgZGF0YSBidWYKKyAqICBAcmV0dXJuIAkgICAJCTAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2dldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGluZGV4LCBtYXhfa2V5X2xlbjsKKworCUVOVEVSKCk7CisKKwltYXhfa2V5X2xlbiA9IGR3cnEtPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlnb3RvIG91dDsKKworCWluZGV4ID0gZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGluZGV4KSB7CisJCWlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA0KQorCQkJZ290byBvdXQ7CisJCWluZGV4LS07CisJfSBlbHNlIHsKKwkJaW5kZXggPSBhZGFwdGVyLT53ZXBfdHhfa2V5aWR4OworCX0KKworCWlmICghZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSAmJgorCSAgICBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkgeworCQlpZiAoaW5kZXggIT0gMCB8fCBhZGFwdGVyLT5pbmZyYW1vZGUgIT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKQorCQkJZ290byBvdXQ7CisJfQorCisJZHdycS0+ZmxhZ3MgPSBpbmRleCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWlmICgoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGRpc2FibGVkKQorCSAgICAmJiAhYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQlleHQtPmtleV9sZW4gPSAwOworCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJdTggKmtleSA9IE5VTEw7CisKKwkJaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJZXh0LT5rZXlfbGVuID0gYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbjsKKwkJCWtleSA9ICZhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ua2V5WzBdOworCQl9IGVsc2UgaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQpICYmCisJCSAgICAgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fAorCQkgICAgICAgICAgICBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgeworCQkJLyogV1BBICovCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCX0gZWxzZSB7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChleHQtPmtleV9sZW4gPiBtYXhfa2V5X2xlbikgeworCQkJcmV0ID0gLUUyQklHOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZXh0LT5rZXlfbGVuKQorCQkJbWVtY3B5KGV4dC0+a2V5LCBrZXksIGV4dC0+a2V5X2xlbik7CisJCWVsc2UKKwkJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJfQorCXJldCA9IDA7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgRW5jcnlwdGlvbiBrZXkgRXh0ZW5kZWQgKFdQQS84MDIuMXggYW5kIFdFUCkKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBhbGcgPSBleHQtPmFsZzsKKwlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKKworCUVOVEVSKCk7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoYWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgfHwgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkgeworCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKKwl9IGVsc2UgaWYgKGFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQl1MTYgaXNfZGVmYXVsdCA9IDAsIGluZGV4LCBzZXRfdHhfa2V5ID0gMDsKKworCQlyZXQgPSB2YWxpZGF0ZV9rZXlfaW5kZXgoYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmlzX2RlZmF1bHQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCisJCSAqIGluZGV4LCBvciBpZiB0aGUgc2V0LVRYLWtleSBmbGFnIHdhcyBwYXNzZWQsIHNldCB0aGUgVFgga2V5LgorCQkgKi8KKwkJaWYgKChhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzICE9IHdsYW44MDJfMTFXRVBlbmFibGVkKQorCQkgICAgfHwgKGR3cnEtPmxlbmd0aCA9PSAwICYmICFpc19kZWZhdWx0KQorCQkgICAgfHwgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSkKKwkJCXNldF90eF9rZXkgPSAxOworCisJCS8qIENvcHkga2V5IHRvIGRyaXZlciAqLworCQlyZXQgPSB3bGFuX3NldF93ZXBfa2V5IChhc3NvY19yZXEsIGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGluZGV4LAorCQkJCQlzZXRfdHhfa2V5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJfSBlbHNlIGlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisJCX0KKworCQkvKiBNYXJrIHRoZSB2YXJpb3VzIFdFUCBiaXRzIGFzIG1vZGlmaWVkICovCisJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCWlmIChkd3JxLT5sZW5ndGgpCisJCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX0tFWVMsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJaWYgKHNldF90eF9rZXkpCisJCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWCwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCisJfSBlbHNlIGlmICgoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgfHwgKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApKSB7CisJCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgKiBwa2V5OworCisJCS8qIHZhbGlkYXRlIGtleSBsZW5ndGggKi8KKwkJaWYgKCgoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKKwkJCSYmIChleHQtPmtleV9sZW4gIT0gS0VZX0xFTl9XUEFfVEtJUCkpCisJCSAgICB8fCAoKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApCisJCSAgICAgICAgJiYgKGV4dC0+a2V5X2xlbiAhPSBLRVlfTEVOX1dQQV9BRVMpKSkgeworCQkJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBzaXplICVkIGZvciBrZXkgb2YgYWxnIgorCQkJCSAgICAgICAidHlwZSAlZC5cbiIsCisJCQkJICAgICAgIGV4dC0+a2V5X2xlbiwKKwkJCQkgICAgICAgYWxnKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisJCQlwa2V5ID0gJmFzc29jX3JlcS0+d3BhX21jYXN0X2tleTsKKwkJZWxzZQorCQkJcGtleSA9ICZhc3NvY19yZXEtPndwYV91bmljYXN0X2tleTsKKworCQltZW1zZXQocGtleSwgMCwgc2l6ZW9mIChzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZKSk7CisJCW1lbWNweShwa2V5LT5rZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCQlwa2V5LT5sZW4gPSBleHQtPmtleV9sZW47CisJCXBrZXktPmZsYWdzID0gS0VZX0lORk9fV1BBX0VOQUJMRUQ7CisKKwkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKwkJCXBrZXktPmZsYWdzIHw9IEtFWV9JTkZPX1dQQV9NQ0FTVDsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0gZWxzZSB7CisJCQlwa2V5LT5mbGFncyB8PSBLRVlfSU5GT19XUEFfVU5JQ0FTVDsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0KKworCQlpZiAoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKKwkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9US0lQOworCQllbHNlIGlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKQorCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX0FFUzsKKworCQkvKiBJZiBXUEEgaXNuJ3QgZW5hYmxlZCB5ZXQsIGRvIHRoYXQgbm93ICovCisJCWlmICggICBhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCA9PSAwCisJCSAgICAmJiBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQgPT0gMCkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMTsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0KKworCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKKwl9CisKK291dDoKKwlpZiAocmV0ID09IDApIHsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3bGFuX3NldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCisJRU5URVIoKTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFzc29jX3JlcSA9IHdsYW5fZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QoYWRhcHRlcik7CisJaWYgKCFhc3NvY19yZXEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCA+IE1BWF9XUEFfSUVfTEVOIHx8CisJICAgIChkd3JxLT5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCkgeworCQltZW1jcHkoJmFzc29jX3JlcS0+d3BhX2llWzBdLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gZHdycS0+bGVuZ3RoOworCX0gZWxzZSB7CisJCW1lbXNldCgmYXNzb2NfcmVxLT53cGFfaWVbMF0sIDAsIHNpemVvZihhZGFwdGVyLT53cGFfaWUpKTsKKwkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gMDsKKwl9CisKK291dDoKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X2JpdChBU1NPQ19GTEFHX1dQQV9JRSwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCQl3bGFuX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfSBlbHNlIHsKKwkJd2xhbl9jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT53cGFfaWVfbGVuID09IDApIHsKKwkJZHdycS0+bGVuZ3RoID0gMDsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCA8IGFkYXB0ZXItPndwYV9pZV9sZW4pIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwlkd3JxLT5sZW5ndGggPSBhZGFwdGVyLT53cGFfaWVfbGVuOworCW1lbWNweShleHRyYSwgJmFkYXB0ZXItPndwYV9pZVswXSwgYWRhcHRlci0+d3BhX2llX2xlbik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCByZXQgPSAwOworCWludCB1cGRhdGVkID0gMDsKKworCUVOVEVSKCk7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoZHdycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCS8qCisJCSAqIGxpYmVydGFzIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzCisJCSAqLworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkJaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRCkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKKwkJfQorCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJfQorCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlID0KKwkJCSAgICB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQl9CisJCXVwZGF0ZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZiAoZHdycS0+dmFsdWUpIHsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCSAgICBjbWRfYWN0X21hY19zdHJpY3RfcHJvdGVjdGlvbl9lbmFibGU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCQkgICAgfmNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZTsKKwkJfQorCQl1cGRhdGVkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCWlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlc2hhcmVkOworCQl9IGVsc2UgaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJfSBlbHNlIGlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJdXBkYXRlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZiAoZHdycS0+dmFsdWUpIHsKKwkJCWlmICghYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgJiYKKwkJCSAgICAhYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKKwkJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJCSAgICB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKKwkJfQorCQl1cGRhdGVkID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCWlmICh1cGRhdGVkKQorCQkJc2V0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSBpZiAocmV0ICE9IC1FT1BOT1RTVVBQKSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCXN3aXRjaCAoZHdycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCQlkd3JxLT52YWx1ZSA9IDA7CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTsKKwkJaWYgKGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTI7CisJCWlmICghZHdycS0+dmFsdWUpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlkd3JxLT52YWx1ZSA9IDA7CisJCWlmIChhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICYKKwkJICAgIGNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZSkKKwkJCWR3cnEtPnZhbHVlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCXN3aXRjaCAoYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSkgeworCQljYXNlIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDoKKwkJCWR3cnEtPnZhbHVlID0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKKwkJCWJyZWFrOworCQljYXNlIHdsYW44MDJfMTFhdXRobW9kZW9wZW46CisJCQlkd3JxLT52YWx1ZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQkJYnJlYWs7CisJCWNhc2Ugd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDoKKwkJCWR3cnEtPnZhbHVlID0gSVdfQVVUSF9BTEdfTEVBUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgJiYgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkKKwkJCWR3cnEtPnZhbHVlID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMRUFWRSgpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHdsYW5fc2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwl1MTYgZGJtOworCisJRU5URVIoKTsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQl3bGFuX3JhZGlvX2lvY3RsKHByaXYsIFJBRElPX09GRik7CisJCXJldHVybiAwOworCX0KKworCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfYXV0b19wcmVhbWJsZTsKKworCXdsYW5fcmFkaW9faW9jdGwocHJpdiwgUkFESU9fT04pOworCisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1RYUE9XX1RZUEUpID09IElXX1RYUE9XX01XQVRUKSB7CisJCWRibSA9ICh1MTYpIG13X3RvX2RibSh2d3JxLT52YWx1ZSk7CisJfSBlbHNlCisJCWRibSA9ICh1MTYpIHZ3cnEtPnZhbHVlOworCisJLyogYXV0byB0eCBwb3dlciBjb250cm9sICovCisKKwlpZiAodndycS0+Zml4ZWQgPT0gMCkKKwkJZGJtID0gMHhmZmZmOworCisJbGJzX3ByX2RlYnVnKDEsICI8MT5UWFBPV0VSIFNFVCAlZCBkYm0uXG4iLCBkYm0pOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfcmZfdHhfcG93ZXIsCisJCQkJICAgIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9sb3csCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgKHZvaWQgKikmZGJtKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKwkvKgorCSAqIE5vdGUgOiBpZiBkd3JxLT5mbGFncyAhPSAwLCB3ZSBzaG91bGQgZ2V0IHRoZSByZWxldmFudCBTU0lEIGZyb20KKwkgKiB0aGUgU1NJRCBsaXN0Li4uCisJICovCisKKwkvKgorCSAqIEdldCB0aGUgY3VycmVudCBTU0lECisJICovCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQltZW1jcHkoZXh0cmEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQsCisJCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoKTsKKwkJZXh0cmFbYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aF0gPSAnXDAnOworCX0gZWxzZSB7CisJCW1lbXNldChleHRyYSwgMCwgMzIpOworCQlleHRyYVthZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoXSA9ICdcMCc7CisJfQorCS8qCisJICogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0CisJICovCisKKwkvKiBUbyBtYWtlIHRoZSBkcml2ZXIgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIFdQQSBzdXBwbGljYW50IHYwLjIuNCAqLworCWlmIChkd3JxLT5sZW5ndGggPT0gMzIpCS8qIGNoZWNrIHdpdGggV1BBIHN1cHBsaWNhbnQgYnVmZmVyIHNpemUgKi8KKwkJZHdycS0+bGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoLAorCQkJCSAgIElXX0VTU0lEX01BWF9TSVpFKTsKKwllbHNlCisJCWR3cnEtPmxlbmd0aCA9IGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWRsZW5ndGggKyAxOworCisJZHdycS0+ZmxhZ3MgPSAxOwkvKiBhY3RpdmUgKi8KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCBzc2lkOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCBzc2lkX2xlbiA9IGR3cnEtPmxlbmd0aDsKKworCUVOVEVSKCk7CisKKwkvKgorCSAqIFdFLTIwIGFuZCBlYXJsaWVyIE5VTEwgcGFkIHRoZSBlbmQgb2YgdGhlIFNTSUQgYW5kIGluY3JlbWVudAorCSAqIFNTSUQgbGVuZ3RoIHNvIGl0IGNhbiBiZSB1c2VkIGxpa2UgYSBzdHJpbmcuICBXRS0yMSBhbmQgbGF0ZXIgZG9uJ3QsCisJICogYnV0IHNvbWUgdXNlcnNwYWNlIHRvb2xzIGFyZW4ndCBhYmxlIHRvIGNvcGUgd2l0aCB0aGUgY2hhbmdlLgorCSAqLworCWlmICgoc3NpZF9sZW4gPiAwKSAmJiAoZXh0cmFbc3NpZF9sZW4gLSAxXSA9PSAnXDAnKSkKKwkJc3NpZF9sZW4tLTsKKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KKwlpZiAoc3NpZF9sZW4gPiBJV19FU1NJRF9NQVhfU0laRSkgeworCQlyZXQgPSAtRTJCSUc7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgmc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisKKwlpZiAoIWR3cnEtPmZsYWdzIHx8ICFzc2lkX2xlbikgeworCQkvKiAiYW55IiBTU0lEIHJlcXVlc3RlZDsgbGVhdmUgU1NJRCBibGFuayAqLworCX0gZWxzZSB7CisJCS8qIFNwZWNpZmljIFNTSUQgcmVxdWVzdGVkICovCisJCW1lbWNweSgmc3NpZC5zc2lkLCBleHRyYSwgc3NpZF9sZW4pOworCQlzc2lkLnNzaWRsZW5ndGggPSBzc2lkX2xlbjsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlJlcXVlc3RlZCBuZXcgU1NJRCA9ICVzXG4iLAorCSAgICAgICAoc3NpZC5zc2lkbGVuZ3RoID4gMCkgPyAoY2hhciAqKXNzaWQuc3NpZCA6ICJhbnkiKTsKKworb3V0OgorCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWlmIChyZXQgPT0gMCkgeworCQkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwkJYXNzb2NfcmVxID0gd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdChhZGFwdGVyKTsKKwkJaWYgKCFhc3NvY19yZXEpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IHRoZSBTU0lEIHRvIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisJCQltZW1jcHkoJmFzc29jX3JlcS0+c3NpZCwgJnNzaWQsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCQkJc2V0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJCXdsYW5fcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwkJfQorCX0KKworCS8qIENhbmNlbCB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgKi8KKwlpZiAocmV0ICE9IDApIHsKKwkJd2xhbl9jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgQ29ubmVjdCB0byB0aGUgQVAgb3IgQWQtaG9jIE5ldHdvcmsgd2l0aCBzcGVjaWZpYyBic3NpZAorICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYXdycSAgICAgICAgIEEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEgICAgICAgIEEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IFdBUDogc2FfZGF0YTogIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoYXdycS0+c2FfZGF0YSkpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisKKwkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJCXJldCA9IC1FTk9NRU07CisJfSBlbHNlIHsKKwkJLyogQ29weSB0aGUgQlNTSUQgdG8gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwkJbWVtY3B5KCZhc3NvY19yZXEtPmJzc2lkLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJCXNldF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCQl3bGFuX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbGliZXJ0YXNfZ2V0X2Z3dmVyc2lvbih3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCBjaGFyICpmd3ZlcnNpb24sIGludCBtYXhsZW4pCit7CisJdW5pb24geworCQl1MzIgbDsKKwkJdTggY1s0XTsKKwl9IHZlcjsKKwljaGFyIGZ3dmVyWzMyXTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCXZlci5sID0gYWRhcHRlci0+ZndyZWxlYXNlbnVtYmVyOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlpZiAodmVyLmNbM10gPT0gMCkKKwkJc3ByaW50Zihmd3ZlciwgIiV1LiV1LiV1IiwgdmVyLmNbMl0sIHZlci5jWzFdLCB2ZXIuY1swXSk7CisJZWxzZQorCQlzcHJpbnRmKGZ3dmVyLCAiJXUuJXUuJXUucCV1IiwKKwkJCXZlci5jWzJdLCB2ZXIuY1sxXSwgdmVyLmNbMF0sIHZlci5jWzNdKTsKKworCXNucHJpbnRmKGZ3dmVyc2lvbiwgbWF4bGVuLCBmd3Zlcik7Cit9CisKKworLyoKKyAqIGl3Y29uZmlnIHNldHRhYmxlIGNhbGxiYWNrcworICovCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3bGFuX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9uYW1lLAkvKiBTSU9DR0lXTkFNRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXTldJRCAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9mcmVxLAkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9mcmVxLAkvKiBTSU9DR0lXRlJFUSAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9tb2RlLAkvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9tb2RlLAkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcmFuZ2UsCS8qIFNJT0NHSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU1RBVFMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NUQVRTICovCisJaXdfaGFuZGxlcl9zZXRfc3B5LAkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkvKiBTSU9DU0lXVEhSU1BZICovCisJaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3dhcCwJLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X3dhcCwJLyogU0lPQ0dJV0FQICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdNTE1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdBUExJU1QgLSBkZXByZWNhdGVkICovCisJKGl3X2hhbmRsZXIpIGxpYmVydGFzX3NldF9zY2FuLAkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBsaWJlcnRhc19nZXRfc2NhbiwJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZXNzaWQsCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9lc3NpZCwJLyogU0lPQ0dJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X25pY2ssCS8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9uaWNrLAkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3JhdGUsCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X3JhdGUsCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3J0cywJLyogU0lPQ1NJV1JUUyAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9ydHMsCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZnJhZywJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfZnJhZywJLyogU0lPQ0dJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfdHhwb3csCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF90eHBvdywJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3JldHJ5LAkvKiBTSU9DU0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcmV0cnksCS8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9lbmNvZGUsCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfZW5jb2RlLAkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3Bvd2VyLAkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcG93ZXIsCS8qIFNJT0NHSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZ2VuaWUsCS8qIFNJT0NTSVdHRU5JRSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9nZW5pZSwJLyogU0lPQ0dJV0dFTklFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X2F1dGgsCS8qIFNJT0NTSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X2F1dGgsCS8qIFNJT0NHSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X2VuY29kZWV4dCwvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X2VuY29kZWV4dCwvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkvKiBTSU9DU0lXUE1LU0EgKi8KK307CisKK3N0cnVjdCBpd19oYW5kbGVyX2RlZiBsaWJlcnRhc19oYW5kbGVyX2RlZiA9IHsKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHdsYW5faGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHdsYW5fcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3bGFuX3ByaXZhdGVfYXJncykgLworCQlzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgd2xhbl9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgd2xhbl9wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopd2xhbl9wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHdsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYzNjdjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaApAQCAtMCwwICsxLDE0NyBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb24gZm9yIElPQ1RMIGNhbGwuCisgICovCisjaWZuZGVmCV9XTEFOX1dFWFRfSF8KKyNkZWZpbmUJX1dMQU5fV0VYVF9IXworCisjZGVmaW5lIFNVQkNNRF9PRkZTRVQJCQk0CisjZGVmaW5lIFNVQkNNRF9EQVRBKHgpCQkJKigoaW50ICopKHgtPnUubmFtZSArIFNVQkNNRF9PRkZTRVQpKQorCisvKiogUFJJVkFURSBDTUQgSUQgKi8KKyNkZWZpbmUJV0xBTklPQ1RMCQkJU0lPQ0lXRklSU1RQUklWCisKKyNkZWZpbmUgV0xBTlNFVFdQQUlFCQkJKFdMQU5JT0NUTCArIDApCisKKyNkZWZpbmUgV0xBTl9TRVRJTlRfR0VUSU5UCQkoV0xBTklPQ1RMICsgNykKKyNkZWZpbmUgV0xBTk5GCQkJCQkxCisjZGVmaW5lIFdMQU5SU1NJCQkJCTIKKyNkZWZpbmUgV0xBTkVOQUJMRTExRAkJCQk1CisjZGVmaW5lIFdMQU5BREhPQ0dSQVRFCQkJCTYKKyNkZWZpbmUgV0xBTl9TVUJDTURfU0VUX1BSRVNDQU4JCQkxMQorCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVROT05FCSAgICAgICAgKFdMQU5JT0NUTCArIDgpCisjZGVmaW5lIFdMQU5ERUFVVEggICAgICAgICAgICAgICAgICAJCTEKKyNkZWZpbmUgV0xBTlJBRElPT04gICAgICAgICAgICAgICAgIAkJMgorI2RlZmluZSBXTEFOUkFESU9PRkYgICAgICAgICAgICAgICAgCQkzCisjZGVmaW5lIFdMQU5SRU1PVkVBREhPQ0FFUyAgICAgICAgICAJCTQKKyNkZWZpbmUgV0xBTkFESE9DU1RPUCAgICAgICAgICAgICAgIAkJNQorI2RlZmluZSBXTEFOQ0lQSEVSVEVTVCAgICAgICAgICAgICAgCQk2CisjZGVmaW5lIFdMQU5DUllQVE9URVNUCQkJCTcKKworI2RlZmluZSBXTEFOV0xBTklETEVPTgkJCQkxMAorI2RlZmluZSBXTEFOV0xBTklETEVPRkYJCQkJMTEKKyNkZWZpbmUgV0xBTl9TVUJDTURfQlRfUkVTRVQJCQkxMworI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfUkVTRVQJCQkxNAorCisjZGVmaW5lIFdMQU5HRVRMT0cgICAgICAgICAgICAgICAgICAJKFdMQU5JT0NUTCArIDkpCisjZGVmaW5lIEdFVExPR19CVUZTSVpFICAzMDAKKworI2RlZmluZSBXTEFOU0NBTl9UWVBFCQkJKFdMQU5JT0NUTCArIDExKQorCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQJCShXTEFOSU9DVEwgKyAxNSkKKyNkZWZpbmUgV0xBTkdFVFJFR0lPTgkJCQkxCisjZGVmaW5lIFdMQU5fR0VUX0xJU1RFTl9JTlRFUlZBTAkJMgorI2RlZmluZSBXTEFOX0dFVF9NVUxUSVBMRV9EVElNCQkJMworI2RlZmluZSBXTEFOX0dFVF9UWF9SQVRFCQkJNAorI2RlZmluZQlXTEFOR0VUQkNOQVZHCQkJCTUKKworI2RlZmluZSBXTEFOX0dFVF9MSU5LTU9ERQkJCTYKKyNkZWZpbmUgV0xBTl9HRVRfUkFESU9NT0RFCQkJNworI2RlZmluZSBXTEFOX0dFVF9ERUJVR01PREUJCQk4CisjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQCQkJMTUKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX1RJTUUJCQkxNgorI2RlZmluZSBXTEFOX1NVQkNNRF9NRVNIX0dFVF9UVEwJCTE3CisKKyNkZWZpbmUgV0xBTlJFR0NGUkRXUgkJCShXTEFOSU9DVEwgKyAxOCkKKworI2RlZmluZSBXTEFOX1NFVE5PTkVfR0VUVFdFTFZFX0NIQVIgKFdMQU5JT0NUTCArIDE5KQorI2RlZmluZSBXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkEgICAgMQorI2RlZmluZSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkEgICAgMgorI2RlZmluZSBXTEFOX0dFVF9UU0YgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVRXT1JEQ0hBUgkoV0xBTklPQ1RMICsgMjEpCisjZGVmaW5lIFdMQU5HRVRBREhPQ0FFUwkJCQkxCisKKyNkZWZpbmUgV0xBTl9TRVRPTkVJTlRfR0VUT05FSU5UCShXTEFOSU9DVEwgKyAyMykKKyNkZWZpbmUgV0xBTl9CRUFDT05fSU5URVJWQUwJCQkxCisjZGVmaW5lCVdMQU5fTElTVEVOSU5UUlZMCQkJNAorCisjZGVmaW5lIFdMQU5fVFhDT05UUk9MCQkJCTYKKyNkZWZpbmUgV0xBTl9OVUxMUEtUSU5URVJWQUwJCQk3CisKKyNkZWZpbmUgV0xBTl9TRVRPTkVJTlRfR0VUTk9ORQkJKFdMQU5JT0NUTCArIDI0KQorI2RlZmluZSBXTEFOX1NVQkNNRF9TRVRSWEFOVEVOTkEJCTEKKyNkZWZpbmUgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BCQkyCisjZGVmaW5lIFdMQU5TRVRBVVRIQUxHCQkJCTUKKyNkZWZpbmUgV0xBTlNFVDgwMjFYQVVUSEFMRwkJCTYKKyNkZWZpbmUgV0xBTlNFVEVOQ1JZUFRJT05NT0RFCQkJNworI2RlZmluZSBXTEFOU0VUUkVHSU9OCQkJCTgKKyNkZWZpbmUgV0xBTl9TRVRfTElTVEVOX0lOVEVSVkFMCQk5CisKKyNkZWZpbmUgV0xBTl9TRVRfTVVMVElQTEVfRFRJTQkJCTEwCisjZGVmaW5lIFdMQU5fU0VUX0FUSU1fV0lORE9XCQkJMTEKKyNkZWZpbmUgV0xBTlNFVEJDTkFWRwkJCQkxMworI2RlZmluZSBXTEFOU0VUREFUQUFWRwkJCQkxNAorI2RlZmluZSBXTEFOX1NFVF9MSU5LTU9ERQkJCTE1CisjZGVmaW5lIFdMQU5fU0VUX1JBRElPTU9ERQkJCTE2CisjZGVmaW5lIFdMQU5fU0VUX0RFQlVHTU9ERQkJCTE3CisjZGVmaW5lIFdMQU5fU1VCQ01EX01FU0hfU0VUX1RUTAkJMTgKKworI2RlZmluZSBXTEFOX1NFVDEyOENIQVJfR0VUMTI4Q0hBUgkoV0xBTklPQ1RMICsgMjUpCisjZGVmaW5lIFdMQU5TQ0FOX01PREUJCQkJNgorCisjZGVmaW5lIFdMQU5fR0VUX0FESE9DX1NUQVRVUwkJCTkKKworI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9BREQJCQkxOAorI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9ERUwgICAJCQkxOQorI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9MSVNUCQkJMjAKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX0FERAkJCQkyMQorI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfREVMICAgCQkyMgorI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfTE9PS1VQCQkyMworI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfTElTVF9ORUlHSEJPUgkJCTI0CisjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9MSVNUCQkJMjUKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX0xJU1RfUk9VVEUJCQkyNgorCisjZGVmaW5lIFdMQU5fU0VUX0dFVF9TSVhURUVOX0lOVCAgICAgICAoV0xBTklPQ1RMICsgMjkpCisjZGVmaW5lIFdMQU5fVFBDQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fUE9XRVJDRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgV0xBTl9BVVRPX0ZSRVFfU0VUCQkJMworI2RlZmluZSBXTEFOX0FVVE9fRlJFUV9HRVQJCQk0CisjZGVmaW5lIFdMQU5fTEVEX0dQSU9fQ1RSTAkJCTUKKyNkZWZpbmUgV0xBTl9TQ0FOUFJPQkVTIAkJCTYKKyNkZWZpbmUJV0xBTl9BREFQVF9SQVRFU0VUCQkJOAorI2RlZmluZQlXTEFOX0lOQUNUSVZJVFlfVElNRU9VVAkJCTkKKyNkZWZpbmUgV0xBTlNOUgkJCQkJMTAKKyNkZWZpbmUgV0xBTl9HRVRfUkFURQkJCQkxMQorI2RlZmluZQlXTEFOX0dFVF9SWElORk8JCQkJMTIKKworI2RlZmluZSBXTEFOQ01ENTJSRFdSCQkJKFdMQU5JT0NUTCArIDMwKQorI2RlZmluZSBXTEFOQ01ENTNSRFdSCQkJKFdMQU5JT0NUTCArIDMxKQorI2RlZmluZSBDTUQ1M0JVRkxFTgkJCQkzMgorCisjZGVmaW5lCVJFR19NQUMJCQkJCTB4MTkKKyNkZWZpbmUJUkVHX0JCUAkJCQkJMHgxYQorI2RlZmluZQlSRUdfUkYJCQkJCTB4MWIKKyNkZWZpbmUJUkVHX0VFUFJPTQkJCQkweDU5CisjZGVmaW5lIFdMQU5fTElOS01PREVfODAyXzMJCQkwCisjZGVmaW5lIFdMQU5fTElOS01PREVfODAyXzExCQkJMgorI2RlZmluZSBXTEFOX1JBRElPTU9ERV9OT05FICAgIAkJCTAKKyNkZWZpbmUgV0xBTl9SQURJT01PREVfUkFESU9UQVAJCQkyCisKKy8qKiB3bGFuX2lvY3RsX3JlZ3Jkd3IgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3JlZ3Jkd3IgeworCS8qKiBXaGljaCByZWdpc3RlciB0byBhY2Nlc3MgKi8KKwl1MTYgd2hpY2hyZWc7CisJLyoqIFJlYWQgb3IgV3JpdGUgKi8KKwl1MTYgYWN0aW9uOworCXUzMiBvZmZzZXQ7CisJdTE2IE5PQjsKKwl1MzIgdmFsdWU7Cit9OworCitleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIGxpYmVydGFzX2hhbmRsZXJfZGVmOworaW50IGxpYmVydGFzX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcmVxLCBpbnQgaSk7CitpbnQgd2xhbl9yYWRpb19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCBvcHRpb24pOworCisjZW5kaWYJCQkJLyogX1dMQU5fV0VYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAppbmRleCA0MjliNzM4Li5jNmUwZDgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaAorKysgYi9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaApAQCAtMTY4LDYgKzE2OCwyMyBAQAogICogICAgICBVbml0bGVzcyBpbmRpY2F0aW9uIG9mIHRoZSBSeC9UeCBhbnRlbm5hIGZvciB0aGlzIHBhY2tldC4KICAqICAgICAgVGhlIGZpcnN0IGFudGVubmEgaXMgYW50ZW5uYSAwLgogICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9SWF9GTEFHUyAgICAgICAgICB1X2ludDE2X3QgICAgICAgYml0bWFwCisgKgorICogICAgIFByb3BlcnRpZXMgb2YgcmVjZWl2ZWQgZnJhbWVzLiBTZWUgZmxhZ3MgZGVmaW5lZCBiZWxvdy4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfVFhfRkxBR1MgICAgICAgICAgdV9pbnQxNl90ICAgICAgIGJpdG1hcAorICoKKyAqICAgICBQcm9wZXJ0aWVzIG9mIHRyYW5zbWl0dGVkIGZyYW1lcy4gU2VlIGZsYWdzIGRlZmluZWQgYmVsb3cuCisgKgorICogSUVFRTgwMjExX1JBRElPVEFQX1JUU19SRVRSSUVTICAgICAgIHVfaW50OF90ICAgICAgICBkYXRhCisgKgorICogICAgIE51bWJlciBvZiBydHMgcmV0cmllcyBhIHRyYW5zbWl0dGVkIGZyYW1lIHVzZWQuCisgKgorICogSUVFRTgwMjExX1JBRElPVEFQX0RBVEFfUkVUUklFUyAgICAgIHVfaW50OF90ICAgICAgICBkYXRhCisgKgorICogICAgIE51bWJlciBvZiB1bmljYXN0IHJldHJpZXMgYSB0cmFuc21pdHRlZCBmcmFtZSB1c2VkLgorICoKKyAqCiAgKiBJRUVFODAyMTFfUkFESU9UQVBfRkNTICAgICAgICAgICAJdTMyICAgICAgIGRhdGEKICAqCiAgKglGQ1MgZnJvbSBmcmFtZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCkBAIC0xODcsNyArMjA0LDExIEBACiAJSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKIAlJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCiAJSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMsCi0JSUVFRTgwMjExX1JBRElPVEFQX0VYVCA9IDMxLAorCUlFRUU4MDIxMV9SQURJT1RBUF9SWF9GTEFHUyA9IDE0LAorCUlFRUU4MDIxMV9SQURJT1RBUF9UWF9GTEFHUyA9IDE1LAorCUlFRUU4MDIxMV9SQURJT1RBUF9SVFNfUkVUUklFUyA9IDE2LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQVRBX1JFVFJJRVMgPSAxNywKKwlJRUVFODAyMTFfUkFESU9UQVBfRVhUID0gMzEKIH07CiAKIC8qIENoYW5uZWwgZmxhZ3MuICovCkBAIC0yMTksNiArMjQwLDE0IEBACiAJCQkJCQkgKiA4MDIuMTEgaGVhZGVyIGFuZCBwYXlsb2FkCiAJCQkJCQkgKiAodG8gMzItYml0IGJvdW5kYXJ5KQogCQkJCQkJICovCisvKiBGb3IgSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1JYX0JBREZDUwkweDAwMDEJLyogZnJhbWUgZmFpbGVkIGNyYyBjaGVjayAqLworCisvKiBGb3IgSUVFRTgwMjExX1JBRElPVEFQX1RYX0ZMQUdTICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX0ZBSUwJMHgwMDAxCS8qIGZhaWxlZCBkdWUgdG8gZXhjZXNzaXZlCisJCQkJCQkgKiByZXRyaWVzICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX0NUUwkweDAwMDIJLyogdXNlZCBjdHMgJ3Byb3RlY3Rpb24nICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX1JUUwkweDAwMDQJLyogdXNlZCBydHMvY3RzIGhhbmRzaGFrZSAqLwogCiAvKiBVZ2x5IG1hY3JvIHRvIGNvbnZlcnQgbGl0ZXJhbCBjaGFubmVsIG51bWJlcnMgaW50byB0aGVpciBtaHogZXF1aXZhbGVudHMKICAqIFRoZXJlIGFyZSBjZXJ0aWFubHkgc29tZSBjb25kaXRpb25zIHRoYXQgd2lsbCBicmVhayB0aGlzIChsaWtlIGZlZWRpbmcgaXQgJzMwJykK