I2luY2x1ZGUgPG5pcnZhbmEuaD4KI2luY2x1ZGUgTlZfVklFV1BPUlRfSAojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDxmdDJidWlsZC5oPgojaW5jbHVkZSBGVF9GUkVFVFlQRV9ICgovKiBpbmNsdWRlIEZyZWVUeXBlIGludGVybmFscyB0byBkZWJ1ZyBoaW50cyAqLwojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaHJlYy5oPgojaW5jbHVkZSA8Li4vc3JjL3BzaGludGVyL3BzaGFsZ28uaD4KCiNpbmNsdWRlIDwuLi9zcmMvYXV0b2hpbnQvYWh0eXBlcy5oPgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIFJPT1QgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKI2luY2x1ZGUgPHRpbWUuaD4gICAgLyogZm9yIGNsb2NrKCkgKi8KCiAgLyogU3VuT1MgNC4xLiogZG9lcyBub3QgZGVmaW5lIENMT0NLU19QRVJfU0VDLCBzbyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4gKi8KICAvKiB0byBnZXQgdGhlIEhaIG1hY3JvIHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwojaWYgZGVmaW5lZCggX19zdW5fXyApICYmICFkZWZpbmVkKCBTVlI0ICkgJiYgIWRlZmluZWQoIF9fU1ZSNCApCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2RlZmluZSBDTE9DS1NfUEVSX1NFQyBIWgojZW5kaWYKCnN0YXRpYyBpbnQgIGZpcnN0X2dseXBoID0gMDsKCnN0YXRpYyBOVl9SZW5kZXJlciAgIHJlbmRlcmVyOwpzdGF0aWMgTlZfUGFpbnRlciAgICBwYWludGVyOwpzdGF0aWMgTlZfUGl4bWFwICAgICB0YXJnZXQ7CnN0YXRpYyBOVl9FcnJvciAgICAgIGVycm9yOwpzdGF0aWMgTlZfTWVtb3J5ICAgICBtZW1vcnk7CnN0YXRpYyBOVlZfRGlzcGxheSAgIGRpc3BsYXk7CnN0YXRpYyBOVlZfU3VyZmFjZSAgIHN1cmZhY2U7CgpzdGF0aWMgRlRfTGlicmFyeSAgICBmcmVldHlwZTsKc3RhdGljIEZUX0ZhY2UgICAgICAgZmFjZTsKCgpzdGF0aWMgIE5WX1BvcyAgICAgICAgZ2x5cGhfc2NhbGU7CnN0YXRpYyAgTlZfUG9zICAgICAgICBnbHlwaF9vcmdfeDsKc3RhdGljICBOVl9Qb3MgICAgICAgIGdseXBoX29yZ195OwpzdGF0aWMgIE5WX1RyYW5zZm9ybSAgZ2x5cGhfdHJhbnNmb3JtOyAgLyogZm9udCB1bml0cyAtPiBkZXZpY2UgcGl4ZWxzICovCnN0YXRpYyAgTlZfVHJhbnNmb3JtICBzaXplX3RyYW5zZm9ybTsgICAvKiBzdWJwaXhlbHMgIC0+IGRldmljZSBwaXhlbHMgKi8KCnN0YXRpYyAgTlZfU2NhbGUgICAgICBncmlkX3NjYWxlID0gMS4wOwoKc3RhdGljICBpbnQgICBnbHlwaF9pbmRleDsKc3RhdGljICBpbnQgICBwaXhlbF9zaXplID0gMTI7CgoKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgT1BUSU9OUywgQ09MT1JTIGFuZCBPVEhFUlMgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2F4aXMgICAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19kb3RzICAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfc3Ryb2tlICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2dseXBoICAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ncmlkICAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZW0gICAgICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3Ntb290aCAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ibHVlcyAgICA9IDA7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfZWRnZXMgICAgPSAwOwpzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X3NlZ21lbnRzID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19saW5rcyAgICA9IDE7CnN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfaW5kaWNlcyAgPSAwOwoKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19wc19oaW50cyAgID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19ob3J6X2hpbnRzID0gMTsKc3RhdGljICBpbnQgICBvcHRpb25fc2hvd192ZXJ0X2hpbnRzID0gMTsKCgpzdGF0aWMgIGludCAgIG9wdGlvbl9oaW50aW5nID0gMTsKCnN0YXRpYyAgY2hhciAgdGVtcF9tZXNzYWdlWzEwMjRdOwoKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX2RvdCAgICAgPSBOVUxMOwpzdGF0aWMgIE5WX1BhdGggICBzeW1ib2xfY2lyY2xlICA9IE5VTEw7CnN0YXRpYyAgTlZfUGF0aCAgIHN5bWJvbF9zcXVhcmUgID0gTlVMTDsKc3RhdGljICBOVl9QYXRoICAgc3ltYm9sX3JlY3RfaCAgPSBOVUxMOwpzdGF0aWMgIE5WX1BhdGggICBzeW1ib2xfcmVjdF92ICA9IE5VTEw7CgoKCiNkZWZpbmUgIEFYSVNfQ09MT1IgICAgICAgIDB4RkZGRjAwMDAKI2RlZmluZSAgR1JJRF9DT0xPUiAgICAgICAgMHhGRkQwRDBEMAojZGVmaW5lICBPTl9DT0xPUiAgICAgICAgICAweEZGRkYyMDAwCiNkZWZpbmUgIE9GRl9DT0xPUiAgICAgICAgIDB4RkZGRjAwODAKI2RlZmluZSAgU1RST05HX0NPTE9SICAgICAgMHhGRjQwNDA0MAojZGVmaW5lICBJTlRFUlBfQ09MT1IgICAgICAweEZGMjA2MDQwCiNkZWZpbmUgIFNNT09USF9DT0xPUiAgICAgIDB4RjAwMEIwNDAKI2RlZmluZSAgQkFDS0dST1VORF9DT0xPUiAgMHhGRkZGRkZGRgojZGVmaW5lICBURVhUX0NPTE9SICAgICAgICAweEZGMDAwMDAwCiNkZWZpbmUgIEVNX0NPTE9SICAgICAgICAgIDB4ODAwMDgwMDAKI2RlZmluZSAgQkxVRVNfVE9QX0NPTE9SICAgMHg0MDAwMDA4RgojZGVmaW5lICBCTFVFU19CT1RfQ09MT1IgICAweDQwMDA4RjAwCgojZGVmaW5lICBHSE9TVF9ISU5UX0NPTE9SICAweEUwMDAwMEZGCiNkZWZpbmUgIFNURU1fSElOVF9DT0xPUiAgIDB4RTAyMDIwRkYKI2RlZmluZSAgU1RFTV9KT0lOX0NPTE9SICAgMHhFMDIwRkYyMAoKI2RlZmluZSAgRURHRV9DT0xPUiAgICAgICAgMHhGMDcwNDA3MAojZGVmaW5lICBTRUdNRU5UX0NPTE9SICAgICAweEYwMjA2MDQwCiNkZWZpbmUgIExJTktfQ09MT1IgICAgICAgIDB4RjBGRkZGMDAKI2RlZmluZSAgU0VSSUZfTElOS19DT0xPUiAgMHhGMEZGODA4RgoKCi8qIHByaW50IG1lc3NhZ2UgYW5kIGFib3J0IHByb2dyYW0gKi8Kc3RhdGljIHZvaWQKUGFuaWMoIGNvbnN0IGNoYXIqICBtZXNzYWdlICkKewogIGZwcmludGYoIHN0ZGVyciwgIlBBTklDOiAlc1xuIiwgbWVzc2FnZSApOwogIGV4aXQoMSk7Cn0KCgpzdGF0aWMgdm9pZAppbml0X3N5bWJvbHMoIHZvaWQgKQp7CiAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgLTEsIC0xLCAzLCAzLCAwLCAwLCAmc3ltYm9sX3NxdWFyZSApOwogIG52X3BhdGhfbmV3X3JlY3RhbmdsZSggcmVuZGVyZXIsIC0xLCAtNiwgMiwgMTIsIDAsIDAsICZzeW1ib2xfcmVjdF92ICk7CiAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgLTYsIC0xLCAxMiwgMiwgMCwgMCwgJnN5bWJvbF9yZWN0X2ggKTsKCiAgbnZfcGF0aF9uZXdfY2lyY2xlKCByZW5kZXJlciwgMCwgMCwgMy4sICZzeW1ib2xfZG90ICk7CgogIG52X3BhdGhfc3Ryb2tlKCBzeW1ib2xfZG90LCAwLjYsCiAgICAgICAgICAgICAgICAgIG52X3BhdGhfbGluZWNhcF9idXR0LAogICAgICAgICAgICAgICAgICBudl9wYXRoX2xpbmVqb2luX21pdGVyLCAxLiwKICAgICAgICAgICAgICAgICAgJnN5bWJvbF9jaXJjbGUgKTsKCiAgbnZfcGF0aF9kZXN0cm95KCBzeW1ib2xfZG90ICk7CgogIG52X3BhdGhfbmV3X2NpcmNsZSggcmVuZGVyZXIsIDAsIDAsIDIuLCAmc3ltYm9sX2RvdCApOwogfQoKCnN0YXRpYyB2b2lkCmRvbmVfc3ltYm9scyggdm9pZCApCnsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9jaXJjbGUgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9kb3QgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9yZWN0X3YgKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9yZWN0X2ggKTsKICBudl9wYXRoX2Rlc3Ryb3koIHN5bWJvbF9zcXVhcmUgKTsKfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqICAgICAgICAgICAgICAgQ09NTU9OIEdSSUQgRFJBV0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAqKioqKi8KICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCnJlc2V0X3NjYWxlKCBOVl9TY2FsZSAgc2NhbGUgKQp7CiAgLyogY29tcHV0ZSBmb250IHVuaXRzIC0+IGdyaWQgcGl4ZWxzIHNjYWxlIGZhY3RvciAqLwogIGdseXBoX3NjYWxlID0gdGFyZ2V0LT53aWR0aCowLjc1IC8gZmFjZS0+dW5pdHNfcGVyX0VNICogc2NhbGU7CgogIC8qIHNldHVwIGZvbnQgdW5pdHMgLT4gZ3JpZCBwaXhlbHMgdHJhbnNmb3JtICovCiAgbnZfdHJhbnNmb3JtX3NldF9zY2FsZSggJmdseXBoX3RyYW5zZm9ybSwgZ2x5cGhfc2NhbGUsIC1nbHlwaF9zY2FsZSApOwogIGdseXBoX29yZ194ID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhLnggPSB0YXJnZXQtPndpZHRoKjAuMTI1OwogIGdseXBoX29yZ195ID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhLnkgPSB0YXJnZXQtPmhlaWdodCowLjg3NTsKCiAgLyogc2V0dXAgc3VicGl4ZWxzIC0+IGdyaWQgcGl4ZWxzIHRyYW5zZm9ybSAqLwogIG52X3RyYW5zZm9ybV9zZXRfc2NhbGUoCiAgICAmc2l6ZV90cmFuc2Zvcm0sCiAgICBnbHlwaF9zY2FsZSAvIG52X2Zyb21maXhlZCggZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlICksCiAgICAtZ2x5cGhfc2NhbGUgLyBudl9mcm9tZml4ZWQoIGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZSApICk7CgogIHNpemVfdHJhbnNmb3JtLmRlbHRhID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhOwp9CgoKc3RhdGljIHZvaWQKcmVzZXRfc2l6ZSggaW50ICAgICAgIHBpeGVsX3NpemUsCiAgICAgICAgICAgIE5WX1NjYWxlICBzY2FsZSApCnsKICBGVF9TZXRfUGl4ZWxfU2l6ZXMoIGZhY2UsIHBpeGVsX3NpemUsIHBpeGVsX3NpemUgKTsKICByZXNldF9zY2FsZSggc2NhbGUgKTsKfQoKCnN0YXRpYyB2b2lkCmNsZWFyX2JhY2tncm91bmQoIHZvaWQgKQp7CiAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCAwLCB0YXJnZXQtPndpZHRoLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICBCQUNLR1JPVU5EX0NPTE9SICk7Cn0KCgpzdGF0aWMgdm9pZApkcmF3X2dyaWQoIHZvaWQgKQp7CiAgaW50ICB4ID0gKGludClnbHlwaF9vcmdfeDsKICBpbnQgIHkgPSAoaW50KWdseXBoX29yZ195OwoKCiAgLyogZHJhdyBncmlkICovCiAgaWYgKCBvcHRpb25fc2hvd19ncmlkICkKICB7CiAgICBOVl9TY2FsZSAgbWluLCBtYXgsIHgsIHN0ZXA7CgoKICAgIC8qIGRyYXcgdmVydGljYWwgZ3JpZCBiYXJzICovCiAgICBzdGVwID0gNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnh4OwogICAgaWYgKCBzdGVwID4gMS4gKQogICAgewogICAgICBtaW4gPSBtYXggPSBnbHlwaF9vcmdfeDsKICAgICAgd2hpbGUgKCBtaW4gLSBzdGVwID49IDAgKSAgICAgICAgICAgICBtaW4gLT0gc3RlcDsKICAgICAgd2hpbGUgKCBtYXggKyBzdGVwIDwgdGFyZ2V0LT53aWR0aCApICBtYXggKz0gc3RlcDsKCiAgICAgIGZvciAoIHggPSBtaW47IHggPD0gbWF4OyB4ICs9IHN0ZXAgKQogICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgKE5WX0ludCkoeCArIC41KSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB0YXJnZXQtPmhlaWdodCwgR1JJRF9DT0xPUiApOwogICAgfQoKICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBncmlkIGJhcnMgKi8KICAgIHN0ZXAgPSAtNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnl5OwogICAgaWYgKCBzdGVwID4gMS4gKQogICAgewogICAgICBtaW4gPSBtYXggPSBnbHlwaF9vcmdfeTsKICAgICAgd2hpbGUgKCBtaW4gLSBzdGVwID49IDAgKSAgICAgICAgICAgICAgbWluIC09IHN0ZXA7CiAgICAgIHdoaWxlICggbWF4ICsgc3RlcCA8IHRhcmdldC0+aGVpZ2h0ICkgIG1heCArPSBzdGVwOwoKICAgICAgZm9yICggeCA9IG1pbjsgeCA8PSBtYXg7IHggKz0gc3RlcCApCiAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCAoTlZfSW50KSh4ICsgLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+d2lkdGgsIDEsIEdSSURfQ09MT1IgKTsKICAgIH0KICB9CgogIC8qIGRyYXcgYXhpcyAqLwogIGlmICggb3B0aW9uX3Nob3dfYXhpcyApCiAgewogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4LCAwLCAxLCB0YXJnZXQtPmhlaWdodCwgQVhJU19DT0xPUiApOwogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB5LCB0YXJnZXQtPndpZHRoLCAxLCBBWElTX0NPTE9SICk7CiAgfQoKICBpZiAoIG9wdGlvbl9zaG93X2VtICkKICB7CiAgICBOVl9QYXRoICBwYXRoOwogICAgTlZfUGF0aCAgc3Ryb2tlOwogICAgTlZfVUludCAgdW5pdHMgPSAoTlZfVUludClmYWNlLT51bml0c19wZXJfRU07CgoKICAgIG52X3BhdGhfbmV3X3JlY3RhbmdsZSggcmVuZGVyZXIsIDAsIDAsIHVuaXRzLCB1bml0cywgMCwgMCwgJnBhdGggKTsKICAgIG52X3BhdGhfdHJhbnNmb3JtKCBwYXRoLCAmZ2x5cGhfdHJhbnNmb3JtICk7CgogICAgbnZfcGF0aF9zdHJva2UoIHBhdGgsIDEuNSwgbnZfcGF0aF9saW5lY2FwX2J1dHQsIG52X3BhdGhfbGluZWpvaW5fbWl0ZXIsCiAgICAgICAgICAgICAgICAgICAgNC4wLCAmc3Ryb2tlICk7CgogICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIEVNX0NPTE9SLCAyNTYgKTsKICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCBOVUxMLCAwLCBzdHJva2UgKTsKCiAgICBudl9wYXRoX2Rlc3Ryb3koIHN0cm9rZSApOwogICAgbnZfcGF0aF9kZXN0cm95KCBwYXRoICk7CiAgfQoKfQoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqICAgICAgICAgICAgICAgICBQT1NUU0NSSVBUIEdMT0JBTFMgUk9VVElORVMgICAgICAgICAgICAgICAgICAqKioqKi8KICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oPgoKc3RhdGljIHZvaWQKZHJhd19wc19ibHVlX3pvbmVzKCB2b2lkICkKewogIGlmICggb3B0aW9uX3Nob3dfYmx1ZXMgJiYgcHNfZGVidWdfZ2xvYmFscyApCiAgewogICAgUFNIX0JsdWVzICAgICAgIGJsdWVzID0gJnBzX2RlYnVnX2dsb2JhbHMtPmJsdWVzOwogICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlOwogICAgTlZfVmVjdG9yICAgICAgIHY7CiAgICBGVF9JbnQgICAgICAgICAgeTEsIHkyOwogICAgRlRfVUludCAgICAgICAgIGNvdW50OwogICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7CgoKICAgIC8qIGRyYXcgdG9wIHpvbmVzICovCiAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX3RvcDsKICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwogICAgem9uZSAgPSB0YWJsZS0+em9uZXM7CgogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCiAgICB7CiAgICAgIHYueCA9IDA7CiAgICAgIGlmICggIXBzX2RlYnVnX25vX2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZiArIHpvbmUtPmN1cl9kZWx0YTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdi55ID0gem9uZS0+b3JnX3JlZiArIHpvbmUtPm9yZ19kZWx0YTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIHkxICA9IChpbnQpKHYueSArIDAuNSk7CgogICAgICB2LnggPSAwOwogICAgICBpZiAoICFwc19kZWJ1Z19ub19ob3J6X2hpbnRzICkKICAgICAgewogICAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWY7CiAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHYueSA9IHpvbmUtPm9yZ19yZWY7CiAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZnbHlwaF90cmFuc2Zvcm0gKTsKICAgICAgfQogICAgICB5MiA9IChpbnQpKHYueSArIDAuNSk7CgogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCB5Mi15MSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCTFVFU19UT1BfQ09MT1IgKTsKCiNpZiAwCiAgICAgIHByaW50ZiggInRvcCBbJS4zZiAlLjNmXVxuIiwgem9uZS0+Y3VyX2JvdHRvbS82NC4wLCB6b25lLT5jdXJfdG9wLzY0LjAgKTsKI2VuZGlmCiAgICB9CgoKICAgIC8qIGRyYXcgYm90dG9tIHpvbmVzICovCiAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwogICAgem9uZSAgPSB0YWJsZS0+em9uZXM7CgogICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCiAgICB7CiAgICAgIHYueCA9IDA7CiAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWY7CiAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgeTEgID0gKGludCkodi55ICsgMC41KTsKCiAgICAgIHYueCA9IDA7CiAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWYgKyB6b25lLT5jdXJfZGVsdGE7CiAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgeTIgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT53aWR0aCwgeTIgLSB5MSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMVUVTX0JPVF9DT0xPUiApOwoKI2lmIDAKICAgICAgcHJpbnRmKCAiYm90IFslLjNmICUuM2ZdXG4iLCB6b25lLT5jdXJfYm90dG9tLzY0LjAsIHpvbmUtPmN1cl90b3AvNjQuMCApOwojZW5kaWYKICAgIH0KICB9Cn0KCgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogLyoqKioqICAgICAgICAgICAgUE9TVFNDUklQVCBISU5URVIgQUxHT1JJVEhNIFJPVVRJTkVTICAgICAgICAgICAgICAqKioqKi8KIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDwuLi9zcmMvcHNoaW50ZXIvcHNoYWxnby5oPgoKc3RhdGljIHZvaWQKZHJhd19wc19oaW50KCBQU0hfSGludCAgaGludCwgCiAgICAgICAgICAgICAgRlRfQm9vbCAgIHZlcnRpY2FsICkKewogIGludCAgICAgICAgeDEsIHgyOwogIE5WX1ZlY3RvciAgdjsKCgogIGlmICggcHNoaW50X3ZlcnRpY2FsICE9IHZlcnRpY2FsICkKICB7CiAgICBpZiAoIHZlcnRpY2FsICkKICAgICAgcHNoaW50X2Nwb3MgPSA0MDsKICAgIGVsc2UKICAgICAgcHNoaW50X2Nwb3MgPSAxMDsKCiAgICBwc2hpbnRfdmVydGljYWwgPSB2ZXJ0aWNhbDsKICB9CgogIGlmICggIXZlcnRpY2FsICkKICB7CiAgICBpZiAoICFvcHRpb25fc2hvd192ZXJ0X2hpbnRzICkKICAgICAgcmV0dXJuOwoKICAgIHYueCA9IGhpbnQtPmN1cl9wb3M7CiAgICB2LnkgPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDEgPSAoaW50KSh2LnggKyAwLjUpOwoKICAgIHYueCA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuOwogICAgdi55ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgyID0gKGludCkodi54ICsgMC41KTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgxLCAwLCAxLCB0YXJnZXQtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBzaF9oaW50X2lzX2dob3N0KCBoaW50ICkKICAgICAgICAgICAgICAgICAgICAgICAgID8gR0hPU1RfSElOVF9DT0xPUiA6IFNURU1fSElOVF9DT0xPUiApOwoKICAgIGlmICggcHNoX2hpbnRfaXNfZ2hvc3QoIGhpbnQgKSApCiAgICB7CiAgICAgIHgxIC0tOwogICAgICB4MiA9IHgxICsgMjsKICAgIH0KICAgIGVsc2UKICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MiwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaF9oaW50X2lzX2dob3N0KCBoaW50ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4MSwgcHNoaW50X2Nwb3MsIHgyICsgMSAtIHgxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgU1RFTV9KT0lOX0NPTE9SICk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoICFvcHRpb25fc2hvd19ob3J6X2hpbnRzICkKICAgICAgcmV0dXJuOwoKICAgIHYueSA9IGhpbnQtPmN1cl9wb3M7CiAgICB2LnggPSAwOwogICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwogICAgeDEgPSAoaW50KSh2LnkgKyAwLjUpOwoKICAgIHYueSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuOwogICAgdi54ID0gMDsKICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgIHgyID0gKGludCkodi55ICsgMC41KTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgxLCB0YXJnZXQtPndpZHRoLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgcHNoX2hpbnRfaXNfZ2hvc3QoIGhpbnQgKQogICAgICAgICAgICAgICAgICAgICAgICAgPyBHSE9TVF9ISU5UX0NPTE9SIDogU1RFTV9ISU5UX0NPTE9SICk7CgogICAgaWYgKCBwc2hfaGludF9pc19naG9zdCggaGludCApICkKICAgIHsKICAgICAgeDEgLS07CiAgICAgIHgyID0geDEgKyAyOwogICAgfQogICAgZWxzZQogICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgyLCB0YXJnZXQtPndpZHRoLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc2hfaGludF9pc19naG9zdChoaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdIT1NUX0hJTlRfQ09MT1IgOiBTVEVNX0hJTlRfQ09MT1IgKTsKCiAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHBzaGludF9jcG9zLCB4MiwgMSwgeDEgKyAxIC0geDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTVEVNX0pPSU5fQ09MT1IgKTsKICB9CgojaWYgMAogIHByaW50ZiggIlslNy4zZiAlNy4zZl0gJWNcbiIsIGhpbnQtPmN1cl9wb3MvNjQuMCwgKGhpbnQtPmN1cl9wb3MraGludC0+Y3VyX2xlbikvNjQuMCwgdmVydGljYWwgPyAndicgOiAnaCcgKTsKI2VuZGlmCgogIHBzaGludF9jcG9zICs9IDEwOwp9CgoKc3RhdGljIHZvaWQKcHNfZHJhd19jb250cm9sX3BvaW50cyggdm9pZCApCnsKICBpZiAoIHBzX2RlYnVnX2dseXBoICkKICB7CiAgICBQU0hfR2x5cGggICAgIGdseXBoID0gcHNfZGVidWdfZ2x5cGg7CiAgICBQU0hfUG9pbnQgICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKICAgIEZUX1VJbnQgICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKICAgIE5WX1RyYW5zZm9ybSAgdHJhbnNmb3JtLCAqdHJhbnMgPSAmdHJhbnNmb3JtOwogICAgTlZfUGF0aCAgICAgICB2ZXJ0X3JlY3Q7CiAgICBOVl9QYXRoICAgICAgIGhvcnpfcmVjdDsKICAgIE5WX1BhdGggICAgICAgZG90LCBjaXJjbGU7CgoKICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKICAgIHsKICAgICAgTlZfVmVjdG9yICB2ZWM7CgoKICAgICAgdmVjLnggPSBwb2ludC0+Y3VyX3g7CiAgICAgIHZlYy55ID0gcG9pbnQtPmN1cl95OwogICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgIG52X3RyYW5zZm9ybV9zZXRfdHJhbnNsYXRlKCB0cmFucywgdmVjLngsIHZlYy55ICk7CgogICAgICBpZiAoIG9wdGlvbl9zaG93X3Ntb290aCAmJiAhcHNoX3BvaW50X2lzX3Ntb290aChwb2ludCkgKQogICAgICB7CiAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNNT09USF9DT0xPUiwgMjU2ICk7CiAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfY2lyY2xlICk7CiAgICAgIH0KCiAgICAgIGlmICggb3B0aW9uX3Nob3dfaG9yel9oaW50cyApCiAgICAgIHsKICAgICAgICBpZiAoIHBvaW50LT5mbGFnc195ICYgUFNIX1BPSU5UX1NUUk9ORyApCiAgICAgICAgewogICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNUUk9OR19DT0xPUiwgMjU2ICk7CiAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHN5bWJvbF9yZWN0X2ggKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICggb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHsKICAgICAgICBpZiAoIHBvaW50LT5mbGFnc194ICYgUFNIX1BPSU5UX1NUUk9ORyApCiAgICAgICAgewogICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIFNUUk9OR19DT0xPUiwgMjU2ICk7CiAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgdHJhbnMsIDAsIHN5bWJvbF9yZWN0X3YgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgpzdGF0aWMgdm9pZApwc19wcmludF9oaW50cyggdm9pZCApCnsKICBpZiAoIHBzX2RlYnVnX2hpbnRzICkKICB7CiAgICBGVF9JbnQgICAgICAgICBkaW1lbnNpb247CgoKICAgIGZvciAoIGRpbWVuc2lvbiA9IDE7IGRpbWVuc2lvbiA+PSAwOyBkaW1lbnNpb24tLSApCiAgICB7CiAgICAgIFBTX0RpbWVuc2lvbiAgZGltICAgPSAmcHNfZGVidWdfaGludHMtPmRpbWVuc2lvblsgZGltZW5zaW9uIF07CiAgICAgIFBTX01hc2sgICAgICAgbWFzayAgPSBkaW0tPm1hc2tzLm1hc2tzOwogICAgICBGVF9VSW50ICAgICAgIGNvdW50ID0gZGltLT5tYXNrcy5udW1fbWFza3M7CgoKICAgICAgcHJpbnRmKCAiJXMgaGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKICAgICAgICAgICAgICBkaW1lbnNpb24gPyAidmVydGljYWwiIDogImhvcml6b250YWwiICk7CgogICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbWFzaysrICkKICAgICAgewogICAgICAgIEZUX1VJbnQgIGluZGV4OwoKCiAgICAgICAgcHJpbnRmKCAibWFzayAtPiAlZFxuIiwgbWFzay0+ZW5kX3BvaW50ICk7CiAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IG1hc2stPm51bV9iaXRzOyBpbmRleCsrICkKICAgICAgICB7CiAgICAgICAgICBpZiAoIG1hc2stPmJ5dGVzWyBpbmRleCA+PiAzIF0gJiAoMHg4MCA+PiAoaW5kZXggJiA3KSkgKQogICAgICAgICAgewogICAgICAgICAgICBQU19IaW50ICBoaW50ID0gZGltLT5oaW50cy5oaW50cyArIGluZGV4OwoKCiAgICAgICAgICAgIHByaW50ZiggIiVjIFslM2QgJTNkICglNGQpXVxuIiwgZGltZW5zaW9uID8gInYiIDogImgiLAogICAgICAgICAgICAgICAgICAgIGhpbnQtPnBvcywgaGludC0+cG9zICsgaGludC0+bGVuLCBoaW50LT5sZW4gKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKiAgICAgICAgICAgIEFVVE9ISU5URVIgRFJBV0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgTlZfUGF0aAphaF9saW5rX3BhdGgoIE5WX1ZlY3RvciogIHAxLAogICAgICAgICAgICAgIE5WX1ZlY3RvciogIHA0LAogICAgICAgICAgICAgIE5WX0Jvb2wgICAgIHZlcnRpY2FsICkKewogIE5WX1BhdGhXcml0ZXIgIHdyaXRlcjsKICBOVl9WZWN0b3IgICAgICBwMiwgcDM7CiAgTlZfUGF0aCAgICAgICAgcGF0aCwgc3Ryb2tlOwoKCiAgaWYgKCB2ZXJ0aWNhbCApCiAgewogICAgcDIueCA9IHA0LT54OwogICAgcDIueSA9IHAxLT55OwoKICAgIHAzLnggPSBwMS0+eDsKICAgIHAzLnkgPSBwNC0+eTsKICB9CiAgZWxzZQogIHsKICAgIHAyLnggPSBwMS0+eDsKICAgIHAyLnkgPSBwNC0+eTsKCiAgICBwMy54ID0gcDQtPng7CiAgICBwMy55ID0gcDEtPnk7CiAgfQoKICBudl9wYXRoX3dyaXRlcl9uZXcoIHJlbmRlcmVyLCAmd3JpdGVyICk7CiAgbnZfcGF0aF93cml0ZXJfbW92ZXRvKCB3cml0ZXIsIHAxICk7CiAgbnZfcGF0aF93cml0ZXJfY3ViaWN0byggd3JpdGVyLCAmcDIsICZwMywgcDQgKTsKICBudl9wYXRoX3dyaXRlcl9lbmQoIHdyaXRlciApOwoKICBwYXRoID0gbnZfcGF0aF93cml0ZXJfZ2V0X3BhdGgoIHdyaXRlciApOwogIG52X3BhdGhfd3JpdGVyX2Rlc3Ryb3koIHdyaXRlciApOwoKICBudl9wYXRoX3N0cm9rZSggcGF0aCwgMS4sCiAgICAgICAgICAgICAgICAgIG52X3BhdGhfbGluZWNhcF9idXR0LCBudl9wYXRoX2xpbmVqb2luX3JvdW5kLAogICAgICAgICAgICAgICAgICAxLiwgJnN0cm9rZSApOwoKICBudl9wYXRoX2Rlc3Ryb3koIHBhdGggKTsKCiAgcmV0dXJuIHN0cm9rZTsKfQoKCnN0YXRpYyB2b2lkCmFoX2RyYXdfc21vb3RoX3BvaW50cyggdm9pZCApCnsKICBpZiAoIGFoX2RlYnVnX2hpbnRlciAmJiBvcHRpb25fc2hvd19zbW9vdGggKQogIHsKICAgIEFIX091dGxpbmUgICBnbHlwaCA9IGFoX2RlYnVnX2hpbnRlci0+Z2x5cGg7CiAgICBGVF9VSW50ICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKICAgIEFIX1BvaW50ICAgICBwb2ludCA9IGdseXBoLT5wb2ludHM7CgoKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTTU9PVEhfQ09MT1IsIDI1NiApOwoKICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKICAgIHsKICAgICAgaWYgKCAhKCBwb2ludC0+ZmxhZ3MgJiBBSF9GTEFHX1dFQUtfSU5URVJQT0xBVElPTiApICkKICAgICAgewogICAgICAgIE5WX1RyYW5zZm9ybSAgdHJhbnNmb3JtLCAqdHJhbnMgPSAmdHJhbnNmb3JtOwogICAgICAgIE5WX1ZlY3RvciAgICAgdmVjOwoKCiAgICAgICAgdmVjLnggPSBwb2ludC0+eCAtIGFoX2RlYnVnX2hpbnRlci0+cHAxLng7CiAgICAgICAgdmVjLnkgPSBwb2ludC0+eTsKICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFuc2Zvcm0sIHZlYy54LCB2ZWMueSApOwogICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX2NpcmNsZSApOwogICAgICB9CiAgICB9CiAgfQp9CgoKc3RhdGljIHZvaWQKYWhfZHJhd19lZGdlcyggdm9pZCApCnsKICBpZiAoIGFoX2RlYnVnX2hpbnRlciApCiAgewogICAgQUhfT3V0bGluZSAgZ2x5cGggPSBhaF9kZWJ1Z19oaW50ZXItPmdseXBoOwogICAgRlRfVUludCAgICAgY291bnQ7CiAgICBBSF9FZGdlICAgICBlZGdlOwogICAgRlRfUG9zICAgICAgcHAxID0gYWhfZGVidWdfaGludGVyLT5wcDEueDsKCgogICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIEVER0VfQ09MT1IsIDI1NiApOwoKICAgIGlmICggb3B0aW9uX3Nob3dfZWRnZXMgKQogICAgewogICAgICAvKiBkcmF3IHZlcnRpY2FsIGVkZ2VzICovCiAgICAgIGlmICggb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgIHsKICAgICAgICBjb3VudCA9IGdseXBoLT5udW1fdmVkZ2VzOwogICAgICAgIGVkZ2UgID0gZ2x5cGgtPnZlcnRfZWRnZXM7CiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGVkZ2UrKyApCiAgICAgICAgewogICAgICAgICAgTlZfVmVjdG9yICB2ZWM7CiAgICAgICAgICBOVl9Qb3MgICAgIHg7CgoKICAgICAgICAgIHZlYy54ID0gZWRnZS0+cG9zIC0gcHAxOwogICAgICAgICAgdmVjLnkgPSAwOwoKICAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2ZWMsICZzaXplX3RyYW5zZm9ybSApOwogICAgICAgICAgeCA9IChGVF9Qb3MpKCB2ZWMueCArIDAuNSApOwoKICAgICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeCwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsIEVER0VfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBlZGdlcyAqLwogICAgICBpZiAoIG9wdGlvbl9zaG93X2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgY291bnQgPSBnbHlwaC0+bnVtX2hlZGdlczsKICAgICAgICBlZGdlICA9IGdseXBoLT5ob3J6X2VkZ2VzOwogICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBlZGdlKysgKQogICAgICAgIHsKICAgICAgICAgIE5WX1ZlY3RvciAgdmVjOwogICAgICAgICAgTlZfUG9zICAgICB4OwoKCiAgICAgICAgICB2ZWMueCA9IDA7CiAgICAgICAgICB2ZWMueSA9IGVkZ2UtPnBvczsKCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIHggPSAoRlRfUG9zKSggdmVjLnkgKyAwLjUgKTsKCiAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgsIHRhcmdldC0+d2lkdGgsIDEsIEVER0VfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIG9wdGlvbl9zaG93X3NlZ21lbnRzICkKICAgIHsKICAgICAgLyogZHJhdyB2ZXJ0aWNhbCBzZWdtZW50cyAqLwogICAgICBpZiAoIG9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgc2VnICAgPSBnbHlwaC0+dmVydF9zZWdtZW50czsKICAgICAgICBGVF9VSW50ICAgICBjb3VudCA9IGdseXBoLT5udW1fdnNlZ21lbnRzOwoKCiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICB7CiAgICAgICAgICBBSF9Qb2ludFJlYyAgKmZpcnN0LCAqbGFzdDsKICAgICAgICAgIE5WX1ZlY3RvciAgdjEsIHYyOwogICAgICAgICAgTlZfUG9zICAgICB5MSwgeTIsIHg7CgoKICAgICAgICAgIGZpcnN0ID0gc2VnLT5maXJzdDsKICAgICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwoKICAgICAgICAgIHYxLnggPSB2Mi54ID0gZmlyc3QtPnggLSBwcDE7CgogICAgICAgICAgaWYgKCBmaXJzdC0+eSA8PSBsYXN0LT55ICkKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueSA9IGZpcnN0LT55OwogICAgICAgICAgICB2Mi55ID0gbGFzdC0+eTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgdjEueSA9IGxhc3QtPnk7CiAgICAgICAgICAgIHYyLnkgPSBmaXJzdC0+eTsKICAgICAgICAgIH0KCiAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdjEsICZzaXplX3RyYW5zZm9ybSApOwogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYyLCAmc2l6ZV90cmFuc2Zvcm0gKTsKCiAgICAgICAgICB5MSA9IChOVl9Qb3MpKCB2MS55ICsgMC41ICk7CiAgICAgICAgICB5MiA9IChOVl9Qb3MpKCB2Mi55ICsgMC41ICk7CiAgICAgICAgICB4ICA9IChOVl9Qb3MpKCB2MS54ICsgMC41ICk7CgogICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4IC0gMSwgeTIsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMoIHkxIC0geTIgKSArIDEsIFNFR01FTlRfQ09MT1IgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBzZWdtZW50cyAqLwogICAgICBpZiAoIG9wdGlvbl9zaG93X2hvcnpfaGludHMgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgc2VnICAgPSBnbHlwaC0+aG9yel9zZWdtZW50czsKICAgICAgICBGVF9VSW50ICAgICBjb3VudCA9IGdseXBoLT5udW1faHNlZ21lbnRzOwoKCiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICB7CiAgICAgICAgICBBSF9Qb2ludFJlYyAgKmZpcnN0LCAqbGFzdDsKICAgICAgICAgIE5WX1ZlY3RvciAgICB2MSwgdjI7CiAgICAgICAgICBOVl9Qb3MgICAgICAgeTEsIHkyLCB4OwoKCiAgICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7CiAgICAgICAgICBsYXN0ICA9IHNlZy0+bGFzdDsKCiAgICAgICAgICB2MS55ID0gdjIueSA9IGZpcnN0LT55OwoKICAgICAgICAgIGlmICggZmlyc3QtPnggPD0gbGFzdC0+eCApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBmaXJzdC0+eCAtIHBwMTsKICAgICAgICAgICAgdjIueCA9IGxhc3QtPnggLSBwcDE7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBsYXN0LT54IC0gcHAxOwogICAgICAgICAgICB2Mi54ID0gZmlyc3QtPnggLSBwcDE7CiAgICAgICAgICB9CgogICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYxLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2MiwgJnNpemVfdHJhbnNmb3JtICk7CgogICAgICAgICAgeTEgPSAoTlZfUG9zKSggdjEueCArIDAuNSApOwogICAgICAgICAgeTIgPSAoTlZfUG9zKSggdjIueCArIDAuNSApOwogICAgICAgICAgeCAgPSAoTlZfUG9zKSggdjEueSArIDAuNSApOwoKICAgICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeTEsIHggLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTKCB5MSAtIHkyICkgKyAxLCAzLCBTRUdNRU5UX0NPTE9SICk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIG9wdGlvbl9zaG93X3ZlcnRfaGludHMgJiYgb3B0aW9uX3Nob3dfbGlua3MgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgc2VnICAgPSBnbHlwaC0+dmVydF9zZWdtZW50czsKICAgICAgICBGVF9VSW50ICAgICBjb3VudCA9IGdseXBoLT5udW1fdnNlZ21lbnRzOwoKCiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICB7CiAgICAgICAgICBBSF9TZWdtZW50ICBzZWcyID0gTlVMTDsKICAgICAgICAgIE5WX1BhdGggICAgIGxpbms7CiAgICAgICAgICBOVl9WZWN0b3IgICB2MSwgdjI7CgoKICAgICAgICAgIGlmICggc2VnLT5saW5rICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCBzZWctPmxpbmsgPiBzZWcgKQogICAgICAgICAgICAgIHNlZzIgPSBzZWctPmxpbms7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggc2VnLT5zZXJpZiApCiAgICAgICAgICAgIHNlZzIgPSBzZWctPnNlcmlmOwoKICAgICAgICAgIGlmICggc2VnMiApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnggPSBzZWctPmZpcnN0LT54ICAtIHBwMTsKICAgICAgICAgICAgdjIueCA9IHNlZzItPmZpcnN0LT54IC0gcHAxOwogICAgICAgICAgICB2MS55ID0gKCBzZWctPmZpcnN0LT55ICsgc2VnLT5sYXN0LT55ICkgLyAyOwogICAgICAgICAgICB2Mi55ID0gKCBzZWcyLT5maXJzdC0+eSArIHNlZzItPmxhc3QtPnkgKSAvIDI7CgogICAgICAgICAgICBsaW5rID0gYWhfbGlua19wYXRoKCAmdjEsICZ2MiwgMSApOwoKICAgICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmID8gU0VSSUZfTElOS19DT0xPUiA6IExJTktfQ09MT1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYgKTsKICAgICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZzaXplX3RyYW5zZm9ybSwgMCwgbGluayApOwoKICAgICAgICAgICAgbnZfcGF0aF9kZXN0cm95KCBsaW5rICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIG9wdGlvbl9zaG93X2hvcnpfaGludHMgJiYgb3B0aW9uX3Nob3dfbGlua3MgKQogICAgICB7CiAgICAgICAgQUhfU2VnbWVudCAgc2VnICAgPSBnbHlwaC0+aG9yel9zZWdtZW50czsKICAgICAgICBGVF9VSW50ICAgICBjb3VudCA9IGdseXBoLT5udW1faHNlZ21lbnRzOwoKCiAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICB7CiAgICAgICAgICBBSF9TZWdtZW50ICBzZWcyID0gTlVMTDsKICAgICAgICAgIE5WX1BhdGggICAgIGxpbms7CiAgICAgICAgICBOVl9WZWN0b3IgICB2MSwgdjI7CgoKICAgICAgICAgIGlmICggc2VnLT5saW5rICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCBzZWctPmxpbmsgPiBzZWcgKQogICAgICAgICAgICAgIHNlZzIgPSBzZWctPmxpbms7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggc2VnLT5zZXJpZiApCiAgICAgICAgICAgIHNlZzIgPSBzZWctPnNlcmlmOwoKICAgICAgICAgIGlmICggc2VnMiApCiAgICAgICAgICB7CiAgICAgICAgICAgIHYxLnkgPSBzZWctPmZpcnN0LT55OwogICAgICAgICAgICB2Mi55ID0gc2VnMi0+Zmlyc3QtPnk7CiAgICAgICAgICAgIHYxLnggPSAoIHNlZy0+Zmlyc3QtPnggKyBzZWctPmxhc3QtPnggKSAvIDIgLSBwcDE7CiAgICAgICAgICAgIHYyLnggPSAoIHNlZzItPmZpcnN0LT54ICsgc2VnMi0+bGFzdC0+eCApIC8gMiAtIHBwMTsKCiAgICAgICAgICAgIGxpbmsgPSBhaF9saW5rX3BhdGgoICZ2MSwgJnYyLCAwICk7CgogICAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYgPyBTRVJJRl9MSU5LX0NPTE9SIDogTElOS19DT0xPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiApOwogICAgICAgICAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgJnNpemVfdHJhbnNmb3JtLCAwLCBsaW5rICk7CgogICAgICAgICAgICBudl9wYXRoX2Rlc3Ryb3koIGxpbmsgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIE1BSU4gTE9PUChTKSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZApkcmF3X2dseXBoKCBpbnQgIGdseXBoX2luZGV4ICkKewogIE5WX1BhdGggICBwYXRoOwoKCiAgcHNoaW50X3ZlcnRpY2FsID0gLTE7CgogIHBzX2RlYnVnX2hpbnRfZnVuYyA9IG9wdGlvbl9zaG93X3BzX2hpbnRzID8gZHJhd19wc19oaW50IDogMDsKCiAgYWhfZGVidWdfaGludGVyID0gTlVMTDsKCiAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19CSVRNQVAgKTsKICBpZiAoIGVycm9yICkKICAgIFBhbmljKCAiY291bGQgbm90IGxvYWQgZ2x5cGgiICk7CgogIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCiAgICBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIG91dGxpbmUiICk7CgogIGVycm9yID0gbnZfcGF0aF9uZXdfZnJvbV9vdXRsaW5lKCByZW5kZXJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5WX091dGxpbmUqKSZmYWNlLT5nbHlwaC0+b3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemVfdHJhbnNmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCApOwogIGlmICggZXJyb3IgKQogICAgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIGdseXBoIHBhdGgiICk7CgogIC8qIHRyYWPpIGR1IGdseXBoZSBwbGVpbiAqLwogIGlmICggb3B0aW9uX3Nob3dfZ2x5cGggKQogIHsKICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCAweEZGNDA0MDgwLCAxMjggKTsKICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCAwLCAwLCBwYXRoICk7CiAgfQoKICBpZiAoIG9wdGlvbl9zaG93X3N0cm9rZSApCiAgewogICAgTlZfUGF0aCAgc3Ryb2tlOwoKCiAgICBlcnJvciA9IG52X3BhdGhfc3Ryb2tlKCBwYXRoLCAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudl9wYXRoX2xpbmVjYXBfYnV0dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52X3BhdGhfbGluZWpvaW5fbWl0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsICZzdHJva2UgKTsKICAgIGlmICggZXJyb3IgKQogICAgICBQYW5pYyggImNvdWxkIG5vdCBzdHJva2UgZ2x5cGggcGF0aCIgKTsKCiAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgMHhGRjAwMDA0MCwgMjU2ICk7CiAgICBudl9wYWludGVyX2ZpbGxfcGF0aCggcGFpbnRlciwgMCwgMCwgc3Ryb2tlICk7CgogICAgbnZfcGF0aF9kZXN0cm95KCBzdHJva2UgKTsKICB9CgogIC8qIHRyYWPpIGRlcyBwb2ludHMgZGUgY29udHJvbGUgKi8KICBpZiAoIG9wdGlvbl9zaG93X2RvdHMgKQogIHsKICAgIE5WX1BhdGggICAgIHBsb3Q7CiAgICBOVl9PdXRsaW5lICBvdXQ7CiAgICBOVl9TY2FsZSAgICByID0gMjsKICAgIE5WX0ludCAgICAgIG4sIGZpcnN0LCBsYXN0OwoKCiAgICBudl9wYXRoX2dldF9vdXRsaW5lKCBwYXRoLCBOVUxMLCBtZW1vcnksICZvdXQgKTsKCiAgICBmaXJzdCA9IDA7CiAgICBmb3IgKCBuID0gMDsgbiA8IG91dC5uX2NvbnRvdXJzOyBuKysgKQogICAgewogICAgICBpbnQgICAgICAgICAgICBtOwogICAgICBOVl9UcmFuc2Zvcm0gICB0cmFuczsKICAgICAgTlZfQ29sb3IgICAgICAgY29sb3I7CiAgICAgIE5WX1N1YlZlY3RvciogIHZlYzsKCgogICAgICBsYXN0ICA9IG91dC5jb250b3Vyc1tuXTsKCiAgICAgIGZvciAoIG0gPSBmaXJzdDsgbSA8PSBsYXN0OyBtKysgKQogICAgICB7CiAgICAgICAgY29sb3IgPSAob3V0LnRhZ3NbbV0gJiBGVF9DVVJWRV9UQUdfT04pCiAgICAgICAgICAgICAgPyBPTl9DT0xPUgogICAgICAgICAgICAgIDogT0ZGX0NPTE9SOwoKICAgICAgICB2ZWMgPSBvdXQucG9pbnRzICsgbTsKCiAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFucywgdmVjLT54IC8gNjQuMCwgdmVjLT55IC8gNjQuMCApOwoKICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgY29sb3IsIDI1NiApOwogICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCAmdHJhbnMsIDAsIHN5bWJvbF9kb3QgKTsKCiAgICAgICAgaWYgKCBvcHRpb25fc2hvd19pbmRpY2VzICkKICAgICAgICB7CiAgICAgICAgICBjaGFyICB0ZW1wWzVdOwoKCiAgICAgICAgICBzcHJpbnRmKCB0ZW1wLCAiJWQiLCBtICk7CiAgICAgICAgICBudl9waXhtYXBfY2VsbF90ZXh0KCB0YXJnZXQsIHZlYy0+eCAvIDY0ICsgNCwgdmVjLT55IC8gNjQgLSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgVEVYVF9DT0xPUiApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKICAgIH0KICB9CgogIGFoX2RyYXdfc21vb3RoX3BvaW50cygpOwogIGFoX2RyYXdfZWRnZXMoKTsKCiAgbnZfcGF0aF9kZXN0cm95KCBwYXRoICk7CgogIC8qIGF1dHJlIGluZm9zICovCiAgewogICAgY2hhciAgdGVtcFsxMDI0XTsKICAgIGNoYXIgIHRlbXAyWzY0XTsKCgogICAgc3ByaW50ZiggdGVtcCwgImZvbnQgbmFtZSA6ICVzICglcykiLCBmYWNlLT5mYW1pbHlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c3R5bGVfbmFtZSApOwogICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCAwLCB0ZW1wLCBURVhUX0NPTE9SICk7CgogICAgRlRfR2V0X0dseXBoX05hbWUoIGZhY2UsIGdseXBoX2luZGV4LCB0ZW1wMiwgNjMgKTsKICAgIHRlbXAyWzYzXSA9IDA7CgogICAgc3ByaW50ZiggdGVtcCwgImdseXBoICU0ZDogJXMiLCBnbHlwaF9pbmRleCwgdGVtcDIgKTsKICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgMCwgOCwgdGVtcCwgVEVYVF9DT0xPUiApOwoKICAgIGlmICggdGVtcF9tZXNzYWdlWzBdICkKICAgIHsKICAgICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCAxNiwgdGVtcF9tZXNzYWdlLCBURVhUX0NPTE9SICk7CiAgICAgIHRlbXBfbWVzc2FnZVswXSA9IDA7CiAgICB9CiAgfQp9CgoKI2RlZmluZSAgVE9HR0xFX09QVElPTih2YXIscHJlZml4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB2YXIgPSAhdmFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsIHByZWZpeCAiIGlzIG5vdyAlcyIsICAgIFwKICAgICAgICAgICAgICAgICAgICAgICB2YXIgPyAib24iIDogIm9mZiIgKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgd2hpbGUoKQoKCiNkZWZpbmUgIFRPR0dMRV9PUFRJT05fTkVHKHZhcixwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgdmFyID0gIXZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgc3ByaW50ZiggdGVtcF9tZXNzYWdlLCBwcmVmaXggIiBpcyBub3cgJXMiLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIXZhciA/ICJvbiIgOiAib2ZmIiApOyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHdoaWxlCgoKc3RhdGljIHZvaWQKaGFuZGxlX2V2ZW50KCBOVlZfRXZlbnRSZWMqICBldiApCnsKICBzd2l0Y2ggKCBldi0+a2V5ICkKICB7CiAgY2FzZSBOVlZfS2V5X0xlZnQ6CiAgICBpZiAoIGdseXBoX2luZGV4ID4gMCApCiAgICAgIGdseXBoX2luZGV4LS07CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS2V5X1JpZ2h0OgogICAgaWYgKCBnbHlwaF9pbmRleCArIDEgPCBmYWNlLT5udW1fZ2x5cGhzICkKICAgICAgZ2x5cGhfaW5kZXgrKzsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICd4JyApOgogICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfYXhpcywgImdyaWQgYXhpcyBkaXNwbGF5IiApOwogICAgYnJlYWs7CgogIGNhc2UgTlZWX0tFWSggJ3MnICk6CiAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19zdHJva2UsICJnbHlwaCBzdHJva2UgZGlzcGxheSIgKTsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICdnJyApOgogICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfZ2x5cGgsICJnbHlwaCBmaWxsIGRpc3BsYXkiICk7CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS0VZKCAnZCcgKToKICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2RvdHMsICJjb250cm9sIHBvaW50cyBkaXNwbGF5IiApOwogICAgYnJlYWsKCiAgY2FzZSBOVlZfS0VZKCAnZScgKToKICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2VtLCAiRU0gc3F1YXJlIGRpc3BsYXkiICk7CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS0VZKCAnKycgKToKICAgIGdyaWRfc2NhbGUgKj0gMS4yOwogICAgcmVzZXRfc2NhbGUoIGdyaWRfc2NhbGUgKTsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICctJyApOgogICAgaWYgKCBncmlkX3NjYWxlID4gMC4zICkKICAgIHsKICAgICAgZ3JpZF9zY2FsZSAvPSAxLjI7CiAgICAgIHJlc2V0X3NjYWxlKCBncmlkX3NjYWxlICk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS2V5X1VwOgogICAgcGl4ZWxfc2l6ZSsrOwogICAgcmVzZXRfc2l6ZSggcGl4ZWxfc2l6ZSwgZ3JpZF9zY2FsZSApOwogICAgc3ByaW50ZiggdGVtcF9tZXNzYWdlLCAicGl4ZWwgc2l6ZSA9ICVkIiwgcGl4ZWxfc2l6ZSApOwogICAgYnJlYWs7CgogIGNhc2UgTlZWX0tleV9Eb3duOgogICAgaWYgKCBwaXhlbF9zaXplID4gMSApCiAgICB7CiAgICAgIHBpeGVsX3NpemUtLTsKICAgICAgcmVzZXRfc2l6ZSggcGl4ZWxfc2l6ZSwgZ3JpZF9zY2FsZSApOwogICAgICBzcHJpbnRmKCB0ZW1wX21lc3NhZ2UsICJwaXhlbCBzaXplID0gJWQiLCBwaXhlbF9zaXplICk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS0VZKCAneicgKToKICAgIFRPR0dMRV9PUFRJT05fTkVHKCBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzLCAidmVydGljYWwgaGludHMgcHJvY2Vzc2luZyIgKTsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICdhJyApOgogICAgVE9HR0xFX09QVElPTl9ORUcoIHBzX2RlYnVnX25vX2hvcnpfaGludHMsICJob3Jpem9udGFsIGhpbnRzIHByb2Nlc3NpbmciICk7CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS0VZKCAnWicgKToKICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X3ZlcnRfaGludHMsICJ2ZXJ0aWNhbCBoaW50cyBkaXNwbGF5IiApOwogICAgYnJlYWs7CgogIGNhc2UgTlZWX0tFWSggJ0EnICk6CiAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzLCAiaG9yaXpvbnRhbCBoaW50cyBkaXNwbGF5IiApOwogICAgYnJlYWs7CgogIGNhc2UgTlZWX0tFWSggJ1MnICk6CiAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19zbW9vdGgsICJzbW9vdGggcG9pbnRzIGRpc3BsYXkiICk7CiAgICBicmVhazsKCiAgY2FzZSBOVlZfS0VZKCAnaScgKToKICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2luZGljZXMsICJwb2ludCBpbmRleCBkaXNwbGF5IiApOwogICAgYnJlYWs7CgogIGNhc2UgTlZWX0tFWSggJ2InICk6CiAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19ibHVlcywgImJsdWUgem9uZXMgZGlzcGxheSIgKTsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICdoJyApOgogICAgcHNfZGVidWdfbm9faG9yel9oaW50cyA9IG9wdGlvbl9oaW50aW5nOwogICAgcHNfZGVidWdfbm9fdmVydF9oaW50cyA9IG9wdGlvbl9oaW50aW5nOwoKICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9oaW50aW5nLCAiaGludGluZyIgKTsKICAgIGJyZWFrOwoKICBjYXNlIE5WVl9LRVkoICdIJyApOgogICAgcHNfcHJpbnRfaGludHMoKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgOwogIH0KfQoKCnN0YXRpYyB2b2lkCnVzYWdlKCkKewogIFBhbmljKCAibm8gdXNhZ2UiICk7Cn0KCgojZGVmaW5lICBPUFRJT04xKG4sY29kZSkgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgIFwKICAgICAgICAgICAgIGNvZGUgICAgICAgICAgXAogICAgICAgICAgICAgYXJnYy0tOyAgICAgICBcCiAgICAgICAgICAgICBhcmd2Kys7ICAgICAgIFwKICAgICAgICAgICAgIGJyZWFrOwoKI2RlZmluZSAgT1BUSU9OMihuLGNvZGUpICAgICBcCiAgICAgICAgICAgY2FzZSBuIDogICAgICAgICAgXAogICAgICAgICAgICAgY29kZSAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFyZ2MgLT0gMjsgICAgICBcCiAgICAgICAgICAgICBhcmd2ICs9IDI7ICAgICAgXAogICAgICAgICAgICAgYnJlYWs7CgoKc3RhdGljIHZvaWQKcGFyc2Vfb3B0aW9ucyggaW50KiAgICAgYXJnY19wLAogICAgICAgICAgICAgICBjaGFyKioqICBhcmd2X3AgKQp7CiAgaW50ICAgICBhcmdjID0gKmFyZ2NfcDsKICBjaGFyKiogIGFyZ3YgPSAqYXJndl9wOwoKCiAgd2hpbGUgKCBhcmdjID4gMiAmJiBhcmd2WzFdWzBdID09ICctJyApCiAgewogICAgc3dpdGNoICggYXJndlsxXVsxXSApCiAgICB7CiAgICAgIE9QVElPTjIoICdmJywgZmlyc3RfZ2x5cGggPSBhdG9pKCBhcmd2WzJdICk7ICkKCiAgICAgIE9QVElPTjIoICdzJywgcGl4ZWxfc2l6ZSA9IGF0b2koIGFyZ3ZbMl0gKTsgKQoKICAgICAgZGVmYXVsdDoKICAgICAgICB1c2FnZSgpOwogICAgfQogIH0KCiAgKmFyZ2NfcCA9IGFyZ2M7CiAgKmFyZ3ZfcCA9IGFyZ3Y7Cn0KCgppbnQKbWFpbiggaW50ICAgICBhcmdjLAogICAgICBjaGFyKiogIGFyZ3YgKQp7CiAgY2hhciogIGZpbGVuYW1lID0gIi93aW5udC9mb250cy9hcmlhbC50dGYiOwoKCiAgcGFyc2Vfb3B0aW9ucyggJmFyZ2MsICZhcmd2ICk7CgogIGlmICggYXJnYyA+PSAyICkKICAgIGZpbGVuYW1lID0gYXJndlsxXTsKCgogIC8qIGNyZWF0ZSBsaWJyYXJ5ICovCiAgZXJyb3IgPSBudl9yZW5kZXJlcl9uZXcoIDAsICZyZW5kZXJlciApOwogIGlmICggZXJyb3IgKQogICAgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIE5pcnZhbmEgcmVuZGVyZXIiICk7CgogIG1lbW9yeSA9IG52X3JlbmRlcmVyX2dldF9tZW1vcnkoIHJlbmRlcmVyICk7CiAgaW5pdF9zeW1ib2xzKCk7CgogIGVycm9yID0gbnZ2X2Rpc3BsYXlfbmV3KCByZW5kZXJlciwgJmRpc3BsYXkgKTsKICBpZiAoIGVycm9yICkKICAgIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBkaXNwbGF5IiApOwoKICBlcnJvciA9IG52dl9zdXJmYWNlX25ldyggZGlzcGxheSwgNDYwLCA0NjAsIG52X3BpeG1hcF90eXBlX2FyZ2IsICZzdXJmYWNlICk7CiAgaWYgKCBlcnJvciApCiAgICBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgc3VyZmFjZSIgKTsKCiAgdGFyZ2V0ID0gbnZ2X3N1cmZhY2VfZ2V0X3BpeG1hcCggc3VyZmFjZSApOwoKICBlcnJvciA9IG52X3BhaW50ZXJfbmV3KCByZW5kZXJlciwgJnBhaW50ZXIgKTsKICBpZiAoIGVycm9yICkKICAgIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBwYWludGVyIiApOwoKICBudl9wYWludGVyX3NldF90YXJnZXQoIHBhaW50ZXIsIHRhcmdldCApOwoKICBjbGVhcl9iYWNrZ3JvdW5kKCk7CgogIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSggJmZyZWV0eXBlICk7CiAgaWYgKCBlcnJvciApCiAgICBQYW5pYyggImNvdWxkIG5vdCBpbml0aWFsaXplIEZyZWVUeXBlIiApOwoKICBlcnJvciA9IEZUX05ld19GYWNlKCBmcmVldHlwZSwgZmlsZW5hbWUsIDAsICZmYWNlICk7CiAgaWYgKCBlcnJvciApCiAgICBQYW5pYyggImNvdWxkIG5vdCBvcGVuIGZvbnQgZmFjZSIgKTsKCiAgcmVzZXRfc2l6ZSggcGl4ZWxfc2l6ZSwgZ3JpZF9zY2FsZSApOwoKICBudnZfc3VyZmFjZV9zZXRfdGl0bGUoIHN1cmZhY2UsICJGcmVlVHlwZSBHbHlwaCBWaWV3ZXIiICk7CgogIHsKICAgIE5WVl9FdmVudFJlYyAgZXZlbnQ7CgoKICAgIGdseXBoX2luZGV4ID0gZmlyc3RfZ2x5cGg7CiAgICBmb3IgKCA7OyApCiAgICB7CiAgICAgIGNsZWFyX2JhY2tncm91bmQoKTsKICAgICAgZHJhd19ncmlkKCk7CgogICAgICBwc19kZWJ1Z19oaW50cyAgPSAwOwogICAgICBhaF9kZWJ1Z19oaW50ZXIgPSAwOwoKICAgICAgYWhfZGVidWdfZGlzYWJsZV92ZXJ0ID0gcHNfZGVidWdfbm9fdmVydF9oaW50czsKICAgICAgYWhfZGVidWdfZGlzYWJsZV9ob3J6ID0gcHNfZGVidWdfbm9faG9yel9oaW50czsKCiAgICAgIGRyYXdfcHNfYmx1ZV96b25lcygpOwogICAgICBkcmF3X2dseXBoKCBnbHlwaF9pbmRleCApOwogICAgICBwc19kcmF3X2NvbnRyb2xfcG9pbnRzKCk7CgogICAgICBudnZfc3VyZmFjZV9yZWZyZXNoKCBzdXJmYWNlLCBOVUxMICk7CgogICAgICBudnZfc3VyZmFjZV9saXN0ZW4oIHN1cmZhY2UsIDAsICZldmVudCApOwogICAgICBpZiAoIGV2ZW50LmtleSA9PSBOVlZfS2V5X0VzYyApCiAgICAgICAgYnJlYWs7CgogICAgICBoYW5kbGVfZXZlbnQoICZldmVudCApOwogICAgICBzd2l0Y2ggKCBldmVudC5rZXkgKQogICAgICB7CiAgICAgIGNhc2UgTlZWX0tleV9Fc2M6CiAgICAgICAgZ290byBFeGl0OwoKICAgICAgZGVmYXVsdDoKICAgICAgICA7CiAgICAgIH0KICAgIH0KICB9CgpFeGl0OgogIC8qIHdhaXQgZm9yIGVzY2FwZSAqLwoKICAvKiBkZXN0cm95IGRpc3BsYXkgKGFuZCBzdXJmYWNlKSAqLwogIG52dl9kaXNwbGF5X3VucmVmKCBkaXNwbGF5ICk7CgogIGRvbmVfc3ltYm9scygpOwogIG52X3JlbmRlcmVyX3VucmVmKCByZW5kZXJlciApOwoKICByZXR1cm4gMDsKfQo=