LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KI2luY2x1ZGUgPGkzODYtbWF0aC1hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCS50eXBlIHA2MyxAb2JqZWN0CnA2MzoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MwoJQVNNX1NJWkVfRElSRUNUSVZFKHA2MykKCS50eXBlIHAxMCxAb2JqZWN0CnAxMDoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHg5MCwgMHg0MAoJQVNNX1NJWkVfRElSRUNUSVZFKHAxMCkKCgkuc2VjdGlvbiAucm9kYXRhLmNzdDE2LCJhTSIsQHByb2diaXRzLDE2CgoJLnAyYWxpZ24gMwoJLnR5cGUgaW5maW5pdHksQG9iamVjdAppbmZfemVybzoKaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweDdmCglBU01fU0laRV9ESVJFQ1RJVkUoaW5maW5pdHkpCgkudHlwZSB6ZXJvLEBvYmplY3QKemVybzoJLmRvdWJsZSAwLjAKCUFTTV9TSVpFX0RJUkVDVElWRSh6ZXJvKQoJLnR5cGUgbWluZl9temVybyxAb2JqZWN0Cm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKREVGSU5FX0RCTF9NSU4KCiNpZmRlZiBQSUMKIyBkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlY3gpCiMgZGVmaW5lIE1PWChvcCx4LGYpIG9wIyNAR09UT0ZGKCVlY3gseCxmKQojZWxzZQojIGRlZmluZSBNTyhvcCkgb3AKIyBkZWZpbmUgTU9YKG9wLHgsZikgb3AoLHgsZikKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19pZWVlNzU0X3BvdykKCWZsZGwJMTIoJWVzcCkJLy8geQoJZnhhbQoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkbAk0KCVlc3ApCQkvLyB4IDogeQoKCXN1YmwJJDgsJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCgljbXBiCSQweDAxLCAlYWgKCWplCTMyZgkJLy8geCBpcyBOYU4KCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2My4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHA2MykJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogeAoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IHgKCWZ1Y29tcAklc3QoMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuZQkzZgoKCS8qIE9LLCB3ZSBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHkuICBJZiBsYXJnZSBlbm91Z2ggdGhhdAoJICAgZXJyb3JzIG1heSBwcm9wYWdhdGUgb3V0IG9mIHRoZSAxMSBiaXRzIGV4Y2VzcyBwcmVjaXNpb24sIHVzZQoJICAgdGhlIGFsZ29yaXRobSBmb3IgcmVhbCBleHBvbmVudCBpbnN0ZWFkLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDEwKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglvcmwJJDAsICVlZHgKCWZzdHAJJXN0KDApCQkvLyB4CglqbnMJNGYJCS8vIHkgPj0gMCwganVtcAoJZmRpdnJsCU1PKG9uZSkJCS8vIDEveAkJKG5vdyByZWZlcnJlZCB0byBhcyB4KQoJbmVnbAklZWF4CglhZGNsCSQwLCAlZWR4CgluZWdsCSVlZHgKNDoJZmxkbAlNTyhvbmUpCQkvLyAxIDogeAoJZnhjaAoKCS8qIElmIHkgaXMgZXZlbiwgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeC4gIE90aGVyd2lzZSwKCSAgIGVuc3VyZSBhbGwgaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG1pZ2h0IG92ZXJmbG93IGhhdmUgdGhlCgkgICBzaWduIG9mIHguICAqLwoJdGVzdGIJJDEsICVhbAoJam56CTZmCglmYWJzCgo2OglzaHJkbAkkMSwgJWVkeCwgJWVheAoJam5jCTVmCglmeGNoCglmYWJzCglmbXVsCSVzdCgxKQkJLy8geCA6IFNUKngKCWZ4Y2gKNToJZmxkCSVzdAkJLy8geCA6IHggOiBTVCp4CglmYWJzCQkJLy8gfHh8IDogeCA6IFNUKngKCWZtdWxwCQkJLy8gfHh8KnggOiBTVCp4CglzaHJsCSQxLCAlZWR4Cgltb3ZsCSVlYXgsICVlY3gKCW9ybAklZWR4LCAlZWN4CglqbnoJNmIKCWZzdHAJJXN0KDApCQkvLyBTVCp4CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoY3gpCiNlbmRpZgoJREJMX05BUlJPV19FVkFMX1VGTE9XX05PTk5BTgoJcmV0CgoJLyogeSBpcyCxTkFOICovCjMwOglmbGRsCTQoJWVzcCkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmdWNvbXAJJXN0KDEpCQkvLyB4IDogeQoJZm5zdHN3CglzYWhmCglqZQkzMWYKCWZ4Y2gJCQkvLyB5IDogeAozMToJZnN0cAklc3QoMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMzI6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmc3RwCSVzdCgxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CS8vIHkgaXMgYSBsYXJnZSBpbnRlZ2VyIChhYnNvbHV0ZSB2YWx1ZSBhdCBsZWFzdCAxTDw8MTApLCBidXQKCS8vIG1heSBiZSBvZGQgdW5sZXNzIGF0IGxlYXN0IDFMPDw2NC4gIFNvIGl0IG1heSBiZSBuZWNlc3NhcnkKCS8vIHRvIGFkanVzdCB0aGUgc2lnbiBvZiBhIG5lZ2F0aXZlIHJlc3VsdCBhZnRlcndhcmRzLgoJZnhjaAkJCS8vIHggOiB5CglmYWJzCQkJLy8gfHh8IDogeQoJZnhjaAkJCS8vIHkgOiB4CgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCWZ4Y2gJCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZmxkbAlNTyhsaW1pdCkJLy8gMC4yOSA6IDEuMCA6IHggOiB5CglmbGQJJXN0KDIpCQkvLyB4IDogMC4yOSA6IDEuMCA6IHggOiB5Cglmc3ViCSVzdCgyKQkJLy8geC0xIDogMC4yOSA6IDEuMCA6IHggOiB5CglmYWJzCQkJLy8gfHgtMXwgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZ1Y29tcHAJCQkvLyAxLjAgOiB4IDogeQoJZm5zdHN3CglmeGNoCQkJLy8geCA6IDEuMCA6IHkKCXNhaGYKCWphCTdmCglmc3ViCSVzdCgxKQkJLy8geC0xIDogMS4wIDogeQoJZnlsMnhwMQkJCS8vIGxvZzIoeCkgOiB5CglqbXAJOGYKCjc6CWZ5bDJ4CQkJLy8gbG9nMih4KSA6IHkKODoJZm11bAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkKCWZzdAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkqbG9nMih4KQoJZnJuZGludAkJCS8vIGludCh5KmxvZzIoeCkpIDogeSpsb2cyKHgpCglmc3Vicgklc3QsICVzdCgxKQkvLyBpbnQoeSpsb2cyKHgpKSA6IGZyYWN0KHkqbG9nMih4KSkKCWZ4Y2gJCQkvLyBmcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWYyeG0xCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpLTEgOiBpbnQoeSpsb2cyKHgpKQoJZmFkZGwJTU8ob25lKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCgkvLyBCZWZvcmUgc2NhbGluZywgd2UgbXVzdCBuZWdhdGUgaWYgeCBpcyBuZWdhdGl2ZSBhbmQgeSBpcyBhbgoJLy8gb2RkIGludGVnZXIuCgl0ZXN0YgkkMiwgJWRoCglqegkyOTFmCgkvLyB4IGlzIG5lZ2F0aXZlLiAgSWYgeSBpcyBhbiBvZGQgaW50ZWdlciwgbmVnYXRlIHRoZSByZXN1bHQuCglmbGRsCTIwKCVlc3ApCS8vIHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZmxkCSVzdAkJLy8geSA6IHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZmFicwkJCS8vIHx5fCA6IHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZmNvbXBsCU1PKHA2MykJCS8vIHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZm5zdHN3CglzYWhmCglqbmMJMjkwZgoKCS8vIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkCSVzdAkJLy8geSA6IHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZmlzdHBsbAkoJWVzcCkJCS8vIHkgOiAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IDJeZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmdWNvbXBwCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWZuc3RzdwoJc2FoZgoJam5lCTI5MWYKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyBpdCBvZGQ/Cglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglhbmRiCSQxLCAlYWwKCWp6CTI5MmYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCWZjaHMKCWptcAkyOTJmCgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyOTA6CWZzdHAJJXN0KDApCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoyOTE6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI5MjoJZnNjYWxlCQkJLy8gKy8tIDJeZnJhY3QoeSpsb2cyKHgpKSoyXmludCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWZzdHAJJXN0KDEpCQkvLyArLy0gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkKCURCTF9OQVJST1dfRVZBTF9VRkxPV19OT05OQU4KCXJldAoKCgkvLyBwb3coeCyxMCkgPSAxCgkuYWxpZ24gQUxJR05BUkcoNCkKMTE6CWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhvbmUpCglyZXQKCgkvLyB5ID09ILFpbmYKCS5hbGlnbiBBTElHTkFSRyg0KQoxMjoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkJCS8vIDEKCWZsZGwJNCglZXNwKQkJLy8geCA6IDEKCWZhYnMJCQkvLyBhYnMoeCkgOiAxCglmdWNvbXBwCQkJLy8gPCAxLCA9PSAxLCBvciA+IDEKCWZuc3RzdwoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQ1LCAlYWgKCWplCTEzZgkJLy8ganVtcCBpZiB4IGlzIE5hTgoKCWNtcGIJJDB4NDAsICVhaAoJamUJMTRmCQkvLyBqdW1wIGlmIHx4fCA9PSAxCgoJc2hsYgkkMSwgJWFoCgl4b3JiCSVhaCwgJWRsCglhbmRsCSQyLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgNCkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNDoJZmxkbAlNTyhvbmUpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTM6CWZsZGwJNCglZXNwKQkJLy8gbG9hZCB4ID09IE5hTgoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIHNvIHRlc3QKCS8vIHRoYXQgKGluIHdoaWNoIGNhc2UgeSBpcyBjZXJ0YWlubHkgZXZlbikgYmVmb3JlIHRlc3RpbmcKCS8vIHdoZXRoZXIgeSBpcyBvZGQuCglmbGQJJXN0CQkvLyB5IDogeQoJZmFicwkJCS8vIHx5fCA6IHkKCWZjb21wbAlNTyhwNjMpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkxNmYKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTE3ZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlci4KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMThmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1gobWluZl9temVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNjoJZmNvbXBsCU1PKHplcm8pCglhZGRsCSQ4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoJZm5zdHN3CglzaHJsCSQ1LCAlZWF4CglhbmRsCSQ4LCAlZWF4CglmbGRsCU1PWChpbmZfemVybywgJWVheCwgMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNzoJc2hsbAkkMzAsICVlZHgJLy8gc2lnbiBiaXQgZm9yIHkgaW4gcmlnaHQgcG9zaXRpb24KCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjE4OglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1goaW5mX3plcm8sICVlZHgsIDgpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAKMjA6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRsCglqegkyMWYJCS8vIHkgPiAwCgoJLy8geCBpcyCxMCBhbmQgeSBpcyA8IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCXRlc3RiCSQyLCAlZGgKCWp6CTI1ZgoKCS8vIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmxkCSVzdAkJLy8geSA6IHkKCWZhYnMJCQkvLyB8eXwgOiB5CglmY29tcGwJTU8ocDYzKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyN2YJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IG1pbnVzIGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJZmNocwoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyNToJZnN0cAklc3QoMCkKMjY6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI3OgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMCBhbmQgeSBpcyA+IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KMjE6CXRlc3RiCSQyLCAlZGgKCWp6CTIyZgoKCS8vIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmNvbWwJTU8ocDYzKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjJmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjNmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyNGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCWZsZGwJTU8obXplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjIyOglmc3RwCSVzdCgwKQoyMzoJYWRkbAkkOCwgJWVzcAkvLyBEb24ndCB1c2UgMiB4IHBvcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMjQ6CWZsZGwJTU8oemVybykKCXJldAoKRU5EKF9faWVlZTc1NF9wb3cpCnN0cm9uZ19hbGlhcyAoX19pZWVlNzU0X3BvdywgX19wb3dfZmluaXRlKQo=