LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwNCwgMjAwNSwgMjAwNwogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAgIDAyMTExLTEzMDcgVVNBLiAgKi8KCiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgoKI2lmZGVmIF9fRUxGX18KCS5zZWN0aW9uIC5yb2RhdGEKI2Vsc2UKCS50ZXh0CiNlbmRpZgoKCS5hbGlnbiBBTElHTkFSRyg0KQoJQVNNX1RZUEVfRElSRUNUSVZFKGluZmluaXR5LEBvYmplY3QpCmluZl96ZXJvOgppbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YKCUFTTV9TSVpFX0RJUkVDVElWRShpbmZpbml0eSkKCUFTTV9UWVBFX0RJUkVDVElWRSh6ZXJvLEBvYmplY3QpCnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCUFTTV9UWVBFX0RJUkVDVElWRShtaW5mX216ZXJvLEBvYmplY3QpCm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCglBU01fVFlQRV9ESVJFQ1RJVkUocDYzLEBvYmplY3QpCnA2MzoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MwoJQVNNX1NJWkVfRElSRUNUSVZFKHA2MykKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVjeCkKI2RlZmluZSBNT1gob3AseCxmKSBvcCMjQEdPVE9GRiglZWN4LHgsZikKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2RlZmluZSBNT1gob3AseCxmKSBvcCgseCxmKQojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfcG93bCkKCWZsZHQJMTYoJWVzcCkJLy8geQoJZnhhbQoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkdAk0KCVlc3ApCQkvLyB4IDogeQoKCXN1YmwJJDgsJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2My4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHA2MykJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogeAoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IHgKCWZ1Y29tcAklc3QoMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuZQkyZgoKCS8qIE9LLCB3ZSBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHkuICAqLwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJb3JsCSQwLCAlZWR4Cglmc3RwCSVzdCgwKQkJLy8geAoJam5zCTRmCQkvLyB5ID49IDAsIGp1bXAKCWZkaXZybAlNTyhvbmUpCQkvLyAxL3gJCShub3cgcmVmZXJyZWQgdG8gYXMgeCkKCW5lZ2wJJWVheAoJYWRjbAkkMCwgJWVkeAoJbmVnbAklZWR4CjQ6CWZsZGwJTU8ob25lKQkJLy8gMSA6IHgKCWZ4Y2gKCjY6CXNocmRsCSQxLCAlZWR4LCAlZWF4CglqbmMJNWYKCWZ4Y2gKCWZtdWwJJXN0KDEpCQkvLyB4IDogU1QqeAoJZnhjaAo1OglmbXVsCSVzdCgwKSwgJXN0CS8vIHgqeCA6IFNUKngKCXNocmwJJDEsICVlZHgKCW1vdmwJJWVheCwgJWVjeAoJb3JsCSVlZHgsICVlY3gKCWpuegk2YgoJZnN0cAklc3QoMCkJCS8vIFNUKngKCXJldAoKCS8qIHkgaXMgsU5BTiAqLwozMDoJZmxkdAk0KCVlc3ApCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZnVjb21wCSVzdCgxKQkJLy8geCA6IHkKCWZuc3RzdwoJc2FoZgoJamUJMzFmCglmeGNoCQkJLy8geSA6IHgKMzE6CWZzdHAJJXN0KDEpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCWZ4Y2gJCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZmxkbAlNTyhsaW1pdCkJLy8gMC4yOSA6IDEuMCA6IHggOiB5CglmbGQJJXN0KDIpCQkvLyB4IDogMC4yOSA6IDEuMCA6IHggOiB5Cglmc3ViCSVzdCgyKQkJLy8geC0xIDogMC4yOSA6IDEuMCA6IHggOiB5CglmYWJzCQkJLy8gfHgtMXwgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZ1Y29tcHAJCQkvLyAxLjAgOiB4IDogeQoJZm5zdHN3CglmeGNoCQkJLy8geCA6IDEuMCA6IHkKCXNhaGYKCWphCTdmCglmc3ViCSVzdCgxKQkJLy8geC0xIDogMS4wIDogeQoJZnlsMnhwMQkJCS8vIGxvZzIoeCkgOiB5CglqbXAJOGYKCjc6CWZ5bDJ4CQkJLy8gbG9nMih4KSA6IHkKODoJZm11bAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkKCWZ4YW0KCWZuc3RzdwoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSpsb2cyKHgpID09ILFpbmYgPwoJamUJMjhmCglmc3QJJXN0KDEpCQkvLyB5KmxvZzIoeCkgOiB5KmxvZzIoeCkKCWZybmRpbnQJCQkvLyBpbnQoeSpsb2cyKHgpKSA6IHkqbG9nMih4KQoJZnN1YnIJJXN0LCAlc3QoMSkJLy8gaW50KHkqbG9nMih4KSkgOiBmcmFjdCh5KmxvZzIoeCkpCglmeGNoCQkJLy8gZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmMnhtMQkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKS0xIDogaW50KHkqbG9nMih4KSkKCWZhZGRsCU1PKG9uZSkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmc2NhbGUJCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglhZGRsCSQ4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoJZnN0cAklc3QoMSkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSoyXmludCh5KmxvZzIoeCkpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjI4Oglmc3RwCSVzdCgxKQkJLy8geSpsb2cyKHgpCglmbGRsCU1PKG9uZSkJCS8vIDEgOiB5KmxvZzIoeCkKCWZzY2FsZQkJCS8vIDJeKHkqbG9nMih4KSkgOiB5KmxvZzIoeCkKCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmc3RwCSVzdCgxKQkJLy8gMl4oeSpsb2cyKHgpKQoJcmV0CgoJLy8gcG93KHgssTApID0gMQoJLmFsaWduIEFMSUdOQVJHKDQpCjExOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQoJcmV0CgoJLy8geSA9PSCxaW5mCgkuYWxpZ24gQUxJR05BUkcoNCkKMTI6CWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhvbmUpCQkvLyAxCglmbGR0CTQoJWVzcCkJCS8vIHggOiAxCglmYWJzCQkJLy8gYWJzKHgpIDogMQoJZnVjb21wcAkJCS8vIDwgMSwgPT0gMSwgb3IgPiAxCglmbnN0c3cKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0NSwgJWFoCglqZQkxM2YJCS8vIGp1bXAgaWYgeCBpcyBOYU4KCgljbXBiCSQweDQwLCAlYWgKCWplCTE0ZgkJLy8ganVtcCBpZiB8eHwgPT0gMQoKCXNobGIJJDEsICVhaAoJeG9yYgklYWgsICVkbAoJYW5kbAkkMiwgJWVkeAoJZmxkbAlNT1goaW5mX3plcm8sICVlZHgsIDQpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTQ6CWZsZGwJTU8ob25lKQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjEzOglmbGR0CTQoJWVzcCkJCS8vIGxvYWQgeCA9PSBOYU4KCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxaW5mCjE1Oglmc3RwCSVzdCgwKQkJLy8geQoJdGVzdGIJJDIsICVkaAoJanoJMTZmCQkvLyBqdW1wIGlmIHggPT0gK2luZgoKCS8vIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMTdmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkxOGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChtaW5mX216ZXJvLCAlZWR4LCA4KQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE2OglmY29tcGwJTU8oemVybykKCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWF4LCAxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE3OglzaGxsCSQzMCwgJWVkeAkvLyBzaWduIGJpdCBmb3IgeSBpbiByaWdodCBwb3NpdGlvbgoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMTg6CXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyN2YJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IG1pbnVzIGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJZmNocwoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyNToJZnN0cAklc3QoMCkKMjY6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI3OgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMCBhbmQgeSBpcyA+IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KMjE6CXRlc3RiCSQyLCAlZGgKCWp6CTIyZgoKCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTIzZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIGl0IG9kZD8KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMjRmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglmbGRsCU1PKG16ZXJvKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyMjoJZnN0cAklc3QoMCkKMjM6CWFkZGwJJDgsICVlc3AJLy8gRG9uJ3QgdXNlIDIgeCBwb3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI0OglmbGRsCU1PKHplcm8pCglyZXQKCkVORChfX2llZWU3NTRfcG93bCkK