LyoKICogIEJhc2VkIG9uIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgYnkgRGF2ZSBKb25lcy4gVGhhbmtzIQogKgogKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgogKgogKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KCiNpbmNsdWRlIDxhc20vbXNyLmg+CiNpbmNsdWRlIDxhc20vdHNjLmg+CiNpbmNsdWRlIDxhc20vdGltZXguaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CgojZGVmaW5lIEVQU19CUkFORF9DN00JMAojZGVmaW5lIEVQU19CUkFORF9DNwkxCiNkZWZpbmUgRVBTX0JSQU5EX0VERU4JMgojZGVmaW5lIEVQU19CUkFORF9DMwkzCiNkZWZpbmUgRVBTX0JSQU5EX0M3RAk0CgpzdHJ1Y3QgZXBzX2NwdV9kYXRhIHsKCXUzMiBmc2I7CglzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgZnJlcV90YWJsZVtdOwp9OwoKc3RhdGljIHN0cnVjdCBlcHNfY3B1X2RhdGEgKmVwc19jcHVbTlJfQ1BVU107CgoKc3RhdGljIHVuc2lnbmVkIGludCBlcHNfZ2V0KHVuc2lnbmVkIGludCBjcHUpCnsKCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7Cgl1MzIgbG8sIGhpOwoKCWlmIChjcHUpCgkJcmV0dXJuIDA7CgljZW50YXVyID0gZXBzX2NwdVtjcHVdOwoJaWYgKGNlbnRhdXIgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCgkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOwoJcmV0dXJuIGNlbnRhdXItPmZzYiAqICgobG8gPj4gOCkgJiAweGZmKTsKfQoKc3RhdGljIGludCBlcHNfc2V0X3N0YXRlKHN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXIsCgkJCSB1bnNpZ25lZCBpbnQgY3B1LAoJCQkgdTMyIGRlc3Rfc3RhdGUpCnsKCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOwoJdTMyIGxvLCBoaTsKCWludCBlcnIgPSAwOwoJaW50IGk7CgoJZnJlcXMub2xkID0gZXBzX2dldChjcHUpOwoJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChkZXN0X3N0YXRlID4+IDgpICYgMHhmZik7CglmcmVxcy5jcHUgPSBjcHU7CgljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwoKCS8qIFdhaXQgd2hpbGUgQ1BVIGlzIGJ1c3kgKi8KCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOwoJaSA9IDA7Cgl3aGlsZSAobG8gJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSkgewoJCXVkZWxheSgxNik7CgkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CgkJaSsrOwoJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CgkJCWVyciA9IC1FTk9ERVY7CgkJCWdvdG8gcG9zdGNoYW5nZTsKCQl9Cgl9CgkvKiBTZXQgbmV3IG11bHRpcGxpZXIgYW5kIHZvbHRhZ2UgKi8KCXdybXNyKE1TUl9JQTMyX1BFUkZfQ1RMLCBkZXN0X3N0YXRlICYgMHhmZmZmLCAwKTsKCS8qIFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgKi8KCWkgPSAwOwoJZG8gewoJCXVkZWxheSgxNik7CgkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CgkJaSsrOwoJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CgkJCWVyciA9IC1FTk9ERVY7CgkJCWdvdG8gcG9zdGNoYW5nZTsKCQl9Cgl9IHdoaWxlIChsbyAmICgoMSA8PCAxNikgfCAoMSA8PCAxNykpKTsKCgkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KcG9zdGNoYW5nZToKCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOwoJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOwoKI2lmZGVmIERFQlVHCgl7Cgl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKCgkvKiBQcmludCB2b2x0YWdlIGFuZCBtdWx0aXBsaWVyICovCglyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKCWN1cnJlbnRfdm9sdGFnZSA9IGxvICYgMHhmZjsKCXByaW50ayhLRVJOX0lORk8gImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwKCQljdXJyZW50X3ZvbHRhZ2UgKiAxNiArIDcwMCk7CgljdXJyZW50X211bHRpcGxpZXIgPSAobG8gPj4gOCkgJiAweGZmOwoJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBDdXJyZW50IG11bHRpcGxpZXIgPSAlZFxuIiwKCQljdXJyZW50X211bHRpcGxpZXIpOwoJfQojZW5kaWYKCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBlcHNfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAoJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAoJCQkgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQp7CglzdHJ1Y3QgZXBzX2NwdV9kYXRhICpjZW50YXVyOwoJdW5zaWduZWQgaW50IG5ld3N0YXRlID0gMDsKCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKCXVuc2lnbmVkIGludCBkZXN0X3N0YXRlOwoJaW50IHJldDsKCglpZiAodW5saWtlbHkoZXBzX2NwdVtjcHVdID09IE5VTEwpKQoJCXJldHVybiAtRU5PREVWOwoJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKCglpZiAodW5saWtlbHkoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwKCQkJJmVwc19jcHVbY3B1XS0+ZnJlcV90YWJsZVswXSwKCQkJdGFyZ2V0X2ZyZXEsCgkJCXJlbGF0aW9uLAoJCQkmbmV3c3RhdGUpKSkgewoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qIE1ha2UgZnJlcXVlbmN5IHRyYW5zaXRpb24gKi8KCWRlc3Rfc3RhdGUgPSBjZW50YXVyLT5mcmVxX3RhYmxlW25ld3N0YXRlXS5pbmRleCAmIDB4ZmZmZjsKCXJldCA9IGVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBkZXN0X3N0YXRlKTsKCWlmIChyZXQpCgkJcHJpbnRrKEtFUk5fRVJSICJlcHM6IFRpbWVvdXQhXG4iKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgZXBzX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKewoJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksCgkJCSZlcHNfY3B1W3BvbGljeS0+Y3B1XS0+ZnJlcV90YWJsZVswXSk7Cn0KCnN0YXRpYyBpbnQgZXBzX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXUzMiBsbywgaGk7Cgl1NjQgdmFsOwoJdTggY3VycmVudF9tdWx0aXBsaWVyLCBjdXJyZW50X3ZvbHRhZ2U7Cgl1OCBtYXhfbXVsdGlwbGllciwgbWF4X3ZvbHRhZ2U7Cgl1OCBtaW5fbXVsdGlwbGllciwgbWluX3ZvbHRhZ2U7Cgl1OCBicmFuZCA9IDA7Cgl1MzIgZnNiOwoJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YSgwKTsKCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZl90YWJsZTsKCWludCBrLCBzdGVwLCB2b2x0YWdlOwoJaW50IHJldDsKCWludCBzdGF0ZXM7CgoJaWYgKHBvbGljeS0+Y3B1ICE9IDApCgkJcmV0dXJuIC1FTk9ERVY7CgoJLyogQ2hlY2sgYnJhbmQgKi8KCXByaW50ayhLRVJOX0lORk8gImVwczogRGV0ZWN0ZWQgVklBICIpOwoKCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CgljYXNlIDEwOgoJCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKCQlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CgkJcHJpbnRrKEtFUk5fQ09OVCAiTW9kZWwgQSAiKTsKCQlicmVhazsKCWNhc2UgMTM6CgkJcmRtc3IoMHgxMTU0LCBsbywgaGkpOwoJCWJyYW5kID0gKCgobG8gPj4gNCkgXiAobG8gPj4gMikpKSAmIDB4MDAwMDAwZmY7CgkJcHJpbnRrKEtFUk5fQ09OVCAiTW9kZWwgRCAiKTsKCQlicmVhazsKCX0KCglzd2l0Y2goYnJhbmQpIHsKCWNhc2UgRVBTX0JSQU5EX0M3TToKCQlwcmludGsoS0VSTl9DT05UICJDNy1NXG4iKTsKCQlicmVhazsKCWNhc2UgRVBTX0JSQU5EX0M3OgoJCXByaW50ayhLRVJOX0NPTlQgIkM3XG4iKTsKCQlicmVhazsKCWNhc2UgRVBTX0JSQU5EX0VERU46CgkJcHJpbnRrKEtFUk5fQ09OVCAiRWRlblxuIik7CgkJYnJlYWs7CgljYXNlIEVQU19CUkFORF9DN0Q6CgkJcHJpbnRrKEtFUk5fQ09OVCAiQzctRFxuIik7CgkJYnJlYWs7CgljYXNlIEVQU19CUkFORF9DMzoKCQlwcmludGsoS0VSTl9DT05UICJDM1xuIik7CgkJcmV0dXJuIC1FTk9ERVY7CgkJYnJlYWs7Cgl9CgkvKiBFbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlciAqLwoJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOwoJaWYgKCEodmFsICYgMSA8PCAxNikpIHsKCQl2YWwgfD0gMSA8PCAxNjsKCQl3cm1zcmwoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIHZhbCk7CgkJLyogQ2FuIGJlIGxvY2tlZCBhdCAwICovCgkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOwoJCWlmICghKHZhbCAmIDEgPDwgMTYpKSB7CgkJCXByaW50ayhLRVJOX0lORk8gImVwczogQ2FuJ3QgZW5hYmxlIEVuaGFuY2VkIFBvd2VyU2F2ZXJcbiIpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9CgoJLyogUHJpbnQgdm9sdGFnZSBhbmQgbXVsdGlwbGllciAqLwoJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CgljdXJyZW50X3ZvbHRhZ2UgPSBsbyAmIDB4ZmY7CglwcmludGsoS0VSTl9JTkZPICJlcHM6IEN1cnJlbnQgdm9sdGFnZSA9ICVkbVZcbiIsIGN1cnJlbnRfdm9sdGFnZSAqIDE2ICsgNzAwKTsKCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CglwcmludGsoS0VSTl9JTkZPICJlcHM6IEN1cnJlbnQgbXVsdGlwbGllciA9ICVkXG4iLCBjdXJyZW50X211bHRpcGxpZXIpOwoKCS8qIFByaW50IGxpbWl0cyAqLwoJbWF4X3ZvbHRhZ2UgPSBoaSAmIDB4ZmY7CglwcmludGsoS0VSTl9JTkZPICJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOwoJbWF4X211bHRpcGxpZXIgPSAoaGkgPj4gOCkgJiAweGZmOwoJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBIaWdoZXN0IG11bHRpcGxpZXIgPSAlZFxuIiwgbWF4X211bHRpcGxpZXIpOwoJbWluX3ZvbHRhZ2UgPSAoaGkgPj4gMTYpICYgMHhmZjsKCXByaW50ayhLRVJOX0lORk8gImVwczogTG93ZXN0IHZvbHRhZ2UgPSAlZG1WXG4iLCBtaW5fdm9sdGFnZSAqIDE2ICsgNzAwKTsKCW1pbl9tdWx0aXBsaWVyID0gKGhpID4+IDI0KSAmIDB4ZmY7CglwcmludGsoS0VSTl9JTkZPICJlcHM6IExvd2VzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1pbl9tdWx0aXBsaWVyKTsKCgkvKiBTYW5pdHkgY2hlY2tzICovCglpZiAoY3VycmVudF9tdWx0aXBsaWVyID09IDAgfHwgbWF4X211bHRpcGxpZXIgPT0gMAoJICAgIHx8IG1pbl9tdWx0aXBsaWVyID09IDApCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKCSAgICB8fCBtYXhfbXVsdGlwbGllciA8PSBtaW5fbXVsdGlwbGllcikKCQlyZXR1cm4gLUVJTlZBTDsKCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFmIHx8IG1heF92b2x0YWdlID4gMHgxZikKCQlyZXR1cm4gLUVJTlZBTDsKCWlmIChtYXhfdm9sdGFnZSA8IG1pbl92b2x0YWdlKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIENhbGMgRlNCIHNwZWVkICovCglmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOwoJLyogQ2FsYyBudW1iZXIgb2YgcC1zdGF0ZXMgc3VwcG9ydGVkICovCglpZiAoYnJhbmQgPT0gRVBTX0JSQU5EX0M3TSkKCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKCWVsc2UKCQlzdGF0ZXMgPSAyOwoKCS8qIEFsbG9jYXRlIHByaXZhdGUgZGF0YSBhbmQgZnJlcXVlbmN5IHRhYmxlIGZvciBjdXJyZW50IGNwdSAqLwoJY2VudGF1ciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlcHNfY3B1X2RhdGEpCgkJICAgICsgKHN0YXRlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksCgkJICAgIEdGUF9LRVJORUwpOwoJaWYgKCFjZW50YXVyKQoJCXJldHVybiAtRU5PTUVNOwoJZXBzX2NwdVswXSA9IGNlbnRhdXI7CgoJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KCWNlbnRhdXItPmZzYiA9IGZzYjsKCgkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCglmX3RhYmxlID0gJmNlbnRhdXItPmZyZXFfdGFibGVbMF07CglpZiAoYnJhbmQgIT0gRVBTX0JSQU5EX0M3TSkgewoJCWZfdGFibGVbMF0uZnJlcXVlbmN5ID0gZnNiICogbWluX211bHRpcGxpZXI7CgkJZl90YWJsZVswXS5pbmRleCA9IChtaW5fbXVsdGlwbGllciA8PCA4KSB8IG1pbl92b2x0YWdlOwoJCWZfdGFibGVbMV0uZnJlcXVlbmN5ID0gZnNiICogbWF4X211bHRpcGxpZXI7CgkJZl90YWJsZVsxXS5pbmRleCA9IChtYXhfbXVsdGlwbGllciA8PCA4KSB8IG1heF92b2x0YWdlOwoJCWZfdGFibGVbMl0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7Cgl9IGVsc2UgewoJCWsgPSAwOwoJCXN0ZXAgPSAoKG1heF92b2x0YWdlIC0gbWluX3ZvbHRhZ2UpICogMjU2KQoJCQkvIChtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyKTsKCQlmb3IgKGkgPSBtaW5fbXVsdGlwbGllcjsgaSA8PSBtYXhfbXVsdGlwbGllcjsgaSsrKSB7CgkJCXZvbHRhZ2UgPSAoayAqIHN0ZXApIC8gMjU2ICsgbWluX3ZvbHRhZ2U7CgkJCWZfdGFibGVba10uZnJlcXVlbmN5ID0gZnNiICogaTsKCQkJZl90YWJsZVtrXS5pbmRleCA9IChpIDw8IDgpIHwgdm9sdGFnZTsKCQkJaysrOwoJCX0KCQlmX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOwoJfQoKCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxNDAwMDA7IC8qIDg0NG1WIC0+IDcwMG1WIGluIG5zICovCglwb2xpY3ktPmN1ciA9IGZzYiAqIGN1cnJlbnRfbXVsdGlwbGllcjsKCglyZXQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgJmNlbnRhdXItPmZyZXFfdGFibGVbMF0pOwoJaWYgKHJldCkgewoJCWtmcmVlKGNlbnRhdXIpOwoJCXJldHVybiByZXQ7Cgl9CgoJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoJmNlbnRhdXItPmZyZXFfdGFibGVbMF0sIHBvbGljeS0+Y3B1KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGVwc19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKewoJdW5zaWduZWQgaW50IGNwdSA9IHBvbGljeS0+Y3B1OwoJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKCXUzMiBsbywgaGk7CgoJaWYgKGVwc19jcHVbY3B1XSA9PSBOVUxMKQoJCXJldHVybiAtRU5PREVWOwoJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKCgkvKiBHZXQgbWF4IGZyZXF1ZW5jeSAqLwoJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CgkvKiBTZXQgbWF4IGZyZXF1ZW5jeSAqLwoJZXBzX3NldF9zdGF0ZShjZW50YXVyLCBjcHUsIGhpICYgMHhmZmZmKTsKCS8qIEJ5ZSAqLwoJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOwoJa2ZyZWUoZXBzX2NwdVtjcHVdKTsKCWVwc19jcHVbY3B1XSA9IE5VTEw7CglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGVwc19hdHRyW10gPSB7CgkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCglOVUxMLAp9OwoKc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBlcHNfZHJpdmVyID0gewoJLnZlcmlmeQkJPSBlcHNfdmVyaWZ5LAoJLnRhcmdldAkJPSBlcHNfdGFyZ2V0LAoJLmluaXQJCT0gZXBzX2NwdV9pbml0LAoJLmV4aXQJCT0gZXBzX2NwdV9leGl0LAoJLmdldAkJPSBlcHNfZ2V0LAoJLm5hbWUJCT0gImVfcG93ZXJzYXZlciIsCgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuYXR0cgkJPSBlcHNfYXR0ciwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGVwc19pbml0KHZvaWQpCnsKCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YSgwKTsKCgkvKiBUaGlzIGRyaXZlciB3aWxsIHdvcmsgb25seSBvbiBDZW50YXVyIEM3IHByb2Nlc3NvcnMgd2l0aAoJICogRW5oYW5jZWQgU3BlZWRTdGVwL1Bvd2VyU2F2ZXIgcmVnaXN0ZXJzICovCglpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIKCSAgICB8fCBjLT54ODYgIT0gNiB8fCBjLT54ODZfbW9kZWwgPCAxMCkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQoJCXJldHVybiAtRU5PREVWOwoKCWlmIChjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZXBzX2RyaXZlcikpCgkJcmV0dXJuIC1FSU5WQUw7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19leGl0IGVwc19leGl0KHZvaWQpCnsKCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpOwp9CgpNT0RVTEVfQVVUSE9SKCJSYWZhsyBCaWxza2kgPHJhZmFsYmlsc2tpQGludGVyaWEucGw+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgUG93ZXJTYXZlciBkcml2ZXIgZm9yIFZJQSBDNyBDUFUncy4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoZXBzX2luaXQpOwptb2R1bGVfZXhpdChlcHNfZXhpdCk7Cg==