Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQppdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQp0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKI2luY2x1ZGUgImJmZC5oIgojaW5jbHVkZSAiYmZkdmVyLmgiCiNpbmNsdWRlICJzeXNkZXAuaCIKI2luY2x1ZGUgImJmZGxpbmsuaCIKI2luY2x1ZGUgInNhZmUtY3R5cGUuaCIKI2luY2x1ZGUgImxpYmJmZC5oIgoKI2luY2x1ZGUgInZtcy5oIgoKI2lmZGVmIEhBVkVfQUxMT0NBX0gKI2luY2x1ZGUgPGFsbG9jYS5oPgojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXRfdm1zX3RpbWVfc3RyaW5nIFBBUkFNUyAoKHZvaWQpKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBSZWFkICYgcHJvY2VzcyBlbWggcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICpwdHI7CiAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKICBpbnQgc3VidHlwZTsKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJIRFIvRU1IXG4iKTsKI2VuZGlmCgogIHN3aXRjaCAob2JqdHlwZSkKICAgIHsKICAgICAgY2FzZSBPQkpfU19DX0hEUjoKCXN1YnR5cGUgPSB2bXNfcmVjWzFdOwoJYnJlYWs7CiAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgoJc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwoJYnJlYWs7CiAgICAgIGRlZmF1bHQ6CglzdWJ0eXBlID0gLTE7CiAgICB9CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDMsICJzdWJ0eXBlICVkXG4iLCBzdWJ0eXBlKTsKI2VuZGlmCgogIHN3aXRjaCAoc3VidHlwZSkKICAgIHsKCiAgICAgIGNhc2UgTUhEX1NfQ19NSEQ6CgkvKgoJICogbW9kdWxlIGhlYWRlcgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwoJUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7CglQUklWKGhkcl9kYXRhKS5oZHJfdF92ZXJzaW9uID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKCXB0ciArPSAqcHRyICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7CgogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19MTk06CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC0yKSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBNSERfU19DX1NSQzoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIE1IRF9TX0NfVFRMOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtMikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19DUFI6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19NVEM6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgTUhEX1NfQ19HVFg6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19NSEQgKyBFVkFYX09GRlNFVDoKCS8qCgkgKiBtb2R1bGUgaGVhZGVyCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9iX3N0cmx2bCA9IHZtc19yZWNbNl07CglQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX2FyY2gyID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CglQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKCXB0ciA9IHZtc19yZWMgKyAyMCArIHZtc19yZWNbMjBdICsgMTsKCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQoJICBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwoJcHRyICs9ICpwdHIgKyAxOwoJUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKCiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9CgkgIF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWKHJlY19sZW5ndGgtNikpOwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCglQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPQoJICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwoJUFJJVihoZHJfZGF0YSkuaGRyX2NfdHRsID0KCSAgX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYocmVjX2xlbmd0aC02KSk7CiAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgoJLyoKCSAqCgkgKi8KICAgICAgYnJlYWs7CgogICAgICBjYXNlIEVNSF9TX0NfTVRDICsgRVZBWF9PRkZTRVQ6CgkvKgoJICoKCSAqLwogICAgICBicmVhazsKCiAgICAgIGNhc2UgRU1IX1NfQ19HVFggKyBFVkFYX09GRlNFVDoKCS8qCgkgKgoJICovCiAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwogICAgICByZXR1cm4gLTE7CgogICAgfSAvKiBzd2l0Y2ggKi8KCiAgcmV0dXJuIDA7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBPdXRwdXQgcm91dGluZXMuICAqLwoKLyogTWFudWZhY3VyZSBhIFZNUyBsaWtlIHRpbWUgb24gYSB1bml4IGJhc2VkIHN5c3RlbS4KICAgc3RvbGVuIGZyb20gb2JqLXZtcy5jICAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgpnZXRfdm1zX3RpbWVfc3RyaW5nICgpCnsKICBzdGF0aWMgdW5zaWduZWQgY2hhciB0YnVmWzE4XTsKI2lmbmRlZiBWTVMKI2luY2x1ZGUgPHRpbWUuaD4KCiAgY2hhciAqcG50OwogIHRpbWVfdCB0aW1lYjsKICB0aW1lICgmdGltZWIpOwogIHBudCA9IGN0aW1lICgmdGltZWIpOwogIHBudFszXSA9IDA7CiAgcG50WzddID0gMDsKICBwbnRbMTBdID0gMDsKICBwbnRbMTZdID0gMDsKICBwbnRbMjRdID0gMDsKICBzcHJpbnRmICh0YnVmLCAiJTJzLSUzcy0lcyAlcyIsIHBudCArIDgsIHBudCArIDQsIHBudCArIDIwLCBwbnQgKyAxMSk7CiNlbHNlCiNpbmNsdWRlIDxzdGFybGV0Lmg+CiAgc3RydWN0CiAgewogICAgaW50IFNpemU7CiAgICB1bnNpZ25lZCBjaGFyICpQdHI7CiAgfSBEZXNjcmlwdG9yOwogIERlc2NyaXB0b3IuU2l6ZSA9IDE3OwogIERlc2NyaXB0b3IuUHRyID0gdGJ1ZjsKICBTWVMkQVNDVElNICgwLCAmRGVzY3JpcHRvciwgMCwgMCk7CiNlbmRpZiAvKiBub3QgVk1TICovCgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICg2LCAidm1zdGltZXN0cmluZzonJXMnXG4iLCB0YnVmKTsKI2VuZGlmCgogIHJldHVybiB0YnVmOwp9CgovKiB3cml0ZSBvYmplY3QgaGVhZGVyIGZvciBiZmQgYWJmZCAgKi8KCmludApfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIG9ianR5cGUpCiAgICAgYmZkICphYmZkOwogICAgIGludCBvYmp0eXBlOwp7CiAgYXN5bWJvbCAqc3ltYm9sOwogIHVuc2lnbmVkIGludCBzeW1udW07CiAgaW50IGhhZF9jYXNlID0gMDsKICBpbnQgaGFkX2ZpbGUgPSAwOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9oZHIgKCVwKVxuIiwgYWJmZCk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCAyKTsKCiAgLyogTUhEICovCgogIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTUhEKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7CiAgICB9CgogIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQogICAgewogICAgICAvKiBzdHJpcCBwYXRoIGFuZCBzdWZmaXggaW5mb3JtYXRpb24gKi8KCiAgICAgIGNoYXIgKmZuYW1lLCAqZm91dCwgKmZwdHI7CgogICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7CiAgICAgIGZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGZwdHIpICsgMSk7CiAgICAgIHN0cmNweSAoZm5hbWUsIGZwdHIpOwogICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7CiAgICAgIGlmIChmb3V0ID09IDApCglmb3V0ID0gc3RyY2hyIChmbmFtZSwgJzonKTsKICAgICAgaWYgKGZvdXQgIT0gMCkKCWZvdXQrKzsKICAgICAgZWxzZQoJZm91dCA9IGZuYW1lOwoKICAgICAgLyogc3RyaXAgLm9iaiBzdWZmaXggICovCgogICAgICBmcHRyID0gc3RycmNociAoZm5hbWUsICcuJyk7CiAgICAgIGlmICgoZnB0ciAhPSAwKQoJICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKCSpmcHRyID0gMDsKCiAgICAgIGZwdHIgPSBmb3V0OwogICAgICB3aGlsZSAoKmZwdHIgIT0gMCkKCXsKCSAgKmZwdHIgPSBUT1VQUEVSICgqZnB0cik7CgkgIGZwdHIrKzsKCSAgaWYgKCgqZnB0ciA9PSAnOycpCgkgICAgIHx8ICgoZnB0ciAtIGZvdXQpID4gMzEpKQoJICAgICpmcHRyID0gMDsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOwogICAgfQogIGVsc2UKICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCAiTk9OQU1FIik7CgogIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCBCRkRfVkVSU0lPTl9TVFJJTkcpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBnZXRfdm1zX3RpbWVfc3RyaW5nICgpLCAxNyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIDAsIDE3KTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBMTU4gKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiR0FTIHByb0dJUyIsIDEwKTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBTUkMgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfU1JDKTsKCiAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBhYmZkLT5zeW1jb3VudDsgc3ltbnVtKyspCiAgICB7CiAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKCiAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0ZJTEUpCgl7CgkgIGlmIChzdHJuY21wICgoY2hhciAqKXN5bWJvbC0+bmFtZSwgIjxDQVNFOiIsIDYpID09IDApCgkgICAgewoJICAgICAgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykgPSBzeW1ib2wtPm5hbWVbNl0gLSAnMCc7CgkgICAgICBQUklWKGZsYWdfc2hvd19hZnRlcl90cnVuYykgPSBzeW1ib2wtPm5hbWVbN10gLSAnMCc7CgoJICAgICAgaWYgKGhhZF9maWxlKQoJCWJyZWFrOwoJICAgICAgaGFkX2Nhc2UgPSAxOwoJICAgICAgY29udGludWU7CgkgICAgfQoKCSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIHN5bWJvbC0+bmFtZSwKCQkJCShpbnQpIHN0cmxlbiAoc3ltYm9sLT5uYW1lKSk7CgkgIGlmIChoYWRfY2FzZSkKCSAgICBicmVhazsKCSAgaGFkX2ZpbGUgPSAxOwoJfQogICAgfQoKICBpZiAoc3ltbnVtID09IGFiZmQtPnN5bWNvdW50KQogICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwoKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBUVEwgKi8KCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiVFRMIiwgMyk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogQ1BSICovCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsCgkJCSAodW5zaWduZWQgY2hhciAqKSJHTlUgQkZEIHBvcnRlZCBieSBLbGF1cyBL5G1wZiAxOTk0LTE5OTYiLAoJCQkgMzkpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIHJldHVybiAwOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFByb2Nlc3MgRU9NL0VFT00gcmVjb3JkCiAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKICAgICBiZmQgKmFiZmQ7CiAgICAgaW50IG9ianR5cGU7CnsKICB1bnNpZ25lZCBjaGFyICp2bXNfcmVjOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiRU9NL0VFT01cbiIpOwojZW5kaWYKCiAgdm1zX3JlYyA9IFBSSVYodm1zX3JlYyk7CgogIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkKICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgUFJJVihlb21fZGF0YSkuZW9tX2xfdG90YWxfbHBzID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDQpOwogICAgICBQUklWKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPSAqKHZtc19yZWMgKyA4KTsKICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCgl7CgkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiT2JqZWN0IG1vZHVsZSBOT1QgZXJyb3ItZnJlZSAhXG4iKSk7CgkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwoJICByZXR1cm4gLTE7Cgl9CiAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKICAgICAgaWYgKFBSSVYocmVjX3NpemUpID4gMTApCgl7CgkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX3RmcmZsZyA9ICoodm1zX3JlYyArIDkpOwoJICAgUFJJVihlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7CgoJICAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkcjsKCX0KICAgIH0KICByZXR1cm4gMDsKfQoKLyogV3JpdGUgZW9tIHJlY29yZCBmb3IgYmZkIGFiZmQgICovCgppbnQKX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBvYmp0eXBlKQogICAgIGJmZCAqYWJmZDsKICAgICBpbnQgb2JqdHlwZTsKewojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7CiNlbmRpZgoKICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7CiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBjb21wbGV0aW9uIGNvZGUgKi8KICBfYmZkX3Ztc19vdXRwdXRfYnl0ZSAoYWJmZCwgMCk7CS8qIGZpbGwgYnl0ZSAqLwoKICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSAhPSAoYmZkX3ZtYSktMSkKICAgIHsKICAgICAgYXNlY3Rpb24gKnNlY3Rpb247CgogICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubGluayIpOwogICAgICBpZiAoc2VjdGlvbiA9PSAwKQoJewoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpIChzZWN0aW9uLT5pbmRleCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKCQkJICAgICAodW5zaWduZWQgbG9uZykgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKICAgIH0KCiAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7CiAgcmV0dXJuIDA7Cn0K