LyoKICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzLCAxOTk0CiAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CiAqIEtpbSBMZXRrZW1hbi4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgogKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKLyogMTk5OS0wMi0wMQlKZWFuLUZyYW5jb2lzIEJpZ25vbGxlczogYWRkZWQgb3B0aW9uICctbScgdG8gZGlzcGxheQogKgkJbW9uZGF5IGFzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIDIwMDAtMDktMDEgIE1pY2hhZWwgQ2hhcmxlcyBQcnV6bmljayA8ZHVtbXlAbmV0d2l6Lm5ldD4KICogICAgICAgICAgICAgQWRkZWQgIi0zIiBvcHRpb24gdG8gcHJpbnQgcHJldi9uZXh0IG1vbnRoIHdpdGggY3VycmVudC4KICogICAgICAgICAgICAgQWRkZWQgb3Zlci1yaWRhYmxlIGRlZmF1bHQgTlVNX01PTlRIUyBhbmQgIi0xIiBvcHRpb24gdG8KICogICAgICAgICAgICAgZ2V0IHRyYWRpdGlvbmFsIG91dHB1dCB3aGVuIC0zIGlzIHRoZSBkZWZhdWx0LiAgSSBob3BlIHRoYXQKICogICAgICAgICAgICAgZW5vdWdoIHBlb3BsZSB3aWxsIGxpa2UgLTMgYXMgdGhlIGRlZmF1bHQgdGhhdCBvbmUgZGF5IHRoZQogKiAgICAgICAgICAgICBwcm9kdWN0IGNhbiBiZSBzaGlwcGVkIHRoYXQgd2F5LgogKgogKiAyMDAxLTA1LTA3ICBQYWJsbyBTYXJhdHhhZ2EgPHBhYmxvQG1hbmRyYWtlc29mdC5jb20+CiAqICAgICAgICAgICAgIEZpeGVkIHRoZSBidWdzIHdpdGggbXVsdGktYnl0ZSBjaGFyc2V0ICh6ZzogY2prLCB1dGYtOCkKICogICAgICAgICAgICAgZGlzcGxheWluZy4gbWFkZSB0aGUgJ21vbnRoIHllYXInICgiJXMgJWQiKSBoZWFkZXIgdHJhbnNsYXRhYmxlCiAqICAgICAgICAgICAgIHNvIGl0IGNhbiBiZSBhZGFwdGVkIHRvIGNvbnZlbnRpb25zIHVzZWQgYnkgZGlmZmVyZW50IGxhbmd1YWdlcwogKiAgICAgICAgICAgICBhZGRlZCBzdXBwb3J0IHRvIHJlYWQgImZpcnN0X3dlZWtkYXkiIGxvY2FsZSBpbmZvcm1hdGlvbgogKiAgICAgICAgICAgICBzdGlsbCB0byBkbzogc3VwcG9ydCBmb3IgJ2NhbF9kaXJlY3Rpb24nICh3aWxsIHJlcXVpcmUgYSBtYWpvcgogKiAgICAgICAgICAgICByZXdyaXRlIG9mIHRoZSBkaXNwbGF5aW5nKSBhbmQgcHJvcGVyIGhhbmRsaW5nIG9mIFJUTCBzY3JpcHRzCiAqLwoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZXJyLmg+CgojaW5jbHVkZSAiYy5oIgojaW5jbHVkZSAibmxzLmgiCgojaWYgZGVmaW5lZChIQVZFX0xJQk5DVVJTRVMpIHx8IGRlZmluZWQoSEFWRV9MSUJOQ1VSU0VTVykKCiNpZmRlZiBIQVZFX05DVVJTRVNfSAojaW5jbHVkZSA8bmN1cnNlcy5oPgojZWxpZiBkZWZpbmVkKEhBVkVfTkNVUlNFU19OQ1VSU0VTX0gpCiNpbmNsdWRlIDxuY3Vyc2VzL25jdXJzZXMuaD4KI2VuZGlmCgojaW5jbHVkZSA8dGVybS5oPiAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZSBhZnRlciA8Y3Vyc2VzLmg+ICovCgpzdGF0aWMgdm9pZApteV9zZXR1cHRlcm0oY29uc3QgY2hhciAqdGVybSwgaW50IGZpbGRlcywgaW50ICplcnJyZXQpIHsKICAgIHNldHVwdGVybSgoY2hhciopdGVybSwgZmlsZGVzLCBlcnJyZXQpOwp9CgpzdGF0aWMgdm9pZApteV9wdXRzdHJpbmcoY2hhciAqcykgewogICAgIHB1dHAocyk7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICoKbXlfdGdldHN0cihjaGFyICpzLCBjaGFyICpzcykgewogICAgY29uc3QgY2hhciogcmV0ID0gdGlnZXRzdHIoc3MpOwogICAgaWYgKCFyZXQgfHwgcmV0PT0oY2hhciopLTEpCiAgICAgICAgcmV0dXJuICIiOwogICAgZWxzZQogICAgICAgIHJldHVybiByZXQ7Cn0KCiNlbGlmIGRlZmluZWQoSEFWRV9MSUJURVJNQ0FQKQoKI2luY2x1ZGUgPHRlcm1jYXAuaD4KCmNoYXIgdGVybWJ1ZmZlcls0MDk2XTsKY2hhciB0Y2J1ZmZlcls0MDk2XTsKY2hhciAqc3RyYnVmID0gdGVybWJ1ZmZlcjsKCnN0YXRpYyB2b2lkCm15X3NldHVwdGVybShjb25zdCBjaGFyICp0ZXJtLCBpbnQgZmlsZGVzLCBpbnQgKmVycnJldCkgewogICAgKmVycnJldCA9IHRnZXRlbnQodGNidWZmZXIsIHRlcm0pOwp9CgpzdGF0aWMgdm9pZApteV9wdXRzdHJpbmcoY2hhciAqcykgewogICAgIHRwdXRzIChzLCAxLCBwdXRjaGFyKTsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKgpteV90Z2V0c3RyKGNoYXIgKnMsIGNoYXIgKnNzKSB7CiAgICBjb25zdCBjaGFyKiByZXQgPSB0Z2V0c3RyKHMsICZzdHJidWYpOwogICAgaWYgKCFyZXQpCiAgICAgICAgcmV0dXJuICIiOwogICAgZWxzZQogICAgICAgIHJldHVybiByZXQ7Cn0KCiNlbHNlIC8qICEgKEhBVkVfTElCVEVSTUNBUCB8fCBIQVZFX0xJQk5DVVJTRVMgfHwgSEFWRV9MSUJOQ1VSU0VTVykgKi8KCnN0YXRpYyB2b2lkCm15X3B1dHN0cmluZyhjaGFyICpzKSB7CiAgICAgZnB1dHMocywgc3Rkb3V0KTsKfQoKI2VuZGlmCgoKY29uc3QgY2hhcgkqdGVybT0iIjsKY29uc3QgY2hhcgkqU2VudGVyPSIiLCAqU2V4aXQ9IiI7LyogZW50ZXIgYW5kIGV4aXQgc3RhbmRvdXQgbW9kZSAqLwppbnQJCVNsZW47CQkvKiBzdHJsZW4gb2YgU2VudGVyK1NleGl0ICovCmNoYXIJCSpIcm93OwkJLyogcG9pbnRlciB0byBoaWdobGlnaHRlZCByb3cgaW4gbW9udGggKi8KCiNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKIyBpbmNsdWRlIDxsYW5naW5mby5oPgojZW5kaWYKCiNpbmNsdWRlICJ3aWRlY2hhci5oIgoKLyogYWxsb3cgY29tcGlsZS10aW1lIGRlZmluZSB0byBvdmVyLXJpZGUgZGVmYXVsdCAqLwojaWZuZGVmIE5VTV9NT05USFMKI2RlZmluZSBOVU1fTU9OVEhTIDEKI2VuZGlmCgojaWYgKCBOVU1fTU9OVEhTICE9IDEgJiYgTlVNX01PTlRIUyAhPTMgKQojZXJyb3IgTlVNX01PTlRIUyBtdXN0IGJlIDEgb3IgMwojZW5kaWYKCiNkZWZpbmUJVEhVUlNEQVkJCTQJCS8qIGZvciByZWZvcm1hdGlvbiAqLwojZGVmaW5lCVNBVFVSREFZCQk2CQkvKiAxIEphbiAxIHdhcyBhIFNhdHVyZGF5ICovCgojZGVmaW5lCUZJUlNUX01JU1NJTkdfREFZCTYzOTc5OQkJLyogMyBTZXAgMTc1MiAqLwojZGVmaW5lCU5VTUJFUl9NSVNTSU5HX0RBWVMJMTEJCS8qIDExIGRheSBjb3JyZWN0aW9uICovCgojZGVmaW5lCU1BWERBWVMJCQk0MgkJLyogc2xvdHMgaW4gYSBtb250aCBhcnJheSAqLwojZGVmaW5lCVNQQUNFCQkJLTEJCS8qIHVzZWQgaW4gZGF5IGFycmF5ICovCgpzdGF0aWMgaW50IGRheXNfaW5fbW9udGhbMl1bMTNdID0gewoJezAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9LAoJezAsIDMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9LAp9OwoKI2RlZmluZSBTRVAxNzUyX09GUwkJNAkJLyogc2VwMTc1Mls0XSBpcyBhIFN1bmRheSAqLwoKLyogMSBTZXAgMTc1MiBpcyByZXByZXNlbnRlZCBieSBzZXAxNzUyWzZdIGFuZCBqX3NlcDE3NTJbNl0gKi8KaW50IHNlcDE3NTJbTUFYREFZUys2XSA9IHsKCQkJCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAkxLAkyLAkxNCwJMTUsCTE2LAoJMTcsCTE4LAkxOSwJMjAsCTIxLAkyMiwJMjMsCgkyNCwJMjUsCTI2LAkyNywJMjgsCTI5LAkzMCwKCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCglTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwKCVNQQUNFLAlTUEFDRQp9LCBqX3NlcDE3NTJbTUFYREFZUys2XSA9IHsKCQkJCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAkyNDUsCTI0NiwJMjU4LAkyNTksCTI2MCwKCTI2MSwJMjYyLAkyNjMsCTI2NCwJMjY1LAkyNjYsCTI2NywKCTI2OCwJMjY5LAkyNzAsCTI3MSwJMjcyLAkyNzMsCTI3NCwKCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCglTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwKCVNQQUNFLAlTUEFDRQp9LCBlbXB0eVtNQVhEQVlTXSA9IHsKCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCglTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwKCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAoJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCglTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRSwJU1BBQ0UsCVNQQUNFLAlTUEFDRQp9OwoKI2RlZmluZQlEQVlfTEVOCQkzCQkvKiAzIHNwYWNlcyBwZXIgZGF5ICovCiNkZWZpbmUJSl9EQVlfTEVOCTQJCS8qIDQgc3BhY2VzIHBlciBkYXkgKi8KI2RlZmluZQlXRUVLX0xFTgkyMQkJLyogNyBkYXlzICogMyBjaGFyYWN0ZXJzICovCiNkZWZpbmUJSl9XRUVLX0xFTgkyOAkJLyogNyBkYXlzICogNCBjaGFyYWN0ZXJzICovCiNkZWZpbmUJSEVBRF9TRVAJMgkJLyogc3BhY2VzIGJldHdlZW4gZGF5IGhlYWRpbmdzICovCiNkZWZpbmUJSl9IRUFEX1NFUAkyCgovKiB1dGYtOCBjYW4gaGF2ZSB1cCB0byA2IGJ5dGVzIHBlciBjaGFyOyBhbmQgYW4gZXh0cmEgYnl0ZSBmb3IgZW5kaW5nIFwwICovCmNoYXIgZGF5X2hlYWRpbmdzW1dFRUtfTEVOKjYrMV07Ci8qIHdlZWtzdGFydCA9IDEgID0+ICAgIiBNIFR1ICBXIFRoICBGICBTICBTICIgKi8KY2hhciBqX2RheV9oZWFkaW5nc1tKX1dFRUtfTEVOKjYrMV07Ci8qIHdlZWtzdGFydCA9IDEgID0+ICAgIiAgTSAgVHUgICBXICBUaCAgIEYgICBTICAgUyAiICovCmNvbnN0IGNoYXIgKmZ1bGxfbW9udGhbMTJdOwoKLyogbGVhcCB5ZWFyIC0tIGFjY291bnQgZm9yIGdyZWdvcmlhbiByZWZvcm1hdGlvbiBpbiAxNzUyICovCiNkZWZpbmUJbGVhcF95ZWFyKHlyKSBcCgkoKHlyKSA8PSAxNzUyID8gISgoeXIpICUgNCkgOiBcCgkoISgoeXIpICUgNCkgJiYgKCh5cikgJSAxMDApKSB8fCAhKCh5cikgJSA0MDApKQoKLyogbnVtYmVyIG9mIGNlbnR1cmllcyBzaW5jZSAxNzAwLCBub3QgaW5jbHVzaXZlICovCiNkZWZpbmUJY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpIFwKCSgoeXIpID4gMTcwMCA/ICh5cikgLyAxMDAgLSAxNyA6IDApCgovKiBudW1iZXIgb2YgY2VudHVyaWVzIHNpbmNlIDE3MDAgd2hvc2UgbW9kdWxvIG9mIDQwMCBpcyAwICovCiNkZWZpbmUJcXVhZF9jZW50dXJpZXNfc2luY2VfMTcwMCh5cikgXAoJKCh5cikgPiAxNjAwID8gKCh5cikgLSAxNjAwKSAvIDQwMCA6IDApCgovKiBudW1iZXIgb2YgbGVhcCB5ZWFycyBiZXR3ZWVuIHllYXIgMSBhbmQgdGhpcyB5ZWFyLCBub3QgaW5jbHVzaXZlICovCiNkZWZpbmUJbGVhcF95ZWFyc19zaW5jZV95ZWFyXzEoeXIpIFwKCSgoeXIpIC8gNCAtIGNlbnR1cmllc19zaW5jZV8xNzAwKHlyKSArIHF1YWRfY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpKQoKLyogMCA9PiBzdW5kYXksIDEgPT4gbW9uZGF5ICovCmludCB3ZWVrc3RhcnQ9MDsKaW50IGp1bGlhbjsKCiNkZWZpbmUgVE9EQVlfRkxBRwkJMHg0MDAJCS8qIGZsYWcgZGF5IGZvciBoaWdobGlnaHRpbmcgKi8KCiNkZWZpbmUgRk1UX1NUX0xJTkVTIDgKI2RlZmluZSBGTVRfU1RfQ0hBUlMgMzAwCS8qIDkwIHN1ZmZpY2VzIGluIG1vc3QgbG9jYWxlcyAqLwpzdHJ1Y3QgZm10X3N0CnsKICBjaGFyIHNbRk1UX1NUX0xJTkVTXVtGTVRfU1RfQ0hBUlNdOwp9OwoKY2hhciAqIGFzY2lpX2RheShjaGFyICosIGludCk7CmludCBjZW50ZXJfc3RyKGNvbnN0IGNoYXIqIHNyYywgY2hhciogZGVzdCwgc2l6ZV90IGRlc3Rfc2l6ZSwgaW50IHdpZHRoKTsKdm9pZCBjZW50ZXIoY29uc3QgY2hhciAqLCBpbnQsIGludCk7CnZvaWQgZGF5X2FycmF5KGludCwgaW50LCBpbnQsIGludCAqKTsKaW50IGRheV9pbl93ZWVrKGludCwgaW50LCBpbnQpOwppbnQgZGF5X2luX3llYXIoaW50LCBpbnQsIGludCk7CnZvaWQgeWVhcmx5KGludCwgaW50KTsKdm9pZCBqX3llYXJseShpbnQsIGludCk7CnZvaWQgZG9fbW9udGhseShpbnQsIGludCwgaW50LCBzdHJ1Y3QgZm10X3N0Kik7CnZvaWQgbW9udGhseShpbnQsIGludCwgaW50KTsKdm9pZCBtb250aGx5MyhpbnQsIGludCwgaW50KTsKdm9pZCB0cmltX3RyYWlsaW5nX3NwYWNlcyhjaGFyICopOwp2b2lkIHVzYWdlKHZvaWQpOwp2b2lkIGhlYWRlcnNfaW5pdCh2b2lkKTsKZXh0ZXJuIGNoYXIgKl9fcHJvZ25hbWU7CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCXN0cnVjdCB0bSAqbG9jYWxfdGltZTsKCXRpbWVfdCBub3c7CglpbnQgY2gsIGRheSwgbW9udGgsIHllYXIsIHlmbGFnOwoJY2hhciAqcHJvZ25hbWUsICpwOwoJaW50IG51bV9tb250aHMgPSBOVU1fTU9OVEhTOwoKCXByb2duYW1lID0gYXJndlswXTsKCWlmICgocCA9IHN0cnJjaHIocHJvZ25hbWUsICcvJykpICE9IE5VTEwpCgkJcHJvZ25hbWUgPSBwKzE7CglfX3Byb2duYW1lID0gcHJvZ25hbWU7CgoJc2V0bG9jYWxlKExDX0FMTCwgIiIpOwoJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKCXRleHRkb21haW4oUEFDS0FHRSk7CgojaWYgZGVmaW5lZChIQVZFX0xJQk5DVVJTRVMpIHx8IGRlZmluZWQoSEFWRV9MSUJOQ1VSU0VTVykgfHwgZGVmaW5lZChIQVZFX0xJQlRFUk1DQVApCglpZiAoKHRlcm0gPSBnZXRlbnYoIlRFUk0iKSkpIHsKCQlpbnQgcmV0OwoJCW15X3NldHVwdGVybSh0ZXJtLCAxLCAmcmV0KTsKCQlpZiAocmV0ID4gMCkgewoJCQlTZW50ZXIgPSBteV90Z2V0c3RyKCJzbyIsInNtc28iKTsKCQkJU2V4aXQgPSBteV90Z2V0c3RyKCJzZSIsInJtc28iKTsKCQkJU2xlbiA9IHN0cmxlbihTZW50ZXIpICsgc3RybGVuKFNleGl0KTsKCQl9Cgl9CiNlbmRpZgoKLyoKICogVGhlIHRyYWRpdGlvbmFsIFVuaXggY2FsIHV0aWxpdHkgc3RhcnRzIHRoZSB3ZWVrIGF0IFN1bmRheSwKICogd2hpbGUgSVNPIDg2MDEgc3RhcnRzIGF0IE1vbmRheS4gV2UgcmVhZCB0aGUgc3RhcnQgZGF5IGZyb20KICogdGhlIGxvY2FsZSBkYXRhYmFzZSwgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKICogLXMgKFN1bmRheSkgb3IgLW0gKE1vbmRheSkgb3B0aW9ucy4KICovCiNpZiBIQVZFX0RFQ0xfX05MX1RJTUVfV0VFS18xU1REQVkKCS8qCgkgKiBZb3UgbmVlZCB0byB1c2UgMiBsb2NhbGUgdmFyaWFibGVzIHRvIGdldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLgoJICogVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBmaXJzdF93ZWVrZGF5PTIgYW5kIGZpcnN0X3dvcmtkYXk9MSBmb3IKCSAqIHRoZSByYXJlIGNhc2Ugd2hlcmUgd29ya2luZyBkYXlzIHNwYW4gYWNyb3NzIDIgd2Vla3MuCgkgKiBUaGlzIHNoZWxsIHNjcmlwdCBzaG93cyB0aGUgY29tYmluYXRpb25zIGFuZCBjYWxjdWxhdGlvbnMgaW52b2x2ZWQ6CgoJIGZvciBMQU5HIGluIGVuX1VTIHJ1X1JVIGZyX0ZSIGNzYl9QTCBQT1NJWDsgZG8KCSAgIHByaW50ZiAiJXM6XHQlcyArICVzIC0xID0gIiAkTEFORyAkKGxvY2FsZSB3ZWVrLTFzdGRheSBmaXJzdF93ZWVrZGF5KQoJICAgZGF0ZSAtZCIkKGxvY2FsZSB3ZWVrLTFzdGRheSkgKyQoKCQobG9jYWxlIGZpcnN0X3dlZWtkYXkpLTEpKWRheSIgKyV3CgkgZG9uZQoKCSBlbl9VUzogIDE5OTcxMTMwICsgMSAtMSA9IDAgICMwID0gc3VuZGF5CgkgcnVfUlU6ICAxOTk3MTEzMCArIDIgLTEgPSAxCgkgZnJfRlI6ICAxOTk3MTIwMSArIDEgLTEgPSAxCgkgY3NiX1BMOiAxOTk3MTIwMSArIDIgLTEgPSAyCgkgUE9TSVg6ICAxOTk3MTIwMSArIDcgLTEgPSAwCgkgKi8KCXsKCQlpbnQgd2ZkOwoJCXVuaW9uIHsgdW5zaWduZWQgaW50IHdvcmQ7IGNoYXIgKnN0cmluZzsgfSB2YWw7CgkJdmFsLnN0cmluZyA9IG5sX2xhbmdpbmZvKF9OTF9USU1FX1dFRUtfMVNUREFZKTsKCgkJd2ZkID0gdmFsLndvcmQ7CgkJd2ZkID0gZGF5X2luX3dlZWsod2ZkICUgMTAwLCAod2ZkIC8gMTAwKSAlIDEwMCwgd2ZkIC8gKDEwMCAqIDEwMCkpOwoJCXdlZWtzdGFydCA9ICh3ZmQgKyAqbmxfbGFuZ2luZm8oX05MX1RJTUVfRklSU1RfV0VFS0RBWSkgLSAxKSAlIDc7Cgl9CiNlbmRpZgoKCXlmbGFnID0gMDsKCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjEzbWpzeVYiKSkgIT0gLTEpCgkJc3dpdGNoKGNoKSB7CgkJY2FzZSAnMSc6CgkJCW51bV9tb250aHMgPSAxOwkJLyogZGVmYXVsdCAqLwoJCQlicmVhazsKCQljYXNlICczJzoKCQkJbnVtX21vbnRocyA9IDM7CgkJCWJyZWFrOwoJCWNhc2UgJ3MnOgoJCQl3ZWVrc3RhcnQgPSAwOwkJLyogZGVmYXVsdCAqLwoJCQlicmVhazsKCQljYXNlICdtJzoKCQkJd2Vla3N0YXJ0ID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnaic6CgkJCWp1bGlhbiA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3knOgoJCQl5ZmxhZyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ1YnOgoJCQlwcmludGYoXygiJXMgZnJvbSAlc1xuIiksCgkJCSAgICAgICBwcm9nbmFtZSwgUEFDS0FHRV9TVFJJTkcpOwoJCQlyZXR1cm4gMDsKCQljYXNlICc/JzoKCQlkZWZhdWx0OgoJCQl1c2FnZSgpOwoJCX0KCWFyZ2MgLT0gb3B0aW5kOwoJYXJndiArPSBvcHRpbmQ7CgoJdGltZSgmbm93KTsKCWxvY2FsX3RpbWUgPSBsb2NhbHRpbWUoJm5vdyk7CgoJZGF5ID0gbW9udGggPSB5ZWFyID0gMDsKCXN3aXRjaChhcmdjKSB7CgljYXNlIDM6CgkJaWYgKChkYXkgPSBhdG9pKCphcmd2KyspKSA8IDEgfHwgZGF5ID4gMzEpCgkJCWVycngoMSwgXygiaWxsZWdhbCBkYXkgdmFsdWU6IHVzZSAxLSVkIiksIDMxKTsKCQkvKiBGQUxMVEhST1VHSCAqLwoJY2FzZSAyOgoJCWlmICgobW9udGggPSBhdG9pKCphcmd2KyspKSA8IDEgfHwgbW9udGggPiAxMikKCQkJZXJyeCgxLCBfKCJpbGxlZ2FsIG1vbnRoIHZhbHVlOiB1c2UgMS0xMiIpKTsKCQkvKiBGQUxMVEhST1VHSCAqLwoJY2FzZSAxOgoJCWlmICgoeWVhciA9IGF0b2koKmFyZ3YpKSA8IDEgfHwgeWVhciA+IDk5OTkpCgkJCWVycngoMSwgXygiaWxsZWdhbCB5ZWFyIHZhbHVlOiB1c2UgMS05OTk5IikpOwoJCWlmIChkYXkpIHsKCQkJaW50IGRtID0gZGF5c19pbl9tb250aFtsZWFwX3llYXIoeWVhcildW21vbnRoXTsKCQkJaWYgKGRheSA+IGRtKQoJCQkJZXJyeCgxLCBfKCJpbGxlZ2FsIGRheSB2YWx1ZTogdXNlIDEtJWQiKSwgZG0pOwoJCQlkYXkgPSBkYXlfaW5feWVhcihkYXksIG1vbnRoLCB5ZWFyKTsKCQl9IGVsc2UgaWYgKChsb2NhbF90aW1lLT50bV95ZWFyICsgMTkwMCkgPT0geWVhcikgewoJCQlkYXkgPSBsb2NhbF90aW1lLT50bV95ZGF5ICsgMTsKCQl9CgkJaWYgKCFtb250aCkKCQkJeWZsYWc9MTsKCQlicmVhazsKCWNhc2UgMDoKCQlkYXkgPSBsb2NhbF90aW1lLT50bV95ZGF5ICsgMTsKCQl5ZWFyID0gbG9jYWxfdGltZS0+dG1feWVhciArIDE5MDA7CgkJbW9udGggPSBsb2NhbF90aW1lLT50bV9tb24gKyAxOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQl1c2FnZSgpOwoJfQoJaGVhZGVyc19pbml0KCk7CgoJaWYgKCFpc2F0dHkoMSkpCgkJZGF5ID0gMDsgLyogZG9uJ3QgaGlnaGxpZ2h0ICovCgoJaWYgKHlmbGFnICYmIGp1bGlhbikKCQlqX3llYXJseShkYXksIHllYXIpOwoJZWxzZSBpZiAoeWZsYWcpCgkJeWVhcmx5KGRheSwgeWVhcik7CgllbHNlIGlmIChudW1fbW9udGhzID09IDEpCgkJbW9udGhseShkYXksIG1vbnRoLCB5ZWFyKTsKCWVsc2UgaWYgKG51bV9tb250aHMgPT0gMykKCQltb250aGx5MyhkYXksIG1vbnRoLCB5ZWFyKTsKCWV4aXQoMCk7Cn0KCnZvaWQgaGVhZGVyc19pbml0KHZvaWQpCnsKICBpbnQgaSwgd2Q7CiAgY2hhciAqY3VyX2RoID0gZGF5X2hlYWRpbmdzLCAqY3VyX2pfZGggPSBqX2RheV9oZWFkaW5nczsKCiAgc3RyY3B5KGRheV9oZWFkaW5ncywiIik7CiAgc3RyY3B5KGpfZGF5X2hlYWRpbmdzLCIiKTsKCiNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKIyBkZWZpbmUgd2Vla2RheSh3ZCkJbmxfbGFuZ2luZm8oQUJEQVlfMSt3ZCkKI2Vsc2UKIyBkZWZpbmUgd2Vla2RheSh3ZCkJX3RpbWVfaW5mby0+YWJicmV2X3drZGF5W3dkXQojZW5kaWYKCiAgZm9yKGkgPSAwIDsgaSA8IDcgOyBpKysgKSB7CiAgICAgc3NpemVfdCBzcGFjZV9sZWZ0OwogICAgIHdkID0gKGkgKyB3ZWVrc3RhcnQpICUgNzsKCiAgICAgaWYgKGkpCiAgICAgICAgc3RyY2F0KGN1cl9kaCsrLCAiICIpOwogICAgIHNwYWNlX2xlZnQgPSBzaXplb2YoZGF5X2hlYWRpbmdzKSAtIChjdXJfZGggLSBkYXlfaGVhZGluZ3MpOwogICAgIGlmKHNwYWNlX2xlZnQgPD0gMikKICAgICAgICBicmVhazsKICAgICBjdXJfZGggKz0gY2VudGVyX3N0cih3ZWVrZGF5KHdkKSwgY3VyX2RoLCBzcGFjZV9sZWZ0LCAyKTsKCiAgICAgaWYgKGkpCiAgICAgICAgc3RyY2F0KGN1cl9qX2RoKyssICIgIik7CiAgICAgc3BhY2VfbGVmdCA9IHNpemVvZihqX2RheV9oZWFkaW5ncykgLSAoY3VyX2pfZGggLSBqX2RheV9oZWFkaW5ncyk7CiAgICAgaWYoc3BhY2VfbGVmdCA8PSAzKQogICAgICAgIGJyZWFrOwogICAgIGN1cl9qX2RoICs9IGNlbnRlcl9zdHIod2Vla2RheSh3ZCksIGN1cl9qX2RoLCBzcGFjZV9sZWZ0LCAzKTsKICB9CgojdW5kZWYgd2Vla2RheQoKICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgewojaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAgICAgZnVsbF9tb250aFtpXSA9IG5sX2xhbmdpbmZvKE1PTl8xK2kpOwojZWxzZQogICAgIGZ1bGxfbW9udGhbaV0gPSBfdGltZV9pbmZvLT5mdWxsX21vbnRoW2ldOwojZW5kaWYKICB9Cn0KCnZvaWQKZG9fbW9udGhseShpbnQgZGF5LCBpbnQgbW9udGgsIGludCB5ZWFyLCBzdHJ1Y3QgZm10X3N0ICpvdXQpIHsKCWludCBjb2wsIHJvdywgZGF5c1tNQVhEQVlTXTsKCWNoYXIgKnAsIGxpbmVvdXRbRk1UX1NUX0NIQVJTXTsKCWludCB3aWR0aCA9IChqdWxpYW4gPyBKX1dFRUtfTEVOIDogV0VFS19MRU4pIC0gMTsKCglkYXlfYXJyYXkoZGF5LCBtb250aCwgeWVhciwgZGF5cyk7CgoJLyoKCSAqICVzIGlzIHRoZSBtb250aCBuYW1lLCAlZCB0aGUgeWVhciBudW1iZXIuCgkgKiB5b3UgY2FuIGNoYW5nZSB0aGUgb3JkZXIgYW5kL29yIGFkZCBzb21ldGhpbmcgaGVyZTsgZWcgZm9yCgkgKiBCYXNxdWUgdGhlIHRyYW5zbGF0aW9uIHNob3VsZCBiZTogIiUyJGRrbyAlMSRzIiwgYW5kCgkgKiB0aGUgVmlldG5hbWVzZSBzaG91bGQgYmUgIiVzIG5hKG0gJWQiLCBldGMuCgkgKi8KCXNucHJpbnRmKGxpbmVvdXQsIHNpemVvZihsaW5lb3V0KSwgXygiJXMgJWQiKSwKCQkJZnVsbF9tb250aFttb250aCAtIDFdLCB5ZWFyKTsKCWNlbnRlcl9zdHIobGluZW91dCwgb3V0LT5zWzBdLCBBUlJBWV9TSVpFKG91dC0+c1swXSksIHdpZHRoKTsKCglzbnByaW50ZihvdXQtPnNbMV0sIEZNVF9TVF9DSEFSUywgIiVzIiwKCQlqdWxpYW4gPyBqX2RheV9oZWFkaW5ncyA6IGRheV9oZWFkaW5ncyk7Cglmb3IgKHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7CgkJaW50IGhhc19obCA9IDA7CgkJZm9yIChjb2wgPSAwLCBwID0gbGluZW91dDsgY29sIDwgNzsgY29sKyspIHsKCQkJaW50IHhkID0gZGF5c1tyb3cgKiA3ICsgY29sXTsKCQkJaWYgKHhkICE9IFNQQUNFICYmICh4ZCAmIFRPREFZX0ZMQUcpKQoJCQkJaGFzX2hsID0gMTsKCQkJcCA9IGFzY2lpX2RheShwLCB4ZCk7CgkJfQoJCSpwID0gJ1wwJzsKCQl0cmltX3RyYWlsaW5nX3NwYWNlcyhsaW5lb3V0KTsKCQlzbnByaW50ZihvdXQtPnNbcm93KzJdLCBGTVRfU1RfQ0hBUlMsICIlcyIsIGxpbmVvdXQpOwoJCWlmIChoYXNfaGwpCgkJCUhyb3cgPSBvdXQtPnNbcm93KzJdOwoJfQp9Cgp2b2lkCm1vbnRobHkoaW50IGRheSwgaW50IG1vbnRoLCBpbnQgeWVhcikgewoJaW50IGk7CglzdHJ1Y3QgZm10X3N0IG91dDsKCglkb19tb250aGx5KGRheSwgbW9udGgsIHllYXIsICZvdXQpOwoJZm9yIChpID0gMDsgaSA8IEZNVF9TVF9MSU5FUzsgaSsrKSB7CgkJbXlfcHV0c3RyaW5nKG91dC5zW2ldKTsKCQlwdXRjaGFyKCdcbicpOwoJfQp9Cgp2b2lkCm1vbnRobHkzKGludCBkYXksIGludCBtb250aCwgaW50IHllYXIpIHsKCWNoYXIgbGluZW91dFtGTVRfU1RfQ0hBUlNdOwoJaW50IGk7CglpbnQgd2lkdGg7CglzdHJ1Y3QgZm10X3N0IG91dF9wcmV2OwoJc3RydWN0IGZtdF9zdCBvdXRfY3VybTsKCXN0cnVjdCBmbXRfc3Qgb3V0X25leHQ7CglpbnQgcHJldl9tb250aCwgcHJldl95ZWFyOwoJaW50IG5leHRfbW9udGgsIG5leHRfeWVhcjsKCglpZiAobW9udGggPT0gMSkgewoJCXByZXZfbW9udGggPSAxMjsKCQlwcmV2X3llYXIgID0geWVhciAtIDE7Cgl9IGVsc2UgewoJCXByZXZfbW9udGggPSBtb250aCAtIDE7CgkJcHJldl95ZWFyICA9IHllYXI7Cgl9CglpZiAobW9udGggPT0gMTIpIHsKCQluZXh0X21vbnRoID0gMTsKCQluZXh0X3llYXIgID0geWVhciArIDE7Cgl9IGVsc2UgewoJCW5leHRfbW9udGggPSBtb250aCArIDE7CgkJbmV4dF95ZWFyICA9IHllYXI7Cgl9CgoJZG9fbW9udGhseShkYXksIHByZXZfbW9udGgsIHByZXZfeWVhciwgJm91dF9wcmV2KTsKCWRvX21vbnRobHkoZGF5LCBtb250aCwgICAgICB5ZWFyLCAgICAgICZvdXRfY3VybSk7Cglkb19tb250aGx5KGRheSwgbmV4dF9tb250aCwgbmV4dF95ZWFyLCAmb3V0X25leHQpOwoKICAgICAgICB3aWR0aCA9IChqdWxpYW4gPyBKX1dFRUtfTEVOIDogV0VFS19MRU4pIC0xOwoJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKCQlwcmludGYoIiVzICAlcyAgJXNcbiIsIG91dF9wcmV2LnNbaV0sIG91dF9jdXJtLnNbaV0sIG91dF9uZXh0LnNbaV0pOwoJZm9yIChpID0gMjsgaSA8IEZNVF9TVF9MSU5FUzsgaSsrKSB7CgkJaW50IHcxLCB3MiwgdzM7CgkJdzEgPSB3MiA9IHczID0gd2lkdGg7CgojaWYgZGVmaW5lZChIQVZFX0xJQk5DVVJTRVMpIHx8IGRlZmluZWQoSEFWRV9MSUJOQ1VSU0VTVykgfHwgZGVmaW5lZChIQVZFX0xJQlRFUk1DQVApCiAgICAgICAgICAgICAgICAvKiBhZGp1c3Qgd2lkdGggdG8gYWxsb3cgZm9yIG5vbiBwcmludGFibGUgY2hhcmFjdGVycyAqLwogICAgICAgICAgICAgICAgdzEgKz0gKG91dF9wcmV2LnNbaV0gPT0gSHJvdyA/IFNsZW4gOiAwKTsKICAgICAgICAgICAgICAgIHcyICs9IChvdXRfY3VybS5zW2ldID09IEhyb3cgPyBTbGVuIDogMCk7CiAgICAgICAgICAgICAgICB3MyArPSAob3V0X25leHQuc1tpXSA9PSBIcm93ID8gU2xlbiA6IDApOwojZW5kaWYKCQlzbnByaW50ZihsaW5lb3V0LCBzaXplb2YobGluZW91dCksICIlLSpzICAlLSpzICAlLSpzXG4iLAoJCSAgICAgICB3MSwgb3V0X3ByZXYuc1tpXSwKCQkgICAgICAgdzIsIG91dF9jdXJtLnNbaV0sCgkJICAgICAgIHczLCBvdXRfbmV4dC5zW2ldKTsKCgkJbXlfcHV0c3RyaW5nKGxpbmVvdXQpOwoJfQp9Cgp2b2lkCmpfeWVhcmx5KGludCBkYXksIGludCB5ZWFyKSB7CglpbnQgY29sLCAqZHAsIGksIG1vbnRoLCByb3csIHdoaWNoX2NhbDsKCWludCBkYXlzWzEyXVtNQVhEQVlTXTsKCWNoYXIgKnAsIGxpbmVvdXRbODBdOwoKCXNucHJpbnRmKGxpbmVvdXQsIHNpemVvZihsaW5lb3V0KSwgIiVkIiwgeWVhcik7CgljZW50ZXIobGluZW91dCwgSl9XRUVLX0xFTioyICsgSl9IRUFEX1NFUCAtIDEsIDApOwoJcHJpbnRmKCJcblxuIik7CgoJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCgkJZGF5X2FycmF5KGRheSwgaSArIDEsIHllYXIsIGRheXNbaV0pOwoJbWVtc2V0KGxpbmVvdXQsICcgJywgc2l6ZW9mKGxpbmVvdXQpIC0gMSk7CglsaW5lb3V0W3NpemVvZihsaW5lb3V0KSAtIDFdID0gJ1wwJzsKCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCArPSAyKSB7CgkJY2VudGVyKGZ1bGxfbW9udGhbbW9udGhdLCBKX1dFRUtfTEVOLTEsIEpfSEVBRF9TRVArMSk7CgkJY2VudGVyKGZ1bGxfbW9udGhbbW9udGggKyAxXSwgSl9XRUVLX0xFTi0xLCAwKTsKCQlwcmludGYoIlxuJXMlKnMgJXNcbiIsIGpfZGF5X2hlYWRpbmdzLCBKX0hFQURfU0VQLCAiIiwKCQkgICAgal9kYXlfaGVhZGluZ3MpOwoJCWZvciAocm93ID0gMDsgcm93IDwgNjsgcm93KyspIHsKCQkJcCA9IGxpbmVvdXQ7CgkJCWZvciAod2hpY2hfY2FsID0gMDsgd2hpY2hfY2FsIDwgMjsgd2hpY2hfY2FsKyspIHsKCQkJCWRwID0gJmRheXNbbW9udGggKyB3aGljaF9jYWxdW3JvdyAqIDddOwoJCQkJZm9yIChjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykKCQkJCQlwID0gYXNjaWlfZGF5KHAsICpkcCsrKTsKCQkJCXAgKz0gc3ByaW50ZihwLCAiICAiKTsKCQkJfQoJCQkqcCA9ICdcMCc7CgkJCXRyaW1fdHJhaWxpbmdfc3BhY2VzKGxpbmVvdXQpOwoJCQlteV9wdXRzdHJpbmcobGluZW91dCk7CgkJCXB1dGNoYXIoJ1xuJyk7CgkJfQoJfQoJcHJpbnRmKCJcbiIpOwp9Cgp2b2lkCnllYXJseShpbnQgZGF5LCBpbnQgeWVhcikgewoJaW50IGNvbCwgKmRwLCBpLCBtb250aCwgcm93LCB3aGljaF9jYWw7CglpbnQgZGF5c1sxMl1bTUFYREFZU107CgljaGFyICpwLCBsaW5lb3V0WzEwMF07CgoJc25wcmludGYobGluZW91dCwgc2l6ZW9mKGxpbmVvdXQpLCAiJWQiLCB5ZWFyKTsKCWNlbnRlcihsaW5lb3V0LCBXRUVLX0xFTiozICsgSEVBRF9TRVAqMiAtIDEsIDApOwoJcHJpbnRmKCJcblxuIik7CgoJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCgkJZGF5X2FycmF5KGRheSwgaSArIDEsIHllYXIsIGRheXNbaV0pOwoJbWVtc2V0KGxpbmVvdXQsICcgJywgc2l6ZW9mKGxpbmVvdXQpIC0gMSk7CglsaW5lb3V0W3NpemVvZihsaW5lb3V0KSAtIDFdID0gJ1wwJzsKCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCArPSAzKSB7CgkJY2VudGVyKGZ1bGxfbW9udGhbbW9udGhdLCBXRUVLX0xFTi0xLCBIRUFEX1NFUCsxKTsKCQljZW50ZXIoZnVsbF9tb250aFttb250aCArIDFdLCBXRUVLX0xFTi0xLCBIRUFEX1NFUCsxKTsKCQljZW50ZXIoZnVsbF9tb250aFttb250aCArIDJdLCBXRUVLX0xFTi0xLCAwKTsKCQlwcmludGYoIlxuJXMlKnMgJXMlKnMgJXNcbiIsIGRheV9oZWFkaW5ncywgSEVBRF9TRVAsCgkJICAgICIiLCBkYXlfaGVhZGluZ3MsIEhFQURfU0VQLCAiIiwgZGF5X2hlYWRpbmdzKTsKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7CgkJCXAgPSBsaW5lb3V0OwoJCQlmb3IgKHdoaWNoX2NhbCA9IDA7IHdoaWNoX2NhbCA8IDM7IHdoaWNoX2NhbCsrKSB7CgkJCQlkcCA9ICZkYXlzW21vbnRoICsgd2hpY2hfY2FsXVtyb3cgKiA3XTsKCQkJCWZvciAoY29sID0gMDsgY29sIDwgNzsgY29sKyspCgkJCQkJcCA9IGFzY2lpX2RheShwLCAqZHArKyk7CgkJCQlwICs9IHNwcmludGYocCwgIiAgIik7CgkJCX0KCQkJKnAgPSAnXDAnOwoJCQl0cmltX3RyYWlsaW5nX3NwYWNlcyhsaW5lb3V0KTsKCQkJbXlfcHV0c3RyaW5nKGxpbmVvdXQpOwoJCQlwdXRjaGFyKCdcbicpOwoJCX0KCX0KCXB1dGNoYXIoJ1xuJyk7Cn0KCi8qCiAqIGRheV9hcnJheSAtLQogKglGaWxsIGluIGFuIGFycmF5IG9mIDQyIGludGVnZXJzIHdpdGggYSBjYWxlbmRhci4gIEFzc3VtZSBmb3IgYSBtb21lbnQKICoJdGhhdCB5b3UgdG9vayB0aGUgKG1heGltdW0pIDYgcm93cyBpbiBhIGNhbGVuZGFyIGFuZCBzdHJldGNoZWQgdGhlbQogKglvdXQgZW5kIHRvIGVuZC4gIFlvdSB3b3VsZCBoYXZlIDQyIG51bWJlcnMgb3Igc3BhY2VzLiAgVGhpcyByb3V0aW5lCiAqCWJ1aWxkcyB0aGF0IGFycmF5IGZvciBhbnkgbW9udGggZnJvbSBKYW4uIDEgdGhyb3VnaCBEZWMuIDk5OTkuCiAqLwp2b2lkCmRheV9hcnJheShpbnQgZGF5LCBpbnQgbW9udGgsIGludCB5ZWFyLCBpbnQgKmRheXMpIHsKCWludCBqdWxkYXksIGRheW51bSwgZHcsIGRtOwoJaW50ICpkX3NlcDE3NTI7CgoJaWYgKG1vbnRoID09IDkgJiYgeWVhciA9PSAxNzUyKSB7CgkJaW50IHNlcDE3NTJfb2ZzID0gKHdlZWtzdGFydCArIFNFUDE3NTJfT0ZTKSAlIDc7CgkJZF9zZXAxNzUyID0ganVsaWFuID8gal9zZXAxNzUyIDogc2VwMTc1MjsKCQltZW1jcHkoZGF5cywgZF9zZXAxNzUyICsgc2VwMTc1Ml9vZnMsIE1BWERBWVMgKiBzaXplb2YoaW50KSk7CgkJZm9yIChkbT0wOyBkbTxNQVhEQVlTOyBkbSsrKQoJCQlpZiAoal9zZXAxNzUyW2RtICsgc2VwMTc1Ml9vZnNdID09IGRheSkKCQkJCWRheXNbZG1dIHw9IFRPREFZX0ZMQUc7CgkJcmV0dXJuOwoJfQoJbWVtY3B5KGRheXMsIGVtcHR5LCBNQVhEQVlTICogc2l6ZW9mKGludCkpOwoJZG0gPSBkYXlzX2luX21vbnRoW2xlYXBfeWVhcih5ZWFyKV1bbW9udGhdOwoJZHcgPSAoZGF5X2luX3dlZWsoMSwgbW9udGgsIHllYXIpIC0gd2Vla3N0YXJ0ICsgNykgJSA3OwoJanVsZGF5ID0gZGF5X2luX3llYXIoMSwgbW9udGgsIHllYXIpOwoJZGF5bnVtID0ganVsaWFuID8ganVsZGF5IDogMTsKCXdoaWxlIChkbS0tKSB7CgkJZGF5c1tkd10gPSBkYXludW0rKzsKCQlpZiAoanVsZGF5KysgPT0gZGF5KQoJCQlkYXlzW2R3XSB8PSBUT0RBWV9GTEFHOwoJCWR3Kys7Cgl9Cn0KCi8qCiAqIGRheV9pbl95ZWFyIC0tCiAqCXJldHVybiB0aGUgMSBiYXNlZCBkYXkgbnVtYmVyIHdpdGhpbiB0aGUgeWVhcgogKi8KaW50CmRheV9pbl95ZWFyKGludCBkYXksIGludCBtb250aCwgaW50IHllYXIpIHsKCWludCBpLCBsZWFwOwoKCWxlYXAgPSBsZWFwX3llYXIoeWVhcik7Cglmb3IgKGkgPSAxOyBpIDwgbW9udGg7IGkrKykKCQlkYXkgKz0gZGF5c19pbl9tb250aFtsZWFwXVtpXTsKCXJldHVybiBkYXk7Cn0KCi8qCiAqIGRheV9pbl93ZWVrCiAqCXJldHVybiB0aGUgMCBiYXNlZCBkYXkgbnVtYmVyIGZvciBhbnkgZGF0ZSBmcm9tIDEgSmFuLiAxIHRvCiAqCTMxIERlYy4gOTk5OS4gIEFzc3VtZXMgdGhlIEdyZWdvcmlhbiByZWZvcm1hdGlvbiBlbGltaW5hdGVzCiAqCTMgU2VwLiAxNzUyIHRocm91Z2ggMTMgU2VwLiAxNzUyLiAgUmV0dXJucyBUaHVyc2RheSBmb3IgYWxsCiAqCW1pc3NpbmcgZGF5cy4KICovCmludApkYXlfaW5fd2VlayhpbnQgZGF5LCBpbnQgbW9udGgsIGludCB5ZWFyKSB7Cglsb25nIHRlbXA7CgoJdGVtcCA9IChsb25nKSh5ZWFyIC0gMSkgKiAzNjUgKyBsZWFwX3llYXJzX3NpbmNlX3llYXJfMSh5ZWFyIC0gMSkKCSAgICArIGRheV9pbl95ZWFyKGRheSwgbW9udGgsIHllYXIpOwoJaWYgKHRlbXAgPCBGSVJTVF9NSVNTSU5HX0RBWSkKCQlyZXR1cm4gKCh0ZW1wIC0gMSArIFNBVFVSREFZKSAlIDcpOwoJaWYgKHRlbXAgPj0gKEZJUlNUX01JU1NJTkdfREFZICsgTlVNQkVSX01JU1NJTkdfREFZUykpCgkJcmV0dXJuICgoKHRlbXAgLSAxICsgU0FUVVJEQVkpIC0gTlVNQkVSX01JU1NJTkdfREFZUykgJSA3KTsKCXJldHVybiAoVEhVUlNEQVkpOwp9CgpjaGFyICoKYXNjaWlfZGF5KGNoYXIgKnAsIGludCBkYXkpIHsKCWludCBkaXNwbGF5LCB2YWw7CglpbnQgaGlnaGxpZ2h0ID0gMDsKCXN0YXRpYyBjaGFyICphZGF5W10gPSB7CgkJIiIsCgkJIiAxIiwgIiAyIiwgIiAzIiwgIiA0IiwgIiA1IiwgIiA2IiwgIiA3IiwKCQkiIDgiLCAiIDkiLCAiMTAiLCAiMTEiLCAiMTIiLCAiMTMiLCAiMTQiLAoJCSIxNSIsICIxNiIsICIxNyIsICIxOCIsICIxOSIsICIyMCIsICIyMSIsCgkJIjIyIiwgIjIzIiwgIjI0IiwgIjI1IiwgIjI2IiwgIjI3IiwgIjI4IiwKCQkiMjkiLCAiMzAiLCAiMzEiLAoJfTsKCglpZiAoZGF5ID09IFNQQUNFKSB7CgkJaW50IGxlbiA9IGp1bGlhbiA/IEpfREFZX0xFTiA6IERBWV9MRU47CgkJbWVtc2V0KHAsICcgJywgbGVuKTsKCQlyZXR1cm4gcCtsZW47Cgl9CglpZiAoZGF5ICYgVE9EQVlfRkxBRykgewoJCWRheSAmPSB+VE9EQVlfRkxBRzsKCQlwICs9IHNwcmludGYocCwgIiVzIiwgU2VudGVyKTsKCQloaWdobGlnaHQgPSAxOwoJfQoJaWYgKGp1bGlhbikgewoJCWlmICgodmFsID0gZGF5IC8gMTAwKSkgewoJCQlkYXkgJT0gMTAwOwoJCQkqcCsrID0gdmFsICsgJzAnOwoJCQlkaXNwbGF5ID0gMTsKCQl9IGVsc2UgewoJCQkqcCsrID0gJyAnOwoJCQlkaXNwbGF5ID0gMDsKCQl9CgkJdmFsID0gZGF5IC8gMTA7CgkJaWYgKHZhbCB8fCBkaXNwbGF5KQoJCQkqcCsrID0gdmFsICsgJzAnOwoJCWVsc2UKCQkJKnArKyA9ICcgJzsKCQkqcCsrID0gZGF5ICUgMTAgKyAnMCc7Cgl9IGVsc2UgewoJCSpwKysgPSBhZGF5W2RheV1bMF07CgkJKnArKyA9IGFkYXlbZGF5XVsxXTsKCX0KCWlmIChoaWdobGlnaHQpCgkJcCArPSBzcHJpbnRmKHAsICIlcyIsIFNleGl0KTsKCSpwKysgPSAnICc7CglyZXR1cm4gcDsKfQoKdm9pZAp0cmltX3RyYWlsaW5nX3NwYWNlcyhzKQoJY2hhciAqczsKewoJY2hhciAqcDsKCglmb3IgKHAgPSBzOyAqcDsgKytwKQoJCWNvbnRpbnVlOwoJd2hpbGUgKHAgPiBzICYmIGlzc3BhY2UoKi0tcCkpCgkJY29udGludWU7CglpZiAocCA+IHMpCgkJKytwOwoJKnAgPSAnXDAnOwp9CgojaWZkZWYgSEFWRV9XSURFQ0hBUgovKiByZXBsYWNlIG5vbiBwcmludGFibGUgY2hhcnMuCiAqIHJldHVybiAxIGlmIHJlcGxhY2VtZW50IG1hZGUsIDAgb3RoZXJ3aXNlICovCmludCB3Y19lbnN1cmVfcHJpbnRhYmxlKHdjaGFyX3QqIHdjaGFycykKewoJaW50IHJlcGxhY2VkPTA7Cgl3Y2hhcl90KiB3YyA9IHdjaGFyczsKCXdoaWxlICgqd2MpIHsKCQlpZiAoIWlzd3ByaW50KCh3aW50X3QpICp3YykpIHsKCQkJKndjPUwnXHVGRkZEJzsKCQkJcmVwbGFjZWQ9MTsKCQl9CgkJd2MrKzsKCX0KCXJldHVybiByZXBsYWNlZDsKfQoKLyogdHJ1bmNhdGUgd2NoYXIgc3RyaW5nIHRvIHdpZHRoIGNlbGxzLgogKiByZXR1cm5zIG51bWJlciBvZiBjZWxscyB1c2VkLiAqLwpzaXplX3Qgd2NfdHJ1bmNhdGUod2NoYXJfdCogd2NoYXJzLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBtaW5jaGFycykKewoJaW50IHdjPTA7CglpbnQgY2VsbHM9MDsKCXdoaWxlICgqKHdjaGFycyt3YykpIHsKCQljZWxscyA9IHdjc3dpZHRoKHdjaGFycywgd2MrMSk7CgkJaWYgKGNlbGxzID4gd2lkdGgpIHsKCQkJaWYgKHdjID49IG1pbmNoYXJzKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCQl3YysrOwoJfQoJd2NoYXJzW3djXT1MJ1wwJzsKCXJldHVybiBjZWxsczsKfQojZW5kaWYKCi8qCiAqIENlbnRlciBzdHJpbmcsIGhhbmRsaW5nIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGFwcHJvcHJpYXRlbHkuCiAqIEluIGFkZGl0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIGxhcmdlIGZvciB0aGUgd2lkdGggaXQncyB0cnVuY2F0ZWQuCiAqIFRoZSBudW1iZXIgb2YgdHJhaWxpbmcgc3BhY2VzIG1heSBiZSAxIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgc3BhY2VzLgogKi8KaW50CmNlbnRlcl9zdHIoY29uc3QgY2hhciogc3JjLCBjaGFyKiBkZXN0LCBzaXplX3QgZGVzdF9zaXplLCBpbnQgd2lkdGgpCnsKI2lmZGVmIEhBVkVfV0lERUNIQVIKCXdjaGFyX3Qgc3RyX3djW0ZNVF9TVF9DSEFSU107CiNlbmRpZgoJY2hhciBzdHJbRk1UX1NUX0NIQVJTXTsKCWNvbnN0IGNoYXIqIHN0cl90b19wcmludD1zcmM7CglpbnQgdXNlZCwgc3BhY2VzLCB3Y19jb252ZXJzaW9uPTAsIHdjX2VuYWJsZWQ9MDsKCiNpZmRlZiBIQVZFX1dJREVDSEFSCglpZiAobWJzdG93Y3Moc3RyX3djLCBzcmMsIEFSUkFZX1NJWkUoc3RyX3djKSkgPiAwKSB7CgkJc3RyX3djW0FSUkFZX1NJWkUoc3RyX3djKS0xXT1MJ1wwJzsKCQl3Y19lbmFibGVkPTE7CgkJd2NfY29udmVyc2lvbiA9IHdjX2Vuc3VyZV9wcmludGFibGUoc3RyX3djKTsKCQl1c2VkID0gd2Nzd2lkdGgoc3RyX3djLCBBUlJBWV9TSVpFKHN0cl93YykpOwoJfQoJZWxzZQojZW5kaWYKCQl1c2VkID0gc3RybGVuKHNyYyk7CgoJaWYgKHdjX2NvbnZlcnNpb24gfHwgdXNlZCA+IHdpZHRoKSB7CgkJc3RyX3RvX3ByaW50PXN0cjsKCQlpZiAod2NfZW5hYmxlZCkgewojaWZkZWYgSEFWRV9XSURFQ0hBUgoJCQl1c2VkID0gd2NfdHJ1bmNhdGUoc3RyX3djLCB3aWR0aCwgMSk7CgkJCXdjc3RvbWJzKHN0ciwgc3RyX3djLCBBUlJBWV9TSVpFKHN0cikpOwojZW5kaWYKCQl9IGVsc2UgewoJCQltZW1jcHkoc3RyLCBzcmMsIHdpZHRoKTsKCQkJc3RyW3dpZHRoXT0nXDAnOwoJCX0KCX0KCglzcGFjZXMgPSB3aWR0aCAtIHVzZWQ7CglzcGFjZXMgPSAoIHNwYWNlcyA8IDAgPyAwIDogc3BhY2VzICk7CgoJcmV0dXJuIHNucHJpbnRmKGRlc3QsIGRlc3Rfc2l6ZSwgIiUqcyVzJSpzIiwKCQlzcGFjZXMgLyAyICsgc3BhY2VzICUgMiwgIiIsCgkJc3RyX3RvX3ByaW50LAoJCXNwYWNlcyAvIDIsICIiICk7Cn0KCnZvaWQKY2VudGVyKHN0ciwgbGVuLCBzZXBhcmF0ZSkKCWNvbnN0IGNoYXIgKnN0cjsKCWludCBsZW47CglpbnQgc2VwYXJhdGU7CnsKCWNoYXIgbGluZW91dFtGTVRfU1RfQ0hBUlNdOwoJY2VudGVyX3N0cihzdHIsIGxpbmVvdXQsIEFSUkFZX1NJWkUobGluZW91dCksIGxlbik7CglmcHV0cyhsaW5lb3V0LCBzdGRvdXQpOwoJaWYgKHNlcGFyYXRlKQoJCXByaW50ZigiJSpzIiwgc2VwYXJhdGUsICIiKTsKfQoKdm9pZAp1c2FnZSgpCnsKCglmcHJpbnRmKHN0ZGVyciwgXygidXNhZ2U6IGNhbCBbLTEzc21qeVZdIFtbW2RheV0gbW9udGhdIHllYXJdXG4iKSk7CglleGl0KDEpOwp9Cg==