ZGlmZiAtLWdpdCBhL3NyYy9idWZmZXIuYyBiL3NyYy9idWZmZXIuYwppbmRleCBmYTJlNjUyLi4xNDE1MmI3IDEwMDY0NAotLS0gYS9zcmMvYnVmZmVyLmMKKysrIGIvc3JjL2J1ZmZlci5jCkBAIC03MDQsMTAgKzcwNCw4IEBACiAgICAgYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOwogICAgIGJ1Zi0+Yl9wX2VvbCA9IFRSVUU7CiAgICAgYnVmLT5iX3N0YXJ0X2VvbCA9IFRSVUU7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGJ1Zi0+Yl9wX2JvbWIgPSBGQUxTRTsKICAgICBidWYtPmJfc3RhcnRfYm9tYiA9IEZBTFNFOwotI2VuZGlmCiAgICAgYnVmLT5iX21sLm1sX21mcCA9IE5VTEw7CiAgICAgYnVmLT5iX21sLm1sX2ZsYWdzID0gTUxfRU1QVFk7CQkvKiBlbXB0eSBidWZmZXIgKi8KICNpZmRlZiBGRUFUX05FVEJFQU5TX0lOVEcKQEAgLTk0MCw5ICs5MzgsNyBAQAogICAgIG1hcF9jbGVhcl9pbnQoYnVmLCBNQVBfQUxMX01PREVTLCBUUlVFLCBGQUxTRSk7ICAvKiBjbGVhciBsb2NhbCBtYXBwaW5ncyAqLwogICAgIG1hcF9jbGVhcl9pbnQoYnVmLCBNQVBfQUxMX01PREVTLCBUUlVFLCBUUlVFKTsgICAvKiBjbGVhciBsb2NhbCBhYmJyZXZzICovCiAjZW5kaWYKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgVklNX0NMRUFSKGJ1Zi0+Yl9zdGFydF9mZW5jKTsKLSNlbmRpZgogfQogCiAvKgpAQCAtMjEzMyw5ICsyMTI5LDcgQEAKIHsKICAgICBpZiAoZnJlZV9wX2ZmKQogICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfZmVuYyk7Ci0jZW5kaWYKIAljbGVhcl9zdHJpbmdfb3B0aW9uKCZidWYtPmJfcF9mZik7CiAJY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYmgpOwogCWNsZWFyX3N0cmluZ19vcHRpb24oJmJ1Zi0+Yl9wX2J0KTsKQEAgLTIyNDUsOSArMjIzOSw3IEBACiAgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfbHcpOwogI2VuZGlmCiAgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfYmtjKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2xlYXJfc3RyaW5nX29wdGlvbigmYnVmLT5iX3BfbWVuYyk7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTM3NzgsMTAgKzM3NzAsOCBAQAogCSAgICBpZiAobGVuID4gMTAwKQogCSAgICB7CiAJCWxlbiAtPSAxMDA7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQkgICAgbGVuICs9ICgqbWJfdGFpbF9vZmYpKHAsIHAgKyBsZW4pICsgMTsKLSNlbmRpZgogCQlwICs9IGxlbjsKIAkgICAgfQogCSAgICBTVFJDUFkoaWNvbl9zdHIsIHApOwpAQCAtMzkzOSwxMSArMzkyOSw5IEBACiAKICAgICBpZiAoZmlsbGNoYXIgPT0gMCkKIAlmaWxsY2hhciA9ICcgJzsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgLyogQ2FuJ3QgaGFuZGxlIGEgbXVsdGktYnl0ZSBmaWxsIGNoYXJhY3RlciB5ZXQuICovCiAgICAgZWxzZSBpZiAobWJfY2hhcjJsZW4oZmlsbGNoYXIpID4gMSkKIAlmaWxsY2hhciA9ICctJzsKLSNlbmRpZgogCiAgICAgLy8gVGhlIGN1cnNvciBpbiB3aW5kb3dzIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGlzbid0IGFsd2F5cwogICAgIC8vIHVwLXRvLWRhdGUsIGVzcC4gYmVjYXVzZSBvZiBhdXRvY29tbWFuZHMgYW5kIHRpbWVycy4KQEAgLTM5NzMsMTEgKzM5NjEsNyBAQAogCWJ5dGV2YWwgPSAwOwogICAgIH0KICAgICBlbHNlCi0jaWZkZWYgRkVBVF9NQllURQogCWJ5dGV2YWwgPSAoKm1iX3B0cjJjaGFyKShwICsgd3AtPndfY3Vyc29yLmNvbCk7Ci0jZWxzZQotCWJ5dGV2YWwgPSBwW3dwLT53X2N1cnNvci5jb2xdOwotI2VuZGlmCiAKICAgICBncm91cGRlcHRoID0gMDsKICAgICBwID0gb3V0OwpAQCAtNDA3OSw3ICs0MDYzLDYgQEAKIAkgICAgaWYgKGwgPiBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWF4d2lkKQogCSAgICB7CiAJCS8qIHRydW5jYXRlLCByZW1vdmUgbiBieXRlcyBvZiB0ZXh0IGF0IHRoZSBzdGFydCAqLwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaWYgKGhhc19tYnl0ZSkKIAkJewogCQkgICAgLyogRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkLiAqLwpAQCAtNDA5MSwxNyArNDA3NCwxNSBAQAogCQkgICAgfQogCQl9CiAJCWVsc2UKLSNlbmRpZgogCQkgICAgbiA9IChsb25nKShwIC0gdCkgLSBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWF4d2lkICsgMTsKIAogCQkqdCA9ICc8JzsKIAkJbWNoX21lbW1vdmUodCArIDEsIHQgKyBuLCAoc2l6ZV90KShwIC0gKHQgKyBuKSkpOwogCQlwID0gcCAtIG4gKyAxOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJLyogRmlsbCB1cCBzcGFjZSBsZWZ0IG92ZXIgYnkgaGFsZiBhIGRvdWJsZS13aWRlIGNoYXIuICovCisKKwkJLy8gRmlsbCB1cCBzcGFjZSBsZWZ0IG92ZXIgYnkgaGFsZiBhIGRvdWJsZS13aWRlIGNoYXIuCiAJCXdoaWxlICgrK2wgPCBpdGVtW2dyb3VwaXRlbVtncm91cGRlcHRoXV0ubWlud2lkKQogCQkgICAgKnArKyA9IGZpbGxjaGFyOwotI2VuZGlmCiAKIAkJLyogY29ycmVjdCB0aGUgc3RhcnQgb2YgdGhlIGl0ZW1zIGZvciB0aGUgdHJ1bmNhdGlvbiAqLwogCQlmb3IgKGwgPSBncm91cGl0ZW1bZ3JvdXBkZXB0aF0gKyAxOyBsIDwgY3VyaXRlbTsgbCsrKQpAQCAtNDQ4MywxNCArNDQ2NCwxMiBAQAogCSAgICBpZiAobCA+IG1heHdpZCkKIAkgICAgewogCQl3aGlsZSAobCA+PSBtYXh3aWQpCi0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJICAgIHsKIAkJCWwgLT0gcHRyMmNlbGxzKHQpOwogCQkJdCArPSAoKm1iX3B0cjJsZW4pKHQpOwogCQkgICAgfQogCQkgICAgZWxzZQotI2VuZGlmCiAJCQlsIC09IGJ5dGUyY2VsbHMoKnQrKyk7CiAJCWlmIChwICsgMSA+PSBvdXQgKyBvdXRsZW4pCiAJCSAgICBicmVhazsKQEAgLTQ2MTAsNyArNDU4OSw2IEBACiAJaWYgKHdpZHRoIC0gdmltX3N0cnNpemUocykgPj0gbWF4d2lkdGgpCiAJewogCSAgICAvKiBUcnVuY2F0aW9uIG1hcmsgaXMgYmV5b25kIG1heCBsZW5ndGggKi8KLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJcyA9IG91dDsKQEAgLTQ2MjcsNyArNDYwNSw2IEBACiAJCSAgICAqcysrID0gZmlsbGNoYXI7CiAJICAgIH0KIAkgICAgZWxzZQotI2VuZGlmCiAJCXMgPSBvdXQgKyBtYXh3aWR0aCAtIDE7CiAJICAgIGZvciAobCA9IDA7IGwgPCBpdGVtY250OyBsKyspCiAJCWlmIChpdGVtW2xdLnN0YXJ0ID4gcykKQEAgLTQ2MzgsNyArNDYxNSw2IEBACiAJfQogCWVsc2UKIAl7Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBpZiAoaGFzX21ieXRlKQogCSAgICB7CiAJCW4gPSAwOwpAQCAtNDY0OSw3ICs0NjI1LDYgQEAKIAkJfQogCSAgICB9CiAJICAgIGVsc2UKLSNlbmRpZgogCQluID0gd2lkdGggLSBtYXh3aWR0aCArIDE7CiAJICAgIHAgPSBzICsgbjsKIAkgICAgU1RSTU9WRShzICsgMSwgcCk7CmRpZmYgLS1naXQgYS9zcmMvY2hhcnNldC5jIGIvc3JjL2NoYXJzZXQuYwppbmRleCAwMjgwOTU0Li43MGUzYmMyIDEwMDY0NAotLS0gYS9zcmMvY2hhcnNldC5jCisrKyBiL3NyYy9jaGFyc2V0LmMKQEAgLTksMTIgKzksMTAgQEAKIAogI2luY2x1ZGUgInZpbS5oIgogCi0jaWZkZWYgRkVBVF9NQllURQotIyBpZiBkZWZpbmVkKEhBVkVfV0NIQVJfSCkKLSMgIGluY2x1ZGUgPHdjaGFyLmg+CSAgICAvKiBmb3IgdG93dXBwZXIoKSBhbmQgdG93bG93ZXIoKSAqLwotIyBlbmRpZgotc3RhdGljIGludCB3aW5fbm9sYnJfY2hhcnRhYnNpemUod2luX1QgKndwLCBjaGFyX3UgKnMsIGNvbG5yX1QgY29sLCBpbnQgKmhlYWRwKTsKKyNpZiBkZWZpbmVkKEhBVkVfV0NIQVJfSCkKKyMgaW5jbHVkZSA8d2NoYXIuaD4JICAgIC8qIGZvciB0b3d1cHBlcigpIGFuZCB0b3dsb3dlcigpICovCiAjZW5kaWYKK3N0YXRpYyBpbnQgd2luX25vbGJyX2NoYXJ0YWJzaXplKHdpbl9UICp3cCwgY2hhcl91ICpzLCBjb2xucl9UIGNvbCwgaW50ICpoZWFkcCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBucjJoZXgodW5zaWduZWQgYyk7CiAKQEAgLTEwOSw3ICsxMDcsNiBAQAogI2VuZGlmCiAJd2hpbGUgKGMgPCAyNTYpCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgLyogVVRGLTg6IGJ5dGVzIDB4YTAgLSAweGZmIGFyZSBwcmludGFibGUgKGxhdGluMSkgKi8KIAkgICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHhhMCkKIAkJZ19jaGFydGFiW2MrK10gPSBDVF9QUklOVF9DSEFSICsgMTsKQEAgLTEyMCwyNiArMTE3LDIyIEBACiAJICAgIGVsc2UgaWYgKGVuY19kYmNzICE9IDAgJiYgTUJfQllURTJMRU4oYykgPT0gMikKIAkJZ19jaGFydGFiW2MrK10gPSBDVF9QUklOVF9DSEFSICsgMjsKIAkgICAgZWxzZQotI2VuZGlmCiAJCS8qIHRoZSByZXN0IGlzIHVucHJpbnRhYmxlIGJ5IGRlZmF1bHQgKi8KIAkJZ19jaGFydGFiW2MrK10gPSAoZHlfZmxhZ3MgJiBEWV9VSEVYKSA/IDQgOiAyOwogCX0KIAotI2lmZGVmIEZFQVRfTUJZVEUKIAkvKiBBc3N1bWUgdGhhdCBldmVyeSBtdWx0aS1ieXRlIGNoYXIgaXMgYSBmaWxlbmFtZSBjaGFyYWN0ZXIuICovCiAJZm9yIChjID0gMTsgYyA8IDI1NjsgKytjKQogCSAgICBpZiAoKGVuY19kYmNzICE9IDAgJiYgTUJfQllURTJMRU4oYykgPiAxKQogCQkgICAgfHwgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBjID09IDB4OGUpCiAJCSAgICB8fCAoZW5jX3V0ZjggJiYgYyA+PSAweGEwKSkKIAkJZ19jaGFydGFiW2NdIHw9IENUX0ZOQU1FX0NIQVI7Ci0jZW5kaWYKICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXQgd29yZCBjaGFyIGZsYWdzIGFsbCB0byBGQUxTRQogICAgICAqLwogICAgIHZpbV9tZW1zZXQoYnVmLT5iX2NoYXJ0YWIsIDAsIChzaXplX3QpMzIpOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoZW5jX2RiY3MgIT0gMCkKIAlmb3IgKGMgPSAwOyBjIDwgMjU2OyArK2MpCiAJewpAQCAtMTQ3LDcgKzE0MCw2IEBACiAJICAgIGlmIChNQl9CWVRFMkxFTihjKSA9PSAyKQogCQlTRVRfQ0hBUlRBQihidWYsIGMpOwogCX0KLSNlbmRpZgogCiAjaWZkZWYgRkVBVF9MSVNQCiAgICAgLyoKQEAgLTE4NCwxMSArMTc2LDkgQEAKIAkgICAgaWYgKFZJTV9JU0RJR0lUKCpwKSkKIAkJYyA9IGdldGRpZ2l0cygmcCk7CiAJICAgIGVsc2UKLSNpZmRlZiBGRUFUX01CWVRFCiAJCSBpZiAoaGFzX21ieXRlKQogCQljID0gbWJfcHRyMmNoYXJfYWR2KCZwKTsKIAkgICAgZWxzZQotI2VuZGlmCiAJCWMgPSAqcCsrOwogCSAgICBjMiA9IC0xOwogCSAgICBpZiAoKnAgPT0gJy0nICYmIHBbMV0gIT0gTlVMKQpAQCAtMTk3LDExICsxODcsOSBAQAogCQlpZiAoVklNX0lTRElHSVQoKnApKQogCQkgICAgYzIgPSBnZXRkaWdpdHMoJnApOwogCQllbHNlCi0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgIGlmIChoYXNfbWJ5dGUpCiAJCSAgICBjMiA9IG1iX3B0cjJjaGFyX2FkdigmcCk7CiAJCWVsc2UKLSNlbmRpZgogCQkgICAgYzIgPSAqcCsrOwogCSAgICB9CiAJICAgIGlmIChjIDw9IDAgfHwgYyA+PSAyNTYgfHwgKGMyIDwgYyAmJiBjMiAhPSAtMSkgfHwgYzIgPj0gMjU2CkBAIC0yNTMsMTMgKzI0MSw5IEBACiAJCQkJICAgIHx8IChwX2FsdGtleW1hcAogCQkJCQkmJiAoRl9pc2FscGhhKGMpIHx8IEZfaXNkaWdpdChjKSkpCiAjZW5kaWYKLQkJCSAgICApCi0jaWZkZWYgRkVBVF9NQllURQotCQkJCS8qIEZvciBkb3VibGUtYnl0ZSB3ZSBrZWVwIHRoZSBjZWxsIHdpZHRoLCBzbwotCQkJCSAqIHRoYXQgd2UgY2FuIGRldGVjdCBpdCBmcm9tIHRoZSBmaXJzdCBieXRlLiAqLwotCQkJCSYmICEoZW5jX2RiY3MgJiYgTUJfQllURTJMRU4oYykgPT0gMikKLSNlbmRpZgotCQkJICAgKQorCQkJCS8vIEZvciBkb3VibGUtYnl0ZSB3ZSBrZWVwIHRoZSBjZWxsIHdpZHRoLCBzbworCQkJCS8vIHRoYXQgd2UgY2FuIGRldGVjdCBpdCBmcm9tIHRoZSBmaXJzdCBieXRlLgorCQkJICAgICkgJiYgIShlbmNfZGJjcyAmJiBNQl9CWVRFMkxFTihjKSA9PSAyKSkKIAkJCXsKIAkJCSAgICBpZiAodGlsZGUpCiAJCQkgICAgewpAQCAtMzIyLDEyICszMDYsMTAgQEAKICAgICByb29tID0gYnVmc2l6ZSAtIGxlbjsKICAgICB3aGlsZSAoKmJ1ZiAhPSAwKQogICAgIHsKLSMgaWZkZWYgRkVBVF9NQllURQogCS8qIEFzc3VtZSBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGRvZXNuJ3QgbmVlZCB0cmFuc2xhdGlvbi4gKi8KIAlpZiAoaGFzX21ieXRlICYmICh0cnNfbGVuID0gKCptYl9wdHIybGVuKShidWYpKSA+IDEpCiAJICAgIGxlbiAtPSB0cnNfbGVuOwogCWVsc2UKLSMgZW5kaWYKIAl7CiAJICAgIHRycyA9IHRyYW5zY2hhcl9ieXRlKCpidWYpOwogCSAgICB0cnNfbGVuID0gKGludClTVFJMRU4odHJzKTsKQEAgLTM1NiwxMiArMzM4LDkgQEAKIHsKICAgICBjaGFyX3UJKnJlczsKICAgICBjaGFyX3UJKnA7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJbCwgbGVuLCBjOwogICAgIGNoYXJfdQloZXhidWZbMTFdOwotI2VuZGlmCiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGhhc19tYnl0ZSkKICAgICB7CiAJLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQsIHRha2luZyBhY2NvdW50IG9mIHVucHJpbnRhYmxlCkBAIC0zOTQsNyArMzczLDYgQEAKIAlyZXMgPSBhbGxvYygodW5zaWduZWQpKGxlbiArIDEpKTsKICAgICB9CiAgICAgZWxzZQotI2VuZGlmCiAJcmVzID0gYWxsb2MoKHVuc2lnbmVkKSh2aW1fc3Ryc2l6ZShzKSArIDEpKTsKICAgICBpZiAocmVzICE9IE5VTEwpCiAgICAgewpAQCAtNDAyLDcgKzM4MCw2IEBACiAJcCA9IHM7CiAJd2hpbGUgKCpwICE9IE5VTCkKIAl7Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuKShwKSkgPiAxKQogCSAgICB7CiAJCWMgPSAoKm1iX3B0cjJjaGFyKShwKTsKQEAgLTQxMyw3ICszOTAsNiBAQAogCQlwICs9IGw7CiAJICAgIH0KIAkgICAgZWxzZQotI2VuZGlmCiAJCVNUUkNBVChyZXMsIHRyYW5zY2hhcl9ieXRlKCpwKyspKTsKIAl9CiAgICAgfQpAQCAtNDY4LDcgKzQ0NCw2IEBACiAgICAgaSA9IDA7CiAgICAgd2hpbGUgKFNUUl9DSEFSKGkpICE9IE5VTCkKICAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChlbmNfdXRmOCB8fCAoaGFzX21ieXRlICYmIE1CX0JZVEUyTEVOKFNUUl9DSEFSKGkpKSA+IDEpKQogCXsKIAkgICAgaWYgKGVuY191dGY4KQpAQCAtNTIwLDcgKzQ5NSw2IEBACiAJICAgIGkgKz0gKCptYl9wdHIybGVuKShTVFJfUFRSKGkpKTsKIAl9CiAJZWxzZQotI2VuZGlmCiAJewogCSAgICBpZiAoYnVmID09IE5VTEwpCiAJCUdBX0NIQVIoaSkgPSBUT0xPV0VSX0xPQyhHQV9DSEFSKGkpKTsKQEAgLTU4MCw3ICs1NTQsNiBAQAogICAgIHJldHVybiB0cmFuc2NoYXJfYnVmOwogfQogCi0jaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKICAqIExpa2UgdHJhbnNjaGFyKCksIGJ1dCBjYWxsZWQgd2l0aCBhIGJ5dGUgaW5zdGVhZCBvZiBhIGNoYXJhY3Rlci4gIENoZWNrcwogICogZm9yIGFuIGlsbGVnYWwgVVRGLTggYnl0ZS4KQEAgLTU5NSw3ICs1NjgsNiBAQAogICAgIH0KICAgICByZXR1cm4gdHJhbnNjaGFyKGMpOwogfQotI2VuZGlmCiAKIC8qCiAgKiBDb252ZXJ0IG5vbi1wcmludGFibGUgY2hhcmFjdGVyIHRvIHR3byBvciBtb3JlIHByaW50YWJsZSBjaGFyYWN0ZXJzIGluCkBAIC02MzIsMTIgKzYwNCwxMCBAQAogCiAJYnVmWzJdID0gTlVMOwogICAgIH0KLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgZWxzZSBpZiAoZW5jX3V0ZjggJiYgYyA+PSAweDgwKQogICAgIHsKIAl0cmFuc2NoYXJfaGV4KGJ1ZiwgYyk7CiAgICAgfQotI2VuZGlmCiAjaWZuZGVmIEVCQ0RJQwogICAgIGVsc2UgaWYgKGMgPj0gJyAnICsgMHg4MCAmJiBjIDw9ICd+JyArIDB4ODApICAgIC8qIDB4YTAgLSAweGZlICovCiAgICAgewpAQCAtNjc1LDEzICs2NDUsMTEgQEAKICAgICBpbnQJCWkgPSAwOwogCiAgICAgYnVmWzBdID0gJzwnOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoYyA+IDI1NSkKICAgICB7CiAJYnVmWysraV0gPSBucjJoZXgoKHVuc2lnbmVkKWMgPj4gMTIpOwogCWJ1ZlsrK2ldID0gbnIyaGV4KCh1bnNpZ25lZCljID4+IDgpOwogICAgIH0KLSNlbmRpZgogICAgIGJ1ZlsrK2ldID0gbnIyaGV4KCh1bnNpZ25lZCljID4+IDQpOwogICAgIGJ1ZlsrK2ldID0gbnIyaGV4KCh1bnNpZ25lZCljKTsKICAgICBidWZbKytpXSA9ICc+JzsKQEAgLTcxMiwxMCArNjgwLDggQEAKICAgICBpbnQKIGJ5dGUyY2VsbHMoaW50IGIpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChlbmNfdXRmOCAmJiBiID49IDB4ODApCiAJcmV0dXJuIDA7Ci0jZW5kaWYKICAgICByZXR1cm4gKGdfY2hhcnRhYltiXSAmIENUX0NFTExfTUFTSyk7CiB9CiAKQEAgLTcyOSw3ICs2OTUsNiBAQAogewogICAgIGlmIChJU19TUEVDSUFMKGMpKQogCXJldHVybiBjaGFyMmNlbGxzKEtfU0VDT05EKGMpKSArIDI7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChjID49IDB4ODApCiAgICAgewogCS8qIFVURi04OiBhYm92ZSAweDgwIG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlICovCkBAIC03NDQsNyArNzA5LDYgQEAKIAkgICAgcmV0dXJuIDI7CiAJfQogICAgIH0KLSNlbmRpZgogICAgIHJldHVybiAoZ19jaGFydGFiW2MgJiAweGZmXSAmIENUX0NFTExfTUFTSyk7CiB9CiAKQEAgLTc1NSwxMiArNzE5LDEwIEBACiAgICAgaW50CiBwdHIyY2VsbHMoY2hhcl91ICpwKQogewotI2lmZGVmIEZFQVRfTUJZVEUKICAgICAvKiBGb3IgVVRGLTggd2UgbmVlZCB0byBsb29rIGF0IG1vcmUgYnl0ZXMgaWYgdGhlIGZpcnN0IGJ5dGUgaXMgPj0gMHg4MC4gKi8KICAgICBpZiAoZW5jX3V0ZjggJiYgKnAgPj0gMHg4MCkKIAlyZXR1cm4gdXRmX3B0cjJjZWxscyhwKTsKICAgICAvKiBGb3IgREJDUyB3ZSBjYW4gdGVsbCB0aGUgY2VsbCBjb3VudCBmcm9tIHRoZSBmaXJzdCBieXRlLiAqLwotI2VuZGlmCiAgICAgcmV0dXJuIChnX2NoYXJ0YWJbKnBdICYgQ1RfQ0VMTF9NQVNLKTsKIH0KIApAQCAtNzg0LDggKzc0Niw2IEBACiAgICAgaW50CQlzaXplID0gMDsKIAogICAgIHdoaWxlICgqcyAhPSBOVUwgJiYgLS1sZW4gPj0gMCkKLSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChoYXNfbWJ5dGUpCiAJewogCSAgICBpbnQJICAgIGwgPSAoKm1iX3B0cjJsZW4pKHMpOwpAQCAtNzk1LDkgKzc1NSw4IEBACiAJICAgIGxlbiAtPSBsIC0gMTsKIAl9CiAJZWxzZQotI2VuZGlmCiAJICAgIHNpemUgKz0gYnl0ZTJjZWxscygqcysrKTsKLSAgICB9CisKICAgICByZXR1cm4gc2l6ZTsKIH0KIApAQCAtOTA3LDEyICs4NjYsMTAgQEAKIHsKICAgICBpZiAoYyA+PSAweDEwMCkKICAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChlbmNfZGJjcyAhPSAwKQogCSAgICByZXR1cm4gZGJjc19jbGFzcygodW5zaWduZWQpYyA+PiA4LCAodW5zaWduZWQpKGMgJiAweGZmKSkgPj0gMjsKIAlpZiAoZW5jX3V0ZjgpCiAJICAgIHJldHVybiB1dGZfY2xhc3NfYnVmKGMsIGJ1ZikgPj0gMjsKLSNlbmRpZgogCXJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIChjID4gMCAmJiBHRVRfQ0hBUlRBQihidWYsIGMpICE9IDApOwpAQCAtOTMyLDEwICs4ODksOCBAQAogewogICAgIGludAljID0gKnA7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGhhc19tYnl0ZSAmJiBNQl9CWVRFMkxFTihjKSA+IDEpCiAJYyA9ICgqbWJfcHRyMmNoYXIpKHApOwotI2VuZGlmCiAgICAgcmV0dXJuIHZpbV9pc3dvcmRjX2J1ZihjLCBidWYpOwogfQogCkBAIC05NzMsMTAgKzkyOCw4IEBACiAgICAgaW50CiB2aW1faXNwcmludGMoaW50IGMpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChlbmNfdXRmOCAmJiBjID49IDB4MTAwKQogCXJldHVybiB1dGZfcHJpbnRhYmxlKGMpOwotI2VuZGlmCiAgICAgcmV0dXJuIChjID49IDB4MTAwIHx8IChjID4gMCAmJiAoZ19jaGFydGFiW2NdICYgQ1RfUFJJTlRfQ0hBUikpKTsKIH0KIApAQCAtOTg3LDEyICs5NDAsMTAgQEAKICAgICBpbnQKIHZpbV9pc3ByaW50Y19zdHJpY3QoaW50IGMpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChlbmNfZGJjcyAhPSAwICYmIGMgPCAweDEwMCAmJiBNQl9CWVRFMkxFTihjKSA+IDEpCiAJcmV0dXJuIEZBTFNFOwogICAgIGlmIChlbmNfdXRmOCAmJiBjID49IDB4MTAwKQogCXJldHVybiB1dGZfcHJpbnRhYmxlKGMpOwotI2VuZGlmCiAgICAgcmV0dXJuIChjID49IDB4MTAwIHx8IChjID4gMCAmJiAoZ19jaGFydGFiW2NdICYgQ1RfUFJJTlRfQ0hBUikpKTsKIH0KIApAQCAtMTAwOSwxMCArOTYwLDggQEAKICAgICBpZiAoIWN1cndpbi0+d19wX2xiciAmJiAqcF9zYnIgPT0gTlVMICYmICFjdXJ3aW4tPndfcF9icmkpCiAgICAgewogI2VuZGlmCi0jaWZkZWYgRkVBVF9NQllURQogCWlmIChjdXJ3aW4tPndfcF93cmFwKQogCSAgICByZXR1cm4gd2luX25vbGJyX2NoYXJ0YWJzaXplKGN1cndpbiwgcywgY29sLCBOVUxMKTsKLSNlbmRpZgogCVJFVF9XSU5fQlVGX0NIQVJUQUJTSVpFKGN1cndpbiwgY3VyYnVmLCBzLCBjb2wpCiAjaWZkZWYgRkVBVF9MSU5FQlJFQUsKICAgICB9CkBAIC0xMDU4LDExICsxMDA3LDcgQEAKICAgICBjb2xucl9UCWNvbF9hZGogPSAwOyAvKiBjb2wgKyBzY3JlZW4gc2l6ZSBvZiB0YWIgKi8KICAgICBjb2xucl9UCWNvbG1heDsKICAgICBpbnQJCWFkZGVkOwotIyBpZmRlZiBGRUFUX01CWVRFCiAgICAgaW50CQltYl9hZGRlZCA9IDA7Ci0jIGVsc2UKLSMgIGRlZmluZSBtYl9hZGRlZCAwCi0jIGVuZGlmCiAgICAgaW50CQludW1iZXJleHRyYTsKICAgICBjaGFyX3UJKnBzOwogICAgIGludAkJdGFiX2NvcnIgPSAoKnMgPT0gVEFCKTsKQEAgLTEwNzQsMTAgKzEwMTksOCBAQAogICAgIGlmICghd3AtPndfcF9sYnIgJiYgIXdwLT53X3BfYnJpICYmICpwX3NiciA9PSBOVUwpCiAjZW5kaWYKICAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmICh3cC0+d19wX3dyYXApCiAJICAgIHJldHVybiB3aW5fbm9sYnJfY2hhcnRhYnNpemUod3AsIHMsIGNvbCwgaGVhZHApOwotI2VuZGlmCiAJUkVUX1dJTl9CVUZfQ0hBUlRBQlNJWkUod3AsIHdwLT53X2J1ZmZlciwgcywgY29sKQogICAgIH0KIApAQCAtMTEzNSwxNCArMTA3OCwxMiBAQAogCSAgICB9CiAJfQogICAgIH0KLSMgaWZkZWYgRkVBVF9NQllURQogICAgIGVsc2UgaWYgKGhhc19tYnl0ZSAmJiBzaXplID09IDIgJiYgTUJfQllURTJMRU4oKnMpID4gMQogCQkJCSAgICAmJiB3cC0+d19wX3dyYXAgJiYgaW5fd2luX2JvcmRlcih3cCwgY29sKSkKICAgICB7CiAJKytzaXplOwkJLyogQ291bnQgdGhlICI+IiBpbiB0aGUgbGFzdCBjb2x1bW4uICovCiAJbWJfYWRkZWQgPSAxOwogICAgIH0KLSMgZW5kaWYKIAogICAgIC8qCiAgICAgICogTWF5IGhhdmUgdG8gYWRkIHNvbWV0aGluZyBmb3IgJ2JyZWFraW5kZW50JyBhbmQvb3IgJ3Nob3dicmVhaycKQEAgLTEyMTAsNyArMTE1MSw2IEBACiAjZW5kaWYKIH0KIAotI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBMaWtlIHdpbl9sYnJfY2hhcnRhYnNpemUoKSwgZXhjZXB0IHRoYXQgd2Uga25vdyAnbGluZWJyZWFrJyBpcyBvZmYgYW5kCiAgKiAnd3JhcCcgaXMgb24uICBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGEgZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHRoYXQKQEAgLTEyNjksNyArMTIwOSw2IEBACiAJcmV0dXJuIEZBTFNFOwogICAgIHJldHVybiAoKHZjb2wgLSB3aWR0aDEpICUgd2lkdGgyID09IHdpZHRoMiAtIDEpOwogfQotI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KIAogLyoKICAqIEdldCB2aXJ0dWFsIGNvbHVtbiBudW1iZXIgb2YgcG9zLgpAQCAtMTMxMCwxMSArMTI0OSw5IEBACiAJaWYgKCpwdHIgPT0gTlVMKQogCSAgICBwb3MtPmNvbCA9IDA7CiAJcG9zcHRyID0gcHRyICsgcG9zLT5jb2w7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChoYXNfbWJ5dGUpCiAJICAgIC8qIGFsd2F5cyBzdGFydCBvbiB0aGUgZmlyc3QgYnl0ZSAqLwogCSAgICBwb3NwdHIgLT0gKCptYl9oZWFkX29mZikobGluZSwgcG9zcHRyKTsKLSNlbmRpZgogICAgIH0KIAogICAgIC8qCkBAIC0xMzI5LDE0ICsxMjY2LDEwIEBACiAjZW5kaWYKICAgICAgICApCiAgICAgewotI2lmbmRlZiBGRUFUX01CWVRFCiAJaGVhZCA9IDA7Ci0jZW5kaWYKIAlmb3IgKDs7KQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGhlYWQgPSAwOwotI2VuZGlmCiAJICAgIGMgPSAqcHRyOwogCSAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBsaW5lICovCiAJICAgIGlmIChjID09IE5VTCkKQEAgLTEzNTMsNyArMTI4Niw2IEBACiAjZW5kaWYKIAkgICAgZWxzZQogCSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQl7CiAJCSAgICAvKiBGb3IgdXRmLTgsIGlmIHRoZSBieXRlIGlzID49IDB4ODAsIG5lZWQgdG8gbG9vayBhdApAQCAtMTM3NCw3ICsxMzA2LDYgQEAKIAkJICAgIH0KIAkJfQogCQllbHNlCi0jZW5kaWYKIAkJICAgIGluY3IgPSBnX2NoYXJ0YWJbY10gJiBDVF9DRUxMX01BU0s7CiAJICAgIH0KIApAQCAtMTQ2MCw5ICsxMzkxLDcgQEAKICAgICBjb2xucl9UCWNvbDsKICAgICBjb2xucl9UCWNvbGFkZDsKICAgICBjb2xucl9UCWVuZGFkZDsKLSMgaWZkZWYgRkVBVF9NQllURQogICAgIGNoYXJfdQkqcHRyOwotIyBlbmRpZgogCiAgICAgaWYgKHZpcnR1YWxfYWN0aXZlKCkpCiAgICAgewpAQCAtMTQ3MSw3ICsxNDAwLDYgQEAKIAogCWNvbGFkZCA9IHBvcy0+Y29sYWRkOwogCWVuZGFkZCA9IDA7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIAkvKiBDYW5ub3QgcHV0IHRoZSBjdXJzb3Igb24gcGFydCBvZiBhIHdpZGUgY2hhcmFjdGVyLiAqLwogCXB0ciA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBwb3MtPmxudW0sIEZBTFNFKTsKIAlpZiAocG9zLT5jb2wgPCAoY29sbnJfVClTVFJMRU4ocHRyKSkKQEAgLTE0ODcsNyArMTQxNSw2IEBACiAJCSAgICBjb2xhZGQgPSAwOwogCSAgICB9CiAJfQotIyBlbmRpZgogCWNvbCArPSBjb2xhZGQ7CiAJaWYgKHN0YXJ0ICE9IE5VTEwpCiAJICAgICpzdGFydCA9IGNvbDsKQEAgLTE2ODQsNyArMTYxMSw2IEBACiAgICAgcmV0dXJuIChjID09ICcwJyB8fCBjID09ICcxJyk7CiB9CiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogVmltJ3Mgb3duIGNoYXJhY3RlciBjbGFzcyBmdW5jdGlvbnMuICBUaGVzZSBleGlzdCBiZWNhdXNlIG1hbnkgbGlicmFyeQogICogaXNsb3dlcigpL3RvdXBwZXIoKSBldGMuIGRvIG5vdCB3b3JrIHByb3Blcmx5OiB0aGV5IGNyYXNoIHdoZW4gdXNlZCB3aXRoCkBAIC0xNzk3LDcgKzE3MjMsNiBAQAogCXJldHVybiBUT0xPV0VSX0FTQyhjKTsKICAgICByZXR1cm4gVE9MT1dFUl9MT0MoYyk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIHNraXB0b3doaXRlOiBza2lwIG92ZXIgdGV4dCB1bnRpbCAnICcgb3IgJ1x0JyBvciBOVUwuCkBAIC0yMDc3LDkgKzIwMDIsNyBAQAogewogI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQogICAgIHJldHVybiAoc3RyWzBdID09ICdcXCcKLSMgaWZkZWYgRkVBVF9NQllURQogCSAgICAmJiBzdHJbMV0gPCAweDgwCi0jIGVuZGlmCiAJICAgICYmIChzdHJbMV0gPT0gJyAnCiAJCXx8IChzdHJbMV0gIT0gTlVMCiAJCSAgICAmJiBzdHJbMV0gIT0gJyonCmRpZmYgLS1naXQgYS9zcmMvZGlmZi5jIGIvc3JjL2RpZmYuYwppbmRleCBlZDYzZjUxLi5kMzY4Zjk2IDEwMDY0NAotLS0gYS9zcmMvZGlmZi5jCisrKyBiL3NyYy9kaWZmLmMKQEAgLTc0MSwxMiArNzQxLDEwIEBACiAJICAgIGlmIChkaWZmX2ZsYWdzICYgRElGRl9JQ0FTRSkKIAkgICAgewogCQlpbnQgYzsKLQotCQkvLyB4ZGlmZiBkb2Vzbid0IHN1cHBvcnQgaWdub3JpbmcgY2FzZSwgZm9sZC1jYXNlIHRoZSB0ZXh0LgotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaW50CW9yaWdfbGVuOwogCQljaGFyX3UJY2J1ZltNQl9NQVhCWVRFUyArIDFdOwogCisJCS8vIHhkaWZmIGRvZXNuJ3Qgc3VwcG9ydCBpZ25vcmluZyBjYXNlLCBmb2xkLWNhc2UgdGhlIHRleHQuCiAJCWMgPSBQVFIyQ0hBUihzKTsKIAkJYyA9IGVuY191dGY4ID8gdXRmX2ZvbGQoYykgOiBNQl9UT0xPV0VSKGMpOwogCQlvcmlnX2xlbiA9IE1CX1BUUjJMRU4ocyk7CkBAIC03NTgsMTAgKzc1Niw2IEBACiAKIAkJcyArPSBvcmlnX2xlbjsKIAkJbGVuICs9IG9yaWdfbGVuOwotI2Vsc2UKLQkJYyA9ICpzKys7Ci0JCXB0cltsZW4rK10gPSBUT0xPV0VSX0xPQyhjKTsKLSNlbmRpZgogCSAgICB9CiAJICAgIGVsc2UKIAkJcHRyW2xlbisrXSA9ICpzKys7CkBAIC0xOTQ2LDcgKzE5NDAsNiBAQAogICAgIHN0YXRpYyBpbnQKIGRpZmZfZXF1YWxfY2hhcihjaGFyX3UgKnAxLCBjaGFyX3UgKnAyLCBpbnQgKmxlbikKIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaW50IGwgID0gKCptYl9wdHIybGVuKShwMSk7CiAKICAgICBpZiAobCAhPSAoKm1iX3B0cjJsZW4pKHAyKSkKQEAgLTE5NjIsNyArMTk1NSw2IEBACiAJKmxlbiA9IGw7CiAgICAgfQogICAgIGVsc2UKLSNlbmRpZgogICAgIHsKIAlpZiAoKCpwMSAhPSAqcDIpCiAJCSYmICghKGRpZmZfZmxhZ3MgJiBESUZGX0lDQVNFKQpAQCAtMjQwMCw3ICsyMzkyLDYgQEAKIAkJICAgIHNpX25ldyArPSBsOwogCQl9CiAJICAgIH0KLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJLyogTW92ZSBiYWNrIHRvIGZpcnN0IGJ5dGUgb2YgY2hhcmFjdGVyIGluIGJvdGggbGluZXMgKG1heQpAQCAtMjQwOCw3ICsyMzk5LDYgQEAKIAkJc2lfb3JnIC09ICgqbWJfaGVhZF9vZmYpKGxpbmVfb3JnLCBsaW5lX29yZyArIHNpX29yZyk7CiAJCXNpX25ldyAtPSAoKm1iX2hlYWRfb2ZmKShsaW5lX25ldywgbGluZV9uZXcgKyBzaV9uZXcpOwogCSAgICB9Ci0jZW5kaWYKIAkgICAgaWYgKCpzdGFydHAgPiBzaV9vcmcpCiAJCSpzdGFydHAgPSBzaV9vcmc7CiAKQEAgLTI0MzgsMTAgKzI0MjgsOCBAQAogCQkgICAgewogCQkJcDEgPSBsaW5lX29yZyArIGVpX29yZzsKIAkJCXAyID0gbGluZV9uZXcgKyBlaV9uZXc7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkJcDEgLT0gKCptYl9oZWFkX29mZikobGluZV9vcmcsIHAxKTsKIAkJCXAyIC09ICgqbWJfaGVhZF9vZmYpKGxpbmVfbmV3LCBwMik7Ci0jZW5kaWYKIAkJCWlmICghZGlmZl9lcXVhbF9jaGFyKHAxLCBwMiwgJmwpKQogCQkJICAgIGJyZWFrOwogCQkJZWlfb3JnIC09IGw7CmRpZmYgLS1naXQgYS9zcmMvZGlncmFwaC5jIGIvc3JjL2RpZ3JhcGguYwppbmRleCA0MDdiNDVmLi5kOTM2MTM2IDEwMDY0NAotLS0gYS9zcmMvZGlncmFwaC5jCisrKyBiL3NyYy9kaWdyYXBoLmMKQEAgLTE1LDExICsxNSw3IEBACiAKICNpZiBkZWZpbmVkKEZFQVRfRElHUkFQSFMpIHx8IGRlZmluZWQoUFJPVE8pCiAKLSNpZmRlZiBGRUFUX01CWVRFCiB0eXBlZGVmIGludCByZXN1bHRfVDsKLSNlbHNlCi10eXBlZGVmIGNoYXJfdSByZXN1bHRfVDsKLSNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBkaWdyYXBoCiB7CkBAIC0zOCw4ICszNCw4IEBACiAgKiBjb21waWxlcnMgY2Fubm90IGhhbmRsZSB0aGVtIChBbWlnYSBTQVMvQyBpcyB0aGUgbW9zdCBwaWNreSBvbmUpLgogICovCiBzdGF0aWMgZGlncl9UIGRpZ3JhcGhkZWZhdWx0W10gPQotI2lmZGVmIF9fTUlOVF9fCiAKKyNpZmRlZiBfX01JTlRfXwogCS8qCiAJICogQVRBUkkgZGlncmFwaHMKIAkgKi8KQEAgLTMyMCwxMzcgKzMxNiw3IEBACiAJfTsKIAogIyAgZWxzZQotIyAgIGlmIGRlZmluZWQoTUFDT1NfWCkgJiYgIWRlZmluZWQoRkVBVF9NQllURSkKLQotCS8qCi0JICogTWFjaW50b3NoIGRpZ3JhcGhzCi0JICovCi0gICAgICAge3snYScsICd0JywgNjR9LAkJLyogQCAqLwotCXsnQScsICciJywgMTI4fSwJLyogfkAgWFggKi8KLQl7J0EnLCAnbycsIDEyOX0sCS8qIMUgKi8KLQl7J0MnLCAnLCcsIDEzMH0sCS8qIMcgKi8KLQl7J0UnLCAnXCcnLCAxMzF9LAkvKiDJICovCi0JeydOJywgJ34nLCAxMzJ9LAkvKiDRICovCi0JeydPJywgJyInLCAxMzN9LAkvKiDWICovCi0JeydVJywgJyInLCAxMzR9LAkvKiDcICovCi0JeydhJywgJ1wnJywgMTM1fSwJLyogfkcgWFggKi8KLQl7J2EnLCAnYCcsIDEzNn0sCS8qIH5IIFhYICovCi0JeydhJywgJ14nLCAxMzd9LAkvKiDiICovCi0JeydhJywgJyInLCAxMzh9LAkvKiDkICovCi0JeydhJywgJ34nLCAxMzl9LAkvKiDjICovCi0JeydhJywgJ28nLCAxNDB9LAkvKiDlICovCi0JeydjJywgJywnLCAxNDF9LAkvKiDnICovCi0JeydlJywgJ1wnJywgMTQyfSwJLyog6SAqLwotCXsnZScsICdgJywgMTQzfSwJLyog6CAqLwotCXsnZScsICdeJywgMTQ0fSwJLyog6iAqLwotCXsnZScsICciJywgMTQ1fSwJLyog6yAqLwotCXsnaScsICdcJycsIDE0Nn0sCS8qIO0gKi8KLQl7J2knLCAnYCcsIDE0N30sCS8qIOwgKi8KLQl7J2knLCAnXicsIDE0OH0sCS8qIO4gKi8KLQl7J2knLCAnIicsIDE0OX0sCS8qIO8gKi8KLQl7J24nLCAnficsIDE1MH0sCS8qIPEgKi8KLQl7J28nLCAnXCcnLCAxNTF9LAkvKiDzICovCi0JeydvJywgJ2AnLCAxNTJ9LAkvKiDyICovCi0JeydvJywgJ14nLCAxNTN9LAkvKiD0ICovCi0JeydvJywgJyInLCAxNTR9LAkvKiD2ICovCi0JeydvJywgJ34nLCAxNTV9LAkvKiBvICovCi0Jeyd1JywgJ1wnJywgMTU2fSwJLyog+iAqLwotCXsndScsICdgJywgMTU3fSwJLyogfl0gWFggKi8KLQl7J3UnLCAnXicsIDE1OH0sCS8qIPsgKi8KLQl7J3UnLCAnIicsIDE1OX0sCS8qIPwgKi8KLQl7JysnLCAnXycsIDE2MH0sCS8qIN0gKi8KLQl7J34nLCAnbycsIDE2MX0sCS8qILAgKi8KLQl7J2MnLCAnfCcsIDE2Mn0sCS8qIKIgKi8KLQl7JyQnLCAnJCcsIDE2M30sCS8qIKMgKi8KLQl7J3AnLCAnYScsIDE2NH0sCS8qIKcgKi8KLQl7Jy4nLCAnLicsIDE2NX0sCS8qICogKi8KLQl7J1AnLCAnUCcsIDE2Nn0sCS8qILYgKi8KLQl7J3MnLCAncycsIDE2N30sCS8qIN8gKi8KLQl7J3InLCAnTycsIDE2OH0sCS8qIK4gKi8KLQl7J2MnLCAnTycsIDE2OX0sCS8qIKkgKi8KLQl7J1QnLCAnTScsIDE3MH0sCS8qIIEgKi8KLQl7Jz0nLCAnLycsIDE3M30sCS8qIIIgKi8KLQl7J0EnLCAnRScsIDE3NH0sCS8qIMYgKi8KLQl7J08nLCAnLycsIDE3NX0sCS8qINggKi8KLQl7JzAnLCAnMCcsIDE3Nn0sCS8qIIMgKi8KLQl7JysnLCAnLScsIDE3N30sCS8qILEgKi8KLQl7JzwnLCAnPScsIDE3OH0sCS8qIL4gKi8KLQl7Jz4nLCAnPScsIDE3OX0sCS8qIIQgKi8KLQl7J1knLCAnLScsIDE4MH0sCS8qIKUgKi8KLQl7J2onLCAndScsIDE4MX0sCS8qILUgKi8KLQl7J20nLCAndScsIDE4MX0sCS8qILUgKi8KLQl7J2QnLCAnZCcsIDE4Mn0sCS8qII8gKi8KLQl7J1MnLCAnUycsIDE4M30sCS8qIIUgKi8KLQl7J1MnLCAnSScsIDE4M30sCS8qIIUgKi8KLQl7J1AnLCAnSScsIDE4NH0sCS8qIL0gKi8KLQl7J3AnLCAnaScsIDE4NX0sCS8qILwgKi8KLQl7J0knLCAnSScsIDE4Nn0sCS8qIIYgKi8KLQl7J2EnLCAnLScsIDE4N30sCS8qILsgKi8KLQl7J28nLCAnLScsIDE4OH0sCS8qILogKi8KLQl7J08nLCAnTScsIDE4OX0sCS8qIL0gKi8KLQl7J2EnLCAnZScsIDE5MH0sCS8qIOYgKi8KLQl7J28nLCAnLycsIDE5MX0sCS8qIPggKi8KLQl7J34nLCAnPycsIDE5Mn0sCS8qIL8gKi8KLQl7J34nLCAnIScsIDE5M30sCS8qIKEgKi8KLQl7Jy0nLCAnLCcsIDE5NH0sCS8qIKwgKi8KLQl7J3YnLCAnLScsIDE5NX0sCS8qIH5IIFhYICovCi0JeydmJywgJy0nLCAxOTZ9LAkvKiCfICovCi0Jeyd+JywgJ34nLCAxOTd9LAkvKiCJICovCi0JeydEJywgJ0UnLCAxOTh9LAkvKiCQICovCi0Jeyc8JywgJzwnLCAxOTl9LAkvKiCrICovCi0Jeyc+JywgJz4nLCAyMDB9LAkvKiC7ICovCi0JeycuJywgJzonLCAyMDF9LAkvKiCKICovCi0JeydBJywgJ2AnLCAyMDN9LAkvKiDAICovCi0JeydBJywgJ34nLCAyMDR9LAkvKiDDICovCi0JeydPJywgJ34nLCAyMDV9LAkvKiDVICovCi0JeydPJywgJ0UnLCAyMDZ9LAkvKiCRICovCi0JeydvJywgJ2UnLCAyMDd9LAkvKiCmICovCi0JeyctJywgJy4nLCAyMDh9LAkvKiAtICovCi0JeyctJywgJy0nLCAyMDl9LAkvKiAtICovCi0JeydgJywgJ2AnLCAyMTB9LAkvKiAiICovCi0JeydcJycsICdcJycsIDIxMX0sCS8qICIgKi8KLQl7J2AnLCAnICcsIDIxMn0sCS8qICcgKi8KLQl7J1wnJywgJyAnLCAyMTN9LAkvKiAnICovCi0JeyctJywgJzonLCAyMTR9LAkvKiD3ICovCi0JeydEJywgJ0knLCAyMTV9LAkvKiDXICovCi0Jeyd5JywgJzonLCAyMTZ9LAkvKiD/ICovCi0JeydZJywgJzonLCAyMTd9LAkvKiCNICovCi0JeycvJywgJy8nLCAyMTh9LAkvKiCOICovCi0JeydFJywgJz0nLCAyMTl9LAkvKiCkIEV1cm8gU3lzdGVtID49OC41ICovCi0JeydvJywgJ3gnLCAyMTl9LAkvKiCkIEN1cnJlbmN5IFN5c3RlbSA8PTguMSovCi0Jeyc8JywgJyAnLCAyMjB9LAkvKiDQICovCi0Jeyc+JywgJyAnLCAyMjF9LAkvKiDwICovCi0JeydmJywgJ2knLCAyMjJ9LAkvKiDeICovCi0JeydmJywgJ2wnLCAyMjN9LAkvKiD+ICovCi0JeycrJywgJysnLCAyMjR9LAkvKiD9ICovCi0Jeyd+JywgJy4nLCAyMjV9LAkvKiC3ICovCi0JeycsJywgJyAnLCAyMjZ9LAkvKiCSICovCi0JeycsJywgJywnLCAyMjd9LAkvKiCTICovCi0JeyclJywgJy4nLCAyMjh9LAkvKiCUICovCi0JeyclJywgJzAnLCAyMjh9LAkvKiCUICovCi0JeydBJywgJ14nLCAyMjl9LAkvKiDCICovCi0JeydFJywgJ14nLCAyMzB9LAkvKiDKICovCi0JeydBJywgJ1wnJywgMjMxfSwJLyogwSAqLwotCXsnRScsICciJywgMjMyfSwJLyogyyAqLwotCXsnRScsICdgJywgMjMzfSwJLyogyCAqLwotCXsnSScsICdcJycsIDIzNH0sCS8qIM0gKi8KLQl7J0knLCAnXicsIDIzNX0sCS8qIM4gKi8KLQl7J0knLCAnIicsIDIzNn0sCS8qIM8gKi8KLQl7J0knLCAnYCcsIDIzN30sCS8qIMwgKi8KLQl7J08nLCAnXCcnLCAyMzh9LAkvKiDTICovCi0JeydPJywgJ14nLCAyMzl9LAkvKiDUICovCi0JeydBJywgJ1AnLCAyNDB9LAkvKiCVICovCi0JeydPJywgJ2AnLCAyNDF9LAkvKiDSICovCi0JeydVJywgJ1wnJywgMjQyfSwJLyog2iAqLwotCXsnVScsICdeJywgMjQzfSwJLyog2yAqLwotCXsnVScsICdgJywgMjQ0fSwJLyog2SAqLwotCXsnaScsICcuJywgMjQ1fSwJLyogniAqLwotCXtOVUwsIE5VTCwgTlVMfQotCX07Ci0KLSMgICBlbHNlCS8qICFNQUNPU19YICovCi0KLSMgICAgaWZkZWYgT0xEX0RJR1JBUEhTCisjICAgaWZkZWYgT0xEX0RJR1JBUEhTCiAKIAkvKgogCSAqIGRpZ3JhcGhzIGNvbXBhdGlibGUgd2l0aCBWaW0gNS54CkBAIC01NTcsNyArNDIzLDcgQEAKIAl7J3knLCAnIicsIDI1NX0sCS8qIHggWFggKi8KIAl7TlVMLCBOVUwsIE5VTH0KIAl9OwotIyAgICBlbHNlIC8qIE9MRF9ESUdSQVBIUyAqLworIyAgIGVsc2UgLyogT0xEX0RJR1JBUEhTICovCiAKIAkvKgogCSAqIGRpZ3JhcGhzIGZvciBVbmljb2RlIGZyb20gUkZDMTM0NQpAQCAtNzkyLDcgKzY1OCw2IEBACiAJeyd5JywgJzonLCAweGZmfSwKIAl7J3knLCAnIicsIDB4ZmZ9LAkvLyB4IFhYICBWaW0gNS54IGNvbXBhdGlibGUKIAotIyAgICAgIGlmZGVmIEZFQVRfTUJZVEUKICMJZGVmaW5lIFVTRV9VTklDT0RFX0RJR1JBUEhTCiAKIAl7J0EnLCAnLScsIDB4MDEwMH0sCkBAIC0xOTU3LDE0ICsxODIyLDExIEBACiAJeydmJywgJ2wnLCAweGZiMDJ9LAogCXsnZicsICd0JywgMHhmYjA1fSwKIAl7J3MnLCAndCcsIDB4ZmIwNn0sCi0jICAgICAgZW5kaWYgLyogRkVBVF9NQllURSAqLwogCiAJe05VTCwgTlVMLCBOVUx9CiAgICAgICAgfTsKIAotIyAgICBlbmRpZiAvKiBPTERfRElHUkFQSFMgKi8KLQotIyAgIGVuZGlmIC8qIE1hY2ludG9zaCAqLworIyAgIGVuZGlmIC8qIE9MRF9ESUdSQVBIUyAqLwogIyAgZW5kaWYgLyogRUJDRElDICovCiAjIGVuZGlmICAgIC8qICFIUFVYX0RJR1JBUEhTICovCiAjZW5kaWYJLyogIV9fTUlOVF9fICovCkBAIC0yMTQxLDggKzIwMDMsNyBAQAogCSAgICArK2RwOwogCX0KICAgICB9Ci0jaWZkZWYgRkVBVF9NQllURQotIyBpZmRlZiBVU0VfVU5JQ09ERV9ESUdSQVBIUworI2lmZGVmIFVTRV9VTklDT0RFX0RJR1JBUEhTCiAgICAgaWYgKHJldHZhbCAhPSAwICYmICFlbmNfdXRmOCkKICAgICB7CiAJY2hhcl91CSAgICBidWZbNl0sICp0bzsKQEAgLTIxNjYsMTIgKzIwMjcsMTEgQEAKIAkgICAgKHZvaWQpY29udmVydF9zZXR1cCgmdmMsIE5VTEwsIE5VTEwpOwogCX0KICAgICB9Ci0jIGVuZGlmCisjZW5kaWYKIAogICAgIC8qIElnbm9yZSBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgd2hlbiBub3QgaW4gbXVsdGktYnl0ZSBtb2RlLiAqLwogICAgIGlmICghaGFzX21ieXRlICYmIHJldHZhbCA+IDB4ZmYpCiAJcmV0dmFsID0gMDsKLSNlbmRpZgogCiAgICAgaWYgKHJldHZhbCA9PSAwKQkJLyogZGlncmFwaCBkZWxldGVkIG9yIG5vdCBmb3VuZCAqLwogICAgIHsKQEAgLTIyOTcsMTAgKzIxNTcsNyBAQAogI2Vsc2UKIAogCWlmIChnZXRleGFjdGRpZ3JhcGgoZHAtPmNoYXIxLCBkcC0+Y2hhcjIsIEZBTFNFKSA9PSBkcC0+cmVzdWx0Ci0jIGlmZGVmIEZFQVRfTUJZVEUKLQkJJiYgKGhhc19tYnl0ZSB8fCBkcC0+cmVzdWx0IDw9IDI1NSkKLSMgZW5kaWYKLQkJKQorCQkmJiAoaGFzX21ieXRlIHx8IGRwLT5yZXN1bHQgPD0gMjU1KSkKIAkgICAgcHJpbnRkaWdyYXBoKGRwLCB1c2VfaGVhZGVycyA/ICZwcmV2aW91cyA6IE5VTEwpOwogI2VuZGlmCiAJKytkcDsKQEAgLTIzNjQsMTEgKzIyMjEsNyBAQAogCiAgICAgaW50CQlsaXN0X3dpZHRoOwogCi0gICAgaWYgKChkeV9mbGFncyAmIERZX1VIRVgpCi0jaWZkZWYgRkVBVF9NQllURQotCSAgICB8fCBoYXNfbWJ5dGUKLSNlbmRpZgotCSAgICApCisgICAgaWYgKChkeV9mbGFncyAmIERZX1VIRVgpIHx8IGhhc19tYnl0ZSkKIAlsaXN0X3dpZHRoID0gMTM7CiAgICAgZWxzZQogCWxpc3Rfd2lkdGggPSAxMTsKQEAgLTI0MDQsNyArMjI1Nyw2IEBACiAJKnAgPSBOVUw7CiAJbXNnX291dHRyYW5zKGJ1Zik7CiAJcCA9IGJ1ZjsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKIAl7CiAJICAgIC8qIGFkZCBhIHNwYWNlIHRvIGRyYXcgYSBjb21wb3NpbmcgY2hhciBvbiAqLwpAQCAtMjQxMyw3ICsyMjY1LDYgQEAKIAkgICAgcCArPSAoKm1iX2NoYXIyYnl0ZXMpKGRwLT5yZXN1bHQsIHApOwogCX0KIAllbHNlCi0jZW5kaWYKIAkgICAgKnArKyA9IChjaGFyX3UpZHAtPnJlc3VsdDsKIAkqcCA9IE5VTDsKIAltc2dfb3V0dHJhbnNfYXR0cihidWYsIEhMX0FUVFIoSExGXzgpKTsKQEAgLTI0NjUsMjEgKzIzMTYsMTUgQEAKIAogCS8qIFNvdXJjZSB0aGUga2V5bWFwIGZpbGUuICBJdCB3aWxsIGNvbnRhaW4gYSAiOmxvYWRrZXltYXAiIGNvbW1hbmQKIAkgKiB3aGljaCB3aWxsIGNhbGwgZXhfbG9hZGtleW1hcCgpIGJlbG93LiAqLwotCWJ1ZmxlbiA9IFNUUkxFTihjdXJidWYtPmJfcF9rZXltYXApCi0jIGlmZGVmIEZFQVRfTUJZVEUKLQkJCQkJICAgKyBTVFJMRU4ocF9lbmMpCi0jIGVuZGlmCi0JCQkJCQkgICAgICAgKyAxNDsKKwlidWZsZW4gPSBTVFJMRU4oY3VyYnVmLT5iX3Bfa2V5bWFwKSArIFNUUkxFTihwX2VuYykgKyAxNDsKIAlidWYgPSBhbGxvYygodW5zaWduZWQpYnVmbGVuKTsKIAlpZiAoYnVmID09IE5VTEwpCiAJICAgIHJldHVybiBlX291dG9mbWVtOwogCi0jIGlmZGVmIEZFQVRfTUJZVEUKIAkvKiB0cnkgZmluZGluZyAia2V5bWFwLydrZXltYXAnXydlbmNvZGluZycudmltIiAgaW4gJ3J1bnRpbWVwYXRoJyAqLwogCXZpbV9zbnByaW50ZigoY2hhciAqKWJ1ZiwgYnVmbGVuLCAia2V5bWFwLyVzXyVzLnZpbSIsCiAJCQkJCQkgICBjdXJidWYtPmJfcF9rZXltYXAsIHBfZW5jKTsKIAlpZiAoc291cmNlX3J1bnRpbWUoYnVmLCAwKSA9PSBGQUlMKQotIyBlbmRpZgogCXsKIAkgICAgLyogdHJ5IGZpbmRpbmcgImtleW1hcC8na2V5bWFwJy52aW0iIGluICdydW50aW1lcGF0aCcgICovCiAJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKWJ1ZiwgYnVmbGVuLCAia2V5bWFwLyVzLnZpbSIsCmRpZmYgLS1naXQgYS9zcmMvZWRpdC5jIGIvc3JjL2VkaXQuYwppbmRleCA4NTIwNjBiLi45MmRiZjRjIDEwMDY0NAotLS0gYS9zcmMvZWRpdC5jCisrKyBiL3NyYy9lZGl0LmMKQEAgLTIxMiw5ICsyMTIsNyBAQAogc3RhdGljIHZvaWQgc3RvcF9pbnNlcnQocG9zX1QgKmVuZF9pbnNlcnRfcG9zLCBpbnQgZXNjLCBpbnQgbm9tb3ZlKTsKIHN0YXRpYyBpbnQgIGVjaGVja19hYmJyKGludCk7CiBzdGF0aWMgdm9pZCByZXBsYWNlX2pvaW4oaW50IG9mZik7Ci0jaWZkZWYgRkVBVF9NQllURQogc3RhdGljIHZvaWQgbWJfcmVwbGFjZV9wb3BfaW5zKGludCBjYyk7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIHJlcGxhY2VfZmx1c2godm9pZCk7CiBzdGF0aWMgdm9pZCByZXBsYWNlX2RvX2JzKGludCBsaW1pdF9jb2wpOwogc3RhdGljIGludCBkZWxfY2hhcl9hZnRlcl9jb2woaW50IGxpbWl0X2NvbCk7CkBAIC01NjcsMTQgKzU2NSwxMiBAQAogCXsKIAkgICAgaWYgKHB0clsxXSA9PSBOVUwpCiAJCSsrY3Vyd2luLT53X2N1cnNvci5jb2w7Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBlbHNlIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJaSA9ICgqbWJfcHRyMmxlbikocHRyKTsKIAkJaWYgKHB0cltpXSA9PSBOVUwpCiAJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCArPSBpOwogCSAgICB9Ci0jZW5kaWYKIAl9CiAJaW5zX2F0X2VvbCA9IEZBTFNFOwogICAgIH0KQEAgLTE1ODAsMTIgKzE1NzYsMTAgQEAKIAkgICAgICogc3BlY2lhbCBjaGFyYWN0ZXIuICBMZXQgQ1RSTC1dIGV4cGFuZCBhYmJyZXZpYXRpb25zIHdpdGhvdXQKIAkgICAgICogaW5zZXJ0aW5nIGl0LiAqLwogCSAgICBpZiAodmltX2lzd29yZGMoYykgfHwgKCFlY2hlY2tfYWJicigKLSNpZmRlZiBGRUFUX01CWVRFCi0JCQkvKiBBZGQgQUJCUl9PRkYgZm9yIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAsIHRoaXMgaXMKLQkJCSAqIHdoYXQgY2hlY2tfYWJicigpIGV4cGVjdHMuICovCi0JCQkoaGFzX21ieXRlICYmIGMgPj0gMHgxMDApID8gKGMgKyBBQkJSX09GRikgOgotI2VuZGlmCi0JCSAgICAgICBjKSAmJiBjICE9IEN0cmxfUlNCKSkKKwkJCS8vIEFkZCBBQkJSX09GRiBmb3IgY2hhcmFjdGVycyBhYm92ZSAweDEwMCwgdGhpcyBpcworCQkJLy8gd2hhdCBjaGVja19hYmJyKCkgZXhwZWN0cy4KKwkJCQkoaGFzX21ieXRlICYmIGMgPj0gMHgxMDApID8gKGMgKyBBQkJSX09GRikgOiBjKQorCQkJJiYgYyAhPSBDdHJsX1JTQikpCiAJICAgIHsKIAkJaW5zZXJ0X3NwZWNpYWwoYywgRkFMU0UsIEZBTFNFKTsKICNpZmRlZiBGRUFUX1JJR0hUTEVGVApAQCAtMTgzNSwxNCArMTgyOSwxMSBAQAogCSAgICBhdHRyID0gMDsKIAlwY19yb3cgPSBXX1dJTlJPVyhjdXJ3aW4pICsgY3Vyd2luLT53X3dyb3c7CiAJcGNfY29sID0gY3Vyd2luLT53X3dpbmNvbDsKLSNpZiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpCiAJcGNfc3RhdHVzID0gUENfU1RBVFVTX1VOU0VUOwotI2VuZGlmCiAjaWZkZWYgRkVBVF9SSUdIVExFRlQKIAlpZiAoY3Vyd2luLT53X3BfcmwpCiAJewogCSAgICBwY19jb2wgKz0gY3Vyd2luLT53X3dpZHRoIC0gMSAtIGN1cndpbi0+d193Y29sOwotIyBpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJaW50IGZpeF9jb2wgPSBtYl9maXhfY29sKHBjX2NvbCwgcGNfcm93KTsKQEAgLTE4NTQsMjIgKzE4NDUsMTcgQEAKIAkJICAgIHBjX3N0YXR1cyA9IFBDX1NUQVRVU19SSUdIVDsKIAkJfQogCSAgICB9Ci0jIGVuZGlmCiAJfQogCWVsc2UKICNlbmRpZgogCXsKIAkgICAgcGNfY29sICs9IGN1cndpbi0+d193Y29sOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKG1iX2xlZnRoYWx2ZShwY19yb3csIHBjX2NvbCkpCiAJCXBjX3N0YXR1cyA9IFBDX1NUQVRVU19MRUZUOwotI2VuZGlmCiAJfQogCiAJLyogc2F2ZSB0aGUgY2hhcmFjdGVyIHRvIGJlIGFibGUgdG8gcHV0IGl0IGJhY2sgKi8KLSNpZiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpCiAJaWYgKHBjX3N0YXR1cyA9PSBQQ19TVEFUVVNfVU5TRVQpCi0jZW5kaWYKIAl7CiAJICAgIHNjcmVlbl9nZXRieXRlcyhwY19yb3csIHBjX2NvbCwgcGNfYnl0ZXMsICZwY19hdHRyKTsKIAkgICAgcGNfc3RhdHVzID0gUENfU1RBVFVTX1NFVDsKQEAgLTE5NTMsMTMgKzE5MzksMTEgQEAKIHsKICAgICBpZiAocGNfc3RhdHVzICE9IFBDX1NUQVRVU19VTlNFVCAmJiBwY19yb3cgPj0gbXNnX3Njcm9sbGVkKQogICAgIHsKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAJaWYgKHBjX3N0YXR1cyA9PSBQQ19TVEFUVVNfUklHSFQpCiAJICAgICsrY3Vyd2luLT53X3djb2w7CiAJaWYgKHBjX3N0YXR1cyA9PSBQQ19TVEFUVVNfUklHSFQgfHwgcGNfc3RhdHVzID09IFBDX1NUQVRVU19MRUZUKQogCSAgICByZWRyYXdXaW5saW5lKGN1cndpbiwgY3Vyd2luLT53X2N1cnNvci5sbnVtKTsKIAllbHNlCi0jZW5kaWYKIAkgICAgc2NyZWVuX3B1dHMocGNfYnl0ZXMsIHBjX3JvdyAtIG1zZ19zY3JvbGxlZCwgcGNfY29sLCBwY19hdHRyKTsKICAgICB9CiB9CkBAIC0xOTc5LDcgKzE5NjMsNiBAQAogICAgIGN1cnNvcl9vZmYoKTsKICAgICBzYXZlX2NvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOwogICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gY29sOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoaGFzX21ieXRlKQogICAgIHsKIAljaGFyX3UgKnA7CkBAIC0xOTg4LDcgKzE5NzEsNiBAQAogCXAgPSBtbF9nZXRfY3VybGluZSgpOwogCWN1cndpbi0+d19jdXJzb3IuY29sIC09ICgqbWJfaGVhZF9vZmYpKHAsIHAgKyBjb2wpOwogICAgIH0KLSNlbmRpZgogICAgIGN1cnNfY29sdW1ucyhGQUxTRSk7CSAgICAvKiByZWNvbXB1dGUgd193cm93IGFuZCB3X3djb2wgKi8KICAgICBpZiAoY3Vyd2luLT53X3djb2wgPCBjdXJ3aW4tPndfd2lkdGgpCiAgICAgewpAQCAtMjEzMiwxMSArMjExNCw5IEBACiAJd2hpbGUgKHZjb2wgPD0gKGludCljdXJ3aW4tPndfdmlydGNvbCkKIAl7CiAJICAgIGxhc3RfdmNvbCA9IHZjb2w7Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBpZiAoaGFzX21ieXRlICYmIG5ld19jdXJzb3JfY29sID49IDApCiAJCW5ld19jdXJzb3JfY29sICs9ICgqbWJfcHRyMmxlbikocHRyICsgbmV3X2N1cnNvcl9jb2wpOwogCSAgICBlbHNlCi0jZW5kaWYKIAkJKytuZXdfY3Vyc29yX2NvbDsKIAkgICAgdmNvbCArPSBsYnJfY2hhcnRhYnNpemUocHRyLCBwdHIgKyBuZXdfY3Vyc29yX2NvbCwgKGNvbG5yX1QpdmNvbCk7CiAJfQpAQCAtMjMwMiw3ICsyMjgyLDYgQEAKICAgIHN0YXRpYyBpbnQKIGRlbF9jaGFyX2FmdGVyX2NvbChpbnQgbGltaXRfY29sIFVOVVNFRCkKIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGVuY191dGY4ICYmIGxpbWl0X2NvbCA+PSAwKQogICAgIHsKIAljb2xucl9UIGVjb2wgPSBjdXJ3aW4tPndfY3Vyc29yLmNvbCArIDE7CkBAIC0yMzI0LDcgKzIzMDMsNiBAQAogCWRlbF9ieXRlcygobG9uZykoKGludCllY29sIC0gY3Vyd2luLT53X2N1cnNvci5jb2wpLCBGQUxTRSwgVFJVRSk7CiAgICAgfQogICAgIGVsc2UKLSNlbmRpZgogCSh2b2lkKWRlbF9jaGFyKEZBTFNFKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTI1MjksNyArMjUwNyw2IEBACiAJLyogSW5mZXIgY2FzZSBvZiBjb21wbGV0ZWQgcGFydC4gKi8KIAogCS8qIEZpbmQgYWN0dWFsIGxlbmd0aCBvZiBjb21wbGV0aW9uLiAqLwotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoaGFzX21ieXRlKQogCXsKIAkgICAgcCA9IHN0cjsKQEAgLTI1NDEsMTEgKzI1MTgsOSBAQAogCSAgICB9CiAJfQogCWVsc2UKLSNlbmRpZgogCSAgICBhY3R1YWxfbGVuID0gbGVuOwogCiAJLyogRmluZCBhY3R1YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIHRleHQuICovCi0jaWZkZWYgRkVBVF9NQllURQogCWlmIChoYXNfbWJ5dGUpCiAJewogCSAgICBwID0gY29tcGxfb3JpZ190ZXh0OwpAQCAtMjU1Nyw3ICsyNTMyLDYgQEAKIAkgICAgfQogCX0KIAllbHNlCi0jZW5kaWYKIAkgICAgYWN0dWFsX2NvbXBsX2xlbmd0aCA9IGNvbXBsX2xlbmd0aDsKIAogCS8qICJhY3R1YWxfbGVuIiBtYXkgYmUgc21hbGxlciB0aGFuICJhY3R1YWxfY29tcGxfbGVuZ3RoIiB3aGVuIHVzaW5nCkBAIC0yNTcxLDIyICsyNTQ1LDE4IEBACiAJewogCSAgICBwID0gc3RyOwogCSAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX2xlbjsgKytpKQotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaWYgKGhhc19tYnl0ZSkKIAkJICAgIHdjYVtpXSA9IG1iX3B0cjJjaGFyX2FkdigmcCk7CiAJCWVsc2UKLSNlbmRpZgogCQkgICAgd2NhW2ldID0gKihwKyspOwogCiAJICAgIC8qIFJ1bGUgMTogV2VyZSBhbnkgY2hhcnMgY29udmVydGVkIHRvIGxvd2VyPyAqLwogCSAgICBwID0gY29tcGxfb3JpZ190ZXh0OwogCSAgICBmb3IgKGkgPSAwOyBpIDwgbWluX2xlbjsgKytpKQogCSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQkgICAgYyA9IG1iX3B0cjJjaGFyX2FkdigmcCk7CiAJCWVsc2UKLSNlbmRpZgogCQkgICAgYyA9ICoocCsrKTsKIAkJaWYgKE1CX0lTTE9XRVIoYykpCiAJCXsKQEAgLTI2MTAsMTEgKzI1ODAsOSBAQAogCQlwID0gY29tcGxfb3JpZ190ZXh0OwogCQlmb3IgKGkgPSAwOyBpIDwgbWluX2xlbjsgKytpKQogCQl7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJCWMgPSBtYl9wdHIyY2hhcl9hZHYoJnApOwogCQkgICAgZWxzZQotI2VuZGlmCiAJCQljID0gKihwKyspOwogCQkgICAgaWYgKHdhc19sZXR0ZXIgJiYgTUJfSVNVUFBFUihjKSAmJiBNQl9JU0xPV0VSKHdjYVtpXSkpCiAJCSAgICB7CkBAIC0yNjMxLDExICsyNTk5LDkgQEAKIAkgICAgcCA9IGNvbXBsX29yaWdfdGV4dDsKIAkgICAgZm9yIChpID0gMDsgaSA8IG1pbl9sZW47ICsraSkKIAkgICAgewotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaWYgKGhhc19tYnl0ZSkKIAkJICAgIGMgPSBtYl9wdHIyY2hhcl9hZHYoJnApOwogCQllbHNlCi0jZW5kaWYKIAkJICAgIGMgPSAqKHArKyk7CiAJCWlmIChNQl9JU0xPV0VSKGMpKQogCQkgICAgd2NhW2ldID0gTUJfVE9MT1dFUih3Y2FbaV0pOwpAQCAtMjY1MiwxMSArMjYxOCw5IEBACiAJICAgIHAgPSBJT2J1ZmY7CiAJICAgIGkgPSAwOwogCSAgICB3aGlsZSAoaSA8IGFjdHVhbF9sZW4gJiYgKHAgLSBJT2J1ZmYgKyA2KSA8IElPU0laRSkKLSNpZmRlZiBGRUFUX01CWVRFCiAJCWlmIChoYXNfbWJ5dGUpCiAJCSAgICBwICs9ICgqbWJfY2hhcjJieXRlcykod2NhW2krK10sIHApOwogCQllbHNlCi0jZW5kaWYKIAkJICAgICoocCsrKSA9IHdjYVtpKytdOwogCSAgICAqcCA9IE5VTDsKIApAQCAtMjgzNywxNCArMjgwMSwxMiBAQAogCXMgPSBtYXRjaC0+Y3Bfc3RyOwogCXdoaWxlICgqcCAhPSBOVUwpCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkgICAgewogCQljMSA9IG1iX3B0cjJjaGFyKHApOwogCQljMiA9IG1iX3B0cjJjaGFyKHMpOwogCSAgICB9CiAJICAgIGVsc2UKLSNlbmRpZgogCSAgICB7CiAJCWMxID0gKnA7CiAJCWMyID0gKnM7CkBAIC0yODUyLDE0ICsyODE0LDEyIEBACiAJICAgIGlmIChtYXRjaC0+Y3BfaWNhc2UgPyAoTUJfVE9MT1dFUihjMSkgIT0gTUJfVE9MT1dFUihjMikpCiAJCQkJCQkJCSA6IChjMSAhPSBjMikpCiAJCWJyZWFrOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkgICAgewogCQlNQl9QVFJfQURWKHApOwogCQlNQl9QVFJfQURWKHMpOwogCSAgICB9CiAJICAgIGVsc2UKLSNlbmRpZgogCSAgICB7CiAJCSsrcDsKIAkJKytzOwpAQCAtMzQyNiw3ICszMzg2LDYgQEAKIAkJCSAgICB3c3RhcnQgPSBwdHI7CiAKIAkJCSAgICAvKiBGaW5kIGVuZCBvZiB0aGUgd29yZC4gKi8KLSNpZmRlZiBGRUFUX01CWVRFCiAJCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJCQkvKiBKYXBhbmVzZSB3b3JkcyBtYXkgaGF2ZSBjaGFyYWN0ZXJzIGluCiAJCQkJICogZGlmZmVyZW50IGNsYXNzZXMsIG9ubHkgc2VwYXJhdGUgd29yZHMKQEAgLTM0NDAsNyArMzM5OSw2IEBACiAJCQkJICAgIHB0ciArPSBsOwogCQkJCX0KIAkJCSAgICBlbHNlCi0jZW5kaWYKIAkJCQlwdHIgPSBmaW5kX3dvcmRfZW5kKHB0cik7CiAKIAkJCSAgICAvKiBBZGQgdGhlIHdvcmQuIFNraXAgdGhlIHJlZ2V4cCBtYXRjaC4gKi8KQEAgLTM0NzUsMTIgKzM0MzMsMTAgQEAKICAgICBjaGFyX3UgKgogZmluZF93b3JkX3N0YXJ0KGNoYXJfdSAqcHRyKQogewotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoaGFzX21ieXRlKQogCXdoaWxlICgqcHRyICE9IE5VTCAmJiAqcHRyICE9ICdcbicgJiYgbWJfZ2V0X2NsYXNzKHB0cikgPD0gMSkKIAkgICAgcHRyICs9ICgqbWJfcHRyMmxlbikocHRyKTsKICAgICBlbHNlCi0jZW5kaWYKIAl3aGlsZSAoKnB0ciAhPSBOVUwgJiYgKnB0ciAhPSAnXG4nICYmICF2aW1faXN3b3JkYygqcHRyKSkKIAkgICAgKytwdHI7CiAgICAgcmV0dXJuIHB0cjsKQEAgLTM0OTMsNyArMzQ0OSw2IEBACiAgICAgY2hhcl91ICoKIGZpbmRfd29yZF9lbmQoY2hhcl91ICpwdHIpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJc3RhcnRfY2xhc3M7CiAKICAgICBpZiAoaGFzX21ieXRlKQpAQCAtMzUwOCw3ICszNDYzLDYgQEAKIAkgICAgfQogICAgIH0KICAgICBlbHNlCi0jZW5kaWYKIAl3aGlsZSAodmltX2lzd29yZGMoKnB0cikpCiAJICAgICsrcHRyOwogICAgIHJldHVybiBwdHI7CkBAIC0zNzE5LDEzICszNjczLDEwIEBACiAgICAgc3RhdGljIHZvaWQKIGluc19jb21wbF9hZGRsZWFkZXIoaW50IGMpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJY2M7Ci0jZW5kaWYKIAogICAgIGlmIChzdG9wX2Fycm93KCkgPT0gRkFJTCkKIAlyZXR1cm47Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChoYXNfbWJ5dGUgJiYgKGNjID0gKCptYl9jaGFyMmxlbikoYykpID4gMSkKICAgICB7CiAJY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOwpAQCAtMzczNyw3ICszNjg4LDYgQEAKIAkgICAgQXBwZW5kVG9SZWRvYnVmZihidWYpOwogICAgIH0KICAgICBlbHNlCi0jZW5kaWYKICAgICB7CiAJaW5zX2NoYXIoYyk7CiAJaWYgKGNvbXBsX29wdF9yZWZyZXNoX2Fsd2F5cykKQEAgLTQxNTUsMTAgKzQxMDUsOCBAQAogCXAgPSBjb21wbF9vcmlnX3RleHQ7CiAJZm9yIChsZW4gPSAwOyBwW2xlbl0gIT0gTlVMICYmIHBbbGVuXSA9PSBwdHJbbGVuXTsgKytsZW4pCiAJICAgIDsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGxlbiA+IDApCiAJICAgIGxlbiAtPSAoKm1iX2hlYWRfb2ZmKShwLCBwICsgbGVuKTsKLSNlbmRpZgogCWZvciAocCArPSBsZW47ICpwICE9IE5VTDsgTUJfUFRSX0FEVihwKSkKIAkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoS19CUyk7CiAgICAgfQpAQCAtNTQxNiwyNSArNTM2NCwxNCBAQAogCQkgICAgcmV0dXJuIEZBSUw7CiAJCWlmICghdmltX2lzd29yZHAobGluZSArIGNvbXBsX2NvbCkKIAkJCXx8IChjb21wbF9jb2wgPiAwCi0JCQkgICAgJiYgKAotI2lmZGVmIEZFQVRfTUJZVEUKLQkJCQl2aW1faXN3b3JkcChtYl9wcmV2cHRyKGxpbmUsIGxpbmUgKyBjb21wbF9jb2wpKQotI2Vsc2UKLQkJCQl2aW1faXN3b3JkYyhsaW5lW2NvbXBsX2NvbCAtIDFdKQotI2VuZGlmCi0JCQkJKSkpCisJCQkgJiYgKHZpbV9pc3dvcmRwKG1iX3ByZXZwdHIobGluZSwgbGluZSArIGNvbXBsX2NvbCkpKSkpCiAJCSAgICBwcmVmaXggPSAoY2hhcl91ICopIiI7CiAJCVNUUkNQWSgoY2hhciAqKWNvbXBsX3BhdHRlcm4sIHByZWZpeCk7CiAJCSh2b2lkKXF1b3RlX21ldGEoY29tcGxfcGF0dGVybiArIFNUUkxFTihwcmVmaXgpLAogCQkJCQkgICAgICBsaW5lICsgY29tcGxfY29sLCBjb21wbF9sZW5ndGgpOwogCSAgICB9Ci0JICAgIGVsc2UgaWYgKC0tc3RhcnRjb2wgPCAwIHx8Ci0jaWZkZWYgRkVBVF9NQllURQotCQkJICAgIXZpbV9pc3dvcmRwKG1iX3ByZXZwdHIobGluZSwgbGluZSArIHN0YXJ0Y29sICsgMSkpCi0jZWxzZQotCQkJICAgIXZpbV9pc3dvcmRjKGxpbmVbc3RhcnRjb2xdKQotI2VuZGlmCi0JCSAgICApCisJICAgIGVsc2UgaWYgKC0tc3RhcnRjb2wgPCAwCisJCSAgICB8fCAhdmltX2lzd29yZHAobWJfcHJldnB0cihsaW5lLCBsaW5lICsgc3RhcnRjb2wgKyAxKSkpCiAJICAgIHsKIAkJLyogTWF0Y2ggYW55IHdvcmQgb2YgYXQgbGVhc3QgdHdvIGNoYXJzICovCiAJCWNvbXBsX3BhdHRlcm4gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopIlxcPFxca1xcayIpOwpAQCAtNTQ0NSw3ICs1MzgyLDYgQEAKIAkgICAgfQogCSAgICBlbHNlCiAJICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8qIFNlYXJjaCB0aGUgcG9pbnQgb2YgY2hhbmdlIGNsYXNzIG9mIG11bHRpYnl0ZSBjaGFyYWN0ZXIKIAkJICogb3Igbm90IGEgd29yZCBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgYmFja3dhcmQuICAqLwogCQlpZiAoaGFzX21ieXRlKQpAQCAtNTQ2NSw3ICs1NDAxLDYgQEAKIAkJICAgIH0KIAkJfQogCQllbHNlCi0jZW5kaWYKIAkJICAgIHdoaWxlICgtLXN0YXJ0Y29sID49IDAgJiYgdmltX2lzd29yZGMobGluZVtzdGFydGNvbF0pKQogCQkJOwogCQljb21wbF9jb2wgKz0gKytzdGFydGNvbDsKQEAgLTU5NTYsNyArNTg5MSw2IEBACiAJfQogCWlmIChkZXN0ICE9IE5VTEwpCiAJICAgICpkZXN0KysgPSAqc3JjOwotIyBpZmRlZiBGRUFUX01CWVRFCiAJLyogQ29weSByZW1haW5pbmcgYnl0ZXMgb2YgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAqLwogCWlmIChoYXNfbWJ5dGUpCiAJewpAQCAtNTk3Miw3ICs1OTA2LDYgQEAKIAkJCSpkZXN0KysgPSAqc3JjOwogCQl9CiAJfQotIyBlbmRpZgogICAgIH0KICAgICBpZiAoZGVzdCAhPSBOVUxMKQogCSpkZXN0ID0gTlVMOwpAQCAtNTk5NSw5ICs1OTI4LDcgQEAKICAgICBpbnQJCWk7CiAgICAgaW50CQloZXggPSBGQUxTRTsKICAgICBpbnQJCW9jdGFsID0gRkFMU0U7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJdW5pY29kZSA9IDA7Ci0jZW5kaWYKIAogICAgIGlmIChnb3RfaW50KQogCXJldHVybiBDdHJsX0M7CkBAIC02MDIyLDI4ICs1OTUzLDE4IEBACiAgICAgewogCW5jID0gcGxhaW5fdmdldGMoKTsKICNpZmRlZiBGRUFUX0NNRExfSU5GTwotCWlmICghKFN0YXRlICYgQ01ETElORSkKLSMgaWZkZWYgRkVBVF9NQllURQotCQkmJiBNQl9CWVRFMkxFTl9DSEVDSyhuYykgPT0gMQotIyBlbmRpZgotCSAgICkKKwlpZiAoIShTdGF0ZSAmIENNRExJTkUpICYmIE1CX0JZVEUyTEVOX0NIRUNLKG5jKSA9PSAxKQogCSAgICBhZGRfdG9fc2hvd2NtZChuYyk7CiAjZW5kaWYKIAlpZiAobmMgPT0gJ3gnIHx8IG5jID09ICdYJykKIAkgICAgaGV4ID0gVFJVRTsKIAllbHNlIGlmIChuYyA9PSAnbycgfHwgbmMgPT0gJ08nKQogCSAgICBvY3RhbCA9IFRSVUU7Ci0jaWZkZWYgRkVBVF9NQllURQogCWVsc2UgaWYgKG5jID09ICd1JyB8fCBuYyA9PSAnVScpCiAJICAgIHVuaWNvZGUgPSBuYzsKLSNlbmRpZgogCWVsc2UKIAl7Ci0JICAgIGlmIChoZXgKLSNpZmRlZiBGRUFUX01CWVRFCi0JCSAgICB8fCB1bmljb2RlICE9IDAKLSNlbmRpZgotCQkgICAgKQorCSAgICBpZiAoaGV4IHx8IHVuaWNvZGUgIT0gMCkKIAkgICAgewogCQlpZiAoIXZpbV9pc3hkaWdpdChuYykpCiAJCSAgICBicmVhazsKQEAgLTYwNjUsMTEgKzU5ODYsNyBAQAogCSAgICArK2k7CiAJfQogCi0JaWYgKGNjID4gMjU1Ci0jaWZkZWYgRkVBVF9NQllURQotCQkmJiB1bmljb2RlID09IDAKLSNlbmRpZgotCQkpCisJaWYgKGNjID4gMjU1ICYmIHVuaWNvZGUgPT0gMCkKIAkgICAgY2MgPSAyNTU7CQkvKiBsaW1pdCByYW5nZSB0byAwLTI1NSAqLwogCW5jID0gMDsKIApAQCAtNjA3OCwxMyArNTk5NSwxMSBAQAogCSAgICBpZiAoaSA+PSAyKQogCQlicmVhazsKIAl9Ci0jaWZkZWYgRkVBVF9NQllURQogCWVsc2UgaWYgKHVuaWNvZGUpCS8qIFVuaWNvZGU6IHVwIHRvIGZvdXIgb3IgZWlnaHQgY2hhcnMgKi8KIAl7CiAJICAgIGlmICgodW5pY29kZSA9PSAndScgJiYgaSA+PSA0KSB8fCAodW5pY29kZSA9PSAnVScgJiYgaSA+PSA4KSkKIAkJYnJlYWs7CiAJfQotI2VuZGlmCiAJZWxzZSBpZiAoaSA+PSAzKQkvKiBkZWNpbWFsIG9yIG9jdGFsOiB1cCB0byB0aHJlZSBjaGFycyAqLwogCSAgICBicmVhazsKICAgICB9CkBAIC02MTA0LDExICs2MDE5LDkgQEAKIAogICAgIGlmIChjYyA9PSAwKQkvKiBOVUwgaXMgc3RvcmVkIGFzIE5MICovCiAJY2MgPSAnXG4nOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoZW5jX2RiY3MgJiYgKGNjICYgMHhmZikgPT0gMCkKIAljYyA9ICc/JzsJLyogZG9uJ3QgYWNjZXB0IGFuIGlsbGVnYWwgREJDUyBjaGFyLCB0aGUgTlVMIGluIHRoZQogCQkJICAgc2Vjb25kIGJ5dGUgd2lsbCBjYXVzZSB0cm91YmxlISAqLwotI2VuZGlmCiAKICAgICAtLW5vX21hcHBpbmc7CiAjaWZkZWYgRkVBVF9HVUkKQEAgLTYxNzksMTEgKzYwOTIsNyBAQAogIyBkZWZpbmUgSVNTUEVDSUFMKGMpCSgoYykgPCAnICcgfHwgKGMpID49IERFTCB8fCAoYykgPT0gJzAnIHx8IChjKSA9PSAnXicpCiAjZW5kaWYKIAotI2lmZGVmIEZFQVRfTUJZVEUKLSMgZGVmaW5lIFdISVRFQ0hBUihjYykgKFZJTV9JU1dISVRFKGNjKSAmJiAoIWVuY191dGY4IHx8ICF1dGZfaXNjb21wb3NpbmcodXRmX3B0cjJjaGFyKG1sX2dldF9jdXJzb3IoKSArIDEpKSkpCi0jZWxzZQotIyBkZWZpbmUgV0hJVEVDSEFSKGNjKSBWSU1fSVNXSElURShjYykKLSNlbmRpZgorI2RlZmluZSBXSElURUNIQVIoY2MpIChWSU1fSVNXSElURShjYykgJiYgKCFlbmNfdXRmOCB8fCAhdXRmX2lzY29tcG9zaW5nKHV0Zl9wdHIyY2hhcihtbF9nZXRfY3Vyc29yKCkgKyAxKSkpKQogCiAvKgogICogImZsYWdzIjogSU5TQ0hBUl9GT1JNQVQgLSBmb3JjZSBmb3JtYXR0aW5nCkBAIC02MzQwLDkgKzYyNDksNyBAQAogI2VuZGlmCiAKICAgICBpZiAoICAgICAgICFJU1NQRUNJQUwoYykKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgICYmICghaGFzX21ieXRlIHx8ICgqbWJfY2hhcjJsZW4pKGMpID09IDEpCi0jZW5kaWYKIAkgICAgJiYgIWhhc19pbnNlcnRjaGFycHJlKCkKIAkgICAgJiYgdnBlZWtjKCkgIT0gTlVMCiAJICAgICYmICEoU3RhdGUgJiBSRVBMQUNFX0ZMQUcpCkBAIC02MzczLDkgKzYyODAsNyBAQAogCSAqLwogCXdoaWxlICgJICAgKGMgPSB2cGVla2MoKSkgIT0gTlVMCiAJCSYmICFJU1NQRUNJQUwoYykKLSNpZmRlZiBGRUFUX01CWVRFCiAJCSYmICghaGFzX21ieXRlIHx8IE1CX0JZVEUyTEVOX0NIRUNLKGMpID09IDEpCi0jZW5kaWYKIAkJJiYgaSA8IElOUFVUX0JVRkxFTgogIyBpZmRlZiBGRUFUX0ZLTUFQCiAJCSYmICEocF9ma21hcCAmJiBLZXlUeXBlZCkgLyogRmFyc2kgbW9kZSBtYXBwaW5nIG1vdmVzIGN1cnNvciAqLwpAQCAtNjQxMiw3ICs2MzE3LDYgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaW50CQljYzsKIAogCWlmIChoYXNfbWJ5dGUgJiYgKGNjID0gKCptYl9jaGFyMmxlbikoYykpID4gMSkKQEAgLTY0MjUsNyArNjMyOSw2IEBACiAJICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKGMpOwogCX0KIAllbHNlCi0jZW5kaWYKIAl7CiAJICAgIGluc19jaGFyKGMpOwogCSAgICBpZiAoZmxhZ3MgJiBJTlNDSEFSX0NUUkxWKQpAQCAtNjQ1NCw5ICs2MzU3LDcgQEAKICAgICBpbnQJCXNhdmVfY2hhciA9IE5VTDsKICAgICBpbnQJCWhhdmV0b19yZWRyYXcgPSBGQUxTRTsKICAgICBpbnQJCWZvX2luc19ibGFuayA9IGhhc19mb3JtYXRfb3B0aW9uKEZPX0lOU19CTEFOSyk7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJZm9fbXVsdGlieXRlID0gaGFzX2Zvcm1hdF9vcHRpb24oRk9fTUJZVEVfQlJFQUspOwotI2VuZGlmCiAgICAgaW50CQlmb193aGl0ZV9wYXIgPSBoYXNfZm9ybWF0X29wdGlvbihGT19XSElURV9QQVIpOwogICAgIGludAkJZmlyc3RfbGluZSA9IFRSVUU7CiAjaWZkZWYgRkVBVF9DT01NRU5UUwpAQCAtNjYxMyw3ICs2NTE0LDYgQEAKIAkJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sIDw9IChjb2xucl9UKXdhbnRjb2wpCiAJCSAgICBicmVhazsKIAkgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgZWxzZSBpZiAoY2MgPj0gMHgxMDAgJiYgZm9fbXVsdGlieXRlKQogCSAgICB7CiAJCS8qIEJyZWFrIGFmdGVyIG9yIGJlZm9yZSBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLwpAQCAtNjY2MCw3ICs2NTYwLDYgQEAKIAkJaWYgKGN1cndpbi0+d19jdXJzb3IuY29sIDw9IChjb2xucl9UKXdhbnRjb2wpCiAJCSAgICBicmVhazsKIAkgICAgfQotI2VuZGlmCiAJICAgIGlmIChjdXJ3aW4tPndfY3Vyc29yLmNvbCA9PSAwKQogCQlicmVhazsKIAkgICAgZGVjX2N1cnNvcigpOwpAQCAtNzM1MCw3ICs3MjQ5LDYgQEAKICAgICBjaGFyX3UgKgogYWRkX2NoYXIyYnVmKGludCBjLCBjaGFyX3UgKnMpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGNoYXJfdQl0ZW1wW01CX01BWEJZVEVTICsgMV07CiAgICAgaW50CQlpOwogICAgIGludAkJbGVuOwpAQCAtNzM1OSw3ICs3MjU3LDYgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCiAgICAgewogCWMgPSB0ZW1wW2ldOwotI2VuZGlmCiAJLyogTmVlZCB0byBlc2NhcGUgS19TUEVDSUFMIGFuZCBDU0kgbGlrZSBpbiB0aGUgdHlwZWFoZWFkIGJ1ZmZlci4gKi8KIAlpZiAoYyA9PSBLX1NQRUNJQUwpCiAJewpAQCAtNzM3Nyw5ICs3Mjc0LDcgQEAKICNlbmRpZgogCWVsc2UKIAkgICAgKnMrKyA9IGM7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIH0KLSNlbmRpZgogICAgIHJldHVybiBzOwogfQogCkBAIC03NDM1LDEzICs3MzMwLDggQEAKIAogCS8qIEFkanVzdCBmb3IgbXVsdGktd2lkZSBjaGFyIChleGNsdWRpbmcgVEFCKSAqLwogCXB0ciA9IG1sX2dldF9jdXJzb3IoKTsKLQljb2xhZHZhbmNlKGdldHZpc2NvbCgpICsgKCgqcHRyICE9IFRBQiAmJiB2aW1faXNwcmludGMoCi0jIGlmZGVmIEZFQVRfTUJZVEUKLQkJCSAgICAoKm1iX3B0cjJjaGFyKShwdHIpCi0jIGVsc2UKLQkJCSAgICAqcHRyCi0jIGVuZGlmCi0JCQkgICAgKSkKKwljb2xhZHZhbmNlKGdldHZpc2NvbCgpICsgKCgqcHRyICE9IFRBQgorCQkJCQkgICYmIHZpbV9pc3ByaW50YygoKm1iX3B0cjJjaGFyKShwdHIpKSkKIAkJICAgID8gcHRyMmNlbGxzKHB0cikgOiAxKSk7CiAJY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CiAJLyogUmV0dXJuIE9LIGlmIHRoZSBjdXJzb3IgbW92ZWQsIEZBSUwgb3RoZXJ3aXNlIChhdCB3aW5kb3cgZWRnZSkuICovCkBAIC03NDU0LDExICs3MzQ0LDkgQEAKICAgICBpZiAoKnB0ciA9PSBOVUwpCiAJcmV0dXJuIEZBSUw7CSAgICAvKiBhbHJlYWR5IGF0IHRoZSB2ZXJ5IGVuZCAqLwogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChoYXNfbWJ5dGUpCiAJbCA9ICgqbWJfcHRyMmxlbikocHRyKTsKICAgICBlbHNlCi0jZW5kaWYKIAlsID0gMTsKIAogICAgIC8qIG1vdmUgImwiIGJ5dGVzIHJpZ2h0LCBidXQgZG9uJ3QgZW5kIHVwIG9uIHRoZSBOVUwsIHVubGVzcyAndmlydHVhbGVkaXQnCkBAIC03NDk5LDEwICs3Mzg3LDcgQEAKIAkgICAgICogJ2JyZWFraW5kZW50JyBpcyBub3Qgc2V0IGFuZCB0aGVyZSBhcmUgbm8gbXVsdGktYnl0ZQogCSAgICAgKiBjaGFyYWN0ZXJzICovCiAJICAgIGlmICgoKnBfc2JyID09IE5VTCAmJiAhY3Vyd2luLT53X3BfYnJpCi0jICBpZmRlZiBGRUFUX01CWVRFCi0JCQkmJiAhaGFzX21ieXRlCi0jICBlbmRpZgotCQkJKSB8fCBnZXR2aXNjb2woKSA8IHYpCisJCQkJCSAgICAgJiYgIWhhc19tYnl0ZSkgfHwgZ2V0dmlzY29sKCkgPCB2KQogCQlicmVhazsKIAkgICAgKyt3aWR0aDsKIAl9CkBAIC03NTE2LDEzICs3NDAxLDggQEAKIAogCSAgICAvKiBBZGp1c3QgZm9yIG11bHRpLXdpZGUgY2hhciAobm90IGEgVEFCKSAqLwogCSAgICBwdHIgPSBtbF9nZXRfY3Vyc29yKCk7Ci0JICAgIGlmICgqcHRyICE9IFRBQiAmJiB2aW1faXNwcmludGMoCi0jICBpZmRlZiBGRUFUX01CWVRFCi0JCQkgICAgKCptYl9wdHIyY2hhcikocHRyKQotIyAgZWxzZQotCQkJICAgICpwdHIKLSMgIGVuZGlmCi0JCQkgICAgKSAmJiBwdHIyY2VsbHMocHRyKSA+IDEpCisJICAgIGlmICgqcHRyICE9IFRBQiAmJiB2aW1faXNwcmludGMoKCptYl9wdHIyY2hhcikocHRyKSkKKwkJCQkJCQkgJiYgcHRyMmNlbGxzKHB0cikgPiAxKQogCQljdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCA9IDA7CiAJfQogCkBAIC03NTM3LDEyICs3NDE3LDEwIEBACiAgICAgY3Vyd2luLT53X3NldF9jdXJzd2FudCA9IFRSVUU7CiAgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICAvKiBpZiB0aGUgY2hhcmFjdGVyIG9uIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGN1cnNvciBpcyBhIG11bHRpLWJ5dGUKICAgICAgKiBjaGFyYWN0ZXIsIG1vdmUgdG8gaXRzIGZpcnN0IGJ5dGUgKi8KICAgICBpZiAoaGFzX21ieXRlKQogCW1iX2FkanVzdF9jdXJzb3IoKTsKLSNlbmRpZgogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzgyOSw3ICs3NzA3LDYgQEAKICAgICArK3JlcGxhY2Vfc3RhY2tfbnI7CiB9CiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogUHVzaCBhIGNoYXJhY3RlciBvbnRvIHRoZSByZXBsYWNlIHN0YWNrLiAgSGFuZGxlcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGluCiAgKiByZXZlcnNlIGJ5dGUgb3JkZXIsIHNvIHRoYXQgdGhlIGZpcnN0IGJ5dGUgaXMgcG9wcGVkIG9mZiBmaXJzdC4KQEAgLTc4NDUsNyArNzcyMiw2IEBACiAJcmVwbGFjZV9wdXNoKHBbal0pOwogICAgIHJldHVybiBsOwogfQotI2VuZGlmCiAKIC8qCiAgKiBQb3Agb25lIGl0ZW0gZnJvbSB0aGUgcmVwbGFjZSBzdGFjay4KQEAgLTc4OTMsMTcgKzc3NjksMTIgQEAKICAgICBTdGF0ZSA9IE5PUk1BTDsJCQkvKiBkb24ndCB3YW50IFJFUExBQ0UgaGVyZSAqLwogICAgIHdoaWxlICgoY2MgPSByZXBsYWNlX3BvcCgpKSA+IDApCiAgICAgewotI2lmZGVmIEZFQVRfTUJZVEUKIAltYl9yZXBsYWNlX3BvcF9pbnMoY2MpOwotI2Vsc2UKLQlpbnNfY2hhcihjYyk7Ci0jZW5kaWYKIAlkZWNfY3Vyc29yKCk7CiAgICAgfQogICAgIFN0YXRlID0gb2xkU3RhdGU7CiB9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAvKgogICogSW5zZXJ0IGJ5dGVzIHBvcHBlZCBmcm9tIHRoZSByZXBsYWNlIHN0YWNrLiAiY2MiIGlzIHRoZSBmaXJzdCBieXRlLiAgSWYgaXQKICAqIGluZGljYXRlcyBhIG11bHRpLWJ5dGUgY2hhciwgcG9wIHRoZSBvdGhlciBieXRlcyB0b28uCkBAIC03OTU2LDcgKzc4MjcsNiBAQAogCSAgICB9CiAJfQogfQotI2VuZGlmCiAKIC8qCiAgKiBtYWtlIHRoZSByZXBsYWNlIHN0YWNrIGVtcHR5CkBAIC04MDEyLDcgKzc4ODIsNiBAQAogCSAgICBnZXR2Y29sKGN1cndpbiwgJmN1cndpbi0+d19jdXJzb3IsIE5VTEwsICZzdGFydF92Y29sLCBOVUxMKTsKIAkgICAgb3JpZ192Y29scyA9IGNoYXJ0YWJzaXplKG1sX2dldF9jdXJzb3IoKSwgc3RhcnRfdmNvbCk7CiAJfQotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoaGFzX21ieXRlKQogCXsKIAkgICAgKHZvaWQpZGVsX2NoYXJfYWZ0ZXJfY29sKGxpbWl0X2NvbCk7CkBAIC04MDIxLDcgKzc4OTAsNiBAQAogCSAgICByZXBsYWNlX3B1c2goY2MpOwogCX0KIAllbHNlCi0jZW5kaWYKIAl7CiAJICAgIHBjaGFyX2N1cnNvcihjYyk7CiAJICAgIGlmIChTdGF0ZSAmIFZSRVBMQUNFX0ZMQUcpCkBAIC04MDM4LDkgKzc5MDYsNyBAQAogCSAgICBmb3IgKGkgPSAwOyBpIDwgaW5zX2xlbjsgKytpKQogCSAgICB7CiAJCXZjb2wgKz0gY2hhcnRhYnNpemUocCArIGksIHZjb2wpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaSArPSAoKm1iX3B0cjJsZW4pKHApIC0gMTsKLSNlbmRpZgogCSAgICB9CiAJICAgIHZjb2wgLT0gc3RhcnRfdmNvbDsKIApAQCAtODMyOSw3ICs4MTk1LDYgQEAKIAkJICAgIC8qIEp1c3QgY29tcGxldGVkIGEgd29yZCwgY2hlY2sgaWYgaXQgc3RhcnRzIHdpdGggImxvb2siLgogCQkgICAgICogc2VhcmNoIGJhY2sgZm9yIHRoZSBzdGFydCBvZiBhIHdvcmQuICovCiAJCSAgICBsaW5lID0gbWxfZ2V0X2N1cmxpbmUoKTsKLSMgaWZkZWYgRkVBVF9NQllURQogCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJICAgIHsKIAkJCWNoYXJfdQkqbjsKQEAgLTgzNDIsNyArODIwNyw2IEBACiAJCQl9CiAJCSAgICB9CiAJCSAgICBlbHNlCi0jIGVuZGlmCiAJCQlmb3IgKHMgPSBsaW5lICsgY3Vyd2luLT53X2N1cnNvci5jb2w7IHMgPiBsaW5lOyAtLXMpCiAJCQkgICAgaWYgKCF2aW1faXN3b3JkYyhzWy0xXSkpCiAJCQkJYnJlYWs7CkBAIC04ODIzLDExICs4Njg3LDkgQEAKICNlbmRpZgogCXsKIAkgICAgLS1jdXJ3aW4tPndfY3Vyc29yLmNvbDsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIC8qIENvcnJlY3QgY3Vyc29yIGZvciBtdWx0aS1ieXRlIGNoYXJhY3Rlci4gKi8KIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJbWJfYWRqdXN0X2N1cnNvcigpOwotI2VuZGlmCiAJfQogICAgIH0KIApAQCAtOTEzNyw5ICs4OTk5LDcgQEAKICAgICBpbnQJCWRpZF9iYWNrc3BhY2UgPSBGQUxTRTsKICAgICBpbnQJCWluX2luZGVudDsKICAgICBpbnQJCW9sZFN0YXRlOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpbnQJCWNwY1tNQVhfTUNPXTsJICAgIC8qIGNvbXBvc2luZyBjaGFyYWN0ZXJzICovCi0jZW5kaWYKIAogICAgIC8qCiAgICAgICogY2FuJ3QgZGVsZXRlIGFueXRoaW5nIGluIGFuIGVtcHR5IGZpbGUKQEAgLTkyODcsMTEgKzkxNDcsNyBAQAogCQl3aGlsZSAoY2MgPiAwKQogCQl7CiAJCSAgICBzYXZlX2NvbCA9IGN1cndpbi0+d19jdXJzb3IuY29sOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIG1iX3JlcGxhY2VfcG9wX2lucyhjYyk7Ci0jZWxzZQotCQkgICAgaW5zX2NoYXIoY2MpOwotI2VuZGlmCiAJCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHNhdmVfY29sOwogCQkgICAgY2MgPSByZXBsYWNlX3BvcCgpOwogCQl9CkBAIC05NDEzLDEyICs5MjY5LDEwIEBACiAJICovCiAJZWxzZQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGludCBjY2xhc3MgPSAwLCBwcmV2X2NjbGFzcyA9IDA7CiAKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJY2NsYXNzID0gbWJfZ2V0X2NsYXNzKG1sX2dldF9jdXJzb3IoKSk7Ci0jZW5kaWYKIAkgICAgZG8KIAkgICAgewogI2lmZGVmIEZFQVRfUklHSFRMRUZUCkBAIC05NDI3LDE0ICs5MjgxLDEyIEBACiAJCSAgICBkZWNfY3Vyc29yKCk7CiAKIAkJY2MgPSBnY2hhcl9jdXJzb3IoKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8qIGxvb2sgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgY2xhc3MgKi8KIAkJaWYgKGhhc19tYnl0ZSkKIAkJewogCQkgICAgcHJldl9jY2xhc3MgPSBjY2xhc3M7CiAJCSAgICBjY2xhc3MgPSBtYl9nZXRfY2xhc3MobWxfZ2V0X2N1cnNvcigpKTsKIAkJfQotI2VuZGlmCiAKIAkJLyogc3RhcnQgb2Ygd29yZD8gKi8KIAkJaWYgKG1vZGUgPT0gQkFDS1NQQUNFX1dPUkQgJiYgIXZpbV9pc3NwYWNlKGNjKSkKQEAgLTk0NDUsMTAgKzkyOTcsNyBAQAogCQkvKiBlbmQgb2Ygd29yZD8gKi8KIAkJZWxzZSBpZiAobW9kZSA9PSBCQUNLU1BBQ0VfV09SRF9OT1RfU1BBQ0UKIAkJCSYmICgodmltX2lzc3BhY2UoY2MpIHx8IHZpbV9pc3dvcmRjKGNjKSAhPSB0ZW1wKQotI2lmZGVmIEZFQVRfTUJZVEUKLQkJCXx8IHByZXZfY2NsYXNzICE9IGNjbGFzcwotI2VuZGlmCi0JCQkpKQorCQkJfHwgcHJldl9jY2xhc3MgIT0gY2NsYXNzKSkKIAkJewogI2lmZGVmIEZFQVRfUklHSFRMRUZUCiAJCSAgICBpZiAoIXJldmluc19vbikKQEAgLTk0NjQsMTIgKzkzMTMsOSBAQAogCQkgICAgcmVwbGFjZV9kb19icygtMSk7CiAJCWVsc2UKIAkJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGlmIChlbmNfdXRmOCAmJiBwX2RlY28pCiAJCQkodm9pZCl1dGZjX3B0cjJjaGFyKG1sX2dldF9jdXJzb3IoKSwgY3BjKTsKLSNlbmRpZgogCQkgICAgKHZvaWQpZGVsX2NoYXIoRkFMU0UpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIC8qCiAJCSAgICAgKiBJZiB0aGVyZSBhcmUgY29tYmluaW5nIGNoYXJhY3RlcnMgYW5kICdkZWxjb21iaW5lJyBpcyBzZXQKIAkJICAgICAqIG1vdmUgdGhlIGN1cnNvciBiYWNrLiAgRG9uJ3QgYmFjayB1cCBiZWZvcmUgdGhlIGJhc2UKQEAgLTk0NzcsNyArOTMyMyw2IEBACiAJCSAgICAgKi8KIAkJICAgIGlmIChlbmNfdXRmOCAmJiBwX2RlY28gJiYgY3BjWzBdICE9IE5VTCkKIAkJCWluY19jdXJzb3IoKTsKLSNlbmRpZgogI2lmZGVmIEZFQVRfUklHSFRMRUZUCiAJCSAgICBpZiAocmV2aW5zX2NoYXJzKQogCQkgICAgewpAQCAtOTcxMywxMSArOTU1OCw5IEBACiAJICAgIC8vIHdvbid0IGdldCB0aGUgZW5kIHNlcXVlbmNlLgogCSAgICBicmVhazsKIAotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoaGFzX21ieXRlKQogCSAgICBpZHggKz0gKCptYl9jaGFyMmJ5dGVzKShjLCBidWYgKyBpZHgpOwogCWVsc2UKLSNlbmRpZgogCSAgICBidWZbaWR4KytdID0gYzsKIAlidWZbaWR4XSA9IE5VTDsKIAlpZiAoZW5kICE9IE5VTEwgJiYgU1RSTkNNUChidWYsIGVuZCwgaWR4KSA9PSAwKQpAQCAtOTc2MCwxMSArOTYwMyw5IEBACiAJCWNhc2UgUEFTVEVfT05FX0NIQVI6CiAJCSAgICBpZiAocmV0X2NoYXIgPT0gLTEpCiAJCSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkJaWYgKGhhc19tYnl0ZSkKIAkJCSAgICByZXRfY2hhciA9ICgqbWJfcHRyMmNoYXIpKGJ1Zik7CiAJCQllbHNlCi0jZW5kaWYKIAkJCSAgICByZXRfY2hhciA9IGJ1ZlswXTsKIAkJICAgIH0KIAkJICAgIGJyZWFrOwpAQCAtOTk3MiwxMSArOTgxMyw5IEBACiAJZWxzZQogI2VuZGlmCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gKCptYl9wdHIybGVuKShtbF9nZXRfY3Vyc29yKCkpOwogCSAgICBlbHNlCi0jZW5kaWYKIAkJKytjdXJ3aW4tPndfY3Vyc29yLmNvbDsKIAl9CiAKQEAgLTEwNTkwLDExICsxMDQyOSw3IEBACiAgICAgaWYgKChjb2xucl9UKXRlbXAgPiBjdXJ3aW4tPndfdmlydGNvbCkKIAlwdHIgPSBwcmV2X3B0cjsKIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBjID0gKCptYl9wdHIyY2hhcikocHRyKTsKLSNlbHNlCi0gICAgYyA9ICpwdHI7Ci0jZW5kaWYKICAgICBpZiAoYyA9PSBOVUwpCiAJdmltX2JlZXAoQk9fQ09QWSk7CiAgICAgcmV0dXJuIGM7CkBAIC0xMDc3MywxMSArMTA2MDgsOSBAQAogICAgIGlmICghaGFzX2luc2VydGNoYXJwcmUoKSkKIAlyZXR1cm4gTlVMTDsKIAotIyBpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGhhc19tYnl0ZSkKIAlidWZbKCptYl9jaGFyMmJ5dGVzKShjLCBidWYpXSA9IE5VTDsKICAgICBlbHNlCi0jIGVuZGlmCiAgICAgewogCWJ1ZlswXSA9IGM7CiAJYnVmWzFdID0gTlVMOwpkaWZmIC0tZ2l0IGEvc3JjL2V2YWwuYyBiL3NyYy9ldmFsLmMKaW5kZXggZWZhMTY4ZS4uNjdhMDA2ZSAxMDA2NDQKLS0tIGEvc3JjL2V2YWwuYworKysgYi9zcmMvZXZhbC5jCkBAIC01NzcsNyArNTc3LDYgQEAKICAgICBWSU1fQ0xFQVIocmVkaXJfdmFybmFtZSk7CiB9CiAKLSMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQogICAgIGludAogZXZhbF9jaGFyY29udmVydCgKICAgICBjaGFyX3UJKmVuY19mcm9tLApAQCAtNjAyLDcgKzYwMSw2IEBACiAJcmV0dXJuIEZBSUw7CiAgICAgcmV0dXJuIE9LOwogfQotIyBlbmRpZgogCiAjIGlmIGRlZmluZWQoRkVBVF9QT1NUU0NSSVBUKSB8fCBkZWZpbmVkKFBST1RPKQogICAgIGludApAQCAtNDk5OCwxMyArNDk5NiwxMSBAQAogCQkJCSAgbnIgPSAobnIgPDwgNCkgKyBoZXgybnIoKnApOwogCQkJICAgICAgfQogCQkJICAgICAgKytwOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJCSAgICAgIC8qIEZvciAiXHUiIHN0b3JlIHRoZSBudW1iZXIgYWNjb3JkaW5nIHRvCiAJCQkgICAgICAgKiAnZW5jb2RpbmcnLiAqLwogCQkJICAgICAgaWYgKGMgIT0gJ1gnKQogCQkJCSAgbmFtZSArPSAoKm1iX2NoYXIyYnl0ZXMpKG5yLCBuYW1lKTsKIAkJCSAgICAgIGVsc2UKLSNlbmRpZgogCQkJCSAgKm5hbWUrKyA9IG5yOwogCQkJICB9CiAJCQkgIGJyZWFrOwpAQCAtNjcwNCwxMSArNjcwMCw5IEBACiB7CiAgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOwogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChoYXNfbWJ5dGUpCiAJYnVmWygqbWJfY2hhcjJieXRlcykoYywgYnVmKV0gPSBOVUw7CiAgICAgZWxzZQotI2VuZGlmCiAgICAgewogCWJ1ZlswXSA9IGM7CiAJYnVmWzFdID0gTlVMOwpAQCAtNjg4NSwxMiArNjg3OSwxMCBAQAogCiAgICAgaWYgKGVhcC0+Zm9yY2VfZmYgIT0gMCkKIAlsZW4gKz0gMTA7IC8qICIgKytmZj11bml4IiAqLwotIyBpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGVhcC0+Zm9yY2VfZW5jICE9IDApCiAJbGVuICs9ICh1bnNpZ25lZClTVFJMRU4oZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2VuYykgKyA3OwogICAgIGlmIChlYXAtPmJhZF9jaGFyICE9IDApCiAJbGVuICs9IDcgKyA0OyAgLyogIiArK2JhZD0iICsgImtlZXAiIG9yICJkcm9wIiAqLwotIyBlbmRpZgogCiAgICAgbmV3dmFsID0gYWxsb2MobGVuICsgMSk7CiAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQpAQCAtNjkxMSw3ICs2OTAzLDYgQEAKIAkJCQkJCWVhcC0+Zm9yY2VfZmYgPT0gJ3UnID8gInVuaXgiCiAJCQkJCQk6IGVhcC0+Zm9yY2VfZmYgPT0gJ2QnID8gImRvcyIKIAkJCQkJCTogIm1hYyIpOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoZWFwLT5mb3JjZV9lbmMgIT0gMCkKIAlzcHJpbnRmKChjaGFyICopbmV3dmFsICsgU1RSTEVOKG5ld3ZhbCksICIgKytlbmM9JXMiLAogCQkJCQkgICAgICAgZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2VuYyk7CkBAIC02OTIxLDcgKzY5MTIsNiBAQAogCVNUUkNQWShuZXd2YWwgKyBTVFJMRU4obmV3dmFsKSwgIiArK2JhZD1kcm9wIik7CiAgICAgZWxzZSBpZiAoZWFwLT5iYWRfY2hhciAhPSAwKQogCXNwcmludGYoKGNoYXIgKiluZXd2YWwgKyBTVFJMRU4obmV3dmFsKSwgIiArK2JhZD0lYyIsIGVhcC0+YmFkX2NoYXIpOwotI2VuZGlmCiAgICAgdmltdmFyc1tWVl9DTURBUkddLnZ2X3N0ciA9IG5ld3ZhbDsKICAgICByZXR1cm4gb2xkdmFsOwogfQpAQCAtODQzMiw3ICs4NDIyLDYgQEAKIAkJICAgIH0KIAkJICAgIGVsc2UKIAkJICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCQlpZiAoaGFzX21ieXRlKQogCQkJewogCQkJICAgIGludCBpID0gKCptYl9wdHIybGVuKShwKTsKQEAgLTg0NDEsNyArODQzMCw2IEBACiAJCQkgICAgcCArPSBpIC0gMTsKIAkJCX0KIAkJCWVsc2UKLSNlbmRpZgogCQkJICAgICh2b2lkKW1zZ19vdXR0cmFuc19sZW5fYXR0cihwLCAxLCBlY2hvX2F0dHIpOwogCQkgICAgfQogCQl9CkBAIC0xMDA4MiwxMCArMTAwNzAsOCBAQAogICAgIC8qIENvdW50IHRoZSBwYXRocyBiYWNrd2FyZCB0byBmaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlc2lyZWQgc3RyaW5nLiAqLwogICAgIGZvciAocCA9IHRmbmFtZSArIGxlbiAtIDE7IHAgPj0gdGZuYW1lOyAtLXApCiAgICAgewotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoaGFzX21ieXRlKQogCSAgICBwIC09IG1iX2hlYWRfb2ZmKHRmbmFtZSwgcCk7Ci0jZW5kaWYKIAlpZiAodmltX2lzcGF0aHNlcCgqcCkpCiAJewogCSAgICBpZiAoc2VwY291bnQgPT0gMCB8fCAoaGFzVGlsZGUgJiYgc2VwY291bnQgPT0gMSkpCmRpZmYgLS1naXQgYS9zcmMvZXZhbGZ1bmMuYyBiL3NyYy9ldmFsZnVuYy5jCmluZGV4IGUwZjVkNmUuLjViYmE3ZWEgMTAwNjQ0Ci0tLSBhL3NyYy9ldmFsZnVuYy5jCisrKyBiL3NyYy9ldmFsZnVuYy5jCkBAIC0yMDcxLDkgKzIwNzEsNyBAQAogICAgIHN0YXRpYyB2b2lkCiBieXRlaWR4KHR5cHZhbF9UICphcmd2YXJzLCB0eXB2YWxfVCAqcmV0dHYsIGludCBjb21wIFVOVVNFRCkKIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2hhcl91CSp0OwotI2VuZGlmCiAgICAgY2hhcl91CSpzdHI7CiAgICAgdmFybnVtYmVyX1QJaWR4OwogCkBAIC0yMDgzLDcgKzIwODEsNiBAQAogICAgIGlmIChzdHIgPT0gTlVMTCB8fCBpZHggPCAwKQogCXJldHVybjsKIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICB0ID0gc3RyOwogICAgIGZvciAoIDsgaWR4ID4gMDsgaWR4LS0pCiAgICAgewpAQCAtMjA5NSwxMCArMjA5Miw2IEBACiAJICAgIHQgKz0gKCptYl9wdHIybGVuKSh0KTsKICAgICB9CiAgICAgcmV0dHYtPnZ2YWwudl9udW1iZXIgPSAodmFybnVtYmVyX1QpKHQgLSBzdHIpOwotI2Vsc2UKLSAgICBpZiAoKHNpemVfdClpZHggPD0gU1RSTEVOKHN0cikpCi0JcmV0dHYtPnZ2YWwudl9udW1iZXIgPSBpZHg7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTI0NTAsNyArMjQ0Myw2IEBACiAgICAgc3RhdGljIHZvaWQKIGZfY2hhcjJucih0eXB2YWxfVCAqYXJndmFycywgdHlwdmFsX1QgKnJldHR2KQogewotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoaGFzX21ieXRlKQogICAgIHsKIAlpbnQJdXRmOCA9IDA7CkBAIC0yNDY0LDggKzI0NTYsNyBAQAogCSAgICByZXR0di0+dnZhbC52X251bWJlciA9ICgqbWJfcHRyMmNoYXIpKHR2X2dldF9zdHJpbmcoJmFyZ3ZhcnNbMF0pKTsKICAgICB9CiAgICAgZWxzZQotI2VuZGlmCi0gICAgcmV0dHYtPnZ2YWwudl9udW1iZXIgPSB0dl9nZXRfc3RyaW5nKCZhcmd2YXJzWzBdKVswXTsKKwlyZXR0di0+dnZhbC52X251bWJlciA9IHR2X2dldF9zdHJpbmcoJmFyZ3ZhcnNbMF0pWzBdOwogfQogCiAvKgpAQCAtMjUzNiwxNSArMjUyNywxMCBAQAogCQlpZiAoY3Vyd2luLT53X2N1cnNvci5jb2xhZGQgPj0gKGNvbG5yX1QpY2hhcnRhYnNpemUocCwKIAkJCQkgY3Vyd2luLT53X3ZpcnRjb2wgLSBjdXJ3aW4tPndfY3Vyc29yLmNvbGFkZCkpCiAJCXsKLSMgaWZkZWYgRkVBVF9NQllURQogCQkgICAgaW50CQlsOwogCiAJCSAgICBpZiAoKnAgIT0gTlVMICYmIHBbKGwgPSAoKm1iX3B0cjJsZW4pKHApKV0gPT0gTlVMKQogCQkJY29sICs9IGw7Ci0jIGVsc2UKLQkJICAgIGlmICgqcCAhPSBOVUwgJiYgcFsxXSA9PSBOVUwpCi0JCQkrK2NvbDsKLSMgZW5kaWYKIAkJfQogCSAgICB9CiAjZW5kaWYKQEAgLTI5MDQsMTEgKzI4OTAsOSBAQAogCiAgICAgLyogTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXMgaW4gYSB2YWxpZCBwb3NpdGlvbi4gKi8KICAgICBjaGVja19jdXJzb3IoKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgLyogQ29ycmVjdCBjdXJzb3IgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAqLwogICAgIGlmIChoYXNfbWJ5dGUpCiAJbWJfYWRqdXN0X2N1cnNvcigpOwotI2VuZGlmCiAKICAgICBjdXJ3aW4tPndfc2V0X2N1cnN3YW50ID0gc2V0X2N1cnN3YW50OwogICAgIHJldHR2LT52dmFsLnZfbnVtYmVyID0gMDsKQEAgLTQ4ODgsMTAgKzQ4NzIsOCBAQAogCSAgICB0ZW1wW2krK10gPSBLX1NFQ09ORChuKTsKIAkgICAgdGVtcFtpKytdID0gS19USElSRChuKTsKIAl9Ci0jaWZkZWYgRkVBVF9NQllURQogCWVsc2UgaWYgKGhhc19tYnl0ZSkKIAkgICAgaSArPSAoKm1iX2NoYXIyYnl0ZXMpKG4sIHRlbXAgKyBpKTsKLSNlbmRpZgogCWVsc2UKIAkgICAgdGVtcFtpKytdID0gbjsKIAl0ZW1wW2krK10gPSBOVUw7CkBAIC01NDM5LDcgKzU0MjEsNyBAQAogCSAgICBkaWN0X2FkZF9zdHJpbmcoZGljdCwgImdyb3VwIiwgc3luX2lkMm5hbWUoY3VyLT5obGdfaWQpKTsKIAkgICAgZGljdF9hZGRfbnVtYmVyKGRpY3QsICJwcmlvcml0eSIsIChsb25nKWN1ci0+cHJpb3JpdHkpOwogCSAgICBkaWN0X2FkZF9udW1iZXIoZGljdCwgImlkIiwgKGxvbmcpY3VyLT5pZCk7Ci0jIGlmIGRlZmluZWQoRkVBVF9DT05DRUFMKSAmJiBkZWZpbmVkKEZFQVRfTUJZVEUpCisjIGlmIGRlZmluZWQoRkVBVF9DT05DRUFMKQogCSAgICBpZiAoY3VyLT5jb25jZWFsX2NoYXIpCiAJICAgIHsKIAkJY2hhcl91IGJ1ZltNQl9NQVhCWVRFUyArIDFdOwpAQCAtNjQyMyw5ICs2NDA1LDcgQEAKIAkibW91c2VfeHRlcm0iLAogIyBlbmRpZgogI2VuZGlmCi0jaWZkZWYgRkVBVF9NQllURQogCSJtdWx0aV9ieXRlIiwKLSNlbmRpZgogI2lmZGVmIEZFQVRfTUJZVEVfSU1FCiAJIm11bHRpX2J5dGVfaW1lIiwKICNlbmRpZgpAQCAtNjY3NCwxMCArNjY1NCw4IEBACiAJICAgIG4gPSBtY2hfaW5wdXRfaXNhdHR5KCk7CiAJZWxzZSBpZiAoU1RSSUNNUChuYW1lLCAidHR5b3V0IikgPT0gMCkKIAkgICAgbiA9IHN0ZG91dF9pc2F0dHk7Ci0jaWZkZWYgRkVBVF9NQllURQogCWVsc2UgaWYgKFNUUklDTVAobmFtZSwgIm11bHRpX2J5dGVfZW5jb2RpbmciKSA9PSAwKQogCSAgICBuID0gaGFzX21ieXRlOwotI2VuZGlmCiAjaWYgZGVmaW5lZChGRUFUX0JFVkFMKSAmJiBkZWZpbmVkKEZFQVRfR1VJX1czMikKIAllbHNlIGlmIChTVFJJQ01QKG5hbWUsICJiYWxsb29uX211bHRpbGluZSIpID09IDApCiAJICAgIG4gPSBtdWx0aWxpbmVfYmFsbG9vbl9hdmFpbGFibGUoKTsKQEAgLTY5NjUsMTcgKzY5NDMsMTQgQEAKICAgICBzdGF0aWMgdm9pZAogZl9pY29udih0eXB2YWxfVCAqYXJndmFycyBVTlVTRUQsIHR5cHZhbF9UICpyZXR0dikKIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2hhcl91CWJ1ZjFbTlVNQlVGTEVOXTsKICAgICBjaGFyX3UJYnVmMltOVU1CVUZMRU5dOwogICAgIGNoYXJfdQkqZnJvbSwgKnRvLCAqc3RyOwogICAgIHZpbWNvbnZfVAl2aW1jb252OwotI2VuZGlmCiAKICAgICByZXR0di0+dl90eXBlID0gVkFSX1NUUklORzsKICAgICByZXR0di0+dnZhbC52X3N0cmluZyA9IE5VTEw7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgc3RyID0gdHZfZ2V0X3N0cmluZygmYXJndmFyc1swXSk7CiAgICAgZnJvbSA9IGVuY19jYW5vbml6ZShlbmNfc2tpcCh0dl9nZXRfc3RyaW5nX2J1ZigmYXJndmFyc1sxXSwgYnVmMSkpKTsKICAgICB0byA9IGVuY19jYW5vbml6ZShlbmNfc2tpcCh0dl9nZXRfc3RyaW5nX2J1ZigmYXJndmFyc1syXSwgYnVmMikpKTsKQEAgLTY5OTEsNyArNjk2Niw2IEBACiAgICAgY29udmVydF9zZXR1cCgmdmltY29udiwgTlVMTCwgTlVMTCk7CiAgICAgdmltX2ZyZWUoZnJvbSk7CiAgICAgdmltX2ZyZWUodG8pOwotI2VuZGlmCiB9CiAKIC8qCkBAIC04MDk3LDEyICs4MDcxLDggQEAKIAkgICAgfQogCSAgICBlbHNlCiAJICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCXN0YXJ0Y29sID0gKGNvbG5yX1QpKHJlZ21hdGNoLnN0YXJ0cFswXQogCQkJCSAgICArICgqbWJfcHRyMmxlbikocmVnbWF0Y2guc3RhcnRwWzBdKSAtIHN0cik7Ci0jZWxzZQotCQlzdGFydGNvbCA9IChjb2xucl9UKShyZWdtYXRjaC5zdGFydHBbMF0gKyAxIC0gc3RyKTsKLSNlbmRpZgogCQlpZiAoc3RhcnRjb2wgPiAoY29sbnJfVClsZW4KIAkJCQkgICAgICB8fCBzdHIgKyBzdGFydGNvbCA8PSByZWdtYXRjaC5zdGFydHBbMF0pCiAJCXsKQEAgLTg3MTIsNyArODY4Miw2IEBACiB7CiAgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOwogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChoYXNfbWJ5dGUpCiAgICAgewogCWludAl1dGY4ID0gMDsKQEAgLTg3MjUsNyArODY5NCw2IEBACiAJICAgIGJ1ZlsoKm1iX2NoYXIyYnl0ZXMpKChpbnQpdHZfZ2V0X251bWJlcigmYXJndmFyc1swXSksIGJ1ZildID0gTlVMOwogICAgIH0KICAgICBlbHNlCi0jZW5kaWYKICAgICB7CiAJYnVmWzBdID0gKGNoYXJfdSl0dl9nZXRfbnVtYmVyKCZhcmd2YXJzWzBdKTsKIAlidWZbMV0gPSBOVUw7CkBAIC05MTc1LDcgKzkxNDMsNiBAQAogCSAgICB9CiAJICAgIGVsc2UgaWYgKCpwID09IE5VTCkKIAkJKnAgPSAnXG4nOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgLyogQ2hlY2sgZm9yIHV0ZjggImJvbSI7IFUrRkVGRiBpcyBlbmNvZGVkIGFzIEVGIEJCIEJGLiAgRG8gdGhpcwogCSAgICAgKiB3aGVuIGZpbmRpbmcgdGhlIEJGIGFuZCBjaGVjayB0aGUgcHJldmlvdXMgdHdvIGJ5dGVzLiAqLwogCSAgICBlbHNlIGlmICgqcCA9PSAweGJmICYmIGVuY191dGY4ICYmICFiaW5hcnkpCkBAIC05MjE1LDcgKzkxODIsNiBAQAogCQkgICAgfQogCQl9CiAJICAgIH0KLSNlbmRpZgogCX0gLyogZm9yICovCiAKIAlpZiAoZmFpbGVkIHx8IChjbnQgPj0gbWF4bGluZSAmJiBtYXhsaW5lID49IDApIHx8IHJlYWRsZW4gPD0gMCkKQEAgLTEwMzg2LDExICsxMDM1Miw5IEBACiAgICAgZWxzZQogICAgIHsKIAlvZmYgPSBMaW5lT2Zmc2V0W3Jvd10gKyBjb2w7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChlbmNfdXRmOCAmJiBTY3JlZW5MaW5lc1VDW29mZl0gIT0gMCkKIAkgICAgYyA9IFNjcmVlbkxpbmVzVUNbb2ZmXTsKIAllbHNlCi0jZW5kaWYKIAkgICAgYyA9IFNjcmVlbkxpbmVzW29mZl07CiAgICAgfQogICAgIHJldHR2LT52dmFsLnZfbnVtYmVyID0gYzsKQEAgLTEwOTEwLDcgKzEwODc0LDYgQEAKIAljc2VhcmNoID0gZGljdF9nZXRfc3RyaW5nKGQsIChjaGFyX3UgKikiY2hhciIsIEZBTFNFKTsKIAlpZiAoY3NlYXJjaCAhPSBOVUxMKQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChlbmNfdXRmOCkKIAkgICAgewogCQlpbnQgcGNjW01BWF9NQ09dOwpAQCAtMTA5MTksNyArMTA4ODIsNiBAQAogCQlzZXRfbGFzdF9jc2VhcmNoKGMsIGNzZWFyY2gsIHV0ZmNfcHRyMmxlbihjc2VhcmNoKSk7CiAJICAgIH0KIAkgICAgZWxzZQotI2VuZGlmCiAJCXNldF9sYXN0X2NzZWFyY2goUFRSMkNIQVIoY3NlYXJjaCksCiAJCQkJCQljc2VhcmNoLCBNQl9QVFIyTEVOKGNzZWFyY2gpKTsKIAl9CkBAIC0xMjUxMSwxOCArMTI0NzMsMTIgQEAKIAkgICAgfQogCSAgICBpZiAoIW1hdGNoKQogCQlicmVhazsKLQkgICAgLyogQWR2YW5jZSB0byBqdXN0IGFmdGVyIHRoZSBtYXRjaC4gKi8KKwkgICAgLy8gQWR2YW5jZSB0byBqdXN0IGFmdGVyIHRoZSBtYXRjaC4KIAkgICAgaWYgKHJlZ21hdGNoLmVuZHBbMF0gPiBzdHIpCiAJCWNvbCA9IDA7CiAJICAgIGVsc2UKLQkgICAgewotCQkvKiBEb24ndCBnZXQgc3R1Y2sgYXQgdGhlIHNhbWUgbWF0Y2guICovCi0jaWZkZWYgRkVBVF9NQllURQorCQkvLyBEb24ndCBnZXQgc3R1Y2sgYXQgdGhlIHNhbWUgbWF0Y2guCiAJCWNvbCA9ICgqbWJfcHRyMmxlbikocmVnbWF0Y2guZW5kcFswXSk7Ci0jZWxzZQotCQljb2wgPSAxOwotI2VuZGlmCi0JICAgIH0KIAkgICAgc3RyID0gcmVnbWF0Y2guZW5kcFswXTsKIAl9CiAKQEAgLTEyNjMyLDcgKzEyNTg4LDYgQEAKIAlyZXR0di0+dnZhbC52X3N0cmluZyA9IHZpbV9zdHJzYXZlKChjaGFyX3UgKilfKCIoSW52YWxpZCkiKSk7CiAgICAgZWxzZQogICAgIHsKLSMgaWZkZWYgRkVBVF9NQllURQogCXZpbWNvbnZfVCAgIGNvbnY7CiAJY2hhcl91CSAgICAqZW5jOwogCkBAIC0xMjY0MSwyOCArMTI1OTYsMjMgQEAKIAljb252ZXJ0X3NldHVwKCZjb252LCBwX2VuYywgZW5jKTsKIAlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKIAkgICAgcCA9IHN0cmluZ19jb252ZXJ0KCZjb252LCBwLCBOVUxMKTsKLSMgZW5kaWYKIAlpZiAocCAhPSBOVUxMKQogCSAgICAodm9pZClzdHJmdGltZSgoY2hhciAqKXJlc3VsdF9idWYsIHNpemVvZihyZXN1bHRfYnVmKSwKIAkJCQkJCQkgIChjaGFyICopcCwgY3VydGltZSk7CiAJZWxzZQogCSAgICByZXN1bHRfYnVmWzBdID0gTlVMOwogCi0jIGlmZGVmIEZFQVRfTUJZVEUKIAlpZiAoY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKIAkgICAgdmltX2ZyZWUocCk7CiAJY29udmVydF9zZXR1cCgmY29udiwgZW5jLCBwX2VuYyk7CiAJaWYgKGNvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCiAJICAgIHJldHR2LT52dmFsLnZfc3RyaW5nID0gc3RyaW5nX2NvbnZlcnQoJmNvbnYsIHJlc3VsdF9idWYsIE5VTEwpOwogCWVsc2UKLSMgZW5kaWYKIAkgICAgcmV0dHYtPnZ2YWwudl9zdHJpbmcgPSB2aW1fc3Ryc2F2ZShyZXN1bHRfYnVmKTsKIAotIyBpZmRlZiBGRUFUX01CWVRFCiAJLyogUmVsZWFzZSBjb252ZXJzaW9uIGRlc2NyaXB0b3JzICovCiAJY29udmVydF9zZXR1cCgmY29udiwgTlVMTCwgTlVMTCk7CiAJdmltX2ZyZWUoZW5jKTsKLSMgZW5kaWYKICAgICB9CiB9CiAjZW5kaWYKQEAgLTEyNjc3LDYgKzEyNjI3LDcgQEAKICAgICBpbnQJCWxlbjsKICAgICBpbnQJCWVycm9yID0gRkFMU0U7CiAgICAgaW50CQljaGFyaWR4OworICAgIGludAkJYnl0ZWlkeCA9IDA7CiAKICAgICByZXR0di0+dnZhbC52X251bWJlciA9IC0xOwogICAgIHN0ciA9IHR2X2dldF9zdHJpbmdfY2hrKCZhcmd2YXJzWzBdKTsKQEAgLTEyNjg2LDI1ICsxMjYzNywxNyBAQAogICAgIGNoYXJpZHggPSAoaW50KXR2X2dldF9udW1iZXJfY2hrKCZhcmd2YXJzWzFdLCAmZXJyb3IpOwogICAgIGlmIChlcnJvcikKIAlyZXR1cm47Ci0jaWZkZWYgRkVBVF9NQllURQotICAgIHsKLQlpbnQJYnl0ZWlkeCA9IDA7CiAKLQl3aGlsZSAoY2hhcmlkeCA+PSAwICYmIGJ5dGVpZHggPCBsZW4pCisgICAgd2hpbGUgKGNoYXJpZHggPj0gMCAmJiBieXRlaWR4IDwgbGVuKQorICAgIHsKKwlpZiAoY2hhcmlkeCA9PSAwKQogCXsKLQkgICAgaWYgKGNoYXJpZHggPT0gMCkKLQkgICAgewotCQlyZXR0di0+dnZhbC52X251bWJlciA9IG1iX3B0cjJjaGFyKHN0ciArIGJ5dGVpZHgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICAtLWNoYXJpZHg7Ci0JICAgIGJ5dGVpZHggKz0gTUJfQ1BUUjJMRU4oc3RyICsgYnl0ZWlkeCk7CisJICAgIHJldHR2LT52dmFsLnZfbnVtYmVyID0gbWJfcHRyMmNoYXIoc3RyICsgYnl0ZWlkeCk7CisJICAgIGJyZWFrOwogCX0KKwktLWNoYXJpZHg7CisJYnl0ZWlkeCArPSBNQl9DUFRSMkxFTihzdHIgKyBieXRlaWR4KTsKICAgICB9Ci0jZWxzZQotICAgIGlmIChjaGFyaWR4IDwgbGVuKQotCXJldHR2LT52dmFsLnZfbnVtYmVyID0gc3RyW2NoYXJpZHhdOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0xMjc3NywxMCArMTI3MjAsOCBAQAogewogICAgIGNoYXJfdQkJKnMgPSB0dl9nZXRfc3RyaW5nKCZhcmd2YXJzWzBdKTsKICAgICBpbnQJCQlza2lwY2MgPSAwOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICB2YXJudW1iZXJfVAkJbGVuID0gMDsKICAgICBpbnQJCQkoKmZ1bmNfbWJfcHRyMmNoYXJfYWR2KShjaGFyX3UgKipwcCk7Ci0jZW5kaWYKIAogICAgIGlmIChhcmd2YXJzWzFdLnZfdHlwZSAhPSBWQVJfVU5LTk9XTikKIAlza2lwY2MgPSAoaW50KXR2X2dldF9udW1iZXJfY2hrKCZhcmd2YXJzWzFdLCBOVUxMKTsKQEAgLTEyNzg4LDcgKzEyNzI5LDYgQEAKIAllbXNnKF8oZV9pbnZhcmcpKTsKICAgICBlbHNlCiAgICAgewotI2lmZGVmIEZFQVRfTUJZVEUKIAlmdW5jX21iX3B0cjJjaGFyX2FkdiA9IHNraXBjYyA/IG1iX3B0cjJjaGFyX2FkdiA6IG1iX2NwdHIyY2hhcl9hZHY7CiAJd2hpbGUgKCpzICE9IE5VTCkKIAl7CkBAIC0xMjc5Niw5ICsxMjczNiw2IEBACiAJICAgICsrbGVuOwogCX0KIAlyZXR0di0+dnZhbC52X251bWJlciA9IGxlbjsKLSNlbHNlCi0JcmV0dHYtPnZ2YWwudl9udW1iZXIgPSAodmFybnVtYmVyX1QpKFNUUkxFTihzKSk7Ci0jZW5kaWYKICAgICB9CiB9CiAKQEAgLTEyODI1LDEzICsxMjc2Miw3IEBACiB7CiAgICAgY2hhcl91CSpzID0gdHZfZ2V0X3N0cmluZygmYXJndmFyc1swXSk7CiAKLSAgICByZXR0di0+dnZhbC52X251bWJlciA9ICh2YXJudW1iZXJfVCkoCi0jaWZkZWYgRkVBVF9NQllURQotCSAgICBtYl9zdHJpbmcyY2VsbHMocywgLTEpCi0jZWxzZQotCSAgICBTVFJMRU4ocykKLSNlbmRpZgotCSAgICApOworICAgIHJldHR2LT52dmFsLnZfbnVtYmVyID0gKHZhcm51bWJlcl9UKShtYl9zdHJpbmcyY2VsbHMocywgLTEpKTsKIH0KIAogLyoKQEAgLTEyODQwLDcgKzEyNzcxLDYgQEAKICAgICBzdGF0aWMgdm9pZAogZl9zdHJjaGFycGFydCh0eXB2YWxfVCAqYXJndmFycywgdHlwdmFsX1QgKnJldHR2KQogewotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBjaGFyX3UJKnA7CiAgICAgaW50CQluY2hhcjsKICAgICBpbnQJCW5ieXRlID0gMDsKQEAgLTEyODk5LDkgKzEyODI5LDYgQEAKIAogICAgIHJldHR2LT52X3R5cGUgPSBWQVJfU1RSSU5HOwogICAgIHJldHR2LT52dmFsLnZfc3RyaW5nID0gdmltX3N0cm5zYXZlKHAgKyBuYnl0ZSwgbGVuKTsKLSNlbHNlCi0gICAgZl9zdHJwYXJ0KGFyZ3ZhcnMsIHJldHR2KTsKLSNlbmRpZgogfQogCiAvKgpAQCAtMTMyNzgsMTEgKzEzMjA1LDkgQEAKIAkJICAgIGNjaGFyID0gKGxjc19jb25jZWFsID09IE5VTCkgPyAnICcgOiBsY3NfY29uY2VhbDsKIAkJaWYgKGNjaGFyICE9IE5VTCkKIAkJewotIyBpZmRlZiBGRUFUX01CWVRFCiAJCSAgICBpZiAoaGFzX21ieXRlKQogCQkJKCptYl9jaGFyMmJ5dGVzKShjY2hhciwgc3RyKTsKIAkJICAgIGVsc2UKLSMgZW5kaWYKIAkJCXN0clswXSA9IGNjaGFyOwogCQl9CiAJICAgIH0KQEAgLTE0MjA4LDcgKzE0MTMzLDYgQEAKICAgICBjaGFyX3UJKmZyb21zdHI7CiAgICAgY2hhcl91CSp0b3N0cjsKICAgICBjaGFyX3UJKnA7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJaW5sZW47CiAgICAgaW50CQlmcm9tbGVuOwogICAgIGludAkJdG9sZW47CkBAIC0xNDIxNiw3ICsxNDE0MCw2IEBACiAgICAgY2hhcl91CSpjcHN0cjsKICAgICBpbnQJCWNwbGVuOwogICAgIGludAkJZmlyc3QgPSBUUlVFOwotI2VuZGlmCiAgICAgY2hhcl91CWJ1ZltOVU1CVUZMRU5dOwogICAgIGNoYXJfdQlidWYyW05VTUJVRkxFTl07CiAgICAgZ2FycmF5X1QJZ2E7CkBAIC0xNDIzMiwxNSArMTQxNTUsMTEgQEAKIAkgICAgcmV0dXJuOwkJLyogdHlwZSBlcnJvcjsgZXJybXNnIGFscmVhZHkgZ2l2ZW4gKi8KICAgICBnYV9pbml0MigmZ2EsIChpbnQpc2l6ZW9mKGNoYXIpLCA4MCk7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKCFoYXNfbWJ5dGUpCi0jZW5kaWYKIAkvKiBub3QgbXVsdGktYnl0ZTogZnJvbXN0ciBhbmQgdG9zdHIgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggKi8KIAlpZiAoU1RSTEVOKGZyb21zdHIpICE9IFNUUkxFTih0b3N0cikpCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIGVycm9yOgotI2VuZGlmCiAJICAgIHNlbXNnKF8oZV9pbnZhcmcyKSwgZnJvbXN0cik7CiAJICAgIGdhX2NsZWFyKCZnYSk7CiAJICAgIHJldHVybjsKQEAgLTE0MjQ5LDcgKzE0MTY4LDYgQEAKICAgICAvKiBmcm9tc3RyIGFuZCB0b3N0ciBoYXZlIHRvIGNvbnRhaW4gdGhlIHNhbWUgbnVtYmVyIG9mIGNoYXJzICovCiAgICAgd2hpbGUgKCppbl9zdHIgIT0gTlVMKQogICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKIAl7CiAJICAgIGlubGVuID0gKCptYl9wdHIybGVuKShpbl9zdHIpOwpAQCAtMTQzMDAsNyArMTQyMTgsNiBAQAogCSAgICBpbl9zdHIgKz0gaW5sZW47CiAJfQogCWVsc2UKLSNlbmRpZgogCXsKIAkgICAgLyogV2hlbiBub3QgdXNpbmcgbXVsdGktYnl0ZSBjaGFycyB3ZSBjYW4gZG8gaXQgZmFzdGVyLiAqLwogCSAgICBwID0gdmltX3N0cmNocihmcm9tc3RyLCAqaW5fc3RyKTsKZGlmZiAtLWdpdCBhL3NyYy9leF9jbWRzLmMgYi9zcmMvZXhfY21kcy5jCmluZGV4IGI2YmQzZDMuLmE0ZTdjZmIgMTAwNjQ0Ci0tLSBhL3NyYy9leF9jbWRzLmMKKysrIGIvc3JjL2V4X2NtZHMuYwpAQCAtNTAsNyArNTAsNiBAQAogI2lmZGVmIEZFQVRfRElHUkFQSFMKICAgICBjaGFyX3UgICAgICAqZGlnOwogI2VuZGlmCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJY2NbTUFYX01DT107CiAgICAgaW50CQljaSA9IDA7CiAgICAgaW50CQlsZW47CkBAIC01OCw3ICs1Nyw2IEBACiAgICAgaWYgKGVuY191dGY4KQogCWMgPSB1dGZjX3B0cjJjaGFyKG1sX2dldF9jdXJzb3IoKSwgY2MpOwogICAgIGVsc2UKLSNlbmRpZgogCWMgPSBnY2hhcl9jdXJzb3IoKTsKICAgICBpZiAoYyA9PSBOVUwpCiAgICAgewpAQCAtNjYsMTAgKzY0LDggQEAKIAlyZXR1cm47CiAgICAgfQogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIElPYnVmZlswXSA9IE5VTDsKICAgICBpZiAoIWhhc19tYnl0ZSB8fCAoZW5jX2RiY3MgIT0gMCAmJiBjIDwgMHgxMDApIHx8IGMgPCAweDgwKQotI2VuZGlmCiAgICAgewogCWlmIChjID09IE5MKQkgICAgLyogTlVMIGlzIHN0b3JlZCBhcyBOTCAqLwogCSAgICBjID0gTlVMOwpAQCAtMTA2LDE1ICsxMDIsMTIgQEAKIAkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCiAJCV8oIjwlcz4lcyVzICAlZCwgIEhleCAlMDJ4LCAgT2N0YWwgJTAzbyIpLAogCQkJCSAgdHJhbnNjaGFyKGMpLCBidWYxLCBidWYyLCBjdmFsLCBjdmFsLCBjdmFsKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGVuY191dGY4KQogCSAgICBjID0gY2NbY2krK107CiAJZWxzZQogCSAgICBjID0gMDsKLSNlbmRpZgogICAgIH0KIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICAvKiBSZXBlYXQgZm9yIGNvbWJpbmluZyBjaGFyYWN0ZXJzLiAqLwogICAgIHdoaWxlIChoYXNfbWJ5dGUgJiYgKGMgPj0gMHgxMDAgfHwgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkpKQogICAgIHsKQEAgLTE1MCw3ICsxNDMsNiBAQAogCWVsc2UKIAkgICAgYyA9IDA7CiAgICAgfQotI2VuZGlmCiAKICAgICBtc2coKGNoYXIgKilJT2J1ZmYpOwogfQpAQCAtODIzLDExICs4MTUsOSBAQAogCSAgICBpZiAocHRyW2NvbF0gPT0gTlVMKQogCQlicmVhazsKIAkgICAgdmNvbCArPSBjaGFydGFic2l6ZShwdHIgKyBjb2wsIChjb2xucl9UKXZjb2wpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJY29sICs9ICgqbWJfcHRyMmxlbikocHRyICsgY29sKTsKIAkgICAgZWxzZQotI2VuZGlmCiAJCSsrY29sOwogCX0KIAlpZiAobmV3X2xpbmUgPT0gTlVMTCkJCSAgICAvKiBvdXQgb2YgbWVtb3J5ICovCkBAIC0yMjgyLDkgKzIyNzIsNyBAQAogICAgIGlmICgodmlyLnZpcl9saW5lID0gYWxsb2MoTFNJWkUpKSA9PSBOVUxMKQogCXJldHVybjsKICAgICB2aXIudmlyX2ZkID0gZnBfaW47Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIHZpci52aXJfY29udi52Y190eXBlID0gQ09OVl9OT05FOwotI2VuZGlmCiAgICAgZ2FfaW5pdDIoJnZpci52aXJfYmFybGluZXMsIChpbnQpc2l6ZW9mKGNoYXJfdSAqKSwgMTAwKTsKICAgICB2aXIudmlyX3ZlcnNpb24gPSAtMTsKIApAQCAtMjMyMSwxMCArMjMwOSw4IEBACiAJCQkJCQkJICBWSU1fVkVSU0lPTl9NRURJVU0pOwogCWZwdXRzKF8oIiMgWW91IG1heSBlZGl0IGl0IGlmIHlvdSdyZSBjYXJlZnVsIVxuXG4iKSwgZnBfb3V0KTsKIAl3cml0ZV92aW1pbmZvX3ZlcnNpb24oZnBfb3V0KTsKLSNpZmRlZiBGRUFUX01CWVRFCiAJZnB1dHMoXygiIyBWYWx1ZSBvZiAnZW5jb2RpbmcnIHdoZW4gdGhpcyBmaWxlIHdhcyB3cml0dGVuXG4iKSwgZnBfb3V0KTsKIAlmcHJpbnRmKGZwX291dCwgIiplbmNvZGluZz0lc1xuXG4iLCBwX2VuYyk7Ci0jZW5kaWYKIAl3cml0ZV92aW1pbmZvX3NlYXJjaF9wYXR0ZXJuKGZwX291dCk7CiAJd3JpdGVfdmltaW5mb19zdWJfc3RyaW5nKGZwX291dCk7CiAjaWZkZWYgRkVBVF9DTURISVNUCkBAIC0yMzUzLDEwICsyMzM5LDggQEAKICAgICB9CiAKICAgICB2aW1fZnJlZSh2aXIudmlyX2xpbmUpOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAodmlyLnZpcl9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQogCWNvbnZlcnRfc2V0dXAoJnZpci52aXJfY29udiwgTlVMTCwgTlVMTCk7Ci0jZW5kaWYKICAgICBnYV9jbGVhcl9zdHJpbmdzKCZ2aXIudmlyX2JhcmxpbmVzKTsKIH0KIApAQCAtMjQ4NCw3ICsyNDY4LDYgQEAKICAgICBzdGF0aWMgaW50CiB2aW1pbmZvX2VuY29kaW5nKHZpcl9UICp2aXJwKQogewotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBjaGFyX3UJKnA7CiAgICAgaW50CQlpOwogCkBAIC0yNTAyLDcgKzI0ODUsNiBAQAogCSAgICBjb252ZXJ0X3NldHVwKCZ2aXJwLT52aXJfY29udiwgcCwgcF9lbmMpOwogCX0KICAgICB9Ci0jZW5kaWYKICAgICByZXR1cm4gdmltaW5mb19yZWFkbGluZSh2aXJwKTsKIH0KIApAQCAtMjU3NCw3ICsyNTU2LDYgQEAKICAgICB9CiAgICAgKmQgPSBOVUw7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGNvbnZlcnQgJiYgdmlycC0+dmlyX2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUgJiYgKnJldHZhbCAhPSBOVUwpCiAgICAgewogCWQgPSBzdHJpbmdfY29udmVydCgmdmlycC0+dmlyX2NvbnYsIHJldHZhbCwgTlVMTCk7CkBAIC0yNTg0LDcgKzI1NjUsNiBAQAogCSAgICByZXR2YWwgPSBkOwogCX0KICAgICB9Ci0jZW5kaWYKIAogICAgIHJldHVybiByZXR2YWw7CiB9CkBAIC0yNzA4LDEwICsyNjg4LDggQEAKICAgICBpbnQJICAgIGk7CiAgICAgaW50CSAgICBhbGxvY2F0ZWQgPSBGQUxTRTsKICAgICBpbnQJICAgIGVvZjsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2hhcl91ICAqc2NvbnY7CiAgICAgaW50CSAgICBjb252ZXJ0ZWQ7Ci0jZW5kaWYKIAogICAgIHdoaWxlICgqcCA9PSAnLCcpCiAgICAgewpAQCAtMjgzNSw3ICsyODEzLDYgQEAKIAkgICAgKytwOwogCSAgICBzW2xlbl0gPSBOVUw7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGNvbnZlcnRlZCA9IEZBTFNFOwogCSAgICBpZiAodmlycC0+dmlyX2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUgJiYgKnMgIT0gTlVMKQogCSAgICB7CkBAIC0yODQ5LDcgKzI4MjYsNyBAQAogCQkgICAgY29udmVydGVkID0gVFJVRTsKIAkJfQogCSAgICB9Ci0jZW5kaWYKKwogCSAgICAvKiBOZWVkIHRvIGNvcHkgaW4gYWxsb2NhdGVkIG1lbW9yeSBpZiB0aGUgc3RyaW5nIHdhc24ndCBhbGxvY2F0ZWQKIAkgICAgICogYWJvdmUgYW5kIHdlIGRpZCBhbGxvY2F0ZSBiZWZvcmUsIHRodXMgdmlyX2xpbmUgbWF5IGNoYW5nZS4gKi8KIAkgICAgaWYgKHMgIT0gYnVmICYmIGFsbG9jYXRlZCkKQEAgLTI4NTcsMTEgKzI4MzQsNyBAQAogCSAgICB2YWx1ZS0+YnZfc3RyaW5nID0gczsKIAkgICAgdmFsdWUtPmJ2X3R5cGUgPSBCVkFMX1NUUklORzsKIAkgICAgdmFsdWUtPmJ2X2xlbiA9IGxlbjsKLQkgICAgdmFsdWUtPmJ2X2FsbG9jYXRlZCA9IGFsbG9jYXRlZAotI2lmZGVmIEZFQVRfTUJZVEUKLQkJCQkJICAgIHx8IGNvbnZlcnRlZAotI2VuZGlmCi0JCQkJCQk7CisJICAgIHZhbHVlLT5idl9hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQgfHwgY29udmVydGVkOwogCSAgICArK3ZhbHVlcy0+Z2FfbGVuOwogCSAgICBpZiAobmV4dHAgIT0gTlVMTCkKIAkgICAgewpAQCAtNDA5NCw5ICs0MDY3LDcgQEAKIAkJICAgIGlmICghb2xkYnVmICYmIGVhcCAhPSBOVUxMKQogCQkgICAgewogCQkJc2V0X2ZpbGVfb3B0aW9ucyhUUlVFLCBlYXApOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJCXNldF9mb3JjZWRfZmVuYyhlYXApOwotI2VuZGlmCiAJCSAgICB9CiAJCX0KIApAQCAtNTMxNywxMSArNTI4OCw5IEBACiAJCSAgICBlbHNlCiAJCSAgICB7CiAJCQkgLyogc2VhcmNoIGZvciBhIG1hdGNoIGF0IG5leHQgY29sdW1uICovCi0jaWZkZWYgRkVBVF9NQllURQogCQkJaWYgKGhhc19tYnl0ZSkKIAkJCSAgICBtYXRjaGNvbCArPSBtYl9wdHIybGVuKHN1Yl9maXJzdGxpbmUgKyBtYXRjaGNvbCk7CiAJCQllbHNlCi0jZW5kaWYKIAkJCSAgICArK21hdGNoY29sOwogCQkgICAgfQogCQkgICAgZ290byBza2lwOwpAQCAtNTc1OSwxMCArNTcyOCw4IEBACiAJCQkgICAgcDEgPSBuZXdfc3RhcnQgLSAxOwogCQkJfQogCQkgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGVsc2UgaWYgKGhhc19tYnl0ZSkKIAkJCXAxICs9ICgqbWJfcHRyMmxlbikocDEpIC0gMTsKLSNlbmRpZgogCQl9CiAKIAkJLyoKQEAgLTcwMTcsMTAgKzY5ODQsOCBAQAogCQkgICAgRklMRQkqZmQ7CiAJCSAgICBjaGFyX3UJKnM7CiAJCSAgICBpbnQJCWZpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIHZpbWNvbnZfVAl2YzsKIAkJICAgIGNoYXJfdQkqY3A7Ci0jZW5kaWYKIAogCQkgICAgLyogRmluZCBhbGwgImRvYy8gKi50eHQiIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LiAqLwogCQkgICAgYWRkX3BhdGhzZXAoTmFtZUJ1ZmYpOwpAQCAtNzA4Niw5ICs3MDUxLDggQEAKIAkJCQkJJiYgKHMgPSB2aW1fc3RyY2hyKElPYnVmZiArIDEsICcqJykpCiAJCQkJCQkJCSAgIT0gTlVMTCkKIAkJCQl7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkJCSAgICBpbnQJdGhpc191dGYgPSBNQVlCRTsKLSNlbmRpZgorCiAJCQkJICAgIC8qIENoYW5nZSB0YWcgZGVmaW5pdGlvbiB0byBhCiAJCQkJICAgICAqIHJlZmVyZW5jZSBhbmQgcmVtb3ZlIDxDUj4vPE5MPi4gKi8KIAkJCQkgICAgSU9idWZmWzBdID0gJ3wnOwpAQCAtNzA5Nyw3ICs3MDYxLDYgQEAKIAkJCQkgICAgewogCQkJCQlpZiAoKnMgPT0gJ1xyJyB8fCAqcyA9PSAnXG4nKQogCQkJCQkgICAgKnMgPSBOVUw7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkJCQkvKiBUaGUgdGV4dCBpcyB1dGYtOCB3aGVuIGEgYnl0ZQogCQkJCQkgKiBhYm92ZSAxMjcgaXMgZm91bmQgYW5kIG5vCiAJCQkJCSAqIGlsbGVnYWwgYnl0ZSBzZXF1ZW5jZSBpcyBmb3VuZC4KQEAgLTcxMTIsMTAgKzcwNzUsOSBAQAogCQkJCQkJdGhpc191dGYgPSBGQUxTRTsKIAkJCQkJICAgIHMgKz0gbCAtIDE7CiAJCQkJCX0KLSNlbmRpZgogCQkJCQkrK3M7CiAJCQkJICAgIH0KLSNpZmRlZiBGRUFUX01CWVRFCisKIAkJCQkgICAgLyogVGhlIGhlbHAgZmlsZSBpcyBsYXRpbjEgb3IgdXRmLTg7CiAJCQkJICAgICAqIGNvbnZlcnNpb24gdG8gdGhlIGN1cnJlbnQKIAkJCQkgICAgICogJ2VuY29kaW5nJyBtYXkgYmUgcmVxdWlyZWQuICovCkBAIC03MTQwLDEwICs3MTAyLDYgQEAKIAkJCQkgICAgbWxfYXBwZW5kKGxudW0sIGNwLCAoY29sbnJfVCkwLCBGQUxTRSk7CiAJCQkJICAgIGlmIChjcCAhPSBJT2J1ZmYpCiAJCQkJCXZpbV9mcmVlKGNwKTsKLSNlbHNlCi0JCQkJICAgIG1sX2FwcGVuZChsbnVtLCBJT2J1ZmYsIChjb2xucl9UKTAsCi0JCQkJCQkJCSAgIEZBTFNFKTsKLSNlbmRpZgogCQkJCSAgICArK2xudW07CiAJCQkJfQogCQkJCWZjbG9zZShmZCk7CkBAIC03MTk5LDEyICs3MTU3LDEwIEBACiAgICAgaW50CQlpOwogICAgIGNoYXJfdQkqZm5hbWU7CiAgICAgaW50CQlkaXJsZW47Ci0jIGlmZGVmIEZFQVRfTUJZVEUKICAgICBpbnQJCXV0ZjggPSBNQVlCRTsKICAgICBpbnQJCXRoaXNfdXRmODsKICAgICBpbnQJCWZpcnN0bGluZTsKICAgICBpbnQJCW1peCA9IEZBTFNFOwkvKiBkZXRlY3RlZCBtaXhlZCBlbmNvZGluZ3MgKi8KLSMgZW5kaWYKIAogICAgIC8qCiAgICAgICogRmluZCBhbGwgKi50eHQgZmlsZXMuCkBAIC03Mjc0LDEyICs3MjMwLDkgQEAKIAl9CiAJZm5hbWUgPSBmaWxlc1tmaV0gKyBkaXJsZW4gKyAxOwogCi0jIGlmZGVmIEZFQVRfTUJZVEUKIAlmaXJzdGxpbmUgPSBUUlVFOwotIyBlbmRpZgogCXdoaWxlICghdmltX2ZnZXRzKElPYnVmZiwgSU9TSVpFLCBmZCkgJiYgIWdvdF9pbnQpCiAJewotIyBpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChmaXJzdGxpbmUpCiAJICAgIHsKIAkJLyogRGV0ZWN0IHV0Zi04IGZpbGUgYnkgYSBub24tQVNDSUkgY2hhciBpbiB0aGUgZmlyc3QgbGluZS4gKi8KQEAgLTczMTEsNyArNzI2NCw2IEBACiAJCX0KIAkJZmlyc3RsaW5lID0gRkFMU0U7CiAJICAgIH0KLSMgZW5kaWYKIAkgICAgcDEgPSB2aW1fc3RyY2hyKElPYnVmZiwgJyonKTsJLyogZmluZCBmaXJzdCAnKicgKi8KIAkgICAgd2hpbGUgKHAxICE9IE5VTEwpCiAJICAgIHsKQEAgLTczOTgsMTAgKzczNTAsOCBAQAogCSAgICB9CiAJfQogCi0jIGlmZGVmIEZFQVRfTUJZVEUKIAlpZiAodXRmOCA9PSBUUlVFKQogCSAgICBmcHJpbnRmKGZkX3RhZ3MsICIhX1RBR19GSUxFX0VOQ09ESU5HXHR1dGYtOFx0Ly9cbiIpOwotIyBlbmRpZgogCiAJLyoKIAkgKiBXcml0ZSB0aGUgdGFncyBpbnRvIHRoZSBmaWxlLgpAQCAtNzQyNiwxMCArNzM3Niw4IEBACiAJICAgIH0KIAl9CiAgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAobWl4KQogCWdvdF9pbnQgPSBGQUxTRTsgICAgLyogY29udGludWUgd2l0aCBvdGhlciBsYW5ndWFnZXMgKi8KLSNlbmRpZgogCiAgICAgZm9yIChpID0gMDsgaSA8IGdhLmdhX2xlbjsgKytpKQogCXZpbV9mcmVlKCgoY2hhcl91ICoqKWdhLmdhX2RhdGEpW2ldKTsKZGlmZiAtLWdpdCBhL3NyYy9leF9jbWRzMi5jIGIvc3JjL2V4X2NtZHMyLmMKaW5kZXggOWZlMjJhMy4uNjBhZjI3YyAxMDA2NDQKLS0tIGEvc3JjL2V4X2NtZHMyLmMKKysrIGIvc3JjL2V4X2NtZHMyLmMKQEAgLTE5NTcsNyArMTk1Nyw3IEBACiAJCSAgICBpZiAoSU9idWZmW0lPU0laRSAtIDJdICE9IE5VTCAmJiBJT2J1ZmZbSU9TSVpFIC0gMl0gIT0gTkwpCiAJCSAgICB7CiAJCQlpbnQgbiA9IElPU0laRSAtIDI7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKKwogCQkJaWYgKGVuY191dGY4KQogCQkJewogCQkJICAgIC8qIE1vdmUgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhpcyBjaGFyLgpAQCAtMTk2OCw3ICsxOTY4LDYgQEAKIAkJCX0KIAkJCWVsc2UgaWYgKGhhc19tYnl0ZSkKIAkJCSAgICBuIC09IG1iX2hlYWRfb2ZmKElPYnVmZiwgSU9idWZmICsgbik7Ci0jIGVuZGlmCiAJCQlJT2J1ZmZbbl0gPSBOTDsKIAkJCUlPYnVmZltuICsgMV0gPSBOVUw7CiAJCSAgICB9CkBAIC00MjU0LDkgKzQyNTMsNyBAQAogICAgIGludAkJZGJnX3RpY2s7CS8qIGRlYnVnX3RpY2sgd2hlbiBicmVha3BvaW50IHdhcyBzZXQgKi8KICAgICBpbnQJCWxldmVsOwkJLyogdG9wIG5lc3RpbmcgbGV2ZWwgb2Ygc291cmNlZCBmaWxlICovCiAjZW5kaWYKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgdmltY29udl9UCWNvbnY7CQkvKiB0eXBlIG9mIGNvbnZlcnNpb24gKi8KLSNlbmRpZgogfTsKIAogI2lmZGVmIEZFQVRfRVZBTApAQCAtNDU5Myw3ICs0NTkwLDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGNvb2tpZS5jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CQkvKiBubyBjb252ZXJzaW9uICovCiAKICAgICAvKiBSZWFkIHRoZSBmaXJzdCBsaW5lIHNvIHdlIGNhbiBjaGVjayBmb3IgYSBVVEYtOCBCT00uICovCkBAIC00NjEyLDcgKzQ2MDgsNiBAQAogCSAgICBmaXJzdGxpbmUgPSBwOwogCX0KICAgICB9Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2FsbCBkb19jbWRsaW5lLCB3aGljaCB3aWxsIGNhbGwgZ2V0c291cmNlbGluZSgpIHRvIGdldCB0aGUgbGluZXMuCkBAIC00NjgzLDkgKzQ2NzgsNyBAQAogICAgIGZjbG9zZShjb29raWUuZnApOwogICAgIHZpbV9mcmVlKGNvb2tpZS5uZXh0bGluZSk7CiAgICAgdmltX2ZyZWUoZmlyc3RsaW5lKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY29udmVydF9zZXR1cCgmY29va2llLmNvbnYsIE5VTEwsIE5VTEwpOwotI2VuZGlmCiAKICAgICBpZiAodHJpZ2dlcl9zb3VyY2VfcG9zdCkKIAlhcHBseV9hdXRvY21kcyhFVkVOVF9TT1VSQ0VQT1NULCBmbmFtZV9leHAsIGZuYW1lX2V4cCwgRkFMU0UsIGN1cmJ1Zik7CkBAIC00OTI0LDcgKzQ5MTcsNiBAQAogCX0KICAgICB9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGxpbmUgIT0gTlVMTCAmJiBzcC0+Y29udi52Y190eXBlICE9IENPTlZfTk9ORSkKICAgICB7CiAJY2hhcl91CSpzOwpAQCAtNDkzNyw3ICs0OTI5LDYgQEAKIAkgICAgbGluZSA9IHM7CiAJfQogICAgIH0KLSNlbmRpZgogCiAjaWZkZWYgRkVBVF9FVkFMCiAgICAgLyogRGlkIHdlIGVuY291bnRlciBhIGJyZWFrcG9pbnQ/ICovCkBAIC01MTk0LDcgKzUxODUsNiBAQAogICAgIHZvaWQKIGV4X3NjcmlwdGVuY29kaW5nKGV4YXJnX1QgKmVhcCBVTlVTRUQpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIHN0cnVjdCBzb3VyY2VfY29va2llCSpzcDsKICAgICBjaGFyX3UJCQkqbmFtZTsKIApAQCAtNTIxOSw3ICs1MjA5LDYgQEAKIAogICAgIGlmIChuYW1lICE9IGVhcC0+YXJnKQogCXZpbV9mcmVlKG5hbWUpOwotI2VuZGlmCiB9CiAKICNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKZGlmZiAtLWdpdCBhL3NyYy9leF9kb2NtZC5jIGIvc3JjL2V4X2RvY21kLmMKaW5kZXggMjEwZmRmYS4uMzY1OTNlYyAxMDA2NDQKLS0tIGEvc3JjL2V4X2RvY21kLmMKKysrIGIvc3JjL2V4X2RvY21kLmMKQEAgLTQwNCw4ICs0MDQsNyBAQAogIyBkZWZpbmUgZXhfZm9sZG9wZW4JCWV4X25pCiAjIGRlZmluZSBleF9mb2xkZG8JCWV4X25pCiAjZW5kaWYKLSNpZiAhKChkZWZpbmVkKEhBVkVfTE9DQUxFX0gpIHx8IGRlZmluZWQoWF9MT0NBTEUpKSBcCi0JJiYgKGRlZmluZWQoRkVBVF9HRVRURVhUKSB8fCBkZWZpbmVkKEZFQVRfTUJZVEUpKSkKKyNpZiAhKGRlZmluZWQoSEFWRV9MT0NBTEVfSCkgfHwgZGVmaW5lZChYX0xPQ0FMRSkpCiAjIGRlZmluZSBleF9sYW5ndWFnZQkJZXhfbmkKICNlbmRpZgogI2lmbmRlZiBGRUFUX1NJR05TCkBAIC0xNTUwLDcgKzE1NDksNiBAQAogI2VuZGlmCiB9CiAKLSNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKICAqIElmICJmZ2V0bGluZSIgaXMgZ2V0X2xvb3BfbGluZSgpLCByZXR1cm4gdGhlIGNvb2tpZSB1c2VkIGJ5IHRoZSBvcmlnaW5hbAogICogZ2V0bGluZSBmdW5jdGlvbi4gIE90aGVyd2lzZSByZXR1cm4gImNvb2tpZSIuCkBAIC0xNTYwLDcgKzE1NTgsNyBAQAogICAgIGNoYXJfdQkqKCpmZ2V0bGluZSkoaW50LCB2b2lkICosIGludCkgVU5VU0VELAogICAgIHZvaWQJKmNvb2tpZSkJCS8qIGFyZ3VtZW50IGZvciBmZ2V0bGluZSgpICovCiB7Ci0jIGlmZGVmIEZFQVRfRVZBTAorI2lmZGVmIEZFQVRfRVZBTAogICAgIGNoYXJfdQkJKigqZ3ApKGludCwgdm9pZCAqLCBpbnQpOwogICAgIHN0cnVjdCBsb29wX2Nvb2tpZSAqY3A7CiAKQEAgLTE1NzUsMTEgKzE1NzMsMTAgQEAKIAljcCA9IGNwLT5jb29raWU7CiAgICAgfQogICAgIHJldHVybiBjcDsKLSMgZWxzZQorI2Vsc2UKICAgICByZXR1cm4gY29va2llOwotIyBlbmRpZgotfQogI2VuZGlmCit9CiAKIAogLyoKQEAgLTMxMTYsMTcgKzMxMTMsOSBAQAogICAgIGQgPSBJT2J1ZmYgKyBTVFJMRU4oSU9idWZmKTsKICAgICB3aGlsZSAoKnMgIT0gTlVMICYmIGQgLSBJT2J1ZmYgPCBJT1NJWkUgLSA3KQogICAgIHsKLQlpZiAoCi0jaWZkZWYgRkVBVF9NQllURQotCQllbmNfdXRmOCA/IChzWzBdID09IDB4YzIgJiYgc1sxXSA9PSAweGEwKSA6Ci0jZW5kaWYKLQkJKnMgPT0gMHhhMCkKKwlpZiAoZW5jX3V0ZjggPyAoc1swXSA9PSAweGMyICYmIHNbMV0gPT0gMHhhMCkgOiAqcyA9PSAweGEwKQogCXsKLQkgICAgcyArPQotI2lmZGVmIEZFQVRfTUJZVEUKLQkJZW5jX3V0ZjggPyAyIDoKLSNlbmRpZgotCQkxOworCSAgICBzICs9IGVuY191dGY4ID8gMiA6IDE7CiAJICAgIFNUUkNQWShkLCAiPGEwPiIpOwogCSAgICBkICs9IDQ7CiAJfQpAQCAtMzc1MiwxMSArMzc0MSw5IEBACiAJcCA9IHhwLT54cF9wYXR0ZXJuOwogCXdoaWxlICgqcCAhPSBOVUwpCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJYyA9IG1iX3B0cjJjaGFyKHApOwogCSAgICBlbHNlCi0jZW5kaWYKIAkJYyA9ICpwOwogCSAgICBpZiAoYyA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQogCQkrK3A7CkBAIC0zNzgwLDE5ICszNzY3LDE1IEBACiAJCWxlbiA9IDA7ICAvKiBhdm9pZCBnZXR0aW5nIHN0dWNrIHdoZW4gc3BhY2UgaXMgaW4gJ2lzZm5hbWUnICovCiAJCXdoaWxlICgqcCAhPSBOVUwpCiAJCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCSAgICBpZiAoaGFzX21ieXRlKQogCQkJYyA9IG1iX3B0cjJjaGFyKHApOwogCQkgICAgZWxzZQotI2VuZGlmCiAJCQljID0gKnA7CiAJCSAgICBpZiAoYyA9PSAnYCcgfHwgdmltX2lzZmlsZWNfb3Jfd2MoYykpCiAJCQlicmVhazsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCSAgICBpZiAoaGFzX21ieXRlKQogCQkJbGVuID0gKCptYl9wdHIybGVuKShwKTsKIAkJICAgIGVsc2UKLSNlbmRpZgogCQkJbGVuID0gMTsKIAkJICAgIE1CX1BUUl9BRFYocCk7CiAJCX0KQEAgLTU0MDgsNyArNTM5MSw2IEBACiAgICAgcmV0dXJuIHA7CiB9CiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCiAgICAgaW50CiBnZXRfYmFkX29wdChjaGFyX3UgKnAsIGV4YXJnX1QgKmVhcCkKIHsKQEAgLTU0MjIsNyArNTQwNCw2IEBACiAJcmV0dXJuIEZBSUw7CiAgICAgcmV0dXJuIE9LOwogfQotI2VuZGlmCiAKIC8qCiAgKiBHZXQgIisrb3B0PWFyZyIgYXJndW1lbnQuCkBAIC01NDMzLDEwICs1NDE0LDggQEAKIHsKICAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnICsgMjsKICAgICBpbnQJCSpwcCA9IE5VTEw7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGludAkJYmFkX2NoYXJfaWR4OwogICAgIGNoYXJfdQkqcDsKLSNlbmRpZgogCiAgICAgLyogIjplZGl0ICsrW25vXWJpblthcnldIGZpbGUiICovCiAgICAgaWYgKFNUUk5DTVAoYXJnLCAiYmluIiwgMykgPT0gMCB8fCBTVFJOQ01QKGFyZywgIm5vYmluIiwgNSkgPT0gMCkKQEAgLTU0NzIsNyArNTQ1MSw2IEBACiAJYXJnICs9IDEwOwogCXBwID0gJmVhcC0+Zm9yY2VfZmY7CiAgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBlbHNlIGlmIChTVFJOQ01QKGFyZywgImVuYyIsIDMpID09IDApCiAgICAgewogCWlmIChTVFJOQ01QKGFyZywgImVuY29kaW5nIiwgOCkgPT0gMCkKQEAgLTU0ODYsNyArNTQ2NCw2IEBACiAJYXJnICs9IDM7CiAJcHAgPSAmYmFkX2NoYXJfaWR4OwogICAgIH0KLSNlbmRpZgogCiAgICAgaWYgKHBwID09IE5VTEwgfHwgKmFyZyAhPSAnPScpCiAJcmV0dXJuIEZBSUw7CkBAIC01NDk3LDE0ICs1NDc0LDExIEBACiAgICAgZWFwLT5hcmcgPSBza2lwd2hpdGUoYXJnKTsKICAgICAqYXJnID0gTlVMOwogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChwcCA9PSAmZWFwLT5mb3JjZV9mZikKICAgICB7Ci0jZW5kaWYKIAlpZiAoY2hlY2tfZmZfdmFsdWUoZWFwLT5jbWQgKyBlYXAtPmZvcmNlX2ZmKSA9PSBGQUlMKQogCSAgICByZXR1cm4gRkFJTDsKIAllYXAtPmZvcmNlX2ZmID0gZWFwLT5jbWRbZWFwLT5mb3JjZV9mZl07Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIH0KICAgICBlbHNlIGlmIChwcCA9PSAmZWFwLT5mb3JjZV9lbmMpCiAgICAgewpAQCAtNTUxOSw3ICs1NDkzLDYgQEAKIAlpZiAoZ2V0X2JhZF9vcHQoZWFwLT5jbWQgKyBiYWRfY2hhcl9pZHgsIGVhcCkgPT0gRkFJTCkKIAkgICAgcmV0dXJuIEZBSUw7CiAgICAgfQotI2VuZGlmCiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC02NTA3LDE0ICs2NDgwLDEwIEBACiAJfQogCWVsc2UKIAl7Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBpbnQgY2hhcmxlbiA9ICgqbWJfcHRyMmxlbikocCk7CisKIAkgICAgbGVuICs9IGNoYXJsZW47CiAJICAgIHAgKz0gY2hhcmxlbjsKLSNlbHNlCi0JICAgICsrbGVuOwotCSAgICArK3A7Ci0jZW5kaWYKIAl9CiAgICAgfQogCkBAIC02Njg1LDEzICs2NjU0LDExIEBACiAJICAgIHJlc3VsdCA9IFNUUkxFTihlYXAtPmFyZykgKyAyOwogCSAgICBmb3IgKHAgPSBlYXAtPmFyZzsgKnA7ICsrcCkKIAkgICAgewotI2lmZGVmICBGRUFUX01CWVRFCiAJCWlmIChlbmNfZGJjcyAhPSAwICYmICgqbWJfcHRyMmxlbikocCkgPT0gMikKIAkJICAgIC8qIERCQ1MgY2FuIGNvbnRhaW4gXCBpbiBhIHRyYWlsIGJ5dGUsIHNraXAgdGhlCiAJCSAgICAgKiBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIuICovCiAJCSAgICArK3A7CiAJCWVsc2UKLSNlbmRpZgogCQkgICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICciJykKIAkJICAgICsrcmVzdWx0OwogCSAgICB9CkBAIC02NzAxLDEzICs2NjY4LDExIEBACiAJCSpidWYrKyA9ICciJzsKIAkJZm9yIChwID0gZWFwLT5hcmc7ICpwOyArK3ApCiAJCXsKLSNpZmRlZiAgRkVBVF9NQllURQogCQkgICAgaWYgKGVuY19kYmNzICE9IDAgJiYgKCptYl9wdHIybGVuKShwKSA9PSAyKQogCQkJLyogREJDUyBjYW4gY29udGFpbiBcIGluIGEgdHJhaWwgYnl0ZSwgY29weSB0aGUKIAkJCSAqIGRvdWJsZS1ieXRlIGNoYXJhY3RlciB0byBhdm9pZCBlc2NhcGluZy4gKi8KIAkJCSpidWYrKyA9ICpwKys7CiAJCSAgICBlbHNlCi0jZW5kaWYKIAkJCSBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnIicpCiAJCQkqYnVmKysgPSAnXFwnOwogCQkgICAgKmJ1ZisrID0gKnA7CkBAIC0xMDMyOCwxMSArMTAyOTMsOSBAQAogZXhfbm9ybWFsKGV4YXJnX1QgKmVhcCkKIHsKICAgICBzYXZlX3N0YXRlX1Qgc2F2ZV9zdGF0ZTsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2hhcl91CSphcmcgPSBOVUxMOwogICAgIGludAkJbDsKICAgICBjaGFyX3UJKnA7Ci0jZW5kaWYKIAogICAgIGlmIChleF9ub3JtYWxfbG9jayA+IDApCiAgICAgewpAQCAtMTAzNDUsNyArMTAzMDgsNiBAQAogCXJldHVybjsKICAgICB9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgLyoKICAgICAgKiB2Z2V0YygpIGV4cGVjdHMgYSBDU0kgYW5kIEtfU1BFQ0lBTCB0byBoYXZlIGJlZW4gZXNjYXBlZC4gIERvbid0IGRvCiAgICAgICogdGhpcyBmb3IgdGhlIEtfU1BFQ0lBTCBsZWFkaW5nIGJ5dGUsIG90aGVyd2lzZSBzcGVjaWFsIGtleXMgd2lsbCBub3QKQEAgLTEwMzU4LDE1ICsxMDMyMCwxNSBAQAogCS8qIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlc2NhcGVkLiAqLwogCWZvciAocCA9IGVhcC0+YXJnOyAqcCAhPSBOVUw7ICsrcCkKIAl7Ci0jIGlmZGVmIEZFQVRfR1VJCisjaWZkZWYgRkVBVF9HVUkKIAkgICAgaWYgKCpwID09IENTSSkgIC8qIGxlYWRieXRlIENTSSAqLwogCQlsZW4gKz0gMjsKLSMgZW5kaWYKKyNlbmRpZgogCSAgICBmb3IgKGwgPSAoKm1iX3B0cjJsZW4pKHApIC0gMTsgbCA+IDA7IC0tbCkKIAkJaWYgKCorK3AgPT0gS19TUEVDSUFMCSAgLyogdHJhaWxieXRlIEtfU1BFQ0lBTCBvciBDU0kgKi8KLSMgaWZkZWYgRkVBVF9HVUkKKyNpZmRlZiBGRUFUX0dVSQogCQkJfHwgKnAgPT0gQ1NJCi0jIGVuZGlmCisjZW5kaWYKIAkJCSkKIAkJICAgIGxlbiArPSAyOwogCX0KQEAgLTEwMzc5LDEzICsxMDM0MSwxMyBAQAogCQlmb3IgKHAgPSBlYXAtPmFyZzsgKnAgIT0gTlVMOyArK3ApCiAJCXsKIAkJICAgIGFyZ1tsZW4rK10gPSAqcDsKLSMgaWZkZWYgRkVBVF9HVUkKKyNpZmRlZiBGRUFUX0dVSQogCQkgICAgaWYgKCpwID09IENTSSkKIAkJICAgIHsKIAkJCWFyZ1tsZW4rK10gPSBLU19FWFRSQTsKIAkJCWFyZ1tsZW4rK10gPSAoaW50KUtFX0NTSTsKIAkJICAgIH0KLSMgZW5kaWYKKyNlbmRpZgogCQkgICAgZm9yIChsID0gKCptYl9wdHIybGVuKShwKSAtIDE7IGwgPiAwOyAtLWwpCiAJCSAgICB7CiAJCQlhcmdbbGVuKytdID0gKisrcDsKQEAgLTEwMzk0LDIwICsxMDM1NiwxOSBAQAogCQkJICAgIGFyZ1tsZW4rK10gPSBLU19TUEVDSUFMOwogCQkJICAgIGFyZ1tsZW4rK10gPSBLRV9GSUxMRVI7CiAJCQl9Ci0jIGlmZGVmIEZFQVRfR1VJCisjaWZkZWYgRkVBVF9HVUkKIAkJCWVsc2UgaWYgKCpwID09IENTSSkKIAkJCXsKIAkJCSAgICBhcmdbbGVuKytdID0gS1NfRVhUUkE7CiAJCQkgICAgYXJnW2xlbisrXSA9IChpbnQpS0VfQ1NJOwogCQkJfQotIyBlbmRpZgorI2VuZGlmCiAJCSAgICB9CiAJCSAgICBhcmdbbGVuXSA9IE5VTDsKIAkJfQogCSAgICB9CiAJfQogICAgIH0KLSNlbmRpZgogCiAgICAgKytleF9ub3JtYWxfYnVzeTsKICAgICBpZiAoc2F2ZV9jdXJyZW50X3N0YXRlKCZzYXZlX3N0YXRlKSkKQEAgLTEwNDI2LDExICsxMDM4Nyw5IEBACiAJCWNoZWNrX2N1cnNvcl9tb3ZlZChjdXJ3aW4pOwogCSAgICB9CiAKLQkgICAgZXhlY19ub3JtYWxfY21kKAotI2lmZGVmIEZFQVRfTUJZVEUKLQkJICAgIGFyZyAhPSBOVUxMID8gYXJnIDoKLSNlbmRpZgotCQkgICAgZWFwLT5hcmcsIGVhcC0+Zm9yY2VpdCA/IFJFTUFQX05PTkUgOiBSRU1BUF9ZRVMsIEZBTFNFKTsKKwkgICAgZXhlY19ub3JtYWxfY21kKGFyZyAhPSBOVUxMCisJCSAgICAgPyBhcmcKKwkJICAgICA6IGVhcC0+YXJnLCBlYXAtPmZvcmNlaXQgPyBSRU1BUF9OT05FIDogUkVNQVBfWUVTLCBGQUxTRSk7CiAJfQogCXdoaWxlIChlYXAtPmFkZHJfY291bnQgPiAwICYmIGVhcC0+bGluZTEgPD0gZWFwLT5saW5lMiAmJiAhZ290X2ludCk7CiAgICAgfQpAQCAtMTA0NDcsOSArMTA0MDYsNyBAQAogICAgIHVpX2N1cnNvcl9zaGFwZSgpOwkJLyogbWF5IHNob3cgZGlmZmVyZW50IGN1cnNvciBzaGFwZSAqLwogI2VuZGlmCiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgdmltX2ZyZWUoYXJnKTsKLSNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2V4X2dldGxuLmMgYi9zcmMvZXhfZ2V0bG4uYwppbmRleCBmN2RmYzMyLi43MTM2OTY4IDEwMDY0NAotLS0gYS9zcmMvZXhfZ2V0bG4uYworKysgYi9zcmMvZXhfZ2V0bG4uYwpAQCAtODksOSArODksNyBAQAogc3RhdGljIGludAljbWRsaW5lX2NoYXJzaXplKGludCBpZHgpOwogc3RhdGljIHZvaWQJc2V0X2NtZHNwb3Modm9pZCk7CiBzdGF0aWMgdm9pZAlzZXRfY21kc3Bvc19jdXJzb3Iodm9pZCk7Ci0jaWZkZWYgRkVBVF9NQllURQogc3RhdGljIHZvaWQJY29ycmVjdF9jbWRzcG9zKGludCBpZHgsIGludCBjZWxscyk7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkCWFsbG9jX2NtZGJ1ZmYoaW50IGxlbik7CiBzdGF0aWMgaW50CXJlYWxsb2NfY21kYnVmZihpbnQgbGVuKTsKIHN0YXRpYyB2b2lkCWRyYXdfY21kbGluZShpbnQgc3RhcnQsIGludCBsZW4pOwpAQCAtNzY5LDcgKzc2Nyw2IEBACiAJCSAgICBzdHVmZmNoYXJSZWFkYnVmZigqYyk7CiAJCSAgICAqYyA9ICdcXCc7CiAJCX0KLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8vIGFkZCBhbnkgY29tcG9zaW5nIGNoYXJhY3RlcnMKIAkJaWYgKG1iX2NoYXIybGVuKCpjKSAhPSBtYl9wdHIybGVuKG1sX2dldF9jdXJzb3IoKSkpCiAJCXsKQEAgLTc4Myw3ICs3ODAsNiBAQAogCQkgICAgfQogCQkgICAgKmMgPSBzYXZlX2M7CiAJCX0KLSNlbmRpZgogCQlyZXR1cm4gRkFJTDsKIAkgICAgfQogCX0KQEAgLTEyNTMsMTAgKzEyNDksOCBAQAogCQlpID0gKGludCkoeHBjLnhwX3BhdHRlcm4gLSBjY2xpbmUuY21kYnVmZik7CiAJCXdoaWxlICgtLWogPiBpKQogCQl7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJCWogLT0gKCptYl9oZWFkX29mZikoY2NsaW5lLmNtZGJ1ZmYsIGNjbGluZS5jbWRidWZmICsgaik7Ci0jZW5kaWYKIAkJICAgIGlmICh2aW1faXNwYXRoc2VwKGNjbGluZS5jbWRidWZmW2pdKSkKIAkJICAgIHsKIAkJCWZvdW5kID0gVFJVRTsKQEAgLTEyODEsMTAgKzEyNzUsOCBAQAogCQlpID0gKGludCkoeHBjLnhwX3BhdHRlcm4gLSBjY2xpbmUuY21kYnVmZik7CiAJCXdoaWxlICgtLWogPiBpKQogCQl7Ci0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgaWYgKGhhc19tYnl0ZSkKIAkJCWogLT0gKCptYl9oZWFkX29mZikoY2NsaW5lLmNtZGJ1ZmYsIGNjbGluZS5jbWRidWZmICsgaik7Ci0jZW5kaWYKIAkJICAgIGlmICh2aW1faXNwYXRoc2VwKGNjbGluZS5jbWRidWZmW2pdKQogI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQogCQkJICAgICYmIHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIgKj9be2AkJSMiLApAQCAtMTYxNiwxOCArMTYwOCwxNSBAQAogCQkgKi8KIAkJaWYgKGMgPT0gS19ERUwgJiYgY2NsaW5lLmNtZHBvcyAhPSBjY2xpbmUuY21kbGVuKQogCQkgICAgKytjY2xpbmUuY21kcG9zOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaWYgKGhhc19tYnl0ZSAmJiBjID09IEtfREVMKQogCQkgICAgY2NsaW5lLmNtZHBvcyArPSBtYl9vZmZfbmV4dChjY2xpbmUuY21kYnVmZiwKIAkJCQkJICAgICAgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKLSNlbmRpZgogCQlpZiAoY2NsaW5lLmNtZHBvcyA+IDApCiAJCXsKIAkJICAgIGNoYXJfdSAqcDsKIAogCQkgICAgaiA9IGNjbGluZS5jbWRwb3M7CiAJCSAgICBwID0gY2NsaW5lLmNtZGJ1ZmYgKyBqOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGlmIChoYXNfbWJ5dGUpCiAJCSAgICB7CiAJCQlwID0gbWJfcHJldnB0cihjY2xpbmUuY21kYnVmZiwgcCk7CkBAIC0xNjQyLDkgKzE2MzEsNyBAQAogCQkJCXAgKz0gKCptYl9wdHIybGVuKShwKTsKIAkJCX0KIAkJICAgIH0KLQkJICAgIGVsc2UKLSNlbmRpZgotCQkJaWYgKGMgPT0gQ3RybF9XKQorCQkgICAgZWxzZSBpZiAoYyA9PSBDdHJsX1cpCiAJCSAgICB7CiAJCQl3aGlsZSAocCA+IGNjbGluZS5jbWRidWZmICYmIHZpbV9pc3NwYWNlKHBbLTFdKSkKIAkJCSAgICAtLXA7CkBAIC0xODkzLDIxICsxODgwLDE3IEBACiAJCSAgICBpZiAoS2V5VHlwZWQgJiYgY2NsaW5lLmNtZHNwb3MgKyBpID49IENvbHVtbnMgKiBSb3dzKQogCQkJYnJlYWs7CiAJCSAgICBjY2xpbmUuY21kc3BvcyArPSBpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGlmIChoYXNfbWJ5dGUpCiAJCQljY2xpbmUuY21kcG9zICs9ICgqbWJfcHRyMmxlbikoY2NsaW5lLmNtZGJ1ZmYKIAkJCQkJCQkgICAgICsgY2NsaW5lLmNtZHBvcyk7CiAJCSAgICBlbHNlCi0jZW5kaWYKIAkJCSsrY2NsaW5lLmNtZHBvczsKIAkJfQogCQl3aGlsZSAoKGMgPT0gS19TX1JJR0hUIHx8IGMgPT0gS19DX1JJR0hUCiAJCQkgICAgICAgfHwgKG1vZF9tYXNrICYgKE1PRF9NQVNLX1NISUZUfE1PRF9NQVNLX0NUUkwpKSkKIAkJCSYmIGNjbGluZS5jbWRidWZmW2NjbGluZS5jbWRwb3NdICE9ICcgJyk7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQkgICAgc2V0X2NtZHNwb3NfY3Vyc29yKCk7Ci0jZW5kaWYKIAkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOwogCiAJY2FzZSBLX0xFRlQ6CkBAIC0xOTE4LDIxICsxOTAxLDE3IEBACiAJCWRvCiAJCXsKIAkJICAgIC0tY2NsaW5lLmNtZHBvczsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCSAgICBpZiAoaGFzX21ieXRlKQkvKiBtb3ZlIHRvIGZpcnN0IGJ5dGUgb2YgY2hhciAqLwogCQkJY2NsaW5lLmNtZHBvcyAtPSAoKm1iX2hlYWRfb2ZmKShjY2xpbmUuY21kYnVmZiwKIAkJCQkJICAgICAgY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKTsKLSNlbmRpZgogCQkgICAgY2NsaW5lLmNtZHNwb3MgLT0gY21kbGluZV9jaGFyc2l6ZShjY2xpbmUuY21kcG9zKTsKIAkJfQogCQl3aGlsZSAoY2NsaW5lLmNtZHBvcyA+IDAKIAkJCSYmIChjID09IEtfU19MRUZUIHx8IGMgPT0gS19DX0xFRlQKIAkJCSAgICAgICB8fCAobW9kX21hc2sgJiAoTU9EX01BU0tfU0hJRlR8TU9EX01BU0tfQ1RSTCkpKQogCQkJJiYgY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZHBvcyAtIDFdICE9ICcgJyk7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQkgICAgc2V0X2NtZHNwb3NfY3Vyc29yKCk7Ci0jZW5kaWYKIAkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOwogCiAJY2FzZSBLX0lHTk9SRToKQEAgLTIwMzAsNyArMjAwOSw2IEBACiAJCSAgICBpZiAobW91c2Vfcm93IDw9IGNtZGxpbmVfcm93ICsgY2NsaW5lLmNtZHNwb3MgLyBDb2x1bW5zCiAJCQkJICAmJiBtb3VzZV9jb2wgPCBjY2xpbmUuY21kc3BvcyAlIENvbHVtbnMgKyBpKQogCQkJYnJlYWs7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGlmIChoYXNfbWJ5dGUpCiAJCSAgICB7CiAJCQkvKiBDb3VudCAiPiIgZm9yIGRvdWJsZS13aWRlIGNoYXIgdGhhdCBkb2Vzbid0IGZpdC4gKi8KQEAgLTIwMzgsNyArMjAxNiw2IEBACiAJCQljY2xpbmUuY21kcG9zICs9ICgqbWJfcHRyMmxlbikoY2NsaW5lLmNtZGJ1ZmYKIAkJCQkJCQkgKyBjY2xpbmUuY21kcG9zKSAtIDE7CiAJCSAgICB9Ci0jIGVuZGlmCiAJCSAgICBjY2xpbmUuY21kc3BvcyArPSBpOwogCQl9CiAJCWdvdG8gY21kbGluZV9ub3RfY2hhbmdlZDsKQEAgLTIzMDEsNyArMjI3OCw2IEBACiAJCWMgPSBnZXRfbGl0ZXJhbCgpOwkgICAgLyogZ2V0IG5leHQgKHR3bykgY2hhcmFjdGVyKHMpICovCiAJCWRvX2FiYnIgPSBGQUxTRTsJICAgIC8qIGRvbid0IGRvIGFiYnJldmlhdGlvbiBub3cgKi8KIAkJZXh0cmFfY2hhciA9IE5VTDsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8qIG1heSBuZWVkIHRvIHJlbW92ZSBeIHdoZW4gY29tcG9zaW5nIGNoYXIgd2FzIHR5cGVkICovCiAJCWlmIChlbmNfdXRmOCAmJiB1dGZfaXNjb21wb3NpbmcoYykgJiYgIWNtZF9zaWxlbnQpCiAJCXsKQEAgLTIzMDksNyArMjI4NSw2IEBACiAJCSAgICBtc2dfcHV0Y2hhcignICcpOwogCQkgICAgY3Vyc29yY21kKCk7CiAJCX0KLSNlbmRpZgogCQlicmVhazsKIAogI2lmZGVmIEZFQVRfRElHUkFQSFMKQEAgLTIzNzQsMTMgKzIzNDksMTIgQEAKIAkgKiBXZSBjb21lIGhlcmUgaWYgd2UgaGF2ZSBhIG5vcm1hbCBjaGFyYWN0ZXIuCiAJICovCiAKLQlpZiAoZG9fYWJiciAmJiAoSVNfU1BFQ0lBTChjKSB8fCAhdmltX2lzd29yZGMoYykpICYmIChjY2hlY2tfYWJicigKLSNpZmRlZiBGRUFUX01CWVRFCi0JCQkvKiBBZGQgQUJCUl9PRkYgZm9yIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAsIHRoaXMgaXMKLQkJCSAqIHdoYXQgY2hlY2tfYWJicigpIGV4cGVjdHMuICovCi0JCQkoaGFzX21ieXRlICYmIGMgPj0gMHgxMDApID8gKGMgKyBBQkJSX09GRikgOgotI2VuZGlmCi0JCQkJCQkJIGMpIHx8IGMgPT0gQ3RybF9SU0IpKQorCWlmIChkb19hYmJyICYmIChJU19TUEVDSUFMKGMpIHx8ICF2aW1faXN3b3JkYyhjKSkKKwkJJiYgKGNjaGVja19hYmJyKAorCQkJLy8gQWRkIEFCQlJfT0ZGIGZvciBjaGFyYWN0ZXJzIGFib3ZlIDB4MTAwLCB0aGlzIGlzCisJCQkvLyB3aGF0IGNoZWNrX2FiYnIoKSBleHBlY3RzLgorCQkJCShoYXNfbWJ5dGUgJiYgYyA+PSAweDEwMCkgPyAoYyArIEFCQlJfT0ZGKSA6IGMpCisJCSAgICB8fCBjID09IEN0cmxfUlNCKSkKIAkgICAgZ290byBjbWRsaW5lX2NoYW5nZWQ7CiAKIAkvKgpAQCAtMjM5MCw3ICsyMzY0LDYgQEAKIAkgICAgcHV0X29uX2NtZGxpbmUoZ2V0X3NwZWNpYWxfa2V5X25hbWUoYywgbW9kX21hc2spLCAtMSwgVFJVRSk7CiAJZWxzZQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJaiA9ICgqbWJfY2hhcjJieXRlcykoYywgSU9idWZmKTsKQEAgLTIzOTgsNyArMjM3MSw2IEBACiAJCXB1dF9vbl9jbWRsaW5lKElPYnVmZiwgaiwgVFJVRSk7CiAJICAgIH0KIAkgICAgZWxzZQotI2VuZGlmCiAJICAgIHsKIAkJSU9idWZmWzBdID0gYzsKIAkJcHV0X29uX2NtZGxpbmUoSU9idWZmLCAxLCBUUlVFKTsKQEAgLTI2ODcsMTEgKzI2NTksOSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBjY2xpbmUuY21kbGVuICYmIGkgPCBjY2xpbmUuY21kcG9zOyArK2kpCiAgICAgewogCWMgPSBjbWRsaW5lX2NoYXJzaXplKGkpOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkvKiBDb3VudCAiPiIgZm9yIGRvdWJsZS13aWRlIG11bHRpLWJ5dGUgY2hhciB0aGF0IGRvZXNuJ3QgZml0LiAqLwogCWlmIChoYXNfbWJ5dGUpCiAJICAgIGNvcnJlY3RfY21kc3BvcyhpLCBjKTsKLSNlbmRpZgogCS8qIElmIHRoZSBjbWRsaW5lIGRvZXNuJ3QgZml0LCBzaG93IGN1cnNvciBvbiBsYXN0IHZpc2libGUgY2hhci4KIAkgKiBEb24ndCBtb3ZlIHRoZSBjdXJzb3IgaXRzZWxmLCBzbyB3ZSBjYW4gc3RpbGwgYXBwZW5kLiAqLwogCWlmICgoY2NsaW5lLmNtZHNwb3MgKz0gYykgPj0gbSkKQEAgLTI2OTksMTQgKzI2NjksMTEgQEAKIAkgICAgY2NsaW5lLmNtZHNwb3MgLT0gYzsKIAkgICAgYnJlYWs7CiAJfQotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoaGFzX21ieXRlKQogCSAgICBpICs9ICgqbWJfcHRyMmxlbikoY2NsaW5lLmNtZGJ1ZmYgKyBpKSAtIDE7Ci0jZW5kaWYKICAgICB9CiB9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAvKgogICogQ2hlY2sgaWYgdGhlIGNoYXJhY3RlciBhdCAiaWR4Iiwgd2hpY2ggaXMgImNlbGxzIiB3aWRlLCBpcyBhIG11bHRpLWJ5dGUKICAqIGNoYXJhY3RlciB0aGF0IGRvZXNuJ3QgZml0LCBzbyB0aGF0IGEgIj4iIG11c3QgYmUgZGlzcGxheWVkLgpAQCAtMjcxOSw3ICsyNjg2LDYgQEAKIAkJJiYgY2NsaW5lLmNtZHNwb3MgJSBDb2x1bW5zICsgY2VsbHMgPiBDb2x1bW5zKQogCWNjbGluZS5jbWRzcG9zKys7CiB9Ci0jZW5kaWYKIAogLyoKICAqIEdldCBhbiBFeCBjb21tYW5kIGxpbmUgZm9yIHRoZSAiOiIgY29tbWFuZC4KQEAgLTI4NDksNyArMjgxNSw2IEBACiAJICAgIHsKIAkJaWYgKGxpbmVfZ2EuZ2FfbGVuID4gMCkKIAkJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGlmIChoYXNfbWJ5dGUpCiAJCSAgICB7CiAJCQlwID0gKGNoYXJfdSAqKWxpbmVfZ2EuZ2FfZGF0YTsKQEAgLTI4NTgsNyArMjgyMyw2IEBACiAJCQlsaW5lX2dhLmdhX2xlbiAtPSBsZW47CiAJCSAgICB9CiAJCSAgICBlbHNlCi0jZW5kaWYKIAkJCS0tbGluZV9nYS5nYV9sZW47CiAJCSAgICBnb3RvIHJlZHJhdzsKIAkJfQpAQCAtMjk2MiwxMiArMjkyNiwxMCBAQAogCiAJaWYgKElTX1NQRUNJQUwoYzEpKQogCSAgICBjMSA9ICc/JzsKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKIAkgICAgbGVuID0gKCptYl9jaGFyMmJ5dGVzKShjMSwKIAkJCQkgIChjaGFyX3UgKilsaW5lX2dhLmdhX2RhdGEgKyBsaW5lX2dhLmdhX2xlbik7CiAJZWxzZQotI2VuZGlmCiAJewogCSAgICBsZW4gPSAxOwogCSAgICAoKGNoYXJfdSAqKWxpbmVfZ2EuZ2FfZGF0YSlbbGluZV9nYS5nYV9sZW5dID0gYzE7CkBAIC0zMDcwLDcgKzMwMzIsNiBAQAogICAgIGlmIChjY2xpbmUuY21kYnVmZiA9PSBOVUxMIHx8IGNjbGluZS5jbWRwb3MgPiBjY2xpbmUuY21kbGVuKQogCXJldHVybiBNQVhDT0w7CiAKLSMgaWZkZWYgRkVBVF9NQllURQogICAgIGlmIChoYXNfbWJ5dGUpCiAgICAgewogCWNvbG5yX1QJY29sOwpAQCAtMzA4Miw3ICszMDQzLDYgQEAKIAlyZXR1cm4gY29sOwogICAgIH0KICAgICBlbHNlCi0jIGVuZGlmCiAJcmV0dXJuIGNjbGluZS5jbWRwb3M7CiB9CiAjZW5kaWYKQEAgLTMxMTEsNyArMzA3MSw2IEBACiAJb2xkX2NvbCA9IG1zZ19jb2w7CiAJY21kc3BvcyA9ICgoY2NsaW5lLmNtZGZpcnN0YyAhPSBOVUwpID8gMSA6IDApICsgY2NsaW5lLmNtZGluZGVudDsKIAotIyBpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKIAl7CiAJICAgIGZvciAoY29sID0gMDsgY29sIDwgcHJlZWRpdF9zdGFydF9jb2wKQEAgLTMxMjIsNyArMzA4MSw2IEBACiAJICAgIH0KIAl9CiAJZWxzZQotIyBlbmRpZgogCXsKIAkgICAgY21kc3BvcyArPSBwcmVlZGl0X3N0YXJ0X2NvbDsKIAkgICAgY21kcG9zICArPSBwcmVlZGl0X3N0YXJ0X2NvbDsKQEAgLTMxNDIsMTEgKzMxMDAsOSBAQAogCSAgICBpZiAoY2hhcl9hdHRyIDwgMCkKIAkJYnJlYWs7IC8qIGVuZCBvZiBwcmVlZGl0IHN0cmluZyAqLwogCi0jIGlmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJY2hhcl9sZW4gPSAoKm1iX3B0cjJsZW4pKGNjbGluZS5jbWRidWZmICsgY21kcG9zKTsKIAkgICAgZWxzZQotIyBlbmRpZgogCQljaGFyX2xlbiA9IDE7CiAKIAkgICAgbXNnX291dHRyYW5zX2xlbl9hdHRyKGNjbGluZS5jbWRidWZmICsgY21kcG9zLCBjaGFyX2xlbiwgY2hhcl9hdHRyKTsKQEAgLTMyNDUsMTAgKzMyMDEsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKIAl7CiAJICAgIG1zZ19wdXRjaGFyKCcqJyk7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkJaSArPSAoKm1iX3B0cjJsZW4pKGNjbGluZS5jbWRidWZmICsgc3RhcnQgKyBpKSAtIDE7Ci0jIGVuZGlmCiAJfQogICAgIGVsc2UKICNlbmRpZgpAQCAtMzM4MiwxMSArMzMzNiw5IEBACiAgICAgbXNnX25vX21vcmUgPSBUUlVFOwogICAgIGlmIChjY2xpbmUuY21kbGVuID09IGNjbGluZS5jbWRwb3MpCiAJbXNnX3B1dGNoYXIoJyAnKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgZWxzZSBpZiAoaGFzX21ieXRlKQogCWRyYXdfY21kbGluZShjY2xpbmUuY21kcG9zLAogCQkJICAgICAgICgqbWJfcHRyMmxlbikoY2NsaW5lLmNtZGJ1ZmYgKyBjY2xpbmUuY21kcG9zKSk7Ci0jZW5kaWYKICAgICBlbHNlCiAJZHJhd19jbWRsaW5lKGNjbGluZS5jbWRwb3MsIDEpOwogICAgIG1zZ19ub19tb3JlID0gRkFMU0U7CkBAIC0zNDI5LDcgKzMzODEsNiBAQAogCX0KIAllbHNlCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSkKIAkgICAgewogCQkvKiBDb3VudCBuciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgc3RyaW5nLiAqLwpAQCAtMzQ1MCwxNSArMzQwMSwxMiBAQAogCQllbHNlCiAJCSAgICBjY2xpbmUuY21kbGVuID0gY2NsaW5lLmNtZHBvcyArIGxlbjsKIAkgICAgfQotCSAgICBlbHNlCi0jZW5kaWYKLQkgICAgaWYgKGNjbGluZS5jbWRwb3MgKyBsZW4gPiBjY2xpbmUuY21kbGVuKQorCSAgICBlbHNlIGlmIChjY2xpbmUuY21kcG9zICsgbGVuID4gY2NsaW5lLmNtZGxlbikKIAkJY2NsaW5lLmNtZGxlbiA9IGNjbGluZS5jbWRwb3MgKyBsZW47CiAJfQogCW1jaF9tZW1tb3ZlKGNjbGluZS5jbWRidWZmICsgY2NsaW5lLmNtZHBvcywgc3RyLCAoc2l6ZV90KWxlbik7CiAJY2NsaW5lLmNtZGJ1ZmZbY2NsaW5lLmNtZGxlbl0gPSBOVUw7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGVuY191dGY4KQogCXsKIAkgICAgLyogV2hlbiB0aGUgaW5zZXJ0ZWQgdGV4dCBzdGFydHMgd2l0aCBhIGNvbXBvc2luZyBjaGFyYWN0ZXIsCkBAIC0zNDc0LDcgKzM0MjIsNyBAQAogCQlsZW4gKz0gaTsKIAkJYyA9IHV0Zl9wdHIyY2hhcihjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3MpOwogCSAgICB9Ci0jIGlmZGVmIEZFQVRfQVJBQklDCisjaWZkZWYgRkVBVF9BUkFCSUMKIAkgICAgaWYgKGkgPT0gMCAmJiBjY2xpbmUuY21kcG9zID4gMCAmJiBhcmFiaWNfbWF5Y29tYmluZShjKSkKIAkgICAgewogCQkvKiBDaGVjayB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZvciBBcmFiaWMgY29tYmluaW5nIHBhaXIuICovCkBAIC0zNDg5LDcgKzM0MzcsNyBAQAogCQllbHNlCiAJCSAgICBpID0gMDsKIAkgICAgfQotIyBlbmRpZgorI2VuZGlmCiAJICAgIGlmIChpICE9IDApCiAJICAgIHsKIAkJLyogQWxzbyBiYWNrdXAgdGhlIGN1cnNvciBwb3NpdGlvbi4gKi8KQEAgLTM1MDMsNyArMzQ1MSw2IEBACiAJCX0KIAkgICAgfQogCX0KLSNlbmRpZgogCiAJaWYgKHJlZHJhdyAmJiAhY21kX3NpbGVudCkKIAl7CkBAIC0zNTM1LDE3ICszNDgyLDE1IEBACiAJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKIAkgICAgewogCQljID0gY21kbGluZV9jaGFyc2l6ZShjY2xpbmUuY21kcG9zKTsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8qIGNvdW50ICI+IiBmb3IgYSBkb3VibGUtd2lkZSBjaGFyIHRoYXQgZG9lc24ndCBmaXQuICovCiAJCWlmIChoYXNfbWJ5dGUpCiAJCSAgICBjb3JyZWN0X2NtZHNwb3MoY2NsaW5lLmNtZHBvcywgYyk7Ci0jZW5kaWYKIAkJLyogU3RvcCBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgc2NyZWVuLCBidXQgZG8gaW5jcmVtZW50IHRoZQogCQkgKiBpbnNlcnQgcG9zaXRpb24sIHNvIHRoYXQgZW50ZXJpbmcgYSB2ZXJ5IGxvbmcgY29tbWFuZAogCQkgKiB3b3JrcywgZXZlbiB0aG91Z2ggeW91IGNhbid0IHNlZSBpdC4gKi8KIAkJaWYgKGNjbGluZS5jbWRzcG9zICsgYyA8IG0pCiAJCSAgICBjY2xpbmUuY21kc3BvcyArPSBjOwotI2lmZGVmIEZFQVRfTUJZVEUKKwogCQlpZiAoaGFzX21ieXRlKQogCQl7CiAJCSAgICBjID0gKCptYl9wdHIybGVuKShjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3MpIC0gMTsKQEAgLTM1NTQsNyArMzQ5OSw2IEBACiAJCSAgICBjY2xpbmUuY21kcG9zICs9IGM7CiAJCSAgICBpICs9IGM7CiAJCX0KLSNlbmRpZgogCQkrK2NjbGluZS5jbWRwb3M7CiAJICAgIH0KIAl9CkBAIC0zNjU0LDcgKzM1OTgsNiBAQAogCSAgICAvKiBMb2NhdGUgc3RhcnQgb2YgbGFzdCB3b3JkIGluIHRoZSBjbWQgYnVmZmVyLiAqLwogCSAgICBmb3IgKHcgPSBjY2xpbmUuY21kYnVmZiArIGNjbGluZS5jbWRwb3M7IHcgPiBjY2xpbmUuY21kYnVmZjsgKQogCSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAoaGFzX21ieXRlKQogCQl7CiAJCSAgICBsZW4gPSAoKm1iX2hlYWRfb2ZmKShjY2xpbmUuY21kYnVmZiwgdyAtIDEpICsgMTsKQEAgLTM2NjMsNyArMzYwNiw2IEBACiAJCSAgICB3IC09IGxlbjsKIAkJfQogCQllbHNlCi0jZW5kaWYKIAkJewogCQkgICAgaWYgKCF2aW1faXN3b3JkYyh3Wy0xXSkpCiAJCQlicmVhazsKQEAgLTM3MDMsMTEgKzM2NDUsOSBAQAogCSAgICBjdiA9ICpzOwogCSAgICBpZiAoY3YgPT0gQ3RybF9WICYmIHNbMV0pCiAJCSsrczsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJCWMgPSBtYl9jcHRyMmNoYXJfYWR2KCZzKTsKIAkgICAgZWxzZQotI2VuZGlmCiAJCWMgPSAqcysrOwogCSAgICBpZiAoY3YgPT0gQ3RybF9WIHx8IGMgPT0gRVNDIHx8IGMgPT0gQ3RybF9DCiAJCSAgICB8fCBjID09IENBUiB8fCBjID09IE5MIHx8IGMgPT0gQ3RybF9MCkBAIC00MjM3LDIyICs0MTc3LDE4IEBACiAKIAlmb3IgKGxlbiA9IDA7IHhwLT54cF9maWxlc1swXVtsZW5dOyBsZW4gKz0gbWJfbGVuKQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIGlmIChoYXNfbWJ5dGUpCiAJICAgIHsKIAkJbWJfbGVuID0gKCptYl9wdHIybGVuKSgmeHAtPnhwX2ZpbGVzWzBdW2xlbl0pOwogCQljMCA9KCogbWJfcHRyMmNoYXIpKCZ4cC0+eHBfZmlsZXNbMF1bbGVuXSk7CiAJICAgIH0KIAkgICAgZWxzZQotI2VuZGlmCiAJCWMwID0geHAtPnhwX2ZpbGVzWzBdW2xlbl07CiAJICAgIGZvciAoaSA9IDE7IGkgPCB4cC0+eHBfbnVtZmlsZXM7ICsraSkKIAkgICAgewotI2lmZGVmIEZFQVRfTUJZVEUKIAkJaWYgKGhhc19tYnl0ZSkKIAkJICAgIGNpID0oKiBtYl9wdHIyY2hhcikoJnhwLT54cF9maWxlc1tpXVtsZW5dKTsKIAkJZWxzZQotI2VuZGlmCiAJCSAgICBjaSA9IHhwLT54cF9maWxlc1tpXVtsZW5dOwogCQlpZiAocF9maWMgJiYgKHhwLT54cF9jb250ZXh0ID09IEVYUEFORF9ESVJFQ1RPUklFUwogCQkJfHwgeHAtPnhwX2NvbnRleHQgPT0gRVhQQU5EX0ZJTEVTCmRpZmYgLS1naXQgYS9zcmMvZmlsZWlvLmMgYi9zcmMvZmlsZWlvLmMKaW5kZXggZGZlMWVmOS4uYWE4NGU5YiAxMDA2NDQKLS0tIGEvc3JjL2ZpbGVpby5jCisrKyBiL3NyYy9maWxlaW8uYwpAQCAtMjcsMTEgKzI3LDkgQEAKIC8qIElzIHRoZXJlIGFueSBzeXN0ZW0gdGhhdCBkb2Vzbid0IGhhdmUgYWNjZXNzKCk/ICovCiAjZGVmaW5lIFVTRV9NQ0hfQUNDRVNTCiAKLSNpZmRlZiBGRUFUX01CWVRFCiBzdGF0aWMgY2hhcl91ICpuZXh0X2ZlbmMoY2hhcl91ICoqcHApOwotIyBpZmRlZiBGRUFUX0VWQUwKKyNpZmRlZiBGRUFUX0VWQUwKIHN0YXRpYyBjaGFyX3UgKnJlYWRmaWxlX2NoYXJjb252ZXJ0KGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqZmVuYywgaW50ICpmZHApOwotIyBlbmRpZgogI2VuZGlmCiAjaWZkZWYgRkVBVF9WSU1JTkZPCiBzdGF0aWMgdm9pZCBjaGVja19tYXJrc19yZWFkKHZvaWQpOwpAQCAtNDcsMzEgKzQ1LDI5IEBACiBzdGF0aWMgaW50IGFwcGx5X2F1dG9jbWRzX2V4YXJnKGV2ZW50X1QgZXZlbnQsIGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqZm5hbWVfaW8sIGludCBmb3JjZSwgYnVmX1QgKmJ1ZiwgZXhhcmdfVCAqZWFwKTsKIHN0YXRpYyBpbnQgYXVfZmluZF9ncm91cChjaGFyX3UgKm5hbWUpOwogCi0jIGRlZmluZSBBVUdST1VQX0RFRkFVTFQgICAgLTEJICAgIC8qIGRlZmF1bHQgYXV0b2NtZCBncm91cCAqLwotIyBkZWZpbmUgQVVHUk9VUF9FUlJPUgkgICAgLTIJICAgIC8qIGVycm9uZW91cyBhdXRvY21kIGdyb3VwICovCi0jIGRlZmluZSBBVUdST1VQX0FMTAkgICAgLTMJICAgIC8qIGFsbCBhdXRvY21kIGdyb3VwcyAqLworI2RlZmluZSBBVUdST1VQX0RFRkFVTFQgICAgLTEJICAgIC8qIGRlZmF1bHQgYXV0b2NtZCBncm91cCAqLworI2RlZmluZSBBVUdST1VQX0VSUk9SCSAgICAtMgkgICAgLyogZXJyb25lb3VzIGF1dG9jbWQgZ3JvdXAgKi8KKyNkZWZpbmUgQVVHUk9VUF9BTEwJICAgIC0zCSAgICAvKiBhbGwgYXV0b2NtZCBncm91cHMgKi8KIAotI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChGRUFUX01CWVRFKQotIyBkZWZpbmUgSEFTX0JXX0ZMQUdTCi0jIGRlZmluZSBGSU9fTEFUSU4xCTB4MDEJLyogY29udmVydCBMYXRpbjEgKi8KLSMgZGVmaW5lIEZJT19VVEY4CTB4MDIJLyogY29udmVydCBVVEYtOCAqLwotIyBkZWZpbmUgRklPX1VDUzIJMHgwNAkvKiBjb252ZXJ0IFVDUy0yICovCi0jIGRlZmluZSBGSU9fVUNTNAkweDA4CS8qIGNvbnZlcnQgVUNTLTQgKi8KLSMgZGVmaW5lIEZJT19VVEYxNgkweDEwCS8qIGNvbnZlcnQgVVRGLTE2ICovCi0jIGlmZGVmIFdJTjMyNjQKLSMgIGRlZmluZSBGSU9fQ09ERVBBR0UJMHgyMAkvKiBjb252ZXJ0IE1TLVdpbmRvd3MgY29kZXBhZ2UgKi8KLSMgIGRlZmluZSBGSU9fUFVUX0NQKHgpICgoKHgpICYgMHhmZmZmKSA8PCAxNikJLyogcHV0IGNvZGVwYWdlIGluIHRvcCB3b3JkICovCi0jICBkZWZpbmUgRklPX0dFVF9DUCh4KQkoKCh4KT4+MTYpICYgMHhmZmZmKQkvKiBnZXQgY29kZXBhZ2UgZnJvbSB0b3Agd29yZCAqLwotIyBlbmRpZgotIyBpZmRlZiBNQUNPU19DT05WRVJUCi0jICBkZWZpbmUgRklPX01BQ1JPTUFOCTB4MjAJLyogY29udmVydCBNYWNSb21hbiAqLwotIyBlbmRpZgotIyBkZWZpbmUgRklPX0VORElBTl9MCTB4ODAJLyogbGl0dGxlIGVuZGlhbiAqLwotIyBkZWZpbmUgRklPX0VOQ1JZUFRFRAkweDEwMDAJLyogZW5jcnlwdCB3cml0dGVuIGJ5dGVzICovCi0jIGRlZmluZSBGSU9fTk9DT05WRVJUCTB4MjAwMAkvKiBza2lwIGVuY29kaW5nIGNvbnZlcnNpb24gKi8KLSMgZGVmaW5lIEZJT19VQ1NCT00JMHg0MDAwCS8qIGNoZWNrIGZvciBCT00gYXQgc3RhcnQgb2YgZmlsZSAqLwotIyBkZWZpbmUgRklPX0FMTAktMQkvKiBhbGxvdyBhbGwgZm9ybWF0cyAqLworI2RlZmluZSBIQVNfQldfRkxBR1MKKyNkZWZpbmUgRklPX0xBVElOMQkweDAxCS8qIGNvbnZlcnQgTGF0aW4xICovCisjZGVmaW5lIEZJT19VVEY4CTB4MDIJLyogY29udmVydCBVVEYtOCAqLworI2RlZmluZSBGSU9fVUNTMgkweDA0CS8qIGNvbnZlcnQgVUNTLTIgKi8KKyNkZWZpbmUgRklPX1VDUzQJMHgwOAkvKiBjb252ZXJ0IFVDUy00ICovCisjZGVmaW5lIEZJT19VVEYxNgkweDEwCS8qIGNvbnZlcnQgVVRGLTE2ICovCisjaWZkZWYgV0lOMzI2NAorIyBkZWZpbmUgRklPX0NPREVQQUdFCTB4MjAJLyogY29udmVydCBNUy1XaW5kb3dzIGNvZGVwYWdlICovCisjIGRlZmluZSBGSU9fUFVUX0NQKHgpICgoKHgpICYgMHhmZmZmKSA8PCAxNikJLyogcHV0IGNvZGVwYWdlIGluIHRvcCB3b3JkICovCisjIGRlZmluZSBGSU9fR0VUX0NQKHgpCSgoKHgpPj4xNikgJiAweGZmZmYpCS8qIGdldCBjb2RlcGFnZSBmcm9tIHRvcCB3b3JkICovCiAjZW5kaWYKKyNpZmRlZiBNQUNPU19DT05WRVJUCisjIGRlZmluZSBGSU9fTUFDUk9NQU4JMHgyMAkvKiBjb252ZXJ0IE1hY1JvbWFuICovCisjZW5kaWYKKyNkZWZpbmUgRklPX0VORElBTl9MCTB4ODAJLyogbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBGSU9fRU5DUllQVEVECTB4MTAwMAkvKiBlbmNyeXB0IHdyaXR0ZW4gYnl0ZXMgKi8KKyNkZWZpbmUgRklPX05PQ09OVkVSVAkweDIwMDAJLyogc2tpcCBlbmNvZGluZyBjb252ZXJzaW9uICovCisjZGVmaW5lIEZJT19VQ1NCT00JMHg0MDAwCS8qIGNoZWNrIGZvciBCT00gYXQgc3RhcnQgb2YgZmlsZSAqLworI2RlZmluZSBGSU9fQUxMCS0xCS8qIGFsbG93IGFsbCBmb3JtYXRzICovCiAKIC8qIFdoZW4gY29udmVydGluZywgYSByZWFkKCkgb3Igd3JpdGUoKSBtYXkgbGVhdmUgc29tZSBieXRlcyB0byBiZSBjb252ZXJ0ZWQKICAqIGZvciB0aGUgbmV4dCBjYWxsLiAgVGhlIHZhbHVlIGlzIGd1ZXNzZWQuLi4gKi8KQEAgLTk1LDcgKzkxLDYgQEAKICNpZmRlZiBGRUFUX0NSWVBUCiAgICAgYnVmX1QJKmJ3X2J1ZmZlcjsJLyogYnVmZmVyIGJlaW5nIHdyaXR0ZW4gKi8KICNlbmRpZgotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBjaGFyX3UJYndfcmVzdFtDT05WX1JFU1RMRU5dOyAvKiBub3QgY29udmVydGVkIGJ5dGVzICovCiAgICAgaW50CQlid19yZXN0bGVuOwkvKiBuciBvZiBieXRlcyBpbiBid19yZXN0W10gKi8KICAgICBpbnQJCWJ3X2ZpcnN0OwkvKiBmaXJzdCB3cml0ZSBjYWxsICovCkBAIC0xMDQsMjcgKzk5LDI0IEBACiAgICAgaW50CQlid19jb252X2Vycm9yOwkvKiBzZXQgZm9yIGNvbnZlcnNpb24gZXJyb3IgKi8KICAgICBsaW5lbnJfVAlid19jb252X2Vycm9yX2xudW07ICAvKiBmaXJzdCBsaW5lIHdpdGggZXJyb3Igb3IgemVybyAqLwogICAgIGxpbmVucl9UCWJ3X3N0YXJ0X2xudW07ICAvKiBsaW5lIG51bWJlciBhdCBzdGFydCBvZiBidWZmZXIgKi8KLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAgICAgaWNvbnZfdAlid19pY29udl9mZDsJLyogZGVzY3JpcHRvciBmb3IgaWNvbnYoKSBvciAtMSAqLwotIyBlbmRpZgogI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50ICBidWZfd3JpdGVfYnl0ZXMoc3RydWN0IGJ3X2luZm8gKmlwKTsKIAotI2lmZGVmIEZFQVRfTUJZVEUKIHN0YXRpYyBsaW5lbnJfVCByZWFkZmlsZV9saW5lbnIobGluZW5yX1QgbGluZWNudCwgY2hhcl91ICpwLCBjaGFyX3UgKmVuZHApOwogc3RhdGljIGludCB1Y3MyYnl0ZXModW5zaWduZWQgYywgY2hhcl91ICoqcHAsIGludCBmbGFncyk7CiBzdGF0aWMgaW50IG5lZWRfY29udmVyc2lvbihjaGFyX3UgKmZlbmMpOwogc3RhdGljIGludCBnZXRfZmlvX2ZsYWdzKGNoYXJfdSAqcHRyKTsKIHN0YXRpYyBjaGFyX3UgKmNoZWNrX2Zvcl9ib20oY2hhcl91ICpwLCBsb25nIHNpemUsIGludCAqbGVucCwgaW50IGZsYWdzKTsKIHN0YXRpYyBpbnQgbWFrZV9ib20oY2hhcl91ICpidWYsIGNoYXJfdSAqbmFtZSk7Ci0jIGlmZGVmIFdJTjMyNjQKKyNpZmRlZiBXSU4zMjY0CiBzdGF0aWMgaW50IGdldF93aW5fZmlvX2ZsYWdzKGNoYXJfdSAqcHRyKTsKLSMgZW5kaWYKLSMgaWZkZWYgTUFDT1NfQ09OVkVSVAorI2VuZGlmCisjaWZkZWYgTUFDT1NfQ09OVkVSVAogc3RhdGljIGludCBnZXRfbWFjX2Zpb19mbGFncyhjaGFyX3UgKnB0cik7Ci0jIGVuZGlmCiAjZW5kaWYKIHN0YXRpYyBjaGFyICplX2F1Y2hhbmdlZGJ1ZiA9IE5fKCJFODEyOiBBdXRvY29tbWFuZHMgY2hhbmdlZCBidWZmZXIgb3IgYnVmZmVyIG5hbWUiKTsKIApAQCAtMjY1LDcgKzI1Nyw2IEBACiAgICAgaW50CQl0cnlfZG9zOwogICAgIGludAkJdHJ5X3VuaXg7CiAgICAgaW50CQlmaWxlX3Jld2luZCA9IEZBTFNFOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpbnQJCWNhbl9yZXRyeTsKICAgICBsaW5lbnJfVAljb252X2Vycm9yID0gMDsJCS8qIGxpbmUgbnIgd2l0aCBjb252ZXJzaW9uIGVycm9yICovCiAgICAgbGluZW5yX1QJaWxsZWdhbF9ieXRlID0gMDsJLyogbGluZSBuciB3aXRoIGlsbGVnYWwgYnl0ZSAqLwpAQCAtMjgxLDE5ICsyNzIsMTggQEAKICAgICBjaGFyX3UJKmZlbmNfbmV4dCA9IE5VTEw7CS8qIG5leHQgaXRlbSBpbiAnZmVuY3MnIG9yIE5VTEwgKi8KICAgICBpbnQJCWFkdmFuY2VfZmVuYyA9IEZBTFNFOwogICAgIGxvbmcJcmVhbF9zaXplID0gMDsKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAgICAgaWNvbnZfdAlpY29udl9mZCA9IChpY29udl90KS0xOwkvKiBkZXNjcmlwdG9yIGZvciBpY29udigpIG9yIC0xICovCi0jICBpZmRlZiBGRUFUX0VWQUwKKyMgaWZkZWYgRkVBVF9FVkFMCiAgICAgaW50CQlkaWRfaWNvbnYgPSBGQUxTRTsJLyogVFJVRSB3aGVuIGljb252KCkgZmFpbGVkIGFuZCB0cnlpbmcKIAkJCQkJICAgJ2NoYXJjb252ZXJ0JyBuZXh0ICovCi0jICBlbmRpZgogIyBlbmRpZgorI2VuZGlmCiAgICAgaW50CQljb252ZXJ0ZWQgPSBGQUxTRTsJLyogVFJVRSBpZiBjb252ZXJzaW9uIGRvbmUgKi8KICAgICBpbnQJCW5vdGNvbnZlcnRlZCA9IEZBTFNFOwkvKiBUUlVFIGlmIGNvbnZlcnNpb24gd2FudGVkIGJ1dCBpdAogCQkJCQkgICB3YXNuJ3QgcG9zc2libGUgKi8KICAgICBjaGFyX3UJY29udl9yZXN0W0NPTlZfUkVTVExFTl07CiAgICAgaW50CQljb252X3Jlc3RsZW4gPSAwOwkvKiBuciBvZiBieXRlcyBpbiBjb252X3Jlc3RbXSAqLwotI2VuZGlmCiAgICAgYnVmX1QJKm9sZF9jdXJidWY7CiAgICAgY2hhcl91CSpvbGRfYl9mZm5hbWU7CiAgICAgY2hhcl91CSpvbGRfYl9mbmFtZTsKQEAgLTYwOSwxMSArNTk5LDkgQEAKIAkJICAgICAqIGVkaXRlZCBiZWZvcmUgYW5kIGRlbGV0ZWQuICBHZXQgdGhlIG9sZCBtYXJrcy4gKi8KIAkJICAgIGNoZWNrX21hcmtzX3JlYWQoKTsKICNlbmRpZgotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIC8qIFNldCBmb3JjZWQgJ2ZpbGVlbmNvZGluZycuICAqLwogCQkgICAgaWYgKGVhcCAhPSBOVUxMKQogCQkJc2V0X2ZvcmNlZF9mZW5jKGVhcCk7Ci0jZW5kaWYKIAkJICAgIGFwcGx5X2F1dG9jbWRzX2V4YXJnKEVWRU5UX0JVRk5FV0ZJTEUsIHNmbmFtZSwgc2ZuYW1lLAogCQkJCQkJCSAgRkFMU0UsIGN1cmJ1ZiwgZWFwKTsKIAkJICAgIC8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IGZpbGVmb3JtYXQgKi8KQEAgLTY1OCwxMCArNjQ2LDggQEAKIAkgICAgY3VyYnVmLT5iX3BfZW9sID0gVFJVRTsKIAkgICAgY3VyYnVmLT5iX3N0YXJ0X2VvbCA9IFRSVUU7CiAJfQotI2lmZGVmIEZFQVRfTUJZVEUKIAljdXJidWYtPmJfcF9ib21iID0gRkFMU0U7CiAJY3VyYnVmLT5iX3N0YXJ0X2JvbWIgPSBGQUxTRTsKLSNlbmRpZgogICAgIH0KIAogICAgIC8qIENyZWF0ZSBhIHN3YXAgZmlsZSBub3csIHNvIHRoYXQgb3RoZXIgVmltcyBhcmUgd2FybmVkIHRoYXQgd2UgYXJlCkBAIC04NDYsNyArODMyLDYgQEAKICAgICAgKi8KICAgICBsaW5lY250ID0gY3VyYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgLyogIisrYmFkPSIgYXJndW1lbnQuICovCiAgICAgaWYgKGVhcCAhPSBOVUxMICYmIGVhcC0+YmFkX2NoYXIgIT0gMCkKICAgICB7CkBAIC05MjYsNyArOTExLDYgQEAKIAlmZW5jID0gbmV4dF9mZW5jKCZmZW5jX25leHQpOwogCWZlbmNfYWxsb2NlZCA9IFRSVUU7CiAgICAgfQotI2VuZGlmCiAKICAgICAvKgogICAgICAqIEp1bXAgYmFjayBoZXJlIHRvIHJldHJ5IHJlYWRpbmcgdGhlIGZpbGUgaW4gZGlmZmVyZW50IHdheXMuCkBAIC05NjYsMTQgKzk1MCwxMiBAQAogCXdoaWxlIChsbnVtID4gZnJvbSkKIAkgICAgbWxfZGVsZXRlKGxudW0tLSwgRkFMU0UpOwogCWZpbGVfcmV3aW5kID0gRkFMU0U7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChzZXRfb3B0aW9ucykKIAl7CiAJICAgIGN1cmJ1Zi0+Yl9wX2JvbWIgPSBGQUxTRTsKIAkgICAgY3VyYnVmLT5iX3N0YXJ0X2JvbWIgPSBGQUxTRTsKIAl9CiAJY29udl9lcnJvciA9IDA7Ci0jZW5kaWYKICAgICB9CiAKICAgICAvKgpAQCAtOTk3LDE1ICs5NzksMTQgQEAKIAkgICAgZmlsZWZvcm1hdCA9IEVPTF9VTktOT1dOOwkJLyogZGV0ZWN0IGZyb20gZmlsZSAqLwogICAgIH0KIAotI2lmZGVmIEZFQVRfTUJZVEUKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAgICAgaWYgKGljb252X2ZkICE9IChpY29udl90KS0xKQogICAgIHsKIAkvKiBhYm9ydGVkIGNvbnZlcnNpb24gd2l0aCBpY29udigpLCBjbG9zZSB0aGUgZGVzY3JpcHRvciAqLwogCWljb252X2Nsb3NlKGljb252X2ZkKTsKIAlpY29udl9mZCA9IChpY29udl90KS0xOwogICAgIH0KLSMgZW5kaWYKKyNlbmRpZgogCiAgICAgaWYgKGFkdmFuY2VfZmVuYykKICAgICB7CkBAIC0xMDczLDQ5ICsxMDU0LDQ5IEBACiAJZWxzZSBpZiAoZW5jX3V0ZjggfHwgU1RSQ01QKHBfZW5jLCAibGF0aW4xIikgPT0gMCkKIAkgICAgZmlvX2ZsYWdzID0gZ2V0X2Zpb19mbGFncyhmZW5jKTsKIAotIyBpZmRlZiBXSU4zMjY0CisjaWZkZWYgV0lOMzI2NAogCS8qCiAJICogQ29udmVyc2lvbiBmcm9tIGFuIE1TLVdpbmRvd3MgY29kZXBhZ2UgdG8gVVRGLTggb3IgYW5vdGhlciBjb2RlcGFnZQogCSAqIGlzIGhhbmRsZWQgd2l0aCBNdWx0aUJ5dGVUb1dpZGVDaGFyKCkuCiAJICovCiAJaWYgKGZpb19mbGFncyA9PSAwKQogCSAgICBmaW9fZmxhZ3MgPSBnZXRfd2luX2Zpb19mbGFncyhmZW5jKTsKLSMgZW5kaWYKKyNlbmRpZgogCi0jIGlmZGVmIE1BQ09TX0NPTlZFUlQKKyNpZmRlZiBNQUNPU19DT05WRVJUCiAJLyogQ29udmVyc2lvbiBmcm9tIEFwcGxlIE1hY1JvbWFuIHRvIGxhdGluMSBvciBVVEYtOCAqLwogCWlmIChmaW9fZmxhZ3MgPT0gMCkKIAkgICAgZmlvX2ZsYWdzID0gZ2V0X21hY19maW9fZmxhZ3MoZmVuYyk7Ci0jIGVuZGlmCisjZW5kaWYKIAotIyBpZmRlZiBVU0VfSUNPTlYKKyNpZmRlZiBVU0VfSUNPTlYKIAkvKgogCSAqIFRyeSB1c2luZyBpY29udigpIGlmIHdlIGNhbid0IGNvbnZlcnQgaW50ZXJuYWxseS4KIAkgKi8KIAlpZiAoZmlvX2ZsYWdzID09IDAKLSMgIGlmZGVmIEZFQVRfRVZBTAorIyBpZmRlZiBGRUFUX0VWQUwKIAkJJiYgIWRpZF9pY29udgotIyAgZW5kaWYKKyMgZW5kaWYKIAkJKQogCSAgICBpY29udl9mZCA9IChpY29udl90KW15X2ljb252X29wZW4oCiAJCQkJICBlbmNfdXRmOCA/IChjaGFyX3UgKikidXRmLTgiIDogcF9lbmMsIGZlbmMpOwotIyBlbmRpZgorI2VuZGlmCiAKLSMgaWZkZWYgRkVBVF9FVkFMCisjaWZkZWYgRkVBVF9FVkFMCiAJLyoKIAkgKiBVc2UgdGhlICdjaGFyY29udmVydCcgZXhwcmVzc2lvbiB3aGVuIGNvbnZlcnNpb24gaXMgcmVxdWlyZWQKIAkgKiBhbmQgd2UgY2FuJ3QgZG8gaXQgaW50ZXJuYWxseSBvciB3aXRoIGljb252KCkuCiAJICovCiAJaWYgKGZpb19mbGFncyA9PSAwICYmICFyZWFkX3N0ZGluICYmICFyZWFkX2J1ZmZlciAmJiAqcF9jY3YgIT0gTlVMCiAJCQkJCQkgICAgJiYgIXJlYWRfZmlmbwotIyAgaWZkZWYgVVNFX0lDT05WCisjIGlmZGVmIFVTRV9JQ09OVgogCQkJCQkJICAgICYmIGljb252X2ZkID09IChpY29udl90KS0xCi0jICBlbmRpZgorIyBlbmRpZgogCQkpCiAJewotIyAgaWZkZWYgVVNFX0lDT05WCisjIGlmZGVmIFVTRV9JQ09OVgogCSAgICBkaWRfaWNvbnYgPSBGQUxTRTsKLSMgIGVuZGlmCisjIGVuZGlmCiAJICAgIC8qIFNraXAgY29udmVyc2lvbiB3aGVuIGl0J3MgYWxyZWFkeSBkb25lIChyZXRyeSBmb3Igd3JvbmcKIAkgICAgICogImZpbGVmb3JtYXQiKS4gKi8KIAkgICAgaWYgKHRtcG5hbWUgPT0gTlVMTCkKQEAgLTExMzcsMTIgKzExMTgsMTIgQEAKIAkgICAgfQogCX0KIAllbHNlCi0jIGVuZGlmCisjZW5kaWYKIAl7CiAJICAgIGlmIChmaW9fZmxhZ3MgPT0gMAotIyBpZmRlZiBVU0VfSUNPTlYKKyNpZmRlZiBVU0VfSUNPTlYKIAkJICAgICYmIGljb252X2ZkID09IChpY29udl90KS0xCi0jIGVuZGlmCisjZW5kaWYKIAkgICAgICAgKQogCSAgICB7CiAJCS8qIENvbnZlcnNpb24gd2FudGVkIGJ1dCB3ZSBjYW4ndC4KQEAgLTExNTcsNyArMTEzOCw2IEBACiAgICAgICogYW5vdGhlciAiZmVuYyIgdmFsdWUuICBJdCdzIEZBTFNFIHdoZW4gbm8gb3RoZXIgImZlbmMiIHRvIHRyeSwgcmVhZGluZwogICAgICAqIHN0ZGluIG9yIGZpeGVkIGF0IGEgc3BlY2lmaWMgZW5jb2RpbmcuICovCiAgICAgY2FuX3JldHJ5ID0gKCpmZW5jICE9IE5VTCAmJiAhcmVhZF9zdGRpbiAmJiAhcmVhZF9maWZvICYmICFrZWVwX2Rlc3RfZW5jKTsKLSNlbmRpZgogCiAgICAgaWYgKCFza2lwX3JlYWQpCiAgICAgewpAQCAtMTE2NSw5ICsxMTQ1LDcgQEAKIAlmaWxlc2l6ZSA9IDA7CiAJc2tpcF9jb3VudCA9IGxpbmVzX3RvX3NraXA7CiAJcmVhZF9jb3VudCA9IGxpbmVzX3RvX3JlYWQ7Ci0jaWZkZWYgRkVBVF9NQllURQogCWNvbnZfcmVzdGxlbiA9IDA7Ci0jZW5kaWYKICNpZmRlZiBGRUFUX1BFUlNJU1RFTlRfVU5ETwogCXJlYWRfdW5kb19maWxlID0gKG5ld2ZpbGUgJiYgKGZsYWdzICYgUkVBRF9LRUVQX1VORE8pID09IDAKIAkJCQkgICYmIGN1cmJ1Zi0+Yl9mZm5hbWUgIT0gTlVMTApAQCAtMTI1Myw3ICsxMjMxLDYgQEAKIAkJcHRyID0gYnVmZmVyICsgbGluZXJlc3Q7CiAJCWxpbmVfc3RhcnQgPSBidWZmZXI7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJCS8qIE1heSBuZWVkIHJvb20gdG8gdHJhbnNsYXRlIGludG8uCiAJCSAqIEZvciBpY29udigpIHdlIGRvbid0IHJlYWxseSBrbm93IHRoZSByZXF1aXJlZCBzcGFjZSwgdXNlIGEKIAkJICogZmFjdG9yIElDT05WX01VTFQuCkBAIC0xMjY1LDExICsxMjQyLDExIEBACiAJCSAqIHVjcy00IHRvIHV0Zi04OiA0IGJ5dGVzIGJlY29tZSB1cCB0byA2IGJ5dGVzLCBzaXplIG11c3QgYmUKIAkJICogbXVsdGlwbGUgb2YgNCAqLwogCQlyZWFsX3NpemUgPSAoaW50KXNpemU7Ci0jIGlmZGVmIFVTRV9JQ09OVgorI2lmZGVmIFVTRV9JQ09OVgogCQlpZiAoaWNvbnZfZmQgIT0gKGljb252X3QpLTEpCiAJCSAgICBzaXplID0gc2l6ZSAvIElDT05WX01VTFQ7CiAJCWVsc2UKLSMgZW5kaWYKKyNlbmRpZgogCQkgICAgaWYgKGZpb19mbGFncyAmIEZJT19MQVRJTjEpCiAJCSAgICBzaXplID0gc2l6ZSAvIDI7CiAJCWVsc2UgaWYgKGZpb19mbGFncyAmIChGSU9fVUNTMiB8IEZJT19VVEYxNikpCkBAIC0xMjc4LDE3ICsxMjU1LDE1IEBACiAJCSAgICBzaXplID0gKHNpemUgKiAyIC8gMykgJiB+MzsKIAkJZWxzZSBpZiAoZmlvX2ZsYWdzID09IEZJT19VQ1NCT00pCiAJCSAgICBzaXplID0gc2l6ZSAvIElDT05WX01VTFQ7CS8qIHdvcnN0IGNhc2UgKi8KLSMgaWZkZWYgV0lOMzI2NAorI2lmZGVmIFdJTjMyNjQKIAkJZWxzZSBpZiAoZmlvX2ZsYWdzICYgRklPX0NPREVQQUdFKQogCQkgICAgc2l6ZSA9IHNpemUgLyBJQ09OVl9NVUxUOwkvKiBhbHNvIHdvcnN0IGNhc2UgKi8KLSMgZW5kaWYKLSMgaWZkZWYgTUFDT1NfQ09OVkVSVAorI2VuZGlmCisjaWZkZWYgTUFDT1NfQ09OVkVSVAogCQllbHNlIGlmIChmaW9fZmxhZ3MgJiBGSU9fTUFDUk9NQU4pCiAJCSAgICBzaXplID0gc2l6ZSAvIElDT05WX01VTFQ7CS8qIGFsc28gd29yc3QgY2FzZSAqLwotIyBlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJCWlmIChjb252X3Jlc3RsZW4gPiAwKQogCQl7CiAJCSAgICAvKiBJbnNlcnQgdW5jb252ZXJ0ZWQgYnl0ZXMgZnJvbSBwcmV2aW91cyBsaW5lLiAqLwpAQCAtMTI5Niw3ICsxMjcxLDYgQEAKIAkJICAgIHB0ciArPSBjb252X3Jlc3RsZW47CiAJCSAgICBzaXplIC09IGNvbnZfcmVzdGxlbjsKIAkJfQotI2VuZGlmCiAKIAkJaWYgKHJlYWRfYnVmZmVyKQogCQl7CkBAIC0xNDQ1LDcgKzE0MTksNiBAQAogCQl7CiAJCSAgICBpZiAoc2l6ZSA8IDApCQkgICAgLyogcmVhZCBlcnJvciAqLwogCQkJZXJyb3IgPSBUUlVFOwotI2lmZGVmIEZFQVRfTUJZVEUKIAkJICAgIGVsc2UgaWYgKGNvbnZfcmVzdGxlbiA+IDApCiAJCSAgICB7CiAJCQkvKgpAQCAtMTQ1NSw5ICsxNDI4LDkgQEAKIAogCQkJLyogV2hlbiB3ZSBkaWQgYSBjb252ZXJzaW9uIHJlcG9ydCBhbiBlcnJvci4gKi8KIAkJCWlmIChmaW9fZmxhZ3MgIT0gMAotIyBpZmRlZiBVU0VfSUNPTlYKKyNpZmRlZiBVU0VfSUNPTlYKIAkJCQl8fCBpY29udl9mZCAhPSAoaWNvbnZfdCktMQotIyBlbmRpZgorI2VuZGlmCiAJCQkgICApCiAJCQl7CiAJCQkgICAgaWYgKGNhbl9yZXRyeSkKQEAgLTE0ODIsOSArMTQ1NSw5IEBACiAJCQkgICAgICogbGVhdmUgdGhlIFVURjggY2hlY2tpbmcgY29kZSB0byBkbyBpdCwgYXMgaXQKIAkJCSAgICAgKiB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseS4gKi8KIAkJCSAgICBpZiAoYmFkX2NoYXJfYmVoYXZpb3IgIT0gQkFEX0tFRVAgJiYgKGZpb19mbGFncyAhPSAwCi0jIGlmZGVmIFVTRV9JQ09OVgorI2lmZGVmIFVTRV9JQ09OVgogCQkJCSAgICB8fCBpY29udl9mZCAhPSAoaWNvbnZfdCktMQotIyBlbmRpZgorI2VuZGlmCiAJCQkgICAgICAgKSkKIAkJCSAgICB7CiAJCQkJd2hpbGUgKGNvbnZfcmVzdGxlbiA+IDApCkBAIC0xNDk0LDIxICsxNDY3LDE5IEBACiAJCQkJfQogCQkJICAgIH0KIAkJCSAgICBmaW9fZmxhZ3MgPSAwOwkvKiBkb24ndCBjb252ZXJ0IHRoaXMgKi8KLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAJCQkgICAgaWYgKGljb252X2ZkICE9IChpY29udl90KS0xKQogCQkJICAgIHsKIAkJCQlpY29udl9jbG9zZShpY29udl9mZCk7CiAJCQkJaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsKIAkJCSAgICB9Ci0jIGVuZGlmCisjZW5kaWYKIAkJCX0KIAkJICAgIH0KLSNlbmRpZgogCQl9CiAJICAgIH0KIAkgICAgc2tpcF9yZWFkID0gRkFMU0U7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIC8qCiAJICAgICAqIEF0IHN0YXJ0IG9mIGZpbGUgKG9yIGFmdGVyIGNyeXB0IG1hZ2ljIG51bWJlcik6IENoZWNrIGZvciBCT00uCiAJICAgICAqIEFsc28gY2hlY2sgZm9yIGEgQk9NIGZvciBvdGhlciBVbmljb2RlIGVuY29kaW5ncywgYnV0IG5vdCBhZnRlcgpAQCAtMTUxNiwxMSArMTQ4NywxMSBAQAogCSAgICAgKiBmb3VuZC4KIAkgICAgICovCiAJICAgIGlmICgoZmlsZXNpemUgPT0gMAotIyBpZmRlZiBGRUFUX0NSWVBUCisjaWZkZWYgRkVBVF9DUllQVAogCQkgICB8fCAoY3J5cHRrZXkgIT0gTlVMTAogCQkJJiYgZmlsZXNpemUgPT0gY3J5cHRfZ2V0X2hlYWRlcl9sZW4oCiAJCQkJCQkgY3J5cHRfZ2V0X21ldGhvZF9ucihjdXJidWYpKSkKLSMgZW5kaWYKKyNlbmRpZgogCQkgICAgICAgKQogCQkgICAgJiYgKGZpb19mbGFncyA9PSBGSU9fVUNTQk9NCiAJCQl8fCAoIWN1cmJ1Zi0+Yl9wX2JvbWIKQEAgLTE1NzQsMTYgKzE1NDUsMTQgQEAKIAkgICAgcHRyIC09IGNvbnZfcmVzdGxlbjsKIAkgICAgc2l6ZSArPSBjb252X3Jlc3RsZW47CiAJICAgIGNvbnZfcmVzdGxlbiA9IDA7Ci0jZW5kaWYKIAkgICAgLyoKIAkgICAgICogQnJlYWsgaGVyZSBmb3IgYSByZWFkIGVycm9yIG9yIGVuZC1vZi1maWxlLgogCSAgICAgKi8KIAkgICAgaWYgKHNpemUgPD0gMCkKIAkJYnJlYWs7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAJICAgIGlmIChpY29udl9mZCAhPSAoaWNvbnZfdCktMSkKIAkgICAgewogCQkvKgpAQCAtMTY0NSw5ICsxNjE0LDkgQEAKIAkJbWNoX21lbW1vdmUobGluZV9zdGFydCwgYnVmZmVyLCAoc2l6ZV90KWxpbmVyZXN0KTsKIAkJc2l6ZSA9IChsb25nKSgoY2hhcl91ICopdG9wIC0gcHRyKTsKIAkgICAgfQotIyBlbmRpZgorI2VuZGlmCiAKLSMgaWZkZWYgV0lOMzI2NAorI2lmZGVmIFdJTjMyNjQKIAkgICAgaWYgKGZpb19mbGFncyAmIEZJT19DT0RFUEFHRSkKIAkgICAgewogCQljaGFyX3UJKnNyYywgKmRzdDsKQEAgLTE4MTMsOCArMTc4Miw4IEBACiAJCXNpemUgPSAobG9uZykoZHN0IC0gcHRyKTsKIAkgICAgfQogCSAgICBlbHNlCi0jIGVuZGlmCi0jIGlmZGVmIE1BQ09TX0NPTlZFUlQKKyNlbmRpZgorI2lmZGVmIE1BQ09TX0NPTlZFUlQKIAkgICAgaWYgKGZpb19mbGFncyAmIEZJT19NQUNST01BTikKIAkgICAgewogCQkvKgpAQCAtMTgyNSw3ICsxNzk0LDcgQEAKIAkJICAgIGdvdG8gcmV3aW5kX3JldHJ5OwogCSAgICB9CiAJICAgIGVsc2UKLSMgZW5kaWYKKyNlbmRpZgogCSAgICBpZiAoZmlvX2ZsYWdzICE9IDApCiAJICAgIHsKIAkJaW50CXU4YzsKQEAgLTIwODksMTEgKzIwNTgsMTEgQEAKIAkJCSAgICAgKiBmaWxlIGlzIG1vcmUgbGlrZWx5IHRoYW4gYSBjb252ZXJzaW9uIGVycm9yLiAqLwogCQkJICAgIGlmIChjYW5fcmV0cnkgJiYgIWluY29tcGxldGVfdGFpbCkKIAkJCQlicmVhazsKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAJCQkgICAgLyogV2hlbiB3ZSBkaWQgYSBjb252ZXJzaW9uIHJlcG9ydCBhbiBlcnJvci4gKi8KIAkJCSAgICBpZiAoaWNvbnZfZmQgIT0gKGljb252X3QpLTEgJiYgY29udl9lcnJvciA9PSAwKQogCQkJCWNvbnZfZXJyb3IgPSByZWFkZmlsZV9saW5lbnIobGluZWNudCwgcHRyLCBwKTsKLSMgZW5kaWYKKyNlbmRpZgogCQkJICAgIC8qIFJlbWVtYmVyIHRoZSBmaXJzdCBsaW5lbnIgd2l0aCBhbiBpbGxlZ2FsIGJ5dGUgKi8KIAkJCSAgICBpZiAoY29udl9lcnJvciA9PSAwICYmIGlsbGVnYWxfYnl0ZSA9PSAwKQogCQkJCWlsbGVnYWxfYnl0ZSA9IHJlYWRmaWxlX2xpbmVucihsaW5lY250LCBwdHIsIHApOwpAQCAtMjExNywxOSArMjA4NiwxOCBAQAogCQkgICAgLyogRGV0ZWN0ZWQgYSBVVEYtOCBlcnJvci4gKi8KIHJld2luZF9yZXRyeToKIAkJICAgIC8qIFJldHJ5IHJlYWRpbmcgd2l0aCBhbm90aGVyIGNvbnZlcnNpb24uICovCi0jIGlmIGRlZmluZWQoRkVBVF9FVkFMKSAmJiBkZWZpbmVkKFVTRV9JQ09OVikKKyNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgJiYgZGVmaW5lZChVU0VfSUNPTlYpCiAJCSAgICBpZiAoKnBfY2N2ICE9IE5VTCAmJiBpY29udl9mZCAhPSAoaWNvbnZfdCktMSkKIAkJCS8qIGljb252KCkgZmFpbGVkLCB0cnkgJ2NoYXJjb252ZXJ0JyAqLwogCQkJZGlkX2ljb252ID0gVFJVRTsKIAkJICAgIGVsc2UKLSMgZW5kaWYKKyNlbmRpZgogCQkJLyogdXNlIG5leHQgaXRlbSBmcm9tICdmaWxlZW5jb2RpbmdzJyAqLwogCQkJYWR2YW5jZV9mZW5jID0gVFJVRTsKIAkJICAgIGZpbGVfcmV3aW5kID0gVFJVRTsKIAkJICAgIGdvdG8gcmV0cnk7CiAJCX0KIAkgICAgfQotI2VuZGlmCiAKIAkgICAgLyogY291bnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIChhZnRlciBjb252ZXJzaW9uISkgKi8KIAkgICAgZmlsZXNpemUgKz0gc2l6ZTsKQEAgLTIzNzEsNyArMjMzOSw2IEBACiAgICAgICogZW5jcnlwdGlvbiB3YXMgdXNlZC4gKi8KICNlbmRpZgogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIC8qIElmIGVkaXRpbmcgYSBuZXcgZmlsZTogc2V0ICdmZW5jJyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLgogICAgICAqIEFsc28gZm9yICI6cmVhZCArK2VkaXQgZmlsZSIuICovCiAgICAgaWYgKHNldF9vcHRpb25zKQpAQCAtMjM3OSwxMyArMjM0NiwxMiBAQAogCQkJCQkJICAgICAgIE9QVF9GUkVFfE9QVF9MT0NBTCwgMCk7CiAgICAgaWYgKGZlbmNfYWxsb2NlZCkKIAl2aW1fZnJlZShmZW5jKTsKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAgICAgaWYgKGljb252X2ZkICE9IChpY29udl90KS0xKQogICAgIHsKIAlpY29udl9jbG9zZShpY29udl9mZCk7CiAJaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsKICAgICB9Ci0jIGVuZGlmCiAjZW5kaWYKIAogICAgIGlmICghcmVhZF9idWZmZXIgJiYgIXJlYWRfc3RkaW4pCkBAIC0yNDA5LDEzICsyMzc1LDExIEBACiAgICAgfQogI2VuZGlmCiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKHRtcG5hbWUgIT0gTlVMTCkKICAgICB7CiAJbWNoX3JlbW92ZSh0bXBuYW1lKTsJCS8qIGRlbGV0ZSBjb252ZXJ0ZWQgZmlsZSAqLwogCXZpbV9mcmVlKHRtcG5hbWUpOwogICAgIH0KLSNlbmRpZgogICAgIC0tbm9fd2FpdF9yZXR1cm47CQkJLyogbWF5IHdhaXQgZm9yIHJldHVybiBub3cgKi8KIAogICAgIC8qCkBAIC0yNTI4LDcgKzI0OTIsNiBAQAogCQlTVFJDQVQoSU9idWZmLCBfKCJbbG9uZyBsaW5lcyBzcGxpdF0iKSk7CiAJCWMgPSBUUlVFOwogCSAgICB9Ci0jaWZkZWYgRkVBVF9NQllURQogCSAgICBpZiAobm90Y29udmVydGVkKQogCSAgICB7CiAJCVNUUkNBVChJT2J1ZmYsIF8oIltOT1QgY29udmVydGVkXSIpKTsKQEAgLTI1MzksNyArMjUwMiw2IEBACiAJCVNUUkNBVChJT2J1ZmYsIF8oIltjb252ZXJ0ZWRdIikpOwogCQljID0gVFJVRTsKIAkgICAgfQotI2VuZGlmCiAjaWZkZWYgRkVBVF9DUllQVAogCSAgICBpZiAoY3J5cHRrZXkgIT0gTlVMTCkKIAkgICAgewpAQCAtMjU0Nyw3ICsyNTA5LDYgQEAKIAkJYyA9IFRSVUU7CiAJICAgIH0KICNlbmRpZgotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGNvbnZfZXJyb3IgIT0gMCkKIAkgICAgewogCQlzcHJpbnRmKChjaGFyICopSU9idWZmICsgU1RSTEVOKElPYnVmZiksCkBAIC0yNTYwLDkgKzI1MjEsNyBAQAogCQkJIF8oIltJTExFR0FMIEJZVEUgaW4gbGluZSAlbGRdIiksIChsb25nKWlsbGVnYWxfYnl0ZSk7CiAJCWMgPSBUUlVFOwogCSAgICB9Ci0JICAgIGVsc2UKLSNlbmRpZgotCQlpZiAoZXJyb3IpCisJICAgIGVsc2UgaWYgKGVycm9yKQogCSAgICB7CiAJCVNUUkNBVChJT2J1ZmYsIF8oIltSRUFEIEVSUk9SU10iKSk7CiAJCWMgPSBUUlVFOwpAQCAtMjYwMSwxMSArMjU2MCw4IEBACiAKIAkvKiB3aXRoIGVycm9ycyB3cml0aW5nIHRoZSBmaWxlIHJlcXVpcmVzICI6dyEiICovCiAJaWYgKG5ld2ZpbGUgJiYgKGVycm9yCi0jaWZkZWYgRkVBVF9NQllURQogCQkgICAgfHwgY29udl9lcnJvciAhPSAwCi0JCSAgICB8fCAoaWxsZWdhbF9ieXRlID4gMCAmJiBiYWRfY2hhcl9iZWhhdmlvciAhPSBCQURfS0VFUCkKLSNlbmRpZgotCQkgICAgKSkKKwkJICAgIHx8IChpbGxlZ2FsX2J5dGUgPiAwICYmIGJhZF9jaGFyX2JlaGF2aW9yICE9IEJBRF9LRUVQKSkpCiAJICAgIGN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsKIAogCXVfY2xlYXJsaW5lKCk7CSAgICAvKiBjYW5ub3QgdXNlICJVIiBjb21tYW5kIGFmdGVyIGFkZGluZyBsaW5lcyAqLwpAQCAtMjc0NSw4ICsyNzAxLDYgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgRkVBVF9NQllURQotCiAvKgogICogRnJvbSB0aGUgY3VycmVudCBsaW5lIGNvdW50IGFuZCBjaGFyYWN0ZXJzIHJlYWQgYWZ0ZXIgdGhhdCwgZXN0aW1hdGUgdGhlCiAgKiBsaW5lIG51bWJlciB3aGVyZSB3ZSBhcmUgbm93LgpAQCAtMjc2Nyw3ICsyNzIxLDYgQEAKIAkgICAgKytsbnVtOwogICAgIHJldHVybiBsbnVtOwogfQotI2VuZGlmCiAKIC8qCiAgKiBGaWxsICIqZWFwIiB0byBmb3JjZSB0aGUgJ2ZpbGVlbmNvZGluZycsICdmaWxlZm9ybWF0JyBhbmQgJ2JpbmFyeSB0byBiZQpAQCAtMjc3NywyMSArMjczMCwxMyBAQAogICAgIGludAogcHJlcF9leGFyZyhleGFyZ19UICplYXAsIGJ1Zl9UICpidWYpCiB7Ci0gICAgZWFwLT5jbWQgPSBhbGxvYygxNQotI2lmZGVmIEZFQVRfTUJZVEUKLQkJKyAodW5zaWduZWQpU1RSTEVOKGJ1Zi0+Yl9wX2ZlbmMpCi0jZW5kaWYKLQkgICAgKTsKKyAgICBlYXAtPmNtZCA9IGFsbG9jKDE1ICsgKHVuc2lnbmVkKVNUUkxFTihidWYtPmJfcF9mZW5jKSk7CiAgICAgaWYgKGVhcC0+Y21kID09IE5VTEwpCiAJcmV0dXJuIEZBSUw7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgc3ByaW50ZigoY2hhciAqKWVhcC0+Y21kLCAiZSArK2VuYz0lcyIsIGJ1Zi0+Yl9wX2ZlbmMpOwogICAgIGVhcC0+Zm9yY2VfZW5jID0gODsKICAgICBlYXAtPmJhZF9jaGFyID0gYnVmLT5iX2JhZF9jaGFyOwotI2Vsc2UKLSAgICBzcHJpbnRmKChjaGFyICopZWFwLT5jbWQsICJlIik7Ci0jZW5kaWYKICAgICBlYXAtPmZvcmNlX2ZmID0gKmJ1Zi0+Yl9wX2ZmOwogCiAgICAgZWFwLT5mb3JjZV9iaW4gPSBidWYtPmJfcF9iaW4gPyBGT1JDRV9CSU4gOiBGT1JDRV9OT0JJTjsKQEAgLTI4MjUsNyArMjc3MCw2IEBACiAgICAgfQogfQogCi0jaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKICAqIFNldCBmb3JjZWQgJ2ZpbGVlbmNvZGluZycuCiAgKi8KQEAgLTI4ODYsNyArMjgzMCw3IEBACiAgICAgcmV0dXJuIHI7CiB9CiAKLSMgaWZkZWYgRkVBVF9FVkFMCisjaWZkZWYgRkVBVF9FVkFMCiAvKgogICogQ29udmVydCBhIGZpbGUgd2l0aCB0aGUgJ2NoYXJjb252ZXJ0JyBleHByZXNzaW9uLgogICogVGhpcyBjbG9zZXMgdGhlIGZpbGUgd2hpY2ggaXMgdG8gYmUgcmVhZCwgY29udmVydHMgaXQgYW5kIG9wZW5zIHRoZQpAQCAtMjkzNywxMCArMjg4MSw5IEBACiAKICAgICByZXR1cm4gdG1wbmFtZTsKIH0KLSMgZW5kaWYKLQogI2VuZGlmCiAKKwogI2lmZGVmIEZFQVRfVklNSU5GTwogLyoKICAqIFJlYWQgbWFya3MgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBmcm9tIHRoZSB2aW1pbmZvIGZpbGUsIHdoZW4gd2Ugc3VwcG9ydApAQCAtMzE3NiwxMiArMzExOSwxMCBAQAogICAgIGludAkJICAgIGZpbGVmb3JtYXQ7CiAgICAgaW50CQkgICAgd3JpdGVfYmluOwogICAgIHN0cnVjdCBid19pbmZvICB3cml0ZV9pbmZvOwkJLyogaW5mbyBmb3IgYnVmX3dyaXRlX2J5dGVzKCkgKi8KLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaW50CQkgICAgY29udmVydGVkID0gRkFMU0U7CiAgICAgaW50CQkgICAgbm90Y29udmVydGVkID0gRkFMU0U7CiAgICAgY2hhcl91CSAgICAqZmVuYzsJCS8qIGVmZmVjdGl2ZSAnZmlsZWVuY29kaW5nJyAqLwogICAgIGNoYXJfdQkgICAgKmZlbmNfdG9mcmVlID0gTlVMTDsgLyogYWxsb2NhdGVkICJmZW5jIiAqLwotI2VuZGlmCiAjaWZkZWYgSEFTX0JXX0ZMQUdTCiAgICAgaW50CQkgICAgd2JfZmxhZ3MgPSAwOwogI2VuZGlmCkBAIC0zMjE5LDE1ICszMTYwLDEzIEBACiAJcmV0dXJuIEZBSUw7CiAgICAgfQogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIC8qIG11c3QgaW5pdCBid19jb252X2J1ZiBhbmQgYndfaWNvbnZfZmQgYmVmb3JlIGp1bXBpbmcgdG8gImZhaWwiICovCiAgICAgd3JpdGVfaW5mby5id19jb252X2J1ZiA9IE5VTEw7CiAgICAgd3JpdGVfaW5mby5id19jb252X2Vycm9yID0gRkFMU0U7CiAgICAgd3JpdGVfaW5mby5id19jb252X2Vycm9yX2xudW0gPSAwOwogICAgIHdyaXRlX2luZm8uYndfcmVzdGxlbiA9IDA7Ci0jIGlmZGVmIFVTRV9JQ09OVgorI2lmZGVmIFVTRV9JQ09OVgogICAgIHdyaXRlX2luZm8uYndfaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsKLSMgZW5kaWYKICNlbmRpZgogI2lmZGVmIEZFQVRfQ1JZUFQKICAgICB3cml0ZV9pbmZvLmJ3X2J1ZmZlciA9IGJ1ZjsKQEAgLTQyMjcsNyArNDE2Niw2IEBACiAgICAgICogbXVsdGktYnl0ZSBjb252ZXJzaW9uLiAqLwogICAgIHdmbmFtZSA9IGZuYW1lOwogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIC8qIENoZWNrIGZvciBmb3JjZWQgJ2ZpbGVlbmNvZGluZycgZnJvbSAiKytvcHQ9dmFsIiBhcmd1bWVudC4gKi8KICAgICBpZiAoZWFwICE9IE5VTEwgJiYgZWFwLT5mb3JjZV9lbmMgIT0gMCkKICAgICB7CkBAIC00MjY1LDcgKzQyMDMsNyBAQAogCX0KICAgICB9CiAKLSMgaWZkZWYgV0lOMzI2NAorI2lmZGVmIFdJTjMyNjQKICAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDAgJiYgKHdiX2ZsYWdzID0gZ2V0X3dpbl9maW9fZmxhZ3MoZmVuYykpICE9IDApCiAgICAgewogCS8qIENvbnZlcnQgVVRGLTggLT4gVUNTLTIgYW5kIFVDUy0yIC0+IERCQ1MuICBXb3JzdC1jYXNlICogNDogKi8KQEAgLTQyNzUsOSArNDIxMyw5IEBACiAJaWYgKHdyaXRlX2luZm8uYndfY29udl9idWYgPT0gTlVMTCkKIAkgICAgZW5kID0gMDsKICAgICB9Ci0jIGVuZGlmCisjZW5kaWYKIAotIyBpZmRlZiBNQUNPU19DT05WRVJUCisjaWZkZWYgTUFDT1NfQ09OVkVSVAogICAgIGlmIChjb252ZXJ0ZWQgJiYgd2JfZmxhZ3MgPT0gMCAmJiAod2JfZmxhZ3MgPSBnZXRfbWFjX2Zpb19mbGFncyhmZW5jKSkgIT0gMCkKICAgICB7CiAJd3JpdGVfaW5mby5id19jb252X2J1ZmxlbiA9IGJ1ZnNpemUgKiAzOwpAQCAtNDI4NiwxMiArNDIyNCwxMiBAQAogCWlmICh3cml0ZV9pbmZvLmJ3X2NvbnZfYnVmID09IE5VTEwpCiAJICAgIGVuZCA9IDA7CiAgICAgfQotIyBlbmRpZgorI2VuZGlmCiAKLSMgaWYgZGVmaW5lZChGRUFUX0VWQUwpIHx8IGRlZmluZWQoVVNFX0lDT05WKQorI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFVTRV9JQ09OVikKICAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDApCiAgICAgewotIyAgaWZkZWYgVVNFX0lDT05WCisjIGlmZGVmIFVTRV9JQ09OVgogCS8qCiAJICogVXNlIGljb252KCkgY29udmVyc2lvbiB3aGVuIGNvbnZlcnNpb24gaXMgbmVlZGVkIGFuZCBpdCdzIG5vdCBkb25lCiAJICogaW50ZXJuYWxseS4KQEAgLTQzMDgsMTIgKzQyNDYsMTIgQEAKIAkJZW5kID0gMDsKIAkgICAgd3JpdGVfaW5mby5id19maXJzdCA9IFRSVUU7CiAJfQotIyAgIGlmZGVmIEZFQVRfRVZBTAotCWVsc2UKLSMgICBlbmRpZgotIyAgZW5kaWYKLQogIyAgaWZkZWYgRkVBVF9FVkFMCisJZWxzZQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBGRUFUX0VWQUwKIAkgICAgLyoKIAkgICAgICogV2hlbiB0aGUgZmlsZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgd2l0aCAnY2hhcmNvbnZlcnQnIGFmdGVyCiAJICAgICAqIHdyaXRpbmcsIHdyaXRlIHRvIGEgdGVtcCBmaWxlIGluc3RlYWQgYW5kIGxldCB0aGUgY29udmVyc2lvbgpAQCAtNDMyOCwxNiArNDI2NiwxNiBAQAogCQkgICAgZ290byByZXN0b3JlX2JhY2t1cDsKIAkJfQogCSAgICB9Ci0jICBlbmRpZgotICAgIH0KICMgZW5kaWYKKyAgICB9CisjZW5kaWYKICAgICBpZiAoY29udmVydGVkICYmIHdiX2ZsYWdzID09IDAKLSMgIGlmZGVmIFVTRV9JQ09OVgorI2lmZGVmIFVTRV9JQ09OVgogCSAgICAmJiB3cml0ZV9pbmZvLmJ3X2ljb252X2ZkID09IChpY29udl90KS0xCi0jICBlbmRpZgotIyAgaWZkZWYgRkVBVF9FVkFMCisjIGVuZGlmCisjIGlmZGVmIEZFQVRfRVZBTAogCSAgICAmJiB3Zm5hbWUgPT0gZm5hbWUKLSMgIGVuZGlmCisjIGVuZGlmCiAJICAgICkKICAgICB7CiAJaWYgKCFmb3JjZWl0KQpAQCAtNDM0Nyw3ICs0Mjg1LDYgQEAKIAl9CiAJbm90Y29udmVydGVkID0gVFJVRTsKICAgICB9Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogSWYgY29udmVyc2lvbiBpcyB0YWtpbmcgcGxhY2UsIHdlIG1heSBmaXJzdCBwcmV0ZW5kIHRvIHdyaXRlIGFuZCBjaGVjawpAQCAtNDM2Miw5ICs0Mjk5LDcgQEAKIAkgKiAtIHdlIG1ha2UgYSBiYWNrdXAgZmlsZSwgdGhhdCBjYW4gYmUgcmVzdG9yZWQgaW4gY2FzZSBvZiBjb252ZXJzaW9uCiAJICogICBmYWlsdXJlLgogCSAqLwotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAoIWNvbnZlcnRlZCB8fCBkb2JhY2t1cCkKLSNlbmRpZgogCSAgICBjaGVja2luZ19jb252ZXJzaW9uID0gRkFMU0U7CiAKIAlpZiAoY2hlY2tpbmdfY29udmVyc2lvbikKQEAgLTQ0NzcsMTAgKzQ0MTIsOCBAQAogCQkJZW5kID0gMDsKIAkJfQogCi0jaWZkZWYgRkVBVF9NQllURQogCQlpZiAod2ZuYW1lICE9IGZuYW1lKQogCQkgICAgdmltX2ZyZWUod2ZuYW1lKTsKLSNlbmRpZgogCQlnb3RvIGZhaWw7CiAJICAgIH0KIAkgICAgd3JpdGVfaW5mby5id19mZCA9IGZkOwpAQCAtNDU2Myw3ICs0NDk2LDYgQEAKIAllbHNlCiAJICAgIHdyaXRlX2JpbiA9IGJ1Zi0+Yl9wX2JpbjsKIAotI2lmZGVmIEZFQVRfTUJZVEUKIAkvKgogCSAqIFRoZSBCT00gaXMgd3JpdHRlbiBqdXN0IGFmdGVyIHRoZSBlbmNyeXB0aW9uIG1hZ2ljIG51bWJlci4KIAkgKiBTa2lwIGl0IHdoZW4gYXBwZW5kaW5nIGFuZCB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0ZWQsIHRoZSBCT00gb25seQpAQCAtNDU4Myw3ICs0NTE1LDYgQEAKIAkgICAgfQogCX0KIAl3cml0ZV9pbmZvLmJ3X3N0YXJ0X2xudW0gPSBzdGFydDsKLSNlbmRpZgogCiAjaWZkZWYgRkVBVF9QRVJTSVNURU5UX1VORE8KIAl3cml0ZV91bmRvX2ZpbGUgPSAoYnVmLT5iX3BfdWRmCkBAIC00NjM1LDkgKzQ1NjYsNyBAQAogCQluY2hhcnMgKz0gYnVmc2l6ZTsKIAkJcyA9IGJ1ZmZlcjsKIAkJbGVuID0gMDsKLSNpZmRlZiBGRUFUX01CWVRFCiAJCXdyaXRlX2luZm8uYndfc3RhcnRfbG51bSA9IGxudW07Ci0jZW5kaWYKIAkgICAgfQogCSAgICAvKiB3cml0ZSBmYWlsZWQgb3IgbGFzdCBsaW5lIGhhcyBubyBFT0w6IHN0b3AgaGVyZSAqLwogCSAgICBpZiAoZW5kID09IDAKQEAgLTQ4NDEsNyArNDc3MCw3IEBACiAJfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmIGRlZmluZWQoRkVBVF9FVkFMKQorI2lmIGRlZmluZWQoRkVBVF9FVkFMKQogCWlmICh3Zm5hbWUgIT0gZm5hbWUpCiAJewogCSAgICAvKgpAQCAtNDg3MCw3ICs0Nzk5LDYgQEAKIAkgKi8KIAlpZiAoZXJybXNnID09IE5VTEwpCiAJewotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKHdyaXRlX2luZm8uYndfY29udl9lcnJvcikKIAkgICAgewogCQlpZiAod3JpdGVfaW5mby5id19jb252X2Vycm9yX2xudW0gPT0gMCkKQEAgLTQ4ODMsMTIgKzQ4MTEsMTAgQEAKIAkJCQkJIChsb25nKXdyaXRlX2luZm8uYndfY29udl9lcnJvcl9sbnVtKTsKIAkJfQogCSAgICB9CisJICAgIGVsc2UgaWYgKGdvdF9pbnQpCisJCWVycm1zZyA9IChjaGFyX3UgKilfKGVfaW50ZXJyKTsKIAkgICAgZWxzZQotI2VuZGlmCi0JCWlmIChnb3RfaW50KQotCQkgICAgZXJybXNnID0gKGNoYXJfdSAqKV8oZV9pbnRlcnIpOwotCQllbHNlCi0JCSAgICBlcnJtc2cgPSAoY2hhcl91ICopXygiRTUxNDogd3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIpOworCQllcnJtc2cgPSAoY2hhcl91ICopXygiRTUxNDogd3JpdGUgZXJyb3IgKGZpbGUgc3lzdGVtIGZ1bGw/KSIpOwogCX0KIAogCS8qCkBAIC00OTUzLDcgKzQ4NzksNiBAQAogICAgIHsKIAltc2dfYWRkX2ZuYW1lKGJ1ZiwgZm5hbWUpOwkvKiBwdXQgZm5hbWUgaW4gSU9idWZmIHdpdGggcXVvdGVzICovCiAJYyA9IEZBTFNFOwotI2lmZGVmIEZFQVRfTUJZVEUKIAlpZiAod3JpdGVfaW5mby5id19jb252X2Vycm9yKQogCXsKIAkgICAgU1RSQ0FUKElPYnVmZiwgXygiIENPTlZFUlNJT04gRVJST1IiKSk7CkBAIC00OTcyLDcgKzQ4OTcsNiBAQAogCSAgICBTVFJDQVQoSU9idWZmLCBfKCJbY29udmVydGVkXSIpKTsKIAkgICAgYyA9IFRSVUU7CiAJfQotI2VuZGlmCiAJaWYgKGRldmljZSkKIAl7CiAJICAgIFNUUkNBVChJT2J1ZmYsIF8oIltEZXZpY2VdIikpOwpAQCAtNTAxMywxMSArNDkzNyw4IEBACiAgICAgLyogV2hlbiB3cml0dGVuIGV2ZXJ5dGhpbmcgY29ycmVjdGx5OiByZXNldCAnbW9kaWZpZWQnLiAgVW5sZXNzIG5vdAogICAgICAqIHdyaXRpbmcgdG8gdGhlIG9yaWdpbmFsIGZpbGUgYW5kICcrJyBpcyBub3QgaW4gJ2Nwb3B0aW9ucycuICovCiAgICAgaWYgKHJlc2V0X2NoYW5nZWQgJiYgd2hvbGUgJiYgIWFwcGVuZAotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgJiYgIXdyaXRlX2luZm8uYndfY29udl9lcnJvcgotI2VuZGlmCi0JICAgICYmIChvdmVyd3JpdGluZyB8fCB2aW1fc3RyY2hyKHBfY3BvLCBDUE9fUExVUykgIT0gTlVMTCkKLQkgICAgKQorCSAgICAmJiAob3ZlcndyaXRpbmcgfHwgdmltX3N0cmNocihwX2NwbywgQ1BPX1BMVVMpICE9IE5VTEwpKQogICAgIHsKIAl1bmNoYW5nZWQoYnVmLCBUUlVFKTsKIAkvKiBiOmNoYW5nZWR0aWNrIGlzIGFsd2F5cyBpbmNyZW1lbnRlZCBpbiB1bmNoYW5nZWQoKSBidXQgdGhhdApAQCAtNTExMywxNiArNTAzNCwxNCBAQAogICAgIHZpbV9mcmVlKGJhY2t1cCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbGJ1ZikKIAl2aW1fZnJlZShidWZmZXIpOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICB2aW1fZnJlZShmZW5jX3RvZnJlZSk7CiAgICAgdmltX2ZyZWUod3JpdGVfaW5mby5id19jb252X2J1Zik7Ci0jIGlmZGVmIFVTRV9JQ09OVgorI2lmZGVmIFVTRV9JQ09OVgogICAgIGlmICh3cml0ZV9pbmZvLmJ3X2ljb252X2ZkICE9IChpY29udl90KS0xKQogICAgIHsKIAlpY29udl9jbG9zZSh3cml0ZV9pbmZvLmJ3X2ljb252X2ZkKTsKIAl3cml0ZV9pbmZvLmJ3X2ljb252X2ZkID0gKGljb252X3QpLTE7CiAgICAgfQotIyBlbmRpZgogI2VuZGlmCiAjaWZkZWYgSEFWRV9BQ0wKICAgICBtY2hfZnJlZV9hY2woYWNsKTsKQEAgLTU0MTEsNyArNTMzMCw2IEBACiAgICAgaW50CQlmbGFncyA9IGlwLT5id19mbGFnczsJLyogZXh0cmEgZmxhZ3MgKi8KICNlbmRpZgogCi0jaWZkZWYgRkVBVF9NQllURQogICAgIC8qCiAgICAgICogU2tpcCBjb252ZXJzaW9uIHdoZW4gd3JpdGluZyB0aGUgY3J5cHQgbWFnaWMgbnVtYmVyIG9yIHRoZSBCT00uCiAgICAgICovCkBAIC01NTIxLDcgKzU0MzksNyBAQAogCSAgICB9CiAJfQogCi0jIGlmZGVmIFdJTjMyNjQKKyNpZmRlZiBXSU4zMjY0CiAJZWxzZSBpZiAoZmxhZ3MgJiBGSU9fQ09ERVBBR0UpCiAJewogCSAgICAvKgpAQCAtNTYxNyw3ICs1NTM1LDcgQEAKIAogCSAgICBmcm9tbGVuID0gdG8gLSBpcC0+YndfY29udl9idWY7CiAJICAgIGJ1ZiA9IHRvOwotIyAgaWZkZWYgQ1BfVVRGOAkvKiBWQyA0LjEgZG9lc24ndCBkZWZpbmUgQ1BfVVRGOCAqLworIyBpZmRlZiBDUF9VVEY4CS8qIFZDIDQuMSBkb2Vzbid0IGRlZmluZSBDUF9VVEY4ICovCiAJICAgIGlmIChGSU9fR0VUX0NQKGZsYWdzKSA9PSBDUF9VVEY4KQogCSAgICB7CiAJCS8qIENvbnZlcnQgZnJvbSBVQ1MtMiB0byBVVEYtOCwgdXNpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUKQEAgLTU2MzYsNyArNTU1NCw3IEBACiAJCWxlbiA9IChpbnQpKHRvIC0gYnVmKTsKIAkgICAgfQogCSAgICBlbHNlCi0jZW5kaWYKKyMgZW5kaWYKIAkgICAgewogCQkvKiBDb252ZXJ0IGZyb20gVUNTLTIgdG8gdGhlIGNvZGVwYWdlLCB1c2luZyB0aGUgcmVtYWluZGVyIG9mCiAJCSAqIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gIElmIHRoZSBjb252ZXJzaW9uIHVzZXMgdGhlIGRlZmF1bHQKQEAgLTU2NTMsOSArNTU3MSw5IEBACiAJCX0KIAkgICAgfQogCX0KLSMgZW5kaWYKKyNlbmRpZgogCi0jIGlmZGVmIE1BQ09TX0NPTlZFUlQKKyNpZmRlZiBNQUNPU19DT05WRVJUCiAJZWxzZSBpZiAoZmxhZ3MgJiBGSU9fTUFDUk9NQU4pCiAJewogCSAgICAvKgpAQCAtNTY4OSw5ICs1NjA3LDkgQEAKIAkgICAgfQogCSAgICBidWYgPSBpcC0+YndfY29udl9idWY7CiAJfQotIyBlbmRpZgorI2VuZGlmCiAKLSMgaWZkZWYgVVNFX0lDT05WCisjaWZkZWYgVVNFX0lDT05WCiAJaWYgKGlwLT5id19pY29udl9mZCAhPSAoaWNvbnZfdCktMSkKIAl7CiAJICAgIGNvbnN0IGNoYXIJKmZyb207CkBAIC01NzU5LDkgKzU2NzcsOCBAQAogCSAgICBidWYgPSBpcC0+YndfY29udl9idWY7CiAJICAgIGxlbiA9IChpbnQpKChjaGFyX3UgKil0byAtIGlwLT5id19jb252X2J1Zik7CiAJfQotIyBlbmRpZgorI2VuZGlmCiAgICAgfQotI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KIAogICAgIGlmIChpcC0+YndfZmQgPCAwKQogCS8qIE9ubHkgY2hlY2tpbmcgY29udmVyc2lvbiwgd2hpY2ggaXMgT0sgaWYgd2UgZ2V0IGhlcmUuICovCkBAIC01Nzk4LDcgKzU3MTUsNiBAQAogICAgIHJldHVybiAod2xlbiA8IGxlbikgPyBGQUlMIDogT0s7CiB9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAvKgogICogQ29udmVydCBhIFVuaWNvZGUgY2hhcmFjdGVyIHRvIGJ5dGVzLgogICogUmV0dXJuIFRSVUUgZm9yIGFuIGVycm9yLCBGQUxTRSB3aGVuIGl0J3MgT0suCkBAIC02MDg5LDcgKzYwMDUsNiBAQAogICAgICh2b2lkKXVjczJieXRlcygweGZlZmYsICZwLCBmbGFncyk7CiAgICAgcmV0dXJuIChpbnQpKHAgLSBidWYpOwogfQotI2VuZGlmCiAKIC8qCiAgKiBUcnkgdG8gZmluZCBhIHNob3J0bmFtZSBieSBjb21wYXJpbmcgdGhlIGZ1bGxuYW1lIHdpdGggdGhlIGN1cnJlbnQKQEAgLTc2MzksMTMgKzc1NTQsMTAgQEAKICAgICBpZiAocGF0aF93aXRoX3VybChmbmFtZSkpCiAJcmV0dXJuOwogICAgIGZvciAocCA9IGZuYW1lOyAqcCAhPSBOVUw7ICsrcCkKLSMgaWZkZWYgIEZFQVRfTUJZVEUKIAkvKiBUaGUgQmlnNSBlbmNvZGluZyBjYW4gaGF2ZSAnXCcgaW4gdGhlIHRyYWlsIGJ5dGUuICovCiAJaWYgKGVuY19kYmNzICE9IDAgJiYgKCptYl9wdHIybGVuKShwKSA+IDEpCiAJICAgICsrcDsKLQllbHNlCi0jIGVuZGlmCi0JaWYgKCpwID09ICdcXCcpCisJZWxzZSBpZiAoKnAgPT0gJ1xcJykKIAkgICAgKnAgPSAnLyc7CiB9CiAjZW5kaWYKQEAgLTEwMzQwLDEzICsxMDI1MiwxMSBAQAogI2VuZGlmCiAJICAgIGRlZmF1bHQ6CiAJCXNpemUrKzsKLSMgaWZkZWYgRkVBVF9NQllURQogCQlpZiAoZW5jX2RiY3MgIT0gMCAmJiAoKm1iX3B0cjJsZW4pKHApID4gMSkKIAkJewogCQkgICAgKytwOwogCQkgICAgKytzaXplOwogCQl9Ci0jIGVuZGlmCiAJCWJyZWFrOwogCX0KICAgICB9CkBAIC0xMDQ3OSwxMiArMTAzODksOSBAQAogCQkgICAgcmVnX3BhdFtpKytdID0gJywnOwogCQlicmVhazsKIAkgICAgZGVmYXVsdDoKLSMgaWZkZWYgIEZFQVRfTUJZVEUKIAkJaWYgKGVuY19kYmNzICE9IDAgJiYgKCptYl9wdHIybGVuKShwKSA+IDEpCiAJCSAgICByZWdfcGF0W2krK10gPSAqcCsrOwotCQllbHNlCi0jIGVuZGlmCi0JCWlmIChhbGxvd19kaXJzICE9IE5VTEwgJiYgdmltX2lzcGF0aHNlcCgqcCkpCisJCWVsc2UgaWYgKGFsbG93X2RpcnMgIT0gTlVMTCAmJiB2aW1faXNwYXRoc2VwKCpwKSkKIAkJICAgICphbGxvd19kaXJzID0gVFJVRTsKIAkJcmVnX3BhdFtpKytdID0gKnA7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL2ZvbGQuYyBiL3NyYy9mb2xkLmMKaW5kZXggZWJhMzJlYy4uNzQ0NmY3YyAxMDA2NDQKLS0tIGEvc3JjL2ZvbGQuYworKysgYi9zcmMvZm9sZC5jCkBAIC0xMDU3LDExICsxMDU3LDkgQEAKIAllbmQtPmNvbCA9IChjb2xucl9UKVNUUkxFTihwdHIpOwogCWlmIChlbmQtPmNvbCA+IDAgJiYgKnBfc2VsID09ICdvJykKIAkgICAgLS1lbmQtPmNvbDsKLSNpZmRlZiBGRUFUX01CWVRFCiAJLyogcHJldmVudCBjdXJzb3IgZnJvbSBtb3Zpbmcgb24gdGhlIHRyYWlsIGJ5dGUgKi8KIAlpZiAoaGFzX21ieXRlKQogCSAgICBtYl9hZGp1c3RfY3Vyc29yKCk7Ci0jZW5kaWYKICAgICB9CiB9CiAKQEAgLTE5NDYsNyArMTk0NCw2IEBACiAJICAgICAqIHJlcGxhY2UgYSBUQUIgd2l0aCBhIHNwYWNlLiAqLwogCSAgICBmb3IgKHAgPSB0ZXh0OyAqcCAhPSBOVUw7ICsrcCkKIAkgICAgewotIyBpZmRlZiBGRUFUX01CWVRFCiAJCWludAlsZW47CiAKIAkJaWYgKGhhc19tYnl0ZSAmJiAobGVuID0gKCptYl9wdHIybGVuKShwKSkgPiAxKQpAQCAtMTk1Niw3ICsxOTUzLDYgQEAKIAkJICAgIHAgKz0gbGVuIC0gMTsKIAkJfQogCQllbHNlCi0jIGVuZGlmCiAJCSAgICBpZiAoKnAgPT0gVEFCKQogCQkJKnAgPSAnICc7CiAJCSAgICBlbHNlIGlmIChwdHIyY2VsbHMocCkgPiAxKQpkaWZmIC0tZ2l0IGEvc3JjL2d1aS5jIGIvc3JjL2d1aS5jCmluZGV4IDkyNzhkZjkuLmNiYmUyYWYgMTAwNjQ0Ci0tLSBhL3NyYy9ndWkuYworKysgYi9zcmMvZ3VpLmMKQEAgLTEzLDcgKzEzLDcgQEAKIC8qIFN0cnVjdHVyZSBjb250YWluaW5nIGFsbCB0aGUgR1VJIGluZm9ybWF0aW9uICovCiBndWlfVCBndWk7CiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyNpZiAhZGVmaW5lZChGRUFUX0dVSV9HVEspCiBzdGF0aWMgdm9pZCBzZXRfZ3VpZm9udHdpZGUoY2hhcl91ICpmb250X25hbWUpOwogI2VuZGlmCiBzdGF0aWMgdm9pZCBndWlfY2hlY2tfcG9zKHZvaWQpOwpAQCAtMzk3LDEzICszOTcsMTEgQEAKICAgICBndWkuZm9udHNldCA9IE5PRk9OVFNFVDsKICMgZW5kaWYKICNlbmRpZgotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBndWkud2lkZV9mb250ID0gTk9GT05UOwotIyBpZm5kZWYgRkVBVF9HVUlfR1RLCisjaWZuZGVmIEZFQVRfR1VJX0dUSwogICAgIGd1aS53aWRlX2JvbGRfZm9udCA9IE5PRk9OVDsKICAgICBndWkud2lkZV9pdGFsX2ZvbnQgPSBOT0ZPTlQ7CiAgICAgZ3VpLndpZGVfYm9sZGl0YWxfZm9udCA9IE5PRk9OVDsKLSMgZW5kaWYKICNlbmRpZgogCiAjaWZkZWYgRkVBVF9NRU5VCkBAIC02NTIsMTAgKzY1MCw4IEBACiAJZW1zZyhfKCJFNjY1OiBDYW5ub3Qgc3RhcnQgR1VJLCBubyB2YWxpZCBmb250IGZvdW5kIikpOwogCWdvdG8gZXJyb3IyOwogICAgIH0KLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGd1aV9nZXRfd2lkZV9mb250KCkgPT0gRkFJTCkKIAllbXNnKF8oIkUyMzE6ICdndWlmb250d2lkZScgaW52YWxpZCIpKTsKLSNlbmRpZgogCiAgICAgZ3VpLm51bV9jb2xzID0gQ29sdW1uczsKICAgICBndWkubnVtX3Jvd3MgPSBSb3dzOwpAQCAtODc0LDcgKzg3MCw3IEBACiAJCSAqIGxvbmdlciBiZSB1c2VkISAqLwogCQlpZiAoZ3VpX21jaF9pbml0X2ZvbnQoZm9udF9uYW1lLCBGQUxTRSkgPT0gT0spCiAJCXsKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpICYmICFkZWZpbmVkKEZFQVRfR1VJX0dUSykKKyNpZiAhZGVmaW5lZChGRUFUX0dVSV9HVEspCiAJCSAgICAvKiBJZiBpdCdzIGEgVW5pY29kZSBmb250LCB0cnkgc2V0dGluZyAnZ3VpZm9udHdpZGUnIHRvIGEKIAkJICAgICAqIHNpbWlsYXIgZG91YmxlLXdpZHRoIGZvbnQuICovCiAJCSAgICBpZiAoKHBfZ3VpZm9udHdpZGUgPT0gTlVMTCB8fCAqcF9ndWlmb250d2lkZSA9PSBOVUwpCkBAIC05MTYsOCArOTEyLDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0jaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQotIyBpZm5kZWYgRkVBVF9HVUlfR1RLCisjaWZuZGVmIEZFQVRfR1VJX0dUSwogLyoKICAqIFRyeSBzZXR0aW5nICdndWlmb250d2lkZScgdG8gYSBmb250IHR3aWNlIGFzIHdpZGUgYXMgIm5hbWUiLgogICovCkBAIC05NjQsNyArOTU5LDcgQEAKIAl9CiAgICAgfQogfQotIyBlbmRpZiAvKiAhRkVBVF9HVUlfR1RLICovCisjZW5kaWYgLyogIUZFQVRfR1VJX0dUSyAqLwogCiAvKgogICogR2V0IHRoZSBmb250IGZvciAnZ3VpZm9udHdpZGUnLgpAQCAtOTk1LDcgKzk5MCw3IEBACiAgICAgfQogCiAgICAgZ3VpX21jaF9mcmVlX2ZvbnQoZ3VpLndpZGVfZm9udCk7Ci0jIGlmZGVmIEZFQVRfR1VJX0dUSworI2lmZGVmIEZFQVRfR1VJX0dUSwogICAgIC8qIEF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkIGlmICdndWlmb250d2lkZScgaXMgZXF1YWwgdG8gJ2d1aWZvbnQnLiAqLwogICAgIGlmIChmb250ICE9IE5PRk9OVCAmJiBndWkubm9ybV9mb250ICE9IE5PRk9OVAogCQkJICYmIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZXF1YWwoZm9udCwgZ3VpLm5vcm1fZm9udCkpCkBAIC0xMDA0LDE5ICs5OTksMTggQEAKIAlndWlfbWNoX2ZyZWVfZm9udChmb250KTsKICAgICB9CiAgICAgZWxzZQotIyBlbmRpZgorI2VuZGlmCiAJZ3VpLndpZGVfZm9udCA9IGZvbnQ7Ci0jIGlmZGVmIEZFQVRfR1VJX01TV0lOCisjaWZkZWYgRkVBVF9HVUlfTVNXSU4KICAgICBndWlfbWNoX3dpZGVfZm9udF9jaGFuZ2VkKCk7Ci0jIGVsc2UKKyNlbHNlCiAgICAgLyoKICAgICAgKiBUT0RPOiBzZXR1cCB3aWRlX2JvbGRfZm9udCwgd2lkZV9pdGFsX2ZvbnQgYW5kIHdpZGVfYm9sZGl0YWxfZm9udCB0bwogICAgICAqIHN1cHBvcnQgdGhvc2UgZm9udHMgZm9yICdndWlmb250d2lkZScuCiAgICAgICovCi0jIGVuZGlmCisjZW5kaWYKICAgICByZXR1cm4gT0s7CiB9Ci0jZW5kaWYKIAogICAgIHZvaWQKIGd1aV9zZXRfY3Vyc29yKGludCByb3csIGludCBjb2wpCkBAIC0xMjU4LDcgKzEyNTIsNyBAQAogCX0KIAllbHNlCiAJewotI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkKKyNpZiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKQogCSAgICBpbnQJICAgIGNvbF9vZmYgPSBGQUxTRTsKICNlbmRpZgogCSAgICAvKgpAQCAtMTI3NSwxNCArMTI2OSwxMyBAQAogCQljdXJfaGVpZ2h0ID0gKGd1aS5jaGFyX2hlaWdodCAqIHNoYXBlLT5wZXJjZW50YWdlICsgOTkpIC8gMTAwOwogCQljdXJfd2lkdGggPSBndWkuY2hhcl93aWR0aDsKIAkgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKIAkgICAgaWYgKGhhc19tYnl0ZSAmJiAoKm1iX29mZjJjZWxscykoTGluZU9mZnNldFtndWkucm93XSArIGd1aS5jb2wsCiAJCQkJICAgIExpbmVPZmZzZXRbZ3VpLnJvd10gKyBzY3JlZW5fQ29sdW1ucykgPiAxKQogCSAgICB7CiAJCS8qIERvdWJsZSB3aWRlIGNoYXJhY3Rlci4gKi8KIAkJaWYgKHNoYXBlLT5zaGFwZSAhPSBTSEFQRV9WRVIpCiAJCSAgICBjdXJfd2lkdGggKz0gZ3VpLmNoYXJfd2lkdGg7Ci0jIGlmZGVmIEZFQVRfUklHSFRMRUZUCisjaWZkZWYgRkVBVF9SSUdIVExFRlQKIAkJaWYgKENVUlNPUl9CQVJfUklHSFQpCiAJCXsKIAkJICAgIC8qIGd1aS5jb2wgcG9pbnRzIHRvIHRoZSBsZWZ0IGhhbHZlIG9mIHRoZSBjaGFyYWN0ZXIgYnV0CkBAIC0xMjkyLDExICsxMjg1LDEwIEBACiAJCSAgICBjb2xfb2ZmID0gVFJVRTsKIAkJICAgICsrZ3VpLmNvbDsKIAkJfQotIyBlbmRpZgotCSAgICB9CiAjZW5kaWYKKwkgICAgfQogCSAgICBndWlfbWNoX2RyYXdfcGFydF9jdXJzb3IoY3VyX3dpZHRoLCBjdXJfaGVpZ2h0LCBjYmcpOwotI2lmIGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChGRUFUX1JJR0hUTEVGVCkKKyNpZiBkZWZpbmVkKEZFQVRfUklHSFRMRUZUKQogCSAgICBpZiAoY29sX29mZikKIAkJLS1ndWkuY29sOwogI2VuZGlmCkBAIC0yMDIzLDkgKzIwMTUsNyBAQAogZ3VpX291dHN0cihjaGFyX3UgKnMsIGludCBsZW4pCiB7CiAgICAgaW50CSAgICB0aGlzX2xlbjsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgaW50CSAgICBjZWxsczsKLSNlbmRpZgogCiAgICAgaWYgKGxlbiA9PSAwKQogCXJldHVybjsKQEAgLTIwMzUsNyArMjAyNSw2IEBACiAKICAgICB3aGlsZSAobGVuID4gMCkKICAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCWlmIChoYXNfbWJ5dGUpCiAJewogCSAgICAvKiBGaW5kIG91dCBob3cgbWFueSBjaGFycyBmaXQgaW4gdGhlIGN1cnJlbnQgbGluZS4gKi8KQEAgLTIwNTEsNyArMjA0MCw2IEBACiAJCXRoaXNfbGVuID0gbGVuOwkgICAgLyogZG9uJ3QgaW5jbHVkZSBmb2xsb3dpbmcgY29tcG9zaW5nIGNoYXIgKi8KIAl9CiAJZWxzZQotI2VuZGlmCiAJICAgIGlmIChndWkuY29sICsgbGVuID4gQ29sdW1ucykKIAkgICAgdGhpc19sZW4gPSBDb2x1bW5zIC0gZ3VpLmNvbDsKIAllbHNlCkBAIC0yMDYxLDEyICsyMDQ5LDEwIEBACiAJCQkJCSAgMCwgKGd1aWNvbG9yX1QpMCwgKGd1aWNvbG9yX1QpMCwgMCk7CiAJcyArPSB0aGlzX2xlbjsKIAlsZW4gLT0gdGhpc19sZW47Ci0jaWZkZWYgRkVBVF9NQllURQogCS8qIGZpbGwgdXAgZm9yIGEgZG91YmxlLXdpZHRoIGNoYXIgdGhhdCBkb2Vzbid0IGZpdC4gKi8KIAlpZiAobGVuID4gMCAmJiBndWkuY29sIDwgQ29sdW1ucykKIAkgICAgKHZvaWQpZ3VpX291dHN0cl9ub3dyYXAoKGNoYXJfdSAqKSIgIiwgMSwKIAkJCQkJICAwLCAoZ3VpY29sb3JfVCkwLCAoZ3VpY29sb3JfVCkwLCAwKTsKLSNlbmRpZgogCS8qIFRoZSBjdXJzb3IgbWF5IHdyYXAgdG8gdGhlIG5leHQgbGluZS4gKi8KIAlpZiAoZ3VpLmNvbCA+PSBDb2x1bW5zKQogCXsKQEAgLTIwODksNyArMjA3NSw2IEBACiAgICAgZ3VpY29sb3JfVAliZywJICAgIC8qIGNvbG9ycyBmb3IgY3Vyc29yICovCiAgICAgaW50CQliYWNrKQkgICAgLyogYmFja3VwIHRoaXMgbWFueSBjaGFycyB3aGVuIHVzaW5nIGJvbGQgdHJpY2sgKi8KIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgY2hhcl91CWJ1ZltNQl9NQVhCWVRFUyArIDFdOwogCiAgICAgLyogRG9uJ3QgZHJhdyByaWdodCBoYWx2ZSBvZiBhIGRvdWJsZS13aWR0aCBVVEYtOCBjaGFyLiAiY2Fubm90IGhhcHBlbiIgKi8KQEAgLTIxMTIsOSArMjA5Nyw2IEBACiAgICAgcmV0dXJuIGd1aV9vdXRzdHJfbm93cmFwKFNjcmVlbkxpbmVzICsgb2ZmLAogCSAgICBlbmNfZGJjcyA/ICgqbWJfcHRyMmxlbikoU2NyZWVuTGluZXMgKyBvZmYpIDogMSwKIAkJCQkJCQkgZmxhZ3MsIGZnLCBiZywgYmFjayk7Ci0jZWxzZQotICAgIHJldHVybiBndWlfb3V0c3RyX25vd3JhcChTY3JlZW5MaW5lcyArIG9mZiwgMSwgZmxhZ3MsIGZnLCBiZywgYmFjayk7Ci0jZW5kaWYKIH0KIAogI2lmZGVmIEZFQVRfR1VJX0dUSwpAQCAtMjIyMyw5ICsyMjA1LDcgQEAKICAgICBndWljb2xvcl9UCXNwX2NvbG9yOwogI2lmICFkZWZpbmVkKEZFQVRfR1VJX0dUSykKICAgICBHdWlGb250CWZvbnQgPSBOT0ZPTlQ7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKICAgICBHdWlGb250CXdpZGVfZm9udCA9IE5PRk9OVDsKLSMgZW5kaWYKICMgaWZkZWYgRkVBVF9YRk9OVFNFVAogICAgIEd1aUZvbnRzZXQJZm9udHNldCA9IE5PRk9OVFNFVDsKICMgZW5kaWYKQEAgLTIzMTYsNyArMjI5Niw2IEBACiAJZWxzZQogCSAgICBmb250ID0gZ3VpLm5vcm1fZm9udDsKIAotIyBpZmRlZiBGRUFUX01CWVRFCiAJLyoKIAkgKiBDaG9vc2UgY29ycmVjdCB3aWRlX2ZvbnQgYnkgZm9udC4gIHdpZGVfZm9udCBzaG91bGQgYmUgc2V0IHdpdGggZm9udAogCSAqIGF0IHNhbWUgdGltZSBpbiBhYm92ZSBibG9jay4gIEJ1dCBpdCB3aWxsIG1ha2UgbWFueSAiaWZkZWYiIG5hc3R5CkBAIC0yMzMwLDggKzIzMDksNiBAQAogCSAgICB3aWRlX2ZvbnQgPSBndWkud2lkZV9pdGFsX2ZvbnQ7CiAJZWxzZSBpZiAoZm9udCA9PSBndWkubm9ybV9mb250ICYmIGd1aS53aWRlX2ZvbnQpCiAJICAgIHdpZGVfZm9udCA9IGd1aS53aWRlX2ZvbnQ7Ci0jIGVuZGlmCi0KICAgICB9CiAjIGlmZGVmIEZFQVRfWEZPTlRTRVQKICAgICBpZiAoZm9udHNldCAhPSBOT0ZPTlRTRVQpCkBAIC0yNDQxLDcgKzI0MTgsNiBAQAogICAgIC8qIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgbGVuZ3RoIGluIGRpc3BsYXkgY2VsbHMgKi8KICAgICBsZW4gPSBndWlfZ3RrMl9kcmF3X3N0cmluZyhndWkucm93LCBjb2wsIHMsIGxlbiwgZHJhd19mbGFncyk7CiAjZWxzZQotIyBpZmRlZiBGRUFUX01CWVRFCiAgICAgaWYgKGVuY191dGY4KQogICAgIHsKIAlpbnQJc3RhcnQ7CQkvKiBpbmRleCBvZiBieXRlcyB0byBiZSBkcmF3biAqLwpAQCAtMjQ1NiwxMSArMjQzMiwxMSBAQAogCWludAljdXJyX3dpZGUgPSBGQUxTRTsgIC8qIHVzZSAnZ3VpZm9udHdpZGUnICovCiAJaW50CXByZXZfd2lkZSA9IEZBTFNFOwogCWludAl3aWRlX2NoYW5nZWQ7Ci0jICBpZmRlZiBXSU4zMjY0CisjIGlmZGVmIFdJTjMyNjQKIAlpbnQJc2VwX2NvbXAgPSBGQUxTRTsgICAvKiBEb24ndCBzZXBhcmF0ZSBjb21wb3NpbmcgY2hhcnMuICovCi0jICBlbHNlCisjIGVsc2UKIAlpbnQJc2VwX2NvbXAgPSBUUlVFOyAgICAvKiBTZXBhcmF0ZSBjb21wb3NpbmcgY2hhcnMuICovCi0jICBlbmRpZgorIyBlbmRpZgogCiAJLyogQnJlYWsgdGhlIHN0cmluZyBhdCBhIGNvbXBvc2luZyBjaGFyYWN0ZXIsIGl0IGhhcyB0byBiZSBkcmF3biBvbgogCSAqIHRvcCBvZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLiAqLwpAQCAtMjQ3Niw5ICsyNDUyLDkgQEAKIAkgICAgaWYgKCFjb21waW5nIHx8IHNlcF9jb21wKQogCSAgICB7CiAJCWlmIChjbiA+IDEKLSMgIGlmZGVmIEZFQVRfWEZPTlRTRVQKKyMgaWZkZWYgRkVBVF9YRk9OVFNFVAogCQkJJiYgZm9udHNldCA9PSBOT0ZPTlRTRVQKLSMgIGVuZGlmCisjIGVuZGlmCiAJCQkmJiB3aWRlX2ZvbnQgIT0gTk9GT05UKQogCQkgICAgY3Vycl93aWRlID0gVFJVRTsKIAkJZWxzZQpAQCAtMjQ5NCwxNSArMjQ3MCwxNSBAQAogCSAgICAgKiBhIGNvbXBvc2luZyBjaGFyYWN0ZXIuICovCiAJICAgIGlmIChpICsgY2wgPj0gbGVuIHx8IChjb21waW5nICYmIHNlcF9jb21wICYmIGkgPiBzdGFydCkKIAkJICAgIHx8IHdpZGVfY2hhbmdlZAotIyAgaWYgZGVmaW5lZChGRUFUX0dVSV9YMTEpCisjIGlmIGRlZmluZWQoRkVBVF9HVUlfWDExKQogCQkgICAgfHwgKGNuID4gMQotIyAgIGlmZGVmIEZFQVRfWEZPTlRTRVQKKyMgIGlmZGVmIEZFQVRfWEZPTlRTRVQKIAkJCS8qIE5vIGZvbnRzZXQ6IEF0IGxlYXN0IGRyYXcgY2hhciBhZnRlciB3aWRlIGNoYXIgYXQKIAkJCSAqIHJpZ2h0IHBvc2l0aW9uLiAqLwogCQkJJiYgZm9udHNldCA9PSBOT0ZPTlRTRVQKLSMgICBlbmRpZgotCQkgICAgICAgKQogIyAgZW5kaWYKKwkJICAgICAgICkKKyMgZW5kaWYKIAkgICAgICAgKQogCSAgICB7CiAJCWlmICgoY29tcGluZyAmJiBzZXBfY29tcCkgfHwgd2lkZV9jaGFuZ2VkKQpAQCAtMjUyOSwyOSArMjUwNSwyOSBAQAogCQkgICAgY2wgPSAwOwogCQl9CiAKLSMgIGlmIGRlZmluZWQoRkVBVF9HVUlfWDExKQorIyBpZiBkZWZpbmVkKEZFQVRfR1VJX1gxMSkKIAkJLyogTm8gZm9udHNldDogZHJhdyBhIHNwYWNlIHRvIGZpbGwgdGhlIGdhcCBhZnRlciBhIHdpZGUgY2hhcgogCQkgKiAqLwogCQlpZiAoY24gPiAxICYmIChkcmF3X2ZsYWdzICYgRFJBV19UUkFOU1ApID09IDAKLSMgICBpZmRlZiBGRUFUX1hGT05UU0VUCisjICBpZmRlZiBGRUFUX1hGT05UU0VUCiAJCQkmJiBmb250c2V0ID09IE5PRk9OVFNFVAotIyAgIGVuZGlmCisjICBlbmRpZgogCQkJJiYgIXdpZGVfY2hhbmdlZCkKIAkJICAgIGd1aV9tY2hfZHJhd19zdHJpbmcoZ3VpLnJvdywgc2NvbCAtIDEsIChjaGFyX3UgKikiICIsCiAJCQkJCQkJICAgICAgIDEsIGRyYXdfZmxhZ3MpOwotIyAgZW5kaWYKKyMgZW5kaWYKIAkgICAgfQogCSAgICAvKiBEcmF3IGEgY29tcG9zaW5nIGNoYXIgb24gdG9wIG9mIHRoZSBwcmV2aW91cyBjaGFyLiAqLwogCSAgICBpZiAoY29tcGluZyAmJiBzZXBfY29tcCkKIAkgICAgewotIyAgaWYgZGVmaW5lZChfX0FQUExFX0NDX18pICYmIFRBUkdFVF9BUElfTUFDX0NBUkJPTgorIyBpZiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykgJiYgVEFSR0VUX0FQSV9NQUNfQ0FSQk9OCiAJCS8qIENhcmJvbiBBVFNVSSBhdXRvZHJhd3MgY29tcG9zaW5nIGNoYXIgb3ZlciBwcmV2aW91cyBjaGFyICovCiAJCWd1aV9tY2hfZHJhd19zdHJpbmcoZ3VpLnJvdywgc2NvbCwgcyArIGksIGNsLAogCQkJCQkJICAgIGRyYXdfZmxhZ3MgfCBEUkFXX1RSQU5TUCk7Ci0jICBlbHNlCisjIGVsc2UKIAkJZ3VpX21jaF9kcmF3X3N0cmluZyhndWkucm93LCBzY29sIC0gY24sIHMgKyBpLCBjbCwKIAkJCQkJCSAgICBkcmF3X2ZsYWdzIHwgRFJBV19UUkFOU1ApOwotIyAgZW5kaWYKKyMgZW5kaWYKIAkJc3RhcnQgPSBpICsgY2w7CiAJICAgIH0KIAkgICAgcHJldl93aWRlID0gY3Vycl93aWRlOwpAQCAtMjU2MCwxNyArMjUzNiwxNCBAQAogCWxlbiA9IHNjb2wgLSBjb2w7CiAgICAgfQogICAgIGVsc2UKLSMgZW5kaWYKICAgICB7CiAJZ3VpX21jaF9kcmF3X3N0cmluZyhndWkucm93LCBjb2wsIHMsIGxlbiwgZHJhd19mbGFncyk7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIAlpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VKQogCXsKIAkgICAgLyogR2V0IHRoZSBsZW5ndGggaW4gZGlzcGxheSBjZWxscywgdGhpcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlCiAJICAgICAqIG51bWJlciBvZiBieXRlcyBmb3IgImV1Yy1qcCIuICovCiAJICAgIGxlbiA9IG1iX3N0cmluZzJjZWxscyhzLCBsZW4pOwogCX0KLSMgZW5kaWYKICAgICB9CiAjZW5kaWYgLyogIUZFQVRfR1VJX0dUSyAqLwogCkBAIC0yNjk3LDkgKzI2NzAsNyBAQAogICAgIGludAkJaWR4LCBsZW47CiAgICAgaW50CQliYWNrLCBuYmFjazsKICAgICBpbnQJCXJldHZhbCA9IEZBTFNFOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpbnQJCW9yaWdfY29sMSwgb3JpZ19jb2wyOwotI2VuZGlmCiAKICAgICAvKiBEb24ndCB0cnkgdG8gdXBkYXRlIHdoZW4gU2NyZWVuTGluZXMgaXMgbm90IHZhbGlkICovCiAgICAgaWYgKCFzY3JlZW5fY2xlYXJlZCB8fCBTY3JlZW5MaW5lcyA9PSBOVUxMKQpAQCAtMjcxNiwxNCArMjY4NywxMSBAQAogICAgIG9sZF9yb3cgPSBndWkucm93OwogICAgIG9sZF9jb2wgPSBndWkuY29sOwogICAgIG9sZF9obF9tYXNrID0gZ3VpLmhpZ2hsaWdodF9tYXNrOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBvcmlnX2NvbDEgPSBjb2wxOwogICAgIG9yaWdfY29sMiA9IGNvbDI7Ci0jZW5kaWYKIAogICAgIGZvciAoZ3VpLnJvdyA9IHJvdzE7IGd1aS5yb3cgPD0gcm93MjsgZ3VpLnJvdysrKQogICAgIHsKLSNpZmRlZiBGRUFUX01CWVRFCiAJLyogV2hlbiBvbmx5IGhhbGYgb2YgYSBkb3VibGUtd2lkZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIGJsb2NrLCBpbmNsdWRlCiAJICogdGhlIG90aGVyIGhhbGYuICovCiAJY29sMSA9IG9yaWdfY29sMTsKQEAgLTI3NTMsMTIgKzI3MjEsMTEgQEAKIAkJICAgIG1zZygoY2hhciAqKUlPYnVmZik7CiAJCX0KIAkgICAgfQotIyBpZmRlZiBGRUFUX0dVSV9HVEsKKyNpZmRlZiBGRUFUX0dVSV9HVEsKIAkgICAgaWYgKGNvbDIgKyAxIDwgQ29sdW1ucyAmJiBTY3JlZW5MaW5lc1tvZmYgKyBjb2wyICsgMV0gPT0gMCkKIAkJKytjb2wyOwotIyBlbmRpZgotCX0KICNlbmRpZgorCX0KIAlndWkuY29sID0gY29sMTsKIAlvZmYgPSBMaW5lT2Zmc2V0W2d1aS5yb3ddICsgZ3VpLmNvbDsKIAlsZW4gPSBjb2wyIC0gY29sMSArIDE7CkBAIC0yNzc4LDcgKzI3NDUsNyBAQAogCXsKIAkgICAgZmlyc3RfYXR0ciA9IFNjcmVlbkF0dHJzW29mZl07CiAJICAgIGd1aS5oaWdobGlnaHRfbWFzayA9IGZpcnN0X2F0dHI7Ci0jaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9HVEspCisjaWYgIWRlZmluZWQoRkVBVF9HVUlfR1RLKQogCSAgICBpZiAoZW5jX3V0ZjggJiYgU2NyZWVuTGluZXNVQ1tvZmZdICE9IDApCiAJICAgIHsKIAkJLyogb3V0cHV0IG11bHRpLWJ5dGUgY2hhcmFjdGVyIHNlcGFyYXRlbHkgKi8KQEAgLTI4MTQsNyArMjc4MSw2IEBACiAJCWZvciAoaWR4ID0gMDsgaWR4IDwgbGVuICYmIFNjcmVlbkF0dHJzW29mZiArIGlkeF0gPT0gZmlyc3RfYXR0cjsKIAkJCQkJCQkJCWlkeCsrKQogCQl7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIAkJICAgIC8qIFN0b3AgYXQgYSBtdWx0aS1ieXRlIFVuaWNvZGUgY2hhcmFjdGVyLiAqLwogCQkgICAgaWYgKGVuY191dGY4ICYmIFNjcmVlbkxpbmVzVUNbb2ZmICsgaWR4XSAhPSAwKQogCQkJYnJlYWs7CkBAIC0yODI3LDcgKzI3OTMsNiBAQAogCQkJCQkJCSAgICArIG9mZiArIGlkeCkgPT0gMikKIAkJCSAgICArK2lkeDsgIC8qIHNraXAgc2Vjb25kIGJ5dGUgb2YgZG91YmxlLWJ5dGUgY2hhciAqLwogCQkgICAgfQotIyBlbmRpZgogCQl9CiAJCW5iYWNrID0gZ3VpX291dHN0cl9ub3dyYXAoU2NyZWVuTGluZXMgKyBvZmYsIGlkeCwgZmxhZ3MsCiAJCQkJCSAgKGd1aWNvbG9yX1QpMCwgKGd1aWNvbG9yX1QpMCwgYmFjayk7CkBAIC0zMzkwLDExICszMzU1LDcgQEAKICAgICBpbnQJCWNvbCA9IGNoZWNrX2NvbChYXzJfQ09MKHgpKTsKICAgICBpbnQJCXJvdyA9IGNoZWNrX3JvdyhZXzJfUk9XKHkpKTsKIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICAqY29scCA9IG1iX2ZpeF9jb2woY29sLCByb3cpOwotI2Vsc2UKLSAgICAqY29scCA9IGNvbDsKLSNlbmRpZgogICAgIHJldHVybiByb3c7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9ndWlfbWFjLmMgYi9zcmMvZ3VpX21hYy5jCmluZGV4IGNkMjdiYjQuLjIzMmI2ZjIgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfbWFjLmMKKysrIGIvc3JjL2d1aV9tYWMuYwpAQCAtNDgsMTEgKzQ4LDcgQEAKIAogLyogVmltJ3MgU2NyYXAgZmxhdm9yLiAqLwogI2RlZmluZSBWSU1TQ1JBUEZMQVZPUiAnVklNIScKLSNpZmRlZiBGRUFUX01CWVRFCi0jIGRlZmluZSBTQ1JBUFRFWFRGTEFWT1Iga1NjcmFwRmxhdm9yVHlwZVVuaWNvZGUKLSNlbHNlCi0jIGRlZmluZSBTQ1JBUFRFWFRGTEFWT1Iga1NjcmFwRmxhdm9yVHlwZVRleHQKLSNlbmRpZgorI2RlZmluZSBTQ1JBUFRFWFRGTEFWT1Iga1NjcmFwRmxhdm9yVHlwZVVuaWNvZGUKIAogc3RhdGljIEV2ZW50SGFuZGxlclVQUCBtb3VzZVdoZWVsSGFuZGxlclVQUCA9IE5VTEw7CiBTSW50MzIgZ01hY1N5c3RlbVZlcnNpb247CkBAIC0xNjksOSArMTY1LDcgQEAKICMgZGVmaW5lIFVTRV9BVFNVSV9EUkFXSU5HCiBpbnQJICAgIHBfbWFjYXRzdWlfbGFzdDsKIEFUU1VTdHlsZSAgIGdGb250U3R5bGU7Ci0jIGlmZGVmIEZFQVRfTUJZVEUKIEFUU1VTdHlsZSAgIGdXaWRlRm9udFN0eWxlOwotIyBlbmRpZgogQm9vbGVhbgkgICAgZ0lzRm9udEZhbGxiYWNrU2V0OwogVUludDMyICAgICAgdXNlQW50aWFsaWFzX2NhY2hlZCA9IDB4MDsKICNlbmRpZgpAQCAtMjAzNSwxNSArMjAyOSwxMSBAQAogCXN3aXRjaCAoZXZlbnRLaW5kKQogCXsKIAkgICAgY2FzZSBrRXZlbnRXaW5kb3dBY3RpdmF0ZWQ6Ci0jIGlmIGRlZmluZWQoRkVBVF9NQllURSkKIAkJaW1fb25fd2luZG93X3N3aXRjaChUUlVFKTsKLSMgZW5kaWYKIAkJcmV0dXJuIG5vRXJyOwogCiAJICAgIGNhc2Uga0V2ZW50V2luZG93RGVhY3RpdmF0ZWQ6Ci0jIGlmIGRlZmluZWQoRkVBVF9NQllURSkKIAkJaW1fb25fd2luZG93X3N3aXRjaChGQUxTRSk7Ci0jIGVuZGlmCiAJCXJldHVybiBub0VycjsKIAl9CiAgICAgfQpAQCAtMjM5MSw3ICsyMzgxLDYgQEAKIAl9CiAJZWxzZQogCXsKLSNpZmRlZiBGRUFUX01CWVRFCiAJICAgIC8qIENvbnZlcnQgY2hhcmFjdGVycyB3aGVuIG5lZWRlZCAoZS5nLiwgZnJvbSBNYWNSb21hbiB0byBsYXRpbjEpLgogCSAgICAgKiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgdGhlIE5VTCBieXRlLiAqLwogCSAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSAmJiBrZXlfY2hhciA+IDApCkBAIC0yNDIxLDcgKzI0MTAsNiBAQAogCQkgICAgc3RyaW5nW2xlbisrXSA9IGtleV9jaGFyOwogCSAgICB9CiAJICAgIGVsc2UKLSNlbmRpZgogCQlzdHJpbmdbbGVuKytdID0ga2V5X2NoYXI7CiAJfQogCkBAIC0zMTk1LDEyICszMTgzLDYgQEAKICAgICB9CiAjZW5kaWYKIAotLyoKLSNpZmRlZiBGRUFUX01CWVRFCi0gICAgc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImVuY29kaW5nIiwgMEwsIChjaGFyX3UgKikidXRmLTgiLCAwKTsKLSNlbmRpZgotKi8KLQogI2lmZGVmIEZFQVRfR1VJX1RBQkxJTkUKICAgICAvKgogICAgICAqIENyZWF0ZSB0aGUgdGFibGluZQpAQCAtMzI1NCwxMCArMzIzNiw4IEBACiB7CiAgICAgaWYgKHBfbWFjYXRzdWkgJiYgZ0ZvbnRTdHlsZSkKIAlBVFNVRGlzcG9zZVN0eWxlKGdGb250U3R5bGUpOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAocF9tYWNhdHN1aSAmJiBnV2lkZUZvbnRTdHlsZSkKIAlBVFNVRGlzcG9zZVN0eWxlKGdXaWRlRm9udFN0eWxlKTsKLSNlbmRpZgogfQogI2VuZGlmCiAKQEAgLTM0MzAsMTMgKzM0MTAsMTEgQEAKIAlpZiAoQVRTVUNyZWF0ZVN0eWxlKCZnRm9udFN0eWxlKSAhPSBub0VycikKIAkgICAgZ0ZvbnRTdHlsZSA9IE5VTEw7CiAgICAgfQotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAocF9tYWNhdHN1aSAmJiBnV2lkZUZvbnRTdHlsZSA9PSBOVUxMKQogICAgIHsKIAlpZiAoQVRTVUNyZWF0ZVN0eWxlKCZnV2lkZUZvbnRTdHlsZSkgIT0gbm9FcnIpCiAJICAgIGdXaWRlRm9udFN0eWxlID0gTlVMTDsKICAgICB9Ci0jZW5kaWYKIAogICAgIHBfbWFjYXRzdWlfbGFzdCA9IHBfbWFjYXRzdWk7CiB9CkBAIC0zNjIyLDcgKzM2MDAsNiBAQAogCSAgICBnRm9udFN0eWxlID0gTlVMTDsKIAl9CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKIAl7CiAJICAgIC8qIEZJWE1FOiB3ZSBzaG91bGQgdXNlIGEgbW9yZSBtYnl0ZSBzZW5zaXRpdmUgd2F5IHRvIHN1cHBvcnQKQEAgLTM2MzcsNyArMzYxNCw2IEBACiAJCWdXaWRlRm9udFN0eWxlID0gTlVMTDsKIAkgICAgfQogCX0KLSNlbmRpZgogICAgIH0KIH0KICNlbmRpZgpAQCAtMzgxMSw3ICszNzg3LDYgQEAKICAgICBzdGF0aWMgdm9pZAogZHJhd19zdHJpbmdfUUQoaW50IHJvdywgaW50IGNvbCwgY2hhcl91ICpzLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCiB7Ci0jaWZkZWYgRkVBVF9NQllURQogICAgIGNoYXJfdQkqdG9mcmVlID0gTlVMTDsKIAogICAgIGlmIChvdXRwdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKQEAgLTM4MjAsNyArMzc5NSw2IEBACiAJaWYgKHRvZnJlZSAhPSBOVUxMKQogCSAgICBzID0gdG9mcmVlOwogICAgIH0KLSNlbmRpZgogCiAgICAgLyoKICAgICAgKiBPbiBPUyBYLCB0cnkgdXNpbmcgUXVhcnR6LXN0eWxlIHRleHQgYW50aWFsaWFzaW5nLgpAQCAtMzg0OSw3ICszODIzLDYgQEAKIAogCXJjLmxlZnQgPSBGSUxMX1goY29sKTsKIAlyYy50b3AgPSBGSUxMX1kocm93KTsKLSNpZmRlZiBGRUFUX01CWVRFCiAJLyogTXVsdGlieXRlIGNvbXB1dGF0aW9uIHRha2VuIGZyb20gZ3VpX3czMi5jICovCiAJaWYgKGhhc19tYnl0ZSkKIAl7CkBAIC0zODU3LDggKzM4MzAsNyBAQAogCSAgICByYy5yaWdodCA9IEZJTExfWChjb2wgKyBtYl9zdHJpbmcyY2VsbHMocywgbGVuKSk7CiAJfQogCWVsc2UKLSNlbmRpZgotCXJjLnJpZ2h0ID0gRklMTF9YKGNvbCArIGxlbikgKyAoY29sICsgbGVuID09IENvbHVtbnMpOworCSAgICByYy5yaWdodCA9IEZJTExfWChjb2wgKyBsZW4pICsgKGNvbCArIGxlbiA9PSBDb2x1bW5zKTsKIAlyYy5ib3R0b20gPSBGSUxMX1kocm93ICsgMSk7CiAJRXJhc2VSZWN0KCZyYyk7CiAgICAgfQpAQCAtMzkxOCw5ICszODkwLDcgQEAKICAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSQykKIAlkcmF3X3VuZGVyY3VybChmbGFncywgcm93LCBjb2wsIGxlbik7CiAKLSNpZmRlZiBGRUFUX01CWVRFCiAgICAgdmltX2ZyZWUodG9mcmVlKTsKLSNlbmRpZgogfQogCiAjaWZkZWYgVVNFX0FUU1VJX0RSQVdJTkcKQEAgLTQwMDcsNyArMzk3Nyw2IEBACiAJICAgIHVzZUFudGlhbGlhc19jYWNoZWQgPSB1c2VBbnRpYWxpYXM7CiAJfQogCi0jaWZkZWYgRkVBVF9NQllURQogCWlmIChoYXNfbWJ5dGUpCiAJewogCSAgICBpbnQgbiwgd2lkdGhfaW5fY2VsbCwgbGFzdF93aWR0aF9pbl9jZWxsOwpAQCAtNDA2OSw3ICs0MDM4LDYgQEAKIAkgICAgQVRTVURpc3Bvc2VUZXh0TGF5b3V0KHRleHRMYXlvdXQpOwogCX0KIAllbHNlCi0jZW5kaWYKIAl7CiAJICAgIEFUU1VUZXh0TGF5b3V0IHRleHRMYXlvdXQ7CiAKQEAgLTQyMjUsMTAgKzQxOTMsOCBAQAogICAgIHJjLmxlZnQgPSBGSUxMX1goZ3VpLmNvbCk7CiAgICAgcmMudG9wID0gRklMTF9ZKGd1aS5yb3cpOwogICAgIHJjLnJpZ2h0ID0gcmMubGVmdCArIGd1aS5jaGFyX3dpZHRoOwotI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAobWJfbGVmdGhhbHZlKGd1aS5yb3csIGd1aS5jb2wpKQogCXJjLnJpZ2h0ICs9IGd1aS5jaGFyX3dpZHRoOwotI2VuZGlmCiAgICAgcmMuYm90dG9tID0gcmMudG9wICsgZ3VpLmNoYXJfaGVpZ2h0OwogCiAgICAgZ3VpX21jaF9zZXRfZmdfY29sb3IoY29sb3IpOwpAQCAtNDcwNSwxMSArNDY3MSw3IEBACiAgICAgICovCiAgICAgc3RhdGljIGxvbmcJIG5leHRfYXZhaWxfaWQgPSAxMjg7CiAgICAgbG9uZwkgbWVudV9hZnRlcl9tZSA9IDA7IC8qIERlZmF1bHQgdG8gdGhlIGVuZCAqLwotI2lmIGRlZmluZWQoRkVBVF9NQllURSkKICAgICBDRlN0cmluZ1JlZiBuYW1lOwotI2Vsc2UKLSAgICBjaGFyX3UJKm5hbWU7Ci0jZW5kaWYKICAgICBzaG9ydAkgaW5kZXg7CiAgICAgdmltbWVudV9UCSpwYXJlbnQgPSBtZW51LT5wYXJlbnQ7CiAgICAgdmltbWVudV9UCSpicm90aGVyID0gbWVudS0+bmV4dDsKQEAgLTQ3NTAsMTIgKzQ3MTIsOCBAQAogCSAqIE9TU3RhdHVzIFNldE1lbnVUaXRsZShNZW51UmVmLCBDb25zdFN0cjI1NVBhcmFtIHRpdGxlKTsKIAkgKi8KIAltZW51LT5zdWJtZW51X2lkID0gbmV4dF9hdmFpbF9pZDsKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAJaWYgKENyZWF0ZU5ld01lbnUobWVudS0+c3VibWVudV9pZCwgMCwgKE1lbnVSZWYgKikmbWVudS0+c3VibWVudV9oYW5kbGUpID09IG5vRXJyKQogCSAgICBTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcoKE1lbnVSZWYpbWVudS0+c3VibWVudV9oYW5kbGUsIG5hbWUpOwotI2Vsc2UKLQltZW51LT5zdWJtZW51X2hhbmRsZSA9IE5ld01lbnUobWVudS0+c3VibWVudV9pZCwgbmFtZSk7Ci0jZW5kaWYKIAluZXh0X2F2YWlsX2lkKys7CiAgICAgfQogCkBAIC00Nzg0LDIxICs0NzQyLDEzIEBACiAJICogdG8gYXZvaWQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVjb2duaXRpb24gYnkgSW5zZXJ0TWVudUl0ZW0KIAkgKi8KIAlJbnNlcnRNZW51SXRlbShwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCAiXHAgIiwgaWR4KTsgLyogYWZ0ZXJJdGVtICovCi0jaWYgZGVmaW5lZChGRUFUX01CWVRFKQogCVNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7Ci0jZWxzZQotCVNldE1lbnVJdGVtVGV4dChwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbmFtZSk7Ci0jZW5kaWYKIAlTZXRJdGVtQ21kKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCAweDFCKTsKIAlTZXRJdGVtTWFyayhwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCBpZHgrMSwgbWVudS0+c3VibWVudV9pZCk7CiAJSW5zZXJ0TWVudShtZW51LT5zdWJtZW51X2hhbmRsZSwgaGllck1lbnUpOwogICAgIH0KIAotI2lmIGRlZmluZWQoRkVBVF9NQllURSkKICAgICBDRlJlbGVhc2UobmFtZSk7Ci0jZWxzZQotICAgIHZpbV9mcmVlKG5hbWUpOwotI2VuZGlmCiAKICNpZiAwCiAgICAgLyogRG9uZSBieSBWaW0gbGF0ZXIgb24gKi8KQEAgLTQ4MTIsMTEgKzQ3NjIsNyBAQAogICAgIHZvaWQKIGd1aV9tY2hfYWRkX21lbnVfaXRlbSh2aW1tZW51X1QgKm1lbnUsIGludCBpZHgpCiB7Ci0jaWYgZGVmaW5lZChGRUFUX01CWVRFKQogICAgIENGU3RyaW5nUmVmIG5hbWU7Ci0jZWxzZQotICAgIGNoYXJfdQkqbmFtZTsKLSNlbmRpZgogICAgIHZpbW1lbnVfVAkqcGFyZW50ID0gbWVudS0+cGFyZW50OwogICAgIGludAkJbWVudV9pbnNlcnRlZDsKIApAQCAtNDkxMiwyMyArNDg1OCwxNCBAQAogICAgIGlmICghbWVudV9pbnNlcnRlZCkKIAlJbnNlcnRNZW51SXRlbShwYXJlbnQtPnN1Ym1lbnVfaGFuZGxlLCAiXHAgIiwgaWR4KTsgLyogYWZ0ZXJJdGVtICovCiAgICAgLyogU2V0IHRoZSBtZW51IGl0ZW0gbmFtZS4gKi8KLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICAgU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBuYW1lKTsKLSNlbHNlCi0gICAgU2V0TWVudUl0ZW1UZXh0KHBhcmVudC0+c3VibWVudV9oYW5kbGUsIGlkeCsxLCBuYW1lKTsKLSNlbmRpZgogCiAjaWYgMAogICAgIC8qIENhbGxlZCBieSBWaW0gKi8KICAgICBEcmF3TWVudUJhcigpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpCiAgICAgQ0ZSZWxlYXNlKG5hbWUpOwotI2Vsc2UKLSAgICAvKiBUT0RPOiBDYW4gbmFtZSBiZSBmcmVlZD8gKi8KLSAgICB2aW1fZnJlZShuYW1lKTsKLSNlbmRpZgogfQogCiAgICAgdm9pZApAQCAtNjI0Miw3ICs2MTc5LDcgQEAKICNlbmRpZgogfQogCi0jaWYgKGRlZmluZWQoRkVBVF9NQllURSkgJiYgZGVmaW5lZChVU0VfQ0FSQk9OS0VZSEFORExFUikpIHx8IGRlZmluZWQoUFJPVE8pCisjaWYgZGVmaW5lZChVU0VfQ0FSQk9OS0VZSEFORExFUikgfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBJbnB1dCBNZXRob2QgQ29udHJvbCBmdW5jdGlvbnMuCiAgKi8KQEAgLTYzOTEsOCArNjMyOCw3IEBACiAgICAgcmV0dXJuIGltX2lzX2FjdGl2ZTsKIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykgKi8KLQorI2VuZGlmCiAKIAogCmRpZmYgLS1naXQgYS9zcmMvZ3VpX3Bob3Rvbi5jIGIvc3JjL2d1aV9waG90b24uYwppbmRleCA3N2Q3ODczLi4yMzRkMjUwIDEwMDY0NAotLS0gYS9zcmMvZ3VpX3Bob3Rvbi5jCisrKyBiL3NyYy9ndWlfcGhvdG9uLmMKQEAgLTUxMywxMyArNTEzLDggQEAKIAlpZiAoc3BlY2lhbF9rZXlzW2ldLmtleV9zeW0gPT0gMCkKIAl7CiAJICAgIGNoID0gUGhUbzg4NTlfMShrZXkpOwotCSAgICBpZiAoY2ggPT0gLTEKLSNpZmRlZiBGRUFUX01CWVRFCi0JCXx8IChlbmNfdXRmOCAmJiBjaCA+IDEyNykKLSNlbmRpZgotCQkpCisJICAgIGlmIChjaCA9PSAtMSB8fCAoZW5jX3V0ZjggJiYgY2ggPiAxMjcpKQogCSAgICB7Ci0jaWZkZWYgRkVBVF9NQllURQogCQlsZW4gPSBQaEtleVRvTWIoc3RyaW5nLCBrZXkpOwogCQlpZiAobGVuID4gMCkKIAkJewpAQCAtNTQ2LDcgKzU0MSw2IEBACiAJCSAgICByZXR1cm4gUHRfQ09OU1VNRTsKIAkJfQogCQlsZW4gPSAwOwotI2VuZGlmCiAJCWNoID0ga2V5LT5rZXlfY2FwOwogCQlpZiAoY2ggPCAweGZmKQogCQl7CkBAIC0xMDc0LDcgKzEwNjgsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIEZFQVRfTUJZVEUKICAgICB2b2lkCiBndWlfcGhfZW5jb2RpbmdfY2hhbmdlZChpbnQgbmV3X2VuY29kaW5nKQogewpAQCAtMTEwMCw3ICsxMDkzLDYgQEAKIAogICAgIGNoYXJzZXRfdHJhbnNsYXRlID0gUHhUcmFuc2xhdGVTZXQoY2hhcnNldF90cmFuc2xhdGUsIGNoYXJzZXQpOwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTQxLDExICsyMTMzLDcgQEAKICAgICBpZiAoZmxhZ3MgJiBEUkFXX1VOREVSTCkKIAlQZ1NldFVuZGVybGluZShndWkubm9ybV9waXhlbCwgUGdfVFJBTlNQQVJFTlQsIDApOwogCi0gICAgaWYgKGNoYXJzZXRfdHJhbnNsYXRlICE9IE5VTEwKLSNpZmRlZiBGRUFUX01CWVRFCi0JICAgICYmIGVuY191dGY4ID09IDAKLSNlbmRpZgotCSAgICkKKyAgICBpZiAoY2hhcnNldF90cmFuc2xhdGUgIT0gTlVMTCAmJiBlbmNfdXRmOCA9PSAwKQogICAgIHsKIAlpbnQgc3JjX3Rha2VuLCBkc3RfbWFkZTsKIApkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uYyBiL3NyYy92ZXJzaW9uLmMKaW5kZXggODcwNmQ5OC4uZDQ4MTIwMSAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uYworKysgYi9zcmMvdmVyc2lvbi5jCkBAIC03OTIsNiArNzkyLDggQEAKIHN0YXRpYyBpbnQgaW5jbHVkZWRfcGF0Y2hlc1tdID0KIHsgICAvKiBBZGQgbmV3IHBhdGNoIG51bWJlciBiZWxvdyB0aGlzIGxpbmUgKi8KIC8qKi8KKyAgICA4MDUsCisvKiovCiAgICAgODA0LAogLyoqLwogICAgIDgwMywK