LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5BTUUJICAgIDogczNjMjQxMC5oCiAqIFZlcnNpb24gIDogMzEuMy4yMDAzCiAqCiAqIEJhc2VkIG9uIFMzQzI0MTBYIFVzZXIncyBtYW51YWwgUmV2IDEuMQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1MzQzI0MTBfSF9fCiNkZWZpbmUgX19TM0MyNDEwX0hfXwoKI2RlZmluZSBTM0MyNFgwX1VBUlRfQ0hBTk5FTFMJMwojZGVmaW5lIFMzQzI0WDBfU1BJX0NIQU5ORUxTCTIKCi8qIFMzQzI0MTAgb25seSBzdXBwb3J0cyA1MTIgQnl0ZSBIVyBFQ0MgKi8KI2RlZmluZSBTM0MyNDEwX0VDQ1NJWkUJCTUxMgojZGVmaW5lIFMzQzI0MTBfRUNDQllURVMJMwoKZW51bSBzM2MyNHgwX3VhcnRzX25yIHsKCVMzQzI0WDBfVUFSVDAsCglTM0MyNFgwX1VBUlQxLAoJUzNDMjRYMF9VQVJUMgp9OwoKLyogUzNDMjQxMCBkZXZpY2UgYmFzZSBhZGRyZXNzZXMgKi8KI2RlZmluZSBTM0MyNFgwX01FTUNUTF9CQVNFCQkweDQ4MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfSE9TVF9CQVNFCQkweDQ5MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JTlRFUlJVUFRfQkFTRQkJMHg0QTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfRE1BX0JBU0UJCTB4NEIwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0NMT0NLX1BPV0VSX0JBU0UJMHg0QzAwMDAwMAojZGVmaW5lIFMzQzI0WDBfTENEX0JBU0UJCTB4NEQwMDAwMDAKI2RlZmluZSBTM0MyNDEwX05BTkRfQkFTRQkJMHg0RTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfVUFSVF9CQVNFCQkweDUwMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9USU1FUl9CQVNFCQkweDUxMDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfREVWSUNFX0JBU0UJCTB4NTIwMDAxNDAKI2RlZmluZSBTM0MyNFgwX1dBVENIRE9HX0JBU0UJCTB4NTMwMDAwMDAKI2RlZmluZSBTM0MyNFgwX0kyQ19CQVNFCQkweDU0MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JMlNfQkFTRQkJMHg1NTAwMDAwMAojZGVmaW5lIFMzQzI0WDBfR1BJT19CQVNFCQkweDU2MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9SVENfQkFTRQkJMHg1NzAwMDAwMAojZGVmaW5lIFMzQzI0MTBfQURDX0JBU0UJCTB4NTgwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1NQSV9CQVNFCQkweDU5MDAwMDAwCiNkZWZpbmUgUzNDMjQxMF9TRElfQkFTRQkJMHg1QTAwMDAwMAoKCi8qIGluY2x1ZGUgY29tbW9uIHN0dWZmICovCiNpbmNsdWRlIDxhc20vYXJjaC9zM2MyNHgwLmg+CgoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9tZW1jdGwgKnMzYzI0eDBfZ2V0X2Jhc2VfbWVtY3RsKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfbWVtY3RsICopUzNDMjRYMF9NRU1DVExfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF91c2JfaG9zdCAqczNjMjR4MF9nZXRfYmFzZV91c2JfaG9zdCh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3VzYl9ob3N0ICopUzNDMjRYMF9VU0JfSE9TVF9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2ludGVycnVwdCAqczNjMjR4MF9nZXRfYmFzZV9pbnRlcnJ1cHQodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9pbnRlcnJ1cHQgKilTM0MyNFgwX0lOVEVSUlVQVF9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2RtYXMgKnMzYzI0eDBfZ2V0X2Jhc2VfZG1hcyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2RtYXMgKilTM0MyNFgwX0RNQV9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX2Nsb2NrX3Bvd2VyICpzM2MyNHgwX2dldF9iYXNlX2Nsb2NrX3Bvd2VyKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfY2xvY2tfcG93ZXIgKilTM0MyNFgwX0NMT0NLX1BPV0VSX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfbGNkICpzM2MyNHgwX2dldF9iYXNlX2xjZCh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2xjZCAqKVMzQzI0WDBfTENEX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfbmFuZCAqczNjMjQxMF9nZXRfYmFzZV9uYW5kKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0MTBfbmFuZCAqKVMzQzI0MTBfTkFORF9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3VhcnQKCSpzM2MyNHgwX2dldF9iYXNlX3VhcnQoZW51bSBzM2MyNHgwX3VhcnRzX25yIG4pCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfdWFydCAqKShTM0MyNFgwX1VBUlRfQkFTRSArIChuICogMHg0MDAwKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfdGltZXJzICpzM2MyNHgwX2dldF9iYXNlX3RpbWVycyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3RpbWVycyAqKVMzQzI0WDBfVElNRVJfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF91c2JfZGV2aWNlICpzM2MyNHgwX2dldF9iYXNlX3VzYl9kZXZpY2Uodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF91c2JfZGV2aWNlICopUzNDMjRYMF9VU0JfREVWSUNFX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfd2F0Y2hkb2cgKnMzYzI0eDBfZ2V0X2Jhc2Vfd2F0Y2hkb2codm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF93YXRjaGRvZyAqKVMzQzI0WDBfV0FUQ0hET0dfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9pMmMgKnMzYzI0eDBfZ2V0X2Jhc2VfaTJjKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfaTJjICopUzNDMjRYMF9JMkNfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9pMnMgKnMzYzI0eDBfZ2V0X2Jhc2VfaTJzKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfaTJzICopUzNDMjRYMF9JMlNfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9ncGlvICpzM2MyNHgwX2dldF9iYXNlX2dwaW8odm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9ncGlvICopUzNDMjRYMF9HUElPX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfcnRjICpzM2MyNHgwX2dldF9iYXNlX3J0Yyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3J0YyAqKVMzQzI0WDBfUlRDX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfYWRjICpzM2MyNDEwX2dldF9iYXNlX2FkYyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNDEwX2FkYyAqKVMzQzI0MTBfQURDX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfc3BpICpzM2MyNHgwX2dldF9iYXNlX3NwaSh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3NwaSAqKVMzQzI0WDBfU1BJX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0MTBfc2RpICpzM2MyNDEwX2dldF9iYXNlX3NkaSh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNDEwX3NkaSAqKVMzQzI0MTBfU0RJX0JBU0U7Cn0KCiNlbmRpZiAvKl9fUzNDMjQxMF9IX18qLwo=