LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2NhY2hlLmMsdiAxLjEyIDIwMDIvMDgvMjIgMDc6MzY6NDQga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgoKLyoKICogUE9TSVggaGFzIGJyb2tlbiBzdGRpbyBzbyB0aGF0IGdldGMgbXVzdCBkbyB0aHJlYWQtc2FmZSBsb2NraW5nLAogKiB0aGlzIGlzIGEgc2VyaW91cyBwZXJmb3JtYW5jZSBwcm9ibGVtIGZvciBhcHBsaWNhdGlvbnMgZG9pbmcgbGFyZ2UKICogYW1vdW50cyBvZiBJTyB3aXRoIGdldGMgKGFzIGlzIGRvbmUgaGVyZSkuICBJZiBhdmFpbGFibGUsIHVzZQogKiB0aGUgZ2V0Y191bmxvY2tlZCB2YXJpZW50IGluc3RlYWQuCiAqLwogCiNpZiBkZWZpbmVkKGdldGNfdW5sb2NrZWQpIHx8IGRlZmluZWQoX0lPX2dldGNfdW5sb2NrZWQpCiNkZWZpbmUgR0VUQyhmKSBnZXRjX3VubG9ja2VkKGYpCiNkZWZpbmUgUFVUQyhjLGYpIHB1dGNfdW5sb2NrZWQoYyxmKQojZWxzZQojZGVmaW5lIEdFVEMoZikgZ2V0YyhmKQojZGVmaW5lIFBVVEMoYyxmKSBwdXRjKGMsZikKI2VuZGlmCgojZGVmaW5lIEZDX0RCR19DQUNIRV9SRUYgICAgMTAyNAoKc3RhdGljIEZjQ2hhcjggKgpGY0NhY2hlUmVhZFN0cmluZyAoRklMRSAqZiwgRmNDaGFyOCAqZGVzdCwgaW50IGxlbikKewogICAgaW50CQljOwogICAgRmNCb29sCWVzY2FwZTsKICAgIEZjQ2hhcjgJKmQ7CiAgICBpbnQJCXNpemU7CiAgICBpbnQJCWk7CgogICAgd2hpbGUgKChjID0gR0VUQyAoZikpICE9IEVPRikKCWlmIChjID09ICciJykKCSAgICBicmVhazsKICAgIGlmIChjID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgaWYgKGxlbiA9PSAwKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgIHNpemUgPSBsZW47CiAgICBpID0gMDsKICAgIGQgPSBkZXN0OwogICAgZXNjYXBlID0gRmNGYWxzZTsKICAgIHdoaWxlICgoYyA9IEdFVEMgKGYpKSAhPSBFT0YpCiAgICB7CglpZiAoIWVzY2FwZSkKCXsKCSAgICBzd2l0Y2ggKGMpIHsKCSAgICBjYXNlICciJzoKCQljID0gJ1wwJzsKCQlicmVhazsKCSAgICBjYXNlICdcXCc6CgkJZXNjYXBlID0gRmNUcnVlOwoJCWNvbnRpbnVlOwoJICAgIH0KCX0KCWlmIChpID09IHNpemUpCgl7CgkgICAgRmNDaGFyOCAqbmV3ID0gbWFsbG9jIChzaXplICogMik7CS8qIGZyZWVkIGluIGNhbGxlciAqLwoJICAgIGlmICghbmV3KQoJCWJyZWFrOwoJICAgIG1lbWNweSAobmV3LCBkLCBzaXplKTsKCSAgICBzaXplICo9IDI7CgkgICAgaWYgKGQgIT0gZGVzdCkKCQlmcmVlIChkKTsKCSAgICBkID0gbmV3OwoJfQoJZFtpKytdID0gYzsKCWlmIChjID09ICdcMCcpCgkgICAgcmV0dXJuIGQ7Cgllc2NhcGUgPSBGY0ZhbHNlOwogICAgfQogICAgaWYgKGQgIT0gZGVzdCkKCWZyZWUgKGQpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDYWNoZVJlYWRVbG9uZyAoRklMRSAqZiwgdW5zaWduZWQgbG9uZyAqZGVzdCkKewogICAgdW5zaWduZWQgbG9uZyAgIHQ7CiAgICBpbnQJCSAgICBjOwoKICAgIHdoaWxlICgoYyA9IEdFVEMgKGYpKSAhPSBFT0YpCiAgICB7CglpZiAoIWlzc3BhY2UgKGMpKQoJICAgIGJyZWFrOwogICAgfQogICAgaWYgKGMgPT0gRU9GKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB0ID0gMDsKICAgIGZvciAoOzspCiAgICB7CglpZiAoYyA9PSBFT0YgfHwgaXNzcGFjZSAoYykpCgkgICAgYnJlYWs7CglpZiAoIWlzZGlnaXQgKGMpKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJdCA9IHQgKiAxMCArIChjIC0gJzAnKTsKCWMgPSBHRVRDIChmKTsKICAgIH0KICAgICpkZXN0ID0gdDsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDYWNoZVJlYWRJbnQgKEZJTEUgKmYsIGludCAqZGVzdCkKewogICAgdW5zaWduZWQgbG9uZyAgIHQ7CiAgICBGY0Jvb2wJICAgIHJldDsKCiAgICByZXQgPSBGY0NhY2hlUmVhZFVsb25nIChmLCAmdCk7CiAgICBpZiAocmV0KQoJKmRlc3QgPSAoaW50KSB0OwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIEZjQm9vbApGY0NhY2hlUmVhZFRpbWUgKEZJTEUgKmYsIHRpbWVfdCAqZGVzdCkKewogICAgdW5zaWduZWQgbG9uZyAgIHQ7CiAgICBGY0Jvb2wJICAgIHJldDsKCiAgICByZXQgPSBGY0NhY2hlUmVhZFVsb25nIChmLCAmdCk7CiAgICBpZiAocmV0KQoJKmRlc3QgPSAodGltZV90KSB0OwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIEZjQm9vbApGY0NhY2hlV3JpdGVDaGFycyAoRklMRSAqZiwgY29uc3QgRmNDaGFyOCAqY2hhcnMpCnsKICAgIEZjQ2hhcjggICAgYzsKICAgIHdoaWxlICgoYyA9ICpjaGFycysrKSkKICAgIHsKCXN3aXRjaCAoYykgewoJY2FzZSAnIic6CgljYXNlICdcXCc6CgkgICAgaWYgKFBVVEMgKCdcXCcsIGYpID09IEVPRikKCQlyZXR1cm4gRmNGYWxzZTsKCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KCWRlZmF1bHQ6CgkgICAgaWYgKFBVVEMgKGMsIGYpID09IEVPRikKCQlyZXR1cm4gRmNGYWxzZTsKCX0KICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDYWNoZVdyaXRlU3RyaW5nIChGSUxFICpmLCBjb25zdCBGY0NoYXI4ICpzdHJpbmcpCnsKCiAgICBpZiAoUFVUQyAoJyInLCBmKSA9PSBFT0YpCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmICghRmNDYWNoZVdyaXRlQ2hhcnMgKGYsIHN0cmluZykpCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmIChQVVRDICgnIicsIGYpID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0NhY2hlV3JpdGVQYXRoIChGSUxFICpmLCBjb25zdCBGY0NoYXI4ICpkaXIsIGNvbnN0IEZjQ2hhcjggKmZpbGUpCnsKICAgIGlmIChQVVRDICgnIicsIGYpID09IEVPRikKCXJldHVybiBGY0ZhbHNlOwogICAgaWYgKGRpcikKCWlmICghRmNDYWNoZVdyaXRlQ2hhcnMgKGYsIGRpcikpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICBpZiAoZGlyICYmIGRpcltzdHJsZW4oKGNvbnN0IGNoYXIgKikgZGlyKSAtIDFdICE9ICcvJykKCWlmIChQVVRDICgnLycsIGYpID09IEVPRikKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIGlmICghRmNDYWNoZVdyaXRlQ2hhcnMgKGYsIGZpbGUpKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBpZiAoUFVUQyAoJyInLCBmKSA9PSBFT0YpCglyZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDYWNoZVdyaXRlVWxvbmcgKEZJTEUgKmYsIHVuc2lnbmVkIGxvbmcgdCkKewogICAgaW50CSAgICBwb3c7CiAgICB1bnNpZ25lZCBsb25nICAgdGVtcCwgZGlnaXQ7CgogICAgdGVtcCA9IHQ7CiAgICBwb3cgPSAxOwogICAgd2hpbGUgKHRlbXAgPj0gMTApCiAgICB7Cgl0ZW1wIC89IDEwOwoJcG93ICo9IDEwOwogICAgfQogICAgdGVtcCA9IHQ7CiAgICB3aGlsZSAocG93KQogICAgewoJZGlnaXQgPSB0ZW1wIC8gcG93OwoJaWYgKFBVVEMgKChjaGFyKSBkaWdpdCArICcwJywgZikgPT0gRU9GKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJdGVtcCA9IHRlbXAgLSBwb3cgKiBkaWdpdDsKCXBvdyA9IHBvdyAvIDEwOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY0NhY2hlV3JpdGVJbnQgKEZJTEUgKmYsIGludCBpKQp7CiAgICByZXR1cm4gRmNDYWNoZVdyaXRlVWxvbmcgKGYsICh1bnNpZ25lZCBsb25nKSBpKTsKfQoKc3RhdGljIEZjQm9vbApGY0NhY2hlV3JpdGVUaW1lIChGSUxFICpmLCB0aW1lX3QgdCkKewogICAgcmV0dXJuIEZjQ2FjaGVXcml0ZVVsb25nIChmLCAodW5zaWduZWQgbG9uZykgdCk7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDYWNoZUZvbnRTZXRBZGQgKEZjRm9udFNldAkgICAgKnNldCwKCQkgICBGY1N0clNldAkgICAgKmRpcnMsCgkJICAgY29uc3QgRmNDaGFyOCAgICAqZGlyLAoJCSAgIGludAkJICAgIGRpcl9sZW4sCgkJICAgY29uc3QgRmNDaGFyOCAgICAqZmlsZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpuYW1lKQp7CiAgICBGY0NoYXI4CXBhdGhfYnVmWzgxOTJdLCAqcGF0aDsKICAgIGludAkJbGVuOwogICAgRmNCb29sCXJldCA9IEZjRmFsc2U7CiAgICBGY1BhdHRlcm4JKmZvbnQ7CiAgICBGY1BhdHRlcm4JKmZyb3plbjsKCiAgICBwYXRoID0gcGF0aF9idWY7CiAgICBsZW4gPSAoZGlyX2xlbiArIDEgKyBzdHJsZW4gKChjb25zdCBjaGFyICopIGZpbGUpICsgMSk7CiAgICBpZiAobGVuID4gc2l6ZW9mIChwYXRoX2J1ZikpCiAgICB7CglwYXRoID0gbWFsbG9jIChsZW4pOwkvKiBmcmVlZCBkb3duIGJlbG93ICovCglpZiAoIXBhdGgpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICBzdHJuY3B5ICgoY2hhciAqKSBwYXRoLCAoY29uc3QgY2hhciAqKSBkaXIsIGRpcl9sZW4pOwogICAgaWYgKGRpcltkaXJfbGVuIC0gMV0gIT0gJy8nKQoJcGF0aFtkaXJfbGVuKytdID0gJy8nOwogICAgc3RyY3B5ICgoY2hhciAqKSBwYXRoICsgZGlyX2xlbiwgKGNvbnN0IGNoYXIgKikgZmlsZSk7CiAgICBpZiAoIUZjU3RyQ21wIChuYW1lLCBGQ19GT05UX0ZJTEVfRElSKSkKICAgIHsKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFVikKCSAgICBwcmludGYgKCIgZGlyIGNhY2hlIGRpciBcIiVzXCJcbiIsIHBhdGgpOwoJcmV0ID0gRmNTdHJTZXRBZGQgKGRpcnMsIHBhdGgpOwogICAgfQogICAgZWxzZSBpZiAoIUZjU3RyQ21wIChuYW1lLCBGQ19GT05UX0ZJTEVfSU5WQUxJRCkpCiAgICB7CglyZXQgPSBGY1RydWU7CiAgICB9CiAgICBlbHNlCiAgICB7Cglmb250ID0gRmNOYW1lUGFyc2UgKG5hbWUpOwoJaWYgKGZvbnQpCgl7CgkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVWKQoJCXByaW50ZiAoIiBkaXIgY2FjaGUgZmlsZSBcIiVzXCJcbiIsIGZpbGUpOwoJICAgIHJldCA9IEZjUGF0dGVybkFkZFN0cmluZyAoZm9udCwgRkNfRklMRSwgcGF0aCk7CgkgICAgaWYgKHJldCkKCSAgICB7CgkJZnJvemVuID0gRmNQYXR0ZXJuRnJlZXplIChmb250KTsKCQlyZXQgPSAoZnJvemVuICE9IDApOwoJCWlmIChyZXQpCgkJICAgcmV0ID0gRmNGb250U2V0QWRkIChzZXQsIGZyb3plbik7CgkgICAgfQoJICAgIEZjUGF0dGVybkRlc3Ryb3kgKGZvbnQpOwoJfQogICAgfQogICAgaWYgKHBhdGggIT0gcGF0aF9idWYpIGZyZWUgKHBhdGgpOwogICAgcmV0dXJuIHJldDsKICAgIAp9CgpzdGF0aWMgdW5zaWduZWQgaW50CkZjQ2FjaGVIYXNoIChjb25zdCBGY0NoYXI4ICpzdHJpbmcpCnsKICAgIHVuc2lnbmVkIGludCAgICBoID0gMDsKICAgIEZjQ2hhcjgJICAgIGM7CgogICAgd2hpbGUgKChjID0gKnN0cmluZysrKSkKCWggPSAoaCA8PCAxKSBeIGM7CiAgICByZXR1cm4gMDsKfQoKLyoKICogVmVyaWZ5IHRoZSBzYXZlZCB0aW1lc3RhbXAgZm9yIGEgZmlsZQogKi8KRmNCb29sCkZjR2xvYmFsQ2FjaGVDaGVja1RpbWUgKEZjR2xvYmFsQ2FjaGVJbmZvICppbmZvKQp7CiAgICBzdHJ1Y3Qgc3RhdAkgICAgc3RhdGI7CgogICAgaWYgKHN0YXQgKChjaGFyICopIGluZm8tPmZpbGUsICZzdGF0YikgPCAwKQogICAgewoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCgkgICAgcHJpbnRmICgiIGZpbGUgbWlzc2luZ1xuIik7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIGlmIChzdGF0Yi5zdF9tdGltZSAhPSBpbmZvLT50aW1lKQogICAgewoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCgkgICAgcHJpbnRmICgiIHRpbWVzdGFtcCBtaXNtYXRjaCAod2FzICVkIGlzICVkKVxuIiwKCQkgICAgKGludCkgaW5mby0+dGltZSwgKGludCkgc3RhdGIuc3RfbXRpbWUpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9Cgp2b2lkCkZjR2xvYmFsQ2FjaGVSZWZlcmVuY2VkIChGY0dsb2JhbENhY2hlCSAgICAqY2FjaGUsCgkJCSBGY0dsb2JhbENhY2hlSW5mbyAgKmluZm8pCnsKICAgIGlmICghaW5mby0+cmVmZXJlbmNlZCkKICAgIHsKCWluZm8tPnJlZmVyZW5jZWQgPSBGY1RydWU7CgljYWNoZS0+cmVmZXJlbmNlZCsrOwoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVfUkVGKQoJICAgIHByaW50ZiAoIlJlZmVyZW5jZSAlZCAlc1xuIiwgY2FjaGUtPnJlZmVyZW5jZWQsIGluZm8tPmZpbGUpOwogICAgfQp9CgovKgogKiBCcmVhayBhIHBhdGggaW50byBkaXIvYmFzZSBlbGVtZW50cyBhbmQgY29tcHV0ZSB0aGUgYmFzZSBoYXNoCiAqIGFuZCB0aGUgZGlyIGxlbmd0aC4gIFRoaXMgaXMgc2hhcmVkIGJldHdlZW4gdGhlIGZ1bmN0aW9ucwogKiB3aGljaCB3YWxrIHRoZSBmaWxlIGNhY2hlcwogKi8KCnR5cGVkZWYgc3RydWN0IF9GY0ZpbGVQYXRoSW5mbyB7CiAgICBjb25zdCBGY0NoYXI4ICAgKmRpcjsKICAgIGludAkJICAgIGRpcl9sZW47CiAgICBjb25zdCBGY0NoYXI4ICAgKmJhc2U7CiAgICB1bnNpZ25lZCBpbnQgICAgYmFzZV9oYXNoOwp9IEZjRmlsZVBhdGhJbmZvOwoKc3RhdGljIEZjRmlsZVBhdGhJbmZvCkZjRmlsZVBhdGhJbmZvR2V0IChjb25zdCBGY0NoYXI4ICAgICpwYXRoKQp7CiAgICBGY0ZpbGVQYXRoSW5mbyAgaTsKICAgIEZjQ2hhcjgJICAgICpzbGFzaDsKCiAgICBzbGFzaCA9IChGY0NoYXI4ICopIHN0cnJjaHIgKChjb25zdCBjaGFyICopIHBhdGgsICcvJyk7CiAgICBpZiAoc2xhc2gpCiAgICB7CiAgICAgICAgaS5kaXIgPSBwYXRoOwogICAgICAgIGkuZGlyX2xlbiA9IHNsYXNoIC0gcGF0aDsKCWlmICghaS5kaXJfbGVuKQoJICAgIGkuZGlyX2xlbiA9IDE7CglpLmJhc2UgPSBzbGFzaCArIDE7CiAgICB9CiAgICBlbHNlCiAgICB7CglpLmRpciA9IChjb25zdCBGY0NoYXI4ICopICIuIjsKCWkuZGlyX2xlbiA9IDE7CglpLmJhc2UgPSBwYXRoOwogICAgfQogICAgaS5iYXNlX2hhc2ggPSBGY0NhY2hlSGFzaCAoaS5iYXNlKTsKICAgIHJldHVybiBpOwp9CgpGY0dsb2JhbENhY2hlRGlyICoKRmNHbG9iYWxDYWNoZURpckdldCAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmRpciwKCQkgICAgIGludAkgICAgbGVuLAoJCSAgICAgRmNCb29sCSAgICBjcmVhdGVfbWlzc2luZykKewogICAgdW5zaWduZWQgaW50CWhhc2ggPSBGY0NhY2hlSGFzaCAoZGlyKTsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJKmQsICoqcHJldjsKCiAgICBmb3IgKHByZXYgPSAmY2FjaGUtPmVudHNbaGFzaCAlIEZDX0dMT0JBTF9DQUNIRV9ESVJfSEFTSF9TSVpFXTsKCSAoZCA9ICpwcmV2KTsKCSBwcmV2ID0gJigqcHJldiktPm5leHQpCiAgICB7CglpZiAoZC0+aW5mby5oYXNoID09IGhhc2ggJiYgZC0+bGVuID09IGxlbiAmJgoJICAgICFzdHJuY21wICgoY29uc3QgY2hhciAqKSBkLT5pbmZvLmZpbGUsCgkJICAgICAgKGNvbnN0IGNoYXIgKikgZGlyLCBsZW4pKQoJICAgIGJyZWFrOwogICAgfQogICAgaWYgKCEoZCA9ICpwcmV2KSkKICAgIHsKCWludAlpOwoJaWYgKCFjcmVhdGVfbWlzc2luZykKCSAgICByZXR1cm4gMDsKCWQgPSBtYWxsb2MgKHNpemVvZiAoRmNHbG9iYWxDYWNoZURpcikgKyBsZW4gKyAxKTsKCWlmICghZCkKCSAgICByZXR1cm4gMDsKCUZjTWVtQWxsb2MgKEZDX01FTV9DQUNIRSwgc2l6ZW9mIChGY0dsb2JhbENhY2hlRGlyKSArIGxlbiArIDEpOwoJZC0+bmV4dCA9ICpwcmV2OwoJKnByZXYgPSBkOwoJZC0+aW5mby5oYXNoID0gaGFzaDsKCWQtPmluZm8uZmlsZSA9IChGY0NoYXI4ICopIChkICsgMSk7CglzdHJuY3B5ICgoY2hhciAqKSBkLT5pbmZvLmZpbGUsIChjb25zdCBjaGFyICopIGRpciwgbGVuKTsKCWQtPmluZm8uZmlsZVtsZW5dID0gJ1wwJzsKCWQtPmluZm8udGltZSA9IDA7CglkLT5pbmZvLnJlZmVyZW5jZWQgPSBGY0ZhbHNlOwoJZC0+bGVuID0gbGVuOwoJZm9yIChpID0gMDsgaSA8IEZDX0dMT0JBTF9DQUNIRV9GSUxFX0hBU0hfU0laRTsgaSsrKQoJICAgIGQtPmVudHNbaV0gPSAwOwoJZC0+c3ViZGlycyA9IDA7CiAgICB9CiAgICByZXR1cm4gZDsKfQoKc3RhdGljIEZjR2xvYmFsQ2FjaGVJbmZvICoKRmNHbG9iYWxDYWNoZURpckFkZCAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmRpciwKCQkgICAgIHRpbWVfdAkgICAgdGltZSwKCQkgICAgIEZjQm9vbAkgICAgcmVwbGFjZSkKewogICAgRmNHbG9iYWxDYWNoZURpcgkqZDsKICAgIEZjRmlsZVBhdGhJbmZvCWk7CiAgICBGY0dsb2JhbENhY2hlU3ViZGlyCSpzdWJkaXI7CiAgICBGY0dsb2JhbENhY2hlRGlyCSpwYXJlbnQ7CgogICAgLyoKICAgICAqIEFkZCB0aGlzIGRpcmVjdG9yeSB0byB0aGUgY2FjaGUKICAgICAqLwogICAgZCA9IEZjR2xvYmFsQ2FjaGVEaXJHZXQgKGNhY2hlLCBkaXIsIHN0cmxlbiAoKGNvbnN0IGNoYXIgKikgZGlyKSwgRmNUcnVlKTsKICAgIGlmICghZCkKCXJldHVybiAwOwogICAgZC0+aW5mby50aW1lID0gdGltZTsKICAgIGkgPSBGY0ZpbGVQYXRoSW5mb0dldCAoZGlyKTsKICAgIC8qCiAgICAgKiBBZGQgdGhpcyBkaXJlY3RvcnkgdG8gdGhlIHN1YmRpcmVjdG9yeSBsaXN0IG9mIHRoZSBwYXJlbnQKICAgICAqLwogICAgcGFyZW50ID0gRmNHbG9iYWxDYWNoZURpckdldCAoY2FjaGUsIGkuZGlyLCBpLmRpcl9sZW4sIEZjVHJ1ZSk7CiAgICBpZiAoIXBhcmVudCkKCXJldHVybiAwOwogICAgc3ViZGlyID0gbWFsbG9jIChzaXplb2YgKEZjR2xvYmFsQ2FjaGVTdWJkaXIpKTsKICAgIGlmICghc3ViZGlyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0FDSEUsIHNpemVvZiAoRmNHbG9iYWxDYWNoZVN1YmRpcikpOwogICAgc3ViZGlyLT5lbnQgPSBkOwogICAgc3ViZGlyLT5uZXh0ID0gcGFyZW50LT5zdWJkaXJzOwogICAgcGFyZW50LT5zdWJkaXJzID0gc3ViZGlyOwogICAgcmV0dXJuICZkLT5pbmZvOwp9CgpzdGF0aWMgdm9pZApGY0dsb2JhbENhY2hlRGlyRGVzdHJveSAoRmNHbG9iYWxDYWNoZURpciAqZCkKewogICAgRmNHbG9iYWxDYWNoZUZpbGUJKmYsICpuZXh0OwogICAgaW50CQkJaDsKICAgIEZjR2xvYmFsQ2FjaGVTdWJkaXIJKnMsICpuZXh0czsKCiAgICBmb3IgKGggPSAwOyBoIDwgRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFOyBoKyspCglmb3IgKGYgPSBkLT5lbnRzW2hdOyBmOyBmID0gbmV4dCkKCXsKCSAgICBuZXh0ID0gZi0+bmV4dDsKCSAgICBGY01lbUZyZWUgKEZDX01FTV9DQUNIRSwgc2l6ZW9mIChGY0dsb2JhbENhY2hlRmlsZSkgKwoJCSAgICAgICBzdHJsZW4gKChjaGFyICopIGYtPmluZm8uZmlsZSkgKyAxICsKCQkgICAgICAgc3RybGVuICgoY2hhciAqKSBmLT5uYW1lKSArIDEpOwoJICAgIGZyZWUgKGYpOwoJfQogICAgZm9yIChzID0gZC0+c3ViZGlyczsgczsgcyA9IG5leHRzKQogICAgewoJbmV4dHMgPSBzLT5uZXh0OwoJRmNNZW1GcmVlIChGQ19NRU1fQ0FDSEUsIHNpemVvZiAoRmNHbG9iYWxDYWNoZVN1YmRpcikpOwoJZnJlZSAocyk7CiAgICB9CiAgICBGY01lbUZyZWUgKEZDX01FTV9DQUNIRSwgc2l6ZW9mIChGY0dsb2JhbENhY2hlRGlyKSArIGQtPmxlbiArIDEpOwogICAgZnJlZSAoZCk7Cn0KCkZjQm9vbApGY0dsb2JhbENhY2hlU2NhbkRpciAoRmNGb250U2V0CQkqc2V0LAoJCSAgICAgIEZjU3RyU2V0CQkqZGlycywKCQkgICAgICBGY0dsb2JhbENhY2hlCSpjYWNoZSwKCQkgICAgICBjb25zdCBGY0NoYXI4CSpkaXIpCnsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJKmQgPSBGY0dsb2JhbENhY2hlRGlyR2V0IChjYWNoZSwgZGlyLAoJCQkJCQkgIHN0cmxlbiAoKGNvbnN0IGNoYXIgKikgZGlyKSwKCQkJCQkJICBGY0ZhbHNlKTsKICAgIEZjR2xvYmFsQ2FjaGVGaWxlCSpmOwogICAgaW50CQkJaDsKICAgIGludAkJCWRpcl9sZW47CiAgICBGY0dsb2JhbENhY2hlU3ViZGlyCSpzdWJkaXI7CgogICAgaWYgKEZjRGVidWcoKSAmIEZDX0RCR19DQUNIRSkKCXByaW50ZiAoIkZjR2xvYmFsQ2FjaGVTY2FuRGlyICVzXG4iLCBkaXIpOwogICAgCiAgICBpZiAoIWQpCiAgICB7CglpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKCSAgICBwcmludGYgKCJcdE5vIGRpciBjYWNoZSBlbnRyeVxuIik7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KCiAgICBpZiAoIUZjR2xvYmFsQ2FjaGVDaGVja1RpbWUgKCZkLT5pbmZvKSkKICAgIHsKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJICAgIHByaW50ZiAoIlx0ZGlyIGNhY2hlIGVudHJ5IHRpbWUgbWlzbWF0Y2hcbiIpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CgogICAgZGlyX2xlbiA9IHN0cmxlbiAoKGNvbnN0IGNoYXIgKikgZGlyKTsKICAgIGZvciAoaCA9IDA7IGggPCBGQ19HTE9CQUxfQ0FDSEVfRklMRV9IQVNIX1NJWkU7IGgrKykKCWZvciAoZiA9IGQtPmVudHNbaF07IGY7IGYgPSBmLT5uZXh0KQoJewoJICAgIGlmIChGY0RlYnVnKCkgJiBGQ19EQkdfQ0FDSEVWKQoJCXByaW50ZiAoIkZjR2xvYmFsQ2FjaGVTY2FuRGlyIGFkZCBmaWxlICVzXG4iLCBmLT5pbmZvLmZpbGUpOwoJICAgIGlmICghRmNDYWNoZUZvbnRTZXRBZGQgKHNldCwgZGlycywgZGlyLCBkaXJfbGVuLAoJCQkJICAgIGYtPmluZm8uZmlsZSwgZi0+bmFtZSkpCgkgICAgewoJCWNhY2hlLT5icm9rZW4gPSBGY1RydWU7CgkJcmV0dXJuIEZjRmFsc2U7CgkgICAgfQoJICAgIEZjR2xvYmFsQ2FjaGVSZWZlcmVuY2VkIChjYWNoZSwgJmYtPmluZm8pOwoJfQogICAgZm9yIChzdWJkaXIgPSBkLT5zdWJkaXJzOyBzdWJkaXI7IHN1YmRpciA9IHN1YmRpci0+bmV4dCkKICAgIHsKCUZjRmlsZVBhdGhJbmZvCWluZm8gPSBGY0ZpbGVQYXRoSW5mb0dldCAoc3ViZGlyLT5lbnQtPmluZm8uZmlsZSk7CgkKCWlmICghRmNDYWNoZUZvbnRTZXRBZGQgKHNldCwgZGlycywgZGlyLCBkaXJfbGVuLAoJCQkJaW5mby5iYXNlLCBGQ19GT05UX0ZJTEVfRElSKSkKCXsKCSAgICBjYWNoZS0+YnJva2VuID0gRmNUcnVlOwoJICAgIHJldHVybiBGY0ZhbHNlOwoJfQoJRmNHbG9iYWxDYWNoZVJlZmVyZW5jZWQgKGNhY2hlLCAmc3ViZGlyLT5lbnQtPmluZm8pOwogICAgfQogICAgCiAgICBGY0dsb2JhbENhY2hlUmVmZXJlbmNlZCAoY2FjaGUsICZkLT5pbmZvKTsKCiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBMb2NhdGUgdGhlIGNhY2hlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgZmlsZQogKi8KRmNHbG9iYWxDYWNoZUZpbGUgKgpGY0dsb2JhbENhY2hlRmlsZUdldCAoRmNHbG9iYWxDYWNoZSAqY2FjaGUsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZmlsZSwKCQkgICAgICBpbnQJICAgIGlkLAoJCSAgICAgIGludAkgICAgKmNvdW50KQp7CiAgICBGY0ZpbGVQYXRoSW5mbwlpID0gRmNGaWxlUGF0aEluZm9HZXQgKGZpbGUpOwogICAgRmNHbG9iYWxDYWNoZURpcgkqZCA9IEZjR2xvYmFsQ2FjaGVEaXJHZXQgKGNhY2hlLCBpLmRpciwgCgkJCQkJCSAgaS5kaXJfbGVuLCBGY0ZhbHNlKTsKICAgIEZjR2xvYmFsQ2FjaGVGaWxlCSpmLCAqbWF0Y2ggPSAwOwogICAgaW50CQkJbWF4ID0gLTE7CgogICAgaWYgKCFkKQoJcmV0dXJuIDA7CiAgICBmb3IgKGYgPSBkLT5lbnRzW2kuYmFzZV9oYXNoICUgRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFXTsgZjsgZiA9IGYtPm5leHQpCiAgICB7CglpZiAoZi0+aW5mby5oYXNoID09IGkuYmFzZV9oYXNoICYmCgkgICAgIXN0cmNtcCAoKGNvbnN0IGNoYXIgKikgZi0+aW5mby5maWxlLCAoY29uc3QgY2hhciAqKSBpLmJhc2UpKQoJewoJICAgIGlmIChmLT5pZCA9PSBpZCkKCQltYXRjaCA9IGY7CgkgICAgaWYgKGYtPmlkID4gbWF4KQoJCW1heCA9IGYtPmlkOwoJfQogICAgfQogICAgaWYgKGNvdW50KQoJKmNvdW50ID0gbWF4OwogICAgcmV0dXJuIG1hdGNoOwp9CiAgICAKLyoKICogQWRkIGEgZmlsZSBlbnRyeSB0byB0aGUgY2FjaGUKICovCnN0YXRpYyBGY0dsb2JhbENhY2hlSW5mbyAqCkZjR2xvYmFsQ2FjaGVGaWxlQWRkIChGY0dsb2JhbENhY2hlICpjYWNoZSwKCQkgICAgICBjb25zdCBGY0NoYXI4ICpwYXRoLAoJCSAgICAgIGludAkgICAgaWQsCgkJICAgICAgdGltZV90CSAgICB0aW1lLAoJCSAgICAgIGNvbnN0IEZjQ2hhcjggKm5hbWUsCgkJICAgICAgRmNCb29sCSAgICByZXBsYWNlKQp7CiAgICBGY0ZpbGVQYXRoSW5mbwlpID0gRmNGaWxlUGF0aEluZm9HZXQgKHBhdGgpOwogICAgRmNHbG9iYWxDYWNoZURpcgkqZCA9IEZjR2xvYmFsQ2FjaGVEaXJHZXQgKGNhY2hlLCBpLmRpciwgCgkJCQkJCSAgaS5kaXJfbGVuLCBGY1RydWUpOwogICAgRmNHbG9iYWxDYWNoZUZpbGUJKmYsICoqcHJldjsKICAgIGludAkJCXNpemU7CgogICAgaWYgKCFkKQoJcmV0dXJuIDA7CiAgICBmb3IgKHByZXYgPSAmZC0+ZW50c1tpLmJhc2VfaGFzaCAlIEZDX0dMT0JBTF9DQUNIRV9GSUxFX0hBU0hfU0laRV07CgkgKGYgPSAqcHJldik7CgkgcHJldiA9ICYoKnByZXYpLT5uZXh0KQogICAgewoJaWYgKGYtPmluZm8uaGFzaCA9PSBpLmJhc2VfaGFzaCAmJiAKCSAgICBmLT5pZCA9PSBpZCAmJgoJICAgICFzdHJjbXAgKChjb25zdCBjaGFyICopIGYtPmluZm8uZmlsZSwgKGNvbnN0IGNoYXIgKikgaS5iYXNlKSkKCXsKCSAgICBicmVhazsKCX0KICAgIH0KICAgIGlmICgqcHJldikKICAgIHsKCWlmICghcmVwbGFjZSkKCSAgICByZXR1cm4gMDsKCglmID0gKnByZXY7CglpZiAoZi0+aW5mby5yZWZlcmVuY2VkKQoJICAgIGNhY2hlLT5yZWZlcmVuY2VkLS07CgkqcHJldiA9IGYtPm5leHQ7CglGY01lbUZyZWUgKEZDX01FTV9DQUNIRSwgc2l6ZW9mIChGY0dsb2JhbENhY2hlRmlsZSkgKwoJCSAgIHN0cmxlbiAoKGNoYXIgKikgZi0+aW5mby5maWxlKSArIDEgKwoJCSAgIHN0cmxlbiAoKGNoYXIgKikgZi0+bmFtZSkgKyAxKTsKCWZyZWUgKGYpOwogICAgfQogICAgc2l6ZSA9IChzaXplb2YgKEZjR2xvYmFsQ2FjaGVGaWxlKSArCgkgICAgc3RybGVuICgoY2hhciAqKSBpLmJhc2UpICsgMSArCgkgICAgc3RybGVuICgoY2hhciAqKSBuYW1lKSArIDEpOwogICAgZiA9IG1hbGxvYyAoc2l6ZSk7CiAgICBpZiAoIWYpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DQUNIRSwgc2l6ZSk7CiAgICBmLT5uZXh0ID0gKnByZXY7CiAgICAqcHJldiA9IGY7CiAgICBmLT5pbmZvLmhhc2ggPSBpLmJhc2VfaGFzaDsKICAgIGYtPmluZm8uZmlsZSA9IChGY0NoYXI4ICopIChmICsgMSk7CiAgICBmLT5pbmZvLnRpbWUgPSB0aW1lOwogICAgZi0+aW5mby5yZWZlcmVuY2VkID0gRmNGYWxzZTsKICAgIGYtPmlkID0gaWQ7CiAgICBmLT5uYW1lID0gZi0+aW5mby5maWxlICsgc3RybGVuICgoY2hhciAqKSBpLmJhc2UpICsgMTsKICAgIHN0cmNweSAoKGNoYXIgKikgZi0+aW5mby5maWxlLCAoY29uc3QgY2hhciAqKSBpLmJhc2UpOwogICAgc3RyY3B5ICgoY2hhciAqKSBmLT5uYW1lLCAoY29uc3QgY2hhciAqKSBuYW1lKTsKICAgIHJldHVybiAmZi0+aW5mbzsKfQoKRmNHbG9iYWxDYWNoZSAqCkZjR2xvYmFsQ2FjaGVDcmVhdGUgKHZvaWQpCnsKICAgIEZjR2xvYmFsQ2FjaGUgICAqY2FjaGU7CiAgICBpbnQJCSAgICBoOwoKICAgIGNhY2hlID0gbWFsbG9jIChzaXplb2YgKEZjR2xvYmFsQ2FjaGUpKTsKICAgIGlmICghY2FjaGUpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DQUNIRSwgc2l6ZW9mIChGY0dsb2JhbENhY2hlKSk7CiAgICBmb3IgKGggPSAwOyBoIDwgRkNfR0xPQkFMX0NBQ0hFX0RJUl9IQVNIX1NJWkU7IGgrKykKCWNhY2hlLT5lbnRzW2hdID0gMDsKICAgIGNhY2hlLT5lbnRyaWVzID0gMDsKICAgIGNhY2hlLT5yZWZlcmVuY2VkID0gMDsKICAgIGNhY2hlLT51cGRhdGVkID0gRmNGYWxzZTsKICAgIGNhY2hlLT5icm9rZW4gPSBGY0ZhbHNlOwogICAgcmV0dXJuIGNhY2hlOwp9Cgp2b2lkCkZjR2xvYmFsQ2FjaGVEZXN0cm95IChGY0dsb2JhbENhY2hlICpjYWNoZSkKewogICAgRmNHbG9iYWxDYWNoZURpcgkqZCwgKm5leHQ7CiAgICBpbnQJCQloOwoKICAgIGZvciAoaCA9IDA7IGggPCBGQ19HTE9CQUxfQ0FDSEVfRElSX0hBU0hfU0laRTsgaCsrKQogICAgewoJZm9yIChkID0gY2FjaGUtPmVudHNbaF07IGQ7IGQgPSBuZXh0KQoJewoJICAgIG5leHQgPSBkLT5uZXh0OwoJICAgIEZjR2xvYmFsQ2FjaGVEaXJEZXN0cm95IChkKTsKCX0KICAgIH0KICAgIEZjTWVtRnJlZSAoRkNfTUVNX0NBQ0hFLCBzaXplb2YgKEZjR2xvYmFsQ2FjaGUpKTsKICAgIGZyZWUgKGNhY2hlKTsKfQoKLyoKICogQ2FjaGUgZmlsZSBzeW50YXggaXMgcXVpdGUgc2ltcGxlOgogKgogKiAiZmlsZV9uYW1lIiBpZCB0aW1lICJmb250X25hbWUiIFxuCiAqLwogCnZvaWQKRmNHbG9iYWxDYWNoZUxvYWQgKEZjR2xvYmFsQ2FjaGUgICAgKmNhY2hlLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmNhY2hlX2ZpbGUpCnsKICAgIEZJTEUJCSpmOwogICAgRmNDaGFyOAkJZmlsZV9idWZbODE5Ml0sICpmaWxlOwogICAgaW50CQkJaWQ7CiAgICB0aW1lX3QJCXRpbWU7CiAgICBGY0NoYXI4CQluYW1lX2J1Zls4MTkyXSwgKm5hbWU7CiAgICBGY0dsb2JhbENhY2hlSW5mbwkqaW5mbzsKCiAgICBmID0gZm9wZW4gKChjaGFyICopIGNhY2hlX2ZpbGUsICJyIik7CiAgICBpZiAoIWYpCglyZXR1cm47CgogICAgY2FjaGUtPnVwZGF0ZWQgPSBGY0ZhbHNlOwogICAgZmlsZSA9IDA7CiAgICBuYW1lID0gMDsKICAgIHdoaWxlICgoZmlsZSA9IEZjQ2FjaGVSZWFkU3RyaW5nIChmLCBmaWxlX2J1Ziwgc2l6ZW9mIChmaWxlX2J1ZikpKSAmJgoJICAgRmNDYWNoZVJlYWRJbnQgKGYsICZpZCkgJiYKCSAgIEZjQ2FjaGVSZWFkVGltZSAoZiwgJnRpbWUpICYmCgkgICAobmFtZSA9IEZjQ2FjaGVSZWFkU3RyaW5nIChmLCBuYW1lX2J1Ziwgc2l6ZW9mIChuYW1lX2J1ZikpKSkKICAgIHsKCWlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFVikKCSAgICBwcmludGYgKCJGY0dsb2JhbENhY2hlTG9hZCBcIiVzXCIgXCIlMjAuMjBzXCJcbiIsIGZpbGUsIG5hbWUpOwoJaWYgKCFGY1N0ckNtcCAobmFtZSwgRkNfRk9OVF9GSUxFX0RJUikpCgkgICAgaW5mbyA9IEZjR2xvYmFsQ2FjaGVEaXJBZGQgKGNhY2hlLCBmaWxlLCB0aW1lLCBGY0ZhbHNlKTsKCWVsc2UKCSAgICBpbmZvID0gRmNHbG9iYWxDYWNoZUZpbGVBZGQgKGNhY2hlLCBmaWxlLCBpZCwgdGltZSwgbmFtZSwgRmNGYWxzZSk7CglpZiAoIWluZm8pCgkgICAgY2FjaGUtPmJyb2tlbiA9IEZjVHJ1ZTsKCWVsc2UKCSAgICBjYWNoZS0+ZW50cmllcysrOwoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVfUkVGKQoJICAgIHByaW50ZiAoIkZjR2xvYmFsQ2FjaGVMb2FkIGVudHJ5ICVkICVzXG4iLAoJCSAgICBjYWNoZS0+ZW50cmllcywgZmlsZSk7CglpZiAoZmlsZSAhPSBmaWxlX2J1ZikKCSAgICBmcmVlIChmaWxlKTsKCWlmIChuYW1lICE9IG5hbWVfYnVmKQoJICAgIGZyZWUgKG5hbWUpOwoJZmlsZSA9IDA7CgluYW1lID0gMDsKICAgIH0KICAgIGlmIChmaWxlICYmIGZpbGUgIT0gZmlsZV9idWYpCglmcmVlIChmaWxlKTsKICAgIGlmIChuYW1lICYmIG5hbWUgIT0gbmFtZV9idWYpCglmcmVlIChuYW1lKTsKICAgIGZjbG9zZSAoZik7Cn0KCkZjQm9vbApGY0dsb2JhbENhY2hlVXBkYXRlIChGY0dsb2JhbENhY2hlICAqY2FjaGUsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqZmlsZSwKCQkgICAgIGludAkgICAgaWQsCgkJICAgICBjb25zdCBGY0NoYXI4ICAqbmFtZSkKewogICAgY29uc3QgRmNDaGFyOAkqbWF0Y2g7CiAgICBzdHJ1Y3Qgc3RhdAkJc3RhdGI7CiAgICBGY0dsb2JhbENhY2hlSW5mbwkqaW5mbzsKCiAgICBtYXRjaCA9IGZpbGU7CgogICAgaWYgKHN0YXQgKChjaGFyICopIGZpbGUsICZzdGF0YikgPCAwKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBpZiAoU19JU0RJUiAoc3RhdGIuc3RfbW9kZSkpCglpbmZvID0gRmNHbG9iYWxDYWNoZURpckFkZCAoY2FjaGUsIGZpbGUsIHN0YXRiLnN0X210aW1lLCAKCQkJCSAgIEZjVHJ1ZSk7CiAgICBlbHNlCglpbmZvID0gRmNHbG9iYWxDYWNoZUZpbGVBZGQgKGNhY2hlLCBmaWxlLCBpZCwgc3RhdGIuc3RfbXRpbWUsIAoJCQkJICAgIG5hbWUsIEZjVHJ1ZSk7CiAgICBpZiAoaW5mbykKICAgIHsKCUZjR2xvYmFsQ2FjaGVSZWZlcmVuY2VkIChjYWNoZSwgaW5mbyk7CgljYWNoZS0+dXBkYXRlZCA9IEZjVHJ1ZTsKICAgIH0KICAgIGVsc2UKCWNhY2hlLT5icm9rZW4gPSBGY1RydWU7CiAgICByZXR1cm4gaW5mbyAhPSAwOwp9CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVNhdmUgKEZjR2xvYmFsQ2FjaGUgICAgKmNhY2hlLAoJCSAgIGNvbnN0IEZjQ2hhcjggICAgKmNhY2hlX2ZpbGUpCnsKICAgIEZJTEUJCSpmOwogICAgaW50CQkJZGlyX2hhc2gsIGZpbGVfaGFzaDsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJKmRpcjsKICAgIEZjR2xvYmFsQ2FjaGVGaWxlCSpmaWxlOwogICAgRmNBdG9taWMJCSphdG9taWM7CgogICAgaWYgKCFjYWNoZS0+dXBkYXRlZCAmJiBjYWNoZS0+cmVmZXJlbmNlZCA9PSBjYWNoZS0+ZW50cmllcykKCXJldHVybiBGY1RydWU7CiAgICAKICAgIGlmIChjYWNoZS0+YnJva2VuKQoJcmV0dXJuIEZjRmFsc2U7CgogICAgLyogU2V0LVVJRCBwcm9ncmFtcyBjYW4ndCBzYWZlbHkgdXBkYXRlIHRoZSBjYWNoZSAqLwogICAgaWYgKGdldHVpZCAoKSAhPSBnZXRldWlkICgpKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgIGF0b21pYyA9IEZjQXRvbWljQ3JlYXRlIChjYWNoZV9maWxlKTsKICAgIGlmICghYXRvbWljKQoJZ290byBiYWlsMDsKICAgIGlmICghRmNBdG9taWNMb2NrIChhdG9taWMpKQoJZ290byBiYWlsMTsKICAgIGYgPSBmb3BlbiAoKGNoYXIgKikgRmNBdG9taWNOZXdGaWxlKGF0b21pYyksICJ3Iik7CiAgICBpZiAoIWYpCglnb3RvIGJhaWwyOwoKICAgIGZvciAoZGlyX2hhc2ggPSAwOyBkaXJfaGFzaCA8IEZDX0dMT0JBTF9DQUNIRV9ESVJfSEFTSF9TSVpFOyBkaXJfaGFzaCsrKQogICAgewoJZm9yIChkaXIgPSBjYWNoZS0+ZW50c1tkaXJfaGFzaF07IGRpcjsgZGlyID0gZGlyLT5uZXh0KQoJewoJICAgIGlmICghZGlyLT5pbmZvLnJlZmVyZW5jZWQpCgkJY29udGludWU7CgkgICAgaWYgKCFGY0NhY2hlV3JpdGVTdHJpbmcgKGYsIGRpci0+aW5mby5maWxlKSkKCQlnb3RvIGJhaWw0OwoJICAgIGlmIChQVVRDICgnICcsIGYpID09IEVPRikKCQlnb3RvIGJhaWw0OwoJICAgIGlmICghRmNDYWNoZVdyaXRlSW50IChmLCAwKSkKCQlnb3RvIGJhaWw0OwoJICAgIGlmIChQVVRDICgnICcsIGYpID09IEVPRikKCQlnb3RvIGJhaWw0OwoJICAgIGlmICghRmNDYWNoZVdyaXRlVGltZSAoZiwgZGlyLT5pbmZvLnRpbWUpKQoJCWdvdG8gYmFpbDQ7CgkgICAgaWYgKFBVVEMgKCcgJywgZikgPT0gRU9GKQoJCWdvdG8gYmFpbDQ7CgkgICAgaWYgKCFGY0NhY2hlV3JpdGVTdHJpbmcgKGYsIChGY0NoYXI4ICopIEZDX0ZPTlRfRklMRV9ESVIpKQoJCWdvdG8gYmFpbDQ7CgkgICAgaWYgKFBVVEMgKCdcbicsIGYpID09IEVPRikKCQlnb3RvIGJhaWw0OwoJICAgIAoJICAgIGZvciAoZmlsZV9oYXNoID0gMDsgZmlsZV9oYXNoIDwgRkNfR0xPQkFMX0NBQ0hFX0ZJTEVfSEFTSF9TSVpFOyBmaWxlX2hhc2grKykKCSAgICB7CgkJZm9yIChmaWxlID0gZGlyLT5lbnRzW2ZpbGVfaGFzaF07IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KQoJCXsKCQkgICAgaWYgKCFmaWxlLT5pbmZvLnJlZmVyZW5jZWQpCgkJCWNvbnRpbnVlOwoJCSAgICBpZiAoIUZjQ2FjaGVXcml0ZVBhdGggKGYsIGRpci0+aW5mby5maWxlLCBmaWxlLT5pbmZvLmZpbGUpKQoJCQlnb3RvIGJhaWw0OwoJCSAgICBpZiAoUFVUQyAoJyAnLCBmKSA9PSBFT0YpCgkJCWdvdG8gYmFpbDQ7CgkJICAgIGlmICghRmNDYWNoZVdyaXRlSW50IChmLCBmaWxlLT5pZCA8IDAgPyAwIDogZmlsZS0+aWQpKQoJCQlnb3RvIGJhaWw0OwoJCSAgICBpZiAoUFVUQyAoJyAnLCBmKSA9PSBFT0YpCgkJCWdvdG8gYmFpbDQ7CgkJICAgIGlmICghRmNDYWNoZVdyaXRlVGltZSAoZiwgZmlsZS0+aW5mby50aW1lKSkKCQkJZ290byBiYWlsNDsKCQkgICAgaWYgKFBVVEMgKCcgJywgZikgPT0gRU9GKQoJCQlnb3RvIGJhaWw0OwoJCSAgICBpZiAoIUZjQ2FjaGVXcml0ZVN0cmluZyAoZiwgZmlsZS0+bmFtZSkpCgkJCWdvdG8gYmFpbDQ7CgkJICAgIGlmIChQVVRDICgnXG4nLCBmKSA9PSBFT0YpCgkJCWdvdG8gYmFpbDQ7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAoZmNsb3NlIChmKSA9PSBFT0YpCglnb3RvIGJhaWwzOwogICAgCiAgICBpZiAoIUZjQXRvbWljUmVwbGFjZU9yaWcgKGF0b21pYykpCglnb3RvIGJhaWwzOwogICAgCiAgICBGY0F0b21pY1VubG9jayAoYXRvbWljKTsKICAgIEZjQXRvbWljRGVzdHJveSAoYXRvbWljKTsKCiAgICBjYWNoZS0+dXBkYXRlZCA9IEZjRmFsc2U7CiAgICByZXR1cm4gRmNUcnVlOwoKYmFpbDQ6CiAgICBmY2xvc2UgKGYpOwpiYWlsMzoKICAgIEZjQXRvbWljRGVsZXRlTmV3IChhdG9taWMpOwpiYWlsMjoKICAgIEZjQXRvbWljVW5sb2NrIChhdG9taWMpOwpiYWlsMToKICAgIEZjQXRvbWljRGVzdHJveSAoYXRvbWljKTsKYmFpbDA6CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKRmNCb29sCkZjRGlyQ2FjaGVWYWxpZCAoY29uc3QgRmNDaGFyOCAqZGlyKQp7CiAgICBGY0NoYXI4CSpjYWNoZV9maWxlID0gRmNTdHJQbHVzIChkaXIsIChGY0NoYXI4ICopICIvIiBGQ19ESVJfQ0FDSEVfRklMRSk7CiAgICBzdHJ1Y3Qgc3RhdAlmaWxlX3N0YXQsIGRpcl9zdGF0OwoKICAgIGlmIChzdGF0ICgoY2hhciAqKSBkaXIsICZkaXJfc3RhdCkgPCAwKQogICAgewoJRmNTdHJGcmVlIChjYWNoZV9maWxlKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgaWYgKHN0YXQgKChjaGFyICopIGNhY2hlX2ZpbGUsICZmaWxlX3N0YXQpIDwgMCkKICAgIHsKCUZjU3RyRnJlZSAoY2FjaGVfZmlsZSk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIEZjU3RyRnJlZSAoY2FjaGVfZmlsZSk7CiAgICAvKgogICAgICogSWYgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBtb2RpZmllZCBtb3JlIHJlY2VudGx5IHRoYW4KICAgICAqIHRoZSBjYWNoZSBmaWxlLCB0aGUgY2FjaGUgaXMgbm90IHZhbGlkCiAgICAgKi8KICAgIGlmIChkaXJfc3RhdC5zdF9tdGltZSAtIGZpbGVfc3RhdC5zdF9tdGltZSA+IDApCglyZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY0RpckNhY2hlUmVhZERpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpCnsKICAgIEZjQ2hhcjgJICAgICpjYWNoZV9maWxlID0gRmNTdHJQbHVzIChkaXIsIChGY0NoYXI4ICopICIvIiBGQ19ESVJfQ0FDSEVfRklMRSk7CiAgICBGSUxFCSAgICAqZjsKICAgIEZjQ2hhcjgJICAgICpiYXNlOwogICAgaW50CQkgICAgaWQ7CiAgICBpbnQJCSAgICBkaXJfbGVuOwogICAgRmNDaGFyOAkgICAgZmlsZV9idWZbODE5Ml0sICpmaWxlOwogICAgRmNDaGFyOAkgICAgbmFtZV9idWZbODE5Ml0sICpuYW1lOwogICAgRmNCb29sCSAgICByZXQgPSBGY0ZhbHNlOwoKICAgIGlmICghY2FjaGVfZmlsZSkKCWdvdG8gYmFpbDA7CiAgICAKICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJcHJpbnRmICgiRmNEaXJDYWNoZVJlYWREaXIgY2FjaGVfZmlsZSBcIiVzXCJcbiIsIGNhY2hlX2ZpbGUpOwogICAgCiAgICBmID0gZm9wZW4gKChjaGFyICopIGNhY2hlX2ZpbGUsICJyIik7CiAgICBpZiAoIWYpCiAgICB7CglpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19DQUNIRSkKCSAgICBwcmludGYgKCIgbm8gY2FjaGUgZmlsZVxuIik7Cglnb3RvIGJhaWwxOwogICAgfQoKICAgIGlmICghRmNEaXJDYWNoZVZhbGlkIChkaXIpKQogICAgewoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCgkgICAgcHJpbnRmICgiIGNhY2hlIGZpbGUgb2xkZXIgdGhhbiBkaXJlY3RvcnlcbiIpOwoJZ290byBiYWlsMjsKICAgIH0KICAgIAogICAgYmFzZSA9IChGY0NoYXI4ICopIHN0cnJjaHIgKChjaGFyICopIGNhY2hlX2ZpbGUsICcvJyk7CiAgICBpZiAoIWJhc2UpCglnb3RvIGJhaWwyOwogICAgYmFzZSsrOwogICAgZGlyX2xlbiA9IGJhc2UgLSBjYWNoZV9maWxlOwogICAgCiAgICBmaWxlID0gMDsKICAgIG5hbWUgPSAwOwogICAgd2hpbGUgKChmaWxlID0gRmNDYWNoZVJlYWRTdHJpbmcgKGYsIGZpbGVfYnVmLCBzaXplb2YgKGZpbGVfYnVmKSkpICYmCgkgICBGY0NhY2hlUmVhZEludCAoZiwgJmlkKSAmJgoJICAgKG5hbWUgPSBGY0NhY2hlUmVhZFN0cmluZyAoZiwgbmFtZV9idWYsIHNpemVvZiAobmFtZV9idWYpKSkpCiAgICB7CglpZiAoIUZjQ2FjaGVGb250U2V0QWRkIChzZXQsIGRpcnMsIGNhY2hlX2ZpbGUsIGRpcl9sZW4sCgkJCQlmaWxlLCBuYW1lKSkKCSAgICBnb3RvIGJhaWwzOwoJaWYgKGZpbGUgIT0gZmlsZV9idWYpCgkgICAgZnJlZSAoZmlsZSk7CglpZiAobmFtZSAhPSBuYW1lX2J1ZikKCSAgICBmcmVlIChuYW1lKTsKCWZpbGUgPSBuYW1lID0gMDsKICAgIH0KICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJcHJpbnRmICgiIGNhY2hlIGxvYWRlZFxuIik7CiAgICAKICAgIHJldCA9IEZjVHJ1ZTsKYmFpbDM6CiAgICBpZiAoZmlsZSAmJiBmaWxlICE9IGZpbGVfYnVmKQoJZnJlZSAoZmlsZSk7CiAgICBpZiAobmFtZSAmJiBuYW1lICE9IG5hbWVfYnVmKQoJZnJlZSAobmFtZSk7CmJhaWwyOgogICAgZmNsb3NlIChmKTsKYmFpbDE6CiAgICBGY1N0ckZyZWUgKGNhY2hlX2ZpbGUpOwpiYWlsMDoKICAgIHJldHVybiByZXQ7Cn0KCi8qCiAqIHJldHVybiB0aGUgcGF0aCBmcm9tIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAnY2FjaGUnIHRvICdmaWxlJwogKi8KCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNGaWxlQmFzZU5hbWUgKGNvbnN0IEZjQ2hhcjggKmNhY2hlLCBjb25zdCBGY0NoYXI4ICpmaWxlKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKmNhY2hlX3NsYXNoOwoKICAgIGNhY2hlX3NsYXNoID0gKGNvbnN0IEZjQ2hhcjggKikgc3RycmNociAoKGNvbnN0IGNoYXIgKikgY2FjaGUsICcvJyk7CiAgICBpZiAoY2FjaGVfc2xhc2ggJiYgIXN0cm5jbXAgKChjb25zdCBjaGFyICopIGNhY2hlLCAoY29uc3QgY2hhciAqKSBmaWxlLAoJCQkJIChjYWNoZV9zbGFzaCArIDEpIC0gY2FjaGUpKQoJcmV0dXJuIGZpbGUgKyAoKGNhY2hlX3NsYXNoICsgMSkgLSBjYWNoZSk7CiAgICByZXR1cm4gZmlsZTsKfQoKRmNCb29sCkZjRGlyQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpCnsKICAgIEZjQ2hhcjgJICAgICpjYWNoZV9maWxlID0gRmNTdHJQbHVzIChkaXIsIChGY0NoYXI4ICopICIvIiBGQ19ESVJfQ0FDSEVfRklMRSk7CiAgICBGY1BhdHRlcm4JICAgICpmb250OwogICAgRklMRQkgICAgKmY7CiAgICBGY0NoYXI4CSAgICAqbmFtZTsKICAgIGNvbnN0IEZjQ2hhcjggICAqZmlsZSwgKmJhc2U7CiAgICBpbnQJCSAgICBuOwogICAgaW50CQkgICAgaWQ7CiAgICBGY0Jvb2wJICAgIHJldDsKICAgIEZjU3RyTGlzdAkgICAgKmxpc3Q7CgogICAgaWYgKCFjYWNoZV9maWxlKQoJZ290byBiYWlsMDsKICAgIGlmIChGY0RlYnVnICgpICYgRkNfREJHX0NBQ0hFKQoJcHJpbnRmICgiRmNEaXJDYWNoZVdyaXRlRGlyIGNhY2hlX2ZpbGUgXCIlc1wiXG4iLCBjYWNoZV9maWxlKTsKICAgIAogICAgZiA9IGZvcGVuICgoY2hhciAqKSBjYWNoZV9maWxlLCAidyIpOwogICAgaWYgKCFmKQogICAgewoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCgkgICAgcHJpbnRmICgiIGNhbid0IGNyZWF0ZSBcIiVzXCJcbiIsIGNhY2hlX2ZpbGUpOwoJZ290byBiYWlsMTsKICAgIH0KICAgIAogICAgbGlzdCA9IEZjU3RyTGlzdENyZWF0ZSAoZGlycyk7CiAgICBpZiAoIWxpc3QpCglnb3RvIGJhaWwyOwogICAgCiAgICB3aGlsZSAoKGRpciA9IEZjU3RyTGlzdE5leHQgKGxpc3QpKSkKICAgIHsKCWJhc2UgPSBGY0ZpbGVCYXNlTmFtZSAoY2FjaGVfZmlsZSwgZGlyKTsKCWlmICghRmNDYWNoZVdyaXRlU3RyaW5nIChmLCBiYXNlKSkKCSAgICBnb3RvIGJhaWwzOwoJaWYgKFBVVEMgKCcgJywgZikgPT0gRU9GKQoJICAgIGdvdG8gYmFpbDM7CglpZiAoIUZjQ2FjaGVXcml0ZUludCAoZiwgMCkpCgkgICAgZ290byBiYWlsMzsKICAgICAgICBpZiAoUFVUQyAoJyAnLCBmKSA9PSBFT0YpCgkgICAgZ290byBiYWlsMzsKCWlmICghRmNDYWNoZVdyaXRlU3RyaW5nIChmLCBGQ19GT05UX0ZJTEVfRElSKSkKCSAgICBnb3RvIGJhaWwzOwoJaWYgKFBVVEMgKCdcbicsIGYpID09IEVPRikKCSAgICBnb3RvIGJhaWwzOwogICAgfQogICAgCiAgICBmb3IgKG4gPSAwOyBuIDwgc2V0LT5uZm9udDsgbisrKQogICAgewoJZm9udCA9IHNldC0+Zm9udHNbbl07CglpZiAoRmNQYXR0ZXJuR2V0U3RyaW5nIChmb250LCBGQ19GSUxFLCAwLCAoRmNDaGFyOCAqKikgJmZpbGUpICE9IEZjUmVzdWx0TWF0Y2gpCgkgICAgZ290byBiYWlsMzsKCWJhc2UgPSBGY0ZpbGVCYXNlTmFtZSAoY2FjaGVfZmlsZSwgZmlsZSk7CglpZiAoRmNQYXR0ZXJuR2V0SW50ZWdlciAoZm9udCwgRkNfSU5ERVgsIDAsICZpZCkgIT0gRmNSZXN1bHRNYXRjaCkKCSAgICBnb3RvIGJhaWwzOwoJaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEVWKQoJICAgIHByaW50ZiAoIiB3cml0ZSBmaWxlIFwiJXNcIlxuIiwgYmFzZSk7CglpZiAoIUZjQ2FjaGVXcml0ZVN0cmluZyAoZiwgYmFzZSkpCgkgICAgZ290byBiYWlsMzsKCWlmIChQVVRDICgnICcsIGYpID09IEVPRikKCSAgICBnb3RvIGJhaWwzOwoJaWYgKCFGY0NhY2hlV3JpdGVJbnQgKGYsIGlkKSkKCSAgICBnb3RvIGJhaWwzOwogICAgICAgIGlmIChQVVRDICgnICcsIGYpID09IEVPRikKCSAgICBnb3RvIGJhaWwzOwoJbmFtZSA9IEZjTmFtZVVucGFyc2UgKGZvbnQpOwoJaWYgKCFuYW1lKQoJICAgIGdvdG8gYmFpbDM7CglyZXQgPSBGY0NhY2hlV3JpdGVTdHJpbmcgKGYsIG5hbWUpOwoJRmNTdHJGcmVlIChuYW1lKTsKCWlmICghcmV0KQoJICAgIGdvdG8gYmFpbDM7CglpZiAoUFVUQyAoJ1xuJywgZikgPT0gRU9GKQoJICAgIGdvdG8gYmFpbDM7CiAgICB9CiAgICAKICAgIEZjU3RyTGlzdERvbmUgKGxpc3QpOwoKICAgIGlmIChmY2xvc2UgKGYpID09IEVPRikKCWdvdG8gYmFpbDE7CiAgICAKICAgIEZjU3RyRnJlZSAoY2FjaGVfZmlsZSk7CgogICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfQ0FDSEUpCglwcmludGYgKCIgY2FjaGUgd3JpdHRlblxuIik7CiAgICByZXR1cm4gRmNUcnVlOwogICAgCmJhaWwzOgogICAgRmNTdHJMaXN0RG9uZSAobGlzdCk7CmJhaWwyOgogICAgZmNsb3NlIChmKTsKYmFpbDE6CiAgICB1bmxpbmsgKChjaGFyICopIGNhY2hlX2ZpbGUpOwogICAgRmNTdHJGcmVlIChjYWNoZV9maWxlKTsKYmFpbDA6CiAgICByZXR1cm4gRmNGYWxzZTsKfQo=