LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBwMyxAb2JqZWN0CnAzOgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweDIwLCAweDQwCglBU01fU0laRV9ESVJFQ1RJVkUocDMpCgkudHlwZSBwNjMsQG9iamVjdApwNjM6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZTAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjMpCgkudHlwZSBwNjQsQG9iamVjdApwNjQ6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjQpCgkudHlwZSBwNzgsQG9iamVjdApwNzg6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZDAsIDB4NDQKCUFTTV9TSVpFX0RJUkVDVElWRShwNzgpCgkudHlwZSBwbTc5LEBvYmplY3QKcG03OToJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgzYgoJQVNNX1NJWkVfRElSRUNUSVZFKHBtNzkpCgoJLnNlY3Rpb24gLnJvZGF0YS5jc3QxNiwiYU0iLEBwcm9nYml0cywxNgoKCS5wMmFsaWduIDMKCS50eXBlIGluZmluaXR5LEBvYmplY3QKaW5mX3plcm86CmluZmluaXR5OgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhmMCwgMHg3ZgoJQVNNX1NJWkVfRElSRUNUSVZFKGluZmluaXR5KQoJLnR5cGUgemVybyxAb2JqZWN0Cnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCS50eXBlIG1pbmZfbXplcm8sQG9iamVjdAptaW5mX216ZXJvOgptaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweGZmCm16ZXJvOgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MAoJQVNNX1NJWkVfRElSRUNUSVZFKG1pbmZfbXplcm8pCgojaWZkZWYgUElDCiMgZGVmaW5lIE1PKG9wKSBvcCMjKCVyaXApCiNlbHNlCiMgZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfcG93bCkKCWZsZHQJMjQoJXJzcCkJLy8geQoJZnhhbQoKCglmbnN0c3cKCW1vdmIJJWFoLCAlZGwKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCS8vIGlzIHkgPT0gMCA/CglqZQkxMWYKCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSA9PSCxaW5mID8KCWplCTEyZgoKCWNtcGIJJDB4MDEsICVhaAkvLyBpcyB5ID09IE5hTiA/CglqZQkzMGYKCglmbGR0CTgoJXJzcCkJCS8vIHggOiB5CgoJZnhhbQoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRoCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAoJamUJMjBmCQkvLyB4IGlzILEwCgoJY21wYgkkMHgwNSwgJWFoCglqZQkxNWYJCS8vIHggaXMgsWluZgoKCWNtcGIJJDB4MDEsICVhaAoJamUJMzFmCQkvLyB4IGlzIE5hTgoKCWZ4Y2gJCQkvLyB5IDogeAoKCS8qIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLiAgKi8KCWZsZGwJTU8ocDYzKQkJLy8gMUw8PDYzIDogeSA6IHgKCWZsZAklc3QoMSkJCS8vIHkgOiAxTDw8NjMgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IDFMPDw2MyA6IHkgOiB4CglmY29taXAJJXN0KDEpLCAlc3QJLy8gMUw8PDYzIDogeSA6IHgKCWZzdHAJJXN0KDApCQkvLyB5IDogeAoJam5jCTJmCgoJLyogRmlyc3Qgc2VlIHdoZXRoZXIgYHknIGlzIGEgbmF0dXJhbCBudW1iZXIuICBJbiB0aGlzIGNhc2Ugd2UKCSAgIGNhbiB1c2UgYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmlzdHBsbAktOCglcnNwKQkvLyB5IDogeAoJZmlsZGxsCS04KCVyc3ApCS8vIGludCh5KSA6IHkgOiB4CglmdWNvbWlwCSVzdCgxKSwlc3QJLy8geSA6IHgKCWplCTlmCgoJLy8gSWYgeSBoYXMgYWJzb2x1dGUgdmFsdWUgYXQgbW9zdCAweDFwLTc5LCB0aGVuIGFueSBmaW5pdGUKCS8vIG5vbnplcm8geCB3aWxsIHJlc3VsdCBpbiAxLiAgU2F0dXJhdGUgeSB0byB0aG9zZSBib3VuZHMgdG8KCS8vIGF2b2lkIHVuZGVyZmxvdyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgeSpsb2cyKHgpLgoJZmxkbAlNTyhwbTc5KQkvLyAweDFwLTc5IDogeSA6IHgKCWZsZAklc3QoMSkJCS8vIHkgOiAweDFwLTc5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiAweDFwLTc5IDogeSA6IHgKCWZjb21pcAklc3QoMSksICVzdAkvLyAweDFwLTc5IDogeSA6IHgKCWZzdHAJJXN0KDApCQkvLyB5IDogeAoJam5jCTNmCglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ocG03OSkJLy8gMHgxcC03OSA6IHgKCXRlc3RiCSQyLCAlZGwKCWpuegkzZgkJLy8geSA+IDAKCWZjaHMJCQkvLyAtMHgxcC03OSA6IHgKCWptcAkzZgoKOToJLyogT0ssIHdlIGhhdmUgYW4gaW50ZWdlciB2YWx1ZSBmb3IgeS4gIFVubGVzcyB2ZXJ5IHNtYWxsCgkgICAod2UgdXNlIDwgOCksIHVzZSB0aGUgYWxnb3JpdGhtIGZvciByZWFsIGV4cG9uZW50IHRvIGF2b2lkCgkgICBhY2N1bXVsYXRpb24gb2YgZXJyb3JzLiAgKi8KCWZsZGwJTU8ocDMpCQkvLyA4IDogeSA6IHgKCWZsZAklc3QoMSkJCS8vIHkgOiA4IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiA4IDogeSA6IHgKCWZjb21pcAklc3QoMSksICVzdAkvLyA4IDogeSA6IHgKCWZzdHAJJXN0KDApCQkvLyB5IDogeAoJam5jCTJmCgltb3YJLTgoJXJzcCksJWVheAoJbW92CS00KCVyc3ApLCVlZHgKCW9ybAkkMCwgJWVkeAoJZnN0cAklc3QoMCkJCS8vIHgKCWpucwk0ZgkJLy8geSA+PSAwLCBqdW1wCglmZGl2cmwJTU8ob25lKQkJLy8gMS94CQkobm93IHJlZmVycmVkIHRvIGFzIHgpCgluZWdsCSVlYXgKCWFkY2wJJDAsICVlZHgKCW5lZ2wJJWVkeAo0OglmbGRsCU1PKG9uZSkJCS8vIDEgOiB4CglmeGNoCgo2OglzaHJkbAkkMSwgJWVkeCwgJWVheAoJam5jCTVmCglmeGNoCglmbXVsCSVzdCgxKQkJLy8geCA6IFNUKngKCWZ4Y2gKNToJZm11bAklc3QoMCksICVzdAkvLyB4KnggOiBTVCp4CglzaHJsCSQxLCAlZWR4Cgltb3ZsCSVlYXgsICVlY3gKCW9ybAklZWR4LCAlZWN4CglqbnoJNmIKCWZzdHAJJXN0KDApCQkvLyBTVCp4CglyZXQKCgkvKiB5IGlzILFOQU4gKi8KMzA6CWZsZHQJOCglcnNwKQkJLy8geCA6IHkKCWZsZGwJTU8ob25lKQkJLy8gMS4wIDogeCA6IHkKCWZ1Y29taXAJJXN0KDEpLCVzdAkvLyB4IDogeQoJamUJMzFmCglmeGNoCQkJLy8geSA6IHgKMzE6CWZzdHAJJXN0KDEpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoJLy8geSBpcyBhIGxhcmdlIGludGVnZXIgKGFic29sdXRlIHZhbHVlIGF0IGxlYXN0IDgpLCBidXQKCS8vIG1heSBiZSBvZGQgdW5sZXNzIGF0IGxlYXN0IDFMPDw2NC4gIFNvIGl0IG1heSBiZSBuZWNlc3NhcnkKCS8vIHRvIGFkanVzdCB0aGUgc2lnbiBvZiBhIG5lZ2F0aXZlIHJlc3VsdCBhZnRlcndhcmRzLgoJZnhjaAkJCS8vIHggOiB5CglmYWJzCQkJLy8gfHh8IDogeQoJZnhjaAkJCS8vIHkgOiB8eHwKCS8vIElmIHkgaGFzIGFic29sdXRlIHZhbHVlIGF0IGxlYXN0IDFMPDw3OCwgdGhlbiBhbnkgZmluaXRlCgkvLyBub256ZXJvIHggd2lsbCByZXN1bHQgaW4gMCAodW5kZXJmbG93KSwgMSBvciBpbmZpbml0eSAob3ZlcmZsb3cpLgoJLy8gU2F0dXJhdGUgeSB0byB0aG9zZSBib3VuZHMgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gdGhlIGNhbGN1bGF0aW9uCgkvLyBvZiB5KmxvZzIoeCkuCglmbGRsCU1PKHA3OCkJCS8vIDFMPDw3OCA6IHkgOiB8eHwKCWZsZAklc3QoMSkJCS8vIHkgOiAxTDw8NzggOiB5IDogfHh8CglmYWJzCQkJLy8gfHl8IDogMUw8PDc4IDogeSA6IHx4fAoJZmNvbWlwCSVzdCgxKSwgJXN0CS8vIDFMPDw3OCA6IHkgOiB8eHwKCWZzdHAJJXN0KDApCQkvLyB5IDogfHh8CglqYwkzZgoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKHA3OCkJCS8vIDFMPDw3OCA6IHx4fAoJdGVzdGIJJDIsICVkbAoJanoJM2YJCS8vIHkgPiAwCglmY2hzCQkJLy8gLSgxTDw8NzgpIDogfHh8CgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCXN1YnEJJDQwLCAlcnNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQwKQoJZnN0cHQJMTYoJXJzcCkJLy8geAoJZnN0cHQJKCVyc3ApCQkvLyA8ZW1wdHk+Cgltb3YJJWVkeCwgMzIoJXJzcCkKCWNhbGwJSElEREVOX0pVTVBUQVJHRVQgKF9fcG93bF9oZWxwZXIpCS8vIDxyZXN1bHQ+Cgltb3YJMzIoJXJzcCksICVlZHgKCWFkZHEJJDQwLCAlcnNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00MCkKCXRlc3RiCSQyLCAlZGgKCWp6CTI5MmYKCS8vIHggaXMgbmVnYXRpdmUuICBJZiB5IGlzIGFuIG9kZCBpbnRlZ2VyLCBuZWdhdGUgdGhlIHJlc3VsdC4KCWZsZHQJMjQoJXJzcCkJLy8geSA6IGFicyhyZXN1bHQpCglmbGRsCU1PKHA2NCkJCS8vIDFMPDw2NCA6IHkgOiBhYnMocmVzdWx0KQoJZmxkCSVzdCgxKQkJLy8geSA6IDFMPDw2NCA6IHkgOiBhYnMocmVzdWx0KQoJZmFicwkJCS8vIHx5fCA6IDFMPDw2NCA6IHkgOiBhYnMocmVzdWx0KQoJZmNvbWlwCSVzdCgxKSwgJXN0CS8vIDFMPDw2NCA6IHkgOiBhYnMocmVzdWx0KQoJZnN0cAklc3QoMCkJCS8vIHkgOiBhYnMocmVzdWx0KQoJam5jCTI5MWYKCWZsZGwJTU8ocDYzKQkJLy8gcDYzIDogeSA6IGFicyhyZXN1bHQpCglmeGNoCQkJLy8geSA6IHA2MyA6IGFicyhyZXN1bHQpCglmcHJlbQkJCS8vIHklcDYzIDogcDYzIDogYWJzKHJlc3VsdCkKCWZzdHAJJXN0KDEpCQkvLyB5JXA2MyA6IGFicyhyZXN1bHQpCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeSA6IGFicyhyZXN1bHQpCglmaXN0cGxsCS04KCVyc3ApCS8vIHkgOiBhYnMocmVzdWx0KQoJZmlsZGxsCS04KCVyc3ApCS8vIGludCh5KSA6IHkgOiBhYnMocmVzdWx0KQoJZnVjb21pcAklc3QoMSksJXN0CS8vIHkgOiBhYnMocmVzdWx0KQoJZmZyZWVwCSVzdAkJLy8gYWJzKHJlc3VsdCkKCWpuZQkyOTJmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJbW92CS04KCVyc3ApLCAlZWF4Cgltb3YJLTQoJXJzcCksICVlZHgKCWFuZGIJJDEsICVhbAoJanoJMjkwZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmNocwoyOTA6CXJldAoyOTE6CWZzdHAJJXN0KDApCQkvLyBhYnMocmVzdWx0KQoyOTI6CXJldAoKCS8vIHBvdyh4LLEwKSA9IDEKCS5hbGlnbiBBTElHTkFSRyg0KQoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkdAk4KCVyc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKI2lmZGVmIFBJQwoJbGVhCWluZl96ZXJvKCVyaXApLCVyY3gKCWZsZGwJKCVyY3gsICVyZHgsIDQpCiNlbHNlCglmbGRsCWluZl96ZXJvKCwlcmR4LCA0KQojZW5kaWYKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNDoJZmxkbAlNTyhvbmUpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTM6CWZsZHQJOCglcnNwKQkJLy8gbG9hZCB4ID09IE5hTgoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIGJ1dCB5CgkvLyBtYXkgYmUgb2RkIHVubGVzcyB3ZSBrbm93IHx5fCA+PSAxTDw8NjQuCglmbGRsCU1PKHA2NCkJCS8vIDFMPDw2NCA6IHkKCWZsZAklc3QoMSkJCS8vIHkgOiAxTDw8NjQgOiB5CglmYWJzCQkJLy8gfHl8IDogMUw8PDY0IDogeQoJZmNvbWlwCSVzdCgxKSwgJXN0CS8vIDFMPDw2NCA6IHkKCWZzdHAJJXN0KDApCQkvLyB5CglqbmMJMTZmCglmbGRsCU1PKHA2MykJCS8vIHA2MyA6IHkKCWZ4Y2gJCQkvLyB5IDogcDYzCglmcHJlbQkJCS8vIHklcDYzIDogcDYzCglmc3RwCSVzdCgxKQkJLy8geSVwNjMKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCS04KCVyc3ApCS8vIHkKCWZpbGRsbAktOCglcnNwKQkvLyBpbnQoeSkgOiB5CglmdWNvbWlwICVzdCgxKSwlc3QKCWZmcmVlcAklc3QJCS8vIDxlbXB0eT4KCWpuZQkxN2YKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyBpdCBvZGQ/Cgltb3YJLTgoJXJzcCksICVlYXgKCW1vdgktNCglcnNwKSwgJWVkeAoJYW5kYgkkMSwgJWFsCglqegkxOGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCXNocmwJJDMxLCAlZWR4CiNpZmRlZiBQSUMKCWxlYQltaW5mX216ZXJvKCVyaXApLCVyY3gKCWZsZGwJKCVyY3gsICVyZHgsIDgpCiNlbHNlCglmbGRsCW1pbmZfbXplcm8oLCVyZHgsIDgpCiNlbmRpZgoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE2OglmY29tcGwJTU8oemVybykKCWZuc3RzdwoJc2hybAkkNSwgJWVheAoJYW5kbAkkOCwgJWVheAojaWZkZWYgUElDCglsZWEJaW5mX3plcm8oJXJpcCksJXJjeAoJZmxkbAkoJXJjeCwgJXJheCwgMSkKI2Vsc2UKCWZsZGwJaW5mX3plcm8oLCVyYXgsIDEpCiNlbmRpZgoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE3OglzaGxsCSQzMCwgJWVkeAkvLyBzaWduIGJpdCBmb3IgeSBpbiByaWdodCBwb3NpdGlvbgoxODoJc2hybAkkMzEsICVlZHgKI2lmZGVmIFBJQwoJbGVhCWluZl96ZXJvKCVyaXApLCVyY3gKCWZsZGwJKCVyY3gsICVyZHgsIDgpCiNlbHNlCglmbGRsCWluZl96ZXJvKCwlcmR4LCA4KQojZW5kaWYKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIGJ1dCB5CgkvLyBtYXkgYmUgb2RkIHVubGVzcyB3ZSBrbm93IHx5fCA+PSAxTDw8NjQuCglmbGRsCU1PKHA2NCkJCS8vIDFMPDw2NCA6IHkKCWZsZAklc3QoMSkJCS8vIHkgOiAxTDw8NjQgOiB5CglmYWJzCQkJLy8gfHl8IDogMUw8PDY0IDogeQoJZmNvbWlwCSVzdCgxKSwgJXN0CS8vIDFMPDw2NCA6IHkKCWZzdHAJJXN0KDApCQkvLyB5CglqbmMJMjVmCglmbGRsCU1PKHA2MykJCS8vIHA2MyA6IHkKCWZ4Y2gJCQkvLyB5IDogcDYzCglmcHJlbQkJCS8vIHklcDYzIDogcDYzCglmc3RwCSVzdCgxKQkJLy8geSVwNjMKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAktOCglcnNwKQkvLyB5CglmaWxkbGwJLTgoJXJzcCkJLy8gaW50KHkpIDogeQoJZnVjb21pcAklc3QoMSksJXN0CglmZnJlZXAJJXN0CQkvLyA8ZW1wdHk+CglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJbW92CS04KCVyc3ApLCVlYXgKCW1vdgktNCglcnNwKSwlZWR4CglhbmRiCSQxLCAlYWwKCWp6CTI3ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgbWludXMgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglmY2hzCglyZXQKCjI1Oglmc3RwCSVzdCgwKQoyNjoKMjc6CS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILEwIGFuZCB5IGlzID4gMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoyMToJdGVzdGIJJDIsICVkaAoJanoJMjJmCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIGJ1dCB5CgkvLyBtYXkgYmUgb2RkIHVubGVzcyB3ZSBrbm93IHx5fCA+PSAxTDw8NjQuCglmbGRsCU1PKHA2NCkJCS8vIDFMPDw2NCA6IHkKCWZ4Y2gJCQkvLyB5IDogMUw8PDY0CglmY29taQklc3QoMSksICVzdAkvLyB5IDogMUw8PDY0Cglmc3RwCSVzdCgxKQkJLy8geQoJam5jCTIyZgoJZmxkbAlNTyhwNjMpCQkvLyBwNjMgOiB5CglmeGNoCQkJLy8geSA6IHA2MwoJZnByZW0JCQkvLyB5JXA2MyA6IHA2MwoJZnN0cAklc3QoMSkJCS8vIHklcDYzCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJLTgoJXJzcCkJLy8geQoJZmlsZGxsCS04KCVyc3ApCS8vIGludCh5KSA6IHkKCWZ1Y29taXAgJXN0KDEpLCVzdAoJZmZyZWVwCSVzdAkJLy8gPGVtcHR5PgoJam5lCTIzZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIGl0IG9kZD8KCW1vdgktOCglcnNwKSwlZWF4Cgltb3YJLTQoJXJzcCksJWVkeAoJYW5kYgkkMSwgJWFsCglqegkyNGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCWZsZGwJTU8obXplcm8pCglyZXQKCjIyOglmc3RwCSVzdCgwKQoyMzoKMjQ6CWZsZGwJTU8oemVybykKCXJldAoKRU5EKF9faWVlZTc1NF9wb3dsKQpzdHJvbmdfYWxpYXMgKF9faWVlZTc1NF9wb3dsLCBfX3Bvd2xfZmluaXRlKQo=