LyoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGxwZmlsZS5oIgoKdHlwZWRlZiBzdHJ1Y3QKewogICAgY29uc3QgY2hhciAqaGVhZGVyMTsKICAgIGNvbnN0IGNoYXIgKmhlYWRlcjI7CiAgICBjb25zdCBjaGFyICpzZWN0aW9uOwogICAgY29uc3QgY2hhciAqZmlyc3RfcGFyYWdyYXBoOwogICAgY29uc3QgY2hhciAqbmV3bGluZTsKICAgIGNvbnN0IGNoYXIgKm5leHRfcGFyYWdyYXBoOwogICAgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFyOwogICAgY29uc3QgY2hhciAqYmVnaW5faXRhbGljOwogICAgY29uc3QgY2hhciAqZW5kX2l0YWxpYzsKICAgIGNvbnN0IGNoYXIgKmJlZ2luX2JvbGRmYWNlOwogICAgY29uc3QgY2hhciAqZW5kX2JvbGRmYWNlOwogICAgY29uc3QgY2hhciAqYmVnaW5fdHlwZXdyaXRlcjsKICAgIGNvbnN0IGNoYXIgKmVuZF90eXBld3JpdGVyOwogICAgY29uc3QgY2hhciAqdGFpbDsKfSBGT1JNQVQ7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBjb25zdCBjaGFyIGNoOwogICAgY29uc3QgY2hhciAqc3Vic3Q7Cn0gQ0hBUk1BUF9FTlRSWTsKCgpGT1JNQVQgZm9ybWF0ID0KewogICAgIjwhZG9jdHlwZSBsaW51eGRvYyBzeXN0ZW0+XG4iCiAgICAiPGFydGljbGU+XG4iCiAgICAiPHRpdGxlPlxuIiwKCiAgICAiXG48YXV0aG9yPlxuJXNcbiIKICAgICI8ZGF0ZT5cbiVzXG4iLAoKICAgICJcbjxzZWN0PlxuIiwKICAgICJcbjxwPlxuIiwKICAgICJcbjxuZXdsaW5lPlxuIiwKICAgICJcblxuIiwKCiAgICAiJiVzOyIsCgogICAgIjxlbT4iLAogICAgIjwvZW0+IiwKICAgICI8YmY+IiwKICAgICI8L2JmPiIsCiAgICAiPHR0PiIsCiAgICAiPC90dD4iLAoKICAgICJcbjwvYXJ0aWNsZT5cbiIKfTsKCkNIQVJNQVBfRU5UUlkgY2hhcm1hcFtdID0Ke3snxicsICJBRWxpZyJ9LAogeyfBJywgIkFhY3V0ZSJ9LAogeyfCJywgIkFjaXJjIn0sCiB7J8AnLCAiQWdyYXZlIn0sCiB7J8MnLCAiQXRpbGRlIn0sCiB7J8cnLCAiQ2NlZGlsIn0sCiB7J8knLCAiRWFjdXRlIn0sCiB7J8gnLCAiRWdyYXZlIn0sCiB7J8snLCAiRXVtbCJ9LAogeyfNJywgIklhY3V0ZSJ9LAogeyfOJywgIkljaXJjIn0sCiB7J8wnLCAiSWdyYXZlIn0sCiB7J88nLCAiSXVtbCJ9LAogeyfRJywgIk50aWxkZSJ9LAogeyfTJywgIk9hY3V0ZSJ9LAogeyfUJywgIk9jaXJjIn0sCiB7J9InLCAiT2dyYXZlIn0sCiB7J9gnLCAiT3NsYXNoIn0sCiB7J9onLCAiVWFjdXRlIn0sCiB7J9knLCAiVWdyYXZlIn0sCiB7J90nLCAiWWFjdXRlIn0sCiB7J+EnLCAiYWFjdXRlIn0sCiB7J+InLCAiYWNpcmMifSwKIHsn5icsICJhZWxpZyJ9LAogeyfgJywgImFncmF2ZSJ9LAogeyflJywgImFyaW5nIn0sCiB7J+MnLCAiYXRpbGRlIn0sCiB7J+cnLCAiY2NlZGlsIn0sCiB7J+knLCAiZWFjdXRlIn0sCiB7J+onLCAiZWNpcmMifSwKIHsn6CcsICJlZ3JhdmUifSwKIHsn6ycsICJldW1sIn0sCiB7J+0nLCAiaWFjdXRlIn0sCiB7J+4nLCAiaWNpcmMifSwKIHsn7CcsICJpZ3JhdmUifSwKIHsn7ycsICJpdW1sIn0sCiB7J/EnLCAibnRpbGRlIn0sCiB7J/MnLCAib2FjdXRlIn0sCiB7J/8nLCAieXVtbCJ9LAogeyf0JywgIm9jaXJjIn0sCiB7J/InLCAib2dyYXZlIn0sCiB7J/gnLCAib3NsYXNoIn0sCiB7J/UnLCAib3RpbGRlIn0sCiB7J/onLCAidWFjdXRlIn0sCiB7J/snLCAidWNpcmMifSwKIHsn+ScsICJ1Z3JhdmUifSwKIHsn/ScsICJ5YWN1dGUifSwKIHsnPCcsICJsdCJ9LAogeycmJywgImFtcCJ9LAogeyciJywgImRxdW90In0sCiB7JyMnLCAibnVtIn0sCiB7JyUnLCAicGVyY250In0sCiB7J1wnJywgInF1b3QifSwKI2lmIDAKIHsnKCcsICJscGFyIn0sCiB7JyknLCAicnBhciJ9LAogeycqJywgImFzdCJ9LAogeycrJywgInBsdXMifSwKIHsnLCcsICJjb21tYSJ9LAogeyctJywgImh5cGhlbiJ9LAogeyc6JywgImNvbG9uIn0sCiB7JzsnLCAic2VtaSJ9LAogeyc9JywgImVxdWFscyJ9LAogeydAJywgImNvbW1hdCJ9LAogeydbJywgImxzcWIifSwKIHsnXScsICJyc3FiIn0sCiB7J14nLCAiY2lyYyJ9LAogeydfJywgImxvd2JhciJ9LAogeyd7JywgImxjdWIifSwKIHsnfCcsICJ2ZXJiYXIifSwKIHsnfScsICJyY3ViIn0sCiB7J34nLCAidGlsZGUifSwKI2VuZGlmCiB7J1xcJywgImJzb2wifSwKIHsnJCcsICJkb2xsYXIifSwKIHsnxCcsICJBdW1sIn0sCiB7J+QnLCAiYXVtbCJ9LAogeyfWJywgIk91bWwifSwKIHsn9icsICJvdW1sIn0sCiB7J9wnLCAiVXVtbCJ9LAogeyf8JywgInV1bWwifSwKIHsn3ycsICJzemxpZyJ9LAogeyc+JywgImd0In0sCiB7J6cnLCAic2VjdCJ9LAogeye2JywgInBhcmEifSwKIHsnqScsICJjb3B5In0sCiB7J6EnLCAiaWV4Y2wifSwKIHsnvycsICJpcXVlc3QifSwKIHsnoicsICJjZW50In0sCiB7J6MnLCAicG91bmQifSwKIHsn1ycsICJ0aW1lcyJ9LAogeyexJywgInBsdXNtbiJ9LAogeyf3JywgImRpdmlkZSJ9LAogeyesJywgIm5vdCJ9LAogeye1JywgIm11In0sCiB7MCwwfX07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIHByaW50X3RleHQKICovCgpzdGF0aWMgdm9pZCBwcmludF90ZXh0KGNvbnN0IGNoYXIgKnApCnsKICAgIGludCBpOwoKICAgIGZvciAoOyAqcDsgcCsrKQogICAgewogICAgICAgIGZvciAoaSA9IDA7IGNoYXJtYXBbaV0uY2g7IGkrKykKICAgICAgICAgICAgaWYgKCpwID09IGNoYXJtYXBbaV0uY2gpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50Zihmb3JtYXQuc3BlY2lhbF9jaGFyLCBjaGFybWFwW2ldLnN1YnN0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgaWYgKCFjaGFybWFwW2ldLmNoKQogICAgICAgICAgICBwcmludGYoIiVjIiwgKnApOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIG1haW4KICovCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIEhMUEZJTEUgICAqaGxwZmlsZTsKICAgIEhMUEZJTEVfUEFHRSAqcGFnZTsKICAgIEhMUEZJTEVfUEFSQUdSQVBIICpwYXJhZ3JhcGg7CiAgICB0aW1lX3QgdDsKICAgIGNoYXIgZGF0ZVs1MF07CiAgICBjaGFyICpmaWxlbmFtZTsKCiAgICBobHBmaWxlID0gSExQRklMRV9SZWFkSGxwRmlsZShhcmdjID4gMSA/IGFyZ3ZbMV0gOiAiIik7CgogICAgaWYgKCFobHBmaWxlKSByZXR1cm4gMjsKCiAgICB0aW1lKCZ0KTsKICAgIHN0cmZ0aW1lKGRhdGUsIHNpemVvZihkYXRlKSwgIiV4IiwgbG9jYWx0aW1lKCZ0KSk7CiAgICBmaWxlbmFtZSA9IHN0cnJjaHIoaGxwZmlsZS0+bHBzelBhdGgsICcvJyk7CiAgICBpZiAoZmlsZW5hbWUpIGZpbGVuYW1lKys7CiAgICBlbHNlIGZpbGVuYW1lID0gaGxwZmlsZS0+bHBzelBhdGg7CgogICAgLyogSGVhZGVyICovCiAgICBwcmludGYoZm9ybWF0LmhlYWRlcjEpOwogICAgcHJpbnRfdGV4dChobHBmaWxlLT5scHN6VGl0bGUpOwogICAgcHJpbnRmKGZvcm1hdC5oZWFkZXIyLCBmaWxlbmFtZSwgZGF0ZSk7CgogICAgZm9yIChwYWdlID0gaGxwZmlsZS0+Zmlyc3RfcGFnZTsgcGFnZTsgcGFnZSA9IHBhZ2UtPm5leHQpCiAgICB7CiAgICAgICAgcGFyYWdyYXBoID0gcGFnZS0+Zmlyc3RfcGFyYWdyYXBoOwogICAgICAgIGlmICghcGFyYWdyYXBoKSBjb250aW51ZTsKCiAgICAgICAgLyogU2VjdGlvbiAqLwogICAgICAgIHByaW50Zihmb3JtYXQuc2VjdGlvbik7CiAgICAgICAgZm9yICg7IHBhcmFncmFwaCAmJiAhcGFyYWdyYXBoLT51LnRleHQud1ZTcGFjZTsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQogICAgICAgICAgICBwcmludF90ZXh0KHBhcmFncmFwaC0+dS50ZXh0Lmxwc3pUZXh0KTsKICAgICAgICBwcmludGYoZm9ybWF0LmZpcnN0X3BhcmFncmFwaCk7CgogICAgICAgIGZvciAoOyBwYXJhZ3JhcGg7IHBhcmFncmFwaCA9IHBhcmFncmFwaC0+bmV4dCkKCXsKICAgICAgICAgICAgc3dpdGNoIChwYXJhZ3JhcGgtPmNvb2tpZSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIHBhcmFfbm9ybWFsX3RleHQ6CiAgICAgICAgICAgIGNhc2UgcGFyYV9kZWJ1Z190ZXh0OgogICAgICAgICAgICAgICAgLyogTmV3IGxpbmU7IG5ldyBwYXJhZ3JhcGggKi8KICAgICAgICAgICAgICAgIGlmIChwYXJhZ3JhcGgtPnUudGV4dC53VlNwYWNlID09IDEpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKGZvcm1hdC5uZXdsaW5lKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFncmFwaC0+dS50ZXh0LndWU3BhY2UgPiAxKQogICAgICAgICAgICAgICAgICAgIHByaW50Zihmb3JtYXQubmV4dF9wYXJhZ3JhcGgpOwoKICAgICAgICAgICAgICAgIGlmIChwYXJhZ3JhcGgtPnUudGV4dC53Rm9udCkKICAgICAgICAgICAgICAgICAgICBwcmludGYoZm9ybWF0LmJlZ2luX2JvbGRmYWNlKTsKCiAgICAgICAgICAgICAgICBwcmludF90ZXh0KHBhcmFncmFwaC0+dS50ZXh0Lmxwc3pUZXh0KTsKCiAgICAgICAgICAgICAgICBpZiAocGFyYWdyYXBoLT51LnRleHQud0ZvbnQpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKGZvcm1hdC5lbmRfYm9sZGZhY2UpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgcGFyYV9iaXRtYXA6CiAgICAgICAgICAgIGNhc2UgcGFyYV9tZXRhZmlsZToKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9Cgl9CiAgICB9CgogICAgcHJpbnRmKGZvcm1hdC50YWlsKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICBTdWJzdGl0dXRpb25zIGZvciBzb21lIFdJTkVMSUIgZnVuY3Rpb25zCiAqLwoKc3RhdGljIEZJTEUgKmZpbGUgPSAwOwoKSEZJTEUgV0lOQVBJIE9wZW5GaWxlKCBMUENTVFIgcGF0aCwgT0ZTVFJVQ1QgKm9mcywgVUlOVCBtb2RlICkKewogICAgZmlsZSA9ICpwYXRoID8gZm9wZW4ocGF0aCwgInIiKSA6IHN0ZGluOwogICAgcmV0dXJuIGZpbGUgPyAoSEZJTEUpMSA6IEhGSUxFX0VSUk9SOwp9CgpIRklMRSBXSU5BUEkgX2xjbG9zZSggSEZJTEUgaEZpbGUgKQp7CiAgICBmY2xvc2UoZmlsZSk7CiAgICByZXR1cm4gMDsKfQoKTE9ORyBXSU5BUEkgX2hyZWFkKCBIRklMRSBoRmlsZSwgTFBWT0lEIGJ1ZmZlciwgTE9ORyBjb3VudCApCnsKICAgIHJldHVybiBmcmVhZChidWZmZXIsIDEsIGNvdW50LCBmaWxlKTsKfQoKSEFORExFIFdJTkFQSSBHZXRQcm9jZXNzSGVhcCh2b2lkKQp7CiAgICByZXR1cm4gMDsKfQoKdm9pZCogV0lOQVBJIEhlYXBBbGxvYyggSEFORExFIGhlYXAsIERXT1JEIGZsYWdzLCBEV09SRCBzaXplICkKewogICAgYXNzZXJ0KGZsYWdzID09IDApOwogICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKfQoKdm9pZCogV0lOQVBJIEhlYXBSZUFsbG9jKCBIQU5ETEUgaGVhcCwgRFdPUkQgZmxhZ3MsIHZvaWQqIHB0ciwgRFdPUkQgc2l6ZSkKewogICAgYXNzZXJ0KGZsYWdzID09IDApOwogICAgcmV0dXJuIHJlYWxsb2MocHRyLCBzaXplKTsKfQoKQk9PTCBXSU5BUEkgSGVhcEZyZWUoIEhHTE9CQUwgaGFuZGxlLCBEV09SRCBmbGFncywgdm9pZCogcHRyICkKewogICAgZnJlZShwdHIpOwogICAgcmV0dXJuIFRSVUU7Cn0KCmNoYXIgX193aW5lX2RiY2hfd2luaGVscFtdID0gIlwwMDN3aW5oZWxwIjsKCnN0YXRpYyBjaGFyICogY29uc3QgZGVidWdfY2hhbm5lbHNbMV0gPQp7CiAgICBfX3dpbmVfZGJjaF93aW5oZWxwCn07CgppbnQgd2luZV9kYmdfbG9nKCBpbnQgY2xzLCBjb25zdCBjaGFyICpjaGFubmVsLCBjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApCnsKICAgIHJldHVybiAxOwp9CgpIQklUTUFQIFdJTkFQSSBDcmVhdGVESUJpdG1hcChIREMgaGRjLCBDT05TVCBCSVRNQVBJTkZPSEVBREVSKiBiaWgsIERXT1JEIGEsIENPTlNUIHZvaWQqIHB0ciwgQ09OU1QgQklUTUFQSU5GTyogYmksIFVJTlQgYykKewogICAgcmV0dXJuIDA7Cn0KCkhNRVRBRklMRSBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzRXgoVUlOVCBjYkJ1ZmZlciwgQ09OU1QgQllURSAqbHBiQnVmZmVyKQp7CiAgICByZXR1cm4gMDsKfQoKQk9PTCBXSU5BUEkgRGVsZXRlTWV0YUZpbGUoSE1FVEFGSUxFIGgpCnsKICAgIHJldHVybiAwOwp9CgpIREMgV0lOQVBJIEdldERDKEhXTkQgaCkKewogICAgcmV0dXJuIDA7Cn0KCmludCBXSU5BUEkgUmVsZWFzZURDKEhXTkQgaCwgSERDIGhkYykKewogICAgcmV0dXJuIDA7Cn0KCkJPT0wgV0lOQVBJIERlbGV0ZU9iamVjdChIR0RJT0JKIGgpCnsKICAgIHJldHVybiBUUlVFOwp9Ci8qCiAqIFN0cmluZyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTMgWW5ndmkgU2lndXJqb25zc29uICh5bmd2aUBoYWZyby5pcykKICovCgpJTlQgV0lOQVBJIGxzdHJjbXAoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCnsKICAgIHJldHVybiBzdHJjbXAoIHN0cjEsIHN0cjIgKTsKfQoKSU5UIFdJTkFQSSBsc3RyY21waSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKewogICAgSU5UIHJlczsKCiAgICB3aGlsZSAoKnN0cjEpCiAgICB7CiAgICAgICAgaWYgKChyZXMgPSB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpKSAhPSAwKSByZXR1cm4gcmVzOwogICAgICAgIHN0cjErKzsKICAgICAgICBzdHIyKys7CiAgICB9CiAgICByZXR1cm4gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKTsKfQoKSU5UIFdJTkFQSSBsc3RybGVuKCBMUENTVFIgc3RyICkKewogICAgcmV0dXJuIHN0cmxlbihzdHIpOwp9CgpMUFNUUiBXSU5BUEkgbHN0cmNweUEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYyApCnsKICAgIGlmICghc3JjIHx8ICFkc3QpIHJldHVybiBOVUxMOwogICAgc3RyY3B5KCBkc3QsIHNyYyApOwogICAgcmV0dXJuIGRzdDsKfQo=