LyogRGlyZWN0M0QgRXhlY3V0ZUJ1ZmZlcgogKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVUxNRVIKICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQ2hyaXN0aWFuIENvc3RhCiAqIENvcHlyaWdodCAoYykgMjAwNiAgICAgIFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCiNpbmNsdWRlICJleGNwdC5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBfZHVtcF9leGVjdXRlZGF0YQogKiBfZHVtcF9EM0RFWEVDVVRFQlVGRkVSREVTQwogKgogKiBEZWJ1ZyBmdW5jdGlvbnMgd2hpY2ggd3JpdGUgdGhlIGV4ZWN1dGVidWZmZXIgZGF0YSB0byB0aGUgY29uc29sZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBfZHVtcF9leGVjdXRlZGF0YShMUEQzREVYRUNVVEVEQVRBIGxwRGF0YSkgewogICAgRFBSSU5URigiZHdTaXplIDogJWRcbiIsIGxwRGF0YS0+ZHdTaXplKTsKICAgIERQUklOVEYoIlZlcnRleCAgICAgIE9mZnNldCA6ICVkICBDb3VudCAgOiAlZFxuIiwgbHBEYXRhLT5kd1ZlcnRleE9mZnNldCwgbHBEYXRhLT5kd1ZlcnRleENvdW50KTsKICAgIERQUklOVEYoIkluc3RydWN0aW9uIE9mZnNldCA6ICVkICBMZW5ndGggOiAlZFxuIiwgbHBEYXRhLT5kd0luc3RydWN0aW9uT2Zmc2V0LCBscERhdGEtPmR3SW5zdHJ1Y3Rpb25MZW5ndGgpOwogICAgRFBSSU5URigiSFZlcnRleCAgICAgT2Zmc2V0IDogJWRcbiIsIGxwRGF0YS0+ZHdIVmVydGV4T2Zmc2V0KTsKfQoKc3RhdGljIHZvaWQgX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MoTFBEM0RFWEVDVVRFQlVGRkVSREVTQyBscERlc2MpIHsKICAgIERQUklOVEYoImR3U2l6ZSAgICAgICA6ICVkXG4iLCBscERlc2MtPmR3U2l6ZSk7CiAgICBEUFJJTlRGKCJkd0ZsYWdzICAgICAgOiAleFxuIiwgbHBEZXNjLT5kd0ZsYWdzKTsKICAgIERQUklOVEYoImR3Q2FwcyAgICAgICA6ICV4XG4iLCBscERlc2MtPmR3Q2Fwcyk7CiAgICBEUFJJTlRGKCJkd0J1ZmZlclNpemUgOiAlZFxuIiwgbHBEZXNjLT5kd0J1ZmZlclNpemUpOwogICAgRFBSSU5URigibHBEYXRhICAgICAgIDogJXBcbiIsIGxwRGVzYy0+bHBEYXRhKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUKICoKICogVGhlIG1haW4gZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXhlY3V0ZSBidWZmZXIKICogSXQgdHJhbnNmb3JtcyB0aGUgdmVydGljZXMgaWYgbmVjZXNzYXJ5LCBhbmQgY2FsbHMgSURpcmVjdDNERGV2aWNlNwogKiBmb3IgZHJhd2luZyB0aGUgdmVydGljZXMuIEl0IGlzIGNhbGxlZCBmcm9tCiAqIElEaXJlY3QzRERldmljZTo6RXhlY3V0ZQogKgogKiBUT0RPOiBQZXJoYXBzIHNvbWUgY29tbWVudHMgYWJvdXQgdGhlIHZhcmlvdXMgb3Bjb2RlcyB3b3VsZG4ndCBodXJ0CiAqCiAqIERvbid0IGRlY2xhcmUgdGhpcyBzdGF0aWMsIGFzIGl0J3MgY2FsbGVkIGZyb20gZGV2aWNlLmMsCiAqIElEaXJlY3QzRERldmljZTo6RXhlY3V0ZQogKgogKiBQYXJhbXM6CiAqICBEZXZpY2U6IDNEIERldmljZSBhc3NvY2lhdGVkIHRvIHVzZSBmb3IgZHJhd2luZwogKiAgVmlld3BvcnQ6IFZpZXdwb3J0IGZvciB0aGlzIG9wZXJhdGlvbgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfRXhlY3V0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpscERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RWaWV3cG9ydEltcGwgKmxwVmlld3BvcnQpCnsKICAgIC8qIERXT1JEIGJzID0gVGhpcy0+ZGVzYy5kd0J1ZmZlclNpemU7ICovCiAgICBEV09SRCB2cyA9IFRoaXMtPmRhdGEuZHdWZXJ0ZXhPZmZzZXQ7CiAgICAvKiBEV09SRCB2YyA9IFRoaXMtPmRhdGEuZHdWZXJ0ZXhDb3VudDsgKi8KICAgIERXT1JEIGlzID0gVGhpcy0+ZGF0YS5kd0luc3RydWN0aW9uT2Zmc2V0OwogICAgLyogRFdPUkQgaWwgPSBUaGlzLT5kYXRhLmR3SW5zdHJ1Y3Rpb25MZW5ndGg7ICovCgogICAgY2hhciAqaW5zdHIgPSAoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgaXM7CgogICAgLyogU2hvdWxkIGNoZWNrIGlmIHRoZSB2aWV3cG9ydCB3YXMgYWRkZWQgb3Igbm90IHRvIHRoZSBkZXZpY2UgKi8KCiAgICAvKiBBY3RpdmF0ZSB0aGUgdmlld3BvcnQgKi8KICAgIGxwVmlld3BvcnQtPmFjdGl2ZV9kZXZpY2UgPSBscERldmljZTsKICAgIGxwVmlld3BvcnQtPmFjdGl2YXRlKGxwVmlld3BvcnQpOwoKICAgIFRSQUNFKCJFeGVjdXRlRGF0YSA6XG4iKTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkKICAgICAgX2R1bXBfZXhlY3V0ZWRhdGEoJihUaGlzLT5kYXRhKSk7CgogICAgd2hpbGUgKDEpIHsKICAgICAgICBMUEQzRElOU1RSVUNUSU9OIGN1cnJlbnQgPSAoTFBEM0RJTlNUUlVDVElPTikgaW5zdHI7CglCWVRFIHNpemU7CglXT1JEIGNvdW50OwoJCgljb3VudCA9IGN1cnJlbnQtPndDb3VudDsKCXNpemUgPSBjdXJyZW50LT5iU2l6ZTsKCWluc3RyICs9IHNpemVvZihEM0RJTlNUUlVDVElPTik7CgkKCXN3aXRjaCAoY3VycmVudC0+Yk9wY29kZSkgewoJICAgIGNhc2UgRDNET1BfUE9JTlQ6IHsKCSAgICAgICAgV0FSTigiUE9JTlQtcyAgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfTElORTogewoJICAgICAgICBXQVJOKCJMSU5FLXMgICAgICAgICAgICglZClcbiIsIGNvdW50KTsKCQlpbnN0ciArPSBjb3VudCAqIHNpemU7CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9UUklBTkdMRTogewoJICAgICAgICBpbnQgaTsKCQlEM0RUTFZFUlRFWCAqdGxfdnggPSAoRDNEVExWRVJURVggKikgVGhpcy0+dmVydGV4X2RhdGE7CgkJVFJBQ0UoIlRSSUFOR0xFICAgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCQoJCWlmIChjb3VudCozPlRoaXMtPm5iX2luZGljZXMpIHsKCQkgICAgVGhpcy0+bmJfaW5kaWNlcyA9IGNvdW50ICogMzsKICAgICAgICAgICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+aW5kaWNlcyk7CgkJICAgIFRoaXMtPmluZGljZXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihXT1JEKSpUaGlzLT5uYl9pbmRpY2VzKTsKCQl9CgkJCQoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgTFBEM0RUUklBTkdMRSBjaSA9IChMUEQzRFRSSUFOR0xFKSBpbnN0cjsKCQkgICAgVFJBQ0VfKGQzZDcpKCIgIHYxOiAlZCAgdjI6ICVkICB2MzogJWRcbiIsY2ktPnUxLnYxLCBjaS0+dTIudjIsIGNpLT51My52Myk7CgkJICAgIFRSQUNFXyhkM2Q3KSgiICBGbGFncyA6ICIpOwoJCSAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKCQkJLyogV2lyZWZyYW1lICovCgkJCWlmIChjaS0+d0ZsYWdzICYgRDNEVFJJRkxBR19FREdFRU5BQkxFMSkKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIkVER0VFTkFCTEUxICIpOwoJICAgIAkJaWYgKGNpLT53RmxhZ3MgJiBEM0RUUklGTEFHX0VER0VFTkFCTEUyKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRURHRUVOQUJMRTIgIik7CgkgICAgCQlpZiAoY2ktPndGbGFncyAmIEQzRFRSSUZMQUdfRURHRUVOQUJMRTEpCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJFREdFRU5BQkxFMyAiKTsKCSAgICAJCS8qIFN0cmlwcyAvIEZhbnMgKi8KCSAgICAJCWlmIChjaS0+d0ZsYWdzID09IEQzRFRSSUZMQUdfRVZFTikKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIkVWRU4gIik7CgkgICAgCQlpZiAoY2ktPndGbGFncyA9PSBEM0RUUklGTEFHX09ERCkKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIk9ERCAiKTsKCSAgICAJCWlmIChjaS0+d0ZsYWdzID09IEQzRFRSSUZMQUdfU1RBUlQpCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJTVEFSVCAiKTsKCSAgICAJCWlmICgoY2ktPndGbGFncyA+IDApICYmIChjaS0+d0ZsYWdzIDwgMzApKQoJICAgICAgIAkJICAgIFRSQUNFXyhkM2Q3KSgiU1RBUlRGTEFUKCVkKSAiLCBjaS0+d0ZsYWdzKTsKCSAgICAJCVRSQUNFXyhkM2Q3KSgiXG4iKTsKICAgICAgICAJICAgIH0KCQkgICAgVGhpcy0+aW5kaWNlc1soaSAqIDMpICAgIF0gPSBjaS0+dTEudjE7CgkJICAgIFRoaXMtPmluZGljZXNbKGkgKiAzKSArIDFdID0gY2ktPnUyLnYyOwoJCSAgICBUaGlzLT5pbmRpY2VzWyhpICogMykgKyAyXSA9IGNpLT51My52MzsKICAgICAgICAgICAgICAgICAgICBpbnN0ciArPSBzaXplOwoJCX0KICAgICAgICAgICAgICAgIC8qIElEaXJlY3QzRERldmljZXMgaGF2ZSBjb2xvciBrZXlpbmcgYWx3YXlzIGVuYWJsZWQgLQogICAgICAgICAgICAgICAgICogZW5hYmxlIGl0IGJlZm9yZSBkcmF3aW5nLiBUaGlzIG92ZXJ3cml0ZXMgYW55IEFMUEhBKgogICAgICAgICAgICAgICAgICogcmVuZGVyIHN0YXRlCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGxwRGV2aWNlLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICBJRGlyZWN0M0REZXZpY2U3X0RyYXdJbmRleGVkUHJpbWl0aXZlKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLElEaXJlY3QzRERldmljZTcpLAoJCQkJICAgICAgICAgICAgICAgICAgICAgIEQzRFBUX1RSSUFOR0xFTElTVCxEM0RGVkZfVExWRVJURVgsdGxfdngsMCxUaGlzLT5pbmRpY2VzLGNvdW50KjMsMCk7CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9NQVRSSVhMT0FEOgoJICAgICAgICBXQVJOKCJNQVRSSVhMT0FELXMgICAgICglZClcbiIsIGNvdW50KTsKCSAgICAgICAgaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgICAgICBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9NQVRSSVhNVUxUSVBMWTogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiTUFUUklYTVVMVElQTFkgICAoJWQpXG4iLCBjb3VudCk7CgkJCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RNQVRSSVhNVUxUSVBMWSBjaSA9IChMUEQzRE1BVFJJWE1VTFRJUExZKSBpbnN0cjsKICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVFJJWCBhLCBiLCBjOwoKICAgICAgICAgICAgICAgICAgICBpZighY2ktPmhEZXN0TWF0cml4IHx8IGNpLT5oRGVzdE1hdHJpeCA+IGxwRGV2aWNlLT5udW1IYW5kbGVzIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIWNpLT5oU3JjTWF0cml4MSB8fCBjaS0+aFNyY01hdHJpeDEgPiBscERldmljZS0+bnVtSGFuZGxlcyB8fAogICAgICAgICAgICAgICAgICAgICAgICFjaS0+aFNyY01hdHJpeDIgfHwgY2ktPmhTcmNNYXRyaXgyID4gbHBEZXZpY2UtPm51bUhhbmRsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJIYW5kbGVzIG91dCBvZiBib3VuZHNcbiIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhEZXN0TWF0cml4IC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRyaXggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oU3JjTWF0cml4MSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscERldmljZS0+SGFuZGxlc1tjaS0+aFNyY01hdHJpeDIgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdHJpeCkgewogICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkhhbmRsZSB0eXBlcyBpbnZhbGlkXG4iKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhID0gKExQRDNETUFUUklYKSBscERldmljZS0+SGFuZGxlc1tjaS0+aERlc3RNYXRyaXggLSAxXS5wdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTFBEM0RNQVRSSVgpIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oU3JjTWF0cml4MSAtIDFdLnB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChMUEQzRE1BVFJJWCkgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhTcmNNYXRyaXgyIC0gMV0ucHRyOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiICBEZXN0IDogJXAgIFNyYzEgOiAlcCAgU3JjMiA6ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5X21hdHJpeChhLGMsYik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NUQVRFVFJBTlNGT1JNOiB7CgkgICAgICAgIGludCBpOwoJCVRSQUNFKCJTVEFURVRSQU5TRk9STSAgICglZClcbiIsIGNvdW50KTsKCQkKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCSAgICBMUEQzRFNUQVRFIGNpID0gKExQRDNEU1RBVEUpIGluc3RyOwoKICAgICAgICAgICAgICAgICAgICBpZighY2ktPnUyLmR3QXJnWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiU2V0dGluZyBhIE5VTEwgbWF0cml4IGhhbmRsZSwgd2hhdCBzaG91bGQgSSBkbz9cbiIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjaS0+dTIuZHdBcmdbMF0gPiBscERldmljZS0+bnVtSGFuZGxlcykgewogICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkhhbmRsZSAlZCBpcyBvdXQgb2YgYm91bmRzXG4iLCBjaS0+dTIuZHdBcmdbMF0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihscERldmljZS0+SGFuZGxlc1tjaS0+dTIuZHdBcmdbMF0gLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdHJpeCkgewogICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkhhbmRsZSAlZCBpcyBub3QgYSBtYXRyaXggaGFuZGxlXG4iLCBjaS0+dTIuZHdBcmdbMF0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUsIChMUEQzRE1BVFJJWCkgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPnUyLmR3QXJnWzBdIC0gMV0ucHRyKTsKICAgICAgICAgICAgICAgICAgICB9CgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfU1RBVEVMSUdIVDogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU1RBVEVMSUdIVCAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFURSBjaSA9IChMUEQzRFNUQVRFKSBpbnN0cjsKCiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiglMDh4LCUwOHgpXG4iLGNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUsIGNpLT51Mi5kd0FyZ1swXSk7CgoJCSAgICBpZiAoIWNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUgJiYgKGNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkKCQkJRVJSKCJVbmV4cGVjdGVkIExpZ2h0IFN0YXRlIFR5cGVcbiIpOwoJCSAgICBlbHNlIGlmIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfTUFURVJJQUwgLyogMSAqLykgewoJCQlJRGlyZWN0M0RNYXRlcmlhbEltcGwgKm1hdCA9IChJRGlyZWN0M0RNYXRlcmlhbEltcGwgKikgY2ktPnUyLmR3QXJnWzBdOwoKCQkJaWYgKG1hdCAhPSBOVUxMKSB7CgkJCSAgICBtYXQtPmFjdGl2YXRlKG1hdCk7CgkJCX0gZWxzZSB7CgkJCSAgICBGSVhNRSgiIEQzRExJR0hUU1RBVEVfTUFURVJJQUwgY2FsbGVkIHdpdGggTlVMTCBtYXRlcmlhbCAhISFcbiIpOwoJCQl9CgkJICAgIH0KCQkgICBlbHNlIGlmIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfQ09MT1JNT0RFTCAvKiAzICovKSB7CgkJCXN3aXRjaCAoY2ktPnUyLmR3QXJnWzBdKSB7CgkJCSAgICBjYXNlIEQzRENPTE9SX01PTk86CgkJCSAgICAgICBFUlIoIkREQ09MT1JfTU9OTyBzaG91bGQgbm90IGhhcHBlbiFcbiIpOwoJCQkgICAgICAgYnJlYWs7CgkJCSAgICBjYXNlIEQzRENPTE9SX1JHQjoKCQkJICAgICAgIC8qIFdlIGFyZSBhbHJlYWR5IGluIHRoaXMgbW9kZSAqLwoJCQkgICAgICAgYnJlYWs7CgkJCSAgICBkZWZhdWx0OgoJCSAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBjb2xvciBtb2RlbCFcbiIpOwoJCQl9CgkJICAgIH0gZWxzZSB7CgkJICAgIAlEM0RSRU5ERVJTVEFURVRZUEUgcnMgPSAwOwoJCSAgICAJc3dpdGNoIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlKSB7CgoJCSAgICAJICAgIGNhc2UgRDNETElHSFRTVEFURV9BTUJJRU5UOiAgICAgICAvKiAyICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7CgkJCQlicmVhazsJCQoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR01PREU6ICAgICAgIC8qIDQgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HVkVSVEVYTU9ERTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR1NUQVJUOiAgICAgIC8qIDUgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7CgkJCQlicmVhazsKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dFTkQ6ICAgICAgICAvKiA2ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR0RFTlNJVFk6ICAgIC8qIDcgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HREVOU0lUWTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYOiAgIC8qIDggKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7CgkJCQlicmVhazsKCQkJICAgIGRlZmF1bHQ6CgkJCQlicmVhazsKCQkJfQoJCQkKCQkgICAgICAgIElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoSUNPTV9JTlRFUkZBQ0UobHBEZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJzLGNpLT51Mi5kd0FyZ1swXSk7CgkJICAgfQoKCQkgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NUQVRFUkVOREVSOiB7CgkgICAgICAgIGludCBpOwoJCVRSQUNFKCJTVEFURVJFTkRFUiAgICAgICglZClcbiIsIGNvdW50KTsKCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFURSBjaSA9IChMUEQzRFNUQVRFKSBpbnN0cjsKCQkgICAgCgkJICAgIElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoSUNPTV9JTlRFUkZBQ0UobHBEZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAoJCQkJCQkgICAgY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUsIGNpLT51Mi5kd0FyZ1swXSk7CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBEM0RPUF9QUk9DRVNTVkVSVElDRVM6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFRPRE86IFNoYXJlIGNvZGUgd2l0aCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlByb2Nlc3NWZXJ0aWNlcyBhbmQgLyBvcgogICAgICAgICAgICAgICAgICogSVdpbmVEM0REZXZpY2U6OlByb2Nlc3NWZXJ0aWNlcwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgIEQzRE1BVFJJWCB2aWV3X21hdCwgd29ybGRfbWF0LCBwcm9qX21hdDsKICAgICAgICAgICAgICAgIFRSQUNFKCJQUk9DRVNTVkVSVElDRVMgICglZClcbiIsIGNvdW50KTsKCiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHRyYW5zZm9ybSBhbmQgd29ybGQgbWF0cml4ICovCiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEM0RNQVRSSVggaXMgY29tcGF0aWJsZSB3aXRoIFdJTkVEM0RNQVRSSVggKi8KCiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVfVklFVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRE1BVFJJWCopICZ2aWV3X21hdCk7CgogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKGxwRGV2aWNlLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1BST0pFQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTkVEM0RNQVRSSVgqKSAmcHJval9tYXQpOwoKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX0dldFRyYW5zZm9ybShscERldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRE1BVFJJWCopICZ3b3JsZF9tYXQpOwoKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCSAgICBMUEQzRFBST0NFU1NWRVJUSUNFUyBjaSA9IChMUEQzRFBST0NFU1NWRVJUSUNFUykgaW5zdHI7CgogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIgIFN0YXJ0IDogJWQgRGVzdCA6ICVkIENvdW50IDogJWRcbiIsCgkJCSAgY2ktPndTdGFydCwgY2ktPndEZXN0LCBjaS0+ZHdDb3VudCk7CgkJICAgIFRSQUNFKCIgIEZsYWdzIDogIik7CgkJICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewoJCSAgICAgICAgaWYgKGNpLT5kd0ZsYWdzICYgRDNEUFJPQ0VTU1ZFUlRJQ0VTX0NPUFkpCgkJCSAgICBUUkFDRSgiQ09QWSAiKTsKCQkJaWYgKGNpLT5kd0ZsYWdzICYgRDNEUFJPQ0VTU1ZFUlRJQ0VTX05PQ09MT1IpCgkJCSAgICBUUkFDRSgiTk9DT0xPUiAiKTsKCQkJaWYgKGNpLT5kd0ZsYWdzID09IEQzRFBST0NFU1NWRVJUSUNFU19PUE1BU0spCgkJCSAgICBUUkFDRSgiT1BNQVNLICIpOwoJCQlpZiAoY2ktPmR3RmxhZ3MgJiBEM0RQUk9DRVNTVkVSVElDRVNfVFJBTlNGT1JNKQoJCQkgICAgVFJBQ0UoIlRSQU5TRk9STSAiKTsKCQkJaWYgKGNpLT5kd0ZsYWdzID09IEQzRFBST0NFU1NWRVJUSUNFU19UUkFOU0ZPUk1MSUdIVCkKCQkJICAgIFRSQUNFKCJUUkFOU0ZPUk1MSUdIVCAiKTsKCQkJaWYgKGNpLT5kd0ZsYWdzICYgRDNEUFJPQ0VTU1ZFUlRJQ0VTX1VQREFURUVYVEVOVFMpCgkJCSAgICBUUkFDRSgiVVBEQVRFRVhURU5UUyAiKTsKCQkJVFJBQ0UoIlxuIik7CgkJICAgIH0KCQkgICAgCgkJICAgIC8qIFRoaXMgaXMgd2hlcmUgZG9pbmcgRGlyZWN0M0Qgb24gdG9wIG9uIE9wZW5HTCBpcyBxdWl0ZSBkaWZmaWN1bHQuCgkJICAgICAgIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYSBzZXQgb2YgdmVydGljZXMgdXNpbmcgdGhlIENVUlJFTlQgc3RhdGUKCQkgICAgICAgKGxpZ2h0aW5nLCBwcm9qZWN0aW9uLCAuLi4pIGJ1dCBkb2VzIG5vdCByYXN0ZXJpemUgdGhlbS4KCQkgICAgICAgVGhleSB3aWxsIG9ubHkgYmUgcHV0IG9uIHNjcmVlbiBsYXRlciAod2l0aCB0aGUgUE9JTlQgLyBMSU5FIGFuZAoJCSAgICAgICBUUklBTkdMRSBvcC1jb2RlcykuIFRoZSBwcm9ibGVtIGlzIHRoYXQgeW91IGNhbiBoYXZlIGEgdHJpYW5nbGUKCQkgICAgICAgd2l0aCBlYWNoIHBvaW50IGhhdmluZyBiZWVuIHRyYW5zZm9ybWVkIHVzaW5nIGFub3RoZXIgc3RhdGUuLi4KCQkgICAgICAgCgkJICAgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIEkgd2lsbCBlbXVsYXRlIG9ubHkgT05FIHRoaW5nIDogZWFjaAoJCSAgICAgICB2ZXJ0ZXggY2FuIGhhdmUgaXRzIG93biAiV09STEQiIHRyYW5zZm9ybWF0aW9uICh0aGlzIGlzIHVzZWQgaW4gdGhlCgkJICAgICAgIFRXSVNULkVYRSBkZW1vIG9mIHRoZSA1LjIgU0RLKS4gSSBzdXBwb3NlIHRoYXQgYWxsIHZlcnRpY2VzIG9mIHRoZQoJCSAgICAgICBleGVjdXRlIGJ1ZmZlciB1c2UgdGhlIHNhbWUgc3RhdGUuCgkJICAgICAgIAoJCSAgICAgICBJZiBJIGZpbmQgYXBwbGljYXRpb25zIHRoYXQgY2hhbmdlIG90aGVyIHN0YXRlcywgSSB3aWxsIHRyeSB0byBkbyBhCgkJICAgICAgIG1vcmUgJ2ZpbmUtdHVuZWQnIHN0YXRlIGVtdWxhdGlvbiAoYnV0IEkgbWF5IGJlY29tZSBxdWl0ZSB0cmlja3kgaWYKCQkgICAgICAgaXQgY2hhbmdlcyBhIGxpZ2h0IHBvc2l0aW9uIGluIHRoZSBtaWRkbGUgb2YgYSB0cmlhbmdsZSkuCgkJICAgICAgIAoJCSAgICAgICBJbiB0aGlzIGNhc2UsIGEgJ2RpcmVjdCcgYXBwcm9hY2ggKGkuZS4gd2l0aG91dCB1c2luZyBPcGVuR0wsIGJ1dAoJCSAgICAgICB3cml0aW5nIG91ciBvd24gM0QgcmFzdGVyaXplcikgd291bGQgYmUgZWFzaWVyLiAqLwoJCSAgICAKCQkgICAgLyogVGhlIGN1cnJlbnQgbWV0aG9kICh3aXRoIHRoZSBoeXBvdGhlc2lzIHRoYXQgb25seSB0aGUgV09STEQgbWF0cml4CgkJICAgICAgIHdpbGwgY2hhbmdlIGJldHdlZW4gdHdvIHBvaW50cykgaXMgbGlrZSB0aGlzIDoKCQkgICAgICAgLSBJIHRyYW5zZm9ybSAnbWFudWFsbHknIGFsbCB0aGUgdmVydGljZXMgd2l0aCB0aGUgY3VycmVudCBXT1JMRAoJCSAgICAgICAgIG1hdHJpeCBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgdmVydGV4IGJ1ZmZlcgoJCSAgICAgICAtIGR1cmluZyB0aGUgcmFzdGVyaXphdGlvbiBwaGFzZSwgdGhlIFdPUkxEIG1hdHJpeCB3aWxsIGJlIHNldCB0bwoJCSAgICAgICAgIHRoZSBJZGVudGl0eSBtYXRyaXggKi8KCQkgICAgCgkJICAgIC8qIEVub3VnaCBmb3IgdGhlIG1vbWVudCAqLwoJCSAgICBpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX1RSQU5TRk9STUxJR0hUKSB7CgkJICAgICAgICB1bnNpZ25lZCBpbnQgbmI7CgkJCUQzRFZFUlRFWCAgKnNyYyA9ICgoTFBEM0RWRVJURVgpICAoKGNoYXIgKilUaGlzLT5kZXNjLmxwRGF0YSArIHZzKSkgKyBjaS0+d1N0YXJ0OwoJCQlEM0RUTFZFUlRFWCAqZHN0ID0gKChMUEQzRFRMVkVSVEVYKSAoVGhpcy0+dmVydGV4X2RhdGEpKSArIGNpLT53RGVzdDsKCQkJRDNETUFUUklYICptYXQyID0gJndvcmxkX21hdDsKCQkJRDNETUFUUklYIG1hdDsKCQkJRDNEVkFMVUUgbngsbnksbno7CgkJCUQzRFZJRVdQT1JUKiBWaWV3cG9ydCA9ICZscFZpZXdwb3J0LT52aWV3cG9ydHMudnAxOwoJCQkKCQkJaWYgKFRSQUNFX09OKGQzZDcpKSB7CgkJCSAgICBUUkFDRSgiICBQcm9qZWN0aW9uIE1hdHJpeCA6ICglcClcbiIsICZwcm9qX21hdCk7CgkJCSAgICBkdW1wX0QzRE1BVFJJWCgmcHJval9tYXQpOwoJCQkgICAgVFJBQ0UoIiAgVmlldyAgICAgICBNYXRyaXggOiAoJXApXG4iLCAmdmlld19tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnZpZXdfbWF0KTsKCQkJICAgIFRSQUNFKCIgIFdvcmxkIE1hdHJpeCA6ICglcClcbiIsICZ3b3JsZF9tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJndvcmxkX21hdCk7CgkJCX0KCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5X21hdHJpeCgmbWF0LCZ2aWV3X21hdCwmd29ybGRfbWF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbHlfbWF0cml4KCZtYXQsJnByb2pfbWF0LCZtYXQpOwoKCQkJZm9yIChuYiA9IDA7IG5iIDwgY2ktPmR3Q291bnQ7IG5iKyspIHsKCQkJICAgIC8qIE5vcm1hbHMgdHJhbnNmb3JtYXRpb24gKi8KCQkJICAgIG54ID0gKHNyYy0+dTQubnggKiBtYXQyLT5fMTEpICsgKHNyYy0+dTUubnkgKiBtYXQyLT5fMjEpICsgKHNyYy0+dTYubnogKiBtYXQyLT5fMzEpOwoJCQkgICAgbnkgPSAoc3JjLT51NC5ueCAqIG1hdDItPl8xMikgKyAoc3JjLT51NS5ueSAqIG1hdDItPl8yMikgKyAoc3JjLT51Ni5ueiAqIG1hdDItPl8zMik7CgkJCSAgICBueiA9IChzcmMtPnU0Lm54ICogbWF0Mi0+XzEzKSArIChzcmMtPnU1Lm55ICogbWF0Mi0+XzIzKSArIChzcmMtPnU2Lm56ICogbWF0Mi0+XzMzKTsKCQkJICAgIAoJCQkgICAgLyogTm8gbGlnaHRpbmcgeWV0ICovCgkJCSAgICBkc3QtPnU1LmNvbG9yID0gMHhGRkZGRkZGRjsgLyogT3BhcXVlIHdoaXRlICovCgkJCSAgICBkc3QtPnU2LnNwZWN1bGFyID0gMHhGRjAwMDAwMDsgLyogTm8gc3BlY3VsYXIgYW5kIG5vIGZvZyBmYWN0b3IgKi8KCQkJICAgIAoJCQkgICAgZHN0LT51Ny50dSAgPSBzcmMtPnU3LnR1OwoJCQkgICAgZHN0LT51OC50diAgPSBzcmMtPnU4LnR2OwoJCQkgICAgCgkJCSAgICAvKiBOb3csIHRoZSBtYXRyaXggbXVsdGlwbGljYXRpb24gKi8KCQkJICAgIGRzdC0+dTEuc3ggPSAoc3JjLT51MS54ICogbWF0Ll8xMSkgKyAoc3JjLT51Mi55ICogbWF0Ll8yMSkgKyAoc3JjLT51My56ICogbWF0Ll8zMSkgKyAoMS4wICogbWF0Ll80MSk7CgkJCSAgICBkc3QtPnUyLnN5ID0gKHNyYy0+dTEueCAqIG1hdC5fMTIpICsgKHNyYy0+dTIueSAqIG1hdC5fMjIpICsgKHNyYy0+dTMueiAqIG1hdC5fMzIpICsgKDEuMCAqIG1hdC5fNDIpOwoJCQkgICAgZHN0LT51My5zeiA9IChzcmMtPnUxLnggKiBtYXQuXzEzKSArIChzcmMtPnUyLnkgKiBtYXQuXzIzKSArIChzcmMtPnUzLnogKiBtYXQuXzMzKSArICgxLjAgKiBtYXQuXzQzKTsKCQkJICAgIGRzdC0+dTQucmh3ID0gKHNyYy0+dTEueCAqIG1hdC5fMTQpICsgKHNyYy0+dTIueSAqIG1hdC5fMjQpICsgKHNyYy0+dTMueiAqIG1hdC5fMzQpICsgKDEuMCAqIG1hdC5fNDQpOwoKCQkJICAgIGRzdC0+dTEuc3ggPSBkc3QtPnUxLnN4IC8gZHN0LT51NC5yaHcgKiBWaWV3cG9ydC0+ZHdXaWR0aCAvIDIKCQkJCSAgICAgICArIFZpZXdwb3J0LT5kd1ggKyBWaWV3cG9ydC0+ZHdXaWR0aCAvIDI7CgkJCSAgICBkc3QtPnUyLnN5ID0gZHN0LT51Mi5zeSAvIGRzdC0+dTQucmh3ICogVmlld3BvcnQtPmR3SGVpZ2h0IC8gMgoJCQkJICAgICAgICsgVmlld3BvcnQtPmR3WSArIFZpZXdwb3J0LT5kd0hlaWdodCAvIDI7CgkJCSAgICBkc3QtPnUzLnN6IC89IGRzdC0+dTQucmh3OwoJCQkgICAgZHN0LT51NC5yaHcgPSAxIC8gZHN0LT51NC5yaHc7CgoJCQkgICAgc3JjKys7CgkJCSAgICBkc3QrKzsKCQkJICAgIAoJCQl9CgkJICAgIH0gZWxzZSBpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX1RSQU5TRk9STSkgewoJCSAgICAgICAgdW5zaWduZWQgaW50IG5iOwoJCQlEM0RMVkVSVEVYICpzcmMgID0gKChMUEQzRExWRVJURVgpICgoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgdnMpKSArIGNpLT53U3RhcnQ7CgkJCUQzRFRMVkVSVEVYICpkc3QgPSAoKExQRDNEVExWRVJURVgpIChUaGlzLT52ZXJ0ZXhfZGF0YSkpICsgY2ktPndEZXN0OwoJCQlEM0RNQVRSSVggbWF0OwoJCQlEM0RWSUVXUE9SVCogVmlld3BvcnQgPSAmbHBWaWV3cG9ydC0+dmlld3BvcnRzLnZwMTsKCQkJCgkJCWlmIChUUkFDRV9PTihkM2Q3KSkgewoJCQkgICAgVFJBQ0UoIiAgUHJvamVjdGlvbiBNYXRyaXggOiAoJXApXG4iLCAmcHJval9tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnByb2pfbWF0KTsKCQkJICAgIFRSQUNFKCIgIFZpZXcgICAgICAgTWF0cml4IDogKCVwKVxuIiwmdmlld19tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnZpZXdfbWF0KTsKCQkJICAgIFRSQUNFKCIgIFdvcmxkIE1hdHJpeCA6ICglcClcbiIsICZtYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJm1hdCk7CgkJCX0KCgkJCW11bHRpcGx5X21hdHJpeCgmbWF0LCZ2aWV3X21hdCwmd29ybGRfbWF0KTsKCQkJbXVsdGlwbHlfbWF0cml4KCZtYXQsJnByb2pfbWF0LCZtYXQpOwoKCQkJZm9yIChuYiA9IDA7IG5iIDwgY2ktPmR3Q291bnQ7IG5iKyspIHsKCQkJICAgIGRzdC0+dTUuY29sb3IgPSBzcmMtPnU0LmNvbG9yOwoJCQkgICAgZHN0LT51Ni5zcGVjdWxhciA9IHNyYy0+dTUuc3BlY3VsYXI7CgkJCSAgICBkc3QtPnU3LnR1ID0gc3JjLT51Ni50dTsKCQkJICAgIGRzdC0+dTgudHYgPSBzcmMtPnU3LnR2OwoJCQkgICAgCgkJCSAgICAvKiBOb3csIHRoZSBtYXRyaXggbXVsdGlwbGljYXRpb24gKi8KCQkJICAgIGRzdC0+dTEuc3ggPSAoc3JjLT51MS54ICogbWF0Ll8xMSkgKyAoc3JjLT51Mi55ICogbWF0Ll8yMSkgKyAoc3JjLT51My56ICogbWF0Ll8zMSkgKyAoMS4wICogbWF0Ll80MSk7CgkJCSAgICBkc3QtPnUyLnN5ID0gKHNyYy0+dTEueCAqIG1hdC5fMTIpICsgKHNyYy0+dTIueSAqIG1hdC5fMjIpICsgKHNyYy0+dTMueiAqIG1hdC5fMzIpICsgKDEuMCAqIG1hdC5fNDIpOwoJCQkgICAgZHN0LT51My5zeiA9IChzcmMtPnUxLnggKiBtYXQuXzEzKSArIChzcmMtPnUyLnkgKiBtYXQuXzIzKSArIChzcmMtPnUzLnogKiBtYXQuXzMzKSArICgxLjAgKiBtYXQuXzQzKTsKCQkJICAgIGRzdC0+dTQucmh3ID0gKHNyYy0+dTEueCAqIG1hdC5fMTQpICsgKHNyYy0+dTIueSAqIG1hdC5fMjQpICsgKHNyYy0+dTMueiAqIG1hdC5fMzQpICsgKDEuMCAqIG1hdC5fNDQpOwoKCQkJICAgIGRzdC0+dTEuc3ggLz0gZHN0LT51NC5yaHcgKiBWaWV3cG9ydC0+ZHZTY2FsZVggKiBWaWV3cG9ydC0+ZHdXaWR0aCAvIDIgKyBWaWV3cG9ydC0+ZHdYOwoJCQkgICAgZHN0LT51Mi5zeSAvPSBkc3QtPnU0LnJodyAqIFZpZXdwb3J0LT5kdlNjYWxlWSAqIFZpZXdwb3J0LT5kd0hlaWdodCAvIDIgKyBWaWV3cG9ydC0+ZHdZOwoJCQkgICAgZHN0LT51My5zeiAvPSBkc3QtPnU0LnJodzsKCQkJICAgIGRzdC0+dTQucmh3ID0gMSAvIGRzdC0+dTQucmh3OwoKCQkJICAgIHNyYysrOwoJCQkgICAgZHN0Kys7CgkJCX0KCQkgICAgfSBlbHNlIGlmIChjaS0+ZHdGbGFncyA9PSBEM0RQUk9DRVNTVkVSVElDRVNfQ09QWSkgewoJCSAgICAgICAgRDNEVExWRVJURVggKnNyYyA9ICgoTFBEM0RUTFZFUlRFWCkgKChjaGFyICopVGhpcy0+ZGVzYy5scERhdGEgKyB2cykpICsgY2ktPndTdGFydDsKCQkJRDNEVExWRVJURVggKmRzdCA9ICgoTFBEM0RUTFZFUlRFWCkgKFRoaXMtPnZlcnRleF9kYXRhKSkgKyBjaS0+d0Rlc3Q7CgkJCQoJCQltZW1jcHkoZHN0LCBzcmMsIGNpLT5kd0NvdW50ICogc2l6ZW9mKEQzRFRMVkVSVEVYKSk7CgkJICAgIH0gZWxzZSB7CgkJICAgICAgICBFUlIoIlVuaGFuZGxlZCB2ZXJ0ZXggcHJvY2Vzc2luZyAhXG4iKTsKCQkgICAgfQoKCQkgICAgaW5zdHIgKz0gc2l6ZTsKCQl9CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9URVhUVVJFTE9BRDogewoJICAgICAgICBXQVJOKCJURVhUVVJFTE9BRC1zICAgICglZClcbiIsIGNvdW50KTsKCgkJaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfRVhJVDogewoJICAgICAgICBUUkFDRSgiRVhJVCAgICAgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJLyogV2UgZGlkIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KCQlpbnN0ciArPSBzaXplOwoJCS8qIEV4aXQgdGhpcyBsb29wICovCgkJZ290byBlbmRfb2ZfYnVmZmVyOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfQlJBTkNIRk9SV0FSRDogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiQlJBTkNIRk9SV0FSRCAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEQlJBTkNIIGNpID0gKExQRDNEQlJBTkNIKSBpbnN0cjsKCgkJICAgIGlmICgoVGhpcy0+ZGF0YS5kc1N0YXR1cy5kd1N0YXR1cyAmIGNpLT5kd01hc2spID09IGNpLT5kd1ZhbHVlKSB7CgkJICAgICAgICBpZiAoIWNpLT5iTmVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiIEJyYW5jaCB0byAlZFxuIiwgY2ktPmR3T2Zmc2V0KTsKCQkJICAgIGluc3RyID0gKGNoYXIqKWN1cnJlbnQgKyBjaS0+ZHdPZmZzZXQ7CgkJCSAgICBicmVhazsKCQkJfQoJCSAgICB9IGVsc2UgewoJCSAgICAgICAgaWYgKGNpLT5iTmVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiIEJyYW5jaCB0byAlZFxuIiwgY2ktPmR3T2Zmc2V0KTsKCQkJICAgIGluc3RyID0gKGNoYXIqKWN1cnJlbnQgKyBjaS0+ZHdPZmZzZXQ7CgkJCSAgICBicmVhazsKCQkJfQoJCSAgICB9CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NQQU46IHsKCSAgICAgICAgV0FSTigiU1BBTi1zICAgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NFVFNUQVRVUzogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU0VUU1RBVFVTICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEU1RBVFVTIGNpID0gKExQRDNEU1RBVFVTKSBpbnN0cjsKCQkgICAgCgkJICAgIFRoaXMtPmRhdGEuZHNTdGF0dXMgPSAqY2k7CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBkZWZhdWx0OgoJICAgICAgICBFUlIoIlVuaGFuZGxlZCBPcENvZGUgJWQgISEhXG4iLGN1cnJlbnQtPmJPcGNvZGUpOwoJICAgICAgICAvKiBUcnkgdG8gc2F2ZSAuLi4gKi8KCSAgICAgICAgaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgICAgICBicmVhazsKCX0KICAgIH0KCmVuZF9vZl9idWZmZXI6CiAgICA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpRdWVyeUludGVyZmFjZQogKgogKiBXZWxsLCBhIHVzdWFsIFF1ZXJ5SW50ZXJmYWNlIGZ1bmN0aW9uLiBEb24ndCBrbm93IGZ1ciBzdXJlIHdoaWNoCiAqIGludGVyZmFjZXMgaXQgY2FuIFF1ZXJ5LgogKgogKiBQYXJhbXM6CiAqICByaWlkOiBUaGUgaW50ZXJmYWNlIElEIHF1ZXJpZWQgZm9yCiAqICBvYmo6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGluIGNhc2Ugb2YgYSBzdWNjZXNzIChTX09LPyBUaGluayBpdCdzIHRoZSBzYW1lKQogKiAgT0xFX0VfRU5VTV9OT01PUkUgaWYgdGhlIGludGVyZmFjZSB3YXNuJ3QgZm91bmQuCiAqICAgKEVfTk9JTlRFUkZBQ0U/PyBEb24ndCBrbm93IHdoYXQgSSByZWFsbHkgbmVlZCkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcC8lcCktPiglcywlcClcbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwoKICAgICpvYmogPSBOVUxMOwoKICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sICByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcl9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcikpOwoJKm9iaiA9IGlmYWNlOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKSk7CiAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBpbnRlcmZhY2UgJXBcbiIsICpvYmopOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpBZGRSZWYKICoKICogQSBub3JtYWwgQWRkUmVmIG1ldGhvZCwgbm90aGluZyBzcGVjaWFsCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9BZGRSZWYoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBGSVhNRSgiKCVwKS0+KClpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpSZWxlYXNlCiAqCiAqIEEgbm9ybWFsIFJlbGVhc2UgbWV0aG9kLCBub3RoaW5nIHNwZWNpYWwKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1JlbGVhc2UoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KClkZWNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiArIDEpOwoKICAgIGlmICghcmVmKSB7CiAgICAgICAgaWYgKFRoaXMtPm5lZWRfZnJlZSkKCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+ZGVzYy5scERhdGEpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzLT52ZXJ0ZXhfZGF0YSk7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPmluZGljZXMpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwoJcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIEV4ZWN1dGUgQnVmZmVyLiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIENPTSBjb21wbGlhbmNlCiAqIE5vdGhpbmcgdG8gZG8gaGVyZS4KICoKICogUmV0dXJuczoKICogIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Jbml0aWFsaXplKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlICpscERpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIG5vLW9wLi4uLlxuIiwgVGhpcywgbHBEaXJlY3QzRERldmljZSwgbHBEZXNjKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpMb2NrCiAqCiAqIExvY2tzIHRoZSBidWZmZXIsIHNvIHRoZSBhcHAgY2FuIHdyaXRlIGludG8gaXQuCiAqCiAqIFBhcmFtczoKICogIERlc2M6IFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBidWZmZXIgZGVzY3JpcHRpb24uIFRoaXMgRGVzY3JpcHRpb24gY29udGFpbnMKICogICAgICAgIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGRhdGEuCiAqCiAqIFJldHVybnM6CiAqICBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Mb2NrKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVCVUZGRVJERVNDICpscERlc2MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBEV09SRCBkd1NpemU7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEZXNjKTsKCiAgICBkd1NpemUgPSBscERlc2MtPmR3U2l6ZTsKICAgIG1lbXNldChscERlc2MsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBEZXNjLCAmVGhpcy0+ZGVzYywgZHdTaXplKTsKICAgIAogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgUmV0dXJuaW5nIGRlc2NyaXB0aW9uIDpcbiIpOwoJX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MobHBEZXNjKTsKICAgIH0KICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpVbmxvY2sKICoKICogVW5sb2NrcyB0aGUgYnVmZmVyLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGhlcmUKICoKICogUmV0dXJuczoKICogIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1VubG9jayhJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSBuby1vcC4uLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6U2V0RXhlY3V0ZURhdGEKICoKICogU2V0cyB0aGUgZXhlY3V0ZSBkYXRhLiBUaGlzIGRhdGEgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgYnVmZmVyJ3MgY29udGVudAogKgogKiBQYXJhbXM6CiAqICBEYXRhOiBQb2ludGVyIHRvIGEgRDNERVhFQ1VURURBVEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8KICogIGFzc2lnbgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIHRoZSB2ZXJ0ZXggYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1NldEV4ZWN1dGVEYXRhKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RFWEVDVVRFREFUQSAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgRFdPUkQgbmJ2ZXJ0OwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwRGF0YSk7CgogICAgbWVtY3B5KCZUaGlzLT5kYXRhLCBscERhdGEsIGxwRGF0YS0+ZHdTaXplKTsKCiAgICAvKiBHZXQgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGUgZXhlY3V0ZSBidWZmZXIgKi8KICAgIG5idmVydCA9IFRoaXMtPmRhdGEuZHdWZXJ0ZXhDb3VudDsKICAgIAogICAgLyogUHJlcGFyZXMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBidWZmZXIgKi8KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnZlcnRleF9kYXRhKTsKICAgIFRoaXMtPnZlcnRleF9kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIG5idmVydCAqIHNpemVvZihEM0RUTFZFUlRFWCkpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIF9kdW1wX2V4ZWN1dGVkYXRhKGxwRGF0YSk7CiAgICB9CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkdldEV4ZWN1dGVEYXRhCiAqCiAqIFJldHVybnMgdGhlIGRhdGEgaW4gdGhlIGV4ZWN1dGUgYnVmZmVyCiAqCiAqIFBhcmFtczoKICogIERhdGE6IFBvaW50ZXIgdG8gYSBEM0RFWEVDVVRFREFUQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gZGF0YQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfR2V0RXhlY3V0ZURhdGEoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVEQVRBICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBEV09SRCBkd1NpemU7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRGF0YSk7CgogICAgZHdTaXplID0gbHBEYXRhLT5kd1NpemU7CiAgICBtZW1zZXQobHBEYXRhLCAwLCBkd1NpemUpOwogICAgbWVtY3B5KGxwRGF0YSwgJlRoaXMtPmRhdGEsIGR3U2l6ZSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIlJldHVybmluZyBkYXRhIDpcbiIpOwoJX2R1bXBfZXhlY3V0ZWRhdGEobHBEYXRhKTsKICAgIH0KCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpWYWxpZGF0ZQogKgogKiBEaXJlY3RYIDUgU0RLOiAiVGhlIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlZhbGlkYXRlIG1ldGhvZCBpcyBub3QKICogY3VycmVudGx5IGltcGxlbWVudGVkIgogKgogKiBQYXJhbXM6CiAqICA/CiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRCwgYmVjYXVzZSBpdCdzIG5vdCBpbXBsZW1lbnRlZCBpbiBXaW5kb3dzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9WYWxpZGF0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWQUxJREFURUNBTExCQUNLIEZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlVzZXJBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFJlc2VydmVkKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwlMDh4KTogVW5pbXBsZW1lbnRlZCFcbiIsIFRoaXMsIE9mZnNldCwgRnVuYywgVXNlckFyZywgUmVzZXJ2ZWQpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiBVbmNoZWNrZWQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6Ok9wdGltaXplCiAqCiAqIERpcmVjdFg1IFNESzogIlRoZSBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpPcHRpbWl6ZSBtZXRob2QgaXMgbm90CiAqIGN1cnJlbnRseSBzdXBwb3J0ZWQiCiAqCiAqIFBhcmFtczoKICogIER1bW15OiBTZWVtcyB0byBiZSBhbiB1bnVzZWQgZHVtbXkgOykKICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVELCBiZWNhdXNlIGl0J3Mgbm90IGltcGxlbWVudGVkIGluIFdpbmRvd3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX09wdGltaXplKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBEdW1teSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCk6IFVuaW1wbGVtZW50ZWRcbiIsIFRoaXMsIER1bW15KTsKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsgLyogVW5jaGVja2VkICovCn0KCmNvbnN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJWdGJsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibCA9CnsKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfQWRkUmVmLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUmVsZWFzZSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Mb2NrLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVW5sb2NrLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfU2V0RXhlY3V0ZURhdGEsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9HZXRFeGVjdXRlRGF0YSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1ZhbGlkYXRlLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfT3B0aW1pemUsCn07Cg==