LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmN0YW5oIGZ1bmN0aW9uLgogICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCiNpZmRlZiBfX0VMRl9fCgkuc2VjdGlvbiAucm9kYXRhCiNlbHNlCgkudGV4dAojZW5kaWYKCgkuYWxpZ24gQUxJR05BUkcoNCkKCUFTTV9UWVBFX0RJUkVDVElWRShoYWxmLEBvYmplY3QpCmhhbGY6CS5kb3VibGUgMC41CglBU01fU0laRV9ESVJFQ1RJVkUoaGFsZikKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCglBU01fVFlQRV9ESVJFQ1RJVkUobG4yXzIsQG9iamVjdCkKbG4yXzI6CS50ZmxvYXQgMC4zNDY1NzM1OTAyNzk5NzI2NTQ3MDg2MTYwCglBU01fU0laRV9ESVJFQ1RJVkUobG4yXzIpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlZHgpCiNlbHNlCiNkZWZpbmUgTU8ob3ApIG9wCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9faWVlZTc1NF9hdGFuaCkKCW1vdmwJOCglZXNwKSwgJWVjeAoKCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMHg3ZmZmZmZmZiwgJWVheAoJY21wbAkkMHg3ZmYwMDAwMCwgJWVheAoJamFlCTVmCjc6CgojaWZkZWYgUElDCgljYWxsCTFmCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCjE6CXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0xYl0sICVlZHgKI2VuZGlmCgoJYW5kbAkkMHg4MDAwMDAwMCwgJWVjeCAvLyBFQ1ggPT0gMCBpZmYgWCA+PSAwCgoJZmxkdAlNTyhsbjJfMikJLy8gMC41KmxuMgoJeG9ybAklZWN4LCA4KCVlc3ApCglmbGRsCTQoJWVzcCkJCS8vIHx4fCA6IDAuNSpsbjIKCWZjb21sCU1PKGhhbGYpCS8vIHx4fCA6IDAuNSpsbjIKCWZsZAklc3QJCS8vIHx4fCA6IHx4fCA6IDAuNSpsbjIKCWZuc3RzdwkJCS8vIHx4fCA6IHx4fCA6IDAuNSpsbjIKCXNhaGYKCWphZQkyZgoJZmFkZAklc3QsICVzdCgxKQkvLyB8eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZsZAklc3QJCS8vIHx4fCA6IHx4fCA6IDIqfHh8IDogMC41KmxuMgoJZnN1YnJsCU1PKG9uZSkJCS8vIDEtfHh8IDogfHh8IDogMip8eHwgOiAwLjUqbG4yCglmeGNoCQkJLy8gfHh8IDogMS18eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZtdWwJJXN0KDIpCQkvLyAyKnx4fF4yIDogMS18eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZkaXZwCQkJLy8gKDIqfHh8XjIpLygxLXx4fCkgOiAyKnx4fCA6IDAuNSpsbjIKCWZhZGRwCQkJLy8gMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglmY29tbAlNTyhsaW1pdCkJLy8gMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglmbnN0c3cJCQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCXNhaGYKCWphZQk0ZgoJZnlsMnhwMQkJCS8vIDAuNSpsbjIqbGQoMSsyKnx4fCsoMip8eHxeMikvKDEtfHh8KSkKCWplY3h6CTNmCglmY2hzCQkJLy8gMC41KmxuMipsZCgxKzIqeCsoMip4XjIpLygxLXgpKQozOglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKNDoJZmFkZGwJTU8ob25lKQkJLy8gMSsyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZ5bDJ4CQkJLy8gMC41KmxuMipsZCgxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKDErMip4KygyKnheMikvKDEteCkpCjM6CXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoyOglmYWRkbAlNTyhvbmUpCQkvLyAxK3x4fCA6IHx4fCA6IDAuNSpsbjIKCWZ4Y2gJCQkvLyB8eHwgOiAxK3x4fCA6IDAuNSpsbjIKCWZzdWJybAlNTyhvbmUpCQkvLyAxLXx4fCA6IDErfHh8IDogMC41KmxuMgoJZmRpdnJwCQkJLy8gKDErfHh8KS8oMS18eHwpIDogMC41KmxuMgoJZnlsMngJCQkvLyAwLjUqbG4yKmxkKCgxK3x4fCkvKDEtfHh8KSkKCWplY3h6CTNmCglmY2hzCQkJLy8gMC41KmxuMipsZCgoMSt4KS8oMS14KSkKMzoJcmV0CgoJLy8geCA9PSBOYU4gb3IgsUluZgo1OglqYQk2ZgoJY21wbAkkMCwgNCglZXNwKQoJamUJN2IKNjoJZmxkbAk0KCVlc3ApCglyZXQKRU5EKF9faWVlZTc1NF9hdGFuaCkK