Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAiYmZkLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCi8qIFJlYWQgJiBwcm9jZXNzIGVtaCByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCgppbnQKX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewogIHVuc2lnbmVkIGNoYXIgKnB0cjsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwogIGludCBzdWJ0eXBlOwoKICB2bXNfcmVjID0gUFJJVih2bXNfcmVjKTsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMiwgIkhEUi9FTUhcbiIpOwojZW5kaWYKCiAgc3dpdGNoIChvYmp0eXBlKQogICAgewogICAgICBjYXNlIE9CSl9TX0NfSERSOgoJc3VidHlwZSA9IHZtc19yZWNbMV07CglicmVhazsKICAgICAgY2FzZSBFT0JKX1NfQ19FTUg6CglzdWJ0eXBlID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDQpICsgRVZBWF9PRkZTRVQ7CglicmVhazsKICAgICAgZGVmYXVsdDoKCXN1YnR5cGUgPSAtMTsKICAgIH0KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwojZW5kaWYKCiAgc3dpdGNoIChzdWJ0eXBlKQogICAgewoKICAgICAgY2FzZSBNSERfU19DX01IRDoKCS8qCgkgKiBtb2R1bGUgaGVhZGVyCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbMl07CglQUklWKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgMyk7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDUpOwoJcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwoJcHRyICs9ICpwdHIgKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0xOTToKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfU1JDOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19UVEw6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0NQUjoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX01UQzoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX0dUWDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX01IRCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqIG1vZHVsZSBoZWFkZXIKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gxID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfYXJjaDIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X25hbWUgPQoJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgMjApOwoJcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9CgkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7CglwdHIgKz0gKnB0ciArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwoKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTE5NICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX1NSQyArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19UVEwgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfQ1BSICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgoJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7CiAgICAgIHJldHVybiAtMTsKCiAgICB9IC8qIHN3aXRjaCAqLwoKICByZXR1cm4gMDsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBPdXRwdXQgcm91dGluZXMuICAqLwoKCi8qIE1hbnVmYWN1cmUgYSBWTVMgbGlrZSB0aW1lIG9uIGEgdW5peCBiYXNlZCBzeXN0ZW0uCiAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyICoKZ2V0X3Ztc190aW1lX3N0cmluZyAoKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CiAgdGltZSAoJnRpbWViKTsKICBwbnQgPSBjdGltZSAoJnRpbWViKTsKICBwbnRbM10gPSAwOwogIHBudFs3XSA9IDA7CiAgcG50WzEwXSA9IDA7CiAgcG50WzE2XSA9IDA7CiAgcG50WzI0XSA9IDA7CiAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKCi8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICBhc3ltYm9sICpzeW1ib2w7CiAgaW50IHN5bW51bTsKICBpbnQgaGFkX2Nhc2UgPSAwOwogIGludCBoYWRfZmlsZSA9IDA7CgoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKCiAgLyogTUhEICovCgogIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7CiAgICB9CgogIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQogICAgewogICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KCiAgICAgIGNoYXIgKmZuYW1lLCAqZm91dCwgKmZwdHI7CgogICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CiAgICAgIGZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGZwdHIpICsgMSk7CiAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwogICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7CiAgICAgIGlmIChmb3V0ID09IDApCglmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKICAgICAgaWYgKGZvdXQgIT0gMCkKCWZvdXQrKzsKICAgICAgZWxzZQoJZm91dCA9IGZuYW1lOwoKICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCgogICAgICBmcHRyID0gc3RycmNociAoZm5hbWUsICcuJyk7CiAgICAgIGlmICgoZnB0ciAhPSAwKQoJICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKCSpmcHRyID0gMDsKCiAgICAgIGZwdHIgPSBmb3V0OwogICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKCXsKCSAgaWYgKGlzbG93ZXIgKCpmcHRyKSkKCSAgICAqZnB0ciA9IHRvdXBwZXIgKCpmcHRyKTsKCSAgZnB0cisrOwoJICBpZiAoKCpmcHRyID09ICc7JykKCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCgkgICAgKmZwdHIgPSAwOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgZ2V0X3Ztc190aW1lX3N0cmluZyAoKSwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCAwLCAxNyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogTE1OICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0xOTSk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIkdBUyBwcm9HSVMiLCAxMCk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogU1JDICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1NSQyk7CgogIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQogICAgewogICAgICBzeW1ib2wgPSBhYmZkLT5vdXRzeW1ib2xzW3N5bW51bV07CgogICAgICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9GSUxFKQoJewoJICBjaGFyICpzOwoKCSAgaWYgKHN0cm5jbXAgKChjaGFyICopc3ltYm9sLT5uYW1lLCAiPENBU0U6IiwgNikgPT0gMCkKCSAgICB7CgkgICAgICBQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSA9IHN5bWJvbC0+bmFtZVs2XSAtICcwJzsKCSAgICAgIFBSSVYoZmxhZ19zaG93X2FmdGVyX3RydW5jKSA9IHN5bWJvbC0+bmFtZVs3XSAtICcwJzsKCgkgICAgICBpZiAoaGFkX2ZpbGUpCgkJYnJlYWs7CgkgICAgICBoYWRfY2FzZSA9IDE7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKilzeW1ib2wtPm5hbWUsIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7CgkgIGlmIChoYWRfY2FzZSkKCSAgICBicmVhazsKCSAgaGFkX2ZpbGUgPSAxOwoJfQogICAgfQoKICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQogICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwoKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBUVEwgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiVFRMIiwgMyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogQ1BSICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsCgkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAoJCQkgMzkpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwojZW5kaWYKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgogIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkgCiAgICAgfHwgKG9ianR5cGUgPT0gT0JKX1NfQ19FT01XKSkKICAgIHsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2JfY29tY29kID0gKih2bXNfcmVjICsgOCk7CiAgICAgIGlmIChQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQoJewoJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gZmFsc2U7CiAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQoJewoJICAgUFJJVihlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IHRydWU7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3BzaW5keCA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CgkgICBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoKCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWKGVvbV9kYXRhKS5lb21fbF90ZnJhZHI7Cgl9CiAgICB9CiAgcmV0dXJuIDA7Cn0KCgovKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZCAgKi8KCmludApfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZW9tICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKI2VuZGlmCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgb2JqdHlwZSwgLTEpOwogIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykoUFJJVih2bXNfbGlua2FnZV9pbmRleCkgPj4gMSkpOwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBmaWxsIGJ5dGUgKi8KCiAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCiAgICB7CiAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwoKICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKCXsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CgkgIHJldHVybiAtMTsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShzZWN0aW9uLT5pbmRleCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKCQkJICAgICAodW5zaWduZWQgbG9uZykgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgIH0KCiAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7CiAgcmV0dXJuIDA7Cn0K