ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJrZXkvYXV0aF9kZXZpY2Vfa2V5LmMgYi9hcC9saWIvbGlia2V5L2F1dGhfZGV2aWNlX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjEzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlia2V5L2F1dGhfZGV2aWNlX2tleS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisquabE3L3pydyjutPDu6fEo8q9x9DR0LeixKPKvbz4yKgKKyq4utTwyMujugorKrG4t93Iy6O6Cisq0N64xMjVo7oyMDE5LzkvMjAKKyrQ3rjExNrI3aO6CisqsOaxvrrFo7p2MS4wCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgIm9zX3R5cGVfZGVmLmgiCisjaW5jbHVkZSAiUk9OdlBhcmFtX0FNVC5oIgorI2luY2x1ZGUgImxpYmNwbnYuaCIKKworaW50IGF1dGhfZGV2aWNlX2tleV9pbml0X3ZhbHVlKHZvaWQpCit7CisJLyqz9cq81rXOqjC08r+q0dC3osSjyr3Q6MPcwuvH0Lu7uabE3KOsxKzIz86qMbK7tPK/qiovCisJLy9yZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IHZlcmlmeV9kZXZpY2Vfa2V5KGNoYXIgKmRldmljZV9rZXksaW50IGtleV9sZW4sY2hhciAqc2VlZCxpbnQgc2VlZF9sZW4pCit7CisJaW50IHZlcmlmeV9yZXN1bHQgPSBhdXRoX2RldmljZV9rZXlfaW5pdF92YWx1ZSgpOworCS8vY2hhciBteUluaXRbMTZdID0gIlpYSUMtVFNQIjsKKwkKKwkvL7vxyKFJTUVJusUKKwl1bnNpZ25lZCBpbnQgcmV0Q29kZSA9ICBDUE5WX0VSUk9SOworICAgIHVuc2lnbmVkIGNoYXIgaW1laV9iY2RbOF09IHswfTsKKwlpbnQgYWJJbWVpaW5kZXggPSAwLGltZWlzdHJpbmRleCA9IDA7CisgICAgY2hhciBpbWVpc3RyWzIqOF0gPSB7MH07CisJaW50IGkgPSAwOworCisJaWYoKGRldmljZV9rZXkgPT0gTlVMTCl8fChrZXlfbGVuICE9IDYpfHwoc2VlZCA9PSBOVUxMKXx8KHNlZWRfbGVuICE9IDgpKQorCXsKKyAgICAJcHJpbnRmKCJwYXJhbWV0ZXIgZXJyb3IhXHJcbiIpOworCQlyZXR1cm4gdmVyaWZ5X3Jlc3VsdDsKKwl9CisJcHJpbnRmKCJwYXJhbWV0ZXIgZGV2aWNlIGtleSA9ICVzLGtleV9sZW49JWQsc2VlZCA9ICVzLHNlZWRfbGVuPSVkXHJcbiIsZGV2aWNlX2tleSxrZXlfbGVuLHNlZWQsc2VlZF9sZW4pOworCXJldENvZGUgPSBjcG52X052SXRlbVJlYWQoT1NfRkxBU0hfQU1UX0NPTU1fUk9fSU1FSV9BRERSRVNTLCAodW5zaWduZWQgY2hhciAqKWltZWlfYmNkLCBPU19GTEFTSF9BTVRfQ09NTV9ST19JTUVJX1NJWkUpOworICAgIHByaW50ZigicmV0Q29kZSA9ICVkXHJcbiIscmV0Q29kZSApOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0Q29kZSApCisgICAgeworICAgICAgICBwcmludGYoInJlYWQgaW1laSBmYWlsIVxyXG4iKTsKKyAgICAgICAgcmV0dXJuIHZlcmlmeV9yZXN1bHQ7IC8vu/HIoWltZWm6xcqnsNwKKyAgICB9CisgICAgI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGltZWlfYmNkKTsgaSsrKQorCXsKKwkJcHJpbnRmKCJpbWVpX2JjZFslZF0gPSAlMDJ4XHJcbiIsaSxpbWVpX2JjZFtpXSk7CisJfQorICAgIAorICAgIGZvciAoYWJJbWVpaW5kZXg9MDsgYWJJbWVpaW5kZXg8IDgtMTsgYWJJbWVpaW5kZXgrKyxpbWVpc3RyaW5kZXgrPTIpCisgICAgeworICAgICAgICBpbWVpc3RyW2ltZWlzdHJpbmRleF0gPSAoaW1laV9iY2RbYWJJbWVpaW5kZXhdJjB4MEYpICsgJzAnOworICAgICAgICBpbWVpc3RyW2ltZWlzdHJpbmRleCsxXSA9ICgoaW1laV9iY2RbYWJJbWVpaW5kZXhdJjB4RjApPj40KSsgJzAnOworICAgIH0KKyAgICAKKyAgICBpbWVpc3RyWzIqOC0yXT0oaW1laV9iY2RbOC0xXSYweDBGKSsgJzAnOworICAgIGltZWlzdHJbMio4LTFdID0gJ1wwJzsKKworCXByaW50ZigiaW1laSA9ICVzXHJcbiIsaW1laXN0cik7CisJI2VuZGlmCisJCisgICAgaW1laV9iY2RbN10gfD0gMHhGMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGltZWlfYmNkKTsgaSsrKQorCXsKKwkJaW1laV9iY2RbaV0gKz0gc2VlZFtpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGltZWlfYmNkKTsgaSsrKQorCXsKKwkJcHJpbnRmKCJpbWVpX2JjZFslZF0gPSAlMDJ4XHJcbiIsaSxpbWVpX2JjZFtpXSk7CisJfQorCisJdW5zaWduZWQgaW50IGNyYyA9IGNyYzMyKDAsIGltZWlfYmNkLCBzaXplb2YoaW1laV9iY2QpKTsKKwlwcmludGYoImNyYyA9ICUwMnhcclxuIixjcmMpOworCisJY2hhciBidWZbMTZdID0geyAwIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJYnVmW2ldID0gKChjcmMgPj4gKDI4IC0gaSAqIDQpKSAmIDB4Rik7CisJCWlmIChidWZbaV0gPiA5KQorCQl7CisJCQlidWZbaV0gPSBidWZbaV0gKyAnQScgLSAxMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJ1ZltpXSA9IGJ1ZltpXSArICcwJzsKKwkJfQorCX0KKworCS8vcHJpbnRmKCJidWYgPSAlc1xyXG4iLGJ1Zik7CisKKwlwcmludGYoImN1cnJlbnQgZGV2aWNlIGtleSA9ICVzXHJcbiIsYnVmKzIpOworCisJaWYoc3RyY21wKGJ1ZisyLGRldmljZV9rZXkpPT0gMCkKKwl7CisJCXZlcmlmeV9yZXN1bHQgPSAxOworCQlwcmludGYoInZlcmlmeSBkZXZpY2Uga2V5IHN1Y2Nlc3MhdmVyaWZ5X3Jlc3VsdD0lZFxyXG4iLHZlcmlmeV9yZXN1bHQpOworCX0KKwllbHNlCisJeworCQlwcmludGYoInZlcmlmeSBkZXZpY2Uga2V5IGZhaWwhdmVyaWZ5X3Jlc3VsdD0lZFxyXG4iLHZlcmlmeV9yZXN1bHQpOworCX0KKwkKKwlyZXR1cm4gdmVyaWZ5X3Jlc3VsdDsKK30KKworCisK