LyoKICogU3RhY2sgd2Fsa2luZwogKgogKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKICogQ29weXJpZ2h0IDE5OTYgRXJpYyBZb3VuZ2RhbGUKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDA0IEVyaWMgUG91ZWNoCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAibnRzdGF0dXMuaCIKI2RlZmluZSBXSU4zMl9OT19TVEFUVVMKI2luY2x1ZGUgImRiZ2hlbHBfcHJpdmF0ZS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgojaW5jbHVkZSAid2luZS93aW5iYXNlMTYuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRiZ2hlbHApOwoKZW51bSBzdF9tb2RlIHtzdG1fc3RhcnQsIHN0bV8zMmJpdCwgc3RtXzE2Yml0LCBzdG1fZG9uZX07CgpzdGF0aWMgY29uc3QgY2hhciogd2luZV9kYmdzdHJfYWRkcihjb25zdCBBRERSRVNTKiBhZGRyKQp7CiAgICBpZiAoIWFkZHIpIHJldHVybiAiKG51bGwpIjsKICAgIHN3aXRjaCAoYWRkci0+TW9kZSkKICAgIHsKICAgIGNhc2UgQWRkck1vZGVGbGF0OgogICAgICAgIHJldHVybiB3aW5lX2RiZ19zcHJpbnRmKCJmbGF0PCUwOGx4PiIsIGFkZHItPk9mZnNldCk7CiAgICBjYXNlIEFkZHJNb2RlMTYxNjoKICAgICAgICByZXR1cm4gd2luZV9kYmdfc3ByaW50ZigiMTYxNjwlMDR4OiUwNGx4PiIsIGFkZHItPlNlZ21lbnQsIGFkZHItPk9mZnNldCk7CiAgICBjYXNlIEFkZHJNb2RlMTYzMjoKICAgICAgICByZXR1cm4gd2luZV9kYmdfc3ByaW50ZigiMTYzMjwlMDR4OiUwOGx4PiIsIGFkZHItPlNlZ21lbnQsIGFkZHItPk9mZnNldCk7CiAgICBjYXNlIEFkZHJNb2RlUmVhbDoKICAgICAgICByZXR1cm4gd2luZV9kYmdfc3ByaW50ZigicmVhbDwlMDR4OiUwNGx4PiIsIGFkZHItPlNlZ21lbnQsIGFkZHItPk9mZnNldCk7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAidW5rbm93biI7CiAgICB9Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIHJlYWRfbWVtKEhBTkRMRSBoUHJvY2VzcywgRFdPUkQgYWRkciwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzaXplLCBMUERXT1JEIG5yZWFkKQp7CiAgICByZXR1cm4gUmVhZFByb2Nlc3NNZW1vcnkoaFByb2Nlc3MsICh2b2lkKilhZGRyLCBidWZmZXIsIHNpemUsIG5yZWFkKTsKfQoKc3RhdGljIEJPT0wgQ0FMTEJBQ0sgcmVhZF9tZW02NChIQU5ETEUgaFByb2Nlc3MsIERXT1JENjQgYWRkciwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNpemUsIExQRFdPUkQgbnJlYWQpCnsKICAgIHJldHVybiBSZWFkUHJvY2Vzc01lbW9yeShoUHJvY2VzcywgKHZvaWQqKShEV09SRF9QVFIpYWRkciwgYnVmZmVyLCBzaXplLCBucmVhZCk7Cn0KCi8qIGluZGV4ZXMgaW4gUmVzZXJ2ZWQgYXJyYXkgKi8KI2RlZmluZSBfX0N1cnJlbnRNb2RlICAgICAwCiNkZWZpbmUgX19DdXJyZW50U3dpdGNoICAgMQojZGVmaW5lIF9fTmV4dFN3aXRjaCAgICAgIDIKCiNkZWZpbmUgY3Vycl9tb2RlICAgKGZyYW1lLT5SZXNlcnZlZFtfX0N1cnJlbnRNb2RlXSkKI2RlZmluZSBjdXJyX3N3aXRjaCAoZnJhbWUtPlJlc2VydmVkW19fQ3VycmVudFN3aXRjaF0pCiNkZWZpbmUgbmV4dF9zd2l0Y2ggKGZyYW1lLT5SZXNlcnZlZFtfX05leHRTd2l0Y2hdKQoKc3RydWN0IHN0YWNrX3dhbGtfY2FsbGJhY2sKewogICAgSEFORExFICAgICAgaFByb2Nlc3M7CiAgICBIQU5ETEUgICAgICBoVGhyZWFkOwogICAgQk9PTCAgICAgICAgaXMzMjsKICAgIHVuaW9uCiAgICB7CiAgICAgICAgc3RydWN0CiAgICAgICAgewogICAgICAgICAgICBQUkVBRF9QUk9DRVNTX01FTU9SWV9ST1VUSU5FICAgICAgICBmX3JlYWRfbWVtOwogICAgICAgICAgICBQVFJBTlNMQVRFX0FERFJFU1NfUk9VVElORSAgICAgICAgICBmX3hsYXRfYWRyOwogICAgICAgIH0gczMyOwogICAgICAgIHN0cnVjdAogICAgICAgIHsKICAgICAgICAgICAgUFJFQURfUFJPQ0VTU19NRU1PUllfUk9VVElORTY0ICAgICAgZl9yZWFkX21lbTsKICAgICAgICAgICAgUFRSQU5TTEFURV9BRERSRVNTX1JPVVRJTkU2NCAgICAgICAgZl94bGF0X2FkcjsKICAgICAgICB9IHM2NDsKICAgIH0gdTsKfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBhZGRyXzMydG82NChjb25zdCBBRERSRVNTKiBhZGRyMzIsIEFERFJFU1M2NCogYWRkcjY0KQp7CiAgICBhZGRyNjQtPk9mZnNldCA9IChVTE9ORzY0KWFkZHIzMi0+T2Zmc2V0OwogICAgYWRkcjY0LT5TZWdtZW50ID0gYWRkcjMyLT5TZWdtZW50OwogICAgYWRkcjY0LT5Nb2RlID0gYWRkcjMyLT5Nb2RlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgYWRkcl82NHRvMzIoY29uc3QgQUREUkVTUzY0KiBhZGRyNjQsIEFERFJFU1MqIGFkZHIzMikKewogICAgYWRkcjMyLT5PZmZzZXQgPSAoVUxPTkcpYWRkcjY0LT5PZmZzZXQ7CiAgICBhZGRyMzItPlNlZ21lbnQgPSBhZGRyNjQtPlNlZ21lbnQ7CiAgICBhZGRyMzItPk1vZGUgPSBhZGRyNjQtPk1vZGU7Cn0KCnN0YXRpYyBpbmxpbmUgQk9PTCBzd19yZWFkX21lbShzdHJ1Y3Qgc3RhY2tfd2Fsa19jYWxsYmFjayogY2IsIERXT1JEIGFkZHIsIHZvaWQqIHB0ciwgRFdPUkQgc3opCnsKICAgIGlmIChjYi0+aXMzMikKICAgICAgICByZXR1cm4gY2ItPnUuczMyLmZfcmVhZF9tZW0oY2ItPmhQcm9jZXNzLCBhZGRyLCBwdHIsIHN6LCBOVUxMKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gY2ItPnUuczY0LmZfcmVhZF9tZW0oY2ItPmhQcm9jZXNzLCBhZGRyLCBwdHIsIHN6LCBOVUxMKTsKfQoKc3RhdGljIGlubGluZSBEV09SRCBzd194bGF0X2FkZHIoc3RydWN0IHN0YWNrX3dhbGtfY2FsbGJhY2sqIGNiLCBBRERSRVNTKiBhZGRyKQp7CiAgICBpZiAoY2ItPmlzMzIpCiAgICAgICAgcmV0dXJuIGNiLT51LnMzMi5mX3hsYXRfYWRyKGNiLT5oUHJvY2VzcywgY2ItPmhUaHJlYWQsIGFkZHIpOwogICAgZWxzZSBpZiAoY2ItPnUuczY0LmZfeGxhdF9hZHIpCiAgICB7CiAgICAgICAgQUREUkVTUzY0ICAgICAgIGFkZHI2NDsKCiAgICAgICAgYWRkcl8zMnRvNjQoYWRkciwgJmFkZHI2NCk7CiAgICAgICAgcmV0dXJuIGNiLT51LnM2NC5mX3hsYXRfYWRyKGNiLT5oUHJvY2VzcywgY2ItPmhUaHJlYWQsICZhZGRyNjQpOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybiBhZGRyX3RvX2xpbmVhcihjYi0+aFByb2Nlc3MsIGNiLT5oVGhyZWFkLCBhZGRyKTsKfQoKc3RhdGljIEJPT0wgc3RhY2tfd2FsayhzdHJ1Y3Qgc3RhY2tfd2Fsa19jYWxsYmFjayogY2IsIExQU1RBQ0tGUkFNRSBmcmFtZSkKewogICAgU1RBQ0szMkZSQU1FICAgICAgICBmcmFtZTMyOwogICAgU1RBQ0sxNkZSQU1FICAgICAgICBmcmFtZTE2OwogICAgY2hhciAgICAgICAgICAgICAgICBjaDsKICAgIEFERFJFU1MgICAgICAgICAgICAgdG1wOwogICAgRFdPUkQgICAgICAgICAgICAgICBwOwogICAgV09SRCAgICAgICAgICAgICAgICB2YWw7CiAgICBCT09MICAgICAgICAgICAgICAgIGRvX3N3aXRjaDsKCiAgICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgIGlmIChjdXJyX21vZGUgPj0gc3RtX2RvbmUpIHJldHVybiBGQUxTRTsKCiAgICBUUkFDRSgiRW50ZXI6IFBDPSVzIEZyYW1lPSVzIFJldHVybj0lcyBTdGFjaz0lcyBNb2RlPSVzIGNTd2l0Y2g9JTA4bHggblN3aXRjaD0lMDhseFxuIiwKICAgICAgICAgIHdpbmVfZGJnc3RyX2FkZHIoJmZyYW1lLT5BZGRyUEMpLCAKICAgICAgICAgIHdpbmVfZGJnc3RyX2FkZHIoJmZyYW1lLT5BZGRyRnJhbWUpLAogICAgICAgICAgd2luZV9kYmdzdHJfYWRkcigmZnJhbWUtPkFkZHJSZXR1cm4pLAogICAgICAgICAgd2luZV9kYmdzdHJfYWRkcigmZnJhbWUtPkFkZHJTdGFjayksIAogICAgICAgICAgY3Vycl9tb2RlID09IHN0bV9zdGFydCA/ICJzdGFydCIgOiAoY3Vycl9tb2RlID09IHN0bV8xNmJpdCA/ICIxNmJpdCIgOiAiMzJiaXQiKSwKICAgICAgICAgIGN1cnJfc3dpdGNoLCBuZXh0X3N3aXRjaCk7CgogICAgaWYgKGN1cnJfbW9kZSA9PSBzdG1fc3RhcnQpCiAgICB7CiAgICAgICAgVEhSRUFEX0JBU0lDX0lORk9STUFUSU9OIGluZm87CgogICAgICAgIGlmICgoZnJhbWUtPkFkZHJQQy5Nb2RlID09IEFkZHJNb2RlRmxhdCkgJiYKICAgICAgICAgICAgKGZyYW1lLT5BZGRyRnJhbWUuTW9kZSAhPSBBZGRyTW9kZUZsYXQpKQogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiQmFkIEFkZHJQQy5Nb2RlIC8gQWRkckZyYW1lLk1vZGUgY29tYmluYXRpb25cbiIpOwogICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgIH0KCiAgICAgICAgLyogSW5pdCBkb25lICovCiAgICAgICAgY3Vycl9tb2RlID0gKGZyYW1lLT5BZGRyUEMuTW9kZSA9PSBBZGRyTW9kZUZsYXQpID8gCiAgICAgICAgICAgIHN0bV8zMmJpdCA6IHN0bV8xNmJpdDsKCiAgICAgICAgLyogY3VyX3N3aXRjaCBob2xkcyBhZGRyZXNzIG9mIFdPVzMyUmVzZXJ2ZWQgZmllbGQgaW4gVEVCIGluIGRlYnVnZ2VlCiAgICAgICAgICogYWRkcmVzcyBzcGFjZQogICAgICAgICAqLwogICAgICAgIGlmIChOdFF1ZXJ5SW5mb3JtYXRpb25UaHJlYWQoY2ItPmhUaHJlYWQsIFRocmVhZEJhc2ljSW5mb3JtYXRpb24sICZpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGluZm8pLCBOVUxMKSA9PSBTVEFUVVNfU1VDQ0VTUykKICAgICAgICB7CiAgICAgICAgICAgIGN1cnJfc3dpdGNoID0gKHVuc2lnbmVkIGxvbmcpaW5mby5UZWJCYXNlQWRkcmVzcyArIEZJRUxEX09GRlNFVChURUIsIFdPVzMyUmVzZXJ2ZWQpOwogICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBjdXJyX3N3aXRjaCwgJm5leHRfc3dpdGNoLCBzaXplb2YobmV4dF9zd2l0Y2gpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV0FSTigiQ2FuJ3QgcmVhZCBURUI6V09XMzJSZXNlcnZlZFxuIik7CiAgICAgICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjdXJyX21vZGUgPT0gc3RtXzE2Yml0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBuZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihmcmFtZTMyKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgV0FSTigiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3Vycl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwogICAgICAgICAgICAgICAgdG1wLk1vZGUgICAgPSBBZGRyTW9kZTE2MTY7CiAgICAgICAgICAgICAgICB0bXAuU2VnbWVudCA9IFNFTEVDVE9ST0YoY3Vycl9zd2l0Y2gpOwogICAgICAgICAgICAgICAgdG1wLk9mZnNldCAgPSBPRkZTRVRPRihjdXJyX3N3aXRjaCk7CiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBzd194bGF0X2FkZHIoY2IsICZ0bXApLCAmY2gsIHNpemVvZihjaCkpKQogICAgICAgICAgICAgICAgICAgIGN1cnJfc3dpdGNoID0gMHhGRkZGRkZGRjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRtcC5Nb2RlICAgID0gQWRkck1vZGUxNjE2OwogICAgICAgICAgICAgICAgdG1wLlNlZ21lbnQgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgIHRtcC5PZmZzZXQgID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwogICAgICAgICAgICAgICAgcCA9IHN3X3hsYXRfYWRkcihjYiwgJnRtcCk7CiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBwLCAmZnJhbWUxNiwgc2l6ZW9mKGZyYW1lMTYpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBXQVJOKCJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgcCk7CiAgICAgICAgICAgICAgICAgICAgZ290byBkb25lX2VycjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJfc3dpdGNoID0gKERXT1JEKWZyYW1lMTYuZnJhbWUzMjsKCiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBjdXJyX3N3aXRjaCwgJmNoLCBzaXplb2YoY2gpKSkKICAgICAgICAgICAgICAgICAgICBjdXJyX3N3aXRjaCA9IDB4RkZGRkZGRkY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAvKiBGSVhNRTogdGhpcyB3aWxsIGFsbG93IHRvIHdvcmsgd2hlbiB3ZSdyZSBub3QgYXR0YWNoZWQgdG8gYSBsaXZlIHRhcmdldCwgCiAgICAgICAgICAgICAqIGJ1dCB0aGUgMTYgPD0+IDMyIHN3aXRjaCBmYWNpbGl0eSB3b24ndCBiZSBhdmFpbGFibGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjdXJyX3N3aXRjaCA9IDA7CiAgICAgICAgZnJhbWUtPkFkZHJSZXR1cm4uTW9kZSA9IGZyYW1lLT5BZGRyU3RhY2suTW9kZSA9IChjdXJyX21vZGUgPT0gc3RtXzE2Yml0KSA/IEFkZHJNb2RlMTYxNiA6IEFkZHJNb2RlRmxhdDsKICAgICAgICAvKiBkb24ndCBzZXQgdXAgQWRkclN0YWNrIG9uIGZpcnN0IGNhbGwuIEVpdGhlciB0aGUgY2FsbGVyIGhhcyBzZXQgaXQgdXAsIG9yCiAgICAgICAgICogd2Ugd2lsbCBnZXQgaXQgaW4gdGhlIG5leHQgZnJhbWUKICAgICAgICAgKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZnJhbWUtPkFkZHJGcmFtZS5PZmZzZXQgPT0gMCkgZ290byBkb25lX2VycjsKICAgICAgICBpZiAoZnJhbWUtPkFkZHJGcmFtZS5Nb2RlID09IEFkZHJNb2RlRmxhdCkKICAgICAgICB7CiAgICAgICAgICAgIGFzc2VydChjdXJyX21vZGUgPT0gc3RtXzMyYml0KTsKICAgICAgICAgICAgZG9fc3dpdGNoID0gY3Vycl9zd2l0Y2ggJiYgZnJhbWUtPkFkZHJGcmFtZS5PZmZzZXQgPj0gY3Vycl9zd2l0Y2g7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGFzc2VydChjdXJyX21vZGUgPT0gc3RtXzE2Yml0KTsKICAgICAgICAgICAgZG9fc3dpdGNoID0gY3Vycl9zd2l0Y2ggJiYgCiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkckZyYW1lLlNlZ21lbnQgPT0gU0VMRUNUT1JPRihjdXJyX3N3aXRjaCkgJiYKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ID49IE9GRlNFVE9GKGN1cnJfc3dpdGNoKTsKICAgICAgICB9CgkgICAKICAgICAgICBpZiAoZG9fc3dpdGNoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGN1cnJfbW9kZSA9PSBzdG1fMTZiaXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghc3dfcmVhZF9tZW0oY2IsIG5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKGZyYW1lMzIpKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBXQVJOKCJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgbmV4dF9zd2l0Y2gpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZV9lcnI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJQQy5Nb2RlICAgICAgICA9IEFkZHJNb2RlRmxhdDsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyUEMuU2VnbWVudCAgICAgPSAwOwogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJQQy5PZmZzZXQgICAgICA9IGZyYW1lMzIucmV0YWRkcjsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuTW9kZSAgICAgPSBBZGRyTW9kZUZsYXQ7CiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkckZyYW1lLlNlZ21lbnQgID0gMDsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ICAgPSBmcmFtZTMyLmVicDsKCiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkclN0YWNrLk1vZGUgICAgID0gQWRkck1vZGVGbGF0OwogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJTdGFjay5TZWdtZW50ICA9IDA7CiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkclJldHVybi5Nb2RlICAgID0gQWRkck1vZGVGbGF0OwogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJSZXR1cm4uU2VnbWVudCA9IDA7CgogICAgICAgICAgICAgICAgbmV4dF9zd2l0Y2ggPSBjdXJyX3N3aXRjaDsKICAgICAgICAgICAgICAgIHRtcC5Nb2RlICAgID0gQWRkck1vZGUxNjE2OwogICAgICAgICAgICAgICAgdG1wLlNlZ21lbnQgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgIHRtcC5PZmZzZXQgID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwogICAgICAgICAgICAgICAgcCA9IHN3X3hsYXRfYWRkcihjYiwgJnRtcCk7CgogICAgICAgICAgICAgICAgaWYgKCFzd19yZWFkX21lbShjYiwgcCwgJmZyYW1lMTYsIHNpemVvZihmcmFtZTE2KSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgV0FSTigiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIHApOwogICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZV9lcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdXJyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7CiAgICAgICAgICAgICAgICBjdXJyX21vZGUgPSBzdG1fMzJiaXQ7CiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBjdXJyX3N3aXRjaCwgJmNoLCBzaXplb2YoY2gpKSkKICAgICAgICAgICAgICAgICAgICBjdXJyX3N3aXRjaCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0bXAuTW9kZSAgICA9IEFkZHJNb2RlMTYxNjsKICAgICAgICAgICAgICAgIHRtcC5TZWdtZW50ID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CiAgICAgICAgICAgICAgICB0bXAuT2Zmc2V0ICA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgIHAgPSBzd194bGF0X2FkZHIoY2IsICZ0bXApOwoKICAgICAgICAgICAgICAgIGlmICghc3dfcmVhZF9tZW0oY2IsIHAsICZmcmFtZTE2LCBzaXplb2YoZnJhbWUxNikpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFdBUk4oIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCBwKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFRSQUNFKCJHb3QgYSAxNiBiaXQgc3RhY2sgc3dpdGNoOiIKICAgICAgICAgICAgICAgICAgICAgICJcblx0ZnJhbWUzMjogJTA4bHgiCiAgICAgICAgICAgICAgICAgICAgICAiXG5cdGVkeDolMDhseCBlY3g6JTA4bHggZWJwOiUwOGx4IgogICAgICAgICAgICAgICAgICAgICAgIlxuXHRkczolMDR4IGVzOiUwNHggZnM6JTA0eCBnczolMDR4IgogICAgICAgICAgICAgICAgICAgICAgIlxuXHRjYWxsX2Zyb21faXA6JTA4bHggbW9kdWxlX2NzOiUwNGx4IHJlbGF5PSUwOGx4IgogICAgICAgICAgICAgICAgICAgICAgIlxuXHRlbnRyeV9pcDolMDR4IGVudHJ5X3BvaW50OiUwOGx4IgogICAgICAgICAgICAgICAgICAgICAgIlxuXHRicDolMDR4IGlwOiUwNHggY3M6JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWZyYW1lMTYuZnJhbWUzMiwKICAgICAgICAgICAgICAgICAgICAgIGZyYW1lMTYuZWR4LCBmcmFtZTE2LmVjeCwgZnJhbWUxNi5lYnAsCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZTE2LmRzLCBmcmFtZTE2LmVzLCBmcmFtZTE2LmZzLCBmcmFtZTE2LmdzLAogICAgICAgICAgICAgICAgICAgICAgZnJhbWUxNi5jYWxsZnJvbV9pcCwgZnJhbWUxNi5tb2R1bGVfY3MsIGZyYW1lMTYucmVsYXksCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZTE2LmVudHJ5X2lwLCBmcmFtZTE2LmVudHJ5X3BvaW50LAogICAgICAgICAgICAgICAgICAgICAgZnJhbWUxNi5icCwgZnJhbWUxNi5pcCwgZnJhbWUxNi5jcyk7CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkclBDLk1vZGUgICAgICAgPSBBZGRyTW9kZTE2MTY7CiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkclBDLlNlZ21lbnQgICAgPSBmcmFtZTE2LmNzOwogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJQQy5PZmZzZXQgICAgID0gZnJhbWUxNi5pcDsKCiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkckZyYW1lLk1vZGUgICAgPSBBZGRyTW9kZTE2MTY7CiAgICAgICAgICAgICAgICBmcmFtZS0+QWRkckZyYW1lLlNlZ21lbnQgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ICA9IGZyYW1lMTYuYnA7CgogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJTdGFjay5Nb2RlICAgID0gQWRkck1vZGUxNjE2OwogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJTdGFjay5TZWdtZW50ID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJSZXR1cm4uTW9kZSAgICA9IEFkZHJNb2RlMTYxNjsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyUmV0dXJuLlNlZ21lbnQgPSBmcmFtZTE2LmNzOwoKICAgICAgICAgICAgICAgIG5leHRfc3dpdGNoID0gY3Vycl9zd2l0Y2g7CiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBuZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihmcmFtZTMyKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgV0FSTigiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIG5leHRfc3dpdGNoKTsKICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3Vycl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwogICAgICAgICAgICAgICAgdG1wLk1vZGUgICAgPSBBZGRyTW9kZTE2MTY7CiAgICAgICAgICAgICAgICB0bXAuU2VnbWVudCA9IFNFTEVDVE9ST0YoY3Vycl9zd2l0Y2gpOwogICAgICAgICAgICAgICAgdG1wLk9mZnNldCAgPSBPRkZTRVRPRihjdXJyX3N3aXRjaCk7CgogICAgICAgICAgICAgICAgaWYgKCFzd19yZWFkX21lbShjYiwgc3dfeGxhdF9hZGRyKGNiLCAmdG1wKSwgJmNoLCBzaXplb2YoY2gpKSkKICAgICAgICAgICAgICAgICAgICBjdXJyX3N3aXRjaCA9IDA7CiAgICAgICAgICAgICAgICBjdXJyX21vZGUgPSBzdG1fMTZiaXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZnJhbWUtPkFkZHJQQyA9IGZyYW1lLT5BZGRyUmV0dXJuOwogICAgICAgICAgICBpZiAoY3Vycl9tb2RlID09IHN0bV8xNmJpdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJTdGFjay5PZmZzZXQgPSBmcmFtZS0+QWRkckZyYW1lLk9mZnNldCArIDIgKiBzaXplb2YoV09SRCk7CiAgICAgICAgICAgICAgICAvKiAicG9wIHVwIiBwcmV2aW91cyBCUCB2YWx1ZSAqLwogICAgICAgICAgICAgICAgaWYgKCFzd19yZWFkX21lbShjYiwgc3dfeGxhdF9hZGRyKGNiLCAmZnJhbWUtPkFkZHJGcmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWwsIHNpemVvZihXT1JEKSkpCiAgICAgICAgICAgICAgICAgICAgZ290byBkb25lX2VycjsKICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ID0gdmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnJhbWUtPkFkZHJTdGFjay5PZmZzZXQgPSBmcmFtZS0+QWRkckZyYW1lLk9mZnNldCArIDIgKiBzaXplb2YoRFdPUkQpOwogICAgICAgICAgICAgICAgLyogInBvcCB1cCIgcHJldmlvdXMgRUJQIHZhbHVlICovCiAgICAgICAgICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBmcmFtZS0+QWRkckZyYW1lLk9mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZS0+QWRkckZyYW1lLk9mZnNldCwgc2l6ZW9mKERXT1JEKSkpCiAgICAgICAgICAgICAgICAgICAgZ290byBkb25lX2VycjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY3Vycl9tb2RlID09IHN0bV8xNmJpdCkKICAgIHsKICAgICAgICBpbnQgICAgIGk7CgogICAgICAgIHAgPSBzd194bGF0X2FkZHIoY2IsICZmcmFtZS0+QWRkckZyYW1lKTsKICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBwICsgc2l6ZW9mKFdPUkQpLCAmdmFsLCBzaXplb2YoV09SRCkpKQogICAgICAgICAgICBnb3RvIGRvbmVfZXJyOwogICAgICAgIGZyYW1lLT5BZGRyUmV0dXJuLk9mZnNldCA9IHZhbDsKICAgICAgICAvKiBnZXQgcG90ZW50aWFsIGNzIGlmIGEgZmFyIGNhbGwgd2FzIHVzZWQgKi8KICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBwICsgMiAqIHNpemVvZihXT1JEKSwgJnZhbCwgc2l6ZW9mKFdPUkQpKSkKICAgICAgICAgICAgZ290byBkb25lX2VycjsKICAgICAgICBpZiAoZnJhbWUtPkFkZHJGcmFtZS5PZmZzZXQgJiAxKQogICAgICAgICAgICBmcmFtZS0+QWRkclJldHVybi5TZWdtZW50ID0gdmFsOyAvKiBmYXIgY2FsbCBhc3N1bWVkICovCiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLCAKICAgICAgICAgICAgICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoKHZhbCAmIDcpID09IDcgJiYgdmFsICE9IGZyYW1lLT5BZGRyUmV0dXJuLlNlZ21lbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExEVF9FTlRSWQlsZTsKCiAgICAgICAgICAgICAgICBpZiAoR2V0VGhyZWFkU2VsZWN0b3JFbnRyeShjYi0+aFRocmVhZCwgdmFsLCAmbGUpICYmCiAgICAgICAgICAgICAgICAgICAgKGxlLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MDgpKSAvKiBjb2RlIHNlZ21lbnQgKi8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBpdCBpcyB2ZXJ5IHVuY29tbW9uIHRvIHB1c2ggYSBjb2RlIHNlZ21lbnQgY3MgYXMKICAgICAgICAgICAgICAgICAgICAgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzIAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGZyYW1lLT5BZGRyUmV0dXJuLlNlZ21lbnQgPSB2YWw7CiAgICAgICAgICAgICAgICB9CgkgICAgfQoJfQogICAgICAgIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ICY9IH4xOwogICAgICAgIC8qIHdlICJwb3AiIHBhcmFtZXRlcnMgYXMgMTYgYml0IGVudGl0aWVzLi4uIG9mIGNvdXJzZSwgdGhpcyB3b24ndAogICAgICAgICAqIHdvcmsgaWYgdGhlIHBhcmFtZXRlciBpcyBpbiBmYWN0IGJpZ2dlciB0aGFuIDE2Yml0LCBidXQKICAgICAgICAgKiB0aGVyZSdzIG5vIHdheSB0byBrbm93IHRoYXQgaGVyZQogICAgICAgICAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZnJhbWUtPlBhcmFtcykgLyBzaXplb2YoZnJhbWUtPlBhcmFtc1swXSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHN3X3JlYWRfbWVtKGNiLCBwICsgKDIgKyBpKSAqIHNpemVvZihXT1JEKSwgJnZhbCwgc2l6ZW9mKHZhbCkpOwogICAgICAgICAgICBmcmFtZS0+UGFyYW1zW2ldID0gdmFsOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoIXN3X3JlYWRfbWVtKGNiLCBmcmFtZS0+QWRkckZyYW1lLk9mZnNldCArIHNpemVvZihEV09SRCksCiAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWUtPkFkZHJSZXR1cm4uT2Zmc2V0LCBzaXplb2YoRFdPUkQpKSkKICAgICAgICB7CiAgICAgICAgICAgIFdBUk4oIkNhbm5vdCByZWFkIG5ldyBmcmFtZSBvZmZzZXQgJTA4bHhcbiIsIGZyYW1lLT5BZGRyRnJhbWUuT2Zmc2V0ICsgc2l6ZW9mKERXT1JEKSk7CiAgICAgICAgICAgIGdvdG8gZG9uZV9lcnI7CiAgICAgICAgfQogICAgICAgIHN3X3JlYWRfbWVtKGNiLCBmcmFtZS0+QWRkckZyYW1lLk9mZnNldCArIDIgKiBzaXplb2YoRFdPUkQpLCAKICAgICAgICAgICAgICAgICAgICBmcmFtZS0+UGFyYW1zLCBzaXplb2YoZnJhbWUtPlBhcmFtcykpOwogICAgfQoKICAgIGZyYW1lLT5GYXIgPSBGQUxTRTsKICAgIGZyYW1lLT5WaXJ0dWFsID0gRkFMU0U7CgogICAgVFJBQ0UoIkxlYXZlOiBQQz0lcyBGcmFtZT0lcyBSZXR1cm49JXMgU3RhY2s9JXMgTW9kZT0lcyBjU3dpdGNoPSUwOGx4IG5Td2l0Y2g9JTA4bHhcbiIsCiAgICAgICAgICB3aW5lX2RiZ3N0cl9hZGRyKCZmcmFtZS0+QWRkclBDKSwgCiAgICAgICAgICB3aW5lX2RiZ3N0cl9hZGRyKCZmcmFtZS0+QWRkckZyYW1lKSwKICAgICAgICAgIHdpbmVfZGJnc3RyX2FkZHIoJmZyYW1lLT5BZGRyUmV0dXJuKSwKICAgICAgICAgIHdpbmVfZGJnc3RyX2FkZHIoJmZyYW1lLT5BZGRyU3RhY2spLCAKICAgICAgICAgIGN1cnJfbW9kZSA9PSBzdG1fc3RhcnQgPyAic3RhcnQiIDogKGN1cnJfbW9kZSA9PSBzdG1fMTZiaXQgPyAiMTZiaXQiIDogIjMyYml0IiksCiAgICAgICAgICBjdXJyX3N3aXRjaCwgbmV4dF9zd2l0Y2gpOwoKICAgIHJldHVybiBUUlVFOwpkb25lX2VycjoKICAgIGN1cnJfbW9kZSA9IHN0bV9kb25lOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVN0YWNrV2FsayAoREJHSEVMUC5AKQogKi8KQk9PTCBXSU5BUEkgU3RhY2tXYWxrKERXT1JEIE1hY2hpbmVUeXBlLCBIQU5ETEUgaFByb2Nlc3MsIEhBTkRMRSBoVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgTFBTVEFDS0ZSQU1FIGZyYW1lLCBMUFZPSUQgY3R4LAogICAgICAgICAgICAgICAgICAgICAgUFJFQURfUFJPQ0VTU19NRU1PUllfUk9VVElORSBmX3JlYWRfbWVtLAogICAgICAgICAgICAgICAgICAgICAgUEZVTkNUSU9OX1RBQkxFX0FDQ0VTU19ST1VUSU5FIEZ1bmN0aW9uVGFibGVBY2Nlc3NSb3V0aW5lLAogICAgICAgICAgICAgICAgICAgICAgUEdFVF9NT0RVTEVfQkFTRV9ST1VUSU5FIEdldE1vZHVsZUJhc2VSb3V0aW5lLAogICAgICAgICAgICAgICAgICAgICAgUFRSQU5TTEFURV9BRERSRVNTX1JPVVRJTkUgZl94bGF0X2FkcikKewogICAgc3RydWN0IHN0YWNrX3dhbGtfY2FsbGJhY2sgIHN3Y2I7CgogICAgVFJBQ0UoIiglbGQsICVwLCAlcCwgJXAsICVwLCAlcCwgJXAsICVwLCAlcClcbiIsCiAgICAgICAgICBNYWNoaW5lVHlwZSwgaFByb2Nlc3MsIGhUaHJlYWQsIGZyYW1lLCBjdHgsCiAgICAgICAgICBmX3JlYWRfbWVtLCBGdW5jdGlvblRhYmxlQWNjZXNzUm91dGluZSwKICAgICAgICAgIEdldE1vZHVsZUJhc2VSb3V0aW5lLCBmX3hsYXRfYWRyKTsKCiAgICBpZiAoTWFjaGluZVR5cGUgIT0gSU1BR0VfRklMRV9NQUNISU5FX0kzODYpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgc3djYi5oUHJvY2VzcyA9IGhQcm9jZXNzOwogICAgc3djYi5oVGhyZWFkID0gaFRocmVhZDsKICAgIHN3Y2IuaXMzMiA9IFRSVUU7CiAgICAvKiBzaWdoLi4uIE1TIGlzbid0IGV2ZW4gY29uc2lzdGVudCBpbiB0aGUgZnVuYyBwcm90b3R5cGVzICovCiAgICBzd2NiLnUuczMyLmZfcmVhZF9tZW0gPSAoZl9yZWFkX21lbSkgPyBmX3JlYWRfbWVtIDogcmVhZF9tZW07CiAgICBzd2NiLnUuczMyLmZfeGxhdF9hZHIgPSAoZl94bGF0X2FkcikgPyBmX3hsYXRfYWRyIDogYWRkcl90b19saW5lYXI7CgogICAgcmV0dXJuIHN0YWNrX3dhbGsoJnN3Y2IsIGZyYW1lKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU3RhY2tXYWxrNjQgKERCR0hFTFAuQCkKICovCkJPT0wgV0lOQVBJIFN0YWNrV2FsazY0KERXT1JEIE1hY2hpbmVUeXBlLCBIQU5ETEUgaFByb2Nlc3MsIEhBTkRMRSBoVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICBMUFNUQUNLRlJBTUU2NCBmcmFtZTY0LCBMUFZPSUQgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICBQUkVBRF9QUk9DRVNTX01FTU9SWV9ST1VUSU5FNjQgZl9yZWFkX21lbSwKICAgICAgICAgICAgICAgICAgICAgICAgUEZVTkNUSU9OX1RBQkxFX0FDQ0VTU19ST1VUSU5FNjQgRnVuY3Rpb25UYWJsZUFjY2Vzc1JvdXRpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBHRVRfTU9EVUxFX0JBU0VfUk9VVElORTY0IEdldE1vZHVsZUJhc2VSb3V0aW5lLAogICAgICAgICAgICAgICAgICAgICAgICBQVFJBTlNMQVRFX0FERFJFU1NfUk9VVElORTY0IGZfeGxhdF9hZHIpCnsKICAgIHN0cnVjdCBzdGFja193YWxrX2NhbGxiYWNrICBzd2NiOwogICAgU1RBQ0tGUkFNRSAgICAgICAgICAgICAgICAgIGZyYW1lMzI7CiAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICAgcmV0OwoKICAgIFRSQUNFKCIoJWxkLCAlcCwgJXAsICVwLCAlcCwgJXAsICVwLCAlcCwgJXApIC0gc3R1YiFcbiIsCiAgICAgICAgICBNYWNoaW5lVHlwZSwgaFByb2Nlc3MsIGhUaHJlYWQsIGZyYW1lNjQsIGN0eCwKICAgICAgICAgIGZfcmVhZF9tZW0sIEZ1bmN0aW9uVGFibGVBY2Nlc3NSb3V0aW5lLAogICAgICAgICAgR2V0TW9kdWxlQmFzZVJvdXRpbmUsIGZfeGxhdF9hZHIpOwoKICAgIGlmIChNYWNoaW5lVHlwZSAhPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NikKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBhZGRyXzY0dG8zMigmZnJhbWU2NC0+QWRkclBDLCAgICAgJmZyYW1lMzIuQWRkclBDKTsKICAgIGFkZHJfNjR0bzMyKCZmcmFtZTY0LT5BZGRyUmV0dXJuLCAmZnJhbWUzMi5BZGRyUmV0dXJuKTsKICAgIGFkZHJfNjR0bzMyKCZmcmFtZTY0LT5BZGRyRnJhbWUsICAmZnJhbWUzMi5BZGRyRnJhbWUpOwogICAgYWRkcl82NHRvMzIoJmZyYW1lNjQtPkFkZHJTdGFjaywgICZmcmFtZTMyLkFkZHJTdGFjayk7CiAgICBhZGRyXzY0dG8zMigmZnJhbWU2NC0+QWRkckJTdG9yZSwgJmZyYW1lMzIuQWRkckJTdG9yZSk7CiAgICBmcmFtZTMyLkZ1bmNUYWJsZUVudHJ5ID0gZnJhbWU2NC0+RnVuY1RhYmxlRW50cnk7IC8qIEZJWE1FICovCiAgICBmcmFtZTMyLkZhciA9IGZyYW1lNjQtPkZhcjsKICAgIGZyYW1lMzIuVmlydHVhbCA9IGZyYW1lNjQtPlZpcnR1YWw7CiAgICBmcmFtZTMyLlJlc2VydmVkWzBdID0gKFVMT05HKWZyYW1lNjQtPlJlc2VydmVkWzBdOwogICAgZnJhbWUzMi5SZXNlcnZlZFsxXSA9IChVTE9ORylmcmFtZTY0LT5SZXNlcnZlZFsxXTsKICAgIGZyYW1lMzIuUmVzZXJ2ZWRbMl0gPSAoVUxPTkcpZnJhbWU2NC0+UmVzZXJ2ZWRbMl07CiAgICAvKiB3ZSBkb24ndCBoYW5kbGUgS2RIZWxwICovCgogICAgc3djYi5oUHJvY2VzcyA9IGhQcm9jZXNzOwogICAgc3djYi5oVGhyZWFkID0gaFRocmVhZDsKICAgIHN3Y2IuaXMzMiA9IEZBTFNFOwogICAgLyogc2lnaC4uLiBNUyBpc24ndCBldmVuIGNvbnNpc3RlbnQgaW4gdGhlIGZ1bmMgcHJvdG90eXBlcyAqLwogICAgc3djYi51LnM2NC5mX3JlYWRfbWVtID0gKGZfcmVhZF9tZW0pID8gZl9yZWFkX21lbSA6IHJlYWRfbWVtNjQ7CiAgICBzd2NiLnUuczY0LmZfeGxhdF9hZHIgPSBmX3hsYXRfYWRyOwoKICAgIHJldCA9IHN0YWNrX3dhbGsoJnN3Y2IsICZmcmFtZTMyKTsKCiAgICBhZGRyXzMydG82NCgmZnJhbWUzMi5BZGRyUEMsICAgICAmZnJhbWU2NC0+QWRkclBDKTsKICAgIGFkZHJfMzJ0bzY0KCZmcmFtZTMyLkFkZHJSZXR1cm4sICZmcmFtZTY0LT5BZGRyUmV0dXJuKTsKICAgIGFkZHJfMzJ0bzY0KCZmcmFtZTMyLkFkZHJGcmFtZSwgICZmcmFtZTY0LT5BZGRyRnJhbWUpOwogICAgYWRkcl8zMnRvNjQoJmZyYW1lMzIuQWRkclN0YWNrLCAgJmZyYW1lNjQtPkFkZHJTdGFjayk7CiAgICBhZGRyXzMydG82NCgmZnJhbWUzMi5BZGRyQlN0b3JlLCAmZnJhbWU2NC0+QWRkckJTdG9yZSk7CiAgICBmcmFtZTY0LT5GdW5jVGFibGVFbnRyeSA9IGZyYW1lMzIuRnVuY1RhYmxlRW50cnk7IC8qIEZJWE1FICovCiAgICBmcmFtZTY0LT5QYXJhbXNbMF0gPSAoVUxPTkcpZnJhbWUzMi5QYXJhbXNbMF07CiAgICBmcmFtZTY0LT5QYXJhbXNbMV0gPSAoVUxPTkcpZnJhbWUzMi5QYXJhbXNbMV07CiAgICBmcmFtZTY0LT5QYXJhbXNbMl0gPSAoVUxPTkcpZnJhbWUzMi5QYXJhbXNbMl07CiAgICBmcmFtZTY0LT5QYXJhbXNbM10gPSAoVUxPTkcpZnJhbWUzMi5QYXJhbXNbM107CiAgICBmcmFtZTY0LT5QYXJhbXNbNF0gPSAoVUxPTkcpZnJhbWUzMi5QYXJhbXNbNF07CiAgICBmcmFtZTY0LT5GYXIgPSBmcmFtZTMyLkZhcjsKICAgIGZyYW1lNjQtPlZpcnR1YWwgPSBmcmFtZTMyLlZpcnR1YWw7CiAgICBmcmFtZTY0LT5SZXNlcnZlZFswXSA9IChVTE9ORylmcmFtZTMyLlJlc2VydmVkWzBdOwogICAgZnJhbWU2NC0+UmVzZXJ2ZWRbMV0gPSAoVUxPTkcpZnJhbWUzMi5SZXNlcnZlZFsxXTsKICAgIGZyYW1lNjQtPlJlc2VydmVkWzJdID0gKFVMT05HKWZyYW1lMzIuUmVzZXJ2ZWRbMl07CiAgICAvKiB3ZSBkb24ndCBoYW5kbGUgS2RIZWxwICovCgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU3ltUmVnaXN0ZXJGdW5jdGlvbkVudHJ5Q2FsbGJhY2sgKERCR0hFTFAuQCkKICoKICoKICovCkJPT0wgV0lOQVBJIFN5bVJlZ2lzdGVyRnVuY3Rpb25FbnRyeUNhbGxiYWNrKEhBTkRMRSBoUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZTUJPTF9GVU5DRU5UUllfQ0FMTEJBQ0sgY2IsIFBWT0lEIHVzZXIpCnsKICAgIEZJWE1FKCIoJXAgJXAgJXApOiBzdHViIVxuIiwgaFByb2MsIGNiLCB1c2VyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVN5bVJlZ2lzdGVyRnVuY3Rpb25FbnRyeUNhbGxiYWNrNjQgKERCR0hFTFAuQCkKICoKICoKICovCkJPT0wgV0lOQVBJIFN5bVJlZ2lzdGVyRnVuY3Rpb25FbnRyeUNhbGxiYWNrNjQoSEFORExFIGhQcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWU1CT0xfRlVOQ0VOVFJZX0NBTExCQUNLNjQgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkc2NCB1c2VyKQp7CiAgICBGSVhNRSgiKCVwICVwICVzKTogc3R1YiFcbiIsIGhQcm9jLCBjYiwgd2luZV9kYmdzdHJfbG9uZ2xvbmcodXNlcikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQo=