LyoKICogV3JpdHRlbiBieSBKLlQuIENvbmtsaW4gPGp0Y0BuZXRic2Qub3JnPi4KICogQWRhcHRlZCBmb3IgdXNlIGFzIGxvZzIgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4uCiAqIFB1YmxpYyBkb21haW4uCiAqCiAqIENoYW5nZWQgdG8gdXNlIGZ5bDJ4cDEgZm9yIHZhbHVlcyBuZWFyIDEsIDxkcmVwcGVyQGN5Z251cy5jb20+LgogKiBBZGFwdGVkIGZvciB4ODYtNjQgYnkgQW5kcmVhcyBKYWVnZXIgPGFqQHN1c2UuZGU+LgogKi8KCiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgoKCS5zZWN0aW9uIC5yb2RhdGEuY3N0OCwiYU0iLEBwcm9nYml0cyw4CgoJLnAyYWxpZ24gMwoJLnR5cGUgb25lLEBvYmplY3QKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCS8qIEl0IGlzIG5vdCBpbXBvcnRhbnQgdGhhdCB0aGlzIGNvbnN0YW50IGlzIHByZWNpc2UuICBJdCBpcyBvbmx5CgkgICBhIHZhbHVlIHdoaWNoIGlzIGtub3duIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgZm9yIHVzaW5nIHRoZQoJICAgZnlsMnhwMSBpbnN0cnVjdGlvbi4gICovCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCgojaWZkZWYgUElDCiMgZGVmaW5lIE1PKG9wKSBvcCMjKCVyaXApCiNlbHNlCiMgZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfbG9nMmwpCglmbGRsCU1PKG9uZSkKCWZsZHQJOCglcnNwKQkJLy8geCA6IDEKCWZ4YW0KCWZuc3RzdwoJZmxkCSVzdAkJLy8geCA6IHggOiAxCgl0ZXN0YgkkMSwgJWFoCglqbnoJM2YJCS8vIGluIGNhc2UgeCBpcyBOYU4gb3IgsUluZgo0Oglmc3ViCSVzdCgyKSwgJXN0CS8vIHgtMSA6IHggOiAxCglmbGQJJXN0CQkvLyB4LTEgOiB4LTEgOiB4IDogMQoJZmFicwkJCS8vIHx4LTF8IDogeC0xIDogeCA6IDEKCWZjb21wbAlNTyhsaW1pdCkJLy8geC0xIDogeCA6IDEKCWZuc3RzdwkJCS8vIHgtMSA6IHggOiAxCglhbmRiCSQweDQ1LCAlYWgKCWp6CTJmCglmeGFtCglmbnN0c3cKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCglqbmUJNWYKCWZhYnMJCQkvLyBsb2cyKDEpIGlzICswIGluIGFsbCByb3VuZGluZyBtb2Rlcy4KNToJZnN0cAklc3QoMSkJCS8vIHgtMSA6IDEKCWZ5bDJ4cDEJCQkvLyBsb2coeCkKCXJldAoKMjoJZnN0cAklc3QoMCkJCS8vIHggOiAxCglmeWwyeAkJCS8vIGxvZyh4KQoJcmV0CgozOgl0ZXN0YgkkNCwgJWFoCglqbnoJNGIJCS8vIGluIGNhc2UgeCBpcyCxSW5mCglmc3RwCSVzdCgxKQoJZnN0cAklc3QoMSkKCWZhZGQJJXN0KDApCglyZXQKRU5EIChfX2llZWU3NTRfbG9nMmwpCgoKRU5UUlkoX19sb2cybF9maW5pdGUpCglmbGRsCU1PKG9uZSkKCWZsZHQJOCglcnNwKQkJLy8geCA6IDEKCWZsZAklc3QJCS8vIHggOiB4IDogMQoJZnN1Ygklc3QoMiksICVzdAkvLyB4LTEgOiB4IDogMQoJZmxkCSVzdAkJLy8geC0xIDogeC0xIDogeCA6IDEKCWZhYnMJCQkvLyB8eC0xfCA6IHgtMSA6IHggOiAxCglmY29tcGwJTU8obGltaXQpCS8vIHgtMSA6IHggOiAxCglmbnN0c3cJCQkvLyB4LTEgOiB4IDogMQoJYW5kYgkkMHg0NSwgJWFoCglqegkyYgoJZnhhbQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAoJam5lCTZmCglmYWJzCQkJLy8gbG9nMigxKSBpcyArMCBpbiBhbGwgcm91bmRpbmcgbW9kZXMuCjY6CWZzdHAJJXN0KDEpCQkvLyB4LTEgOiAxCglmeWwyeHAxCQkJLy8gbG9nKHgpCglyZXQKRU5EIChfX2xvZzJsX2Zpbml0ZSkK