ZGlmZiAtLWdpdCBhL2hvc3RhcGQvQW5kcm9pZC5tayBiL2hvc3RhcGQvQW5kcm9pZC5tawppbmRleCAxMDdmMzgxLi43ZjFlNmU2IDEwMDY0NAotLS0gYS9ob3N0YXBkL0FuZHJvaWQubWsKKysrIGIvaG9zdGFwZC9BbmRyb2lkLm1rCkBAIC0xMDAsNiArMTAwLDcgQEAKIE5FRURfQUVTPXkKIE5FRURfTUQ1PXkKIE5FRURfU0hBMT15CitORUVEX1NIQTI1Nj15CiAKIE9CSlMgKz0gc3JjL2RyaXZlcnMvZHJpdmVycy5jCiBMX0NGTEFHUyArPSAtREhPU1RBUEQKQEAgLTE0NSw2ICsxNDYsNyBAQAogZWxzZQogT0JKUyArPSBzcmMvcmFkaXVzL3JhZGl1cy5jCiBPQkpTICs9IHNyYy9yYWRpdXMvcmFkaXVzX2NsaWVudC5jCitPQkpTICs9IHNyYy9yYWRpdXMvcmFkaXVzX2Rhcy5jCiBlbmRpZgogCiBpZmRlZiBDT05GSUdfTk9fQUNDT1VOVElORwpAQCAtMTU3LDYgKzE1OSwxMiBAQAogTF9DRkxBR1MgKz0gLURDT05GSUdfTk9fVkxBTgogZWxzZQogT0JKUyArPSBzcmMvYXAvdmxhbl9pbml0LmMKK2lmZGVmIENPTkZJR19WTEFOX05FVExJTksKK2lmZGVmIENPTkZJR19GVUxMX0RZTkFNSUNfVkxBTgorT0JKUyArPSBzcmMvYXAvdmxhbl91dGlsLmMKK2VuZGlmCitMX0NGTEFHUyArPSAtRENPTkZJR19WTEFOX05FVExJTksKK2VuZGlmCiBlbmRpZgogCiBpZmRlZiBDT05GSUdfTk9fQ1RSTF9JRkFDRQpAQCAtMTk5LDEwICsyMDcsMjMgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCitpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExVgorT0JKUyArPSBzcmMvYXAvd25tX2FwLmMKK2VuZGlmCisKIGlmZGVmIENPTkZJR19JRUVFODAyMTFOCiBMX0NGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFOCiBlbmRpZgogCitpZmRlZiBDT05GSUdfV05NCitMX0NGTEFHUyArPSAtRENPTkZJR19XTk0KK2VuZGlmCisKK2lmZGVmIENPTkZJR19JRUVFODAyMTFBQworTF9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExQUMKK2VuZGlmCisKIGluY2x1ZGUgJChMT0NBTF9QQVRIKS9zcmMvZHJpdmVycy9kcml2ZXJzLm1rCiAKIE9CSlMgKz0gJChEUlZfQVBfT0JKUykKQEAgLTIzOSw2ICsyNjAsMTQgQEAKIFRMU19GVU5DUz15CiBlbmRpZgogCitpZmRlZiBDT05GSUdfRUFQX1VOQVVUSF9UTFMKK0xfQ0ZMQUdTICs9IC1ERUFQX1NFUlZFUl9VTkFVVEhfVExTCitpZm5kZWYgQ09ORklHX0VBUF9UTFMKK09CSlMgKz0gc3JjL2VhcF9zZXJ2ZXIvZWFwX3NlcnZlcl90bHMuYworVExTX0ZVTkNTPXkKK2VuZGlmCitlbmRpZgorCiBpZmRlZiBDT05GSUdfRUFQX1BFQVAKIExfQ0ZMQUdTICs9IC1ERUFQX1NFUlZFUl9QRUFQCiBPQkpTICs9IHNyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfcGVhcC5jCkBAIC00NzIsNiArNTAxLDE1IEBACiBDT05GSUdfVExTPW9wZW5zc2wKIGVuZGlmCiAKK2lmZGVmIENPTkZJR19UTFNWMTEKK0xfQ0ZMQUdTICs9IC1EQ09ORklHX1RMU1YxMQorZW5kaWYKKworaWZkZWYgQ09ORklHX1RMU1YxMgorTF9DRkxBR1MgKz0gLURDT05GSUdfVExTVjEyCitORUVEX1NIQTI1Nj15CitlbmRpZgorCiBpZmVxICgkKENPTkZJR19UTFMpLCBvcGVuc3NsKQogaWZkZWYgVExTX0ZVTkNTCiBPQkpTICs9IHNyYy9jcnlwdG8vdGxzX29wZW5zc2wuYwpAQCAtNDkwLDEwICs1MjgsNiBAQAogaWZkZWYgVExTX0ZVTkNTCiBPQkpTICs9IHNyYy9jcnlwdG8vdGxzX2dudXRscy5jCiBMSUJTICs9IC1sZ251dGxzIC1sZ3BnLWVycm9yCi1pZmRlZiBDT05GSUdfR05VVExTX0VYVFJBCi1MX0NGTEFHUyArPSAtRENPTkZJR19HTlVUTFNfRVhUUkEKLUxJQlMgKz0gLWxnbnV0bHMtZXh0cmEKLWVuZGlmCiBlbmRpZgogT0JKUyArPSBzcmMvY3J5cHRvL2NyeXB0b19nbnV0bHMuYwogSE9CSlMgKz0gc3JjL2NyeXB0by9jcnlwdG9fZ251dGxzLmMKQEAgLTU1NSw2ICs1ODksOSBAQAogTkVFRF9TSEEyNTY9eQogTkVFRF9CQVNFNjQ9eQogTkVFRF9UTFNfUFJGPXkKK2lmZGVmIENPTkZJR19UTFNWMTIKK05FRURfVExTX1BSRl9TSEEyNTY9eQorZW5kaWYKIE5FRURfTU9ERVhQPXkKIE5FRURfQ0lQSEVSPXkKIExfQ0ZMQUdTICs9IC1EQ09ORklHX1RMU19JTlRFUk5BTApAQCAtNjY5LDE0ICs3MDYsMTkgQEAKIAogU0hBMU9CSlMgPQogaWZkZWYgTkVFRF9TSEExCitpZm5lcSAoJChDT05GSUdfVExTKSwgb3BlbnNzbCkKIFNIQTFPQkpTICs9IHNyYy9jcnlwdG8vc2hhMS5jCitlbmRpZgorU0hBMU9CSlMgKz0gc3JjL2NyeXB0by9zaGExLXByZi5jCiBpZmRlZiBDT05GSUdfSU5URVJOQUxfU0hBMQogU0hBMU9CSlMgKz0gc3JjL2NyeXB0by9zaGExLWludGVybmFsLmMKIGlmZGVmIE5FRURfRklQUzE4Nl8yX1BSRgogU0hBMU9CSlMgKz0gc3JjL2NyeXB0by9maXBzX3ByZl9pbnRlcm5hbC5jCiBlbmRpZgogZW5kaWYKK2lmbmVxICgkKENPTkZJR19UTFMpLCBvcGVuc3NsKQogU0hBMU9CSlMgKz0gc3JjL2NyeXB0by9zaGExLXBia2RmMi5jCitlbmRpZgogaWZkZWYgTkVFRF9UX1BSRgogU0hBMU9CSlMgKz0gc3JjL2NyeXB0by9zaGExLXRwcmYuYwogZW5kaWYKQEAgLTcxNSwxMCArNzU3LDE3IEBACiBlbmRpZgogCiBpZmRlZiBORUVEX1NIQTI1NgorTF9DRkxBR1MgKz0gLURDT05GSUdfU0hBMjU2CitpZm5lcSAoJChDT05GSUdfVExTKSwgb3BlbnNzbCkKIE9CSlMgKz0gc3JjL2NyeXB0by9zaGEyNTYuYworZW5kaWYKK09CSlMgKz0gc3JjL2NyeXB0by9zaGEyNTYtcHJmLmMKIGlmZGVmIENPTkZJR19JTlRFUk5BTF9TSEEyNTYKIE9CSlMgKz0gc3JjL2NyeXB0by9zaGEyNTYtaW50ZXJuYWwuYwogZW5kaWYKK2lmZGVmIE5FRURfVExTX1BSRl9TSEEyNTYKK09CSlMgKz0gc3JjL2NyeXB0by9zaGEyNTYtdGxzcHJmLmMKK2VuZGlmCiBlbmRpZgogCiBpZmRlZiBORUVEX0RIX0dST1VQUwpAQCAtNzM4LDYgKzc4Nyw3IEBACiBlbHNlCiBPQkpTICs9IHNyYy9jcnlwdG8vcmFuZG9tLmMKIEhPQkpTICs9IHNyYy9jcnlwdG8vcmFuZG9tLmMKK0hPQkpTICs9IHNyYy91dGlscy9lbG9vcC5jCiBIT0JKUyArPSAkKFNIQTFPQkpTKQogSE9CSlMgKz0gc3JjL2NyeXB0by9tZDUuYwogZW5kaWYKQEAgLTc3NiwxMSArODI2LDI3IEBACiBPQkpTICs9IHNyYy9hcC9pZWVlODAyXzExX2h0LmMKIGVuZGlmCiAKK2lmZGVmIENPTkZJR19JRUVFODAyMTFBQworT0JKUyArPSBzcmMvYXAvaWVlZTgwMl8xMV92aHQuYworZW5kaWYKKwogaWZkZWYgQ09ORklHX1AyUF9NQU5BR0VSCiBMX0NGTEFHUyArPSAtRENPTkZJR19QMlBfTUFOQUdFUgogT0JKUyArPSBzcmMvYXAvcDJwX2hvc3RhcGQuYwogZW5kaWYKIAoraWZkZWYgQ09ORklHX0hTMjAKK0xfQ0ZMQUdTICs9IC1EQ09ORklHX0hTMjAKK09CSlMgKz0gc3JjL2FwL2hzMjAuYworQ09ORklHX0lOVEVSV09SS0lORz15CitlbmRpZgorCitpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCitMX0NGTEFHUyArPSAtRENPTkZJR19JTlRFUldPUktJTkcKK09CSlMgKz0gc3JjL2NvbW1vbi9nYXMuYworT0JKUyArPSBzcmMvYXAvZ2FzX3NlcnYuYworZW5kaWYKKwogT0JKUyArPSBzcmMvZHJpdmVycy9kcml2ZXJfY29tbW9uLmMKIAogaWZkZWYgQ09ORklHX05PX1NURE9VVF9ERUJVRwpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9NYWtlZmlsZSBiL2hvc3RhcGQvTWFrZWZpbGUKaW5kZXggYjQzYWE3NS4uNjgwOWIwNyAxMDA2NDQKLS0tIGEvaG9zdGFwZC9NYWtlZmlsZQorKysgYi9ob3N0YXBkL01ha2VmaWxlCkBAIC0xMjMsNiArMTIzLDEyIEBACiBDRkxBR1MgKz0gLURDT05GSUdfTk9fVkxBTgogZWxzZQogT0JKUyArPSAuLi9zcmMvYXAvdmxhbl9pbml0Lm8KK2lmZGVmIENPTkZJR19WTEFOX05FVExJTksKK2lmZGVmIENPTkZJR19GVUxMX0RZTkFNSUNfVkxBTgorT0JKUyArPSAuLi9zcmMvYXAvdmxhbl91dGlsLm8KK2VuZGlmCitDRkxBR1MgKz0gLURDT05GSUdfVkxBTl9ORVRMSU5LCitlbmRpZgogZW5kaWYKIAogaWZkZWYgQ09ORklHX05PX0NUUkxfSUZBQ0UKQEAgLTE2NSw2ICsxNzEsMTEgQEAKIE5FRURfQUVTX1VOV1JBUD15CiBlbmRpZgogCitpZmRlZiBDT05GSUdfSUVFRTgwMjExVgorQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMVYKK09CSlMgKz0gLi4vc3JjL2FwL3dubV9hcC5vCitlbmRpZgorCiBpZmRlZiBDT05GSUdfSUVFRTgwMjExTgogQ0ZMQUdTICs9IC1EQ09ORklHX0lFRUU4MDIxMU4KIGVuZGlmCkBAIC0yMTIsNiArMjIzLDE0IEBACiBUTFNfRlVOQ1M9eQogZW5kaWYKIAoraWZkZWYgQ09ORklHX0VBUF9VTkFVVEhfVExTCitDRkxBR1MgKz0gLURFQVBfU0VSVkVSX1VOQVVUSF9UTFMKK2lmbmRlZiBDT05GSUdfRUFQX1RMUworT0JKUyArPSAuLi9zcmMvZWFwX3NlcnZlci9lYXBfc2VydmVyX3Rscy5vCitUTFNfRlVOQ1M9eQorZW5kaWYKK2VuZGlmCisKIGlmZGVmIENPTkZJR19FQVBfUEVBUAogQ0ZMQUdTICs9IC1ERUFQX1NFUlZFUl9QRUFQCiBPQkpTICs9IC4uL3NyYy9lYXBfc2VydmVyL2VhcF9zZXJ2ZXJfcGVhcC5vCkBAIC02NDksMTQgKzY2OCwxOSBAQAogZW5kaWYKIAogaWZkZWYgTkVFRF9TSEExCitpZm5lcSAoJChDT05GSUdfVExTKSwgb3BlbnNzbCkKIFNIQTFPQkpTICs9IC4uL3NyYy9jcnlwdG8vc2hhMS5vCitlbmRpZgorU0hBMU9CSlMgKz0gLi4vc3JjL2NyeXB0by9zaGExLXByZi5vCiBpZmRlZiBDT05GSUdfSU5URVJOQUxfU0hBMQogU0hBMU9CSlMgKz0gLi4vc3JjL2NyeXB0by9zaGExLWludGVybmFsLm8KIGlmZGVmIE5FRURfRklQUzE4Nl8yX1BSRgogU0hBMU9CSlMgKz0gLi4vc3JjL2NyeXB0by9maXBzX3ByZl9pbnRlcm5hbC5vCiBlbmRpZgogZW5kaWYKK2lmbmVxICgkKENPTkZJR19UTFMpLCBvcGVuc3NsKQogU0hBMU9CSlMgKz0gLi4vc3JjL2NyeXB0by9zaGExLXBia2RmMi5vCitlbmRpZgogaWZkZWYgTkVFRF9UX1BSRgogU0hBMU9CSlMgKz0gLi4vc3JjL2NyeXB0by9zaGExLXRwcmYubwogZW5kaWYKQEAgLTY5Niw3ICs3MjAsMTAgQEAKIAogaWZkZWYgTkVFRF9TSEEyNTYKIENGTEFHUyArPSAtRENPTkZJR19TSEEyNTYKK2lmbmVxICgkKENPTkZJR19UTFMpLCBvcGVuc3NsKQogT0JKUyArPSAuLi9zcmMvY3J5cHRvL3NoYTI1Ni5vCitlbmRpZgorT0JKUyArPSAuLi9zcmMvY3J5cHRvL3NoYTI1Ni1wcmYubwogaWZkZWYgQ09ORklHX0lOVEVSTkFMX1NIQTI1NgogT0JKUyArPSAuLi9zcmMvY3J5cHRvL3NoYTI1Ni1pbnRlcm5hbC5vCiBlbmRpZgpAQCAtNzcwLDYgKzc5NywxMiBAQAogT0JKUyArPSAuLi9zcmMvYXAvcDJwX2hvc3RhcGQubwogZW5kaWYKIAoraWZkZWYgQ09ORklHX0hTMjAKK0NGTEFHUyArPSAtRENPTkZJR19IUzIwCitPQkpTICs9IC4uL3NyYy9hcC9oczIwLm8KK0NPTkZJR19JTlRFUldPUktJTkc9eQorZW5kaWYKKwogaWZkZWYgQ09ORklHX0lOVEVSV09SS0lORwogQ0ZMQUdTICs9IC1EQ09ORklHX0lOVEVSV09SS0lORwogT0JKUyArPSAuLi9zcmMvY29tbW9uL2dhcy5vCkBAIC04NTksNiArODkyLDExIEBACiBMSUJTX24gKz0gLWxjcnlwdG8KIGVuZGlmCiAKK2lmZGVmIENPTkZJR19TUUxJVEUKK0NGTEFHUyArPSAtRENPTkZJR19TUUxJVEUKK0xJQlNfaCArPSAtbHNxbGl0ZTMKK2VuZGlmCisKIEhPQkpTICs9IGhscl9hdWNfZ3cubyAuLi9zcmMvdXRpbHMvY29tbW9uLm8gLi4vc3JjL3V0aWxzL3dwYV9kZWJ1Zy5vIC4uL3NyYy91dGlscy9vc18kKENPTkZJR19PUykubyAuLi9zcmMvdXRpbHMvd3BhYnVmLm8gLi4vc3JjL2NyeXB0by9taWxlbmFnZS5vCiBIT0JKUyArPSAuLi9zcmMvY3J5cHRvL2Flcy1lbmNibG9jay5vCiBpZmRlZiBDT05GSUdfSU5URVJOQUxfQUVTCmRpZmYgLS1naXQgYS9ob3N0YXBkL2NvbmZpZ19maWxlLmMgYi9ob3N0YXBkL2NvbmZpZ19maWxlLmMKaW5kZXggZWViYmFhNi4uMGEyNGVjMyAxMDA2NDQKLS0tIGEvaG9zdGFwZC9jb25maWdfZmlsZS5jCisrKyBiL2hvc3RhcGQvY29uZmlnX2ZpbGUuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCWlmICgqcG9zICE9ICdcMCcpCiAJCQl2bGFuX2lkID0gYXRvaShwb3MpOwogCi0JCW5ld2FjbCA9IG9zX3JlYWxsb2MoKmFjbCwgKCpudW0gKyAxKSAqIHNpemVvZigqKmFjbCkpOworCQluZXdhY2wgPSBvc19yZWFsbG9jX2FycmF5KCphY2wsICpudW0gKyAxLCBzaXplb2YoKiphY2wpKTsKIAkJaWYgKG5ld2FjbCA9PSBOVUxMKSB7CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIk1BQyBsaXN0IHJlYWxsb2NhdGlvbiBmYWlsZWQiKTsKIAkJCWZjbG9zZShmKTsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCWludCByZXQ7CiAJc3RhdGljIGludCBzZXJ2ZXJfaW5kZXggPSAxOwogCi0JbnNlcnYgPSBvc19yZWFsbG9jKCpzZXJ2ZXIsICgqbnVtX3NlcnZlciArIDEpICogc2l6ZW9mKCpuc2VydikpOworCW5zZXJ2ID0gb3NfcmVhbGxvY19hcnJheSgqc2VydmVyLCAqbnVtX3NlcnZlciArIDEsIHNpemVvZigqbnNlcnYpKTsKIAlpZiAobnNlcnYgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCkBAIC01NjcsMjUgKzU2NywyMSBAQAogCQkJCSAgICBjb25zdCBjaGFyICp2YWwpCiB7CiAJY2hhciAqc2VjcmV0OwotCXNpemVfdCBsZW47CiAKIAlzZWNyZXQgPSBvc19zdHJjaHIodmFsLCAnICcpOwogCWlmIChzZWNyZXQgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCiAJc2VjcmV0Kys7Ci0JbGVuID0gb3Nfc3RybGVuKHNlY3JldCk7CiAKIAlpZiAoaG9zdGFwZF9wYXJzZV9pcF9hZGRyKHZhbCwgJmJzcy0+cmFkaXVzX2Rhc19jbGllbnRfYWRkcikpCiAJCXJldHVybiAtMTsKIAogCW9zX2ZyZWUoYnNzLT5yYWRpdXNfZGFzX3NoYXJlZF9zZWNyZXQpOwotCWJzcy0+cmFkaXVzX2Rhc19zaGFyZWRfc2VjcmV0ID0gb3NfbWFsbG9jKGxlbik7CisJYnNzLT5yYWRpdXNfZGFzX3NoYXJlZF9zZWNyZXQgPSAodTggKikgb3Nfc3RyZHVwKHNlY3JldCk7CiAJaWYgKGJzcy0+cmFkaXVzX2Rhc19zaGFyZWRfc2VjcmV0ID09IE5VTEwpCiAJCXJldHVybiAtMTsKLQotCW9zX21lbWNweShic3MtPnJhZGl1c19kYXNfc2hhcmVkX3NlY3JldCwgc2VjcmV0LCBsZW4pOwotCWJzcy0+cmFkaXVzX2Rhc19zaGFyZWRfc2VjcmV0X2xlbiA9IGxlbjsKKwlic3MtPnJhZGl1c19kYXNfc2hhcmVkX3NlY3JldF9sZW4gPSBvc19zdHJsZW4oc2VjcmV0KTsKIAogCXJldHVybiAwOwogfQpAQCAtNjczLDYgKzY2OSw4IEBACiAJCSplbmQgPSAnXDAnOwogCQlpZiAob3Nfc3RyY21wKHN0YXJ0LCAiQ0NNUCIpID09IDApCiAJCQl2YWwgfD0gV1BBX0NJUEhFUl9DQ01QOworCQllbHNlIGlmIChvc19zdHJjbXAoc3RhcnQsICJHQ01QIikgPT0gMCkKKwkJCXZhbCB8PSBXUEFfQ0lQSEVSX0dDTVA7CiAJCWVsc2UgaWYgKG9zX3N0cmNtcChzdGFydCwgIlRLSVAiKSA9PSAwKQogCQkJdmFsIHw9IFdQQV9DSVBIRVJfVEtJUDsKIAkJZWxzZSBpZiAob3Nfc3RyY21wKHN0YXJ0LCAiV0VQMTA0IikgPT0gMCkKQEAgLTc4NCw4ICs3ODIsOCBAQAogCWlmICgqaWZuYW1lID09ICdcMCcpCiAJCXJldHVybiAtMTsKIAotCWJzcyA9IG9zX3JlYWxsb2MoY29uZi0+YnNzLCAoY29uZi0+bnVtX2JzcyArIDEpICoKLQkJCSBzaXplb2Yoc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZykpOworCWJzcyA9IG9zX3JlYWxsb2NfYXJyYXkoY29uZi0+YnNzLCBjb25mLT5udW1fYnNzICsgMSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZykpOwogCWlmIChic3MgPT0gTlVMTCkgewogCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKIAkJCSAgICJtdWx0aS1CU1MgZW50cnkiKTsKQEAgLTkwOSw3OCArOTA3LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IGhvc3RhcGRfY29uZmlnX3dtbV9hYyhzdHJ1Y3QgaG9zdGFwZF9jb25maWcgKmNvbmYsIGNoYXIgKm5hbWUsCi0JCQkJIGNoYXIgKnZhbCkKLXsKLQlpbnQgbnVtLCB2OwotCWNoYXIgKnBvczsKLQlzdHJ1Y3QgaG9zdGFwZF93bW1fYWNfcGFyYW1zICphYzsKLQotCS8qIHNraXAgJ3dtZV9hY18nIG9yICd3bW1fYWNfJyBwcmVmaXggKi8KLQlwb3MgPSBuYW1lICsgNzsKLQlpZiAob3Nfc3RybmNtcChwb3MsICJiZV8iLCAzKSA9PSAwKSB7Ci0JCW51bSA9IDA7Ci0JCXBvcyArPSAzOwotCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJia18iLCAzKSA9PSAwKSB7Ci0JCW51bSA9IDE7Ci0JCXBvcyArPSAzOwotCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJ2aV8iLCAzKSA9PSAwKSB7Ci0JCW51bSA9IDI7Ci0JCXBvcyArPSAzOwotCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJ2b18iLCAzKSA9PSAwKSB7Ci0JCW51bSA9IDM7Ci0JCXBvcyArPSAzOwotCX0gZWxzZSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiVW5rbm93biBXTU0gbmFtZSAnJXMnIiwgcG9zKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWFjID0gJmNvbmYtPndtbV9hY19wYXJhbXNbbnVtXTsKLQotCWlmIChvc19zdHJjbXAocG9zLCAiYWlmcyIpID09IDApIHsKLQkJdiA9IGF0b2kodmFsKTsKLQkJaWYgKHYgPCAxIHx8IHYgPiAyNTUpIHsKLQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiSW52YWxpZCBBSUZTIHZhbHVlICVkIiwgdik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYWMtPmFpZnMgPSB2OwotCX0gZWxzZSBpZiAob3Nfc3RyY21wKHBvcywgImN3bWluIikgPT0gMCkgewotCQl2ID0gYXRvaSh2YWwpOwotCQlpZiAodiA8IDAgfHwgdiA+IDEyKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkludmFsaWQgY3dNaW4gdmFsdWUgJWQiLCB2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhYy0+Y3dtaW4gPSB2OwotCX0gZWxzZSBpZiAob3Nfc3RyY21wKHBvcywgImN3bWF4IikgPT0gMCkgewotCQl2ID0gYXRvaSh2YWwpOwotCQlpZiAodiA8IDAgfHwgdiA+IDEyKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkludmFsaWQgY3dNYXggdmFsdWUgJWQiLCB2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhYy0+Y3dtYXggPSB2OwotCX0gZWxzZSBpZiAob3Nfc3RyY21wKHBvcywgInR4b3BfbGltaXQiKSA9PSAwKSB7Ci0JCXYgPSBhdG9pKHZhbCk7Ci0JCWlmICh2IDwgMCB8fCB2ID4gMHhmZmZmKSB7Ci0JCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkludmFsaWQgdHhvcCB2YWx1ZSAlZCIsIHYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWFjLT50eG9wX2xpbWl0ID0gdjsKLQl9IGVsc2UgaWYgKG9zX3N0cmNtcChwb3MsICJhY20iKSA9PSAwKSB7Ci0JCXYgPSBhdG9pKHZhbCk7Ci0JCWlmICh2IDwgMCB8fCB2ID4gMSkgewotCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJJbnZhbGlkIGFjbSB2YWx1ZSAlZCIsIHYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWFjLT5hZG1pc3Npb25fY29udHJvbF9tYW5kYXRvcnkgPSB2OwotCX0gZWxzZSB7Ci0JCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiVW5rbm93biB3bW1fYWNfIGZpZWxkICclcyciLCBwb3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQogI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCiBzdGF0aWMgaW50IGFkZF9yMGtoKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcywgY2hhciAqdmFsdWUpCiB7CkBAIC0xMjY4LDEwICsxMTk0LDEwIEBACiAKIAlpZiAoY29uZi0+aWVlZTgwMjExbiAmJiBic3MtPndwYSAmJgogCSAgICAhKGJzcy0+d3BhX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSAmJgotCSAgICAhKGJzcy0+cnNuX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9DQ01QKSkgeworCSAgICAhKGJzcy0+cnNuX3BhaXJ3aXNlICYgKFdQQV9DSVBIRVJfQ0NNUCB8IFdQQV9DSVBIRVJfR0NNUCkpKSB7CiAJCWJzcy0+ZGlzYWJsZV8xMW4gPSAxOwogCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkhUIChJRUVFIDgwMi4xMW4pIHdpdGggV1BBL1dQQTIgIgotCQkJICAgInJlcXVpcmVzIENDTVAgdG8gYmUgZW5hYmxlZCwgZGlzYWJsaW5nIEhUICIKKwkJCSAgICJyZXF1aXJlcyBDQ01QL0dDTVAgdG8gYmUgZW5hYmxlZCwgZGlzYWJsaW5nIEhUICIKIAkJCSAgICJjYXBhYmlsaXRpZXMiKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMU4gKi8KQEAgLTEyODgsOCArMTIxNCwyNyBAQAogCQkJICAgImRpc2FibGVkIik7CiAJCWJzcy0+d3BzX3N0YXRlID0gMDsKIAl9CisKKwlpZiAoYnNzLT53cHNfc3RhdGUgJiYgYnNzLT53cGEgJiYKKwkgICAgKCEoYnNzLT53cGEgJiAyKSB8fAorCSAgICAgIShic3MtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfQ0NNUCkpKSB7CisJCXdwYV9wcmludGYoTVNHX0lORk8sICJXUFM6IFdQQS9US0lQIGNvbmZpZ3VyYXRpb24gd2l0aG91dCAiCisJCQkgICAiV1BBMi9DQ01QIGZvcmNlZCBXUFMgdG8gYmUgZGlzYWJsZWQiKTsKKwkJYnNzLT53cHNfc3RhdGUgPSAwOworCX0KICNlbmRpZiAvKiBDT05GSUdfV1BTMiAqLwogCisjaWZkZWYgQ09ORklHX0hTMjAKKwlpZiAoYnNzLT5oczIwICYmCisJICAgICghKGJzcy0+d3BhICYgMikgfHwKKwkgICAgICEoYnNzLT5yc25fcGFpcndpc2UgJiAoV1BBX0NJUEhFUl9DQ01QIHwgV1BBX0NJUEhFUl9HQ01QKSkpKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiSFMgMi4wOiBXUEEyLUVudGVycHJpc2UvQ0NNUCAiCisJCQkgICAiY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgSG90c3BvdCAyLjAgIgorCQkJICAgImZ1bmN0aW9uYWxpdHkiKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzAsOSArMTI3NSw5IEBACiAJfQogCWxlbiAvPSAyOwogCi0JcmMgPSBvc19yZWFsbG9jKGJzcy0+cm9hbWluZ19jb25zb3J0aXVtLAotCQkJc2l6ZW9mKHN0cnVjdCBob3N0YXBkX3JvYW1pbmdfY29uc29ydGl1bSkgKgotCQkJKGJzcy0+cm9hbWluZ19jb25zb3J0aXVtX2NvdW50ICsgMSkpOworCXJjID0gb3NfcmVhbGxvY19hcnJheShic3MtPnJvYW1pbmdfY29uc29ydGl1bSwKKwkJCSAgICAgIGJzcy0+cm9hbWluZ19jb25zb3J0aXVtX2NvdW50ICsgMSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaG9zdGFwZF9yb2FtaW5nX2NvbnNvcnRpdW0pKTsKIAlpZiAocmMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCkBAIC0xMzQ2LDUwICsxMjkxLDM4NyBAQAogfQogCiAKLXN0YXRpYyBpbnQgcGFyc2VfdmVudWVfbmFtZShzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpic3MsIGNoYXIgKnBvcywKLQkJCSAgICBpbnQgbGluZSkKK3N0YXRpYyBpbnQgcGFyc2VfbGFuZ19zdHJpbmcoc3RydWN0IGhvc3RhcGRfbGFuZ19zdHJpbmcgKiphcnJheSwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpjb3VudCwgY2hhciAqcG9zKQogewogCWNoYXIgKnNlcDsKIAlzaXplX3QgY2xlbiwgbmxlbjsKLQlzdHJ1Y3QgaG9zdGFwZF92ZW51ZV9uYW1lICp2bjsKKwlzdHJ1Y3QgaG9zdGFwZF9sYW5nX3N0cmluZyAqbHM7CiAKIAlzZXAgPSBvc19zdHJjaHIocG9zLCAnOicpOwogCWlmIChzZXAgPT0gTlVMTCkKLQkJZ290byBmYWlsOworCQlyZXR1cm4gLTE7CiAJKnNlcCsrID0gJ1wwJzsKIAogCWNsZW4gPSBvc19zdHJsZW4ocG9zKTsKIAlpZiAoY2xlbiA8IDIpCi0JCWdvdG8gZmFpbDsKKwkJcmV0dXJuIC0xOwogCW5sZW4gPSBvc19zdHJsZW4oc2VwKTsKIAlpZiAobmxlbiA+IDI1MikKLQkJZ290byBmYWlsOwotCi0Jdm4gPSBvc19yZWFsbG9jKGJzcy0+dmVudWVfbmFtZSwKLQkJCXNpemVvZihzdHJ1Y3QgaG9zdGFwZF92ZW51ZV9uYW1lKSAqCi0JCQkoYnNzLT52ZW51ZV9uYW1lX2NvdW50ICsgMSkpOwotCWlmICh2biA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQlic3MtPnZlbnVlX25hbWUgPSB2bjsKLQl2biA9ICZic3MtPnZlbnVlX25hbWVbYnNzLT52ZW51ZV9uYW1lX2NvdW50XTsKLQlic3MtPnZlbnVlX25hbWVfY291bnQrKzsKKwlscyA9IG9zX3JlYWxsb2NfYXJyYXkoKmFycmF5LCAqY291bnQgKyAxLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0YXBkX2xhbmdfc3RyaW5nKSk7CisJaWYgKGxzID09IE5VTEwpCisJCXJldHVybiAtMTsKIAotCW9zX21lbXNldCh2bi0+bGFuZywgMCwgc2l6ZW9mKHZuLT5sYW5nKSk7Ci0Jb3NfbWVtY3B5KHZuLT5sYW5nLCBwb3MsIGNsZW4pOwotCXZuLT5uYW1lX2xlbiA9IG5sZW47Ci0Jb3NfbWVtY3B5KHZuLT5uYW1lLCBzZXAsIG5sZW4pOworCSphcnJheSA9IGxzOworCWxzID0gJigqYXJyYXkpWypjb3VudF07CisJKCpjb3VudCkrKzsKKworCW9zX21lbXNldChscy0+bGFuZywgMCwgc2l6ZW9mKGxzLT5sYW5nKSk7CisJb3NfbWVtY3B5KGxzLT5sYW5nLCBwb3MsIGNsZW4pOworCWxzLT5uYW1lX2xlbiA9IG5sZW47CisJb3NfbWVtY3B5KGxzLT5uYW1lLCBzZXAsIG5sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwYXJzZV92ZW51ZV9uYW1lKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcywgY2hhciAqcG9zLAorCQkJICAgIGludCBsaW5lKQoreworCWlmIChwYXJzZV9sYW5nX3N0cmluZygmYnNzLT52ZW51ZV9uYW1lLCAmYnNzLT52ZW51ZV9uYW1lX2NvdW50LCBwb3MpKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogSW52YWxpZCB2ZW51ZV9uYW1lICclcyciLAorCQkJICAgbGluZSwgcG9zKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBhcnNlXzNncHBfY2VsbF9uZXQoc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqYnNzLCBjaGFyICpidWYsCisJCQkgICAgICAgaW50IGxpbmUpCit7CisJc2l6ZV90IGNvdW50OworCWNoYXIgKnBvczsKKwl1OCAqaW5mbyA9IE5VTEwsICppcG9zOworCisJLyogZm9ybWF0OiA8TUNDMSxNTkMxPls7PE1DQzIsTU5DMj5dWzsuLi5dICovCisKKwljb3VudCA9IDE7CisJZm9yIChwb3MgPSBidWY7ICpwb3M7IHBvcysrKSB7CisJCWlmICgoKnBvcyA8ICcwJyAmJiAqcG9zID4gJzknKSAmJiAqcG9zICE9ICc7JyAmJiAqcG9zICE9ICcsJykKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCpwb3MgPT0gJzsnKQorCQkJY291bnQrKzsKKwl9CisJaWYgKDEgKyBjb3VudCAqIDMgPiAweDdmKQorCQlnb3RvIGZhaWw7CisKKwlpbmZvID0gb3NfemFsbG9jKDIgKyAzICsgY291bnQgKiAzKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpcG9zID0gaW5mbzsKKwkqaXBvcysrID0gMDsgLyogR1VEIC0gVmVyc2lvbiAxICovCisJKmlwb3MrKyA9IDMgKyBjb3VudCAqIDM7IC8qIFVzZXIgRGF0YSBIZWFkZXIgTGVuZ3RoIChVREhMKSAqLworCSppcG9zKysgPSAwOyAvKiBQTE1OIExpc3QgSUVJICovCisJLyogZXh0KGI4KSB8IExlbmd0aCBvZiBQTE1OIExpc3QgdmFsdWUgY29udGVudHMoYjcuLjEpICovCisJKmlwb3MrKyA9IDEgKyBjb3VudCAqIDM7CisJKmlwb3MrKyA9IGNvdW50OyAvKiBOdW1iZXIgb2YgUExNTnMgKi8KKworCXBvcyA9IGJ1ZjsKKwl3aGlsZSAocG9zICYmICpwb3MpIHsKKwkJY2hhciAqbWNjLCAqbW5jOworCQlzaXplX3QgbW5jX2xlbjsKKworCQltY2MgPSBwb3M7CisJCW1uYyA9IG9zX3N0cmNocihwb3MsICcsJyk7CisJCWlmIChtbmMgPT0gTlVMTCkKKwkJCWdvdG8gZmFpbDsKKwkJKm1uYysrID0gJ1wwJzsKKwkJcG9zID0gb3Nfc3RyY2hyKG1uYywgJzsnKTsKKwkJaWYgKHBvcykKKwkJCSpwb3MrKyA9ICdcMCc7CisKKwkJbW5jX2xlbiA9IG9zX3N0cmxlbihtbmMpOworCQlpZiAob3Nfc3RybGVuKG1jYykgIT0gMyB8fCAobW5jX2xlbiAhPSAyICYmIG1uY19sZW4gIT0gMykpCisJCQlnb3RvIGZhaWw7CisKKwkJLyogQkMgY29kZWQgTUNDLE1OQyAqLworCQkvKiBNQ0MgZGlnaXQgMiB8IE1DQyBkaWdpdCAxICovCisJCSppcG9zKysgPSAoKG1jY1sxXSAtICcwJykgPDwgNCkgfCAobWNjWzBdIC0gJzAnKTsKKwkJLyogTU5DIGRpZ2l0IDMgfCBNQ0MgZGlnaXQgMyAqLworCQkqaXBvcysrID0gKCgobW5jX2xlbiA9PSAyKSA/IDB4ZjAgOiAoKG1uY1syXSAtICcwJykgPDwgNCkpKSB8CisJCQkobWNjWzJdIC0gJzAnKTsKKwkJLyogTU5DIGRpZ2l0IDIgfCBNTkMgZGlnaXQgMSAqLworCQkqaXBvcysrID0gKChtbmNbMV0gLSAnMCcpIDw8IDQpIHwgKG1uY1swXSAtICcwJyk7CisJfQorCisJb3NfZnJlZShic3MtPmFucXBfM2dwcF9jZWxsX25ldCk7CisJYnNzLT5hbnFwXzNncHBfY2VsbF9uZXQgPSBpbmZvOworCWJzcy0+YW5xcF8zZ3BwX2NlbGxfbmV0X2xlbiA9IDIgKyAzICsgMyAqIGNvdW50OworCXdwYV9oZXhkdW1wKE1TR19NU0dEVU1QLCAiM0dQUCBDZWxsdWxhciBOZXR3b3JrIGluZm9ybWF0aW9uIiwKKwkJICAgIGJzcy0+YW5xcF8zZ3BwX2NlbGxfbmV0LCBic3MtPmFucXBfM2dwcF9jZWxsX25ldF9sZW4pOwogCiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0Jd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkIHZlbnVlX25hbWUgJyVzJyIsCi0JCSAgIGxpbmUsIHBvcyk7CisJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkIGFucXBfM2dwcF9jZWxsX25ldDogJXMiLAorCQkgICBsaW5lLCBidWYpOworCW9zX2ZyZWUoaW5mbyk7CiAJcmV0dXJuIC0xOwogfQorCisKK3N0YXRpYyBpbnQgcGFyc2VfbmFpX3JlYWxtKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcywgY2hhciAqYnVmLCBpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgaG9zdGFwZF9uYWlfcmVhbG1fZGF0YSAqcmVhbG07CisJc2l6ZV90IGksIGosIGxlbjsKKwlpbnQgKm9mZnNldHM7CisJY2hhciAqcG9zLCAqZW5kLCAqcnBvczsKKworCW9mZnNldHMgPSBvc19jYWxsb2MoYnNzLT5uYWlfcmVhbG1fY291bnQgKiBNQVhfTkFJX1JFQUxNUywKKwkJCSAgICBzaXplb2YoaW50KSk7CisJaWYgKG9mZnNldHMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IGJzcy0+bmFpX3JlYWxtX2NvdW50OyBpKyspIHsKKwkJcmVhbG0gPSAmYnNzLT5uYWlfcmVhbG1fZGF0YVtpXTsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9OQUlfUkVBTE1TOyBqKyspIHsKKwkJCW9mZnNldHNbaSAqIE1BWF9OQUlfUkVBTE1TICsgal0gPQorCQkJCXJlYWxtLT5yZWFsbVtqXSA/CisJCQkJcmVhbG0tPnJlYWxtW2pdIC0gcmVhbG0tPnJlYWxtX2J1ZiA6IC0xOworCQl9CisJfQorCisJcmVhbG0gPSBvc19yZWFsbG9jX2FycmF5KGJzcy0+bmFpX3JlYWxtX2RhdGEsIGJzcy0+bmFpX3JlYWxtX2NvdW50ICsgMSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBob3N0YXBkX25haV9yZWFsbV9kYXRhKSk7CisJaWYgKHJlYWxtID09IE5VTEwpIHsKKwkJb3NfZnJlZShvZmZzZXRzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlic3MtPm5haV9yZWFsbV9kYXRhID0gcmVhbG07CisKKwkvKiBwYXRjaCB0aGUgcG9pbnRlcnMgYWZ0ZXIgcmVhbGxvYyAqLworCWZvciAoaSA9IDA7IGkgPCBic3MtPm5haV9yZWFsbV9jb3VudDsgaSsrKSB7CisJCXJlYWxtID0gJmJzcy0+bmFpX3JlYWxtX2RhdGFbaV07CisJCWZvciAoaiA9IDA7IGogPCBNQVhfTkFJX1JFQUxNUzsgaisrKSB7CisJCQlpbnQgb2ZmcyA9IG9mZnNldHNbaSAqIE1BWF9OQUlfUkVBTE1TICsgal07CisJCQlpZiAob2ZmcyA+PSAwKQorCQkJCXJlYWxtLT5yZWFsbVtqXSA9IHJlYWxtLT5yZWFsbV9idWYgKyBvZmZzOworCQkJZWxzZQorCQkJCXJlYWxtLT5yZWFsbVtqXSA9IE5VTEw7CisJCX0KKwl9CisJb3NfZnJlZShvZmZzZXRzKTsKKworCXJlYWxtID0gJmJzcy0+bmFpX3JlYWxtX2RhdGFbYnNzLT5uYWlfcmVhbG1fY291bnRdOworCW9zX21lbXNldChyZWFsbSwgMCwgc2l6ZW9mKCpyZWFsbSkpOworCisJcG9zID0gYnVmOworCXJlYWxtLT5lbmNvZGluZyA9IGF0b2kocG9zKTsKKwlwb3MgPSBvc19zdHJjaHIocG9zLCAnLCcpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCXBvcysrOworCisJZW5kID0gb3Nfc3RyY2hyKHBvcywgJywnKTsKKwlpZiAoZW5kKSB7CisJCWxlbiA9IGVuZCAtIHBvczsKKwkJKmVuZCA9ICdcMCc7CisJfSBlbHNlIHsKKwkJbGVuID0gb3Nfc3RybGVuKHBvcyk7CisJfQorCisJaWYgKGxlbiA+IE1BWF9OQUlfUkVBTE1MRU4pIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJUb28gbG9uZyBhIHJlYWxtIHN0cmluZyAoJWQgPiBtYXggJWQgIgorCQkJICAgImNoYXJhY3RlcnMpIiwgKGludCkgbGVuLCBNQVhfTkFJX1JFQUxNTEVOKTsKKwkJZ290byBmYWlsOworCX0KKwlvc19tZW1jcHkocmVhbG0tPnJlYWxtX2J1ZiwgcG9zLCBsZW4pOworCisJaWYgKGVuZCkKKwkJcG9zID0gZW5kICsgMTsKKwllbHNlCisJCXBvcyA9IE5VTEw7CisKKwl3aGlsZSAocG9zICYmICpwb3MpIHsKKwkJc3RydWN0IGhvc3RhcGRfbmFpX3JlYWxtX2VhcCAqZWFwOworCisJCWlmIChyZWFsbS0+ZWFwX21ldGhvZF9jb3VudCA+PSBNQVhfTkFJX0VBUF9NRVRIT0RTKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlRvbyBtYW55IEVBUCBtZXRob2RzIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQllYXAgPSAmcmVhbG0tPmVhcF9tZXRob2RbcmVhbG0tPmVhcF9tZXRob2RfY291bnRdOworCQlyZWFsbS0+ZWFwX21ldGhvZF9jb3VudCsrOworCisJCWVuZCA9IG9zX3N0cmNocihwb3MsICcsJyk7CisJCWlmIChlbmQgPT0gTlVMTCkKKwkJCWVuZCA9IHBvcyArIG9zX3N0cmxlbihwb3MpOworCisJCWVhcC0+ZWFwX21ldGhvZCA9IGF0b2kocG9zKTsKKwkJZm9yICg7OykgeworCQkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJ1snKTsKKwkJCWlmIChwb3MgPT0gTlVMTCB8fCBwb3MgPiBlbmQpCisJCQkJYnJlYWs7CisJCQlwb3MrKzsKKwkJCWlmIChlYXAtPm51bV9hdXRocyA+PSBNQVhfTkFJX0FVVEhfVFlQRVMpIHsKKwkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlRvbyBtYW55IGF1dGggcGFyYW1zIik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJZWFwLT5hdXRoX2lkW2VhcC0+bnVtX2F1dGhzXSA9IGF0b2kocG9zKTsKKwkJCXBvcyA9IG9zX3N0cmNocihwb3MsICc6Jyk7CisJCQlpZiAocG9zID09IE5VTEwgfHwgcG9zID4gZW5kKQorCQkJCWdvdG8gZmFpbDsKKwkJCXBvcysrOworCQkJZWFwLT5hdXRoX3ZhbFtlYXAtPm51bV9hdXRoc10gPSBhdG9pKHBvcyk7CisJCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnXScpOworCQkJaWYgKHBvcyA9PSBOVUxMIHx8IHBvcyA+IGVuZCkKKwkJCQlnb3RvIGZhaWw7CisJCQlwb3MrKzsKKwkJCWVhcC0+bnVtX2F1dGhzKys7CisJCX0KKworCQlpZiAoKmVuZCAhPSAnLCcpCisJCQlicmVhazsKKworCQlwb3MgPSBlbmQgKyAxOworCX0KKworCS8qIFNwbGl0IHJlYWxtIGxpc3QgaW50byBudWxsIHRlcm1pbmF0ZWQgcmVhbG1zICovCisJcnBvcyA9IHJlYWxtLT5yZWFsbV9idWY7CisJaSA9IDA7CisJd2hpbGUgKCpycG9zKSB7CisJCWlmIChpID49IE1BWF9OQUlfUkVBTE1TKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlRvbyBtYW55IHJlYWxtcyIpOworCQkJZ290byBmYWlsOworCQl9CisJCXJlYWxtLT5yZWFsbVtpKytdID0gcnBvczsKKwkJcnBvcyA9IG9zX3N0cmNocihycG9zLCAnOycpOworCQlpZiAocnBvcyA9PSBOVUxMKQorCQkJYnJlYWs7CisJCSpycG9zKysgPSAnXDAnOworCX0KKworCWJzcy0+bmFpX3JlYWxtX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQgbmFpX3JlYWxtICclcyciLCBsaW5lLCBidWYpOworCXJldHVybiAtMTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KIAogCisjaWZkZWYgQ09ORklHX0hTMjAKK3N0YXRpYyBpbnQgaHMyMF9wYXJzZV9jb25uX2NhcGFiKHN0cnVjdCBob3N0YXBkX2Jzc19jb25maWcgKmJzcywgY2hhciAqYnVmLAorCQkJCSBpbnQgbGluZSkKK3sKKwl1OCAqY29ubl9jYXA7CisJY2hhciAqcG9zOworCisJaWYgKGJzcy0+aHMyMF9jb25uZWN0aW9uX2NhcGFiaWxpdHlfbGVuID49IDB4ZmZmMCkKKwkJcmV0dXJuIC0xOworCisJY29ubl9jYXAgPSBvc19yZWFsbG9jKGJzcy0+aHMyMF9jb25uZWN0aW9uX2NhcGFiaWxpdHksCisJCQkgICAgICBic3MtPmhzMjBfY29ubmVjdGlvbl9jYXBhYmlsaXR5X2xlbiArIDQpOworCWlmIChjb25uX2NhcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlic3MtPmhzMjBfY29ubmVjdGlvbl9jYXBhYmlsaXR5ID0gY29ubl9jYXA7CisJY29ubl9jYXAgKz0gYnNzLT5oczIwX2Nvbm5lY3Rpb25fY2FwYWJpbGl0eV9sZW47CisJcG9zID0gYnVmOworCWNvbm5fY2FwWzBdID0gYXRvaShwb3MpOworCXBvcyA9IG9zX3N0cmNocihwb3MsICc6Jyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcG9zKys7CisJV1BBX1BVVF9MRTE2KGNvbm5fY2FwICsgMSwgYXRvaShwb3MpKTsKKwlwb3MgPSBvc19zdHJjaHIocG9zLCAnOicpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBvcysrOworCWNvbm5fY2FwWzNdID0gYXRvaShwb3MpOworCWJzcy0+aHMyMF9jb25uZWN0aW9uX2NhcGFiaWxpdHlfbGVuICs9IDQ7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhzMjBfcGFyc2Vfd2FuX21ldHJpY3Moc3RydWN0IGhvc3RhcGRfYnNzX2NvbmZpZyAqYnNzLCBjaGFyICpidWYsCisJCQkJICBpbnQgbGluZSkKK3sKKwl1OCAqd2FuX21ldHJpY3M7CisJY2hhciAqcG9zOworCisJLyogPFdBTiBJbmZvPjo8REwgU3BlZWQ+OjxVTCBTcGVlZD46PERMIExvYWQ+OjxVTCBMb2FkPjo8TE1EPiAqLworCisJd2FuX21ldHJpY3MgPSBvc196YWxsb2MoMTMpOworCWlmICh3YW5fbWV0cmljcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwb3MgPSBidWY7CisJLyogV0FOIEluZm8gKi8KKwlpZiAoaGV4c3RyMmJpbihwb3MsIHdhbl9tZXRyaWNzLCAxKSA8IDApCisJCWdvdG8gZmFpbDsKKwlwb3MgKz0gMjsKKwlpZiAoKnBvcyAhPSAnOicpCisJCWdvdG8gZmFpbDsKKwlwb3MrKzsKKworCS8qIERvd25saW5rIFNwZWVkICovCisJV1BBX1BVVF9MRTMyKHdhbl9tZXRyaWNzICsgMSwgYXRvaShwb3MpKTsKKwlwb3MgPSBvc19zdHJjaHIocG9zLCAnOicpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCXBvcysrOworCisJLyogVXBsaW5rIFNwZWVkICovCisJV1BBX1BVVF9MRTMyKHdhbl9tZXRyaWNzICsgNSwgYXRvaShwb3MpKTsKKwlwb3MgPSBvc19zdHJjaHIocG9zLCAnOicpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCXBvcysrOworCisJLyogRG93bmxpbmsgTG9hZCAqLworCXdhbl9tZXRyaWNzWzldID0gYXRvaShwb3MpOworCXBvcyA9IG9zX3N0cmNocihwb3MsICc6Jyk7CisJaWYgKHBvcyA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJcG9zKys7CisKKwkvKiBVcGxpbmsgTG9hZCAqLworCXdhbl9tZXRyaWNzWzEwXSA9IGF0b2kocG9zKTsKKwlwb3MgPSBvc19zdHJjaHIocG9zLCAnOicpOworCWlmIChwb3MgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCXBvcysrOworCisJLyogTE1EICovCisJV1BBX1BVVF9MRTE2KHdhbl9tZXRyaWNzICsgMTEsIGF0b2kocG9zKSk7CisKKwlvc19mcmVlKGJzcy0+aHMyMF93YW5fbWV0cmljcyk7CisJYnNzLT5oczIwX3dhbl9tZXRyaWNzID0gd2FuX21ldHJpY3M7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IEludmFsaWQgaHMyMF93YW5fbWV0cmljcyAnJXMnIiwKKwkJICAgbGluZSwgcG9zKTsKKwlvc19mcmVlKHdhbl9tZXRyaWNzKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBoczIwX3BhcnNlX29wZXJfZnJpZW5kbHlfbmFtZShzdHJ1Y3QgaG9zdGFwZF9ic3NfY29uZmlnICpic3MsCisJCQkJCSBjaGFyICpwb3MsIGludCBsaW5lKQoreworCWlmIChwYXJzZV9sYW5nX3N0cmluZygmYnNzLT5oczIwX29wZXJfZnJpZW5kbHlfbmFtZSwKKwkJCSAgICAgICZic3MtPmhzMjBfb3Blcl9mcmllbmRseV9uYW1lX2NvdW50LCBwb3MpKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogSW52YWxpZCAiCisJCQkgICAiaHMyMF9vcGVyX2ZyaWVuZGx5X25hbWUgJyVzJyIsIGxpbmUsIHBvcyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KKworCiAjaWZkZWYgQ09ORklHX1dQU19ORkMKIHN0YXRpYyBzdHJ1Y3Qgd3BhYnVmICogaG9zdGFwZF9wYXJzZV9iaW4oY29uc3QgY2hhciAqYnVmKQogewpAQCAtMTQ3MCw5ICsxNzUyLDIyIEBACiAJCQl9IGVsc2UgewogCQkJCW9zX21lbWNweShic3MtPnNzaWQuc3NpZCwgcG9zLAogCQkJCQkgIGJzcy0+c3NpZC5zc2lkX2xlbik7Ci0JCQkJYnNzLT5zc2lkLnNzaWRbYnNzLT5zc2lkLnNzaWRfbGVuXSA9ICdcMCc7CiAJCQkJYnNzLT5zc2lkLnNzaWRfc2V0ID0gMTsKIAkJCX0KKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAic3NpZDIiKSA9PSAwKSB7CisJCQlzaXplX3Qgc2xlbjsKKwkJCWNoYXIgKnN0ciA9IHdwYV9jb25maWdfcGFyc2Vfc3RyaW5nKHBvcywgJnNsZW4pOworCQkJaWYgKHN0ciA9PSBOVUxMIHx8IHNsZW4gPCAxIHx8CisJCQkJICAgc2xlbiA+IEhPU1RBUERfTUFYX1NTSURfTEVOKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkIFNTSUQgIgorCQkJCQkgICAiJyVzJyIsIGxpbmUsIHBvcyk7CisJCQkJZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCW9zX21lbWNweShic3MtPnNzaWQuc3NpZCwgc3RyLCBzbGVuKTsKKwkJCQlic3MtPnNzaWQuc3NpZF9sZW4gPSBzbGVuOworCQkJCWJzcy0+c3NpZC5zc2lkX3NldCA9IDE7CisJCQl9CisJCQlvc19mcmVlKHN0cik7CiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIm1hY2FkZHJfYWNsIikgPT0gMCkgewogCQkJYnNzLT5tYWNhZGRyX2FjbCA9IGF0b2kocG9zKTsKIAkJCWlmIChic3MtPm1hY2FkZHJfYWNsICE9IEFDQ0VQVF9VTkxFU1NfREVOSUVEICYmCkBAIC0yMTIwLDYgKzI0MTUsMTUgQEAKIAkJCQkJICAgInJlYWQgVkxBTiBmaWxlICclcyciLCBsaW5lLCBwb3MpOwogCQkJCWVycm9ycysrOwogCQkJfQorCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJ2bGFuX25hbWluZyIpID09IDApIHsKKwkJCWJzcy0+c3NpZC52bGFuX25hbWluZyA9IGF0b2kocG9zKTsKKwkJCWlmIChic3MtPnNzaWQudmxhbl9uYW1pbmcgPj0gRFlOQU1JQ19WTEFOX05BTUlOR19FTkQgfHwKKwkJCSAgICBic3MtPnNzaWQudmxhbl9uYW1pbmcgPCAwKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBpbnZhbGlkICIKKwkJCQkJICAgIm5hbWluZyBzY2hlbWUgJWQiLCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcy0+c3NpZC52bGFuX25hbWluZyk7CisJCQkJZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgQ09ORklHX0ZVTExfRFlOQU1JQ19WTEFOCiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInZsYW5fdGFnZ2VkX2ludGVyZmFjZSIpID09IDApIHsKIAkJCWJzcy0+c3NpZC52bGFuX3RhZ2dlZF9pbnRlcmZhY2UgPSBvc19zdHJkdXAocG9zKTsKQEAgLTIxNDIsNyArMjQ0Niw4IEBACiAJCQlic3MtPndtbV91YXBzZCA9IGF0b2kocG9zKTsKIAkJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIndtZV9hY18iLCA3KSA9PSAwIHx8CiAJCQkgICBvc19zdHJuY21wKGJ1ZiwgIndtbV9hY18iLCA3KSA9PSAwKSB7Ci0JCQlpZiAoaG9zdGFwZF9jb25maWdfd21tX2FjKGNvbmYsIGJ1ZiwgcG9zKSkgeworCQkJaWYgKGhvc3RhcGRfY29uZmlnX3dtbV9hYyhjb25mLT53bW1fYWNfcGFyYW1zLCBidWYsCisJCQkJCQkgIHBvcykpIHsKIAkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IGludmFsaWQgV01NICIKIAkJCQkJICAgImFjIGl0ZW0iLCBsaW5lKTsKIAkJCQllcnJvcnMrKzsKQEAgLTIyMDAsOCArMjUwNSwxMyBAQAogCQkJCQkgICAidmh0X2NhcGFiIiwgbGluZSk7CiAJCQkJZXJyb3JzKys7CiAJCQl9CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInJlcXVpcmVfdmh0IikgPT0gMCkgeworCQkJY29uZi0+cmVxdWlyZV92aHQgPSBhdG9pKHBvcyk7CiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgInZodF9vcGVyX2Nod2lkdGgiKSA9PSAwKSB7Ci0JCSAgICBjb25mLT52aHRfb3Blcl9jaHdpZHRoID0gYXRvaShwb3MpOworCQkJY29uZi0+dmh0X29wZXJfY2h3aWR0aCA9IGF0b2kocG9zKTsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAidmh0X29wZXJfY2VudHJfZnJlcV9zZWcwX2lkeCIpID09IDApCisJCXsKKwkJCWNvbmYtPnZodF9vcGVyX2NlbnRyX2ZyZXFfc2VnMF9pZHggPSBhdG9pKHBvcyk7CiAjZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMUFDICovCiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIm1heF9saXN0ZW5faW50ZXJ2YWwiKSA9PSAwKSB7CiAJCQlic3MtPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBhdG9pKHBvcyk7CkBAIC0yNDI5LDYgKzI3MzksOTIgQEAKIAkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAidmVudWVfbmFtZSIpID09IDApIHsKIAkJCWlmIChwYXJzZV92ZW51ZV9uYW1lKGJzcywgcG9zLCBsaW5lKSA8IDApCiAJCQkJZXJyb3JzKys7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIm5ldHdvcmtfYXV0aF90eXBlIikgPT0gMCkgeworCQkJdTggYXV0aF90eXBlOworCQkJdTE2IHJlZGlyZWN0X3VybF9sZW47CisJCQlpZiAoaGV4c3RyMmJpbihwb3MsICZhdXRoX3R5cGUsIDEpKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkICIKKwkJCQkJICAgIm5ldHdvcmtfYXV0aF90eXBlICclcyciLAorCQkJCQkgICBsaW5lLCBwb3MpOworCQkJCWVycm9ycysrOworCQkJCXJldHVybiBlcnJvcnM7CisJCQl9CisJCQlpZiAoYXV0aF90eXBlID09IDAgfHwgYXV0aF90eXBlID09IDIpCisJCQkJcmVkaXJlY3RfdXJsX2xlbiA9IG9zX3N0cmxlbihwb3MgKyAyKTsKKwkJCWVsc2UKKwkJCQlyZWRpcmVjdF91cmxfbGVuID0gMDsKKwkJCW9zX2ZyZWUoYnNzLT5uZXR3b3JrX2F1dGhfdHlwZSk7CisJCQlic3MtPm5ldHdvcmtfYXV0aF90eXBlID0KKwkJCQlvc19tYWxsb2MocmVkaXJlY3RfdXJsX2xlbiArIDMgKyAxKTsKKwkJCWlmIChic3MtPm5ldHdvcmtfYXV0aF90eXBlID09IE5VTEwpIHsKKwkJCQllcnJvcnMrKzsKKwkJCQlyZXR1cm4gZXJyb3JzOworCQkJfQorCQkJKmJzcy0+bmV0d29ya19hdXRoX3R5cGUgPSBhdXRoX3R5cGU7CisJCQlXUEFfUFVUX0xFMTYoYnNzLT5uZXR3b3JrX2F1dGhfdHlwZSArIDEsCisJCQkJICAgICByZWRpcmVjdF91cmxfbGVuKTsKKwkJCWlmIChyZWRpcmVjdF91cmxfbGVuKQorCQkJCW9zX21lbWNweShic3MtPm5ldHdvcmtfYXV0aF90eXBlICsgMywKKwkJCQkJICBwb3MgKyAyLCByZWRpcmVjdF91cmxfbGVuKTsKKwkJCWJzcy0+bmV0d29ya19hdXRoX3R5cGVfbGVuID0gMyArIHJlZGlyZWN0X3VybF9sZW47CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImlwYWRkcl90eXBlX2F2YWlsYWJpbGl0eSIpID09IDApIHsKKwkJCWlmIChoZXhzdHIyYmluKHBvcywgJmJzcy0+aXBhZGRyX3R5cGVfYXZhaWxhYmlsaXR5LCAxKSkKKwkJCXsKKwkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IEludmFsaWQgIgorCQkJCQkgICAiaXBhZGRyX3R5cGVfYXZhaWxhYmlsaXR5ICclcyciLAorCQkJCQkgICBsaW5lLCBwb3MpOworCQkJCWJzcy0+aXBhZGRyX3R5cGVfY29uZmlndXJlZCA9IDA7CisJCQkJZXJyb3JzKys7CisJCQkJcmV0dXJuIGVycm9yczsKKwkJCX0KKwkJCWJzcy0+aXBhZGRyX3R5cGVfY29uZmlndXJlZCA9IDE7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImRvbWFpbl9uYW1lIikgPT0gMCkgeworCQkJaW50IGosIG51bV9kb21haW5zLCBkb21haW5fbGVuLCBkb21haW5fbGlzdF9sZW4gPSAwOworCQkJY2hhciAqdG9rX3N0YXJ0LCAqdG9rX3ByZXY7CisJCQl1OCAqZG9tYWluX2xpc3QsICpkb21haW5fcHRyOworCisJCQlkb21haW5fbGlzdF9sZW4gPSBvc19zdHJsZW4ocG9zKSArIDE7CisJCQlkb21haW5fbGlzdCA9IG9zX21hbGxvYyhkb21haW5fbGlzdF9sZW4pOworCQkJaWYgKGRvbWFpbl9saXN0ID09IE5VTEwpIHsKKwkJCQllcnJvcnMrKzsKKwkJCQlyZXR1cm4gZXJyb3JzOworCQkJfQorCisJCQlkb21haW5fcHRyID0gZG9tYWluX2xpc3Q7CisJCQl0b2tfcHJldiA9IHBvczsKKwkJCW51bV9kb21haW5zID0gMTsKKwkJCXdoaWxlICgodG9rX3ByZXYgPSBvc19zdHJjaHIodG9rX3ByZXYsICcsJykpKSB7CisJCQkJbnVtX2RvbWFpbnMrKzsKKwkJCQl0b2tfcHJldisrOworCQkJfQorCQkJdG9rX3ByZXYgPSBwb3M7CisJCQlmb3IgKGogPSAwOyBqIDwgbnVtX2RvbWFpbnM7IGorKykgeworCQkJCXRva19zdGFydCA9IG9zX3N0cmNocih0b2tfcHJldiwgJywnKTsKKwkJCQlpZiAodG9rX3N0YXJ0KSB7CisJCQkJCWRvbWFpbl9sZW4gPSB0b2tfc3RhcnQgLSB0b2tfcHJldjsKKwkJCQkJKmRvbWFpbl9wdHIgPSBkb21haW5fbGVuOworCQkJCQlvc19tZW1jcHkoZG9tYWluX3B0ciArIDEsIHRva19wcmV2LAorCQkJCQkJICBkb21haW5fbGVuKTsKKwkJCQkJZG9tYWluX3B0ciArPSBkb21haW5fbGVuICsgMTsKKwkJCQkJdG9rX3ByZXYgPSArK3Rva19zdGFydDsKKwkJCQl9IGVsc2UgeworCQkJCQlkb21haW5fbGVuID0gb3Nfc3RybGVuKHRva19wcmV2KTsKKwkJCQkJKmRvbWFpbl9wdHIgPSBkb21haW5fbGVuOworCQkJCQlvc19tZW1jcHkoZG9tYWluX3B0ciArIDEsIHRva19wcmV2LAorCQkJCQkJICBkb21haW5fbGVuKTsKKwkJCQkJZG9tYWluX3B0ciArPSBkb21haW5fbGVuICsgMTsKKwkJCQl9CisJCQl9CisKKwkJCW9zX2ZyZWUoYnNzLT5kb21haW5fbmFtZSk7CisJCQlic3MtPmRvbWFpbl9uYW1lID0gZG9tYWluX2xpc3Q7CisJCQlic3MtPmRvbWFpbl9uYW1lX2xlbiA9IGRvbWFpbl9saXN0X2xlbjsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiYW5xcF8zZ3BwX2NlbGxfbmV0IikgPT0gMCkgeworCQkJaWYgKHBhcnNlXzNncHBfY2VsbF9uZXQoYnNzLCBwb3MsIGxpbmUpIDwgMCkKKwkJCQllcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAibmFpX3JlYWxtIikgPT0gMCkgeworCQkJaWYgKHBhcnNlX25haV9yZWFsbShic3MsIHBvcywgbGluZSkgPCAwKQorCQkJCWVycm9ycysrOwogCQl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJnYXNfZnJhZ19saW1pdCIpID09IDApIHsKIAkJCWJzcy0+Z2FzX2ZyYWdfbGltaXQgPSBhdG9pKHBvcyk7CiAJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImdhc19jb21lYmFja19kZWxheSIpID09IDApIHsKQEAgLTI0MzksNiArMjgzNSw4MSBAQAogCQkJb3NfZnJlZShic3MtPmR1bXBfbXNrX2ZpbGUpOwogCQkJYnNzLT5kdW1wX21za19maWxlID0gb3Nfc3RyZHVwKHBvcyk7CiAjZW5kaWYgLyogQ09ORklHX1JBRElVU19URVNUICovCisjaWZkZWYgQ09ORklHX0hTMjAKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiaHMyMCIpID09IDApIHsKKwkJCWJzcy0+aHMyMCA9IGF0b2kocG9zKTsKKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiZGlzYWJsZV9kZ2FmIikgPT0gMCkgeworCQkJYnNzLT5kaXNhYmxlX2RnYWYgPSBhdG9pKHBvcyk7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImhzMjBfb3Blcl9mcmllbmRseV9uYW1lIikgPT0gMCkgeworCQkJaWYgKGhzMjBfcGFyc2Vfb3Blcl9mcmllbmRseV9uYW1lKGJzcywgcG9zLCBsaW5lKSA8IDApCisJCQkJZXJyb3JzKys7CisJCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgImhzMjBfd2FuX21ldHJpY3MiKSA9PSAwKSB7CisJCQlpZiAoaHMyMF9wYXJzZV93YW5fbWV0cmljcyhic3MsIHBvcywgbGluZSkgPCAwKSB7CisJCQkJZXJyb3JzKys7CisJCQkJcmV0dXJuIGVycm9yczsKKwkJCX0KKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiaHMyMF9jb25uX2NhcGFiIikgPT0gMCkgeworCQkJaWYgKGhzMjBfcGFyc2VfY29ubl9jYXBhYihic3MsIHBvcywgbGluZSkgPCAwKSB7CisJCQkJZXJyb3JzKys7CisJCQkJcmV0dXJuIGVycm9yczsKKwkJCX0KKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiaHMyMF9vcGVyYXRpbmdfY2xhc3MiKSA9PSAwKSB7CisJCQl1OCAqb3Blcl9jbGFzczsKKwkJCXNpemVfdCBvcGVyX2NsYXNzX2xlbjsKKwkJCW9wZXJfY2xhc3NfbGVuID0gb3Nfc3RybGVuKHBvcyk7CisJCQlpZiAob3Blcl9jbGFzc19sZW4gPCAyIHx8IChvcGVyX2NsYXNzX2xlbiAmIDB4MDEpKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkICIKKwkJCQkJICAgImhzMjBfb3BlcmF0aW5nX2NsYXNzICclcyciLAorCQkJCQkgICBsaW5lLCBwb3MpOworCQkJCWVycm9ycysrOworCQkJCXJldHVybiBlcnJvcnM7CisJCQl9CisJCQlvcGVyX2NsYXNzX2xlbiAvPSAyOworCQkJb3Blcl9jbGFzcyA9IG9zX21hbGxvYyhvcGVyX2NsYXNzX2xlbik7CisJCQlpZiAob3Blcl9jbGFzcyA9PSBOVUxMKSB7CisJCQkJZXJyb3JzKys7CisJCQkJcmV0dXJuIGVycm9yczsKKwkJCX0KKwkJCWlmIChoZXhzdHIyYmluKHBvcywgb3Blcl9jbGFzcywgb3Blcl9jbGFzc19sZW4pKSB7CisJCQkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJMaW5lICVkOiBJbnZhbGlkICIKKwkJCQkJICAgImhzMjBfb3BlcmF0aW5nX2NsYXNzICclcyciLAorCQkJCQkgICBsaW5lLCBwb3MpOworCQkJCW9zX2ZyZWUob3Blcl9jbGFzcyk7CisJCQkJZXJyb3JzKys7CisJCQkJcmV0dXJuIGVycm9yczsKKwkJCX0KKwkJCW9zX2ZyZWUoYnNzLT5oczIwX29wZXJhdGluZ19jbGFzcyk7CisJCQlic3MtPmhzMjBfb3BlcmF0aW5nX2NsYXNzID0gb3Blcl9jbGFzczsKKwkJCWJzcy0+aHMyMF9vcGVyYXRpbmdfY2xhc3NfbGVuID0gb3Blcl9jbGFzc19sZW47CisjZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KKwkJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAidmVuZG9yX2VsZW1lbnRzIikgPT0gMCkgeworCQkJc3RydWN0IHdwYWJ1ZiAqZWxlbXM7CisJCQlzaXplX3QgbGVuID0gb3Nfc3RybGVuKHBvcyk7CisJCQlpZiAobGVuICYgMHgwMSkgeworCQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogSW52YWxpZCAiCisJCQkJCSAgICJ2ZW5kb3JfZWxlbWVudHMgJyVzJyIsIGxpbmUsIHBvcyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlsZW4gLz0gMjsKKwkJCWlmIChsZW4gPT0gMCkgeworCQkJCXdwYWJ1Zl9mcmVlKGJzcy0+dmVuZG9yX2VsZW1lbnRzKTsKKwkJCQlic3MtPnZlbmRvcl9lbGVtZW50cyA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWVsZW1zID0gd3BhYnVmX2FsbG9jKGxlbik7CisJCQlpZiAoZWxlbXMgPT0gTlVMTCkKKwkJCQlyZXR1cm4gMTsKKworCQkJaWYgKGhleHN0cjJiaW4ocG9zLCB3cGFidWZfcHV0KGVsZW1zLCBsZW4pLCBsZW4pKSB7CisJCQkJd3BhYnVmX2ZyZWUoZWxlbXMpOworCQkJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiTGluZSAlZDogSW52YWxpZCAiCisJCQkJCSAgICJ2ZW5kb3JfZWxlbWVudHMgJyVzJyIsIGxpbmUsIHBvcyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXdwYWJ1Zl9mcmVlKGJzcy0+dmVuZG9yX2VsZW1lbnRzKTsKKwkJCWJzcy0+dmVuZG9yX2VsZW1lbnRzID0gZWxlbXM7CiAJCX0gZWxzZSB7CiAJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkxpbmUgJWQ6IHVua25vd24gY29uZmlndXJhdGlvbiAiCiAJCQkJICAgIml0ZW0gJyVzJyIsIGxpbmUsIGJ1Zik7CkBAIC0yNDcyLDYgKzI5NDMsOSBAQAogCX0KIAlpZiAocGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApCiAJCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9US0lQOworCWVsc2UgaWYgKChwYWlyd2lzZSAmIChXUEFfQ0lQSEVSX0NDTVAgfCBXUEFfQ0lQSEVSX0dDTVApKSA9PQorCQkgV1BBX0NJUEhFUl9HQ01QKQorCQlic3MtPndwYV9ncm91cCA9IFdQQV9DSVBIRVJfR0NNUDsKIAllbHNlCiAJCWJzcy0+d3BhX2dyb3VwID0gV1BBX0NJUEhFUl9DQ01QOwogCmRpZmYgLS1naXQgYS9ob3N0YXBkL2N0cmxfaWZhY2UuYyBiL2hvc3RhcGQvY3RybF9pZmFjZS5jCmluZGV4IDc1ODdlMDMuLjFiOGJlZGUgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvY3RybF9pZmFjZS5jCisrKyBiL2hvc3RhcGQvY3RybF9pZmFjZS5jCkBAIC01MjMsNyArNTIzLDggQEAKIAlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImJzc2lkPSIgTUFDU1RSICJcbiIKIAkJCSAgInNzaWQ9JXNcbiIsCiAJCQkgIE1BQzJTVFIoaGFwZC0+b3duX2FkZHIpLAotCQkJICBoYXBkLT5jb25mLT5zc2lkLnNzaWQpOworCQkJICB3cGFfc3NpZF90eHQoaGFwZC0+Y29uZi0+c3NpZC5zc2lkLAorCQkJCSAgICAgICBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuKSk7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKIAkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAlwb3MgKz0gcmV0OwpAQCAtNjE4LDYgKzYxOSwxMiBAQAogCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKIAkJcG9zICs9IHJldDsKIAl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgorCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9HQ01QKSB7CisJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPUdDTVBcbiIpOworCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJcG9zICs9IHJldDsKKwl9IGVsc2UgaWYgKGhhcGQtPmNvbmYtPndwYSAmJgogCQkgICBoYXBkLT5jb25mLT53cGFfZ3JvdXAgPT0gV1BBX0NJUEhFUl9US0lQKSB7CiAJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZ3JvdXBfY2lwaGVyPVRLSVBcbiIpOwogCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQpAQCAtNjM3LDYgKzY0NCwxMiBAQAogCQkJCXJldHVybiBwb3MgLSBidWY7CiAJCQlwb3MgKz0gcmV0OwogCQl9CisJCWlmIChoYXBkLT5jb25mLT5yc25fcGFpcndpc2UgJiBXUEFfQ0lQSEVSX0dDTVApIHsKKwkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiR0NNUCAiKTsKKwkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKKwkJCXBvcyArPSByZXQ7CisJCX0KIAkJaWYgKGhhcGQtPmNvbmYtPnJzbl9wYWlyd2lzZSAmIFdQQV9DSVBIRVJfVEtJUCkgewogCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJUS0lQICIpOwogCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKQEAgLTY2Miw2ICs2NzUsMTIgQEAKIAkJCQlyZXR1cm4gcG9zIC0gYnVmOwogCQkJcG9zICs9IHJldDsKIAkJfQorCQlpZiAoaGFwZC0+Y29uZi0+d3BhX3BhaXJ3aXNlICYgV1BBX0NJUEhFUl9HQ01QKSB7CisJCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIkdDTVAgIik7CisJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQorCQkJCXJldHVybiBwb3MgLSBidWY7CisJCQlwb3MgKz0gcmV0OworCQl9CiAJCWlmIChoYXBkLT5jb25mLT53cGFfcGFpcndpc2UgJiBXUEFfQ0lQSEVSX1RLSVApIHsKIAkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiVEtJUCAiKTsKIAkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCkBAIC03NDYsNiArNzY1LDM2IEBACiB9CiAKIAorc3RhdGljIGludCBob3N0YXBkX2N0cmxfaWZhY2VfZW5hYmxlKHN0cnVjdCBob3N0YXBkX2lmYWNlICppZmFjZSkKK3sKKwlpZiAoaG9zdGFwZF9lbmFibGVfaWZhY2UoaWZhY2UpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkVuYWJsaW5nIG9mIGludGVyZmFjZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9yZWxvYWQoc3RydWN0IGhvc3RhcGRfaWZhY2UgKmlmYWNlKQoreworCWlmIChob3N0YXBkX3JlbG9hZF9pZmFjZShpZmFjZSkgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiUmVsb2FkaW5nIG9mIGludGVyZmFjZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhvc3RhcGRfY3RybF9pZmFjZV9kaXNhYmxlKHN0cnVjdCBob3N0YXBkX2lmYWNlICppZmFjZSkKK3sKKwlpZiAoaG9zdGFwZF9kaXNhYmxlX2lmYWNlKGlmYWNlKSA8IDApIHsKKwkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJEaXNhYmxpbmcgb2YgaW50ZXJmYWNlIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKIHN0YXRpYyB2b2lkIGhvc3RhcGRfY3RybF9pZmFjZV9yZWNlaXZlKGludCBzb2NrLCB2b2lkICplbG9vcF9jdHgsCiAJCQkJICAgICAgIHZvaWQgKnNvY2tfY3R4KQogewpAQCAtODk4LDYgKzk0NywxNSBAQAogCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJHRVQgIiwgNCkgPT0gMCkgewogCQlyZXBseV9sZW4gPSBob3N0YXBkX2N0cmxfaWZhY2VfZ2V0KGhhcGQsIGJ1ZiArIDQsIHJlcGx5LAogCQkJCQkJICAgcmVwbHlfc2l6ZSk7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkVOQUJMRSIsIDYpID09IDApIHsKKwkJaWYgKGhvc3RhcGRfY3RybF9pZmFjZV9lbmFibGUoaGFwZC0+aWZhY2UpKQorCQkJcmVwbHlfbGVuID0gLTE7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlJFTE9BRCIsIDYpID09IDApIHsKKwkJaWYgKGhvc3RhcGRfY3RybF9pZmFjZV9yZWxvYWQoaGFwZC0+aWZhY2UpKQorCQkJcmVwbHlfbGVuID0gLTE7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkRJU0FCTEUiLCA3KSA9PSAwKSB7CisJCWlmIChob3N0YXBkX2N0cmxfaWZhY2VfZGlzYWJsZShoYXBkLT5pZmFjZSkpCisJCQlyZXBseV9sZW4gPSAtMTsKIAl9IGVsc2UgewogCQlvc19tZW1jcHkocmVwbHksICJVTktOT1dOIENPTU1BTkRcbiIsIDE2KTsKIAkJcmVwbHlfbGVuID0gMTY7CkBAIC0xMDkxLDYgKzExNDksMjIwIEBACiB9CiAKIAorc3RhdGljIGludCBob3N0YXBkX2N0cmxfaWZhY2VfYWRkKHN0cnVjdCBoYXBkX2ludGVyZmFjZXMgKmludGVyZmFjZXMsCisJCQkJICBjaGFyICpidWYpCit7CisJaWYgKGhvc3RhcGRfYWRkX2lmYWNlKGludGVyZmFjZXMsIGJ1ZikgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0VSUk9SLCAiQWRkaW5nIGludGVyZmFjZSAlcyBmYWlsZWQiLCBidWYpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX3JlbW92ZShzdHJ1Y3QgaGFwZF9pbnRlcmZhY2VzICppbnRlcmZhY2VzLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCWlmIChob3N0YXBkX3JlbW92ZV9pZmFjZShpbnRlcmZhY2VzLCBidWYpIDwgMCkgeworCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIlJlbW92aW5nIGludGVyZmFjZSAlcyBmYWlsZWQiLCBidWYpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGhvc3RhcGRfZ2xvYmFsX2N0cmxfaWZhY2VfcmVjZWl2ZShpbnQgc29jaywgdm9pZCAqZWxvb3BfY3R4LAorCQkJCQkgICAgICB2b2lkICpzb2NrX2N0eCkKK3sKKwl2b2lkICppbnRlcmZhY2VzID0gZWxvb3BfY3R4OworCWNoYXIgYnVmWzI1Nl07CisJaW50IHJlczsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gZnJvbTsKKwlzb2NrbGVuX3QgZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKwljaGFyIHJlcGx5WzI0XTsKKwlpbnQgcmVwbHlfbGVuOworCisJcmVzID0gcmVjdmZyb20oc29jaywgYnVmLCBzaXplb2YoYnVmKSAtIDEsIDAsCisJCSAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmZnJvbWxlbik7CisJaWYgKHJlcyA8IDApIHsKKwkJcGVycm9yKCJyZWN2ZnJvbShjdHJsX2lmYWNlKSIpOworCQlyZXR1cm47CisJfQorCWJ1ZltyZXNdID0gJ1wwJzsKKworCW9zX21lbWNweShyZXBseSwgIk9LXG4iLCAzKTsKKwlyZXBseV9sZW4gPSAzOworCisJaWYgKG9zX3N0cmNtcChidWYsICJQSU5HIikgPT0gMCkgeworCQlvc19tZW1jcHkocmVwbHksICJQT05HXG4iLCA1KTsKKwkJcmVwbHlfbGVuID0gNTsKKwl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiQUREICIsIDQpID09IDApIHsKKwkJaWYgKGhvc3RhcGRfY3RybF9pZmFjZV9hZGQoaW50ZXJmYWNlcywgYnVmICsgNCkgPCAwKQorCQkJcmVwbHlfbGVuID0gLTE7CisJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlJFTU9WRSAiLCA3KSA9PSAwKSB7CisJCWlmIChob3N0YXBkX2N0cmxfaWZhY2VfcmVtb3ZlKGludGVyZmFjZXMsIGJ1ZiArIDcpIDwgMCkKKwkJCXJlcGx5X2xlbiA9IC0xOworCX0gZWxzZSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVW5yZWNvZ25pemVkIGdsb2JhbCBjdHJsX2lmYWNlIGNvbW1hbmQgIgorCQkJICAgImlnbm9yZWQiKTsKKwkJcmVwbHlfbGVuID0gLTE7CisJfQorCisJaWYgKHJlcGx5X2xlbiA8IDApIHsKKwkJb3NfbWVtY3B5KHJlcGx5LCAiRkFJTFxuIiwgNSk7CisJCXJlcGx5X2xlbiA9IDU7CisJfQorCisJc2VuZHRvKHNvY2ssIHJlcGx5LCByZXBseV9sZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sIGZyb21sZW4pOworfQorCisKK3N0YXRpYyBjaGFyICogaG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9wYXRoKHN0cnVjdCBoYXBkX2ludGVyZmFjZXMgKmludGVyZmFjZSkKK3sKKwljaGFyICpidWY7CisJc2l6ZV90IGxlbjsKKworCWlmIChpbnRlcmZhY2UtPmdsb2JhbF9pZmFjZV9wYXRoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gb3Nfc3RybGVuKGludGVyZmFjZS0+Z2xvYmFsX2lmYWNlX3BhdGgpICsKKwkJb3Nfc3RybGVuKGludGVyZmFjZS0+Z2xvYmFsX2lmYWNlX25hbWUpICsgMjsKKwlidWYgPSBvc19tYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJb3Nfc25wcmludGYoYnVmLCBsZW4sICIlcy8lcyIsIGludGVyZmFjZS0+Z2xvYmFsX2lmYWNlX3BhdGgsCisJCSAgICBpbnRlcmZhY2UtPmdsb2JhbF9pZmFjZV9uYW1lKTsKKwlidWZbbGVuIC0gMV0gPSAnXDAnOworCXJldHVybiBidWY7Cit9CisKKworaW50IGhvc3RhcGRfZ2xvYmFsX2N0cmxfaWZhY2VfaW5pdChzdHJ1Y3QgaGFwZF9pbnRlcmZhY2VzICppbnRlcmZhY2UpCit7CisJc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisJaW50IHMgPSAtMTsKKwljaGFyICpmbmFtZSA9IE5VTEw7CisKKwlpZiAoaW50ZXJmYWNlLT5nbG9iYWxfaWZhY2VfcGF0aCA9PSBOVUxMKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiY3RybF9pZmFjZSBub3QgY29uZmlndXJlZCEiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1rZGlyKGludGVyZmFjZS0+Z2xvYmFsX2lmYWNlX3BhdGgsIFNfSVJXWFUgfCBTX0lSV1hHKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJVc2luZyBleGlzdGluZyBjb250cm9sICIKKwkJCQkgICAiaW50ZXJmYWNlIGRpcmVjdG9yeS4iKTsKKwkJfSBlbHNlIHsKKwkJCXBlcnJvcigibWtkaXJbY3RybF9pbnRlcmZhY2VdIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlpZiAob3Nfc3RybGVuKGludGVyZmFjZS0+Z2xvYmFsX2lmYWNlX3BhdGgpICsgMSArCisJICAgIG9zX3N0cmxlbihpbnRlcmZhY2UtPmdsb2JhbF9pZmFjZV9uYW1lKSA+PSBzaXplb2YoYWRkci5zdW5fcGF0aCkpCisJCWdvdG8gZmFpbDsKKworCXMgPSBzb2NrZXQoUEZfVU5JWCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHMgPCAwKSB7CisJCXBlcnJvcigic29ja2V0KFBGX1VOSVgpIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlvc19tZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisjaWZkZWYgX19GcmVlQlNEX18KKwlhZGRyLnN1bl9sZW4gPSBzaXplb2YoYWRkcik7CisjZW5kaWYgLyogX19GcmVlQlNEX18gKi8KKwlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCWZuYW1lID0gaG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9wYXRoKGludGVyZmFjZSk7CisJaWYgKGZuYW1lID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwlvc19zdHJsY3B5KGFkZHIuc3VuX3BhdGgsIGZuYW1lLCBzaXplb2YoYWRkci5zdW5fcGF0aCkpOworCWlmIChiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiY3RybF9pZmFjZSBiaW5kKFBGX1VOSVgpIGZhaWxlZDogJXMiLAorCQkJICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiY3RybF9pZmFjZSBleGlzdHMsIGJ1dCBkb2VzIG5vdCIKKwkJCQkgICAiIGFsbG93IGNvbm5lY3Rpb25zIC0gYXNzdW1pbmcgaXQgd2FzIGxlZnQiCisJCQkJICAgIm92ZXIgZnJvbSBmb3JjZWQgcHJvZ3JhbSB0ZXJtaW5hdGlvbiIpOworCQkJaWYgKHVubGluayhmbmFtZSkgPCAwKSB7CisJCQkJcGVycm9yKCJ1bmxpbmtbY3RybF9pZmFjZV0iKTsKKwkJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIkNvdWxkIG5vdCB1bmxpbmsgIgorCQkJCQkgICAiZXhpc3RpbmcgY3RybF9pZmFjZSBzb2NrZXQgJyVzJyIsCisJCQkJCSAgIGZuYW1lKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwKKwkJCSAgICAwKSB7CisJCQkJcGVycm9yKCJiaW5kKFBGX1VOSVgpIik7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTdWNjZXNzZnVsbHkgcmVwbGFjZWQgbGVmdG92ZXIgIgorCQkJCSAgICJjdHJsX2lmYWNlIHNvY2tldCAnJXMnIiwgZm5hbWUpOworCQl9IGVsc2UgeworCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgImN0cmxfaWZhY2UgZXhpc3RzIGFuZCBzZWVtcyB0byAiCisJCQkJICAgImJlIGluIHVzZSAtIGNhbm5vdCBvdmVycmlkZSBpdCIpOworCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgIkRlbGV0ZSAnJXMnIG1hbnVhbGx5IGlmIGl0IGlzICIKKwkJCQkgICAibm90IHVzZWQgYW55bW9yZSIsIGZuYW1lKTsKKwkJCW9zX2ZyZWUoZm5hbWUpOworCQkJZm5hbWUgPSBOVUxMOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKGNobW9kKGZuYW1lLCBTX0lSV1hVIHwgU19JUldYRykgPCAwKSB7CisJCXBlcnJvcigiY2htb2RbY3RybF9pbnRlcmZhY2UvaWZuYW1lXSIpOworCQlnb3RvIGZhaWw7CisJfQorCW9zX2ZyZWUoZm5hbWUpOworCisJaW50ZXJmYWNlLT5nbG9iYWxfY3RybF9zb2NrID0gczsKKwllbG9vcF9yZWdpc3Rlcl9yZWFkX3NvY2socywgaG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9yZWNlaXZlLAorCQkJCSBpbnRlcmZhY2UsIE5VTEwpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKHMgPj0gMCkKKwkJY2xvc2Uocyk7CisJaWYgKGZuYW1lKSB7CisJCXVubGluayhmbmFtZSk7CisJCW9zX2ZyZWUoZm5hbWUpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKwordm9pZCBob3N0YXBkX2dsb2JhbF9jdHJsX2lmYWNlX2RlaW5pdChzdHJ1Y3QgaGFwZF9pbnRlcmZhY2VzICppbnRlcmZhY2VzKQoreworCWNoYXIgKmZuYW1lID0gTlVMTDsKKworCWlmIChpbnRlcmZhY2VzLT5nbG9iYWxfY3RybF9zb2NrID4gLTEpIHsKKwkJZWxvb3BfdW5yZWdpc3Rlcl9yZWFkX3NvY2soaW50ZXJmYWNlcy0+Z2xvYmFsX2N0cmxfc29jayk7CisJCWNsb3NlKGludGVyZmFjZXMtPmdsb2JhbF9jdHJsX3NvY2spOworCQlpbnRlcmZhY2VzLT5nbG9iYWxfY3RybF9zb2NrID0gLTE7CisJCWZuYW1lID0gaG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9wYXRoKGludGVyZmFjZXMpOworCQlpZiAoZm5hbWUpIHsKKwkJCXVubGluayhmbmFtZSk7CisJCQlvc19mcmVlKGZuYW1lKTsKKwkJfQorCisJCWlmIChpbnRlcmZhY2VzLT5nbG9iYWxfaWZhY2VfcGF0aCAmJgorCQkgICAgcm1kaXIoaW50ZXJmYWNlcy0+Z2xvYmFsX2lmYWNlX3BhdGgpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT1RFTVBUWSkgeworCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ29udHJvbCBpbnRlcmZhY2UgIgorCQkJCQkgICAiZGlyZWN0b3J5IG5vdCBlbXB0eSAtIGxlYXZpbmcgaXQgIgorCQkJCQkgICAiYmVoaW5kIik7CisJCQl9IGVsc2UgeworCQkJCXBlcnJvcigicm1kaXJbY3RybF9pbnRlcmZhY2VdIik7CisJCQl9CisJCX0KKwkJb3NfZnJlZShpbnRlcmZhY2VzLT5nbG9iYWxfaWZhY2VfcGF0aCk7CisJCWludGVyZmFjZXMtPmdsb2JhbF9pZmFjZV9wYXRoID0gTlVMTDsKKwl9Cit9CisKKwogc3RhdGljIHZvaWQgaG9zdGFwZF9jdHJsX2lmYWNlX3NlbmQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCwgaW50IGxldmVsLAogCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CmRpZmYgLS1naXQgYS9ob3N0YXBkL2N0cmxfaWZhY2UuaCBiL2hvc3RhcGQvY3RybF9pZmFjZS5oCmluZGV4IDY0YTUwODAuLjMzNDFhNjYgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvY3RybF9pZmFjZS5oCisrKyBiL2hvc3RhcGQvY3RybF9pZmFjZS5oCkBAIC0xMiw2ICsxMiw4IEBACiAjaWZuZGVmIENPTkZJR19OT19DVFJMX0lGQUNFCiBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CiB2b2lkIGhvc3RhcGRfY3RybF9pZmFjZV9kZWluaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCk7CitpbnQgaG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9pbml0KHN0cnVjdCBoYXBkX2ludGVyZmFjZXMgKmludGVyZmFjZSk7Cit2b2lkIGhvc3RhcGRfZ2xvYmFsX2N0cmxfaWZhY2VfZGVpbml0KHN0cnVjdCBoYXBkX2ludGVyZmFjZXMgKmludGVyZmFjZSk7CiAjZWxzZSAvKiBDT05GSUdfTk9fQ1RSTF9JRkFDRSAqLwogc3RhdGljIGlubGluZSBpbnQgaG9zdGFwZF9jdHJsX2lmYWNlX2luaXQoc3RydWN0IGhvc3RhcGRfZGF0YSAqaGFwZCkKIHsKQEAgLTIxLDYgKzIzLDE3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaG9zdGFwZF9jdHJsX2lmYWNlX2RlaW5pdChzdHJ1Y3QgaG9zdGFwZF9kYXRhICpoYXBkKQogewogfQorCitzdGF0aWMgaW5saW5lIGludAoraG9zdGFwZF9nbG9iYWxfY3RybF9pZmFjZV9pbml0KHN0cnVjdCBoYXBkX2ludGVyZmFjZXMgKmludGVyZmFjZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitob3N0YXBkX2dsb2JhbF9jdHJsX2lmYWNlX2RlaW5pdChzdHJ1Y3QgaGFwZF9pbnRlcmZhY2VzICppbnRlcmZhY2UpCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX05PX0NUUkxfSUZBQ0UgKi8KIAogI2VuZGlmIC8qIENUUkxfSUZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9kZWZjb25maWcgYi9ob3N0YXBkL2RlZmNvbmZpZwppbmRleCA5YzViMTNhLi4yMDRhYTc2IDEwMDY0NAotLS0gYS9ob3N0YXBkL2RlZmNvbmZpZworKysgYi9ob3N0YXBkL2RlZmNvbmZpZwpAQCAtMTY3LDYgKzE2NywxMCBAQAogIyBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBicmlkZ2UgYW5kIFZMQU4gaW50ZXJmYWNlcyBpZiBuZWNlc3NhcnkuCiAjQ09ORklHX0ZVTExfRFlOQU1JQ19WTEFOPXkKIAorIyBVc2UgbmV0bGluay1iYXNlZCBrZXJuZWwgQVBJIGZvciBWTEFOIG9wZXJhdGlvbnMgaW5zdGVhZCBvZiBpb2N0bCgpCisjIE5vdGU6IFRoaXMgcmVxdWlyZXMgbGlibmwgMy4xIG9yIG5ld2VyLgorI0NPTkZJR19WTEFOX05FVExJTks9eQorCiAjIFJlbW92ZSBzdXBwb3J0IGZvciBkdW1waW5nIHN0YXRlIGludG8gYSBmaWxlIG9uIFNJR1VTUjEgc2lnbmFsCiAjIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVkdWNlIGJpbmFyeSBzaXplIGF0IHRoZSBjb3N0IG9mIGRpc2FibGluZyBhIGRlYnVnZ2luZwogIyBvcHRpb24uCkBAIC0yNTcsMyArMjYxLDkgQEAKICMgVGhpcyBjYW4gYmUgdXNlZCB0byBlbmFibGUgZnVuY3Rpb25hbGl0eSB0byBpbXByb3ZlIGludGVyd29ya2luZyB3aXRoCiAjIGV4dGVybmFsIG5ldHdvcmtzLgogI0NPTkZJR19JTlRFUldPUktJTkc9eQorCisjIEhvdHNwb3QgMi4wCisjQ09ORklHX0hTMjA9eQorCisjIEVuYWJsZSBTUUxpdGUgZGF0YWJhc2Ugc3VwcG9ydCBpbiBobHJfYXVjX2d3CisjQ09ORklHX1NRTElURT15CmRpZmYgLS1naXQgYS9ob3N0YXBkL2VhcF9yZWdpc3Rlci5jIGIvaG9zdGFwZC9lYXBfcmVnaXN0ZXIuYwppbmRleCAwODljN2IyLi4wYTdmZjkxIDEwMDY0NAotLS0gYS9ob3N0YXBkL2VhcF9yZWdpc3Rlci5jCisrKyBiL2hvc3RhcGQvZWFwX3JlZ2lzdGVyLmMKQEAgLTM5LDYgKzM5LDExIEBACiAJCXJldCA9IGVhcF9zZXJ2ZXJfdGxzX3JlZ2lzdGVyKCk7CiAjZW5kaWYgLyogRUFQX1NFUlZFUl9UTFMgKi8KIAorI2lmZGVmIEVBUF9TRVJWRVJfVU5BVVRIX1RMUworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZWFwX3NlcnZlcl91bmF1dGhfdGxzX3JlZ2lzdGVyKCk7CisjZW5kaWYgLyogRUFQX1NFUlZFUl9UTFMgKi8KKwogI2lmZGVmIEVBUF9TRVJWRVJfTVNDSEFQVjIKIAlpZiAocmV0ID09IDApCiAJCXJldCA9IGVhcF9zZXJ2ZXJfbXNjaGFwdjJfcmVnaXN0ZXIoKTsKZGlmZiAtLWdpdCBhL2hvc3RhcGQvaGxyX2F1Y19ndy5jIGIvaG9zdGFwZC9obHJfYXVjX2d3LmMKaW5kZXggNTE2ZDg1OS4uZTI3ZGRhYiAxMDA2NDQKLS0tIGEvaG9zdGFwZC9obHJfYXVjX2d3LmMKKysrIGIvaG9zdGFwZC9obHJfYXVjX2d3LmMKQEAgLTQzLDYgKzQzLDkgQEAKIAogI2luY2x1ZGUgImluY2x1ZGVzLmgiCiAjaW5jbHVkZSA8c3lzL3VuLmg+CisjaWZkZWYgQ09ORklHX1NRTElURQorI2luY2x1ZGUgPHNxbGl0ZTMuaD4KKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJjcnlwdG8vbWlsZW5hZ2UuaCIKQEAgLTg5LDYgKzkyLDE0MCBAQAogI2RlZmluZSBFQVBfQUtBX0NLX0xFTiAxNgogCiAKKyNpZmRlZiBDT05GSUdfU1FMSVRFCisKK3N0YXRpYyBzcWxpdGUzICpzcWxpdGVfZGIgPSBOVUxMOworc3RhdGljIHN0cnVjdCBtaWxlbmFnZV9wYXJhbWV0ZXJzIGRiX3RtcF9taWxlbmFnZTsKKworCitzdGF0aWMgaW50IGRiX3RhYmxlX2V4aXN0cyhzcWxpdGUzICpkYiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyIGNtZFsxMjhdOworCW9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICJTRUxFQ1QgMSBGUk9NICVzOyIsIG5hbWUpOworCXJldHVybiBzcWxpdGUzX2V4ZWMoZGIsIGNtZCwgTlVMTCwgTlVMTCwgTlVMTCkgPT0gU1FMSVRFX09LOworfQorCisKK3N0YXRpYyBpbnQgZGJfdGFibGVfY3JlYXRlX21pbGVuYWdlKHNxbGl0ZTMgKmRiKQoreworCWNoYXIgKmVyciA9IE5VTEw7CisJY29uc3QgY2hhciAqc3FsID0KKwkJIkNSRUFURSBUQUJMRSBtaWxlbmFnZSgiCisJCSIgIGltc2kgSU5URUdFUiBQUklNQVJZIEtFWSBOT1QgTlVMTCwiCisJCSIgIGtpIENIQVIoMzIpIE5PVCBOVUxMLCIKKwkJIiAgb3BjIENIQVIoMzIpIE5PVCBOVUxMLCIKKwkJIiAgYW1mIENIQVIoNCkgTk9UIE5VTEwsIgorCQkiICBzcW4gQ0hBUigxMikgTk9UIE5VTEwiCisJCSIpOyI7CisKKwlwcmludGYoIkFkZGluZyBkYXRhYmFzZSB0YWJsZSBmb3IgbWlsZW5hZ2UgaW5mb3JtYXRpb25cbiIpOworCWlmIChzcWxpdGUzX2V4ZWMoZGIsIHNxbCwgTlVMTCwgTlVMTCwgJmVycikgIT0gU1FMSVRFX09LKSB7CisJCXByaW50ZigiU1FMaXRlIGVycm9yOiAlc1xuIiwgZXJyKTsKKwkJc3FsaXRlM19mcmVlKGVycik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3FsaXRlMyAqIGRiX29wZW4oY29uc3QgY2hhciAqZGJfZmlsZSkKK3sKKwlzcWxpdGUzICpkYjsKKworCWlmIChzcWxpdGUzX29wZW4oZGJfZmlsZSwgJmRiKSkgeworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuIGRhdGFiYXNlICVzOiAlc1xuIiwKKwkJICAgICAgIGRiX2ZpbGUsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisJCXNxbGl0ZTNfY2xvc2UoZGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWRiX3RhYmxlX2V4aXN0cyhkYiwgIm1pbGVuYWdlIikgJiYKKwkgICAgZGJfdGFibGVfY3JlYXRlX21pbGVuYWdlKGRiKSA8IDApIHsKKwkJc3FsaXRlM19jbG9zZShkYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkYjsKK30KKworCitzdGF0aWMgaW50IGdldF9taWxlbmFnZV9jYih2b2lkICpjdHgsIGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmNvbFtdKQoreworCXN0cnVjdCBtaWxlbmFnZV9wYXJhbWV0ZXJzICptID0gY3R4OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAob3Nfc3RyY21wKGNvbFtpXSwgImtpIikgPT0gMCAmJiBhcmd2W2ldICYmCisJCSAgICBoZXhzdHIyYmluKGFyZ3ZbaV0sIG0tPmtpLCBzaXplb2YobS0+a2kpKSkgeworCQkJcHJpbnRmKCJJbnZhbGlkIGtpIHZhbHVlIGluIGRhdGFiYXNlXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChvc19zdHJjbXAoY29sW2ldLCAib3BjIikgPT0gMCAmJiBhcmd2W2ldICYmCisJCSAgICBoZXhzdHIyYmluKGFyZ3ZbaV0sIG0tPm9wYywgc2l6ZW9mKG0tPm9wYykpKSB7CisJCQlwcmludGYoIkludmFsaWQgb3BjdmFsdWUgaW4gZGF0YWJhc2VcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKG9zX3N0cmNtcChjb2xbaV0sICJhbWYiKSA9PSAwICYmIGFyZ3ZbaV0gJiYKKwkJICAgIGhleHN0cjJiaW4oYXJndltpXSwgbS0+YW1mLCBzaXplb2YobS0+YW1mKSkpIHsKKwkJCXByaW50ZigiSW52YWxpZCBhbWYgdmFsdWUgaW4gZGF0YWJhc2VcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKG9zX3N0cmNtcChjb2xbaV0sICJzcW4iKSA9PSAwICYmIGFyZ3ZbaV0gJiYKKwkJICAgIGhleHN0cjJiaW4oYXJndltpXSwgbS0+c3FuLCBzaXplb2YobS0+c3FuKSkpIHsKKwkJCXByaW50ZigiSW52YWxpZCBzcW4gdmFsdWUgaW4gZGF0YWJhc2VcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBtaWxlbmFnZV9wYXJhbWV0ZXJzICogZGJfZ2V0X21pbGVuYWdlKGNvbnN0IGNoYXIgKmltc2lfdHh0KQoreworCWNoYXIgY21kWzEyOF07CisJdW5zaWduZWQgbG9uZyBsb25nIGltc2k7CisKKwlvc19tZW1zZXQoJmRiX3RtcF9taWxlbmFnZSwgMCwgc2l6ZW9mKGRiX3RtcF9taWxlbmFnZSkpOworCWltc2kgPSBhdG9sbChpbXNpX3R4dCk7CisJb3Nfc25wcmludGYoZGJfdG1wX21pbGVuYWdlLmltc2ksIHNpemVvZihkYl90bXBfbWlsZW5hZ2UuaW1zaSksCisJCSAgICAiJWxsdSIsIGltc2kpOworCW9zX3NucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksCisJCSAgICAiU0VMRUNUIGtpLG9wYyxhbWYsc3FuIEZST00gbWlsZW5hZ2UgV0hFUkUgaW1zaT0lbGx1OyIsCisJCSAgICBpbXNpKTsKKwlpZiAoc3FsaXRlM19leGVjKHNxbGl0ZV9kYiwgY21kLCBnZXRfbWlsZW5hZ2VfY2IsICZkYl90bXBfbWlsZW5hZ2UsCisJCQkgTlVMTCkgIT0gU1FMSVRFX09LKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZGJfdG1wX21pbGVuYWdlOworfQorCisKK3N0YXRpYyBpbnQgZGJfdXBkYXRlX21pbGVuYWdlX3NxbihzdHJ1Y3QgbWlsZW5hZ2VfcGFyYW1ldGVycyAqbSkKK3sKKwljaGFyIGNtZFsxMjhdLCB2YWxbMTNdLCAqcG9zOworCisJcG9zID0gdmFsOworCXBvcyArPSB3cGFfc25wcmludGZfaGV4KHBvcywgc2l6ZW9mKHZhbCksIG0tPnNxbiwgNik7CisJKnBvcyA9ICdcMCc7CisJb3Nfc25wcmludGYoY21kLCBzaXplb2YoY21kKSwKKwkJICAgICJVUERBVEUgbWlsZW5hZ2UgU0VUIHNxbj0nJXMnIFdIRVJFIGltc2k9JXM7IiwKKwkJICAgIHZhbCwgbS0+aW1zaSk7CisJaWYgKHNxbGl0ZTNfZXhlYyhzcWxpdGVfZGIsIGNtZCwgTlVMTCwgTlVMTCwgTlVMTCkgIT0gU1FMSVRFX09LKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIHVwZGF0ZSBTUU4gaW4gZGF0YWJhc2UgZm9yIElNU0kgJXNcbiIsCisJCSAgICAgICBtLT5pbXNpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KKworCiBzdGF0aWMgaW50IG9wZW5fc29ja2V0KGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAJc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CkBAIC00NjAsNiArNTk3LDExIEBACiAJCW0gPSBtLT5uZXh0OwogCX0KIAorI2lmZGVmIENPTkZJR19TUUxJVEUKKwlpZiAoIW0pCisJCW0gPSBkYl9nZXRfbWlsZW5hZ2UoaW1zaSk7CisjZW5kaWYgLyogQ09ORklHX1NRTElURSAqLworCiAJcmV0dXJuIG07CiB9CiAKQEAgLTU3Nyw2ICs3MTksNyBAQAogCXNpemVfdCByZXNfbGVuOwogCWludCByZXQ7CiAJc3RydWN0IG1pbGVuYWdlX3BhcmFtZXRlcnMgKm07CisJaW50IGZhaWxlZCA9IDA7CiAKIAltID0gZ2V0X21pbGVuYWdlKGltc2kpOwogCWlmIChtKSB7CkBAIC01ODQsNiArNzI3LDkgQEAKIAkJCXJldHVybjsKIAkJcmVzX2xlbiA9IEVBUF9BS0FfUkVTX01BWF9MRU47CiAJCWluY19zcW4obS0+c3FuKTsKKyNpZmRlZiBDT05GSUdfU1FMSVRFCisJCWRiX3VwZGF0ZV9taWxlbmFnZV9zcW4obSk7CisjZW5kaWYgLyogQ09ORklHX1NRTElURSAqLwogCQlzcW5fY2hhbmdlcyA9IDE7CiAJCXByaW50ZigiQUtBOiBNaWxlbmFnZSB3aXRoIFNRTj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCSAgICAgICBtLT5zcW5bMF0sIG0tPnNxblsxXSwgbS0+c3FuWzJdLApAQCAtNjAxLDcgKzc0Nyw3IEBACiAJCW1lbXNldChyZXMsICcyJywgRUFQX0FLQV9SRVNfTUFYX0xFTik7CiAJCXJlc19sZW4gPSBFQVBfQUtBX1JFU19NQVhfTEVOOwogI2Vsc2UgLyogQUtBX1VTRV9GSVhFRF9URVNUX1ZBTFVFUyAqLwotCQlyZXR1cm47CisJCWZhaWxlZCA9IDE7CiAjZW5kaWYgLyogQUtBX1VTRV9GSVhFRF9URVNUX1ZBTFVFUyAqLwogCX0KIApAQCAtNjExLDYgKzc1NywxMyBAQAogCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCiAJCXJldHVybjsKIAlwb3MgKz0gcmV0OworCWlmIChmYWlsZWQpIHsKKwkJcmV0ID0gc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJGQUlMVVJFIik7CisJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCisJCQlyZXR1cm47CisJCXBvcyArPSByZXQ7CisJCWdvdG8gZG9uZTsKKwl9CiAJcG9zICs9IHdwYV9zbnByaW50Zl9oZXgocG9zLCBlbmQgLSBwb3MsIF9yYW5kLCBFQVBfQUtBX1JBTkRfTEVOKTsKIAkqcG9zKysgPSAnICc7CiAJcG9zICs9IHdwYV9zbnByaW50Zl9oZXgocG9zLCBlbmQgLSBwb3MsIGF1dG4sIEVBUF9BS0FfQVVUTl9MRU4pOwpAQCAtNjIxLDYgKzc3NCw3IEBACiAJKnBvcysrID0gJyAnOwogCXBvcyArPSB3cGFfc25wcmludGZfaGV4KHBvcywgZW5kIC0gcG9zLCByZXMsIHJlc19sZW4pOwogCitkb25lOgogCXByaW50ZigiU2VuZDogJXNcbiIsIHJlcGx5KTsKIAogCWlmIChzZW5kdG8ocywgcmVwbHksIHBvcyAtIHJlcGx5LCAwLCAoc3RydWN0IHNvY2thZGRyICopIGZyb20sCkBAIC02NjgsNiArODIyLDkgQEAKIAkJcHJpbnRmKCJBS0EtQVVUUzogUmUtc3luY2hyb25pemVkOiAiCiAJCSAgICAgICAiU1FOPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkJICAgICAgIHNxblswXSwgc3FuWzFdLCBzcW5bMl0sIHNxblszXSwgc3FuWzRdLCBzcW5bNV0pOworI2lmZGVmIENPTkZJR19TUUxJVEUKKwkJZGJfdXBkYXRlX21pbGVuYWdlX3NxbihtKTsKKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCiAJCXNxbl9jaGFuZ2VzID0gMTsKIAl9CiB9CkBAIC03MzQsNiArODkxLDEzIEBACiAKIAljbG9zZShzZXJ2X3NvY2spOwogCXVubGluayhzb2NrZXRfcGF0aCk7CisKKyNpZmRlZiBDT05GSUdfU1FMSVRFCisJaWYgKHNxbGl0ZV9kYikgeworCQlzcWxpdGUzX2Nsb3NlKHNxbGl0ZV9kYik7CisJCXNxbGl0ZV9kYiA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPTkZJR19TUUxJVEUgKi8KIH0KIAogCkBAIC03NTMsNyArOTE3LDcgQEAKIAkgICAgICAgInVzYWdlOlxuIgogCSAgICAgICAiaGxyX2F1Y19ndyBbLWh1XSBbLXM8c29ja2V0IHBhdGg+XSBbLWc8dHJpcGxldCBmaWxlPl0gIgogCSAgICAgICAiWy1tPG1pbGVuYWdlIGZpbGU+XSBcXFxuIgotCSAgICAgICAiICAgICAgICBbLWk8SU5EIGxlbiBpbiBiaXRzPl1cbiIKKwkgICAgICAgIiAgICAgICAgWy1EPERCIGZpbGU+XSBbLWk8SU5EIGxlbiBpbiBiaXRzPl1cbiIKIAkgICAgICAgIlxuIgogCSAgICAgICAib3B0aW9uczpcbiIKIAkgICAgICAgIiAgLWggPSBzaG93IHRoaXMgdXNhZ2UgaGVscFxuIgpAQCAtNzYyLDYgKzkyNiw3IEBACiAJICAgICAgICIgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAlcylcbiIKIAkgICAgICAgIiAgLWc8dHJpcGxldCBmaWxlPiA9IHBhdGggZm9yIEdTTSBhdXRoZW50aWNhdGlvbiB0cmlwbGV0c1xuIgogCSAgICAgICAiICAtbTxtaWxlbmFnZSBmaWxlPiA9IHBhdGggZm9yIE1pbGVuYWdlIGtleXNcbiIKKwkgICAgICAgIiAgLUQ8REIgZmlsZT4gPSBwYXRoIHRvIFNRTGl0ZSBkYXRhYmFzZVxuIgogCSAgICAgICAiICAtaTxJTkQgbGVuIGluIGJpdHM+ID0gSU5EIGxlbmd0aCBmb3IgU1FOIChkZWZhdWx0OiA1KVxuIiwKIAkgICAgICAgZGVmYXVsdF9zb2NrZXRfcGF0aCk7CiB9CkBAIC03NzEsNiArOTM2LDcgQEAKIHsKIAlpbnQgYzsKIAljaGFyICpnc21fdHJpcGxldF9maWxlID0gTlVMTDsKKwljaGFyICpzcWxpdGVfZGJfZmlsZSA9IE5VTEw7CiAKIAlpZiAob3NfcHJvZ3JhbV9pbml0KCkpCiAJCXJldHVybiAtMTsKQEAgLTc3OCwxMCArOTQ0LDE4IEBACiAJc29ja2V0X3BhdGggPSBkZWZhdWx0X3NvY2tldF9wYXRoOwogCiAJZm9yICg7OykgewotCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJnOmhpOm06czp1Iik7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgIkQ6ZzpoaTptOnM6dSIpOwogCQlpZiAoYyA8IDApCiAJCQlicmVhazsKIAkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ0QnOgorI2lmZGVmIENPTkZJR19TUUxJVEUKKwkJCXNxbGl0ZV9kYl9maWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisjZWxzZSAvKiBDT05GSUdfU1FMSVRFICovCisJCQlwcmludGYoIk5vIFNRTGl0ZSBzdXBwb3J0IGluY2x1ZGVkIGluIHRoZSBidWlsZFxuIik7CisJCQlyZXR1cm4gLTE7CisjZW5kaWYgLyogQ09ORklHX1NRTElURSAqLwogCQljYXNlICdnJzoKIAkJCWdzbV90cmlwbGV0X2ZpbGUgPSBvcHRhcmc7CiAJCQlicmVhazsKQEAgLTgxMCw2ICs5ODQsMTYgQEAKIAkJfQogCX0KIAorCWlmICghZ3NtX3RyaXBsZXRfZmlsZSAmJiAhbWlsZW5hZ2VfZmlsZSAmJiAhc3FsaXRlX2RiX2ZpbGUpIHsKKwkJdXNhZ2UoKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIENPTkZJR19TUUxJVEUKKwlpZiAoc3FsaXRlX2RiX2ZpbGUgJiYgKHNxbGl0ZV9kYiA9IGRiX29wZW4oc3FsaXRlX2RiX2ZpbGUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisjZW5kaWYgLyogQ09ORklHX1NRTElURSAqLworCiAJaWYgKGdzbV90cmlwbGV0X2ZpbGUgJiYgcmVhZF9nc21fdHJpcGxldHMoZ3NtX3RyaXBsZXRfZmlsZSkgPCAwKQogCQlyZXR1cm4gLTE7CiAKQEAgLTgyOSw2ICsxMDEzLDEzIEBACiAJZm9yICg7OykKIAkJcHJvY2VzcyhzZXJ2X3NvY2spOwogCisjaWZkZWYgQ09ORklHX1NRTElURQorCWlmIChzcWxpdGVfZGIpIHsKKwkJc3FsaXRlM19jbG9zZShzcWxpdGVfZGIpOworCQlzcWxpdGVfZGIgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1FMSVRFICovCisKIAlvc19wcm9ncmFtX2RlaW5pdCgpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9ob3N0YXBkL2hscl9hdWNfZ3cudHh0IGIvaG9zdGFwZC9obHJfYXVjX2d3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGI2NzgzCi0tLSAvZGV2L251bGwKKysrIGIvaG9zdGFwZC9obHJfYXVjX2d3LnR4dApAQCAtMCwwICsxLDk4IEBACitITFIvQXVDIHRlc3RpbmcgZ2F0ZXdheSBmb3IgaG9zdGFwZCBFQVAtU0lNL0FLQSBkYXRhYmFzZS9hdXRoZW50aWNhdG9yCisKK2hscl9hdWNfZ3cgaXMgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRUFQLVNJTS9BS0EvQUtBJworZGF0YWJhc2UvYXV0aGVudGljYXRpb24gZ2F0ZXdheSBpbnRlcmZhY2UgdG8gSExSL0F1Qy4gSXQgY291bGQgYmUKK3JlcGxhY2VkIHdpdGggYW4gaW1wbGVtZW50YXRpb24gb2YgU1M3IGdhdGV3YXkgdG8gR1NNL1VNVFMKK2F1dGhlbnRpY2F0aW9uIGNlbnRlciAoSExSL0F1QykuIGhvc3RhcGQgd2lsbCBzZW5kIFNJTS9BS0EKK2F1dGhlbnRpY2F0aW9uIHF1ZXJpZXMgb3ZlciBhIFVOSVggZG9tYWluIHNvY2tldCB0byBhbmQgZXh0ZXJuYWwKK3Byb2dyYW0sIGUuZy4sIGhscl9hdWNfZ3cuCisKK2hscl9hdWNfZ3cgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBHU00gYW5kIFVNVFMgYXV0aGVudGljYXRpb24gZGF0YSB3aXRoCit0ZXh0IGZpbGVzOiBHU00gdHJpcGxldCBmaWxlIChzZWUgaG9zdGFwZC5zaW1fZGIpIGFuZCBNaWxlbmFnZSBmaWxlIChzZWUKK2hscl9hdWNfZ3cubWlsZW5hZ2VfZGIpLiBNaWxlbmFnZSBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlCitkeW5hbWljIGF1dGhlbnRpY2F0aW9uIGRhdGEgZm9yIEVBUC1TSU0sIEVBUC1BS0EsIGFuZCBFQVAtQUtBJyB3aGlsZSB0aGUKK0dTTSB0cmlwbGV0IGRhdGEgaXMgdXNlZCBmb3IgYSBtb3JlIHN0YXRpYyBjb25maWd1cmF0aW9uIChlLmcuLCB0cmlwbGV0cworZXh0cmFjdGVkIGZyb20gYSBTSU0gY2FyZCkuCisKK0FsdGVybmF0aXZlbHksIGhscl9hdWNfZ3cgY2FuIGJlIGJ1aWx0IHdpdGggc3VwcG9ydCBmb3IgYW4gU1FMaXRlCitkYXRhYmFzZSBmb3IgbW9yZSBkeW5hbWljIG9wZXJhdGlvbnMuIFRoaXMgaXMgZW5hYmxlZCBieSBhZGRpbmcKKyJDT05GSUdfU1FMSVRFPXkiIGludG8gaG9zdGFwZC8uY29uZmlnIGJlZm9yZSBidWlsZGluZyBobHJfYXVjX2d3ICgibWFrZQorY2xlYW47IG1ha2UgaGxyX2F1Y19ndyIgaW4gdGhpcyBkaXJlY3RvcnkpLgorCitob3N0YXBkIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGhscl9hdWNfZ3cgd2l0aCB0aGUgZWFwX3NpbV9kYiBwYXJhbWV0ZXIgaW4KK2hvc3RhcGQuY29uZiAoZS5nLiwgImVhcF9zaW1fZGI9dW5peDovdG1wL2hscl9hdWNfZ3cuc29jayIpLiBobHJfYXVjX2d3CitpcyBjb25maWd1cmVkIHdpdGggY29tbWFuZCBsaW5lIHBhcmFtZXRlcnM6CisKK2hscl9hdWNfZ3cgWy1odV0gWy1zPHNvY2tldCBwYXRoPl0gWy1nPHRyaXBsZXQgZmlsZT5dIFstbTxtaWxlbmFnZSBmaWxlPl0gXAorICAgICAgICBbLUQ8REIgZmlsZT5dIFstaTxJTkQgbGVuIGluIGJpdHM+XQorCitvcHRpb25zOgorICAtaCA9IHNob3cgdGhpcyB1c2FnZSBoZWxwCisgIC11ID0gdXBkYXRlIFNRTiBpbiBNaWxlbmFnZSBmaWxlIG9uIGV4aXQKKyAgLXM8c29ja2V0IHBhdGg+ID0gcGF0aCBmb3IgVU5JWCBkb21haW4gc29ja2V0CisgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAvdG1wL2hscl9hdWNfZ3cuc29jaykKKyAgLWc8dHJpcGxldCBmaWxlPiA9IHBhdGggZm9yIEdTTSBhdXRoZW50aWNhdGlvbiB0cmlwbGV0cworICAtbTxtaWxlbmFnZSBmaWxlPiA9IHBhdGggZm9yIE1pbGVuYWdlIGtleXMKKyAgLUQ8REIgZmlsZT4gPSBwYXRoIHRvIFNRTGl0ZSBkYXRhYmFzZQorICAtaTxJTkQgbGVuIGluIGJpdHM+ID0gSU5EIGxlbmd0aCBmb3IgU1FOIChkZWZhdWx0OiA1KQorCisKK1RoZSBTUUxpdGUgZGF0YWJhc2UgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggc3FsaXRlLCBlLmcuLCBieSBydW5uaW5nCitmb2xsb3dpbmcgY29tbWFuZHMgaW4gInNxbGl0ZTMgL3BhdGgvdG8vaGxyX2F1Y19ndy5kYiI6CisKK0NSRUFURSBUQUJMRSBtaWxlbmFnZSgKKwlpbXNpIElOVEVHRVIgUFJJTUFSWSBLRVkgTk9UIE5VTEwsCisJa2kgQ0hBUigzMikgTk9UIE5VTEwsCisJb3BjIENIQVIoMzIpIE5PVCBOVUxMLAorCWFtZiBDSEFSKDQpIE5PVCBOVUxMLAorCXNxbiBDSEFSKDEyKSBOT1QgTlVMTAorKTsKK0lOU0VSVCBJTlRPIG1pbGVuYWdlKGltc2ksa2ksb3BjLGFtZixzcW4pIFZBTFVFUygKKwkyMzIwMTAwMDAwMDAwMDAsCisJJzkwZGNhNGVkYTQ1YjUzY2YwZjEyZDdjOWMzYmM2YTg5JywKKwknY2I5Y2NjYzRiOTI1OGU2ZGNhNDc2MDM3OWZiODI1ODEnLAorCSc2MWRmJywKKwknMDAwMDAwMDAwMDAwJworKTsKK0lOU0VSVCBJTlRPIG1pbGVuYWdlKGltc2ksa2ksb3BjLGFtZixzcW4pIFZBTFVFUygKKwk1NTU0NDQzMzMyMjIxMTEsCisJJzUxMjIyNTAyMTRjMzNlNzIzYTVkZDUyM2ZjMTQ1ZmMwJywKKwknOTgxZDQ2NGM3YzUyZWI2ZTUwMzYyMzQ5ODRhZDBiY2YnLAorCSdjM2FiJywKKwknMTZmM2IzZjcwZmMxJworKTsKKworCisiaGxyX2F1Y19ndyAtRCAvcGF0aC90by9obHJfYXVjX2d3LmRiIiBjYW4gdGhlbiBiZSB1c2VkIHRvIGZldGNoCitNaWxlbmFnZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIElNU0kgZnJvbSB0aGUgZGF0YWJhc2UuIFRoZSBkYXRhYmFzZSBjYW4gYmUKK3VwZGF0ZWQgZHluYW1pY2FsbHkgd2hpbGUgaGxyX2F1Y19ndyBpcyBydW5uaW5nIHRvIGFkZC9yZW1vdmUvbW9kaWZ5CitlbnRyaWVzLgorCisKK0V4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgaG9zdGFwZCB0byBvcGVyYXRlIGFzIGEgUkFESVVTCithdXRoZW50aWNhdGlvbiBzZXJ2ZXIgZm9yIEVBUC1TSU0vQUtBL0FLQSc6CisKK2hvc3RhcGQuY29uZjoKKworZHJpdmVyPW5vbmUKK3JhZGl1c19zZXJ2ZXJfY2xpZW50cz1ob3N0YXBkLnJhZGl1c19jbGllbnRzCitlYXBfc2VydmVyPTEKK2VhcF91c2VyX2ZpbGU9aG9zdGFwZC5lYXBfdXNlcgorZWFwX3NpbV9kYj11bml4Oi90bXAvaGxyX2F1Y19ndy5zb2NrCitlYXBfc2ltX2FrYV9yZXN1bHRfaW5kPTEKKworaG9zdGFwZC5yYWRpdXNfY2xpZW50czoKKworMC4wLjAuMC8wCXJhZGl1cworCitob3N0YXBkLmVhcF91c2VyOgorCisiMCIqCUFLQQorIjEiKglTSU0KKyIyIioJQUtBCisiMyIqCVNJTQorIjQiKglBS0EKKyI1IioJU0lNCisiNiIqCUFLQScKKyI3IioJQUtBJworIjgiKglBS0EnCmRpZmYgLS1naXQgYS9ob3N0YXBkL2hvc3RhcGQuY29uZiBiL2hvc3RhcGQvaG9zdGFwZC5jb25mCmluZGV4IGRhYTAzZDIuLjVhMmMyZWEgMTAwNjQ0Ci0tLSBhL2hvc3RhcGQvaG9zdGFwZC5jb25mCisrKyBiL2hvc3RhcGQvaG9zdGFwZC5jb25mCkBAIC04NCw2ICs4NCwxMSBAQAogCiAjIFNTSUQgdG8gYmUgdXNlZCBpbiBJRUVFIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcwogc3NpZD10ZXN0CisjIEFsdGVybmF0aXZlIGZvcm1hdHMgZm9yIGNvbmZpZ3VyaW5nIFNTSUQKKyMgKGRvdWJsZSBxdW90ZWQgc3RyaW5nLCBoZXhkdW1wLCBwcmludGYtZXNjYXBlZCBzdHJpbmcpCisjc3NpZDI9InRlc3QiCisjc3NpZDI9NzQ2NTczNzQKKyNzc2lkMj1QImhlbGxvXG50aGVyZSIKIAogIyBDb3VudHJ5IGNvZGUgKElTTy9JRUMgMzE2Ni0xKS4gVXNlZCB0byBzZXQgcmVndWxhdG9yeSBkb21haW4uCiAjIFNldCBhcyBuZWVkZWQgdG8gaW5kaWNhdGUgY291bnRyeSBpbiB3aGljaCBkZXZpY2UgaXMgb3BlcmF0aW5nLgpAQCAtMTk2LDYgKzIwMSwxMyBAQAogIyAgICAgcmVxdWVzdHMgZm9yIGJyb2FkY2FzdCBTU0lECiBpZ25vcmVfYnJvYWRjYXN0X3NzaWQ9MAogCisjIEFkZGl0aW9uYWwgdmVuZG9yIHNwZWNmaWMgZWxlbWVudHMgZm9yIEJlYWNvbiBhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzCisjIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBlbGVtZW50KHMpIGludG8KKyMgdGhlIGVuZCBvZiB0aGUgQmVhY29uIGFuZCBQcm9iZSBSZXNwb25zZSBmcmFtZXMuIFRoZSBmb3JtYXQgZm9yIHRoZXNlCisjIGVsZW1lbnQocykgaXMgYSBoZXhkdW1wIG9mIHRoZSByYXcgaW5mb3JtYXRpb24gZWxlbWVudHMgKGlkK2xlbitwYXlsb2FkIGZvcgorIyBvbmUgb3IgbW9yZSBlbGVtZW50cykKKyN2ZW5kb3JfZWxlbWVudHM9ZGQwNDExMjIzMzAxCisKICMgVFggcXVldWUgcGFyYW1ldGVycyAoRURDRiAvIGJ1cnN0aW5nKQogIyB0eF9xdWV1ZV88cXVldWUgbmFtZT5fPHBhcmFtPgogIyBxdWV1ZXM6IGRhdGEwLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBhZnRlcl9iZWFjb24sIGJlYWNvbgpAQCAtNDg5LDcgKzUwMSw3IEBACiAjIGVsc2UgcmVzZXJ2ZWQgKGRlZmF1bHQpCiAjCiAjIE51bWJlciBvZiBTb3VuZGluZyBEaW1lbnNpb25zOiBbU09VTkRJTkctRElNRU5TSU9OLTJdCi0jIEJlYW1mb3JtZXKScyBjYXBhYmlsaXR5IGluZGljYXRpbmcgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIE5VTV9TVFMgcGFyYW1ldGVyCisjIEJlYW1mb3JtZXIncyBjYXBhYmlsaXR5IGluZGljYXRpbmcgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIE5VTV9TVFMgcGFyYW1ldGVyCiAjIGluIHRoZSBUWFZFQ1RPUiBvZiBhIFZIVCBORFAKICMgSWYgU1UgYmVhbWZvcm1lciBjYXBhYmxlLCBzZXQgdG8gbWF4aW11bSB2YWx1ZSBtaW51cyAxCiAjIGVsc2UgcmVzZXJ2ZWQgKGRlZmF1bHQpCkBAIC01MjIsNyArNTM0LDcgQEAKICMgSW5kaWNhdGVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBBLU1QRFUgcHJlLUVPRiBwYWRkaW5nIHRoYXQgdGhlIFNUQSBjYW4gcmVjdgogIyBUaGlzIGZpZWxkIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNy4KICMgVGhlIGxlbmd0aCBkZWZpbmVkIGJ5IHRoaXMgZmllbGQgaXMgZXF1YWwgdG8KLSMgMiBwb3coMTMgKyBNYXhpbXVtIEEtTVBEVSBMZW5ndGggRXhwb25lbnQpIJYxIG9jdGV0cworIyAyIHBvdygxMyArIE1heGltdW0gQS1NUERVIExlbmd0aCBFeHBvbmVudCkgLTEgb2N0ZXRzCiAjCiAjIFZIVCBMaW5rIEFkYXB0YXRpb24gQ2FwYWJsZTogW1ZIVC1MSU5LLUFEQVBUMl0gW1ZIVC1MSU5LLUFEQVBUM10KICMgSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBTVEEgc3VwcG9ydHMgbGluayBhZGFwdGF0aW9uIHVzaW5nIFZIVCB2YXJpYW50CkBAIC01NDUsNyArNTU3LDIxIEBACiAjIDAgPSBUeCBhbnRlbm5hIHBhdHRlcm4gbWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gYXNzb2NpYXRpb24KICMgMSA9IFR4IGFudGVubmEgcGF0dGVybiBkb2VzIG5vdCBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBhc3NvY2lhdGlvbgogI3ZodF9jYXBhYj1bU0hPUlQtR0ktODBdW0hUQy1WSFRdCisjCisjIFJlcXVpcmUgc3RhdGlvbnMgdG8gc3VwcG9ydCBWSFQgUEhZIChyZWplY3QgYXNzb2NpYXRpb24gaWYgdGhleSBkbyBub3QpCisjcmVxdWlyZV92aHQ9MQorCisjIDAgPSAyMCBvciA0MCBNSHogb3BlcmF0aW5nIENoYW5uZWwgd2lkdGgKKyMgMSA9IDgwIE1IeiBjaGFubmVsIHdpZHRoCisjIDIgPSAxNjAgTUh6IGNoYW5uZWwgd2lkdGgKKyMgMyA9IDgwKzgwIE1IeiBjaGFubmVsIHdpZHRoCiAjdmh0X29wZXJfY2h3aWR0aD0xCisjCisjIGNlbnRlciBmcmVxID0gNSBHSHogKyAoNSAqIGluZGV4KQorIyBTbyBpbmRleCA0MiBnaXZlcyBjZW50ZXIgZnJlcSA1LjIxMCBHSHoKKyMgd2hpY2ggaXMgY2hhbm5lbCA0MiBpbiA1RyBiYW5kCisjCisjdmh0X29wZXJfY2VudHJfZnJlcV9zZWcwX2lkeD00MgogCiAjIyMjIyBJRUVFIDgwMi4xWC0yMDA0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTc5Niw2ICs4MjIsMTIgQEAKICMgdG8gdGhlIGJyaWRnZS4KICN2bGFuX3RhZ2dlZF9pbnRlcmZhY2U9ZXRoMAogCisjIFdoZW4gaG9zdGFwZCBjcmVhdGVzIGEgVkxBTiBpbnRlcmZhY2Ugb24gdmxhbl90YWdnZWRfaW50ZXJmYWNlcywgaXQgbmVlZHMKKyMgdG8ga25vdyBob3cgdG8gbmFtZSBpdC4KKyMgMCA9IHZsYW48WFhYPiwgZS5nLiwgdmxhbjEKKyMgMSA9IDx2bGFuX3RhZ2dlZF9pbnRlcmZhY2U+LjxYWFg+LCBlLmcuIGV0aDAuMQorI3ZsYW5fbmFtaW5nPTAKKwogIyBBcmJpdHJhcnkgUkFESVVTIGF0dHJpYnV0ZXMgY2FuIGJlIGFkZGVkIGludG8gQWNjZXNzLVJlcXVlc3QgYW5kCiAjIEFjY291bnRpbmctUmVxdWVzdCBwYWNrZXRzIGJ5IHNwZWNpZnlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhdHRyaWJ1dGVzIHdpdGgKICMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBvZiB0aGVzZSB0bwpAQCAtMTMxMSw3ICsxMzQzLDcgQEAKICMgQXJiaXRyYXJ5IG51bWJlciBvZiBSb2FtaW5nIENvbnNvcnRpdW0gT0lzIGNhbiBiZSBjb25maWd1cmVkIHdpdGggZWFjaCBsaW5lCiAjIGFkZGluZyBhIG5ldyBPSSB0byB0aGUgbGlzdC4gVGhlIGZpcnN0IHRocmVlIGVudHJpZXMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoCiAjIEJlYWNvbiBhbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWVzLiBBbnkgYWRkaXRpb25hbCBlbnRyeSB3aWxsIGJlIGF2YWlsYWJsZSBvbmx5Ci0jIHRocm91Z2ggQU5RUCBxdWVyaWVzLiBFYWNoIE9JIGlzIGJldHdlZW4gMyBhbmQgMTUgb2N0ZXRzIGFuZCBpcyBjb25maWd1cmVkIGEKKyMgdGhyb3VnaCBBTlFQIHF1ZXJpZXMuIEVhY2ggT0kgaXMgYmV0d2VlbiAzIGFuZCAxNSBvY3RldHMgYW5kIGlzIGNvbmZpZ3VyZWQgYXMKICMgYSBoZXhzdHJpbmcuCiAjcm9hbWluZ19jb25zb3J0aXVtPTAyMTEyMgogI3JvYW1pbmdfY29uc29ydGl1bT0yMjMzNDQ1NTY2CkBAIC0xMzI1LDYgKzEzNTcsMTI0IEBACiAjdmVudWVfbmFtZT1lbmc6RXhhbXBsZSB2ZW51ZQogI3ZlbnVlX25hbWU9ZmluOkVzaW1lcmtraXBhaWtrYQogCisjIE5ldHdvcmsgQXV0aGVudGljYXRpb24gVHlwZQorIyBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIG5ldHdvcmsgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiB0aGUKKyMgbmV0d29yay4KKyMgZm9ybWF0OiA8bmV0d29yayBhdXRoIHR5cGUgaW5kaWNhdG9yICgxLW9jdGV0IGhleCBzdHIpPiBbcmVkaXJlY3QgVVJMXQorIyBOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFR5cGUgSW5kaWNhdG9yIHZhbHVlczoKKyMgMDAgPSBBY2NlcHRhbmNlIG9mIHRlcm1zIGFuZCBjb25kaXRpb25zCisjIDAxID0gT24tbGluZSBlbnJvbGxtZW50IHN1cHBvcnRlZAorIyAwMiA9IGh0dHAvaHR0cHMgcmVkaXJlY3Rpb24KKyMgMDMgPSBETlMgcmVkaXJlY3Rpb24KKyNuZXR3b3JrX2F1dGhfdHlwZT0wMAorI25ldHdvcmtfYXV0aF90eXBlPTAyaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yZWRpcmVjdC9tZS9oZXJlLworCisjIElQIEFkZHJlc3MgVHlwZSBBdmFpbGFiaWxpdHkKKyMgZm9ybWF0OiA8MS1vY3RldCBlbmNvZGVkIHZhbHVlIGFzIGhleCBzdHI+CisjIChpcHY0X3R5cGUgJiAweDNmKSA8PCAyIHwgKGlwdjZfdHlwZSAmIDB4MykKKyMgaXB2NF90eXBlOgorIyAwID0gQWRkcmVzcyB0eXBlIG5vdCBhdmFpbGFibGUKKyMgMSA9IFB1YmxpYyBJUHY0IGFkZHJlc3MgYXZhaWxhYmxlCisjIDIgPSBQb3J0LXJlc3RyaWN0ZWQgSVB2NCBhZGRyZXNzIGF2YWlsYWJsZQorIyAzID0gU2luZ2xlIE5BVGVkIHByaXZhdGUgSVB2NCBhZGRyZXNzIGF2YWlsYWJsZQorIyA0ID0gRG91YmxlIE5BVGVkIHByaXZhdGUgSVB2NCBhZGRyZXNzIGF2YWlsYWJsZQorIyA1ID0gUG9ydC1yZXN0cmljdGVkIElQdjQgYWRkcmVzcyBhbmQgc2luZ2xlIE5BVGVkIElQdjQgYWRkcmVzcyBhdmFpbGFibGUKKyMgNiA9IFBvcnQtcmVzdHJpY3RlZCBJUHY0IGFkZHJlc3MgYW5kIGRvdWJsZSBOQVRlZCBJUHY0IGFkZHJlc3MgYXZhaWxhYmxlCisjIDcgPSBBdmFpbGFiaWxpdHkgb2YgdGhlIGFkZHJlc3MgdHlwZSBpcyBub3Qga25vd24KKyMgaXB2Nl90eXBlOgorIyAwID0gQWRkcmVzcyB0eXBlIG5vdCBhdmFpbGFibGUKKyMgMSA9IEFkZHJlc3MgdHlwZSBhdmFpbGFibGUKKyMgMiA9IEF2YWlsYWJpbGl0eSBvZiB0aGUgYWRkcmVzcyB0eXBlIG5vdCBrbm93bgorI2lwYWRkcl90eXBlX2F2YWlsYWJpbGl0eT0xNAorCisjIERvbWFpbiBOYW1lCisjIGZvcm1hdDogPHZhcmlhYmxlLW9jdGV0IHN0cj5bLDx2YXJpYWJsZS1vY3RldCBzdHI+XQorI2RvbWFpbl9uYW1lPWV4YW1wbGUuY29tLGFub3RoZXIuZXhhbXBsZS5jb20seWV0LWFub3RoZXIuZXhhbXBsZS5jb20KKworIyAzR1BQIENlbGx1bGFyIE5ldHdvcmsgaW5mb3JtYXRpb24KKyMgZm9ybWF0OiA8TUNDMSxNTkMxPls7PE1DQzIsTU5DMj5dWzsuLi5dCisjYW5xcF8zZ3BwX2NlbGxfbmV0PTI0NCw5MTszMTAsMDI2OzIzNCw1NgorCisjIE5BSSBSZWFsbSBpbmZvcm1hdGlvbgorIyBPbmUgb3IgbW9yZSByZWFsbSBjYW4gYmUgYWR2ZXJ0aXNlZC4gRWFjaCBuYWlfcmVhbG0gbGluZSBhZGRzIGEgbmV3IHJlYWxtIHRvCisjIHRoZSBzZXQuIFRoZXNlIHBhcmFtZXRlcnMgcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3Igc3RhdGlvbnMgdXNpbmcgSW50ZXJ3b3JraW5nCisjIG5ldHdvcmsgc2VsZWN0aW9uIHRvIGFsbG93IGF1dG9tYXRpYyBjb25uZWN0aW9uIHRvIGEgbmV0d29yayBiYXNlZCBvbgorIyBjcmVkZW50aWFscy4KKyMgZm9ybWF0OiA8ZW5jb2Rpbmc+LDxOQUkgUmVhbG0ocyk+Wyw8RUFQIE1ldGhvZCAxPl1bLDxFQVAgTWV0aG9kIDI+XVssLi4uXQorIyBlbmNvZGluZzoKKyMJMCA9IFJlYWxtIGZvcm1hdHRlZCBpbiBhY2NvcmRhbmNlIHdpdGggSUVURiBSRkMgNDI4MgorIwkxID0gVVRGLTggZm9ybWF0dGVkIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBpcyBub3QgZm9ybWF0dGVkIGluCisjCSAgICBhY2NvcmRhbmNlIHdpdGggSUVURiBSRkMgNDI4MgorIyBOQUkgUmVhbG0ocyk6IFNlbWktY29sb24gZGVsaW1pdGVkIE5BSSBSZWFsbShzKQorIyBFQVAgTWV0aG9kOiA8RUFQIE1ldGhvZD5bOjxbQXV0aFBhcmFtMTpWYWwxXT5dWzxbQXV0aFBhcmFtMjpWYWwyXT5dWy4uLl0KKyMgQXV0aFBhcmFtIChUYWJsZSA4LTE4OCBpbiBJRUVFIFN0ZCA4MDIuMTEtMjAxMik6CisjIElEIDIgPSBOb24tRUFQIElubmVyIEF1dGhlbnRpY2F0aW9uIFR5cGUKKyMJMSA9IFBBUCwgMiA9IENIQVAsIDMgPSBNU0NIQVAsIDQgPSBNU0NIQVBWMgorIyBJRCAzID0gSW5uZXIgYXV0aGVudGljYXRpb24gRUFQIE1ldGhvZCBUeXBlCisjIElEIDUgPSBDcmVkZW50aWFsIFR5cGUKKyMJMSA9IFNJTSwgMiA9IFVTSU0sIDMgPSBORkMgU2VjdXJlIEVsZW1lbnQsIDQgPSBIYXJkd2FyZSBUb2tlbiwKKyMJNSA9IFNvZnRva2VuLCA2ID0gQ2VydGlmaWNhdGUsIDcgPSB1c2VybmFtZS9wYXNzd29yZCwgOSA9IEFub255bW91cywKKyMJMTAgPSBWZW5kb3IgU3BlY2lmaWMKKyNuYWlfcmVhbG09MCxleGFtcGxlLmNvbTtleGFtcGxlLm5ldAorIyBFQVAgbWV0aG9kcyBFQVAtVExTIHdpdGggY2VydGlmaWNhdGUgYW5kIEVBUC1UVExTL01TQ0hBUHYyIHdpdGgKKyMgdXNlcm5hbWUvcGFzc3dvcmQKKyNuYWlfcmVhbG09MCxleGFtcGxlLm9yZywxM1s1OjZdLDIxWzI6NF1bNTo3XQorCisjIyMjIyBIb3RzcG90IDIuMCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRW5hYmxlIEhvdHNwb3QgMi4wIHN1cHBvcnQKKyNoczIwPTEKKworIyBEaXNhYmxlIERvd25zdHJlYW0gR3JvdXAtQWRkcmVzc2VkIEZvcndhcmRpbmcgKERHQUYpCisjIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGEgbmV0d29yayB3aGVyZSBubyBncm91cC1hZGRyZXNzZWQgZnJhbWVzIGFyZQorIyBhbGxvd2VkLiBUaGUgQVAgd2lsbCBub3QgZm9yd2FyZCBhbnkgZ3JvdXAtYWRkcmVzcyBmcmFtZXMgdG8gdGhlIHN0YXRpb25zIGFuZAorIyByYW5kb20gR1RLcyBhcmUgaXNzdWVkIGZvciBlYWNoIHN0YXRpb24gdG8gcHJldmVudCBhc3NvY2lhdGVkIHN0YXRpb25zIGZyb20KKyMgZm9yZ2luZyBzdWNoIGZyYW1lcyB0byBvdGhlciBzdGF0aW9ucyBpbiB0aGUgQlNTLgorI2Rpc2FibGVfZGdhZj0xCisKKyMgT3BlcmF0b3IgRnJpZW5kbHkgTmFtZQorIyBUaGlzIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgb25lIG9yIG1vcmUgT3BlcmF0b3IgRnJpZW5kbHkgTmFtZQorIyBEdXBsZXMuIEVhY2ggZW50cnkgaGFzIGEgdHdvIG9yIHRocmVlIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIChJU08tNjM5KQorIyBzZXBhcmF0ZWQgYnkgY29sb24gZnJvbSB0aGUgb3BlcmF0b3IgZnJpZW5kbHkgbmFtZSBzdHJpbmcuCisjaHMyMF9vcGVyX2ZyaWVuZGx5X25hbWU9ZW5nOkV4YW1wbGUgb3BlcmF0b3IKKyNoczIwX29wZXJfZnJpZW5kbHlfbmFtZT1maW46RXNpbWVya2tpb3BlcmFhdHRvcmkKKworIyBDb25uZWN0aW9uIENhcGFiaWxpdHkKKyMgVGhpcyBjYW4gYmUgdXNlZCB0byBhZHZlcnRpc2Ugd2hhdCB0eXBlIG9mIElQIHRyYWZmaWMgY2FuIGJlIHNlbnQgdGhyb3VnaCB0aGUKKyMgaG90c3BvdCAoZS5nLiwgZHVlIHRvIGZpcmV3YWxsIGFsbG93aW5nL2Jsb2NraW5nIHByb3RvY29scy9wb3J0cykuCisjIGZvcm1hdDogPElQIFByb3RvY29sPjo8UG9ydCBOdW1iZXI+OjxTdGF0dXM+CisjIElQIFByb3RvY29sOiAxID0gSUNNUCwgNiA9IFRDUCwgMTcgPSBVRFAKKyMgUG9ydCBOdW1iZXI6IDAuLjY1NTM1CisjIFN0YXR1czogMCA9IENsb3NlZCwgMSA9IE9wZW4sIDIgPSBVbmtub3duCisjIEVhY2ggaHMyMF9jb25uX2NhcGFiIGxpbmUgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWR2ZXJ0aXNlZCB0dXBsZXMuCisjaHMyMF9jb25uX2NhcGFiPTE6MDoyCisjaHMyMF9jb25uX2NhcGFiPTY6MjI6MQorI2hzMjBfY29ubl9jYXBhYj0xNzo1MDYwOjAKKworIyBXQU4gTWV0cmljcworIyBmb3JtYXQ6IDxXQU4gSW5mbz46PERMIFNwZWVkPjo8VUwgU3BlZWQ+OjxETCBMb2FkPjo8VUwgTG9hZD46PExNRD4KKyMgV0FOIEluZm86IEIwLUIxOiBMaW5rIFN0YXR1cywgQjI6IFN5bW1ldHJpYyBMaW5rLCBCMzogQXQgQ2FwYWJpdHkKKyMgICAgKGVuY29kZWQgYXMgdHdvIGhleCBkaWdpdHMpCisjICAgIExpbmsgU3RhdHVzOiAxID0gTGluayB1cCwgMiA9IExpbmsgZG93biwgMyA9IExpbmsgaW4gdGVzdCBzdGF0ZQorIyBEb3dubGluayBTcGVlZDogRXN0aW1hdGUgb2YgV0FOIGJhY2toYXVsIGxpbmsgY3VycmVudCBkb3dubGluayBzcGVlZCBpbiBrYnBzOworIwkxLi40Mjk0OTY3Mjk1OyAwID0gdW5rbm93bgorIyBVcGxpbmsgU3BlZWQ6IEVzdGltYXRlIG9mIFdBTiBiYWNraGF1bCBsaW5rIGN1cnJlbnQgdXBsaW5rIHNwZWVkIGluIGticHMKKyMJMS4uNDI5NDk2NzI5NTsgMCA9IHVua25vd24KKyMgRG93bmxpbmsgTG9hZDogQ3VycmVudCBsb2FkIG9mIGRvd25saW5rIFdBTiBjb25uZWN0aW9uIChzY2FsZWQgdG8gMjU1ID0gMTAwJSkKKyMgVXBsaW5rIExvYWQ6IEN1cnJlbnQgbG9hZCBvZiB1cGxpbmsgV0FOIGNvbm5lY3Rpb24gKHNjYWxlZCB0byAyNTUgPSAxMDAlKQorIyBMb2FkIE1lYXN1cmVtZW50IER1cmF0aW9uOiBEdXJhdGlvbiBmb3IgbWVhc3VyaW5nIGRvd25saW5rL3VwbGluayBsb2FkIGluCisjIHRlbnRocyBvZiBhIHNlY29uZCAoMS4uNjU1MzUpOyAwIGlmIGxvYWQgY2Fubm90IGJlIGRldGVybWluZWQKKyNoczIwX3dhbl9tZXRyaWNzPTAxOjgwMDA6MTAwMDo4MDoyNDA6MzAwMAorCisjIE9wZXJhdGluZyBDbGFzcyBJbmRpY2F0aW9uCisjIExpc3Qgb2Ygb3BlcmF0aW5nIGNsYXNzZXMgdGhlIEJTU2VzIGluIHRoaXMgRVNTIHVzZS4gVGhlIEdsb2JhbCBvcGVyYXRpbmcKKyMgY2xhc3NlcyBpbiBUYWJsZSBFLTQgb2YgSUVFRSBTdGQgODAyLjExLTIwMTIgQW5uZXggRSBkZWZpbmUgdGhlIHZhbHVlcyB0aGF0CisjIGNhbiBiZSB1c2VkIGluIHRoaXMuCisjIGZvcm1hdDogaGV4ZHVtcCBvZiBvcGVyYXRpbmcgY2xhc3Mgb2N0ZXRzCisjIGZvciBleGFtcGxlLCBvcGVyYXRpbmcgY2xhc3NlcyA4MSAoMi40IEdIeiBjaGFubmVscyAxLTEzKSBhbmQgMTE1ICg1IEdIegorIyBjaGFubmVscyAzNi00OCk6CisjaHMyMF9vcGVyYXRpbmdfY2xhc3M9NTE3MworCiAjIyMjIyBNdWx0aXBsZSBCU1NJRCBzdXBwb3J0ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjCiAjIEFib3ZlIGNvbmZpZ3VyYXRpb24gaXMgdXNpbmcgdGhlIGRlZmF1bHQgaW50ZXJmYWNlICh3bGFuIywgb3IgbXVsdGktU1NJRCBWTEFOCmRpZmYgLS1naXQgYS9ob3N0YXBkL2hvc3RhcGRfY2xpLmMgYi9ob3N0YXBkL2hvc3RhcGRfY2xpLmMKaW5kZXggMGMzM2Q1Yi4uYWVkOTgxYyAxMDA2NDQKLS0tIGEvaG9zdGFwZC9ob3N0YXBkX2NsaS5jCisrKyBiL2hvc3RhcGQvaG9zdGFwZF9jbGkuYwpAQCAtNzEsNiArNzEsNyBAQAogIiAgIHdwc19waW4gPHV1aWQ+IDxwaW4+IFt0aW1lb3V0XSBbYWRkcl0gIGFkZCBXUFMgRW5yb2xsZWUgUElOXG4iCiAiICAgd3BzX2NoZWNrX3BpbiA8UElOPiAgdmVyaWZ5IFBJTiBjaGVja3N1bVxuIgogIiAgIHdwc19wYmMgICAgICAgICAgICAgIGluZGljYXRlIGJ1dHRvbiBwdXNoZWQgdG8gaW5pdGlhdGUgUEJDXG4iCisiICAgd3BzX2NhbmNlbCAgICAgICAgICAgY2FuY2VsIHRoZSBwZW5kaW5nIFdQUyBvcGVyYXRpb25cbiIKICNpZmRlZiBDT05GSUdfV1BTX09PQgogIiAgIHdwc19vb2IgPHR5cGU+IDxwYXRoPiA8bWV0aG9kPiAgdXNlIFdQUyB3aXRoIG91dC1vZi1iYW5kIChVRkQpXG4iCiAjZW5kaWYgLyogQ09ORklHX1dQU19PT0IgKi8KQEAgLTk3Nyw3ICs5NzgsNyBAQAogCiAJZWxvb3BfcmVnaXN0ZXJfc2lnbmFsX3Rlcm1pbmF0ZShob3N0YXBkX2NsaV9lbG9vcF90ZXJtaW5hdGUsIE5VTEwpOwogCWVkaXRfaW5pdChob3N0YXBkX2NsaV9lZGl0X2NtZF9jYiwgaG9zdGFwZF9jbGlfZWRpdF9lb2ZfY2IsCi0JCSAgTlVMTCwgTlVMTCwgTlVMTCk7CisJCSAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJZWxvb3BfcmVnaXN0ZXJfdGltZW91dChwaW5nX2ludGVydmFsLCAwLCBob3N0YXBkX2NsaV9waW5nLCBOVUxMLCBOVUxMKTsKIAogCWVsb29wX3J1bigpOwpkaWZmIC0tZ2l0IGEvaG9zdGFwZC9tYWluLmMgYi9ob3N0YXBkL21haW4uYwppbmRleCBkOGMyNzc2Li41NmYwMDAyIDEwMDY0NAotLS0gYS9ob3N0YXBkL21haW4uYworKysgYi9ob3N0YXBkL21haW4uYwpAQCAtMTY2LDE0ICsxNjYsOSBAQAogCWlmIChoYXBkX2lmYWNlID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIAotCWhhcGRfaWZhY2UtPnJlbG9hZF9jb25maWcgPSBob3N0YXBkX3JlbG9hZF9jb25maWc7Ci0JaGFwZF9pZmFjZS0+Y29uZmlnX3JlYWRfY2IgPSBob3N0YXBkX2NvbmZpZ19yZWFkOwogCWhhcGRfaWZhY2UtPmNvbmZpZ19mbmFtZSA9IG9zX3N0cmR1cChjb25maWdfZmlsZSk7CiAJaWYgKGhhcGRfaWZhY2UtPmNvbmZpZ19mbmFtZSA9PSBOVUxMKQogCQlnb3RvIGZhaWw7Ci0JaGFwZF9pZmFjZS0+Y3RybF9pZmFjZV9pbml0ID0gaG9zdGFwZF9jdHJsX2lmYWNlX2luaXQ7Ci0JaGFwZF9pZmFjZS0+Y3RybF9pZmFjZV9kZWluaXQgPSBob3N0YXBkX2N0cmxfaWZhY2VfZGVpbml0OwotCWhhcGRfaWZhY2UtPmZvcl9lYWNoX2ludGVyZmFjZSA9IGhvc3RhcGRfZm9yX2VhY2hfaW50ZXJmYWNlOwogCiAJY29uZiA9IGhvc3RhcGRfY29uZmlnX3JlYWQoaGFwZF9pZmFjZS0+Y29uZmlnX2ZuYW1lKTsKIAlpZiAoY29uZiA9PSBOVUxMKQpAQCAtMTgxLDcgKzE3Niw3IEBACiAJaGFwZF9pZmFjZS0+Y29uZiA9IGNvbmY7CiAKIAloYXBkX2lmYWNlLT5udW1fYnNzID0gY29uZi0+bnVtX2JzczsKLQloYXBkX2lmYWNlLT5ic3MgPSBvc196YWxsb2MoY29uZi0+bnVtX2JzcyAqCisJaGFwZF9pZmFjZS0+YnNzID0gb3NfY2FsbG9jKGNvbmYtPm51bV9ic3MsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgaG9zdGFwZF9kYXRhICopKTsKIAlpZiAoaGFwZF9pZmFjZS0+YnNzID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKQEAgLTI0OCwxMyArMjQzLDEzIEBACiAJfQogCXBhcmFtcy5ic3NpZCA9IGI7CiAJcGFyYW1zLmlmbmFtZSA9IGhhcGQtPmNvbmYtPmlmYWNlOwotCXBhcmFtcy5zc2lkID0gKGNvbnN0IHU4ICopIGhhcGQtPmNvbmYtPnNzaWQuc3NpZDsKKwlwYXJhbXMuc3NpZCA9IGhhcGQtPmNvbmYtPnNzaWQuc3NpZDsKIAlwYXJhbXMuc3NpZF9sZW4gPSBoYXBkLT5jb25mLT5zc2lkLnNzaWRfbGVuOwogCXBhcmFtcy50ZXN0X3NvY2tldCA9IGhhcGQtPmNvbmYtPnRlc3Rfc29ja2V0OwogCXBhcmFtcy51c2VfcGFlX2dyb3VwX2FkZHIgPSBoYXBkLT5jb25mLT51c2VfcGFlX2dyb3VwX2FkZHI7CiAKIAlwYXJhbXMubnVtX2JyaWRnZSA9IGhhcGQtPmlmYWNlLT5udW1fYnNzOwotCXBhcmFtcy5icmlkZ2UgPSBvc196YWxsb2MoaGFwZC0+aWZhY2UtPm51bV9ic3MgKiBzaXplb2YoY2hhciAqKSk7CisJcGFyYW1zLmJyaWRnZSA9IG9zX2NhbGxvYyhoYXBkLT5pZmFjZS0+bnVtX2Jzcywgc2l6ZW9mKGNoYXIgKikpOwogCWlmIChwYXJhbXMuYnJpZGdlID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlmb3IgKGkgPSAwOyBpIDwgaGFwZC0+aWZhY2UtPm51bV9ic3M7IGkrKykgewpAQCAtMjg0LDIxICsyNzksNiBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGhvc3RhcGRfaW50ZXJmYWNlX2RlaW5pdF9mcmVlKHN0cnVjdCBob3N0YXBkX2lmYWNlICppZmFjZSkKLXsKLQljb25zdCBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgKmRyaXZlcjsKLQl2b2lkICpkcnZfcHJpdjsKLQlpZiAoaWZhY2UgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWRyaXZlciA9IGlmYWNlLT5ic3NbMF0tPmRyaXZlcjsKLQlkcnZfcHJpdiA9IGlmYWNlLT5ic3NbMF0tPmRydl9wcml2OwotCWhvc3RhcGRfaW50ZXJmYWNlX2RlaW5pdChpZmFjZSk7Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPmhhcGRfZGVpbml0ICYmIGRydl9wcml2KQotCQlkcml2ZXItPmhhcGRfZGVpbml0KGRydl9wcml2KTsKLQlob3N0YXBkX2ludGVyZmFjZV9mcmVlKGlmYWNlKTsKLX0KLQotCiBzdGF0aWMgc3RydWN0IGhvc3RhcGRfaWZhY2UgKgogaG9zdGFwZF9pbnRlcmZhY2VfaW5pdChzdHJ1Y3QgaGFwZF9pbnRlcmZhY2VzICppbnRlcmZhY2VzLAogCQkgICAgICAgY29uc3QgY2hhciAqY29uZmlnX2ZuYW1lLCBpbnQgZGVidWcpCkBAIC00MTEsNyArMzkxLDcgQEAKIAkJd3BhX3ByaW50ZihNU0dfRVJST1IsICJObyBkcml2ZXJzIGVuYWJsZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlnbG9iYWwuZHJ2X3ByaXYgPSBvc196YWxsb2MoZ2xvYmFsLmRydl9jb3VudCAqIHNpemVvZih2b2lkICopKTsKKwlnbG9iYWwuZHJ2X3ByaXYgPSBvc19jYWxsb2MoZ2xvYmFsLmRydl9jb3VudCwgc2l6ZW9mKHZvaWQgKikpOwogCWlmIChnbG9iYWwuZHJ2X3ByaXYgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCkBAIC00OTksMTMgKzQ3OSwxNSBAQAogCWZwcmludGYoc3RkZXJyLAogCQkiXG4iCiAJCSJ1c2FnZTogaG9zdGFwZCBbLWhkQkt0dl0gWy1QIDxQSUQgZmlsZT5dIFstZSA8ZW50cm9weSBmaWxlPl0gIgotCQkiPGNvbmZpZ3VyYXRpb24gZmlsZShzKT5cbiIKKwkJIlxcXG4iCisJCSIgICAgICAgICBbLWcgPGdsb2JhbCBjdHJsX2lmYWNlPl0gPGNvbmZpZ3VyYXRpb24gZmlsZShzKT5cbiIKIAkJIlxuIgogCQkib3B0aW9uczpcbiIKIAkJIiAgIC1oICAgc2hvdyB0aGlzIHVzYWdlXG4iCiAJCSIgICAtZCAgIHNob3cgbW9yZSBkZWJ1ZyBtZXNzYWdlcyAoLWRkIGZvciBldmVuIG1vcmUpXG4iCiAJCSIgICAtQiAgIHJ1biBkYWVtb24gaW4gdGhlIGJhY2tncm91bmRcbiIKIAkJIiAgIC1lICAgZW50cm9weSBmaWxlXG4iCisJCSIgICAtZyAgIGdsb2JhbCBjb250cm9sIGludGVyZmFjZSBwYXRoXG4iCiAJCSIgICAtUCAgIFBJRCBmaWxlXG4iCiAJCSIgICAtSyAgIGluY2x1ZGUga2V5IGRhdGEgaW4gZGVidWcgbWVzc2FnZXNcbiIKICNpZmRlZiBDT05GSUdfREVCVUdfRklMRQpAQCAtNTI3LDYgKzUwOSwyOCBAQAogfQogCiAKK3N0YXRpYyBpbnQgaG9zdGFwZF9nZXRfZ2xvYmFsX2N0cmxfaWZhY2Uoc3RydWN0IGhhcGRfaW50ZXJmYWNlcyAqaW50ZXJmYWNlcywKKwkJCQkJIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciAqcG9zOworCW9zX2ZyZWUoaW50ZXJmYWNlcy0+Z2xvYmFsX2lmYWNlX3BhdGgpOworCWludGVyZmFjZXMtPmdsb2JhbF9pZmFjZV9wYXRoID0gb3Nfc3RyZHVwKHBhdGgpOworCWlmIChpbnRlcmZhY2VzLT5nbG9iYWxfaWZhY2VfcGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcG9zID0gb3Nfc3RycmNocihpbnRlcmZhY2VzLT5nbG9iYWxfaWZhY2VfcGF0aCwgJy8nKTsKKwlpZiAocG9zID09IE5VTEwpIHsKKwkJb3NfZnJlZShpbnRlcmZhY2VzLT5nbG9iYWxfaWZhY2VfcGF0aCk7CisJCWludGVyZmFjZXMtPmdsb2JhbF9pZmFjZV9wYXRoID0gTlVMTDsKKwkJcmV0dXJuIC0xOworCX0KKworCSpwb3MgPSAnXDAnOworCWludGVyZmFjZXMtPmdsb2JhbF9pZmFjZV9uYW1lID0gcG9zICsgMTsKKworCXJldHVybiAwOworfQorCisKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJc3RydWN0IGhhcGRfaW50ZXJmYWNlcyBpbnRlcmZhY2VzOwpAQCAtNTQwLDggKzU0NCwxOSBAQAogCWlmIChvc19wcm9ncmFtX2luaXQoKSkKIAkJcmV0dXJuIC0xOwogCisJb3NfbWVtc2V0KCZpbnRlcmZhY2VzLCAwLCBzaXplb2YoaW50ZXJmYWNlcykpOworCWludGVyZmFjZXMucmVsb2FkX2NvbmZpZyA9IGhvc3RhcGRfcmVsb2FkX2NvbmZpZzsKKwlpbnRlcmZhY2VzLmNvbmZpZ19yZWFkX2NiID0gaG9zdGFwZF9jb25maWdfcmVhZDsKKwlpbnRlcmZhY2VzLmZvcl9lYWNoX2ludGVyZmFjZSA9IGhvc3RhcGRfZm9yX2VhY2hfaW50ZXJmYWNlOworCWludGVyZmFjZXMuY3RybF9pZmFjZV9pbml0ID0gaG9zdGFwZF9jdHJsX2lmYWNlX2luaXQ7CisJaW50ZXJmYWNlcy5jdHJsX2lmYWNlX2RlaW5pdCA9IGhvc3RhcGRfY3RybF9pZmFjZV9kZWluaXQ7CisJaW50ZXJmYWNlcy5kcml2ZXJfaW5pdCA9IGhvc3RhcGRfZHJpdmVyX2luaXQ7CisJaW50ZXJmYWNlcy5nbG9iYWxfaWZhY2VfcGF0aCA9IE5VTEw7CisJaW50ZXJmYWNlcy5nbG9iYWxfaWZhY2VfbmFtZSA9IE5VTEw7CisJaW50ZXJmYWNlcy5nbG9iYWxfY3RybF9zb2NrID0gLTE7CisKIAlmb3IgKDs7KSB7Ci0JCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgIkJkZTpmOmhLUDp0diIpOworCQljID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJCZGU6ZjpoS1A6dHZnOiIpOwogCQlpZiAoYyA8IDApCiAJCQlicmVhazsKIAkJc3dpdGNoIChjKSB7CkBAIC01NzYsNiArNTkxLDkgQEAKIAkJCXNob3dfdmVyc2lvbigpOwogCQkJZXhpdCgxKTsKIAkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCWhvc3RhcGRfZ2V0X2dsb2JhbF9jdHJsX2lmYWNlKCZpbnRlcmZhY2VzLCBvcHRhcmcpOworCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAkJCXVzYWdlKCk7CkBAIC01ODMsNyArNjAxLDcgQEAKIAkJfQogCX0KIAotCWlmIChvcHRpbmQgPT0gYXJnYykKKwlpZiAob3B0aW5kID09IGFyZ2MgJiYgaW50ZXJmYWNlcy5nbG9iYWxfaWZhY2VfcGF0aCA9PSBOVUxMKQogCQl1c2FnZSgpOwogCiAJd3BhX21zZ19yZWdpc3Rlcl9pZm5hbWVfY2IoaG9zdGFwZF9tc2dfaWZuYW1lX2NiKTsKQEAgLTU5MiwxMSArNjEwLDEzIEBACiAJCXdwYV9kZWJ1Z19vcGVuX2ZpbGUobG9nX2ZpbGUpOwogCiAJaW50ZXJmYWNlcy5jb3VudCA9IGFyZ2MgLSBvcHRpbmQ7Ci0JaW50ZXJmYWNlcy5pZmFjZSA9IG9zX3phbGxvYyhpbnRlcmZhY2VzLmNvdW50ICoKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaG9zdGFwZF9pZmFjZSAqKSk7Ci0JaWYgKGludGVyZmFjZXMuaWZhY2UgPT0gTlVMTCkgewotCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIm1hbGxvYyBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOworCWlmIChpbnRlcmZhY2VzLmNvdW50KSB7CisJCWludGVyZmFjZXMuaWZhY2UgPSBvc19jYWxsb2MoaW50ZXJmYWNlcy5jb3VudCwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGhvc3RhcGRfaWZhY2UgKikpOworCQlpZiAoaW50ZXJmYWNlcy5pZmFjZSA9PSBOVUxMKSB7CisJCQl3cGFfcHJpbnRmKE1TR19FUlJPUiwgIm1hbGxvYyBmYWlsZWQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQogCX0KIAogCWlmIChob3N0YXBkX2dsb2JhbF9pbml0KCZpbnRlcmZhY2VzLCBlbnRyb3B5X2ZpbGUpKQpAQCAtNjExLDEyICs2MzEsMTUgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAorCWhvc3RhcGRfZ2xvYmFsX2N0cmxfaWZhY2VfaW5pdCgmaW50ZXJmYWNlcyk7CisKIAlpZiAoaG9zdGFwZF9nbG9iYWxfcnVuKCZpbnRlcmZhY2VzLCBkYWVtb25pemUsIHBpZF9maWxlKSkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAwOwogCiAgb3V0OgorCWhvc3RhcGRfZ2xvYmFsX2N0cmxfaWZhY2VfZGVpbml0KCZpbnRlcmZhY2VzKTsKIAkvKiBEZWluaXRpYWxpemUgYWxsIGludGVyZmFjZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5jb3VudDsgaSsrKQogCQlob3N0YXBkX2ludGVyZmFjZV9kZWluaXRfZnJlZShpbnRlcmZhY2VzLmlmYWNlW2ldKTsK