LyoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgImhscGZpbGUuaCIKCnR5cGVkZWYgc3RydWN0CnsKICBjb25zdCBjaGFyICpoZWFkZXIxOwogIGNvbnN0IGNoYXIgKmhlYWRlcjI7CiAgY29uc3QgY2hhciAqc2VjdGlvbjsKICBjb25zdCBjaGFyICpmaXJzdF9wYXJhZ3JhcGg7CiAgY29uc3QgY2hhciAqbmV3bGluZTsKICBjb25zdCBjaGFyICpuZXh0X3BhcmFncmFwaDsKICBjb25zdCBjaGFyICpzcGVjaWFsX2NoYXI7CiAgY29uc3QgY2hhciAqYmVnaW5faXRhbGljOwogIGNvbnN0IGNoYXIgKmVuZF9pdGFsaWM7CiAgY29uc3QgY2hhciAqYmVnaW5fYm9sZGZhY2U7CiAgY29uc3QgY2hhciAqZW5kX2JvbGRmYWNlOwogIGNvbnN0IGNoYXIgKmJlZ2luX3R5cGV3cml0ZXI7CiAgY29uc3QgY2hhciAqZW5kX3R5cGV3cml0ZXI7CiAgY29uc3QgY2hhciAqdGFpbDsKfSBGT1JNQVQ7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgY29uc3QgY2hhciBjaDsKICBjb25zdCBjaGFyICpzdWJzdDsKfSBDSEFSTUFQW107CgoKRk9STUFUIGZvcm1hdCA9CnsKICAiPCFkb2N0eXBlIGxpbnV4ZG9jIHN5c3RlbT5cbiIKICAiPGFydGljbGU+XG4iCiAgIjx0aXRsZT5cbiIsCgogICJcbjxhdXRob3I+XG4lc1xuIgogICI8ZGF0ZT5cbiVzXG4iLAoKICAiXG48c2VjdD5cbiIsCiAgIlxuPHA+XG4iLAogICJcbjxuZXdsaW5lPlxuIiwKICAiXG5cbiIsCgogICImJXM7IiwKCiAgIjxlbT4iLAogICI8L2VtPiIsCiAgIjxiZj4iLAogICI8L2JmPiIsCiAgIjx0dD4iLAogICI8L3R0PiIsCgogICJcbjwvYXJ0aWNsZT5cbiIKfTsKCkNIQVJNQVAgY2hhcm1hcCA9CiAge3snxicsICJBRWxpZyJ9LAogICB7J8EnLCAiQWFjdXRlIn0sCiAgIHsnwicsICJBY2lyYyJ9LAogICB7J8AnLCAiQWdyYXZlIn0sCiAgIHsnwycsICJBdGlsZGUifSwKICAgeyfHJywgIkNjZWRpbCJ9LAogICB7J8knLCAiRWFjdXRlIn0sCiAgIHsnyCcsICJFZ3JhdmUifSwKICAgeyfLJywgIkV1bWwifSwKICAgeyfNJywgIklhY3V0ZSJ9LAogICB7J84nLCAiSWNpcmMifSwKICAgeyfMJywgIklncmF2ZSJ9LAogICB7J88nLCAiSXVtbCJ9LAogICB7J9EnLCAiTnRpbGRlIn0sCiAgIHsn0ycsICJPYWN1dGUifSwKICAgeyfUJywgIk9jaXJjIn0sCiAgIHsn0icsICJPZ3JhdmUifSwKICAgeyfYJywgIk9zbGFzaCJ9LAogICB7J9onLCAiVWFjdXRlIn0sCiAgIHsn2ScsICJVZ3JhdmUifSwKICAgeyfdJywgIllhY3V0ZSJ9LAogICB7J+EnLCAiYWFjdXRlIn0sCiAgIHsn4icsICJhY2lyYyJ9LAogICB7J+YnLCAiYWVsaWcifSwKICAgeyfgJywgImFncmF2ZSJ9LAogICB7J+UnLCAiYXJpbmcifSwKICAgeyfjJywgImF0aWxkZSJ9LAogICB7J+cnLCAiY2NlZGlsIn0sCiAgIHsn6ScsICJlYWN1dGUifSwKICAgeyfqJywgImVjaXJjIn0sCiAgIHsn6CcsICJlZ3JhdmUifSwKICAgeyfrJywgImV1bWwifSwKICAgeyftJywgImlhY3V0ZSJ9LAogICB7J+4nLCAiaWNpcmMifSwKICAgeyfsJywgImlncmF2ZSJ9LAogICB7J+8nLCAiaXVtbCJ9LAogICB7J/EnLCAibnRpbGRlIn0sCiAgIHsn8ycsICJvYWN1dGUifSwKICAgeyf/JywgInl1bWwifSwKICAgeyf0JywgIm9jaXJjIn0sCiAgIHsn8icsICJvZ3JhdmUifSwKICAgeyf4JywgIm9zbGFzaCJ9LAogICB7J/UnLCAib3RpbGRlIn0sCiAgIHsn+icsICJ1YWN1dGUifSwKICAgeyf7JywgInVjaXJjIn0sCiAgIHsn+ScsICJ1Z3JhdmUifSwKICAgeyf9JywgInlhY3V0ZSJ9LAogICB7JzwnLCAibHQifSwKICAgeycmJywgImFtcCJ9LAogICB7JyInLCAiZHF1b3QifSwKICAgeycjJywgIm51bSJ9LAogICB7JyUnLCAicGVyY250In0sCiAgIHsnXCcnLCAicXVvdCJ9LAojaWYgMAogICB7JygnLCAibHBhciJ9LAogICB7JyknLCAicnBhciJ9LAogICB7JyonLCAiYXN0In0sCiAgIHsnKycsICJwbHVzIn0sCiAgIHsnLCcsICJjb21tYSJ9LAogICB7Jy0nLCAiaHlwaGVuIn0sCiAgIHsnOicsICJjb2xvbiJ9LAogICB7JzsnLCAic2VtaSJ9LAogICB7Jz0nLCAiZXF1YWxzIn0sCiAgIHsnQCcsICJjb21tYXQifSwKICAgeydbJywgImxzcWIifSwKICAgeyddJywgInJzcWIifSwKICAgeydeJywgImNpcmMifSwKICAgeydfJywgImxvd2JhciJ9LAogICB7J3snLCAibGN1YiJ9LAogICB7J3wnLCAidmVyYmFyIn0sCiAgIHsnfScsICJyY3ViIn0sCiAgIHsnficsICJ0aWxkZSJ9LAojZW5kaWYKICAgeydcXCcsICJic29sIn0sCiAgIHsnJCcsICJkb2xsYXIifSwKICAgeyfEJywgIkF1bWwifSwKICAgeyfkJywgImF1bWwifSwKICAgeyfWJywgIk91bWwifSwKICAgeyf2JywgIm91bWwifSwKICAgeyfcJywgIlV1bWwifSwKICAgeyf8JywgInV1bWwifSwKICAgeyffJywgInN6bGlnIn0sCiAgIHsnPicsICJndCJ9LAogICB7J6cnLCAic2VjdCJ9LAogICB7J7YnLCAicGFyYSJ9LAogICB7J6knLCAiY29weSJ9LAogICB7J6EnLCAiaWV4Y2wifSwKICAgeye/JywgImlxdWVzdCJ9LAogICB7J6InLCAiY2VudCJ9LAogICB7J6MnLCAicG91bmQifSwKICAgeyfXJywgInRpbWVzIn0sCiAgIHsnsScsICJwbHVzbW4ifSwKICAgeyf3JywgImRpdmlkZSJ9LAogICB7J6wnLCAibm90In0sCiAgIHsntScsICJtdSJ9LAogICB7MCwwfX07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIHByaW50X3RleHQKICovCgpzdGF0aWMgdm9pZCBwcmludF90ZXh0KGNvbnN0IGNoYXIgKnApCnsKICBpbnQgaTsKCiAgZm9yICg7ICpwOyBwKyspCiAgICB7CiAgICAgIGZvciAoaSA9IDA7IGNoYXJtYXBbaV0uY2g7IGkrKykKCWlmICgqcCA9PSBjaGFybWFwW2ldLmNoKQoJICB7CgkgICAgcHJpbnRmKGZvcm1hdC5zcGVjaWFsX2NoYXIsIGNoYXJtYXBbaV0uc3Vic3QpOwoJICAgIGJyZWFrOwoJICB9CiAgICAgIGlmICghY2hhcm1hcFtpXS5jaCkKCXByaW50ZigiJWMiLCAqcCk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgICAgICAgbWFpbgogKi8KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIEhMUEZJTEUgICAqaGxwZmlsZTsKICBITFBGSUxFX1BBR0UgKnBhZ2U7CiAgSExQRklMRV9QQVJBR1JBUEggKnBhcmFncmFwaDsKICB0aW1lX3QgdDsKICBjaGFyIGRhdGVbNTBdOwogIGNoYXIgKmZpbGVuYW1lOwoKICBobHBmaWxlID0gSExQRklMRV9SZWFkSGxwRmlsZShhcmdjID4gMSA/IGFyZ3ZbMV0gOiAiIik7CgogIGlmICghaGxwZmlsZSkgcmV0dXJuKDIpOwoKICB0aW1lKCZ0KTsKICBzdHJmdGltZShkYXRlLCBzaXplb2YoZGF0ZSksICIleCIsIGxvY2FsdGltZSgmdCkpOwogIGZpbGVuYW1lID0gc3RycmNocihobHBmaWxlLT5scHN6UGF0aCwgJy8nKTsKICBpZiAoZmlsZW5hbWUpIGZpbGVuYW1lKys7CiAgZWxzZSBmaWxlbmFtZSA9IGhscGZpbGUtPmxwc3pQYXRoOwoKICAvKiBIZWFkZXIgKi8KICBwcmludGYoZm9ybWF0LmhlYWRlcjEpOwogIHByaW50X3RleHQoaGxwZmlsZS0+bHBzelRpdGxlKTsKICBwcmludGYoZm9ybWF0LmhlYWRlcjIsIGZpbGVuYW1lLCBkYXRlKTsKCiAgZm9yIChwYWdlID0gaGxwZmlsZS0+Zmlyc3RfcGFnZTsgcGFnZTsgcGFnZSA9IHBhZ2UtPm5leHQpCiAgICB7CiAgICAgIHBhcmFncmFwaCA9IHBhZ2UtPmZpcnN0X3BhcmFncmFwaDsKICAgICAgaWYgKCFwYXJhZ3JhcGgpIGNvbnRpbnVlOwoKICAgICAgLyogU2VjdGlvbiAqLwogICAgICBwcmludGYoZm9ybWF0LnNlY3Rpb24pOwogICAgICBmb3IgKDsgcGFyYWdyYXBoICYmICFwYXJhZ3JhcGgtPndWU3BhY2U7IHBhcmFncmFwaCA9IHBhcmFncmFwaC0+bmV4dCkKCXByaW50X3RleHQocGFyYWdyYXBoLT5scHN6VGV4dCk7CiAgICAgIHByaW50Zihmb3JtYXQuZmlyc3RfcGFyYWdyYXBoKTsKCiAgICAgIGZvciAoOyBwYXJhZ3JhcGg7IHBhcmFncmFwaCA9IHBhcmFncmFwaC0+bmV4dCkKCXsKCSAgLyogTmV3IGxpbmU7IG5ldyBwYXJhZ3JhcGggKi8KCSAgaWYgKHBhcmFncmFwaC0+d1ZTcGFjZSA9PSAxKQoJICAgIHByaW50Zihmb3JtYXQubmV3bGluZSk7CgkgIGVsc2UgaWYgKHBhcmFncmFwaC0+d1ZTcGFjZSA+IDEpCgkgICAgcHJpbnRmKGZvcm1hdC5uZXh0X3BhcmFncmFwaCk7CgoJICBpZiAocGFyYWdyYXBoLT53Rm9udCkKCSAgICBwcmludGYoZm9ybWF0LmJlZ2luX2JvbGRmYWNlKTsKCgkgIHByaW50X3RleHQocGFyYWdyYXBoLT5scHN6VGV4dCk7CgoJICBpZiAocGFyYWdyYXBoLT53Rm9udCkKCSAgICBwcmludGYoZm9ybWF0LmVuZF9ib2xkZmFjZSk7Cgl9CiAgICB9CgogIHByaW50Zihmb3JtYXQudGFpbCk7CgogIHJldHVybigwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICBTdWJzdGl0dXRpb25zIGZvciBzb21lIFdJTkVMSUIgZnVuY3Rpb25zCiAqLwoKc3RhdGljIEZJTEUgKmZpbGUgPSAwOwoKSEZJTEUgV0lOQVBJIE9wZW5GaWxlKCBMUENTVFIgcGF0aCwgT0ZTVFJVQ1QgKm9mcywgVUlOVCBtb2RlICkKewogIGZpbGUgPSAqcGF0aCA/IGZvcGVuKHBhdGgsICJyIikgOiBzdGRpbjsKICByZXR1cm4gZmlsZSA/IChIRklMRSkxIDogSEZJTEVfRVJST1I7Cn0KCkhGSUxFIFdJTkFQSSBfbGNsb3NlKCBIRklMRSBoRmlsZSApCnsKICBmY2xvc2UoZmlsZSk7CiAgcmV0dXJuIDA7Cn0KCkxPTkcgV0lOQVBJIF9ocmVhZCggSEZJTEUgaEZpbGUsIExQVk9JRCBidWZmZXIsIExPTkcgY291bnQgKQp7CiAgcmV0dXJuIGZyZWFkKGJ1ZmZlciwgMSwgY291bnQsIGZpbGUpOwp9CgpIR0xPQkFMIFdJTkFQSSBHbG9iYWxBbGxvYyggVUlOVCBmbGFncywgRFdPUkQgc2l6ZSApCnsKICByZXR1cm4gKEhHTE9CQUwpIG1hbGxvYyhzaXplKTsKfQoKTFBWT0lEIFdJTkFQSSBHbG9iYWxMb2NrKCBIR0xPQkFMIGhhbmRsZSApCnsKICByZXR1cm4gKExQVk9JRCkgaGFuZGxlOwp9CgpIR0xPQkFMIFdJTkFQSSBHbG9iYWxGcmVlKCBIR0xPQkFMIGhhbmRsZSApCnsKICBmcmVlKChWT0lEKikgaGFuZGxlKTsKICByZXR1cm4oMCk7Cn0KCi8qCiAqIFN0cmluZyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTMgWW5ndmkgU2lndXJqb25zc29uICh5bmd2aUBoYWZyby5pcykKICovCgpJTlQgV0lOQVBJIGxzdHJjbXAoTFBDU1RSIHN0cjEsTFBDU1RSIHN0cjIpCnsKICByZXR1cm4gc3RyY21wKCBzdHIxLCBzdHIyICk7Cn0KCklOVCBXSU5BUEkgbHN0cmNtcGkoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCnsKICBJTlQgcmVzOwoKICB3aGlsZSAoKnN0cjEpCiAgICB7CiAgICAgIGlmICgocmVzID0gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKSkgIT0gMCkgcmV0dXJuIHJlczsKICAgICAgc3RyMSsrOwogICAgICBzdHIyKys7CiAgICB9CiAgcmV0dXJuIHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMik7Cn0KCklOVCBXSU5BUEkgbHN0cmxlbihMUENTVFIgc3RyKQp7CiAgcmV0dXJuIHN0cmxlbihzdHIpOwp9CgpMUFNUUiBXSU5BUEkgbHN0cmNweUEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYyApCnsKICAgIGlmICghc3JjIHx8ICFkc3QpIHJldHVybiBOVUxMOwogICAgc3RyY3B5KCBkc3QsIHNyYyApOwogICAgcmV0dXJuIGRzdDsKfQoKdm9pZCBXSU5BUEkgaG1lbWNweTE2KExQVk9JRCBocHZEZXN0LCBMUENWT0lEIGhwdlNvdXJjZSwgTE9ORyBjYkNvcHkpCnsKICBtZW1jcHkoaHB2RGVzdCwgaHB2U291cmNlLCBjYkNvcHkpOwp9CgovKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCi8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KLyogRW5kOiAgICAgICAgICAgICAgICAqLwo=