LyoKICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAogKgogKiAgSW5mb3JtYXRpb24gc3RydWN0dXJlcyBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YQogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA0CU5va2lhIENvcnBvcmF0aW9uCiAqICBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqLwoKI2lmbmRlZiBfT01BUF9CT0FSRF9ICiNkZWZpbmUgX09NQVBfQk9BUkRfSAoKI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CgovKiBEaWZmZXJlbnQgcGVyaXBoZXJhbCBpZHMgKi8KI2RlZmluZSBPTUFQX1RBR19DTE9DSwkJMHg0ZjAxCiNkZWZpbmUgT01BUF9UQUdfTU1DCQkweDRmMDIKI2RlZmluZSBPTUFQX1RBR19TRVJJQUxfQ09OU09MRSAweDRmMDMKI2RlZmluZSBPTUFQX1RBR19VU0IJCTB4NGYwNAojZGVmaW5lIE9NQVBfVEFHX0xDRAkJMHg0ZjA1CiNkZWZpbmUgT01BUF9UQUdfR1BJT19TV0lUQ0gJMHg0ZjA2CiNkZWZpbmUgT01BUF9UQUdfVUFSVAkJMHg0ZjA3CiNkZWZpbmUgT01BUF9UQUdfRkJNRU0JCTB4NGYwOAojZGVmaW5lIE9NQVBfVEFHX1NUSV9DT05TT0xFCTB4NGYwOQoKI2RlZmluZSBPTUFQX1RBR19CT09UX1JFQVNPTiAgICAweDRmODAKI2RlZmluZSBPTUFQX1RBR19GTEFTSF9QQVJUCTB4NGY4MQojZGVmaW5lIE9NQVBfVEFHX1ZFUlNJT05fU1RSCTB4NGY4MgoKc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnIHsKCS8qIDAgZm9yIDEyIE1IeiwgMSBmb3IgMTMgTUh6IGFuZCAyIGZvciAxOS4yIE1IeiAqLwoJdTggc3lzdGVtX2Nsb2NrX3R5cGU7Cn07CgpzdHJ1Y3Qgb21hcF9tbWNfY29uZiB7Cgl1bnNpZ25lZCBlbmFibGVkOjE7CgkvKiBub211eCBtZWFucyAic3RhbmRhcmQiIG11eGluZyBpcyB3cm9uZyBvbiB0aGlzIGJvYXJkLCBhbmQgdGhhdAoJICogYm9hcmQtc3BlY2lmaWMgY29kZSBoYW5kbGVkIGl0IGJlZm9yZSBjb21tb24gaW5pdCBsb2dpYy4KCSAqLwoJdW5zaWduZWQgbm9tdXg6MTsKCS8qIHN3aXRjaCBwaW4gY2FuIGJlIGZvciBjYXJkIGRldGVjdCAoZGVmYXVsdCkgb3IgY2FyZCBjb3ZlciAqLwoJdW5zaWduZWQgY292ZXI6MTsKCS8qIDQgd2lyZSBzaWduYWxpbmcgaXMgb3B0aW9uYWwsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFNEL1NESU8gKi8KCXVuc2lnbmVkIHdpcmU0OjE7CglzMTYgcG93ZXJfcGluOwoJczE2IHN3aXRjaF9waW47CglzMTYgd3BfcGluOwp9OwoKc3RydWN0IG9tYXBfbW1jX2NvbmZpZyB7CglzdHJ1Y3Qgb21hcF9tbWNfY29uZiBtbWNbMl07Cn07CgpzdHJ1Y3Qgb21hcF9zZXJpYWxfY29uc29sZV9jb25maWcgewoJdTggY29uc29sZV91YXJ0OwoJdTMyIGNvbnNvbGVfc3BlZWQ7Cn07CgpzdHJ1Y3Qgb21hcF9zdGlfY29uc29sZV9jb25maWcgewoJdW5zaWduZWQgZW5hYmxlOjE7Cgl1OCBjaGFubmVsOwp9OwoKc3RydWN0IG9tYXBfdXNiX2NvbmZpZyB7CgkvKiBDb25maWd1cmUgZHJpdmVycyBhY2NvcmRpbmcgdG8gdGhlIGNvbm5lY3RvcnMgb24geW91ciBib2FyZDoKCSAqICAtICJBIiBjb25uZWN0b3IgKHJlY3RhZ3VsYXIpCgkgKgkuLi4gZm9yIGhvc3QvT0hDSSB1c2UsIHNldCAicmVnaXN0ZXJfaG9zdCIuCgkgKiAgLSAiQiIgY29ubmVjdG9yIChzcXVhcmlzaCkgb3IgIk1pbmktQiIKCSAqCS4uLiBmb3IgZGV2aWNlL2dhZGdldCB1c2UsIHNldCAicmVnaXN0ZXJfZGV2Ii4KCSAqICAtICJNaW5pLUFCIiBjb25uZWN0b3IgKHZlcnkgc2ltaWxhciB0byBNaW5pLUIpCgkgKgkuLi4gZm9yIE9URyB1c2UgYXMgZGV2aWNlIE9SIGhvc3QsIGluaXRpYWxpemUgIm90ZyIKCSAqLwoJdW5zaWduZWQJcmVnaXN0ZXJfaG9zdDoxOwoJdW5zaWduZWQJcmVnaXN0ZXJfZGV2OjE7Cgl1OAkJb3RnOwkvKiBwb3J0IG51bWJlciwgMS1iYXNlZDogIHVzYjEgPT0gMiAqLwoKCXU4CQlobWNfbW9kZTsKCgkvKiBpbXBsaWNpdGx5IHRydWUgaWYgb3RnOiAgaG9zdCBzdXBwb3J0cyByZW1vdGUgd2FrZXVwPyAqLwoJdTgJCXJ3YzsKCgkvKiBzaWduYWxpbmcgcGlucyB1c2VkIHRvIHRhbGsgdG8gdHJhbnNjZWl2ZXIgb24gdXNiTjoKCSAqICAwID09IHVzYk4gdW51c2VkCgkgKiAgMiA9PSB1c2IwLW9ubHksIHVzaW5nIGludGVybmFsIHRyYW5zY2VpdmVyCgkgKiAgMyA9PSAzIHdpcmUgYmlkaXJlY3Rpb25hbAoJICogIDQgPT0gNCB3aXJlIGJpZGlyZWN0aW9uYWwKCSAqICA2ID09IDYgd2lyZSB1bmlkaXJlY3Rpb25hbCAob3IgVExMKQoJICovCgl1OAkJcGluc1szXTsKfTsKCnN0cnVjdCBvbWFwX2xjZF9jb25maWcgewoJY2hhciBwYW5lbF9uYW1lWzE2XTsKCWNoYXIgY3RybF9uYW1lWzE2XTsKfTsKCnN0cnVjdCBvbWFwX2ZibWVtX2NvbmZpZyB7Cgl1MzIgZmJfc3JhbV9zdGFydDsKCXUzMiBmYl9zcmFtX3NpemU7Cgl1MzIgZmJfc2RyYW1fc3RhcnQ7Cgl1MzIgZmJfc2RyYW1fc2l6ZTsKfTsKCi8qIENvdmVyOgogKiAgICAgIGhpZ2ggLT4gY2xvc2VkCiAqICAgICAgbG93ICAtPiBvcGVuCiAqIENvbm5lY3Rpb246CiAqICAgICAgaGlnaCAtPiBjb25uZWN0ZWQKICogICAgICBsb3cgIC0+IGRpc2Nvbm5lY3RlZAogKi8KI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09WRVIJCTB4MDAwMAojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfVFlQRV9DT05ORUNUSU9OCTB4MDAwMQojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19JTlZFUlRFRAkJMHgwMDAxCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX09VVFBVVAkJMHgwMDAyCnN0cnVjdCBvbWFwX2dwaW9fc3dpdGNoX2NvbmZpZyB7CgljaGFyIG5hbWVbMTJdOwoJdTE2IGdwaW87CglpbnQgZmxhZ3M6NDsKCWludCB0eXBlOjQ7CglpbnQga2V5X2NvZGU6MjQ7IC8qIExpbnV4IGtleSBjb2RlICovCn07CgpzdHJ1Y3Qgb21hcF91YXJ0X2NvbmZpZyB7CgkvKiBCaXQgZmllbGQgb2YgVUFSVHMgcHJlc2VudDsgYml0IDAgLS0+IFVBUlQxICovCgl1bnNpZ25lZCBpbnQgZW5hYmxlZF91YXJ0czsKfTsKCgpzdHJ1Y3Qgb21hcF9mbGFzaF9wYXJ0X2NvbmZpZyB7CgljaGFyIHBhcnRfdGFibGVbMF07Cn07CgpzdHJ1Y3Qgb21hcF9ib290X3JlYXNvbl9jb25maWcgewoJY2hhciByZWFzb25fc3RyWzEyXTsKfTsKCnN0cnVjdCBvbWFwX3ZlcnNpb25fY29uZmlnIHsKCWNoYXIgY29tcG9uZW50WzEyXTsKCWNoYXIgdmVyc2lvblsxMl07Cn07CgoKI2luY2x1ZGUgPGFzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLW5va2lhLmg+CgpzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgewoJdTE2IHRhZzsKCXUxNiBsZW47Cgl1OCAgZGF0YVswXTsKfTsKCnN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgewoJdTE2IHRhZzsKCWNvbnN0IHZvaWQgKmRhdGE7Cn07CgpleHRlcm4gY29uc3Qgdm9pZCAqX19vbWFwX2dldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IG5yKTsKCiNkZWZpbmUgb21hcF9nZXRfY29uZmlnKHRhZywgdHlwZSkgXAoJKChjb25zdCB0eXBlICopIF9fb21hcF9nZXRfY29uZmlnKCh0YWcpLCBzaXplb2YodHlwZSksIDApKQojZGVmaW5lIG9tYXBfZ2V0X25yX2NvbmZpZyh0YWcsIHR5cGUsIG5yKSBcCgkoKGNvbnN0IHR5cGUgKikgX19vbWFwX2dldF9jb25maWcoKHRhZyksIHNpemVvZih0eXBlKSwgKG5yKSkpCgpleHRlcm4gY29uc3Qgdm9pZCAqb21hcF9nZXRfdmFyX2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgKmxlbik7CgpleHRlcm4gc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqb21hcF9ib2FyZF9jb25maWc7CmV4dGVybiBpbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsKCiNlbmRpZgo=