Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZQogKiAgU3VwcG9ydCwgbWFkZSBzb21lIHN0dWZmIHNtYWxsZXIsIGFuZCBmaXR0ZWQgZm9yIGxpZmUgaW4gYnVzeWJveC4KICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4JCQkvKiBmb3IgX0lPICovCiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KI2luY2x1ZGUgImJ1c3lib3guaCIKCiNpZm5kZWYgX0lPCi8qIHByZS0xLjMuNDUgKi8KZW51bSB7IEJMS0dFVFNJWkUgPSAweDEyNjAgfTsKI2Vsc2UKLyogc2FtZSBvbiBpMzg2LCBtNjhrLCBhcm07IGRpZmZlcmVudCBvbiBhbHBoYSwgbWlwcywgc3BhcmMsIHBwYyAqLwojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCiNlbmRpZgoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIGxvbmcgUEFHRVMgPSAwOwpzdGF0aWMgaW50IGNoZWNrID0gMDsKc3RhdGljIGludCBiYWRwYWdlcyA9IDA7CiNpZiBFTkFCTEVfRkVBVFVSRV9NS1NXQVBfVjAKc3RhdGljIGludCB2ZXJzaW9uID0gLTE7CiNlbHNlCiNkZWZpbmUgdmVyc2lvbiAxCi8qIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBvcHRpbWl6ZSBhd2F5IGFueXRoaW5nIHdoaWNoIHdvdWxkIGRlYWwgd2l0aCBjaGVja2luZwogKiB0aGUga2VybmVsIHJldmlzaW9uIGFzIHdlIGhhdmUgdjEgc3VwcG9ydCBvbmx5IGFueXdheS4KICovCiN1bmRlZiBLRVJORUxfVkVSU0lPTgojZGVmaW5lIEtFUk5FTF9WRVJTSU9OKHAscSxyKSAxCiNkZWZpbmUgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpIDEKI2VuZGlmCgovKgogKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5pb24gc3dhcF9oZWFkZXIgdXNlcyB0aGUgY29uc3RhbnQgUEFHRV9TSVpFLgogKiBVbmZvcnR1bmF0ZWx5LCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhpcyBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBtb2RlbCwKICogYW5kIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHJ1biB0aW1lIC0tIHdlIHVzZSBnZXRwYWdlc2l6ZSgpLgogKi8KCnN0YXRpYyBpbnQgcGFnZXNpemU7CnN0YXRpYyB1bnNpZ25lZCBpbnQgKnNpZ25hdHVyZV9wYWdlOwoKc3RhdGljIHN0cnVjdCBzd2FwX2hlYWRlcl92MSB7CgljaGFyIGJvb3RiaXRzWzEwMjRdOwkJLyogU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCgl1bnNpZ25lZCBpbnQgc3dhcF92ZXJzaW9uOwoJdW5zaWduZWQgaW50IGxhc3RfcGFnZTsKCXVuc2lnbmVkIGludCBucl9iYWRwYWdlczsKCXVuc2lnbmVkIGludCBwYWRkaW5nWzEyNV07Cgl1bnNpZ25lZCBpbnQgYmFkcGFnZXNbMV07Cn0gKnA7CgpzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zaWduYXR1cmVfcGFnZSh2b2lkKQp7CglwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CgojaWZkZWYgUEFHRV9TSVpFCglpZiAocGFnZXNpemUgIT0gUEFHRV9TSVpFKQoJCWJiX2Vycm9yX21zZygiQXNzdW1pbmcgcGFnZXMgb2Ygc2l6ZSAlZCIsIHBhZ2VzaXplKTsKI2VuZGlmCglzaWduYXR1cmVfcGFnZSA9ICh1bnNpZ25lZCBpbnQgKikgeG1hbGxvYyhwYWdlc2l6ZSk7CgltZW1zZXQoc2lnbmF0dXJlX3BhZ2UsIDAsIHBhZ2VzaXplKTsKCXAgPSAoc3RydWN0IHN3YXBfaGVhZGVyX3YxICopIHNpZ25hdHVyZV9wYWdlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc2lnbmF0dXJlKGNoYXIgKnNpZykKewoJY2hhciAqc3AgPSAoY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCglzdHJuY3B5KHNwICsgcGFnZXNpemUgLSAxMCwgc2lnLCAxMCk7Cn0KCiNkZWZpbmUgVjBfTUFYX1BBR0VTCSg4ICogKHBhZ2VzaXplIC0gMTApKQovKiBCZWZvcmUgMi4yLjBwcmU5ICovCiNkZWZpbmUgVjFfT0xEX01BWF9QQUdFUwkoKDB4N2ZmZmZmZmYgLyBwYWdlc2l6ZSkgLSAxKQovKiBTaW5jZSAyLjIuMHByZTk6CiAgIGVycm9yIGlmIG5yIG9mIHBhZ2VzID49IFNXUF9PRkZTRVQoU1dQX0VOVFJZKDAsfjBVTCkpCiAgIHdpdGggdmFyaWF0aW9ucyBvbgoJI2RlZmluZSBTV1BfRU5UUlkodHlwZSxvZmZzZXQpICgoKHR5cGUpIDw8IDEpIHwgKChvZmZzZXQpIDw8IDgpKQoJI2RlZmluZSBTV1BfT0ZGU0VUKGVudHJ5KSAoKGVudHJ5KSA+PiA4KQogICBvbiB0aGUgdmFyaW91cyBhcmNoaXRlY3R1cmVzLiBCZWxvdyB0aGUgcmVzdWx0IC0geXVrLgoKICAgTWFjaGluZQlwYWdlc2l6ZQlTV1BfRU5UUlkJU1dQX09GRlNFVAlib3VuZCsxCW9sZGJvdW5kKzIKICAgaTM4NgkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgbWlwcwkJMl4xMgkJbzw8MTUJCWU+PjE1CQkxPDwxNwkxPDwxOQogICBhbHBoYQkyXjEzCQlvPDw0MAkJZT4+NDAJCTE8PDI0CTE8PDE4CiAgIG02OGsJCTJeMTIJCW88PDEyCQllPj4xMgkJMTw8MjAJMTw8MTkKICAgc3BhcmMJMl57MTIsMTN9CShvJjB4M2ZmZmYpPDw5CShlPj45KSYweDNmZmZmCTE8PDE4CTE8PHsxOSwxOH0KICAgc3BhcmM2NAkyXjEzCQlvPDwxMwkJZT4+MTMJCTE8PDUxCTE8PDE4CiAgIHBwYwkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgYXJtbwkJMl57MTMsMTQsMTV9CW88PDgJCWU+PjgJCTE8PDI0CTE8PHsxOCwxNywxNn0KICAgYXJtdgkJMl4xMgkJbzw8OQkJZT4+OQkJMTw8MjMJMTw8MTkKCiAgIGFzc3VtaW5nIHRoYXQgbG9uZ3MgaGF2ZSA2NCBiaXRzIG9uIGFscGhhIGFuZCBzcGFyYzY0IGFuZCAzMiBiaXRzIGVsc2V3aGVyZS4KCiAgIFRoZSBiYWQgcGFydCBpcyB0aGF0IHdlIG5lZWQgdG8ga25vdyB0aGlzIHNpbmNlIHRoZSBrZXJuZWwgd2lsbAogICByZWZ1c2UgYSBzd2FwIHNwYWNlIGlmIGl0IGlzIHRvbyBsYXJnZS4KKi8KLyogcGF0Y2ggZnJvbSBqaiAtIHdoeSBkb2VzIHRoaXMgZGlmZmVyIGZyb20gdGhlIGFib3ZlPyAqLwojaWYgZGVmaW5lZChfX2FscGhhX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMjQpIC0gMSkKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAxNykgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMyA8PCAyOSkgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIChwYWdlc2l6ZSA9PSA4MTkyID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxzZQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgVjFfT0xEX01BWF9QQUdFUwojZW5kaWYKLyogbWFuIHBhZ2Ugbm93IHNheXM6ClRoZSBtYXhpbXVtIHVzZWZ1bCBzaXplIG9mIGEgc3dhcCBhcmVhIG5vdyBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUuCkl0IGlzIHJvdWdobHkgMkdCIG9uIGkzODYsIFBQQywgbTY4aywgQVJNLCAxR0Igb24gc3BhcmMsIDUxMk1CIG9uIG1pcHMsCjEyOEdCIG9uIGFscGhhIGFuZCAzVEIgb24gc3BhcmM2NC4KKi8KCiNkZWZpbmUgTUFYX0JBRFBBR0VTCSgocGFnZXNpemUtMTAyNC0xMjgqc2l6ZW9mKGludCktMTApL3NpemVvZihpbnQpKQoKc3RhdGljIGlubGluZSB2b2lkIGJpdF9zZXQodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciB8IG07Cn0KCnN0YXRpYyBpbnQgYml0X3Rlc3RfYW5kX2NsZWFyKHVuc2lnbmVkIGludCAqYWRkciwgdW5zaWduZWQgaW50IG5yKQp7Cgl1bnNpZ25lZCBpbnQgciwgbTsKCglhZGRyICs9IG5yIC8gKDggKiBzaXplb2YoaW50KSk7CgoJciA9ICphZGRyOwoJbSA9IDEgPDwgKG5yICYgKDggKiBzaXplb2YoaW50KSAtIDEpKTsKCgkqYWRkciA9IHIgJiB+bTsKCXJldHVybiAociAmIG0pICE9IDA7Cn0KCnN0YXRpYyB2b2lkIHBhZ2Vfb2soaW50IHBhZ2UpCnsKCWlmIChFTkFCTEVfRkVBVFVSRV9NS1NXQVBfVjApIHsKCQliaXRfc2V0KHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKCX0KfQoKc3RhdGljIHZvaWQgY2hlY2tfYmxvY2tzKHZvaWQpCnsKCXVuc2lnbmVkIGludCBjdXJyZW50X3BhZ2U7CglpbnQgZG9fc2VlayA9IDE7CgljaGFyICpidWZmZXI7CgoJYnVmZmVyID0geG1hbGxvYyhwYWdlc2l6ZSk7CgljdXJyZW50X3BhZ2UgPSAwOwoJd2hpbGUgKGN1cnJlbnRfcGFnZSA8IFBBR0VTKSB7CgkJaWYgKCFjaGVjayAmJiB2ZXJzaW9uID09IDApIHsKCQkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoZG9fc2VlayAmJiBsc2VlayhERVYsIGN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0KCQkJY3VycmVudF9wYWdlICogcGFnZXNpemUpCgkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiKTsKCQlpZiAoKGRvX3NlZWsgPSAocGFnZXNpemUgIT0gcmVhZChERVYsIGJ1ZmZlciwgcGFnZXNpemUpKSkpIHsKCQkJY3VycmVudF9wYWdlKys7CgkJCWlmICh2ZXJzaW9uID09IDApCgkJCQliaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIGN1cnJlbnRfcGFnZSk7CgkJCWVsc2UgewoJCQkJaWYgKGJhZHBhZ2VzID09IE1BWF9CQURQQUdFUykKCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYmFkIHBhZ2VzIik7CgkJCQlwLT5iYWRwYWdlc1tiYWRwYWdlc10gPSBjdXJyZW50X3BhZ2U7CgkJCX0KCQkJYmFkcGFnZXMrKzsKCQkJY29udGludWU7CgkJfQoJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJfQoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQoJCWZyZWUoYnVmZmVyKTsKCWlmIChiYWRwYWdlcyA+IDApCgkJcHJpbnRmKCIlZCBiYWQgcGFnZSVzXG4iLCBiYWRwYWdlcywgKGJhZHBhZ2VzPT0xKT8iIjoicyIpOwp9CgpzdGF0aWMgbG9uZyB2YWxpZF9vZmZzZXQoaW50IGZkLCBpbnQgb2Zmc2V0KQp7CgljaGFyIGNoOwoKCWlmIChsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDApCgkJcmV0dXJuIDA7CglpZiAocmVhZChmZCwgJmNoLCAxKSA8IDEpCgkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBmaW5kX3NpemUoaW50IGZkKQp7Cgl1bnNpZ25lZCBpbnQgaGlnaCwgbG93OwoKCWxvdyA9IDA7Cglmb3IgKGhpZ2ggPSAxOyBoaWdoID4gMCAmJiB2YWxpZF9vZmZzZXQoZmQsIGhpZ2gpOyBoaWdoICo9IDIpCgkJbG93ID0gaGlnaDsKCXdoaWxlIChsb3cgPCBoaWdoIC0gMSkgewoJCWNvbnN0IGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwoKCQlpZiAodmFsaWRfb2Zmc2V0KGZkLCBtaWQpKQoJCQlsb3cgPSBtaWQ7CgkJZWxzZQoJCQloaWdoID0gbWlkOwoJfQoJcmV0dXJuIChsb3cgKyAxKTsKfQoKLyogcmV0dXJuIHNpemUgaW4gcGFnZXMsIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8Kc3RhdGljIGlubGluZSBsb25nIGdldF9zaXplKGNvbnN0IGNoYXIgKmZpbGUpCnsKCWludCBmZDsKCWxvbmcgc2l6ZTsKCglmZCA9IGJiX3hvcGVuMyhmaWxlLCBPX1JET05MWSwgMCk7CglpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSB7CgkJc2l6ZSAvPSBwYWdlc2l6ZSAvIDUxMjsKCX0gZWxzZSB7CgkJc2l6ZSA9IGZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBzaXplOwp9CgppbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CgljaGFyICp0bXA7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJaW50IHN6OwoJaW50IG1heHBhZ2VzOwoJaW50IGdvb2RwYWdlczsKI2lmZGVmIF9fc3BhcmNfXwoJaW50IGZvcmNlID0gMDsKI2VuZGlmCgoJaW5pdF9zaWduYXR1cmVfcGFnZSgpOwkJLyogZ2V0IHBhZ2VzaXplICovCgoJYmJfb3B0X2NvbXBsZW1lbnRhbGx5ID0gIj8iOyAvKiBjYWxsIGJiX3Nob3dfdXNhZ2UgaW50ZXJuYWxseSAqLwoJc3ogPSBiYl9nZXRvcHRfdWxmbGFncyhhcmdjLCBhcmd2LCAiK2NmdjoiLCAmdG1wKTsKCWlmIChzeiAmIDEpCgkJY2hlY2sgPSAxOwojaWZkZWYgX19zcGFyY19fCglpZiAoc3ogJiAyKQoJCWZvcmNlID0gMTsKI2VuZGlmCiNpZiBFTkFCTEVfRkVBVFVSRV9NS1NXQVBfVjAKCWlmIChzeiAmIDQpIHsKCQl2ZXJzaW9uID0gYmJfeGdldGxhcmcodG1wLCAxMCwgMCwgMSk7Cgl9IGVsc2UgewoJCWlmIChnZXRfbGludXhfdmVyc2lvbl9jb2RlKCkgPCBLRVJORUxfVkVSU0lPTigyLCAxLCAxMTcpKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQojZW5kaWYKCglhcmd2ICs9IG9wdGluZDsKCWFyZ2MgLT0gb3B0aW5kOwoKCWdvb2RwYWdlcyA9IHBhZ2VzaXplIC8gMTAyNDsgLyogY2FjaGUgZGl2aXNpb24gKi8KCXdoaWxlIChhcmdjLS0pIHsKCQlpZiAoZGV2aWNlX25hbWUpIHsKCQkJUEFHRVMgPSBiYl94Z2V0bGFyZyhhcmd2WzBdLCAwLCAxMCwgc3ogKiBnb29kcGFnZXMpIC8gZ29vZHBhZ2VzOwoJCQlhcmdjID0gMDsgLyogaWdub3JlIGFueSBzdXJwbHVzIGFyZ3MuLiAqLwoJCX0gZWxzZSB7CgkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQkJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CgkJCWFyZ3YrKzsKCQl9Cgl9CgoJaWYgKCFkZXZpY2VfbmFtZSkgewoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvcjogTm93aGVyZSB0byBzZXQgdXAgc3dhcCBvbj8iKTsKCX0KCWlmICghUEFHRVMpIHsKCQlQQUdFUyA9IHN6OwoJfQoKI2lmIDAKCW1heHBhZ2VzID0gKCh2ZXJzaW9uID09IDApID8gVjBfTUFYX1BBR0VTIDogVjFfTUFYX1BBR0VTKTsKI2Vsc2UKCWlmICghdmVyc2lvbikKCQltYXhwYWdlcyA9IFYwX01BWF9QQUdFUzsKCWVsc2UgaWYgKGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSA+PSBLRVJORUxfVkVSU0lPTigyLDIsMSkpCgkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7CgllbHNlIHsKCQltYXhwYWdlcyA9IFYxX09MRF9NQVhfUEFHRVM7CgkJaWYgKG1heHBhZ2VzID4gVjFfTUFYX1BBR0VTKQoJCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCX0KI2VuZGlmCglpZiAoUEFHRVMgPiBtYXhwYWdlcykgewoJCVBBR0VTID0gbWF4cGFnZXM7CgkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiB0cnVuY2F0aW5nIHN3YXAgYXJlYSB0byAlbGRrQiIsCgkJCQlQQUdFUyAqIGdvb2RwYWdlcyk7Cgl9CgoJREVWID0gYmJfeG9wZW4zKGRldmljZV9uYW1lLCBPX1JEV1IsIDApOwoJaWYgKGZzdGF0KERFViwgJnN0YXRidWYpIDwgMCkKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgZGV2aWNlX25hbWUpOwoJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCgkJY2hlY2sgPSAwOwoJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJXaWxsIG5vdCB0cnkgdG8gbWFrZSBzd2FwZGV2aWNlIG9uICclcyciLCBkZXZpY2VfbmFtZSk7CgojaWZkZWYgX19zcGFyY19fCglpZiAoIWZvcmNlICYmIHZlcnNpb24gPT0gMCkgewoJCS8qIERvbid0IG92ZXJ3cml0ZSBwYXJ0aXRpb24gdGFibGUgdW5sZXNzIGZvcmNlZCAqLwoJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHNpZ25hdHVyZV9wYWdlOwoJCXVuc2lnbmVkIHNob3J0ICpxLCBzdW07CgoJCWlmIChyZWFkKERFViwgYnVmZmVyLCA1MTIpICE9IDUxMikKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikgKGJ1ZmZlciArIDUxMCk7CgkJCWZvciAoc3VtID0gMDsgcSA+PSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOykKCQkJCXN1bSBePSAqcS0tOwoJCQlpZiAoIXN1bSkgewoJCQkJYmJfZXJyb3JfbXNnKCJEZXZpY2UgJyVzJyBjb250YWlucyBhIHZhbGlkIFN1biBkaXNrbGFiZWwuXG4iCiJUaGlzIHByb2JhYmx5IG1lYW5zIGNyZWF0aW5nIHYwIHN3YXAgd291bGQgZGVzdHJveSB5b3VyIHBhcnRpdGlvbiB0YWJsZVxuIgoiTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuIgoidGhlIC1mIG9wdGlvbiB0byBmb3JjZSBpdC4iLCBkZXZpY2VfbmFtZSk7CgkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwoJCQl9CgkJfQoJfQojZW5kaWYKCglpZiAodmVyc2lvbiA9PSAwIHx8IGNoZWNrKQoJCWNoZWNrX2Jsb2NrcygpOwoJaWYgKHZlcnNpb24gPT0gMCAmJiAhYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCAwKSkKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJaWYgKHZlcnNpb24gPT0gMSkgewoJCXAtPnN3YXBfdmVyc2lvbiA9IHZlcnNpb247CgkJcC0+bGFzdF9wYWdlID0gUEFHRVMgLSAxOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlVuYWJsZSB0byBzZXQgdXAgc3dhcC1zcGFjZTogdW5yZWFkYWJsZSIpOwoJcHJpbnRmKCJTZXR0aW5nIHVwIHN3YXBzcGFjZSB2ZXJzaW9uICVkLCBzaXplID0gJWxkIGJ5dGVzXG4iLAoJCSAgIHZlcnNpb24sIChsb25nKSAoZ29vZHBhZ2VzICogcGFnZXNpemUpKTsKCXdyaXRlX3NpZ25hdHVyZSgodmVyc2lvbiA9PSAwKSA/ICJTV0FQLVNQQUNFIiA6ICJTV0FQU1BBQ0UyIik7CgoJc3ogPSAoKHZlcnNpb24gPT0gMCkgPyAwIDogMTAyNCk7IC8qIG9mZnNldCAqLwoJaWYgKGxzZWVrKERFViwgc3osIFNFRUtfU0VUKSAhPSBzeikKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5hYmxlIHRvIHJld2luZCBzd2FwLWRldmljZSIpOwoJZ29vZHBhZ2VzID0gcGFnZXNpemUgLSBzejsgLyogY2FjaGUgc3Vic3RyYWN0aW9uICovCglpZiAod3JpdGUoREVWLCAoY2hhciAqKSBzaWduYXR1cmVfcGFnZSArIHN6LCBnb29kcGFnZXMpCgkJIT0gZ29vZHBhZ2VzKQoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gd3JpdGUgc2lnbmF0dXJlIHBhZ2UiKTsKCgkvKgoJICogQSBzdWJzZXF1ZW50IHN3YXBvbigpIHdpbGwgZmFpbCBpZiB0aGUgc2lnbmF0dXJlCgkgKiBpcyBub3QgYWN0dWFsbHkgb24gZGlzay4gKFRoaXMgaXMgYSBrZXJuZWwgYnVnLikKCSAqLwoJaWYgKGZzeW5jKERFVikpCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZzeW5jIGZhaWxlZCIpOwoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CgkJY2xvc2UoREVWKTsKCQlmcmVlKHNpZ25hdHVyZV9wYWdlKTsKCX0KCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K