I2luY2x1ZGUgPG5pcnZhbmEuaD4KI2luY2x1ZGUgTlZfVklFV1BPUlRfSAojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDxmdDJidWlsZC5oPgojaW5jbHVkZSBGVF9GUkVFVFlQRV9ICgovKiBpbmNsdWRlIEZyZWVUeXBlIGludGVybmFscyB0byBkZWJ1ZyBoaW50cyAqLwojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaHJlYy5oPgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28xLmg+CiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzIuaD4KCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICBST09UIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiNpbmNsdWRlIDx0aW1lLmg+ICAgIC8qIGZvciBjbG9jaygpICovCgovKiBTdW5PUyA0LjEuKiBkb2VzIG5vdCBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMsIHNvIGluY2x1ZGUgPHN5cy9wYXJhbS5oPiAqLwovKiB0byBnZXQgdGhlIEhaIG1hY3JvIHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwojaWYgZGVmaW5lZChfX3N1bl9fKSAmJiAhZGVmaW5lZChTVlI0KSAmJiAhZGVmaW5lZChfX1NWUjQpCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2RlZmluZSBDTE9DS1NfUEVSX1NFQyBIWgojZW5kaWYKCnN0YXRpYyBpbnQgIGZpcnN0X2dseXBoID0gMDsKCnN0YXRpYyBOVl9SZW5kZXJlciAgIHJlbmRlcmVyOwpzdGF0aWMgTlZfUGFpbnRlciAgICBwYWludGVyOwpzdGF0aWMgTlZfUGl4bWFwICAgICB0YXJnZXQ7CnN0YXRpYyBOVl9FcnJvciAgICAgIGVycm9yOwpzdGF0aWMgTlZfTWVtb3J5ICAgICBtZW1vcnk7CnN0YXRpYyBOVlZfRGlzcGxheSAgIGRpc3BsYXk7CnN0YXRpYyBOVlZfU3VyZmFjZSAgIHN1cmZhY2U7CgpzdGF0aWMgRlRfTGlicmFyeSAgICBmcmVldHlwZTsKc3RhdGljIEZUX0ZhY2UgICAgICAgZmFjZTsKCgpzdGF0aWMgIE5WX1BvcyAgICAgICAgZ2x5cGhfc2NhbGU7CnN0YXRpYyAgTlZfUG9zICAgICAgICBnbHlwaF9vcmdfeDsKc3RhdGljICBOVl9Qb3MgICAgICAgIGdseXBoX29yZ195OwpzdGF0aWMgIE5WX1RyYW5zZm9ybSAgZ2x5cGhfdHJhbnNmb3JtOyAgLyogZm9udCB1bml0cyAtPiBkZXZpY2UgcGl4ZWxzICovCnN0YXRpYyAgTlZfVHJhbnNmb3JtICBzaXplX3RyYW5zZm9ybTsgICAvKiBzdWJwaXhlbHMgIC0+IGRldmljZSBwaXhlbHMgKi8KCnN0YXRpYyAgTlZfU2NhbGUgICAgICBncmlkX3NjYWxlID0gMS4wOwoKc3RhdGljICBpbnQgICBnbHlwaF9pbmRleDsKc3RhdGljICBpbnQgICBwaXhlbF9zaXplID0gMTI7CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICBPUFRJT05TLCBDT0xPUlMgYW5kIE9USEVSUyAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfYXhpcyAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19kb3RzICAgPSAxOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3N0cm9rZSA9IDA7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZ2x5cGggID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ncmlkICAgPSAxOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2VtICAgICA9IDA7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfc21vb3RoID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ibHVlcyAgPSAwOwoKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19wc19oaW50cyAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ob3J6X2hpbnRzID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd192ZXJ0X2hpbnRzID0gMTsKCgpzdGF0aWMgIGludCAgIG9wdGlvbl9oaW50aW5nID0gMTsKCnN0YXRpYyAgY2hhciAgdGVtcF9tZXNzYWdlWzEwMjRdOwoKI2RlZmluZSAgQVhJU19DT0xPUiAgICAgICAgMHhGRkZGMDAwMAojZGVmaW5lICBHUklEX0NPTE9SICAgICAgICAweEZGRDBEMEQwCiNkZWZpbmUgIE9OX0NPTE9SICAgICAgICAgIDB4RkZGRjIwMDAKI2RlZmluZSAgT0ZGX0NPTE9SICAgICAgICAgMHhGRkZGMDA4MAojZGVmaW5lICBTVFJPTkdfQ09MT1IgICAgICAweEZGNDA0MDQwCiNkZWZpbmUgIElOVEVSUF9DT0xPUiAgICAgIDB4RkYyMDYwNDAKI2RlZmluZSAgU01PT1RIX0NPTE9SICAgICAgMHhGMDAwQjA0MAojZGVmaW5lICBCQUNLR1JPVU5EX0NPTE9SICAweEZGRkZGRkZGCiNkZWZpbmUgIFRFWFRfQ09MT1IgICAgICAgIDB4RkYwMDAwMDAKI2RlZmluZSAgRU1fQ09MT1IgICAgICAgICAgMHg4MDAwODAwMAojZGVmaW5lICBCTFVFU19UT1BfQ09MT1IgICAweDQwMDAwMDhGCiNkZWZpbmUgIEJMVUVTX0JPVF9DT0xPUiAgIDB4NDAwMDhGMDAKCiNkZWZpbmUgIEdIT1NUX0hJTlRfQ09MT1IgIDB4RTAwMDAwRkYKI2RlZmluZSAgU1RFTV9ISU5UX0NPTE9SICAgMHhFMDIwMjBGRgojZGVmaW5lICBTVEVNX0pPSU5fQ09MT1IgICAweEUwMjBGRjIwCgovKiBwcmludCBtZXNzYWdlIGFuZCBhYm9ydCBwcm9ncmFtICovCnN0YXRpYyB2b2lkClBhbmljKCBjb25zdCBjaGFyKiAgbWVzc2FnZSApCnsKICBmcHJpbnRmKCBzdGRlcnIsICJQQU5JQzogJXNcbiIsIG1lc3NhZ2UgKTsKICBleGl0KDEpOwp9CgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIENPTU1PTiBHUklEIERSQVdJTkcgUk9VVElORVMgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApyZXNldF9zY2FsZSggTlZfU2NhbGUgIHNjYWxlICkKeyAKIC8qIGNvbXB1dGUgZm9udCB1bml0cyAtPiBncmlkIHBpeGVscyBzY2FsZSBmYWN0b3IgKi8KICBnbHlwaF9zY2FsZSA9IHRhcmdldC0+d2lkdGgqMC43NSAvIGZhY2UtPnVuaXRzX3Blcl9FTSAqIHNjYWxlOwogCiAvKiBzZXR1cCBmb250IHVuaXRzIC0+IGdyaWQgcGl4ZWxzIHRyYW5zZm9ybSAqLwogIG52X3RyYW5zZm9ybV9zZXRfc2NhbGUoICZnbHlwaF90cmFuc2Zvcm0sIGdseXBoX3NjYWxlLCAtZ2x5cGhfc2NhbGUgKTsKICBnbHlwaF9vcmdfeCA9IGdseXBoX3RyYW5zZm9ybS5kZWx0YS54ID0gdGFyZ2V0LT53aWR0aCowLjEyNTsKICBnbHlwaF9vcmdfeSA9IGdseXBoX3RyYW5zZm9ybS5kZWx0YS55ID0gdGFyZ2V0LT5oZWlnaHQqMC44NzU7CiAKIC8qIHNldHVwIHN1YnBpeGVscyAtPiBncmlkIHBpeGVscyB0cmFuc2Zvcm0gKi8KICBudl90cmFuc2Zvcm1fc2V0X3NjYWxlKCAmc2l6ZV90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9zY2FsZS9udl9mcm9tZml4ZWQoZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdseXBoX3NjYWxlL252X2Zyb21maXhlZChmYWNlLT5zaXplLT5tZXRyaWNzLnlfc2NhbGUpICk7CgogIHNpemVfdHJhbnNmb3JtLmRlbHRhID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhOwp9CiAgICAgICAgICAgCiAgICAgICAgICAgCnN0YXRpYyB2b2lkCnJlc2V0X3NpemUoIGludCAgcGl4ZWxfc2l6ZSwgTlZfU2NhbGUgIHNjYWxlICkKewogIEZUX1NldF9QaXhlbF9TaXplcyggZmFjZSwgcGl4ZWxfc2l6ZSwgcGl4ZWxfc2l6ZSApOwogIHJlc2V0X3NjYWxlKCBzY2FsZSApOwp9CgoKc3RhdGljIHZvaWQKY2xlYXJfYmFja2dyb3VuZCggdm9pZCApCnsKICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIDAsIHRhcmdldC0+d2lkdGgsIHRhcmdldC0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIEJBQ0tHUk9VTkRfQ09MT1IgKTsKfQoKCnN0YXRpYyB2b2lkCmRyYXdfZ3JpZCggdm9pZCApCnsKICBpbnQgIHggPSAoaW50KWdseXBoX29yZ194OwogIGludCAgeSA9IChpbnQpZ2x5cGhfb3JnX3k7CgogIC8qIGRyYXcgZ3JpZCAqLwogIGlmICggb3B0aW9uX3Nob3dfZ3JpZCApCiAgewogICAgTlZfU2NhbGUgIG1pbiwgbWF4LCB4LCBzdGVwOwogICAgCiAgICAvKiBkcmF3IHZlcnRpY2FsIGdyaWQgYmFycyAqLwogICAgc3RlcCA9IDY0LiAqIHNpemVfdHJhbnNmb3JtLm1hdHJpeC54eDsKICAgIGlmIChzdGVwID4gMS4pCiAgICB7CiAgICAgIG1pbiAgPSBtYXggPSBnbHlwaF9vcmdfeDsKICAgICAgd2hpbGUgKCBtaW4gLSBzdGVwID49IDAgKSAgICAgICAgICAgICBtaW4gLT0gc3RlcDsKICAgICAgd2hpbGUgKCBtYXggKyBzdGVwIDwgdGFyZ2V0LT53aWR0aCApICBtYXggKz0gc3RlcDsKICAgICAgICAKICAgICAgZm9yICggeCA9IG1pbjsgeCA8PSBtYXg7IHggKz0gc3RlcCApCiAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAoTlZfSW50KSh4Ky41KSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB0YXJnZXQtPmhlaWdodCwgR1JJRF9DT0xPUiApOwogICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgLyogZHJhdyBob3Jpem9udGFsIGdyaWQgYmFycyAqLwogICAgc3RlcCA9IC02NC4gKiBzaXplX3RyYW5zZm9ybS5tYXRyaXgueXk7CiAgICBpZiAoc3RlcCA+IDEuKQogICAgewogICAgICBtaW4gID0gbWF4ID0gZ2x5cGhfb3JnX3k7CiAgICAgIHdoaWxlICggbWluIC0gc3RlcCA+PSAwICkgICAgICAgICAgICAgIG1pbiAtPSBzdGVwOwogICAgICB3aGlsZSAoIG1heCArIHN0ZXAgPCB0YXJnZXQtPmhlaWdodCApICBtYXggKz0gc3RlcDsKICAgICAgICAKICAgICAgZm9yICggeCA9IG1pbjsgeCA8PSBtYXg7IHggKz0gc3RlcCApCiAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCAoTlZfSW50KSh4Ky41KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCAxLCBHUklEX0NPTE9SICk7CiAgICB9CiAgfSAgCiAgCiAgLyogZHJhdyBheGlzICovCiAgaWYgKCBvcHRpb25fc2hvd19heGlzICkKICB7CiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LCBBWElTX0NPTE9SICk7CiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHksIHRhcmdldC0+d2lkdGgsIDEsIEFYSVNfQ09MT1IgKTsKICB9CiAgCiAgaWYgKCBvcHRpb25fc2hvd19lbSApCiAgewogICAgTlZfUGF0aCAgcGF0aDsKICAgIE5WX1BhdGggIHN0cm9rZTsKICAgIE5WX1VJbnQgIHVuaXRzID0gKE5WX1VJbnQpZmFjZS0+dW5pdHNfcGVyX0VNOwogICAgCiAgICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAwLCAwLCB1bml0cywgdW5pdHMsIDAsIDAsICZwYXRoICk7CiAgICBudl9wYXRoX3RyYW5zZm9ybSggcGF0aCwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgCiAgICBudl9wYXRoX3N0cm9rZSggcGF0aCwgMS41LCBudl9wYXRoX2xpbmVjYXBfYnV0dCwgbnZfcGF0aF9saW5lam9pbl9taXRlciwKICAgICAgICAgICAgICAgICAgICA0LjAsICZzdHJva2UgKTsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgRU1fQ09MT1IsIDI1NiApOwogICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIE5VTEwsIDAsIHN0cm9rZSApOwoKICAgIG52X3BhdGhfZGVzdHJveSggc3Ryb2tlICk7CiAgICBudl9wYXRoX2Rlc3Ryb3koIHBhdGggKTsKICB9Cgp9CgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgIFBPU1RTQ1JJUFQgR0xPQkFMUyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGdsb2IuaD4KCnN0YXRpYyB2b2lkCmRyYXdfcHNfYmx1ZV96b25lcyggdm9pZCApCnsKICBpZiAoIG9wdGlvbl9zaG93X2JsdWVzICYmIHBzX2RlYnVnX2dsb2JhbHMgKQogIHsKICAgIFBTSF9CbHVlcyAgICAgICBibHVlcyA9ICZwc19kZWJ1Z19nbG9iYWxzLT5ibHVlczsKICAgIFBTSF9CbHVlX1RhYmxlICB0YWJsZTsKICAgIE5WX1ZlY3RvciAgICAgICB2OwogICAgRlRfSW50ICAgICAgICAgIHkxLCB5MjsKICAgIEZUX1VJbnQgICAgICAgICBjb3VudDsKICAgIFBTSF9CbHVlX1pvbmUgICB6b25lOwogICAgCiAgICAvKiBkcmF3IHRvcCB6b25lcyAqLwogICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF90b3A7CiAgICBjb3VudCA9IHRhYmxlLT5jb3VudDsKICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwogICAgCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKICAgIHsKICAgICAgdi54ID0gMDsKICAgICAgaWYgKCAhcHNfZGVidWdfbm9faG9yel9oaW50cyApCiAgICAgIHsKICAgICAgICB2LnkgPSB6b25lLT5jdXJfcmVmICsgem9uZS0+Y3VyX2RlbHRhOwogICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB2LnkgPSB6b25lLT5vcmdfcmVmICsgem9uZS0+b3JnX2RlbHRhOwogICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmZ2x5cGhfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgeTEgID0gKGludCkodi55ICsgMC41KTsKICAgICAgCiAgICAgIHYueCA9IDA7CiAgICAgIGlmICggIXBzX2RlYnVnX25vX2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZjsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+b3JnX3JlZjsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIHkyID0gKGludCkodi55ICsgMC41KTsKICAgICAgCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+d2lkdGgsIHkyLXkxKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMVUVTX1RPUF9DT0xPUiApOwoKI2lmIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgcHJpbnRmKCAidG9wIFslLjNmICUuM2ZdXG4iLCB6b25lLT5jdXJfYm90dG9tLzY0LjAsIHpvbmUtPmN1cl90b3AvNjQuMCApOwojZW5kaWYgICAgICAKICAgIH0KICAgIAogICAgCiAgICAvKiBkcmF3IGJvdHRvbSB6b25lcyAqLwogICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF9ib3R0b207CiAgICBjb3VudCA9IHRhYmxlLT5jb3VudDsKICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwogICAgCiAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKICAgIHsKICAgICAgdi54ID0gMDsKICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZjsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB5MSAgPSAoaW50KSh2LnkgKyAwLjUpOwogICAgICAKICAgICAgdi54ID0gMDsKICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZiArIHpvbmUtPmN1cl9kZWx0YTsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB5MiA9IChpbnQpKHYueSArIDAuNSk7CiAgICAgIAogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCB5Mi15MSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCTFVFU19CT1RfQ09MT1IgKTsKCiNpZiAwCiAgICAgIHByaW50ZiggImJvdCBbJS4zZiAlLjNmXVxuIiwgem9uZS0+Y3VyX2JvdHRvbS82NC4wLCB6b25lLT5jdXJfdG9wLzY0LjAgKTsKI2VuZGlmCiAgICB9CiAgfQp9CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgUE9TVFNDUklQVCBISU5URVIgQUxHT1JJVEhNIDEgUk9VVElORVMgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzEuaD4KCnN0YXRpYyBpbnQgcHNoaW50X2Nwb3MgICAgID0gMDsKc3RhdGljIGludCBwc2hpbnRfdmVydGljYWwgPSAtMTsKCnN0YXRpYyB2b2lkCmRyYXdfcHMxX2hpbnQoIFBTSDFfSGludCAgIGhpbnQsIEZUX0Jvb2wgIHZlcnRpY2FsICkKewogIGludCAgICAgICAgeDEsIHgyOwogIE5WX1ZlY3RvciAgdjsKICAKICAKICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgewogICAgaWYgKHZlcnRpY2FsKQogICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgZWxzZQogICAgICBwc2hpbnRfY3BvcyA9IDEwOwogICAgICAKICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogIH0KICAKICBpZiAodmVydGljYWwpCiAgewogICAgaWYgKCAhb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2LnggPSBoaW50LT5jdXJfcG9zOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi54ICsgMC41KTsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueCArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgyLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNoMV9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIHBzaGludF9jcG9zLCB4MisxLXgxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIW9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi55ICsgMC41KTsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4MSwgdGFyZ2V0LT53aWR0aCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDFfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2gxX2hpbnRfaXNfZ2hvc3QoaGludCkgKQogICAgewogICAgICB4MSAtLTsKICAgICAgeDIgPSB4MSArIDI7CiAgICB9CiAgICBlbHNlCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDIsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDFfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHBzaGludF9jcG9zLCB4MiwgMSwgeDErMS14MiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KCiNpZiAwCiAgcHJpbnRmKCAiWyU3LjNmICU3LjNmXSAlY1xuIiwgaGludC0+Y3VyX3Bvcy82NC4wLCAoaGludC0+Y3VyX3BvcytoaW50LT5jdXJfbGVuKS82NC4wLCB2ZXJ0aWNhbCA/ICd2JyA6ICdoJyApOwojZW5kaWYKICAKICBwc2hpbnRfY3BvcyArPSAxMDsKfQoKCgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgUE9TVFNDUklQVCBISU5URVIgQUxHT1JJVEhNIDIgUk9VVElORVMgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnbzIuaD4KCnN0YXRpYyB2b2lkCmRyYXdfcHMyX2hpbnQoIFBTSDJfSGludCAgIGhpbnQsIEZUX0Jvb2wgIHZlcnRpY2FsICkKewogIGludCAgICAgICAgeDEsIHgyOwogIE5WX1ZlY3RvciAgdjsKICAKICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgewogICAgaWYgKHZlcnRpY2FsKQogICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgZWxzZQogICAgICBwc2hpbnRfY3BvcyA9IDEwOwogICAgICAKICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogIH0KICAKICBpZiAodmVydGljYWwpCiAgewogICAgaWYgKCAhb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2LnggPSBoaW50LT5jdXJfcG9zOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi54ICsgMC41KTsKCiAgICB2LnggPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueSA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueCArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgyLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNoMl9oaW50X2lzX2dob3N0KGhpbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeDEsIHBzaGludF9jcG9zLCB4MisxLXgxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIW9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgxID0gKGludCkodi55ICsgMC41KTsKCiAgICB2LnkgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKICAgIHYueCA9IDA7CiAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICB4MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB4MSwgdGFyZ2V0LT53aWR0aCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDJfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2gyX2hpbnRfaXNfZ2hvc3QoaGludCkgKQogICAgewogICAgICB4MSAtLTsKICAgICAgeDIgPSB4MSArIDI7CiAgICB9CiAgICBlbHNlCiAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeDIsIHRhcmdldC0+d2lkdGgsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaDJfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHBzaGludF9jcG9zLCB4MiwgMSwgeDErMS14MiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNURU1fSk9JTl9DT0xPUiApOwogIH0KCiNpZiAwCiAgcHJpbnRmKCAiWyU3LjNmICU3LjNmXSAlY1xuIiwgaGludC0+Y3VyX3Bvcy82NC4wLCAoaGludC0+Y3VyX3BvcytoaW50LT5jdXJfbGVuKS82NC4wLCB2ZXJ0aWNhbCA/ICd2JyA6ICdoJyApOwojZW5kaWYKICAKICBwc2hpbnRfY3BvcyArPSAxMDsKfQoKCnN0YXRpYyB2b2lkCnBzMl9kcmF3X2NvbnRyb2xfcG9pbnRzKCB2b2lkICkKewogIGlmICggcHMyX2RlYnVnX2dseXBoICkKICB7CiAgICBQU0gyX0dseXBoICAgIGdseXBoID0gcHMyX2RlYnVnX2dseXBoOwogICAgUFNIMl9Qb2ludCAgICBwb2ludCA9IGdseXBoLT5wb2ludHM7CiAgICBGVF9VSW50ICAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICBOVl9UcmFuc2Zvcm0gIHRyYW5zZm9ybSwgKnRyYW5zID0gJnRyYW5zZm9ybTsKICAgIE5WX1BhdGggICAgICAgdmVydF9yZWN0OwogICAgTlZfUGF0aCAgICAgICBob3J6X3JlY3Q7CiAgICBOVl9QYXRoICAgICAgIGRvdCwgY2lyY2xlOwogICAgCiAgICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAtMSwgLTYsIDIsIDEyLCAwLCAwLCAmdmVydF9yZWN0ICk7CiAgICBudl9wYXRoX25ld19yZWN0YW5nbGUoIHJlbmRlcmVyLCAtNiwgLTEsIDEyLCAyLCAwLCAwLCAmaG9yel9yZWN0ICk7CiAgICBudl9wYXRoX25ld19jaXJjbGUoIHJlbmRlcmVyLCAwLCAwLCAzLiwgJmRvdCApOwogICAgbnZfcGF0aF9zdHJva2UoIGRvdCwgMC42LCBudl9wYXRoX2xpbmVjYXBfYnV0dCwgbnZfcGF0aF9saW5lam9pbl9taXRlciwgMS4sICZjaXJjbGUgKTsKICAgIAogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgewogICAgICBOVl9WZWN0b3IgIHZlYzsKICAgICAgCiAgICAgIHZlYy54ID0gcG9pbnQtPmN1cl94OwogICAgICB2ZWMueSA9IHBvaW50LT5jdXJfeTsKICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnZlYywgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgIAogICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggdHJhbnMsIHZlYy54LCB2ZWMueSApOwoKICAgICAgaWYgKCBvcHRpb25fc2hvd19zbW9vdGggJiYgIXBzaDJfcG9pbnRfaXNfc21vb3RoKHBvaW50KSApCiAgICAgIHsKICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU01PT1RIX0NPTE9SLCAyNTYgKTsKICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIGNpcmNsZSApOwogICAgICB9CiAgICAgICAgCiAgICAgIGlmIChvcHRpb25fc2hvd19ob3J6X2hpbnRzKQogICAgICB7CiAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3NfeSAmIFBTSDJfUE9JTlRfU1RST05HICkKICAgICAgICB7CiAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU1RST05HX0NPTE9SLCAyNTYgKTsKICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgaG9yel9yZWN0ICk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBpZiAob3B0aW9uX3Nob3dfdmVydF9oaW50cykKICAgICAgewogICAgICAgIGlmICggcG9pbnQtPmZsYWdzX3ggJiBQU0gyX1BPSU5UX1NUUk9ORyApCiAgICAgICAgewogICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNUUk9OR19DT0xPUiwgMjU2ICk7CiAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHZlcnRfcmVjdCApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIG52X3BhdGhfZGVzdHJveSggY2lyY2xlICk7CiAgICBudl9wYXRoX2Rlc3Ryb3koIGRvdCApOyAgICAKICAgIG52X3BhdGhfZGVzdHJveSggaG9yel9yZWN0ICk7CiAgICBudl9wYXRoX2Rlc3Ryb3koIHZlcnRfcmVjdCApOwogIH0KfQoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIE1BSU4gTE9PUChTKSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApkcmF3X2dseXBoKCBpbnQgIGdseXBoX2luZGV4ICkKewogIE5WX1BhdGggICBwYXRoOwoKICBwc2hpbnRfdmVydGljYWwgICAgPSAtMTsKICAKICBwczFfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzMV9oaW50IDogMDsKICBwczJfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzMl9oaW50IDogMDsKCiAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgb3B0aW9uX2hpbnRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGVF9MT0FEX05PX0JJVE1BUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX0xPQURfTk9fQklUTUFQIHwgRlRfTE9BRF9OT19ISU5USU5HICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIiApOwogIAogIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCAhPSBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSApCiAgICBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIG91dGxpbmUiICk7CiAgCiAgZXJyb3IgPSBudl9wYXRoX25ld19mcm9tX291dGxpbmUoIHJlbmRlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlZfT3V0bGluZSopJmZhY2UtPmdseXBoLT5vdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZV90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgZ2x5cGggcGF0aCIgKTsKICAKICAvKiB0cmFj6SBkdSBnbHlwaGUgcGxlaW4gKi8KICBpZiAoIG9wdGlvbl9zaG93X2dseXBoICkKICB7CiAgICBudl9wYWludGVyX3NldF9jb2xvciAoIHBhaW50ZXIsIDB4RkY0MDQwODAsIDEyOCApOwogICAgbnZfcGFpbnRlcl9maWxsX3BhdGggKCBwYWludGVyLCAwLCAwLCBwYXRoICk7CiAgfQoKICBpZiAoIG9wdGlvbl9zaG93X3N0cm9rZSApCiAgewogICAgTlZfUGF0aCAgIHN0cm9rZTsKICAgIAogICAgZXJyb3IgPSBudl9wYXRoX3N0cm9rZSggcGF0aCwgMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lY2FwX2J1dHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudl9wYXRoX2xpbmVqb2luX21pdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAmc3Ryb2tlICk7CiAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IHN0cm9rZSBnbHlwaCBwYXRoIiApOwogIAogICAgbnZfcGFpbnRlcl9zZXRfY29sb3IgKCBwYWludGVyLCAweEZGMDAwMDQwLCAyNTYgKTsKICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoICggcGFpbnRlciwgMCwgMCwgc3Ryb2tlICk7CiAgCiAgICBudl9wYXRoX2Rlc3Ryb3koIHN0cm9rZSApOwogIH0KCiAgLyogdHJhY+kgZGVzIHBvaW50cyBkZSBjb250cm9sZSAqLwogIGlmICggb3B0aW9uX3Nob3dfZG90cyApCiAgewogICAgTlZfUGF0aCAgICAgcGxvdDsKICAgIE5WX091dGxpbmUgIG91dDsKICAgIE5WX1NjYWxlICAgIHIgPSAyOwogICAgTlZfSW50ICAgICAgbiwgZmlyc3QsIGxhc3Q7CgogICAgbnZfcGF0aF9uZXdfY2lyY2xlKCByZW5kZXJlciwgMCwgMCwgMi4sICZwbG90ICk7CiAgICAKICAgIG52X3BhdGhfZ2V0X291dGxpbmUoIHBhdGgsIE5VTEwsIG1lbW9yeSwgJm91dCApOwogICAgCiAgICBmaXJzdCA9IDA7CiAgICBmb3IgKCBuID0gMDsgbiA8IG91dC5uX2NvbnRvdXJzOyBuKysgKQogICAgewogICAgICBpbnQgICAgICAgICAgICBtOwogICAgICBOVl9UcmFuc2Zvcm0gICB0cmFuczsKICAgICAgTlZfQ29sb3IgICAgICAgY29sb3I7CiAgICAgIE5WX1N1YlZlY3RvciogIHZlYzsKICAgICAgCiAgICAgIGxhc3QgID0gb3V0LmNvbnRvdXJzW25dOwogICAgICAKICAgICAgZm9yICggbSA9IGZpcnN0OyBtIDw9IGxhc3Q7IG0rKyApCiAgICAgIHsKICAgICAgICBjb2xvciA9IChvdXQudGFnc1ttXSAmIEZUX0N1cnZlX1RhZ19PbikKICAgICAgICAgICAgICA/IE9OX0NPTE9SCiAgICAgICAgICAgICAgOiBPRkZfQ09MT1I7CiAgICAgICAgICAgICAgCiAgICAgICAgdmVjID0gb3V0LnBvaW50cyArIG07CgogICAgICAgIG52X3RyYW5zZm9ybV9zZXRfdHJhbnNsYXRlKCAmdHJhbnMsIHZlYy0+eC82NC4wLCB2ZWMtPnkvNjQuMCApOyAgICAgICAgCgogICAgICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBjb2xvciwgMjU2ICk7CiAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZ0cmFucywgMCwgcGxvdCApOwoKICAgICAgfQogICAgICAKICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKICAgIH0KCiAgICBudl9wYXRoX2Rlc3Ryb3koIHBsb3QgKTsKICB9CgogIG52X3BhdGhfZGVzdHJveSggcGF0aCApOwogIAogIC8qIGF1dHJlIGluZm9zICovCiAgewogICAgY2hhciAgdGVtcFsxMDI0XTsKICAgIGNoYXIgIHRlbXAyWzY0XTsKICAgIAogICAgc3ByaW50ZiggdGVtcCwgImZvbnQgbmFtZSA6ICVzICglcykiLCBmYWNlLT5mYW1pbHlfbmFtZSwgZmFjZS0+c3R5bGVfbmFtZSApOwogICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCAwLCB0ZW1wLCBURVhUX0NPTE9SICk7CiAgICAKICAgIEZUX0dldF9HbHlwaF9OYW1lKCBmYWNlLCBnbHlwaF9pbmRleCwgdGVtcDIsIDYzICk7CiAgICB0ZW1wMls2M10gPSAwOwogICAgCiAgICBzcHJpbnRmKCB0ZW1wLCAiZ2x5cGggJTRkOiAlcyIsIGdseXBoX2luZGV4LCB0ZW1wMiApOwogICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCA4LCB0ZW1wLCBURVhUX0NPTE9SICk7CiAgICAKICAgIGlmICggdGVtcF9tZXNzYWdlWzBdICkKICAgIHsKICAgICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCAxNiwgdGVtcF9tZXNzYWdlLCBURVhUX0NPTE9SICk7CiAgICAgIHRlbXBfbWVzc2FnZVswXSA9IDA7CiAgICB9CiAgfQp9CgoKCiNkZWZpbmUgIFRPR0dMRV9PUFRJT04odmFyLHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgdmFyID0gIXZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgc3ByaW50ZiggdGVtcF9tZXNzYWdlLCBwcmVmaXggIiBpcyBub3cgJXMiLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgdmFyID8gIm9uIiA6ICJvZmYiICk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0KCgojZGVmaW5lICBUT0dHTEVfT1BUSU9OX05FRyh2YXIscHJlZml4KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHZhciA9ICF2YXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHNwcmludGYoIHRlbXBfbWVzc2FnZSwgcHJlZml4ICIgaXMgbm93ICVzIiwgICAgXAogICAgICAgICAgICAgICAgICAgICAgICF2YXIgPyAib24iIDogIm9mZiIgKTsgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9CgogICAgICAgICAgICAKc3RhdGljIHZvaWQKaGFuZGxlX2V2ZW50KCBOVlZfRXZlbnRSZWMqICAgZXYgKQp7CiAgc3dpdGNoIChldi0+a2V5KQogIHsKICAgIGNhc2UgTlZWX0tleV9MZWZ0OgogICAgICB7CiAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA+IDAgKQogICAgICAgICAgZ2x5cGhfaW5kZXgtLTsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgIGNhc2UgTlZWX0tleV9SaWdodDoKICAgICAgewogICAgICAgIGlmICggZ2x5cGhfaW5kZXgrMSA8IGZhY2UtPm51bV9nbHlwaHMgKQogICAgICAgICAgZ2x5cGhfaW5kZXgrKzsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgIGNhc2UgTlZWX0tFWSgneCcpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19heGlzLCAiZ3JpZCBheGlzIGRpc3BsYXkiICkKCiAgICBjYXNlIE5WVl9LRVkoJ3MnKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfc3Ryb2tlLCAiZ2x5cGggc3Ryb2tlIGRpc3BsYXkiICkKICAgIAogICAgY2FzZSBOVlZfS0VZKCdnJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2dseXBoLCAiZ2x5cGggZmlsbCBkaXNwbGF5IiApCiAgICAgIAogICAgY2FzZSBOVlZfS0VZKCdkJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2RvdHMsICJjb250cm9sIHBvaW50cyBkaXNwbGF5IiApCiAgICAgIAogICAgY2FzZSBOVlZfS0VZKCdlJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2VtLCAiRU0gc3F1YXJlIGRpc3BsYXkiICkKICAgIAogICAgY2FzZSBOVlZfS0VZKCcrJyk6CiAgICAgIHsKICAgICAgICBncmlkX3NjYWxlICo9IDEuMjsKICAgICAgICByZXNldF9zY2FsZSggZ3JpZF9zY2FsZSApOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIAogICAgY2FzZSBOVlZfS0VZKCctJyk6CiAgICAgIHsKICAgICAgICBpZiAoZ3JpZF9zY2FsZSA+IDAuMykKICAgICAgICB7CiAgICAgICAgICBncmlkX3NjYWxlIC89IDEuMjsKICAgICAgICAgIHJlc2V0X3NjYWxlKCBncmlkX3NjYWxlICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS2V5X1VwOgogICAgICB7CiAgICAgICAgcGl4ZWxfc2l6ZSsrOwogICAgICAgIHJlc2V0X3NpemUoIHBpeGVsX3NpemUsIGdyaWRfc2NhbGUgKTsKICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsICJwaXhlbCBzaXplID0gJWQiLCBwaXhlbF9zaXplICk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlIE5WVl9LZXlfRG93bjoKICAgICAgewogICAgICAgIGlmIChwaXhlbF9zaXplID4gMSkKICAgICAgICB7CiAgICAgICAgICBwaXhlbF9zaXplLS07CiAgICAgICAgICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7CiAgICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsICJwaXhlbCBzaXplID0gJWQiLCBwaXhlbF9zaXplICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSBOVlZfS0VZKCd6Jyk6CiAgICAgIFRPR0dMRV9PUFRJT05fTkVHKCBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzLCAidmVydGljYWwgaGludHMgcHJvY2Vzc2luZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnYScpOgogICAgICBUT0dHTEVfT1BUSU9OX05FRyggcHNfZGVidWdfbm9faG9yel9oaW50cywgImhvcml6b250YWwgaGludHMgcHJvY2Vzc2luZyIgKQoKICAgIGNhc2UgTlZWX0tFWSgnWicpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd192ZXJ0X2hpbnRzLCAidmVydGljYWwgaGludHMgZGlzcGxheSIgKQoKICAgIGNhc2UgTlZWX0tFWSgnQScpOgogICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzLCAiaG9yaXpvbnRhbCBoaW50cyBkaXNwbGF5IiApCgogICAgY2FzZSBOVlZfS0VZKCdTJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X3Ntb290aCwgInNtb290aCBwb2ludHMgZGlzcGxheSIgKTsKCiAgICBjYXNlIE5WVl9LRVkoJ2InKToKICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfYmx1ZXMsICJibHVlIHpvbmVzIGRpc3BsYXkiICk7CgogICAgY2FzZSBOVlZfS0VZKCdoJyk6CiAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9oaW50aW5nLCAiaGludGluZyIgKQogICAgICAKICAgIGRlZmF1bHQ6CiAgICAgIDsKICB9Cn0KCgoKc3RhdGljIHZvaWQKdXNhZ2UoKQp7CiAgUGFuaWMoICJubyB1c2FnZSIgKTsKfQoKCiNkZWZpbmUgIE9QVElPTjEobixjb2RlKSAgIFwKICAgICAgICAgICBjYXNlIG4gOiAgICAgICAgXAogICAgICAgICAgICAgY29kZSAgICAgICAgICBcCiAgICAgICAgICAgICBhcmdjLS07ICAgICAgIFwKICAgICAgICAgICAgIGFyZ3YrKzsgICAgICAgXAogICAgICAgICAgICAgYnJlYWs7CgojZGVmaW5lICBPUFRJT04yKG4sY29kZSkgICAgIFwKICAgICAgICAgICBjYXNlIG4gOiAgICAgICAgICBcCiAgICAgICAgICAgICBjb2RlICAgICAgICAgICAgXAogICAgICAgICAgICAgYXJnYyAtPSAyOyAgICAgIFwKICAgICAgICAgICAgIGFyZ3YgKz0gMjsgICAgICBcCiAgICAgICAgICAgICBicmVhazsKCgpzdGF0aWMgdm9pZApwYXJzZV9vcHRpb25zKCBpbnQqICBhcmdjX3AsIGNoYXIqKiogYXJndl9wICkKewogIGludCAgICBhcmdjID0gKmFyZ2NfcDsKICBjaGFyKiogYXJndiA9ICphcmd2X3A7CiAgCiAgd2hpbGUgKGFyZ2MgPiAyICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKQogIHsKICAgIHN3aXRjaCAoYXJndlsxXVsxXSkKICAgIHsKICAgICAgT1BUSU9OMiggJ2YnLCBmaXJzdF9nbHlwaCA9IGF0b2koIGFyZ3ZbMl0gKTsgKQoKICAgICAgT1BUSU9OMiggJ3MnLCBwaXhlbF9zaXplID0gYXRvaSggYXJndlsyXSApOyApCiAgICAgIAogICAgICBkZWZhdWx0OgogICAgICAgIHVzYWdlKCk7CiAgICB9CiAgfQogIAogICphcmdjX3AgPSBhcmdjOwogICphcmd2X3AgPSBhcmd2Owp9CiAgCiAgCgppbnQgIG1haW4oIGludCAgYXJnYywgY2hhcioqICBhcmd2ICkKewogIGNoYXIqICBmaWxlbmFtZSA9ICIvZm9udHMvbGNkeHNyLnBmYSI7CiAgCiAgcGFyc2Vfb3B0aW9ucyggJmFyZ2MsICZhcmd2ICk7CiAgCiAgaWYgKCBhcmdjID49IDIgKQogICAgZmlsZW5hbWUgPSBhcmd2WzFdOwogICAKICAKICAvKiBjcmVhdGUgbGlicmFyeSAqLwogIGVycm9yID0gbnZfcmVuZGVyZXJfbmV3KCAwLCAmcmVuZGVyZXIgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBOaXJ2YW5hIHJlbmRlcmVyIiApOwogIAogIG1lbW9yeSA9IG52X3JlbmRlcmVyX2dldF9tZW1vcnkoIHJlbmRlcmVyICk7CgogIGVycm9yID0gbnZ2X2Rpc3BsYXlfbmV3KCByZW5kZXJlciwgJmRpc3BsYXkgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBkaXNwbGF5IiApOwogIAogIGVycm9yID0gbnZ2X3N1cmZhY2VfbmV3KCBkaXNwbGF5LCA0NjAsIDQ2MCwgbnZfcGl4bWFwX3R5cGVfYXJnYiwgJnN1cmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBzdXJmYWNlIiApOwoKICB0YXJnZXQgPSBudnZfc3VyZmFjZV9nZXRfcGl4bWFwKCBzdXJmYWNlICk7CgogIGVycm9yID0gbnZfcGFpbnRlcl9uZXcoIHJlbmRlcmVyLCAmcGFpbnRlciApOwogIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIHBhaW50ZXIiICk7CiAgCiAgbnZfcGFpbnRlcl9zZXRfdGFyZ2V0KCBwYWludGVyLCB0YXJnZXQgKTsKICAKICBjbGVhcl9iYWNrZ3JvdW5kKCk7CgogIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSggJmZyZWV0eXBlICk7CiAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBpbml0aWFsaXNlIEZyZWVUeXBlIiApOwogIAogIGVycm9yID0gRlRfTmV3X0ZhY2UoIGZyZWV0eXBlLCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IG9wZW4gZm9udCBmYWNlIiApOwoKICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7CiAKCiAgbnZ2X3N1cmZhY2Vfc2V0X3RpdGxlKCBzdXJmYWNlLCAiRnJlZVR5cGUgR2x5cGggVmlld2VyIiApOwoKICB7CiAgICBOVlZfRXZlbnRSZWMgIGV2ZW50OwoKICAgIGdseXBoX2luZGV4ID0gZmlyc3RfZ2x5cGg7ICAgIAogICAgZm9yICggOzsgKQogICAgewogICAgICBjbGVhcl9iYWNrZ3JvdW5kKCk7CiAgICAgIGRyYXdfZ3JpZCgpOwoKICAgICAgcHNfZGVidWdfaGludHMgPSAwOwogICAgICBkcmF3X3BzX2JsdWVfem9uZXMoKTsKICAgICAgZHJhd19nbHlwaCggZ2x5cGhfaW5kZXggKTsKICAgICAgcHMyX2RyYXdfY29udHJvbF9wb2ludHMoKTsKICAgICAgCiAgICAgIG52dl9zdXJmYWNlX3JlZnJlc2goIHN1cmZhY2UsIE5VTEwgKTsKCiAgICAgIG52dl9zdXJmYWNlX2xpc3Rlbiggc3VyZmFjZSwgMCwgJmV2ZW50ICk7CiAgICAgIGlmICggZXZlbnQua2V5ID09IE5WVl9LZXlfRXNjICkKICAgICAgICBicmVhazsKICAgICAgICAKICAgICAgaGFuZGxlX2V2ZW50KCAmZXZlbnQgKTsKICAgICAgc3dpdGNoIChldmVudC5rZXkpCiAgICAgIHsKICAgICAgICBjYXNlIE5WVl9LZXlfRXNjOgogICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIDsKICAgICAgfQogICAgfQogIH0KIAogRXhpdDoKICAvKiB3YWl0IGZvciBlc2NhcGUgKi8KICAgICAgCiAgCiAgLyogZGVzdHJveSBkaXNwbGF5IChhbmQgc3VyZmFjZSkgKi8KICBudnZfZGlzcGxheV91bnJlZiggZGlzcGxheSApOwogIG52X3JlbmRlcmVyX3VucmVmKCByZW5kZXJlciApOwoKICByZXR1cm4gMDsKfQo=