LyogaTJjLWNvcmUuYyAtIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIGlpYy1idXMgaW50ZXJmYWNlCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTkgU2ltb24gRy4gVm9nbAoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgkJICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPi4KICAgQWxsIFNNQnVzLXJlbGF0ZWQgdGhpbmdzIGFyZSB3cml0dGVuIGJ5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KICAgU01CdXMgMi4wIHN1cHBvcnQgYnkgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAgICAgICAgICAgICAgICAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2lkci5oPgojaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CgoKc3RhdGljIExJU1RfSEVBRChhZGFwdGVycyk7CnN0YXRpYyBMSVNUX0hFQUQoZHJpdmVycyk7CnN0YXRpYyBERUNMQVJFX01VVEVYKGNvcmVfbGlzdHMpOwpzdGF0aWMgREVGSU5FX0lEUihpMmNfYWRhcHRlcl9pZHIpOwoKLyogbWF0Y2ggYWx3YXlzIHN1Y2NlZWRzLCBhcyB3ZSB3YW50IHRoZSBwcm9iZSgpIHRvIHRlbGwgaWYgd2UgcmVhbGx5IGFjY2VwdCB0aGlzIG1hdGNoICovCnN0YXRpYyBpbnQgaTJjX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCnsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGkyY19idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCWludCByYyA9IDA7CgoJaWYgKGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5zdXNwZW5kKQoJCXJjID0gZGV2LT5kcml2ZXItPnN1c3BlbmQoZGV2LHN0YXRlLDApOwoJcmV0dXJuIHJjOwp9CgpzdGF0aWMgaW50IGkyY19idXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYpCnsKCWludCByYyA9IDA7CgkKCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+cmVzdW1lKQoJCXJjID0gZGV2LT5kcml2ZXItPnJlc3VtZShkZXYsMCk7CglyZXR1cm4gcmM7Cn0KCnN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgaTJjX2J1c190eXBlID0gewoJLm5hbWUgPQkJImkyYyIsCgkubWF0Y2ggPQlpMmNfZGV2aWNlX21hdGNoLAoJLnN1c3BlbmQgPSAgICAgIGkyY19idXNfc3VzcGVuZCwKCS5yZXN1bWUgPSAgICAgICBpMmNfYnVzX3Jlc3VtZSwKfTsKCnN0YXRpYyBpbnQgaTJjX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgaW50IGkyY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gZGV2X3RvX2kyY19hZGFwdGVyKGRldik7Cgljb21wbGV0ZSgmYWRhcC0+ZGV2X3JlbGVhc2VkKTsKfQoKc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGkyY19hZGFwdGVyX2RyaXZlciA9IHsKCS5uYW1lID0JImkyY19hZGFwdGVyIiwKCS5idXMgPSAmaTJjX2J1c190eXBlLAoJLnByb2JlID0gaTJjX2RldmljZV9wcm9iZSwKCS5yZW1vdmUgPSBpMmNfZGV2aWNlX3JlbW92ZSwKfTsKCnN0YXRpYyB2b2lkIGkyY19hZGFwdGVyX2NsYXNzX2Rldl9yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xhc3NfZGV2X3RvX2kyY19hZGFwdGVyKGRldik7Cgljb21wbGV0ZSgmYWRhcC0+Y2xhc3NfZGV2X3JlbGVhc2VkKTsKfQoKc3RhdGljIHN0cnVjdCBjbGFzcyBpMmNfYWRhcHRlcl9jbGFzcyA9IHsKCS5uYW1lID0JCSJpMmMtYWRhcHRlciIsCgkucmVsZWFzZSA9CSZpMmNfYWRhcHRlcl9jbGFzc19kZXZfcmVsZWFzZSwKfTsKCnN0YXRpYyBzc2l6ZV90IHNob3dfYWRhcHRlcl9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSBkZXZfdG9faTJjX2FkYXB0ZXIoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhZGFwLT5uYW1lKTsKfQpzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19hZGFwdGVyX25hbWUsIE5VTEwpOwoKCnN0YXRpYyB2b2lkIGkyY19jbGllbnRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Cgljb21wbGV0ZSgmY2xpZW50LT5yZWxlYXNlZCk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfY2xpZW50X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2xpZW50LT5uYW1lKTsKfQoKLyogCiAqIFdlIGNhbid0IHVzZSB0aGUgREVWSUNFX0FUVFIoKSBtYWNybyBoZXJlIGFzIHdlIHdhbnQgdGhlIHNhbWUgZmlsZW5hbWUgZm9yIGEKICogZGlmZmVyZW50IHR5cGUgb2YgYSBkZXZpY2UuICBTbyBiZXdhcmUgaWYgdGhlIERFVklDRV9BVFRSKCkgbWFjcm8gZXZlcgogKiBjaGFuZ2VzLCB0aGlzIGRlZmluaXRpb24gd2lsbCBhbHNvIGhhdmUgdG8gY2hhbmdlLgogKi8Kc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2NsaWVudF9uYW1lID0gewoJLmF0dHIJPSB7Lm5hbWUgPSAibmFtZSIsIC5tb2RlID0gU19JUlVHTywgLm93bmVyID0gVEhJU19NT0RVTEUgfSwKCS5zaG93CT0gJnNob3dfY2xpZW50X25hbWUsCn07CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyAKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogKi8KCi8qIC0tLS0tCiAqIGkyY19hZGRfYWRhcHRlciBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGFsZ29yaXRobSBsYXllciwKICogd2hlbiBhIG5ldyBodyBhZGFwdGVyIHJlZ2lzdGVycy4gQSBuZXcgZGV2aWNlIGlzIHJlZ2lzdGVyIHRvIGJlCiAqIGF2YWlsYWJsZSBmb3IgY2xpZW50cy4KICovCmludCBpMmNfYWRkX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglpbnQgaWQsIHJlcyA9IDA7CglzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CglzdHJ1Y3QgaTJjX2RyaXZlciAgKmRyaXZlcjsKCglkb3duKCZjb3JlX2xpc3RzKTsKCglpZiAoaWRyX3ByZV9nZXQoJmkyY19hZGFwdGVyX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgewoJCXJlcyA9IC1FTk9NRU07CgkJZ290byBvdXRfdW5sb2NrOwoJfQoKCXJlcyA9IGlkcl9nZXRfbmV3KCZpMmNfYWRhcHRlcl9pZHIsIE5VTEwsICZpZCk7CglpZiAocmVzIDwgMCkgewoJCWlmIChyZXMgPT0gLUVBR0FJTikKCQkJcmVzID0gLUVOT01FTTsKCQlnb3RvIG91dF91bmxvY2s7Cgl9CgoJYWRhcC0+bnIgPSAgaWQgJiBNQVhfSURfTUFTSzsKCWluaXRfTVVURVgoJmFkYXAtPmJ1c19sb2NrKTsKCWluaXRfTVVURVgoJmFkYXAtPmNsaXN0X2xvY2spOwoJbGlzdF9hZGRfdGFpbCgmYWRhcC0+bGlzdCwmYWRhcHRlcnMpOwoJSU5JVF9MSVNUX0hFQUQoJmFkYXAtPmNsaWVudHMpOwoKCS8qIEFkZCB0aGUgYWRhcHRlciB0byB0aGUgZHJpdmVyIGNvcmUuCgkgKiBJZiB0aGUgcGFyZW50IHBvaW50ZXIgaXMgbm90IHNldCB1cCwKCSAqIHdlIGFkZCB0aGlzIGFkYXB0ZXIgdG8gdGhlIGhvc3QgYnVzLgoJICovCglpZiAoYWRhcC0+ZGV2LnBhcmVudCA9PSBOVUxMKQoJCWFkYXAtPmRldi5wYXJlbnQgPSAmcGxhdGZvcm1fYnVzOwoJc3ByaW50ZihhZGFwLT5kZXYuYnVzX2lkLCAiaTJjLSVkIiwgYWRhcC0+bnIpOwoJYWRhcC0+ZGV2LmRyaXZlciA9ICZpMmNfYWRhcHRlcl9kcml2ZXI7CglhZGFwLT5kZXYucmVsZWFzZSA9ICZpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZTsKCWRldmljZV9yZWdpc3RlcigmYWRhcC0+ZGV2KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmYWRhcC0+ZGV2LCAmZGV2X2F0dHJfbmFtZSk7CgoJLyogQWRkIHRoaXMgYWRhcHRlciB0byB0aGUgaTJjX2FkYXB0ZXIgY2xhc3MgKi8KCW1lbXNldCgmYWRhcC0+Y2xhc3NfZGV2LCAweDAwLCBzaXplb2Yoc3RydWN0IGNsYXNzX2RldmljZSkpOwoJYWRhcC0+Y2xhc3NfZGV2LmRldiA9ICZhZGFwLT5kZXY7CglhZGFwLT5jbGFzc19kZXYuY2xhc3MgPSAmaTJjX2FkYXB0ZXJfY2xhc3M7CglzdHJsY3B5KGFkYXAtPmNsYXNzX2Rldi5jbGFzc19pZCwgYWRhcC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUpOwoJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZhZGFwLT5jbGFzc19kZXYpOwoKCS8qIGluZm9ybSBkcml2ZXJzIG9mIG5ldyBhZGFwdGVycyAqLwoJbGlzdF9mb3JfZWFjaChpdGVtLCZkcml2ZXJzKSB7CgkJZHJpdmVyID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2RyaXZlciwgbGlzdCk7CgkJaWYgKGRyaXZlci0+ZmxhZ3MgJiBJMkNfREZfTk9USUZZKQoJCQkvKiBXZSBpZ25vcmUgdGhlIHJldHVybiBjb2RlOyBpZiBpdCBmYWlscywgdG9vIGJhZCAqLwoJCQlkcml2ZXItPmF0dGFjaF9hZGFwdGVyKGFkYXApOwoJfQoKCWRldl9kYmcoJmFkYXAtPmRldiwgInJlZ2lzdGVyZWQgYXMgYWRhcHRlciAjJWRcbiIsIGFkYXAtPm5yKTsKCm91dF91bmxvY2s6Cgl1cCgmY29yZV9saXN0cyk7CglyZXR1cm4gcmVzOwp9CgoKaW50IGkyY19kZWxfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBsaXN0X2hlYWQgICppdGVtLCAqX247CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXBfZnJvbV9saXN0OwoJc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcjsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CglpbnQgcmVzID0gMDsKCglkb3duKCZjb3JlX2xpc3RzKTsKCgkvKiBGaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGlzIGFkYXB0ZXIgd2FzIGV2ZXIgYWRkZWQgKi8KCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcF9mcm9tX2xpc3QsICZhZGFwdGVycywgbGlzdCkgewoJCWlmIChhZGFwX2Zyb21fbGlzdCA9PSBhZGFwKQoJCQlicmVhazsKCX0KCWlmIChhZGFwX2Zyb21fbGlzdCAhPSBhZGFwKSB7CgkJcHJfZGVidWcoIkkyQzogQXR0ZW1wdGluZyB0byBkZWxldGUgYW4gdW5yZWdpc3RlcmVkICIKCQkJICJhZGFwdGVyXG4iKTsKCQlyZXMgPSAtRUlOVkFMOwoJCWdvdG8gb3V0X3VubG9jazsKCX0KCglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmRyaXZlcnMpIHsKCQlkcml2ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfZHJpdmVyLCBsaXN0KTsKCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikKCQkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9hZGFwdGVyKGFkYXApKSkgewoJCQkJZGV2X3dhcm4oJmFkYXAtPmRldiwgImNhbid0IGRldGFjaCBhZGFwdGVyICIKCQkJCQkgIndoaWxlIGRldGFjaGluZyBkcml2ZXIgJXM6IGRyaXZlciBub3QgIgoJCQkJCSAiZGV0YWNoZWQhIiwgZHJpdmVyLT5uYW1lKTsKCQkJCWdvdG8gb3V0X3VubG9jazsKCQkJfQoJfQoKCS8qIGRldGFjaCBhbnkgYWN0aXZlIGNsaWVudHMuIFRoaXMgbXVzdCBiZSBkb25lIGZpcnN0LCBiZWNhdXNlCgkgKiBpdCBjYW4gZmFpbDsgaW4gd2hpY2ggY2FzZSB3ZSBnaXZlIHVwcC4gKi8KCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCBfbiwgJmFkYXAtPmNsaWVudHMpIHsKCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKCgkJLyogZGV0YWNoaW5nIGRldmljZXMgaXMgdW5jb25kaXRpb25hbCBvZiB0aGUgc2V0IG5vdGlmeQoJCSAqIGZsYWcsIGFzIF9hbGxfIGNsaWVudHMgdGhhdCByZXNpZGUgb24gdGhlIGFkYXB0ZXIKCQkgKiBtdXN0IGJlIGRlbGV0ZWQsIGFzIHRoaXMgd291bGQgY2F1c2UgaW52YWxpZCBzdGF0ZXMuCgkJICovCgkJaWYgKChyZXM9Y2xpZW50LT5kcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiYWRhcHRlciBub3QgIgoJCQkJInVucmVnaXN0ZXJlZCwgYmVjYXVzZSBjbGllbnQgYXQgIgoJCQkJImFkZHJlc3MgJTAyeCBjYW4ndCBiZSBkZXRhY2hlZC4gIiwKCQkJCWNsaWVudC0+YWRkcik7CgkJCWdvdG8gb3V0X3VubG9jazsKCQl9Cgl9CgoJLyogY2xlYW4gdXAgdGhlIHN5c2ZzIHJlcHJlc2VudGF0aW9uICovCglpbml0X2NvbXBsZXRpb24oJmFkYXAtPmRldl9yZWxlYXNlZCk7Cglpbml0X2NvbXBsZXRpb24oJmFkYXAtPmNsYXNzX2Rldl9yZWxlYXNlZCk7CgljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmYWRhcC0+Y2xhc3NfZGV2KTsKCWRldmljZV9yZW1vdmVfZmlsZSgmYWRhcC0+ZGV2LCAmZGV2X2F0dHJfbmFtZSk7CglkZXZpY2VfdW5yZWdpc3RlcigmYWRhcC0+ZGV2KTsKCWxpc3RfZGVsKCZhZGFwLT5saXN0KTsKCgkvKiB3YWl0IGZvciBzeXNmcyB0byBkcm9wIGFsbCByZWZlcmVuY2VzICovCgl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhZGFwLT5kZXZfcmVsZWFzZWQpOwoJd2FpdF9mb3JfY29tcGxldGlvbigmYWRhcC0+Y2xhc3NfZGV2X3JlbGVhc2VkKTsKCgkvKiBmcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidXMgaWQgKi8KCWlkcl9yZW1vdmUoJmkyY19hZGFwdGVyX2lkciwgYWRhcC0+bnIpOwoKCWRldl9kYmcoJmFkYXAtPmRldiwgImFkYXB0ZXIgdW5yZWdpc3RlcmVkXG4iKTsKCiBvdXRfdW5sb2NrOgoJdXAoJmNvcmVfbGlzdHMpOwoJcmV0dXJuIHJlczsKfQoKCi8qIC0tLS0tCiAqIFdoYXQgZm9sbG93cyBpcyB0aGUgInVwd2FyZHMiIGludGVyZmFjZTogY29tbWFuZHMgZm9yIHRhbGtpbmcgdG8gY2xpZW50cywKICogd2hpY2ggaW1wbGVtZW50IHRoZSBmdW5jdGlvbnMgdG8gYWNjZXNzIHRoZSBwaHlzaWNhbCBpbmZvcm1hdGlvbiBvZiB0aGUKICogY2hpcHMuCiAqLwoKaW50IGkyY19hZGRfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpCnsKCXN0cnVjdCBsaXN0X2hlYWQgICAqaXRlbTsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKCWludCByZXMgPSAwOwoKCWRvd24oJmNvcmVfbGlzdHMpOwoKCS8qIGFkZCB0aGUgZHJpdmVyIHRvIHRoZSBsaXN0IG9mIGkyYyBkcml2ZXJzIGluIHRoZSBkcml2ZXIgY29yZSAqLwoJZHJpdmVyLT5kcml2ZXIubmFtZSA9IGRyaXZlci0+bmFtZTsKCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZpMmNfYnVzX3R5cGU7Cglkcml2ZXItPmRyaXZlci5wcm9iZSA9IGkyY19kZXZpY2VfcHJvYmU7Cglkcml2ZXItPmRyaXZlci5yZW1vdmUgPSBpMmNfZGV2aWNlX3JlbW92ZTsKCglyZXMgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKCWlmIChyZXMpCgkJZ290byBvdXRfdW5sb2NrOwoJCglsaXN0X2FkZF90YWlsKCZkcml2ZXItPmxpc3QsJmRyaXZlcnMpOwoJcHJfZGVidWcoImkyYy1jb3JlOiBkcml2ZXIgJXMgcmVnaXN0ZXJlZC5cbiIsIGRyaXZlci0+bmFtZSk7CgoJLyogbm93IGxvb2sgZm9yIGluc3RhbmNlcyBvZiBkcml2ZXIgb24gb3VyIGFkYXB0ZXJzICovCglpZiAoZHJpdmVyLT5mbGFncyAmIEkyQ19ERl9OT1RJRlkpIHsKCQlsaXN0X2Zvcl9lYWNoKGl0ZW0sJmFkYXB0ZXJzKSB7CgkJCWFkYXB0ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfYWRhcHRlciwgbGlzdCk7CgkJCWRyaXZlci0+YXR0YWNoX2FkYXB0ZXIoYWRhcHRlcik7CgkJfQoJfQoKIG91dF91bmxvY2s6Cgl1cCgmY29yZV9saXN0cyk7CglyZXR1cm4gcmVzOwp9CgppbnQgaTJjX2RlbF9kcml2ZXIoc3RydWN0IGkyY19kcml2ZXIgKmRyaXZlcikKewoJc3RydWN0IGxpc3RfaGVhZCAgICppdGVtMSwgKml0ZW0yLCAqX247CglzdHJ1Y3QgaTJjX2NsaWVudCAgKmNsaWVudDsKCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKCQoJaW50IHJlcyA9IDA7CgoJZG93bigmY29yZV9saXN0cyk7CgoJLyogSGF2ZSBhIGxvb2sgYXQgZWFjaCBhZGFwdGVyLCBpZiBjbGllbnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBzdGlsbAoJICogYXR0YWNoZWQuIElmIHNvLCBkZXRhY2ggdGhlbSB0byBiZSBhYmxlIHRvIGtpbGwgdGhlIGRyaXZlciAKCSAqIGFmdGVyd2FyZHMuCgkgKi8KCXByX2RlYnVnKCJpMmMtY29yZTogdW5yZWdpc3Rlcl9kcml2ZXIgLSBsb29raW5nIGZvciBjbGllbnRzLlxuIik7CgkvKiByZW1vdmluZyBjbGllbnRzIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbm90aWZ5IGZsYWcsIGVsc2UgCgkgKiBpbnZhbGlkIG9wZXJhdGlvbiBtaWdodCAod2lsbCEpIHJlc3VsdCwgd2hlbiB1c2luZyBzdGFsZSBjbGllbnQKCSAqIHBvaW50ZXJzLgoJICovCglsaXN0X2Zvcl9lYWNoKGl0ZW0xLCZhZGFwdGVycykgewoJCWFkYXAgPSBsaXN0X2VudHJ5KGl0ZW0xLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIsIGxpc3QpOwoJCWRldl9kYmcoJmFkYXAtPmRldiwgImV4YW1pbmluZyBhZGFwdGVyXG4iKTsKCQlpZiAoZHJpdmVyLT5kZXRhY2hfYWRhcHRlcikgewoJCQlpZiAoKHJlcyA9IGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIoYWRhcCkpKSB7CgkJCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAid2hpbGUgdW5yZWdpc3RlcmluZyAiCgkJCQkgICAgICAgImR1bW15IGRyaXZlciAlcywgYWRhcHRlciBjb3VsZCAiCgkJCQkgICAgICAgIm5vdCBiZSBkZXRhY2hlZCBwcm9wZXJseTsgZHJpdmVyICIKCQkJCSAgICAgICAibm90IHVubG9hZGVkISIsZHJpdmVyLT5uYW1lKTsKCQkJCWdvdG8gb3V0X3VubG9jazsKCQkJfQoJCX0gZWxzZSB7CgkJCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtMiwgX24sICZhZGFwLT5jbGllbnRzKSB7CgkJCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0yLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CgkJCQlpZiAoY2xpZW50LT5kcml2ZXIgIT0gZHJpdmVyKQoJCQkJCWNvbnRpbnVlOwoJCQkJcHJfZGVidWcoImkyYy1jb3JlLm86IGRldGFjaGluZyBjbGllbnQgJXM6XG4iLCBjbGllbnQtPm5hbWUpOwoJCQkJaWYgKChyZXMgPSBkcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKCQkJCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJ3aGlsZSAiCgkJCQkJCSJ1bnJlZ2lzdGVyaW5nIGRyaXZlciAiCgkJCQkJCSJgJXMnLCB0aGUgY2xpZW50IGF0ICIKCQkJCQkJImFkZHJlc3MgJTAyeCBvZiAiCgkJCQkJCSJhZGFwdGVyIGNvdWxkIG5vdCAiCgkJCQkJCSJiZSBkZXRhY2hlZDsgZHJpdmVyICIKCQkJCQkJIm5vdCB1bmxvYWRlZCEiLAoJCQkJCQlkcml2ZXItPm5hbWUsCgkJCQkJCWNsaWVudC0+YWRkcik7CgkJCQkJZ290byBvdXRfdW5sb2NrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CglsaXN0X2RlbCgmZHJpdmVyLT5saXN0KTsKCXByX2RlYnVnKCJpMmMtY29yZTogZHJpdmVyIHVucmVnaXN0ZXJlZDogJXNcbiIsIGRyaXZlci0+bmFtZSk7Cgogb3V0X3VubG9jazoKCXVwKCZjb3JlX2xpc3RzKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9faTJjX2NoZWNrX2FkZHIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgYWRkcikKewoJc3RydWN0IGxpc3RfaGVhZCAgICppdGVtOwoJc3RydWN0IGkyY19jbGllbnQgICpjbGllbnQ7CgoJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwdGVyLT5jbGllbnRzKSB7CgkJY2xpZW50ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgaTJjX2NsaWVudCwgbGlzdCk7CgkJaWYgKGNsaWVudC0+YWRkciA9PSBhZGRyKQoJCQlyZXR1cm4gLUVCVVNZOwoJfQoJcmV0dXJuIDA7Cn0KCmludCBpMmNfY2hlY2tfYWRkcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKQp7CglpbnQgcnZhbDsKCglkb3duKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKCXJ2YWwgPSBfX2kyY19jaGVja19hZGRyKGFkYXB0ZXIsIGFkZHIpOwoJdXAoJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoKCXJldHVybiBydmFsOwp9CgppbnQgaTJjX2F0dGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwoKCWRvd24oJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJaWYgKF9faTJjX2NoZWNrX2FkZHIoY2xpZW50LT5hZGFwdGVyLCBjbGllbnQtPmFkZHIpKSB7CgkJdXAoJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJCXJldHVybiAtRUJVU1k7Cgl9CglsaXN0X2FkZF90YWlsKCZjbGllbnQtPmxpc3QsJmFkYXB0ZXItPmNsaWVudHMpOwoJdXAoJmFkYXB0ZXItPmNsaXN0X2xvY2spOwoJCglpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKSAgewoJCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIoY2xpZW50KSkgIHsKCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgIndhcm5pbmc6IGNsaWVudF9yZWdpc3RlciAiCgkJCQkic2VlbXMgdG8gaGF2ZSBmYWlsZWQgZm9yIGNsaWVudCAlMDJ4XG4iLAoJCQkJY2xpZW50LT5hZGRyKTsKCQl9Cgl9CgoJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiY2xpZW50IFslc10gcmVnaXN0ZXJlZCB0byBhZGFwdGVyXG4iLAoJCWNsaWVudC0+bmFtZSk7CgoJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkKCQljbGllbnQtPnVzYWdlX2NvdW50ID0gMDsKCgljbGllbnQtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5hZGFwdGVyLT5kZXY7CgljbGllbnQtPmRldi5kcml2ZXIgPSAmY2xpZW50LT5kcml2ZXItPmRyaXZlcjsKCWNsaWVudC0+ZGV2LmJ1cyA9ICZpMmNfYnVzX3R5cGU7CgljbGllbnQtPmRldi5yZWxlYXNlID0gJmkyY19jbGllbnRfcmVsZWFzZTsKCQoJc25wcmludGYoJmNsaWVudC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKGNsaWVudC0+ZGV2LmJ1c19pZCksCgkJIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKCXByX2RlYnVnKCJyZWdpc3RlcmluZyAlc1xuIiwgY2xpZW50LT5kZXYuYnVzX2lkKTsKCWRldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NsaWVudF9uYW1lKTsKCQoJcmV0dXJuIDA7Cn0KCgppbnQgaTJjX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwoJaW50IHJlcyA9IDA7CgkKCWlmICgoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfQUxMT1dfVVNFKSAmJiAoY2xpZW50LT51c2FnZV9jb3VudCA+IDApKQoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGFkYXB0ZXItPmNsaWVudF91bnJlZ2lzdGVyKSAgewoJCXJlcyA9IGFkYXB0ZXItPmNsaWVudF91bnJlZ2lzdGVyKGNsaWVudCk7CgkJaWYgKHJlcykgewoJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKCQkJICAgICAgICJjbGllbnRfdW5yZWdpc3RlciBbJXNdIGZhaWxlZCwgIgoJCQkgICAgICAgImNsaWVudCBub3QgZGV0YWNoZWQiLCBjbGllbnQtPm5hbWUpOwoJCQlnb3RvIG91dDsKCQl9Cgl9CgoJZG93bigmYWRhcHRlci0+Y2xpc3RfbG9jayk7CglsaXN0X2RlbCgmY2xpZW50LT5saXN0KTsKCWluaXRfY29tcGxldGlvbigmY2xpZW50LT5yZWxlYXNlZCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY2xpZW50X25hbWUpOwoJZGV2aWNlX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKCXVwKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNsaWVudC0+cmVsZWFzZWQpOwoKIG91dDoKCXJldHVybiByZXM7Cn0KCnN0YXRpYyBpbnQgaTJjX2luY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCglpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+ZHJpdmVyLT5vd25lcikpCgkJcmV0dXJuIC1FTk9ERVY7CglpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+YWRhcHRlci0+b3duZXIpKSB7CgkJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+b3duZXIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBpMmNfZGVjX3VzZV9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+b3duZXIpOwoJbW9kdWxlX3B1dChjbGllbnQtPmFkYXB0ZXItPm93bmVyKTsKfQoKaW50IGkyY191c2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCWludCByZXQ7CgoJcmV0ID0gaTJjX2luY191c2VfY2xpZW50KGNsaWVudCk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkgewoJCWlmIChjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9BTExPV19NVUxUSVBMRV9VU0UpCgkJCWNsaWVudC0+dXNhZ2VfY291bnQrKzsKCQllbHNlIGlmIChjbGllbnQtPnVzYWdlX2NvdW50ID4gMCkgCgkJCWdvdG8gYnVzeTsKCQllbHNlIAoJCQljbGllbnQtPnVzYWdlX2NvdW50Kys7Cgl9CgoJcmV0dXJuIDA7CiBidXN5OgoJaTJjX2RlY191c2VfY2xpZW50KGNsaWVudCk7CglyZXR1cm4gLUVCVVNZOwp9CgppbnQgaTJjX3JlbGVhc2VfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCWlmKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX0FMTE9XX1VTRSkgewoJCWlmKGNsaWVudC0+dXNhZ2VfY291bnQ+MCkKCQkJY2xpZW50LT51c2FnZV9jb3VudC0tOwoJCWVsc2UgewoJCQlwcl9kZWJ1ZygiaTJjLWNvcmU6ICVzIHVzZWQgb25lIHRvbyBtYW55IHRpbWVzXG4iLAoJCQkJX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuIC1FUEVSTTsKCQl9Cgl9CgkKCWkyY19kZWNfdXNlX2NsaWVudChjbGllbnQpOwoJCglyZXR1cm4gMDsKfQoKdm9pZCBpMmNfY2xpZW50c19jb21tYW5kKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICAqaXRlbTsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CgoJZG93bigmYWRhcC0+Y2xpc3RfbG9jayk7CglsaXN0X2Zvcl9lYWNoKGl0ZW0sJmFkYXAtPmNsaWVudHMpIHsKCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfY2xpZW50LCBsaXN0KTsKCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+ZHJpdmVyLT5vd25lcikpCgkJCWNvbnRpbnVlOwoJCWlmIChOVUxMICE9IGNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKSB7CgkJCXVwKCZhZGFwLT5jbGlzdF9sb2NrKTsKCQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LGNtZCxhcmcpOwoJCQlkb3duKCZhZGFwLT5jbGlzdF9sb2NrKTsKCQl9CgkJbW9kdWxlX3B1dChjbGllbnQtPmRyaXZlci0+b3duZXIpOwogICAgICAgfQogICAgICAgdXAoJmFkYXAtPmNsaXN0X2xvY2spOwp9CgpzdGF0aWMgaW50IF9faW5pdCBpMmNfaW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsOwoKCXJldHZhbCA9IGJ1c19yZWdpc3RlcigmaTJjX2J1c190eXBlKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmaTJjX2FkYXB0ZXJfZHJpdmVyKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCXJldHVybiBjbGFzc19yZWdpc3RlcigmaTJjX2FkYXB0ZXJfY2xhc3MpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX2V4aXQodm9pZCkKewoJY2xhc3NfdW5yZWdpc3RlcigmaTJjX2FkYXB0ZXJfY2xhc3MpOwoJZHJpdmVyX3VucmVnaXN0ZXIoJmkyY19hZGFwdGVyX2RyaXZlcik7CglidXNfdW5yZWdpc3RlcigmaTJjX2J1c190eXBlKTsKfQoKc3Vic3lzX2luaXRjYWxsKGkyY19pbml0KTsKbW9kdWxlX2V4aXQoaTJjX2V4aXQpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiB0aGUgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdG8gdGhlIGkyYyBidXNzZXMuCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgppbnQgaTJjX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQp7CglpbnQgcmV0OwoKCWlmIChhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcikgewojaWZkZWYgREVCVUcKCQlmb3IgKHJldCA9IDA7IHJldCA8IG51bTsgcmV0KyspIHsKCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAibWFzdGVyX3hmZXJbJWRdICVjLCBhZGRyPTB4JTAyeCwgIgoJCQkJImxlbj0lZFxuIiwgcmV0LCBtc2dzW3JldF0uZmxhZ3MgJiBJMkNfTV9SRCA/CgkJCQknUicgOiAnVycsIG1zZ3NbcmV0XS5hZGRyLCBtc2dzW3JldF0ubGVuKTsKCQl9CiNlbmRpZgoKCQlkb3duKCZhZGFwLT5idXNfbG9jayk7CgkJcmV0ID0gYWRhcC0+YWxnby0+bWFzdGVyX3hmZXIoYWRhcCxtc2dzLG51bSk7CgkJdXAoJmFkYXAtPmJ1c19sb2NrKTsKCgkJcmV0dXJuIHJldDsKCX0gZWxzZSB7CgkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiSTJDIGxldmVsIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKCQlyZXR1cm4gLUVOT1NZUzsKCX0KfQoKaW50IGkyY19tYXN0ZXJfc2VuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LGNvbnN0IGNoYXIgKmJ1ZiAsaW50IGNvdW50KQp7CglpbnQgcmV0OwoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwPWNsaWVudC0+YWRhcHRlcjsKCXN0cnVjdCBpMmNfbXNnIG1zZzsKCglpZiAoY2xpZW50LT5hZGFwdGVyLT5hbGdvLT5tYXN0ZXJfeGZlcikgewoJCW1zZy5hZGRyICAgPSBjbGllbnQtPmFkZHI7CgkJbXNnLmZsYWdzID0gY2xpZW50LT5mbGFncyAmIEkyQ19NX1RFTjsKCQltc2cubGVuID0gY291bnQ7CgkJbXNnLmJ1ZiA9IChjaGFyICopYnVmOwoJCgkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJtYXN0ZXJfc2VuZDogd3JpdGluZyAlZCBieXRlcy5cbiIsCgkJCWNvdW50KTsKCQoJCWRvd24oJmFkYXAtPmJ1c19sb2NrKTsKCQlyZXQgPSBhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcihhZGFwLCZtc2csMSk7CgkJdXAoJmFkYXAtPmJ1c19sb2NrKTsKCgkJLyogaWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcwoJCSAqIHRyYW5zbWl0dGVkLCBlbHNlIGVycm9yIGNvZGUuCgkJICovCgkJcmV0dXJuIChyZXQgPT0gMSApPyBjb3VudCA6IHJldDsKCX0gZWxzZSB7CgkJZGV2X2VycigmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJJMkMgbGV2ZWwgdHJhbnNmZXJzIG5vdCBzdXBwb3J0ZWRcbiIpOwoJCXJldHVybiAtRU5PU1lTOwoJfQp9CgppbnQgaTJjX21hc3Rlcl9yZWN2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNoYXIgKmJ1ZiAsaW50IGNvdW50KQp7CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA9Y2xpZW50LT5hZGFwdGVyOwoJc3RydWN0IGkyY19tc2cgbXNnOwoJaW50IHJldDsKCWlmIChjbGllbnQtPmFkYXB0ZXItPmFsZ28tPm1hc3Rlcl94ZmVyKSB7CgkJbXNnLmFkZHIgICA9IGNsaWVudC0+YWRkcjsKCQltc2cuZmxhZ3MgPSBjbGllbnQtPmZsYWdzICYgSTJDX01fVEVOOwoJCW1zZy5mbGFncyB8PSBJMkNfTV9SRDsKCQltc2cubGVuID0gY291bnQ7CgkJbXNnLmJ1ZiA9IGJ1ZjsKCgkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsICJtYXN0ZXJfcmVjdjogcmVhZGluZyAlZCBieXRlcy5cbiIsCgkJCWNvdW50KTsKCQoJCWRvd24oJmFkYXAtPmJ1c19sb2NrKTsKCQlyZXQgPSBhZGFwLT5hbGdvLT5tYXN0ZXJfeGZlcihhZGFwLCZtc2csMSk7CgkJdXAoJmFkYXAtPmJ1c19sb2NrKTsKCQoJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAibWFzdGVyX3JlY3Y6IHJldHVybjolZCAoY291bnQ6JWQsIGFkZHI6MHglMDJ4KVxuIiwKCQkJcmV0LCBjb3VudCwgY2xpZW50LT5hZGRyKTsKCQoJCS8qIGlmIGV2ZXJ5dGhpbmcgd2VudCBvayAoaS5lLiAxIG1zZyB0cmFuc21pdHRlZCksIHJldHVybiAjYnl0ZXMKCSAJKiB0cmFuc21pdHRlZCwgZWxzZSBlcnJvciBjb2RlLgoJIAkqLwoJCXJldHVybiAocmV0ID09IDEgKT8gY291bnQgOiByZXQ7Cgl9IGVsc2UgewoJCWRldl9lcnIoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiSTJDIGxldmVsIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKCQlyZXR1cm4gLUVOT1NZUzsKCX0KfQoKCmludCBpMmNfY29udHJvbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAoJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCWludCByZXQgPSAwOwoJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwoKCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAiaTJjIGlvY3RsLCBjbWQ6IDB4JXgsIGFyZzogJSNseFxuIiwgY21kLCBhcmcpOwoJc3dpdGNoIChjbWQpIHsKCQljYXNlIEkyQ19SRVRSSUVTOgoJCQlhZGFwLT5yZXRyaWVzID0gYXJnOwoJCQlicmVhazsKCQljYXNlIEkyQ19USU1FT1VUOgoJCQlhZGFwLT50aW1lb3V0ID0gYXJnOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpZiAoYWRhcC0+YWxnby0+YWxnb19jb250cm9sIT1OVUxMKQoJCQkJcmV0ID0gYWRhcC0+YWxnby0+YWxnb19jb250cm9sKGFkYXAsY21kLGFyZyk7Cgl9CglyZXR1cm4gcmV0Owp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHRoZSBpMmMgYWRkcmVzcyBzY2FubmluZyBmdW5jdGlvbgogKiBXaWxsIG5vdCB3b3JrIGZvciAxMC1iaXQgYWRkcmVzc2VzIQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgaTJjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSAqYWRkcmVzc19kYXRhLAoJICAgICAgaW50ICgqZm91bmRfcHJvYykgKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCkpCnsKCWludCBhZGRyLGksZm91bmQsZXJyOwoJaW50IGFkYXBfaWQgPSBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKCgkvKiBGb3JnZXQgaXQgaWYgd2UgY2FuJ3QgcHJvYmUgdXNpbmcgU01CVVNfUVVJQ0sgKi8KCWlmICghIGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsSTJDX0ZVTkNfU01CVVNfUVVJQ0spKQoJCXJldHVybiAtMTsKCglmb3IgKGFkZHIgPSAweDAwOyBhZGRyIDw9IDB4N2Y7IGFkZHIrKykgewoKCQkvKiBTa2lwIGlmIGFscmVhZHkgaW4gdXNlICovCgkJaWYgKGkyY19jaGVja19hZGRyKGFkYXB0ZXIsYWRkcikpCgkJCWNvbnRpbnVlOwoKCQkvKiBJZiBpdCBpcyBpbiBvbmUgb2YgdGhlIGZvcmNlIGVudHJpZXMsIHdlIGRvbid0IGRvIGFueSBkZXRlY3Rpb24KCQkgICBhdCBhbGwgKi8KCQlmb3VuZCA9IDA7CgoJCWZvciAoaSA9IDA7ICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5mb3JjZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7IGkgKz0gMikgewoJCQlpZiAoKChhZGFwX2lkID09IGFkZHJlc3NfZGF0YS0+Zm9yY2VbaV0pIHx8IAoJCQkgICAgIChhZGRyZXNzX2RhdGEtPmZvcmNlW2ldID09IEFOWV9JMkNfQlVTKSkgJiYKCQkJICAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmZvcmNlW2krMV0pKSB7CgkJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBmb3JjZSBwYXJhbWV0ZXIgZm9yIGFkYXB0ZXIgJWQsIGFkZHIgJTA0eFxuIiwKCQkJCQlhZGFwX2lkLCBhZGRyKTsKCQkJCWlmICgoZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLGFkZHIsMCkpKQoJCQkJCXJldHVybiBlcnI7CgkJCQlmb3VuZCA9IDE7CgkJCX0KCQl9CgkJaWYgKGZvdW5kKSAKCQkJY29udGludWU7CgoJCS8qIElmIHRoaXMgYWRkcmVzcyBpcyBpbiBvbmUgb2YgdGhlIGlnbm9yZXMsIHdlIGNhbiBmb3JnZXQgYWJvdXQKCQkgICBpdCByaWdodCBub3cgKi8KCQlmb3IgKGkgPSAwOwoJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPmlnbm9yZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7CgkJICAgICBpICs9IDIpIHsKCQkJaWYgKCgoYWRhcF9pZCA9PSBhZGRyZXNzX2RhdGEtPmlnbm9yZVtpXSkgfHwgCgkJCSAgICAoKGFkZHJlc3NfZGF0YS0+aWdub3JlW2ldID09IEFOWV9JMkNfQlVTKSkpICYmCgkJCSAgICAoYWRkciA9PSBhZGRyZXNzX2RhdGEtPmlnbm9yZVtpKzFdKSkgewoJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgaWdub3JlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgIgoJCQkJCSJhZGRyICUwNHhcbiIsIGFkYXBfaWQgLGFkZHIpOwoJCQkJZm91bmQgPSAxOwoJCQl9CgkJfQoJCWZvciAoaSA9IDA7CgkJICAgICAhZm91bmQgJiYgKGFkZHJlc3NfZGF0YS0+aWdub3JlX3JhbmdlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKCQkgICAgIGkgKz0gMykgewoJCQlpZiAoKChhZGFwX2lkID09IGFkZHJlc3NfZGF0YS0+aWdub3JlX3JhbmdlW2ldKSB8fAoJCQkgICAgKChhZGRyZXNzX2RhdGEtPmlnbm9yZV9yYW5nZVtpXT09QU5ZX0kyQ19CVVMpKSkgJiYKCQkJICAgIChhZGRyID49IGFkZHJlc3NfZGF0YS0+aWdub3JlX3JhbmdlW2krMV0pICYmCgkJCSAgICAoYWRkciA8PSBhZGRyZXNzX2RhdGEtPmlnbm9yZV9yYW5nZVtpKzJdKSkgewoJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgaWdub3JlX3JhbmdlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgIgoJCQkJCSJhZGRyICUwNHhcbiIsIGFkYXBfaWQsYWRkcik7CgkJCQlmb3VuZCA9IDE7CgkJCX0KCQl9CgkJaWYgKGZvdW5kKSAKCQkJY29udGludWU7CgoJCS8qIE5vdywgd2Ugd2lsbCBkbyBhIGRldGVjdGlvbiwgYnV0IG9ubHkgaWYgaXQgaXMgaW4gdGhlIG5vcm1hbCBvciAKCQkgICBwcm9iZSBlbnRyaWVzICovICAKCQlmb3IgKGkgPSAwOwoJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOwoJCSAgICAgaSArPSAxKSB7CgkJCWlmIChhZGRyID09IGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1tpXSkgewoJCQkJZm91bmQgPSAxOwoJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgbm9ybWFsIGkyYyBlbnRyeSBmb3IgYWRhcHRlciAlZCwgIgoJCQkJCSJhZGRyICUwMnhcbiIsIGFkYXBfaWQsIGFkZHIpOwoJCQl9CgkJfQoKCQlmb3IgKGkgPSAwOwoJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNfcmFuZ2VbaV0gIT0gSTJDX0NMSUVOVF9FTkQpOwoJCSAgICAgaSArPSAyKSB7CgkJCWlmICgoYWRkciA+PSBhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNfcmFuZ2VbaV0pICYmCgkJCSAgICAoYWRkciA8PSBhZGRyZXNzX2RhdGEtPm5vcm1hbF9pMmNfcmFuZ2VbaSsxXSkpIHsKCQkJCWZvdW5kID0gMTsKCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIG5vcm1hbCBpMmNfcmFuZ2UgZW50cnkgZm9yIGFkYXB0ZXIgJWQsICIKCQkJCQkiYWRkciAlMDR4XG4iLCBhZGFwX2lkLGFkZHIpOwoJCQl9CgkJfQoKCQlmb3IgKGkgPSAwOwoJCSAgICAgIWZvdW5kICYmIChhZGRyZXNzX2RhdGEtPnByb2JlW2ldICE9IEkyQ19DTElFTlRfRU5EKTsKCQkgICAgIGkgKz0gMikgewoJCQlpZiAoKChhZGFwX2lkID09IGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0pIHx8CgkJCSAgICAoKGFkZHJlc3NfZGF0YS0+cHJvYmVbaV0gPT0gQU5ZX0kyQ19CVVMpKSkgJiYKCQkJICAgIChhZGRyID09IGFkZHJlc3NfZGF0YS0+cHJvYmVbaSsxXSkpIHsKCQkJCWZvdW5kID0gMTsKCQkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImZvdW5kIHByb2JlIHBhcmFtZXRlciBmb3IgYWRhcHRlciAlZCwgIgoJCQkJCSJhZGRyICUwNHhcbiIsIGFkYXBfaWQsYWRkcik7CgkJCX0KCQl9CgkJZm9yIChpID0gMDsKCQkgICAgICFmb3VuZCAmJiAoYWRkcmVzc19kYXRhLT5wcm9iZV9yYW5nZVtpXSAhPSBJMkNfQ0xJRU5UX0VORCk7CgkJICAgICBpICs9IDMpIHsKCQkJaWYgKCgoYWRhcF9pZCA9PSBhZGRyZXNzX2RhdGEtPnByb2JlX3JhbmdlW2ldKSB8fAoJCQkgICAoYWRkcmVzc19kYXRhLT5wcm9iZV9yYW5nZVtpXSA9PSBBTllfSTJDX0JVUykpICYmCgkJCSAgIChhZGRyID49IGFkZHJlc3NfZGF0YS0+cHJvYmVfcmFuZ2VbaSsxXSkgJiYKCQkJICAgKGFkZHIgPD0gYWRkcmVzc19kYXRhLT5wcm9iZV9yYW5nZVtpKzJdKSkgewoJCQkJZm91bmQgPSAxOwoJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiZm91bmQgcHJvYmVfcmFuZ2UgcGFyYW1ldGVyIGZvciBhZGFwdGVyICVkLCAiCgkJCQkJImFkZHIgJTA0eFxuIiwgYWRhcF9pZCxhZGRyKTsKCQkJfQoJCX0KCQlpZiAoIWZvdW5kKSAKCQkJY29udGludWU7CgoJCS8qIE9LLCBzbyB3ZSByZWFsbHkgc2hvdWxkIGV4YW1pbmUgdGhpcyBhZGRyZXNzLiBGaXJzdCBjaGVjawoJCSAgIHdoZXRoZXIgdGhlcmUgaXMgc29tZSBjbGllbnQgaGVyZSBhdCBhbGwhICovCgkJaWYgKGkyY19zbWJ1c194ZmVyKGFkYXB0ZXIsYWRkciwwLDAsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCkgPj0gMCkKCQkJaWYgKChlcnIgPSBmb3VuZF9wcm9jKGFkYXB0ZXIsYWRkciwtMSkpKQoJCQkJcmV0dXJuIGVycjsKCX0KCXJldHVybiAwOwp9CgovKgogKiByZXR1cm4gaWQgbnVtYmVyIGZvciBhIHNwZWNpZmljIGFkYXB0ZXIKICovCmludCBpMmNfYWRhcHRlcl9pZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiBhZGFwLT5ucjsKfQoKc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfZ2V0X2FkYXB0ZXIoaW50IGlkKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CglzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CgkKCWRvd24oJmNvcmVfbGlzdHMpOwoJbGlzdF9mb3JfZWFjaChpdGVtLCZhZGFwdGVycykgewoJCWFkYXB0ZXIgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBpMmNfYWRhcHRlciwgbGlzdCk7CgkJaWYgKGlkID09IGFkYXB0ZXItPm5yICYmCgkJICAgIHRyeV9tb2R1bGVfZ2V0KGFkYXB0ZXItPm93bmVyKSkgewoJCQl1cCgmY29yZV9saXN0cyk7CgkJCXJldHVybiBhZGFwdGVyOwoJCX0KCX0KCXVwKCZjb3JlX2xpc3RzKTsKCXJldHVybiBOVUxMOwp9Cgp2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCW1vZHVsZV9wdXQoYWRhcC0+b3duZXIpOwp9CgovKiBUaGUgU01CdXMgcGFydHMgKi8KCiNkZWZpbmUgUE9MWSAgICAoMHgxMDcwVSA8PCAzKSAKc3RhdGljIHU4CmNyYzgodTE2IGRhdGEpCnsKCWludCBpOwogIAoJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJaWYgKGRhdGEgJiAweDgwMDApIAoJCQlkYXRhID0gZGF0YSBeIFBPTFk7CgkJZGF0YSA9IGRhdGEgPDwgMTsKCX0KCXJldHVybiAodTgpKGRhdGEgPj4gOCk7Cn0KCi8qIENSQyBvdmVyIGNvdW50IGJ5dGVzIGluIHRoZSBmaXJzdCBhcnJheSBwbHVzIHRoZSBieXRlcyBpbiB0aGUgcmVzdAogICBhcnJheSBpZiBpdCBpcyBub24tbnVsbC4gcmVzdFswXSBpcyB0aGUgKGxlbmd0aCBvZiByZXN0KSAtIDEKICAgYW5kIGlzIGluY2x1ZGVkLiAqLwpzdGF0aWMgdTggaTJjX3NtYnVzX3BhcnRpYWxfcGVjKHU4IGNyYywgaW50IGNvdW50LCB1OCAqZmlyc3QsIHU4ICpyZXN0KQp7CglpbnQgaTsKCglmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCWNyYyA9IGNyYzgoKGNyYyBeIGZpcnN0W2ldKSA8PCA4KTsKCWlmKHJlc3QgIT0gTlVMTCkKCQlmb3IoaSA9IDA7IGkgPD0gcmVzdFswXTsgaSsrKQoJCQljcmMgPSBjcmM4KChjcmMgXiByZXN0W2ldKSA8PCA4KTsKCXJldHVybiBjcmM7Cn0KCnN0YXRpYyB1OCBpMmNfc21idXNfcGVjKGludCBjb3VudCwgdTggKmZpcnN0LCB1OCAqcmVzdCkKewoJcmV0dXJuIGkyY19zbWJ1c19wYXJ0aWFsX3BlYygwLCBjb3VudCwgZmlyc3QsIHJlc3QpOwp9CgovKiBSZXR1cm5zIG5ldyAic2l6ZSIgKHRyYW5zYWN0aW9uIHR5cGUpCiAgIE5vdGUgdGhhdCB3ZSBjb252ZXJ0IGJ5dGUgdG8gYnl0ZV9kYXRhIGFuZCBieXRlX2RhdGEgdG8gd29yZF9kYXRhCiAgIHJhdGhlciB0aGFuIGludmVudCBuZXcgeHh4X1BFQyB0cmFuc2FjdGlvbnMuICovCnN0YXRpYyBpbnQgaTJjX3NtYnVzX2FkZF9wZWModTE2IGFkZHIsIHU4IGNvbW1hbmQsIGludCBzaXplLAoJCQkgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQp7Cgl1OCBidWZbM107CgoJYnVmWzBdID0gYWRkciA8PCAxOwoJYnVmWzFdID0gY29tbWFuZDsKCXN3aXRjaChzaXplKSB7CgkJY2FzZSBJMkNfU01CVVNfQllURToKCQkJZGF0YS0+Ynl0ZSA9IGkyY19zbWJ1c19wZWMoMiwgYnVmLCBOVUxMKTsKCQkJc2l6ZSA9IEkyQ19TTUJVU19CWVRFX0RBVEE7CgkJCWJyZWFrOwoJCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKCQkJYnVmWzJdID0gZGF0YS0+Ynl0ZTsKCQkJZGF0YS0+d29yZCA9IGJ1ZlsyXSB8fAoJCQkgICAgICAgICAgICAoaTJjX3NtYnVzX3BlYygzLCBidWYsIE5VTEwpIDw8IDgpOwoJCQlzaXplID0gSTJDX1NNQlVTX1dPUkRfREFUQTsKCQkJYnJlYWs7CgkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgoJCQkvKiB1bnN1cHBvcnRlZCAqLwoJCQlicmVhazsKCQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgoJCQlkYXRhLT5ibG9ja1tkYXRhLT5ibG9ja1swXSArIDFdID0KCQkJICAgICAgICAgICAgIGkyY19zbWJ1c19wZWMoMiwgYnVmLCBkYXRhLT5ibG9jayk7CgkJCXNpemUgPSBJMkNfU01CVVNfQkxPQ0tfREFUQV9QRUM7CgkJCWJyZWFrOwoJfQoJcmV0dXJuIHNpemU7CQp9CgpzdGF0aWMgaW50IGkyY19zbWJ1c19jaGVja19wZWModTE2IGFkZHIsIHU4IGNvbW1hbmQsIGludCBzaXplLCB1OCBwYXJ0aWFsLAoJCQkgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCnsKCXU4IGJ1ZlszXSwgcnBlYywgY3BlYzsKCglidWZbMV0gPSBjb21tYW5kOwoJc3dpdGNoKHNpemUpIHsKCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CgkJCWJ1ZlswXSA9IChhZGRyIDw8IDEpIHwgMTsKCQkJY3BlYyA9IGkyY19zbWJ1c19wZWMoMiwgYnVmLCBOVUxMKTsKCQkJcnBlYyA9IGRhdGEtPmJ5dGU7CgkJCWJyZWFrOwoJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKCQkJYnVmWzBdID0gKGFkZHIgPDwgMSkgfCAxOwoJCQlidWZbMl0gPSBkYXRhLT53b3JkICYgMHhmZjsKCQkJY3BlYyA9IGkyY19zbWJ1c19wZWMoMywgYnVmLCBOVUxMKTsKCQkJcnBlYyA9IGRhdGEtPndvcmQgPj4gODsKCQkJYnJlYWs7CgkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBX1BFQzoKCQkJLyogdW5zdXBwb3J0ZWQgKi8KCQkJY3BlYyA9IHJwZWMgPSAwOwoJCQlicmVhazsKCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOgoJCQkvKiB1bnN1cHBvcnRlZCAqLwoJCQljcGVjID0gcnBlYyA9IDA7CgkJCWJyZWFrOwoJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEFfUEVDOgoJCQlidWZbMF0gPSAoYWRkciA8PCAxKTsKCQkJYnVmWzJdID0gKGFkZHIgPDwgMSkgfCAxOwoJCQljcGVjID0gaTJjX3NtYnVzX3BlYygzLCBidWYsIGRhdGEtPmJsb2NrKTsKCQkJcnBlYyA9IGRhdGEtPmJsb2NrW2RhdGEtPmJsb2NrWzBdICsgMV07CgkJCWJyZWFrOwoJCWNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTF9QRUM6CgkJCWJ1ZlswXSA9IChhZGRyIDw8IDEpIHwgMTsKCQkJcnBlYyA9IGkyY19zbWJ1c19wYXJ0aWFsX3BlYyhwYXJ0aWFsLCAxLAoJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgZGF0YS0+YmxvY2spOwoJCQljcGVjID0gZGF0YS0+YmxvY2tbZGF0YS0+YmxvY2tbMF0gKyAxXTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY3BlYyA9IHJwZWMgPSAwOwoJCQlicmVhazsKCX0KCWlmIChycGVjICE9IGNwZWMpIHsKCQlwcl9kZWJ1ZygiaTJjLWNvcmU6IEJhZCBQRUMgMHglMDJ4IHZzLiAweCUwMnhcbiIsCgkJCXJwZWMsIGNwZWMpOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwkKfQoKczMyIGkyY19zbWJ1c193cml0ZV9xdWljayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCB2YWx1ZSkKewoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKIAkgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCk7Cn0KCnMzMiBpMmNfc21idXNfcmVhZF9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CglpZiAoaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAoJICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19SRUFELDAsSTJDX1NNQlVTX0JZVEUsICZkYXRhKSkKCQlyZXR1cm4gLTE7CgllbHNlCgkJcmV0dXJuIDB4MEZGICYgZGF0YS5ieXRlOwp9CgpzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CS8qIG9ubHkgZm9yIFBFQyAqLwoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsdmFsdWUsIEkyQ19TTUJVU19CWVRFLCZkYXRhKTsKfQoKczMyIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKQp7Cgl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwoJaWYgKGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCSAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfUkVBRCxjb21tYW5kLCBJMkNfU01CVVNfQllURV9EQVRBLCZkYXRhKSkKCQlyZXR1cm4gLTE7CgllbHNlCgkJcmV0dXJuIDB4MEZGICYgZGF0YS5ieXRlOwp9CgpzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLCB1OCB2YWx1ZSkKewoJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKCWRhdGEuYnl0ZSA9IHZhbHVlOwoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsY29tbWFuZCwKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfQllURV9EQVRBLCZkYXRhKTsKfQoKczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKQp7Cgl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwoJaWYgKGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCSAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfUkVBRCxjb21tYW5kLCBJMkNfU01CVVNfV09SRF9EQVRBLCAmZGF0YSkpCgkJcmV0dXJuIC0xOwoJZWxzZQoJCXJldHVybiAweDBGRkZGICYgZGF0YS53b3JkOwp9CgpzMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLCB1MTYgdmFsdWUpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CglkYXRhLndvcmQgPSB2YWx1ZTsKCXJldHVybiBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1dSSVRFLGNvbW1hbmQsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1dPUkRfREFUQSwmZGF0YSk7Cn0KCnMzMiBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAoJCQkgICAgICAgdTggbGVuZ3RoLCB1OCAqdmFsdWVzKQp7Cgl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwoJaW50IGk7CglpZiAobGVuZ3RoID4gSTJDX1NNQlVTX0JMT0NLX01BWCkKCQlsZW5ndGggPSBJMkNfU01CVVNfQkxPQ0tfTUFYOwoJZm9yIChpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykKCQlkYXRhLmJsb2NrW2ldID0gdmFsdWVzW2ktMV07CglkYXRhLmJsb2NrWzBdID0gbGVuZ3RoOwoJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKCQkJICAgICAgSTJDX1NNQlVTX1dSSVRFLGNvbW1hbmQsCgkJCSAgICAgIEkyQ19TTUJVU19CTE9DS19EQVRBLCZkYXRhKTsKfQoKLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgKi8KczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZXMpCnsKCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CglpbnQgaTsKCWlmIChpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsY2xpZW50LT5hZGRyLGNsaWVudC0+ZmxhZ3MsCgkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwKCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEsJmRhdGEpKQoJCXJldHVybiAtMTsKCWVsc2UgewoJCWZvciAoaSA9IDE7IGkgPD0gZGF0YS5ibG9ja1swXTsgaSsrKQoJCQl2YWx1ZXNbaS0xXSA9IGRhdGEuYmxvY2tbaV07CgkJcmV0dXJuIGRhdGEuYmxvY2tbMF07Cgl9Cn0KCi8qIFNpbXVsYXRlIGEgU01CdXMgY29tbWFuZCB1c2luZyB0aGUgaTJjIHByb3RvY29sIAogICBObyBjaGVja2luZyBvZiBwYXJhbWV0ZXJzIGlzIGRvbmUhICAqLwpzdGF0aWMgczMyIGkyY19zbWJ1c194ZmVyX2VtdWxhdGVkKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXB0ZXIsIHUxNiBhZGRyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJlYWRfd3JpdGUsIHU4IGNvbW1hbmQsIGludCBzaXplLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCnsKCS8qIFNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBzZXJpZXMgb2YgbXNncy4gSW4gdGhlIGNhc2Ugb2Ygd3JpdGluZywgd2UKCSAgbmVlZCB0byB1c2Ugb25seSBvbmUgbWVzc2FnZTsgd2hlbiByZWFkaW5nLCB3ZSBuZWVkIHR3by4gV2UgaW5pdGlhbGl6ZQoJICBtb3N0IHRoaW5ncyB3aXRoIHNhbmUgZGVmYXVsdHMsIHRvIGtlZXAgdGhlIGNvZGUgYmVsb3cgc29tZXdoYXQKCSAgc2ltcGxlci4gKi8KCXVuc2lnbmVkIGNoYXIgbXNnYnVmMFszNF07Cgl1bnNpZ25lZCBjaGFyIG1zZ2J1ZjFbMzRdOwoJaW50IG51bSA9IHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQ/MjoxOwoJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geyB7IGFkZHIsIGZsYWdzLCAxLCBtc2didWYwIH0sIAoJICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFkZHIsIGZsYWdzIHwgSTJDX01fUkQsIDAsIG1zZ2J1ZjEgfQoJICAgICAgICAgICAgICAgICAgICAgICAgfTsKCWludCBpOwoKCW1zZ2J1ZjBbMF0gPSBjb21tYW5kOwoJc3dpdGNoKHNpemUpIHsKCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgoJCW1zZ1swXS5sZW4gPSAwOwoJCS8qIFNwZWNpYWwgY2FzZTogVGhlIHJlYWQvd3JpdGUgZmllbGQgaXMgdXNlZCBhcyBkYXRhICovCgkJbXNnWzBdLmZsYWdzID0gZmxhZ3MgfCAocmVhZF93cml0ZT09STJDX1NNQlVTX1JFQUQpP0kyQ19NX1JEOjA7CgkJbnVtID0gMTsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JZVEU6CgkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKCQkJLyogU3BlY2lhbCBjYXNlOiBvbmx5IGEgcmVhZCEgKi8KCQkJbXNnWzBdLmZsYWdzID0gSTJDX01fUkQgfCBmbGFnczsKCQkJbnVtID0gMTsKCQl9CgkJYnJlYWs7CgljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CgkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpCgkJCW1zZ1sxXS5sZW4gPSAxOwoJCWVsc2UgewoJCQltc2dbMF0ubGVuID0gMjsKCQkJbXNnYnVmMFsxXSA9IGRhdGEtPmJ5dGU7CgkJfQoJCWJyZWFrOwoJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKQoJCQltc2dbMV0ubGVuID0gMjsKCQllbHNlIHsKCQkJbXNnWzBdLmxlbj0zOwoJCQltc2didWYwWzFdID0gZGF0YS0+d29yZCAmIDB4ZmY7CgkJCW1zZ2J1ZjBbMl0gPSAoZGF0YS0+d29yZCA+PiA4KSAmIDB4ZmY7CgkJfQoJCWJyZWFrOwoJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgoJCW51bSA9IDI7IC8qIFNwZWNpYWwgY2FzZSAqLwoJCXJlYWRfd3JpdGUgPSBJMkNfU01CVVNfUkVBRDsKCQltc2dbMF0ubGVuID0gMzsKCQltc2dbMV0ubGVuID0gMjsKCQltc2didWYwWzFdID0gZGF0YS0+d29yZCAmIDB4ZmY7CgkJbXNnYnVmMFsyXSA9IChkYXRhLT53b3JkID4+IDgpICYgMHhmZjsKCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CgljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzoKCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgewoJCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJCbG9jayByZWFkIG5vdCBzdXBwb3J0ZWQgIgoJCQkgICAgICAgInVuZGVyIEkyQyBlbXVsYXRpb24hXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0gZWxzZSB7CgkJCW1zZ1swXS5sZW4gPSBkYXRhLT5ibG9ja1swXSArIDI7CgkJCWlmIChtc2dbMF0ubGVuID4gSTJDX1NNQlVTX0JMT0NLX01BWCArIDIpIHsKCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInNtYnVzX2FjY2VzcyBjYWxsZWQgd2l0aCAiCgkJCQkgICAgICAgImludmFsaWQgYmxvY2sgd3JpdGUgc2l6ZSAoJWQpXG4iLAoJCQkJICAgICAgIGRhdGEtPmJsb2NrWzBdKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZihzaXplID09IEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQykKCQkJCShtc2dbMF0ubGVuKSsrOwoJCQlmb3IgKGkgPSAxOyBpIDw9IG1zZ1swXS5sZW47IGkrKykKCQkJCW1zZ2J1ZjBbaV0gPSBkYXRhLT5ibG9ja1tpLTFdOwoJCX0KCQlicmVhazsKCWNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDoKCWNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTF9QRUM6CgkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiQmxvY2sgcHJvY2VzcyBjYWxsIG5vdCBzdXBwb3J0ZWQgIgoJCSAgICAgICAidW5kZXIgSTJDIGVtdWxhdGlvbiFcbiIpOwoJCXJldHVybiAtMTsKCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgoJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CgkJCW1zZ1sxXS5sZW4gPSBJMkNfU01CVVNfSTJDX0JMT0NLX01BWDsKCQl9IGVsc2UgewoJCQltc2dbMF0ubGVuID0gZGF0YS0+YmxvY2tbMF0gKyAxOwoJCQlpZiAobXNnWzBdLmxlbiA+IEkyQ19TTUJVU19JMkNfQkxPQ0tfTUFYICsgMSkgewoJCQkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAiaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQgY2FsbGVkIHdpdGggIgoJCQkJICAgICAgICJpbnZhbGlkIGJsb2NrIHdyaXRlIHNpemUgKCVkKVxuIiwKCQkJCSAgICAgICBkYXRhLT5ibG9ja1swXSk7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJZm9yIChpID0gMTsgaSA8PSBkYXRhLT5ibG9ja1swXTsgaSsrKQoJCQkJbXNnYnVmMFtpXSA9IGRhdGEtPmJsb2NrW2ldOwoJCX0KCQlicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2VycigmYWRhcHRlci0+ZGV2LCAic21idXNfYWNjZXNzIGNhbGxlZCB3aXRoIGludmFsaWQgc2l6ZSAoJWQpXG4iLAoJCSAgICAgICBzaXplKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2csIG51bSkgPCAwKQoJCXJldHVybiAtMTsKCglpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkKCQlzd2l0Y2goc2l6ZSkgewoJCQljYXNlIEkyQ19TTUJVU19CWVRFOgoJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjBbMF07CgkJCQlicmVhazsKCQkJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgoJCQkJZGF0YS0+Ynl0ZSA9IG1zZ2J1ZjFbMF07CgkJCQlicmVhazsKCQkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOiAKCQkJY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgoJCQkJZGF0YS0+d29yZCA9IG1zZ2J1ZjFbMF0gfCAobXNnYnVmMVsxXSA8PCA4KTsKCQkJCWJyZWFrOwoJCQljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKCQkJCS8qIGZpeGVkIGF0IDMyIGZvciBub3cgKi8KCQkJCWRhdGEtPmJsb2NrWzBdID0gSTJDX1NNQlVTX0kyQ19CTE9DS19NQVg7CgkJCQlmb3IgKGkgPSAwOyBpIDwgSTJDX1NNQlVTX0kyQ19CTE9DS19NQVg7IGkrKykKCQkJCQlkYXRhLT5ibG9ja1tpKzFdID0gbXNnYnVmMVtpXTsKCQkJCWJyZWFrOwoJCX0KCXJldHVybiAwOwp9CgoKczMyIGkyY19zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXB0ZXIsIHUxNiBhZGRyLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKICAgICAgICAgICAgICAgICAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsIAogICAgICAgICAgICAgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQp7CglzMzIgcmVzOwoJaW50IHN3cGVjID0gMDsKCXU4IHBhcnRpYWwgPSAwOwoKCWZsYWdzICY9IEkyQ19NX1RFTiB8IEkyQ19DTElFTlRfUEVDOwoJaWYoKGZsYWdzICYgSTJDX0NMSUVOVF9QRUMpICYmCgkgICAhKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0hXUEVDX0NBTEMpKSkgewoJCXN3cGVjID0gMTsKCQlpZihyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEICYmCgkJICAgc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSkKCQkJc2l6ZSA9IEkyQ19TTUJVU19CTE9DS19EQVRBX1BFQzsKCQllbHNlIGlmKHNpemUgPT0gSTJDX1NNQlVTX1BST0NfQ0FMTCkKCQkJc2l6ZSA9IEkyQ19TTUJVU19QUk9DX0NBTExfUEVDOwoJCWVsc2UgaWYoc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMKSB7CgkJCWkyY19zbWJ1c19hZGRfcGVjKGFkZHIsIGNvbW1hbmQsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfQkxPQ0tfREFUQSwgZGF0YSk7CgkJCXBhcnRpYWwgPSBkYXRhLT5ibG9ja1tkYXRhLT5ibG9ja1swXSArIDFdOwoJCQlzaXplID0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTF9QRUM7CgkJfSBlbHNlIGlmKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFICYmCgkJICAgICAgICAgIHNpemUgIT0gSTJDX1NNQlVTX1FVSUNLICYmCgkJICAgICAgICAgIHNpemUgIT0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBKQoJCQlzaXplID0gaTJjX3NtYnVzX2FkZF9wZWMoYWRkciwgY29tbWFuZCwgc2l6ZSwgZGF0YSk7Cgl9CgoJaWYgKGFkYXB0ZXItPmFsZ28tPnNtYnVzX3hmZXIpIHsKCQlkb3duKCZhZGFwdGVyLT5idXNfbG9jayk7CgkJcmVzID0gYWRhcHRlci0+YWxnby0+c21idXNfeGZlcihhZGFwdGVyLGFkZHIsZmxhZ3MscmVhZF93cml0ZSwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsc2l6ZSxkYXRhKTsKCQl1cCgmYWRhcHRlci0+YnVzX2xvY2spOwoJfSBlbHNlCgkJcmVzID0gaTJjX3NtYnVzX3hmZXJfZW11bGF0ZWQoYWRhcHRlcixhZGRyLGZsYWdzLHJlYWRfd3JpdGUsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsc2l6ZSxkYXRhKTsKCglpZihyZXMgPj0gMCAmJiBzd3BlYyAmJgoJICAgc2l6ZSAhPSBJMkNfU01CVVNfUVVJQ0sgJiYgc2l6ZSAhPSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEgJiYKCSAgIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEIHx8IHNpemUgPT0gSTJDX1NNQlVTX1BST0NfQ0FMTF9QRUMgfHwKCSAgICBzaXplID09IEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTExfUEVDKSkgewoJCWlmKGkyY19zbWJ1c19jaGVja19wZWMoYWRkciwgY29tbWFuZCwgc2l6ZSwgcGFydGlhbCwgZGF0YSkpCgkJCXJldHVybiAtMTsKCX0KCXJldHVybiByZXM7Cn0KCgpFWFBPUlRfU1lNQk9MKGkyY19hZGRfYWRhcHRlcik7CkVYUE9SVF9TWU1CT0woaTJjX2RlbF9hZGFwdGVyKTsKRVhQT1JUX1NZTUJPTChpMmNfYWRkX2RyaXZlcik7CkVYUE9SVF9TWU1CT0woaTJjX2RlbF9kcml2ZXIpOwpFWFBPUlRfU1lNQk9MKGkyY19hdHRhY2hfY2xpZW50KTsKRVhQT1JUX1NZTUJPTChpMmNfZGV0YWNoX2NsaWVudCk7CkVYUE9SVF9TWU1CT0woaTJjX3VzZV9jbGllbnQpOwpFWFBPUlRfU1lNQk9MKGkyY19yZWxlYXNlX2NsaWVudCk7CkVYUE9SVF9TWU1CT0woaTJjX2NsaWVudHNfY29tbWFuZCk7CkVYUE9SVF9TWU1CT0woaTJjX2NoZWNrX2FkZHIpOwoKRVhQT1JUX1NZTUJPTChpMmNfbWFzdGVyX3NlbmQpOwpFWFBPUlRfU1lNQk9MKGkyY19tYXN0ZXJfcmVjdik7CkVYUE9SVF9TWU1CT0woaTJjX2NvbnRyb2wpOwpFWFBPUlRfU1lNQk9MKGkyY190cmFuc2Zlcik7CkVYUE9SVF9TWU1CT0woaTJjX2FkYXB0ZXJfaWQpOwpFWFBPUlRfU1lNQk9MKGkyY19nZXRfYWRhcHRlcik7CkVYUE9SVF9TWU1CT0woaTJjX3B1dF9hZGFwdGVyKTsKRVhQT1JUX1NZTUJPTChpMmNfcHJvYmUpOwoKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfeGZlcik7CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX3F1aWNrKTsKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9ieXRlKTsKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfYnl0ZSk7CkVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKTsKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKTsKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF93b3JkX2RhdGEpOwpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEpOwpFWFBPUlRfU1lNQk9MKGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKTsKRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YSk7CgpNT0RVTEVfQVVUSE9SKCJTaW1vbiBHLiBWb2dsIDxzaW1vbkB0ay51bmktbGluei5hYy5hdD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIG1haW4gbW9kdWxlIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK