ZGlmZiAtLWdpdCBhL3gtbG9hZGVyLnZlcnNpb24gYi94LWxvYWRlci52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjA5NWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzEuNDZfT01BUFBTUF8wMy4wMC4wMS4wNgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvLmZpbGUtbGlzdCBiL3gtbG9hZGVyLy5maWxlLWxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNTA2OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyLy5maWxlLWxpc3QKQEAgLTAsMCArMSwxMTEgQEAKKy5AQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNQorLi9SRUFETUVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2FybV9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNAorLi9ib2FyZC9vbWFwMTcxMGgzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQyMGg0QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vYm9hcmQvb21hcDI0MjBoNC94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQzMHNkcEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDI0MzBzZHAvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAyNDMwc2RwL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MzBzZHAvb21hcDI0MzBzZHAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzcKKy4vYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHBAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vY3B1QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9jcHUvYXJtMTEzNkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTExMzYvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm0xMTM2L2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzcKKy4vY3B1L2FybTExMzYvY3B1LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm0xMTM2L3N0YXJ0LlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm05MjZlanNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm05MjZlanMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm05MjZlanMvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9jcHUvYXJtOTI2ZWpzL2NwdS5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2NwdS9vbWFwM0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvY3B1LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9zdGFydC5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9kcml2ZXJzL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9kcml2ZXJzL2s5ZjU2MTYuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vZHJpdmVycy9rOWsxMjE2LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnMvbnMxNjU1MC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9kcml2ZXJzL29uZW5hbmQuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVycy9vbmVuYW5kX3JlZ3MuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVycy9zZXJpYWwuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc21AQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2JpdHMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDJ4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0M3guaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvbWVtLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDIwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQzMC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc2l6ZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3N5c19pbmZvLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqcy9zaXplcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2JpdHMuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2Nrcy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzMzQzeC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY3B1LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tZW0uaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL211eC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDM0MzAuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NpemVzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfaW5mby5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX3Byb3RvLmgKKy4vaW5jbHVkZS9hc20vYXRvbWljLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3Byb2MtYXJtdkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vc2V0dXAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vc2l6ZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vc3RyaW5nLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3R5cGVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9jb21tb24uaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vaW5jbHVkZS9jb25maWdzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNAorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzQKKy4vaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC82CisuL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvc3RkZGVmLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9uczE2NTUwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2xpYkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vbGliL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9saWIvX3VkaXZzaTMuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL191bW9kc2kzLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9ib2FyZC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvOAorLi9saWIvZGl2MC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvZWNjLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9wcmludGYuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbWtjb25maWdAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL3NjcmlwdHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL3NjcmlwdHMvbWtvbmVib290LnNoQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvLmdpdGlnbm9yZSBiL3gtbG9hZGVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxMTRkYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitpbmNsdWRlL2FzbS9hcmNoCitpbmNsdWRlL2FzbS9wcm9jCmRpZmYgLS1naXQgYS94LWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDM4NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiwgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAxMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1ZFUlNJT04gPSAxCitQQVRDSExFVkVMID0gNDYKK1NVQkxFVkVMID0KK0VYVFJBVkVSU0lPTiA9CitpZm5lcSAiJChTVUJMRVZFTCkiICIiCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCitlbHNlCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpJChFWFRSQVZFUlNJT04pCitlbmRpZgorVElNRVNUQU1QX0ZJTEUgPSAkKG9iailpbmNsdWRlL3RpbWVzdGFtcF9hdXRvZ2VuZXJhdGVkLmgKK1ZFUlNJT05fRklMRSA9ICQob2JqKWluY2x1ZGUvdmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgKKworSE9TVEFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSB8IFwKKwlzZWQgLWUgcy9pLjg2L2kzODYvIFwKKwkgICAgLWUgcy9zdW40dS9zcGFyYzY0LyBcCisJICAgIC1lIHMvYXJtLiovYXJtLyBcCisJICAgIC1lIHMvc2ExMTAvYXJtLyBcCisJICAgIC1lIHMvcHBjNjQvcG93ZXJwYy8gXAorCSAgICAtZSBzL3BwYy9wb3dlcnBjLyBcCisJICAgIC1lIHMvbWFjcHBjL3Bvd2VycGMvXAorCSAgICAtZSBzL3NoLiovc2gvKQorCitIT1NUT1MgOj0gJChzaGVsbCB1bmFtZSAtcyB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgXAorCSAgICBzZWQgLWUgJ3MvXChjeWd3aW5cKS4qL2N5Z3dpbi8nKQorCisjIFNldCBzaGVsbCB0byBiYXNoIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHNoCitTSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXAorCWVsc2UgaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlbiBlY2hvIC9iaW4vYmFzaDsgXAorCWVsc2UgZWNobyBzaDsgZmk7IGZpKQorCitleHBvcnQJSE9TVEFSQ0ggSE9TVE9TIFNIRUxMCisKKyMgRGVhbCB3aXRoIGNvbGxpZGluZyBkZWZpbml0aW9ucyBmcm9tIHRjc2ggZXRjLgorVkVORE9SPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFsbG93IGZvciBzaWxlbnQgYnVpbGRzCitpZmVxICgsJChmaW5kc3RyaW5nIHMsJChNQUtFRkxBR1MpKSkKK1hFQ0hPID0gZWNobworZWxzZQorWEVDSE8gPSA6CitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFgtbG9hZGVyIGJ1aWxkIHN1cHBvcnRzIHByb2R1Y2luZyBhIG9iamVjdCBmaWxlcyB0byB0aGUgc2VwYXJhdGUgZXh0ZXJuYWwKKyMgZGlyZWN0b3J5LiBUd28gdXNlIGNhc2VzIGFyZSBzdXBwb3J0ZWQ6CisjCisjIDEpIEFkZCBPPSB0byB0aGUgbWFrZSBjb21tYW5kIGxpbmUKKyMgJ21ha2UgTz0vdG1wL2J1aWxkIGFsbCcKKyMKKyMgMikgU2V0IGVudmlyb25lbWVudCB2YXJpYWJsZSBCVUlMRF9ESVIgdG8gcG9pbnQgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24KKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJ21ha2UnCisjCisjIFRoZSBzZWNvbmQgYXBwcm9hY2ggY2FuIGFsc28gYmUgdXNlZCB3aXRoIGEgTUFLRUFMTCBzY3JpcHQKKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJy4vTUFLRUFMTCcKKyMKKyMgQ29tbWFuZCBsaW5lICdPPScgc2V0dGluZyBvdmVycmlkZXMgQlVJTERfRElSIGVudmlyb25lbnQgdmFyaWFibGUuCisjCisjIFdoZW4gbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyBpcyB1c2VkIHRoZSBsb2NhbCBidWlsZCBpcyBwZXJmb3JtZWQgYW5kCisjIHRoZSBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyMKKworaWZkZWYgTworaWZlcSAoIiQob3JpZ2luIE8pIiwgImNvbW1hbmQgbGluZSIpCitCVUlMRF9ESVIgOj0gJChPKQorZW5kaWYKK2VuZGlmCisKK2lmbmVxICgkKEJVSUxEX0RJUiksKQorc2F2ZWQtb3V0cHV0IDo9ICQoQlVJTERfRElSKQorCisjIEF0dGVtcHQgdG8gY3JlYXRlIGEgb3V0cHV0IGRpcmVjdG9yeS4KKyQoc2hlbGwgWyAtZCAke0JVSUxEX0RJUn0gXSB8fCBta2RpciAtcCAke0JVSUxEX0RJUn0pCisKKyMgVmVyaWZ5IGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorQlVJTERfRElSIDo9ICQoc2hlbGwgY2QgJChCVUlMRF9ESVIpICYmIC9iaW4vcHdkKQorJChpZiAkKEJVSUxEX0RJUiksLCQoZXJyb3Igb3V0cHV0IGRpcmVjdG9yeSAiJChzYXZlZC1vdXRwdXQpIiBkb2VzIG5vdCBleGlzdCkpCitlbmRpZiAjIGlmbmVxICgkKEJVSUxEX0RJUiksKQorCitPQkpUUkVFCQk6PSAkKGlmICQoQlVJTERfRElSKSwkKEJVSUxEX0RJUiksJChDVVJESVIpKQorU1JDVFJFRQkJOj0gJChDVVJESVIpCitUT1BESVIJCTo9ICQoU1JDVFJFRSkKK0xORElSCQk6PSAkKE9CSlRSRUUpCitleHBvcnQJVE9QRElSIFNSQ1RSRUUgT0JKVFJFRQorCitNS0NPTkZJRwk6PSAkKFNSQ1RSRUUpL21rY29uZmlnCitleHBvcnQgTUtDT05GSUcKKworaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK1JFTU9URV9CVUlMRAk6PSAxCitleHBvcnQgUkVNT1RFX0JVSUxECitlbmRpZgorCisjICQob2JqKSBhbmQgKHNyYykgYXJlIGRlZmluZWQgaW4gY29uZmlnLm1rIGJ1dCBoZXJlIGluIG1haW4gTWFrZWZpbGUKKyMgd2UgYWxzbyBuZWVkIHRoZW0gYmVmb3JlIGNvbmZpZy5tayBpcyBpbmNsdWRlZCB3aGljaCBpcyB0aGUgY2FzZSBmb3IKKyMgc29tZSB0YXJnZXRzIGxpa2UgdW5jb25maWcsIGNsZWFuLCBjbG9iYmVyLCBkaXN0Y2xlYW4sIGV0Yy4KK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitvYmogOj0gJChPQkpUUkVFKS8KK3NyYyA6PSAkKFNSQ1RSRUUpLworZWxzZQorb2JqIDo9CitzcmMgOj0KK2VuZGlmCitleHBvcnQgb2JqIHNyYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlICJ0b29scyIgYXJlIG5lZWRlZCBlYXJseSwgc28gcHV0IHRoaXMgZmlyc3QKKyMgRG9uJ3QgaW5jbHVkZSBzdHVmZiBhbHJlYWR5IGRvbmUgaW4gJChMSUJTKQorU1VCRElSUyA9IHRvb2xzCisuUEhPTlkgOiAkKFNVQkRJUlMpCisKK2lmZXEgKCQob2JqKWluY2x1ZGUvY29uZmlnLm1rLCQod2lsZGNhcmQgJChvYmopaW5jbHVkZS9jb25maWcubWspKQorCisjIEluY2x1ZGUgYXV0b2NvbmYubWsgYmVmb3JlIGNvbmZpZy5tayBzbyB0aGF0IHRoZSBjb25maWcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlCisjIHRvIGFsbCB0b3AgbGV2ZWwgYnVpbGQgZmlsZXMuICBXZSBuZWVkIHRoZSBkdW1teSBhbGw6IHRhcmdldCB0byBwcmV2ZW50IHRoZQorIyBkZXBlbmRlbmN5IHRhcmdldCBpbiBhdXRvY29uZi5tay5kZXAgZnJvbSBiZWluZyB0aGUgZGVmYXVsdC4KK2FsbDoKK3NpbmNsdWRlICQob2JqKWluY2x1ZGUvYXV0b2NvbmYubWsuZGVwCitzaW5jbHVkZSAkKG9iailpbmNsdWRlL2F1dG9jb25mLm1rCisKKyMgbG9hZCBBUkNILCBCT0FSRCwgYW5kIENQVSBjb25maWd1cmF0aW9uCitpbmNsdWRlICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCitleHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQworCisjIHNldCBkZWZhdWx0IHRvIG5vdGhpbmcgZm9yIG5hdGl2ZSBidWlsZHMKK2lmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCitDUk9TU19DT01QSUxFID89CitlbmRpZgorCisjIGxvYWQgb3RoZXIgY29uZmlndXJhdGlvbgoraW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgWC1Mb2FkIG9iamVjdHMuLi4ub3JkZXIgaXMgaW1wb3J0YW50IChpLmUuIHN0YXJ0IG11c3QgYmUgZmlyc3QpCisKK09CSlMgID0gJChDUFVESVIpL3N0YXJ0Lm8KKworT0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChPQkpTKSkKKworTElCUyArPSAkKHNoZWxsIGlmIFsgLWYgYm9hcmQvJChWRU5ET1IpL2NvbW1vbi9NYWtlZmlsZSBdOyB0aGVuIGVjaG8gXAorCSJib2FyZC8kKFZFTkRPUikvY29tbW9uL2xpYiQoVkVORE9SKS5hIjsgZmkpCitMSUJTICs9ICQoQ1BVRElSKS9saWIkKENQVSkuYQorTElCUyArPSBsaWIvbGliJChBUkNIKS5hCitMSUJTICs9IGNvbW1vbi9saWJjb21tb24uYQorTElCUyArPSBmcy9mYXQvbGliZmF0LmEKK0xJQlMgKz0gZGlzay9saWJkaXNrLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvbmFuZC9saWJuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvb25lbmFuZC9saWJvbmVuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9ydGMvbGlicnRjLmEKK0xJQlMgKz0gZHJpdmVycy9zZXJpYWwvbGlic2VyaWFsLmEKK0xJQlMgKz0gZHJpdmVycy91c2IvbGlidXNiLmEKKworTElCUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChMSUJTKSkKKy5QSE9OWSA6ICQoTElCUykgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisKK0xJQkJPQVJEID0gYm9hcmQvJChCT0FSRERJUikvbGliJChCT0FSRCkuYQorTElCQk9BUkQgOj0gJChhZGRwcmVmaXggJChvYmopLCQoTElCQk9BUkQpKQorCisjIEFkZCBHQ0MgbGliCitQTEFURk9STV9MSUJHQ0MgPSAtTCAkKHNoZWxsIGRpcm5hbWUgYCQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZWApIC1sZ2NjCitQTEFURk9STV9MSUJTICs9ICQoUExBVEZPUk1fTElCR0NDKQorZXhwb3J0IFBMQVRGT1JNX0xJQlMKKworX19PQkpTIDo9ICQoc3Vic3QgJChvYmopLCwkKE9CSlMpKQorX19MSUJTIDo9ICQoc3Vic3QgJChvYmopLCwkKExJQlMpKSAkKHN1YnN0ICQob2JqKSwsJChMSUJCT0FSRCkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBbHdheXMgYXBwZW5kIEFMTCBzbyB0aGF0IGFyY2ggY29uZmlnLm1rJ3MgY2FuIGFkZCBjdXN0b20gb25lcworQUxMICs9ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gJChvYmopeC1sb2FkLmJpbi5pZnQgJChvYmopU3lzdGVtLm1hcAorCithbGw6CQkkKEFMTCkKKworJChvYmopeC1sb2FkLmhleDoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGloZXggJDwgJEAKKworJChvYmopeC1sb2FkLnNyZWM6CSQob2JqKXgtbG9hZAorCQkkKE9CSkNPUFkpIC1PIHNyZWMgJDwgJEAKKworJChvYmopeC1sb2FkLmJpbjoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGJpbmFyeSAkPCAkQAorCiskKG9iail4LWxvYWQuYmluLmlmdDoJJChvYmopeC1sb2FkLmJpbgorCQkkKG9iail0b29scy9zaWduR1AgJDwKKworJChvYmopeC1sb2FkLmRpczoJJChvYmopeC1sb2FkCisJCSQoT0JKRFVNUCkgLWQgJDwgPiAkQAorCitHRU5fWExPQUQgPSBcCisJCVVOREVGX1NZTT1gJChPQkpEVU1QKSAteCAkKExJQkJPQVJEKSAkKExJQlMpIHwgXAorCQlzZWQgIC1uIC1lICdzLy4qXCgkKFNZTV9QUkVGSVgpX191X2Jvb3RfY21kXy4qXCkvLXVcMS9wJ3xzb3J0fHVuaXFgO1wKKwkJY2QgJChMTkRJUikgJiYgJChMRCkgJChMREZMQUdTKSAkJFVOREVGX1NZTSAkKF9fT0JKUykgXAorCQkJLS1zdGFydC1ncm91cCAkKF9fTElCUykgLS1lbmQtZ3JvdXAgJChQTEFURk9STV9MSUJTKSBcCisJCQktTWFwIHgtbG9hZC5tYXAgLW8geC1sb2FkCQorJChvYmopeC1sb2FkOglkZXBlbmQgJChTVUJESVJTKSAkKE9CSlMpICQoTElCQk9BUkQpICQoTElCUykgJChMRFNDUklQVCkgJChvYmopeC1sb2FkLmxkcworCQkkKEdFTl9YTE9BRCkKKworJChPQkpTKToJZGVwZW5kCisJCSQoTUFLRSkgLUMgJChDUFVESVIpICQoaWYgJChSRU1PVEVfQlVJTEQpLCRALCQobm90ZGlyICRAKSkKKworJChMSUJTKToJZGVwZW5kICQoU1VCRElSUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKExJQkJPQVJEKToJZGVwZW5kICQoTElCUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKFNVQkRJUlMpOglkZXBlbmQKKwkJJChNQUtFKSAtQyAkQCBhbGwKKworJChMRFNDUklQVCk6CWRlcGVuZAorCQkkKE1BS0UpIC1DICQoZGlyICRAKSAkKG5vdGRpciAkQCkKKworJChvYmopeC1sb2FkLmxkczogJChMRFNDUklQVCkKKwkJJChDUFApICQoQ1BQRkxBR1MpICQoTERQUEZMQUdTKSAtYW5zaSAtRF9fQVNTRU1CTFlfXyAtUCAtIDwkXiA+JEAKKworJChvYmopb25lYm9vdDoJJChvYmopeC1sb2FkLmJpbgorCQlzY3JpcHRzL21rb25lYm9vdC5zaAorJChWRVJTSU9OX0ZJTEUpOgorCQlAKCBwcmludGYgJyNkZWZpbmUgWF9MT0FERVJfVkVSU0lPTiAiVGV4YXMgSW5zdHJ1bWVudHMgWC1Mb2FkZXIgJXMlcyJcbicgIiQoWF9MT0FERVJfVkVSU0lPTikiIFwKKwkJICckKHNoZWxsICQoVE9QRElSKS90b29scy9zZXRsb2NhbHZlcnNpb24gJChUT1BESVIpKScgKSA+ICRALnRtcAorCQlAY21wIC1zICRAICRALnRtcCAmJiBybSAtZiAkQC50bXAgfHwgbXYgLWYgJEAudG1wICRACisKKyQoVElNRVNUQU1QX0ZJTEUpOgorCQlATENfQUxMPUMgZGF0ZSArJyNkZWZpbmUgWF9MT0FERVJfREFURSAiJWIgJWQgJUMleSInID4gJEAKKwkJQExDX0FMTD1DIGRhdGUgKycjZGVmaW5lIFhfTE9BREVSX1RJTUUgIiVUIicgPj4gJEAKKworIyBFeHBsaWNpdGx5IG1ha2UgX2RlcGVuZCBpbiBzdWJkaXJzIGNvbnRhaW5pbmcgbXVsdGlwbGUgdGFyZ2V0cyB0byBwcmV2ZW50CisjIHBhcmFsbGVsIHN1Yi1tYWtlcyBjcmVhdGluZyAuZGVwZW5kIGZpbGVzIHNpbXVsdGFuZW91c2x5LgorZGVwZW5kIGRlcDoJJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisJCWZvciBkaXIgaW4gJChTVUJESVJTKSAkKENQVURJUikgJChkaXIgJChMRFNDUklQVCkpIDsgZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBfZGVwZW5kIDsgZG9uZQorCitUQUdfU1VCRElSUyA9ICQoU1VCRElSUykKK1RBR19TVUJESVJTICs9ICQoZGlyICQoX19MSUJTKSkKK1RBR19TVUJESVJTICs9IGluY2x1ZGUKKwordGFncyBjdGFnczoKKwkJY3RhZ3MgLXcgLW8gJChvYmopY3RhZ3MgYGZpbmQgJChUQUdfU1VCRElSUykgXAorCQkJCQkJLW5hbWUgJyouW2NoU10nIC1wcmludGAKKworZXRhZ3M6CisJCWV0YWdzIC1hIC1vICQob2JqKWV0YWdzIGBmaW5kICQoVEFHX1NVQkRJUlMpIFwKKwkJCQkJCS1uYW1lICcqLltjaFNdJyAtcHJpbnRgCitjc2NvcGU6CisJCWZpbmQgJChUQUdfU1VCRElSUykgLW5hbWUgJyouW2NoU10nIC1wcmludCA+IGNzY29wZS5maWxlcworCQljc2NvcGUgLWIgLXEgLWsKKworU1lTVEVNX01BUCA9IFwKKwkJJChOTSkgJDEgfCBcCisJCWdyZXAgLXYgJ1woY29tcGlsZWRcKVx8XChcLm8kJFwpXHxcKCBbYVV3XSBcKVx8XChcLlwubmckJFwpXHxcKExBU0hbUkxdRElcKScgfCBcCisJCUxDX0FMTD1DIHNvcnQKKyQob2JqKVN5c3RlbS5tYXA6CSQob2JqKXgtbG9hZAorCQlAJChjYWxsIFNZU1RFTV9NQVAsJDwpID4gJChvYmopU3lzdGVtLm1hcAorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZWxzZQkjICFjb25maWcubWsKK2FsbCAkKG9iail4LWxvYWQuaGV4ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gXAorJChvYmopeC1sb2FkLmRpcyAkKG9iail4LWxvYWQgXAorJChvYmopb25lYm9vdCBcCiskKGZpbHRlci1vdXQgdG9vbHMsJChTVUJESVJTKSkgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpIFwKK2RlcGVuZCBkZXAgdGFncyBjdGFncyBldGFncyBjc2NvcGUgJChvYmopU3lzdGVtLm1hcDoKKwlAZWNobyAiU3lzdGVtIG5vdCBjb25maWd1cmVkIC0gc2VlIFJFQURNRSIgPiYyCisJQCBleGl0IDEKKwordG9vbHM6CisJJChNQUtFKSAtQyB0b29scwordG9vbHMtYWxsOgorCSQoTUFLRSkgLUMgdG9vbHMgSE9TVF9UT09MU19BTEw9eQorZW5kaWYJIyBjb25maWcubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit1bmNvbmZpZzoKKwlAcm0gLWYgJChvYmopaW5jbHVkZS9jb25maWcuaCAkKG9iailpbmNsdWRlL2NvbmZpZy5taworCislX2NvbmZpZzo6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpIC1BICQoQDpfY29uZmlnPSkKKworIworIyBGdW5jdGlvbnMgdG8gZ2VuZXJhdGUgY29tbW9uIGJvYXJkIGRpcmVjdG9yeSBuYW1lcworIworbGNuYW1lCT0gJChzaGVsbCBlY2hvICQoMSkgfCBzZWQgLWUgJ3MvXCguKlwpX2NvbmZpZy9cTFwxLycpCit1Y25hbWUJPSAkKHNoZWxsIGVjaG8gJCgxKSB8IHNlZCAtZSAncy9cKC4qXClfY29uZmlnL1xVXDEvJykKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBBUk0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9NQVAxIChBUk05MnhUKSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29tYXAxNzEwaDNfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIG9tYXAxNzEwaDMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgT01BUDIgKEFSTTExMzYpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb21hcDI0MjBoNF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm0xMTM2IG9tYXAyNDIwaDQKKworb21hcDI0MzBzZHBfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtMTEzNiBvbWFwMjQzMHNkcAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBPTUFQMyAoQVJNLUNvcnRleEE4KSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitvbWFwMzQzMHNkcF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBvbWFwMyBvbWFwMzQzMHNkcAorCitvbWFwMzQzMGxhYnJhZG9yX2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIG9tYXAzNDMwbGFicmFkb3IKKworb21hcDNldm1fY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgb21hcDNldm0KKworYW0zNTE3ZXZtX2NvbmZpZyA6ICAgICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIGFtMzUxN2V2bQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGVhbjoKKwlAcm0gLWYgJChvYmopdG9vbHMvc2lnbkdQCisJQHJtIC1mICQoVElNRVNUQU1QX0ZJTEUpICQoVkVSU0lPTl9GSUxFKQorCUBmaW5kICQoT0JKVFJFRSkgLXR5cGUgZiBcCisJCVwoIC1uYW1lICdjb3JlJyAtbyAtbmFtZSAnKi5iYWsnIC1vIC1uYW1lICcqficgXAorCQktbyAtbmFtZSAnKi5vJwktbyAtbmFtZSAnKi5hJyAtbyAtbmFtZSAnKi5leGUnCVwpIC1wcmludCBcCisJCXwgeGFyZ3Mgcm0gLWYKKworY2xvYmJlcjoJY2xlYW4KKwlAZmluZCAkKE9CSlRSRUUpIC10eXBlIGYgXCggLW5hbWUgLmRlcGVuZCBcCisJCS1vIC1uYW1lICcqLnNyZWMnIC1vIC1uYW1lICcqLmJpbicgLW8gLW5hbWUgJyouYmluLmlmdCcgXCkgXAorCQktcHJpbnQwIFwKKwkJfCB4YXJncyAtMCBybSAtZgorCUBybSAtZiAkKE9CSlMpICQob2JqKSouYmFrICQob2JqKWN0YWdzICQob2JqKWV0YWdzICQob2JqKVRBR1MgXAorCQkkKG9iailjc2NvcGUuKiAkKG9iaikqLip+CisJQHJtIC1mICQob2JqKXgtbG9hZCAkKG9iail4LWxvYWQubWFwICQob2JqKXgtbG9hZC5oZXggJChBTEwpCisJQHJtIC1mICQob2JqKWluY2x1ZGUvYXNtL3Byb2MgJChvYmopaW5jbHVkZS9hc20vYXJjaCAkKG9iailpbmNsdWRlL2FzbQorCitpZmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCittcnByb3BlciBcCitkaXN0Y2xlYW46CWNsb2JiZXIgdW5jb25maWcKK2Vsc2UKK21ycHJvcGVyIFwKK2Rpc3RjbGVhbjoJY2xvYmJlciB1bmNvbmZpZworCXJtIC1yZiAkKG9iaikqCitlbmRpZgorCitiYWNrdXA6CisJRj1gYmFzZW5hbWUgJChUT1BESVIpYCA7IGNkIC4uIDsgXAorCWd0YXIgLS1mb3JjZS1sb2NhbCAtemN2ZiBgTENfQUxMPUMgZGF0ZSAiKyQkRi0lWS0lbS0lZC0lVC50YXIuZ3oiYCAkJEYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvUkVBRE1FIGIveC1sb2FkZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjY2MmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9SRUFETUUKQEAgLTAsMCArMSwxNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU29tZSBjdXQvcGFzdGUgZnJvbSBVLUJvb3QgUkVBRE1FCisjIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDQKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitTdW1tYXJ5OgorPT09PT09PT0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCitsb2FkZXIgZm9yIEVtYmVkZGVkIGJvYXJkcyBiYXNlZCBvbiBPTUFQIHByb2Nlc3NvcnMuIFgtTG9hZGVyIGNhbiBiZQorc2lnbmVkIGJ5IFRleGFzIEluc3RydW1lbnRzIElGVCBhbmQgaW5zdGFsbGVkIHRvIE5hbmQgZmxhc2ggdG8gYWNoaWV2ZQorTmFuZCBib290aW5nLgorCisKK1N0YXR1czoKKz09PT09PT0KKworVGhlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEgzIGJvYXJkIChPTUFQMTcxMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChNYXkgMjAwNCkKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBINCBib2FyZCAoT01BUDI0MjApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoTm92IDIwMDQpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMjQzMFNEUCBib2FyZCAoT01BUDI0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoSnVsIDIwMDYpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMzQzMFNEUCBib2FyZCAoT01BUDM0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoRGVjIDIwMDYpCisKKworU3VwcG9ydCBmb3Igb3RoZXIgT01BUCBib2FyZHMgY2FuIGJlIGFkZGVkLgorIAorICAKK0RpcmVjdG9yeSBIaWVyYXJjaHk6Cis9PT09PT09PT09PT09PT09PT09PQorCistIGJvYXJkCQlCb2FyZCBkZXBlbmRlbnQgZmlsZXMKKy0gY3B1CQlDUFUgc3BlY2lmaWMgZmlsZXMKKy0gZHJpdmVycwlDb21tb25seSB1c2VkIGRldmljZSBkcml2ZXJzCistIGxpYgkJTGlicmFyaWVzCisgCistIGNwdS9hcm05MjZlanMgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIDkyNiBDUFVzCistIGNwdS9hcm0xMTM2IEZpbGVzIHNwZWNpZmljIHRvIEFSTSAxMTM2IENQVXMKKy0gY3B1L29tYXAzIEZpbGVzIHNwZWNpZmljIHRvIEFSTSBDb3J0ZXhBOCBDUFUKKworIAorLSBib2FyZC9vbWFwMTcxMGgzCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMTcxMCBIMyBib2FyZHMKKy0gYm9hcmQvb21hcDI0MjBoNAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDI0MjAgSDQgYm9hcmRzCistIGJvYXJkL29tYXAyNDMwc2RwCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMjQzMCAyNDMwc2RwIGJvYXJkcworLSBib2FyZC9vbWFwMzQzMHNkcAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDM0MjBzZHAgYm9hcmRzCisKKyAKK1NvZnR3YXJlIENvbmZpZ3VyYXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitDb25maWd1cmF0aW9uIGlzIHVzdWFsbHkgZG9uZSB1c2luZyBDIHByZXByb2Nlc3NvciBkZWZpbmVzLiBDb25maWd1cmF0aW9uCitkZXBlbmRzIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBib2FyZCBhbmQgQ1BVIHR5cGU7IGFsbCBzdWNoIGluZm9ybWF0aW9uIGlzCitrZXB0IGluIGEgY29uZmlndXJhdGlvbiBmaWxlICJpbmNsdWRlL2NvbmZpZ3MvPGJvYXJkX25hbWU+LmgiLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUsIGFsbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGFyZSBpbgorImluY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgiLgorICAKK0ZvciBhbGwgc3VwcG9ydGVkIGJvYXJkcyB0aGVyZSBhcmUgcmVhZHktdG8tdXNlIGRlZmF1bHQKK2NvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZTsganVzdCB0eXBlICJtYWtlIDxib2FyZF9uYW1lPl9jb25maWciLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUgdHlwZToKKworCWNkIHgtbG9hZAorCW1ha2Ugb21hcDE3MTBoM19jb25maWcKKworQWZ0ZXIgYSBib2FyZCBoYXMgYmVlbiBjb25maWd1cmVkLCB0eXBlICJtYWtlIiB0byBidWlsZCBpdCBzdXBwb3NpbmcgdGhlCituZWVkZWQgY3Jvc3MgdG9vbHMgYXJlIGluIHlvdXIgcGF0aC4KKworIAorSW1hZ2UgRm9ybWF0OgorPT09PT09PT09PT09PQorCitYLUxvYWRlciBleHBlY3RzIE9TIGJvb3QgbG9hZGVyIChlLmcuIFUtQm9vdCkgaW4gTmFuZCBmbGFzaCB1c2luZworSkZGUzIgc3R5bGUgRUNDLiAKKworCitQcmVwYXJlIEJvb3RpbmcgTmFuZCBGbGFzaDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBZnRlciB5b3UgaGF2ZSBidWlsdCB4LWxvYWQuYmluIGZvciB5b3VyIGJvYXJkLCB5b3UgbmVlZCB0byBkbyB0aGUKK2ZvbGxvd2luZ3MgdG8gZ2V0IGl0IGludG8gTmFuZCBmbGFzaDoKKworMS4gVXNlIFRleGFzIEluc3RydW1lbnRzIElGVCB0byBzaWduIHgtbG9hZC5iaW4uIFRoaXMgcmVzdWx0cyBpbiBhCitzaWduZWQgaW1hZ2UgY2FsbGVkIHgtbG9hZC5iaW4uaWZ0LgorMi4gVXNlIFRleGFzIEluc3RydW1lbnRzIEZsYXNoUHJlcCB0byBnZW5lcmF0ZSBhIC5vdXQgZmlsZSB1c2luZworRmxhc2hXcml0ZXJOYW5kIGFuZCBzcGVjaWZ5aW5nIDAgYXMgbmFuZCB0YXJnZXQgYWRkcmVzcy4KKzMuIFVzZSBUZXhhcyBpbnN0cnVtbmV0cyBDb2RlIENvbXBvc2VyIFN0dWRpbyB0byBydW4gdGhlIC5vdXQgZmlsZSAKK3doaWNoIGZsYXNoZXMgeC1sb2FkLmJpbi5pZnQgdG8gTmFuZCBmbGFzaC4KKworTmV4dCB5b3UgbmVlZCB0byBnZXQgeW91ciBPUyBib290IGxvYWRlciB0byBOYW5kIGF0IHRoZSBhZGRyZXNzIHlvdXIKK1gtTG9hZGVyIGV4cGVjdHMuIEZvciB0aGUgSDMgZXhhbXBsZSwgeW91IGNhbiB1c2UgVS1Cb290IHRvIGZsYXNoIFUtQm9vdC4KK1lvdSBjYW4ndCB1c2UgRmxhc2hXcml0ZXJOYW5kIGJlY2F1c2UgaXQgdXNlcyBST00gY29kZSBFQ0Mgc3R5bGUuICAKKworCitNb3JlIEluZm9ybWF0aW9uCis9PT09PT09PT09PT09PT09CisKK09NQVAxNzEwIE5BTkQgQm9vdGluZyBEZXNpZ24gRG9jdW1lbnQgaGFzIG1vcmUgaW5mb3JtYXRpb24uCisKK0ltcGxlbWVuYXRpb24gbm90ZXM6Cis9PT09PT09PT09PT09PT09PT09PQorSDMsIEg0IHN1cHBvcnQgTkFORCBmbGFzaCBib290aW5nCisyNDMwc2RwICYgMzQzMHNkcCBzdXBwb3J0IE9uZU5BTkQgYm9vdGluZworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2FybV9jb25maWcubWsgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDk2MjUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfQVJNIC1EX19BUk1fXwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzI5MjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDkKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisjIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IGFtMzUxN2V2bS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDRiZTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyAqIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRGVmaW5pdGlvbnMgZm9yIEVNSUY0IGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUAkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQ0QJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XUgkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQVMJMHg4CisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQwkJMHhBCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUkQJMHgyCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XVFIJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hQCQkweDIKKyNkZWZpbmUJRU1JRjRfVElNMl9UX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hTTlIJMHgxQworI2RlZmluZQlFTUlGNF9USU0yX1RfWFNSRAkweEM4CisjZGVmaW5lCUVNSUY0X1RJTTJfVF9SVFAJMHgxCisjZGVmaW5lCUVNSUY0X1RJTTJfVF9DS0UJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNM19UX1REUVNDS01BWAkweDAKKyNkZWZpbmUJRU1JRjRfVElNM19UX1JGQwkweDI1CisjZGVmaW5lCUVNSUY0X1RJTTNfVF9SQVNfTUFYCTB4NworCisjZGVmaW5lCUVNSUY0X1BXUl9JRExFCQkweDIKKyNkZWZpbmUJRU1JRjRfUFdSX0RQRF9FTgkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX0VOCQkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX1RJTQkweDAKKworI2RlZmluZQlFTUlGNF9JTklUUkVGX0RJUwkweDAKKyNkZWZpbmUJRU1JRjRfUEFTUgkJMHgwCisjZGVmaW5lCUVNSUY0X1JFRlJFU0hfUkFURQkweDUwRgorCisvKgorICogU0RSQU0gQ29uZmlnIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJRU1JRjRfQ0ZHX1NEUkFNX1RZUAkweDIKKyNkZWZpbmUJRU1JRjRfQ0ZHX0lCQU5LX1BPUwkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9URVJNCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSMl9ERFFTCTB4MQorI2RlZmluZQlFTUlGNF9DRkdfRFlOX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9ESVNfRExMCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfU0RSX0RSVgkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0NXTAkJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19OQVJST1dfTUQJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19DTAkJMHg1CisjZGVmaW5lCUVNSUY0X0NGR19ST1dTSVpFCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfSUJBTksJCTB4MworI2RlZmluZQlFTUlGNF9DRkdfRUJBTksJCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfUEdTSVpFCTB4MgorCisvKgorICogRU1JRjQgUEhZIENvbnRyb2wgMSByZWdpc3RlciBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgRU1JRjRfRERSMV9SRF9MQVQJMHg2CisjZGVmaW5lCUVNSUY0X0REUjFfUFdSRE5fRElTCTB4MAorI2RlZmluZSBFTUlGNF9ERFIxX1NUUkJFTl9FWFQJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfRExMX01PREUJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfVlRQX0RZTgkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9MQl9DS19TRUwJMHgwCisKKy8qCisgKiBFTUlGNCBQSFkgQ29udHJvbCAyIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBFTUlGNF9ERFIyX1RYX0RBVEFfQUxJR04JMHgwCisjZGVmaW5lIEVNSUY0X0REUjJfUlhfRExMX0JZUEFTUwkweDAKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CisjaWYgMAorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKKyNlbmRpZgorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogTW92ZSBpdCB0byBjb21tb24gcGxhY2Ugc28gdGhhdCBzaG91bGQgYmUgdXNlZAorICogZm9yIGFsbCBPTUFQIHNlcmllcyBvZiBkZXZpY2VzCisgKi8KK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJdTMyIGNwdWlkID0gMCwgY3B1X2ZhbWlseSA9IDA7CisJdTE2IGhhd2tleWU7CisKKwljcHVpZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCWhhd2tleWUgID0gKGNwdWlkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJc3dpdGNoIChoYXdrZXllKSB7CisJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwlkZWZhdWx0OgorCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjcHVfZmFtaWx5OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNib290X3ZhbHVlKHZvaWQpIC0gcmV0dXJuIFNZU19CT09UWzQ6MF0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoU1lTQk9PVF9NQVNLKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZ2V0X21lbV90eXBlKHZvaWQpIC0gcmV0dXJucyB0aGUga2luZCBvZiBtZW1vcnkgY29ubmVjdGVkCisgKiB0byBHUE1DIHRoYXQgd2UgYXJlIHRyeWluZyB0byBib290IGZvcm0uIFVzZXMgU1lTIEJPT1Qgc2V0dGluZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfbWVtX3R5cGUodm9pZCkKK3sKKyAgICAgICAgdTMyICAgbWVtX3R5cGUgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworICAgICAgICBzd2l0Y2ggKG1lbV90eXBlKXsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgY2FzZSAyNzogICAgcmV0dXJuIEdQTUNfTkFORDsKKworCisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAJCXJldHVybiBNTUNfTkFORDsKKworICAgICAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEdQTUNfTkFORDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfZW1pZjRfZGRyKCkgLSBJbml0L0NvbmZpZ3VyZSBERFIgb24gQU0zNTE3IEVWTSBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ19lbWlmNF9kZHIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJLyogU2V0IHRoZSBERFIgUEhZIHBhcmFtZXRlcnMgaW4gUEhZIGN0cmwgcmVnaXN0ZXJzICovCisJcmVndmFsID0gKEVNSUY0X0REUjFfUkRfTEFUIHwgKEVNSUY0X0REUjFfUFdSRE5fRElTIDw8IDYpIHwKKwkJKEVNSUY0X0REUjFfU1RSQkVOX0VYVCA8PCA3KSB8IChFTUlGNF9ERFIxX0RMTF9NT0RFIDw8IDEyKSB8CisJCShFTUlGNF9ERFIxX1ZUUF9EWU4gPDwgMTUpIHwgKEVNSUY0X0REUjFfTEJfQ0tfU0VMIDw8IDIzKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwxX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X0REUjJfVFhfREFUQV9BTElHTiB8IChFTUlGNF9ERFIyX1JYX0RMTF9CWVBBU1MgPDwgMSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwyKTsKKworCS8qIFJlc2V0IHRoZSBERFIgUEhZIGFuZCB3YWl0IHRpbGwgY29tcGxldGVkICovCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAxMCwgMSwgMSk7CisJLypXYWl0IHRpbGwgdGhhdCBiaXQgY2xlYXJzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X0lPREZUX1RMR0MpICYgQklUMTApID09IDB4MSk7CisJLypSZS12ZXJpZnkgdGhlIEREUiBQSFkgc3RhdHVzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X1NEUkFNX1NUUykgJiBCSVQyKSA9PSAweDApOworCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAwLCAxLCAxKTsKKwkvKiBTZXQgU0RSIHRpbWluZyByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSAoRU1JRjRfVElNMV9UX1dUUiB8IChFTUlGNF9USU0xX1RfUlJEIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTFfVF9SQyA8PCA2KSB8IChFTUlGNF9USU0xX1RfUkFTIDw8IDEyKSB8CisJCShFTUlGNF9USU0xX1RfV1IgPDwgMTcpIHwgKEVNSUY0X1RJTTFfVF9SQ0QgPDwgMjEpIHwKKwkJKEVNSUY0X1RJTTFfVF9SUCA8PCAyNSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTFfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfVElNMl9UX0NLRSB8IChFTUlGNF9USU0yX1RfUlRQIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTJfVF9YU1JEIDw8IDYpIHwgKEVNSUY0X1RJTTJfVF9YU05SIDw8IDE2KSB8CisJCShFTUlGNF9USU0yX1RfT0RUIDw8IDI1KSB8IChFTUlGNF9USU0yX1RfWFAgPDwgMjgpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X1RJTTNfVF9SQVNfTUFYIHwgKEVNSUY0X1RJTTNfVF9SRkMgPDwgNCkgfAorCQkoRU1JRjRfVElNM19UX1REUVNDS01BWCA8PCAxMykpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTMpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTNfU0hEVyk7CisKKwkvKiBTZXQgdGhlIFBXUiBjb250cm9sIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X1BXUl9QTV9USU0gfCAoRU1JRjRfUFdSX1BNX0VOIDw8IDgpIHwKKwkJKEVNSUY0X1BXUl9EUERfRU4gPDwgMTApIHwgKEVNSUY0X1BXUl9JRExFIDw8IDMwKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfUFdSX01HVF9DVFJMKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9QV1JfTUdUX0NUUkxfU0hEVyk7CisKKwkvKiBTZXQgdGhlIEREUiByZWZyZXNoIHJhdGUgY29udHJvbCByZWdpc3RlciAqLworCXJlZ3ZhbCA9IChFTUlGNF9SRUZSRVNIX1JBVEUgfCAoRU1JRjRfUEFTUiA8PCAyNCkgfAorCQkoRU1JRjRfSU5JVFJFRl9ESVMgPDwgMzEpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSX1NIRFcpOworCisJLyogc2V0IHRoZSBTRFJBTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X0NGR19QR1NJWkUgfCAoRU1JRjRfQ0ZHX0VCQU5LIDw8IDMpIHwKKwkJKEVNSUY0X0NGR19JQkFOSyA8PCA0KSB8IChFTUlGNF9DRkdfUk9XU0laRSA8PCA3KSB8CisJCShFTUlGNF9DRkdfQ0wgPDwgMTApIHwgKEVNSUY0X0NGR19OQVJST1dfTUQgPDwgMTQpIHwKKwkJKEVNSUY0X0NGR19DV0wgPDwgMTYpIHwgKEVNSUY0X0NGR19TRFJfRFJWIDw8IDE4KSB8CisJCShFTUlGNF9DRkdfRERSX0RJU19ETEwgPDwgMjApIHwgKEVNSUY0X0NGR19EWU5fT0RUIDw8IDIxKSB8CisJCShFTUlGNF9DRkdfRERSMl9ERFFTIDw8IDIzKSB8IChFTUlGNF9DRkdfRERSX1RFUk0gPDwgMjQpIHwKKwkJKEVNSUY0X0NGR19JQkFOS19QT1MgPDwgMjcpIHwgKEVNSUY0X0NGR19TRFJBTV9UWVAgPDwgMjkpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9DRkcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCSAqLworCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogQ09SRSBEUExMICovCisJLyogc3IzMihDTV9DTEtTRUwyX0VNVSkgc2V0IG92ZXJyaWRlIHRvIHdvcmsgd2hlbiBhc2xlZXAgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKworCS8qIGVuYWJsZSB0aGUgRERSUEhZIGNsayAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTg4KSwgMTUsIDE1LCAweDEpOworCS8qIGVuYWJsZSB0aGUgRU1JRjQgY2xrICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1ODgpLCAxNCwgMTQsIDB4MSk7CisJLyogRW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTlDKSwgMCwgNCwgMHhGKTsKKwlzcjMyKChPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDU5QyksIDgsIDEwLCAweDcpOworCisJLyogYnJpbmcgY3BnbWFjIG91dCBvZiByZXNldCAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTk4KSwgMSwgMSwgMHgxKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgRU1JRjQgZm9yIG91ciBERFIgKi8KKwljb25maWdfZW1pZjRfZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCisJLyogRW5hYmxlIFVBUlQyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTQsIDEsIDB4MSk7CisKKwkvKiBFbmFibGUgVUFSVDIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTl9QRVIsIDExLCAxLCAweDEpOworI2VuZGlmCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKworCS8qIEVuYWJsZSBNTUMyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjUsIDEsIDB4MSk7CisKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTApLCAgICAgIChNMCkpIC8qU0RSQ19DS0UwKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTEpLCAgICAgIChNMCkpIC8qU0RSQ19DS0UxKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1RYX0lSVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlRTX1NEKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQzX0NUU19SQ1RYKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlhfSVJSWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwkvKkV4cGFuc2lvbiBjYXJkICAqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ0xLKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qTU1DMV9DTEsqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ01EKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9DTUQqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMCksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQwKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDEpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUMSovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQyKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDIqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMyksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQzKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDQpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNCovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQ1KSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDUqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNiksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ2Ki9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDcpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNyovXAorCU1VWF9WQUwoQ1AoTWNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChOQU5EX0JBU0VfQURSPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgICAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKworCX0KKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoT05FTkFORF9CQVNFPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgIAlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisKKyAgICAgICBsb25nIHNpemUgPSAwOworI2lmZGVmIENGR19DTURfRkFUCisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DIFxuIik7CisKKyAgICAgICByZXQgPSBtbWNfaW5pdCgxKTsKKyAgICAgICBpZihyZXQgPT0gMCl7CisgICAgICAgICAgICAgICBwcmludGYoIlxuIE1NQyBpbml0IGZhaWxlZCBcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsIGJ1ZiwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUMgXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisjZW5kaWYKKyAgICAgICByZXR1cm4gc2l6ZTsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjEyYTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMgKEMpIENvcHlyaWdodCAyMDA5CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThmNmU3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBNYW5pa2FuZGFuIFBpbGxhaSA8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUwY2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gZGlhbW9uZC5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNGU0NTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9jb25maWcubWsKQEAgLTAsMCArMSwyMiBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDAwMAorU1RBQ0tfQkFTRSA9IDB4NDAyMEZDQjAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL2RpYW1vbmQuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL2RpYW1vbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU3Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvZGlhbW9uZC5jCkBAIC0wLDAgKzEsMTA0NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVMgKDMpCisKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworCWRlbGF5KDB4MjAwMDApOworfQorCisvKgorICogIHZvaWQgc19pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdmVyeSBlYXJseSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gb2YgY2hpcAorICogICAgcGluIG11bHRpcGxleGluZyBhbmQgY2xvY2tzIGFuZCBpcyBjYWxsZWQgd2hlbiBPTkxZIGFuCisgKiAgICBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubyBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisKKwlkZWxheSgxMDApOworCisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfZGlhbW9uZF9zZHJhbSgpOworfQorCisvKgorICogIGludCBib2FyZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGVhcmx5LCBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogICAgZm9sbG93aW5nIGNvcmUgQ1BVIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorYm9hcmRfaW5pdCh2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9kZXZpY2VfdHlwZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqICAgIGRldmljZSBpcyBvZiBUU1QsIEVNVSwgSFMgb3IgR1AgdHlwZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLgorICoKKyAqLwordTMyCitnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9zeXNib290X3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZCwgaW5kaWNhdGluZyB0aGUKKyAqICAgIG9yZGVyIG9mIG1lbW9yeSBpbnRlcmZhY2VzIGZyb20gd2hpY2ggdGhlIHByb2Nlc3NvciB3aWxsIGF0dGVtcHQKKyAqICAgIHRvIGJvb3QgaXRzZWxmLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQuCisgKgorICovCit1MzIKK2dldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisjaWYgMAorCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAweDNmOworI2VuZGlmCit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfRElBTU9ORF9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCWNhc2UgMTU6CisJCWxpc3RbMF0gPSBHUE1DX05BTkQ7CisJCWxpc3RbMV0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbGlzdFsyXSA9IE1NQ19OQU5EOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJbGlzdFswXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzFdID0gTU1DX05BTkQ7CisJCWxpc3RbMl0gPSBHUE1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisgICAgcmV0dXJuIG51bWJlcl9vZl9kZXZpY2VzOworfQorCisvKgorICogIGludCBtaXNjX2luaXRfcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBtaXNjZWxsYW5lb3VzLCBib2FyZC1zcGVjaWZpYworICogICAgaW5pdGlhbGl6YXRpb24gZm9sbG93aW5nIENQVSwgZWFybHkgYm9hcmQsIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIGxvYWRpbmcgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcgorICogICAgdG8gUkFNLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorbWlzY19pbml0X3Iodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogIHZvaWQgZm9vYmFyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3Blcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgaW50CitncG1jX2NvbmZpZ18wKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApCisJLyoKKwkgKiBGaXJzdCwgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGFuZCB3YWl0LgorCSAqLworCV9fcmF3X3dyaXRlbChHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRCwgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5leHQsIHByb2dyYW0gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMV8wLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzJfMCwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUczXzAsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNF8wLCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzVfMCwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc2XzAsIEdQTUNfQ09ORklHNl8wKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBHUE1DIG1hcHBpbmcgYW5kIHNwaW4gZm9yIHRoZSBwYXJhbWV0ZXJzIHRvCisJICogYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlfX3Jhd193cml0ZWwoKENGR19HUE1DX0NPTkZJRzdfMCB8IEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQpLAorCQkJCSBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgyMDAwKTsKKworCWlmIChuYW5kX2NoaXAoKSl7CisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKSAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBpbnQgbmFuZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlcgorICogICAgKEdQTUMpIHN1Y2ggdGhhdCBvbi1ib2FyZCBOQU5EIGRldmljZXMgbWF5IGJlIGFjY2Vzc2VkIGZvcgorICogICAgc2Vjb25kLXN0YWdlIGJvb3QuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBOQU5EIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSwgMS4KKyAqCisgKi8KK2ludAorbmFuZF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKgorCSAqIEVzdGFibGlzaCBHUE1DIGdsb2JhbCBzZXR0aW5ncy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVCwgR1BNQ19TWVNDT05GSUcpOworCisJX19yYXdfd3JpdGVsKEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFLCBHUE1DX0lSUUVOQUJMRSk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19USU1FT1VURU5BQkxFX09GRiwgR1BNQ19USU1FT1VUX0NPTlRST0wpOworCisJaWYgKGdwbWNfY29uZmlnXzAoKSkgeworCQlwdXRzKCJVbnN1cHBvcnRlZCBOQU5EIGRldmljZSBAIEdQTUMwIVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0dXMgPSAwOworCisgZG9uZToKKwkvKiBEdW1wIEdQTUMgYW5kIFNEUkMgcmVnaXN0ZXJzIGlmIHNvIGNvbmZpZ3VyZWQuICovCisKKwlvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqICB2b2lkIGJvYXJkX2hhbmcoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgYm9hcmQtc3BlY2lmaWMgYWN0aW9ucyB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgIGhhbmdzIGJ5IGV4ZWN1dGluZyBoYW5nKCkuIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG87CisgKiAgICBob3dldmVyLCB3ZSBtaWdodCBsYXRlciBkcml2ZSB0aGUgcGllem8gb3IgYSBMRUQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitib2FyZF9oYW5nICh2b2lkKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmOTJmOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL211eC5jCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgSS9PIHBhZCBtdWx0aXBsZXhlciBjb25maWd1cmF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB2b2lkIHNldF9tdXhjb25mX3JlZ3MoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZXMgc2V0cyB0aGUgSS9PIHBhZCBtdWx0aXBsZXhlcnMgZm9yIFVBUlQsIEdQTUMsIFNEUkMsCisgKiAgICBHUElPLgorICoKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqLwordm9pZAorc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCS8qCisJICogVGhlIGJpdCBmaWVsZHMgZm9yIHRoZXNlIHNldHRpbmdzIGFyZSBhcyBmb2xsb3dzOgorCSAqCisJICogICBJe0VOLERJU30JIAktIElucHV0IEVuYWJsZS9EaXNhYmxlCisJICogICBQVFtEVV0JCSAJLSBQdWxsLWRvd24sIC11cAorCSAqICAgRElTLEVOCQkgIAktIFB1bGwtZG93biwgLXVwIGRpc2FibGVkL2VuYWJsZWQKKwkgKiAgIE1bMDEyMzQ1NjddCS0gQ29uZmlndXJhdGlvbiBtb2RlIDAtNworCSAqLworCisJLyoKKwkgKiBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorCSAqCisJICogTW9zdCBvZiB0aGUgU0RSQyBzaWduYWxzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBTYW1zdW5nCisJICogSzRYNTExNjNQSS1GQ0c2IDUxMiBNYiB4IDE2LWJpdCAoNjQgTWlCKSBERFIgU0RSQU0uIEJlY2F1c2Ugd2UKKwkgKiBpbnRlcmZhY2UgaW4gMTYtYml0IHJhdGhlciB0aGFuIDMyLWJpdCBtb2RlLCB3ZSBwbGFjZSB0aGUKKwkgKiB1bnVzZWQgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisJICovCisKKwlNVVhfVkFMKENQKFNEUkNfRDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QwCisJTVVYX1ZBTChDUChTRFJDX0QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMQorCU1VWF9WQUwoQ1AoU0RSQ19EMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDIKKwlNVVhfVkFMKENQKFNEUkNfRDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QzCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDUKKwlNVVhfVkFMKENQKFNEUkNfRDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q2CisJTVVYX1ZBTChDUChTRFJDX0Q3KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENworCU1VWF9WQUwoQ1AoU0RSQ19EOCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDgKKwlNVVhfVkFMKENQKFNEUkNfRDkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q5CisJTVVYX1ZBTChDUChTRFJDX0QxMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEwCisJTVVYX1ZBTChDUChTRFJDX0QxMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDExCisJTVVYX1ZBTChDUChTRFJDX0QxMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEyCisJTVVYX1ZBTChDUChTRFJDX0QxMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEzCisJTVVYX1ZBTChDUChTRFJDX0QxNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE0CisJTVVYX1ZBTChDUChTRFJDX0QxNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE1CisKKwkvLyBCZWNhdXNlIHdlIGludGVyZmFjZSBTRFJBTSBpbiAxNi1iaXQgbW9kZSwgcGxhY2UKKwkvLyBTRFJDX0RBVEFbMzE6MTZdIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoU0RSQ19DTEspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0NMSworCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMwCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzEKKworCS8vIFBsYWNlIHVudXNlZCBEUSBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKEdQTUNfQTEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0ExCisJTVVYX1ZBTChDUChHUE1DX0EyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMgorCU1VWF9WQUwoQ1AoR1BNQ19BMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTMKKwlNVVhfVkFMKENQKEdQTUNfQTQpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E0CisJTVVYX1ZBTChDUChHUE1DX0E1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNQorCU1VWF9WQUwoQ1AoR1BNQ19BNiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTYKKwlNVVhfVkFMKENQKEdQTUNfQTcpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E3CisKKwkvLyBQbGFjZSB0aGUgdW51c2VkIEdQTUNfQTggcGluIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfQTkgdG8gR1BJT180MiB1c2VkIGFzIGEgcHVzaC1wdWxsLCBhY3RpdmUgbG93IGlucHV0CisJLy8gZnJvbSB0aGUgVVNCIFBIWSBmb3IgVVNCIHN1c3BlbmQgbm90aWZpY2F0aW9uLgorCisJTVVYX1ZBTChDUChHUE1DX0E5KSwJCShJRU4gIHwgUFRVIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MgorCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gR1BNQ19BMTAgdG8gR1BJT180MyB1c2VkIGFzIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBvdXRwdXQKKwkvLyBMQ0RfbkVOQlVGRkVSIGZvciB0aGUgMS44ViB0byAzLjNWIExDRCBidWZmZXIgZW5hYmxlLgorCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNDMKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisKKwlNVVhfVkFMKENQKEdQTUNfRDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QwCisJTVVYX1ZBTChDUChHUE1DX0QxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMQorCU1VWF9WQUwoQ1AoR1BNQ19EMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDIKKwlNVVhfVkFMKENQKEdQTUNfRDMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QzCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDUKKwlNVVhfVkFMKENQKEdQTUNfRDYpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q2CisJTVVYX1ZBTChDUChHUE1DX0Q3KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENworCU1VWF9WQUwoQ1AoR1BNQ19EOCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDgKKwlNVVhfVkFMKENQKEdQTUNfRDkpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q5CisJTVVYX1ZBTChDUChHUE1DX0QxMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEwCisJTVVYX1ZBTChDUChHUE1DX0QxMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDExCisJTVVYX1ZBTChDUChHUE1DX0QxMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEyCisJTVVYX1ZBTChDUChHUE1DX0QxMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEzCisJTVVYX1ZBTChDUChHUE1DX0QxNCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE0CisJTVVYX1ZBTChDUChHUE1DX0QxNSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE1CisJTVVYX1ZBTChDUChHUE1DX05DUzApLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzAKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MyCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gdG8gR1BNQ19OQ1MzIGZvciBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORAorCS8vIEZsYXNoCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzUgZm9yIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMKKwkvLyBhbmQgUEhZCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTNQorI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M2IHRvIEdQVDExX1BXTV9FVlQgdXNlZCBhcyBhIHB1c2gtcHVsbCBwdWxzZSB3aWR0aAorCS8vIG1vZHVsYXRlZCAoUFdNKSBzaWduYWwgZm9yIHRoZSBwaWV6by4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTMpKTsJLy8gR1BUMTFfUFdNX0VWVAorCisJLy8gQXNzaWduIEdQTUNfTkNTNyB0byBHUElPXzU4IHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0CisJLy8gUElFWk9fTkVOQUJMRSB0byB0aGUgVEkgU043NExWQzJHMjQwIER1YWwgQnVmZmVyL0RyaXZlciBXaXRoCisJLy8gMy1TdGF0ZSBPdXRwdXRzIGlucHV0cy4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT181OAorCisJTVVYX1ZBTChDUChHUE1DX0NMSyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQ0xLCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25BRFZfQUxFCisJTVVYX1ZBTChDUChHUE1DX05PRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbk9FCisJTVVYX1ZBTChDUChHUE1DX05XRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldFCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25CRTBfQ0xFCisKKwkvLyBBc3NpZ24gR1BNQ19OQkUxIHRvIEdQSU9fNjEgdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQgdG8gdGhlCisJLy8gWmlnQmVlIGFjdGl2ZS1sb3cgcmVzZXQuCisKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjEKKworCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XUAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDAKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQxCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW5hdmFpbGFibGUKKworCS8vIEFzc2lnbiBHUE1DX1dBSVQzIHRvIEdQSU9fNjUgdXNlZCBhcyBhbiBhY3RpdmUtaGlnaCwgcHVzaC1wdWxsCisJLy8gYmFja3BsYXRlIGRldGVjdCBpbnB1dC4KKworCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjUKKworCS8qCisJICogRGlzcGxheSBTdWJzeXN0ZW0gKERTUykKKwkgKgorCSAqIEFsbCBEU1Mgc2lnbmFscyBhcmUgdXNlZCBpbiB0aGVpciBub3JtYWwsIGRlZmF1bHQgbW9kZSAoTW9kZSAwKQorCSAqIHRvIGRyaXZlIHRoZSBTYW1zdW5nIExNUzM1MERGMFsxM10gTENEIGRpc3BsYXkgcGFuZWwuCisJICovCisKKwlNVVhfVkFMKENQKERTU19QQ0xLKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1BDTEsKKwlNVVhfVkFMKENQKERTU19IU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19IU1lOQworCU1VWF9WQUwoQ1AoRFNTX1ZTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1ZTWU5DCisJTVVYX1ZBTChDUChEU1NfQUNCSUFTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0FDQklBUworCU1VWF9WQUwoQ1AoRFNTX0RBVEEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEwCisJTVVYX1ZBTChDUChEU1NfREFUQTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEKKwlNVVhfVkFMKENQKERTU19EQVRBMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEzCisJTVVYX1ZBTChDUChEU1NfREFUQTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTQKKwlNVVhfVkFMKENQKERTU19EQVRBNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE2CisJTVVYX1ZBTChDUChEU1NfREFUQTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTcKKwlNVVhfVkFMKENQKERTU19EQVRBOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE5CisJTVVYX1ZBTChDUChEU1NfREFUQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTEKKwlNVVhfVkFMKENQKERTU19EQVRBMTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEyCisJTVVYX1ZBTChDUChEU1NfREFUQTEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMworCU1VWF9WQUwoQ1AoRFNTX0RBVEExNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTQKKwlNVVhfVkFMKENQKERTU19EQVRBMTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE1CisJTVVYX1ZBTChDUChEU1NfREFUQTE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTcKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE4CisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjAKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIxCisJTVVYX1ZBTChDUChEU1NfREFUQTIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjMKKworCU1VWF9WQUwoQ1AoQ0FNX1dFTiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIC8gVHJhbnNtaXR0ZXIgKFVBUlQpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9UWAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlRTCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9DVFMKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlgKKwkvKgorCSAqIENvbnRyb2wgYW5kIERlYnVnCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoU1lTXzMySyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU18zMksKKwlNVVhfVkFMKENQKFNZU19CT09UMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QxCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDIKKwlNVVhfVkFMKENQKFNZU19CT09UMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMworCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q0CisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDUKKwlNVVhfVkFMKENQKFNZU19CT09UNiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNgorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIFNZU19DTEtPVVQxCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19uVFJTVAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RDSworCU1VWF9WQUwoQ1AoSlRBR19UTVMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RNUworCU1VWF9WQUwoQ1AoSlRBR19UREkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RESQorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUwCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTEKKwlNVVhfVkFMKENQKEVUS19DTEtfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19DVExfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EM19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EN19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTBfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTFfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTJfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTNfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBFVEtfRDFbNDVdIGFzIE1NMl9SWFJDViBhbmQgTU0yX1RYU0UwIFVTQiBGUy9MUyBIb3N0CisJLy8gKE1vZGUgNSkKKworCU1VWF9WQUwoQ1AoRVRLX0QxNF9FUzIpLAkoSUVOICB8IFBURCB8IERJUyB8IE01KSk7CS8vIE1NMl9SWFJDVgorCU1VWF9WQUwoQ1AoRVRLX0QxNV9FUzIpLAkoSUVOICB8IFBURCB8IERJUyB8IE01KSk7CS8vIE1NMl9UWFNFMAorfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldHVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgSXQgaW5oZXJpdHMgZW50aXJlbHkgZnJvbSB0aGUgZXF1aXZhbGVudCBUSSBPTUFQMyBFVk0KKyAqCWZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUcxXzApCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJRzNfMCkKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc0XzApCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNV8wKQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorI2VuZGlmIC8qICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICovCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWikKKy53b3JkIDE1MCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDE1MCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsIDE1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKQorLndvcmQgMzAwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDYwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICAzLCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiTVBVIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKSAqLworCitpdmFfMzZ4X2RwbGxfcGFyYW06CisvLyAgICAgTSAgIE4gICBGUyBNMgorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxNi44IE1IegorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWikKKy53b3JkIDEwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDEwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgNzEsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaKQorLndvcmQgMTY2LCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMzMyLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgNDE1LCAyMywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTY2LCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgNDE1LCA0NywgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopCisud29yZCAyMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCA0MDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDE3LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiQ29yZSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopICovCisKKy8qCisgKiBGb3IgdGhlIHBlcmlwaGVyYWwgKFBFUikgKGFrYSBEUExMNCkgY2xvY2sgc2V0dGluZ3MsIHRoZXJlIGFyZSBvbmx5CisgKiBlZmZlY3RpdmVseSB0d28gY2xvY2sgY2hvaWNlcywgOTYgTUh6IG9yIDE5MiBNSHouIEhvd2V2ZXIsIHRoZSBvbmx5CisgKiB0aW1lIDE5MiBNSHogaXMgYXB0IHRvIGJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gaXMgaWYgYm90aCBTR1ggYW5kCisgKiBUViBvdXRwdXQgYXJlIHVzZWQuCisgKgorICogICBGb3IgYW55IGdpdmVuIHN5c3RlbSBjbG9jaywgdGhlIGRpdmlkZXJzIGFyZSBjb25maWd1cmVkIHRodXMgKHBlcgorICogICBTZWN0aW9uIDMuNS4zLjMuMy4yICJUeXBlIEIgRFBMTCAoTG93LUppdHRlcikiIG9mIHRoZSBPTUFQMyBUUk0pOgorICoKKyAqICAgICBQRVJbY2xrb3V0XSA9IChTWVNbY2xrb3V0XSAqIE0pIC8gKE4gKyAxKQorICoKKyAqICAgICAgIE0yW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTIgICAgICAgICAgIHVzZWQgYnkgVUFSVCwgTU1DLCBJMkMsIGV0Yy4KKyAqICAgICAgIE0zW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTMgICAgICAgICAgIHVzZWQgYnkgVFYgb3V0LgorICogICAgICAgTTRbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNCAgICAgICAgICAgdXNlZCBieSBEU1MuCisgKiAgICAgICBNNVtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE01ICAgICAgICAgICB1c2VkIGJ5IGNhbWVyYS4KKyAqICAgICAgIE02W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTYgICAgICAgICAgIHVzZWQgYnkgZW11bGF0aW9uLgorICoKKyAqICBTbywgZm9yIGEgMTkuMiBNSHogc3lzdGVtIGNsb2NrIGFuZCB0aGUgc2NhbGFyIGVudHJpZXMgYmVsb3c6CisgKgorICogICAgICAgUEVSW2Nsa291dF0gPSAoMTkuMiAqIDU0MCkgLyAoMTEgKyAxKSA9IDg2NAorICoKKyAqICAgICAgIE0yW2Nsa291dF06IDg2NCAvICA5ID0gIDk2ICAgTUh6CisgKiAgICAgICBNM1tjbGtvdXRdOiA4NjQgLyAxNiA9ICA1NCAgIE1IegorICogICAgICAgTTRbY2xrb3V0XTogODY0IC8gIDUgPSAxNzIuOCBNSHoKKyAqICAgICAgIE01W2Nsa291dF06IDg2NCAvICA0ID0gMjE2ICAgTUh6CisgKiAgICAgICBNNltjbGtvdXRdOiA4NjQgLyAgMyA9IDI4OCAgIE1IegorICovCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBTWVNfQ0xLICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYKKy53b3JkIDEyMDAwLCAgICA0MzIsICAgIDUsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMiAgIE1IegorLndvcmQgMTMwMDAsICAgIDg2NCwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEzICAgTUh6Cisud29yZCAxOTIwMCwgICAgNTQwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTkuMiBNSHoKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAyNiAgIE1IegorLndvcmQgMzg0MDAsICAgIDI3MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDM4LjQgTUh6Cisud29yZCAxNjgwMCwgICAgMzYwLCAgICA2LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTYuOCBNSHoKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKKyAqICAgICAgYWNjZXNzaW5nIERpZ2l0YWwgUGhhc2VkIExvY2sgTG9vcCAoRFBMTCkgcGFyYW1ldGVycyBhbmQKKyAqICAgICAgc2V0dGluZ3MuCisgKgorICovCisKKyNpZm5kZWYgX05FU1RfRElBTU9ORF9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKgorICogVHlwZSBEZWZpbml0aW9ucworICovCisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KKworc3RydWN0IGRwbGxfcGFyYW0geworCXUzMiBtOworCXUzMiBuOworCXUzMiBmc2VsOworCXUzMiBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXUzMiBzeXNfY2xrOworCXUzMiBtOworCXUzMiBuOworCXUzMiBtMjsKKwl1MzIgbTM7CisJdTMyIG00OworCXUzMiBtNTsKKwl1MzIgbTY7CisJdTMyIG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisvKgorICogSW5saW5lIEZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gcGxhdGZvcm0uUy4KKyAqLworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wcmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3ByY20uYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IGNsb2NrIHNldC11cCBmb3IgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQKKyAqICAgICAgQ2xvY2sgTWFuYWdlciAoUFJDTSkKKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdTMyIGdldF9vc2NfY2xrX3NwZWVkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQgYmFzZWQgb24KKyAqICAgIGEga25vd24gMzIga0h6IGNsb2NrIGFuZCBnZW5lcmFsIHB1cnBvc2UgdGltZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIGNsb2NrIHNwZWVkLgorICoKKyAqLworc3RhdGljIHUzMgorZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qCisgKiAgdm9pZCBnZXRfc3lzX2Nsa2luX3NlbCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgUFJDTSBQUk0gc3lzdGVtIGNsb2NrCisgKiAgICBmcmVxdWVuY3kgc2VsZWN0b3IsIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIHRvIFBSTV9DTEtTRUwuCisgKgorICogIElucHV0KHMpOgorICogICAgaGVydHogIC0gVGhlIHNwZWVkLCBpbiBNSHosIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBpcyBiZWxpZXZlZAorICogICAgICAgICAgICAgICB0byBiZSBydW5uaW5nIGF0LgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgaW5kZXggdXNlZCB0byBhY2Nlc3MgdGhlCisgKiAgICAgICAgICAgICAgIGRpZ2l0YWwgUExMIHNldHRpbmdzLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBmb3IgdGhlIGRpZ2l0YWwgUExMIHNldHRpbmdzCisgKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjbG9jayByYXRlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorZ2V0X3N5c19jbGtpbl9zZWwodTMyIGhlcnR6LCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJc3dpdGNoIChoZXJ0eikgeworCisJY2FzZSBTMzhfNE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaOworCQlicmVhazsKKworCWNhc2UgUzI2TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTlfMk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE2XzhNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxM006CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEyTToKKwlkZWZhdWx0OgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWjsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogIHZvaWQgcHJjbV9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgY2xvY2tzIGluIGEgYm9hcmQtc3BlY2lmaWMgbWFubmVyIGZvcgorICogICAgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlciAoUFJDTSkgYW5kIGlzCisgKiAgICBjYWxsZWQgb25seSB3aGVuIGFuIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vCisgKiAgICBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgc3lzX2Nsa19yYXRlID0gMCwgc3lzX2Nsa2luX3NlbCwgc3lzX2Nsa19kaXY7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCXN5c19jbGtfcmF0ZSA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwoc3lzX2Nsa19yYXRlLCAmc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBTZXQgdGhlIFBSTV9DTEtTRUxfU1lTX0NMS0lOX1NFTCB2YWx1ZSBpbiB0aGUgcHJvY2Vzc29yLiAqLworCisJc3IzMihQUkNNX1BSTV9DQ1JfQ0xLU0VMLAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJULAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMsCisJCSBzeXNfY2xraW5fc2VsKTsKKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZSBieSB0d28uCisJICoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisKKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYKKwkgICAoc3lzX2Nsa2luX3NlbCA+IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWikpIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMjsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDI7CisKKwl9IGVsc2UgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMTsKKworCX0KKworCXNyMzIoUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUywKKwkJIHN5c19jbGtfZGl2KTsKKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci94LWxvYWQubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIFgtTG9hZGVyIGxpbmtlciBzY2F0dGVyIGZpbGUgZm9yIHRoZSBOZXN0CisgKiAgICAgIExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICovCisKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViNjc5NQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBkaWFtb25kLm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEzODBjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2NvbmZpZy5tawpAQCAtMCwwICsxLDIxIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvZGlhbW9uZC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2RpYW1vbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODA2ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2RpYW1vbmQuYwpAQCAtMCwwICsxLDEwNzUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQUNVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IG9uIEdQSU8sIFJBTSBhbmQgZmxhc2ggaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgICBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBPTUFQMyBFVk0gZXF1aXZhbGVudCBmaWxlLgorICoKKyAqICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb3JkZXIgaXMgcm91Z2hseToKKyAqCisgKiAgICAgICAgMSkgc19pbml0CisgKiAgICAgICAgMikgYm9hcmRfaW5pdAorICogICAgICAgIDMpIG1pc2NfaW5pdF9yCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTICgxKQorCisKK3ZvaWQKK3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKSB7CisJZGVsYXkodXNlY3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorZ2V0X2NwdV9pZCh2b2lkKQoreworCXUzMiBjcHVpZCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKworCXJldHVybiAoY3B1aWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitnZXRfY3B1X3Jldih2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCWlmICgoY3B1aWQgICYgMHhmKSA9PSAweDApIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzEpOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzIpOworCisJfQorCit9CisKK3UzMgoraXNfY3B1X2ZhbWlseSh2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKwl1MzIgY3B1X2ZhbWlseSA9IDAsIG9tYXAzNHh4X2lkID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCisJfSBlbHNlIHsKKwkJb21hcDM0eHhfaWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAob21hcDM0eHhfaWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisKKwkJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzRYWDoKKwkJZGVmYXVsdDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQlicmVhazsKKworCQl9CisJfQorCisJcmV0dXJuIChjcHVfZmFtaWx5KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiAgdm9pZCBzcjMyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgY2xlYXJzIGFuZCBzZXRzIGEgdmFsdWUgaW4gYSBiaXQgZXh0ZW50IGZvciBhCisgKiAgICAzMi1iaXQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNsZWFyIGFuZCBzZXQgdGhlIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIDMyLWJpdCB2YWx1ZS4KKyAqICAgIHN0YXJ0X2JpdCAtIFRoZSBmaXJzdCBiaXQgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICBudW1fYml0cyAgLSBUaGUgcmFuZ2Ugb2YgYml0cyBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIHZhbHVlICAgICAtIFRoZSB2YWx1ZSB0byBzZXQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCBiaXQgZXh0ZW50IGNsZWFyZWQgYW5kCisgKiAgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKworCW1zayA9ICgxIDw8IG51bV9iaXRzKTsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qCisgKiAgdTMyIHdhaXRfb25fdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZWFkcyB0aGUgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZAorICogICAgYnVzeSB3YWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIG1hdGNoIHZhbHVlIGlzIHJlYWQgb3IgdW50aWwgdGhlCisgKiAgICBib3VuZGVkIG51bWJlciBvZiBsb29wcyBoYXZlIGJlZW4gcmVhY2hlZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICByZWFkX2JpdF9tYXNrIC0gVGhlIGJpdCBtYXNrIHRvIGFwcGx5IGFmdGVyIHJlYWRpbmcgdGhlIHJlZ2lzdGVyLgorICogICAgbWF0Y2hfdmFsdWUgICAtIFRoZSB2YWx1ZSB0byBtYXRjaCBvbiBhZnRlciByZWFkaW5nIGFuZCBtYXNraW5nLgorICogICAgcmVhZF9hZGRyICAgICAtIFRoZSByZWdpc3RlciBhZGRyZXNzIHRvIHJlYWQuCisgKiAgICBib3VuZCAgICAgICAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHJlYWQgYmVmb3JlIGdpdmluZworICogICAgICAgICAgICAgICAgICAgIHVwLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRydWUgKDEpIGlmIHRoZSBtYXRjaF92YWx1ZSB3YXMgcmVhY2hlZDsgb3RoZXJ3aXNlLCBmYWxzZSAoMCkuCisgKgorICovCit1MzIKK3dhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3RyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJY29uc3QgaW50IHR5cGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworCS8qCisJICogSWYgdGhlIHByb2Nlc3NvciBpcyBhIEdQIGRldmljZSwgdW5sb2NrIHRoZSBkZXZpY2UgU1JBTSBmb3IKKwkgKiBnZW5lcmFsIHVzZS4KKwkgKi8KKworCWlmICh0eXBlID09IENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1ApIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFNEUkMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFNEUkNfUkVWSVNJT04pOworCURVTVBfUkVHTChTRFJDX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKFNEUkNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19DU19DRkcpOworCURVTVBfUkVHTChTRFJDX1NIQVJJTkcpOworCURVTVBfUkVHTChTRFJDX0VSUl9BRERSKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfVFlQRSk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9DVFJMKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfUE9XRVJfUkVHKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzApOworCURVTVBfUkVHTChTRFJDX01SXzApOworCURVTVBfUkVHTChTRFJDX0VNUjJfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzApOworCURVTVBfUkVHTChTRFJDX01DRkdfMSk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMSk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8xKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMSk7Cit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfR1BNQ19ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBHUE1DIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChHUE1DX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChHUE1DX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFFTkFCTEUpOworCURVTVBfUkVHTChHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX0FERFJFU1MpOworCURVTVBfUkVHTChHUE1DX0VSUl9UWVBFICk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHICk7CisJRFVNUF9SRUdMKEdQTUNfU1RBVFVTICk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18xKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMik7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzMpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN180KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNSk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM182KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzYpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN183KTsKKworI2lmIDAKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU180KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU183KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcxKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcyKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9TVEFUVVMpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VDQ19TSVpFX0NPTkZJRyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0MxX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDMl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzNfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M0X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzZfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M3X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzlfUkVTVUxUKTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1NXREFUQSk7CisjZW5kaWYKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX1BSQ01fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgUFJDTSBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woUFJDTV9QUk1fQ0NSX0NMS1NFTCk7CisJRFVNUF9SRUdMKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDNfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ0FNKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NPUkUpOworCURVTVBfUkVHTChDTV9DTEtTRUxfRFNTKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9FTVUpOworfQorI2Vsc2UKKyNkZWZpbmUgb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENGR19QUkNNX0RFQlVHICovCisKKy8qCisgKiAgdm9pZCBjb25maWdfZGlhbW9uZF9zZHJhbSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBwcm9jZXNzb3IncyBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorICogICAgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiAzMiBNYiB4IDE2IGIgKDY0CisgKiAgICBNaUIpIEREUiBTRFJBTSBvbiB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorY29uZmlnX2RpYW1vbmRfc2RyYW0odm9pZCkKK3sKKwl1MzIgdmFsdWUsIGFjdGltX2N0cmxhLCBhY3RpbV9jdHJsYjsKKworCS8qCisJICogU3RlcCAxOiBSZXNldCB0aGUgU0RSQyBjb250cm9sbGVyIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSByZXNldAorCSAqIGV2ZW50IHRvIGNsZWFyLgorCSAqLworCisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9TRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICB3YWl0X29uX3ZhbHVlKFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1RBVFVTLAorCQkJCSAgMTIwMDAwMDApOworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfQ0xFQVIsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qCisJICogU3RlcCAyOiBTZXR1cCB0aGUgcG9zaXRpb24gYW5kIGdlb21ldHJ5IG9mIHRoZSBTRFJBTSBkZXZpY2Ugb24KKwkgKiB0aGUgY29udHJvbGxlcidzIGJ1cy4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfU0hBUklOR19MT0NLX09GRiAJCQkJCQkJCQkJCQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09GRik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1NIQVJJTkcpOworCisJLyoKKwkgKiBTdGVwIDM6IFNldHVwIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIFJBUyB3aWR0aCwKKwkgKiBDQVMgd2lkdGgsIGFkZHJlc3MgbXVsdGlwbGV4aW5nLCBzaXplLCBiYW5rIG1hcHBpbmcsIGJ1cyB3aWR0aCwKKwkgKiBwb3dlciBtb2RlLCBERFIgdHlwZSBhbmQgbWVtb3J5IHR5cGUuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX01DRkdfTE9DS1NUQVRVU19SVwkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19SQVNXSURUSF8xNF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19DQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX0NBU1dJRFRIXzEwX0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRkxFWElCTEUJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQU1TSVpFX0VOQ09ERShDRkdfU0RSQU1fU0laRV9NQikJCQkJCXwKKwkJIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9FTkNPREUoU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX1JfQl9DKXwKKwkJIFNEUkNfTUNGR19CMzJOT1QxNl9PRkYJCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERUVQUERfU1VQUE9SVEVECQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERFJUWVBFX0VOQ09ERShTRFJDX01DRkdfRERSVFlQRV9NT0JJTEVfRERSKQkJCXwKKwkJIFNEUkNfTUNGR19SQU1UWVBFX0VOQ09ERShTRFJDX01DRkdfUkFNVFlQRV9ERFIpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTUNGR18wKTsKKworCS8qCisJICogU3RlcCA0OiBFc3RhYmxpc2ggdGhlIEFDIGZpbmUgdHVuaW5nIHRpbWluZyBjaGFyYWN0ZXJpc3RpY3MuCisJICovCisKKwlhY3RpbV9jdHJsYQorCQk9IChTRFJDX0FDVElNX0NUUkxBX1RSRkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQVNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REQUxfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwpKTsKKworCWFjdGltX2N0cmxiCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUikJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RDS0VfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYU1JfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IpKTsKKworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGIsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKgorCSAqIFN0ZXAgNTogRXN0YWJsaXNoIHRoZSBtZW1vcnkgYXV0b3JlZnJlc2ggY29udHJvbAorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19SRlJfQ1RSTF9BUkNWX0VOQ09ERSgxMjQ0KQkJCQkJCXwKKwkJIFNEUkNfUkZSX0NUUkxfQVJFX0VOQ09ERShTRFJDX1JGUl9DVFJMX0FSRV8xX0FSQ1YpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUkZSX0NUUkxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX1BPV0VSX1JFR19XQUtFVVBfREVMQVlFRAkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfRU5DT0RFKDApCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRU5BQkxFCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0RJU0FCTEUJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfRU5DT0RFKFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTk9ORSkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19QQUdFUE9MSUNZX0hQSEIpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19QT1dFUl9SRUcpOworCisJLyoKKwkgKiBTdGVwIDY6IEVzdGFibGlzaCB0aGUgSkVERUMtZGVmaW5lZCBtb2RlIGFuZCBETEwgcGFyYW1ldGVycy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwlkZWxheSg1MDAwKTsJICAgICAgICAgICAgICAgICAKKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX1BSRUNIQVJHRV9BTEwpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX01SX1pFUk9fMQkJCQkJCQl8CisJCSBTRFJDX01SX1dCU1RfRU5BQkxFCQkJCQl8CisJCSBTRFJDX01SX1pFUk9fMAkJCQkJCQl8CisJCSBTRFJDX01SX0NBU0xfRU5DT0RFKFNEUkNfTVJfQ0FTTF8zKQl8CisJCSBTRFJDX01SX1NJTF9TRVJJQUwJCQkJCQl8CisJCSBTRFJDX01SX0JMX0VOQ09ERShTRFJDX01SX0JMXzQpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTVJfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9FTkNPREUoMCkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9FTkNPREUoMCkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0VOQ09ERShTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfUFdEKSB8IAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisgCWRlbGF5KDB4MjAwMDApOworfQorCisvKgorICogIHZvaWQgc19pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdmVyeSBlYXJseSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gb2YgY2hpcAorICogICAgcGluIG11bHRpcGxleGluZyBhbmQgY2xvY2tzIGFuZCBpcyBjYWxsZWQgd2hlbiBPTkxZIGFuCisgKiAgICBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubyBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisKKwlkZWxheSgxMDApOworCisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfZGlhbW9uZF9zZHJhbSgpOworfQorCisvKgorICogIGludCBib2FyZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGVhcmx5LCBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogICAgZm9sbG93aW5nIGNvcmUgQ1BVIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorYm9hcmRfaW5pdCh2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9kZXZpY2VfdHlwZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqICAgIGRldmljZSBpcyBvZiBUU1QsIEVNVSwgSFMgb3IgR1AgdHlwZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLgorICoKKyAqLwordTMyCitnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9zeXNib290X3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZCwgaW5kaWNhdGluZyB0aGUKKyAqICAgIG9yZGVyIG9mIG1lbW9yeSBpbnRlcmZhY2VzIGZyb20gd2hpY2ggdGhlIHByb2Nlc3NvciB3aWxsIGF0dGVtcHQKKyAqICAgIHRvIGJvb3QgaXRzZWxmLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQuCisgKgorICovCit1MzIKK2dldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIGludCBnZXRfYm9vdF9kZXZpY2VfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VfbGlzdCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIGNvbnN0YW50IGxpc3QgaW5kaWNhdGluZyB0aGUgcHJlZmVycmVkCisgKiAgICBkZXZpY2UgYm9vdCBsaXN0LgorICogICAgSXQgZ2V0cyBjYWxsZWQgZnJvbSBzdGFydF9hcm1ib290IGluIGJvYXJkLmMKKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcHJlZmVycmVkIGZpcnN0IHByb2Nlc3NvciBtZW1vcnkgYm9vdCBpbnRlcmZhY2UuCisgKgorICovCisKK2ludAorZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCkKK3sKKwlzdGF0aWMgdTMyIGxpc3RbTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTXTsKKwljb25zdCB1MzIgbWVtX29yZGVyID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKworCS8vIHNldCBkZWZhdWx0cworCWludCBudW1iZXJfb2ZfZGV2aWNlcyA9IDA7CisJKmRldmljZXNfbGlzdCA9ICZsaXN0WzBdOworCisJc3dpdGNoIChtZW1fb3JkZXIpIHsKKworCWNhc2UgMDoKKwljYXNlIDI6CisJY2FzZSA0OgorCWNhc2UgMTY6CisJY2FzZSAyMjoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfT05FTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgMToKKwljYXNlIDEyOgorCWNhc2UgMTU6CisJY2FzZSAyMToKKwljYXNlIDI3OgorICAgICAgICBsaXN0WzBdID0gR1BNQ19OQU5EOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSAzOgorCWNhc2UgNjoKKyAgICAgICAgbGlzdFswXSA9IE1NQ19PTkVOQU5EOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSA4OgorCWNhc2UgMTE6CisJY2FzZSAxNDoKKwljYXNlIDIwOgorCWNhc2UgMjY6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX01ET0M7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDE3OgorCWNhc2UgMTg6CisJY2FzZSAyNDoKKyAgICAgICAgbGlzdFswXSA9IE1NQ19OQU5EOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSA3OgorCWNhc2UgMTA6CisJY2FzZSAxMzoKKwljYXNlIDE5OgorCWNhc2UgMjU6CisKKwlkZWZhdWx0OgorICAgICAgICBsaXN0WzBdID0gR1BNQ19OT1I7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwl9CisgICAgcmV0dXJuIG51bWJlcl9vZl9kZXZpY2VzOworfQorCisvKgorICogIGludCBtaXNjX2luaXRfcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBtaXNjZWxsYW5lb3VzLCBib2FyZC1zcGVjaWZpYworICogICAgaW5pdGlhbGl6YXRpb24gZm9sbG93aW5nIENQVSwgZWFybHkgYm9hcmQsIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIGxvYWRpbmcgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcgorICogICAgdG8gUkFNLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorbWlzY19pbml0X3Iodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogIHZvaWQgZm9vYmFyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3Blcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgaW50CitncG1jX2NvbmZpZ18wKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApCisJLyoKKwkgKiBGaXJzdCwgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGFuZCB3YWl0LgorCSAqLworCV9fcmF3X3dyaXRlbChHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRCwgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5leHQsIHByb2dyYW0gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMV8wLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzJfMCwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUczXzAsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNF8wLCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzVfMCwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc2XzAsIEdQTUNfQ09ORklHNl8wKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBHUE1DIG1hcHBpbmcgYW5kIHNwaW4gZm9yIHRoZSBwYXJhbWV0ZXJzIHRvCisJICogYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlfX3Jhd193cml0ZWwoKENGR19HUE1DX0NPTkZJRzdfMCB8IEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQpLAorCQkJCSBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgyMDAwKTsKKworCWlmIChuYW5kX2NoaXAoKSl7CisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKSAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBpbnQgbmFuZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlcgorICogICAgKEdQTUMpIHN1Y2ggdGhhdCBvbi1ib2FyZCBOQU5EIGRldmljZXMgbWF5IGJlIGFjY2Vzc2VkIGZvcgorICogICAgc2Vjb25kLXN0YWdlIGJvb3QuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBOQU5EIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSwgMS4KKyAqCisgKi8KK2ludAorbmFuZF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKgorCSAqIEVzdGFibGlzaCBHUE1DIGdsb2JhbCBzZXR0aW5ncy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVCwgR1BNQ19TWVNDT05GSUcpOworCisJX19yYXdfd3JpdGVsKEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFLCBHUE1DX0lSUUVOQUJMRSk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19USU1FT1VURU5BQkxFX09GRiwgR1BNQ19USU1FT1VUX0NPTlRST0wpOworCisJaWYgKGdwbWNfY29uZmlnXzAoKSkgeworCQlwdXRzKCJVbnN1cHBvcnRlZCBOQU5EIGRldmljZSBAIEdQTUMwIVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0dXMgPSAwOworCisgZG9uZToKKwkvKiBEdW1wIEdQTUMgYW5kIFNEUkMgcmVnaXN0ZXJzIGlmIHNvIGNvbmZpZ3VyZWQuICovCisKKwlvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqICB2b2lkIGJvYXJkX2hhbmcoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgYm9hcmQtc3BlY2lmaWMgYWN0aW9ucyB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgIGhhbmdzIGJ5IGV4ZWN1dGluZyBoYW5nKCkuIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG87CisgKiAgICBob3dldmVyLCB3ZSBtaWdodCBsYXRlciBkcml2ZSB0aGUgcGllem8gb3IgYSBMRUQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitib2FyZF9oYW5nICh2b2lkKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9tdXguYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmY5MmY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL211eC5jCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgSS9PIHBhZCBtdWx0aXBsZXhlciBjb25maWd1cmF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB2b2lkIHNldF9tdXhjb25mX3JlZ3MoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZXMgc2V0cyB0aGUgSS9PIHBhZCBtdWx0aXBsZXhlcnMgZm9yIFVBUlQsIEdQTUMsIFNEUkMsCisgKiAgICBHUElPLgorICoKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqLwordm9pZAorc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCS8qCisJICogVGhlIGJpdCBmaWVsZHMgZm9yIHRoZXNlIHNldHRpbmdzIGFyZSBhcyBmb2xsb3dzOgorCSAqCisJICogICBJe0VOLERJU30JIAktIElucHV0IEVuYWJsZS9EaXNhYmxlCisJICogICBQVFtEVV0JCSAJLSBQdWxsLWRvd24sIC11cAorCSAqICAgRElTLEVOCQkgIAktIFB1bGwtZG93biwgLXVwIGRpc2FibGVkL2VuYWJsZWQKKwkgKiAgIE1bMDEyMzQ1NjddCS0gQ29uZmlndXJhdGlvbiBtb2RlIDAtNworCSAqLworCisJLyoKKwkgKiBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorCSAqCisJICogTW9zdCBvZiB0aGUgU0RSQyBzaWduYWxzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBTYW1zdW5nCisJICogSzRYNTExNjNQSS1GQ0c2IDUxMiBNYiB4IDE2LWJpdCAoNjQgTWlCKSBERFIgU0RSQU0uIEJlY2F1c2Ugd2UKKwkgKiBpbnRlcmZhY2UgaW4gMTYtYml0IHJhdGhlciB0aGFuIDMyLWJpdCBtb2RlLCB3ZSBwbGFjZSB0aGUKKwkgKiB1bnVzZWQgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisJICovCisKKwlNVVhfVkFMKENQKFNEUkNfRDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QwCisJTVVYX1ZBTChDUChTRFJDX0QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMQorCU1VWF9WQUwoQ1AoU0RSQ19EMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDIKKwlNVVhfVkFMKENQKFNEUkNfRDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QzCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDUKKwlNVVhfVkFMKENQKFNEUkNfRDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q2CisJTVVYX1ZBTChDUChTRFJDX0Q3KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENworCU1VWF9WQUwoQ1AoU0RSQ19EOCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDgKKwlNVVhfVkFMKENQKFNEUkNfRDkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q5CisJTVVYX1ZBTChDUChTRFJDX0QxMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEwCisJTVVYX1ZBTChDUChTRFJDX0QxMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDExCisJTVVYX1ZBTChDUChTRFJDX0QxMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEyCisJTVVYX1ZBTChDUChTRFJDX0QxMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEzCisJTVVYX1ZBTChDUChTRFJDX0QxNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE0CisJTVVYX1ZBTChDUChTRFJDX0QxNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE1CisKKwkvLyBCZWNhdXNlIHdlIGludGVyZmFjZSBTRFJBTSBpbiAxNi1iaXQgbW9kZSwgcGxhY2UKKwkvLyBTRFJDX0RBVEFbMzE6MTZdIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoU0RSQ19DTEspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0NMSworCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMwCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzEKKworCS8vIFBsYWNlIHVudXNlZCBEUSBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKEdQTUNfQTEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0ExCisJTVVYX1ZBTChDUChHUE1DX0EyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMgorCU1VWF9WQUwoQ1AoR1BNQ19BMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTMKKwlNVVhfVkFMKENQKEdQTUNfQTQpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E0CisJTVVYX1ZBTChDUChHUE1DX0E1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNQorCU1VWF9WQUwoQ1AoR1BNQ19BNiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTYKKwlNVVhfVkFMKENQKEdQTUNfQTcpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E3CisKKwkvLyBQbGFjZSB0aGUgdW51c2VkIEdQTUNfQTggcGluIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfQTkgdG8gR1BJT180MiB1c2VkIGFzIGEgcHVzaC1wdWxsLCBhY3RpdmUgbG93IGlucHV0CisJLy8gZnJvbSB0aGUgVVNCIFBIWSBmb3IgVVNCIHN1c3BlbmQgbm90aWZpY2F0aW9uLgorCisJTVVYX1ZBTChDUChHUE1DX0E5KSwJCShJRU4gIHwgUFRVIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MgorCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gR1BNQ19BMTAgdG8gR1BJT180MyB1c2VkIGFzIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBvdXRwdXQKKwkvLyBMQ0RfbkVOQlVGRkVSIGZvciB0aGUgMS44ViB0byAzLjNWIExDRCBidWZmZXIgZW5hYmxlLgorCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNDMKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisKKwlNVVhfVkFMKENQKEdQTUNfRDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QwCisJTVVYX1ZBTChDUChHUE1DX0QxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMQorCU1VWF9WQUwoQ1AoR1BNQ19EMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDIKKwlNVVhfVkFMKENQKEdQTUNfRDMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QzCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDUKKwlNVVhfVkFMKENQKEdQTUNfRDYpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q2CisJTVVYX1ZBTChDUChHUE1DX0Q3KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENworCU1VWF9WQUwoQ1AoR1BNQ19EOCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDgKKwlNVVhfVkFMKENQKEdQTUNfRDkpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q5CisJTVVYX1ZBTChDUChHUE1DX0QxMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEwCisJTVVYX1ZBTChDUChHUE1DX0QxMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDExCisJTVVYX1ZBTChDUChHUE1DX0QxMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEyCisJTVVYX1ZBTChDUChHUE1DX0QxMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEzCisJTVVYX1ZBTChDUChHUE1DX0QxNCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE0CisJTVVYX1ZBTChDUChHUE1DX0QxNSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE1CisJTVVYX1ZBTChDUChHUE1DX05DUzApLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzAKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MyCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gdG8gR1BNQ19OQ1MzIGZvciBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORAorCS8vIEZsYXNoCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzUgZm9yIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMKKwkvLyBhbmQgUEhZCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTNQorI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpICovCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M2IHRvIEdQVDExX1BXTV9FVlQgdXNlZCBhcyBhIHB1c2gtcHVsbCBwdWxzZSB3aWR0aAorCS8vIG1vZHVsYXRlZCAoUFdNKSBzaWduYWwgZm9yIHRoZSBwaWV6by4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTMpKTsJLy8gR1BUMTFfUFdNX0VWVAorCisJLy8gQXNzaWduIEdQTUNfTkNTNyB0byBHUElPXzU4IHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0CisJLy8gUElFWk9fTkVOQUJMRSB0byB0aGUgVEkgU043NExWQzJHMjQwIER1YWwgQnVmZmVyL0RyaXZlciBXaXRoCisJLy8gMy1TdGF0ZSBPdXRwdXRzIGlucHV0cy4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT181OAorCisJTVVYX1ZBTChDUChHUE1DX0NMSyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQ0xLCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25BRFZfQUxFCisJTVVYX1ZBTChDUChHUE1DX05PRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbk9FCisJTVVYX1ZBTChDUChHUE1DX05XRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldFCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25CRTBfQ0xFCisKKwkvLyBBc3NpZ24gR1BNQ19OQkUxIHRvIEdQSU9fNjEgdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQgdG8gdGhlCisJLy8gWmlnQmVlIGFjdGl2ZS1sb3cgcmVzZXQuCisKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjEKKworCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XUAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDAKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQxCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW5hdmFpbGFibGUKKworCS8vIEFzc2lnbiBHUE1DX1dBSVQzIHRvIEdQSU9fNjUgdXNlZCBhcyBhbiBhY3RpdmUtaGlnaCwgcHVzaC1wdWxsCisJLy8gYmFja3BsYXRlIGRldGVjdCBpbnB1dC4KKworCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjUKKworCS8qCisJICogRGlzcGxheSBTdWJzeXN0ZW0gKERTUykKKwkgKgorCSAqIEFsbCBEU1Mgc2lnbmFscyBhcmUgdXNlZCBpbiB0aGVpciBub3JtYWwsIGRlZmF1bHQgbW9kZSAoTW9kZSAwKQorCSAqIHRvIGRyaXZlIHRoZSBTYW1zdW5nIExNUzM1MERGMFsxM10gTENEIGRpc3BsYXkgcGFuZWwuCisJICovCisKKwlNVVhfVkFMKENQKERTU19QQ0xLKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1BDTEsKKwlNVVhfVkFMKENQKERTU19IU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19IU1lOQworCU1VWF9WQUwoQ1AoRFNTX1ZTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1ZTWU5DCisJTVVYX1ZBTChDUChEU1NfQUNCSUFTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0FDQklBUworCU1VWF9WQUwoQ1AoRFNTX0RBVEEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEwCisJTVVYX1ZBTChDUChEU1NfREFUQTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEKKwlNVVhfVkFMKENQKERTU19EQVRBMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEzCisJTVVYX1ZBTChDUChEU1NfREFUQTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTQKKwlNVVhfVkFMKENQKERTU19EQVRBNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE2CisJTVVYX1ZBTChDUChEU1NfREFUQTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTcKKwlNVVhfVkFMKENQKERTU19EQVRBOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE5CisJTVVYX1ZBTChDUChEU1NfREFUQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTEKKwlNVVhfVkFMKENQKERTU19EQVRBMTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEyCisJTVVYX1ZBTChDUChEU1NfREFUQTEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMworCU1VWF9WQUwoQ1AoRFNTX0RBVEExNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTQKKwlNVVhfVkFMKENQKERTU19EQVRBMTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE1CisJTVVYX1ZBTChDUChEU1NfREFUQTE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTcKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE4CisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjAKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIxCisJTVVYX1ZBTChDUChEU1NfREFUQTIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjMKKworCU1VWF9WQUwoQ1AoQ0FNX1dFTiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIC8gVHJhbnNtaXR0ZXIgKFVBUlQpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9UWAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlRTCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9DVFMKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlgKKwkvKgorCSAqIENvbnRyb2wgYW5kIERlYnVnCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoU1lTXzMySyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU18zMksKKwlNVVhfVkFMKENQKFNZU19CT09UMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QxCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDIKKwlNVVhfVkFMKENQKFNZU19CT09UMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMworCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q0CisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDUKKwlNVVhfVkFMKENQKFNZU19CT09UNiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNgorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIFNZU19DTEtPVVQxCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19uVFJTVAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RDSworCU1VWF9WQUwoQ1AoSlRBR19UTVMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RNUworCU1VWF9WQUwoQ1AoSlRBR19UREkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RESQorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUwCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTEKKwlNVVhfVkFMKENQKEVUS19DTEtfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19DVExfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EM19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EN19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTBfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTFfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTJfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTNfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBFVEtfRDFbNDVdIGFzIE1NMl9SWFJDViBhbmQgTU0yX1RYU0UwIFVTQiBGUy9MUyBIb3N0CisJLy8gKE1vZGUgNSkKKworCU1VWF9WQUwoQ1AoRVRLX0QxNF9FUzIpLAkoSUVOICB8IFBURCB8IERJUyB8IE01KSk7CS8vIE1NMl9SWFJDVgorCU1VWF9WQUwoQ1AoRVRLX0QxNV9FUzIpLAkoSUVOICB8IFBURCB8IERJUyB8IE01KSk7CS8vIE1NMl9UWFNFMAorfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldHVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgSXQgaW5oZXJpdHMgZW50aXJlbHkgZnJvbSB0aGUgZXF1aXZhbGVudCBUSSBPTUFQMyBFVk0KKyAqCWZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUcxXzApCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJRzNfMCkKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc0XzApCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNV8wKQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorI2VuZGlmIC8qICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICovCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWikKKy53b3JkIDE1MCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDE1MCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsIDE1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKQorLndvcmQgMzAwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDYwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICAzLCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiTVBVIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKSAqLworCitpdmFfMzZ4X2RwbGxfcGFyYW06CisvLyAgICAgTSAgIE4gICBGUyBNMgorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxNi44IE1IegorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWikKKy53b3JkIDEwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDEwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgNzEsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaKQorLndvcmQgMTY2LCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMzMyLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgNDE1LCAyMywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTY2LCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgNDE1LCA0NywgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopCisud29yZCAyMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCA0MDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDE3LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiQ29yZSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopICovCisKKy8qCisgKiBGb3IgdGhlIHBlcmlwaGVyYWwgKFBFUikgKGFrYSBEUExMNCkgY2xvY2sgc2V0dGluZ3MsIHRoZXJlIGFyZSBvbmx5CisgKiBlZmZlY3RpdmVseSB0d28gY2xvY2sgY2hvaWNlcywgOTYgTUh6IG9yIDE5MiBNSHouIEhvd2V2ZXIsIHRoZSBvbmx5CisgKiB0aW1lIDE5MiBNSHogaXMgYXB0IHRvIGJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gaXMgaWYgYm90aCBTR1ggYW5kCisgKiBUViBvdXRwdXQgYXJlIHVzZWQuCisgKgorICogICBGb3IgYW55IGdpdmVuIHN5c3RlbSBjbG9jaywgdGhlIGRpdmlkZXJzIGFyZSBjb25maWd1cmVkIHRodXMgKHBlcgorICogICBTZWN0aW9uIDMuNS4zLjMuMy4yICJUeXBlIEIgRFBMTCAoTG93LUppdHRlcikiIG9mIHRoZSBPTUFQMyBUUk0pOgorICoKKyAqICAgICBQRVJbY2xrb3V0XSA9IChTWVNbY2xrb3V0XSAqIE0pIC8gKE4gKyAxKQorICoKKyAqICAgICAgIE0yW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTIgICAgICAgICAgIHVzZWQgYnkgVUFSVCwgTU1DLCBJMkMsIGV0Yy4KKyAqICAgICAgIE0zW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTMgICAgICAgICAgIHVzZWQgYnkgVFYgb3V0LgorICogICAgICAgTTRbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNCAgICAgICAgICAgdXNlZCBieSBEU1MuCisgKiAgICAgICBNNVtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE01ICAgICAgICAgICB1c2VkIGJ5IGNhbWVyYS4KKyAqICAgICAgIE02W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTYgICAgICAgICAgIHVzZWQgYnkgZW11bGF0aW9uLgorICoKKyAqICBTbywgZm9yIGEgMTkuMiBNSHogc3lzdGVtIGNsb2NrIGFuZCB0aGUgc2NhbGFyIGVudHJpZXMgYmVsb3c6CisgKgorICogICAgICAgUEVSW2Nsa291dF0gPSAoMTkuMiAqIDU0MCkgLyAoMTEgKyAxKSA9IDg2NAorICoKKyAqICAgICAgIE0yW2Nsa291dF06IDg2NCAvICA5ID0gIDk2ICAgTUh6CisgKiAgICAgICBNM1tjbGtvdXRdOiA4NjQgLyAxNiA9ICA1NCAgIE1IegorICogICAgICAgTTRbY2xrb3V0XTogODY0IC8gIDUgPSAxNzIuOCBNSHoKKyAqICAgICAgIE01W2Nsa291dF06IDg2NCAvICA0ID0gMjE2ICAgTUh6CisgKiAgICAgICBNNltjbGtvdXRdOiA4NjQgLyAgMyA9IDI4OCAgIE1IegorICovCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBTWVNfQ0xLICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYKKy53b3JkIDEyMDAwLCAgICA0MzIsICAgIDUsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMiAgIE1IegorLndvcmQgMTMwMDAsICAgIDg2NCwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEzICAgTUh6Cisud29yZCAxOTIwMCwgICAgNTQwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTkuMiBNSHoKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAyNiAgIE1IegorLndvcmQgMzg0MDAsICAgIDI3MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDM4LjQgTUh6Cisud29yZCAxNjgwMCwgICAgMzYwLCAgICA2LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTYuOCBNSHoKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uaCBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKKyAqICAgICAgYWNjZXNzaW5nIERpZ2l0YWwgUGhhc2VkIExvY2sgTG9vcCAoRFBMTCkgcGFyYW1ldGVycyBhbmQKKyAqICAgICAgc2V0dGluZ3MuCisgKgorICovCisKKyNpZm5kZWYgX05FU1RfRElBTU9ORF9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKgorICogVHlwZSBEZWZpbml0aW9ucworICovCisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KKworc3RydWN0IGRwbGxfcGFyYW0geworCXUzMiBtOworCXUzMiBuOworCXUzMiBmc2VsOworCXUzMiBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXUzMiBzeXNfY2xrOworCXUzMiBtOworCXUzMiBuOworCXUzMiBtMjsKKwl1MzIgbTM7CisJdTMyIG00OworCXUzMiBtNTsKKwl1MzIgbTY7CisJdTMyIG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisvKgorICogSW5saW5lIEZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gcGxhdGZvcm0uUy4KKyAqLworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcHJjbS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3ByY20uYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IGNsb2NrIHNldC11cCBmb3IgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQKKyAqICAgICAgQ2xvY2sgTWFuYWdlciAoUFJDTSkKKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdTMyIGdldF9vc2NfY2xrX3NwZWVkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQgYmFzZWQgb24KKyAqICAgIGEga25vd24gMzIga0h6IGNsb2NrIGFuZCBnZW5lcmFsIHB1cnBvc2UgdGltZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIGNsb2NrIHNwZWVkLgorICoKKyAqLworc3RhdGljIHUzMgorZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qCisgKiAgdm9pZCBnZXRfc3lzX2Nsa2luX3NlbCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgUFJDTSBQUk0gc3lzdGVtIGNsb2NrCisgKiAgICBmcmVxdWVuY3kgc2VsZWN0b3IsIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIHRvIFBSTV9DTEtTRUwuCisgKgorICogIElucHV0KHMpOgorICogICAgaGVydHogIC0gVGhlIHNwZWVkLCBpbiBNSHosIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBpcyBiZWxpZXZlZAorICogICAgICAgICAgICAgICB0byBiZSBydW5uaW5nIGF0LgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgaW5kZXggdXNlZCB0byBhY2Nlc3MgdGhlCisgKiAgICAgICAgICAgICAgIGRpZ2l0YWwgUExMIHNldHRpbmdzLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBmb3IgdGhlIGRpZ2l0YWwgUExMIHNldHRpbmdzCisgKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjbG9jayByYXRlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorZ2V0X3N5c19jbGtpbl9zZWwodTMyIGhlcnR6LCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJc3dpdGNoIChoZXJ0eikgeworCisJY2FzZSBTMzhfNE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaOworCQlicmVhazsKKworCWNhc2UgUzI2TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTlfMk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE2XzhNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxM006CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEyTToKKwlkZWZhdWx0OgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWjsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogIHZvaWQgcHJjbV9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgY2xvY2tzIGluIGEgYm9hcmQtc3BlY2lmaWMgbWFubmVyIGZvcgorICogICAgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlciAoUFJDTSkgYW5kIGlzCisgKiAgICBjYWxsZWQgb25seSB3aGVuIGFuIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vCisgKiAgICBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgc3lzX2Nsa19yYXRlID0gMCwgc3lzX2Nsa2luX3NlbCwgc3lzX2Nsa19kaXY7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCXN5c19jbGtfcmF0ZSA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwoc3lzX2Nsa19yYXRlLCAmc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBTZXQgdGhlIFBSTV9DTEtTRUxfU1lTX0NMS0lOX1NFTCB2YWx1ZSBpbiB0aGUgcHJvY2Vzc29yLiAqLworCisJc3IzMihQUkNNX1BSTV9DQ1JfQ0xLU0VMLAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJULAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMsCisJCSBzeXNfY2xraW5fc2VsKTsKKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZSBieSB0d28uCisJICoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisKKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYKKwkgICAoc3lzX2Nsa2luX3NlbCA+IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWikpIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMjsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDI7CisKKwl9IGVsc2UgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMTsKKworCX0KKworCXNyMzIoUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUywKKwkJIHN5c19jbGtfZGl2KTsKKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIFgtTG9hZGVyIGxpbmtlciBzY2F0dGVyIGZpbGUgZm9yIHRoZSBOZXN0CisgKiAgICAgIExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICovCisKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0YTkwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBqNDkubyBtdXgubyBwcmNtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikKKworU1JDUyAgICA6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUyAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoU09CSlMpICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoU09CSlMpICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46ICBjbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkOTYwYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjEgQEAKKworCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCisKK1RFWFRfQkFTRSA9IDB4NDAyMDAwMDAKK1NUQUNLX0JBU0UgPSAweDQwMjBGQ0IwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2o0OS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9qNDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA5YmJjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9qNDkuYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQUNVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IG9uIEdQSU8sIFJBTSBhbmQgZmxhc2ggaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgICBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBPTUFQMyBFVk0gZXF1aXZhbGVudCBmaWxlLgorICoKKyAqICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb3JkZXIgaXMgcm91Z2hseToKKyAqCisgKiAgICAgICAgMSkgc19pbml0CisgKiAgICAgICAgMikgYm9hcmRfaW5pdAorICogICAgICAgIDMpIG1pc2NfaW5pdF9yCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUFYX0o0OV9CT09UX0RFVklDRVMgKDMpCisKK3ZvaWQKK3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKSB7CisJZGVsYXkodXNlY3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorZ2V0X2NwdV9pZCh2b2lkKQoreworCXUzMiBjcHVpZCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKworCXJldHVybiAoY3B1aWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitnZXRfY3B1X3Jldih2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCWlmICgoY3B1aWQgICYgMHhmKSA9PSAweDApIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzEpOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzIpOworCisJfQorCit9CisKK3UzMgoraXNfY3B1X2ZhbWlseSh2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKwl1MzIgY3B1X2ZhbWlseSA9IDAsIG9tYXAzNHh4X2lkID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCisJfSBlbHNlIHsKKwkJb21hcDM0eHhfaWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAob21hcDM0eHhfaWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisKKwkJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzRYWDoKKwkJZGVmYXVsdDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQlicmVhazsKKworCQl9CisJfQorCisJcmV0dXJuIChjcHVfZmFtaWx5KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiAgdm9pZCBzcjMyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgY2xlYXJzIGFuZCBzZXRzIGEgdmFsdWUgaW4gYSBiaXQgZXh0ZW50IGZvciBhCisgKiAgICAzMi1iaXQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNsZWFyIGFuZCBzZXQgdGhlIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIDMyLWJpdCB2YWx1ZS4KKyAqICAgIHN0YXJ0X2JpdCAtIFRoZSBmaXJzdCBiaXQgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICBudW1fYml0cyAgLSBUaGUgcmFuZ2Ugb2YgYml0cyBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIHZhbHVlICAgICAtIFRoZSB2YWx1ZSB0byBzZXQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCBiaXQgZXh0ZW50IGNsZWFyZWQgYW5kCisgKiAgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKworCW1zayA9ICgxIDw8IG51bV9iaXRzKTsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qCisgKiAgdTMyIHdhaXRfb25fdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZWFkcyB0aGUgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZAorICogICAgYnVzeSB3YWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIG1hdGNoIHZhbHVlIGlzIHJlYWQgb3IgdW50aWwgdGhlCisgKiAgICBib3VuZGVkIG51bWJlciBvZiBsb29wcyBoYXZlIGJlZW4gcmVhY2hlZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICByZWFkX2JpdF9tYXNrIC0gVGhlIGJpdCBtYXNrIHRvIGFwcGx5IGFmdGVyIHJlYWRpbmcgdGhlIHJlZ2lzdGVyLgorICogICAgbWF0Y2hfdmFsdWUgICAtIFRoZSB2YWx1ZSB0byBtYXRjaCBvbiBhZnRlciByZWFkaW5nIGFuZCBtYXNraW5nLgorICogICAgcmVhZF9hZGRyICAgICAtIFRoZSByZWdpc3RlciBhZGRyZXNzIHRvIHJlYWQuCisgKiAgICBib3VuZCAgICAgICAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHJlYWQgYmVmb3JlIGdpdmluZworICogICAgICAgICAgICAgICAgICAgIHVwLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRydWUgKDEpIGlmIHRoZSBtYXRjaF92YWx1ZSB3YXMgcmVhY2hlZDsgb3RoZXJ3aXNlLCBmYWxzZSAoMCkuCisgKgorICovCit1MzIKK3dhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3RyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJY29uc3QgaW50IHR5cGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworCS8qCisJICogSWYgdGhlIHByb2Nlc3NvciBpcyBhIEdQIGRldmljZSwgdW5sb2NrIHRoZSBkZXZpY2UgU1JBTSBmb3IKKwkgKiBnZW5lcmFsIHVzZS4KKwkgKi8KKworCWlmICh0eXBlID09IENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1ApIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFNEUkMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFNEUkNfUkVWSVNJT04pOworCURVTVBfUkVHTChTRFJDX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKFNEUkNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19DU19DRkcpOworCURVTVBfUkVHTChTRFJDX1NIQVJJTkcpOworCURVTVBfUkVHTChTRFJDX0VSUl9BRERSKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfVFlQRSk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9DVFJMKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfUE9XRVJfUkVHKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzApOworCURVTVBfUkVHTChTRFJDX01SXzApOworCURVTVBfUkVHTChTRFJDX0VNUjJfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzApOworCURVTVBfUkVHTChTRFJDX01DRkdfMSk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMSk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8xKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMSk7Cit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfR1BNQ19ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBHUE1DIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChHUE1DX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChHUE1DX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFFTkFCTEUpOworCURVTVBfUkVHTChHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX0FERFJFU1MpOworCURVTVBfUkVHTChHUE1DX0VSUl9UWVBFICk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHICk7CisJRFVNUF9SRUdMKEdQTUNfU1RBVFVTICk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18xKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMik7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzMpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN180KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNSk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM182KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzYpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN183KTsKKworI2lmIDAKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU180KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU183KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcxKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcyKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9TVEFUVVMpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VDQ19TSVpFX0NPTkZJRyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0MxX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDMl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzNfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M0X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzZfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M3X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzlfUkVTVUxUKTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1NXREFUQSk7CisjZW5kaWYKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX1BSQ01fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgUFJDTSBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woUFJDTV9QUk1fQ0NSX0NMS1NFTCk7CisJRFVNUF9SRUdMKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDNfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ0FNKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NPUkUpOworCURVTVBfUkVHTChDTV9DTEtTRUxfRFNTKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9FTVUpOworfQorI2Vsc2UKKyNkZWZpbmUgb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENGR19QUkNNX0RFQlVHICovCisKKy8qCisgKiAgdm9pZCBjb25maWdfZGlhbW9uZF9zZHJhbSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBwcm9jZXNzb3IncyBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorICogICAgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiAzMiBNYiB4IDE2IGIgKDY0CisgKiAgICBNaUIpIEREUiBTRFJBTSBvbiB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorY29uZmlnX2RpYW1vbmRfc2RyYW0odm9pZCkKK3sKKwl1MzIgdmFsdWUsIGFjdGltX2N0cmxhLCBhY3RpbV9jdHJsYjsKKworCS8qCisJICogU3RlcCAxOiBSZXNldCB0aGUgU0RSQyBjb250cm9sbGVyIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSByZXNldAorCSAqIGV2ZW50IHRvIGNsZWFyLgorCSAqLworCisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9TRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICB3YWl0X29uX3ZhbHVlKFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1RBVFVTLAorCQkJCSAgMTIwMDAwMDApOworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfQ0xFQVIsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qCisJICogU3RlcCAyOiBTZXR1cCB0aGUgcG9zaXRpb24gYW5kIGdlb21ldHJ5IG9mIHRoZSBTRFJBTSBkZXZpY2Ugb24KKwkgKiB0aGUgY29udHJvbGxlcidzIGJ1cy4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfU0hBUklOR19MT0NLX09GRiAJCQkJCQkJCQkJCQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09GRik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1NIQVJJTkcpOworCisJLyoKKwkgKiBTdGVwIDM6IFNldHVwIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIFJBUyB3aWR0aCwKKwkgKiBDQVMgd2lkdGgsIGFkZHJlc3MgbXVsdGlwbGV4aW5nLCBzaXplLCBiYW5rIG1hcHBpbmcsIGJ1cyB3aWR0aCwKKwkgKiBwb3dlciBtb2RlLCBERFIgdHlwZSBhbmQgbWVtb3J5IHR5cGUuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX01DRkdfTE9DS1NUQVRVU19SVwkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19SQVNXSURUSF8xNF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19DQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX0NBU1dJRFRIXzEwX0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRkxFWElCTEUJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQU1TSVpFX0VOQ09ERShDRkdfU0RSQU1fU0laRV9NQikJCQkJCXwKKwkJIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9FTkNPREUoU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX1JfQl9DKXwKKwkJIFNEUkNfTUNGR19CMzJOT1QxNl9PRkYJCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERUVQUERfU1VQUE9SVEVECQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERFJUWVBFX0VOQ09ERShTRFJDX01DRkdfRERSVFlQRV9NT0JJTEVfRERSKQkJCXwKKwkJIFNEUkNfTUNGR19SQU1UWVBFX0VOQ09ERShTRFJDX01DRkdfUkFNVFlQRV9ERFIpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTUNGR18wKTsKKworCS8qCisJICogU3RlcCA0OiBFc3RhYmxpc2ggdGhlIEFDIGZpbmUgdHVuaW5nIHRpbWluZyBjaGFyYWN0ZXJpc3RpY3MuCisJICovCisKKwlhY3RpbV9jdHJsYQorCQk9IChTRFJDX0FDVElNX0NUUkxBX1RSRkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQVNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REQUxfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwpKTsKKworCWFjdGltX2N0cmxiCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUikJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RDS0VfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYU1JfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IpKTsKKworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGIsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKgorCSAqIFN0ZXAgNTogRXN0YWJsaXNoIHRoZSBtZW1vcnkgYXV0b3JlZnJlc2ggY29udHJvbAorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19SRlJfQ1RSTF9BUkNWX0VOQ09ERSgxMjQ0KQkJCQkJCXwKKwkJIFNEUkNfUkZSX0NUUkxfQVJFX0VOQ09ERShTRFJDX1JGUl9DVFJMX0FSRV8xX0FSQ1YpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUkZSX0NUUkxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX1BPV0VSX1JFR19XQUtFVVBfREVMQVlFRAkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfRU5DT0RFKDApCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRU5BQkxFCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0RJU0FCTEUJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfRU5DT0RFKFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTk9ORSkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19QQUdFUE9MSUNZX0hQSEIpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19QT1dFUl9SRUcpOworCisJLyoKKwkgKiBTdGVwIDY6IEVzdGFibGlzaCB0aGUgSkVERUMtZGVmaW5lZCBtb2RlIGFuZCBETEwgcGFyYW1ldGVycy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwlkZWxheSg1MDAwKTsJICAgICAgICAgICAgICAgICAKKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX1BSRUNIQVJHRV9BTEwpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX01SX1pFUk9fMQkJCQkJCQl8CisJCSBTRFJDX01SX1dCU1RfRU5BQkxFCQkJCQl8CisJCSBTRFJDX01SX1pFUk9fMAkJCQkJCQl8CisJCSBTRFJDX01SX0NBU0xfRU5DT0RFKFNEUkNfTVJfQ0FTTF8zKQl8CisJCSBTRFJDX01SX1NJTF9TRVJJQUwJCQkJCQl8CisJCSBTRFJDX01SX0JMX0VOQ09ERShTRFJDX01SX0JMXzQpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTVJfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9FTkNPREUoMCkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9FTkNPREUoMCkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0VOQ09ERShTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfUFdEKSB8IAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisgCWRlbGF5KDB4MjAwMDApOworfQorCisvKgorICogIHZvaWQgc19pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdmVyeSBlYXJseSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gb2YgY2hpcAorICogICAgcGluIG11bHRpcGxleGluZyBhbmQgY2xvY2tzIGFuZCBpcyBjYWxsZWQgd2hlbiBPTkxZIGFuCisgKiAgICBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubyBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisKKwlkZWxheSgxMDApOworCisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfZGlhbW9uZF9zZHJhbSgpOworfQorCisvKgorICogIGludCBib2FyZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGVhcmx5LCBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogICAgZm9sbG93aW5nIGNvcmUgQ1BVIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorYm9hcmRfaW5pdCh2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9kZXZpY2VfdHlwZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqICAgIGRldmljZSBpcyBvZiBUU1QsIEVNVSwgSFMgb3IgR1AgdHlwZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLgorICoKKyAqLwordTMyCitnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9zeXNib290X3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZCwgaW5kaWNhdGluZyB0aGUKKyAqICAgIG9yZGVyIG9mIG1lbW9yeSBpbnRlcmZhY2VzIGZyb20gd2hpY2ggdGhlIHByb2Nlc3NvciB3aWxsIGF0dGVtcHQKKyAqICAgIHRvIGJvb3QgaXRzZWxmLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQuCisgKgorICovCit1MzIKK2dldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisjaWYgMAorCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAweDNmOworI2VuZGlmCit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfSjQ5X0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisJY2FzZSAxNToKKwkJbGlzdFswXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsxXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzJdID0gTU1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWNhc2UgNDc6CisJCWxpc3RbMF0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbGlzdFsxXSA9IE1NQ19OQU5EOworCQlsaXN0WzJdID0gR1BNQ19OQU5EOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIG51bWJlcl9vZl9kZXZpY2VzOworfQorCisvKgorICogIGludCBtaXNjX2luaXRfcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBtaXNjZWxsYW5lb3VzLCBib2FyZC1zcGVjaWZpYworICogICAgaW5pdGlhbGl6YXRpb24gZm9sbG93aW5nIENQVSwgZWFybHkgYm9hcmQsIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIGxvYWRpbmcgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcgorICogICAgdG8gUkFNLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorbWlzY19pbml0X3Iodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogIHZvaWQgZm9vYmFyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3Blcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgaW50CitncG1jX2NvbmZpZ18wKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApCisJLyoKKwkgKiBGaXJzdCwgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGFuZCB3YWl0LgorCSAqLworCV9fcmF3X3dyaXRlbChHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRCwgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5leHQsIHByb2dyYW0gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMV8wLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzJfMCwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUczXzAsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNF8wLCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzVfMCwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc2XzAsIEdQTUNfQ09ORklHNl8wKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBHUE1DIG1hcHBpbmcgYW5kIHNwaW4gZm9yIHRoZSBwYXJhbWV0ZXJzIHRvCisJICogYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlfX3Jhd193cml0ZWwoKENGR19HUE1DX0NPTkZJRzdfMCB8IEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQpLAorCQkJCSBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgyMDAwKTsKKworCWlmIChuYW5kX2NoaXAoKSl7CisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKSAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBpbnQgbmFuZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlcgorICogICAgKEdQTUMpIHN1Y2ggdGhhdCBvbi1ib2FyZCBOQU5EIGRldmljZXMgbWF5IGJlIGFjY2Vzc2VkIGZvcgorICogICAgc2Vjb25kLXN0YWdlIGJvb3QuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBOQU5EIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSwgMS4KKyAqCisgKi8KK2ludAorbmFuZF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKgorCSAqIEVzdGFibGlzaCBHUE1DIGdsb2JhbCBzZXR0aW5ncy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVCwgR1BNQ19TWVNDT05GSUcpOworCisJX19yYXdfd3JpdGVsKEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFLCBHUE1DX0lSUUVOQUJMRSk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19USU1FT1VURU5BQkxFX09GRiwgR1BNQ19USU1FT1VUX0NPTlRST0wpOworCisJaWYgKGdwbWNfY29uZmlnXzAoKSkgeworCQlwdXRzKCJVbnN1cHBvcnRlZCBOQU5EIGRldmljZSBAIEdQTUMwIVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0dXMgPSAwOworCisgZG9uZToKKwkvKiBEdW1wIEdQTUMgYW5kIFNEUkMgcmVnaXN0ZXJzIGlmIHNvIGNvbmZpZ3VyZWQuICovCisKKwlvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqICB2b2lkIGJvYXJkX2hhbmcoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgYm9hcmQtc3BlY2lmaWMgYWN0aW9ucyB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgIGhhbmdzIGJ5IGV4ZWN1dGluZyBoYW5nKCkuIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG87CisgKiAgICBob3dldmVyLCB3ZSBtaWdodCBsYXRlciBkcml2ZSB0aGUgcGllem8gb3IgYSBMRUQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitib2FyZF9oYW5nICh2b2lkKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzdkZjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL211eC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgSS9PIHBhZCBtdWx0aXBsZXhlciBjb25maWd1cmF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB2b2lkIHNldF9tdXhjb25mX3JlZ3MoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZXMgc2V0cyB0aGUgSS9PIHBhZCBtdWx0aXBsZXhlcnMgZm9yIFVBUlQsIEdQTUMsIFNEUkMsCisgKiAgICBHUElPLgorICoKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqLwordm9pZAorc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCS8qCisJICogVGhlIGJpdCBmaWVsZHMgZm9yIHRoZXNlIHNldHRpbmdzIGFyZSBhcyBmb2xsb3dzOgorCSAqCisJICogICBJe0VOLERJU30JIAktIElucHV0IEVuYWJsZS9EaXNhYmxlCisJICogICBQVFtEVV0JCSAJLSBQdWxsLWRvd24sIC11cAorCSAqICAgRElTLEVOCQkgIAktIFB1bGwtZG93biwgLXVwIGRpc2FibGVkL2VuYWJsZWQKKwkgKiAgIE1bMDEyMzQ1NjddCS0gQ29uZmlndXJhdGlvbiBtb2RlIDAtNworCSAqLworCisJLyoKKwkgKiBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorCSAqCisJICogTW9zdCBvZiB0aGUgU0RSQyBzaWduYWxzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBTYW1zdW5nCisJICogSzRYNTExNjNQSS1GQ0c2IDUxMiBNYiB4IDE2LWJpdCAoNjQgTWlCKSBERFIgU0RSQU0uIEJlY2F1c2Ugd2UKKwkgKiBpbnRlcmZhY2UgaW4gMTYtYml0IHJhdGhlciB0aGFuIDMyLWJpdCBtb2RlLCB3ZSBwbGFjZSB0aGUKKwkgKiB1bnVzZWQgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisJICovCisKKwlNVVhfVkFMKENQKFNEUkNfRDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QwCisJTVVYX1ZBTChDUChTRFJDX0QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMQorCU1VWF9WQUwoQ1AoU0RSQ19EMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDIKKwlNVVhfVkFMKENQKFNEUkNfRDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QzCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDUKKwlNVVhfVkFMKENQKFNEUkNfRDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q2CisJTVVYX1ZBTChDUChTRFJDX0Q3KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENworCU1VWF9WQUwoQ1AoU0RSQ19EOCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDgKKwlNVVhfVkFMKENQKFNEUkNfRDkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q5CisJTVVYX1ZBTChDUChTRFJDX0QxMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEwCisJTVVYX1ZBTChDUChTRFJDX0QxMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDExCisJTVVYX1ZBTChDUChTRFJDX0QxMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEyCisJTVVYX1ZBTChDUChTRFJDX0QxMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEzCisJTVVYX1ZBTChDUChTRFJDX0QxNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE0CisJTVVYX1ZBTChDUChTRFJDX0QxNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE1CisKKwkvLyBCZWNhdXNlIHdlIGludGVyZmFjZSBTRFJBTSBpbiAxNi1iaXQgbW9kZSwgcGxhY2UKKwkvLyBTRFJDX0RBVEFbMzE6MTZdIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoU0RSQ19DTEspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0NMSworCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMwCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzEKKworCS8vIFBsYWNlIHVudXNlZCBEUSBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKEdQTUNfQTEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0ExCisJTVVYX1ZBTChDUChHUE1DX0EyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMgorCU1VWF9WQUwoQ1AoR1BNQ19BMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTMKKwlNVVhfVkFMKENQKEdQTUNfQTQpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E0CisJTVVYX1ZBTChDUChHUE1DX0E1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNQorCU1VWF9WQUwoQ1AoR1BNQ19BNiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTYKKwlNVVhfVkFMKENQKEdQTUNfQTcpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E3CisKKwkvLyBQbGFjZSB0aGUgdW51c2VkIEdQTUNfQTggcGluIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfQTkgdG8gR1BJT180MiB1c2VkIGFzIGEgcHVzaC1wdWxsLCBhY3RpdmUgbG93IGlucHV0CisJLy8gZnJvbSB0aGUgVVNCIFBIWSBmb3IgVVNCIHN1c3BlbmQgbm90aWZpY2F0aW9uLgorCisJTVVYX1ZBTChDUChHUE1DX0E5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gR1BJT180MgorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uaCBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjhjMTJkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKyNkZWZpbmUgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKgorICogVHlwZSBEZWZpbml0aW9ucworICovCisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KKworc3RydWN0IGRwbGxfcGFyYW0geworCXUzMiBtOworCXUzMiBuOworCXUzMiBmc2VsOworCXUzMiBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXUzMiBzeXNfY2xrOworCXUzMiBtOworCXUzMiBuOworCXUzMiBtMjsKKwl1MzIgbTM7CisJdTMyIG00OworCXUzMiBtNTsKKwl1MzIgbTY7CisJdTMyIG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisvKgorICogSW5saW5lIEZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gcGxhdGZvcm0uUy4KKyAqLworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTkVTVF9KNDlfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcHJjbS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wcmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNGE5MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBwb3J0aW9ucyBvZiBYLUxvYWRlciBzcGVjaWZpYworIyAgICAgIHRvIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisjCisKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGo0OS5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9jb25maWcubWsKQEAgLTAsMCArMSwyMSBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvajQ5LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9qNDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM0YzUwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvajQ5LmMKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9KNDlfQk9PVF9ERVZJQ0VTICgzKQorCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CSAgICAgICAgICAgICAgICAgCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfCAKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworIAlkZWxheSgweDIwMDAwKTsKK30KKworLyoKKyAqICB2b2lkIHNfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHZlcnkgZWFybHkgc3lzdGVtIGluaXRpYWxpemF0aW9uIG9mIGNoaXAKKyAqICAgIHBpbiBtdWx0aXBsZXhpbmcgYW5kIGNsb2NrcyBhbmQgaXMgY2FsbGVkIHdoZW4gT05MWSBhbgorICogICAgU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8gU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCisJZGVsYXkoMTAwKTsKKworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnX2RpYW1vbmRfc2RyYW0oKTsKK30KKworLyoKKyAqICBpbnQgYm9hcmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBlYXJseSwgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqICAgIGZvbGxvd2luZyBjb3JlIENQVSBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK2JvYXJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIHUzMiBnZXRfZGV2aWNlX3R5cGUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiAgICBkZXZpY2UgaXMgb2YgVFNULCBFTVUsIEhTIG9yIEdQIHR5cGUuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisJY29uc3QgaW50IHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQsIGluZGljYXRpbmcgdGhlCisgKiAgICBvcmRlciBvZiBtZW1vcnkgaW50ZXJmYWNlcyBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzb3Igd2lsbCBhdHRlbXB0CisgKiAgICB0byBib290IGl0c2VsZi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLgorICoKKyAqLwordTMyCitnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworI2lmIDAKKwljb25zdCB1MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisJY29uc3QgdTMyIHBlcmlwaGVyYWxfdHlwZSA9IENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYW5kIGNhbGxlcnMgb2YgaXQgYXJlIGltcGxpY2l0bHkgZXhwZWN0aW5nIHRoZQorCSAqIE1FTU9SWSBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMCkgbm90IHRoZSBQRVJISVBIRVJBTAorCSAqIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAxKSBib290IG9yZGVyLCBzbyBjaGVjayB0aGF0IGlzCisJICogYWN0dWFsbHkgdGhlIGNhc2UuCisJICovCisKKwlpZiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2YWx1ZSkgPT0gcGVyaXBoZXJhbF90eXBlKSB7CisJCWhhbmcoKTsKKwl9CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHZhbHVlKSk7CisjZWxzZQorICAgICAgICByZXR1cm4gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgMHgzZjsKKyNlbmRpZgorfQorCisvKgorICogIGludCBnZXRfYm9vdF9kZXZpY2VfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VfbGlzdCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIGNvbnN0YW50IGxpc3QgaW5kaWNhdGluZyB0aGUgcHJlZmVycmVkCisgKiAgICBkZXZpY2UgYm9vdCBsaXN0LgorICogICAgSXQgZ2V0cyBjYWxsZWQgZnJvbSBzdGFydF9hcm1ib290IGluIGJvYXJkLmMKKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcHJlZmVycmVkIGZpcnN0IHByb2Nlc3NvciBtZW1vcnkgYm9vdCBpbnRlcmZhY2UuCisgKgorICovCisKK2ludAorZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCkKK3sKKwlzdGF0aWMgdTMyIGxpc3RbTUFYX0o0OV9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCWNhc2UgMTU6CisJCWxpc3RbMF0gPSBHUE1DX05BTkQ7CisJCWxpc3RbMV0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbGlzdFsyXSA9IE1NQ19OQU5EOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwljYXNlIDQ3OgorCQlsaXN0WzBdID0gTU1DX05BTkQ7CisJCWxpc3RbMV0gPSBHUE1DX05BTkQ7CisJCWxpc3RbMl0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBudW1iZXJfb2ZfZGV2aWNlczsKK30KKworLyoKKyAqICBpbnQgbWlzY19pbml0X3IoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgbWlzY2VsbGFuZW91cywgYm9hcmQtc3BlY2lmaWMKKyAqICAgIGluaXRpYWxpemF0aW9uIGZvbGxvd2luZyBDUFUsIGVhcmx5IGJvYXJkLCBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBsb2FkaW5nIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIKKyAqICAgIHRvIFJBTS4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK21pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICB2b2lkIGZvb2JhcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lLi4uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworc3RhdGljIGludAorZ3BtY19jb25maWdfMCh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKQorCS8qCisJICogRmlyc3QsIGRpc2FibGUgdGhlIGludGVyZmFjZSBhbmQgd2FpdC4KKwkgKi8KKwlfX3Jhd193cml0ZWwoR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQsIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDEwMDApOworCisJLyoKKwkgKiBOZXh0LCBwcm9ncmFtIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzFfMCwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcyXzAsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHM18wLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzRfMCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc1XzAsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNl8wLCBHUE1DX0NPTkZJRzZfMCk7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgR1BNQyBtYXBwaW5nIGFuZCBzcGluIGZvciB0aGUgcGFyYW1ldGVycyB0bworCSAqIGJlY29tZSBhY3RpdmUuCisJICovCisJX19yYXdfd3JpdGVsKChDRkdfR1BNQ19DT05GSUc3XzAgfCBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVEKSwKKwkJCQkgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMjAwMCk7CisKKwlpZiAobmFuZF9jaGlwKCkpeworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgaW50IG5hbmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIKKyAqICAgIChHUE1DKSBzdWNoIHRoYXQgb24tYm9hcmQgTkFORCBkZXZpY2VzIG1heSBiZSBhY2Nlc3NlZCBmb3IKKyAqICAgIHNlY29uZC1zdGFnZSBib290LgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgTkFORCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkOyBvdGhlcndpc2UsIDEuCisgKgorICovCitpbnQKK25hbmRfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSAxOworCisJLyoKKwkgKiBFc3RhYmxpc2ggR1BNQyBnbG9iYWwgc2V0dGluZ3MuCisJICovCisKKwlfX3Jhd193cml0ZWwoR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQsIEdQTUNfU1lTQ09ORklHKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRSwgR1BNQ19JUlFFTkFCTEUpOworCisJX19yYXdfd3JpdGVsKEdQTUNfVElNRU9VVEVOQUJMRV9PRkYsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKworCWlmIChncG1jX2NvbmZpZ18wKCkpIHsKKwkJcHV0cygiVW5zdXBwb3J0ZWQgTkFORCBkZXZpY2UgQCBHUE1DMCFcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3RhdHVzID0gMDsKKworIGRvbmU6CisJLyogRHVtcCBHUE1DIGFuZCBTRFJDIHJlZ2lzdGVycyBpZiBzbyBjb25maWd1cmVkLiAqLworCisJb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiAgdm9pZCBib2FyZF9oYW5nKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGJvYXJkLXNwZWNpZmljIGFjdGlvbnMgd2hlbiB0aGUgc3lzdGVtCisgKiAgICBoYW5ncyBieSBleGVjdXRpbmcgaGFuZygpLiBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOworICogICAgaG93ZXZlciwgd2UgbWlnaHQgbGF0ZXIgZHJpdmUgdGhlIHBpZXpvIG9yIGEgTEVELgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorYm9hcmRfaGFuZyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9tdXguYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzdkZjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9tdXguYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IEkvTyBwYWQgbXVsdGlwbGV4ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdm9pZCBzZXRfbXV4Y29uZl9yZWdzKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmVzIHNldHMgdGhlIEkvTyBwYWQgbXVsdGlwbGV4ZXJzIGZvciBVQVJULCBHUE1DLCBTRFJDLAorICogICAgR1BJTy4KKyAqCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKi8KK3ZvaWQKK3NldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBiaXQgZmllbGRzIGZvciB0aGVzZSBzZXR0aW5ncyBhcmUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgSXtFTixESVN9CSAJLSBJbnB1dCBFbmFibGUvRGlzYWJsZQorCSAqICAgUFRbRFVdCQkgCS0gUHVsbC1kb3duLCAtdXAKKwkgKiAgIERJUyxFTgkJICAJLSBQdWxsLWRvd24sIC11cCBkaXNhYmxlZC9lbmFibGVkCisJICogICBNWzAxMjM0NTY3XQktIENvbmZpZ3VyYXRpb24gbW9kZSAwLTcKKwkgKi8KKworCS8qCisJICogU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKwkgKgorCSAqIE1vc3Qgb2YgdGhlIFNEUkMgc2lnbmFscyBhcmUgdXNlZCB0byBkcml2ZSB0aGUgU2Ftc3VuZworCSAqIEs0WDUxMTYzUEktRkNHNiA1MTIgTWIgeCAxNi1iaXQgKDY0IE1pQikgRERSIFNEUkFNLiBCZWNhdXNlIHdlCisJICogaW50ZXJmYWNlIGluIDE2LWJpdCByYXRoZXIgdGhhbiAzMi1iaXQgbW9kZSwgd2UgcGxhY2UgdGhlCisJICogdW51c2VkIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCSAqLworCisJTVVYX1ZBTChDUChTRFJDX0QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEKKwlNVVhfVkFMKENQKFNEUkNfRDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QyCisJTVVYX1ZBTChDUChTRFJDX0QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMworCU1VWF9WQUwoQ1AoU0RSQ19ENCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDQKKwlNVVhfVkFMKENQKFNEUkNfRDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q1CisJTVVYX1ZBTChDUChTRFJDX0Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENgorCU1VWF9WQUwoQ1AoU0RSQ19ENyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDcKKwlNVVhfVkFMKENQKFNEUkNfRDgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q4CisJTVVYX1ZBTChDUChTRFJDX0Q5KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOQorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMQorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMgorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMworCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNQorCisJLy8gQmVjYXVzZSB3ZSBpbnRlcmZhY2UgU0RSQU0gaW4gMTYtYml0IG1vZGUsIHBsYWNlCisJLy8gU0RSQ19EQVRBWzMxOjE2XSBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19DTEsKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMxCisKKwkvLyBQbGFjZSB1bnVzZWQgRFEgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChHUE1DX0ExKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMQorCU1VWF9WQUwoQ1AoR1BNQ19BMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTIKKwlNVVhfVkFMKENQKEdQTUNfQTMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EzCisJTVVYX1ZBTChDUChHUE1DX0E0KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTUKKwlNVVhfVkFMKENQKEdQTUNfQTYpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E2CisJTVVYX1ZBTChDUChHUE1DX0E3KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNworCisJLy8gUGxhY2UgdGhlIHVudXNlZCBHUE1DX0E4IHBpbiBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKEdQTUNfQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX0E5IHRvIEdQSU9fNDIgdXNlZCBhcyBhIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBpbnB1dAorCS8vIGZyb20gdGhlIFVTQiBQSFkgZm9yIFVTQiBzdXNwZW5kIG5vdGlmaWNhdGlvbi4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIEdQSU9fNDIKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKEdQTUNfRDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QwCisJTVVYX1ZBTChDUChHUE1DX0QxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMQorCU1VWF9WQUwoQ1AoR1BNQ19EMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDIKKwlNVVhfVkFMKENQKEdQTUNfRDMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QzCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDUKKwlNVVhfVkFMKENQKEdQTUNfRDYpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q2CisJTVVYX1ZBTChDUChHUE1DX0Q3KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENworCU1VWF9WQUwoQ1AoR1BNQ19EOCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDgKKwlNVVhfVkFMKENQKEdQTUNfRDkpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q5CisJTVVYX1ZBTChDUChHUE1DX0QxMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEwCisJTVVYX1ZBTChDUChHUE1DX0QxMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDExCisJTVVYX1ZBTChDUChHUE1DX0QxMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEyCisJTVVYX1ZBTChDUChHUE1DX0QxMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEzCisJTVVYX1ZBTChDUChHUE1DX0QxNCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE0CisJTVVYX1ZBTChDUChHUE1DX0QxNSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE1CisJTVVYX1ZBTChDUChHUE1DX05DUzApLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzAKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MyCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M2IHRvIEdQVDExX1BXTV9FVlQgdXNlZCBhcyBhIHB1c2gtcHVsbCBwdWxzZSB3aWR0aAorCS8vIG1vZHVsYXRlZCAoUFdNKSBzaWduYWwgZm9yIHRoZSBwaWV6by4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTMpKTsJLy8gR1BUMTFfUFdNX0VWVAorCisJLy8gQXNzaWduIEdQTUNfTkNTNyB0byBHUElPXzU4IHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0CisJLy8gUElFWk9fTkVOQUJMRSB0byB0aGUgVEkgU043NExWQzJHMjQwIER1YWwgQnVmZmVyL0RyaXZlciBXaXRoCisJLy8gMy1TdGF0ZSBPdXRwdXRzIGlucHV0cy4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT181OAorCisJTVVYX1ZBTChDUChHUE1DX0NMSyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQ0xLCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25BRFZfQUxFCisJTVVYX1ZBTChDUChHUE1DX05PRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbk9FCisJTVVYX1ZBTChDUChHUE1DX05XRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldFCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25CRTBfQ0xFCisKKwkvLyBBc3NpZ24gR1BNQ19OQkUxIHRvIEdQSU9fNjEgdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQgdG8gdGhlCisJLy8gWmlnQmVlIGFjdGl2ZS1sb3cgcmVzZXQuCisKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjEKKworCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XUAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDAKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQxCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW5hdmFpbGFibGUKKworCS8vIEFzc2lnbiBHUE1DX1dBSVQzIHRvIEdQSU9fNjUgdXNlZCBhcyBhbiBhY3RpdmUtaGlnaCwgcHVzaC1wdWxsCisJLy8gYmFja3BsYXRlIGRldGVjdCBpbnB1dC4KKworCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjUKKworCS8qCisJICogRGlzcGxheSBTdWJzeXN0ZW0gKERTUykKKwkgKgorCSAqIEFsbCBEU1Mgc2lnbmFscyBhcmUgdXNlZCBpbiB0aGVpciBub3JtYWwsIGRlZmF1bHQgbW9kZSAoTW9kZSAwKQorCSAqIHRvIGRyaXZlIHRoZSBTYW1zdW5nIExNUzM1MERGMFsxM10gTENEIGRpc3BsYXkgcGFuZWwuCisJICovCisKKwlNVVhfVkFMKENQKERTU19QQ0xLKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1BDTEsKKwlNVVhfVkFMKENQKERTU19IU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19IU1lOQworCU1VWF9WQUwoQ1AoRFNTX1ZTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1ZTWU5DCisJTVVYX1ZBTChDUChEU1NfQUNCSUFTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0FDQklBUworCU1VWF9WQUwoQ1AoRFNTX0RBVEEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEwCisJTVVYX1ZBTChDUChEU1NfREFUQTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEKKwlNVVhfVkFMKENQKERTU19EQVRBMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEzCisJTVVYX1ZBTChDUChEU1NfREFUQTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTQKKwlNVVhfVkFMKENQKERTU19EQVRBNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE2CisJTVVYX1ZBTChDUChEU1NfREFUQTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTcKKwlNVVhfVkFMKENQKERTU19EQVRBOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE5CisJTVVYX1ZBTChDUChEU1NfREFUQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTEKKwlNVVhfVkFMKENQKERTU19EQVRBMTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEyCisJTVVYX1ZBTChDUChEU1NfREFUQTEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMworCU1VWF9WQUwoQ1AoRFNTX0RBVEExNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTQKKwlNVVhfVkFMKENQKERTU19EQVRBMTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE1CisJTVVYX1ZBTChDUChEU1NfREFUQTE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTcKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE4CisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjAKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIxCisJTVVYX1ZBTChDUChEU1NfREFUQTIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjMKKworCU1VWF9WQUwoQ1AoQ0FNX1dFTiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIC8gVHJhbnNtaXR0ZXIgKFVBUlQpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9UWAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfUlRTCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9DVFMKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlgKKwkvKgorCSAqIENvbnRyb2wgYW5kIERlYnVnCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoU1lTXzMySyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU18zMksKKwlNVVhfVkFMKENQKFNZU19CT09UMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QxCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDIKKwlNVVhfVkFMKENQKFNZU19CT09UMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMworCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q0CisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDUKKwlNVVhfVkFMKENQKFNZU19CT09UNiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNgorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIFNZU19DTEtPVVQxCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19uVFJTVAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RDSworCU1VWF9WQUwoQ1AoSlRBR19UTVMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RNUworCU1VWF9WQUwoQ1AoSlRBR19UREkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RESQorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUwCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTEKKwlNVVhfVkFMKENQKEVUS19DTEtfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19DVExfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EM19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EN19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTBfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTFfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTJfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTNfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBFVEtfRDFbNDVdIGFzIE1NMl9SWFJDViBhbmQgTU0yX1RYU0UwIFVTQiBGUy9MUyBIb3N0CisJLy8gKE1vZGUgNSkKKworCU1VWF9WQUwoQ1AoRVRLX0QxNF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9SWFJDVgorCU1VWF9WQUwoQ1AoRVRLX0QxNV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9UWFNFMAorfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLlMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldHVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgSXQgaW5oZXJpdHMgZW50aXJlbHkgZnJvbSB0aGUgZXF1aXZhbGVudCBUSSBPTUFQMyBFVk0KKyAqCWZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUcxXzApCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJRzNfMCkKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc0XzApCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNV8wKQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorI2VuZGlmIC8qICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICovCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWikKKy53b3JkIDE1MCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDE1MCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsIDE1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKQorLndvcmQgMzAwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDYwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICAzLCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiTVBVIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKSAqLworCitpdmFfMzZ4X2RwbGxfcGFyYW06CisvLyAgICAgTSAgIE4gICBGUyBNMgorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxNi44IE1IegorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWikKKy53b3JkIDEwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDEwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgNzEsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaKQorLndvcmQgMTY2LCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMzMyLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgNDE1LCAyMywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTY2LCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgNDE1LCA0NywgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopCisud29yZCAyMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCA0MDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDE3LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiQ29yZSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopICovCisKKy8qCisgKiBGb3IgdGhlIHBlcmlwaGVyYWwgKFBFUikgKGFrYSBEUExMNCkgY2xvY2sgc2V0dGluZ3MsIHRoZXJlIGFyZSBvbmx5CisgKiBlZmZlY3RpdmVseSB0d28gY2xvY2sgY2hvaWNlcywgOTYgTUh6IG9yIDE5MiBNSHouIEhvd2V2ZXIsIHRoZSBvbmx5CisgKiB0aW1lIDE5MiBNSHogaXMgYXB0IHRvIGJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gaXMgaWYgYm90aCBTR1ggYW5kCisgKiBUViBvdXRwdXQgYXJlIHVzZWQuCisgKgorICogICBGb3IgYW55IGdpdmVuIHN5c3RlbSBjbG9jaywgdGhlIGRpdmlkZXJzIGFyZSBjb25maWd1cmVkIHRodXMgKHBlcgorICogICBTZWN0aW9uIDMuNS4zLjMuMy4yICJUeXBlIEIgRFBMTCAoTG93LUppdHRlcikiIG9mIHRoZSBPTUFQMyBUUk0pOgorICoKKyAqICAgICBQRVJbY2xrb3V0XSA9IChTWVNbY2xrb3V0XSAqIE0pIC8gKE4gKyAxKQorICoKKyAqICAgICAgIE0yW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTIgICAgICAgICAgIHVzZWQgYnkgVUFSVCwgTU1DLCBJMkMsIGV0Yy4KKyAqICAgICAgIE0zW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTMgICAgICAgICAgIHVzZWQgYnkgVFYgb3V0LgorICogICAgICAgTTRbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNCAgICAgICAgICAgdXNlZCBieSBEU1MuCisgKiAgICAgICBNNVtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE01ICAgICAgICAgICB1c2VkIGJ5IGNhbWVyYS4KKyAqICAgICAgIE02W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTYgICAgICAgICAgIHVzZWQgYnkgZW11bGF0aW9uLgorICoKKyAqICBTbywgZm9yIGEgMTkuMiBNSHogc3lzdGVtIGNsb2NrIGFuZCB0aGUgc2NhbGFyIGVudHJpZXMgYmVsb3c6CisgKgorICogICAgICAgUEVSW2Nsa291dF0gPSAoMTkuMiAqIDU0MCkgLyAoMTEgKyAxKSA9IDg2NAorICoKKyAqICAgICAgIE0yW2Nsa291dF06IDg2NCAvICA5ID0gIDk2ICAgTUh6CisgKiAgICAgICBNM1tjbGtvdXRdOiA4NjQgLyAxNiA9ICA1NCAgIE1IegorICogICAgICAgTTRbY2xrb3V0XTogODY0IC8gIDUgPSAxNzIuOCBNSHoKKyAqICAgICAgIE01W2Nsa291dF06IDg2NCAvICA0ID0gMjE2ICAgTUh6CisgKiAgICAgICBNNltjbGtvdXRdOiA4NjQgLyAgMyA9IDI4OCAgIE1IegorICovCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBTWVNfQ0xLICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYKKy53b3JkIDEyMDAwLCAgICA0MzIsICAgIDUsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMiAgIE1IegorLndvcmQgMTMwMDAsICAgIDg2NCwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEzICAgTUh6Cisud29yZCAxOTIwMCwgICAgNTQwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTkuMiBNSHoKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAyNiAgIE1IegorLndvcmQgMzg0MDAsICAgIDI3MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDM4LjQgTUh6Cisud29yZCAxNjgwMCwgICAgMzYwLCAgICA2LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTYuOCBNSHoKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjhjMTJkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKKyAqICAgICAgYWNjZXNzaW5nIERpZ2l0YWwgUGhhc2VkIExvY2sgTG9vcCAoRFBMTCkgcGFyYW1ldGVycyBhbmQKKyAqICAgICAgc2V0dGluZ3MuCisgKgorICovCisKKyNpZm5kZWYgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0o0OV9QTEFURk9STV9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAqIFR5cGUgRGVmaW5pdGlvbnMKKyAqLworCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCisKK3N0cnVjdCBkcGxsX3BhcmFtIHsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgZnNlbDsKKwl1MzIgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1MzIgc3lzX2NsazsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgbTI7CisJdTMyIG0zOworCXUzMiBtNDsKKwl1MzIgbTU7CisJdTMyIG02OworCXUzMiBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworLyoKKyAqIElubGluZSBGdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIHBsYXRmb3JtLlMuCisgKi8KKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX05FU1RfSjQ5X1BMQVRGT1JNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wcmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3ByY20uYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IGNsb2NrIHNldC11cCBmb3IgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQKKyAqICAgICAgQ2xvY2sgTWFuYWdlciAoUFJDTSkKKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdTMyIGdldF9vc2NfY2xrX3NwZWVkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQgYmFzZWQgb24KKyAqICAgIGEga25vd24gMzIga0h6IGNsb2NrIGFuZCBnZW5lcmFsIHB1cnBvc2UgdGltZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIGNsb2NrIHNwZWVkLgorICoKKyAqLworc3RhdGljIHUzMgorZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qCisgKiAgdm9pZCBnZXRfc3lzX2Nsa2luX3NlbCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgUFJDTSBQUk0gc3lzdGVtIGNsb2NrCisgKiAgICBmcmVxdWVuY3kgc2VsZWN0b3IsIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIHRvIFBSTV9DTEtTRUwuCisgKgorICogIElucHV0KHMpOgorICogICAgaGVydHogIC0gVGhlIHNwZWVkLCBpbiBNSHosIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBpcyBiZWxpZXZlZAorICogICAgICAgICAgICAgICB0byBiZSBydW5uaW5nIGF0LgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgaW5kZXggdXNlZCB0byBhY2Nlc3MgdGhlCisgKiAgICAgICAgICAgICAgIGRpZ2l0YWwgUExMIHNldHRpbmdzLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBmb3IgdGhlIGRpZ2l0YWwgUExMIHNldHRpbmdzCisgKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjbG9jayByYXRlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorZ2V0X3N5c19jbGtpbl9zZWwodTMyIGhlcnR6LCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJc3dpdGNoIChoZXJ0eikgeworCisJY2FzZSBTMzhfNE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaOworCQlicmVhazsKKworCWNhc2UgUzI2TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTlfMk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE2XzhNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxM006CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEyTToKKwlkZWZhdWx0OgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWjsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogIHZvaWQgcHJjbV9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgY2xvY2tzIGluIGEgYm9hcmQtc3BlY2lmaWMgbWFubmVyIGZvcgorICogICAgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlciAoUFJDTSkgYW5kIGlzCisgKiAgICBjYWxsZWQgb25seSB3aGVuIGFuIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vCisgKiAgICBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgc3lzX2Nsa19yYXRlID0gMCwgc3lzX2Nsa2luX3NlbCwgc3lzX2Nsa19kaXY7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCXN5c19jbGtfcmF0ZSA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwoc3lzX2Nsa19yYXRlLCAmc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBTZXQgdGhlIFBSTV9DTEtTRUxfU1lTX0NMS0lOX1NFTCB2YWx1ZSBpbiB0aGUgcHJvY2Vzc29yLiAqLworCisJc3IzMihQUkNNX1BSTV9DQ1JfQ0xLU0VMLAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJULAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMsCisJCSBzeXNfY2xraW5fc2VsKTsKKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZSBieSB0d28uCisJICoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisKKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYKKwkgICAoc3lzX2Nsa2luX3NlbCA+IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWikpIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMjsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDI7CisKKwl9IGVsc2UgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMTsKKworCX0KKworCXNyMzIoUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUywKKwkJIHN5c19jbGtfZGl2KTsKKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS94LWxvYWQubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIFgtTG9hZGVyIGxpbmtlciBzY2F0dGVyIGZpbGUgZm9yIHRoZSBOZXN0CisgKiAgICAgIExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICovCisKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAyMGFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAxNzEwaDMubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTNjNzYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL2NvbmZpZy5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwNAorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIEtzaGl0aWogR3VwdGEgPEtzaGl0aWpAdGkuY29tPgorIworIyBUSSBIMyBib2FyZCB3aXRoIE9NQVAxNzEwIChBUk05MjVFSlMpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIElubm92YXRvciBoYXMgMSBiYW5rIG9mIDI1NiBNQiBTRFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyAxMDAwJzAwMDAgdG8gMjAwMCcwMDAwCisjCisjCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCAxMDAwJzgwMDAsIGVudHJ5IDEwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKyMKKyMgd2UgbG9hZCBvdXJzZWxmIHRvIDExMDgnMDAwMAorIworIworCitQTEFURk9STV9MREZMQUdTICs9IC1uby13YXJuLW1pc21hdGNoCitURVhUX0JBU0UgPSAweDExMDgwMDAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NWNmZTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKyNpbmNsdWRlIDwuL2NvbmZpZ3Mvb21hcDE1MTAuaD4KKyNlbmRpZgorICAKKyNkZWZpbmUgQ09NUF9NT0RFX0VOQUJMRSAoKHVuc2lnbmVkIGludCkweDAwMDBFQUVGKQorCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBDRkdfUFJJTlRGIAorCisgIAkvKiBzZXR1cCBmb3IgVUFSVDEgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClGVU5DX01VWF9DVFJMXzApICY9IH4oMHgwMjAwMDAwMCk7CS8qIGJpdCAyNSAqLworICAJLyogYml0IDI5IGZvciBVQVJUMSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KU1PRF9DT05GX0NUUkxfMCkgJj0gfigweDAwMDAyMDAwKTsKKyAgCisJLyogRW5hYmxlIHRoZSBwb3dlciBmb3IgVUFSVDEgKi8KKyNkZWZpbmUgVUFSVDFfNDhNSFpfRU5BQkxFCSgodW5zaWduZWQgc2hvcnQpMHgwMjAwKQorI2RlZmluZSBTV19DTE9DS19SRVFVRVNUCTB4RkZGRTA4MzQKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKVNXX0NMT0NLX1JFUVVFU1QpIHw9IFVBUlQxXzQ4TUhaX0VOQUJMRTsKKworI2VuZGlmCisKKyAJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpQ09NUF9NT0RFX0NUUkxfMCkgPSBDT01QX01PREVfRU5BQkxFOworICAJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgR1BJTzFfRElSRUNUSU9OCQkweEZGRkJFNDM0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfRgkJMHhGRkZFMTA5NAorI2RlZmluZSBQVV9QRF9TRUxfNAkJCTB4RkZGRTEwQzQKKy8qCisgKiBPbiBIMyBib2FyZCwgTmFuZCBSL0IgaXMgdGllZCB0byBHUElPXzEwCisgKiBXZSBzZXR1cCB0aGlzIEdQSU8gcGluIAorICovCitpbnQgbmFuZF9pbml0ICh2b2lkKQoreworICAgCQorIAkvKiBHUElPXzEwIGZvciBpbnB1dC4gaXQgaXMgaW4gR1BJTzEgbW9kdWxlICovCisgCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUdQSU8xX0RJUkVDVElPTikgfD0gMHgwNDAwOyAKKwkKKwkvKiBHUElPMTAgRnVuY19NVVhfQ1RSTCByZWcgYml0IDI5OjI3LCBDb25maWd1cmUgVjIgdG8gbW9kZTEgYXMgR1BJTyAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUZVTkNfTVVYX0NUUkxfRikgJj0gMHhDN0ZGRkZGRjsKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClGVU5DX01VWF9DVFJMX0YpIHw9IDB4MDgwMDAwMDA7CisJICAKKwkvKiBHUElPMTAgcHVsbHVwL2Rvd24gcmVnaXN0ZXIsIEVuYWJsZSBwdWxsdXAgb24gR1BJTzEwICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpUFVfUERfU0VMXzQpIHw9IDB4MDg7CisgCSAKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3t9CisgCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2NGUzZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBLc2hpdGlqIEd1cHRhIDxLc2hpdGlqQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE3MTApCisjaW5jbHVkZSA8Li9jb25maWdzL29tYXAxNTEwLmg+CisjZW5kaWYKKworCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworLmdsb2JsIHBsYXRmb3Jtc2V0dXAKK3BsYXRmb3Jtc2V0dXA6CisKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFNldCB1cCBBUk0gQ0xNIHJlZ2lzdGVycyAoSURMRUNUMSkgICAgICAgICAgICAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsCVJFR19BUk1fSURMRUNUMQorCWxkcglyMSwJVkFMX0FSTV9JRExFQ1QxCisJc3RyCXIxLAlbcjBdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBTZXQgdXAgQVJNIENMTSByZWdpc3RlcnMgKElETEVDVDIpICAJCSAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsCVJFR19BUk1fSURMRUNUMgorCWxkcglyMSwJVkFMX0FSTV9JRExFQ1QyCisJc3RyCXIxLAlbcjBdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBTZXQgdXAgQVJNIENMTSByZWdpc3RlcnMgKElETEVDVDMpCQkgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfQVJNX0lETEVDVDMKKwlsZHIJcjEsCVZBTF9BUk1fSURMRUNUMworCXN0cglyMSwJW3IwXQorCisKKwltb3YJcjEsCSMweDA1CQkvKiBQRVJfRU4gYml0ICovCisJbGRyCXIwLAlSRUdfQVJNX1JTVENUMgorCXN0cmgJcjEsCVtyMF0JCS8qIENMS007IFBlcmlwaGVyYWwgcmVzZXQuICovCisKKwkvKiBTZXQgQ0xLTSB0byBTeW5jLVNjYWxhYmxlCSovCisJLyogSSBzdXBwb3NlZGx5IG5lZWQgdG8gZW5hYmxlIHRoZSBkc3AgY2xvY2sgYmVmb3JlIHN3aXRjaGluZyAqLworCWxkcglyMSwJVkFMX0FSTV9TWVNTVAorCWxkcglyMCwJUkVHX0FSTV9TWVNTVAorCXN0cmgJcjEsCVtyMF0KKwltb3YJcjAsCSMweDQwMAorMToKKwlzdWJzCXIwLAlyMCwJIzB4MQkvKiB3YWl0IGZvciBhbnkgYnViYmxlcyB0byBmaW5pc2ggKi8KKwlibmUJMWIKKwlsZHIJcjEsCVZBTF9BUk1fQ0tDVEwKKwlsZHIJcjAsCVJFR19BUk1fQ0tDVEwKKwlzdHJoCXIxLAlbcjBdCisKKwkvKiBhIGZldyBub3BzIHRvIGxldCBzZXR0bGUgKi8KKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKworCS8qIHNldHVwIERQTEwgMSAqLworCS8qIFJhbXAgdXAgdGhlIGNsb2NrIHRvIDk2TWh6ICovCisJbGRyCXIxLAlWQUxfRFBMTDFfQ1RMCisJbGRyCXIwLAlSRUdfRFBMTDFfQ1RMCisJc3RyaAlyMSwJW3IwXQorCWFuZHMJcjEsCXIxLAkjMHgxMAkvKiBDaGVjayBpZiBQTEwgaXMgZW5hYmxlZC4gKi8KKwliZXEJbG9ja19lbmQJLyogRG8gbm90IGxvb2sgZm9yIGxvY2sgaWYgQllQQVNTIHNlbGVjdGVkICovCisyOgorCWxkcmgJcjEsCVtyMF0KKwlhbmRzCXIxLAlyMSwJIzB4MDEJLyoJQ2hlY2sgdGhlIExPQ0sgYml0LiovCisJYmVxIDJiCQkJLyoJbG9vcCB1bnRpbCBiaXQgZ29lcyBoaS4gKi8KK2xvY2tfZW5kOgorCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBUdXJuIG9mZiB0aGUgd2F0Y2hkb2cgZHVyaW5nIGluaXQuLi4JCQkqCisgCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsCVJFR19XQVRDSERPRworCWxkcglyMSwJV0FUQ0hET0dfVkFMMQorCXN0cglyMSwJW3IwXQorCWxkcglyMSwJV0FUQ0hET0dfVkFMMgorCXN0cglyMSwJW3IwXQorCWxkcglyMCwJUkVHX1dTUFJET0cKKwlsZHIJcjEsCVdTUFJET0dfVkFMMQorCXN0cglyMSwJW3IwXQorCWxkcglyMCwJUkVHX1dXUFNET0cKKword2F0Y2gxV2FpdDoKKwlsZHIJcjEsCVtyMF0KKwl0c3QJcjEsCSMweDEwCisJYm5lCXdhdGNoMVdhaXQKKworCWxkcglyMCwJUkVHX1dTUFJET0cKKwlsZHIJcjEsCVdTUFJET0dfVkFMMgorCXN0cglyMSwJW3IwXQorCWxkcglyMCwJUkVHX1dXUFNET0cKK3dhdGNoMldhaXQ6CisJbGRyCXIxLAlbcjBdCisJdHN0CXIxLAkjMHgxMAorCWJuZQl3YXRjaDJXYWl0CisKKworCS8qIFNldCBtZW1vcnkgdGltaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXcgY2xvY2sgc3BlZWQgKi8KKyAJIAorCS8qCisJKiBEZWxheSBmb3IgU0RSQU0gaW5pdGlhbGl6YXRpb24uCisJKi8KKwltb3YJcjMsCSMweDE4MDAJCS8qIHZhbHVlIHNob3VsZCBiZSBjaGVja2VkICovCiszOgorCXN1YnMJcjMsCXIzLAkjMHgxCS8qIERlY3JlbWVudCBjb3VudCAqLworCWJuZSAJM2IKKworCisJLyoKKwkgKiBTZXQgU0RSQU0gY29udHJvbCB2YWx1ZXMuIERpc2FibGUgcmVmcmVzaCBiZWZvcmUgTVJTIGNvbW1hbmQuCisJICovCisKKwkvKiBtb2JpbGUgZGRyIG9wZXJhdGlvbiAqLworCWxkcglyMCwJUkVHX1NEUkFNX09QRVJBVElPTgorCW1vdglyMiwJIzA3CisJc3RyCXIyLAlbcjBdCisKKwkvKiBjb25maWcgcmVnaXN0ZXIgKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9DT05GSUcKKwlsZHIJcjEsCVNEUkFNX0NPTkZJR19WQUwKKwlzdHIJcjEsCVtyMF0KKworCS8qIG1hbnVhbCBjb21tYW5kIHJlZ2lzdGVyICovCisJbGRyCXIwLAlSRUdfU0RSQU1fTUFOVUFMX0NNRAorCS8qIGlzc3VlIHNldCBja2UgaGlnaCAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9DS0VfU0VUX0hJR0gKKwlzdHIJcjEsCVtyMF0KKwkvKiBpc3N1ZSBub3AgKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fTk9QCisJc3RyCXIxLAlbcjBdCisKKwltb3YJcjIsCSMweDAxMDAKK3dhaXRNRERSMToKKwlzdWJzCXIyLAlyMiwJICMxCisJYm5lCXdhaXRNRERSMQkvKiBkZWxheSBsb29wICovCisKKwkvKiBpc3N1ZSBwcmVjaGFyZ2UgKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fUFJFQ0hBUkdFCisJc3RyCXIxLAlbcjBdCisKKworCS8qIGlzc3VlIGF1dG9yZWZyZXNoIHggMiAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9BVVRPUkVGUkVTSAorCXN0cglyMSwJW3IwXQorCXN0cglyMSwJW3IwXQorCisJLyogbXJzIHJlZ2lzdGVyIGRkciBtb2JpbGUgKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9NUlMKKwltb3YJcjEsCSMweDMzCisJc3RyCXIxLAlbcjBdCisKKwkvKiBlbXJzMSBsb3ctcG93ZXIgcmVnaXN0ZXIgKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9FTVJTMQorCS8qIHNlbGYgcmVmcmVzaCBvbiBhbGwgYmFua3MgKi8KKwltb3YJcjEsCSMwCisJc3RyCXIxLAlbcjBdCisKKwlsZHIJcjAsCVJFR19ETExfVVJEX0NPTlRST0wKKwlsZHIJcjEsCURMTF9VUkRfQ09OVFJPTF9WQUwKKwlzdHIJcjEsCVtyMF0KKworCWxkcglyMCwJUkVHX0RMTF9MUkRfQ09OVFJPTAorCWxkcglyMSwJRExMX0xSRF9DT05UUk9MX1ZBTAorCXN0cglyMSwJW3IwXQorCisJbGRyCXIwLAlSRUdfRExMX1dSVF9DT05UUk9MCisJbGRyCXIxLAlETExfV1JUX0NPTlRST0xfVkFMCisJc3RyCXIxLAlbcjBdCisKKwkvKiBkZWxheSBsb29wICovCisJbW92CXIyLAkjMHgwMTAwCit3YWl0TUREUjI6CisJc3VicwlyMiwJcjIsCSMxCisJYm5lCXdhaXRNRERSMgorCisJLyoKKwkgKiBEZWxheSBmb3IgU0RSQU0gaW5pdGlhbGl6YXRpb24uCisJICovCisJbW92CXIzLAkjMHgxODAwCis0OgorCXN1YnMJcjMsCXIzLAkjMQkvKiBEZWNyZW1lbnQgY291bnQuICovCisJYm5lCTRiCisJYgljb21tb25fdGMKKworc2tpcF9zZHJhbToKKworCWxkcglyMCwJUkVHX1NEUkFNX0NPTkZJRworCWxkcglyMSwJU0RSQU1fQ09ORklHX1ZBTAorCXN0cglyMSwJW3IwXQorCisJLyogRW5hYmxlIEVNSUZGIFRDIERvdWJsZXIgaW4gT01BUDE3MTAgKi8KKwlsZHIJcjAsCVJFR19FTUlGRl9ET1VCTEVSCisJbW92CXIwLAkjMHgxOworCitjb21tb25fdGM6CisJLyogc2xvdyBpbnRlcmZhY2UgKi8KKwlsZHIJcjEsCVZBTF9UQ19FTUlGU19DT05GSUcKKwlsZHIJcjAsCVJFR19UQ19FTUlGU19DT05GSUcKKwlzdHIJcjEsCVtyMF0KKworI2lmZGVmIENGR19CT09UX0NTMAorCS8qIENoaXAgU2VsZWN0IDMgZm9yIE5BTkQqLworCWxkcglyMSwJVkFMX1RDX0VNSUZTX0NTM19DT05GSUcKKwlsZHIJcjAsCVJFR19UQ19FTUlGU19DUzNfQ09ORklHCisJc3RyCXIxLAlbcjBdIAorI2Vsc2UKKwkvKiBDaGlwIFNlbGVjdCAyIGZvciBOQU5EKi8KKwlsZHIJcjEsCVZBTF9UQ19FTUlGU19DUzJfQ09ORklHCisJbGRyCXIwLAlSRUdfVENfRU1JRlNfQ1MyX0NPTkZJRworCXN0cglyMSwJW3IwXSAKKyNlbmRpZgorICAKKyAgICAgICAgLyogU3RhcnQgTVBVIFRpbWVyIDEgKi8KKyAgICAgICAgbGRyICAgICByMCwgICAgIFJFR19NUFVfTE9BRF9USU1FUgorICAgICAgICBsZHIgICAgIHIxLCAgICAgVkFMX01QVV9MT0FEX1RJTUVSCisgICAgICAgIHN0ciAgICAgcjEsICAgICBbcjBdCisKKyAgICAgICAgbGRyICAgICByMCwgICAgIFJFR19NUFVfQ05UTF9USU1FUgorICAgICAgICBsZHIgICAgIHIxLCAgICAgVkFMX01QVV9DTlRMX1RJTUVSCisgICAgICAgIHN0ciAgICAgcjEsICAgICBbcjBdCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKKworUkVHX1RDX0VNSUZTX0NPTkZJRzoJCS8qIDMyIGJpdHMgKi8KKwkud29yZCAweGZmZmVjYzBjCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCitSRUdfVENfRU1JRlNfQ1MzX0NPTkZJRzoJLyogMzIgYml0cyAqLworCS53b3JkIDB4ZmZmZWNjMWMKKyNlbHNlCitSRUdfVENfRU1JRlNfQ1MyX0NPTkZJRzoJLyogMzIgYml0cyAqLworCS53b3JkIDB4ZmZmZWNjMTgKKyNlbmRpZgorIAorLyogTVBVIGNsb2NrL3Jlc2V0L3Bvd2VyIG1vZGUgY29udHJvbCByZWdpc3RlcnMgKi8KK1JFR19BUk1fQ0tDVEw6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMDAKKworUkVHX0FSTV9JRExFQ1QzOgkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMjQKK1JFR19BUk1fSURMRUNUMjoJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTA4CitSRUdfQVJNX0lETEVDVDE6CQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UwNAorCitSRUdfQVJNX1JTVENUMjoJCQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UxNAorUkVHX0FSTV9TWVNTVDoJCQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UxOAorLyogRFBMTCBjb250cm9sIHJlZ2lzdGVycyAqLworUkVHX0RQTEwxX0NUTDoJCQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2YwMAorCisvKiBXYXRjaCBEb2cgcmVnaXN0ZXIgKi8KKy8qIHNlY3VyZSB3YXRjaGRvZyBzdG9wICovCitSRUdfV1NQUkRPRzoKKwkud29yZCAweGZmZmViMDQ4CisvKiB3YXRjaGRvZyB3cml0ZSBwZW5kaW5nICovCitSRUdfV1dQU0RPRzoKKwkud29yZCAweGZmZmViMDM0CisKK1dTUFJET0dfVkFMMToKKwkud29yZCAweDAwMDBhYWFhCitXU1BSRE9HX1ZBTDI6CisJLndvcmQgMHgwMDAwNTU1NQorCisvKiBTRFJBTSBjb25maWcgaXM6IGF1dG8gcmVmcmVzaCBlbmFibGVkLCAxNiBiaXQgNCBiYW5rLAorIGNvdW50ZXIgQDgxOTIgcm93cywgMTAgbnMsIDggYnVyc3QgKi8KK1JFR19TRFJBTV9DT05GSUc6CisJLndvcmQgMHhmZmZlY2MyMAorCisvKiBPcGVyYXRpb24gcmVnaXN0ZXIgKi8KK1JFR19TRFJBTV9PUEVSQVRJT046CisJLndvcmQgMHhmZmZlY2M4MAorCitSRUdfRU1JRkZfRE9VQkxFUjoKKwkud29yZCAweGZmZmVjYzYwCisKKy8qIE1hbnVhbCBjb21tYW5kIHJlZ2lzdGVyICovCitSRUdfU0RSQU1fTUFOVUFMX0NNRDoKKwkud29yZCAweGZmZmVjYzg0CisKKy8qIFNEUkFNIE1SUyAoTmV3KSBjb25maWcgaXM6IENBUyBsYXRlbmN5IGlzIDIsIGJ1cnN0IGxlbmd0aCA4ICovCitSRUdfU0RSQU1fTVJTOgorCS53b3JkIDB4ZmZmZWNjNzAKKworLyogU0RSQU0gTVJTIChOZXcpIGNvbmZpZyBpczogQ0FTIGxhdGVuY3kgaXMgMiwgYnVyc3QgbGVuZ3RoIDggKi8KK1JFR19TRFJBTV9FTVJTMToKKwkud29yZCAweGZmZmVjYzc4CisKKy8qIFdSVCBETEwgcmVnaXN0ZXIgKi8KK1JFR19ETExfV1JUX0NPTlRST0w6CisJLndvcmQgMHhmZmZlY2M2NAorRExMX1dSVF9DT05UUk9MX1ZBTDoKKwkud29yZCAweDAzNTAwMDAyCisKKy8qIFVSRCBETEwgcmVnaXN0ZXIgKi8KK1JFR19ETExfVVJEX0NPTlRST0w6CisJLndvcmQgMHhmZmZlY2NjMAorRExMX1VSRF9DT05UUk9MX1ZBTDoKKwkud29yZCAweDAwMDAwMDA2CisKKy8qIExSRCBETEwgcmVnaXN0ZXIgKi8KK1JFR19ETExfTFJEX0NPTlRST0w6CisJLndvcmQgMHhmZmZlY2NjYworCitSRUdfV0FUQ0hET0c6CisJLndvcmQgMHhmZmZlYzgwOAorCitSRUdfTVBVX0xPQURfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZWM2MDAKK1JFR19NUFVfQ05UTF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZlYzUwMAorCisvKiA5NiBNSHogU2Ftc3VuZyBNb2JpbGUgRERSICovCitTRFJBTV9DT05GSUdfVkFMOgorCS53b3JkIDB4MGMwMjhhZjQKKworRExMX0xSRF9DT05UUk9MX1ZBTDoKKwkud29yZCAweDAwMDAwMDA2CisKK1ZBTF9BUk1fQ0tDVEw6CisJLndvcmQgMHgzNTBlCitWQUxfQVJNX1NZU1NUOgorCS53b3JkIDB4MTAwMQorCitWQUxfRFBMTDFfQ1RMOgorCS53b3JkIDB4MjgxMAorCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCitWQUxfVENfRU1JRlNfQ09ORklHOgorCS53b3JkIDB4MDAwMDAwMTAgCitWQUxfVENfRU1JRlNfQ1MzX0NPTkZJRzoJCisgCS53b3JkIDB4ZmY4MGZmZjMgICAKKyNlbHNlCitWQUxfVENfRU1JRlNfQ09ORklHOgorCS53b3JkIDB4MDAwMDAwMTIgICAvKnN3YXAgQ1MwL0NTMyBhZGRyZXNzaW5nICovCitWQUxfVENfRU1JRlNfQ1MyX0NPTkZJRzoJCisgCS53b3JkIDB4ZmY4MGZmZjMgICAKKyNlbmRpZgorCisgCitWQUxfVENfRU1JRkZfU0RSQU1fQ09ORklHOgorCS53b3JkIDB4MDEwMjkwZmMKK1ZBTF9UQ19FTUlGRl9NUlM6CisJLndvcmQgMHgwMDAwMDAyNworCitWQUxfQVJNX0lETEVDVDE6CisJLndvcmQgMHgwMDAwMTRjNgorCitWQUxfQVJNX0lETEVDVDI6CisJLndvcmQgMHgwMDAwMDlmZgorVkFMX0FSTV9JRExFQ1QzOgorCS53b3JkIDB4MDAwMDAwM2YKKworV0FUQ0hET0dfVkFMMToKKwkud29yZCAweDAwMDAwMGY1CitXQVRDSERPR19WQUwyOgorCS53b3JkIDB4MDAwMDAwYTAKKworVkFMX01QVV9MT0FEX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmZmZmZmCitWQUxfTVBVX0NOVExfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZmZmYTEKKworLyogY29tbWFuZCB2YWx1ZXMgKi8KKy5lcXUgQ01EX1NEUkFNX05PUCwJCTB4MDAwMDAwMDAKKy5lcXUgQ01EX1NEUkFNX1BSRUNIQVJHRSwJMHgwMDAwMDAwMQorLmVxdSBDTURfU0RSQU1fQVVUT1JFRlJFU0gsCTB4MDAwMDAwMDIKKy5lcXUgQ01EX1NEUkFNX0NLRV9TRVRfSElHSCwJMHgwMDAwMDAwNwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODRlZWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworIAkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0NzQyOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMjQyMGg0Lm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzc3MGYzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBUSSBINCBib2FyZCB3aXRoIE9NQVAyNDIwIChBUk0xMTM2KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgNjRNQiBtRERSLVNEUkFNIG9uIENTMAorIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwLzAwMDAgKGJhbmsxKSBFUzIgd2lsbCBiZSBjb25maWd1cmFibGUKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorCisjIEZvciB1c2Ugd2l0aCBleHRlcm5hbCBvciBpbnRlcm5hbCBib290cy4KKyMgQ09ORklHX1BBUlRJQUxfU1JBTSBtdXN0IGJlIGRlZmluZWQgdG8gdXNlIHRoaXMuCitURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgVXNlZCB3aXRoIGZ1bGwgU1JBTSBib290LgorIyBUaGlzIGlzIGVpdGhlciB3aXRoIGEgR1Agc3lzdGVtIG9yIGEgc2lnbmVkIGJvb3QgaW1hZ2UuCisjIGVhc2llc3QsIGFuZCBzYWZlc3Qgd2F5IHRvIGdvIGlmIHlvdSBjYW4uCisjIENvbW1lbnQgb3V0IC8vQ09ORklHX1BBUlRJQUxfU1JBTSBmb3IgdGhpcyBvbmUuCisjCisjVEVYVF9CQVNFID0gMHg0MDI4MDAwMAorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODFiNDkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cy4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQyMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpOworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpOworc3RhdGljIHZvaWQgbXV4U2V0dXBVQVJUMSh2b2lkKTsKK3N0YXRpYyB1MzIgIGdldF9jcHVfcmV2KHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5ICh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIgorCQkJCQkgICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiIChsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDRkdfU0RSQU1fRERSCit2b2lkCitjb25maWdfc2RyYW1fZGRyKHUzMiByZXYpCit7CisJLyogYmFsbCBEMTEsIG1vZGUgMCAqLworCV9fcmF3X3dyaXRlYigweDA4LCAweDQ4MDAwMDMyKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCV9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCX0KKworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxBXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEJfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKworCS8qIAorCSAqIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIKKwkgKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeQorCSAqIFNlcmlhbCBtb2RlCisJICogQ0FTIGxhdGVuY3kgPSAzIAorCSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCBTRFJDX01SXzApOworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCBTRFJDX0RMTEJfQ1RSTCk7CisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJfQorCit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0REUgorCisKKyNpZmRlZiBDRkdfU0RSQU1fQ09NQk8gCit2b2lkCitjb25maWdfc2RyYW1fY29tYm8odTMyIHJldikKK3sKKworCXUzMiBkbGxjdHJsPTA7CisKKyAgICAgICAgLyogYmFsbCBDMTIsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CisgICAgICAgIC8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOworICAgICAgICAvKiBiYWxsIEIxMywgbW9kZSAwIC0gZm9yIENLRTEgKG5vdCBuZWVkZWQgcmt3IGZvciBjb21ibykgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOworCisgICAgICAgIC8qY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0uIElzc3VlIHNvZnQgcmVzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgZGVsYXkoMjAwMDAwKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIFNEUkNUcmlTdGF0ZTogbm8gVHJpcyAqLworICAgICAgICAvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKworICAgICAgICAvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKyAgICAgICAgLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworICAgICAgICAvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IeiwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzEpOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCAweDY4MDA5MGQ0KTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzEpOworCisgICAgICAgIC8qIENTMSBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8xKTsKKworICAgICAgICAvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICAvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisJCWRsbGN0cmwgPSAoQklUMHxCSVQzKTsKKwllbHNlCisJCWRsbGN0cmwgPSBCSVQwOwkJCisKKyAgICAgICAgaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9hZCBjdHIgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2NrIGFuZCBnbyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEFfQ1RSTCk7IC8vIEVTMi54CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLnggPworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExCX0NUUkwpOyAvLyBFUzIueAorICAgICAgICB9Cit9CisKKyNlbmRpZiAvLyBDRkdfU0RSQU1fQ09NQk8KKworI2lmZGVmIENGR19TRFJBTV9TRFIgCit2b2lkCitjb25maWdfc2RyYW1fc2RyKHUzMiByZXYpCit7CisJdTMyIGRsbGN0cmw9MDsKKworCS8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CisKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworCWRlbGF5KDIwMDAwMCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIENoaXAtbGV2ZWwgc2hhcmVkIGludGVyZmFjZSBtYW5hZ2VtZW50ICovCisJLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisJLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJLyogQ1MxTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCWVsc2UKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisJLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisJLyogQ29uZmlndXJlIHRvIE1VWDE0OiAzMk1ieDMyICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NRENGR18wX1NEUiwgU0RSQ19NQ0ZHXzApOyAvKiBkaWZmIGZyb20gY29tYm8gY2FzZSAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworIAorCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSAyIC0gU0RSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTVJfMF9TRFIsIFNEUkNfTVJfMCk7ICAvKiBkaWZmIGZyb20gY29tYm8gY2FzZSAqLworCisJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisgICAgICAgICAgICAgICAgZGxsY3RybCA9IChCSVQwfEJJVDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGxsY3RybCA9IEJJVDA7CisKKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEFfQ1RSTCk7CisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9hZCBjdHIgdmFsdWUgKi8KKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9jayBhbmQgZ28gKi8KKwl9CisJZWxzZSB7CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJfQorICAgCit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX1NEUgorCisjaWZkZWYgQ0ZHX1NEUkFNX1NUQUNLRUQgCit2b2lkCitjb25maWdfc2RyYW1fc3RhY2tlZCh1MzIgcmV2KQoreworCisJLyogUGluIE11eGluZyBmb3IgU0RSQyAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGExKTsJLyogbXV4IG1vZGUgMCAoQ1MxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsJLyogbXV4IG1vZGUgMCAoQ0tFMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CS8qIGNvbm5lY3Qgc2RyY19hMTIgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMSk7CS8qIGNvbm5lY3Qgc2RyY19hMTMgKi8KKworCS8qIGNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsJLyogbm8gaWRsZSBhY2sgYW5kIFJFU0VUIGVuYWJsZSAqLworCWRlbGF5KDIwMDAwMCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSBtb2RlICovCisKKwkvKiBTRFJDX1NIQVJJTkcgKi8KKwkvKiBVLWJvb3QgaXMgd3JpdGluZyAweDAwMDAwMTAwIHRob3VnaCAoSDRfMjQyMF9TRFJDX1NIQVJJTkcgKSAqLworCS8vX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJX19yYXdfd3JpdGVsKDB4MDAwMDQ5MDAsIFNEUkNfU0hBUklORyk7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJLyogTm9uZSBmb3IgRVMyLjEgKi8KKworCS8qICBTRFJDX0NTMSBDb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfQ1NfQ0ZHKTsJLyogUmVtYXAgQ1MxIHRvIDB4ODAwMDAwMDAgKi8KKworCS8qIERpc2FibGUgcG93ZXIgZG93biBvZiBDS0UgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDA4NSwgU0RSQ19QT1dFUik7CisKKwlfX3Jhd193cml0ZWwoMHgwMUEwMjAxOSwgU0RSQ19NQ0ZHXzEpOwkvKiBTRFJDX01DRkcxICovCisJX19yYXdfd3JpdGVsKDB4MDAwM0REMDMsIFNEUkNfUkZSX0NUUkwxKTsJLyogU0RSQ19SRlJfQ1RSTDEgKi8KKwlfX3Jhd193cml0ZWwoMHg5MkREQzQ4NSwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsJLyogU0RSQ19BQ1RJTV9DVFJMQTAgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxNCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsJLyogU0RSQ19BQ1RJTV9DVFJMQjAgKi8KKworCS8qTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMSk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzEpOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzEpOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzEpOworCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIFNEUkNfTVJfMSk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMjAsIFNEUkNfRU1SMl8xKTsJLyogd2Vhay1zdHJlbmd0aCBkcml2ZXIgKi8KKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOworCX0KKwllbHNlIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJfQorfQorI2VuZGlmIC8vIENGR19TRFJBTV9TVEFDS0VECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgc19pbml0KGludCBza2lwKQoreworCXUzMiAgIHJldjsKKworCXJldiA9IGdldF9jcHVfcmV2KCk7CisKKwl3YXRjaGRvZ19pbml0KCk7CisJbXV4U2V0dXBVQVJUMSgpOworCWRlbGF5KDEwMCk7CisKKwkvKkRQTEwgb3V0ID0gMnggRFBMTCAtLT4gY29yZSBjbG9jayAqLworCV9fcmF3X3dyaXRlbChEUExMX09VVCwgQ01fQ0xLU0VMMl9QTEwpOworCisJLypEUExMIGludG8gbG93IHBvd2VyIGJ5cGFzcyAob3RoZXJzIG9mZikgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgQ01fQ0xLRU5fUExMKTsKKworCS8qTVBVIGNvcmUgY2xvY2sgPSBDb3JlIC8yID0gMzAwICovCisJX19yYXdfd3JpdGVsKE1QVV9ESVYsIENNX0NMS1NFTF9NUFUpOworCisJLypEU1BpZj0yMDAsIERTUGlmPTEwMCwgSVZBPTIwMCAqLworCV9fcmF3X3dyaXRlbChEU1BfRElWLCBDTV9DTEtTRUxfRFNQKTsKKworCS8qR0ZYIGNsb2NrIChMMy8yKSA1ME1IeiAqLworCV9fcmF3X3dyaXRlbChHRlhfRElWLCBDTV9DTEtTRUxfR0ZYKTsKKworCS8qTDM9MTAwLCBMND0xMDAsIERpc3BsYXlTUz01MCBWbHluYz05Nk1oeixzc2k9MTAwLCB1c2I9NTAgKi8KKwlfX3Jhd193cml0ZWwoQlVTX0RJViwgQ01fQ0xLU0VMMV9DT1JFKTsKKworCS8qMTJNSHogYXBsbCBzcmMsIDEyLygxKzEpKjUwPTMwMCAqLworCV9fcmF3X3dyaXRlbChEUExMX1ZBTCwgQ01fQ0xLU0VMMV9QTEwpOworCisJLypWYWxpZCB0aGUgY29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBQUkNNX0NMS0NGR19DVFJMKTsKKwlkZWxheSgxMDAwKTsKKworCS8qRW5hYmxlIERQTEw9MzAwLCA5Nk1IeiBBUExMIGxvY2tlZC4gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwRiwgQ01fQ0xLRU5fUExMKTsKKwlkZWxheSgyMDAwMDApOworCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgorCWNvbmZpZ19zZHJhbV9kZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX0NPTUJPKQorCWNvbmZpZ19zZHJhbV9jb21ibyhyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fU0RSKQorCWNvbmZpZ19zZHJhbV9zZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX1NUQUNLRUQpCisJY29uZmlnX3NkcmFtX3N0YWNrZWQocmV2KTsKKyNlbHNlCisjZXJyb3IgU0RSQU0gdHlwZSBub3Qgc3VwcG9ydGVkCisjZW5kaWYJCisKKwlkZWxheSgyMDAwMCk7CisJcGVyaXBoZXJhbF9lbmFibGUoKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisjZGVmaW5lIEdQIChCSVQ4fEJJVDkpCisKKwkvKiBUaGVyZSBhcmUgNCB3YXRjaCBkb2dzLiAgMSBzZWN1cmUsIGFuZCAzIGdlbmVyYWwgcHVycG9zZS4KKwkgKiBJIHdvdWxkIGV4cGVjdCB0aGF0IHRoZSBST00gdGFrZXMgY2FyZSBvZiB0aGUgc2VjdXJlIG9uZSwKKwkgKiBidXQgd2Ugd2lsbCB0cnkgYWxzby4gIE9mIHRoZSAzIEdQIG9uZXMsIDEgY2FuIHJlc2V0IHVzCisJICogZGlyZWN0bHksIHRoZSBvdGhlciAyIG9ubHkgZ2VuZXJhdGUgTVBVIGludGVycnVwdHMuCisJICovCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdEMl9CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDJfQkFTRStXU1BSKTsKKworI2lmIE1QVV9XRF9DTE9DS0VEIC8qIHZhbHVlIDB4MTAgc3RpY2sgb24gYXB0aXgsIEJJVDQgcG9sYXJpdHkgc2VlbXMgb3Bwc2l0ZSovCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdEM19CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QzX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDNfQkFTRStXU1BSKTsKKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDRfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdENF9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0Q0X0JBU0UrV1NQUik7CisjZW5kaWYKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlK1dXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgaWZfY2xrcz0wLCBmdW5jX2Nsa3M9MDsKKworCS8qIEVuYWJsZSBHUDIgdGltZXIuKi8KKwlpZl9jbGtzIHw9IEJJVDQ7CisJZnVuY19jbGtzIHw9IEJJVDQ7CisJdiA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTDJfQ09SRSkgfCAweDQ7CS8qIFN5c19jbGsgaW5wdXQgT01BUDI0MjBfR1BUMiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9DTEtTRUwyX0NPUkUpOworCV9fcmF3X3dyaXRlbCgweDEsIENNX0NMS1NFTF9XS1VQKTsKKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrICovCisJZnVuY19jbGtzIHw9IEJJVDIxOworCWlmX2Nsa3MgfD0gQklUMjE7CisjZW5kaWYKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMV9DT1JFKSB8IGlmX2Nsa3M7CS8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodixDTV9JQ0xLRU4xX0NPUkUgKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMV9DT1JFKSB8IGZ1bmNfY2xrczsgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMV9DT1JFKTsKKwlkZWxheSgxMDAwKTsKKworI2lmbmRlZiBLRVJORUxfVVBEQVRFRAorCXsKKyNkZWZpbmUgVjEgMHhmZmZmZmZmZgorI2RlZmluZSBWMiAweDAwMDAwMDA3CisKKwkJX19yYXdfd3JpdGVsKFYxLCBDTV9GQ0xLRU4xX0NPUkUpOworCQlfX3Jhd193cml0ZWwoVjIsIENNX0ZDTEtFTjJfQ09SRSk7CisJCV9fcmF3X3dyaXRlbChWMSwgQ01fSUNMS0VOMV9DT1JFKTsKKwkJX19yYXdfd3JpdGVsKFYxLCBDTV9JQ0xLRU4yX0NPUkUpOworCX0KKyNlbmRpZgorCit9CisKKy8qIFBpbiBNdXhpbmcgcmVnaXN0ZXJzIHVzZWQgZm9yIFVBUlQxICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9DVFMgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDNSkKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1JUUyAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM2KQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfVFggICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzcpCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9SWCAgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDOCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtdXhTZXR1cFVBUlQxICAob3N0Ym9vdCkKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgdWFydDEgbXV4aW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtdXhTZXR1cFVBUlQxKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKk11eENvbmZpZ1JlZzsKKworCS8qIFVBUlQxX0NUUyBwaW4gY29uZmlndXJhdGlvbiwgUElOID0gRDIxICovCisJTXV4Q29uZmlnUmVnID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilDT05UUk9MX1BBRENPTkZfVUFSVDFfQ1RTOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KKworCS8qIFVBUlQxX1JUUyBwaW4gY29uZmlndXJhdGlvbiwgUElOID0gSDIxICovCisJTXV4Q29uZmlnUmVnID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilDT05UUk9MX1BBRENPTkZfVUFSVDFfUlRTOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KKworCS8qIFVBUlQxX1RYIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBMMjAgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9UWDsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCisKKwkvKiBVQVJUMV9SWCBwaW4gY29uZmlndXJhdGlvbiwgUElOID0gVDIxICovCisJTXV4Q29uZmlnUmVnID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilDT05UUk9MX1BBRENPTkZfVUFSVDFfUlg7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworfQorCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJdTMyCXJldjsKKworCXJldiA9IGdldF9jcHVfcmV2KCk7CisKKworCS8qIEdQTUMgcGluIG11eGluZyAqLyAKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwNzApICY9IDB4MDAwMDAwRkY7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDc0KSAmPSAweDAwMDAwMDAwOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3OCkgJj0gMHgwMDAwMDAwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwN0MpICY9IDB4MDAwMDAwMDA7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDgwKSAmPSAweEZGMDAwMDAwOworCisJLyogR1BNQ19JT19ESVIgKi8KKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwOEMpID0gMHgxOTAwMDAwMDsKKworCS8qIEdQTUMgQ29uZmlndXJhdGlvbiAqLworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTAxMCkgPSAweDAwMDAwMDBBOworCXdoaWxlICgoKCoodm9sYXRpbGUgaW50ICopMHg2ODAwQTAxNCkgJiAweDAwMDAwMDAxKSA9PSAwKTsKKworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA1MCkgPSAweDAwMDAwMDAxOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNjApID0gMHgwMDAwMTgwMDsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDY0KSA9IDB4MDAxNDE0MDA7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2OCkgPSAweDAwMTQxNDAwOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNkMpID0gMHgwRjAxMEYwMTsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDcwKSA9IDB4MDEwQzE0MTQ7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDc0KSA9IDB4MDAwMDBBODA7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDc4KSA9IDB4MDAwMDBDNDQ7IAkvL2Jhc2UgMHgwNDAwMDAwMAorCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEE4KSA9IDB4MDAwMDAwMDA7CisJZGVsYXkoMTAwMCk7CisjaWZkZWYgQ0ZHX1NEUkFNX1NUQUNLRUQKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOTApID0gMHgwMDAxMTAwMDsKKyNlbHNlCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDkwKSA9IDB4MDAwMTEyMDA7CisjZW5kaWYKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOTQpID0gMHgwMDFmMWYwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOTgpID0gMHgwMDA4MDgwMjsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOUMpID0gMHgxQzA5MUMwOTsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwQTApID0gMHgwMzFBMUYxRjsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwQTQpID0gMHgwMDAwMDNDMjsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwQTgpID0gMHgwMDAwMEY0ODsKKworCWlmIChyZXYgIT0gQ1BVXzI0MjBfMjQyMl9FUzEpCisJCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA0MCkgPSAweDFGRjA7CS8vIGVzMi54CisKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworICAgICAgICB1MzIgdjsKKyAgICAgICAgdiA9IF9fcmF3X3JlYWRsKFRBUF9JRENPREVfUkVHKTsKKyAgICAgICAgdiA9IHYgPj4gMjg7CisgICAgICAgIHJldHVybih2KzEpOyAgLyogY3VycmVudGx5IDI0MjIgYW5kIDI0MjAgbWF0Y2ggdXAgKi8KK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3t9CisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMzdlNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MjAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZmRlZiBDT05GSUdfUEFSVElBTF9TUkFNCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovIAorICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IFBSQ01fQ0xLQ0ZHX0NUUkwgLSBhZGRyIG9mIHZhbGlkIHJlZworICogIFIxID0gQ01fQ0xLRU5fUExMIC0gYWRkciBkcGxsIGN0bHIgcmVnCisgKiAgUjIgPSBkcGxsIHZhbHVlCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3ViICAgICBzcCwgc3AsICMweDQgLyogZ2V0IHNvbWUgc3RhY2sgc3BhY2UgKi8KKyAgICAgICAgc3RyICAgICByNCwgW3NwXSAgICAgLyogc2F2ZSByNCdzIHZhbHVlICovCisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI4LCBwbGxfY3RsX2FkZAorICAgICAgICBtb3YgICAgIHI0LCAjMHgyCisgICAgICAgIHN0ciAgICAgcjQsIFtyOF0KKyAgICAgICAgbGRyICAgICByNCwgcGxsX3N0YXQKK2Jsb2NrOgorICAgICAgICBsZHIgICAgIHI4LCBbcjRdCS8qIHdhaXQgZm9yIGJ5cGFzcyB0byB0YWtlIGVmZmVjdCAqLworICAgICAgICBhbmQgICAgIHI4LCByOCwgIzB4MworICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIGJuZSAgICAgYmxvY2sKKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjQsIHBsbF9kaXZfYWRkCisJbGRyICAgICByOCwgcGxsX2Rpdl92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgIAorICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjQsIGNmZzNfMF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGNmZzNfMF92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBjZmc0XzBfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBjZmc0XzBfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgY2ZnMV8wX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQorICAgICAgICBvcnIgICAgIHI4LCByOCwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKworCS8qIHNldHVwIHRvIDJ4IGxvb3AgdGhvdWdoIGNvZGUuICBUaGUgZmlyc3QgbG9vcCBwcmUtbG9hZHMgdGhlIAorICAgICAgICAgKiBpY2FjaGUsIHRoZSAybmQgY29tbWl0cyB0aGUgcHJjbSBjb25maWcsIGFuZCBsb2NrcyB0aGUgZHBsbAorICAgICAgICAgKi8KKyAgICAgICAgbW92ICAgICByNCwgIzB4MTAwMCAgICAgIC8qIHNwaW4gc3BpbiBzcGluICovCisgICAgICAgIG1vdiAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCBwYXNzIGNvbmRpdGlvbiAmIHNldCByZWdpc3RlcnMgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NAorMjoKKyAgICAgICAgbGRybmUgICByOCwgW3IzXSAgICAgICAgIC8qIERQTEwgbG9jayBjaGVjayAqLworICAgICAgICBhbmQgICAgIHI4LCByOCwgIzB4NworICAgICAgICBjbXAgICAgIHI4LCAjMHgyCisgICAgICAgIGJlcSAgICAgNGYKKzM6CisgICAgICAgIHN1YmVxICAgcjgsIHI4LCAjMHgxCisgICAgICAgIHN0cmVxICAgcjgsIFtyMF0gICAgICAgICAvKiBjb21taXQgZGl2aWRlcnMgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMToKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogTG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AxCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIHN0cmVxICAgcjIsIFtyMV0gICAgICAgIC8qIGxvY2sgZHBsbCAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AyOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBsb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDIKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgbGRyZXEgICByOCwgW3IzXSAgICAgICAgIC8qIGdldCBsb2NrIGNvbmRpdGlvbiBmb3IgZHBsbCAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgdGltZSB0aG91Z2g/ICovCisgICAgICAgIGJuZSAgICAgMmIKKyAgICAgICAgbW92ZXEgICByOCwgIzB4MiAgICAgICAgIC8qIHNldCB0byBkcGxsIGNoZWNrIGNvbmRpdGlvbi4gKi8KKyAgICAgICAgYmVxICAgICAzYiAgICAgICAgICAgICAgIC8qIGlmIGNvbmRpdGlvbiBub3QgdHJ1ZSBicmFuY2ggKi8KKzQ6ICAKKyAgICAgICAgbGRyICAgICByNCwgW3NwXQorICAgICAgICBhZGQgICAgIHNwLCBzcCwgIzB4NCAgICAgLyogcmV0dXJuIHN0YWNrIHNwYWNlICovCisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KK2NmZzNfMF9hZGRyOgorICAgIC53b3JkICBHUE1DX0NPTkZJRzNfMAorY2ZnM18wX3ZhbDogCisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzMKK2NmZzRfMF9hZGRyOgorICAgIC53b3JkICBHUE1DX0NPTkZJRzRfMAorY2ZnNF8wX3ZhbDoKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHNAorY2ZnMV8wX2FkZHI6CisgICAgLndvcmQgIEdQTUNfQ09ORklHMV8wCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9zdGF0OgorICAgIC53b3JkIENNX0lETEVTVF9DS0dFTgorcGxsX2Rpdl9hZGQ6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X3ZhbDoKKyAgICAud29yZCBEUExMX1ZBTAkvKiBEUExMIHNldHRpbmcgKDMwME1IeiBkZWZhdWx0KSAqLworI2VuZGlmICAgICAgICAgICAgCisKKy5nbG9ibCBwbGF0Zm9ybXNldHVwCitwbGF0Zm9ybXNldHVwOgorCW1vdiByMywgcjAgICAgIC8qIHNhdmUgc2tpcCBpbmZvcm1hdGlvbiAqLworI2lmZGVmIENPTkZJR19BUFRJWAorCWxkcglyMCwJUkVHX1NEUkNfTUNGR18wCisJbGRyCXIxLAlWQUxfU0RSQ19NQ0ZHXzAKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19TRFJDX01SXzAKKwlsZHIJcjEsCVZBTF9TRFJDX01SXzAKKwlzdHIJcjEsCVtyMF0KKwkvKiBhIGRkciBuZWVkcyBlbXIxIHNldCBoZXJlICovCisJbGRyCXIwLAlSRUdfU0RSQ19TSEFSSU5HCisJbGRyCXIxLAlWQUxfU0RSQ19TSEFSSU5HCisJc3RyCXIxLAlbcjBdCisgICAgICAgCWxkcglyMCwJUkVHX1NEUkNfUkZSX0NUUkxfMAorCWxkcglyMSwJVkFMX1NEUkNfUkZSX0NUUkxfMAorCXN0cglyMSwJW3IwXQorCisgICAgICAgLyogbGl0dGxlIGRlbGF5IGFmdGVyIGluaXQgKi8KKyAgICAgICBtb3YgcjIsICMweDE4MDAgICAgICAgICAgICAgICAgICAgICAgICAKKzE6ICAgICAgIAorICAgICAgICBzdWJzIHIyLCByMiwgIzB4MQorICAgICAgICBibmUgMWIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQVJUSUFMX1NSQU0KKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBtb3YgICAgIHIwLCAgICAgcjMgICAgICAvKiBwYXNzIHNraXAgaW5mbyB0byBzX2luaXQgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKyNlbmRpZgorCisJLyogbWFwIGludGVycnVwdCBjb250cm9sbGVyICovCisJbGRyCXIwLAlWQUxfSU5USF9TRVRVUAorCW1jcglwMTUsIDAsIHIwLCBjMTUsIGMyLCA0CisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworVkFMX0lOVEhfU0VUVVA6CisJLndvcmQgUEVSSUZFUkFMX1BPUlRfQkFTRQorU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKworCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjRjYTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEphbnVhcnkgMjAwNCAtIENoYW5nZWQgdG8gc3VwcG9ydCBINCBkZXZpY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtMTEzNi9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM5NDFkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMjQzMHNkcC5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM1MDc4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgVEkgSDQgYm9hcmQgd2l0aCBPTUFQMjQyMCAoQVJNMTEzNikgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDY0TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMC8wMDAwIChiYW5rMSkgRVMyIHdpbGwgYmUgY29uZmlndXJhYmxlCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCA4MDAwJzgwMDAsIGVudHJ5IDgwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKworIyAyNDMwIGg0IGhhcyBzYW1lIG1lbSBjb25maWd1cmF0aW9uIGFzIGg0LgorCisjIEZvciB1c2Ugd2l0aCBleHRlcm5hbCBvciBpbnRlcm5hbCBib290cy4KKyMgQ09ORklHX1BBUlRJQUxfU1JBTSBtdXN0IGJlIGRlZmluZWQgdG8gdXNlIHRoaXMuCitURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgVXNlZCB3aXRoIGZ1bGwgU1JBTSBib290LgorIyBUaGlzIGlzIGVpdGhlciB3aXRoIGEgR1Agc3lzdGVtIG9yIGEgc2lnbmVkIGJvb3QgaW1hZ2UuCisjIGVhc2llc3QsIGFuZCBzYWZlc3Qgd2F5IHRvIGdvIGlmIHlvdSBjYW4uCisjIENvbW1lbnQgb3V0IC8vQ09ORklHX1BBUlRJQUxfU1JBTSBmb3IgdGhpcyBvbmUuCisjCisjVEVYVF9CQVNFID0gMHg0MDI4MDAwMAorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvb21hcDI0MzBzZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE3YjQyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvb21hcDI0MzBzZHAuYwpAQCAtMCwwICsxLDc0NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MzAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSk7CitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCk7CitzdGF0aWMgdm9pZCBtdXhTZXR1cEFsbCh2b2lkKTsKK3N0YXRpYyB1MzIgIGdldF9jcHVfcmV2KHZvaWQpOworc3RhdGljIHUzMiAgZ2V0X2RldmljZV90eXBlKHZvaWQpOworc3RhdGljIHZvaWQgcHJjbV9pbml0KHZvaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5ICh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIgorCQkJCQkgICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiIChsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKyAgICAgICAgdTMyIHY7CisgICAgICAgIHYgPSBfX3Jhd19yZWFkbChUQVBfSURDT0RFX1JFRyk7CisgICAgICAgIHYgPSB2ID4+IDI4OworICAgICAgICByZXR1cm4odisxKTsgIC8qIGN1cnJlbnRseSAyNDIyIGFuZCAyNDIwIG1hdGNoIHVwICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEhlbHBlciBmdW5jdGlvbiB0byB3YWl0IGZvciB0aGUgc3RhdHVzIG9mIGEgcmVnaXN0ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworICAgICAgICB1MzIgaSA9IDAsIHZhbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICB2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgIGlmIChpPT1ib3VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZSBvZiBtZW1vcnkgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENGR19TRFJBTV9ERFIKK3ZvaWQKK2NvbmZpZ19zZHJhbV9kZHIodTMyIHJldikKK3sKKwkvKiBiYWxsIEQxMSwgbW9kZSAwICovCisJX19yYXdfd3JpdGViKDB4MDgsIDB4NDgwMDAwMzIpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQV8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxCXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisKKwkvKiAKKwkgKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyCisJICogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkKKwkgKiBTZXJpYWwgbW9kZQorCSAqIENBUyBsYXRlbmN5ID0gMyAKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgU0RSQ19NUl8wKTsKKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKworfQorI2VuZGlmIC8vIENGR19TRFJBTV9ERFIKKworI2lmZGVmIENGR19TRFJBTV9DT01CTyAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9jb21ibyh1MzIgcmV2KQoreworCisJdTMyIGRsbGN0cmw9MDsKKworICAgICAgICAvKiBiYWxsIEMxMiwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGExKTsKKyAgICAgICAgLyogYmFsbCBEMTEsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CisgICAgICAgIC8qIGJhbGwgQjEzLCBtb2RlIDAgLSBmb3IgQ0tFMSAobm90IG5lZWRlZCBya3cgZm9yIGNvbWJvKSAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CisKKyAgICAgICAgLypjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbS4gSXNzdWUgc29mdCByZXNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7IC8qIHdhaXQgdGlsbCByZXNldCBkb25lIHNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19TWVNDT05GSUcpOworCisgICAgICAgIC8qIFNEUkNUcmlTdGF0ZTogbm8gVHJpcyAqLworICAgICAgICAvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKQorCSAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCWVsc2UKKyAgICAgICAJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCisgICAgICAgIC8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwkKKwkvKiBUaGlzIGlzIHJlcWQgb25seSBmb3IgRVMxICovCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisgICAgICAgIAlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworICAgICAgICAvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisgICAgICAgIC8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6LCBTRFJDX0FDVElNX0NUUkxBXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJLyogVGhpcyBpcyByZXFkIG9ubHkgZm9yIEVTMSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorICAgICAgICAJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIDB4NjgwMDkwZDQpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCAweDY4MDA5MGQ4KTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIDB4NjgwMDkwZDgpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCAweDY4MDA5MGQ4KTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgMHg2ODAwOTBkOCk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCAweDY4MDA5MGI0KTsKKworICAgICAgICAvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICAvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisKKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKwkJZGxsY3RybCA9IChCSVQwfEJJVDMpOworCWVsc2UKKwkJZGxsY3RybCA9IEJJVDA7CQkKKworICAgICAgICBpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2FkIGN0ciB2YWx1ZSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvY2sgYW5kIGdvICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgLy8gX19yYXdfd3JpdGVsKDB4MDAwMDk4MDgsIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54ID8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIC8vX19yYXdfd3JpdGVsKDB4MDAwMDk4MDgsIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICB9Cit9CisKKyNlbmRpZiAvLyBDRkdfU0RSQU1fQ09NQk8KKworI2lmZGVmIENGR18yNDMwU0RSQU1fRERSCit2b2lkCitjb25maWdfMjQzMHNkcmFtX2Rkcih1MzIgcmV2KQoreworCXUzMiBkbGxzdGF0LCBkbGxjdHJsOworCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgIHdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsgLyogd2FpdCB0aWxsIHJlc2V0IGRvbmUgc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBDaGlwLWxldmVsIHNoYXJlZCBpbnRlcmZhY2UgbWFuYWdlbWVudCAqLworCS8qIFNEUkNUcmlTdGF0ZTogbm8gVHJpcyAqLworCS8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCS8qIENTMU11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworCS8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworCS8qIENvbmZpZ3VyZSB0byBNVVgxNDogMzJNYngzMiAqLworCV9fcmF3X3dyaXRlbChTRFBfMjQzMF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJX19yYXdfd3JpdGVsKFNEUF8yNDMwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gMiAtIFNEUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogU2V0IHVwIFNEUkMgRExMIHZhbHVlcyBmb3IgMjQzMCBERFIgKi8KKwlkbGxjdHJsID0gKFNEUF8yNDMwX1NEUkNfRExMQUJfQ1RSTCAmIH5CSVQyKTsgLyogc2V0IHRhcmdldCBjdHJsIHZhbCAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEFfQ1RSTCk7CS8qIHNldCBsb2NrIG1vZGUgKi8KKwlfX3Jhd193cml0ZWwoZGxsY3RybCwgU0RSQ19ETExCX0NUUkwpOwkvKiBzZXQgbG9jayBtb2RlICovCisJZGVsYXkoMHgxMDAwKTsgLyogdGltZSB0byB0cmFjayB0byBjZW50ZXIgKi8JCisJZGxsc3RhdCA9IF9fcmF3X3JlYWRsKFNEUkNfRExMQV9TVEFUVVMpICYgMHhGRjAwOyAvKiBnZXQgc3RhdHVzICovCisJZGxsY3RybCA9IChkbGxjdHJsICYgMHgwMEZGKSB8IGRsbHN0YXQgfCBCSVQyOyAvKiBidWlsZCB1bmxvY2sgdmFsdWUgKi8KKwlfX3Jhd193cml0ZWwoZGxsY3RybCwgU0RSQ19ETExBX0NUUkwpOwkvKiBzZXQgdW5sb2NrIG1vZGUgKi8KKwlfX3Jhd193cml0ZWwoZGxsY3RybCwgU0RSQ19ETExCX0NUUkwpOwkvKiBzZXQgdW5sb2NrIG1vZGUgKi8KK30KKyNlbmRpZiAvLyBDRkdfMjQzMFNEUkFNX0REUgorCisjaWZkZWYgQ0ZHX1NEUkFNX1NUQUNLRUQgCit2b2lkCitjb25maWdfc2RyYW1fc3RhY2tlZCh1MzIgcmV2KQoreworCisJLyogUGluIE11eGluZyBmb3IgU0RSQyAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGExKTsJLyogbXV4IG1vZGUgMCAoQ1MxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsJLyogbXV4IG1vZGUgMCAoQ0tFMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CS8qIGNvbm5lY3Qgc2RyY19hMTIgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMSk7CS8qIGNvbm5lY3Qgc2RyY19hMTMgKi8KKworCS8qIGNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsJLyogbm8gaWRsZSBhY2sgYW5kIFJFU0VUIGVuYWJsZSAqLworCWRlbGF5KDIwMDAwMCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTAsIFNEUkNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSBtb2RlICovCisKKwkvKiBTRFJDX1NIQVJJTkcgKi8KKwkvKiBVLWJvb3QgaXMgd3JpdGluZyAweDAwMDAwMTAwIHRob3VnaCAoSDRfMjQyMF9TRFJDX1NIQVJJTkcgKSAqLworCS8vX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJX19yYXdfd3JpdGVsKDB4MDAwMDQ5MDAsIFNEUkNfU0hBUklORyk7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJLyogTm9uZSBmb3IgRVMyLjEgKi8KKworCS8qICBTRFJDX0NTMSBDb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfQ1NfQ0ZHKTsJLyogUmVtYXAgQ1MxIHRvIDB4ODAwMDAwMDAgKi8KKworCS8qIERpc2FibGUgcG93ZXIgZG93biBvZiBDS0UgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDA4NSwgU0RSQ19QT1dFUik7CisKKwlfX3Jhd193cml0ZWwoMHgwMUEwMjAxOSwgU0RSQ19NQ0ZHXzEpOwkvKiBTRFJDX01DRkcxICovCisJX19yYXdfd3JpdGVsKDB4MDAwM0REMDMsIFNEUkNfUkZSX0NUUkwxKTsJLyogU0RSQ19SRlJfQ1RSTDEgKi8KKwlfX3Jhd193cml0ZWwoMHg5MkREQzQ4NSwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsJLyogU0RSQ19BQ1RJTV9DVFJMQTAgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxNCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsJLyogU0RSQ19BQ1RJTV9DVFJMQjAgKi8KKworCS8qTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgMHg2ODAwOTBEOCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIDB4NjgwMDkwRDgpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCAweDY4MDA5MEQ4KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgMHg2ODAwOTBEOCk7CisKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgMHg2ODAwOTBCNCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMjAsIDB4NjgwMDkwQkMpOwkvKiB3ZWFrLXN0cmVuZ3RoIGRyaXZlciAqLworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7CisJfQorCWVsc2UgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9Cit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX1NUQUNLRUQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh1MzIgKnNoaWZ0KQoreworI2RlZmluZSBHUFRfRU4gICgoMDw8Mil8QklUMXxCSVQwKSAgICAgIC8qIGVuYWJsZSBzeXNfY2xrIE5PLXByZXNjYWxlIC8xICovCisjZGVmaW5lIEdQVF9DVFIgT01BUDI0WFhfR1BUMitUQ1JSICAgICAgLyogcmVhZCBjb3VudGVyIGFkZHJlc3MgKi8KKyAgICAgICAgdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisJdW5zaWduZWQgaW50IHYsIGlmX2Nsa3M9MCwgZnVuY19jbGtzPTAgOworCisKKworICAgICAgICBpZihfX3Jhd19yZWFkbChQUkNNX0NMS1NSQ19DVFJMKSAmIEJJVDcpeyAgICAvKiBpZiBjdXJyZW50bHkgLzIgKi8KKyAgICAgICAgICAgICAgICAqc2hpZnQgPSAxOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAqc2hpZnQgPSAwOworICAgICAgICB9CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMMl9DT1JFKSB8IDB4NDsgICAgICAvKiBtYXNrIGZvciBzeXNfY2xrIHVzZSAqLworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTDJfQ09SRSk7ICAgICAgICAgICAgLyogdGltZXIyIHNvdXJjZSB0byBzeXNfY2xrICovCisJX19yYXdfd3JpdGVsKEJJVDQsIENNX0lDTEtFTjFfQ09SRSk7ICAgICAgICAgICAvKiB0aW1lcjIgaW50ZXJmYWNlIGNsb2NrIG9uICovCisJX19yYXdfd3JpdGVsKEJJVDQsIENNX0ZDTEtFTjFfQ09SRSk7ICAgICAgICAgICAvKiB0aW1lcjIgZnVuY3Rpb24gY2xvY2sgb24gKi8KKwkvKiBFbmFibGUgR1AyIHRpbWVyLiovCisJaWZfY2xrcyB8PSBCSVQ0OworCWZ1bmNfY2xrcyB8PSBCSVQ0OworCXYgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU4xX0NPUkUpIHwgaWZfY2xrczsJLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LENNX0lDTEtFTjFfQ09SRSApOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4xX0NPUkUpIHwgZnVuY19jbGtzOyAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4xX0NPUkUpOworICAgICAgICBfX3Jhd193cml0ZWwoMCwgT01BUDI0WFhfR1BUMitUTERSKTsgICAgICAgICAgIC8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDI0WFhfR1BUMitUQ0xSKTsgICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKyAgICAgICAgLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLyAgICAgICAgICAgICAgICAgICAgICAvKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworICAgICAgICAvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworICAgICAgICBzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7ICAgICAgICAgICAgIC8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzKi8KKyAgICAgICAgd2hpbGUoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7ICAgICAgICAgICAvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisgICAgICAgIGNzdGFydCA9IF9fcmF3X3JlYWRsKEdQVF9DVFIpOyAgICAgICAgICAgICAgICAgLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKyAgICAgICAgd2hpbGUoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQrMjApKTsgICAgICAvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKyAgICAgICAgY2VuZCA9IF9fcmF3X3JlYWRsKEdQVF9DVFIpOyAgICAgICAgICAgICAgICAgICAvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKyAgICAgICAgY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworICAgICAgICAvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisgICAgICAgIGlmKGNkaWZmID4gKDE5MDAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMzOF80TSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDE1MjAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMyNk0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICgxMzAwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMjRNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoOTAwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMTlfMk0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICg3NjAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMxM00pOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oIChjb25maWcgSUkgZGVmYXVsdCkuCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitwcmNtX2luaXQoKQoreworCXUzMiBkaXYsIHNwZWVkLCB2YWwsIGRpdl9ieV8yOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJDTV9DTEtTUkNfQ1RSTCkgJiB+KEJJVDEgfCBCSVQwKTsKKyNpZiBkZWZpbmVkKE9NQVAyNDMwX1NRVUFSRV9DTE9DS19JTlBVVCkKKwlfX3Jhd193cml0ZWwodmFsLCBQUkNNX0NMS1NSQ19DVFJMKTsKKyNlbHNlCisJX19yYXdfd3JpdGVsKCh2YWwgfCBCSVQwKSwgUFJDTV9DTEtTUkNfQ1RSTCk7CisjZW5kaWYKKwlzcGVlZCA9IGdldF9vc2NfY2xrX3NwZWVkKCZkaXZfYnlfMik7CisgICAgICAgIGlmKChzcGVlZCA+IFMxOV8yTSkgJiYgKCFkaXZfYnlfMikpeyAvKiBpZiBmYXN0ICYmIC8yIG9mZiwgZW5hYmxlIGl0ICovCisgICAgICAgICAgICAgICAgdmFsID0gfihCSVQ2fEJJVDcpICYgX19yYXdfcmVhZGwoUFJDTV9DTEtTUkNfQ1RSTCk7CisgICAgICAgICAgICAgICAgdmFsIHw9ICgweDIgPDwgNik7IC8qIGRpdmlkZSBieSAyIGlmICgyNCwyNiwzOC40KSAtPiAoMTIvMTMvMTkuMikgICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKHZhbCwgUFJDTV9DTEtTUkNfQ1RSTCk7CisgICAgICAgIH0KKworCV9fcmF3X3dyaXRlbCgwLCBDTV9GQ0xLRU4xX0NPUkUpOwkvKiBzdG9wIGFsbCBjbG9ja3MgdG8gcmVkdWNlIHJpbmdpbmcgKi8KKwlfX3Jhd193cml0ZWwoMCwgQ01fRkNMS0VOMl9DT1JFKTsJLyogbWF5IG5vdCBiZSBuZWNlc3NhcnkgKi8KKwlfX3Jhd193cml0ZWwoMCwgQ01fSUNMS0VOMV9DT1JFKTsKKwlfX3Jhd193cml0ZWwoMCwgQ01fSUNMS0VOMl9DT1JFKTsKKworCS8qRFBMTCBpbnRvIGxvdyBwb3dlciBieXBhc3MgKG90aGVycyBvZmYpICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIENNX0NMS0VOX1BMTCk7CisKKwlfX3Jhd193cml0ZWwoRFBMTF9PVVQsIENNX0NMS1NFTDJfUExMKTsgLyogc2V0IERQTEwgb3V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbChNUFVfRElWLCBDTV9DTEtTRUxfTVBVKTsgICAvKiBzZXQgTVBVIGRpdmlkZXIgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKERTUF9ESVYsIENNX0NMS1NFTF9EU1ApOyAgIC8qIHNldCBkc3AgYW5kIGl2YSBkaXZpZGVycyAqLworICAgICAgICBfX3Jhd193cml0ZWwoR0ZYX0RJViwgQ01fQ0xLU0VMX0dGWCk7ICAgLyogc2V0IGdmeCBkaXZpZGVycyAqLworICAgICAgICBfX3Jhd193cml0ZWwoTURNX0RJViwgQ01fQ0xLU0VMX01ETSk7ICAgLyogc2V0IG1kbSBkaXZpZGVycyAqLworCisJZGl2ID0gQlVTX0RJVjsKKwlfX3Jhd193cml0ZWwoZGl2LCBDTV9DTEtTRUwxX0NPUkUpOy8qIHNldCBMMy9MNC9VU0IvRGlzcGxheS9TU2kgZGl2aWRlcnMgKi8KKwlkZWxheSgxMDAwKTsKKworCS8qMTNNSHogYXBsbCBzcmMsIFBSQ00gJ3gnIERQTEwgcmF0ZSAqLworCV9fcmF3X3dyaXRlbChEUExMX1ZBTCwgQ01fQ0xLU0VMMV9QTEwpOworCisJLypWYWxpZCB0aGUgY29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBQUkNNX0NMS0NGR19DVFJMKTsKKwlkZWxheSgxMDAwKTsKKworCS8qIHNldCB1cCBBUExMU19DTEtJTiBwZXIgY3J5c3RhbCAqLworCWlmIChzcGVlZCA+IFMxOV8yTSkKKyAgICAgICAgICAgICAgICBzcGVlZCA+Pj0gMTsgICAgLyogaWYgZmFzdCBzaGlmdCB0byAvMiByYW5nZSAqLworICAgICAgICB2YWwgPSAoMHgyIDw8IDIzKTsgICAgICAvKiBkZWZhdWx0IHRvIDEzTWh6IGZvciAyNDMwYyAqLworICAgICAgICBpZiAoc3BlZWQgPT0gUzEyTSkKKyAgICAgICAgICAgICAgICB2YWwgPSAoMHgzIDw8IDIzKTsKKyAgICAgICAgZWxzZSBpZiAoc3BlZWQgPT0gUzE5XzJNKQorICAgICAgICAgICAgICAgIHZhbCA9ICgweDAgPDwgMjMpOworICAgICAgICB2YWwgfD0gKH4oQklUMjN8QklUMjR8QklUMjUpICYgX19yYXdfcmVhZGwoQ01fQ0xLU0VMMV9QTEwpKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMMV9QTEwpOworCisgICAgICAgIF9fcmF3X3dyaXRlbChEUExMX0xPQ0t8QVBMTF9MT0NLLCBDTV9DTEtFTl9QTEwpOyAgIC8qIGVuYWJsZSBhcGxsICovCisgICAgICAgIHdhaXRfb25fdmFsdWUoQklUOCwgQklUOCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOy8qIHdhaXQgZm9yIGFwbGwgbG9jayAqLworCisgICAgICAgIGRlbGF5KDIwMDAwMCk7Cit9CisKK3ZvaWQgU0VDX2dlbmVyaWModm9pZCkKK3sKKy8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKyNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDY4KTsgLyogUkVRX0lORk9fUEVSTUlTU0lPTl8xIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgIC8qIFJFQURfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgIC8qIFdSSVRFX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg2MCk7IC8qIEFERFJfTUFUQ0hfMSBMKi8KKworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDQ4KTsgLyogUkVRX0lORk9fUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg1MCk7IC8qIFJFQURfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg1OCk7IC8qIFdSSVRFX1BFUk1JU1NJT05fMCBMKi8KKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg0OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NTApOyAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NTgpOyAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDgwKTsgIC8qIEFERFJfTUFUQ0hfMiBMKi8KKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDQ4KTsgLyogUkVRX0lORk9fUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg1MCk7IC8qIFJFQURfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg1OCk7IC8qIFdSSVRFX1BFUk1JU1NJT05fMCBMKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX3NyYW0odm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisKKyAgICAgICAgLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKyAgICAgICAgbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisgICAgICAgIGlmICgobW9kZSA9PSBHUF9ERVZJQ0UpIHx8IChtb2RlID09IEhTX0RFVklDRSkgfHwgKG1vZGUgPT0gRU1VX0RFVklDRSkKKyAgICAgICAgICAgIHx8IChtb2RlID09IFRTVF9ERVZJQ0UpKSB7CisgICAgICAgICAgICAgICAgLyogU2VjdXJlIG9yIEVtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QgKi8KKyAgICAgICAgICAgICAgICBTRUNfZ2VuZXJpYygpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHNfaW5pdChpbnQgc2tpcCkKK3sKKyAgICAgICAgdTMyICAgcmV2OworCisgICAgICAgIHJldiA9IGdldF9jcHVfcmV2KCk7CisKKyAgICAgICAgd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfc3JhbSgpOyAgIAorICAgICAgICBtdXhTZXR1cEFsbCgpOworICAgICAgICBkZWxheSgxMDApOworCXByY21faW5pdCgpOworCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgorICAgICAgICBjb25maWdfc2RyYW1fZGRyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9DT01CTykKKyAgICAgICAgY29uZmlnX3NkcmFtX2NvbWJvKHJldik7CisjZWxpZiBkZWZpbmVkKENGR18yNDMwU0RSQU1fRERSKQorICAgICAgICBjb25maWdfMjQzMHNkcmFtX2RkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fU1RBQ0tFRCkKKyAgICAgICAgY29uZmlnX3NkcmFtX3N0YWNrZWQocmV2KTsKKyNlbHNlCisjZXJyb3IgU0RSQU0gdHlwZSBub3Qgc3VwcG9ydGVkCisjZW5kaWYKKworICAgICAgICBkZWxheSgyMDAwMCk7CisgICAgICAgIHBlcmlwaGVyYWxfZW5hYmxlKCk7CisgICAgICAgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKyNkZWZpbmUgR1AgKEJJVDh8QklUOSkKKworCS8qIFRoZXJlIGFyZSA0IHdhdGNoIGRvZ3MuICAxIHNlY3VyZSwgYW5kIDMgZ2VuZXJhbCBwdXJwb3NlLgorCSAqIEkgd291bGQgZXhwZWN0IHRoYXQgdGhlIFJPTSB0YWtlcyBjYXJlIG9mIHRoZSBzZWN1cmUgb25lLAorCSAqIGJ1dCB3ZSB3aWxsIHRyeSBhbHNvLiAgT2YgdGhlIDMgR1Agb25lcywgMSBjYW4gcmVzZXQgdXMKKwkgKiBkaXJlY3RseSwgdGhlIG90aGVyIDIgb25seSBnZW5lcmF0ZSBNUFUgaW50ZXJydXB0cy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0QyX0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdEMl9CQVNFK1dTUFIpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UrV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2LCBpZl9jbGtzPTAsIGlmX2Nsa3MyID0gMCwgZnVuY19jbGtzPTAsIGZ1bmNfY2xrczIgPSAwOworCisJLyogRW5hYmxlIEdQMiB0aW1lci4qLworCWlmX2Nsa3MgfD0gQklUNDsKKwlmdW5jX2Nsa3MgfD0gQklUNDsKKwl2ID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMMl9DT1JFKSB8IDB4NDsJLyogU3lzX2NsayBpbnB1dCBPTUFQMjRYWF9HUFQyICovCisJX19yYXdfd3JpdGVsKHYsIENNX0NMS1NFTDJfQ09SRSk7CisJX19yYXdfd3JpdGVsKDB4MSwgQ01fQ0xLU0VMX1dLVVApOworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2sgKi8KKwlmdW5jX2Nsa3MgfD0gQklUMjE7CisJaWZfY2xrcyB8PSBCSVQyMTsKKyNlbmRpZgorCXYgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU4xX0NPUkUpIHwgaWZfY2xrczsJLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LENNX0lDTEtFTjFfQ09SRSApOworCXYgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU4yX0NPUkUpIHwgaWZfY2xrczI7ICAgIC8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKHYsIENNX0lDTEtFTjJfQ09SRSk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjFfQ09SRSkgfCBmdW5jX2Nsa3M7IC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjFfQ09SRSk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjJfQ09SRSkgfCBmdW5jX2Nsa3MyOyAgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjJfQ09SRSk7CisJZGVsYXkoMTAwMCk7CisKK30KKworLyogRG8gcGluIG11eGluZyBmb3IgYWxsIHRoZSBkZXZpY2VzIHVzZWQgaW4gWC1Mb2FkZXIgKi8KKyNkZWZpbmUgTVVYX1ZBTChPRkZTRVQsVkFMVUUpXAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlYihWQUxVRSwgT01BUDI0WFhfQ1RSTF9CQVNFICsgT0ZGU0VUKTsKK3N0YXRpYyB2b2lkIG11eFNldHVwQWxsKHZvaWQpCit7CisJLyogVUFSVCAxKi8KKwlNVVhfVkFMKDB4MDBCMSwgMHgxQikgICAgICAgIC8qIHVhcnQxX2N0cy0gRU4sIEhJLCAzLCAtPmdwaW9fMzIgKi8KKwlNVVhfVkFMKDB4MDBCMiwgMHgxQikgICAgICAgIC8qIHVhcnQxX3J0cy0gRU4sIEhJLCAzLCAtPmdwaW9fOCAqLworCU1VWF9WQUwoMHgwMEIzLCAweDFCKSAgICAgICAgLyogdWFydDFfdHgtIEVOLCBISSwgMywgLT5ncGlvXzkgKi8KKwlNVVhfVkFMKDB4MDBCNCwgMHgxQikgICAgICAgIC8qIHVhcnQxX3J4LSBFTiwgSEksIDMsIC0+Z3Bpb18xMCAqLworCU1VWF9WQUwoMHgwMTA3LCAweDAxKSAgICAgICAgLyogc3NpMV9kYXRfdHgtIERpcywgMSwgLT51YXJ0MV90eCAqLworCU1VWF9WQUwoMHgwMTA4LCAweDAxKSAgICAgICAgLyogc3NpMV9mbGFnX3R4LSBEaXMsIDEsIC0+dWFydDFfcnRzICovCisJTVVYX1ZBTCgweDAxMDksIDB4MDEpICAgICAgICAvKiBzc2kxX3JkeV90eC0gRGlzLCAxLCAtPnVhcnQxX2N0cyAqLworCU1VWF9WQUwoMHgwMTBBLCAweDAxKSAgICAgICAgLyogc3NpMV9kYXRfcngtIERpcywgMSwgLT51YXJ0MV9yeCAqLworCisJLyogTXV4IHNldHRpbmdzIGZvciBTRFJDICovCisJTVVYX1ZBTCgweDAwNTQsIDB4MUIpICAgICAgICAvKiBzZHJjX2ExNCAtIEVOLCBISSwgMywgLT5ncGlvXzAgKi8KKwlNVVhfVkFMKDB4MDA1NSwgMHgxQikgICAgICAgIC8qIHNkcmNfYTEzIC0gRU4sIEhJLCAzLCAtPmdwaW9fMSAqLworCU1VWF9WQUwoMHgwMDU2LCAweDAwKSAgICAgICAgLyogc2RyY19hMTIgLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0NiwgMHgwMCkgICAgICAgIC8qIHNkcmNfbmNzMSAtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQ4LCAweDAwKSAgICAgICAgLyogc2RyY19ja2UxIC0gRGlzLCAwICovCisJLyogR1BNQyAqLworCU1VWF9WQUwoMHgwMDMwLCAweDAwKSAgICAgICAgLyogZ3BtY19jbGsgLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzMiwgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzMS0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzMsIDB4MDApICAgICAgICAvKiBncG1jX25jczItIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDM0LCAweDAzKSAgICAgICAgLyogZ3BtY19uY3MzLSBEaXMsIDMsIC0+Z3Bpb18yNCAqLworCU1VWF9WQUwoMHgwMDM1LCAweDAzKSAgICAgICAgLyogZ3BtY19uY3M0LSBEaXMsIDMsIC0+Z3Bpb18yNSAqLworCU1VWF9WQUwoMHgwMDM2LCAweDAwKSAgICAgICAgLyogZ3BtY19uY3M1LSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzNywgMHgwMykgICAgICAgIC8qIGdwbWNfbmNzNi0gRGlzLCAzLCAtPmdwaW9fMjcgKi8KKwlNVVhfVkFMKDB4MDAzOCwgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzNy0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDAsIDB4MTgpICAgICAgICAvKiBncG1jX3dhaXQxLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0MSwgMHgxOCkgICAgICAgIC8qIGdwbWNfd2FpdDItIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQyLCAweDFCKSAgICAgICAgLyogZ3BtY193YWl0My0gRU4sIEhJLCAzLCAtPmdwaW9fMzUgKi8KKwlNVVhfVkFMKDB4MDA4NSwgMHgxQikgICAgICAgIC8qIGdwbWNfYTEwLSBFTiwgSEksIDMsIC0+Z3Bpb18zICovCit9CisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwl1MzIJcmV2OworCisJLyogR1BNQyBDb25maWd1cmF0aW9uICovCisJcmV2ICA9IGdldF9jcHVfcmV2KCk7CisKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoMHgwMDEsIEdQTUNfQ09ORklHKTsJLyogc2V0IG5XUCwgZGlzYWJsZSBsaW1pdGVkIGFkZHIgKi8KKyNlbmRpZgorCisJLyogU2V0IHRoZSBHUE1DIFZhbHMgLiBGb3IgTkFORCBib290IG9uIDI0MzBTRFAsIE5BTkQgaXMgbWFwcGVkIGF0IENTMAorICAgICAgICAgKiAgLCBOT1IgYXQgQ1MxIGFuZCBNUERCIGF0IENTNS4gQW5kIG9uZU5BTkQgYm9vdCwgd2UgbWFwIG9uZU5BTkQgYXQgQ1MwLgorCSAqICBXZSBjb25maWd1cmUgb25seSBHUE1DIENTMCB3aXRoIHJlcXVpcmVkIHZhbHVlcy4gQ29uZmlnaXJpbmcgb3RoZXIgZGV2aWNlcyAKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19DT05GSUc3XzApOworCXNkZWxheSgxMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzZfMCk7CisKKyNlbHNlIC8qIENGR19PTkVOQU5EICovCisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzZfMCk7CisjZW5kaWYKKworCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisJX19yYXdfd3JpdGVsKCggKChPTUFQMjRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorCQkgICAgICgoT01BUDI0WFhfR1BNQ19DUzBfTUFQPj4yNCkgJiAweDNGKSB8CisJCSAgICAgKDE8PDYpICksIEdQTUNfQ09ORklHN18wKTsKKwlzZGVsYXkoMjAwMCk7CisjaWZkZWYgQ0ZHX05BTkQKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbHNlCisJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMWQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MzAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovIAorICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IFBSQ01fQ0xLQ0ZHX0NUUkwgLSBhZGRyIG9mIHZhbGlkIHJlZworICogIFIxID0gQ01fQ0xLRU5fUExMIC0gYWRkciBkcGxsIGN0bHIgcmVnCisgKiAgUjIgPSBkcGxsIHZhbHVlCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3ViICAgICBzcCwgc3AsICMweDQgLyogZ2V0IHNvbWUgc3RhY2sgc3BhY2UgKi8KKyAgICAgICAgc3RyICAgICByNCwgW3NwXSAgICAgLyogc2F2ZSByNCdzIHZhbHVlICovCisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI4LCBwbGxfY3RsX2FkZAorICAgICAgICBtb3YgICAgIHI0LCAjMHgyCisgICAgICAgIHN0ciAgICAgcjQsIFtyOF0KKyAgICAgICAgbGRyICAgICByNCwgcGxsX3N0YXQKK2Jsb2NrOgorICAgICAgICBsZHIgICAgIHI4LCBbcjRdCS8qIHdhaXQgZm9yIGJ5cGFzcyB0byB0YWtlIGVmZmVjdCAqLworICAgICAgICBhbmQgICAgIHI4LCByOCwgIzB4MworICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIGJuZSAgICAgYmxvY2sKKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjQsIHBsbF9kaXZfYWRkCisJbGRyICAgICByOCwgcGxsX2Rpdl92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgIAorICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjQsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBbcjRdCisgICAgICAgIG9yciAgICAgcjgsIHI4LCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorCisJLyogc2V0dXAgdG8gMnggbG9vcCB0aG91Z2ggY29kZS4gIFRoZSBmaXJzdCBsb29wIHByZS1sb2FkcyB0aGUgCisgICAgICAgICAqIGljYWNoZSwgdGhlIDJuZCBjb21taXRzIHRoZSBwcmNtIGNvbmZpZywgYW5kIGxvY2tzIHRoZSBkcGxsCisgICAgICAgICAqLworICAgICAgICBtb3YgICAgIHI0LCAjMHgxMDAwICAgICAgLyogc3BpbiBzcGluIHNwaW4gKi8KKyAgICAgICAgbW92ICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHBhc3MgY29uZGl0aW9uICYgc2V0IHJlZ2lzdGVycyAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0CisyOgorICAgICAgICBsZHJuZSAgIHI4LCBbcjNdICAgICAgICAgLyogRFBMTCBsb2NrIGNoZWNrICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHg3CisgICAgICAgIGNtcCAgICAgcjgsICMweDIKKyAgICAgICAgYmVxICAgICA0ZgorMzoKKyAgICAgICAgc3ViZXEgICByOCwgcjgsICMweDEKKyAgICAgICAgc3RyZXEgICByOCwgW3IwXSAgICAgICAgIC8qIGNvbW1pdCBkaXZpZGVycyAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AxOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBMb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDEKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgc3RyZXEgICByMiwgW3IxXSAgICAgICAgLyogbG9jayBkcGxsICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDI6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIGxvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMgorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBsZHJlcSAgIHI4LCBbcjNdICAgICAgICAgLyogZ2V0IGxvY2sgY29uZGl0aW9uIGZvciBkcGxsICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCB0aW1lIHRob3VnaD8gKi8KKyAgICAgICAgYm5lICAgICAyYgorICAgICAgICBtb3ZlcSAgIHI4LCAjMHgyICAgICAgICAgLyogc2V0IHRvIGRwbGwgY2hlY2sgY29uZGl0aW9uLiAqLworICAgICAgICBiZXEgICAgIDNiICAgICAgICAgICAgICAgLyogaWYgY29uZGl0aW9uIG5vdCB0cnVlIGJyYW5jaCAqLworNDogIAorICAgICAgICBsZHIgICAgIHI0LCBbc3BdCisgICAgICAgIGFkZCAgICAgc3AsIHNwLCAjMHg0ICAgICAvKiByZXR1cm4gc3RhY2sgc3BhY2UgKi8KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworI2lmZGVmIENGR19PTkVOQU5ECitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUczXzAgCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIE9ORU5BTkRfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUc0XzAKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBPTkVOQU5EX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHMV8wCisjZWxzZQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHM18wIAorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUc0XzAKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUc0CitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUcxXzAKKyNlbmRpZgorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfc3RhdDoKKyAgICAud29yZCBDTV9JRExFU1RfQ0tHRU4KK3BsbF9kaXZfYWRkOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl92YWw6CisgICAgLndvcmQgRFBMTF9WQUwJLyogRFBMTCBzZXR0aW5nICgzMDBNSHogZGVmYXVsdCkgKi8KKworLmdsb2JsIHBsYXRmb3Jtc2V0dXAKK3BsYXRmb3Jtc2V0dXA6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIG1hcCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWxkcglyMCwJVkFMX0lOVEhfU0VUVVAKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMiwgNAorCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1ZBTF9JTlRIX1NFVFVQOgorCS53b3JkIFBFUklGRVJBTF9QT1JUX0JBU0UKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyZThmOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEphbnVhcnkgMjAwNCAtIENoYW5nZWQgdG8gc3VwcG9ydCBINCBkZXZpY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9hcm0xMTM2L3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzhiOGEzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAzNDMwc2RwLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2YWQ2YzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL2NvbmZpZy5tawpAQCAtMCwwICsxLDIyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFNEUDM0MzAgYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAxMjhNQiBtRERSLVNEUkFNIG9uIENTMAorIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAnMDAwMCAoYmFuazEpIC0gcmUtbWFwcGFibGUgYmVsb3cgQ1MxCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjA4ODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL29tYXAzNDMwc2RwLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL29tYXAzNDMwc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWY5ZmVkYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3Ivb21hcDM0MzBzZHAuYwpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNi0yMDA4CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworCXUzMiBjcHVpZD0wOworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCWlmKChjcHVpZCAgJiAweGYpID09IDB4MCkKKwkJcmV0dXJuIENQVV8zNDMwX0VTMTsKKwllbHNlCisJCXJldHVybiBDUFVfMzQzMF9FUzI7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisjaWZkZWYgQ0ZHXzM0MzBTRFJBTV9ERFIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ18zNDMwc2RyYW1fZGRyKCkgLSBJbml0IEREUiBvbiAzNDMwU0RQIGRldiBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ18zNDMwc2RyYW1fZGRyKHZvaWQpCit7CisJLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisJX19yYXdfd3JpdGVsKFNPRlRSRVNFVCwgU0RSQ19TWVNDT05GSUcpOworCXdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogc2V0dXAgc2RyYyB0byBiYWxsIG11eCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogc2V0IG1kY2ZnICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisKKwkvKiBzZXQgdGltaW5nICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKEREUiBpcyBkaWZmZXJlbnQpICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCS8qIHNldCBtcjAgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBzZXQgdXAgZGxsICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsKKwlkZWxheSgweDIwMDApOwkvKiBnaXZlIHRpbWUgdG8gbG9jayAqLworCit9CisjZW5kaWYgLy8gQ0ZHXzM0MzBTRFJBTV9ERFIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKwkvKiBJZiBTWVNfQ0xLIGlzIGJlaW5nIGRpdmlkZWQgYnkgMiwgcmVtb3ZlIGZvciBub3cgKi8KKwl2YWwgPSAodmFsICYgKH5CSVQ3KSkgfCBCSVQ2OworCV9fcmF3X3dyaXRlbCh2YWwsIFBSTV9DTEtTUkNfQ1RSTCk7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xraW5fc2VsKCkgLSByZXR1cm5zIHRoZSBzeXNfY2xraW5fc2VsIGZpZWxkIHZhbHVlIGJhc2VkIG9uIAorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmgKKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTSwgb3IgRmxhc2ggKHVzaW5nIHRlbXAgU1JBTSBzdGFjaykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByY21faW5pdCh2b2lkKQoreworCXUzMiBvc2NfY2xrPTAsIHN5c19jbGtpbl9zZWw7CisJZHBsbF9wYXJhbSAqZHBsbF9wYXJhbV9wOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwlpZihzeXNfY2xraW5fc2VsID4gMikgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgMCwgMiwgMCk7LyogQnlwYXNzIG1vZGU6IFQyIGlucHV0cyBhIHNxdWFyZSBjbG9jayAqLworCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZSAKKwkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4gCisJICovCisJaWYoY3B1X2lzXzM0MTAoKSkKKwkJc2lsX2luZGV4ID0gMjsKKwllbHNlIHsKKwkJaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzEpCisJCQlzaWxfaW5kZXggPSAwOworCQllbHNlIGlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMyKQorCQkJc2lsX2luZGV4ID0gMTsKKwl9CQorCisJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogQ09SRSBEUExMICovCisJLyogc3IzMihDTV9DTEtTRUwyX0VNVSkgc2V0IG92ZXJyaWRlIHRvIHdvcmsgd2hlbiBhc2xlZXAgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJCS8qIEZvciAzNDMwIEVTMS4wIEVycmF0YSAxLjUwLCBkZWZhdWx0IHZhbHVlIGRpcmVjdGx5IGRvZXNudAorCQkgICB3b3JrLiB3cml0ZSBhbm90aGVyIHZhbHVlIGFuZCB0aGVuIGRlZmF1bHQgdmFsdWUuICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMiArIDEpOwkvKiBtM3gyICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CQkvKiBtM3gyICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDIsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsJCQkvKiA5Nk0gU3JjICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiIEVTMSBvbmx5ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKwlzcjMyKENNX0NMS1NFTF9HRlgsIDAsIDMsIEdGWF9ESVYpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gUEVSICBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBjbGtfaW5kZXg7CisJLyogUEVSIERQTEwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkvKiBzZXQgTTMgKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBtICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IG4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7LyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsgLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBJVkEgRFBMTCAoc2V0IHRvIDEyKjIwPTI0ME1IeikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IE0gKi8KKyAgCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvciAKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfMzQzMHNkcmFtX2RkcigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKy8vLy8jaWZkZWYgQ09ORklHX1NFUklBTDMKKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDExLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMTEsIDEsIDB4MSk7CisvLy8vI2Vsc2UKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKy8vLy8jZW5kaWYKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwkvKlNEUkMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwkvKkdQTUMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0IGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05DUzUgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTEpKSAvKnN5c19uZG1hcmVxMSBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMSkpIC8qR1BNQ19JT19ESVIgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTEgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypncG1jX25XYWl0IGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypncG1jX25XYWl0IGxhYiovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypEU1NfREFUQTE4Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkRTU19EQVRBMTkqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLCAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qRFNTX0RBVEEyMCovXAorCU1VWF9WQUwoQ1AoQ0FNX1hDTEtCKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypDQU1fWENMS0IqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfVFgqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlRTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLCAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCU1VWF9WQUwoQ1AoTUNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qc3lzX2Nsa291dDIgbGFiKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKnN5c19jbGtvdXQyIGxhYiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki9cCisJTVVYX1ZBTChDUChVQVJUM19DVFNfUkNUWCksIChJRU4gIHwgUFREIHwgRU4gIHwgTTApKSAvKlVBUlQzX0NUU19SQ1RYICovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlRTX1NEKSwgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUM19SVFNfU0QgKi9cCisJTVVYX1ZBTChDUChVQVJUM19SWF9JUlJYICksIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQzX1JYX0lSUlgqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1RYX0lSVFggKSwgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDNfVFhfSVJUWCovXAorCU1VWF9WQUwoQ1Aoc2RyY19ja2UwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypzZHJjX2NrZTAgKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTEpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKSAvKnNkcmNfY2tlMSBub3QgdXNlZCovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2V0X211eGNvbmZfcmVncworICogRGVzY3JpcHRpb246IFNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24gTXV4IHJlZ2lzdGVycworICogICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBoYXJkd2FyZS4gTWFueSBwaW5zIG5lZWQKKyAqICAgICAgICAgICAgICB0byBiZSBtb3ZlZCBmcm9tIHByb3RlY3QgdG8gcHJpbWFyeSBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCU1VWF9ERUZBVUxUKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBuYW5kK19pbml0CisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIG5hbmQgZm9yIG5hbmQgYW5kIGpmZnMyIGNvbW1hbmRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCgweDAwMSwgR1BNQ19DT05GSUcpOwkvKiBzZXQgbldQLCBkaXNhYmxlIGxpbWl0ZWQgYWRkciAqLworI2VuZGlmCisKKwkvKiBzZXR1cCBDUzAgZm9yIE1pY3JvbiBOQU5ELCBsZWF2ZSBvdGhlciBDUydzIHRvIHUtYm9vdCAqLworCV9fcmF3X3dyaXRlbCgwICwgR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlkZWxheSgxMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyNlbHNlIC8qIENGR19PTkVOQU5EICovCisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisjZW5kaWYKKworCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorCQkgICAgICgoT01BUDM0WFhfR1BNQ19DUzBfTUFQPj4yNCkgJiAweDNGKSB8CisJCSAgICAgKDE8PDYpICksICAoR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKSk7CisJZGVsYXkoMjAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2Vsc2UKKwlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4NjkyNzAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3BsYXRmb3JtLlMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovIAorICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuICAKKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNSAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8gICAgIAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKSAKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkgCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuIAorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUsMHgwNywweDA1LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorIAorLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OSwweDEyLDB4MDQsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDE3LDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgxOSwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEsMHgzMiwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgyRiwweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwNSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyLDB4MDksMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MEIsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDBDLDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRiwweDMwLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDE3LDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogQ29yZSBEUExMIHRhcmdldHMgZm9yIEwzIGF0IDE2NiAmIEwxMzMgKi8KK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTJfRVMxLE1fMTJfRVMxLEZTTF8xMl9FUzEsTTJfMTJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisvKiAzNDEwICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCBNXzEzX0VTMSxOXzEzX0VTMSxGU0xfMTNfRVMxLE0yXzEzX0VTMQorLyogRVMyICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworLyogMzQxMCAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzE5cDJfRVMxLE5fMTlwMl9FUzEsRlNMXzE5cDJfRVMxLE0yXzE5cDJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8yNl9FUzEsTl8yNl9FUzEsRlNMXzI2X0VTMSxNMl8yNl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKy8qIDM0MTAgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8zOHA0X0VTMSxOXzM4cDRfRVMxLEZTTF8zOHA0X0VTMSxNMl8zOHA0X0VTMQorLyogRVMyICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisvKiAzNDEwICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgsMHgwNSwweDA3LDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwLDB4MEMsMHgwMywweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEsMHgwOSwweDA3LDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgsMHgwQywweDA3LDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMSwweDEzLDB4MDcsMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0MDJmNzQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVjZTE3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMzQzMHNkcC5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFkNmM1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgU0RQMzQzMCBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDEyOE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMCcwMDAwIChiYW5rMSkgLSByZS1tYXBwYWJsZSBiZWxvdyBDUzEKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDg4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDlhYWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jCkBAIC0wLDAgKzEsNzc0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworc3RydWN0IGRwbGxfcGFyYW0geworICAgICAgICB1bnNpZ25lZCBpbnQgbTsKKyAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgIHVuc2lnbmVkIGludCBmc2VsOworICAgICAgICB1bnNpZ25lZCBpbnQgbTI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKyNkZWZpbmUgTUFYX1NJTF9JTkRFWAkzCisKKy8qIEZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbG93bGV2ZWxfaW5pdC5TICovCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSgpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0oKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcjMyIC0gY2xlYXIgJiBzZXQgYSB2YWx1ZSBpbiBhIGJpdCByYW5nZSBmb3IgYSAzMiBiaXQgYWRkcmVzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCW1zayA9IDEgPDwgbnVtX2JpdHM7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YWl0X29uX3ZhbHVlKCkgLSBjb21tb24gcm91dGluZSB0byBhbGxvdyB3YWl0aW5nIGZvciBjaGFuZ2VzIGluCisgKiAgIHZvbGF0aWxlIHJlZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworI2lmZGVmIENGR18zNDMwU0RSQU1fRERSCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfMzQzMHNkcmFtX2RkcigpIC0gSW5pdCBERFIgb24gMzQzMFNEUCBkZXYgYm9hcmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWdfMzQzMHNkcmFtX2Rkcih2b2lkKQoreworCS8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworCV9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisJX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIHNldCBtZGNmZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCisJLyogc2V0IHRpbWluZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzIChERFIgaXMgZGlmZmVyZW50KSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKwkvKiBzZXQgbXIwICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogc2V0IHVwIGRsbCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CisJZGVsYXkoMHgyMDAwKTsJLyogZ2l2ZSB0aW1lIHRvIGxvY2sgKi8KKworfQorI2VuZGlmIC8vIENGR18zNDMwU0RSQU1fRERSCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisJLyogSWYgU1lTX0NMSyBpcyBiZWluZyBkaXZpZGVkIGJ5IDIsIHJlbW92ZSBmb3Igbm93ICovCisJdmFsID0gKHZhbCAmICh+QklUNykpIHwgQklUNjsKKwlfX3Jhd193cml0ZWwodmFsLCBQUk1fQ0xLU1JDX0NUUkwpOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbgorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmgKKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTSwgb3IgRmxhc2ggKHVzaW5nIHRlbXAgU1JBTSBzdGFjaykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByY21faW5pdCh2b2lkKQoreworCXUzMiBvc2NfY2xrPTAsIHN5c19jbGtpbl9zZWw7CisJZHBsbF9wYXJhbSAqZHBsbF9wYXJhbV9wOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwlpZihzeXNfY2xraW5fc2VsID4gMikgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJICovCisJaWYoY3B1X2lzXzM0MTAoKSkKKwkJc2lsX2luZGV4ID0gMjsKKwllbHNlIHsKKwkJaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzEpCisJCQlzaWxfaW5kZXggPSAwOworCQllbHNlIGlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMyKQorCQkJc2lsX2luZGV4ID0gMTsKKwl9CQorCisJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogQ09SRSBEUExMICovCisJLyogc3IzMihDTV9DTEtTRUwyX0VNVSkgc2V0IG92ZXJyaWRlIHRvIHdvcmsgd2hlbiBhc2xlZXAgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgMCwgMywgR0ZYX0RJVik7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBQRVIgIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIGNsa19pbmRleDsKKwkvKiBQRVIgRFBMTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CS8qIHNldCBNMyAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IG0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgbiAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOyAvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIElWQSBEUExMIChzZXQgdG8gMTIqMjA9MjQwTUh6KSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgTSAqLworICAJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWludCBtb2RlOworCisJLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKwkvKiBzZWN1cmUgY29kZSBicmVha3MgZm9yIFNlY3VyZS9FbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UKi8KKwltb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisJaWYgKG1vZGUgPT0gR1BfREVWSUNFKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfMzQzMF9BU18zNDEwCisJLyogc2V0dXAgdGhlIHNjYWxhYmlsaXR5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIAorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ18zNDMwc2RyYW1fZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKKy8qIFNldCBNVVggZm9yIFVBUlQsIEdQTUMsIFNEUkMsIEdQSU8gKi8KKworI2RlZmluZSAJTVVYX1ZBTChPRkZTRVQsVkFMVUUpXAorCQlfX3Jhd193cml0ZXcoKFZBTFVFKSwgT01BUDM0WFhfQ1RSTF9CQVNFICsgKE9GRlNFVCkpOworCisjZGVmaW5lCQlDUCh4KQkoQ09OVFJPTF9QQURDT05GXyMjeCkKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzYqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYxKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY0Ki9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjUqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTAqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MSovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksICAgICAgKElFTiB8IFBUVSB8IERJUyB8IE0wKSkgLypVQVJUMV9DVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwgICAgICAgKElFTiB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCU1VWF9WQUwoQ1AoTUNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKDB4MDAxLCBHUE1DX0NPTkZJRyk7CS8qIHNldCBuV1AsIGRpc2FibGUgbGltaXRlZCBhZGRyICovCisjZW5kaWYKKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAzNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzMuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisjZWxzZSAvKiBDRkdfT05FTkFORCAqLworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworI2VuZGlmCisKKwkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKwkJICAgICAoKE9NQVAzNFhYX0dQTUNfQ1MwX01BUD4+MjQpICYgMHgzRikgfAorCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworCWRlbGF5KDIwMDApOworI2lmIGRlZmluZWQoQ0ZHX05BTkQpCisgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZWxpZiBkZWZpbmVkKENGR19PTkVOQU5EKQorCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDRkdfQ01EX0ZBVAordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh2b2lkKQoreworICAgICAgIGxvbmcgc2l6ZSwgaTsKKyAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IENGR19MT0FEQUREUjsKKyAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50OworICAgICAgIGNoYXIgYnVmWzEyXTsKKyAgICAgICBibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisgICAgICAgaW50IGRldiA9IDA7CisgICAgICAgaW50IHBhcnQgPSAxOworICAgICAgIGNoYXIgKmVwOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DIFxuIik7CisKKyAgICAgICByZXQgPSBtbWNfaW5pdCgxKTsKKyAgICAgICBpZihyZXQgPT0gMCl7CisgICAgICAgICAgICAgICBwcmludGYoIlxuIE1NQyBpbml0IGZhaWxlZCBcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsICh1bnNpZ25lZCBjaGFyICopb2Zmc2V0LCAwKTsKKyAgICAgICBpZiAoc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIHByaW50ZigiXG4lbGQgQnl0ZXMgUmVhZCBmcm9tIE1NQyBcbiIsIHNpemUpOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBPUyBCb290bG9hZGVyIGZyb20gTU1DLi4uXG4iKTsKKworICAgICAgICgobW1jX2Jvb3RfYWRkciAqKSBDRkdfTE9BREFERFIpICgpOworCisgICAgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjkyNzAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLiAgCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNCAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgIAorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovICAgICAKKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzQpCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNSkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkgCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApIAorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKworI2VuZGlmCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLiAKKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFLDB4MDcsMHgwNSwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDFGNCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKyAKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzksMHgxMiwweDA0LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgxNywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MTksMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBLDB4MzIsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MkYsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MDUsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQSwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDE2OCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MiwweDA5LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDBCLDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwQywweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YsMHgzMCwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgxNywweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIENvcmUgRFBMTCB0YXJnZXRzIGZvciBMMyBhdCAxNjYgJiBMMTMzICovCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzEyX0VTMSxNXzEyX0VTMSxGU0xfMTJfRVMxLE0yXzEyX0VTMQorLyogRVMyICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorLyogMzQxMCAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xM19FUzEsTl8xM19FUzEsRlNMXzEzX0VTMSxNMl8xM19FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xOXAyX0VTMSxOXzE5cDJfRVMxLEZTTF8xOXAyX0VTMSxNMl8xOXAyX0VTMQorLyogRVMyICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisvKiAzNDEwICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMjZfRVMxLE5fMjZfRVMxLEZTTF8yNl9FUzEsTTJfMjZfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisvKiAzNDEwICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMzhwNF9FUzEsTl8zOHA0X0VTMSxGU0xfMzhwNF9FUzEsTTJfMzhwNF9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorLyogMzQxMCAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4LDB4MDUsMHgwNywweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMCwweDBDLDB4MDMsMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxLDB4MDksMHgwNywweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4LDB4MEMsMHgwNywweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEsMHgxMywweDA3LDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDJmNzQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTM5OWM1YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDNldm0ubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQ1ZWMyMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL2NvbmZpZy5tawpAQCAtMCwwICsxLDE5IEBACisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDA4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkN2I5OTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdW5zaWduZWQgaW50IHN5c19jbGs7CisJdW5zaWduZWQgaW50IG07CisJdW5zaWduZWQgaW50IG47CisJdW5zaWduZWQgaW50IG0yOworCXVuc2lnbmVkIGludCBtMzsKKwl1bnNpZ25lZCBpbnQgbTQ7CisJdW5zaWduZWQgaW50IG01OworCXVuc2lnbmVkIGludCBtNjsKKwl1bnNpZ25lZCBpbnQgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKyNkZWZpbmUgTUFYX1NJTF9JTkRFWAkzCisKKy8qIEZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbG93bGV2ZWxfaW5pdC5TICovCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKK3ZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWNzKSB7CisJZGVsYXkodXNlY3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKSAtIHJldHVybiBTWVNfQk9PVFs0OjBdCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKFNZU0JPT1RfTUFTSyk7CisgICAgICAgIHJldHVybiBtb2RlOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGdldF9tZW1fdHlwZSh2b2lkKSAtIHJldHVybnMgdGhlIGtpbmQgb2YgbWVtb3J5IGNvbm5lY3RlZAorICogdG8gR1BNQyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gYm9vdCBmb3JtLiBVc2VzIFNZUyBCT09UIHNldHRpbmdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X21lbV90eXBlKHZvaWQpCit7CisgICAgICAgIHUzMiAgIG1lbV90eXBlID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKyAgICAgICAgc3dpdGNoIChtZW1fdHlwZSl7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgY2FzZSAyMjogICAgcmV0dXJuIEdQTUNfT05FTkFORDsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgY2FzZSAyNzogICAgcmV0dXJuIEdQTUNfTkFORDsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2FzZSA2OiAgICAgcmV0dXJuIE1NQ19PTkVOQU5EOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICBjYXNlIDI2OiAgICByZXR1cm4gR1BNQ19NRE9DOworCisgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgIGNhc2UgMjQ6CXJldHVybiBNTUNfTkFORDsKKworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgIHJldHVybiBHUE1DX05PUjsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCit1MzIgaXNfY3B1X2ZhbWlseSh2b2lkKQoreworCXUzMiBjcHVpZCA9IDAsIGNwdV9mYW1pbHkgPSAwOworCXUxNiBoYXdrZXllOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIoY3B1aWQpKTsKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwl9IGVsc2UgeworCQljcHVpZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChjcHVpZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKwkJCWNhc2UgSEFXS0VZRV9PTUFQMzRYWDoKKwkJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJCWJyZWFrOworCQkJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwkJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjcHVfZmFtaWx5OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisjaWZkZWYgQ0ZHX09NQVBFVk1fRERSCisjaWZkZWYgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1ha2VfY3MxX2NvbnRpZ3VvdXMoKSAtIGZvciBlczIgYW5kIGFib3ZlIHJlbWFwIGNzMSBiZWhpbmQgY3MwIHRvIGFsbG93CisgKiAgY29tbWFuZCBsaW5lIG1lbT14eXogdXNlIGFsbCBtZW1vcnkgd2l0aCBvdXQgZGlzY29udGludW91cyBzdXBwb3J0CisgKiAgY29tcGlsZWQgaW4uICBDb3VsZCBkbyBpdCBhdCB0aGUgQVRBRywgYnV0IHRoZXJlIHJlYWxseSBpcyB0d28gYmFua3MuLi4KKyAqIENhbGxlZCBhcyBwYXJ0IG9mIDJuZCBwaGFzZSBERFIgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbWFrZV9jczFfY29udGlndW91cyh2b2lkKQoreworCXUzMiBzaXplLCBhX2FkZF9sb3csIGFfYWRkX2hpZ2g7CisKKwlzaXplID0gZ2V0X3Nkcl9jc19zaXplKFNEUkNfQ1MwX09TRVQpOworCXNpemUgLz0gU1pfMzJNOyAgICAgICAgIC8qIGZpbmQgc2l6ZSB0byBvZmZzZXQgQ1MxICovCisJYV9hZGRfaGlnaCA9IChzaXplICYgMykgPDwgODsgICAvKiBzZXQgdXAgbG93IGZpZWxkICovCisJYV9hZGRfbG93ID0gKHNpemUgJiAweDNDKSA+PiAyOyAvKiBzZXQgdXAgaGlnaCBmaWVsZCAqLworCV9fcmF3X3dyaXRlbCgoYV9hZGRfaGlnaCB8IGFfYWRkX2xvdyksIFNEUkNfQ1NfQ0ZHKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3MwX3NpemUoKSAtIGdldCBzaXplIG9mIGNoaXAgc2VsZWN0IDAvMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfc2RyX2NzX3NpemUodTMyIG9mZnNldCkKK3sKKwl1MzIgc2l6ZTsKKworCS8qIGdldCByYW0gc2l6ZSBmaWVsZCAqLworCXNpemUgPSBfX3Jhd19yZWFkbChTRFJDX01DRkdfMCArIG9mZnNldCkgPj4gODsKKwlzaXplICY9IDB4M0ZGOyAgICAgICAgICAvKiByZW1vdmUgdW53YW50ZWQgYml0cyAqLworCXNpemUgKj0gU1pfMk07ICAgICAgICAgIC8qIGZpbmQgc2l6ZSBpbiBNQiAqLworCXJldHVybiBzaXplOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ18zNDMwc2RyYW1fZGRyKCkgLSBJbml0IEREUiBvbiAzNDMwU0RQIGRldiBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ18zNDMwc2RyYW1fZGRyKHZvaWQpCit7CisKKyNpZm5kZWYgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisJLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisJX19yYXdfd3JpdGVsKFNPRlRSRVNFVCwgU0RSQ19TWVNDT05GSUcpOworCXdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogc2V0dXAgc2RyYyB0byBiYWxsIG11eCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogc2V0IG1kY2ZnICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisKKwkvKiBzZXQgdGltaW5nICovCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJX19yYXdfd3JpdGVsKEhZTklYX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwkJX19yYXdfd3JpdGVsKEhZTklYX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCX0gZWxzZSB7CisJCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKwkJCV9fcmF3X3dyaXRlbChJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJCQlfX3Jhd193cml0ZWwoSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCQl9CisJCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19OQU5EKSB8fChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworCQkJX19yYXdfd3JpdGVsKE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJCQlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwkJfQorCSB9CisKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19QT1dFUl9QT1AsIFNEUkNfUE9XRVIpOworCisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAoRERSIGlzIGRpZmZlcmVudCkgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisJLyogc2V0IG1yMCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIHNldCB1cCBkbGwgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOworCWRlbGF5KDB4MjAwMCk7CS8qIGdpdmUgdGltZSB0byBsb2NrICovCisjZWxzZQorICAgICAgIC8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworICAgICAgICAgX19yYXdfd3JpdGVsKFNPRlRSRVNFVCwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworICAgICAgICAgX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworICAgICAgICAgLyogc2V0dXAgc2RyYyB0byBiYWxsIG11eCAqLworICAgICAgICAgX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKyAgICAgICAgIC8qIFNEUkNfTUNGRzAgcmVnaXN0ZXIgKi8KKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA4MCkgPSAweDAyNTg0MDk5Oy8vZnJvbSBNaWNyb24KKworCSBpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQkgLyogU0RSQ19BQ1RJTV9DVFJMQTAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA5YykgPSAweDkyZTFjNGM2Oy8vIGZvciAyMDBNCisJCSAvKiBTRFJDX0FDVElNX0NUUkxCMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGEwKSA9IDB4MDAwMjExMWM7CisJIH0gZWxzZSB7CisJCSAvKiBTRFJDX0FDVElNX0NUUkxBMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDljKSA9IDB4YWE5ZGI0YzY7Ly8gZm9yIDE2Nk0gZnJvbSBya3cKKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEIwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTApID0gMHgwMDAxMTUxNzsKKwkgfQorCisKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhNCkgPTB4MDAwNERDMDE7CisKKyAgICAgICAgIC8qIERpc2JsZSBQb3dlciBEb3duIG9mIENLRSBjdXogb2YgMSBDS0Ugb24gY29tYm8gcGFydCAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDcwKSA9IDB4MDAwMDAwODE7CisKKyAgICAgICAgIC8qIFNEUkNfTWFudWFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAwOyAvLyBOT1AgY29tbWFuZAorICAgICAgICAgZGVsYXkoNTAwMCk7CisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMTsgLy8gUHJlY2hhcmdlIGNvbW1hbmQKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAyOyAvLyBBdXRvLXJlZnJlc2ggY29tbWFuZAorICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDI7IC8vIEF1dG8tcmVmcmVzaCBjb21tYW5kCisKKyAgICAgICAgIC8qIFNEUkMgTVIwIHJlZ2lzdGVyICovCisgICAgICAgICAoKihpbnQqKTB4NkQwMDAwODQpID0gMHgwMDAwMDAzMjsgLy8gQnVyc3QgbGVuZ3RoID00CisgICAgICAgICAvLyBDQVMgbGF0ZW5jeSA9IDMKKyAgICAgICAgIC8vIFdyaXRlIEJ1cnN0ID0gUmVhZCBCdXJzdAorICAgICAgICAgLy8gU2VyaWFsIE1vZGUKKworICAgICAgICAgLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA2MCkgPSAweDAwMDBBOworICAgICAgICAgZGVsYXkoMHgyMDAwMCk7IC8vIHNvbWUgZGVsYXkKKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKwltYWtlX2NzMV9jb250aWd1b3VzKCk7CisKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJX19yYXdfd3JpdGVsKE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwgKyBTRFJDX0NTMV9PU0VUKTsKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlkZWxheSg1MDAwKTsgICAvKiBzdXBwb3NlZCB0byBiZSAxMDB1cyBwZXIgZGVzaWduIHNwZWMgZm9yIG1kZHIvbXNkciAqLworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCArIFNEUkNfQ1MxX09TRVQpOworI2VuZGlmCit9CisjZW5kaWYgLyogQ0ZHX09NQVBFVk1fRERSICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xraW5fc2VsKCkgLSByZXR1cm5zIHRoZSBzeXNfY2xraW5fc2VsIGZpZWxkIHZhbHVlIGJhc2VkIG9uCisgKiAgIC0tIGlucHV0IG9zY2lsbGF0b3IgY2xvY2sgZnJlcXVlbmN5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3N5c19jbGtpbl9zZWwodTMyIG9zY19jbGssIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlpZihvc2NfY2xrID09IFMzOF80TSkKKwkJKnN5c19jbGtpbl9zZWw9ICA0OworCWVsc2UgaWYob3NjX2NsayA9PSBTMjZNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDM7CisJZWxzZSBpZihvc2NfY2xrID09IFMxOV8yTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAyOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTNNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDE7CisJZWxzZSBpZihvc2NfY2xrID09IFMxMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMDsKK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQgZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQgbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkIGl2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIGRwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQgZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQgbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQgaXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmgKKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTSwgb3IgRmxhc2ggKHVzaW5nIHRlbXAgU1JBTSBzdGFjaykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByY21faW5pdCh2b2lkKQoreworCXUzMiBvc2NfY2xrPTAsIHN5c19jbGtpbl9zZWw7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCW9zY19jbGsgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKG9zY19jbGssICZzeXNfY2xraW5fc2VsKTsKKworCXNyMzIoUFJNX0NMS1NFTCwgMCwgMywgc3lzX2Nsa2luX3NlbCk7IC8qIHNldCBpbnB1dCBjcnlzdGFsIHNwZWVkICovCisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUvMiAqLworCS8qCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJiAoc3lzX2Nsa2luX3NlbCA+IDIpKSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAyKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwvMjsKKwl9IGVsc2UgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMSk7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsOworCX0KKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfMzQzMHNkcmFtX2RkcigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfVFgqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlRTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLCAgICAgIChJRU4gfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwlNVVhfVkFMKENQKE1DQlNQMV9EWCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNTgqL1wKKwlNVVhfVkFMKENQKFNZU18zMkspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU1lTXzMySyovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzIgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT180ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzUgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT183ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzggKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fMTg2Ki9cCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfblRSU1QqL1wKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UQ0sqL1wKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UTVMqL1wKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UREkqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUwKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMSovXAorCU1VWF9WQUwoQ1AoRVRLX0NMSyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEyKi9cCisJTVVYX1ZBTChDUChFVEtfQ1RMKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTMqL1wKKwlNVVhfVkFMKENQKEVUS19EMCApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDIgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNyovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI4Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2V0X211eGNvbmZfcmVncworICogRGVzY3JpcHRpb246IFNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24gTXV4IHJlZ2lzdGVycworICogICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBoYXJkd2FyZS4gTWFueSBwaW5zIG5lZWQKKyAqICAgICAgICAgICAgICB0byBiZSBtb3ZlZCBmcm9tIHByb3RlY3QgdG8gcHJpbWFyeSBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCU1VWF9ERUZBVUxUKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBuYW5kK19pbml0CisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIG5hbmQgZm9yIG5hbmQgYW5kIGpmZnMyIGNvbW1hbmRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworCisJLyogU2V0IHRoZSBHUE1DIFZhbHMgLiBGb3IgTkFORCBib290IG9uIDM0MzBTRFAsIE5BTkQgaXMgbWFwcGVkIGF0IENTMAorICAgICAgICAgKiAgLCBOT1IgYXQgQ1MxIGFuZCBNUERCIGF0IENTMy4gQW5kIG9uZU5BTkQgYm9vdCwgd2UgbWFwIG9uZU5BTkQgYXQgQ1MwLgorCSAqICBXZSBjb25maWd1cmUgb25seSBHUE1DIENTMCB3aXRoIHJlcXVpcmVkIHZhbHVlcy4gQ29uZmlnaXJpbmcgb3RoZXIgZGV2aWNlcworCSAqICBhdCBvdGhlciBDUyBpbiBkb25lIGluIHUtYm9vdCBhbnl3YXkuIFNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIGRvaW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCV9fcmF3X3dyaXRlbCgwICwgR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlkZWxheSgxMDAwKTsKKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19OQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX05BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoTkFORF9CQVNFX0FEUj4+MjQpICYgMHgzRikgfAorICAgICAgICAJCSAgICAgKDE8PDYpICksICAoR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKSk7CisgICAgICAgIAlkZWxheSgyMDAwKTsKKworICAgICAgICAgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorICAgICAgICAJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisgICAgICAgIAkJcmV0dXJuIDE7CisgICAgICAgIAl9CisKKwl9CisKKwlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfT05FTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19PTkVOQU5EKSl7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyAgICAgICAgCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisgICAgICAgIAlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisgICAgICAgIAkJICAgICAoKE9ORU5BTkRfQkFTRT4+MjQpICYgMHgzRikgfAorICAgICAgICAJCSAgICAgKDE8PDYpICksICAoR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKSk7CisgICAgICAgIAlkZWxheSgyMDAwKTsKKworICAgICAgICAJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisgICAgICAgIAkJcmV0dXJuIDE7CisgICAgICAgIAl9CisJfQorCXJldHVybiAwOworfQorCisKK3R5cGVkZWYgaW50IChtbWNfYm9vdF9hZGRyKSAodm9pZCk7CitpbnQgbW1jX2Jvb3QodW5zaWduZWQgY2hhciAqYnVmKQoreworCisgICAgICAgbG9uZyBzaXplID0gMDsKKyNpZmRlZiBDRkdfQ01EX0ZBVAorICAgICAgIGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjID0gTlVMTDsKKyAgICAgICB1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIFgtbG9hZGVyIG9uIE1NQ1xuIik7CisKKyAgICAgICByZXQgPSBtbWNfaW5pdCgxKTsKKyAgICAgICBpZihyZXQgPT0gMCl7CisgICAgICAgICAgICAgICBwcmludGYoIlxuIE1NQyBpbml0IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KDApOworICAgICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIDEpOworICAgICAgIHNpemUgPSBmaWxlX2ZhdF9yZWFkKCJ1LWJvb3QuYmluIiwgYnVmLCAwKTsKKyAgICAgICBpZiAoc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIHByaW50ZigiXG4lbGQgQnl0ZXMgUmVhZCBmcm9tIE1NQ1xuIiwgc2l6ZSk7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIE9TIEJvb3Rsb2FkZXIgZnJvbSBNTUMuLi5cbiIpOworI2VuZGlmCisgICAgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2EzYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06Cisud29yZCAzMDAsIDEyLCAwLCAxCisud29yZCAzMDAsIDEyLCAwLCAxCisud29yZCAzMDAsIDEyLCAwLCAxCisud29yZCAzMDAsIDEyLCAwLCAxCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy53b3JkIDEwLCAwLCAwLCAxCisud29yZCAxMCwgMCwgMCwgMQorLndvcmQgMTAsIDAsIDAsIDEKKy53b3JkIDEwLCAwLCAwLCAxCisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06Cisud29yZCAyMDAsIDEyLCAwLCAxCisud29yZCAyMDAsIDEyLCAwLCAxCisud29yZCAyMDAsIDEyLCAwLCAxCisud29yZCAyMDAsIDEyLCAwLCAxCisKK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8qICAgIFNZU0NMSyAgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJViAqLworLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZjM1MmQzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmRzLmNmZyBiL3gtbG9hZGVyL2JvYXJkcy5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYTkyMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkcy5jZmcKQEAgLTAsMCArMSwyNiBAQAorIworIyBMaXN0IG9mIGJvYXJkcworIworIyBTeW50YXg6CisjICAgICAgICB3aGl0ZS1zcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBlbnRyaWVzOworIyAgICAgICAgZWFjaCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisjCisjICAgICAgICBUYXJnZXRuYW1lICBBcmNoaXRlY3R1cmUgIENQVSAgQm9hcmRuYW1lICBWZW5kb3IgIFNvQworIworIyAgICAgICAgVW51c2VkIGZpZWxkcyBjYW4gYmUgc3BlY2lmaWVkIGFzICItIiwgb3Igb21pdHRlZCBpZiB0aGV5CisjICAgICAgICBhcmUgdGhlIGxhc3QgZmllbGQgb24gdGhlIGxpbmUuCisjCisjICAgICAgICBMaW5lcyBzdGFydGluZyB3aXRoICcjJyBhcmUgY29tbWVudHMuCisjICAgICAgICBCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4KKyMKKyMgVG8ga2VlcCB0aGUgbGlzdCBzb3J0ZWQsIHVzZSBzb21ldGhpbmcgbGlrZQorIworIyAgICAgICAgOi4sJCEgc29ydCAtZiAtazIsMiAtazMsMyAtazYsNiAtazUsNSAtazEsMQorIworIyBUYXJnZXQgICAgICAgICAgICBBUkNIICAgICAgIFNvQyAgICAgICAgICAgICBCb2FyZCBuYW1lICAgICAgICBWZW5kb3IgICAgICAgICAgICAgICAgU29DCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGlhbW9uZCAgICAgICAgICAgICBhcm0gICAgICAgIG9tYXAzICAgICAgICAgICBkaWFtb25kICAgICAgICAgICBuZXN0CitkaWFtb25kLXVzYi1sb2FkZXIgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGRpYW1vbmQtdXNiLWxvYWRlciBuZXN0CitqNDkgICAgICAgICAgICAgICAgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGo0OSAgICAgICAgICAgICAgIG5lc3QKK2o0OS11c2ItbG9hZGVyICAgICAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgajQ5LXVzYi1sb2FkZXIgICAgbmVzdApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL01ha2VmaWxlIGIveC1sb2FkZXIvY29tbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjcyYmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWJjb21tb24uYQorCitBT0JKUwk9CisKKyMgY29yZQorQ09CSlMteSArPSBib290bS5vCitDT0JKUy15ICs9IG1haW4ubworQ09CSlMteSArPSBjb25zb2xlLm8KK0NPQkpTLXkgKz0gaW1hZ2UubworCitDT0JKUwk6PSAkKHNvcnQgJChDT0JKUy15KSkKK1NSQ1MJOj0gJChBT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQU9CSlMpICQoQ09CSlMpKQorCitDUFBGTEFHUyArPSAtSS4uCisKK2FsbDoJJChMSUIpICQoQU9CSlMpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vYm9vdG0uYyBiL3gtbG9hZGVyL2NvbW1vbi9ib290bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmEyMjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vYm9vdG0uYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCBHcmFudCBFcmlja3NvbiA8bWFyYXRob245NkBnbWFpbC5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRoYXQgYm9vdCB0aGUgc2Vjb25kLXN0YWdlCisgKiAgICAgIGJvb3QgbG9hZGVyIGZyb20gbWVtb3J5LCBpbiBlaXRoZXIgcmF3LCBiaW5hcnkgZm9ybWF0IG9yCisgKiAgICAgIGluIHUtYm9vdCAnbWtpbWFnZScgZm9ybWF0LgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxib290bS5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisKK3R5cGVkZWYgdm9pZCAoc3BsKSh2b2lkKTsKKworc3RhdGljIHZvaWQgZXhlYyh1bG9uZyBhZGRyZXNzLCBjb25zdCBjaGFyICp3aGF0KQoreworCXByaW50ZigiXG5TdGFydGluZyAlcyAuLi4iLCB3aGF0KTsKKworCSgoc3BsICopYWRkcmVzcykoKTsKK30KKworaW50IGJvb3RtKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwlpbnQgc3RhdHVzID0gQk9PVE1fU1RBVFVTX0ZBSUxVUkU7CisjaWYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCisJY29uc3QgaW50IGZvcm1hdCA9IGdlbmltZ19nZXRfZm9ybWF0KCh2b2lkICopYnVmZmVyKTsKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqIGhlYWRlciA9IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKWJ1ZmZlcjsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisKKwljYXNlIElNQUdFX0ZPUk1BVF9MRUdBQ1k6CisJCXN0YXR1cyA9IGJvb3RtX2ltYWdlKGhlYWRlcik7CisJCWJyZWFrOworCisJY2FzZSBJTUFHRV9GT1JNQVRfRklUOgorCQlwcmludGYoIlVuc3VwcG9ydGVkIGltYWdlIGZvcm1hdCBGSVQgKCVkKVxuIiwgZm9ybWF0KTsKKwkJYnJlYWs7CisKKwljYXNlIElNQUdFX0ZPUk1BVF9JTlZBTElEOgorCWRlZmF1bHQ6CisJCXByaW50ZigiVW5rbm93biBvciBpbnZhbGlkIGltYWdlIGZvcm1hdCAoJWQpXG4iLCBmb3JtYXQpOworCQlicmVhazsKKworCX0KKyNlbHNlCisJc3RhdHVzID0gYm9vdG1fYmluYXJ5KGJ1ZmZlcik7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpICovCisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK2ludCBib290bV9iaW5hcnkoY29uc3QgdWludDhfdCAqYnVmZmVyKQoreworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybi4gKi8KKworCWV4ZWMoKHVsb25nKWJ1ZmZlciwgInNlY29uZC1zdGFnZSBib290IGxvYWRlciIpOworCisJLyogSG93ZXZlciwgaWYgaXQgZG9lcywgcmV0dXJuIGZhaWxlZCBzdGF0dXMuICovCisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQoraW50IGJvb3RtX2ltYWdlKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZWFkZXIpCit7CisJY29uc3QgY2hhciAqIGZhaWx1cmUgPSBOVUxMOworCWNvbnN0IGNoYXIgKiB0eXBlX25hbWUgPSBOVUxMOworCXVpbnQzMl90IGxvYWQsIGltYWdlX3N0YXJ0LCBpbWFnZV9sZW47CisKKwkvKiBEaXNwbGF5IHRvIHN0YW5kYXJkIG91dHB1dCB0aGUgaW1hZ2UgY29udGVudHMuICovCisKKwlpbWFnZV9wcmludF9jb250ZW50cyhoZWFkZXIpOworCisJLyogVmFsaWRhdGUgdGhlIGltYWdlIGhlYWRlciBhbmQgaW1hZ2UgZGF0YSBDUkNzICovCisKKwlwdXRzKCIgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOworCisJeworCQlpZiAoIWltYWdlX2NoZWNrX2hjcmMoaGVhZGVyKSkgeworCQkJZmFpbHVyZSA9ICJIZWFkZXIgSW52YWxpZFxuIjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmICghaW1hZ2VfY2hlY2tfZGNyYyhoZWFkZXIpKSB7CisJCQlmYWlsdXJlID0gIkRhdGEgSW52YWxpZFxuIjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXB1dHMoIk9LXG4iKTsKKworCS8qIFdlIE9OTFkgc3VwcG9ydCB1bmNvbXByZXNzZWQgQVJNIFUtQm9vdCBmaXJtd2FyZSBpbWFnZXMuIENoZWNrCisJICogdG8gbWFrZSBzdXJlIHRoYXQncyB3aGF0IHdlIGFyZSBnb2luZyB0byBib290LgorCSAqLworCisJaWYgKCFpbWFnZV9jaGVja190eXBlKGhlYWRlciwgSUhfVFlQRV9GSVJNV0FSRSkpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBub3QgYSBmaXJtd2FyZSBpbWFnZVxuIjsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghaW1hZ2VfY2hlY2tfb3MoaGVhZGVyLCBJSF9PU19VX0JPT1QpKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgbm90IHUtYm9vdCBmaXJtd2FyZVxuIjsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChpbWFnZV9nZXRfY29tcChoZWFkZXIpICE9IElIX0NPTVBfTk9ORSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIGNvbXByZXNzZWRcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWltYWdlX2NoZWNrX3RhcmdldF9hcmNoKGhlYWRlcikpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBub3QgYnVpbHQgZm9yIHRoaXMgcHJvY2Vzc29yXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJdHlwZV9uYW1lID0gZ2VuaW1nX2dldF90eXBlX25hbWUoaW1hZ2VfZ2V0X3R5cGUoaGVhZGVyKSk7CisKKwlwcmludGYoIiAgIExvYWRpbmcgJXMgLi4uICIsIHR5cGVfbmFtZSk7CisKKwl7CisJCWxvYWQgPSBpbWFnZV9nZXRfbG9hZChoZWFkZXIpOworCQlpbWFnZV9zdGFydCA9IGltYWdlX2dldF9kYXRhKGhlYWRlcik7CisJCWltYWdlX2xlbiA9IGltYWdlX2dldF9kYXRhX3NpemUoaGVhZGVyKTsKKworCQltZW1tb3ZlX3dkKCh2b2lkICopbG9hZCwgKHZvaWQgKilpbWFnZV9zdGFydCwgaW1hZ2VfbGVuLCBDSFVOS1NaKTsKKwl9CisKKwlwdXRzKCJPS1xuIik7CisKKwkvKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4uICovCisKKwlleGVjKGxvYWQsIHR5cGVfbmFtZSk7CisKKwkvKiBIb3dldmVyLCBpZiBpdCBkb2VzLCByZXR1cm4gZmFpbGVkIHN0YXR1cy4gKi8KKworIGZhaWw6CisJcHV0cyhmYWlsdXJlKTsKKworCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL2NvbnNvbGUuYyBiL3gtbG9hZGVyL2NvbW1vbi9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhM2NiNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9jb25zb2xlLmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUGFvbG8gU2NhZmZhcmRpLCBBSVJWRU5UIFNBTSBzLnAuYSAtIFJJTUlOSShJVEFMWSksIGFyc2VuaW9AdGluLml0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCit2b2lkIHB1dHMoY29uc3QgY2hhciAqcykKK3sKKwlzZXJpYWxfcHV0cyhzKTsKK30KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL2ltYWdlLmMgYi94LWxvYWRlci9jb21tb24vaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE2ZTk1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL2ltYWdlLmMKQEAgLTAsMCArMSwyNTQxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4IFNlbWloYWxmCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBVU0VfSE9TVENDCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKworI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKyNpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICisjaW5jbHVkZSA8ZGF0YWZsYXNoLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MT0dCVUZGRVIKKyNpbmNsdWRlIDxsb2didWZmLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCisjaW5jbHVkZSA8cnRjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGltYWdlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpIHx8IGRlZmluZWQgKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8ZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorI2luY2x1ZGUgPHUtYm9vdC9tZDUuaD4KKyNpbmNsdWRlIDxzaGExLmg+CisKK3N0YXRpYyBpbnQgZml0X2NoZWNrX3JhbWRpc2sgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG9zX25vZmZzZXQsCisJCXVpbnQ4X3QgYXJjaCwgaW50IHZlcmlmeSk7CisjZW5kaWYKKworI2Vsc2UKKyNpbmNsdWRlICJta2ltYWdlLmgiCisjaW5jbHVkZSA8dS1ib290L21kNS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2VuZGlmIC8qICFVU0VfSE9TVENDKi8KKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX2FyY2hbXSA9IHsKKwl7CUlIX0FSQ0hfSU5WQUxJRCwJTlVMTCwJCSJJbnZhbGlkIEFSQ0giLAl9LAorCXsJSUhfQVJDSF9BTFBIQSwJCSJhbHBoYSIsCSJBbHBoYSIsCX0sCisJewlJSF9BUkNIX0FSTSwJCSJhcm0iLAkJIkFSTSIsCQl9LAorCXsJSUhfQVJDSF9JMzg2LAkJIng4NiIsCQkiSW50ZWwgeDg2IiwJfSwKKwl7CUlIX0FSQ0hfSUE2NCwJCSJpYTY0IiwJCSJJQTY0IiwJCX0sCisJewlJSF9BUkNIX002OEssCQkibTY4ayIsCQkiTTY4SyIsCQl9LAorCXsJSUhfQVJDSF9NSUNST0JMQVpFLAkibWljcm9ibGF6ZSIsCSJNaWNyb0JsYXplIiwJfSwKKwl7CUlIX0FSQ0hfTUlQUywJCSJtaXBzIiwJCSJNSVBTIiwJCX0sCisJewlJSF9BUkNIX01JUFM2NCwJCSJtaXBzNjQiLAkiTUlQUyA2NCBCaXQiLAl9LAorCXsJSUhfQVJDSF9OSU9TMiwJCSJuaW9zMiIsCSJOSU9TIElJIiwJfSwKKwl7CUlIX0FSQ0hfUFBDLAkJInBvd2VycGMiLAkiUG93ZXJQQyIsCX0sCisJewlJSF9BUkNIX1BQQywJCSJwcGMiLAkJIlBvd2VyUEMiLAl9LAorCXsJSUhfQVJDSF9TMzkwLAkJInMzOTAiLAkJIklCTSBTMzkwIiwJfSwKKwl7CUlIX0FSQ0hfU0gsCQkic2giLAkJIlN1cGVySCIsCX0sCisJewlJSF9BUkNIX1NQQVJDLAkJInNwYXJjIiwJIlNQQVJDIiwJfSwKKwl7CUlIX0FSQ0hfU1BBUkM2NCwJInNwYXJjNjQiLAkiU1BBUkMgNjQgQml0IiwJfSwKKwl7CUlIX0FSQ0hfQkxBQ0tGSU4sCSJibGFja2ZpbiIsCSJCbGFja2ZpbiIsCX0sCisJewlJSF9BUkNIX0FWUjMyLAkJImF2cjMyIiwJIkFWUjMyIiwJfSwKKwl7CS0xLAkJCSIiLAkJIiIsCQl9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX29zW10gPSB7CisJewlJSF9PU19JTlZBTElELAlOVUxMLAkJIkludmFsaWQgT1MiLAkJfSwKKwl7CUlIX09TX0xJTlVYLAkibGludXgiLAkiTGludXgiLAkJfSwKKyNpZiBkZWZpbmVkKENPTkZJR19MWU5YS0RJKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJewlJSF9PU19MWU5YT1MsCSJseW54b3MiLAkiTHlueE9TIiwJCX0sCisjZW5kaWYKKwl7CUlIX09TX05FVEJTRCwJIm5ldGJzZCIsCSJOZXRCU0QiLAkJfSwKKwl7CUlIX09TX1JURU1TLAkicnRlbXMiLAkiUlRFTVMiLAkJfSwKKwl7CUlIX09TX1VfQk9PVCwJInUtYm9vdCIsCSJVLUJvb3QiLAkJfSwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUxGKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJewlJSF9PU19RTlgsCSJxbngiLAkJIlFOWCIsCQkJfSwKKwl7CUlIX09TX1ZYV09SS1MsCSJ2eHdvcmtzIiwJIlZ4V29ya3MiLAkJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0lOVEVHUklUWSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXsJSUhfT1NfSU5URUdSSVRZLCJpbnRlZ3JpdHkiLAkiSU5URUdSSVRZIiwJCX0sCisjZW5kaWYKKyNpZmRlZiBVU0VfSE9TVENDCisJewlJSF9PU180XzRCU0QsCSI0XzRic2QiLAkiNF80QlNEIiwJCX0sCisJewlJSF9PU19ERUxMLAkiZGVsbCIsCQkiRGVsbCIsCQkJfSwKKwl7CUlIX09TX0VTSVgsCSJlc2l4IiwJCSJFc2l4IiwJCQl9LAorCXsJSUhfT1NfRlJFRUJTRCwJImZyZWVic2QiLAkiRnJlZUJTRCIsCQl9LAorCXsJSUhfT1NfSVJJWCwJImlyaXgiLAkJIklyaXgiLAkJCX0sCisJewlJSF9PU19OQ1IsCSJuY3IiLAkJIk5DUiIsCQkJfSwKKwl7CUlIX09TX09QRU5CU0QsCSJvcGVuYnNkIiwJIk9wZW5CU0QiLAkJfSwKKwl7CUlIX09TX1BTT1MsCSJwc29zIiwJCSJwU09TIiwJCQl9LAorCXsJSUhfT1NfU0NPLAkic2NvIiwJCSJTQ08iLAkJCX0sCisJewlJSF9PU19TT0xBUklTLAkic29sYXJpcyIsCSJTb2xhcmlzIiwJCX0sCisJewlJSF9PU19TVlI0LAkic3ZyNCIsCQkiU1ZSNCIsCQkJfSwKKyNlbmRpZgorCXsJLTEsCQkiIiwJCSIiLAkJCX0sCit9OworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2VfdHlwZVtdID0geworCXsJSUhfVFlQRV9JTlZBTElELCAgICBOVUxMLAkgICJJbnZhbGlkIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfRklMRVNZU1RFTSwgImZpbGVzeXN0ZW0iLCAiRmlsZXN5c3RlbSBJbWFnZSIsCX0sCisJewlJSF9UWVBFX0ZJUk1XQVJFLCAgICJmaXJtd2FyZSIsCSAgIkZpcm13YXJlIiwJCX0sCisJewlJSF9UWVBFX0tFUk5FTCwJICAgICJrZXJuZWwiLAkgICJLZXJuZWwgSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9NVUxUSSwJICAgICJtdWx0aSIsCSAgIk11bHRpLUZpbGUgSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9SQU1ESVNLLCAgICAicmFtZGlzayIsCSAgIlJBTURpc2sgSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9TQ1JJUFQsICAgICAic2NyaXB0IiwJICAiU2NyaXB0IiwJCX0sCisJewlJSF9UWVBFX1NUQU5EQUxPTkUsICJzdGFuZGFsb25lIiwgIlN0YW5kYWxvbmUgUHJvZ3JhbSIsIH0sCisJewlJSF9UWVBFX0ZMQVREVCwgICAgICJmbGF0X2R0IiwgICAgIkZsYXQgRGV2aWNlIFRyZWUiLAl9LAorCXsJSUhfVFlQRV9LV0JJTUFHRSwgICAia3diaW1hZ2UiLCAgICJLaXJrd29vZCBCb290IEltYWdlIix9LAorCXsJSUhfVFlQRV9JTVhJTUFHRSwgICAiaW14aW1hZ2UiLCAgICJGcmVlc2NhbGUgaS5NWCBCb290IEltYWdlIix9LAorCXsJLTEsCQkgICAgIiIsCQkgICIiLAkJCX0sCit9OworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2VfY29tcFtdID0geworCXsJSUhfQ09NUF9OT05FLAkibm9uZSIsCQkidW5jb21wcmVzc2VkIiwJCX0sCisJewlJSF9DT01QX0JaSVAyLAkiYnppcDIiLAkiYnppcDIgY29tcHJlc3NlZCIsCX0sCisJewlJSF9DT01QX0daSVAsCSJnemlwIiwJCSJnemlwIGNvbXByZXNzZWQiLAl9LAorCXsJSUhfQ09NUF9MWk1BLAkibHptYSIsCQkibHptYSBjb21wcmVzc2VkIiwJfSwKKwl7CUlIX0NPTVBfTFpPLAkibHpvIiwJCSJsem8gY29tcHJlc3NlZCIsCX0sCisJewktMSwJCSIiLAkJIiIsCQkJfSwKK307CisKK3VpbnQzMl90IGNyYzMyICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKK3VpbnQzMl90IGNyYzMyX3dkICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50LCB1aW50KTsKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCitzdGF0aWMgdm9pZCBnZW5pbWdfcHJpbnRfdGltZSAodGltZV90IHRpbWVzdGFtcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTGVnYWN5IGZvcm1hdCByb3V0aW5lcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGltYWdlX2NoZWNrX2hjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJdWxvbmcgaGNyYzsKKwl1bG9uZyBsZW4gPSBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCk7CisJaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOworCisJLyogQ29weSBoZWFkZXIgc28gd2UgY2FuIGJsYW5rIENSQyBmaWVsZCBmb3IgcmUtY2FsY3VsYXRpb24gKi8KKwltZW1tb3ZlICgmaGVhZGVyLCAoY2hhciAqKWhkciwgaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpKTsKKwlpbWFnZV9zZXRfaGNyYyAoJmhlYWRlciwgMCk7CisKKwloY3JjID0gY3JjMzIgKDAsICh1bnNpZ25lZCBjaGFyICopJmhlYWRlciwgbGVuKTsKKworCXJldHVybiAoaGNyYyA9PSBpbWFnZV9nZXRfaGNyYyAoaGRyKSk7Cit9CisKK2ludCBpbWFnZV9jaGVja19kY3JjIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXVsb25nIGRhdGEgPSBpbWFnZV9nZXRfZGF0YSAoaGRyKTsKKwl1bG9uZyBsZW4gPSBpbWFnZV9nZXRfZGF0YV9zaXplIChoZHIpOworCXVsb25nIGRjcmMgPSBjcmMzMl93ZCAoMCwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBsZW4sIENIVU5LU1pfQ1JDMzIpOworCisJcmV0dXJuIChkY3JjID09IGltYWdlX2dldF9kY3JjIChoZHIpKTsKK30KKworLyoqCisgKiBpbWFnZV9tdWx0aV9jb3VudCAtIGdldCBjb21wb25lbnQgKHN1Yi1pbWFnZSkgY291bnQKKyAqIEBoZHI6IHBvaW50ZXIgdG8gdGhlIGhlYWRlciBvZiB0aGUgbXVsdGkgY29tcG9uZW50IGltYWdlCisgKgorICogaW1hZ2VfbXVsdGlfY291bnQoKSByZXR1cm5zIG51bWJlciBvZiBjb21wb25lbnRzIGluIGEgbXVsdGkKKyAqIGNvbXBvbmVudCBpbWFnZS4KKyAqCisgKiBOb3RlOiBubyBjaGVja2luZyBvZiB0aGUgaW1hZ2UgdHlwZSBpcyBkb25lLCBjYWxsZXIgbXVzdCBwYXNzCisgKiBhIHZhbGlkIG11bHRpIGNvbXBvbmVudCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG51bWJlciBvZiBjb21wb25lbnRzCisgKi8KK3Vsb25nIGltYWdlX211bHRpX2NvdW50IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXVsb25nIGksIGNvdW50ID0gMDsKKwl1aW50MzJfdCAqc2l6ZTsKKworCS8qIGdldCBzdGFydCBvZiB0aGUgaW1hZ2UgcGF5bG9hZCwgd2hpY2ggaW4gY2FzZSBvZiBtdWx0aQorCSAqIGNvbXBvbmVudCBpbWFnZXMgdGhhdCBwb2ludHMgdG8gYSB0YWJsZSBvZiBjb21wb25lbnQgc2l6ZXMgKi8KKwlzaXplID0gKHVpbnQzMl90ICopaW1hZ2VfZ2V0X2RhdGEgKGhkcik7CisKKwkvKiBjb3VudCBub24gZW1wdHkgc2xvdHMgKi8KKwlmb3IgKGkgPSAwOyBzaXplW2ldOyArK2kpCisJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogaW1hZ2VfbXVsdGlfZ2V0aW1nIC0gZ2V0IGNvbXBvbmVudCBkYXRhIGFkZHJlc3MgYW5kIHNpemUKKyAqIEBoZHI6IHBvaW50ZXIgdG8gdGhlIGhlYWRlciBvZiB0aGUgbXVsdGkgY29tcG9uZW50IGltYWdlCisgKiBAaWR4OiBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGNvbXBvbmVudAorICogQGRhdGE6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIGNvbXBvbmVudCBkYXRhIGFkZHJlc3MKKyAqIEBsZW46IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIGNvbXBvbmVudCBzaXplCisgKgorICogaW1hZ2VfbXVsdGlfZ2V0aW1nKCkgcmV0dXJucyBzaXplIGFuZCBkYXRhIGFkZHJlc3MgZm9yIHRoZSByZXF1ZXN0ZWQKKyAqIGNvbXBvbmVudCBpbiBhIG11bHRpIGNvbXBvbmVudCBpbWFnZS4KKyAqCisgKiBOb3RlOiBubyBjaGVja2luZyBvZiB0aGUgaW1hZ2UgdHlwZSBpcyBkb25lLCBjYWxsZXIgbXVzdCBwYXNzCisgKiBhIHZhbGlkIG11bHRpIGNvbXBvbmVudCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGRhdGEgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgY29tcG9uZW50LCBpZiBpZHggaXMgdmFsaWQKKyAqICAgICAwIGluIGRhdGEgYW5kIGxlbiwgaWYgaWR4IGlzIG91dCBvZiByYW5nZQorICovCit2b2lkIGltYWdlX211bHRpX2dldGltZyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWxvbmcgaWR4LAorCQkJdWxvbmcgKmRhdGEsIHVsb25nICpsZW4pCit7CisJaW50IGk7CisJdWludDMyX3QgKnNpemU7CisJdWxvbmcgb2Zmc2V0LCBjb3VudCwgaW1nX2RhdGE7CisKKwkvKiBnZXQgbnVtYmVyIG9mIGNvbXBvbmVudCAqLworCWNvdW50ID0gaW1hZ2VfbXVsdGlfY291bnQgKGhkcik7CisKKwkvKiBnZXQgc3RhcnQgb2YgdGhlIGltYWdlIHBheWxvYWQsIHdoaWNoIGluIGNhc2Ugb2YgbXVsdGkKKwkgKiBjb21wb25lbnQgaW1hZ2VzIHRoYXQgcG9pbnRzIHRvIGEgdGFibGUgb2YgY29tcG9uZW50IHNpemVzICovCisJc2l6ZSA9ICh1aW50MzJfdCAqKWltYWdlX2dldF9kYXRhIChoZHIpOworCisJLyogZ2V0IGFkZHJlc3Mgb2YgdGhlIHByb3BlciBjb21wb25lbnQgZGF0YSBzdGFydCwgd2hpY2ggbWVhbnMKKwkgKiBza2lwcGluZyBzaXplcyB0YWJsZSAoYWRkIDEgZm9yIGxhc3QsIG51bGwgZW50cnkpICovCisJaW1nX2RhdGEgPSBpbWFnZV9nZXRfZGF0YSAoaGRyKSArIChjb3VudCArIDEpICogc2l6ZW9mICh1aW50MzJfdCk7CisKKwlpZiAoaWR4IDwgY291bnQpIHsKKwkJKmxlbiA9IHVpbWFnZV90b19jcHUgKHNpemVbaWR4XSk7CisJCW9mZnNldCA9IDA7CisKKwkJLyogZ28gb3ZlciBhbGwgaW5kaWNlcyBwcmVjZWRpbmcgcmVxdWVzdGVkIGNvbXBvbmVudCBpZHggKi8KKwkJZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKSB7CisJCQkvKiBhZGQgdXAgaS10aCBjb21wb25lbnQgc2l6ZSwgcm91bmRpbmcgdXAgdG8gNCBieXRlcyAqLworCQkJb2Zmc2V0ICs9ICh1aW1hZ2VfdG9fY3B1IChzaXplW2ldKSArIDMpICYgfjMgOworCQl9CisKKwkJLyogY2FsY3VsYXRlIGlkeC10aCBjb21wb25lbnQgZGF0YSBhZGRyZXNzICovCisJCSpkYXRhID0gaW1nX2RhdGEgKyBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJKmxlbiA9IDA7CisJCSpkYXRhID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGltYWdlX3ByaW50X3R5cGUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJY29uc3QgY2hhciAqb3MsICphcmNoLCAqdHlwZSwgKmNvbXA7CisKKwlvcyA9IGdlbmltZ19nZXRfb3NfbmFtZSAoaW1hZ2VfZ2V0X29zIChoZHIpKTsKKwlhcmNoID0gZ2VuaW1nX2dldF9hcmNoX25hbWUgKGltYWdlX2dldF9hcmNoIChoZHIpKTsKKwl0eXBlID0gZ2VuaW1nX2dldF90eXBlX25hbWUgKGltYWdlX2dldF90eXBlIChoZHIpKTsKKwljb21wID0gZ2VuaW1nX2dldF9jb21wX25hbWUgKGltYWdlX2dldF9jb21wIChoZHIpKTsKKworCXByaW50ZiAoIiVzICVzICVzICglcylcbiIsIGFyY2gsIG9zLCB0eXBlLCBjb21wKTsKK30KKworLyoqCisgKiBpbWFnZV9wcmludF9jb250ZW50cyAtIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsZWdhY3kgZm9ybWF0IGltYWdlCisgKiBAcHRyOiBwb2ludGVyIHRvIHRoZSBsZWdhY3kgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGltYWdlX3ByaW50X2NvbnRlbnRzKCkgZm9ybWF0cyBhIG11bHRpIGxpbmUgbGVnYWN5IGltYWdlIGNvbnRlbnRzIGRlc2NyaXB0aW9uLgorICogVGhlIHJvdXRpbmUgcHJpbnRzIG91dCBhbGwgaGVhZGVyIGZpZWxkcyBmb2xsb3dlZCBieSB0aGUgc2l6ZS9vZmZzZXQgZGF0YQorICogZm9yIE1VTFRJL1NDUklQVCBpbWFnZXMuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgaW1hZ2VfcHJpbnRfY29udGVudHMgKGNvbnN0IHZvaWQgKnB0cikKK3sKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopcHRyOworCWNvbnN0IGNoYXIgKnA7CisKKyNpZmRlZiBVU0VfSE9TVENDCisJcCA9ICIiOworI2Vsc2UKKwlwID0gIiAgICI7CisjZW5kaWYKKworCXByaW50ZiAoIiVzSW1hZ2UgTmFtZTogICAlLipzXG4iLCBwLCBJSF9OTUxFTiwgaW1hZ2VfZ2V0X25hbWUgKGhkcikpOworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwlwcmludGYgKCIlc0NyZWF0ZWQ6ICAgICAgIiwgcCk7CisJZ2VuaW1nX3ByaW50X3RpbWUgKCh0aW1lX3QpaW1hZ2VfZ2V0X3RpbWUgKGhkcikpOworI2VuZGlmCisJcHJpbnRmICgiJXNJbWFnZSBUeXBlOiAgICIsIHApOworCWltYWdlX3ByaW50X3R5cGUgKGhkcik7CisJcHJpbnRmICgiJXNEYXRhIFNpemU6ICAgICIsIHApOworCWdlbmltZ19wcmludF9zaXplIChpbWFnZV9nZXRfZGF0YV9zaXplIChoZHIpKTsKKwlwcmludGYgKCIlc0xvYWQgQWRkcmVzczogJTA4eFxuIiwgcCwgaW1hZ2VfZ2V0X2xvYWQgKGhkcikpOworCXByaW50ZiAoIiVzRW50cnkgUG9pbnQ6ICAlMDh4XG4iLCBwLCBpbWFnZV9nZXRfZXAgKGhkcikpOworCisJaWYgKGltYWdlX2NoZWNrX3R5cGUgKGhkciwgSUhfVFlQRV9NVUxUSSkgfHwKKwkJCWltYWdlX2NoZWNrX3R5cGUgKGhkciwgSUhfVFlQRV9TQ1JJUFQpKSB7CisJCWludCBpOworCQl1bG9uZyBkYXRhLCBsZW47CisJCXVsb25nIGNvdW50ID0gaW1hZ2VfbXVsdGlfY291bnQgKGhkcik7CisKKwkJcHJpbnRmICgiJXNDb250ZW50czpcbiIsIHApOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaW1hZ2VfbXVsdGlfZ2V0aW1nIChoZHIsIGksICZkYXRhLCAmbGVuKTsKKworCQkJcHJpbnRmICgiJXMgICBJbWFnZSAlZDogIiwgcCwgaSk7CisJCQlnZW5pbWdfcHJpbnRfc2l6ZSAobGVuKTsKKworCQkJaWYgKGltYWdlX2NoZWNrX3R5cGUgKGhkciwgSUhfVFlQRV9TQ1JJUFQpICYmIGkgPiAwKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgdXNlciBtYXkgbmVlZCB0byBrbm93IG9mZnNldHMKKwkJCQkgKiBpZiBwbGFubmluZyB0byBkbyBzb21ldGhpbmcgd2l0aAorCQkJCSAqIG11bHRpcGxlIGZpbGVzCisJCQkJICovCisJCQkJcHJpbnRmICgiJXMgICAgT2Zmc2V0ID0gMHglMDhseFxuIiwgcCwgZGF0YSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNoYXJlZCBkdWFsLWZvcm1hdCByb3V0aW5lcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBVU0VfSE9TVENDCit2b2lkIG1lbW1vdmVfd2QgKHZvaWQgKnRvLCB2b2lkICpmcm9tLCBzaXplX3QgbGVuLCB1bG9uZyBjaHVua3N6KQoreworCWlmICh0byA9PSBmcm9tKQorCQlyZXR1cm47CisKKyNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc2l6ZV90IHRhaWwgPSAobGVuID4gY2h1bmtzeikgPyBjaHVua3N6IDogbGVuOworCQlXQVRDSERPR19SRVNFVCAoKTsKKwkJbWVtbW92ZSAodG8sIGZyb20sIHRhaWwpOworCQl0byArPSB0YWlsOworCQlmcm9tICs9IHRhaWw7CisJCWxlbiAtPSB0YWlsOworCX0KKyNlbHNlCS8qICEoQ09ORklHX0hXX1dBVENIRE9HIHx8IENPTkZJR19XQVRDSERPRykgKi8KKwltZW1tb3ZlICh0bywgZnJvbSwgbGVuKTsKKyNlbmRpZgkvKiBDT05GSUdfSFdfV0FUQ0hET0cgfHwgQ09ORklHX1dBVENIRE9HICovCit9CisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKwordm9pZCBnZW5pbWdfcHJpbnRfc2l6ZSAodWludDMyX3Qgc2l6ZSkKK3sKKyNpZm5kZWYgVVNFX0hPU1RDQworCXByaW50ZiAoIiVkIEJ5dGVzID0gIiwgc2l6ZSk7CisJcHJpbnRfc2l6ZSAoc2l6ZSwgIlxuIik7CisjZWxzZQorCXByaW50ZiAoIiVkIEJ5dGVzID0gJS4yZiBrQiA9ICUuMmYgTUJcbiIsCisJCQlzaXplLCAoZG91YmxlKXNpemUgLyAxLjAyNGUzLAorCQkJKGRvdWJsZSlzaXplIC8gMS4wNDg1NzZlNik7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKK3N0YXRpYyB2b2lkIGdlbmltZ19wcmludF90aW1lICh0aW1lX3QgdGltZXN0YW1wKQoreworI2lmbmRlZiBVU0VfSE9TVENDCisJc3RydWN0IHJ0Y190aW1lIHRtOworCisJdG9fdG0gKHRpbWVzdGFtcCwgJnRtKTsKKwlwcmludGYgKCIlNGQtJTAyZC0lMDJkICAlMmQ6JTAyZDolMDJkIFVUQ1xuIiwKKwkJCXRtLnRtX3llYXIsIHRtLnRtX21vbiwgdG0udG1fbWRheSwKKwkJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKyNlbHNlCisJcHJpbnRmICgiJXMiLCBjdGltZSgmdGltZXN0YW1wKSk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBDT05GSUdfVElNRVNUQU1QIHx8IENPTkZJR19DTURfREFURSB8fCBVU0VfSE9TVENDICovCisKKy8qKgorICogZ2V0X3RhYmxlX2VudHJ5X25hbWUgLSB0cmFuc2xhdGUgZW50cnkgaWQgdG8gbG9uZyBuYW1lCisgKiBAdGFibGU6IHBvaW50ZXIgdG8gYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgZW50cmllcyBvZiBhIHNwZWNpZmljIHR5cGUKKyAqIEBtc2c6IG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgd2hlbiB0cmFuc2xhdGlvbiBmYWlscworICogQGlkOiBlbnRyeSBpZCB0byBiZSB0cmFuc2xhdGVkCisgKgorICogZ2V0X3RhYmxlX2VudHJ5X25hbWUoKSB3aWxsIGdvIG92ZXIgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQKKyAqIGVudHJ5IHRoYXQgbWF0Y2hlcyBnaXZlbiBpZC4gSWYgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsIGl0cyBsb25nCisgKiBuYW1lIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBsb25nIGVudHJ5IG5hbWUgaWYgdHJhbnNsYXRpb24gc3VjY2VlZHMKKyAqICAgICBtc2cgb3RoZXJ3aXNlCisgKi8KK2NoYXIgKmdldF90YWJsZV9lbnRyeV9uYW1lICh0YWJsZV9lbnRyeV90ICp0YWJsZSwgY2hhciAqbXNnLCBpbnQgaWQpCit7CisJZm9yICg7IHRhYmxlLT5pZCA+PSAwOyArK3RhYmxlKSB7CisJCWlmICh0YWJsZS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gdGFibGUtPmxuYW1lOworCX0KKwlyZXR1cm4gKG1zZyk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfb3NfbmFtZSAodWludDhfdCBvcykKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9uYW1lICh1aW1hZ2Vfb3MsICJVbmtub3duIE9TIiwgb3MpKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9hcmNoX25hbWUgKHVpbnQ4X3QgYXJjaCkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9uYW1lICh1aW1hZ2VfYXJjaCwgIlVua25vd24gQXJjaGl0ZWN0dXJlIiwgYXJjaCkpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X3R5cGVfbmFtZSAodWludDhfdCB0eXBlKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV90eXBlLCAiVW5rbm93biBJbWFnZSIsIHR5cGUpKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9jb21wX25hbWUgKHVpbnQ4X3QgY29tcCkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9uYW1lICh1aW1hZ2VfY29tcCwgIlVua25vd24gQ29tcHJlc3Npb24iLCBjb21wKSk7Cit9CisKKy8qKgorICogZ2V0X3RhYmxlX2VudHJ5X2lkIC0gdHJhbnNsYXRlIHNob3J0IGVudHJ5IG5hbWUgdG8gaWQKKyAqIEB0YWJsZTogcG9pbnRlciB0byBhIHRyYW5zbGF0aW9uIHRhYmxlIGZvciBlbnRyaWVzIG9mIGEgc3BlY2lmaWMgdHlwZQorICogQHRhYmxlX25hbWU6IHRvIGJlIHVzZWQgaW4gY2FzZSBvZiBlcnJvcgorICogQG5hbWU6IGVudHJ5IHNob3J0IG5hbWUgdG8gYmUgdHJhbnNsYXRlZAorICoKKyAqIGdldF90YWJsZV9lbnRyeV9pZCgpIHdpbGwgZ28gb3ZlciB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZAorICogZW50cnkgdGhhdCBtYXRjaGVzIGdpdmVuIHNob3J0IG5hbWUuIElmIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLAorICogaXRzIGlkIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBlbnRyeSBpZCBpZiB0cmFuc2xhdGlvbiBzdWNjZWVkcworICogICAgIC0xIG90aGVyd2lzZQorICovCitpbnQgZ2V0X3RhYmxlX2VudHJ5X2lkICh0YWJsZV9lbnRyeV90ICp0YWJsZSwKKwkJY29uc3QgY2hhciAqdGFibGVfbmFtZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl0YWJsZV9lbnRyeV90ICp0OworI2lmZGVmIFVTRV9IT1NUQ0MKKwlpbnQgZmlyc3QgPSAxOworCisJZm9yICh0ID0gdGFibGU7IHQtPmlkID49IDA7ICsrdCkgeworCQlpZiAodC0+c25hbWUgJiYgc3RyY2FzZWNtcCh0LT5zbmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAodC0+aWQpOworCX0KKworCWZwcmludGYgKHN0ZGVyciwgIlxuSW52YWxpZCAlcyBUeXBlIC0gdmFsaWQgbmFtZXMgYXJlIiwgdGFibGVfbmFtZSk7CisJZm9yICh0ID0gdGFibGU7IHQtPmlkID49IDA7ICsrdCkgeworCQlpZiAodC0+c25hbWUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmcHJpbnRmIChzdGRlcnIsICIlYyAlcyIsIChmaXJzdCkgPyAnOicgOiAnLCcsIHQtPnNuYW1lKTsKKwkJZmlyc3QgPSAwOworCX0KKwlmcHJpbnRmIChzdGRlcnIsICJcbiIpOworI2Vsc2UKKwlmb3IgKHQgPSB0YWJsZTsgdC0+aWQgPj0gMDsgKyt0KSB7CisJCWlmICh0LT5zbmFtZSAmJiBzdHJjbXAodC0+c25hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gKHQtPmlkKTsKKwl9CisJZGVidWcgKCJJbnZhbGlkICVzIFR5cGU6ICVzXG4iLCB0YWJsZV9uYW1lLCBuYW1lKTsKKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisJcmV0dXJuICgtMSk7Cit9CisKK2ludCBnZW5pbWdfZ2V0X29zX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2Vfb3MsICJPUyIsIG5hbWUpKTsKK30KKworaW50IGdlbmltZ19nZXRfYXJjaF9pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX2FyY2gsICJDUFUiLCBuYW1lKSk7Cit9CisKK2ludCBnZW5pbWdfZ2V0X3R5cGVfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV90eXBlLCAiSW1hZ2UiLCBuYW1lKSk7Cit9CisKK2ludCBnZW5pbWdfZ2V0X2NvbXBfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV9jb21wLCAiQ29tcHJlc3Npb24iLCBuYW1lKSk7Cit9CisKKyNpZm5kZWYgVVNFX0hPU1RDQworLyoqCisgKiBnZW5pbWdfZ2V0X2Zvcm1hdCAtIGdldCBpbWFnZSBmb3JtYXQgdHlwZQorICogQGltZ19hZGRyOiBpbWFnZSBzdGFydCBhZGRyZXNzCisgKgorICogZ2VuaW1nX2dldF9mb3JtYXQoKSBjaGVja3Mgd2hldGhlciBwcm92aWRlZCBhZGRyZXNzIHBvaW50cyB0byBhIHZhbGlkCisgKiBsZWdhY3kgb3IgRklUIGltYWdlLgorICoKKyAqIE5ldyB1SW1hZ2UgZm9ybWF0IGFuZCBGRFQgYmxvYiBhcmUgYmFzZWQgb24gYSBsaWJmZHQuIEZEVCBibG9iCisgKiBtYXkgYmUgcGFzc2VkIGRpcmVjdGx5IG9yIGVtYmVkZGVkIGluIGEgRklUIGltYWdlLiBJbiBib3RoIHNpdHVhdGlvbnMKKyAqIGdlbmltZ19nZXRfZm9ybWF0KCkgbXVzdCBiZSBhYmxlIHRvIGRlY3RlY3QgbGliZmR0IGhlYWRlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIGZvcm1hdCB0eXBlIG9yIElNQUdFX0ZPUk1BVF9JTlZBTElEIGlmIG5vIGltYWdlIGlzIHByZXNlbnQKKyAqLworaW50IGdlbmltZ19nZXRfZm9ybWF0ICh2b2lkICppbWdfYWRkcikKK3sKKwl1bG9uZyBmb3JtYXQgPSBJTUFHRV9GT1JNQVRfSU5WQUxJRDsKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkgfHwgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorCWNoYXIgKmZpdF9oZHI7CisjZW5kaWYKKworCWhkciA9IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKWltZ19hZGRyOworCWlmIChpbWFnZV9jaGVja19tYWdpYyhoZHIpKQorCQlmb3JtYXQgPSBJTUFHRV9GT1JNQVRfTEVHQUNZOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkgfHwgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorCWVsc2UgeworCQlmaXRfaGRyID0gKGNoYXIgKilpbWdfYWRkcjsKKwkJaWYgKGZkdF9jaGVja19oZWFkZXIgKGZpdF9oZHIpID09IDApCisJCQlmb3JtYXQgPSBJTUFHRV9GT1JNQVRfRklUOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGZvcm1hdDsKK30KKworLyoqCisgKiBnZW5pbWdfZ2V0X2ltYWdlIC0gZ2V0IGltYWdlIGZyb20gc3BlY2lhbCBzdG9yYWdlIChpZiBuZWNlc3NhcnkpCisgKiBAaW1nX2FkZHI6IGltYWdlIHN0YXJ0IGFkZHJlc3MKKyAqCisgKiBnZW5pbWdfZ2V0X2ltYWdlKCkgY2hlY2tzIGlmIHByb3ZpZGVkIGltYWdlIHN0YXJ0IGFkZGRyZXNzIGlzIGxvY2F0ZWQKKyAqIGluIGEgZGF0YWZsYXNoIHN0b3JhZ2UuIElmIHNvLCBpbWFnZSBpcyBtb3ZlZCB0byBhIHN5c3RlbSBSQU0gbWVtb3J5LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugc3RhcnQgYWRkcmVzcyBhZnRlciBwb3NzaWJsZSByZWxvY2F0aW9uIGZyb20gc3BlY2lhbCBzdG9yYWdlCisgKi8KK3Vsb25nIGdlbmltZ19nZXRfaW1hZ2UgKHVsb25nIGltZ19hZGRyKQoreworCXVsb25nIHJhbV9hZGRyID0gaW1nX2FkZHI7CisKKyNpZmRlZiBDT05GSUdfSEFTX0RBVEFGTEFTSAorCXVsb25nIGhfc2l6ZSwgZF9zaXplOworCisJaWYgKGFkZHJfZGF0YWZsYXNoIChpbWdfYWRkcikpeworCQkvKiBnZXIgUkFNIGFkZHJlc3MgKi8KKwkJcmFtX2FkZHIgPSBDT05GSUdfU1lTX0xPQURfQUREUjsKKworCQkvKiBnZXQgaGVhZGVyIHNpemUgKi8KKwkJaF9zaXplID0gaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJaWYgKHNpemVvZihzdHJ1Y3QgZmR0X2hlYWRlcikgPiBoX3NpemUpCisJCQloX3NpemUgPSBzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpOworI2VuZGlmCisKKwkJLyogcmVhZCBpbiBoZWFkZXIgKi8KKwkJZGVidWcgKCIgICBSZWFkaW5nIGltYWdlIGhlYWRlciBmcm9tIGRhdGFmbGFzaCBhZGRyZXNzICIKKwkJCSIlMDhseCB0byBSQU0gYWRkcmVzcyAlMDhseFxuIiwgaW1nX2FkZHIsIHJhbV9hZGRyKTsKKworCQlyZWFkX2RhdGFmbGFzaCAoaW1nX2FkZHIsIGhfc2l6ZSwgKGNoYXIgKilyYW1fYWRkcik7CisKKwkJLyogZ2V0IGRhdGEgc2l6ZSAqLworCQlzd2l0Y2ggKGdlbmltZ19nZXRfZm9ybWF0ICgodm9pZCAqKXJhbV9hZGRyKSkgeworCQljYXNlIElNQUdFX0ZPUk1BVF9MRUdBQ1k6CisJCQlkX3NpemUgPSBpbWFnZV9nZXRfZGF0YV9zaXplICgoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilyYW1fYWRkcik7CisJCQlkZWJ1ZyAoIiAgIExlZ2FjeSBmb3JtYXQgaW1hZ2UgZm91bmQgYXQgMHglMDhseCwgc2l6ZSAweCUwOGx4XG4iLAorCQkJCQlyYW1fYWRkciwgZF9zaXplKTsKKwkJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJY2FzZSBJTUFHRV9GT1JNQVRfRklUOgorCQkJZF9zaXplID0gZml0X2dldF9zaXplICgoY29uc3Qgdm9pZCAqKXJhbV9hZGRyKSAtIGhfc2l6ZTsKKwkJCWRlYnVnICgiICAgRklUL0ZEVCBmb3JtYXQgaW1hZ2UgZm91bmQgYXQgMHglMDhseCwgc2l6ZSAweCUwOGx4XG4iLAorCQkJCQlyYW1fYWRkciwgZF9zaXplKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlwcmludGYgKCIgICBObyB2YWxpZCBpbWFnZSBmb3VuZCBhdCAweCUwOGx4XG4iLCBpbWdfYWRkcik7CisJCQlyZXR1cm4gcmFtX2FkZHI7CisJCX0KKworCQkvKiByZWFkIGluIGltYWdlIGRhdGEgKi8KKwkJZGVidWcgKCIgICBSZWFkaW5nIGltYWdlIHJlbWFpbmluZyBkYXRhIGZyb20gZGF0YWZsYXNoIGFkZHJlc3MgIgorCQkJIiUwOGx4IHRvIFJBTSBhZGRyZXNzICUwOGx4XG4iLCBpbWdfYWRkciArIGhfc2l6ZSwKKwkJCXJhbV9hZGRyICsgaF9zaXplKTsKKworCQlyZWFkX2RhdGFmbGFzaCAoaW1nX2FkZHIgKyBoX3NpemUsIGRfc2l6ZSwKKwkJCQkoY2hhciAqKShyYW1fYWRkciArIGhfc2l6ZSkpOworCisJfQorI2VuZGlmIC8qIENPTkZJR19IQVNfREFUQUZMQVNIICovCisKKwlyZXR1cm4gcmFtX2FkZHI7Cit9CisKKy8qKgorICogZml0X2hhc19jb25maWcgLSBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIEZJVCBjb25maWd1cmF0aW9uCisgKiBAaW1hZ2VzOiBwb2ludGVyIHRvIHRoZSBib290bSBjb21tYW5kIGhlYWRlcnMgc3RydWN0dXJlCisgKgorICogZml0X2hhc19jb25maWcoKSBjaGVja3MgaWYgdGhlcmUgaXMgYSBGSVQgY29uZmlndXJhdGlvbiBpbiB1c2UKKyAqIChpZiBGVEkgc3VwcG9ydCBpcyBwcmVzZW50KS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG5vIEZJVCBzdXBwb3J0IG9yIG5vIGNvbmZpZ3VyYXRpb24gZm91bmQKKyAqICAgICAxLCBjb25maWd1cmF0aW9uIGZvdW5kCisgKi8KK2ludCBnZW5pbWdfaGFzX2NvbmZpZyAoYm9vdG1faGVhZGVyc190ICppbWFnZXMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCWlmIChpbWFnZXMtPmZpdF91bmFtZV9jZmcpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCitzdGF0aWMgdm9pZCBmZHRfZXJyb3IgKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlwdXRzICgiRVJST1I6ICIpOworCXB1dHMgKG1zZyk7CisJcHV0cyAoIiAtIG11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKK30KKworc3RhdGljIGNvbnN0IGltYWdlX2hlYWRlcl90ICppbWFnZV9nZXRfZmR0ICh1bG9uZyBmZHRfYWRkcikKK3sKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqZmR0X2hkciA9IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKWZkdF9hZGRyOworCisJaW1hZ2VfcHJpbnRfY29udGVudHMgKGZkdF9oZHIpOworCisJcHV0cyAoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CisJaWYgKCFpbWFnZV9jaGVja19oY3JjIChmZHRfaGRyKSkgeworCQlmZHRfZXJyb3IgKCJmZHQgaGVhZGVyIGNoZWNrc3VtIGludmFsaWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFpbWFnZV9jaGVja19kY3JjIChmZHRfaGRyKSkgeworCQlmZHRfZXJyb3IgKCJmZHQgY2hlY2tzdW0gaW52YWxpZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcHV0cyAoIk9LXG4iKTsKKworCWlmICghaW1hZ2VfY2hlY2tfdHlwZSAoZmR0X2hkciwgSUhfVFlQRV9GTEFURFQpKSB7CisJCWZkdF9lcnJvciAoInVJbWFnZSBpcyBub3QgYSBmZHQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChpbWFnZV9nZXRfY29tcCAoZmR0X2hkcikgIT0gSUhfQ09NUF9OT05FKSB7CisJCWZkdF9lcnJvciAoInVJbWFnZSBpcyBjb21wcmVzc2VkIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZmR0X2NoZWNrX2hlYWRlciAoKGNoYXIgKilpbWFnZV9nZXRfZGF0YSAoZmR0X2hkcikpICE9IDApIHsKKwkJZmR0X2Vycm9yICgidUltYWdlIGRhdGEgaXMgbm90IGEgZmR0Iik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZmR0X2hkcjsKK30KKworLyoqCisgKiBmaXRfY2hlY2tfZmR0IC0gdmVyaWZ5IEZJVCBmb3JtYXQgRkRUIHN1YmltYWdlCisgKiBAZml0X2hkcjogcG9pbnRlciB0byB0aGUgRklUICBoZWFkZXIKKyAqIGZkdF9ub2Zmc2V0OiBGRFQgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgd2l0aGluIEZJVCBpbWFnZQorICogQHZlcmlmeTogZGF0YSBDUkMgdmVyaWZpY2F0aW9uIGZsYWcKKyAqCisgKiBmaXRfY2hlY2tfZmR0KCkgdmVyaWZpZXMgaW50ZWdyaXR5IG9mIHRoZSBGRFQgc3ViaW1hZ2UgYW5kIGZyb20KKyAqIHNwZWNpZmllZCBGSVQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBvbiBzdWNjZXNzCisgKiAgICAgMCwgb24gZmFpbHVyZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorc3RhdGljIGludCBmaXRfY2hlY2tfZmR0IChjb25zdCB2b2lkICpmaXQsIGludCBmZHRfbm9mZnNldCwgaW50IHZlcmlmeSkKK3sKKwlmaXRfaW1hZ2VfcHJpbnQgKGZpdCwgZmR0X25vZmZzZXQsICIgICAiKTsKKworCWlmICh2ZXJpZnkpIHsKKwkJcHV0cyAoIiAgIFZlcmlmeWluZyBIYXNoIEludGVncml0eSAuLi4gIik7CisJCWlmICghZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoZml0LCBmZHRfbm9mZnNldCkpIHsKKwkJCWZkdF9lcnJvciAoIkJhZCBEYXRhIEhhc2giKTsKKwkJCXJldHVybiAwOworCQl9CisJCXB1dHMgKCJPS1xuIik7CisJfQorCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoZml0LCBmZHRfbm9mZnNldCwgSUhfVFlQRV9GTEFURFQpKSB7CisJCWZkdF9lcnJvciAoIk5vdCBhIEZEVCBpbWFnZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19jb21wIChmaXQsIGZkdF9ub2Zmc2V0LCBJSF9DT01QX05PTkUpKSB7CisJCWZkdF9lcnJvciAoIkZEVCBpbWFnZSBpcyBjb21wcmVzc2VkIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19GSVQgKi8KKworI2lmbmRlZiBDT05GSUdfU1lTX0ZEVF9QQUQKKyNkZWZpbmUgQ09ORklHX1NZU19GRFRfUEFEIDB4MzAwMAorI2VuZGlmCisKKy8qKgorICogYm9vdF9yZWxvY2F0ZV9mZHQgLSByZWxvY2F0ZSBmbGF0IGRldmljZSB0cmVlCisgKiBAbG1iOiBwb2ludGVyIHRvIGxtYiBoYW5kbGUsIHdpbGwgYmUgdXNlZCBmb3IgbWVtb3J5IG1nbXQKKyAqIEBib290bWFwX2Jhc2U6IGJhc2UgYWRkcmVzcyBvZiB0aGUgYm9vdG1hcCByZWdpb24KKyAqIEBvZl9mbGF0X3RyZWU6IHBvaW50ZXIgdG8gYSBjaGFyKiB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBzdGFydCBhZGRyZXNzCisgKiBAb2Zfc2l6ZTogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IGxlbmd0aAorICoKKyAqIGJvb3RfcmVsb2NhdGVfZmR0KCkgZGV0ZXJtaW5lcyBpZiB0aGUgb2ZfZmxhdF90cmVlIGFkZHJlc3MgaXMgd2l0aGluCisgKiB0aGUgYm9vdG1hcCBhbmQgaWYgbm90IHJlbG9jYXRlcyBpdCBpbnRvIHRoYXQgcmVnaW9uCisgKgorICogb2ZfZmxhdF90cmVlIGFuZCBvZl9zaXplIGFyZSBzZXQgdG8gZmluYWwgKGFmdGVyIHJlbG9jYXRpb24pIHZhbHVlcworICoKKyAqIHJldHVybnM6CisgKiAgICAgIDAgLSBzdWNjZXNzCisgKiAgICAgIDEgLSBmYWlsdXJlCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQk9PVE1BUFNaKQoraW50IGJvb3RfcmVsb2NhdGVfZmR0IChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nIGJvb3RtYXBfYmFzZSwKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpCit7CisJY2hhcgkqZmR0X2Jsb2IgPSAqb2ZfZmxhdF90cmVlOworCXVsb25nCXJlbG9jYXRlID0gMDsKKwl1bG9uZwlvZl9sZW4gPSAwOworCisJLyogbm90aGluZyB0byBkbyAqLworCWlmICgqb2Zfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChmZHRfY2hlY2tfaGVhZGVyIChmZHRfYmxvYikgIT0gMCkgeworCQlmZHRfZXJyb3IgKCJpbWFnZSBpcyBub3QgYSBmZHQiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKyNpZm5kZWYgQ09ORklHX1NZU19OT19GTEFTSAorCS8qIG1vdmUgdGhlIGJsb2IgaWYgaXQgaXMgaW4gZmxhc2ggKHNldCByZWxvY2F0ZSkgKi8KKwlpZiAoYWRkcjJpbmZvICgodWxvbmcpZmR0X2Jsb2IpICE9IE5VTEwpCisJCXJlbG9jYXRlID0gMTsKKyNlbmRpZgorCisJLyoKKwkgKiBUaGUgYmxvYiBuZWVkcyB0byBiZSBpbnNpZGUgdGhlIGJvb3QgbWFwcGluZy4KKwkgKi8KKwlpZiAoZmR0X2Jsb2IgPCAoY2hhciAqKWJvb3RtYXBfYmFzZSkKKwkJcmVsb2NhdGUgPSAxOworCisJaWYgKChmZHRfYmxvYiArICpvZl9zaXplICsgQ09ORklHX1NZU19GRFRfUEFEKSA+PQorCQkJKChjaGFyICopQ09ORklHX1NZU19CT09UTUFQU1ogKyBib290bWFwX2Jhc2UpKQorCQlyZWxvY2F0ZSA9IDE7CisKKwkvKiBtb3ZlIGZsYXR0ZW5kIGRldmljZSB0cmVlIGlmIG5lZWRlZCAqLworCWlmIChyZWxvY2F0ZSkgeworCQlpbnQgZXJyOworCQl1bG9uZyBvZl9zdGFydCA9IDA7CisKKwkJLyogcG9zaXRpb24gb24gYSA0SyBib3VuZGFyeSBiZWZvcmUgdGhlIGFsbG9jX2N1cnJlbnQgKi8KKwkJLyogUGFkIHRoZSBGRFQgYnkgYSBzcGVjaWZpZWQgYW1vdW50ICovCisJCW9mX2xlbiA9ICpvZl9zaXplICsgQ09ORklHX1NZU19GRFRfUEFEOworCQlvZl9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWxtYl9hbGxvY19iYXNlKGxtYiwgb2ZfbGVuLCAweDEwMDAsCisJCQkJKENPTkZJR19TWVNfQk9PVE1BUFNaICsgYm9vdG1hcF9iYXNlKSk7CisKKwkJaWYgKG9mX3N0YXJ0ID09IDApIHsKKwkJCXB1dHMoImRldmljZSB0cmVlIC0gYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJZGVidWcgKCIjIyBkZXZpY2UgdHJlZSBhdCAweCUwOGxYIC4uLiAweCUwOGxYIChsZW49JWxkPTB4JWxYKVxuIiwKKwkJCSh1bG9uZylmZHRfYmxvYiwgKHVsb25nKWZkdF9ibG9iICsgKm9mX3NpemUgLSAxLAorCQkJb2ZfbGVuLCBvZl9sZW4pOworCisJCXByaW50ZiAoIiAgIExvYWRpbmcgRGV2aWNlIFRyZWUgdG8gJTA4bHgsIGVuZCAlMDhseCAuLi4gIiwKKwkJCW9mX3N0YXJ0LCBvZl9zdGFydCArIG9mX2xlbiAtIDEpOworCisJCWVyciA9IGZkdF9vcGVuX2ludG8gKGZkdF9ibG9iLCAodm9pZCAqKW9mX3N0YXJ0LCBvZl9sZW4pOworCQlpZiAoZXJyICE9IDApIHsKKwkJCWZkdF9lcnJvciAoImZkdCBtb3ZlIGZhaWxlZCIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlwdXRzICgiT0tcbiIpOworCisJCSpvZl9mbGF0X3RyZWUgPSAoY2hhciAqKW9mX3N0YXJ0OworCQkqb2Zfc2l6ZSA9IG9mX2xlbjsKKwl9IGVsc2UgeworCQkqb2ZfZmxhdF90cmVlID0gZmR0X2Jsb2I7CisJCW9mX2xlbiA9IChDT05GSUdfU1lTX0JPT1RNQVBTWiArIGJvb3RtYXBfYmFzZSkgLSAodWxvbmcpZmR0X2Jsb2I7CisJCWxtYl9yZXNlcnZlKGxtYiwgKHVsb25nKWZkdF9ibG9iLCBvZl9sZW4pOworCQlmZHRfc2V0X3RvdGFsc2l6ZSgqb2ZfZmxhdF90cmVlLCBvZl9sZW4pOworCisJCSpvZl9zaXplID0gb2ZfbGVuOworCX0KKworCXNldF93b3JraW5nX2ZkdF9hZGRyKCpvZl9mbGF0X3RyZWUpOworCXJldHVybiAwOworCitlcnJvcjoKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0JPT1RNQVBTWiAqLworCisvKioKKyAqIGJvb3RfZ2V0X2ZkdCAtIG1haW4gZmR0IGhhbmRsaW5nIHJvdXRpbmUKKyAqIEBhcmdjOiBjb21tYW5kIGFyZ3VtZW50IGNvdW50CisgKiBAYXJndjogY29tbWFuZCBhcmd1bWVudCBsaXN0CisgKiBAaW1hZ2VzOiBwb2ludGVyIHRvIHRoZSBib290bSBpbWFnZXMgc3RydWN0dXJlCisgKiBAb2ZfZmxhdF90cmVlOiBwb2ludGVyIHRvIGEgY2hhciogdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgc3RhcnQgYWRkcmVzcworICogQG9mX3NpemU6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBsZW5ndGgKKyAqCisgKiBib290X2dldF9mZHQoKSBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIHZhbGlkIGZsYXQgZGV2aWNlIHRyZWUgaW1hZ2UuCisgKiBDdXJlbnRseSBzdXBwb3J0ZWQgYXJlIHRoZSBmb2xsb3dpbmcgcmFtZGlzayBzb3VyY2VzOgorICogICAgICAtIG11bHRpY29tcG9uZW50IGtlcm5lbC9yYW1kaXNrIGltYWdlLAorICogICAgICAtIGNvbW1hbmRsaW5lIHByb3ZpZGVkIGFkZHJlc3Mgb2YgZGVjaWNhdGVkIHJhbWRpc2sgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBpZiBmZHQgaW1hZ2Ugd2FzIGZvdW5kIGFuZCB2YWxpZCwgb3Igc2tpcHBlZAorICogICAgIG9mX2ZsYXRfdHJlZSBhbmQgb2Zfc2l6ZSBhcmUgc2V0IHRvIGZkdCBzdGFydCBhZGRyZXNzIGFuZCBsZW5ndGggaWYKKyAqICAgICBmZHQgaW1hZ2UgaXMgZm91bmQgYW5kIHZhbGlkCisgKgorICogICAgIDEsIGlmIGZkdCBpbWFnZSBpcyBmb3VuZCBidXQgY29ycnVwdGVkCisgKiAgICAgb2ZfZmxhdF90cmVlIGFuZCBvZl9zaXplIGFyZSBzZXQgdG8gMCBpZiBubyBmZHQgZXhpc3RzCisgKi8KK2ludCBib290X2dldF9mZHQgKGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKQoreworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpmZHRfaGRyOworCXVsb25nCQlmZHRfYWRkcjsKKwljaGFyCQkqZmR0X2Jsb2IgPSBOVUxMOworCXVsb25nCQlpbWFnZV9zdGFydCwgaW1hZ2VfZW5kOworCXVsb25nCQlsb2FkX3N0YXJ0LCBsb2FkX2VuZDsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJdm9pZAkJKmZpdF9oZHI7CisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2NvbmZpZyA9IE5VTEw7CisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2ZkdCA9IE5VTEw7CisJdWxvbmcJCWRlZmF1bHRfYWRkcjsKKwlpbnQJCWNmZ19ub2Zmc2V0OworCWludAkJZmR0X25vZmZzZXQ7CisJY29uc3Qgdm9pZAkqZGF0YTsKKwlzaXplX3QJCXNpemU7CisjZW5kaWYKKworCSpvZl9mbGF0X3RyZWUgPSBOVUxMOworCSpvZl9zaXplID0gMDsKKworCWlmIChhcmdjID4gMyB8fCBnZW5pbWdfaGFzX2NvbmZpZyAoaW1hZ2VzKSkgeworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJaWYgKGFyZ2MgPiAzKSB7CisJCQkvKgorCQkJICogSWYgdGhlIEZEVCBibG9iIGNvbWVzIGZyb20gdGhlIEZJVCBpbWFnZSBhbmQgdGhlCisJCQkgKiBGSVQgaW1hZ2UgYWRkcmVzcyBpcyBvbWl0dGVkIGluIHRoZSBjb21tYW5kIGxpbmUKKwkJCSAqIGFyZ3VtZW50LCB0cnkgdG8gdXNlIHJhbWRpc2sgb3Igb3MgRklUIGltYWdlCisJCQkgKiBhZGRyZXNzIG9yIGRlZmF1bHQgbG9hZCBhZGRyZXNzLgorCQkJICovCisJCQlpZiAoaW1hZ2VzLT5maXRfdW5hbWVfcmQpCisJCQkJZGVmYXVsdF9hZGRyID0gKHVsb25nKWltYWdlcy0+Zml0X2hkcl9yZDsKKwkJCWVsc2UgaWYgKGltYWdlcy0+Zml0X3VuYW1lX29zKQorCQkJCWRlZmF1bHRfYWRkciA9ICh1bG9uZylpbWFnZXMtPmZpdF9oZHJfb3M7CisJCQllbHNlCisJCQkJZGVmYXVsdF9hZGRyID0gbG9hZF9hZGRyOworCisJCQlpZiAoZml0X3BhcnNlX2NvbmYgKGFyZ3ZbM10sIGRlZmF1bHRfYWRkciwKKwkJCQkJCSZmZHRfYWRkciwgJmZpdF91bmFtZV9jb25maWcpKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IGNvbmZpZyAnJXMnIGZyb20gaW1hZ2UgYXQgMHglMDhseFxuIiwKKwkJCQkJCWZpdF91bmFtZV9jb25maWcsIGZkdF9hZGRyKTsKKwkJCX0gZWxzZSBpZiAoZml0X3BhcnNlX3N1YmltYWdlIChhcmd2WzNdLCBkZWZhdWx0X2FkZHIsCisJCQkJCQkmZmR0X2FkZHIsICZmaXRfdW5hbWVfZmR0KSkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBzdWJpbWFnZSAnJXMnIGZyb20gaW1hZ2UgYXQgMHglMDhseFxuIiwKKwkJCQkJCWZpdF91bmFtZV9mZHQsIGZkdF9hZGRyKTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJZmR0X2FkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7CisJCQkJZGVidWcgKCIqICBmZHQ6IGNtZGxpbmUgaW1hZ2UgYWRkcmVzcyA9IDB4JTA4bHhcbiIsCisJCQkJCQlmZHRfYWRkcik7CisJCQl9CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQl9IGVsc2UgeworCQkJLyogdXNlIEZJVCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGluIGZpcnN0IGJvb3RtCisJCQkgKiBjb21tYW5kIGFyZ3VtZW50CisJCQkgKi8KKwkJCWZkdF9hZGRyID0gKHVsb25nKWltYWdlcy0+Zml0X2hkcl9vczsKKwkJCWZpdF91bmFtZV9jb25maWcgPSBpbWFnZXMtPmZpdF91bmFtZV9jZmc7CisJCQlkZWJ1ZyAoIiogIGZkdDogdXNpbmcgY29uZmlnICclcycgZnJvbSBpbWFnZSBhdCAweCUwOGx4XG4iLAorCQkJCQlmaXRfdW5hbWVfY29uZmlnLCBmZHRfYWRkcik7CisKKwkJCS8qCisJCQkgKiBDaGVjayB3aGV0aGVyIGNvbmZpZ3VyYXRpb24gaGFzIEZEVCBibG9iIGRlZmluZWQsCisJCQkgKiBpZiBub3QgcXVpdCBzaWxlbnRseS4KKwkJCSAqLworCQkJZml0X2hkciA9ICh2b2lkICopZmR0X2FkZHI7CisJCQljZmdfbm9mZnNldCA9IGZpdF9jb25mX2dldF9ub2RlIChmaXRfaGRyLAorCQkJCQlmaXRfdW5hbWVfY29uZmlnKTsKKwkJCWlmIChjZmdfbm9mZnNldCA8IDApIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogbm8gc3VjaCBjb25maWdcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlmZHRfbm9mZnNldCA9IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoZml0X2hkciwKKwkJCQkJY2ZnX25vZmZzZXQpOworCQkJaWYgKGZkdF9ub2Zmc2V0IDwgMCkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBubyBmZHQgaW4gY29uZmlnXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJZGVidWcgKCIjIyBDaGVja2luZyBmb3IgJ0ZEVCcvJ0ZEVCBJbWFnZScgYXQgJTA4bHhcbiIsCisJCQkJZmR0X2FkZHIpOworCisJCS8qIGNvcHkgZnJvbSBkYXRhZmxhc2ggaWYgbmVlZGVkICovCisJCWZkdF9hZGRyID0gZ2VuaW1nX2dldF9pbWFnZSAoZmR0X2FkZHIpOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFuIEZEVCBpbWFnZSBhdCB0aGUKKwkJICogYWRkcmVzcyBwcm92aWRlZCBpbiB0aGUgc2Vjb25kIGJvb3RtIGFyZ3VtZW50CisJCSAqIGNoZWNrIGltYWdlIHR5cGUsIGZvciBGSVQgaW1hZ2VzIGdldCBhIEZJVCBub2RlLgorCQkgKi8KKwkJc3dpdGNoIChnZW5pbWdfZ2V0X2Zvcm1hdCAoKHZvaWQgKilmZHRfYWRkcikpIHsKKwkJY2FzZSBJTUFHRV9GT1JNQVRfTEVHQUNZOgorCQkJLyogdmVyaWZ5IGZkdF9hZGRyIHBvaW50cyB0byBhIHZhbGlkIGltYWdlIGhlYWRlciAqLworCQkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGZyb20gTGVnYWN5IEltYWdlIGF0ICUwOGx4XG4iLAorCQkJCQlmZHRfYWRkcik7CisJCQlmZHRfaGRyID0gaW1hZ2VfZ2V0X2ZkdCAoZmR0X2FkZHIpOworCQkJaWYgKCFmZHRfaGRyKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qCisJCQkgKiBtb3ZlIGltYWdlIGRhdGEgdG8gdGhlIGxvYWQgYWRkcmVzcywKKwkJCSAqIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgaW5pdGlhbCBpbWFnZQorCQkJICovCisJCQlpbWFnZV9zdGFydCA9ICh1bG9uZylmZHRfaGRyOworCQkJaW1hZ2VfZW5kID0gaW1hZ2VfZ2V0X2ltYWdlX2VuZCAoZmR0X2hkcik7CisKKwkJCWxvYWRfc3RhcnQgPSBpbWFnZV9nZXRfbG9hZCAoZmR0X2hkcik7CisJCQlsb2FkX2VuZCA9IGxvYWRfc3RhcnQgKyBpbWFnZV9nZXRfZGF0YV9zaXplIChmZHRfaGRyKTsKKworCQkJaWYgKChsb2FkX3N0YXJ0IDwgaW1hZ2VfZW5kKSAmJiAobG9hZF9lbmQgPiBpbWFnZV9zdGFydCkpIHsKKwkJCQlmZHRfZXJyb3IgKCJmZHQgb3ZlcndyaXR0ZW4iKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlkZWJ1ZyAoIiAgIExvYWRpbmcgRkRUIGZyb20gMHglMDhseCB0byAweCUwOGx4XG4iLAorCQkJCQlpbWFnZV9nZXRfZGF0YSAoZmR0X2hkciksIGxvYWRfc3RhcnQpOworCisJCQltZW1tb3ZlICgodm9pZCAqKWxvYWRfc3RhcnQsCisJCQkJCSh2b2lkICopaW1hZ2VfZ2V0X2RhdGEgKGZkdF9oZHIpLAorCQkJCQlpbWFnZV9nZXRfZGF0YV9zaXplIChmZHRfaGRyKSk7CisKKwkJCWZkdF9ibG9iID0gKGNoYXIgKilsb2FkX3N0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgSU1BR0VfRk9STUFUX0ZJVDoKKwkJCS8qCisJCQkgKiBUaGlzIGNhc2Ugd2lsbCBjYXRjaCBib3RoOiBuZXcgdUltYWdlIGZvcm1hdAorCQkJICogKGxpYmZkdCBiYXNlZCkgYW5kIHJhdyBGRFQgYmxvYiAoYWxzbyBsaWJmZHQKKwkJCSAqIGJhc2VkKS4KKwkJCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJCS8qIGNoZWNrIEZEVCBibG9iIHZzIEZJVCBibG9iICovCisJCQlpZiAoZml0X2NoZWNrX2Zvcm1hdCAoKGNvbnN0IHZvaWQgKilmZHRfYWRkcikpIHsKKwkJCQkvKgorCQkJCSAqIEZJVCBpbWFnZQorCQkJCSAqLworCQkJCWZpdF9oZHIgPSAodm9pZCAqKWZkdF9hZGRyOworCQkJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBmcm9tIEZJVCBJbWFnZSBhdCAlMDhseFxuIiwKKwkJCQkJCWZkdF9hZGRyKTsKKworCQkJCWlmICghZml0X3VuYW1lX2ZkdCkgeworCQkJCQkvKgorCQkJCQkgKiBubyBGRFQgYmxvYiBpbWFnZSBub2RlIHVuaXQgbmFtZSwKKwkJCQkJICogdHJ5IHRvIGdldCBjb25maWcgbm9kZSBmaXJzdC4gSWYKKwkJCQkJICogY29uZmlnIHVuaXQgbm9kZSBuYW1lIGlzIE5VTEwKKwkJCQkJICogZml0X2NvbmZfZ2V0X25vZGUoKSB3aWxsIHRyeSB0bworCQkJCQkgKiBmaW5kIGRlZmF1bHQgY29uZmlnIG5vZGUKKwkJCQkJICovCisJCQkJCWNmZ19ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X25vZGUgKGZpdF9oZHIsCisJCQkJCQkJZml0X3VuYW1lX2NvbmZpZyk7CisKKwkJCQkJaWYgKGNmZ19ub2Zmc2V0IDwgMCkgeworCQkJCQkJZmR0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgY29uZmlndXJhdGlvbiBub2RlXG4iKTsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKworCQkJCQlmaXRfdW5hbWVfY29uZmlnID0gZmR0X2dldF9uYW1lIChmaXRfaGRyLAorCQkJCQkJCWNmZ19ub2Zmc2V0LCBOVUxMKTsKKwkJCQkJcHJpbnRmICgiICAgVXNpbmcgJyVzJyBjb25maWd1cmF0aW9uXG4iLAorCQkJCQkJCWZpdF91bmFtZV9jb25maWcpOworCisJCQkJCWZkdF9ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChmaXRfaGRyLAorCQkJCQkJCWNmZ19ub2Zmc2V0KTsKKwkJCQkJZml0X3VuYW1lX2ZkdCA9IGZpdF9nZXRfbmFtZSAoZml0X2hkciwKKwkJCQkJCQlmZHRfbm9mZnNldCwgTlVMTCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogZ2V0IEZEVCBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQgKi8KKwkJCQkJZmR0X25vZmZzZXQgPSBmaXRfaW1hZ2VfZ2V0X25vZGUgKGZpdF9oZHIsCisJCQkJCQkJZml0X3VuYW1lX2ZkdCk7CisJCQkJfQorCQkJCWlmIChmZHRfbm9mZnNldCA8IDApIHsKKwkJCQkJZmR0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgc3ViaW1hZ2Ugbm9kZVxuIik7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCisJCQkJcHJpbnRmICgiICAgVHJ5aW5nICclcycgRkRUIGJsb2Igc3ViaW1hZ2VcbiIsCisJCQkJCQlmaXRfdW5hbWVfZmR0KTsKKworCQkJCWlmICghZml0X2NoZWNrX2ZkdCAoZml0X2hkciwgZmR0X25vZmZzZXQsCisJCQkJCQkJaW1hZ2VzLT52ZXJpZnkpKQorCQkJCQlnb3RvIGVycm9yOworCisJCQkJLyogZ2V0IHJhbWRpc2sgaW1hZ2UgZGF0YSBhZGRyZXNzIGFuZCBsZW5ndGggKi8KKwkJCQlpZiAoZml0X2ltYWdlX2dldF9kYXRhIChmaXRfaGRyLCBmZHRfbm9mZnNldCwKKwkJCQkJCQkmZGF0YSwgJnNpemUpKSB7CisJCQkJCWZkdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIEZEVCBzdWJpbWFnZSBkYXRhIik7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCisJCQkJLyogdmVyaWZ0IHRoYXQgaW1hZ2UgZGF0YSBpcyBhIHByb3BlciBGRFQgYmxvYiAqLworCQkJCWlmIChmZHRfY2hlY2tfaGVhZGVyICgoY2hhciAqKWRhdGEpICE9IDApIHsKKwkJCQkJZmR0X2Vycm9yICgiU3ViaW1hZ2UgZGF0YSBpcyBub3QgYSBGVEQiKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIG1vdmUgaW1hZ2UgZGF0YSB0byB0aGUgbG9hZCBhZGRyZXNzLAorCQkJCSAqIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgaW5pdGlhbCBpbWFnZQorCQkJCSAqLworCQkJCWltYWdlX3N0YXJ0ID0gKHVsb25nKWZpdF9oZHI7CisJCQkJaW1hZ2VfZW5kID0gZml0X2dldF9lbmQgKGZpdF9oZHIpOworCisJCQkJaWYgKGZpdF9pbWFnZV9nZXRfbG9hZCAoZml0X2hkciwgZmR0X25vZmZzZXQsCisJCQkJCQkJJmxvYWRfc3RhcnQpID09IDApIHsKKwkJCQkJbG9hZF9lbmQgPSBsb2FkX3N0YXJ0ICsgc2l6ZTsKKworCQkJCQlpZiAoKGxvYWRfc3RhcnQgPCBpbWFnZV9lbmQpICYmCisJCQkJCQkJKGxvYWRfZW5kID4gaW1hZ2Vfc3RhcnQpKSB7CisJCQkJCQlmZHRfZXJyb3IgKCJGRFQgb3ZlcndyaXR0ZW4iKTsKKwkJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKworCQkJCQlwcmludGYgKCIgICBMb2FkaW5nIEZEVCBmcm9tIDB4JTA4bHggdG8gMHglMDhseFxuIiwKKwkJCQkJCQkodWxvbmcpZGF0YSwgbG9hZF9zdGFydCk7CisKKwkJCQkJbWVtbW92ZSAoKHZvaWQgKilsb2FkX3N0YXJ0LAorCQkJCQkJCSh2b2lkICopZGF0YSwgc2l6ZSk7CisKKwkJCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWxvYWRfc3RhcnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWRhdGE7CisJCQkJfQorCisJCQkJaW1hZ2VzLT5maXRfaGRyX2ZkdCA9IGZpdF9oZHI7CisJCQkJaW1hZ2VzLT5maXRfdW5hbWVfZmR0ID0gZml0X3VuYW1lX2ZkdDsKKwkJCQlpbWFnZXMtPmZpdF9ub2Zmc2V0X2ZkdCA9IGZkdF9ub2Zmc2V0OworCQkJCWJyZWFrOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEZEVCBibG9iCisJCQkJICovCisJCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWZkdF9hZGRyOworCQkJCWRlYnVnICgiKiAgZmR0OiByYXcgRkRUIGJsb2JcbiIpOworCQkJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBibG9iIGF0ICUwOGx4XG4iLCAobG9uZylmZHRfYmxvYik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXB1dHMgKCJFUlJPUjogRGlkIG5vdCBmaW5kIGEgY21kbGluZSBGbGF0dGVuZWQgRGV2aWNlIFRyZWVcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXByaW50ZiAoIiAgIEJvb3RpbmcgdXNpbmcgdGhlIGZkdCBibG9iIGF0IDB4JXhcbiIsIChpbnQpZmR0X2Jsb2IpOworCisJfSBlbHNlIGlmIChpbWFnZXMtPmxlZ2FjeV9oZHJfdmFsaWQgJiYKKwkJCWltYWdlX2NoZWNrX3R5cGUgKCZpbWFnZXMtPmxlZ2FjeV9oZHJfb3NfY29weSwgSUhfVFlQRV9NVUxUSSkpIHsKKworCQl1bG9uZyBmZHRfZGF0YSwgZmR0X2xlbjsKKworCQkvKgorCQkgKiBOb3cgY2hlY2sgaWYgd2UgaGF2ZSBhIGxlZ2FjeSBtdWx0aS1jb21wb25lbnQgaW1hZ2UsCisJCSAqIGdldCBzZWNvbmQgZW50cnkgZGF0YSBzdGFydCBhZGRyZXNzIGFuZCBsZW4uCisJCSAqLworCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgZnJvbSBtdWx0aSAiCisJCQkiY29tcG9uZW50IEltYWdlIGF0ICUwOGxYXG4iLAorCQkJKHVsb25nKWltYWdlcy0+bGVnYWN5X2hkcl9vcyk7CisKKwkJaW1hZ2VfbXVsdGlfZ2V0aW1nIChpbWFnZXMtPmxlZ2FjeV9oZHJfb3MsIDIsICZmZHRfZGF0YSwgJmZkdF9sZW4pOworCQlpZiAoZmR0X2xlbikgeworCisJCQlmZHRfYmxvYiA9IChjaGFyICopZmR0X2RhdGE7CisJCQlwcmludGYgKCIgICBCb290aW5nIHVzaW5nIHRoZSBmZHQgYXQgMHgleFxuIiwgKGludClmZHRfYmxvYik7CisKKwkJCWlmIChmZHRfY2hlY2tfaGVhZGVyIChmZHRfYmxvYikgIT0gMCkgeworCQkJCWZkdF9lcnJvciAoImltYWdlIGlzIG5vdCBhIGZkdCIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmIChiZTMyX3RvX2NwdSAoZmR0X3RvdGFsc2l6ZSAoZmR0X2Jsb2IpKSAhPSBmZHRfbGVuKSB7CisJCQkJZmR0X2Vycm9yICgiZmR0IHNpemUgIT0gaW1hZ2Ugc2l6ZSIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWJ1ZyAoIiMjIE5vIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWRlYnVnICgiIyMgTm8gRmxhdHRlbmVkIERldmljZSBUcmVlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKm9mX2ZsYXRfdHJlZSA9IGZkdF9ibG9iOworCSpvZl9zaXplID0gYmUzMl90b19jcHUgKGZkdF90b3RhbHNpemUgKGZkdF9ibG9iKSk7CisJZGVidWcgKCIgICBvZl9mbGF0X3RyZWUgYXQgMHglMDhseCBzaXplIDB4JTA4bHhcbiIsCisJCQkodWxvbmcpKm9mX2ZsYXRfdHJlZSwgKm9mX3NpemUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCSpvZl9mbGF0X3RyZWUgPSAwOworCSpvZl9zaXplID0gMDsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5ldyB1SW1hZ2UgZm9ybWF0IHJvdXRpbmVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3N0YXRpYyBpbnQgZml0X3BhcnNlX3NwZWMgKGNvbnN0IGNoYXIgKnNwZWMsIGNoYXIgc2VwYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKm5hbWUpCit7CisJY29uc3QgY2hhciAqc2VwOworCisJKmFkZHIgPSBhZGRyX2N1cnI7CisJKm5hbWUgPSBOVUxMOworCisJc2VwID0gc3RyY2hyIChzcGVjLCBzZXBjKTsKKwlpZiAoc2VwKSB7CisJCWlmIChzZXAgLSBzcGVjID4gMCkKKwkJCSphZGRyID0gc2ltcGxlX3N0cnRvdWwgKHNwZWMsIE5VTEwsIDE2KTsKKworCQkqbmFtZSA9IHNlcCArIDE7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9wYXJzZV9jb25mIC0gcGFyc2UgRklUIGNvbmZpZ3VyYXRpb24gc3BlYworICogQHNwZWM6IGlucHV0IHN0cmluZywgY29udGFpbmluZyBjb25maWd1cmF0aW9uIHNwZWMKKyAqIEBhZGRfY3VycjogY3VycmVudCBpbWFnZSBhZGRyZXNzICh0byBiZSB1c2VkIGFzIGEgcG9zc2libGUgZGVmYXVsdCkKKyAqIEBhZGRyOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBGSVQgaW1hZ2UgYWRkcmVzcyBvZiBhIGdpdmVuCisgKiBjb25maWd1cmF0aW9uCisgKiBAY29uZl9uYW1lIGRvdWJsZSBwb2ludGVyIHRvIGEgY2hhciwgd2lsbCBob2xkIHBvaW50ZXIgdG8gYSBjb25maWd1cmF0aW9uCisgKiB1bml0IG5hbWUKKyAqCisgKiBmaXRfcGFyc2VfY29uZigpIGV4cGVjdHMgY29uZmlndXJhdGlvbiBzcGVjIGluIHRoZSBmb3Igb2YgWzxhZGRyPl0jPGNvbmY+LAorICogd2hlcmUgPGFkZHI+IGlzIGEgRklUIGltYWdlIGFkZHJlc3MgdGhhdCBjb250YWlucyBjb25maWd1cmF0aW9uCisgKiB3aXRoIGEgPGNvbmY+IHVuaXQgbmFtZS4KKyAqCisgKiBBZGRyZXNzIHBhcnQgaXMgb3B0aW9uYWwsIGFuZCBpZiBvbWl0dGVkIGRlZmF1bHQgYWRkX2N1cnIgd2lsbAorICogYmUgdXNlZCBpbnN0ZWFkLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBzcGVjIGlzIGEgdmFsaWQgY29uZmlndXJhdGlvbiBzdHJpbmcsCisgKiAgICAgYWRkciBhbmQgY29uZl9uYW1lIGFyZSBzZXQgYWNjb3JkaW5nbHkKKyAqICAgICAwIG90aGVyd2lzZQorICovCitpbmxpbmUgaW50IGZpdF9wYXJzZV9jb25mIChjb25zdCBjaGFyICpzcGVjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqY29uZl9uYW1lKQoreworCXJldHVybiBmaXRfcGFyc2Vfc3BlYyAoc3BlYywgJyMnLCBhZGRyX2N1cnIsIGFkZHIsIGNvbmZfbmFtZSk7Cit9CisKKy8qKgorICogZml0X3BhcnNlX3N1YmltYWdlIC0gcGFyc2UgRklUIHN1YmltYWdlIHNwZWMKKyAqIEBzcGVjOiBpbnB1dCBzdHJpbmcsIGNvbnRhaW5pbmcgc3ViaW1hZ2Ugc3BlYworICogQGFkZF9jdXJyOiBjdXJyZW50IGltYWdlIGFkZHJlc3MgKHRvIGJlIHVzZWQgYXMgYSBwb3NzaWJsZSBkZWZhdWx0KQorICogQGFkZHI6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIEZJVCBpbWFnZSBhZGRyZXNzIG9mIGEgZ2l2ZW4KKyAqIHN1YmltYWdlCisgKiBAaW1hZ2VfbmFtZTogZG91YmxlIHBvaW50ZXIgdG8gYSBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byBhIHN1YmltYWdlIG5hbWUKKyAqCisgKiBmaXRfcGFyc2Vfc3ViaW1hZ2UoKSBleHBlY3RzIHN1YmltYWdlIHNwZWMgaW4gdGhlIGZvciBvZgorICogWzxhZGRyPl06PHN1YmltYWdlPiwgd2hlcmUgPGFkZHI+IGlzIGEgRklUIGltYWdlIGFkZHJlc3MgdGhhdCBjb250YWlucworICogc3ViaW1hZ2Ugd2l0aCBhIDxzdWJpbWc+IHVuaXQgbmFtZS4KKyAqCisgKiBBZGRyZXNzIHBhcnQgaXMgb3B0aW9uYWwsIGFuZCBpZiBvbWl0dGVkIGRlZmF1bHQgYWRkX2N1cnIgd2lsbAorICogYmUgdXNlZCBpbnN0ZWFkLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBzcGVjIGlzIGEgdmFsaWQgc3ViaW1hZ2Ugc3RyaW5nLAorICogICAgIGFkZHIgYW5kIGltYWdlX25hbWUgYXJlIHNldCBhY2NvcmRpbmdseQorICogICAgIDAgb3RoZXJ3aXNlCisgKi8KK2lubGluZSBpbnQgZml0X3BhcnNlX3N1YmltYWdlIChjb25zdCBjaGFyICpzcGVjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqaW1hZ2VfbmFtZSkKK3sKKwlyZXR1cm4gZml0X3BhcnNlX3NwZWMgKHNwZWMsICc6JywgYWRkcl9jdXJyLCBhZGRyLCBpbWFnZV9uYW1lKTsKK30KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCitzdGF0aWMgdm9pZCBmaXRfZ2V0X2RlYnVnIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LAorCQljaGFyICpwcm9wX25hbWUsIGludCBlcnIpCit7CisJZGVidWcgKCJDYW4ndCBnZXQgJyVzJyBwcm9wZXJ0eSBmcm9tIEZJVCAweCUwOGx4LCAiCisJCSJub2RlOiBvZmZzZXQgJWQsIG5hbWUgJXMgKCVzKVxuIiwKKwkJcHJvcF9uYW1lLCAodWxvbmcpZml0LCBub2Zmc2V0LAorCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCWZkdF9zdHJlcnJvciAoZXJyKSk7Cit9CisKKy8qKgorICogZml0X3ByaW50X2NvbnRlbnRzIC0gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIEZJVCBmb3JtYXQgaW1hZ2UKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X3ByaW50X2NvbnRlbnRzKCkgZm9ybWF0cyBhIG11bHRpIGxpbmUgRklUIGltYWdlIGNvbnRlbnRzIGRlc2NyaXB0aW9uLgorICogVGhlIHJvdXRpbmUgcHJpbnRzIG91dCBGSVQgaW1hZ2UgcHJvcGVydGllcyAocm9vdCBub2RlIGxldmVsKSBmb2xsd2VkIGJ5CisgKiB0aGUgZGV0YWlscyBvZiBlYWNoIGNvbXBvbmVudCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfcHJpbnRfY29udGVudHMgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwljaGFyICpkZXNjOworCWNoYXIgKnVuYW1lOworCWludCBpbWFnZXNfbm9mZnNldDsKKwlpbnQgY29uZnNfbm9mZnNldDsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCWludCBjb3VudCA9IDA7CisJaW50IHJldDsKKwljb25zdCBjaGFyICpwOworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl0aW1lX3QgdGltZXN0YW1wOworI2VuZGlmCisKKyNpZmRlZiBVU0VfSE9TVENDCisJcCA9ICIiOworI2Vsc2UKKwlwID0gIiAgICI7CisjZW5kaWYKKworCS8qIFJvb3Qgbm9kZSBwcm9wZXJ0aWVzICovCisJcmV0ID0gZml0X2dldF9kZXNjIChmaXQsIDAsICZkZXNjKTsKKwlwcmludGYgKCIlc0ZJVCBkZXNjcmlwdGlvbjogIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIGRlc2MpOworCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXJldCA9IGZpdF9nZXRfdGltZXN0YW1wIChmaXQsIDAsICZ0aW1lc3RhbXApOworCXByaW50ZiAoIiVzQ3JlYXRlZDogICAgICAgICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlnZW5pbWdfcHJpbnRfdGltZSAodGltZXN0YW1wKTsKKyNlbmRpZgorCisJLyogRmluZCBpbWFnZXMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm47CisJfQorCisJLyogUHJvY2VzcyBpdHMgc3Vibm9kZXMsIHByaW50IG91dCBjb21wb25lbnQgaW1hZ2VzIGRldGFpbHMgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIGNvdW50ID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2VzX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGltYWdlcyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29tcG9uZW50IGltYWdlIG5vZGUuCisJCQkgKi8KKwkJCXByaW50ZiAoIiVzIEltYWdlICV1ICglcylcbiIsIHAsIGNvdW50KyssCisJCQkJCWZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCQkJZml0X2ltYWdlX3ByaW50IChmaXQsIG5vZmZzZXQsIHApOworCQl9CisJfQorCisJLyogRmluZCBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSBvZmZzZXQgKi8KKwljb25mc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9DT05GU19QQVRIKTsKKwlpZiAoY29uZnNfbm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBnZXQgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0NPTkZTX1BBVEgsIGZkdF9zdHJlcnJvciAoY29uZnNfbm9mZnNldCkpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbiB1bml0IG5hbWUgZnJvbSBkZWZhdWx0IHByb3BlcnR5ICovCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9ERUZBVUxUX1BST1AsIE5VTEwpOworCWlmICh1bmFtZSkKKwkJcHJpbnRmICgiJXMgRGVmYXVsdCBDb25maWd1cmF0aW9uOiAnJXMnXG4iLCBwLCB1bmFtZSk7CisKKwkvKiBQcm9jZXNzIGl0cyBzdWJub2RlcywgcHJpbnQgb3V0IGNvbmZpZ3VyYXRpb25zIGRldGFpbHMgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIGNvdW50ID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgY29uZnNfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbmZpZ3VyYXRpb24gbm9kZS4KKwkJCSAqLworCQkJcHJpbnRmICgiJXMgQ29uZmlndXJhdGlvbiAldSAoJXMpXG4iLCBwLCBjb3VudCsrLAorCQkJCQlmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSk7CisKKwkJCWZpdF9jb25mX3ByaW50IChmaXQsIG5vZmZzZXQsIHApOworCQl9CisJfQorfQorCisvKioKKyAqIGZpdF9pbWFnZV9wcmludCAtIHByaW50cyBvdXQgdGhlIEZJVCBjb21wb25lbnQgaW1hZ2UgZGV0YWlscworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBpbWFnZV9ub2Zmc2V0OiBvZmZzZXQgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X2ltYWdlX3ByaW50KCkgbGlzdHMgYWxsIG1hbmRhdG9yeSBwcm9wZXJpZXMgZm9yIHRoZSBwcm9jZXNzZWQgY29tcG9uZW50CisgKiBpbWFnZS4gSWYgcHJlc2VudCwgaGFzaCBub2RlcyBhcmUgcHJpbnRlZCBvdXQgYXMgd2VsbC4gTG9hZAorICogYWRkcmVzcyBmb3IgaW1hZ2VzIG9mIHR5cGUgZmlybXdhcmUgaXMgYWxzbyBwcmludGVkIG91dC4gU2luY2UgdGhlIGxvYWQKKyAqIGFkZHJlc3MgaXMgbm90IG1hbmRhdG9yeSBmb3IgZmlybXdhcmUgaW1hZ2VzLCBpdCB3aWxsIGJlIG91dHB1dCBhcworICogInVuYXZhaWxhYmxlIiB3aGVuIG5vdCBwcmVzZW50LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9pbWFnZV9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCwgY29uc3QgY2hhciAqcCkKK3sKKwljaGFyICpkZXNjOworCXVpbnQ4X3QgdHlwZSwgYXJjaCwgb3MsIGNvbXA7CisJc2l6ZV90IHNpemU7CisJdWxvbmcgbG9hZCwgZW50cnk7CisJY29uc3Qgdm9pZCAqZGF0YTsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCWludCByZXQ7CisKKwkvKiBNYW5kYXRvcnkgcHJvcGVydGllcyAqLworCXJldCA9IGZpdF9nZXRfZGVzYyAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGVzYyk7CisJcHJpbnRmICgiJXMgIERlc2NyaXB0aW9uOiAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIGRlc2MpOworCisJZml0X2ltYWdlX2dldF90eXBlIChmaXQsIGltYWdlX25vZmZzZXQsICZ0eXBlKTsKKwlwcmludGYgKCIlcyAgVHlwZTogICAgICAgICAlc1xuIiwgcCwgZ2VuaW1nX2dldF90eXBlX25hbWUgKHR5cGUpKTsKKworCWZpdF9pbWFnZV9nZXRfY29tcCAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmY29tcCk7CisJcHJpbnRmICgiJXMgIENvbXByZXNzaW9uOiAgJXNcbiIsIHAsIGdlbmltZ19nZXRfY29tcF9uYW1lIChjb21wKSk7CisKKwlyZXQgPSBmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRhdGEsICZzaXplKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCisJcHJpbnRmICgiJXMgIERhdGEgU3RhcnQ6ICAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiMHglMDhseFxuIiwgKHVsb25nKWRhdGEpOworI2VuZGlmCisKKwlwcmludGYgKCIlcyAgRGF0YSBTaXplOiAgICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlnZW5pbWdfcHJpbnRfc2l6ZSAoc2l6ZSk7CisKKwkvKiBSZW1haW5pbmcsIHR5cGUgZGVwZW5kZW50IHByb3BlcnRpZXMgKi8KKwlpZiAoKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHx8ICh0eXBlID09IElIX1RZUEVfU1RBTkRBTE9ORSkgfHwKKwkgICAgKHR5cGUgPT0gSUhfVFlQRV9SQU1ESVNLKSB8fCAodHlwZSA9PSBJSF9UWVBFX0ZJUk1XQVJFKSB8fAorCSAgICAodHlwZSA9PSBJSF9UWVBFX0ZMQVREVCkpIHsKKwkJZml0X2ltYWdlX2dldF9hcmNoIChmaXQsIGltYWdlX25vZmZzZXQsICZhcmNoKTsKKwkJcHJpbnRmICgiJXMgIEFyY2hpdGVjdHVyZTogJXNcbiIsIHAsIGdlbmltZ19nZXRfYXJjaF9uYW1lIChhcmNoKSk7CisJfQorCisJaWYgKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHsKKwkJZml0X2ltYWdlX2dldF9vcyAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmb3MpOworCQlwcmludGYgKCIlcyAgT1M6ICAgICAgICAgICAlc1xuIiwgcCwgZ2VuaW1nX2dldF9vc19uYW1lIChvcykpOworCX0KKworCWlmICgodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgfHwgKHR5cGUgPT0gSUhfVFlQRV9TVEFOREFMT05FKSB8fAorCQkodHlwZSA9PSBJSF9UWVBFX0ZJUk1XQVJFKSkgeworCQlyZXQgPSBmaXRfaW1hZ2VfZ2V0X2xvYWQgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmxvYWQpOworCQlwcmludGYgKCIlcyAgTG9hZCBBZGRyZXNzOiAiLCBwKTsKKwkJaWYgKHJldCkKKwkJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiMHglMDhseFxuIiwgbG9hZCk7CisJfQorCisJaWYgKCh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB8fCAodHlwZSA9PSBJSF9UWVBFX1NUQU5EQUxPTkUpKSB7CisJCWZpdF9pbWFnZV9nZXRfZW50cnkgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmVudHJ5KTsKKwkJcHJpbnRmICgiJXMgIEVudHJ5IFBvaW50OiAgIiwgcCk7CisJCWlmIChyZXQpCisJCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJCWVsc2UKKwkJCXByaW50ZiAoIjB4JTA4bHhcbiIsIGVudHJ5KTsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBoYXNoIHN1Ym5vZGVzIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCWZvciAobmRlcHRoID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCQkJZml0X2ltYWdlX3ByaW50X2hhc2ggKGZpdCwgbm9mZnNldCwgcCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZml0X2ltYWdlX3ByaW50X2hhc2ggLSBwcmludHMgb3V0IHRoZSBoYXNoIG5vZGUgZGV0YWlscworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBvZmZzZXQgb2YgdGhlIGhhc2ggbm9kZQorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9pbWFnZV9wcmludF9oYXNoKCkgbGlzdHMgcHJvcGVyaWVzIGZvciB0aGUgcHJvY2Vzc2VkIGhhc2ggbm9kZQorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9pbWFnZV9wcmludF9oYXNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmFsZ287CisJdWludDhfdCAqdmFsdWU7CisJaW50IHZhbHVlX2xlbjsKKwlpbnQgaSwgcmV0OworCisJLyoKKwkgKiBDaGVjayBzdWJub2RlIG5hbWUsIG11c3QgYmUgZXF1YWwgdG8gImhhc2giLgorCSAqIE11bHRpcGxlIGhhc2ggbm9kZXMgcmVxdWlyZSB1bmlxdWUgdW5pdCBub2RlCisJICogbmFtZXMsIGUuZy4gaGFzaEAxLCBoYXNoQDIsIGV0Yy4KKwkgKi8KKwlpZiAoc3RybmNtcCAoZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlGSVRfSEFTSF9OT0RFTkFNRSwKKwkJCXN0cmxlbihGSVRfSEFTSF9OT0RFTkFNRSkpICE9IDApCisJCXJldHVybjsKKworCWRlYnVnICgiJXMgIEhhc2ggbm9kZTogICAgJyVzJ1xuIiwgcCwKKwkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSk7CisKKwlwcmludGYgKCIlcyAgSGFzaCBhbGdvOiAgICAiLCBwKTsKKwlpZiAoZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGZpdCwgbm9mZnNldCwgJmFsZ28pKSB7CisJCXByaW50ZiAoImludmFsaWQvdW5zdXBwb3J0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCXByaW50ZiAoIiVzXG4iLCBhbGdvKTsKKworCXJldCA9IGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoZml0LCBub2Zmc2V0LCAmdmFsdWUsCisJCQkJCSZ2YWx1ZV9sZW4pOworCXByaW50ZiAoIiVzICBIYXNoIHZhbHVlOiAgICIsIHApOworCWlmIChyZXQpIHsKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCB2YWx1ZV9sZW47IGkrKykKKwkJCXByaW50ZiAoIiUwMngiLCB2YWx1ZVtpXSk7CisJCXByaW50ZiAoIlxuIik7CisJfQorCisJZGVidWcgICgiJXMgIEhhc2ggbGVuOiAgICAgJWRcbiIsIHAsIHZhbHVlX2xlbik7Cit9CisKKy8qKgorICogZml0X2dldF9kZXNjIC0gZ2V0IG5vZGUgZGVzY3JpcHRpb24gcHJvcGVydHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogbm9kZSBvZmZzZXQKKyAqIEBkZXNjOiBkb3VibGUgcG9pbnRlciB0byB0aGUgY2hhciwgd2lsbCBob2xkIHBvaW50ZXIgdG8gdGhlIGRlc2NycHRpb24KKyAqCisgKiBmaXRfZ2V0X2Rlc2MoKSByZWFkcyBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBmcm9tIGEgZ2l2ZW4gbm9kZSwgaWYKKyAqIGRlc2NyaXB0aW9uIGlzIGZvdW5kIHBvaW50ZXIgdG8gaXQgaXMgcmV0dXJlbmVkIGluIHRoaXJkIGNhbGwgYXJndW1lbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9nZXRfZGVzYyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmRlc2MpCit7CisJaW50IGxlbjsKKworCSpkZXNjID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfREVTQ19QUk9QLCAmbGVuKTsKKwlpZiAoKmRlc2MgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9ERVNDX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfZ2V0X3RpbWVzdGFtcCAtIGdldCBub2RlIHRpbWVzdGFtcCBwcm9wZXJ0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBub2RlIG9mZnNldAorICogQHRpbWVzdGFtcDogcG9pbnRlciB0byB0aGUgdGltZV90LCB3aWxsIGhvbGQgcmVhZCB0aW1lc3RhbXAKKyAqCisgKiBmaXRfZ2V0X3RpbWVzdGFtcCgpIHJlYWRzIHRpbWVzdGFtcCBwb3BlcnR5IGZyb20gZ2l2ZW4gbm9kZSwgaWYgdGltZXN0YW1wCisgKiBpcyBmb3VuZCBhbmQgaGFzIGEgY29ycmVjdCBzaXplIGl0cyB2YWx1ZSBpcyByZXR1cmVkIGluIHRoaXJkIGNhbGwKKyAqIGFyZ3VtZW50LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBwcm9wZXJ0eSByZWFkIGZhaWx1cmUKKyAqICAgICAtMiwgb24gd3JvbmcgdGltZXN0YW1wIHNpemUKKyAqLworaW50IGZpdF9nZXRfdGltZXN0YW1wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgKnRpbWVzdGFtcCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1RJTUVTVEFNUF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX1RJTUVTVEFNUF9QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChsZW4gIT0gc2l6ZW9mICh1aW50MzJfdCkpIHsKKwkJZGVidWcgKCJGSVQgdGltZXN0YW1wIHdpdGggaW5jb3JyZWN0IHNpemUgb2YgKCV1KVxuIiwgbGVuKTsKKwkJcmV0dXJuIC0yOworCX0KKworCSp0aW1lc3RhbXAgPSB1aW1hZ2VfdG9fY3B1ICgqKCh1aW50MzJfdCAqKWRhdGEpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X25vZGUgLSBnZXQgbm9kZSBvZmZzZXQgZm9yIGNvbXBvbmVudCBpbWFnZSBvZiBhIGdpdmVuIHVuaXQgbmFtZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBpbWFnZV91bmFtZTogY29tcG9uZW50IGltYWdlIG5vZGUgdW5pdCBuYW1lCisgKgorICogZml0X2ltYWdlX2dldF9ub2RlKCkgZmluZHMgYSBjb21wb25lbnQgaW1hZ2UgKHdpdGhpbmcgdGhlICcvaW1hZ2VzJworICogbm9kZSkgb2YgYSBwcm92aWRlZCB1bml0IG5hbWUuIElmIGltYWdlIGlzIGZvdW5kIGl0cyBub2RlIG9mZnNldCBpcworICogcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqaW1hZ2VfdW5hbWUpCit7CisJaW50IG5vZmZzZXQsIGltYWdlc19ub2Zmc2V0OworCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZmluZCBpbWFnZXMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0lNQUdFU19QQVRILCBmZHRfc3RyZXJyb3IgKGltYWdlc19ub2Zmc2V0KSk7CisJCXJldHVybiBpbWFnZXNfbm9mZnNldDsKKwl9CisKKwlub2Zmc2V0ID0gZmR0X3N1Ym5vZGVfb2Zmc2V0IChmaXQsIGltYWdlc19ub2Zmc2V0LCBpbWFnZV91bmFtZSk7CisJaWYgKG5vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZ2V0IG5vZGUgb2Zmc2V0IGZvciBpbWFnZSB1bml0IG5hbWU6ICclcycgKCVzKVxuIiwKKwkJCWltYWdlX3VuYW1lLCBmZHRfc3RyZXJyb3IgKG5vZmZzZXQpKTsKKwl9CisKKwlyZXR1cm4gbm9mZnNldDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X29zIC0gZ2V0IG9zIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQG9zOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgb3MgbnVtZXJpYyBpZAorICoKKyAqIGZpdF9pbWFnZV9nZXRfb3MoKSBmaW5kcyBvcyBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqb3MpCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IE9TIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9PU19QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX09TX1BST1AsIGxlbik7CisJCSpvcyA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIE9TIG5hbWUgdG8gaWQgKi8KKwkqb3MgPSBnZW5pbWdfZ2V0X29zX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2FyY2ggLSBnZXQgYXJjaCBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBhcmNoOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgYXJjaCBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF9hcmNoKCkgZmluZHMgYXJjaCBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICphcmNoKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBhcmNoaXRlY3R1cmUgbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0FSQ0hfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9BUkNIX1BST1AsIGxlbik7CisJCSphcmNoID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgYXJjaGl0ZWN0dXJlIG5hbWUgdG8gaWQgKi8KKwkqYXJjaCA9IGdlbmltZ19nZXRfYXJjaF9pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF90eXBlIC0gZ2V0IHR5cGUgaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAdHlwZTogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIHR5cGUgbnVtZXJpYyBpZAorICoKKyAqIGZpdF9pbWFnZV9nZXRfdHlwZSgpIGZpbmRzIHR5cGUgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdHlwZSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgaW1hZ2UgdHlwZSBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVFlQRV9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX1RZUEVfUFJPUCwgbGVuKTsKKwkJKnR5cGUgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBpbWFnZSB0eXBlIG5hbWUgdG8gaWQgKi8KKwkqdHlwZSA9IGdlbmltZ19nZXRfdHlwZV9pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9jb21wIC0gZ2V0IGNvbXAgaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAY29tcDogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIGNvbXAgbnVtZXJpYyBpZAorICoKKyAqIGZpdF9pbWFnZV9nZXRfY29tcCgpIGZpbmRzIGNvbXAgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqY29tcCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgY29tcHJlc3Npb24gbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0NPTVBfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9DT01QX1BST1AsIGxlbik7CisJCSpjb21wID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgY29tcHJlc3Npb24gbmFtZSB0byBpZCAqLworCSpjb21wID0gZ2VuaW1nX2dldF9jb21wX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2xvYWQgLSBnZXQgbG9hZCBhZGRyZXNzIHByb3BlcnR5IGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGxvYWQ6IHBvaW50ZXIgdG8gdGhlIHVpbnQzMl90LCB3aWxsIGhvbGQgbG9hZCBhZGRyZXNzCisgKgorICogZml0X2ltYWdlX2dldF9sb2FkKCkgZmluZHMgbG9hZCBhZGRyZXNzIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2xvYWQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICpsb2FkKQoreworCWludCBsZW47CisJY29uc3QgdWludDMyX3QgKmRhdGE7CisKKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0xPQURfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9MT0FEX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqbG9hZCA9IHVpbWFnZV90b19jcHUgKCpkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2VudHJ5IC0gZ2V0IGVudHJ5IHBvaW50IGFkZHJlc3MgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAZW50cnk6IHBvaW50ZXIgdG8gdGhlIHVpbnQzMl90LCB3aWxsIGhvbGQgZW50cnkgcG9pbnQgYWRkcmVzcworICoKKyAqIGZpdF9pbWFnZV9nZXRfZW50cnkoKSBmaW5kcyBlbnRyeSBwb2ludCBhZGRyZXNzIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2VudHJ5IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqZW50cnkpCit7CisJaW50IGxlbjsKKwljb25zdCB1aW50MzJfdCAqZGF0YTsKKworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfRU5UUllfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9FTlRSWV9QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJKmVudHJ5ID0gdWltYWdlX3RvX2NwdSAoKmRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfZGF0YSAtIGdldCBkYXRhIHByb3BlcnR5IGFuZCBpdHMgc2l6ZSBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBkYXRhOiBkb3VibGUgcG9pbnRlciB0byB2b2lkLCB3aWxsIGhvbGQgZGF0YSBwcm9wZXJ0eSdzIGRhdGEgYWRkcmVzcworICogQHNpemU6IHBvaW50ZXIgdG8gc2l6ZV90LCB3aWxsIGhvbGQgZGF0YSBwcm9wZXJ0eSdzIGRhdGEgc2l6ZQorICoKKyAqIGZpdF9pbWFnZV9nZXRfZGF0YSgpIGZpbmRzIGRhdGEgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCBpdHMgZGF0YSBzdGFydCBhZGRyZXNzIGFuZCBzaXplIGFyZSByZXR1cm5lZCB0bworICogdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9kYXRhIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LAorCQljb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKQoreworCWludCBsZW47CisKKwkqZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9EQVRBX1BST1AsICZsZW4pOworCWlmICgqZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0RBVEFfUFJPUCwgbGVuKTsKKwkJKnNpemUgPSAwOworCQlyZXR1cm4gLTE7CisJfQorCisJKnNpemUgPSBsZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gLSBnZXQgaGFzaCBhbGdvcml0aG0gbmFtZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBoYXNoIG5vZGUgb2Zmc2V0CisgKiBAYWxnbzogZG91YmxlIHBvaW50ZXIgdG8gY2hhciwgd2lsbCBob2xkIHBvaW50ZXIgdG8gdGhlIGFsZ29yaXRobSBuYW1lCisgKgorICogZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28oKSBmaW5kcyBoYXNoIGFsZ29yaXRobSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGhhc2ggbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCBpdHMgZGF0YSBzdGFydCBhZGRyZXNzIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqYWxnbykKK3sKKwlpbnQgbGVuOworCisJKmFsZ28gPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9BTEdPX1BST1AsICZsZW4pOworCWlmICgqYWxnbyA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0FMR09fUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAtIGdldCBoYXNoIHZhbHVlIGFuZCBsZW5ndGgKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogaGFzaCBub2RlIG9mZnNldAorICogQHZhbHVlOiBkb3VibGUgcG9pbnRlciB0byB1aW50OF90LCB3aWxsIGhvbGQgYWRkcmVzcyBvZiBhIGhhc2ggdmFsdWUgZGF0YQorICogQHZhbHVlX2xlbjogcG9pbnRlciB0byBhbiBpbnQsIHdpbGwgaG9sZCBoYXNoIGRhdGEgbGVuZ3RoCisgKgorICogZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlKCkgZmluZHMgaGFzaCB2YWx1ZSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGhhc2ggbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCBpdHMgZGF0YSBzdGFydCBhZGRyZXNzIGFuZCBzaXplIGFyZSByZXR1cm5lZCB0bworICogdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICoqdmFsdWUsCisJCQkJaW50ICp2YWx1ZV9sZW4pCit7CisJaW50IGxlbjsKKworCSp2YWx1ZSA9ICh1aW50OF90ICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1ZBTFVFX1BST1AsICZsZW4pOworCWlmICgqdmFsdWUgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9WQUxVRV9QUk9QLCBsZW4pOworCQkqdmFsdWVfbGVuID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCSp2YWx1ZV9sZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X3NldF90aW1lc3RhbXAgLSBzZXQgbm9kZSB0aW1lc3RhbXAgcHJvcGVydHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogbm9kZSBvZmZzZXQKKyAqIEB0aW1lc3RhbXA6IHRpbWVzdGFtcCB2YWx1ZSB0byBiZSBzZXQKKyAqCisgKiBmaXRfc2V0X3RpbWVzdGFtcCgpIGF0dGVtcHRzIHRvIHNldCB0aW1lc3RhbXAgcHJvcGVydHkgaW4gdGhlIHJlcXVlc3RlZAorICogbm9kZSBhbmQgcmV0dXJucyBvcGVyYXRpb24gc3RhdHVzIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIHByb3BlcnR5IHJlYWQgZmFpbHVyZQorICovCitpbnQgZml0X3NldF90aW1lc3RhbXAgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCB0aW1lc3RhbXApCit7CisJdWludDMyX3QgdDsKKwlpbnQgcmV0OworCisJdCA9IGNwdV90b191aW1hZ2UgKHRpbWVzdGFtcCk7CisJcmV0ID0gZmR0X3NldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1RJTUVTVEFNUF9QUk9QLCAmdCwKKwkJCQlzaXplb2YgKHVpbnQzMl90KSk7CisJaWYgKHJldCkgeworCQlwcmludGYgKCJDYW4ndCBzZXQgJyVzJyBwcm9wZXJ0eSBmb3IgJyVzJyBub2RlICglcylcbiIsCisJCQlGSVRfVElNRVNUQU1QX1BST1AsIGZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCWZkdF9zdHJlcnJvciAocmV0KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjYWxjdWxhdGVfaGFzaCAtIGNhbGN1bGF0ZSBhbmQgcmV0dXJuIGhhc2ggZm9yIHByb3ZpZGVkIGlucHV0IGRhdGEKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhCisgKiBAZGF0YV9sZW46IGRhdGEgbGVuZ3RoCisgKiBAYWxnbzogcmVxdWVzdGVkIGhhc2ggYWxnb3JpdGhtCisgKiBAdmFsdWU6IHBvaW50ZXIgdG8gdGhlIGNoYXIsIHdpbGwgaG9sZCBoYXNoIHZhbHVlIGRhdGEgKGNhbGxlciBtdXN0CisgKiBhbGxvY2F0ZSBlbm91Z2ggZnJlZSBzcGFjZSkKKyAqIHZhbHVlX2xlbjogbGVuZ3RoIG9mIHRoZSBjYWxjdWxhdGVkIGhhc2gKKyAqCisgKiBjYWxjdWxhdGVfaGFzaCgpIGNvbXB1dGVzIGlucHV0IGRhdGEgaGFzaCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBhbGdvcml0aG0uCisgKiBSZXN1bHRpbmcgaGFzaCB2YWx1ZSBpcyBwbGFjZWQgaW4gY2FsbGVyIHByb3ZpZGVkICd2YWx1ZScgYnVmZmVyLCBsZW5ndGgKKyAqIG9mIHRoZSBjYWxjdWxhdGVkIGhhc2ggaXMgcmV0dXJuZWQgdmlhIHZhbHVlX2xlbiBwb2ludGVyIGFyZ3VtZW50LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgLTEsIHdoZW4gYWxnbyBpcyB1bnN1cHBvcnRlZAorICovCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9oYXNoIChjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4sIGNvbnN0IGNoYXIgKmFsZ28sCisJCQl1aW50OF90ICp2YWx1ZSwgaW50ICp2YWx1ZV9sZW4pCit7CisJaWYgKHN0cmNtcCAoYWxnbywgImNyYzMyIikgPT0gMCApIHsKKwkJKigodWludDMyX3QgKil2YWx1ZSkgPSBjcmMzMl93ZCAoMCwgZGF0YSwgZGF0YV9sZW4sCisJCQkJCQkJQ0hVTktTWl9DUkMzMik7CisJCSooKHVpbnQzMl90ICopdmFsdWUpID0gY3B1X3RvX3VpbWFnZSAoKigodWludDMyX3QgKil2YWx1ZSkpOworCQkqdmFsdWVfbGVuID0gNDsKKwl9IGVsc2UgaWYgKHN0cmNtcCAoYWxnbywgInNoYTEiKSA9PSAwICkgeworCQlzaGExX2NzdW1fd2QgKCh1bnNpZ25lZCBjaGFyICopIGRhdGEsIGRhdGFfbGVuLAorCQkJCSh1bnNpZ25lZCBjaGFyICopIHZhbHVlLCBDSFVOS1NaX1NIQTEpOworCQkqdmFsdWVfbGVuID0gMjA7CisJfSBlbHNlIGlmIChzdHJjbXAgKGFsZ28sICJtZDUiKSA9PSAwICkgeworCQltZDVfd2QgKCh1bnNpZ25lZCBjaGFyICopZGF0YSwgZGF0YV9sZW4sIHZhbHVlLCBDSFVOS1NaX01ENSk7CisJCSp2YWx1ZV9sZW4gPSAxNjsKKwl9IGVsc2UgeworCQlkZWJ1ZyAoIlVuc3VwcG9ydGVkIGhhc2ggYWxvZ3JpdGhtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFVTRV9IT1NUQ0MKKy8qKgorICogZml0X3NldF9oYXNoZXMgLSBwcm9jZXNzIEZJVCBjb21wb25lbnQgaW1hZ2Ugbm9kZXMgYW5kIGNhbGN1bGF0ZSBoYXNoZXMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogZml0X3NldF9oYXNoZXMoKSBhZGRzIGhhc2ggdmFsdWVzIGZvciBhbGwgY29tcG9uZW50IGltYWdlcyBpbiB0aGUgRklUIGJsb2IuCisgKiBIYXNoZXMgYXJlIGNhbGN1bGF0ZWQgZm9yIGFsbCBjb21wb25lbnQgaW1hZ2VzIHdoaWNoIGhhdmUgaGFzaCBzdWJub2RlcworICogd2l0aCBhbGdvcml0aG0gcHJvcGVydHkgc2V0IHRvIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtcy4KKyAqCisgKiByZXR1cm5zCisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIGxpYmZkdCBlcnJvciBjb2RlLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfc2V0X2hhc2hlcyAodm9pZCAqZml0KQoreworCWludCBpbWFnZXNfbm9mZnNldDsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCWludCByZXQ7CisKKwkvKiBGaW5kIGltYWdlcyBwYXJlbnQgbm9kZSBvZmZzZXQgKi8KKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCBpbWFnZXMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0lNQUdFU19QQVRILCBmZHRfc3RyZXJyb3IgKGltYWdlc19ub2Zmc2V0KSk7CisJCXJldHVybiBpbWFnZXNfbm9mZnNldDsKKwl9CisKKwkvKiBQcm9jZXNzIGl0cyBzdWJub2RlcywgcHJpbnQgb3V0IGNvbXBvbmVudCBpbWFnZXMgZGV0YWlscyAqLworCWZvciAobmRlcHRoID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2VzX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGltYWdlcyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29tcG9uZW50IGltYWdlIG5vZGUuCisJCQkgKi8KKwkJCXJldCA9IGZpdF9pbWFnZV9zZXRfaGFzaGVzIChmaXQsIG5vZmZzZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX3NldF9oYXNoZXMgLSBjYWxjdWxhdGUvc2V0IGhhc2hlcyBmb3IgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2Vfbm9mZnNldDogcmVxdWVzdGVkIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKgorICogZml0X2ltYWdlX3NldF9oYXNoZXMoKSBhZGRzIGhhc2ggdmFsdWVzIGZvciBhbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4gQWxsCisgKiBleGlzdGluZyBoYXNoIHN1Ym5vZGVzIGFyZSBjaGVja2VkLCBpZiBhbGdvcml0aG0gcHJvcGVydHkgaXMgc2V0IHRvIG9uZSBvZgorICogdGhlIHN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobXMsIGhhc2ggdmFsdWUgaXMgY29tcHV0ZWQgYW5kIGNvcnJlc3BvbmRpbmcKKyAqIGhhc2ggbm9kZSBwcm9wZXJ0eSBpcyBzZXQsIGZvciBleGFtcGxlOgorICoKKyAqIElucHV0IGNvbXBvbmVudCBpbWFnZSBub2RlIHN0cnVjdHVyZToKKyAqCisgKiBvIGltYWdlQDEgKGF0IGltYWdlX25vZmZzZXQpCisgKiAgIHwgLSBkYXRhID0gW2JpbmFyeSBkYXRhXQorICogICBvIGhhc2hAMQorICogICAgIHwtIGFsZ28gPSAic2hhMSIKKyAqCisgKiBPdXRwdXQgY29tcG9uZW50IGltYWdlIG5vZGUgc3RydWN0dXJlOgorICoKKyAqIG8gaW1hZ2VAMSAoYXQgaW1hZ2Vfbm9mZnNldCkKKyAqICAgfCAtIGRhdGEgPSBbYmluYXJ5IGRhdGFdCisgKiAgIG8gaGFzaEAxCisgKiAgICAgfC0gYWxnbyA9ICJzaGExIgorICogICAgIHwtIHZhbHVlID0gc2hhMShkYXRhKQorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCBvbiBzdWNlc3MKKyAqICAgIDwwIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9zZXRfaGFzaGVzICh2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0KQoreworCWNvbnN0IHZvaWQgKmRhdGE7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYWxnbzsKKwl1aW50OF90IHZhbHVlW0ZJVF9NQVhfSEFTSF9MRU5dOworCWludCB2YWx1ZV9sZW47CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKworCS8qIEdldCBpbWFnZSBkYXRhIGFuZCBkYXRhIGxlbmd0aCAqLworCWlmIChmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRhdGEsICZzaXplKSkgeworCQlwcmludGYgKCJDYW4ndCBnZXQgaW1hZ2UgZGF0YS9zaXplXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGhhc2ggc3Vibm9kZXMgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisKKwkJCS8qCisJCQkgKiBDaGVjayBzdWJub2RlIG5hbWUsIG11c3QgYmUgZXF1YWwgdG8gImhhc2giLgorCQkJICogTXVsdGlwbGUgaGFzaCBub2RlcyByZXF1aXJlIHVuaXF1ZSB1bml0IG5vZGUKKwkJCSAqIG5hbWVzLCBlLmcuIGhhc2hAMSwgaGFzaEAyLCBldGMuCisJCQkgKi8KKwkJCWlmIChzdHJuY21wIChmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJCUZJVF9IQVNIX05PREVOQU1FLAorCQkJCQkJc3RybGVuKEZJVF9IQVNIX05PREVOQU1FKSkgIT0gMCkgeworCQkJCS8qIE5vdCBhIGhhc2ggc3Vibm9kZSwgc2tpcCBpdCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGZpdCwgbm9mZnNldCwgJmFsZ28pKSB7CisJCQkJcHJpbnRmICgiQ2FuJ3QgZ2V0IGhhc2ggYWxnbyBwcm9wZXJ0eSBmb3IgIgorCQkJCQkiJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlpZiAoY2FsY3VsYXRlX2hhc2ggKGRhdGEsIHNpemUsIGFsZ28sIHZhbHVlLCAmdmFsdWVfbGVuKSkgeworCQkJCXByaW50ZiAoIlVuc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtICglcykgZm9yICIKKwkJCQkJIiclcycgaGFzaCBub2RlIGluICclcycgaW1hZ2Ugbm9kZVxuIiwKKwkJCQkJYWxnbywgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSAoZml0LCBub2Zmc2V0LCB2YWx1ZSwKKwkJCQkJCQl2YWx1ZV9sZW4pKSB7CisJCQkJcHJpbnRmICgiQ2FuJ3Qgc2V0IGhhc2ggdmFsdWUgZm9yICIKKwkJCQkJIiclcycgaGFzaCBub2RlIGluICclcycgaW1hZ2Ugbm9kZVxuIiwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSAtIHNldCBoYXNoIHZhbHVlIGluIHJlcXVlc3RlZCBoYXMgbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBoYXNoIG5vZGUgb2Zmc2V0CisgKiBAdmFsdWU6IGhhc2ggdmFsdWUgdG8gYmUgc2V0CisgKiBAdmFsdWVfbGVuOiBoYXNoIHZhbHVlIGxlbmd0aAorICoKKyAqIGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSgpIGF0dGVtcHRzIHRvIHNldCBoYXNoIHZhbHVlIGluIGEgbm9kZSBhdCBvZmZzZXQKKyAqIGdpdmVuIGFuZCByZXR1cm5zIG9wZXJhdGlvbiBzdGF0dXMgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zCisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnZhbHVlLAorCQkJCWludCB2YWx1ZV9sZW4pCit7CisJaW50IHJldDsKKworCXJldCA9IGZkdF9zZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9WQUxVRV9QUk9QLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZiAoIkNhbid0IHNldCBoYXNoICclcycgcHJvcGVydHkgZm9yICclcycgbm9kZSAoJXMpXG4iLAorCQkJRklUX1ZBTFVFX1BST1AsIGZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCWZkdF9zdHJlcnJvciAocmV0KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAtIHZlcmlmeSBkYXRhIGludGVyZ2l0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBpbWFnZV9ub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzKCkgZ29lcyBvdmVyIGNvbXBvbmVudCBpbWFnZSBoYXNoIG5vZGVzLAorICogcmUtY2FsY3VsYXRlcyBlYWNoIGRhdGEgaGFzaCBhbmQgY29tcGFyZXMgd2l0aCB0aGUgdmFsdWUgc3RvcmVkIGluIGhhc2gKKyAqIG5vZGUuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBpZiBhbGwgaGFzaGVzIGFyZSB2YWxpZAorICogICAgIDAsIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0KQoreworCWNvbnN0IHZvaWQJKmRhdGE7CisJc2l6ZV90CQlzaXplOworCWNoYXIJCSphbGdvOworCXVpbnQ4X3QJCSpmaXRfdmFsdWU7CisJaW50CQlmaXRfdmFsdWVfbGVuOworCXVpbnQ4X3QJCXZhbHVlW0ZJVF9NQVhfSEFTSF9MRU5dOworCWludAkJdmFsdWVfbGVuOworCWludAkJbm9mZnNldDsKKwlpbnQJCW5kZXB0aDsKKwljaGFyCQkqZXJyX21zZyA9ICIiOworCisJLyogR2V0IGltYWdlIGRhdGEgYW5kIGRhdGEgbGVuZ3RoICovCisJaWYgKGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGF0YSwgJnNpemUpKSB7CisJCXByaW50ZiAoIkNhbid0IGdldCBpbWFnZSBkYXRhL3NpemVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBoYXNoIHN1Ym5vZGVzIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCWZvciAobmRlcHRoID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCisJCQkvKgorCQkJICogQ2hlY2sgc3Vibm9kZSBuYW1lLCBtdXN0IGJlIGVxdWFsIHRvICJoYXNoIi4KKwkJCSAqIE11bHRpcGxlIGhhc2ggbm9kZXMgcmVxdWlyZSB1bmlxdWUgdW5pdCBub2RlCisJCQkgKiBuYW1lcywgZS5nLiBoYXNoQDEsIGhhc2hAMiwgZXRjLgorCQkJICovCisJCQlpZiAoc3RybmNtcCAoZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCUZJVF9IQVNIX05PREVOQU1FLAorCQkJCQlzdHJsZW4oRklUX0hBU0hfTk9ERU5BTUUpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGZpdCwgbm9mZnNldCwgJmFsZ28pKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5DYW4ndCBnZXQgaGFzaCBhbGdvICIKKwkJCQkJCSJwcm9wZXJ0eSI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXByaW50ZiAoIiVzIiwgYWxnbyk7CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGZpdCwgbm9mZnNldCwgJmZpdF92YWx1ZSwKKwkJCQkJCQkmZml0X3ZhbHVlX2xlbikpIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcbkNhbid0IGdldCBoYXNoIHZhbHVlICIKKwkJCQkJCSJwcm9wZXJ0eSI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJaWYgKGNhbGN1bGF0ZV9oYXNoIChkYXRhLCBzaXplLCBhbGdvLCB2YWx1ZSwgJnZhbHVlX2xlbikpIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcblVuc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtIjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlpZiAodmFsdWVfbGVuICE9IGZpdF92YWx1ZV9sZW4pIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciAhXG5CYWQgaGFzaCB2YWx1ZSBsZW4iOworCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2UgaWYgKG1lbWNtcCAodmFsdWUsIGZpdF92YWx1ZSwgdmFsdWVfbGVuKSAhPSAwKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5CYWQgaGFzaCB2YWx1ZSI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXByaW50ZiAoIisgIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKKworZXJyb3I6CisJcHJpbnRmICgiJXMgZm9yICclcycgaGFzaCBub2RlIGluICclcycgaW1hZ2Ugbm9kZVxuIiwKKwkJCWVycl9tc2csIGZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2FsbF9pbWFnZV9jaGVja19oYXNoZXMgLSB2ZXJpZnkgZGF0YSBpbnRlcmdpdHkgZm9yIGFsbCBpbWFnZXMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogZml0X2FsbF9pbWFnZV9jaGVja19oYXNoZXMoKSBnb2VzIG92ZXIgYWxsIGltYWdlcyBpbiB0aGUgRklUIGFuZAorICogZm9yIGV2ZXJ5IGltYWdlcyBjaGVja3MgaWYgYWxsIGl0J3MgaGFzaGVzIGFyZSB2YWxpZC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIGlmIGFsbCBoYXNoZXMgb2YgYWxsIGltYWdlcyBhcmUgdmFsaWQKKyAqICAgICAwLCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2FsbF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwlpbnQgaW1hZ2VzX25vZmZzZXQ7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgY291bnQ7CisKKwkvKiBGaW5kIGltYWdlcyBwYXJlbnQgbm9kZSBvZmZzZXQgKi8KKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCBpbWFnZXMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0lNQUdFU19QQVRILCBmZHRfc3RyZXJyb3IgKGltYWdlc19ub2Zmc2V0KSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGltYWdlIHN1Ym5vZGVzLCBjaGVjayBoYXNoZXMgZm9yIGVhY2ggKi8KKwlwcmludGYgKCIjIyBDaGVja2luZyBoYXNoKGVzKSBmb3IgRklUIEltYWdlIGF0ICUwOGx4IC4uLlxuIiwKKwkJKHVsb25nKWZpdCk7CisJZm9yIChuZGVwdGggPSAwLCBjb3VudCA9IDAsCisJCW5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkJKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCQlub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgaW1hZ2VzIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKwkJCSAqLworCQkJcHJpbnRmICgiICAgSGFzaChlcykgZm9yIEltYWdlICV1ICglcyk6ICIsIGNvdW50KyssCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSk7CisKKwkJCWlmICghZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoZml0LCBub2Zmc2V0KSkKKwkJCQlyZXR1cm4gMDsKKwkJCXByaW50ZiAoIlxuIik7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX29zIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIGlzIG9mIGEgZ2l2ZW4gb3MgdHlwZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBvczogcmVxdWVzdGVkIGltYWdlIG9zCisgKgorICogZml0X2ltYWdlX2NoZWNrX29zKCkgcmVhZHMgaW1hZ2Ugb3MgcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cyBudW1lcmljCisgKiBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgb3MuIENvbXBhcmlzb24gcmVzdWx0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIGltYWdlIGlzIG9mIGdpdmVuIG9zIHR5cGUKKyAqICAgICAwIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3Qgb3MpCit7CisJdWludDhfdCBpbWFnZV9vczsKKworCWlmIChmaXRfaW1hZ2VfZ2V0X29zIChmaXQsIG5vZmZzZXQsICZpbWFnZV9vcykpCisJCXJldHVybiAwOworCXJldHVybiAob3MgPT0gaW1hZ2Vfb3MpOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19hcmNoIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIGlzIG9mIGEgZ2l2ZW4gYXJjaAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBhcmNoOiByZXF1ZXN0ZWQgaW1hZ2VhcmNoCisgKgorICogZml0X2ltYWdlX2NoZWNrX2FyY2goKSByZWFkcyBpbWFnZSBhcmNoIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMgbnVtZXJpYworICogaWQgd2l0aCB0aGUgcmVxdWVzdGVkIGFyY2guIENvbXBhcmlzb24gcmVzdWx0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIGltYWdlIGlzIG9mIGdpdmVuIGFyY2gKKyAqICAgICAwIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBhcmNoKQoreworCXVpbnQ4X3QgaW1hZ2VfYXJjaDsKKworCWlmIChmaXRfaW1hZ2VfZ2V0X2FyY2ggKGZpdCwgbm9mZnNldCwgJmltYWdlX2FyY2gpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGFyY2ggPT0gaW1hZ2VfYXJjaCk7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX3R5cGUgLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgaXMgb2YgYSBnaXZlbiB0eXBlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQHR5cGU6IHJlcXVlc3RlZCBpbWFnZSB0eXBlCisgKgorICogZml0X2ltYWdlX2NoZWNrX3R5cGUoKSByZWFkcyBpbWFnZSB0eXBlIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMgbnVtZXJpYworICogaWQgd2l0aCB0aGUgcmVxdWVzdGVkIHR5cGUuIENvbXBhcmlzb24gcmVzdWx0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIGltYWdlIGlzIG9mIGdpdmVuIHR5cGUKKyAqICAgICAwIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCB0eXBlKQoreworCXVpbnQ4X3QgaW1hZ2VfdHlwZTsKKworCWlmIChmaXRfaW1hZ2VfZ2V0X3R5cGUgKGZpdCwgbm9mZnNldCwgJmltYWdlX3R5cGUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHR5cGUgPT0gaW1hZ2VfdHlwZSk7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX2NvbXAgLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgdXNlcyBnaXZlbiBjb21wcmVzc2lvbgorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBjb21wOiByZXF1ZXN0ZWQgaW1hZ2UgY29tcHJlc3Npb24gdHlwZQorICoKKyAqIGZpdF9pbWFnZV9jaGVja19jb21wKCkgcmVhZHMgaW1hZ2UgY29tcHJlc3Npb24gcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cworICogbnVtZXJpYyBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgY29tcHJlc3Npb24gdHlwZS4gQ29tcGFyaXNvbiByZXN1bHQgaXMKKyAqIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIGltYWdlIHVzZXMgcmVxdWVzdGVkIGNvbXByZXNzaW9uCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgY29tcCkKK3sKKwl1aW50OF90IGltYWdlX2NvbXA7CisKKwlpZiAoZml0X2ltYWdlX2dldF9jb21wIChmaXQsIG5vZmZzZXQsICZpbWFnZV9jb21wKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChjb21wID09IGltYWdlX2NvbXApOworfQorCisvKioKKyAqIGZpdF9jaGVja19mb3JtYXQgLSBzYW5pdHkgY2hlY2sgRklUIGltYWdlIGZvcm1hdAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiBmaXRfY2hlY2tfZm9ybWF0KCkgcnVucyBhIGJhc2ljIHNhbml0eSBGSVQgaW1hZ2UgdmVyaWZpY2F0aW9uLgorICogUm91dGluZSBjaGVja3MgZm9yIG1hbmRhdG9yeSBwcm9wZXJ0aWVzLCBub2RlcywgZXRjLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgb24gc3VjY2VzcworICogICAgIDAsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9jaGVja19mb3JtYXQgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwkvKiBtYW5kYXRvcnkgLyBub2RlICdkZXNjcmlwdGlvbicgcHJvcGVydHkgKi8KKwlpZiAoZmR0X2dldHByb3AgKGZpdCwgMCwgRklUX0RFU0NfUFJPUCwgTlVMTCkgPT0gTlVMTCkgeworCQlkZWJ1ZyAoIldyb25nIEZJVCBmb3JtYXQ6IG5vIGRlc2NyaXB0aW9uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCS8qIG1hbmRhdG9yeSAvIG5vZGUgJ3RpbWVzdGFtcCcgcHJvcGVydHkgKi8KKwlpZiAoZmR0X2dldHByb3AgKGZpdCwgMCwgRklUX1RJTUVTVEFNUF9QUk9QLCBOVUxMKSA9PSBOVUxMKSB7CisJCWRlYnVnICgiV3JvbmcgRklUIGZvcm1hdDogbm8gdGltZXN0YW1wXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwkvKiBtYW5kYXRvcnkgc3ViaW1hZ2VzIHBhcmVudCAnL2ltYWdlcycgbm9kZSAqLworCWlmIChmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKSA8IDApIHsKKwkJZGVidWcgKCJXcm9uZyBGSVQgZm9ybWF0OiBubyBpbWFnZXMgcGFyZW50IG5vZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBmaXRfY29uZl9nZXRfbm9kZSAtIGdldCBub2RlIG9mZnNldCBmb3IgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHVuaXQgbmFtZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBjb25mX3VuYW1lOiBjb25maWd1cmF0aW9uIG5vZGUgdW5pdCBuYW1lCisgKgorICogZml0X2NvbmZfZ2V0X25vZGUoKSBmaW5kcyBhIGNvbmZpZ3VyYXRpb24gKHdpdGhpbmcgdGhlICcvY29uZmlndXJhdGlvbnMnCisgKiBwYXJhbnQgbm9kZSkgb2YgYSBwcm92aWRlZCB1bml0IG5hbWUuIElmIGNvbmZpZ3VyYXRpb24gaXMgZm91bmQgaXRzIG5vZGUgb2Zmc2V0CisgKiBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIFdoZW4gTlVMTCBpcyBwcm92aWRlZCBpbiBzZWNvbmQgYXJndW1lbnQgZml0X2NvbmZfZ2V0X25vZGUoKSB3aWxsIHNlYXJjaAorICogZm9yIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIG5vZGUgaW5zdGVhZC4gRGVmYXVsdCBjb25maWd1cmF0aW9uIG5vZGUgdW5pdCBuYW1lCisgKiBpcyByZXRyaXZlZCBmcm9tIEZJVF9ERUZBVUxUX1BST1AgcHJvcGVydHkgb2YgdGhlICcvY29uZmlndXJhdGlvbnMnIG5vZGUuCisgKgorICogcmV0dXJuczoKKyAqICAgICBjb25maWd1cmF0aW9uIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBjb25zdCBjaGFyICpjb25mX3VuYW1lKQoreworCWludCBub2Zmc2V0LCBjb25mc19ub2Zmc2V0OworCWludCBsZW47CisKKwljb25mc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9DT05GU19QQVRIKTsKKwlpZiAoY29uZnNfbm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBmaW5kIGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9DT05GU19QQVRILCBmZHRfc3RyZXJyb3IgKGNvbmZzX25vZmZzZXQpKTsKKwkJcmV0dXJuIGNvbmZzX25vZmZzZXQ7CisJfQorCisJaWYgKGNvbmZfdW5hbWUgPT0gTlVMTCkgeworCQkvKiBnZXQgY29uZmlndXJhdGlvbiB1bml0IG5hbWUgZnJvbSB0aGUgZGVmYXVsdCBwcm9wZXJ0eSAqLworCQlkZWJ1ZyAoIk5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLCB0cnlpbmcgZGVmYXVsdC4uLlxuIik7CisJCWNvbmZfdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIGNvbmZzX25vZmZzZXQsIEZJVF9ERUZBVUxUX1BST1AsICZsZW4pOworCQlpZiAoY29uZl91bmFtZSA9PSBOVUxMKSB7CisJCQlmaXRfZ2V0X2RlYnVnIChmaXQsIGNvbmZzX25vZmZzZXQsIEZJVF9ERUZBVUxUX1BST1AsIGxlbik7CisJCQlyZXR1cm4gbGVuOworCQl9CisJCWRlYnVnICgiRm91bmQgZGVmYXVsdCBjb25maWd1cmF0aW9uOiAnJXMnXG4iLCBjb25mX3VuYW1lKTsKKwl9CisKKwlub2Zmc2V0ID0gZmR0X3N1Ym5vZGVfb2Zmc2V0IChmaXQsIGNvbmZzX25vZmZzZXQsIGNvbmZfdW5hbWUpOworCWlmIChub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGdldCBub2RlIG9mZnNldCBmb3IgY29uZmlndXJhdGlvbiB1bml0IG5hbWU6ICclcycgKCVzKVxuIiwKKwkJCWNvbmZfdW5hbWUsIGZkdF9zdHJlcnJvciAobm9mZnNldCkpOworCX0KKworCXJldHVybiBub2Zmc2V0OworfQorCitzdGF0aWMgaW50IF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJY29uc3QgY2hhciAqcHJvcF9uYW1lKQoreworCWNoYXIgKnVuYW1lOworCWludCBsZW47CisKKwkvKiBnZXQga2VybmVsIGltYWdlIHVuaXQgbmFtZSBmcm9tIGNvbmZpZ3VyYXRpb24ga2VybmVsIHByb3BlcnR5ICovCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIHByb3BfbmFtZSwgJmxlbik7CisJaWYgKHVuYW1lID09IE5VTEwpCisJCXJldHVybiBsZW47CisKKwlyZXR1cm4gZml0X2ltYWdlX2dldF9ub2RlIChmaXQsIHVuYW1lKTsKK30KKworLyoqCisgKiBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUgLSBnZXQga2VybmVsIGltYWdlIG5vZGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8KKyAqIGEgZ2l2ZW4gY29uZmlndXJhdGlvbgorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb25maWd1cmF0aW9uIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlKCkgcmV0cml2ZXMga2VybmVsIGltYWdlIG5vZGUgdW5pdCBuYW1lIGZyb20KKyAqIGNvbmZpZ3VyYXRpb24gRklUX0tFUk5FTF9QUk9QIHByb3BlcnR5IGFuZCB0cmFuc2xhdGVzIGl0IHRvIHRoZSBub2RlCisgKiBvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KQoreworCXJldHVybiBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGZpdCwgbm9mZnNldCwgRklUX0tFUk5FTF9QUk9QKTsKK30KKworLyoqCisgKiBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlIC0gZ2V0IHJhbWRpc2sgaW1hZ2Ugbm9kZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICogYSBnaXZlbiBjb25maWd1cmF0aW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlKCkgcmV0cml2ZXMgcmFtZGlzayBpbWFnZSBub2RlIHVuaXQgbmFtZSBmcm9tCisgKiBjb25maWd1cmF0aW9uIEZJVF9LRVJORUxfUFJPUCBwcm9wZXJ0eSBhbmQgdHJhbnNsYXRlcyBpdCB0byB0aGUgbm9kZQorICogb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpCit7CisJcmV0dXJuIF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoZml0LCBub2Zmc2V0LCBGSVRfUkFNRElTS19QUk9QKTsKK30KKworLyoqCisgKiBmaXRfY29uZl9nZXRfZmR0X25vZGUgLSBnZXQgZmR0IGltYWdlIG5vZGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8KKyAqIGEgZ2l2ZW4gY29uZmlndXJhdGlvbgorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb25maWd1cmF0aW9uIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2NvbmZfZ2V0X2ZkdF9ub2RlKCkgcmV0cml2ZXMgZmR0IGltYWdlIG5vZGUgdW5pdCBuYW1lIGZyb20KKyAqIGNvbmZpZ3VyYXRpb24gRklUX0tFUk5FTF9QUk9QIHByb3BlcnR5IGFuZCB0cmFuc2xhdGVzIGl0IHRvIHRoZSBub2RlCisgKiBvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KQoreworCXJldHVybiBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGZpdCwgbm9mZnNldCwgRklUX0ZEVF9QUk9QKTsKK30KKworLyoqCisgKiBmaXRfY29uZl9wcmludCAtIHByaW50cyBvdXQgdGhlIEZJVCBjb25maWd1cmF0aW9uIGRldGFpbHMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogb2Zmc2V0IG9mIHRoZSBjb25maWd1cmF0aW9uIG5vZGUKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfY29uZl9wcmludCgpIGxpc3RzIGFsbCBtYW5kYXRvcnkgcHJvcGVyaWVzIGZvciB0aGUgcHJvY2Vzc2VkCisgKiBjb25maWd1cmF0aW9uIG5vZGUuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X2NvbmZfcHJpbnQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApCit7CisJY2hhciAqZGVzYzsKKwljaGFyICp1bmFtZTsKKwlpbnQgcmV0OworCisJLyogTWFuZGF0b3J5IHByb3BlcnRpZXMgKi8KKwlyZXQgPSBmaXRfZ2V0X2Rlc2MgKGZpdCwgbm9mZnNldCwgJmRlc2MpOworCXByaW50ZiAoIiVzICBEZXNjcmlwdGlvbjogICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCBkZXNjKTsKKworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfS0VSTkVMX1BST1AsIE5VTEwpOworCXByaW50ZiAoIiVzICBLZXJuZWw6ICAgICAgICIsIHApOworCWlmICh1bmFtZSA9PSBOVUxMKQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgdW5hbWUpOworCisJLyogT3B0aW9uYWwgcHJvcGVydGllcyAqLworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfUkFNRElTS19QUk9QLCBOVUxMKTsKKwlpZiAodW5hbWUpCisJCXByaW50ZiAoIiVzICBJbml0IFJhbWRpc2s6ICVzXG4iLCBwLCB1bmFtZSk7CisKKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0ZEVF9QUk9QLCBOVUxMKTsKKwlpZiAodW5hbWUpCisJCXByaW50ZiAoIiVzICBGRFQ6ICAgICAgICAgICVzXG4iLCBwLCB1bmFtZSk7Cit9CisKKy8qKgorICogZml0X2NoZWNrX3JhbWRpc2sgLSB2ZXJpZnkgRklUIGZvcm1hdCByYW1kaXNrIHN1YmltYWdlCisgKiBAZml0X2hkcjogcG9pbnRlciB0byB0aGUgRklUIHJhbWRpc2sgaGVhZGVyCisgKiBAcmRfbm9mZnNldDogcmFtZGlzayBzdWJpbWFnZSBub2RlIG9mZnNldCB3aXRoaW4gRklUIGltYWdlCisgKiBAYXJjaDogcmVxdWVzdGVkIHJhbWRpc2sgaW1hZ2UgYXJjaGl0ZWN0dXJlIHR5cGUKKyAqIEB2ZXJpZnk6IGRhdGEgQ1JDIHZlcmlmaWNhdGlvbiBmbGFnCisgKgorICogZml0X2NoZWNrX3JhbWRpc2soKSB2ZXJpZmllcyBpbnRlZ3JpdHkgb2YgdGhlIHJhbWRpc2sgc3ViaW1hZ2UgYW5kIGZyb20KKyAqIHNwZWNpZmllZCBGSVQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBvbiBzdWNjZXNzCisgKiAgICAgMCwgb24gZmFpbHVyZQorICovCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3N0YXRpYyBpbnQgZml0X2NoZWNrX3JhbWRpc2sgKGNvbnN0IHZvaWQgKmZpdCwgaW50IHJkX25vZmZzZXQsIHVpbnQ4X3QgYXJjaCwgaW50IHZlcmlmeSkKK3sKKwlmaXRfaW1hZ2VfcHJpbnQgKGZpdCwgcmRfbm9mZnNldCwgIiAgICIpOworCisJaWYgKHZlcmlmeSkgeworCQlwdXRzICgiICAgVmVyaWZ5aW5nIEhhc2ggSW50ZWdyaXR5IC4uLiAiKTsKKwkJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChmaXQsIHJkX25vZmZzZXQpKSB7CisJCQlwdXRzICgiQmFkIERhdGEgSGFzaFxuIik7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMjUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHV0cyAoIk9LXG4iKTsKKwl9CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEyNik7CisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfb3MgKGZpdCwgcmRfbm9mZnNldCwgSUhfT1NfTElOVVgpIHx8CisJICAgICFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZml0LCByZF9ub2Zmc2V0LCBhcmNoKSB8fAorCSAgICAhZml0X2ltYWdlX2NoZWNrX3R5cGUgKGZpdCwgcmRfbm9mZnNldCwgSUhfVFlQRV9SQU1ESVNLKSkgeworCQlwcmludGYgKCJObyBMaW51eCAlcyBSYW1kaXNrIEltYWdlXG4iLAorCQkJCWdlbmltZ19nZXRfYXJjaF9uYW1lKGFyY2gpKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtMTI2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2hvd19ib290X3Byb2dyZXNzICgxMjcpOworCXJldHVybiAxOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKyNlbmRpZiAvKiBDT05GSUdfRklUICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vbWFpbi5jIGIveC1sb2FkZXIvY29tbW9uL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWE3ODhlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL21haW4uYwpAQCAtMCwwICsxLDM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEFkZCB0byByZWFkbGluZSBjbWRsaW5lLWVkaXRpbmcgYnkKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogSmluSHVhIEx1bywgR3VhbmdEb25nIExpbnV4IENlbnRlciwgPGx1by5qaW5odWFAZ2QtbGludXguY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qICNkZWZpbmUJREVCVUcJKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNob3dfYm9vdF9wcm9ncmVzcyAoKSBpZiBuZWVkZWQKKyAqLwordm9pZCBpbmxpbmUgX19zaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpIHt9Cit2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyAoaW50IHZhbCkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fc2hvd19ib290X3Byb2dyZXNzIikpKTsKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbmZpZy5tayBiL3gtbG9hZGVyL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTgwYzYxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjU0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK2lmZXEgKCQoQ1VSRElSKSwkKFNSQ1RSRUUpKQorZGlyIDo9CitlbHNlCitkaXIgOj0gJChzdWJzdCAkKFNSQ1RSRUUpLywsJChDVVJESVIpKQorZW5kaWYKKworb2JqIDo9ICQoaWYgJChkaXIpLCQoT0JKVFJFRSkvJChkaXIpLywkKE9CSlRSRUUpLykKK3NyYyA6PSAkKGlmICQoZGlyKSwkKFNSQ1RSRUUpLyQoZGlyKS8sJChTUkNUUkVFKS8pCisKKyQoc2hlbGwgbWtkaXIgLXAgJChvYmopKQorZWxzZQorb2JqIDo9CitzcmMgOj0KK2VuZGlmCisKKyMgY2xlYW4gdGhlIHNsYXRlIC4uLgorUExBVEZPUk1fUkVMRkxBR1MgPQorUExBVEZPUk1fQ1BQRkxBR1MgPQorUExBVEZPUk1fTERGTEFHUyA9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworSE9TVENGTEFHUwk9IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIFwKKwkJICAkKEhPU1RDUFBGTEFHUykKK0hPU1RTVFJJUAk9IHN0cmlwCisKKyMKKyMgTWFjIE9TIFggLyBEYXJ3aW4ncyBDIHByZXByb2Nlc3NvciBpcyBBcHBsZSBzcGVjaWZpYy4gIEl0CisjIGdlbmVyYXRlcyBudW1lcm91cyBlcnJvcnMgYW5kIHdhcm5pbmdzLiAgV2Ugd2FudCB0byBieXBhc3MgaXQKKyMgYW5kIHVzZSBHTlUgQydzIGNwcC4gIFRvIGRvIHRoaXMgd2UgcGFzcyB0aGUgLXRyYWRpdGlvbmFsLWNwcAorIyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLiAgTm90ZSB0aGF0IHRoZSAtdHJhZGl0aW9uYWwtY3BwIGZsYWcKKyMgRE9FUyBOT1QgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgR05VIEMncyBmbGFnLCBhbGwgaXQgZG9lcworIyBpcyBpbnZva2UgdGhlIEdOVSBwcmVwcm9jZXNzb3IgaW4gc3RvY2sgQU5TSS9JU08gQyBmYXNoaW9uLgorIworIyBBcHBsZSdzIGxpbmtlciBpcyBzaW1pbGFyLCB0aGFua3MgdG8gdGhlIG5ldyAyIHN0YWdlIGxpbmtpbmcKKyMgbXVsdGlwbGUgc3ltYm9sIGRlZmluaXRpb25zIGFyZSB0cmVhdGVkIGFzIGVycm9ycywgaGVuY2UgdGhlCisjIC1tdWx0aXBseV9kZWZpbmVkIHN1cHByZXNzIG9wdGlvbiB0byB0dXJuIG9mZiB0aGlzIGVycm9yLgorIworCitpZmVxICgkKEhPU1RPUyksZGFyd2luKQorIyBnZXQgbWFqb3IgYW5kIG1pbm9yIHByb2R1Y3QgdmVyc2lvbiAoZS5nLiAnMTAnIGFuZCAnNicgZm9yIFNub3cgTGVvcGFyZCkKK0RBUldJTl9NQUpPUl9WRVJTSU9OCT0gJChzaGVsbCBzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiB8IGN1dCAtZiAxIC1kICcuJykKK0RBUldJTl9NSU5PUl9WRVJTSU9OCT0gJChzaGVsbCBzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiB8IGN1dCAtZiAyIC1kICcuJykKKworb3NfeF9iZWZvcmUJPSAkKHNoZWxsIGlmIFsgJChEQVJXSU5fTUFKT1JfVkVSU0lPTikgLWxlICQoMSkgLWEgXAorCSQoREFSV0lOX01JTk9SX1ZFUlNJT04pIC1sZSAkKDIpIF0gOyB0aGVuIGVjaG8gIiQoMykiOyBlbHNlIGVjaG8gIiQoNCkiOyBmaSA7KQorCisjIFNub3cgTGVvcGFyZHMgYnVpbGQgZW52aXJvbm1lbnQgaGFzIG5vIGxvbmdlciByZXN0cmljdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlCitIT1NUQ0MJCSA9ICQoY2FsbCBvc194X2JlZm9yZSwgMTAsIDUsICJjYyIsICJnY2MiKQorSE9TVENGTEFHUwkrPSAkKGNhbGwgb3NfeF9iZWZvcmUsIDEwLCA0LCAiLXRyYWRpdGlvbmFsLWNwcCIpCitIT1NUTERGTEFHUwkrPSAkKGNhbGwgb3NfeF9iZWZvcmUsIDEwLCA1LCAiLW11bHRpcGx5X2RlZmluZWQgc3VwcHJlc3MiKQorZWxzZQorSE9TVENDCQk9IGdjYworZW5kaWYKKworaWZlcSAoJChIT1NUT1MpLGN5Z3dpbikKK0hPU1RDRkxBR1MJKz0gLWFuc2kKK2VuZGlmCisKKyMgV2UgYnVpbGQgc29tZSBmaWxlcyB3aXRoIGV4dHJhIHBlZGFudGljIGZsYWdzIHRvIHRyeSB0byBtaW5pbWl6ZSB0aGluZ3MKKyMgdGhhdCB3b24ndCBidWlsZCBvbiBzb21lIHdlaXJkIGhvc3QgY29tcGlsZXIgLS0gdGhvdWdoIHRoZXJlIGFyZSBsb3RzIG9mCisjIGV4Y2VwdGlvbnMgZm9yIGZpbGVzIHRoYXQgYXJlbid0IGNvbXBsYWludC4KKworSE9TVENGTEFHU19OT1BFRCA9ICQoZmlsdGVyLW91dCAtcGVkYW50aWMsJChIT1NUQ0ZMQUdTKSkKK0hPU1RDRkxBR1MJKz0gLXBlZGFudGljCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3B0aW9uIGNoZWNrZXIgKGNvdXJ0ZXN5IGxpbnV4IGtlcm5lbCkgdG8gZW5zdXJlCisjIG9ubHkgc3VwcG9ydGVkIGNvbXBpbGVyIG9wdGlvbnMgYXJlIHVzZWQKKyMKK2NjLW9wdGlvbiA9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpICQoMSkgLVMgLW8gL2Rldi9udWxsIC14YyAvZGV2L251bGwgXAorCQk+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQorCisjCisjIEluY2x1ZGUgdGhlIG1ha2UgdmFyaWFibGVzIChDQywgZXRjLi4uKQorIworQVMJPSAkKENST1NTX0NPTVBJTEUpYXMKK0xECT0gJChDUk9TU19DT01QSUxFKWxkCitDQwk9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK0NQUAk9ICQoQ0MpIC1FCitBUgk9ICQoQ1JPU1NfQ09NUElMRSlhcgorTk0JPSAkKENST1NTX0NPTVBJTEUpbm0KK1NUUklQCT0gJChDUk9TU19DT01QSUxFKXN0cmlwCitPQkpDT1BZID0gJChDUk9TU19DT01QSUxFKW9iamNvcHkKK09CSkRVTVAgPSAkKENST1NTX0NPTVBJTEUpb2JqZHVtcAorUkFOTElCCT0gJChDUk9TU19DT01QSUxFKVJBTkxJQgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTG9hZCBnZW5lcmF0ZWQgYm9hcmQgY29uZmlndXJhdGlvbgorc2luY2x1ZGUgJChPQkpUUkVFKS9pbmNsdWRlL2F1dG9jb25mLm1rCisKKyMgU29tZSBhcmNoaXRlY3R1cmUgY29uZmlnLm1rIGZpbGVzIG5lZWQgdG8ga25vdyB3aGF0IENQVURJUiBpcyBzZXQgdG8sCisjIHNvIGNhbGN1bGF0ZSBDUFVESVIgYmVmb3JlIGluY2x1ZGluZyBBUkNIL1NPQy9DUFUgY29uZmlnLm1rIGZpbGVzLgorIyBDaGVjayBpZiBhcmNoLyRBUkNIL2NwdS8kQ1BVIGV4aXN0cywgb3RoZXJ3aXNlIGFzc3VtZSBhcmNoLyRBUkNIL2NwdSBjb250YWlucworIyBDUFUtc3BlY2lmaWMgY29kZS4KK0NQVURJUj1jcHUvJChDUFUpCitpZm5lcSAoJChTUkNUUkVFKS8kKENQVURJUiksJCh3aWxkY2FyZCAkKFNSQ1RSRUUpLyQoQ1BVRElSKSkpCitDUFVESVI9Y3B1CitlbmRpZgorCitzaW5jbHVkZSAkKFRPUERJUikvJChBUkNIKV9jb25maWcubWsJCSMgaW5jbHVkZSBhcmNoaXRlY3R1cmUgZGVwZW5kZW5kIHJ1bGVzCitzaW5jbHVkZSAkKFRPUERJUikvJChDUFVESVIpL2NvbmZpZy5tawkJIyBpbmNsdWRlICBDUFUJc3BlY2lmaWMgcnVsZXMKKworaWZkZWYJU09DCitzaW5jbHVkZSAkKFRPUERJUikvJChDUFVESVIpLyQoU09DKS9jb25maWcubWsJIyBpbmNsdWRlICBTb0MJc3BlY2lmaWMgcnVsZXMKK2VuZGlmCitpZmRlZglWRU5ET1IKK0JPQVJERElSID0gJChWRU5ET1IpLyQoQk9BUkQpCitlbHNlCitCT0FSRERJUiA9ICQoQk9BUkQpCitlbmRpZgoraWZkZWYJQk9BUkQKK3NpbmNsdWRlICQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKS9jb25maWcubWsJIyBpbmNsdWRlIGJvYXJkIHNwZWNpZmljIHJ1bGVzCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmbmVxICgsJChmaW5kc3RyaW5nIHMsJChNQUtFRkxBR1MpKSkKK0FSRkxBR1MgPSBjcgorZWxzZQorQVJGTEFHUyA9IGNydgorZW5kaWYKK1JFTEZMQUdTPSAkKFBMQVRGT1JNX1JFTEZMQUdTKQorREJHRkxBR1M9IC1nICMgLURERUJVRworT1BURkxBR1M9IC1PcyAjLWZvbWl0LWZyYW1lLXBvaW50ZXIKK2lmbmRlZiBMRFNDUklQVAorI0xEU0NSSVBUIDo9ICQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKS94LWxvYWQubGRzLmRlYnVnCitMRFNDUklQVCA6PSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikveC1sb2FkLmxkcworZW5kaWYKK09CSkNGTEFHUyArPSAtLWdhcC1maWxsPTB4ZmYKKworZ2NjaW5jZGlyIDo9ICQoc2hlbGwgJChDQykgLXByaW50LWZpbGUtbmFtZT1pbmNsdWRlKQorCitDUFBGTEFHUyA6PSAkKERCR0ZMQUdTKSAkKE9QVEZMQUdTKSAkKFJFTEZMQUdTKQkJXAorCS1EX19LRVJORUxfXworaWZuZXEgKCQoVEVYVF9CQVNFKSwpCitDUFBGTEFHUyArPSAtRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkKK2VuZGlmCisKK2lmbmVxICgkKFNUQUNLX0JBU0UpLCkKK0NQUEZMQUdTICs9IC1EU1RBQ0tfQkFTRT0kKFNUQUNLX0JBU0UpCitlbmRpZgorCitpZm5lcSAoJChSRVNFVF9WRUNUT1JfQUREUkVTUyksKQorQ1BQRkxBR1MgKz0gLURSRVNFVF9WRUNUT1JfQUREUkVTUz0kKFJFU0VUX1ZFQ1RPUl9BRERSRVNTKQorZW5kaWYKKworaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK0NQUEZMQUdTICs9IC1JJChPQkpUUkVFKS9pbmNsdWRlMiAtSSQoT0JKVFJFRSkvaW5jbHVkZQorZW5kaWYKKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvaW5jbHVkZQorQ1BQRkxBR1MgKz0gLWZuby1idWlsdGluIC1mZnJlZXN0YW5kaW5nIC1ub3N0ZGluYwlcCisJLWlzeXN0ZW0gJChnY2NpbmNkaXIpIC1waXBlICQoUExBVEZPUk1fQ1BQRkxBR1MpCisKK2lmZGVmIEJVSUxEX1RBRworQ0ZMQUdTIDo9ICQoQ1BQRkxBR1MpIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgXAorCS1EQlVJTERfVEFHPSciJChCVUlMRF9UQUcpIicKK2Vsc2UKK0NGTEFHUyA6PSAkKENQUEZMQUdTKSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzCitlbmRpZgorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXN0YWNrLXByb3RlY3RvcikKKworIyAkKENQUEZMQUdTKSBzZXRzIC1nLCB3aGljaCBjYXVzZXMgZ2NjIHRvIHBhc3MgYSBzdWl0YWJsZSAtZzxmb3JtYXQ+CisjIG9wdGlvbiB0byB0aGUgYXNzZW1ibGVyLgorQUZMQUdTX0RFQlVHIDo9CisKK0FGTEFHU19ERUJVRyA6PSAtV2EsLWdzdGFicworQUZMQUdTIDo9ICQoQUZMQUdTX0RFQlVHKSAtRF9fQVNTRU1CTFlfXyAkKENQUEZMQUdTKQorCitMREZMQUdTICs9IC1Cc3RhdGljIC1UICQob2JqKXgtbG9hZC5sZHMgJChQTEFURk9STV9MREZMQUdTKQoraWZuZXEgKCQoVEVYVF9CQVNFKSwpCitMREZMQUdTICs9IC1UdGV4dCAkKFRFWFRfQkFTRSkKK2VuZGlmCisKKyMgTG9jYXRpb24gb2YgYSB1c2FibGUgQkZEIGxpYnJhcnksIHdoZXJlIHdlIGRlZmluZSAidXNhYmxlIiBhcworIyAiYnVpbHQgZm9yICR7SE9TVH0sIHN1cHBvcnRzICR7VEFSR0VUfSIuICBTZW5zaWJsZSB2YWx1ZXMgYXJlCisjIC0gV2hlbiBjcm9zcy1jb21waWxpbmc6IHRoZSByb290IG9mIHRoZSBjcm9zcy1lbnZpcm9ubWVudAorIyAtIExpbnV4L3BwYyAobmF0aXZlKTogL3VzcgorIyAtIE5ldEJTRC9wcGMgKG5hdGl2ZSk6IHlvdSBsb3NlIC4uLiAobXVzdCBleHRyYWN0IHRoZXNlIGZyb20gdGhlCisjICAgYmludXRpbHMgYnVpbGQgZGlyZWN0b3J5LCBwbHVzIHRoZSBuYXRpdmUgYW5kIFUtQm9vdCBpbmNsdWRlCisjICAgZmlsZXMgZG9uJ3QgbGlrZSBlYWNoIG90aGVyKQorIworIyBTbyBmYXIsIHRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRvb2xzL2dkYi9NYWtlZmlsZS4KKworaWZlcSAoJChIT1NUT1MpLGRhcndpbikKK0JGRF9ST09UX0RJUiA9CQkvdXNyL2xvY2FsL3Rvb2xzCitlbHNlCitpZmVxICgkKEhPU1RBUkNIKSwkKEFSQ0gpKQorIyBuYXRpdmUKK0JGRF9ST09UX0RJUiA9CQkvdXNyCitlbHNlCisjQkZEX1JPT1RfRElSID0JCS9MaW51eFBQQy9DREsJCSMgTGludXgvaTM4NgorI0JGRF9ST09UX0RJUiA9CQkvdXNyL3BrZy9jcm9zcwkJIyBOZXRCU0QvaTM4NgorQkZEX1JPT1RfRElSID0JCS9vcHQvcG93ZXJwYworZW5kaWYKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZXhwb3J0CUhPU1RDQyBIT1NUQ0ZMQUdTIEhPU1RMREZMQUdTIFBFRENGTEFHUyBIT1NUU1RSSVAgQ1JPU1NfQ09NUElMRSBcCisJQVMgTEQgQ0MgQ1BQIEFSIE5NIFNUUklQIE9CSkNPUFkgT0JKRFVNUCBNQUtFCitleHBvcnQJVEVYVF9CQVNFIFBMQVRGT1JNX0NQUEZMQUdTIFBMQVRGT1JNX1JFTEZMQUdTIENQUEZMQUdTIENGTEFHUyBBRkxBR1MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEFsbG93IGJvYXJkcyB0byB1c2UgY3VzdG9tIG9wdGltaXplIGZsYWdzIG9uIGEgcGVyIGRpci9maWxlIGJhc2lzCitCQ1VSRElSID0gJChzdWJzdCAkKFNSQ1RSRUUpLywsJChDVVJESVI6JChvYmopJT0lKSkKKyQob2JqKSUuczoJJS5TCisJJChDUFApICQoQUZMQUdTKSAkKEFGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKEFGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8CiskKG9iaiklLm86CSUuUworCSQoQ0MpICAkKEFGTEFHUykgJChBRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChBRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYworJChvYmopJS5vOgklLmMKKwkkKENDKSAgJChDRkxBR1MpICQoQ0ZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQ0ZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMKKyQob2JqKSUuaToJJS5jCisJJChDUFApICQoQ0ZMQUdTKSAkKENGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKENGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jCiskKG9iaiklLnM6CSUuYworCSQoQ0MpICAkKENGTEFHUykgJChDRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChDRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYyAtUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9NYWtlZmlsZSBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYTM0YWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8KK09CSlMJPSBjcHUubworCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvY29uZmlnLm1rIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDY4MjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jb25maWcubWsKQEAgLTAsMCArMSwzMyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1mbm8tY29tbW9uIC1mZml4ZWQtcjgKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY1CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU3VwcGx5IG9wdGlvbnMgYWNjb3JkaW5nIHRvIGNvbXBpbGVyIHZlcnNpb24KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tYXBjcy0zMiwtbWFiaT1hcGNzLWdudSkKK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbW5vLXRodW1iLWludGVyd29yaywpCitQTEFURk9STV9SRUxGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1zaG9ydC1sb2FkLWJ5dGVzLCQoY2FsbCBjYy1vcHRpb24sLW1hbGlnbm1lbnQtdHJhcHMsKSkKKyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NwdS5jIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2OGZiOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NwdS5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHVybWVudHMKKyAqCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIHVkZWxheSgpIGlzIENQVSBzcGVjaWZpYyBjb2RlCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKiBTZWUgYWxzbyBBUk0gUmVmLiBNYW4uICovCisjZGVmaW5lIEMxX01NVQkJKDE8PDApCQkvKiBtbXUgb2ZmL29uICovCisjZGVmaW5lIEMxX0FMSUdOCSgxPDwxKQkJLyogYWxpZ25tZW50IGZhdWx0cyBvZmYvb24gKi8KKyNkZWZpbmUgQzFfREMJCSgxPDwyKQkJLyogZGNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9XQgkJKDE8PDMpCQkvKiBtZXJnaW5nIHdyaXRlIGJ1ZmZlciBvbi9vZmYgKi8KKyNkZWZpbmUgQzFfQklHX0VORElBTgkoMTw8NykJLyogYmlnIGVuZGlhbiBvZmYvb24gKi8KKyNkZWZpbmUgQzFfU1lTX1BST1QJKDE8PDgpCQkvKiBzeXN0ZW0gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9ST01fUFJPVAkoMTw8OSkJCS8qIFJPTSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX0lDCQkoMTw8MTIpCQkvKiBpY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX0hJR0hfVkVDVE9SUwkoMTw8MTMpCS8qIGxvY2F0aW9uIG9mIHZlY3RvcnM6IGxvdy9oaWdoIGFkZHJlc3NlcyAqLworI2RlZmluZSBSRVNFUlZFRF8xCSgweGYgPDwgMykJLyogbXVzdCBiZSAxMTFiIGZvciBSL1cgKi8KKworaW50IGNwdV9pbml0ICh2b2lkKQoreworCWludCBpOworCisJLyogdHVybiBvZmYgSS9ELWNhY2hlICovCisJYXNtICgibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMCI6Ij1yIiAoaSkpOworCWkgJj0gfihDMV9EQyB8IEMxX0lDKTsKKwlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzEsIGMwLCAwIjogOiJyIiAoaSkpOworCisJLyogZmx1c2ggSS9ELWNhY2hlICovCisJaSA9IDA7CisJYXNtICgibWNyIHAxNSwgMCwgJTAsIGM3LCBjNywgMCI6IDoiciIgKGkpKTsgIC8vIGludmFsaWRhdGUgYm90aCBjYWNoZXMgYW5kIGZsdXNoIGJ0YgorCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjNywgYzEwLCA0IjogOiJyIiAoaSkpOyAvLyBtZW0gYmFycmllciB0byBzeW5jIHRoaW5ncworCisJcmV0dXJuIDA7Cit9CisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvc3RhcnQuUyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxMDhkMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L3N0YXJ0LlMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiAgYXJtYm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgT01QMjQyMC9BUk0xMTM2IENQVS1jb3JlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNCAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJQWxleCBa/HBrZSA8YXp1QHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwMwlLc2hpdGlqIDxrc2hpdGlqQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQJSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy5nbG9ibCBfc3RhcnQKK19zdGFydDoJCisJYglyZXNldAorIAlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisKK19oYW5nOgorIAkud29yZCBkb19oYW5nCisJCisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OCAvKiBub3cgMTYqND02NCAqLworCisuZ2xvYmFsIF9lbmRfdmVjdAorX2VuZF92ZWN0OgorCisJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCisgKgorICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKKyAqIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorICogcmVsb2NhdGUgYXJtYm9vdCB0byByYW0KKyAqIHNldHVwIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQorCisuZ2xvYmwgX2FybWJvb3Rfc3RhcnQKK19hcm1ib290X3N0YXJ0OgorCS53b3JkIF9zdGFydAorCisvKgorICogVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQuCisgKi8KKy5nbG9ibCBfYnNzX3N0YXJ0CitfYnNzX3N0YXJ0OgorCS53b3JkIF9fYnNzX3N0YXJ0CisKKy5nbG9ibCBfYnNzX2VuZAorX2Jzc19lbmQ6CisJLndvcmQgX2VuZAorCisvKgorICogdGhlIGFjdHVhbCByZXNldCBjb2RlCisgKi8KKworcmVzZXQ6IAorCS8qCisJICogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQorCSAqLworCW1ycwlyMCxjcHNyCisJYmljCXIwLHIwLCMweDFmCisJb3JyCXIwLHIwLCMweGQzCisJbXNyCWNwc3IscjAKKworCS8qIENvcHkgdmVjdG9ycyB0byBtYXNrIFJPTSBpbmRpcmVjdCBhZGRyICovIAorCWFkciAgICAgcjAsIF9zdGFydCAgICAgICAgICAgICAgLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlhZGQgICAgIHIwLCByMCwgIzQJCQkJLyogc2tpcCByZXNldCB2ZWN0b3IJCQkqLworCW1vdiAgICAgcjIsICM2NCAgICAgICAgICAgICAgICAgLyogcjIgPC0gc2l6ZSB0byBjb3B5ICAqLworCWFkZCAgICAgcjIsIHIwLCByMiAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKwltb3YgICAgIHIxLCAjMHg0MDAwMDAwMCAgICAgICAgIC8qIGJ1aWxkIHZlY3QgYWRkciAqLworCW1vdiAgICAgcjMsICMweDAwMjAwMDAwCisJYWRkICAgICByMSwgcjEsIHIzCisJbW92ICAgICByMywgIzB4ZjgwMAorCWFkZCAgICAgcjEsIHIxLCByMworbmV4dDoKKwlsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibmUgICAgIG5leHQgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW50aWwgZXF1YWwgKi8KKworCWJsCWNweV9jbGtfY29kZSAgICAgICAgICAgIC8qIHB1dCBkcGxsIGFkanVzdCBjb2RlIGJlaGluZCB2ZWN0b3JzICovCisgCisJLyogdGhlIG1hc2sgUk9NIGNvZGUgc2hvdWxkIGhhdmUgUExMIGFuZCBvdGhlcnMgc3RhYmxlICovCisJYmwgIGNwdV9pbml0X2NyaXQKKworcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0JICAgICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCByMCwgcjEgICAgICAgICAgICAgICAgICAvKiBkb24ndCByZWxvYyBkdXJpbmcgZGVidWcgICAgICAgICAqLworCS8qIGJlcSBzdGFja19zZXR1cCAqLworCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8KK3N0YWNrX3NldHVwOgorCWxkcglyMCwgX1RFWFRfQkFTRQkJLyogdXBwZXIgMTI4IEtpQjogcmVsb2NhdGVkIHVib290ICAgKi8KKwlzdWIJc3AsIHIwLCAjMTI4CQkvKiBsZWF2ZSAzMiB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAgKi8KKworY2xlYXJfYnNzOgorCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAgKi8KKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLworCW1vdiAJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvL2NsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29wLi4uICAgICAgICAgICAgICAgICAgICAqLworLy8JYWRkCXIwLCByMCwgIzQKKy8vCWNtcAlyMCwgcjEKKy8vCWJuZQljbGJzc19sCisKKwlsZHIJcGMsIF9zdGFydF9hcm1ib290CisKK19zdGFydF9hcm1ib290Ogkud29yZCBzdGFydF9hcm1ib290CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ1BVX2luaXRfY3JpdGljYWwgcmVnaXN0ZXJzCisgKgorICogc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycworICogc2V0dXAgbWVtb3J5IHRpbWluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2NwdV9pbml0X2NyaXQ6CisJLyoKKwkgKiBmbHVzaCB2NCBJL0QgY2FjaGVzCisJICovCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggdjMvdjQgY2FjaGUgKi8KKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCS8qIGZsdXNoIHY0IFRMQiAqLworCisJLyoKKwkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCisJICovCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCWJpYwlyMCwgcjAsICMweDAwMDAyMzAwCUAgY2xlYXIgYml0cyAxMywgOTo4ICgtLVYtIC0tUlMpCisJYmljCXIwLCByMCwgIzB4MDAwMDAwODcJQCBjbGVhciBiaXRzIDcsIDI6MCAoQi0tLSAtQ0FNKQorCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAyIChBKSBBbGlnbgorI2lmbmRlZiBDT05GSUdfSUNBQ0hFX09GRgorCW9ycglyMCwgcjAsICMweDAwMDAxMDAwCUAgc2V0IGJpdCAxMiAoSSkgSS1DYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCisJLyoKKyAgICAgICAgICogSnVtcCB0byBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4uLiBUaGUgTWFzayBST00gd2lsbCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICAgICAgICogYmFzaWMgbWVtb3J5LiAgR28gaGVyZSB0byBidW1wIHVwIGNsb2NrIHJhdGUgYW5kIGhhbmRsZSB3YWtlIHVwIGNvbmRpdGlvbnMuCisJICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogcGFzcyBvbiBpbmZvIGFib3V0IHNraXBwaW5nIHNvbWUgaW5pdCBwb3J0aW9ucyAqLworCW1vdmVxICAgcjAsIzB4MSAgICAgICAgICAgICAgICAgLyogZmxhZyB0byBza2lwIHByY20gYW5kIHNkcmMgc2V0dXAgKi8KKwltb3ZuZSAgIHIwLCMweDAKKworLy9tb3YgcjAsICMxICAgIC8qIHRoaXMgc2tpcCBtZW1vcnkgaW5pdCAqLworCisJbW92CWlwLCBsciAgICAgICAgICAvKiBwZXJzZXZlcmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibAlwbGF0Zm9ybXNldHVwICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKworCW1vdglsciwgaXAgICAgICAgICAgLyogcmVzdG9yZSBsaW5rICovCisJbW92CXBjLCBsciAgICAgICAgICAvKiBiYWNrIHRvIG15IGNhbGxlciAqLworCisKKy8qCisgKiBleGNlcHRpb24gaGFuZGxlcgorICovCisgCS5hbGlnbiAgNQorZG9faGFuZzoKKwlsZHIJc3AsIF9URVhUX0JBU0UJCS8qIHVzZSAzMiB3b3JkcyBhYm9ydCBzdGFjayAqLworICAgCWJsCWhhbmcJCQkJLyogaGFuZyBhbmQgbmV2ZXIgcmV0dXJuICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvTWFrZWZpbGUgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4M2MzZDAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworT0JKUwk9IGNwdS5vICAKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY29uZmlnLm1rIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZGIxMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZm5vLWNvbW1vbiAtZmZpeGVkLXI4CisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1tYXJjaD1hcm12NQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFN1cHBseSBvcHRpb25zIGFjY29yZGluZyB0byBjb21waWxlciB2ZXJzaW9uCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbWFwY3MtMzIsLW1hYmk9YXBjcy1nbnUpCitQTEFURk9STV9SRUxGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1zaG9ydC1sb2FkLWJ5dGVzLCQoY2FsbCBjYy1vcHRpb24sLW1hbGlnbm1lbnQtdHJhcHMsKSkKKyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY3B1LmMgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmZhOGEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NwdS5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cyA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisgIAorI2RlZmluZSBUSU1FUl9MT0FEX1ZBTCAweGZmZmZmZmZmCisKKy8qIG1hY3JvIHRvIHJlYWQgdGhlIDMyIGJpdCB0aW1lciAqLworI2RlZmluZSBSRUFEX1RJTUVSICgqKHZvbGF0aWxlIHVsb25nICopKENGR19USU1FUkJBU0UrOCkpCisKK3N0YXRpYyB1bG9uZyB0aW1lc3RhbXA7CitzdGF0aWMgdWxvbmcgbGFzdGRlYzsKKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXJfbWFza2VkICh2b2lkKTsKKworLyogbm90aGluZyByZWFsbHkgdG8gZG8gd2l0aCBjcHUsIGp1c3Qgc3RhcnRzIHVwIGEgY291bnRlci4gKi8KK2ludCBjcHVfaW5pdCAodm9pZCkKK3sKKyAJaW50MzJfdCB2YWw7CisKKwkvKiBTdGFydCB0aGUgZGVjcmVtZW50ZXIgdGlja2luZyBkb3duIGZyb20gMHhmZmZmZmZmZiAqLworCSooKGludDMyX3QgKikgKENGR19USU1FUkJBU0UgKyBMT0FEX1RJTSkpID0gVElNRVJfTE9BRF9WQUw7CisJdmFsID0gTVBVVElNX1NUIHwgTVBVVElNX0FSIHwgTVBVVElNX0NMT0NLX0VOQUJMRSB8IChDRkdfUFZUIDw8IE1QVVRJTV9QVFZfQklUKTsKKwkqKChpbnQzMl90ICopIChDRkdfVElNRVJCQVNFICsgQ05UTF9USU1FUikpID0gdmFsOworCisJLyogaW5pdCB0aGUgdGltZXN0YW1wIGFuZCBsYXN0ZGVjIHZhbHVlICovCisJcmVzZXRfdGltZXJfbWFza2VkKCk7CisgCQorIAlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCByZXNldF90aW1lcl9tYXNrZWQgKHZvaWQpCit7CisJLyogcmVzZXQgdGltZSAqLworCWxhc3RkZWMgPSBSRUFEX1RJTUVSOyAgLyogY2FwdXJlIGN1cnJlbnQgZGVjcmVtZW50ZXIgdmFsdWUgdGltZSAqLworCXRpbWVzdGFtcCA9IDA7ICAgICAgICAgLyogc3RhcnQgImFkdmFuY2luZyIgdGltZSBzdGFtcCBmcm9tIDAgKi8KK30KKworI2lmZGVmICBDRkdfVURFTEFZCisKK3N0YXRpYyB1bG9uZyBnZXRfdGltZXJfbWFza2VkICh2b2lkKTsKK3N0YXRpYyB1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpOworCisvKiBkZWxheSB4IHVzZWNvbmRzIEFORCBwZXJzZXJ2ZSBhZHZhbmNlIHRpbXN0YW1wIHZhbHVlICovCit2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVsb25nIHRtbywgdG1wOworCisJaWYodXNlYyA+PSAxMDAwKXsgICAgICAgICAgICAgICAvKiBpZiAiYmlnIiBudW1iZXIsIHNwcmVhZCBub3JtYWxpemF0aW9uIHRvIHNlY29uZHMgKi8KKwkJdG1vID0gdXNlYyAvIDEwMDA7ICAgICAgLyogc3RhcnQgdG8gbm9ybWFsaXplIGZvciB1c2VjIHRvIHRpY2tzIHBlciBzZWMgKi8KKwkJdG1vICo9IENGR19IWjsgICAgICAgICAgLyogZmluZCBudW1iZXIgb2YgInRpY2tzIiB0byB3YWl0IHRvIGFjaGlldmUgdGFyZ2V0ICovCisJCXRtbyAvPSAxMDAwOyAgICAgICAgICAgIC8qIGZpbmlzaCBub3JtYWxpemUuICovCisJfWVsc2V7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbHNlIHNtYWxsIG51bWJlciwgZG9uJ3Qga2lsbCBpdCBwcmlvciB0byBIWiBtdWx0aXBseSAqLworCQl0bW8gPSB1c2VjICogQ0ZHX0haOworCQl0bW8gLz0gKDEwMDAqMTAwMCk7CisJfQorCisJdG1wID0gZ2V0X3RpbWVyICgwKTsJCS8qIGdldCBjdXJyZW50IHRpbWVzdGFtcCAqLworCWlmKCAodG1vICsgdG1wKSA8IHRtcCApIAkvKiBpZiBzZXR0aW5nIHRoaXMgZm9yZHdhcmQgd2lsbCByb2xsIHRpbWUgc3RhbXAgKi8KKwkJcmVzZXRfdGltZXJfbWFza2VkICgpOwkvKiByZXNldCAiYWR2YW5jaW5nIiB0aW1lc3RhbXAgdG8gMCwgc2V0IGxhc3RkZWMgdmFsdWUgKi8KKwllbHNlCisJCXRtbyArPSB0bXA7CQkvKiBlbHNlLCBzZXQgYWR2YW5jaW5nIHN0YW1wIHdha2UgdXAgdGltZSAqLworCisJd2hpbGUgKGdldF90aW1lcl9tYXNrZWQgKCkgPCB0bW8pLyogbG9vcCB0aWxsIGV2ZW50ICovCisJCS8qTk9QKi87Cit9CisgCitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwl1bG9uZyBub3cgPSBSRUFEX1RJTUVSOwkJLyogY3VycmVudCB0aWNrIHZhbHVlICovCisKKwlpZiAobGFzdGRlYyA+PSBub3cpIHsJCS8qIG5vcm1hbCBtb2RlIChub24gcm9sbCkgKi8KKwkJLyogbm9ybWFsIG1vZGUgKi8KKwkJdGltZXN0YW1wICs9IGxhc3RkZWMgLSBub3c7IC8qIG1vdmUgc3RhbXAgZm9yZHdhcmQgd2l0aCBhYnNvdWx0ZSBkaWZmIHRpY2tzICovCisJfSBlbHNlIHsJCQkvKiB3ZSBoYXZlIG92ZXJmbG93IG9mIHRoZSBjb3VudCBkb3duIHRpbWVyICovCisJCS8qIG50cyA9IHRzICsgbGQgKyAoVExWIC0gbm93KQorCQkgKiB0cz1vbGQgc3RhbXAsIGxkPXRpbWUgdGhhdCBwYXNzZWQgYmVmb3JlIHBhc3NpbmcgdGhyb3VnaCAtMQorCQkgKiAoVExWLW5vdykgYW1vdW50IG9mIHRpbWUgYWZ0ZXIgcGFzc2luZyB0aG91Z2ggLTEKKwkJICogbnRzID0gbmV3ICJhZHZhbmNpbmcgdGltZSBzdGFtcCIuLi5pdCBjb3VsZCBhbHNvIHJvbGwgYW5kIGNhdXNlIHByb2JsZW1zLgorCQkgKi8KKwkJdGltZXN0YW1wICs9IGxhc3RkZWMgKyBUSU1FUl9MT0FEX1ZBTCAtIG5vdzsKKwl9CisJbGFzdGRlYyA9IG5vdzsKKworCXJldHVybiB0aW1lc3RhbXA7Cit9CisKK3N0YXRpYyB1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCit7CisJcmV0dXJuIGdldF90aW1lcl9tYXNrZWQgKCkgLSBiYXNlOworfQorCisjZW5kaWYgCQkvKiBDRkdfVURFTEFZICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvc3RhcnQuUyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjExZGFlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9zdGFydC5TCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIEFSTTkyNkVKUyBDUFUtY29yZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgIFRleGFzIEluc3RydW1lbnRzCisgKgorICogIC0tLS0tIEFkYXB0ZWQgZm9yIE9NQVAxNjEwIGZyb20gQVJNOTI1dCBjb2RlIC0tLS0tLQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUdhcnkgSmVubmVqb2huIDxnakBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCUtzaGl0aWogPGtzaGl0aWpAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwNAlKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKQorI2luY2x1ZGUgPC4vY29uZmlncy9vbWFwMTUxMC5oPgorI2VuZGlmCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEp1bXAgdmVjdG9yIHRhYmxlIGFzIGluIHRhYmxlIDMuMSBpbiBbMV0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCWIJcmVzZXQKKyAJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCitfaGFuZzoKKyAJLndvcmQgZG9faGFuZworICAKKwkuYmFsaWdubCAxNiwweGRlYWRiZWVmCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCisgKgorICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKKyAqIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorICogcmVsb2NhdGUgYXJtYm9vdCB0byByYW0KKyAqIHNldHVwIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQorCisuZ2xvYmwgX2FybWJvb3Rfc3RhcnQKK19hcm1ib290X3N0YXJ0OgorCS53b3JkIF9zdGFydAorCisvKgorICogVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQuCisgKi8KKy5nbG9ibCBfYnNzX3N0YXJ0CitfYnNzX3N0YXJ0OgorCS53b3JkIF9fYnNzX3N0YXJ0CisKKy5nbG9ibCBfYnNzX2VuZAorX2Jzc19lbmQ6CisJLndvcmQgX2VuZAorCisgCisvKgorICogdGhlIGFjdHVhbCByZXNldCBjb2RlCisgKi8KKworcmVzZXQ6CisJLyoKKwkgKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCisJICovCisJbXJzCXIwLGNwc3IKKwliaWMJcjAscjAsIzB4MWYKKwlvcnIJcjAscjAsIzB4ZDMKKwltc3IJY3BzcixyMAorICAKKwkvKgorCSAqIHR1cm4gb2ZmIHRoZSB3YXRjaGRvZywgdW5sb2NrL2RpYWJsZSBzZXF1ZW5jZQorCSAqLworCW1vdglyMSwgIzB4RjUKKwlsZHIJcjAsID1XRFRJTV9NT0RFCisJc3RyaAlyMSwgW3IwXQorCW1vdglyMSwgIzB4QTAKKwlzdHJoCXIxLCBbcjBdCisKKworCS8qCisJICogbWFzayBhbGwgSVJRcyBieSBzZXR0aW5nIGFsbCBiaXRzIGluIHRoZSBJTlRNUiAtIGRlZmF1bHQKKwkgKi8KKworCW1vdglyMSwgIzB4ZmZmZmZmZmYKKwlsZHIJcjAsID1SRUdfSUhMMV9NSVIKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjAsID1SRUdfSUhMMl9NSVIKKwlzdHIJcjEsIFtyMF0KKyAKKwkvKgorCSAqIHdlIGRvIHN5cy1jcml0aWNhbCBpbml0cyBhdCByZWJvb3QsCisgCSAqLworIAlibAljcHVfaW5pdF9jcml0IAorICAKKwkvKiAKKwkgKiByZWxvY2F0ZSBleGNlcHRpb24gdmVjdG9ycyB0byBTUkFNIHdoZXJlIFJPTSBjb2RlIGV4cGVjdHMKKwkgKi8KKyNpZmRlZiBDRkdfQk9PVF9DUzAKKworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworIAlhZGQgICAgIHIwLCByMCwgIzQJLyogc2tpcCByZXNldCB2ZWN0b3IJCQkqLworCW1vdglyMiwgIzM2CQkvKiByMiA8LSBzaXplIG9mIGRhdGEgKDgrMSB3b3JkcykgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCW1vdiByMSwgIzB4MjAwMDAwMDAKK25leHQ6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJsZQluZXh0CisKKyNlbmRpZgorIAorcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFgtTG9hZGVyIHRvIFJBTQkgICAgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wICAgICByMCwgcjEgICAgICAgICAgICAgICAgICAvKiBkb24ndCByZWxvYyBkdXJpbmcgZGVidWcgICAgICAgICAqLworCS8qYmVxICAgICBzdGFja19zZXR1cCovCisKKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0CisJbGRyCXIzLCBfYnNzX3N0YXJ0CisJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNpemUgb2YgYXJtYm9vdCAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisKK2NvcHlfbG9vcDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYmxlCWNvcHlfbG9vcAorCisJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLworc3RhY2tfc2V0dXA6CisJbGRyCXIwLCBfVEVYVF9CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgWC1Mb2FkZXIgICAqLworICAJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgICovCisKK2NsZWFyX2JzczoKKwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAgICovCisJYWRkCXIwLCByMCwgIzQJCS8qIHN0YXJ0IGF0IGZpcnN0IGJ5dGUgb2YgYnNzICAgICAgICovCisJbGRyCXIxLCBfYnNzX2VuZAkJLyogc3RvcCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworY2xic3NfbDpzdHIJcjIsIFtyMF0JCS8qIGNsZWFyIGxvb3AuLi4gICAgICAgICAgICAgICAgICAgICovCisJYWRkCXIwLCByMCwgIzQKKwljbXAJcjAsIHIxCisJYm5lCWNsYnNzX2wKKworIAlsZHIJcGMsIF9zdGFydF9hcm1ib290CisKK19zdGFydF9hcm1ib290OgorCS53b3JkICBzdGFydF9hcm1ib290CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ1BVX2luaXRfY3JpdGljYWwgcmVnaXN0ZXJzCisgKgorICogc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycworICogc2V0dXAgbWVtb3J5IHRpbWluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCitjcHVfaW5pdF9jcml0OgorCS8qCisJICogZmx1c2ggdjQgSS9EIGNhY2hlcworCSAqLworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCS8qIGZsdXNoIHYzL3Y0IGNhY2hlICovCisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMAkvKiBmbHVzaCB2NCBUTEIgKi8KKworCS8qCisJICogZGlzYWJsZSBNTVUgc3R1ZmYgYW5kIGNhY2hlcworCSAqLworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwliaWMJcjAsIHIwLCAjMHgwMDAwMjMwMAkvKiBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykgKi8KKwliaWMJcjAsIHIwLCAjMHgwMDAwMDA4NwkvKiBjbGVhciBiaXRzIDcsIDI6MCAoQi0tLSAtQ0FNKSAqLworCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCS8qIHNldCBiaXQgMiAoQSkgQWxpZ24gKi8KKwlvcnIJcjAsIHIwLCAjMHgwMDAwMTAwMAkvKiBzZXQgYml0IDEyIChJKSBJLUNhY2hlICovCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCisJLyoKKwkgKiBHbyBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKwkgKi8KKwltb3YJaXAsIGxyCQkvKiBwZXJzZXJ2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsCXBsYXRmb3Jtc2V0dXAJLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKwltb3YJbHIsIGlwCQkvKiByZXN0b3JlIGxpbmsgKi8KKwltb3YJcGMsIGxyCQkvKiBiYWNrIHRvIG15IGNhbGxlciAqLworICAKKy8qCisgKiBleGNlcHRpb24gaGFuZGxlcgorICovCisgCS5hbGlnbiAgNQorZG9faGFuZzoKKwlsZHIJc3AsIF9URVhUX0JBU0UJCS8qIHVzZSAzMiB3b3JkcyBhYm9ydCBzdGFjayAqLworICAgCWJsCWhhbmcJCQkJLyogaGFuZyBhbmQgbmV2ZXIgcmV0dXJuICovCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL01ha2VmaWxlIGIveC1sb2FkZXIvY3B1L29tYXAzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWU3NjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJOj0gc3RhcnQubworQ09CSlMJOj0gY3B1Lm8gbW1jLm8KKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvY29uZmlnLm1rIGIveC1sb2FkZXIvY3B1L29tYXAzL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmY5MGNiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL2NvbmZpZy5tawpAQCAtMCwwICsxLDMzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCitQTEFURk9STV9SRUxGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAgLWZuby1jb21tb24gLWZmaXhlZC1yOCAtbXNvZnQtZmxvYXQKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY3LWEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jIGIveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjQyMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvY3B1LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2IFRleGFzIEluc3R1cm1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKiBTZWUgYWxzbyBBUk0gUmVmLiBNYW4uICovCisjZGVmaW5lIEMxX01NVQkJKDE8PDApCQkvKiBtbXUgb2ZmL29uICovCisjZGVmaW5lIEMxX0FMSUdOCSgxPDwxKQkJLyogYWxpZ25tZW50IGZhdWx0cyBvZmYvb24gKi8KKyNkZWZpbmUgQzFfREMJCSgxPDwyKQkJLyogZGNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9XQgkJKDE8PDMpCQkvKiBtZXJnaW5nIHdyaXRlIGJ1ZmZlciBvbi9vZmYgKi8KKyNkZWZpbmUgQzFfQklHX0VORElBTgkoMTw8NykJLyogYmlnIGVuZGlhbiBvZmYvb24gKi8KKyNkZWZpbmUgQzFfU1lTX1BST1QJKDE8PDgpCQkvKiBzeXN0ZW0gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9ST01fUFJPVAkoMTw8OSkJCS8qIFJPTSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX0lDCQkoMTw8MTIpCQkvKiBpY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX0hJR0hfVkVDVE9SUwkoMTw8MTMpCS8qIGxvY2F0aW9uIG9mIHZlY3RvcnM6IGxvdy9oaWdoIGFkZHJlc3NlcyAqLworI2RlZmluZSBSRVNFUlZFRF8xCSgweGYgPDwgMykJLyogbXVzdCBiZSAxMTFiIGZvciBSL1cgKi8KKworaW50IGNwdV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzY1ZGY0OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWMuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3MgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bW1jLmg+CisjaW5jbHVkZSA8cGFydC5oPgorCisjaWZkZWYgQ0ZHX0NNRF9NTUMKKworI2luY2x1ZGUgIm1tY19ob3N0X2RlZi5oIgorI2luY2x1ZGUgIm1tY19wcm90b2NvbC5oIgorCisjZGVmaW5lIE9NQVBfTU1DX01BU1RFUl9DTE9DSyAgIDk2MDAwMDAwCitleHRlcm4gaW50IGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKTsKKworbW1jX2NhcmRfZGF0YSBjdXJfY2FyZF9kYXRhOworc3RhdGljIGJsb2NrX2Rldl9kZXNjX3QgbW1jX2Jsa19kZXY7CisKK2Jsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpCit7CisJcmV0dXJuICgoYmxvY2tfZGV2X2Rlc2NfdCAqKSAmbW1jX2Jsa19kZXYpOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19ib2FyZF9pbml0KHZvaWQpCit7CisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKSAmJiAhZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkKKwl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOworCisJdmFsdWUgPSBDT05UUk9MX1BCSUFTX0xJVEU7CisJQ09OVFJPTF9QQklBU19MSVRFID0gdmFsdWUgfCAoMSA8PCAyKSB8ICgxIDw8IDEpIHwgKDEgPDwgOSk7CisKKwl2YWx1ZSA9IENPTlRST0xfREVWX0NPTkYwOworCUNPTlRST0xfREVWX0NPTkYwID0gdmFsdWUgfCAoMSA8PCAyNCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKwordm9pZCBtbWNfaW5pdF9zdHJlYW0odm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbW1jX3N0YXQ7CisKKwlPTUFQX0hTTU1DX0NPTiB8PSBJTklUX0lOSVRTVFJFQU07CisKKwlPTUFQX0hTTU1DX0NNRCA9IE1NQ19DTUQwOworCWRvIHsKKwkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJfSB3aGlsZSAoIShtbWNfc3RhdCAmIENDX01BU0spKTsKKworCU9NQVBfSFNNTUNfU1RBVCA9IENDX01BU0s7CisKKwlPTUFQX0hTTU1DX0NNRCA9IE1NQ19DTUQwOworCWRvIHsKKwkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJfSB3aGlsZSAoIShtbWNfc3RhdCAmIENDX01BU0spKTsKKworCU9NQVBfSFNNTUNfU1RBVCA9IE9NQVBfSFNNTUNfU1RBVDsKKwlPTUFQX0hTTU1DX0NPTiAmPSB+SU5JVF9JTklUU1RSRUFNOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19jbG9ja19jb25maWcodW5zaWduZWQgaW50IGljbGssIHVuc2lnbmVkIHNob3J0IGNsa19kaXYpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW1tY19yZWdfb3V0KE9NQVBfSFNNTUNfU1lTQ1RMLCAoSUNFX01BU0sgfCBEVE9fTUFTSyB8IENFTl9NQVNLKSwKKwkJICAgIChJQ0VfU1RPUCB8IERUT18xNVRIRFRPIHwgQ0VOX0RJU0FCTEUpKTsKKworCXN3aXRjaCAoaWNsaykgeworCWNhc2UgQ0xLX0lOSVRTRVE6CisJCXZhbCA9IE1NQ19JTklUX1NFUV9DTEsgLyAyOworCQlicmVhazsKKwljYXNlIENMS180MDBLSFo6CisJCXZhbCA9IE1NQ180MDBrSHpfQ0xLOworCQlicmVhazsKKwljYXNlIENMS19NSVNDOgorCQl2YWwgPSBjbGtfZGl2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJbW1jX3JlZ19vdXQoT01BUF9IU01NQ19TWVNDVEwsCisJCSAgICBJQ0VfTUFTSyB8IENMS0RfTUFTSywgKHZhbCA8PCBDTEtEX09GRlNFVCkgfCBJQ0VfT1NDSUxMQVRFKTsKKworCXdoaWxlICgoT01BUF9IU01NQ19TWVNDVEwgJiBJQ1NfTUFTSykgPT0gSUNTX05PVFJFQURZKTsKKworCisJT01BUF9IU01NQ19TWVNDVEwgfD0gQ0VOX0VOQUJMRTsKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfaW5pdF9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsOworCisJbW1jX2JvYXJkX2luaXQoKTsKKworCU9NQVBfSFNNTUNfU1lTQ09ORklHIHw9IE1NQ19TT0ZUUkVTRVQ7CisJd2hpbGUgKChPTUFQX0hTTU1DX1NZU1NUQVRVUyAmIFJFU0VURE9ORSkgPT0gMCkgOworCisJT01BUF9IU01NQ19TWVNDVEwgfD0gU09GVFJFU0VUQUxMOworCXdoaWxlICgoT01BUF9IU01NQ19TWVNDVEwgJiBTT0ZUUkVTRVRBTEwpICE9IDB4MCkgOworCisJT01BUF9IU01NQ19IQ1RMID0gRFRXXzFfQklUTU9ERSB8IFNEQlBfUFdST0ZGIHwgU0RWU18zVjA7CisJT01BUF9IU01NQ19DQVBBIHw9IFZTMzBfM1YwU1VQIHwgVlMxOF8xVjhTVVA7CisKKwlyZWdfdmFsID0gT01BUF9IU01NQ19DT04gJiBSRVNFUlZFRF9NQVNLOworCisJT01BUF9IU01NQ19DT04gPSBDVFBMX01NQ19TRCB8IHJlZ192YWwgfCBXUFBfQUNUSVZFSElHSCB8CisJICAgIENEUF9BQ1RJVkVISUdIIHwgTUlUX0NUTyB8IERXOF8xXzRCSVRNT0RFIHwgTU9ERV9GVU5DIHwKKwkgICAgU1RSX0JMT0NLIHwgSFJfTk9IT1NUUkVTUCB8IElOSVRfTk9JTklUIHwgTk9PUEVORFJBSU47CisKKwltbWNfY2xvY2tfY29uZmlnKENMS19JTklUU0VRLCAwKTsKKwlPTUFQX0hTTU1DX0hDVEwgfD0gU0RCUF9QV1JPTjsKKworCU9NQVBfSFNNTUNfSUUgPSAweDMwN2YwMDMzOworCisJbW1jX2luaXRfc3RyZWFtKCk7CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX3NlbmRfY21kKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhcmcsCisJCQkgICB1bnNpZ25lZCBpbnQgKnJlc3BvbnNlKQoreworCXVuc2lnbmVkIGludCBtbWNfc3RhdDsKKworCXdoaWxlICgoT01BUF9IU01NQ19QU1RBVEUgJiBEQVRJX01BU0spID09IERBVElfQ01ERElTKTsKKworCisJT01BUF9IU01NQ19CTEsgPSBCTEVOXzUxMkJZVEVTTEVOIHwgTkJMS19TVFBDTlQ7CisJT01BUF9IU01NQ19TVEFUID0gMHhGRkZGRkZGRjsKKwlPTUFQX0hTTU1DX0FSRyA9IGFyZzsKKwlPTUFQX0hTTU1DX0NNRCA9IGNtZCB8IENNRF9UWVBFX05PUk1BTCB8IENJQ0VfTk9DSEVDSyB8CisJICAgIENDQ0VfTk9DSEVDSyB8IE1TQlNfU0dMRUJMSyB8IEFDRU5fRElTQUJMRSB8IEJDRV9ESVNBQkxFIHwKKwkgICAgREVfRElTQUJMRTsKKworCXdoaWxlICgxKSB7CisJCWRvIHsKKwkJCW1tY19zdGF0ID0gT01BUF9IU01NQ19TVEFUOworCQl9IHdoaWxlIChtbWNfc3RhdCA9PSAwKTsKKworCQlpZiAoKG1tY19zdGF0ICYgRVJSSV9NQVNLKSAhPSAwKQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKW1tY19zdGF0OworCisKKwkJaWYgKG1tY19zdGF0ICYgQ0NfTUFTSykgeworCQkJT01BUF9IU01NQ19TVEFUID0gQ0NfTUFTSzsKKwkJCXJlc3BvbnNlWzBdID0gT01BUF9IU01NQ19SU1AxMDsKKwkJCWlmICgoY21kICYgUlNQX1RZUEVfTUFTSykgPT0gUlNQX1RZUEVfTEdIVDEzNikgeworCQkJCXJlc3BvbnNlWzFdID0gT01BUF9IU01NQ19SU1AzMjsKKwkJCQlyZXNwb25zZVsyXSA9IE9NQVBfSFNNTUNfUlNQNTQ7CisJCQkJcmVzcG9uc2VbM10gPSBPTUFQX0hTTU1DX1JTUDc2OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfZGF0YSh1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpCit7CisJdW5zaWduZWQgaW50IG1tY19zdGF0OworCXVuc2lnbmVkIGludCByZWFkX2NvdW50ID0gMDsKKworCS8qCisJICogU3RhcnQgUG9sbGVkIFJlYWQKKwkgKi8KKwl3aGlsZSAoMSkgeworCQlkbyB7CisJCQltbWNfc3RhdCA9IE9NQVBfSFNNTUNfU1RBVDsKKwkJfSB3aGlsZSAobW1jX3N0YXQgPT0gMCk7CisKKwkJaWYgKChtbWNfc3RhdCAmIEVSUklfTUFTSykgIT0gMCkKKwkJCXJldHVybiAodW5zaWduZWQgY2hhciltbWNfc3RhdDsKKworCQlpZiAobW1jX3N0YXQgJiBCUlJfTUFTSykgeworCQkJdW5zaWduZWQgaW50IGs7CisKKwkJCU9NQVBfSFNNTUNfU1RBVCB8PSBCUlJfTUFTSzsKKwkJCWZvciAoayA9IDA7IGsgPCBNTUNTRF9TRUNUT1JfU0laRSAvIDQ7IGsrKykgeworCQkJCSpvdXRwdXRfYnVmID0gT01BUF9IU01NQ19EQVRBOworCQkJCW91dHB1dF9idWYrKzsKKwkJCQlyZWFkX2NvdW50ICs9IDQ7CisJCQl9CisJCX0KKworCQlpZiAobW1jX3N0YXQgJiBCV1JfTUFTSykKKwkJCU9NQVBfSFNNTUNfU1RBVCB8PSBCV1JfTUFTSzsKKworCQlpZiAobW1jX3N0YXQgJiBUQ19NQVNLKSB7CisJCQlPTUFQX0hTTU1DX1NUQVQgfD0gVENfTUFTSzsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19kZXRlY3RfY2FyZChtbWNfY2FyZF9kYXRhICptbWNfY2FyZF9jdXIpCit7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgb2NyX3ZhbHVlLCBvY3JfcmVjdmQsIHJldF9jbWQ0MSwgaGNzX3ZhbDsKKwl1bnNpZ25lZCBpbnQgcmVzcFs0XTsKKwl1bnNpZ25lZCBzaG9ydCByZXRyeV9jbnQgPSAyMDAwOworCisJLyogU2V0IHRvIEluaXRpYWxpemF0aW9uIENsb2NrICovCisJZXJyID0gbW1jX2Nsb2NrX2NvbmZpZyhDTEtfNDAwS0haLCAwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwltbWNfY2FyZF9jdXItPlJDQSA9IE1NQ19SRUxBVElWRV9DQVJEX0FERFJFU1M7CisJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCisJb2NyX3ZhbHVlID0gKDB4MUZGIDw8IDE1KTsKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDAsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlhcmd1bWVudCA9IFNEX0NNRDhfQ0hFQ0tfUEFUVEVSTiB8IFNEX0NNRDhfMl83XzNfNl9WX1JBTkdFOworCWVyciA9IG1tY19zZW5kX2NtZChNTUNfU0RDTUQ4LCBhcmd1bWVudCwgcmVzcCk7CisJaGNzX3ZhbCA9IChlcnIgPT0gMSkgPworCSAgICBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SIDoKKwkgICAgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX0JZVEU7CisKKwlhcmd1bWVudCA9IDB4MDAwMCA8PCAxNjsKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDU1LCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKGVyciA9PSAxKSB7CisJCW1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID0gU0RfQ0FSRDsKKwkJb2NyX3ZhbHVlIHw9IGhjc192YWw7CisJCXJldF9jbWQ0MSA9IE1NQ19BQ01ENDE7CisJfSBlbHNlIHsKKwkJbW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPSBNTUNfQ0FSRDsKKwkJb2NyX3ZhbHVlIHw9IE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX1NFQ1RPUjsKKwkJcmV0X2NtZDQxID0gTU1DX0NNRDE7CisJCU9NQVBfSFNNTUNfQ09OICY9IH5PRDsKKwkJT01BUF9IU01NQ19DT04gfD0gT1BFTkRSQUlOOworCX0KKworCWFyZ3VtZW50ID0gb2NyX3ZhbHVlOworCWVyciA9IG1tY19zZW5kX2NtZChyZXRfY21kNDEsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlvY3JfcmVjdmQgPSAoKG1tY19yZXNwX3IzICopIHJlc3ApLT5vY3I7CisKKwl3aGlsZSAoIShvY3JfcmVjdmQgJiAoMHgxIDw8IDMxKSkgJiYgKHJldHJ5X2NudCA+IDApKSB7CisJCXJldHJ5X2NudC0tOworCQlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gU0RfQ0FSRCkgeworCQkJYXJndW1lbnQgPSAweDAwMDAgPDwgMTY7CisJCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDU1LCBhcmd1bWVudCwgcmVzcCk7CisJCX0KKworCQlhcmd1bWVudCA9IG9jcl92YWx1ZTsKKwkJZXJyID0gbW1jX3NlbmRfY21kKHJldF9jbWQ0MSwgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCQlvY3JfcmVjdmQgPSAoKG1tY19yZXNwX3IzICopIHJlc3ApLT5vY3I7CisJfQorCisJaWYgKCEob2NyX3JlY3ZkICYgKDB4MSA8PCAzMSkpKQorCQlyZXR1cm4gMDsKKworCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBNTUNfQ0FSRCkgeworCQlpZiAoKG9jcl9yZWN2ZCAmIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX01BU0spID09CisJCSAgICBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9TRUNUT1IpIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IFNFQ1RPUl9NT0RFOworCQl9IGVsc2UgeworCQkJbW1jX2NhcmRfY3VyLT5tb2RlID0gQllURV9NT0RFOworCQl9CisKKwkJb2NyX3JlY3ZkICY9IH5NTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9NQVNLOworCX0gZWxzZSB7CisJCWlmICgob2NyX3JlY3ZkICYgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX01BU0spCisJCSAgICA9PSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SKSB7CisJCQltbWNfY2FyZF9jdXItPm1vZGUgPSBTRUNUT1JfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IEJZVEVfTU9ERTsKKwkJfQorCQlvY3JfcmVjdmQgJj0gfk1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9NQVNLOworCX0KKworCW9jcl9yZWN2ZCAmPSB+KDB4MSA8PCAzMSk7CisJaWYgKCEob2NyX3JlY3ZkICYgb2NyX3ZhbHVlKSkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDIsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAoZXJyICE9IDEpCisJCXJldHVybiBlcnI7CisKKwlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gTU1DX0NBUkQpIHsKKwkJYXJndW1lbnQgPSBtbWNfY2FyZF9jdXItPlJDQSA8PCAxNjsKKwkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQzLCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX1NEQ01EMywgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCisJCW1tY19jYXJkX2N1ci0+UkNBID0gKChtbWNfcmVzcF9yNiAqKSByZXNwKS0+bmV3cHVibGlzaGVkcmNhOworCX0KKworCU9NQVBfSFNNTUNfQ09OICY9IH5PRDsKKwlPTUFQX0hTTU1DX0NPTiB8PSBOT09QRU5EUkFJTjsKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfcmVhZF9jYXJkc2l6ZShtbWNfY2FyZF9kYXRhICptbWNfZGV2X2RhdGEsCisJCQkJbW1jX2NzZF9yZWdfdCAqY3VyX2NzZCkKK3sKKwltbWNfZXh0ZW5kZWRfY3NkX3JlZ190IGV4dF9jc2Q7CisJdW5zaWduZWQgaW50IHNpemUsIGNvdW50LCBibGtfbGVuLCBibGtfbm8sIGNhcmRfc2l6ZSwgYXJndW1lbnQ7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IHJlc3BbNF07CisKKwlpZiAobW1jX2Rldl9kYXRhLT5tb2RlID09IFNFQ1RPUl9NT0RFKSB7CisJCWlmIChtbWNfZGV2X2RhdGEtPmNhcmRfdHlwZSA9PSBTRF9DQVJEKSB7CisJCQljYXJkX3NpemUgPQorCQkJICAgICgoKG1tY19zZDJfY3NkX3JlZ190ICopIGN1cl9jc2QpLT4KKwkJCSAgICAgY19zaXplX2xzYiAmIE1NQ19TRDJfQ1NEX0NfU0laRV9MU0JfTUFTSykgfAorCQkJICAgICgoKChtbWNfc2QyX2NzZF9yZWdfdCAqKSBjdXJfY3NkKS0+CisJCQkgICAgICBjX3NpemVfbXNiICYgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9NQVNLKQorCQkJICAgICA8PCBNTUNfU0QyX0NTRF9DX1NJWkVfTVNCX09GRlNFVCk7CisJCQltbWNfZGV2X2RhdGEtPnNpemUgPSBjYXJkX3NpemUgKiAxMDI0OworCQkJaWYgKG1tY19kZXZfZGF0YS0+c2l6ZSA9PSAwKQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJYXJndW1lbnQgPSAweDAwMDAwMDAwOworCQkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ4LCBhcmd1bWVudCwgcmVzcCk7CisJCQlpZiAoZXJyICE9IDEpCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IG1tY19yZWFkX2RhdGEoKHVuc2lnbmVkIGludCAqKSZleHRfY3NkKTsKKwkJCWlmIChlcnIgIT0gMSkKKwkJCQlyZXR1cm4gZXJyOworCQkJbW1jX2Rldl9kYXRhLT5zaXplID0gZXh0X2NzZC5zZWN0b3Jjb3VudDsKKworCQkJaWYgKG1tY19kZXZfZGF0YS0+c2l6ZSA9PSAwKQorCQkJCW1tY19kZXZfZGF0YS0+c2l6ZSA9IDgzODg2MDg7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3VyX2NzZC0+Y19zaXplX211bHQgPj0gOCkKKwkJCXJldHVybiAwOworCisJCWlmIChjdXJfY3NkLT5yZWFkX2JsX2xlbiA+PSAxMikKKwkJCXJldHVybiAwOworCisJCS8qIENvbXB1dGUgc2l6ZSAqLworCQljb3VudCA9IDEgPDwgKGN1cl9jc2QtPmNfc2l6ZV9tdWx0ICsgMik7CisJCWNhcmRfc2l6ZSA9IChjdXJfY3NkLT5jX3NpemVfbHNiICYgTU1DX0NTRF9DX1NJWkVfTFNCX01BU0spIHwKKwkJICAgICgoY3VyX2NzZC0+Y19zaXplX21zYiAmIE1NQ19DU0RfQ19TSVpFX01TQl9NQVNLKQorCQkgICAgIDw8IE1NQ19DU0RfQ19TSVpFX01TQl9PRkZTRVQpOworCisJCWJsa19ubyA9IChjYXJkX3NpemUgKyAxKSAqIGNvdW50OworCQlibGtfbGVuID0gMSA8PCBjdXJfY3NkLT5yZWFkX2JsX2xlbjsKKwkJc2l6ZSA9IGJsa19ubyAqIGJsa19sZW47CisKKwkJbW1jX2Rldl9kYXRhLT5zaXplID0gc2l6ZSAvIE1NQ1NEX1NFQ1RPUl9TSVpFOworCQlpZiAobW1jX2Rldl9kYXRhLT5zaXplID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgb21hcF9tbWNfcmVhZF9zZWN0KHVuc2lnbmVkIGludCBzdGFydF9zZWMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMsCisJCQkJIG1tY19jYXJkX2RhdGEgKm1tY19jLAorCQkJCSB1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpCit7CisJdW5zaWduZWQgY2hhciBlcnI7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50OworCXVuc2lnbmVkIGludCByZXNwWzRdOworCXVuc2lnbmVkIGludCBudW1fc2VjX3ZhbCA9CisJICAgIChudW1fYnl0ZXMgKyAoTU1DU0RfU0VDVE9SX1NJWkUgLSAxKSkgLyBNTUNTRF9TRUNUT1JfU0laRTsKKwl1bnNpZ25lZCBpbnQgc2VjX2luY192YWw7CisKKwlpZiAobnVtX3NlY192YWwgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobW1jX2MtPm1vZGUgPT0gU0VDVE9SX01PREUpIHsKKwkJYXJndW1lbnQgPSBzdGFydF9zZWM7CisJCXNlY19pbmNfdmFsID0gMTsKKwl9IGVsc2UgeworCQlhcmd1bWVudCA9IHN0YXJ0X3NlYyAqIE1NQ1NEX1NFQ1RPUl9TSVpFOworCQlzZWNfaW5jX3ZhbCA9IE1NQ1NEX1NFQ1RPUl9TSVpFOworCX0KKworCXdoaWxlIChudW1fc2VjX3ZhbCkgeworCQllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDE3LCBhcmd1bWVudCwgcmVzcCk7CisJCWlmIChlcnIgIT0gMSkKKwkJCXJldHVybiBlcnI7CisKKworCQllcnIgPSBtbWNfcmVhZF9kYXRhKG91dHB1dF9idWYpOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCisJCW91dHB1dF9idWYgKz0gKE1NQ1NEX1NFQ1RPUl9TSVpFIC8gNCk7CisJCWFyZ3VtZW50ICs9IHNlY19pbmNfdmFsOworCQludW1fc2VjX3ZhbC0tOworCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBjb25maWd1cmVfbW1jKG1tY19jYXJkX2RhdGEgKm1tY19jYXJkX2N1cikKK3sKKwl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJdW5zaWduZWQgaW50IGFyZ3VtZW50OworCXVuc2lnbmVkIGludCByZXNwWzRdOworCXVuc2lnbmVkIGludCB0cmFuc19mYWN0LCB0cmFuc191bml0LCByZXRyaWVzID0gMjsKKwl1bnNpZ25lZCBpbnQgbWF4X2R0cjsKKwlpbnQgZHNvcjsKKwl2b2xhdGlsZSBtbWNfY3NkX3JlZ190IENhcmRfQ1NEOworCXVuc2lnbmVkIGNoYXIgdHJhbnNfc3BlZWQ7CisKKwltbWNfaW5pdF9zZXR1cCgpOworCisJZG8geworCQlyZXRfdmFsID0gbW1jX2RldGVjdF9jYXJkKG1tY19jYXJkX2N1cik7CisJCXJldHJpZXMtLTsKKwl9IHdoaWxlICgocmV0cmllcyA+IDApICYmIChyZXRfdmFsICE9IDEpKTsKKworCWFyZ3VtZW50ID0gbW1jX2NhcmRfY3VyLT5SQ0EgPDwgMTY7CisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01EOSwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzNdID0gcmVzcFszXTsKKwkoKHVuc2lnbmVkIGludCAqKSZDYXJkX0NTRClbMl0gPSByZXNwWzJdOworCSgodW5zaWduZWQgaW50ICopJkNhcmRfQ1NEKVsxXSA9IHJlc3BbMV07CisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzBdID0gcmVzcFswXTsKKworCWlmIChtbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9PSBNTUNfQ0FSRCkKKwkJbW1jX2NhcmRfY3VyLT52ZXJzaW9uID0gQ2FyZF9DU0Quc3BlY192ZXJzOworCisJdHJhbnNfc3BlZWQgPSBDYXJkX0NTRC50cmFuX3NwZWVkOworCisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01ENCwgTU1DX0RTUl9ERUZBVUxUIDw8IDE2LCByZXNwKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXRyYW5zX3VuaXQgPSB0cmFuc19zcGVlZCAmIE1NQ19DU0RfVFJBTl9TUEVFRF9VTklUX01BU0s7CisJdHJhbnNfZmFjdCA9IHRyYW5zX3NwZWVkICYgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl9NQVNLOworCisJaWYgKHRyYW5zX3VuaXQgPiBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF8xMDBNSFopCisJCXJldHVybiAwOworCisJaWYgKCh0cmFuc19mYWN0IDwgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl8xXzApIHx8CisJICAgICh0cmFuc19mYWN0ID4gTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl84XzApKQorCQlyZXR1cm4gMDsKKworCXRyYW5zX3VuaXQgPj49IDA7CisJdHJhbnNfZmFjdCA+Pj0gMzsKKworCW1heF9kdHIgPSB0cmFuX2V4cFt0cmFuc191bml0XSAqIHRyYW5fbWFudFt0cmFuc19mYWN0XTsKKwlkc29yID0gT01BUF9NTUNfTUFTVEVSX0NMT0NLIC8gbWF4X2R0cjsKKworCWlmIChkc29yID09IDQpCisJCWRzb3IgPSA1OworCWlmIChkc29yID09IDMpCisJCWRzb3IgPSA0OworCisJcmV0X3ZhbCA9IG1tY19jbG9ja19jb25maWcoQ0xLX01JU0MsIGRzb3IpOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJYXJndW1lbnQgPSBtbWNfY2FyZF9jdXItPlJDQSA8PCAxNjsKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ3X1NFTEVDVCwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJLyogQ29uZmlndXJlIHRoZSBibG9jayBsZW5ndGggdG8gNTEyIGJ5dGVzICovCisJYXJndW1lbnQgPSBNTUNTRF9TRUNUT1JfU0laRTsKKwlyZXRfdmFsID0gbW1jX3NlbmRfY21kKE1NQ19DTUQxNiwgYXJndW1lbnQsIHJlc3ApOworCWlmIChyZXRfdmFsICE9IDEpCisJCXJldHVybiByZXRfdmFsOworCisJLyogZ2V0IHRoZSBjYXJkIHNpemUgaW4gc2VjdG9ycyAqLworCXJldF92YWwgPSBtbWNfcmVhZF9jYXJkc2l6ZShtbWNfY2FyZF9jdXIsIChtbWNfY3NkX3JlZ190ICopJkNhcmRfQ1NEKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBsb25nIG1tY19icmVhZChpbnQgZGV2X251bSwgdWxvbmcgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmRzdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlyZXQgPSBvbWFwX21tY19yZWFkX3NlY3QoYmxrbnIsIChibGtjbnQgKiBNTUNTRF9TRUNUT1JfU0laRSksCisJCQkmY3VyX2NhcmRfZGF0YSwgKHVuc2lnbmVkIGludCAqKWRzdCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG1tY19pbml0KGludCB2ZXJib3NlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworCXJldCA9IGNvbmZpZ3VyZV9tbWMoJmN1cl9jYXJkX2RhdGEpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltbWNfYmxrX2Rldi5pZl90eXBlID0gSUZfVFlQRV9NTUM7CisJbW1jX2Jsa19kZXYucGFydF90eXBlID0gUEFSVF9UWVBFX0RPUzsKKwltbWNfYmxrX2Rldi5kZXYgPSAwOworCW1tY19ibGtfZGV2Lmx1biA9IDA7CisJbW1jX2Jsa19kZXYudHlwZSA9IDA7CisKKwkvKiBGSVhNRSBmaWxsIGluIHRoZSBjb3JyZWN0IHNpemUgKGlzIHNldCB0byAzMk1CeXRlKSAqLworCW1tY19ibGtfZGV2LmJsa3N6ID0gTU1DU0RfU0VDVE9SX1NJWkU7CisJbW1jX2Jsa19kZXYubGJhID0gMHgxMDAwMDsKKwltbWNfYmxrX2Rldi5yZW1vdmFibGUgPSAwOworCW1tY19ibGtfZGV2LmJsb2NrX3JlYWQgPSBtbWNfYnJlYWQ7CisKKwlmYXRfcmVnaXN0ZXJfZGV2aWNlKCZtbWNfYmxrX2RldiwgMSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IG1tY19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNpemUpCit7CisJLyoKKwkgKiBOT1QgSW1wbGVtZW50ZWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KK2ludCBtbWNfd3JpdGUodW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBsb25nIGRzdCwgaW50IHNpemUpCit7CisJLyoKKwkgKiBOT1QgSW1wbGVtZW50ZWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1tYzJpbmZvKHVuc2lnbmVkIGludCBhZGRyKQoreworCS8qCisJICogTk9UIEltcGxlbWVudGVkCisJICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL21tY19ob3N0X2RlZi5oIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19ob3N0X2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1MjZmOTEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX2hvc3RfZGVmLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDxraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTU1DX0hPU1RfREVGSU5JVElPTlNfSAorI2RlZmluZSBNTUNfSE9TVF9ERUZJTklUSU9OU19ICisKKy8qCisgKiBPTUFQIEhTTU1DIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgT01BUF9IU01NQ19TWVNDT05GSUcJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMwMTApCisjZGVmaW5lIE9NQVBfSFNNTUNfU1lTU1RBVFVTCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMDE0KQorI2RlZmluZSBPTUFQX0hTTU1DX0NPTgkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMDJDKQorI2RlZmluZSBPTUFQX0hTTU1DX0JMSwkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTA0KQorI2RlZmluZSBPTUFQX0hTTU1DX0FSRwkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTA4KQorI2RlZmluZSBPTUFQX0hTTU1DX0NNRAkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTBDKQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDEwCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExMCkKKyNkZWZpbmUgT01BUF9IU01NQ19SU1AzMgkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMTQpCisjZGVmaW5lIE9NQVBfSFNNTUNfUlNQNTQJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTE4KQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDc2CQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExQykKKyNkZWZpbmUgT01BUF9IU01NQ19EQVRBCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMjApCisjZGVmaW5lIE9NQVBfSFNNTUNfUFNUQVRFCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyNCkKKyNkZWZpbmUgT01BUF9IU01NQ19IQ1RMCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMjgpCisjZGVmaW5lIE9NQVBfSFNNTUNfU1lTQ1RMCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEyQykKKyNkZWZpbmUgT01BUF9IU01NQ19TVEFUCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMzApCisjZGVmaW5lIE9NQVBfSFNNTUNfSUUJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEzNCkKKyNkZWZpbmUgT01BUF9IU01NQ19DQVBBCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxNDApCisKKy8qIFQyIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIENPTlRST0xfREVWX0NPTkYwCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODAwMjI3NCkKKyNkZWZpbmUgQ09OVFJPTF9QQklBU19MSVRFCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODAwMjUyMCkKKworLyoKKyAqIE9NQVAgSFMgTU1DIEJpdCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE1NQ19TT0ZUUkVTRVQJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSRVNFVERPTkUJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgTk9PUEVORFJBSU4JCQkJCSgweDAgPDwgMCkKKyNkZWZpbmUgT1BFTkRSQUlOCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIE9ECQkJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgSU5JVF9OT0lOSVQJCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgSU5JVF9JTklUU1RSRUFNCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgSFJfTk9IT1NUUkVTUAkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFNUUl9CTE9DSyAJCQkJCSgweDAgPDwgMykKKyNkZWZpbmUgTU9ERV9GVU5DCQkJCQkoMHgwIDw8IDQpCisjZGVmaW5lIERXOF8xXzRCSVRNT0RFIAkJCQkoMHgwIDw8IDUpCisjZGVmaW5lIE1JVF9DVE8JCQkJCQkoMHgwIDw8IDYpCisjZGVmaW5lIENEUF9BQ1RJVkVISUdICQkJCSgweDAgPDwgNykKKyNkZWZpbmUgV1BQX0FDVElWRUhJR0ggCQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUkVTRVJWRURfTUFTSwkJCQkoMHgzIDw8IDkpCisjZGVmaW5lIENUUExfTU1DX1NEIAkJCQkoMHgwIDw8IDExKQorI2RlZmluZSBCTEVOXzUxMkJZVEVTTEVOCQkJKDB4MjAwIDw8IDApCisjZGVmaW5lIE5CTEtfU1RQQ05UCQkJCQkoMHgwIDw8IDE2KQorI2RlZmluZSBERV9ESVNBQkxFCQkJCQkoMHgwIDw8IDApCisjZGVmaW5lIEJDRV9ESVNBQkxFCQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIEFDRU5fRElTQUJMRQkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIERESVJfT0ZGU0VUCQkJCQkoNCkKKyNkZWZpbmUgRERJUl9NQVNLCQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIERESVJfV1JJVEUJCQkJCSgweDAgPDwgNCkKKyNkZWZpbmUgRERJUl9SRUFECQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIE1TQlNfU0dMRUJMSwkJCQkoMHgwIDw8IDUpCisjZGVmaW5lIFJTUF9UWVBFX09GRlNFVAkJCQkoMTYpCisjZGVmaW5lIFJTUF9UWVBFX01BU0sJCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTk9SU1AJCQkJKDB4MCA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTEdIVDEzNgkJCSgweDEgPDwgMTYpCisjZGVmaW5lIFJTUF9UWVBFX0xHSFQ0OAkJCQkoMHgyIDw8IDE2KQorI2RlZmluZSBSU1BfVFlQRV9MR0hUNDhCCQkJKDB4MyA8PCAxNikKKyNkZWZpbmUgQ0NDRV9OT0NIRUNLCQkJCSgweDAgPDwgMTkpCisjZGVmaW5lIENDQ0VfQ0hFQ0sJCQkJCSgweDEgPDwgMTkpCisjZGVmaW5lIENJQ0VfTk9DSEVDSwkJCQkoMHgwIDw8IDIwKQorI2RlZmluZSBDSUNFX0NIRUNLCQkJCQkoMHgxIDw8IDIwKQorI2RlZmluZSBEUF9PRkZTRVQJCQkJCSgyMSkKKyNkZWZpbmUgRFBfTUFTSwkJCQkJCSgweDEgPDwgMjEpCisjZGVmaW5lIERQX05PX0RBVEEJCQkJCSgweDAgPDwgMjEpCisjZGVmaW5lIERQX0RBVEEJCQkJCQkoMHgxIDw8IDIxKQorI2RlZmluZSBDTURfVFlQRV9OT1JNQUwJCQkJKDB4MCA8PCAyMikKKyNkZWZpbmUgSU5ERVhfT0ZGU0VUCQkJCSgyNCkKKyNkZWZpbmUgSU5ERVhfTUFTSwkJCQkJKDB4M2YgPDwgMjQpCisjZGVmaW5lIElOREVYKGkpCQkJCQkoaSA8PCAyNCkKKyNkZWZpbmUgREFUSV9NQVNLCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIERBVElfQ01ERElTCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIERUV18xX0JJVE1PREUJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBEVFdfNF9CSVRNT0RFCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgU0RCUF9QV1JPRkYJCQkJCSgweDAgPDwgOCkKKyNkZWZpbmUgU0RCUF9QV1JPTgkJCQkJKDB4MSA8PCA4KQorI2RlZmluZSBTRFZTXzFWOAkJCQkJKDB4NSA8PCA5KQorI2RlZmluZSBTRFZTXzNWMAkJCQkJKDB4NiA8PCA5KQorI2RlZmluZSBJQ0VfTUFTSwkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBJQ0VfU1RPUAkJCQkJKDB4MCA8PCAwKQorI2RlZmluZSBJQ1NfTUFTSwkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBJQ1NfTk9UUkVBRFkJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBJQ0VfT1NDSUxMQVRFCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgQ0VOX01BU0sJCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgQ0VOX0RJU0FCTEUJCQkJCSgweDAgPDwgMikKKyNkZWZpbmUgQ0VOX0VOQUJMRQkJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBDTEtEX09GRlNFVAkJCQkJKDYpCisjZGVmaW5lIENMS0RfTUFTSwkJCQkJKDB4M0ZGIDw8IDYpCisjZGVmaW5lIERUT19NQVNLCQkJCQkoMHhGIDw8IDE2KQorI2RlZmluZSBEVE9fMTVUSERUTwkJCQkJKDB4RSA8PCAxNikKKyNkZWZpbmUgU09GVFJFU0VUQUxMCQkJCSgweDEgPDwgMjQpCisjZGVmaW5lIENDX01BU0sJCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIFRDX01BU0sJCQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEJXUl9NQVNLCQkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIEJSUl9NQVNLCQkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIEVSUklfTUFTSwkJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgSUVfQ0MJCQkJCQkoMHgwMSA8PCAwKQorI2RlZmluZSBJRV9UQwkJCQkJCSgweDAxIDw8IDEpCisjZGVmaW5lIElFX0JXUgkJCQkJCSgweDAxIDw8IDQpCisjZGVmaW5lIElFX0JSUgkJCQkJCSgweDAxIDw8IDUpCisjZGVmaW5lIElFX0NUTwkJCQkJCSgweDAxIDw8IDE2KQorI2RlZmluZSBJRV9DQ1JDCQkJCQkJKDB4MDEgPDwgMTcpCisjZGVmaW5lIElFX0NFQgkJCQkJCSgweDAxIDw8IDE4KQorI2RlZmluZSBJRV9DSUUJCQkJCQkoMHgwMSA8PCAxOSkKKyNkZWZpbmUgSUVfRFRPCQkJCQkJKDB4MDEgPDwgMjApCisjZGVmaW5lIElFX0RDUkMJCQkJCQkoMHgwMSA8PCAyMSkKKyNkZWZpbmUgSUVfREVCCQkJCQkJKDB4MDEgPDwgMjIpCisjZGVmaW5lIElFX0NFUlIJCQkJCQkoMHgwMSA8PCAyOCkKKyNkZWZpbmUgSUVfQkFEQQkJCQkJCSgweDAxIDw8IDI5KQorCisjZGVmaW5lIFZTMzBfM1YwU1VQCQkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVlMxOF8xVjhTVVAJCQkJCSgxIDw8IDI2KQorCisvKiBEcml2ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTU1DU0RfU0VDVE9SX1NJWkUJCSg1MTIpCisjZGVmaW5lIE1NQ19DQVJECQkJCTAKKyNkZWZpbmUgU0RfQ0FSRAkJCQkJMQorI2RlZmluZSBCWVRFX01PREUJCQkJMAorI2RlZmluZSBTRUNUT1JfTU9ERQkJCQkxCisjZGVmaW5lIENMS19JTklUU0VRCQkJCTAKKyNkZWZpbmUgQ0xLXzQwMEtIWgkJCQkxCisjZGVmaW5lIENMS19NSVNDCQkJCTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjYXJkX3R5cGU7CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IG1vZGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IFJDQTsKK30gbW1jX2NhcmRfZGF0YTsKKworI2RlZmluZSBtbWNfcmVnX291dChhZGRyLCBtYXNrLCB2YWwpIFwKKwkoYWRkcikgPSAoKChhZGRyKSkgJiAofihtYXNrKSkgKSB8ICggKHZhbCkgJiAobWFzaykpOworCisjZW5kaWYJCQkJLyogTU1DX0hPU1RfREVGSU5JVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL21tY19wcm90b2NvbC5oIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwN2ViMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jX3Byb3RvY29sLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDxraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgTU1DX1BST1RPQ09MX0gKKyNkZWZpbmUgTU1DX1BST1RPQ09MX0gKKworI2luY2x1ZGUgIm1tY19ob3N0X2RlZi5oIgorCisvKiBSZXNwb25zZXMgKi8KKyNkZWZpbmUgUlNQX1RZUEVfTk9ORQkoUlNQX1RZUEVfTk9SU1AgICB8IENDQ0VfTk9DSEVDSyB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjEJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjFCCShSU1BfVFlQRV9MR0hUNDhCIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjIJCShSU1BfVFlQRV9MR0hUMTM2IHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9OT0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SMwkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX05PQ0hFQ0sgfCBDSUNFX05PQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1I0CQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfTk9DSEVDSyB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjUJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjYJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjcgICAgIChSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9DSEVDSyAgIHwgQ0lDRV9DSEVDSykKKworLyogQWxsIHN1cHBvcnRlZCBjb21tYW5kcyAqLworI2RlZmluZSBNTUNfQ01EMAkoSU5ERVgoMCkgIHwgUlNQX1RZUEVfTk9ORSB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMQkoSU5ERVgoMSkgIHwgUlNQX1RZUEVfUjMgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMgkoSU5ERVgoMikgIHwgUlNQX1RZUEVfUjIgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMwkoSU5ERVgoMykgIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfU0RDTUQzCShJTkRFWCgzKSAgfCBSU1BfVFlQRV9SNiAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ0CShJTkRFWCg0KSAgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ2CShJTkRFWCg2KSAgfCBSU1BfVFlQRV9SMUIgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ3X1NFTEVDVAkoSU5ERVgoNykgIHwgUlNQX1RZUEVfUjFCICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EN19ERVNFTEVDVCBcCisJKElOREVYKDcpICB8IFJTUF9UWVBFX05PTkUgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDgJKElOREVYKDgpICB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9SRUFEKQorI2RlZmluZSBNTUNfU0RDTUQ4CShJTkRFWCg4KSAgfCBSU1BfVFlQRV9SNyAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ5CShJTkRFWCg5KSAgfCBSU1BfVFlQRV9SMiAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxMgkoSU5ERVgoMTIpIHwgUlNQX1RZUEVfUjFCICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTMJKElOREVYKDEzKSB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDE1CShJTkRFWCgxNSkgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxNgkoSU5ERVgoMTYpIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTcJKElOREVYKDE3KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9SRUFEKQorI2RlZmluZSBNTUNfQ01EMjQJKElOREVYKDI0KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0FDTUQ2CShJTkRFWCg2KSAgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19BQ01ENDEJKElOREVYKDQxKSB8IFJTUF9UWVBFX1IzICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0FDTUQ1MQkoSU5ERVgoNTEpIHwgUlNQX1RZUEVfUjEgICB8IERQX0RBVEEgICAgfCBERElSX1JFQUQpCisjZGVmaW5lIE1NQ19DTUQ1NQkoSU5ERVgoNTUpIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorCisjZGVmaW5lIE1NQ19BQ19DTURfUkNBX01BU0sgICAgICh1bnNpZ25lZCBpbnQpKDB4RkZGRiA8PCAxNikKKyNkZWZpbmUgTU1DX0JDX0NNRF9EU1JfTUFTSyAgICAgKHVuc2lnbmVkIGludCkoMHhGRkZGIDw8IDE2KQorI2RlZmluZSBNTUNfRFNSX0RFRkFVTFQgICAgICAgICAoMHgwNDA0KQorI2RlZmluZSBTRF9DTUQ4X0NIRUNLX1BBVFRFUk4gICAgICAgKDB4QUEpCisjZGVmaW5lIFNEX0NNRDhfMl83XzNfNl9WX1JBTkdFICAgICAoMHgwMSA8PCA4KQorCisvKiBDbG9jayBDb25maWd1cmF0aW9ucyBhbmQgTWFjcm9zICovCisKKyNkZWZpbmUgTU1DX0NMT0NLX1JFRkVSRU5DRQkJKDk2KQorI2RlZmluZSBNTUNfUkVMQVRJVkVfQ0FSRF9BRERSRVNTCSgweDEyMzQpCisjZGVmaW5lIE1NQ19JTklUX1NFUV9DTEsJCShNTUNfQ0xPQ0tfUkVGRVJFTkNFICogMTAwMCAvIDgwKQorI2RlZmluZSBNTUNfNDAwa0h6X0NMSwkJCShNTUNfQ0xPQ0tfUkVGRVJFTkNFICogMTAwMCAvIDQwMCkKKyNkZWZpbmUgQ0xLRFIociwgZiwgdSkJCQkoKCgocikqMTAwKSAvICgoZikqKHUpKSkgKyAxKQorI2RlZmluZSBDTEtEKGYsIHUpCQkJKENMS0RSKE1NQ19DTE9DS19SRUZFUkVOQ0UsIGYsIHUpKQorCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX01BU0sJKDB4MyA8PCAyOSkKKyNkZWZpbmUgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfQllURSAgICAoMHgwIDw8IDI5KQorI2RlZmluZSBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9TRUNUT1IgICgweDIgPDwgMjkpCisKKyNkZWZpbmUgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX01BU0sJCSgweDEgPDwgMzApCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9CWVRFCQkoMHgwIDw8IDMwKQorI2RlZmluZSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfU0VDVE9SCSgweDEgPDwgMzApCisKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX0xTQl9NQVNLICAgICAgICAgKDB4RkZGRikKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9NQVNLICAgICAgICAgKDB4MDAzRikKKyNkZWZpbmUgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9PRkZTRVQgICAgICAgKDE2KQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9MU0JfTUFTSyAgICAgICAgICAgICAoMHgwMDAzKQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9NU0JfTUFTSyAgICAgICAgICAgICAoMHgwM0ZGKQorI2RlZmluZSBNTUNfQ1NEX0NfU0laRV9NU0JfT0ZGU0VUICAgICAgICAgICAoMikKKworI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF9NQVNLICAgICAgICAoMHgwNyA8PCAwKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SX01BU0sgICAgICAoMHgwRiA8PCAzKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF8xMDBNSFogICAgICAoMHgzIDw8IDApCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfMV8wICAgICAgICgweDAxIDw8IDMpCisjZGVmaW5lIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfOF8wICAgICAgICgweDBGIDw8IDMpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHJhbl9leHBbXSA9IHsKKwkxMDAwMCwgICAgICAgICAgMTAwMDAwLCAgICAgICAgIDEwMDAwMDAsICAgICAgICAxMDAwMDAwMCwKKwkwLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0cmFuX21hbnRbXSA9IHsKKwkwLCAgICAgIDEwLCAgICAgMTIsICAgICAxMywgICAgIDE1LCAgICAgMjAsICAgICAyNSwgICAgIDMwLAorCTM1LCAgICAgNDAsICAgICA0NSwgICAgIDUwLCAgICAgNTUsICAgICA2MCwgICAgIDcwLCAgICAgODAsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbm90X3VzZWQ6MTsKKwl1bnNpZ25lZCBjcmM6NzsKKwl1bnNpZ25lZCBlY2M6MjsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdDoyOworCXVuc2lnbmVkIHRtcF93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgcGVybV93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgY29weToxOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0X2dycDoxOworCXVuc2lnbmVkIGNvbnRlbnRfcHJvdF9hcHA6MTsKKwl1bnNpZ25lZCByZXNlcnZlZF8xOjQ7CisJdW5zaWduZWQgd3JpdGVfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHdyaXRlX2JsX2xlbjo0OworCXVuc2lnbmVkIHIyd19mYWN0b3I6MzsKKwl1bnNpZ25lZCBkZWZhdWx0X2VjYzoyOworCXVuc2lnbmVkIHdwX2dycF9lbmFibGU6MTsKKwl1bnNpZ25lZCB3cF9ncnBfc2l6ZTo1OworCXVuc2lnbmVkIGVyYXNlX2dycF9tdWx0OjU7CisJdW5zaWduZWQgZXJhc2VfZ3JwX3NpemU6NTsKKwl1bnNpZ25lZCBjX3NpemVfbXVsdDozOworCXVuc2lnbmVkIHZkZF93X2N1cnJfbWF4OjM7CisJdW5zaWduZWQgdmRkX3dfY3Vycl9taW46MzsKKwl1bnNpZ25lZCB2ZGRfcl9jdXJyX21heDozOworCXVuc2lnbmVkIHZkZF9yX2N1cnJfbWluOjM7CisJdW5zaWduZWQgY19zaXplX2xzYjoyOworCXVuc2lnbmVkIGNfc2l6ZV9tc2I6MTA7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMjoyOworCXVuc2lnbmVkIGRzcl9pbXA6MTsKKwl1bnNpZ25lZCByZWFkX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHdyaXRlX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHJlYWRfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHJlYWRfYmxfbGVuOjQ7CisJdW5zaWduZWQgY2NjOjEyOworCXVuc2lnbmVkIHRyYW5fc3BlZWQ6ODsKKwl1bnNpZ25lZCBuc2FjOjg7CisJdW5zaWduZWQgdGFhYzo4OworCXVuc2lnbmVkIHJlc2VydmVkXzM6MjsKKwl1bnNpZ25lZCBzcGVjX3ZlcnM6NDsKKwl1bnNpZ25lZCBjc2Rfc3RydWN0dXJlOjI7Cit9IG1tY19jc2RfcmVnX3Q7CisKKy8qIGNzZCBmb3Igc2QyLjAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBub3RfdXNlZDoxOworCXVuc2lnbmVkIGNyYzo3OworCXVuc2lnbmVkIHJlc2VydmVkXzE6MjsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdDoyOworCXVuc2lnbmVkIHRtcF93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgcGVybV93cml0ZV9wcm90ZWN0OjE7CisJdW5zaWduZWQgY29weToxOworCXVuc2lnbmVkIGZpbGVfZm9ybWF0X2dycDoxOworCXVuc2lnbmVkIHJlc2VydmVkXzI6NTsKKwl1bnNpZ25lZCB3cml0ZV9ibF9wYXJ0aWFsOjE7CisJdW5zaWduZWQgd3JpdGVfYmxfbGVuOjQ7CisJdW5zaWduZWQgcjJ3X2ZhY3RvcjozOworCXVuc2lnbmVkIHJlc2VydmVkXzM6MjsKKwl1bnNpZ25lZCB3cF9ncnBfZW5hYmxlOjE7CisJdW5zaWduZWQgd3BfZ3JwX3NpemU6NzsKKwl1bnNpZ25lZCBzZWN0b3Jfc2l6ZTo3OworCXVuc2lnbmVkIGVyYXNlX2Jsa19sZW46MTsKKwl1bnNpZ25lZCByZXNlcnZlZF80OjE7CisJdW5zaWduZWQgY19zaXplX2xzYjoxNjsKKwl1bnNpZ25lZCBjX3NpemVfbXNiOjY7CisJdW5zaWduZWQgcmVzZXJ2ZWRfNTo2OworCXVuc2lnbmVkIGRzcl9pbXA6MTsKKwl1bnNpZ25lZCByZWFkX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHdyaXRlX2Jsa19taXNhbGlnbjoxOworCXVuc2lnbmVkIHJlYWRfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHJlYWRfYmxfbGVuOjQ7CisJdW5zaWduZWQgY2NjOjEyOworCXVuc2lnbmVkIHRyYW5fc3BlZWQ6ODsKKwl1bnNpZ25lZCBuc2FjOjg7CisJdW5zaWduZWQgdGFhYzo4OworCXVuc2lnbmVkIHJlc2VydmVkXzY6NjsKKwl1bnNpZ25lZCBjc2Rfc3RydWN0dXJlOjI7Cit9IG1tY19zZDJfY3NkX3JlZ190OworCisvKiBleHRlbmRlZCBjc2QgLSA1MTIgYnl0ZXMgbG9uZyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMVsxODFdOworCXVuc2lnbmVkIGNoYXIgZXJhc2VkbWVtb3J5Y29udGVudDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzI7CisJdW5zaWduZWQgY2hhciBidXN3aWR0aG1vZGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8zOworCXVuc2lnbmVkIGNoYXIgaGlnaHNwZWVkaW50ZXJmYWNldGltaW5nOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNDsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3M7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF81OworCXVuc2lnbmVkIGNoYXIgY29tbWFuZHNldHJldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNjsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRzZXQ7CisJdW5zaWduZWQgY2hhciBleHRlbmRlZGNzZHJldmlzaW9uOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNzsKKwl1bnNpZ25lZCBjaGFyIGNzZHN0cnVjdHVyZXZlcnNpb247CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF84OworCXVuc2lnbmVkIGNoYXIgY2FyZHR5cGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF85WzNdOworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzc181Mm1oel8xXzk1djsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3NfMjZtaHpfMV85NXY7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzUybWh6XzNfNnY7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzI2bWh6XzNfNnY7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xMDsKKwl1bnNpZ25lZCBjaGFyIG1pbnJlYWRwZXJmXzRiXzI2bWh6OworCXVuc2lnbmVkIGNoYXIgbWlud3JpdGVwZXJmXzRiXzI2bWh6OworCXVuc2lnbmVkIGNoYXIgbWlucmVhZHBlcmZfOGJfMjZtaHpfNGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciBtaW53cml0ZXBlcmZfOGJfMjZtaHpfNGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciBtaW5yZWFkcGVyZl84Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbndyaXRlcGVyZl84Yl81Mm1oejsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzExOworCXVuc2lnbmVkIGludCBzZWN0b3Jjb3VudDsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzEyWzI4OF07CisJdW5zaWduZWQgY2hhciBzdXBwb3J0ZWRjb21tYW5kc2V0czsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzEzWzddOworfSBtbWNfZXh0ZW5kZWRfY3NkX3JlZ190OworCisvKiBtbWMgc2QgcmVzcG9uY2UgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgb2NyOworfSBtbWNfcmVzcF9yMzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGNhcmRzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbmV3cHVibGlzaGVkcmNhOworfSBtbWNfcmVzcF9yNjsKKworZXh0ZXJuIG1tY19jYXJkX2RhdGEgbW1jX2RldjsKKwordW5zaWduZWQgY2hhciBtbWNfbG93bGV2ZWxfaW5pdCh2b2lkKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3NlbmRfY29tbWFuZCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcmVzcG9uc2UpOwordW5zaWduZWQgY2hhciBtbWNfc2V0dXBfY2xvY2sodW5zaWduZWQgaW50IGljbGssIHVuc2lnbmVkIHNob3J0IGNsa2QpOwordW5zaWduZWQgY2hhciBtbWNfc2V0X29wZW5kcmFpbih1bnNpZ25lZCBjaGFyIHN0YXRlKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfZGF0YSh1bnNpZ25lZCBpbnQgKm91dHB1dF9idWYpOworCisjZW5kaWYJCQkJLypNTUNfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvb21hcDMvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg4OTM1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL3N0YXJ0LlMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiAgYXJtYm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgT01QMjQyMC9BUk0xMTM2IENQVS1jb3JlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA2ICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUdhcnkgSmVubmVqb2huIDxnakBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCUtzaGl0aWogPGtzaGl0aWpAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwNAlKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCWIJcmVzZXQKKyAJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCitfaGFuZzoKKyAJLndvcmQgZG9faGFuZworCisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OCAvKiBub3cgMTYqND02NCAqLworCisuZ2xvYmFsIF9lbmRfdmVjdAorX2VuZF92ZWN0OgorCisJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCisgKgorICogZG8gaW1wb3J0YW50IGluaXQgb25seSBpZiB3ZSBkb24ndCBzdGFydCBmcm9tIG1lbW9yeSEKKyAqIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorICogcmVsb2NhdGUgYXJtYm9vdCB0byByYW0KKyAqIHNldHVwIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQorCisjaWZuZGVmIFNUQUNLX0JBU0UKKyNkZWZpbmUgU1RBQ0tfQkFTRSBURVhUX0JBU0UKKyNlbmRpZgorCQorX1NUQUNLX0JBU0U6CisgICAgLndvcmQgICBTVEFDS19CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDoKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisKKwkvKiBDb3B5IHZlY3RvcnMgdG8gbWFzayBST00gaW5kaXJlY3QgYWRkciAqLworCWFkciAgICAgcjAsIF9zdGFydCAgICAgICAgICAgICAgLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlhZGQgICAgIHIwLCByMCwgIzQJCQkJLyogc2tpcCByZXNldCB2ZWN0b3IJCQkqLworCW1vdiAgICAgcjIsICM2NCAgICAgICAgICAgICAgICAgLyogcjIgPC0gc2l6ZSB0byBjb3B5ICAqLworCWFkZCAgICAgcjIsIHIwLCByMiAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKwltb3YgICAgIHIxLCAjU1JBTV9PRkZTRVQwICAgICAgICAgLyogYnVpbGQgdmVjdCBhZGRyICovCisJbW92ICAgICByMywgI1NSQU1fT0ZGU0VUMQorCWFkZCAgICAgcjEsIHIxLCByMworCW1vdiAgICAgcjMsICNTUkFNX09GRlNFVDIKKwlhZGQgICAgIHIxLCByMSwgcjMKK25leHQ6CisJbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYm5lICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVudGlsIGVxdWFsICovCisKKwlibAljcHlfY2xrX2NvZGUgICAgICAgICAgICAvKiBwdXQgZHBsbCBhZGp1c3QgY29kZSBiZWhpbmQgdmVjdG9ycyAqLworCisJLyogdGhlIG1hc2sgUk9NIGNvZGUgc2hvdWxkIGhhdmUgUExMIGFuZCBvdGhlcnMgc3RhYmxlICovCisJYmwgIGNwdV9pbml0X2NyaXQKKworcmVsb2NhdGU6CQkJCS8qIHJlbG9jYXRlIFUtQm9vdCB0byBSQU0JICAgICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCByMCwgcjEgICAgICAgICAgICAgICAgICAJLyogbm8gbmVlZCB0byByZWxvY2F0ZSBpZiBYSVAgICAgICAgKi8KKwliZXEgc3RhY2tfc2V0dXAJCQkvKiBza2lwIHR4dCBjcHkgaWYgWElQKFNSQU0sIFNEUkFNKSAqLworCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlZWUgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8KK3N0YWNrX3NldHVwOgorCWxkcglyMCwgX1NUQUNLX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCisJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgKi8KKwlhbmQJc3AsIHNwLCAjfjcJCS8qIDggYnl0ZSBhbGluZ2VkIGZvciAobGRyL3N0cilkICAgICovCisKKwkvKiBDbGVhciBCU1MgKGlmIGFueSkuICBJcyBiZWxvdyB0eCAod2F0Y2ggbG9hZCBhZGRyIC0gbmVlZCBzcGFjZSkgICovCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICovCitjbGJzc19sOgorCXN0cglyMiwgW3IwXQkJLyogY2xlYXIgQlNTIGxvY2F0aW9uICAgICAgICAgICAgICAgKi8KKwljbXAJcjAsIHIxCQkJLyogYXJlIHdlIGF0IHRoZSBlbmQgeWV0ICAgICAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAkJLyogaW5jcmVtZW50IGNsZWFyIGluZGV4IHBvaW50ZXIgICAgKi8KKwlibmUJY2xic3NfbCAgICAgICAgICAgICAgICAgLyoga2VlcCBjbGVhcmluZyB0aWxsIGF0IGVuZCAgICAgICAgKi8KKworCWxkcglwYywgX3N0YXJ0X2FybWJvb3QJLyoganVtcCB0byBDIGNvZGUgICAgICAgICAgICAgICAgICAgKi8KKworX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIEludmFsaWRhdGUgTDEgSS9ECisJICovCisgICAgICAgIG1vdglyMCwgIzAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBmb3IgTUNSICovCisgICAgICAgIG1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAgIC8qIGludmFsaWRhdGUgVExCcyAqLworICAgICAgICBtY3IJcDE1LCAwLCByMCwgYzcsIGM1LCAxICAvKiBpbnZhbGlkYXRlIGljYWNoZSAqLworCisJLyogSW52YWxpZGUgTDIgY2FjaGUgKGdwIGRldmljZSBjYWxsIHBvaW50KQorCSAqIC0gd2FybmluZywgdGhpcyBtYXkgaGF2ZSBpc3N1ZXMgb24gRU1VL0hTIGRldmljZXMKKwkgKiB0aGlzIGNhbGwgY2FuIGNvcnJ1cHQgcjAtcjUKKwkgKi8KKwltb3YgcjEyLCAjMHgxCQlAIHNldCB1cCB0byBpbnZhbGlkZSBMMgorLyoKKyAqIFRPRE86IE5lZWQgdG8gcmV2ZXJ0IGJhY2sgb24gR1AgZGV2aWNlLgorICovCisvKgorc21pOiAJLndvcmQgMHhFMTYwMDA3MAlAIENhbGwgU01JIG1vbml0b3IKKyovCisJLyoKKwkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCisJICovCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCWJpYwlyMCwgcjAsICMweDAwMDAyMDAwCUAgY2xlYXIgYml0cyAxMyAoLS1WLSkKKwliaWMJcjAsIHIwLCAjMHgwMDAwMDAwNwlAIGNsZWFyIGJpdHMgMjowICgtQ0FNKQorCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAxICgtLUEtKSBBbGlnbgorI2lmbmRlZiBDT05GSUdfSUNBQ0hFX09GRgorCW9ycglyMCwgcjAsICMweDAwMDAxODAwCUAgc2V0IGJpdCAxMSwxMiAoLS0tSSBaLS0tKSBCVEIsSS1DYWNoZQorI2VuZGlmCisJbWNyCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCisJLyoKKyAgICAgICAgICogSnVtcCB0byBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4uLiBUaGUgTWFzayBST00gd2lsbCBoYXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICAgICAgICogYmFzaWMgbWVtb3J5LiAgR28gaGVyZSB0byBidW1wIHVwIGNsb2NrIHJhdGUgYW5kIGhhbmRsZSB3YWtlIHVwIGNvbmRpdGlvbnMuCisJICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogcGFzcyBvbiBpbmZvIGFib3V0IHNraXBwaW5nIHNvbWUgaW5pdCBwb3J0aW9ucyAqLworCW1vdmVxICAgcjAsIzB4MSAgICAgICAgICAgICAgICAgLyogZmxhZyB0byBza2lwIHByY20gYW5kIHNkcmMgc2V0dXAgKi8KKwltb3ZuZSAgIHIwLCMweDAKKworCW1vdglpcCwgbHIgICAgICAgICAgLyogcGVyc2V2ZXJlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJbG93bGV2ZWxfaW5pdCAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisJbW92CWxyLCBpcCAgICAgICAgICAvKiByZXN0b3JlIGxpbmsgKi8KKwltb3YJcGMsIGxyICAgICAgICAgIC8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisKKy8qCisgKiBleGNlcHRpb24gaGFuZGxlcgorICovCisgCS5hbGlnbiAgNQorZG9faGFuZzoKKwlsZHIJc3AsIF9URVhUX0JBU0UJCS8qIHVzZSAzMiB3b3JkcyBhYm9ydCBzdGFjayAqLworICAgCWJsCWhhbmcJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZGlzay9NYWtlZmlsZSBiL3gtbG9hZGVyL2Rpc2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWY0MDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2Rpc2svTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworI0NGTEFHUyArPSAtREVUX0RFQlVHIC1EREVCVUcKKworTElCCT0gJChvYmopbGliZGlzay5hCisKK0NPQkpTCT0gcGFydC5vCisKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZGlzay9wYXJ0LmMgYi94LWxvYWRlci9kaXNrL3BhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzY3ZjEzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZGlzay9wYXJ0LmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxpZGUuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisKKyN1bmRlZglQQVJUX0RFQlVHCisKKyNpZmRlZglQQVJUX0RFQlVHCisjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKKyNlbmRpZgorCisjaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiByZXBvcnRzIGRldmljZSBpbmZvIHRvIHRoZSB1c2VyCisgKi8KK3ZvaWQgZGV2X3ByaW50IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYykKK3sKKyNpZmRlZiBDT05GSUdfTEJBNDgKKwl1aW50NjRfdCBsYmE1MTI7IC8qIG51bWJlciBvZiBibG9ja3MgaWYgNTEyYnl0ZXMgYmxvY2sgc2l6ZSAqLworI2Vsc2UKKwlsYmFpbnRfdCBsYmE1MTI7CisjZW5kaWYKKworCWlmIChkZXZfZGVzYy0+dHlwZT09REVWX1RZUEVfVU5LTk9XTikgeworCQlyZXR1cm47CisJfQorCWlmIChkZXZfZGVzYy0+aWZfdHlwZT09SUZfVFlQRV9TQ1NJKSAgeworCQlwcmludGYgKCIoJWQ6JWQpICIsIGRldl9kZXNjLT50YXJnZXQsZGV2X2Rlc2MtPmx1bik7CisJfQorCWlmIChkZXZfZGVzYy0+aWZfdHlwZT09SUZfVFlQRV9JREUpIHsKKwkJcHJpbnRmICgiTW9kZWw6ICVzIEZpcm06ICVzIFNlciM6ICVzXG4iLAorCQkJZGV2X2Rlc2MtPnZlbmRvciwKKwkJCWRldl9kZXNjLT5yZXZpc2lvbiwKKwkJCWRldl9kZXNjLT5wcm9kdWN0KTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJWZW5kb3I6ICVzIFByb2QuOiAlcyBSZXY6ICVzXG4iLAorCQkJZGV2X2Rlc2MtPnZlbmRvciwKKwkJCWRldl9kZXNjLT5wcm9kdWN0LAorCQkJZGV2X2Rlc2MtPnJldmlzaW9uKTsKKwl9CisJcHJpbnRmICgiICAgICAgICAgICAgVHlwZTogIik7CisJc3dpdGNoIChkZXZfZGVzYy0+dHlwZSAmIDB4MUYpIHsKKwkJY2FzZSBERVZfVFlQRV9IQVJERElTSzogcHJpbnRmICgiSGFyZCBEaXNrIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX0NEUk9NOiAJcHJpbnRmICgiQ0QgUk9NIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX09QRElTSzogCXByaW50ZiAoIk9wdGljYWwgRGV2aWNlIik7CisJCQkJCWJyZWFrOworCQljYXNlIERFVl9UWVBFX1RBUEU6IAlwcmludGYgKCJUYXBlIik7CisJCQkJCWJyZWFrOworCQlkZWZhdWx0OgkJcHJpbnRmICgiIyAlMDJYICMiLCBkZXZfZGVzYy0+dHlwZSAmIDB4MUYpOworCQkJCQlicmVhazsKKwl9CisJaWYgKChkZXZfZGVzYy0+bGJhICogZGV2X2Rlc2MtPmJsa3N6KT4wTCkgeworCQl1bG9uZyBtYiwgbWJfcXVvdCwgbWJfcmVtLCBnYiwgZ2JfcXVvdCwgZ2JfcmVtOworCQlsYmFpbnRfdCBsYmE7CisKKwkJbGJhID0gZGV2X2Rlc2MtPmxiYTsKKworCQlsYmE1MTIgPSAobGJhICogKGRldl9kZXNjLT5ibGtzei81MTIpKTsKKwkJbWIgPSAoMTAgKiBsYmE1MTIpIC8gMjA0ODsJLyogMjA0OCA9ICgxMDI0ICogMTAyNCkgLyA1MTIgTUIgKi8KKwkJLyogcm91bmQgdG8gMSBkaWdpdCAqLworCQltYl9xdW90CT0gbWIgLyAxMDsKKwkJbWJfcmVtCT0gbWIgLSAoMTAgKiBtYl9xdW90KTsKKworCQlnYiA9IG1iIC8gMTAyNDsKKwkJZ2JfcXVvdAk9IGdiIC8gMTA7CisJCWdiX3JlbQk9IGdiIC0gKDEwICogZ2JfcXVvdCk7CisjaWZkZWYgQ09ORklHX0xCQTQ4CisJCWlmIChkZXZfZGVzYy0+bGJhNDgpCisJCQlwcmludGYgKCIgICAgICAgICAgICBTdXBwb3J0cyA0OC1iaXQgYWRkcmVzc2luZ1xuIik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENGR182NEJJVF9MQkEpICYmIGRlZmluZWQoQ0ZHXzY0QklUX1ZTUFJJTlRGKQorCQlwcmludGYgKCIgICAgICAgICAgICBDYXBhY2l0eTogJWxkLiVsZCBNQiA9ICVsZC4lbGQgR0IgKCVxZCB4ICVsZClcbiIsCisJCQltYl9xdW90LCBtYl9yZW0sCisJCQlnYl9xdW90LCBnYl9yZW0sCisJCQlsYmEsCisJCQlkZXZfZGVzYy0+Ymxrc3opOworI2Vsc2UKKwkJcHJpbnRmICgiICAgICAgICAgICAgQ2FwYWNpdHk6ICVsZC4lbGQgTUIgPSAlbGQuJWxkIEdCICglbGQgeCAlbGQpXG4iLAorCQkJbWJfcXVvdCwgbWJfcmVtLAorCQkJZ2JfcXVvdCwgZ2JfcmVtLAorCQkJKHVsb25nKWxiYSwKKwkJCWRldl9kZXNjLT5ibGtzeik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlwcmludGYgKCIgICAgICAgICAgICBDYXBhY2l0eTogbm90IGF2YWlsYWJsZVxuIik7CisJfQorfQorI2VuZGlmCS8qIENGR19DTURfSURFIHx8IENGR19DTURfU0NTSSB8fCBDRkdfQ01EX1VTQiB8fCBDT05GSUdfTU1DICovCisKKyNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykJfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICAgICAgICAgICkKKworI2lmIGRlZmluZWQoQ09ORklHX01BQ19QQVJUSVRJT04pIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ET1NfUEFSVElUSU9OKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVNPX1BBUlRJVElPTikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikKKwordm9pZCBpbml0X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKyNpZmRlZiBDT05GSUdfSVNPX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfaXNvKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfSVNPOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfbWFjKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfTUFDOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfZG9zKGRldl9kZXNjKSA9PSAwKSB7CisJCWRldl9kZXNjLT5wYXJ0X3R5cGUgPSBQQVJUX1RZUEVfRE9TOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJaWYgKHRlc3RfcGFydF9hbWlnYShkZXZfZGVzYykgPT0gMCkgeworCSAgICBkZXZfZGVzYy0+cGFydF90eXBlID0gUEFSVF9UWVBFX0FNSUdBOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCit9CisKKworaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKQoreworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mb19tYWMoZGV2X2Rlc2MscGFydCxpbmZvKSA9PSAwKSB7CisJCQlQUklOVEYgKCIjIyBWYWxpZCBNQUMgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfRE9TOgorCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX2RvcyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKKwkJCVBSSU5URiAoIiMjIFZhbGlkIERPUyBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9JU086CisJCWlmIChnZXRfcGFydGl0aW9uX2luZm9faXNvKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgeworCQkJUFJJTlRGICgiIyMgVmFsaWQgSVNPIGJvb3QgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9BTUlHQToKKwkgICAgaWYgKGdldF9wYXJ0aXRpb25faW5mb19hbWlnYShkZXZfZGVzYywgcGFydCwgaW5mbykgPT0gMCkKKwkgICAgeworCQlQUklOVEYgKCIjIyBWYWxpZCBBbWlnYSBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQlyZXR1cm4gKDApOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wYXJ0X2hlYWRlciAoY29uc3QgY2hhciAqdHlwZSwgYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworCXN3aXRjaCAoZGV2X2Rlc2MtPmlmX3R5cGUpIHsKKwkJY2FzZSBJRl9UWVBFX0lERTogIAlwcmludGYgKCJJREUiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9TQ1NJOiAJcHJpbnRmICgiU0NTSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX0FUQVBJOglwcmludGYgKCJBVEFQSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQjoJcHJpbnRmICgiVVNCIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfRE9DOglwcmludGYgKCJET0MiKTsKKwkJCQkJYnJlYWs7CisJCWRlZmF1bHQ6IAkJcHJpbnRmICgiVU5LTk9XTiIpOworCQkJCQlicmVhazsKKwl9CisJcHJpbnRmICgiIGRldmljZSAlZCAgLS0gICBQYXJ0aXRpb24gVHlwZTogJXNcblxuIiwKKwkJCWRldl9kZXNjLT5kZXYsIHR5cGUpOworfQorCit2b2lkIHByaW50X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgTUFDIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiTUFDIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X21hYyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0RPUzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgRE9TIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiRE9TIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X2RvcyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfSVNPOgorCQlQUklOVEYgKCIjIyBUZXN0aW5nIGZvciB2YWxpZCBJU08gQm9vdCBwYXJ0aXRpb24gIyNcbiIpOworCQlwcmludF9wYXJ0X2hlYWRlciAoIklTTyIsIGRldl9kZXNjKTsKKwkJcHJpbnRfcGFydF9pc28gKGRldl9kZXNjKTsKKwkJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfQU1JR0E6CisJICAgIFBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIGEgdmFsaWQgQW1pZ2EgcGFydGl0aW9uICMjXG4iKTsKKwkgICAgcHJpbnRfcGFydF9oZWFkZXIgKCJBTUlHQSIsIGRldl9kZXNjKTsKKwkgICAgcHJpbnRfcGFydF9hbWlnYSAoZGV2X2Rlc2MpOworCSAgICByZXR1cm47CisjZW5kaWYKKwl9Cit9CisKKworI2Vsc2UJLyogbmVpdGhlciBNQUMgbm9yIERPUyBub3IgSVNPIHBhcnRpdGlvbiBjb25maWd1cmVkICovCisjIGVycm9yIG5laXRoZXIgQ09ORklHX01BQ19QQVJUSVRJT04gbm9yIENPTkZJR19ET1NfUEFSVElUSU9OIG5vciBDT05GSUdfSVNPX1BBUlRJVElPTiBjb25maWd1cmVkIQorI2VuZGlmCisKKyNlbmRpZgkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTEyNTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsOTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJuYW5kLmEKKworaWZlcSAoJChCT0FSRCksIG9tYXAzNDMwc2RwKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMzQzMGxhYnJhZG9yKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwM2V2bSkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgYW0zNTE3ZXZtKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQyMGg0KQorQ09CSlMteQkrPSBrOWsxMjE2Lm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQzMHNkcCkKK0NPQkpTLXkJKz0gazlrMTIxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDE3MTBoMykKK0NPQkpTLXkJKz0gazlmNTYxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgZGlhbW9uZCkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgZGlhbW9uZC11c2ItbG9hZGVyKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBqNDkpCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIGo0OS11c2ItbG9hZGVyKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKKyMjIERpc2FibGVkIGZvciBub3c6CisjIwkgIGNzODkwMC5vIGN0NjkwMDAubyBkYXRhZmxhc2gubyBkYzIxMTR4Lm8gZHMxNzIyLm8gXAorIyMJICBsYW45MWM5Ni5vIG13X2VlcHJvbS5vIG5hdHNlbWkubyBcCisjIwkgIHNtYzkxMTExLm8gc21pTHlueEVNLm8gc3BpX2VlcHJvbS5vIHN5bTUzYzh4eC5vIFwKKyMjCisKK0NPQkpTCTo9ICQoQ09CSlMteSkKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWYxZzA4cjBhLmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjFnMDhyMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGZmMDZmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWYxZzA4cjBhLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogIFNhbXN1bmcgSzlGMUcwOFIwQVEwQyBOQU5EIGNoaXAgZHJpdmVyIGZvciBhbiBPTUFQMjQyMCBib2FyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorCisjaWYgZGVmaW5lZChDRkdfTkFORF9LOUYxRzA4UjBBKSB8fAlcCisgICAgZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSB8fAlcCisgICAgZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpCisKKyNkZWZpbmUgSzlGMUcwOFIwQV9NRlIJCTB4ZWMgIC8qIFNhbXN1bmcgKi8KKyNkZWZpbmUgSzlGMUcwOFIwQV9JRAkJMHhhMSAgLyogcGFydCAjICovCisKKyNkZWZpbmUgUzM0TVMwMUcxX01GUgkJMHgwMSAgLyogU3BhbnNpb24gKi8KKyNkZWZpbmUgUzM0TVMwMUcxX0lECQkweGJhICAvKiBwYXJ0ICMgLSAxNmJpdCwgMkdCICovCisKKy8qIFNpbmNlIE1pY3JvbiBhbmQgU2Ftc3VuZyBwYXJ0cyBhcmUgc2ltaWxhciBpbiBnZW9tZXRyeSBhbmQgYnVzIHdpZHRoCisgKiB3ZSBjYW4gdXNlIHRoZSBzYW1lIGRyaXZlci4gTmVlZCB0byByZXZpc2l0IHRvIG1ha2UgdGhpcyBmaWxlIGluZGVwZW5kZW50CisgKiBvZiBwYXJ0L21hbnVmYWN0dXJlcgorICovCisjZGVmaW5lIE1UMjlGMUdfTUZSCQkweDJjICAvKiBNaWNyb24gKi8KKyNkZWZpbmUgTVQyOUYxR19JRAkJMHhhMSAgLyogeDgsIDFHaUIgKi8KKyNkZWZpbmUgTVQyOUYyR19JRAkJMHhiYSAgLyogeDE2LCAyR2lCICovCisKKyNkZWZpbmUgSFlOSVg0R2lCX01GUgkJMHhBRCAgLyogSHluaXggKi8KKyNkZWZpbmUgSFlOSVg0R2lCX0lECQkweEJDICAvKiB4MTYsIDRHaUIgKi8KKworI2RlZmluZSBBRERSX0NPTFVNTgkJMQorI2RlZmluZSBBRERSX1BBR0UJCTIKKyNkZWZpbmUgQUREUl9DT0xVTU5fUEFHRQkoQUREUl9DT0xVTU4gfCBBRERSX1BBR0UpCisKKyNkZWZpbmUgQUREUl9PT0IJCSgweDQgfCBBRERSX0NPTFVNTl9QQUdFKQorCisjZGVmaW5lIFBBR0VfU0laRQkJMjA0OAorI2RlZmluZSBPT0JfU0laRQkJNjQKKyNkZWZpbmUgTUFYX05VTV9QQUdFUwkJNjQKKworI2RlZmluZSBFQ0NfQ0hFQ0tfRU5BQkxFCisKKyNpZiBDRkdfTkFORF9FQ0NfMUJJVAorI2RlZmluZSBFQ0NfU0laRQkJMjQKKyNkZWZpbmUgRUNDX1NURVBTCQkzCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCisjZGVmaW5lIG9tYXBfY29ycmVjdF9kYXRhCisjZGVmaW5lIG9tYXBfY2FsY3VsYXRlX2VjYworI2VsaWYgQ0ZHX05BTkRfRUNDXzRCSVQKKyNkZWZpbmUgRUNDX1NJWkUJCTI4IAorI2RlZmluZSBFQ0NfU1RFUFMJCTI4IAorCitleHRlcm4gZW5hYmxlX2h3ZWNjX2JjaDQodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpOworZXh0ZXJuIGludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g0KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKTsKK2V4dGVybiBpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQoY29uc3QgdWludDhfdCAqZGF0LCB1aW50OF90ICplY2NfY29kZSk7CisKKyNkZWZpbmUgb21hcF9lbmFibGVfaHdlY2MJb21hcF9lbmFibGVfaHdlY2NfYmNoNAorI2RlZmluZSBvbWFwX2NvcnJlY3RfZGF0YQlvbWFwX2NvcnJlY3RfZGF0YV9iY2g0CisjZGVmaW5lIG9tYXBfY2FsY3VsYXRlX2VjYwlvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNAorI2VsaWYgQ0ZHX05BTkRfRUNDXzhCSVQKKyNkZWZpbmUgRUNDX1NJWkUJCTUyCisjZGVmaW5lIEVDQ19TVEVQUwkJNTIgCisKK2V4dGVybiB2b2lkIG9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpOworZXh0ZXJuIGludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g4KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKTsKK2V4dGVybiBpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgoY29uc3QgdWludDhfdCAqZGF0LCB1aW50OF90ICplY2NfY29kZSk7CisKKyNkZWZpbmUgb21hcF9lbmFibGVfaHdlY2MJb21hcF9lbmFibGVfaHdlY2NfYmNoOAorI2RlZmluZSBvbWFwX2NvcnJlY3RfZGF0YQlvbWFwX2NvcnJlY3RfZGF0YV9iY2g4CisjZGVmaW5lIG9tYXBfY2FsY3VsYXRlX2VjYwlvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOAorI2Vsc2UKKyNlcnJvciAiTm9uZSBvZiBDRkdfTkFORF9FQ0NfezEsNCw4fUJJVCBpcyBkZWZpbmVkLiIKKyNlbmRpZiAvKiBDRkdfTkFORF9FQ0NfMUJJVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTAsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKiBidWYsIHVsb25nIHBhZ2VfYWRkcik7CisKKyNpZmRlZiBDRkdfTkFORF9FQ0NfMUJJVAorc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPQorCQl7NDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorCQk0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsCisJCTU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2M307CisjZWxpZiBDRkdfTkFORF9FQ0NfNEJJVAorc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPQorCQl7MzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIAorCQk0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgCisJCTUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCAKKwkJNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9OworI2VsaWYgQ0ZHX05BTkRfRUNDXzhCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezEyLCAxMywgMTQsCisJCTE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLAorCQkyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKKwkJMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsCisJCTM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCAKKwkJNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIAorCQk1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgCisJCTU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzfTsKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGlwc2l6ZSA9ICgyNTYgPDwgMjApOworCisjaWZkZWYgTkFORF8xNkJJVAorc3RhdGljIGludCBidXNfd2lkdGggPSAxNjsKKyNlbHNlCitzdGF0aWMgaW50IGJ1c193aWR0aCA9IDg7CisjZW5kaWYKKworLyogTmFuRF9Db21tYW5kOiBTZW5kIGEgZmxhc2ggY29tbWFuZCB0byB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0NvbW1hbmQodW5zaWduZWQgY2hhciBjb21tYW5kKQoreworIAlOQU5EX0NUTF9TRVRDTEUoTkFORF9BRERSKTsKKworIAlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgTkFORF9BRERSKTsKKyAJTkFORF9DVExfQ0xSQ0xFKE5BTkRfQUREUik7CisKKyAgCWlmKGNvbW1hbmQgPT0gTkFORF9DTURfUkVTRVQpeworCQl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9TVEFUVVMpOworCQlkb3sKKwkJCXJldF92YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKyAgCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisgCX0KKworCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisKKy8qIE5hbkRfQWRkcmVzczogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgZm9yIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyh1bnNpZ25lZCBpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworCXVjaGFyIHU7CisKKyAJTkFORF9DVExfU0VUQUxFKE5BTkRfQUREUik7CisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRQorCQkJCXx8IG51bWJ5dGVzID09IEFERFJfT09CKQorCXsKKwkJdXNob3J0IGNvbCA9IG9mczsKKworCQl1ID0gY29sICAmIDB4ZmY7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCisJCXUgPSAoY29sID4+IDgpICYgMHgwNzsKKwkJaWYgKG51bWJ5dGVzID09IEFERFJfT09CKQorCQkJdSA9IHUgfCAoKGJ1c193aWR0aCA9PSAxNikgPyAoMSA8PCAyKSA6ICgxIDw8IDMpKTsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisJfQorCisJaWYgKG51bWJ5dGVzID09IEFERFJfUEFHRSB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFCisJCQkJfHwgbnVtYnl0ZXMgPT0gQUREUl9PT0IpCisJeworCQl1ID0gKG9mcyA+PiAxMSkgJiAweGZmOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKwkJdSA9IChvZnMgPj4gMTkpICYgMHhmZjsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisKKwkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgZGV2aWNlcyA+IDEyOE1pQiAqLworCQlpZiAoY2hpcHNpemUgPiAoMTI4IDw8IDIwKSkgeworCQkJdSA9IChvZnMgPj4gMjcpICYgMHhmZjsKKwkJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCQl9CisJfQorCisgCU5BTkRfQ1RMX0NMUkFMRShOQU5EX0FERFIpOworCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiByZWFkIGNoaXAgbWZyIGFuZCBpZAorICogcmV0dXJuIDAgaWYgdGhleSBtYXRjaCBib2FyZCBjb25maWcKKyAqIHJldHVybiAxIGlmIG5vdAorICovCitpbnQgbmFuZF9jaGlwKCkKK3sKKwljb25zdCBpbnQgc3VwcG9ydGVkID0gMDsKKwlpbnQgbWZyLCBpZDsKKworIAlOQU5EX0VOQUJMRV9DRSgpOworCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVTRVQpKSB7CisgCQlwcmludGYoIkVycjogUkVTRVRcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAoIXN1cHBvcnRlZCk7CisJfQorCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRElEKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFQURJRFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsKKwkJcmV0dXJuICghc3VwcG9ydGVkKTsKKyAJfQorCisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTiwgMCk7CisKKyAJbWZyID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJaWQgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCWRlYnVnKCJOQU5EOiAleDoleFxuIiwgbWZyLCBpZCk7CisKKwlOQU5EX0RJU0FCTEVfQ0UoKTsKKworCXN3aXRjaCAobWZyKSB7CisKKwljYXNlIEs5RjFHMDhSMEFfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBLOUYxRzA4UjBBX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1UMjlGMUdfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBNVDI5RjFHX0lEOgkJCisJCWNhc2UgTVQyOUYyR19JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBIWU5JWDRHaUJfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBIWU5JWDRHaUJfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKwljYXNlIFMzNE1TMDFHMV9NRlI6CisJCXN3aXRjaCAoaWQpIHsKKworCQljYXNlIFMzNE1TMDFHMV9JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoJCQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwl9CisKKwlyZXR1cm4gKCFzdXBwb3J0ZWQpOworfQorCisvKiByZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIHJldHVybiAxIGlmIHRoZSBibG9jayBpcyBiYWQgb3IgRUNDIGVycm9yIGNhbid0IGJlIGNvcnJlY3RlZCBmb3IgYW55IHBhZ2UKKyAqIHJldHVybiAwIG9uIHN1Y2VzcworICovCitpbnQgbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcikKK3sKKwlpbnQgaSwgb2Zmc2V0ID0gMDsKKworI2lmZGVmIEVDQ19DSEVDS19FTkFCTEUKKwl1MTYgb29iX2J1ZltPT0JfU0laRSA+PiAxXTsKKworCS8qIGNoZWNrIGJhZCBibG9jayAqLworCS8qIDB0aCB3b3JkIGluIHNwYXJlIGFyZWEgbmVlZHMgYmUgMHhmZiAqLworCWlmIChuYW5kX3JlYWRfb29iKCh1bnNpZ25lZCBjaGFyICopb29iX2J1ZiwgYmxvY2tfYWRkcikKKwkJfHwgKG9vYl9idWZbMF0gJiAweGZmKSAhPSAweGZmKSB7CisJCXByaW50ZigiU2tpcHBlZCBiYWQgYmxvY2sgYXQgMHgleFxuIiwgYmxvY2tfYWRkcik7CisJCXJldHVybiBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0s7ICAgIC8qIHNraXAgYmFkIGJsb2NrICovCisJfQorI2VuZGlmCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKGk9MDsgaTxNQVhfTlVNX1BBR0VTOyBpKyspeworCQlpZiAobmFuZF9yZWFkX3BhZ2UoYnVmK29mZnNldCwgYmxvY2tfYWRkciArIG9mZnNldCkpCisJCQlyZXR1cm4gTkFORF9SRUFEX0VDQ19GQUlMVVJFOworCQlvZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBOQU5EX1JFQURfU1VDQ0VTUzsKK30KK3N0YXRpYyBpbnQgY291bnQ7CisvKiByZWFkIGEgcGFnZSB3aXRoIEVDQyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworI2lmZGVmIEVDQ19DSEVDS19FTkFCTEUKKwkvKiBpbmNyZWFzZWQgc2l6ZSBvZiBlY2NfY29kZSBhbmQgZWNjX2NhbGMgdG8gbWF0Y2ggdGhlIE9PQiBzaXplLCAKKwkgICBhcyBpcyBkb25lIGluIHRoZSBrZXJuZWwgKi8KKwl1X2NoYXIgZWNjX2NvZGVbT09CX1NJWkVdOworCXVfY2hhciBlY2NfY2FsY1tPT0JfU0laRV07CisJdV9jaGFyIG9vYl9idWZbT09CX1NJWkVdOworI2VuZGlmCisJdTE2IHZhbDsKKwlpbnQgY250cjsKKwlpbnQgbGVuOworCisjaWZkZWYgTkFORF8xNkJJVAorCXUxNiAqcDsKKyNlbHNlCisJdV9jaGFyICpwOworI2VuZGlmCisKKwlOQU5EX0VOQUJMRV9DRSgpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEMCk7CisJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OX1BBR0UsIHBhZ2VfYWRkcik7CisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURTVEFSVCk7CisJTkFORF9XQUlUX1JFQURZKCk7CisKKwkvKiBBIGRlbGF5IHNlZW1zIHRvIGJlIGhlbHBpbmcgaGVyZS4gbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uICovCisJZGVsYXkoMTAwMDApOworCisJb21hcF9lbmFibGVfaHdlY2MoYnVzX3dpZHRoLCAwKTsKKworCS8qIHJlYWQgdGhlIHBhZ2UgKi8KKwlsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IFBBR0VfU0laRSA+PiAxIDogUEFHRV9TSVpFOworCXAgPSAodTE2ICopYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCBsZW47IGNudHIrKyl7CisJCSpwKysgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJZGVsYXkoMTApOworICAgCX0KKworI2lmZGVmIEVDQ19DSEVDS19FTkFCTEUKKwlvbWFwX2NhbGN1bGF0ZV9lY2MoYnVmLCAmZWNjX2NhbGNbMF0pOworCisJLyogcmVhZCB0aGUgT09CIGFyZWEgKi8KKwlwID0gKHUxNiAqKW9vYl9idWY7CisgICAgICAgIGxlbiA9IChidXNfd2lkdGggPT0gMTYpID8gT09CX1NJWkUgPj4gMSA6IE9PQl9TSVpFOworCWZvciAoY250ciA9IDA7IGNudHIgPCBsZW47IGNudHIrKyl7CisJCSpwKysgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJZGVsYXkoMTApOworIAl9CisJY291bnQgPSAwOworIAlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisJLyogTmVlZCB0byBlbmFibGUgSFdFQ0MgZm9yIFJFQURJTkcgKi8KKworIAkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLworCWZvciAoY250ciA9IDA7IGNudHIgPCBFQ0NfU0laRTsgY250cisrKQorCQllY2NfY29kZVtjbnRyXSA9ICBvb2JfYnVmW2VjY19wb3NbY250cl1dOworCisJZm9yKGNvdW50ID0gMDsgY291bnQgPCBFQ0NfU0laRTsgY291bnQgKz0gRUNDX1NURVBTKSB7CisjaWYgQ0ZHX05BTkRfRUNDXzFCSVQKKyAJCW5hbmRfY2FsY3VsYXRlX2VjYyAoYnVmLCAmZWNjX2NhbGNbMF0pOworCQlpZiAobmFuZF9jb3JyZWN0X2RhdGEgKGJ1ZiwgJmVjY19jb2RlW2NvdW50XSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworI2Vsc2UKKwkJaWYgKG9tYXBfY29ycmVjdF9kYXRhKGJ1ZiwgJmVjY19jb2RlW2NvdW50XSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworI2VuZGlmCisgCQkJcHJpbnRmICgiRUNDIEZhaWxlZCwgcGFnZSAweCUwOHhcbiIsIHBhZ2VfYWRkcik7CisJCQlmb3IgKHZhbD0wOyB2YWwgPDI1NjsgdmFsKyspCisJCQkJcHJpbnRmKCIleCAiLCBidWZbdmFsXSk7CisJCQlwcmludGYoIlxuIik7CisgIAkJCXJldHVybiAxOworIAkJfQorCQlidWYgKz0gMjU2OworCQlwYWdlX2FkZHIgKz0gMjU2OworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiAvIDIwNDggYnl0ZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKwlpbnQgY250cjsKKwlpbnQgbGVuOworCisjaWZkZWYgTkFORF8xNkJJVAorCXUxNiAqcDsKKyNlbHNlCisJdV9jaGFyICpwOworI2VuZGlmCisJcCA9ICh1MTYgKilidWY7CisgICAgICAgIGxlbiA9IChidXNfd2lkdGggPT0gMTYpID8gT09CX1NJWkUgPj4gMSA6IE9PQl9TSVpFOworCisgIAlOQU5EX0VOQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBsb3cgKi8KKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworIAlOYW5EX0FkZHJlc3MoQUREUl9PT0IsIHBhZ2VfYWRkcik7CisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURTVEFSVCk7CisJTkFORF9XQUlUX1JFQURZKCk7CisKKwkvKiBBIGRlbGF5IHNlZW1zIHRvIGJlIGhlbHBpbmcgaGVyZS4gbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uICovCisJZGVsYXkoMTAwMDApOworCWZvciAoY250ciA9IDA7IGNudHIgPCBsZW47IGNudHIrKykKKwkJKnArKyA9IFJFQURfTkFORChOQU5EX0FERFIpOworCisJTkFORF9XQUlUX1JFQURZKCk7CisJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfSzlGMUcwOFIwQSkgfHwKKwkJKiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpIHx8CisJCSogZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpCisJCSovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjU2MTYuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmNTYxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjE0MmIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjU2MTYuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAgU2Ftc3VuZyBLOUY1NjE2UTBDIE5BTkQgY2hpcCBkcml2ZXIgZm9yIGFuIE9NQVAxNnh4IGJvYXJkCisgKiAKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9LOUY1NjE2CisKKyNkZWZpbmUgSzlGNTYxNl9NRlIJCTB4ZWMKKyNkZWZpbmUgSzlGNTYxNl9JRAkJMHg0NQorCisjZGVmaW5lIEFERFJfQ09MVU1OCQkxICAgICAgICAgIAorI2RlZmluZSBBRERSX1BBR0UJCTIgICAgICAgICAgICAgCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJMworCisjZGVmaW5lIFBBR0VfU0laRQkJNTEyCisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICogYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworCisvKiBKRkZTMiA1MTItYnl0ZS1wYWdlIEVDQyBsYXlvdXQgKi8KK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0gezAsMSwyLDMsNiw3fTsKK3N0YXRpYyB1X2NoYXIgZWNjdmFsaWRfcG9zID0gNDsKKworLyogTmFuRF9Db21tYW5kOiBTZW5kIGEgZmxhc2ggY29tbWFuZCB0byB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0NvbW1hbmQodW5zaWduZWQgY2hhciBjb21tYW5kKQoreworIAlOQU5EX0NUTF9TRVRDTEUoTkFORF9BRERSKTsKKyAJV1JJVEVfTkFORF9DT01NQU5EKGNvbW1hbmQsIE5BTkRfQUREUik7CisgCU5BTkRfQ1RMX0NMUkNMRShOQU5EX0FERFIpOworCisgIAlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdW5zaWduZWQgY2hhciByZXRfdmFsOworCQlOYW5EX0NvbW1hbmQoTkFORF9DTURfU1RBVFVTKTsKKwkJZG97CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7Lyogd2FpdCB0aWxsIHJlYWR5ICovCisgIAkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworIAl9CisgCQorIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTmFuRF9BZGRyZXNzOiBTZXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBmb3IgdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9BZGRyZXNzKGludCBudW1ieXRlcywgdW5zaWduZWQgbG9uZyBvZnMpCit7CisgCWludCBpOworCisgCU5BTkRfQ1RMX1NFVEFMRShOQU5EX0FERFIpOworIAorCWlmIChudW1ieXRlcyA9PSBBRERSX0NPTFVNTiB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisJb2ZzID0gb2ZzID4+IDg7CisKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9QQUdFIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyssIG9mcyA9IG9mcyA+PiA4KQorCQkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworIAlOQU5EX0NUTF9DTFJBTEUoTkFORF9BRERSKTsKKworIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBjaGlwIG1mciBhbmQgaWQKKyAqIHJldHVybiAwIGlmIHRoZXkgbWF0Y2ggYm9hcmQgY29uZmlnCisgKiByZXR1cm4gMSBpZiBub3QKKyAqLworaW50IG5hbmRfY2hpcCgpCit7CisJaW50IG1mciwgaWQ7CisKKyAJTkFORF9FTkFCTEVfQ0UoKTsKKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFU0VUKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFU0VUXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOyAgIAorCQlyZXR1cm4gMTsKKwl9CisgCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRElEKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFQURJRFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsKKwkJcmV0dXJuIDE7CisgCX0KKyAKKyAJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OLCAwKTsKKworIAltZnIgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwlpZCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCisJTkFORF9ESVNBQkxFX0NFKCk7CisKKyAgCXJldHVybiAobWZyICE9IEs5RjU2MTZfTUZSIHx8IGlkICE9IEs5RjU2MTZfSUQpOworfQorCisvKiByZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIHJldHVybiAxIGlmIHRoZSBibG9jayBpcyBiYWQgb3IgRUNDIGVycm9yIGNhbid0IGJlIGNvcnJlY3RlZCBmb3IgYW55IHBhZ2UKKyAqIHJldHVybiAwIG9uIHN1Y2VzcworICovIAoraW50IG5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpCit7CisJaW50IGksIG9mZnNldCA9IDA7CisJdWNoYXIgb29iX2J1ZlsxNl07CisgCQorCS8qIGNoZWNrIGJhZCBibG9jayAqLworCS8qIDB0aCBhbmQgNXRoIHdvcmRzIG5lZWQgYmUgMHhmZmZmICovCisJaWYgKG5hbmRfcmVhZF9vb2Iob29iX2J1ZiwgYmxvY2tfYWRkcikgfHwKKy8vCQlvb2JfYnVmWzBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxXSAhPSAweGZmIHx8CisvLwkJb29iX2J1ZlsxMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzExXSAhPSAweGZmICl7CisJCW9vYl9idWZbNV0gIT0gMHhmZil7CisJCXByaW50ZigiU2tpcHBlZCBiYWQgYmxvY2sgYXQgMHgleFxuIiwgYmxvY2tfYWRkcik7CisgCQlyZXR1cm4gTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLOyAgICAvKiBza2lwIGJhZCBibG9jayAqLworCX0KKworCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChpPTA7IGk8MzI7IGkrKyl7CisJCWlmIChuYW5kX3JlYWRfcGFnZShidWYrb2Zmc2V0LCBibG9ja19hZGRyICsgb2Zmc2V0KSkKKwkJCXJldHVybiBOQU5EX1JFQURfRUNDX0ZBSUxVUkU7CisJCW9mZnNldCArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIE5BTkRfUkVBRF9TVUNDRVNTOworfQorCisvKiByZWFkIGEgcGFnZSB3aXRoIEVDQyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworIAl1X2NoYXIgZWNjX2NvZGVbNl07CisJdV9jaGFyIGVjY19jYWxjWzNdOworIAl1X2NoYXIgb29iX2J1ZlsxNl07CisJdV9jaGFyICpwOworCXUxNiB2YWw7CisJaW50IGNudHI7CisKKwlOQU5EX0VOQUJMRV9DRSgpOyAgIAorCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEMCk7CisJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OX1BBR0UsIHBhZ2VfYWRkcj4+MSk7CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKyAJcCA9IGJ1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgMjU2OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKnArKyA9IHZhbCAmIDB4ZmY7CisJCSpwKysgPSB2YWwgPj4gODsKKyAJfQorCisJcCA9IG9vYl9idWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisgCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKnArKyA9IHZhbCAmIDB4ZmY7CisJCSpwKysgPSB2YWwgPj4gODsKKyAJfQorIAlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisgCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJZm9yIChjbnRyID0gMDsgY250ciA8IDY7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCisJaWYgKChvb2JfYnVmW2VjY3ZhbGlkX3Bvc10gJiAweDBmKSAhPSAweDBmKSB7CisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYsICZlY2NfY29kZVswXSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwl9CisJCisJaWYgKChvb2JfYnVmW2VjY3ZhbGlkX3Bvc10gJiAweGYwKSAhPSAweGYwKSB7CisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiArIDI1NiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYgKyAyNTYsICZlY2NfY29kZVszXSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIrMHgxMDApOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgYnl0ZSBwYWdlLgorICovCitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKwl1MTYgdmFsOworCWludCBjbnRyOworICAgIAkKKyAgCU5BTkRfRU5BQkxFX0NFKCk7ICAvKiBzZXQgcGluIGxvdyAqLworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFET09CKTsKKyAJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OX1BBR0UsIHBhZ2VfYWRkcj4+MSk7CisJTkFORF9XQUlUX1JFQURZKCk7CisKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpidWYrKyA9IHZhbCAmIDB4ZmY7CisJCSpidWYrKyA9IHZhbCA+PiA4OworICAJfQorCisJTkFORF9XQUlUX1JFQURZKCk7CisJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlrMTIxNi5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWsxMjE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlMzA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlrMTIxNi5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqICBTYW1zdW5nIEs5SzEyMTZRMEMgTkFORCBjaGlwIGRyaXZlciBmb3IgYW4gT01BUDI0MjAgYm9hcmQKKyAqIAorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgdS1ib290IGZpbGU6CisgKgljb21tb24vY21kX25hbmQuYworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19OQU5EX0s5SzEyMTYKKworI2RlZmluZSBLOUsxMjE2X01GUgkJMHhlYworI2RlZmluZSBLOUsxMjE2X0lECQkweDQ2CisKKyNkZWZpbmUgQUREUl9DT0xVTU4JCTEgICAgICAgICAgCisjZGVmaW5lIEFERFJfUEFHRQkJMiAgICAgICAgICAgICAKKyNkZWZpbmUgQUREUl9DT0xVTU5fUEFHRQkzCisKKyNkZWZpbmUgUEFHRV9TSVpFCQk1MTIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5ICh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIgorCQkJCQkgICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiIChsb29wcykpOworfQorCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqIGJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKKworLyogSkZGUzIgNTEyLWJ5dGUtcGFnZSBFQ0MgbGF5b3V0ICovCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9IHswLDEsMiwzLDYsN307CitzdGF0aWMgdV9jaGFyIGVjY3ZhbGlkX3BvcyA9IDQ7CisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisgCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBOQU5EX0FERFIpOworIAlOQU5EX0NUTF9DTFJDTEUoTkFORF9BRERSKTsKKworICAJaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7CisJCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwkJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1NUQVRVUyk7CisJCWRveworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworICAJCX0gd2hpbGUoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKKyAJfQorIAkKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5hbkRfQWRkcmVzczogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgZm9yIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyhpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworIAlpbnQgaTsKKworIAlOQU5EX0NUTF9TRVRBTEUoTkFORF9BRERSKTsKKyAKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworCW9mcyA9IG9mcyA+PiA5OworCisJaWYgKG51bWJ5dGVzID09IEFERFJfUEFHRSB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrLCBvZnMgPSBvZnMgPj4gOCkKKwkJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKyAJTkFORF9DVExfQ0xSQUxFKE5BTkRfQUREUik7CisKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgY2hpcCBtZnIgYW5kIGlkCisgKiByZXR1cm4gMCBpZiB0aGV5IG1hdGNoIGJvYXJkIGNvbmZpZworICogcmV0dXJuIDEgaWYgbm90CisgKi8KK2ludCBuYW5kX2NoaXAoKQoreworCWludCBtZnIsIGlkOworCisgCU5BTkRfRU5BQkxFX0NFKCk7CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRVNFVCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRVNFVFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsgICAKKwkJcmV0dXJuIDE7CisJfQorIAorIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAxOworIAl9CisgCisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTiwgMCk7CisKKyAJbWZyID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJaWQgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfRElTQUJMRV9DRSgpOworCisgIAlyZXR1cm4gKG1mciAhPSBLOUsxMjE2X01GUiB8fCBpZCAhPSBLOUsxMjE2X0lEKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKK2ludCBuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKQoreworCWludCBpLCBvZmZzZXQgPSAwOworCXVjaGFyIG9vYl9idWZbMTZdOworIAkKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggYW5kIDV0aCB3b3JkcyBuZWVkIGJlIDB4ZmZmZiAqLworCWlmIChuYW5kX3JlYWRfb29iKG9vYl9idWYsIGJsb2NrX2FkZHIpIHx8CisvLwkJb29iX2J1ZlswXSAhPSAweGZmIHx8IG9vYl9idWZbMV0gIT0gMHhmZiB8fAorLy8JCW9vYl9idWZbMTBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxMV0gIT0gMHhmZiApeworCQlvb2JfYnVmWzVdICE9IDB4ZmYpeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworIAkJcmV0dXJuIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSzsgICAgLyogc2tpcCBiYWQgYmxvY2sgKi8KKwl9CisKKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAoaT0wOyBpPDMyOyBpKyspeworCQlpZiAobmFuZF9yZWFkX3BhZ2UoYnVmK29mZnNldCwgYmxvY2tfYWRkciArIG9mZnNldCkpCisJCQlyZXR1cm4gTkFORF9SRUFEX0VDQ19GQUlMVVJFOworCQlvZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBOQU5EX1JFQURfU1VDQ0VTUzsKK30KK3N0YXRpYyBjb3VudCA9IDA7CisvKiByZWFkIGEgcGFnZSB3aXRoIEVDQyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworIAl1X2NoYXIgZWNjX2NvZGVbNl07CisJdV9jaGFyIGVjY19jYWxjWzNdOworIAl1X2NoYXIgb29iX2J1ZlsxNl07CisJdV9jaGFyICpwOworCXUxNiB2YWw7CisJaW50IGNudHI7CisKKwlOQU5EX0VOQUJMRV9DRSgpOyAgIAorCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEMCk7CisJTmFuRF9BZGRyZXNzKEFERFJfQ09MVU1OX1BBR0UsIHBhZ2VfYWRkcik7CisJTkFORF9XQUlUX1JFQURZKCk7CisKKwlkZWxheSg1MDApOyAvKiB3ZSBnbyB0aHJvdWdoIE5GQyBuZWVkIGEgYmlnZ2VyIGRlbGF5LiAyMDAgaXMgbm90IGVub3VnaCAqLworIAorICAJcCA9IGJ1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgMjU2OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKyAJCSpwKysgPSB2YWwgJiAweGZmOworIAkJKnArKyA9IHZhbCA+PiA4OworICAgCX0KKworCXAgPSBvb2JfYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworIAkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKwljb3VudCA9IDE7CisgCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKyAJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgNjsgY250cisrKQorCQllY2NfY29kZVtjbnRyXSA9ICBvb2JfYnVmW2VjY19wb3NbY250cl1dOworCisJaWYgKChvb2JfYnVmW2VjY3ZhbGlkX3Bvc10gJiAweDBmKSAhPSAweDBmKSB7CisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYsICZlY2NfY29kZVswXSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIpOworCQkJZm9yICh2YWw9MDsgdmFsIDwyNTY7IHZhbCsrKQorCQkJCXByaW50ZigiJXggIiwgYnVmW3ZhbF0pOworCQkJcHJpbnRmKCJcbiIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwl9CisJCisJaWYgKChvb2JfYnVmW2VjY3ZhbGlkX3Bvc10gJiAweGYwKSAhPSAweGYwKSB7CisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiArIDI1NiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYgKyAyNTYsICZlY2NfY29kZVszXSwgJmVjY19jYWxjWzBdKSA9PSAtMSkgeworIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIrMHgxMDApOworCQkJZm9yICh2YWw9MDsgdmFsIDwyNTY7IHZhbCsrKQorCQkJCXByaW50ZigiJXggIiwgYnVmW3ZhbCsyNTZdKTsKKwkJCXByaW50ZigiXG4iKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKyAgICAJCisgIAlOQU5EX0VOQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBsb3cgKi8KKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRE9PQik7CisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisvKglkbyB7CisJCSoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwN2MpID0gTkFORF9DTURfU1RBVFVTOworCSAgdmFsID0gKih2b2xhdGlsZSB1MzIgKikoMHg2ODAwQTA4NCk7CisJICBwcmludGYoInZhbCA9ICV4XG4iLCB2YWwpOwkKKwl9IHdoaWxlICgodmFsICYgMHg0MCkgIT0gMHg0MCk7CisqLworCS8qIHRoZSBhYm92ZSBjb2RlIGZyb20gT1NUQm9vdCBkb2Vzbid0IHdvcmssIHdlIHVzZSBkZWxheSAqLworCWRlbGF5KDUwMCk7IC8qIHdlIGdvIHRocm91Z2ggTkZDIG5lZWQgYSBiaWdnZXIgZGVsYXkuIDIwMCBpcyBub3QgZW5vdWdoICovCisgCisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqYnVmKysgPSB2YWwgJiAweGZmOworCQkqYnVmKysgPSB2YWwgPj4gODsKKyAgCX0KKyAgCisJTkFORF9XQUlUX1JFQURZKCk7CisJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjE5NWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgU2Ftc3VuZyBFbGVjdHJvbmljcy4KKyMgS3l1bmdtaW4gUGFyayA8a3l1bmdtaW4ucGFya0BzYW1zdW5nLmNvbT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYm9uZW5hbmQuYQorCitDT0JKUy15CTo9IG9uZW5hbmQubworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmQuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2Y3MDYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmQuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSBTYW1zdW5nIEVsZWN0cm9uaXMKKyAqIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjaW5jbHVkZSAib25lbmFuZF9yZWdzLmgiCisKKyNpZiBkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZChDRkdfR1BNQ19PTkVOQU5EKQorI2RlZmluZSBvbmVuYW5kX3JlYWR3KGEpCSgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKQorI2RlZmluZSBvbmVuYW5kX3dyaXRldyh2LCBhKQkoKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYSkpID0gKHUxNikgKHYpKQorCisjZGVmaW5lIFNBTVNVTkdfTUZSX0lECQkweEVDCisjZGVmaW5lIEtGTTFHMTZRMkFfREVWX0lECTB4MzAKKyNkZWZpbmUgS0ZOMkcxNlEyQV9ERVZfSUQJMHg0MAorCisKKyNkZWZpbmUgVEhJU19PTkVOQU5EKGEpCQkoT05FTkFORF9BRERSICsgKGEpKQorCisjZGVmaW5lIFJFQURfSU5URVJSVVBUKCkJCQkJCQlcCisJb25lbmFuZF9yZWFkdyhUSElTX09ORU5BTkQoT05FTkFORF9SRUdfSU5URVJSVVBUKSkKKworI2RlZmluZSBSRUFEX0NUUkxfU1RBVFVTKCkJCQkJCQlcCisJb25lbmFuZF9yZWFkdyhUSElTX09ORU5BTkQoT05FTkFORF9SRUdfQ1RSTF9TVEFUVVMpKQorCisjZGVmaW5lIFJFQURfRUNDX1NUQVRVUygpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0VDQ19TVEFUVVMpKQorCQorI2RlZmluZSBTRVRfRU1JRlNfQ1NfQ09ORklHKHYpCQkJCQlcCisJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShPTUFQX0VNSUZTX0NTX0NPTkZJRykgPSAodikpCisKKyNkZWZpbmUgb25lbmFuZF9ibG9ja19hZGRyZXNzKGJsb2NrKQkJKGJsb2NrKQorI2RlZmluZSBvbmVuYW5kX3NlY3Rvcl9hZGRyZXNzKHBhZ2UpCQkocGFnZSA8PCAyKQorI2RlZmluZSBvbmVuYW5kX2J1ZmZlcl9hZGRyZXNzKCkJCSgoMSA8PCAzKSA8PCA4KQorI2RlZmluZSBvbmVuYW5kX2J1ZmZlcnJhbV9hZGRyZXNzKGJsb2NrKQkoMCkKKworI2lmIGRlZmluZWQoQ0ZHX1NZTkNfQlVSU1RfUkVBRCkgJiYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3N5bmNfYnVyc3RfcmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl2YWx1ZSA9IDAKKwkJfCAoMHgxIDw8IDE1KQkJLyogUmVhZCBNb2RlOiBTeW5jaHJvbm91cyAqLworCQl8ICgweDQgPDwgMTIpCQkvKiBCdXJzdCBSZWFkIExhdGVuY3k6IDQgY3ljbGVzICovCisJCXwgKDB4NCA8PCA5KQkJLyogQnVyc3QgTGVuZ3RoOiA4IHdvcmQgKi8KKwkJfCAoMHgxIDw8IDcpCQkvKiBSRFkgc2lnbmFsIHBsYXJpdHkgKi8KKwkJfCAoMHgxIDw8IDYpCQkvKiBJTlQgc2lnbmFsIHBsYXJpdHkgKi8KKwkJfCAoMHgxIDw8IDUpCQkvKiBJL08gYnVmZmVyIGVuYWJsZSAqLworCQk7CisJb25lbmFuZF93cml0ZXcodmFsdWUsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19TWVNfQ0ZHMSkpOworCisJdmFsdWUgPSAwCisJCXwgKDQgPDwgMTYpCQkvKiBTeW5jaHJvbm91cyBCdXJzdCBSZWFkICovCisJCXwgKDEgPDwgMTIpCQkvKiBQR1dTVC9XRUxFTiAqLworCQl8ICgxIDw8IDgpCQkvKiBXUldTVCAqLworCQl8ICg0IDw8IDQpCQkvKiBSRFdTVCAqLworCQl8ICgxIDw8IDApCQkvKiBGQ0xLRElWID0+IDQ4TUh6ICovCisJCTsKKwlTRVRfRU1JRlNfQ1NfQ09ORklHKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hc3luY19yZWFkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXZhbHVlID0gMAorCQl8ICgweDAgPDwgMTUpCQkvKiBSZWFkIE1vZGU6IEFzeW5jaHJvbm91cyAqLworCQl8ICgweDQgPDwgMTIpCQkvKiBCdXJzdCBSZWFkIExhdGVuY3k6IDQgY3ljbGVzICovCisJCXwgKDB4MCA8PCA5KQkJLyogQnVyc3QgTGVuZ3RoOiBjb250aW51b3VzICovCisJCXwgKDB4MSA8PCA3KQkJLyogUkRZIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA2KQkJLyogSU5UIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MCA8PCA1KQkJLyogSS9PIGJ1ZmZlciBkaXNhYmxlICovCisJCTsKKwlvbmVuYW5kX3dyaXRldyh2YWx1ZSwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NZU19DRkcxKSk7CisKKwl2YWx1ZSA9IDAKKwkJfCAoMCA8PCAxNikJCS8qIEFzeW5jaHJvbm91cyBSZWFkICovCisJCXwgKDEgPDwgMTIpCQkvKiBQR1dTVC9XRUxFTiAqLworCQl8ICgxIDw8IDgpCQkvKiBXUldTVCAqLworCQl8ICgzIDw8IDQpCQkvKiBSRFdTVCAqLworCQl8ICgxIDw8IDApCQkvKiBGQ0xLRElWID0+IDQ4TUh6ICovCisJCTsKKwlTRVRfRU1JRlNfQ1NfQ09ORklHKHZhbHVlKTsKK30KKyNlbHNlCisjZGVmaW5lIHNldF9zeW5jX2J1cnN0X3JlYWQoLi4uKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9hc3luY19yZWFkKC4uLikJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitpbnQKK29uZW5hbmRfY2hpcCgpCit7CisJdW5zaWduZWQgc2hvcnQgbWZfaWQsIGRldl9pZDsKKwltZl9pZCA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKFRISVNfT05FTkFORChPTkVOQU5EX1JFR19NQU5VRkFDVFVSRVJfSUQpKSk7CisJZGV2X2lkID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0RFVklDRV9JRCkpKTsKKworCWlmKG1mX2lkID09IFNBTVNVTkdfTUZSX0lEKSB7CisJCWlmIChkZXZfaWQgPT0gS0ZNMUcxNlEyQV9ERVZfSUQpIHsKKwkJcHJpbnRmKCJEZXRlY3RlZCBTYW1zdW5nIE11eE9uZU5BTkQxRyBGbGFzaCBcclxuIik7CisJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGRldl9pZCA9PSBLRk4yRzE2UTJBX0RFVl9JRCkgeworCQkJcHJpbnRmKCJEZXRlY3RlZCBTYW1zdW5nIE11eE9uZU5BTkQyRyBGbGFzaCBcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIE9ORU5BTkQgRmxhc2ggdW5zdXBwb3J0ZWRcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiT05FTkFORCBGbGFzaCBVbnN1cHBvcnRlZFxyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisvKiByZWFkIGEgcGFnZSB3aXRoIEVDQyAqLworc3RhdGljIGlubGluZSBpbnQgb25lbmFuZF9yZWFkX3BhZ2UodWxvbmcgYmxvY2ssIHVsb25nIHBhZ2UsIHVfY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgKmJhc2U7CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZMzIKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nICpwOworCXVuc2lnbmVkIGludCBjdHJsLCBlY2M7CisJdW5zaWduZWQgc2hvcnQgYmJtYXJrZXI7CisjZW5kaWYKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfYmxvY2tfYWRkcmVzcyhibG9jayksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTMSkpOworCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9zZWN0b3JfYWRkcmVzcyhwYWdlKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M4KSk7CisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2J1ZmZlcl9hZGRyZXNzKCksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9CVUZGRVIpKTsKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfYnVmZmVycmFtX2FkZHJlc3MoYmxvY2spLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzIpKTsKKworCW9uZW5hbmRfd3JpdGV3KE9ORU5BTkRfSU5UX0NMRUFSLCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfSU5URVJSVVBUKSk7CisKKwlvbmVuYW5kX3dyaXRldyhPTkVOQU5EX0NNRF9SRUFELCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfQ09NTUFORCkpOworCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisgCXAgPSAodW5zaWduZWQgbG9uZyAqKSBidWY7CisjZW5kaWYKKwliYXNlID0gKHVuc2lnbmVkIGxvbmcgKikgKE9ORU5BTkRfQUREUiArIE9ORU5BTkRfREFUQVJBTSk7CisKKwl3aGlsZSAoIShSRUFEX0lOVEVSUlVQVCgpICYgT05FTkFORF9JTlRfTUFTVEVSKSkKKwkJY29udGludWU7CisJLyogQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIGJhZC4gQmFkIGJsb2NrIG1hcmtlcnMgICAgKi8KKwkvKiBhcmUgc3RvcmVkIGluIHNwYXJlIGFyZWEgb2YgMXN0IG9yIDJuZCBwYWdlICovCisJaWYgKChwYWdlID09IDApIHx8IChwYWdlID09IDEpKQorCXsKKwkgICAgdW5zaWduZWQgbG9uZyAqc3BhcmVBcmVhID0gKHVuc2lnbmVkIGxvbmcgKikgKE9ORU5BTkRfQUREUiArIE9ORU5BTkRfU1BBUkVSQU0pOworCSAgICBiYm1hcmtlciA9ICpzcGFyZUFyZWE7CisgICAgICAgICAgICAvKiBmb3IgYmFkIGJsb2NrIG1hcmtlcnMgKi8KKyAgICAgICAgICAgIGlmIChiYm1hcmtlciAhPSAweEZGRkYpeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCX0KKworCWN0cmwgPSBSRUFEX0NUUkxfU1RBVFVTKCk7CisJCisJaWYgKGN0cmwgJiBPTkVOQU5EX0NUUkxfRVJST1IpIHsKKwkJaGFuZygpOworCX0KKwkKKwlpZiAoUkVBRF9JTlRFUlJVUFQoKSAmIE9ORU5BTkRfSU5UX1JFQUQpIHsKKworCQllY2MgPSBSRUFEX0VDQ19TVEFUVVMoKTsKKwkJaWYgKGVjYyAmIE9ORU5BTkRfRUNDXzJCSVRfQUxMKSB7CisJCQloYW5nKCk7CisJCX0KKwl9CisJCisjaWZkZWYgX19IQVZFX0FSQ0hfTUVNQ1BZMzIKKwkvKiAzMiBieXRlcyBib3VuZGFyeSBtZW1vcnkgY29weSAqLworCW1lbWNweTMyKGJ1ZiwgYmFzZSwgT05FTkFORF9QQUdFX1NJWkUpOworI2Vsc2UKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IChPTkVOQU5EX1BBR0VfU0laRSA+PiAyKTsgb2Zmc2V0KyspIHsKKwkJdmFsdWUgPSAqKGJhc2UgKyBvZmZzZXQpOworCQkqcCsrID0gdmFsdWU7CisgCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9QQUdFCQkwCisjZGVmaW5lIE9ORU5BTkRfUEFHRVNfUEVSX0JMT0NLCQk2NAorCisvKioKKyAqIG9uZW5hbmRfcmVhZF9ibG9jayAtIFJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogQHJldHVybiAwIG9uIHN1Y2VzcworICovIAorCitpbnQgb25lbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2spCit7CisJaW50IHBhZ2UsIG9mZnNldCA9IDA7CisKKwlzZXRfc3luY19idXJzdF9yZWFkKCk7CisKKwkvKiBOT1RFOiB5b3UgbXVzdCByZWFkIHBhZ2UgZnJvbSBwYWdlIDEgb2YgYmxvY2sgMCAqLworCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChwYWdlID0gT05FTkFORF9TVEFSVF9QQUdFOworCSAgICBwYWdlIDwgT05FTkFORF9QQUdFU19QRVJfQkxPQ0s7IHBhZ2UrKykgeworCisJCWlmIChvbmVuYW5kX3JlYWRfcGFnZShibG9jaywgcGFnZSwgYnVmICsgb2Zmc2V0KSl7CisJCSAgICBzZXRfYXN5bmNfcmVhZCgpOworCQkgICAgcmV0dXJuIDE7CisJCX0KKworCQlvZmZzZXQgKz0gT05FTkFORF9QQUdFX1NJWkU7CisJfQorCisJc2V0X2FzeW5jX3JlYWQoKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9yZWdzLmggYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWNjOGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfcmVncy5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbXRkL29uZW5hbmRfcmVncy5oCisgKgorICogIE9uZU5BTkQgUmVnaXN0ZXIgaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19PTkVOQU5EX1JFR19ICisjZGVmaW5lIF9fT05FTkFORF9SRUdfSAorCisvKiBNZW1vcnkgQWRkcmVzcyBNYXAgVHJhbnNsYXRpb24gKFdvcmQgb3JkZXIpICovCisjZGVmaW5lIE9ORU5BTkRfTUVNT1JZX01BUCh4KQkJKCh4KSA8PCAxKQorCisvKgorICogRXh0ZXJuYWwgQnVmZmVyUkFNIGFyZWEKKyAqLworI2RlZmluZQlPTkVOQU5EX0JPT1RSQU0JCQlPTkVOQU5EX01FTU9SWV9NQVAoMHgwMDAwKQorI2RlZmluZQlPTkVOQU5EX0RBVEFSQU0JCQlPTkVOQU5EX01FTU9SWV9NQVAoMHgwMjAwKQorI2RlZmluZQlPTkVOQU5EX1NQQVJFUkFNCQlPTkVOQU5EX01FTU9SWV9NQVAoMHg4MDEwKQorCisvKgorICogT25lTkFORCBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTkVOQU5EX1JFR19NQU5VRkFDVFVSRVJfSUQJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfREVWSUNFX0lECQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAxKQorI2RlZmluZSBPTkVOQU5EX1JFR19WRVJTSU9OX0lECQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAyKQorI2RlZmluZSBPTkVOQU5EX1JFR19EQVRBX0JVRkZFUl9TSVpFCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0JPT1RfQlVGRkVSX1NJWkUJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwNCkKKyNkZWZpbmUgT05FTkFORF9SRUdfTlVNX0JVRkZFUlMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1RFQ0hOT0xPR1kJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDYpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzEJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzIJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzMJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwMikKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzQJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwMykKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzUJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwNCkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzYJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwNSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzcJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwNikKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzgJT05FTkFORF9NRU1PUllfTUFQKDB4RjEwNykKKworI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9CVUZGRVIJT05FTkFORF9NRU1PUllfTUFQKDB4RjIwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfQ09NTUFORAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjIyMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1lTX0NGRzEJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMjEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NZU19DRkcyCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjIyKQorI2RlZmluZSBPTkVOQU5EX1JFR19DVFJMX1NUQVRVUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0MCkKKyNkZWZpbmUgT05FTkFORF9SRUdfSU5URVJSVVBUCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjQxKQorI2RlZmluZSBPTkVOQU5EX1JFR19TVEFSVF9CTE9DS19BRERSRVNTCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNEMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VORF9CTE9DS19BRERSRVNTCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNEQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1dQX1NUQVRVUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0RSkKKworI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfU1RBVFVTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAwKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTAJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMAkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMikKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00xCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAzKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzEJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNSkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MyCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA2KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDcpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMwkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwOCkKKworLyoKKyAqIERldmljZSBJRCBSZWdpc3RlciBGMDAxaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0RFVklDRV9ERU5TSVRZX1NISUZUCSg0KQorI2RlZmluZSBPTkVOQU5EX0RFVklDRV9JU19ERFAJCSgxIDw8IDMpCisjZGVmaW5lIE9ORU5BTkRfREVWSUNFX0lTX0RFTVVYCQkoMSA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0RFVklDRV9WQ0NfTUFTSwkJKDB4MykKKworI2RlZmluZSBPTkVOQU5EX0RFVklDRV9ERU5TSVRZXzUxMk1iCSgweDAwMikKKworLyoKKyAqIFZlcnNpb24gSUQgUmVnaXN0ZXIgRjAwMmggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9WRVJTSU9OX1BST0NFU1NfU0hJRlQJKDgpCisKKy8qCisgKiBTdGFydCBBZGRyZXNzIDEgRjEwMGggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0REUF9TSElGVAkJKDE1KQorCisvKgorICogU3RhcnQgQWRkcmVzcyA4IEYxMDdoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9GUEFfTUFTSwkJKDB4M2YpCisjZGVmaW5lIE9ORU5BTkRfRlBBX1NISUZUCQkoMikKKyNkZWZpbmUgT05FTkFORF9GU0FfTUFTSwkJKDB4MDMpCisKKy8qCisgKiBTdGFydCBCdWZmZXIgUmVnaXN0ZXIgRjIwMGggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0JTQV9NQVNLCQkoMHgwMykKKyNkZWZpbmUgT05FTkFORF9CU0FfU0hJRlQJCSg4KQorI2RlZmluZSBPTkVOQU5EX0JTQV9CT09UUkFNCQkoMCA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0JTQV9EQVRBUkFNMAkJKDIgPDwgMikKKyNkZWZpbmUgT05FTkFORF9CU0FfREFUQVJBTTEJCSgzIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfQlNDX01BU0sJCSgweDAzKQorCisvKgorICogQ29tbWFuZCBSZWdpc3RlciBGMjIwaCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFQUQJCSgweDAwKQorI2RlZmluZSBPTkVOQU5EX0NNRF9SRUFET09CCQkoMHgxMykKKyNkZWZpbmUgT05FTkFORF9DTURfUFJPRwkJKDB4ODApCisjZGVmaW5lIE9ORU5BTkRfQ01EX1BST0dPT0IJCSgweDFBKQorI2RlZmluZSBPTkVOQU5EX0NNRF9VTkxPQ0sJCSgweDIzKQorI2RlZmluZSBPTkVOQU5EX0NNRF9MT0NLCQkoMHgyQSkKKyNkZWZpbmUgT05FTkFORF9DTURfTE9DS19USUdIVAkJKDB4MkMpCisjZGVmaW5lIE9ORU5BTkRfQ01EX0VSQVNFCQkoMHg5NCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVTRVQJCSgweEYwKQorI2RlZmluZSBPTkVOQU5EX0NNRF9SRUFESUQJCSgweDkwKQorCisvKiBOT1RFOiBUaG9zZSBhcmUgbm90ICpSRUFMKiBjb21tYW5kcyAqLworI2RlZmluZSBPTkVOQU5EX0NNRF9CVUZGRVJSQU0JCSgweDE5NzgpCisKKy8qCisgKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyIEYyMjFoIChSLCBSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9TWU5DX1JFQUQJKDEgPDwgMTUpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfQlJMCQkoMTIpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfQkwJCSg5KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX05PX0VDQwkJKDEgPDwgOCkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9SRFkJCSgxIDw8IDcpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfSU5UCQkoMSA8PCA2KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0lPQkUJCSgxIDw8IDUpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfUkRZX0NPTkYJKDEgPDwgNCkKKworLyoKKyAqIENvbnRyb2xsZXIgU3RhdHVzIFJlZ2lzdGVyIEYyNDBoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9PTkdPCQkoMSA8PCAxNSkKKyNkZWZpbmUgT05FTkFORF9DVFJMX0xPQ0sJCSgxIDw8IDE0KQorI2RlZmluZSBPTkVOQU5EX0NUUkxfTE9BRAkJKDEgPDwgMTMpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9QUk9HUkFNCQkoMSA8PCAxMikKKyNkZWZpbmUgT05FTkFORF9DVFJMX0VSQVNFCQkoMSA8PCAxMSkKKyNkZWZpbmUgT05FTkFORF9DVFJMX0VSUk9SCQkoMSA8PCAxMCkKKyNkZWZpbmUgT05FTkFORF9DVFJMX1JTVEIJCSgxIDw8IDcpCisKKy8qCisgKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIEYyNDFoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfSU5UX01BU1RFUgkJKDEgPDwgMTUpCisjZGVmaW5lIE9ORU5BTkRfSU5UX1JFQUQJCSgxIDw8IDcpCisjZGVmaW5lIE9ORU5BTkRfSU5UX1dSSVRFCQkoMSA8PCA2KQorI2RlZmluZSBPTkVOQU5EX0lOVF9FUkFTRQkJKDEgPDwgNSkKKyNkZWZpbmUgT05FTkFORF9JTlRfUkVTRVQJCSgxIDw8IDQpCisjZGVmaW5lIE9ORU5BTkRfSU5UX0NMRUFSCQkoMCA8PCAwKQorCisvKgorICogTkFORCBGbGFzaCBXcml0ZSBQcm90ZWN0aW9uIFN0YXR1cyBSZWdpc3RlciBGMjRFaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX1dQX1VTCQkJKDEgPDwgMikKKyNkZWZpbmUgT05FTkFORF9XUF9MUwkJCSgxIDw8IDEpCisjZGVmaW5lIE9ORU5BTkRfV1BfTFRTCQkJKDEgPDwgMCkKKworLyoKKyAqIEVDQyBTdGF0dXMgUmVpZ3NlciBGRjAwaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0VDQ18xQklUCQkoMSA8PCAwKQorI2RlZmluZSBPTkVOQU5EX0VDQ18yQklUCQkoMSA8PCAxKQorI2RlZmluZSBPTkVOQU5EX0VDQ18yQklUX0FMTAkJKDB4QUFBQSkKKworI2VuZGlmCS8qIF9fT05FTkFORF9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjMxNDRmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGlicnRjLmEKKworQ09CSlMteSArPSBkYXRlLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvcnRjL2RhdGUuYyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL2RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBhZDkyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvZGF0ZS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEYXRlICYgVGltZSBzdXBwb3J0IGZvciBQaGlsaXBzIFBDRjg1NjMgUlRDCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxydGMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApCisKKyNkZWZpbmUgRkVCUlVBUlkJCTIKKyNkZWZpbmUJU1RBUlRPRlRJTUUJCTE5NzAKKyNkZWZpbmUgU0VDREFZCQkJODY0MDBMCisjZGVmaW5lIFNFQ1lSCQkJKFNFQ0RBWSAqIDM2NSkKKyNkZWZpbmUJbGVhcHllYXIoeWVhcikJCSgoeWVhcikgJSA0ID09IDApCisjZGVmaW5lCWRheXNfaW5feWVhcihhKQkJKGxlYXB5ZWFyKGEpID8gMzY2IDogMzY1KQorI2RlZmluZQlkYXlzX2luX21vbnRoKGEpCShtb250aF9kYXlzWyhhKSAtIDFdKQorCitzdGF0aWMgaW50IG1vbnRoX2RheXNbMTJdID0geworCTMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKK307CisKKy8qCisgKiBUaGlzIG9ubHkgd29ya3MgZm9yIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgLSBpLmUuIGFmdGVyIDE3NTIgKGluIHRoZSBVSykKKyAqLwordm9pZCBHcmVnb3JpYW5EYXkoc3RydWN0IHJ0Y190aW1lICogdG0pCit7CisJaW50IGxlYXBzVG9EYXRlOworCWludCBsYXN0WWVhcjsKKwlpbnQgZGF5OworCWludCBNb250aE9mZnNldFtdID0geyAwLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzQgfTsKKworCWxhc3RZZWFyPXRtLT50bV95ZWFyLTE7CisKKwkvKgorCSAqIE51bWJlciBvZiBsZWFwIGNvcnJlY3Rpb25zIHRvIGFwcGx5IHVwIHRvIGVuZCBvZiBsYXN0IHllYXIKKwkgKi8KKwlsZWFwc1RvRGF0ZSA9IGxhc3RZZWFyLzQgLSBsYXN0WWVhci8xMDAgKyBsYXN0WWVhci80MDA7CisKKwkvKgorCSAqIFRoaXMgeWVhciBpcyBhIGxlYXAgeWVhciBpZiBpdCBpcyBkaXZpc2libGUgYnkgNCBleGNlcHQgd2hlbiBpdCBpcworCSAqIGRpdmlzaWJsZSBieSAxMDAgdW5sZXNzIGl0IGlzIGRpdmlzaWJsZSBieSA0MDAKKwkgKgorCSAqIGUuZy4gMTkwNCB3YXMgYSBsZWFwIHllYXIsIDE5MDAgd2FzIG5vdCwgMTk5NiBpcywgYW5kIDIwMDAgd2lsbCBiZQorCSAqLworCWlmKCh0bS0+dG1feWVhciU0PT0wKSAmJgorCSAgICgodG0tPnRtX3llYXIlMTAwIT0wKSB8fCAodG0tPnRtX3llYXIlNDAwPT0wKSkgJiYKKwkgICAodG0tPnRtX21vbj4yKSkgeworCQkvKgorCQkgKiBXZSBhcmUgcGFzdCBGZWIuIDI5IGluIGEgbGVhcCB5ZWFyCisJCSAqLworCQlkYXk9MTsKKwl9IGVsc2UgeworCQlkYXk9MDsKKwl9CisKKwlkYXkgKz0gbGFzdFllYXIqMzY1ICsgbGVhcHNUb0RhdGUgKyBNb250aE9mZnNldFt0bS0+dG1fbW9uLTFdICsgdG0tPnRtX21kYXk7CisKKwl0bS0+dG1fd2RheT1kYXklNzsKK30KKwordm9pZCB0b190bShpbnQgdGltLCBzdHJ1Y3QgcnRjX3RpbWUgKiB0bSkKK3sKKwlyZWdpc3RlciBpbnQgICAgaTsKKwlyZWdpc3RlciBsb25nICAgaG1zLCBkYXk7CisKKwlkYXkgPSB0aW0gLyBTRUNEQVk7CisJaG1zID0gdGltICUgU0VDREFZOworCisJLyogSG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgYXJlIGVhc3kgKi8KKwl0bS0+dG1faG91ciA9IGhtcyAvIDM2MDA7CisJdG0tPnRtX21pbiA9IChobXMgJSAzNjAwKSAvIDYwOworCXRtLT50bV9zZWMgPSAoaG1zICUgMzYwMCkgJSA2MDsKKworCS8qIE51bWJlciBvZiB5ZWFycyBpbiBkYXlzICovCisJZm9yIChpID0gU1RBUlRPRlRJTUU7IGRheSA+PSBkYXlzX2luX3llYXIoaSk7IGkrKykgeworCQlkYXkgLT0gZGF5c19pbl95ZWFyKGkpOworCX0KKwl0bS0+dG1feWVhciA9IGk7CisKKwkvKiBOdW1iZXIgb2YgbW9udGhzIGluIGRheXMgbGVmdCAqLworCWlmIChsZWFweWVhcih0bS0+dG1feWVhcikpIHsKKwkJZGF5c19pbl9tb250aChGRUJSVUFSWSkgPSAyOTsKKwl9CisJZm9yIChpID0gMTsgZGF5ID49IGRheXNfaW5fbW9udGgoaSk7IGkrKykgeworCQlkYXkgLT0gZGF5c19pbl9tb250aChpKTsKKwl9CisJZGF5c19pbl9tb250aChGRUJSVUFSWSkgPSAyODsKKwl0bS0+dG1fbW9uID0gaTsKKworCS8qIERheXMgYXJlIHdoYXQgaXMgbGVmdCBvdmVyICgrMSkgZnJvbSBhbGwgdGhhdC4gKi8KKwl0bS0+dG1fbWRheSA9IGRheSArIDE7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgZGF5IG9mIHdlZWsKKwkgKi8KKwlHcmVnb3JpYW5EYXkodG0pOworfQorCisvKiBDb252ZXJ0cyBHcmVnb3JpYW4gZGF0ZSB0byBzZWNvbmRzIHNpbmNlIDE5NzAtMDEtMDEgMDA6MDA6MDAuCisgKiBBc3N1bWVzIGlucHV0IGluIG5vcm1hbCBkYXRlIGZvcm1hdCwgaS5lLiAxOTgwLTEyLTMxIDIzOjU5OjU5CisgKiA9PiB5ZWFyPTE5ODAsIG1vbj0xMiwgZGF5PTMxLCBob3VyPTIzLCBtaW49NTksIHNlYz01OS4KKyAqCisgKiBbRm9yIHRoZSBKdWxpYW4gY2FsZW5kYXIgKHdoaWNoIHdhcyB1c2VkIGluIFJ1c3NpYSBiZWZvcmUgMTkxNywKKyAqIEJyaXRhaW4gJiBjb2xvbmllcyBiZWZvcmUgMTc1MiwgYW55d2hlcmUgZWxzZSBiZWZvcmUgMTU4MiwKKyAqIGFuZCBpcyBzdGlsbCBpbiB1c2UgYnkgc29tZSBjb21tdW5pdGllcykgbGVhdmUgb3V0IHRoZQorICogLXllYXIvMTAwK3llYXIvNDAwIHRlcm1zLCBhbmQgYWRkIDEwLl0KKyAqCisgKiBUaGlzIGFsZ29yaXRobSB3YXMgZmlyc3QgcHVibGlzaGVkIGJ5IEdhdXNzIChJIHRoaW5rKS4KKyAqCisgKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcmZsb3cgb24gMjEwNi0wMi0wNyAwNjoyODoxNiBvbgorICogbWFjaGluZXMgd2VyZSBsb25nIGlzIDMyLWJpdCEgKEhvd2V2ZXIsIGFzIHRpbWVfdCBpcyBzaWduZWQsIHdlCisgKiB3aWxsIGFscmVhZHkgZ2V0IHByb2JsZW1zIGF0IG90aGVyIHBsYWNlcyBvbiAyMDM4LTAxLTE5IDAzOjE0OjA4KQorICovCit1bnNpZ25lZCBsb25nCitta3RpbWUgKHVuc2lnbmVkIGludCB5ZWFyLCB1bnNpZ25lZCBpbnQgbW9uLAorCXVuc2lnbmVkIGludCBkYXksIHVuc2lnbmVkIGludCBob3VyLAorCXVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBzZWMpCit7CisJaWYgKDAgPj0gKGludCkgKG1vbiAtPSAyKSkgewkvKiAxLi4xMiAtPiAxMSwxMiwxLi4xMCAqLworCQltb24gKz0gMTI7CQkvKiBQdXRzIEZlYiBsYXN0IHNpbmNlIGl0IGhhcyBsZWFwIGRheSAqLworCQl5ZWFyIC09IDE7CisJfQorCisJcmV0dXJuICgoKAorCQkodW5zaWduZWQgbG9uZykgKHllYXIvNCAtIHllYXIvMTAwICsgeWVhci80MDAgKyAzNjcqbW9uLzEyICsgZGF5KSArCisJCQl5ZWFyKjM2NSAtIDcxOTQ5OQorCSAgICApKjI0ICsgaG91ciAvKiBub3cgaGF2ZSBob3VycyAqLworCSAgKSo2MCArIG1pbiAvKiBub3cgaGF2ZSBtaW51dGVzICovCisJKSo2MCArIHNlYzsgLyogZmluYWxseSBzZWNvbmRzICovCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg0YmU0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYtMjAwOQorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJOj0gJChvYmopbGlic2VyaWFsLmEKKworQ09CSlMteSArPSBuczE2NTUwLm8KK0NPQkpTLXkgKz0gc2VyaWFsLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL25zMTY1NTAuYyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL25zMTY1NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE1YzEyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvbnMxNjU1MC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKiAgCisgKiBDT00xIE5TMTY1NTAgc3VwcG9ydAorICogb3JpZ2luYWxseSBmcm9tIGxpbnV4IHNvdXJjZSAoYXJjaC9wcGMvYm9vdC9uczE2NTUwLmMpCisgKiBtb2RpZmllZCB0byB1c2UgQ0ZHX0lTQV9NRU0gYW5kIG5ldyBkZWZpbmVzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgQ0ZHX1BSSU5URgorI2lmZGVmIENGR19OUzE2NTUwCisKKyNpbmNsdWRlIDxuczE2NTUwLmg+CisKKyNkZWZpbmUgTENSVkFMIExDUl84TjEJCQkJCS8qIDggZGF0YSwgMSBzdG9wLCBubyBwYXJpdHkgKi8KKyNkZWZpbmUgTUNSVkFMIChNQ1JfRFRSIHwgTUNSX1JUUykJCQkvKiBSVFMvRFRSICovCisjZGVmaW5lIEZDUlZBTCAoRkNSX0ZJRk9fRU4gfCBGQ1JfUlhTUiB8IEZDUl9UWFNSKQkvKiBDbGVhciAmIGVuYWJsZSBGSUZPcyAqLworCit2b2lkIE5TMTY1NTBfaW5pdCAoTlMxNjU1MF90IGNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKQoreworCWNvbV9wb3J0LT5pZXIgPSAweDAwOworI2lmZGVmIENPTkZJR19PTUFQCisJY29tX3BvcnQtPm1kcjEgPSAweDc7ICAgLyogbW9kZSBzZWxlY3QgcmVzZXQgVEwxNkM3NTAqLworI2VuZGlmCisJY29tX3BvcnQtPmxjciA9IExDUl9CS1NFIHwgTENSVkFMOworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOworCWNvbV9wb3J0LT5kbG0gPSAoYmF1ZF9kaXZpc29yID4+IDgpICYgMHhmZjsKKwljb21fcG9ydC0+bGNyID0gTENSVkFMOworCWNvbV9wb3J0LT5tY3IgPSBNQ1JWQUw7CisJY29tX3BvcnQtPmZjciA9IEZDUlZBTDsKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQKQorCWNvbV9wb3J0LT5tZHIxID0gMDsJLyogc2VsZWN0IHVhcnQgbW9kZSAqLworI2VuZGlmCit9CisKK3ZvaWQgTlMxNjU1MF9yZWluaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcikKK3sKKwljb21fcG9ydC0+aWVyID0gMHgwMDsKKwljb21fcG9ydC0+bGNyID0gTENSX0JLU0U7CisJY29tX3BvcnQtPmRsbCA9IGJhdWRfZGl2aXNvciAmIDB4ZmY7CisJY29tX3BvcnQtPmRsbSA9IChiYXVkX2Rpdmlzb3IgPj4gOCkgJiAweGZmOworCWNvbV9wb3J0LT5sY3IgPSBMQ1JWQUw7CisJY29tX3BvcnQtPm1jciA9IE1DUlZBTDsKKwljb21fcG9ydC0+ZmNyID0gRkNSVkFMOworfQorCit2b2lkIE5TMTY1NTBfcHV0YyAoTlMxNjU1MF90IGNvbV9wb3J0LCBjaGFyIGMpCit7CisJd2hpbGUgKChjb21fcG9ydC0+bHNyICYgTFNSX1RIUkUpID09IDApOworCWNvbV9wb3J0LT50aHIgPSBjOworfQorCitjaGFyIE5TMTY1NTBfZ2V0YyAoTlMxNjU1MF90IGNvbV9wb3J0KQoreworCXdoaWxlICgoY29tX3BvcnQtPmxzciAmIExTUl9EUikgPT0gMCk7CisJcmV0dXJuIChjb21fcG9ydC0+cmJyKTsKK30KKworaW50IE5TMTY1NTBfdHN0YyAoTlMxNjU1MF90IGNvbV9wb3J0KQoreworCXJldHVybiAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfRFIpICE9IDApOworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvc2VyaWFsLmMgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWVjZjJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvc2VyaWFsLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gcm9idEBmbHlpbmdwaWcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19QUklOVEYKKyNpZmRlZiBDRkdfTlMxNjU1MF9TRVJJQUwKKworI2luY2x1ZGUgPG5zMTY1NTAuaD4KKyNpZmRlZiBDRkdfTlM4NzMwOAorI2luY2x1ZGUgPG5zODczMDguaD4KKyNlbmRpZgorCisjaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMQorc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMTsKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDIKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTI7CisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAzCitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT00zOworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gNAorc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NNDsKKyNlbHNlCisjZXJyb3Igbm8gdmFsaWQgY29uc29sZSBkZWZpbmVkCisjZW5kaWYKKworc3RhdGljIGludCBjYWxjX2Rpdmlzb3IgKHZvaWQpCit7CisvLwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKKwkvKiBJZiBjYW4ndCBjbGVhbmx5IGNsb2NrIDExNTIwMCBzZXQgZGl2IHRvIDEgKi8KKwlpZiAoKENGR19OUzE2NTUwX0NMSyA9PSAxMjAwMDAwMCkgJiYgKENPTkZJR19CQVVEUkFURSA9PSAxMTUyMDApKSB7CisJCWNvbnNvbGUtPm9zY18xMm1fc2VsID0gT1NDXzEyTV9TRUw7CS8qIGVuYWJsZSA2LjUgKiBkaXZpc29yICovCisJCXJldHVybiAoMSk7CQkJCS8qIHJldHVybiAxIGZvciBiYXNlIGRpdmlzb3IgKi8KKwl9CisJY29uc29sZS0+b3NjXzEybV9zZWwgPSAwOwkJCS8qIGNsZWFyIGlmIHByZXZpc291bHkgc2V0ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTYxMCkgfHwgZGVmaW5lZChDT05GSUdfT01BUDE3MTApCisJLyogSWYgY2FuJ3QgY2xlYW5seSBjbG9jayAxMTUyMDAgc2V0IGRpdiB0byAxICovCisJaWYgKChDRkdfTlMxNjU1MF9DTEsgPT0gNDgwMDAwMDApICYmIChDT05GSUdfQkFVRFJBVEUgPT0gMTE1MjAwKSkgeworCQlyZXR1cm4gKDI2KTsJCS8qIHJldHVybiAyNiBmb3IgYmFzZSBkaXZpc29yICovCisJfQorI2VuZGlmCisJcmV0dXJuIChDRkdfTlMxNjU1MF9DTEsgLyAxNiAvIENPTkZJR19CQVVEUkFURSk7Cit9CisKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwlpbnQgY2xvY2tfZGl2aXNvciA9IGNhbGNfZGl2aXNvcigpOworCisjaWZkZWYgQ0ZHX05TODczMDgKKwlpbml0aWFsaXNlX25zODczMDgoKTsKKyNlbmRpZgorCisJTlMxNjU1MF9pbml0KGNvbnNvbGUsIGNsb2NrX2Rpdmlzb3IpOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorc2VyaWFsX3B1dGMoY29uc3QgY2hhciBjKQoreworCWlmIChjID09ICdcbicpCisJCU5TMTY1NTBfcHV0Yyhjb25zb2xlLCAnXHInKTsKKworCU5TMTY1NTBfcHV0Yyhjb25zb2xlLCBjKTsKK30KKwordm9pZAorc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKKworaW50CitzZXJpYWxfZ2V0Yyh2b2lkKQoreworCXJldHVybiBOUzE2NTUwX2dldGMoY29uc29sZSk7Cit9CisKK2ludAorc2VyaWFsX3RzdGModm9pZCkKK3sKKwlyZXR1cm4gTlMxNjU1MF90c3RjKGNvbnNvbGUpOworfQorCit2b2lkCitzZXJpYWxfc2V0YnJnICh2b2lkKQoreworCWludCBjbG9ja19kaXZpc29yOworCisgICAgY2xvY2tfZGl2aXNvciA9IGNhbGNfZGl2aXNvcigpOworCU5TMTY1NTBfcmVpbml0KGNvbnNvbGUsIGNsb2NrX2Rpdmlzb3IpOworfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy91c2IvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL3VzYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDlkMTAxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy91c2IvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYtMjAwOQorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJOj0gJChvYmopbGlidXNiLmEKKworQ09CSlMteSArPSB1c2IubworCitDT0JKUwk6PSAkKHNvcnQgJChDT0JKUy15KSkKK1NSQ1MJOj0gJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorCithbGw6CSQoTElCKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmMgYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY0NjdmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBVU0IgYm9vdGxvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSaWNrIEJyb25zb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKyNpbmNsdWRlICJ1c2IuaCIKKworZXh0ZXJuIHZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWNzKTsKKwordHlwZWRlZiBpbnQgYm9vdF9vc19mbiAodm9pZCk7CisKKy8qIHNlbmQgYSBwYWNrZXQgdmlhIFVTQiAqLworaW50IHVzYl9zZW5kX3BhY2tldCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZSkKKyAgIHsKKyAgIGludCByZXQgPSAwOworCisgICBpZiAoISgqcGVyaV90eGNzciAmIE1VU0JfVFhDU1JfVFhQS1RSRFkpKQorICAgICAgIHsKKyAgICAgICB1bnNpZ25lZCBpbnQgY250cjsKKworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBwYWNrZXRfc2l6ZTsgY250cisrKQorICAgICAgICAgICAqYnVsa19maWZvID0gYnVmZmVyW2NudHJdOworCisgICAgICAgKnBlcmlfdHhjc3IgfD0gTVVTQl9UWENTUl9UWFBLVFJEWTsKKworICAgICAgIHJldCA9IHBhY2tldF9zaXplOworICAgICAgIH0KKyAgIHJldHVybiByZXQ7CisgICB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgdXNiX3JlY3YgKHU4ICpidWZmZXIsIGludCBzaXplKQoreworICAgaW50IGNudHI7CisgICB1MTYgY291bnQgPSAwOworCisgICBpZiAoKnBlcmlfcnhjc3IgJiBNVVNCX1JYQ1NSX1JYUEtUUkRZKQorICAgICAgIHsKKyAgICAgICBjb3VudCA9ICpyeGNvdW50OworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBjb3VudDsgY250cisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICpidWZmZXIrKyA9ICpidWxrX2ZpZm87CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLyogQ2xlYXIgdGhlIFJYUEtUUkRZIGJpdCAqLworICAgICAgICpwZXJpX3J4Y3NyICY9IH5NVVNCX1JYQ1NSX1JYUEtUUkRZOworICAgICAgIH0KKyAgIHJldHVybiBjb3VudDsgIC8qIEZJWE1FICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVzYl9vdXRidWZmZXJbUlhfRU5EUE9JTlRfTUFYSU1VTV9QQUNLRVRfU0laRV8yXzBdOworCitpbnQgdXNiX3NlbmRfYnVmZmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplKQoreworICAgIGludCBidWZmZXJfaW5kZXggPSAwLAorICAgICAgICBwYWNrZXRfc2l6ZSwKKyAgICAgICAgcmV0dmFsID0gMDsKKworICAgIHdoaWxlICgoYnVmZmVyX2luZGV4IDwgYnVmZmVyX3NpemUpICYmCisgICAgICAgICAgIChyZXR2YWwgPT0gMCkpIHsKKyAgICAgICAgcGFja2V0X3NpemUgPSBSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzJfMDsKKyAgICAgICAgaWYgKChidWZmZXJfaW5kZXggKyBwYWNrZXRfc2l6ZSkgPiBidWZmZXJfc2l6ZSkKKyAgICAgICAgICAgIHBhY2tldF9zaXplID0gYnVmZmVyX3NpemUgLSBidWZmZXJfaW5kZXg7CisKKyAgICAgICAgcmV0dmFsID0gdXNiX3NlbmRfcGFja2V0KCZidWZmZXJbYnVmZmVyX2luZGV4XSwgcGFja2V0X3NpemUpOworICAgICAgICBpZiAocmV0dmFsID09IHBhY2tldF9zaXplKSB7CisgICAgICAgICAgICBidWZmZXJfaW5kZXggKz0gcGFja2V0X3NpemU7CisgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICB9CisgICB9CisKKyAgIHJldHVybiBidWZmZXJfaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9tc2cgKHVuc2lnbmVkIGludCBjbWQsIGNvbnN0IGNoYXIgKm1zZykKKyAgIHsKKyAgIHVuc2lnbmVkIGNoYXIgKnBfY2hhciA9IHVzYl9vdXRidWZmZXI7CisKKyAgICogKGludCAqKSBwX2NoYXIgPSBjbWQ7CisgICBwX2NoYXIgKz0gc2l6ZW9mIChjbWQpOworICAgaWYgKG1zZykKKyAgICAgICB7CisgICAgICAgd2hpbGUgKCptc2cpCisgICAgICAgICAgICpwX2NoYXIrKz0gKm1zZysrOworICAgICAgICpwX2NoYXIrKz0gMDsKKyAgICAgICB9CisgICB1c2Jfc2VuZF9wYWNrZXQgKHVzYl9vdXRidWZmZXIsIHBfY2hhciAtIHVzYl9vdXRidWZmZXIpOworICAgfQorCitzdGF0aWMgdm9pZCB1c2JfY29kZSAodW5zaWduZWQgaW50IGNtZCwgdTMyIGNvZGUxLCB1MzIgY29kZTIpCisgICB7CisgICB1bnNpZ25lZCBpbnQgKnBfaW50ID0gKHVuc2lnbmVkIGludCAqKSB1c2Jfb3V0YnVmZmVyOworCisgICAqcF9pbnQrKyA9IGNtZDsKKyAgICpwX2ludCsrID0gY29kZTE7CisgICAqcF9pbnQrKyA9IGNvZGUyOworICAgdXNiX3NlbmRfcGFja2V0ICh1c2Jfb3V0YnVmZmVyLCAoKHVuc2lnbmVkIGNoYXIgKikgcF9pbnQpIC0gdXNiX291dGJ1ZmZlcik7CisgICB9CisKK3ZvaWQgZG9fdXNiICh2b2lkKQorICAgeworICAgYm9vdF9vc19mbiAqYm9vdF9mbjsKKyAgIGludCByZXM7CisgICB1MzIgdXNiX2luYnVmZmVyW1JYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wXTsKKyAgIHUzMiB0b3RhbDsKKyAgIHU4ICphZGRyOworICAgdTMyIGJ5dGVzOworICAgaW50IGNudHIgPSAwOworCisgICB1c2JfbXNnIChVU0JMT0FEX0NNRF9GSUxFX1JFUSwgImZpbGUgcmVxIik7CisgICB3aGlsZSgrK2NudHIgPCAyMDAwMDApICAvKiB0cnkgZm9yIDEgc2Vjb25kIHRoZW4gYmFpbCBvdXQgKi8KKyAgICAgICB7CisgICAgICAgcmVzID0gdXNiX3JlY3YgKCh1OCAqKSB1c2JfaW5idWZmZXIsIHNpemVvZiAodXNiX2luYnVmZmVyKSk7CisgICAgICAgaWYgKChyZXMgPT0gVVNCTE9BRF9DTURfUkVTUE9OU0VfTEVOKSAmJiAodXNiX2luYnVmZmVyWzBdID09IFVTQkxPQURfQ01EX0ZJTEUpKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICB0b3RhbCA9IHVzYl9pbmJ1ZmZlclsxXTsgIC8qIGdldCBzaXplIGFuZCBhZGRyZXNzICovCisgICAgICAgICAgICAgICBhZGRyID0gKHU4ICopIHVzYl9pbmJ1ZmZlclsyXTsKKyAgICAgICAgICAgICAgIHByaW50ZiAoIlVTQkxPQURfQ01EX0ZJTEU6ICU4dUIgQCAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWRkcik7CisgICAgICAgICAgICAgICB1c2JfY29kZSAoVVNCTE9BRF9DTURfRUNIT19TWiwgdG90YWwsIDApOworCisgICAgICAgICAgICAgICBieXRlcyA9IDA7CisgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXMgPCB0b3RhbCkKKyAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gdXNiX3JlY3YoJigodTggKilhZGRyKVtieXRlc10sICh0b3RhbCAtIGJ5dGVzKSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgdXNiX2NvZGUgKFVTQkxPQURfQ01EX1JFUE9SVF9TWiwgdG90YWwsIDApOyAgLyogdGVsbCBoaW0gd2UgZ290IHRoaXMgbWFueSBieXRlcyAqLworICAgICAgICAgICAgICAgcHJpbnRmICgiUmVjZWl2ZWQgZmlsZSBPS1xuIik7CisgICAgICAgICAgICAgICB1c2JfbXNnIChVU0JMT0FEX0NNRF9GSUxFX1JFUSwgImZpbGUgcmVxIik7ICAvKiBzZWUgaWYgdGhleSBoYXZlIGFub3RoZXIgZmlsZSBmb3IgdXMgKi8KKyAgICAgICAgICAgICAgIGNudHIgPSAwOworICAgICAgICAgICB9CisgICAgICAgZWxzZSBpZiAoKHJlcyA9PSBVU0JMT0FEX0NNRF9SRVNQT05TRV9MRU4pICYmICh1c2JfaW5idWZmZXJbMF0gPT0gVVNCTE9BRF9DTURfSlVNUCkpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZiAoIlVTQkxPQURfQ01EX0pVTVA6IGFkZHIgPSAweCV4XG4iLCB1c2JfaW5idWZmZXJbMV0pOworICAgICAgICAgICAgICAgYm9vdF9mbiA9IChib290X29zX2ZuICopIHVzYl9pbmJ1ZmZlclsxXTsKKyAgICAgICAgICAgICAgIGJvb3RfZm4oKTsgIC8qIGdvIHRvIHUtYm9vdCBhbmQgbWF5YmUga2VybmVsICovCisgICAgICAgICAgIH0KKyAgICAgICBlbHNlIGlmIChyZXMgPiAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwcmludGYgKCJVbnJlY29nbml6ZWQgJWRCIGNvbW1hbmQ6ICVjJWMlYyVjXG4iLCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciopdXNiX2luYnVmZmVyKVswXSwgKChjaGFyKil1c2JfaW5idWZmZXIpWzFdLCAoKGNoYXIqKXVzYl9pbmJ1ZmZlcilbMl0sICgoY2hhciopdXNiX2luYnVmZmVyKVszXSk7CisgICAgICAgICAgIH0KKworICAgICAgIHVkZWxheSgxMDAwKTsgIC8qIGRlbGF5IDEgbXMgLS0gc3VzcGVjdCBjbG9ja3MgYXJlbid0IGNvbmZpZ3VyZWQgYXMgZXhwZWN0ZWQsIHJlc3VsdGluZyBpbiBhIHNpZ25pZmljYW50bHkgc2hvcnRlciBkZWxheSAqLworICAgICAgIH0KKyAgICAgICBwcmludGYoIlVTQiBkb25lXG4iKTsKKyAgICAgICBoYW5nKCk7CisgICB9CmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuaCBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjRlYTMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogVVNCIGJvb3Rsb2FkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmljayBCcm9uc29uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1VTQl9IXworI2RlZmluZSBfVVNCX0hfCisKKyNkZWZpbmUgT01BUDM0WFhfVVNCX0JBU0UgICAgIChPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UgKyAweEFCMDAwKQorCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9FUChuKSAgICAgICAgIChPTUFQMzRYWF9VU0JfQkFTRSArIDB4MTAwICsgMHgxMCoobikpCisKKyNkZWZpbmUgTVVTQl9SWENTUiAgICAgMHgwNgorI2RlZmluZSBNVVNCX1JYQ09VTlQgICAgICAgMHgwOAorI2RlZmluZSBNVVNCX1RYQ1NSICAgICAweDAyCisjZGVmaW5lIE1VU0JfRklGT1NJWkUgICAgICAweDBGCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9SWENTUihuKSAgICAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX1JYQ1NSKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfUlhDT1VOVChuKSAgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9SWENPVU5UKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfVFhDU1IobikgICAgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9UWENTUikKKyNkZWZpbmUgT01BUDM0WFhfVVNCX0ZJRk9TSVpFKG4pICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfRklGT1NJWkUpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9GSUZPKG4pICAgICAgIChPTUFQMzRYWF9VU0JfQkFTRSArIDB4MjAgKyAoKG4pICogNCkpCisKKy8qIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJVTEtfRU5EUE9JTlQgMQorc3RhdGljIHZvbGF0aWxlIHUxNiAqcGVyaV9yeGNzciA9ICh2b2xhdGlsZSB1MTYgKikgT01BUDM0WFhfVVNCX1JYQ1NSKEJVTEtfRU5EUE9JTlQpOworI2RlZmluZSBNVVNCX1JYQ1NSX1JYUEtUUkRZICAgICAgICAweDAwMDEKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnJ4Y291bnQgICAgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9SWENPVU5UKEJVTEtfRU5EUE9JTlQpOworc3RhdGljIHZvbGF0aWxlIHUxNiAqcGVyaV90eGNzciA9ICh2b2xhdGlsZSB1MTYgKikgT01BUDM0WFhfVVNCX1RYQ1NSKEJVTEtfRU5EUE9JTlQpOworI2RlZmluZSBNVVNCX1RYQ1NSX1RYUEtUUkRZICAgICAgICAweDAwMDEKK3N0YXRpYyB2b2xhdGlsZSB1OCAgKmJ1bGtfZmlmbyAgPSAodm9sYXRpbGUgdTggICopIE9NQVAzNFhYX1VTQl9GSUZPKEJVTEtfRU5EUE9JTlQpOworCisvKiBJbiBoaWdoIHNwZWVkIG1vZGUgcGFja2V0cyBhcmUgNTEyCisgICBJbiBmdWxsIHNwZWVkIG1vZGUgcGFja2V0cyBhcmUgNjQgKi8KKyNkZWZpbmUgUlhfRU5EUE9JTlRfTUFYSU1VTV9QQUNLRVRfU0laRV8yXzAgICgweDAyMDApCisjZGVmaW5lIFJYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMV8xICAoMHgwMDQwKQorCisjZGVmaW5lIE1JTihhLGIpICggKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKKyNkZWZpbmUgUEFDSzQoYSxiLGMsZCkgICAgICgoKGQpPDwyNCkgfCAoKGMpPDwxNikgfCAoKGIpPDw4KSB8IChhKSkKKyNkZWZpbmUgVVNCTE9BRF9DTURfRklMRSBQQUNLNCgnVScsICdTJywgJ0InLCAncycpICAvKiBzZW5kIGZpbGUgc2l6ZSAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9KVU1QIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdqJykgIC8qIGdvIHdoZXJlIEkgdGVsbCB5b3UgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfRklMRV9SRVEgUEFDSzQoJ1UnLCAnUycsICdCJywgJ2YnKSAgLyogZmlsZSByZXF1ZXN0ICovCisjZGVmaW5lIFVTQkxPQURfQ01EX0VDSE9fU1ogUEFDSzQoJ1UnLCAnUycsICdCJywgJ24nKSAgLyogZWNobyBmaWxlIHNpemUgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfUkVQT1JUX1NaIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdvJykgIC8qIHJlcG9ydCBmaWxlIHNpemUgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfTUVTU0FHRSBQQUNLNCgnVScsICdTJywgJ0InLCAnbScpICAvKiBtZXNzYWdlIGZvciBkZWJ1ZyAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9OQU5EX0RVTVAgUEFDSzQoJ1UnLCAnUycsICdCJywgJ2QnKSAgLyogZHVtcCBOQU5EICovCisjZGVmaW5lIFVTQkxPQURfQ01EX05BTkRfT09CX0RVTVAgUEFDSzQoJ1UnLCAnUycsICdCJywgJ2InKSAgLyogZHVtcCBOQU5EIE9PQiAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9OQU5EX0RVTVBfU1ogUEFDSzQoJ1UnLCAnUycsICdCJywgJ3InKSAgLyogZHVtcCBzaXplICovCisKKyNkZWZpbmUgVVNCTE9BRF9DTURfUkVTUE9OU0VfTEVOIDEyCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9NYWtlZmlsZSBiL3gtbG9hZGVyL2ZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0MTliOTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMQorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworIworCitTVUJESVJTCTo9IGZhdAorCisuZGVwZW5kIGFsbDoKKwlAZm9yIGRpciBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCQkkKE1BS0UpIC1DICQkZGlyICRAIDsgZG9uZQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvZmF0L01ha2VmaWxlIGIveC1sb2FkZXIvZnMvZmF0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3YWY3M2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUKQEAgLTAsMCArMSw0NSBAQAorIworIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliZmF0LmEKKworQU9CSlMJPQorQ09CSlMJPSBmYXQubyBmaWxlLm8KKworU1JDUwk6PSAkKEFPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChBT0JKUykgJChDT0JKUykpCisKK2FsbDoJJChMSUIpICQoQU9CSlMpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL2ZhdC9mYXQuYyBiL3gtbG9hZGVyL2ZzL2ZhdC9mYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzYzODgxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZnMvZmF0L2ZhdC5jCkBAIC0wLDAgKzEsOTI4IEBACisvKgorICogZmF0LmMKKyAqCisgKiBSL08gKFYpRkFUIDEyLzE2LzMyIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24gYnkgTWFyY3VzIFN1bmRiZXJnCisgKgorICogMjAwMi0wNy0yOCAtIHJqb25lc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byBwcGNib290IHYxLjEuNgorICogMjAwMy0wMy0xMCAtIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gdWJvb3QKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIENGR19DTURfRkFUCisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGxvd2VyY2FzZS4KKyAqLworc3RhdGljIHZvaWQKK2Rvd25jYXNlKGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCVRPTE9XRVIoKnN0cik7CisJCXN0cisrOworCX0KK30KKworc3RhdGljICBibG9ja19kZXZfZGVzY190ICpjdXJfZGV2ID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnRfb2Zmc2V0ID0gMDsKK3N0YXRpYyBpbnQgY3VyX3BhcnQgPSAxOworCisjZGVmaW5lIERPU19QQVJUX1RCTF9PRkZTRVQJMHgxYmUKKyNkZWZpbmUgRE9TX1BBUlRfTUFHSUNfT0ZGU0VUCTB4MWZlCisjZGVmaW5lIERPU19GU19UWVBFX09GRlNFVAkweDUyCisKK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3Qsc2l6ZV90IGNvdW50KQoreworICAgICAgICByZWdpc3RlciBzaWduZWQgY2hhciBfX3JlcyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKChfX3JlcyA9ICpjcyAtICpjdCsrKSAhPSAwIHx8ICEqY3MrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX19yZXM7Cit9CisKK2NoYXIgKiBzdHJjcHkoY2hhciAqIGRlc3QsY29uc3QgY2hhciAqc3JjKQoreworICAgICAgICBjaGFyICp0bXAgPSBkZXN0OworCisgICAgICAgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nICovOworICAgICAgICByZXR1cm4gdG1wOworfQorCitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QpCit7CisgICAgICAgIHJlZ2lzdGVyIHNpZ25lZCBjaGFyIF9fcmVzOworCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgaWYgKChfX3JlcyA9ICpjcyAtICpjdCsrKSAhPSAwIHx8ICEqY3MrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9fcmVzOworfQordm9pZCAqIG1lbWNweSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworICAgICAgICBjaGFyICp0bXAgPSAoY2hhciAqKSBkZXN0LCAqcyA9IChjaGFyICopIHNyYzsKKworICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgICAgICAgICAqdG1wKysgPSAqcysrOworCisgICAgICAgIHJldHVybiBkZXN0OworfQorCisKK2ludCBkaXNrX3JlYWQgKF9fdTMyIHN0YXJ0YmxvY2ssIF9fdTMyIGdldHNpemUsIF9fdTggKiBidWZwdHIpCit7CisJc3RhcnRibG9jayArPSBwYXJ0X29mZnNldDsKKwlpZiAoY3VyX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJaWYgKGN1cl9kZXYtPmJsb2NrX3JlYWQpIHsKKwkJcmV0dXJuIGN1cl9kZXYtPmJsb2NrX3JlYWQgKGN1cl9kZXYtPmRldiwgc3RhcnRibG9jaywgZ2V0c2l6ZSwgKHVuc2lnbmVkIGxvbmcgKilidWZwdHIpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworaW50CitmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcltTRUNUT1JfU0laRV07CisKKwlpZiAoIWRldl9kZXNjLT5ibG9ja19yZWFkKQorCQlyZXR1cm4gLTE7CisJY3VyX2Rldj1kZXZfZGVzYzsKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGEgTUJSIChvbiBmbG9wcGllcyB3ZSBoYXZlIG9ubHkgYSBQQlIpICovCisJaWYgKGRldl9kZXNjLT5ibG9ja19yZWFkIChkZXZfZGVzYy0+ZGV2LCAwLCAxLCAodWxvbmcgKikgYnVmZmVyKSAhPSAxKSB7CisJCXByaW50ZiAoIioqIENhbid0IHJlYWQgZnJvbSBkZXZpY2UgJWQgKipcbiIsIGRldl9kZXNjLT5kZXYpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChidWZmZXJbRE9TX1BBUlRfTUFHSUNfT0ZGU0VUXSAhPSAweDU1IHx8CisJCWJ1ZmZlcltET1NfUEFSVF9NQUdJQ19PRkZTRVQgKyAxXSAhPSAweGFhKSB7CisJCS8qIG5vIHNpZ25hdHVyZSBmb3VuZCAqLworCQlyZXR1cm4gLTE7CisJfQorCWlmKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCJGQVQiLDMpKSB7CisJCS8qIG9rLCB3ZSBhc3N1bWUgd2UgYXJlIG9uIGEgUEJSIG9ubHkgKi8KKwkJY3VyX3BhcnQgPSAxOworCQlwYXJ0X29mZnNldD0wOworCX0KKwllbHNlIHsKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpIHx8IFwKKyAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKQorCQlkaXNrX3BhcnRpdGlvbl90IGluZm87CisJCWlmKCFnZXRfcGFydGl0aW9uX2luZm8oZGV2X2Rlc2MsIHBhcnRfbm8sICZpbmZvKSkgeworCQkJcGFydF9vZmZzZXQgPSBpbmZvLnN0YXJ0OworCQkJY3VyX3BhcnQgPSBwYXJ0X25vOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRmICgiKiogUGFydGl0aW9uICVkIG5vdCB2YWxpZCBvbiBkZXZpY2UgJWQgKipcbiIscGFydF9ubyxkZXZfZGVzYy0+ZGV2KTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2Vsc2UKKwkJLyogRklYTUUgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZQorCQkgKiBwYXJ0aXRpb24gd2hlcmUgdGhlIERPUyBGUyByZXNpZGVzLiBUaGlzIGNhbiBiZSBkb25lCisJCSAqIGJ5IHVzaW5nIHRoZSBnZXRfcGFydGl0aW9uX2luZm8gcm91dGluZS4gRm9yIHRoaXMKKwkJICogcHVycG9zZSB0aGUgbGlicGFydCBtdXN0IGJlIGluY2x1ZGVkLgorCQkgKi8KKwkJcGFydF9vZmZzZXQ9NjM7CisJCS8vcGFydF9vZmZzZXQ9MDsKKwkJY3VyX3BhcnQgPSAxOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBHZXQgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIGRpcmVjdG9yeSBkZWxpbWl0ZXIgKCcvJyBvciAnXCcpIGluIGEgc3RyaW5nLgorICogUmV0dXJuIGluZGV4IGludG8gc3RyaW5nIGlmIGZvdW5kLCAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2RpcmRlbGltKGNoYXIgKnN0cikKK3sKKwljaGFyICpzdGFydCA9IHN0cjsKKworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJaWYgKElTRElSREVMSU0oKnN0cikpIHJldHVybiBzdHIgLSBzdGFydDsKKwkJc3RyKys7CisJfQorCXJldHVybiAtMTsKK30KKworCisvKgorICogTWF0Y2ggdm9sdW1lX2luZm8gZnNfdHlwZSBzdHJpbmdzLgorICogUmV0dXJuIDAgb24gbWF0Y2gsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorY29tcGFyZV9zaWduKGNoYXIgKnN0cjEsIGNoYXIgKnN0cjIpCit7CisJY2hhciAqZW5kID0gc3RyMStTSUdOTEVOOworCisJd2hpbGUgKHN0cjEgIT0gZW5kKSB7CisJCWlmICgqc3RyMSAhPSAqc3RyMikgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cjErKzsKKwkJc3RyMisrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBFeHRyYWN0IHplcm8gdGVybWluYXRlZCBzaG9ydCBuYW1lIGZyb20gYSBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9uYW1lIChkaXJfZW50cnkgKmRpcmVudCwgY2hhciAqc19uYW1lKQoreworCWNoYXIgKnB0cjsKKworCW1lbWNweSAoc19uYW1lLCBkaXJlbnQtPm5hbWUsIDgpOworCXNfbmFtZVs4XSA9ICdcMCc7CisJcHRyID0gc19uYW1lOworCXdoaWxlICgqcHRyICYmICpwdHIgIT0gJyAnKQorCQlwdHIrKzsKKwlpZiAoZGlyZW50LT5leHRbMF0gJiYgZGlyZW50LT5leHRbMF0gIT0gJyAnKSB7CisJCSpwdHIgPSAnLic7CisJCXB0cisrOworCQltZW1jcHkgKHB0ciwgZGlyZW50LT5leHQsIDMpOworCQlwdHJbM10gPSAnXDAnOworCQl3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKKwkJCXB0cisrOworCX0KKwkqcHRyID0gJ1wwJzsKKwlpZiAoKnNfbmFtZSA9PSBERUxFVEVEX0ZMQUcpCisJCSpzX25hbWUgPSAnXDAnOworCWVsc2UgaWYgKCpzX25hbWUgPT0gYVJJTkcpCisJCSpzX25hbWUgPSAn5Sc7CisJZG93bmNhc2UgKHNfbmFtZSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGVudHJ5IGF0IGluZGV4ICdlbnRyeScgaW4gYSBGQVQgKDEyLzE2LzMyKSB0YWJsZS4KKyAqIE9uIGZhaWx1cmUgMHgwMCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIF9fdTMyCitnZXRfZmF0ZW50KGZzZGF0YSAqbXlkYXRhLCBfX3UzMiBlbnRyeSkKK3sKKwlfX3UzMiBidWZudW07CisJX191MzIgb2Zmc2V0OworCV9fdTMyIHJldCA9IDB4MDA7CisKKwlzd2l0Y2ggKG15ZGF0YS0+ZmF0c2l6ZSkgeworCWNhc2UgMzI6CisJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMzJCVUZTSVpFOworCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDMyQlVGU0laRTsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYnVmbnVtID0gZW50cnkgLyBGQVQxNkJVRlNJWkU7CisJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMTZCVUZTSVpFOworCQlicmVhazsKKwljYXNlIDEyOgorCQlidWZudW0gPSBlbnRyeSAvIEZBVDEyQlVGU0laRTsKKwkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQxMkJVRlNJWkU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5zdXBwb3J0ZWQgRkFUIHNpemUgKi8KKwkJcmV0dXJuIHJldDsKKwl9CisJLyogUmVhZCBhIG5ldyBibG9jayBvZiBGQVQgZW50cmllcyBpbnRvIHRoZSBjYWNoZS4gKi8KKwlpZiAoYnVmbnVtICE9IG15ZGF0YS0+ZmF0YnVmbnVtKSB7CisJCWludCBnZXRzaXplID0gRkFUQlVGU0laRS9GU19CTE9DS19TSVpFOworCQlfX3U4ICpidWZwdHIgPSAoX191OCAqKW15ZGF0YS0+ZmF0YnVmOworCQlfX3UzMiBmYXRsZW5ndGggPSBteWRhdGEtPmZhdGxlbmd0aDsKKwkJX191MzIgc3RhcnRibG9jayA9IGJ1Zm51bSAqIEZBVEJVRkJMT0NLUzsKKworCQlmYXRsZW5ndGggKj0gU0VDVE9SX1NJWkU7CS8qIFdlIHdhbnQgaXQgaW4gYnl0ZXMgbm93ICovCisJCXN0YXJ0YmxvY2sgKz0gbXlkYXRhLT5mYXRfc2VjdDsJLyogT2Zmc2V0IGZyb20gc3RhcnQgb2YgZGlzayAqLworCisJCWlmIChnZXRzaXplID4gZmF0bGVuZ3RoKSBnZXRzaXplID0gZmF0bGVuZ3RoOworCQlpZiAoZGlza19yZWFkKHN0YXJ0YmxvY2ssIGdldHNpemUsIGJ1ZnB0cikgPCAwKSB7CisJCQlGQVRfRFBSSU5UKCJFcnJvciByZWFkaW5nIEZBVCBibG9ja3NcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlteWRhdGEtPmZhdGJ1Zm51bSA9IGJ1Zm51bTsKKwl9CisKKwkvKiBHZXQgdGhlIGFjdHVhbCBlbnRyeSBmcm9tIHRoZSB0YWJsZSAqLworCXN3aXRjaCAobXlkYXRhLT5mYXRzaXplKSB7CisJY2FzZSAzMjoKKwkJcmV0ID0gRkFUMkNQVTMyKCgoX191MzIqKW15ZGF0YS0+ZmF0YnVmKVtvZmZzZXRdKTsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJcmV0ID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmZzZXRdKTsKKwkJYnJlYWs7CisJY2FzZSAxMjogeworCQlfX3UzMiBvZmYxNiA9IChvZmZzZXQqMykvNDsKKwkJX191MTYgdmFsMSwgdmFsMjsKKworCQlzd2l0Y2ggKG9mZnNldCAmIDB4MykgeworCQljYXNlIDA6CisJCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CisJCQlyZXQgJj0gMHhmZmY7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJdmFsMSA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKKwkJCXZhbDEgJj0gMHhmMDAwOworCQkJdmFsMiA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTYrMV0pOworCQkJdmFsMiAmPSAweDAwZmY7CisJCQlyZXQgPSAodmFsMiA8PCA0KSB8ICh2YWwxID4+IDEyKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl2YWwxID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOworCQkJdmFsMSAmPSAweGZmMDA7CisJCQl2YWwyID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNisxXSk7CisJCQl2YWwyICY9IDB4MDAwZjsKKwkJCXJldCA9ICh2YWwyIDw8IDgpIHwgKHZhbDEgPj4gOCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcmV0ID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOzsKKwkJCXJldCA9IChyZXQgJiAweGZmZjApID4+IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWJyZWFrOworCX0KKwlGQVRfRFBSSU5UKCJyZXQ6ICVkLCBvZmZzZXQ6ICVkXG4iLCByZXQsIG9mZnNldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBSZWFkIGF0IG1vc3QgJ3NpemUnIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBjbHVzdGVyIGludG8gJ2J1ZmZlcicuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9jbHVzdGVyKGZzZGF0YSAqbXlkYXRhLCBfX3UzMiBjbHVzdG51bSwgX191OCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGlkeCA9IDA7CisJX191MzIgc3RhcnRzZWN0OworCisJaWYgKGNsdXN0bnVtID4gMCkgeworCQlzdGFydHNlY3QgPSBteWRhdGEtPmRhdGFfYmVnaW4gKyBjbHVzdG51bSpteWRhdGEtPmNsdXN0X3NpemU7CisJfSBlbHNlIHsKKwkJc3RhcnRzZWN0ID0gbXlkYXRhLT5yb290ZGlyX3NlY3Q7CisJfQorCisJaWYgKGRpc2tfcmVhZChzdGFydHNlY3QsIHNpemUvRlNfQkxPQ0tfU0laRSAsIGJ1ZmZlcikgPCAwKSB7CisJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYoc2l6ZSAlIEZTX0JMT0NLX1NJWkUpIHsKKwkJX191OCB0bXBidWZbRlNfQkxPQ0tfU0laRV07CisJCWlkeD0gc2l6ZS9GU19CTE9DS19TSVpFOworCQlpZiAoZGlza19yZWFkKHN0YXJ0c2VjdCArIGlkeCwgMSwgdG1wYnVmKSA8IDApIHsKKwkJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgZGF0YVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnVmZmVyICs9IGlkeCpGU19CTE9DS19TSVpFOworCisJCW1lbWNweShidWZmZXIsIHRtcGJ1Ziwgc2l6ZSAlIEZTX0JMT0NLX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmVhZCBhdCBtb3N0ICdtYXhzaXplJyBieXRlcyBmcm9tIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCAnZGVudHB0cicKKyAqIGludG8gJ2J1ZmZlcicuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIG9uIGZhdGFsIGVycm9ycy4KKyAqLworc3RhdGljIGxvbmcKK2dldF9jb250ZW50cyhmc2RhdGEgKm15ZGF0YSwgZGlyX2VudHJ5ICpkZW50cHRyLCBfX3U4ICpidWZmZXIsCisJICAgICB1bnNpZ25lZCBsb25nIG1heHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmaWxlc2l6ZSA9IEZBVDJDUFUzMihkZW50cHRyLT5zaXplKSwgZ290c2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGJ5dGVzcGVyY2x1c3QgPSBteWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRTsKKwlfX3UzMiBjdXJjbHVzdCA9IFNUQVJUKGRlbnRwdHIpOworCV9fdTMyIGVuZGNsdXN0LCBuZXdjbHVzdDsKKwl1bnNpZ25lZCBsb25nIGFjdHNpemU7CisKKwlGQVRfRFBSSU5UKCJGaWxlc2l6ZTogJWxkIGJ5dGVzXG4iLCBmaWxlc2l6ZSk7CisKKwlpZiAobWF4c2l6ZSA+IDAgJiYgZmlsZXNpemUgPiBtYXhzaXplKSBmaWxlc2l6ZSA9IG1heHNpemU7CisKKwlGQVRfRFBSSU5UKCJSZWFkaW5nOiAlbGQgYnl0ZXNcbiIsIGZpbGVzaXplKTsKKworCWFjdHNpemU9Ynl0ZXNwZXJjbHVzdDsKKwllbmRjbHVzdD1jdXJjbHVzdDsKKwlkbyB7CisJCS8qIHNlYXJjaCBmb3IgY29uc2VjdXRpdmUgY2x1c3RlcnMgKi8KKwkJd2hpbGUoYWN0c2l6ZSA8IGZpbGVzaXplKSB7CisJCQluZXdjbHVzdCA9IGdldF9mYXRlbnQobXlkYXRhLCBlbmRjbHVzdCk7CisJCQlpZigobmV3Y2x1c3QgLTEpIT1lbmRjbHVzdCkKKwkJCQlnb3RvIGdldGl0OworCQkJaWYgKG5ld2NsdXN0IDw9IDB4MDAwMSB8fCBuZXdjbHVzdCA+PSAweGZmZjApIHsKKwkJCQlGQVRfRFBSSU5UKCJjdXJjbHVzdDogMHgleFxuIiwgbmV3Y2x1c3QpOworCQkJCUZBVF9EUFJJTlQoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKKwkJCQlyZXR1cm4gZ290c2l6ZTsKKwkJCX0KKwkJCWVuZGNsdXN0PW5ld2NsdXN0OworCQkJYWN0c2l6ZSs9IGJ5dGVzcGVyY2x1c3Q7CisJCX0KKwkJLyogYWN0c2l6ZSA+PSBmaWxlIHNpemUgKi8KKwkJYWN0c2l6ZSAtPSBieXRlc3BlcmNsdXN0OworCQkvKiBnZXQgcmVtYWluaW5nIGNsdXN0ZXJzICovCisJCWlmIChnZXRfY2x1c3RlcihteWRhdGEsIGN1cmNsdXN0LCBidWZmZXIsIChpbnQpYWN0c2l6ZSkgIT0gMCkgeworCQkJRkFUX0VSUk9SKCJFcnJvciByZWFkaW5nIGNsdXN0ZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIGdldCByZW1haW5pbmcgYnl0ZXMgKi8KKwkJZ290c2l6ZSArPSAoaW50KWFjdHNpemU7CisJCWZpbGVzaXplIC09IGFjdHNpemU7CisJCWJ1ZmZlciArPSBhY3RzaXplOworCQlhY3RzaXplPSBmaWxlc2l6ZTsKKwkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgZW5kY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CisJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZ290c2l6ZSs9YWN0c2l6ZTsKKwkJcmV0dXJuIGdvdHNpemU7CitnZXRpdDoKKwkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CisJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZ290c2l6ZSArPSAoaW50KWFjdHNpemU7CisJCWZpbGVzaXplIC09IGFjdHNpemU7CisJCWJ1ZmZlciArPSBhY3RzaXplOworCQljdXJjbHVzdCA9IGdldF9mYXRlbnQobXlkYXRhLCBlbmRjbHVzdCk7CisJCWlmIChjdXJjbHVzdCA8PSAweDAwMDEgfHwgY3VyY2x1c3QgPj0gMHhmZmYwKSB7CisJCQlGQVRfRFBSSU5UKCJjdXJjbHVzdDogMHgleFxuIiwgY3VyY2x1c3QpOworCQkJRkFUX0VSUk9SKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CisJCQlyZXR1cm4gZ290c2l6ZTsKKwkJfQorCQlhY3RzaXplPWJ5dGVzcGVyY2x1c3Q7CisJCWVuZGNsdXN0PWN1cmNsdXN0OworCX0gd2hpbGUgKDEpOworfQorCisKKyNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCisjaWYgMAorLyoKKyAqIEV4dHJhY3QgdGhlIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiBmcm9tICdzbG90cHRyJyBpbnRvICdsX25hbWUnLAorICogc3RhcnRpbmcgYXQgbF9uYW1lWyppZHhdLgorICogUmV0dXJuIDEgaWYgdGVybWluYXRvciAoemVybyBieXRlKSBpcyBmb3VuZCwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK3Nsb3Qyc3RyKGRpcl9zbG90ICpzbG90cHRyLCBjaGFyICpsX25hbWUsIGludCAqaWR4KQoreworCWludCBqOworCisJZm9yIChqID0gMDsgaiA8PSA4OyBqICs9IDIpIHsKKwkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTBfNFtqXTsKKwkJaWYgKGxfbmFtZVsqaWR4XSA9PSAweDAwKSByZXR1cm4gMTsKKwkJKCppZHgpKys7CisJfQorCWZvciAoaiA9IDA7IGogPD0gMTA7IGogKz0gMikgeworCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lNV8xMFtqXTsKKwkJaWYgKGxfbmFtZVsqaWR4XSA9PSAweDAwKSByZXR1cm4gMTsKKwkJKCppZHgpKys7CisJfQorCWZvciAoaiA9IDA7IGogPD0gMjsgaiArPSAyKSB7CisJCWxfbmFtZVsqaWR4XSA9IHNsb3RwdHItPm5hbWUxMV8xMltqXTsKKwkJaWYgKGxfbmFtZVsqaWR4XSA9PSAweDAwKSByZXR1cm4gMTsKKwkJKCppZHgpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKy8qIENhbGN1bGF0ZSBzaG9ydCBuYW1lIGNoZWNrc3VtICovCitzdGF0aWMgX191OAorbWtja3N1bShjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGk7CisJX191OCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKKwkJcmV0ID0gKCgocmV0JjEpPDw3KXwoKHJldCYweGZlKT4+MSkpICsgc3RyW2ldOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworCisvKgorICogR2V0IHRoZSBkaXJlY3RvcnkgZW50cnkgYXNzb2NpYXRlZCB3aXRoICdmaWxlbmFtZScgZnJvbSB0aGUgZGlyZWN0b3J5CisgKiBzdGFydGluZyBhdCAnc3RhcnRzZWN0JworICovCisKKworc3RhdGljIGRpcl9lbnRyeSAqZ2V0X2RlbnRmcm9tZGlyIChmc2RhdGEgKiBteWRhdGEsIGludCBzdGFydHNlY3QsCisJCQkJICAgY2hhciAqZmlsZW5hbWUsIGRpcl9lbnRyeSAqIHJldGRlbnQsCisJCQkJICAgaW50IGRvbHMpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZiAwCitfX3U4IGdldF9kZW50ZnJvbWRpcl9ibG9ja1tNQVhfQ0xVU1RTSVpFXTsKK3N0YXRpYyBkaXJfZW50cnkgKmdldF9kZW50ZnJvbWRpciAoZnNkYXRhICogbXlkYXRhLCBpbnQgc3RhcnRzZWN0LAorCQkJCSAgIGNoYXIgKmZpbGVuYW1lLCBkaXJfZW50cnkgKiByZXRkZW50LAorCQkJCSAgIGludCBkb2xzKQoreworICAgIF9fdTE2IHByZXZja3N1bSA9IDB4ZmZmZjsKKyAgICBfX3UzMiBjdXJjbHVzdCA9IFNUQVJUIChyZXRkZW50KTsKKyAgICBpbnQgZmlsZXMgPSAwLCBkaXJzID0gMDsKKworICAgIHdoaWxlICgxKSB7CisJZGlyX2VudHJ5ICpkZW50cHRyOworCWludCBpOworCisJaWYgKGdldF9jbHVzdGVyIChteWRhdGEsIGN1cmNsdXN0LCBnZXRfZGVudGZyb21kaXJfYmxvY2ssCisJCSBteWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRSkgIT0gMCkgeworCSAgICBGQVRfRFBSSU5UICgiRXJyb3I6IHJlYWRpbmcgZGlyZWN0b3J5IGJsb2NrXG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCWRlbnRwdHIgPSAoZGlyX2VudHJ5ICopIGdldF9kZW50ZnJvbWRpcl9ibG9jazsKKwlmb3IgKGkgPSAwOyBpIDwgRElSRU5UU1BFUkNMVVNUOyBpKyspIHsKKwkgICAgY2hhciBzX25hbWVbMTRdLCBsX25hbWVbMjU2XTsKKworCSAgICBsX25hbWVbMF0gPSAnXDAnOworCSAgICBpZiAoZGVudHB0ci0+bmFtZVswXSA9PSBERUxFVEVEX0ZMQUcpIHsKKwkJICAgIGRlbnRwdHIrKzsKKwkJICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGlmICgoZGVudHB0ci0+YXR0ciAmIEFUVFJfVk9MVU1FKSkgeworCQkgICAgLyogVm9sdW1lIGxhYmVsIG9yIFZGQVQgZW50cnkgKi8KKwkJICAgIGRlbnRwdHIrKzsKKwkJICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChkZW50cHRyLT5uYW1lWzBdID09IDApIHsKKwkJaWYgKGRvbHMpIHsKKwkJICAgIHByaW50ZiAoIlxuJWQgZmlsZShzKSwgJWQgZGlyKHMpXG5cbiIsIGZpbGVzLCBkaXJzKTsKKwkJfQorCQlGQVRfRFBSSU5UICgiRGVudG5hbWUgPT0gTlVMTCAtICVkXG4iLCBpKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKyNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCisJICAgIGlmIChkb2xzICYmIG1rY2tzdW0gKGRlbnRwdHItPm5hbWUpID09IHByZXZja3N1bSkgeworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgICAgZ2V0X25hbWUgKGRlbnRwdHIsIHNfbmFtZSk7CisJICAgIGlmIChkb2xzKSB7CisJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOworCQljaGFyIGRpcmM7CisJCWludCBkb2l0ID0gMDsKKworCQlpZiAoaXNkaXIpIHsKKwkJICAgIGRpcnMrKzsKKwkJICAgIGRpcmMgPSAnLyc7CisJCSAgICBkb2l0ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgIGRpcmMgPSAnICc7CisJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKKwkJCWZpbGVzKys7CisJCQlkb2l0ID0gMTsKKwkJICAgIH0KKwkJfQorCQlpZiAoZG9pdCkgeworCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CisJCQlwcmludGYgKCIgJThsZCAgICVzJWNcbiIsCisJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHNfbmFtZSwKKwkJCQlkaXJjKTsKKwkJICAgIH0gZWxzZSB7CisJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBzX25hbWUsIGRpcmMpOworCQkgICAgfQorCQl9CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIHNfbmFtZSkgJiYgc3RyY21wIChmaWxlbmFtZSwgbF9uYW1lKSkgeworCQlGQVRfRFBSSU5UICgiTWlzbWF0Y2g6IHwlc3wlc3xcbiIsIHNfbmFtZSwgbF9uYW1lKTsKKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBtZW1jcHkgKHJldGRlbnQsIGRlbnRwdHIsIHNpemVvZiAoZGlyX2VudHJ5KSk7CisKKwkgICAgRkFUX0RQUklOVCAoIkRlbnROYW1lOiAlcyIsIHNfbmFtZSk7CisJICAgIEZBVF9EUFJJTlQgKCIsIHN0YXJ0OiAweCV4IiwgU1RBUlQgKGRlbnRwdHIpKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc2l6ZTogIDB4JXggJXNcbiIsCisJCQlGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLAorCQkJKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikgPyAiKERJUikiIDogIiIpOworCisJICAgIHJldHVybiByZXRkZW50OworCX0KKwljdXJjbHVzdCA9IGdldF9mYXRlbnQgKG15ZGF0YSwgY3VyY2x1c3QpOworCWlmIChjdXJjbHVzdCA8PSAweDAwMDEgfHwgY3VyY2x1c3QgPj0gMHhmZmYwKSB7CisJICAgIEZBVF9EUFJJTlQgKCJjdXJjbHVzdDogMHgleFxuIiwgY3VyY2x1c3QpOworCSAgICBGQVRfRVJST1IgKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBSZWFkIGJvb3Qgc2VjdG9yIGFuZCB2b2x1bWUgaW5mbyBmcm9tIGEgRkFUIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludAorcmVhZF9ib290c2VjdGFuZHZpKGJvb3Rfc2VjdG9yICpicywgdm9sdW1lX2luZm8gKnZvbGluZm8sIGludCAqZmF0c2l6ZSkKK3sKKwlfX3U4IGJsb2NrW0ZTX0JMT0NLX1NJWkVdOworCXZvbHVtZV9pbmZvICp2aXN0YXJ0OworCisJcHJpbnRmKCJSZWFkaW5nIGJvb3Qgc2VjdG9yXG4iKTsKKworCWlmIChkaXNrX3JlYWQoMCwgMSwgYmxvY2spIDwgMCkgeworCQlGQVRfRFBSSU5UKCJFcnJvcjogcmVhZGluZyBibG9ja1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoYnMsIGJsb2NrLCBzaXplb2YoYm9vdF9zZWN0b3IpKTsKKwlicy0+cmVzZXJ2ZWQJPSBGQVQyQ1BVMTYoYnMtPnJlc2VydmVkKTsKKwlicy0+ZmF0X2xlbmd0aAk9IEZBVDJDUFUxNihicy0+ZmF0X2xlbmd0aCk7CisJYnMtPnNlY3NfdHJhY2sJPSBGQVQyQ1BVMTYoYnMtPnNlY3NfdHJhY2spOworCWJzLT5oZWFkcwk9IEZBVDJDUFUxNihicy0+aGVhZHMpOworI2lmIDAgLyogVU5VU0VEICovCisJYnMtPmhpZGRlbgk9IEZBVDJDUFUzMihicy0+aGlkZGVuKTsKKyNlbmRpZgorCWJzLT50b3RhbF9zZWN0CT0gRkFUMkNQVTMyKGJzLT50b3RhbF9zZWN0KTsKKworCS8qIEZBVDMyIGVudHJpZXMgKi8KKwlpZiAoYnMtPmZhdF9sZW5ndGggPT0gMCkgeworCQkvKiBBc3N1bWUgRkFUMzIgKi8KKwkJYnMtPmZhdDMyX2xlbmd0aCA9IEZBVDJDUFUzMihicy0+ZmF0MzJfbGVuZ3RoKTsKKwkJYnMtPmZsYWdzCSA9IEZBVDJDUFUxNihicy0+ZmxhZ3MpOworCQlicy0+cm9vdF9jbHVzdGVyID0gRkFUMkNQVTMyKGJzLT5yb290X2NsdXN0ZXIpOworCQlicy0+aW5mb19zZWN0b3IgID0gRkFUMkNQVTE2KGJzLT5pbmZvX3NlY3Rvcik7CisJCWJzLT5iYWNrdXBfYm9vdCAgPSBGQVQyQ1BVMTYoYnMtPmJhY2t1cF9ib290KTsKKwkJdmlzdGFydCA9ICh2b2x1bWVfaW5mbyopIChibG9jayArIHNpemVvZihib290X3NlY3RvcikpOworCQkqZmF0c2l6ZSA9IDMyOworCX0gZWxzZSB7CisJCXZpc3RhcnQgPSAodm9sdW1lX2luZm8qKSAmKGJzLT5mYXQzMl9sZW5ndGgpOworCQkqZmF0c2l6ZSA9IDA7CisJfQorCW1lbWNweSh2b2xpbmZvLCB2aXN0YXJ0LCBzaXplb2Yodm9sdW1lX2luZm8pKTsKKworCS8qIFRlcm1pbmF0ZSBmc190eXBlIHN0cmluZy4gV3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdmlzdGFydAorCSAgIGlzIG9rIC0gaXQncyBqdXN0IHRoZSBidWZmZXIuICovCisJdmlzdGFydC0+ZnNfdHlwZVs3XSA9ICdcMCc7CisKKwlpZiAoKmZhdHNpemUgPT0gMzIpIHsKKwkJaWYgKGNvbXBhcmVfc2lnbihGQVQzMl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjb21wYXJlX3NpZ24oRkFUMTJfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgeworCQkJKmZhdHNpemUgPSAxMjsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChjb21wYXJlX3NpZ24oRkFUMTZfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgeworCQkJKmZhdHNpemUgPSAxNjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJRkFUX0RQUklOVCgiRXJyb3I6IGJyb2tlbiBmc190eXBlIHNpZ25cbiIpOworCXJldHVybiAtMTsKK30KKworI2lmIDAKK19fdTggZG9fZmF0X3JlYWRfYmxvY2tbTUFYX0NMVVNUU0laRV07ICAvKiBCbG9jayBidWZmZXIgKi8KKyNlbmRpZgorCitfX3U4ICpmbmFtZWNvcHkgPSAoX191OCAqKTB4ODA1MDAwMDA7CitfX3U4ICpkb19mYXRfcmVhZF9ibG9jayA9IChfX3U4ICopMHg4MDUwMDg4MDsKKworYm9vdF9zZWN0b3IgYnM7Cit2b2x1bWVfaW5mbyB2b2xpbmZvOworZnNkYXRhIGRhdGFibG9jazsKKworbG9uZworZG9fZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplLAorCSAgICAgaW50IGRvbHMpCit7CisjaWYgQ09ORklHX05JT1MgLyogTklPUyBDUFUgY2Fubm90IGFjY2VzcyBiaWcgYXV0b21hdGljIGFycmF5cyAqLworICAgIHN0YXRpYworI2VuZGlmCisgICAgZnNkYXRhICpteWRhdGEgPSAmZGF0YWJsb2NrOworICAgIGRpcl9lbnRyeSAqZGVudHB0cjsKKyAgICBfX3UxNiBwcmV2Y2tzdW0gPSAweGZmZmY7CisgICAgY2hhciAqc3VibmFtZSA9ICIiOworICAgIGludCByb290ZGlyX3NpemUsIGN1cnNlY3Q7CisgICAgaW50IGlkeCwgaXNkaXIgPSAwOworICAgIGludCBmaWxlcyA9IDAsIGRpcnMgPSAwOworICAgIGxvbmcgcmV0ID0gMDsKKyAgICBpbnQgZmlyc3R0aW1lOworCisgICAgaWYgKHJlYWRfYm9vdHNlY3RhbmR2aSAoJmJzLCAmdm9saW5mbywgJm15ZGF0YS0+ZmF0c2l6ZSkpIHsKKwlwcmludGYgKCJFcnJvcjogcmVhZGluZyBib290IHNlY3RvclxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobXlkYXRhLT5mYXRzaXplID09IDMyKSB7CisJbXlkYXRhLT5mYXRsZW5ndGggPSBicy5mYXQzMl9sZW5ndGg7CisgICAgfSBlbHNlIHsKKwlteWRhdGEtPmZhdGxlbmd0aCA9IGJzLmZhdF9sZW5ndGg7CisgICAgfQorICAgIG15ZGF0YS0+ZmF0X3NlY3QgPSBicy5yZXNlcnZlZDsKKyAgICBjdXJzZWN0ID0gbXlkYXRhLT5yb290ZGlyX3NlY3QKKwkgICAgPSBteWRhdGEtPmZhdF9zZWN0ICsgbXlkYXRhLT5mYXRsZW5ndGggKiBicy5mYXRzOworICAgIG15ZGF0YS0+Y2x1c3Rfc2l6ZSA9IGJzLmNsdXN0ZXJfc2l6ZTsKKyAgICBpZiAobXlkYXRhLT5mYXRzaXplID09IDMyKSB7CisJcm9vdGRpcl9zaXplID0gbXlkYXRhLT5jbHVzdF9zaXplOworCW15ZGF0YS0+ZGF0YV9iZWdpbiA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0ICAgLyogKyByb290ZGlyX3NpemUgKi8KKwkJLSAobXlkYXRhLT5jbHVzdF9zaXplICogMik7CisgICAgfSBlbHNlIHsKKwlyb290ZGlyX3NpemUgPSAoKGJzLmRpcl9lbnRyaWVzWzFdICogKGludCkgMjU2ICsgYnMuZGlyX2VudHJpZXNbMF0pCisJCQkqIHNpemVvZiAoZGlyX2VudHJ5KSkgLyBTRUNUT1JfU0laRTsKKwlteWRhdGEtPmRhdGFfYmVnaW4gPSBteWRhdGEtPnJvb3RkaXJfc2VjdCArIHJvb3RkaXJfc2l6ZQorCQktIChteWRhdGEtPmNsdXN0X3NpemUgKiAyKTsKKyAgICB9CisgICAgbXlkYXRhLT5mYXRidWZudW0gPSAtMTsKKworICAgIEZBVF9EUFJJTlQgKCJGQVQlZCwgZmF0bGVuZ3RoOiAlZFxuIiwgbXlkYXRhLT5mYXRzaXplLAorCQlteWRhdGEtPmZhdGxlbmd0aCk7CisgICAgRkFUX0RQUklOVCAoIlJvb3RkaXIgYmVnaW5zIGF0IHNlY3RvcjogJWQsIG9mZnNldDogJXgsIHNpemU6ICVkXG4iCisJCSJEYXRhIGJlZ2lucyBhdDogJWRcbiIsCisJCW15ZGF0YS0+cm9vdGRpcl9zZWN0LCBteWRhdGEtPnJvb3RkaXJfc2VjdCAqIFNFQ1RPUl9TSVpFLAorCQlyb290ZGlyX3NpemUsIG15ZGF0YS0+ZGF0YV9iZWdpbik7CisgICAgRkFUX0RQUklOVCAoIkNsdXN0ZXIgc2l6ZTogJWRcbiIsIG15ZGF0YS0+Y2x1c3Rfc2l6ZSk7CisKKyAgICAvKiAiY3dkIiBpcyBhbHdheXMgdGhlIHJvb3QuLi4gKi8KKyAgICB3aGlsZSAoSVNESVJERUxJTSAoKmZpbGVuYW1lKSkKKwlmaWxlbmFtZSsrOworICAgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBmaWxlbmFtZSBhbmQgY29udmVydCBpdCB0byBsb3dlcmNhc2UgKi8KKyAgICBzdHJjcHkoKGNoYXIgKilmbmFtZWNvcHksIGZpbGVuYW1lKTsKKyAgICBkb3duY2FzZSgoY2hhciAqKWZuYW1lY29weSk7CisgICAgaWYgKCpmbmFtZWNvcHkgPT0gJ1wwJykgeworCWlmICghZG9scyl7CisJCXByaW50ZigiXG4gbm90IHRoZXJlXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlkb2xzID0gTFNfUk9PVDsKKyAgICB9IGVsc2UgaWYoKGlkeCA9IGRpcmRlbGltKChjaGFyICopZm5hbWVjb3B5KSkgPj0gMCkgeworCWlzZGlyID0gMTsKKwlmbmFtZWNvcHlbaWR4XSA9ICdcMCc7CisJc3VibmFtZSA9IChjaGFyICopZm5hbWVjb3B5ICsgaWR4ICsgMTsKKwkvKiBIYW5kbGUgbXVsdGlwbGUgZGVsaW1pdGVycyAqLworCXdoaWxlIChJU0RJUkRFTElNICgqc3VibmFtZSkpCisJICAgIHN1Ym5hbWUrKzsKKyAgICB9IGVsc2UgaWYgKGRvbHMpIHsKKwlpc2RpciA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKwlpbnQgaTsKKworCWlmIChkaXNrX3JlYWQgKGN1cnNlY3QsIG15ZGF0YS0+Y2x1c3Rfc2l6ZSwgZG9fZmF0X3JlYWRfYmxvY2spIDwgMCkgeworCSAgICBwcmludGYgKCJFcnJvcjogcmVhZGluZyByb290ZGlyIGJsb2NrXG4iKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlkZW50cHRyID0gKGRpcl9lbnRyeSAqKSBkb19mYXRfcmVhZF9ibG9jazsKKwlmb3IgKGkgPSAwOyBpIDwgRElSRU5UU1BFUkJMT0NLOyBpKyspIHsKKwkgICAgY2hhciBzX25hbWVbMTRdLCBsX25hbWVbMjU2XTsKKworCSAgICBsX25hbWVbMF0gPSAnXDAnOworCSAgICBpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZPTFVNRSkpIHsKKwkJICAgIC8qIFZvbHVtZSBsYWJlbCBvciBWRkFUIGVudHJ5ICovCisJCSAgICBkZW50cHRyKys7CisJCSAgICBjb250aW51ZTsKKwkgICAgfSBlbHNlIGlmIChkZW50cHRyLT5uYW1lWzBdID09IDApIHsKKwkJRkFUX0RQUklOVCAoIlJvb3REZW50bmFtZSA9PSBOVUxMIC0gJWRcbiIsIGkpOworCQlpZiAoZG9scyA9PSBMU19ST09UKSB7CisJCSAgICBwcmludGYgKCJcbiVkIGZpbGUocyksICVkIGRpcihzKVxuXG4iLCBmaWxlcywgZGlycyk7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLTE7CisJICAgIH0KKyNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCisJICAgIGVsc2UgaWYgKGRvbHMgPT0gTFNfUk9PVAorCQkgICAgICYmIG1rY2tzdW0gKGRlbnRwdHItPm5hbWUpID09IHByZXZja3N1bSkgeworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgICAgZ2V0X25hbWUgKGRlbnRwdHIsIHNfbmFtZSk7CisJICAgIGlmIChkb2xzID09IExTX1JPT1QpIHsKKwkJaW50IGlzZGlyID0gKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUik7CisJCWNoYXIgZGlyYzsKKwkJaW50IGRvaXQgPSAwOworCisJCWlmIChpc2RpcikgeworCQkgICAgZGlyYyA9ICcvJzsKKwkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgeworCQkJZGlycysrOworCQkJZG9pdCA9IDE7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBkaXJjID0gJyAnOworCQkgICAgaWYgKHNfbmFtZVswXSAhPSAwKSB7CisJCQlmaWxlcysrOworCQkJZG9pdCA9IDE7CisJCSAgICB9CisJCX0KKwkJaWYgKGRvaXQpIHsKKwkJICAgIGlmIChkaXJjID09ICcgJykgeworCQkJcHJpbnRmICgiICU4bGQgICAlcyVjXG4iLAorCQkJCShsb25nKSBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCBzX25hbWUsCisJCQkJZGlyYyk7CisJCSAgICB9IGVsc2UgeworCQkJcHJpbnRmICgiICAgICAgICAgICAgJXMlY1xuIiwgc19uYW1lLCBkaXJjKTsKKwkJICAgIH0KKwkJfQorCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChzdHJjbXAoKGNoYXIgKilmbmFtZWNvcHksIHNfbmFtZSkgJiYKKwkJc3RyY21wKChjaGFyICopZm5hbWVjb3B5LCBsX25hbWUpKSB7CisJCUZBVF9EUFJJTlQgKCJSb290TWlzbWF0Y2g6IHwlc3wlc3xcbiIsIHNfbmFtZSwgbF9uYW1lKTsKKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoaXNkaXIgJiYgIShkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpKQorCQlyZXR1cm4gLTE7CisKKwkgICAgRkFUX0RQUklOVCAoIlJvb3ROYW1lOiAlcyIsIHNfbmFtZSk7CisJICAgIEZBVF9EUFJJTlQgKCIsIHN0YXJ0OiAweCV4IiwgU1RBUlQgKGRlbnRwdHIpKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc2l6ZTogIDB4JXggJXNcbiIsCisJCQlGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCBpc2RpciA/ICIoRElSKSIgOiAiIik7CisKKwkgICAgZ290byByb290ZGlyX2RvbmU7ICAvKiBXZSBnb3QgYSBtYXRjaCAqLworCX0KKwljdXJzZWN0Kys7CisgICAgfQorICByb290ZGlyX2RvbmU6CisKKyAgICBmaXJzdHRpbWUgPSAxOworICAgIHdoaWxlIChpc2RpcikgeworCWludCBzdGFydHNlY3QgPSBteWRhdGEtPmRhdGFfYmVnaW4KKwkJKyBTVEFSVCAoZGVudHB0cikgKiBteWRhdGEtPmNsdXN0X3NpemU7CisJZGlyX2VudHJ5IGRlbnQ7CisJY2hhciAqbmV4dG5hbWUgPSBOVUxMOworCisJZGVudCA9ICpkZW50cHRyOworCWRlbnRwdHIgPSAmZGVudDsKKwlpZHggPSBkaXJkZWxpbSAoc3VibmFtZSk7CisJaWYgKGlkeCA+PSAwKSB7CisJICAgIHN1Ym5hbWVbaWR4XSA9ICdcMCc7CisJICAgIG5leHRuYW1lID0gc3VibmFtZSArIGlkeCArIDE7CisJICAgIC8qIEhhbmRsZSBtdWx0aXBsZSBkZWxpbWl0ZXJzICovCisJICAgIHdoaWxlIChJU0RJUkRFTElNICgqbmV4dG5hbWUpKQorCQluZXh0bmFtZSsrOworCSAgICBpZiAoZG9scyAmJiAqbmV4dG5hbWUgPT0gJ1wwJykKKwkJZmlyc3R0aW1lID0gMDsKKwl9IGVsc2UgeworCSAgICBpZiAoZG9scyAmJiBmaXJzdHRpbWUpIHsKKwkJZmlyc3R0aW1lID0gMDsKKwkgICAgfSBlbHNlIHsKKwkJaXNkaXIgPSAwOworCSAgICB9CisJfQorCisJaWYgKGdldF9kZW50ZnJvbWRpciAobXlkYXRhLCBzdGFydHNlY3QsIHN1Ym5hbWUsIGRlbnRwdHIsCisJCQkgICAgIGlzZGlyID8gMCA6IGRvbHMpID09IE5VTEwpIHsKKwkgICAgaWYgKGRvbHMgJiYgIWlzZGlyKQorCQlyZXR1cm4gMDsKKwkgICAgcmV0dXJuIC0xOworCX0KKworCWlmIChpZHggPj0gMCkgeworCSAgICBpZiAoIShkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpKQorCQlyZXR1cm4gLTE7CisJICAgIHN1Ym5hbWUgPSBuZXh0bmFtZTsKKwl9CisgICAgfQorICAgIHJldCA9IGdldF9jb250ZW50cyAobXlkYXRhLCBkZW50cHRyLCBidWZmZXIsIG1heHNpemUpOworICAgIEZBVF9EUFJJTlQgKCJTaXplOiAlZCwgZ290OiAlbGRcbiIsIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK2ludAorZmlsZV9mYXRfZGV0ZWN0ZnModm9pZCkKK3sKKwlib290X3NlY3RvcgliczsKKwl2b2x1bWVfaW5mbwl2b2xpbmZvOworCWludAkJZmF0c2l6ZTsKKwljaGFyCXZvbF9sYWJlbFsxMl07CisKKwlpZihjdXJfZGV2PT1OVUxMKSB7CisJCXByaW50ZigiTm8gY3VycmVudCBkZXZpY2VcbiIpOworCQlyZXR1cm4gMTsKKwl9CisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSB8fCBcCisgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSB8fCAoQ09ORklHX01NQykKKwlwcmludGYoIkludGVyZmFjZTogICIpOworCXN3aXRjaChjdXJfZGV2LT5pZl90eXBlKSB7CisJCWNhc2UgSUZfVFlQRV9JREUgOglwcmludGYoIklERSIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX1NDU0kgOglwcmludGYoIlNDU0kiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9BVEFQSSA6CXByaW50ZigiQVRBUEkiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9VU0IgOglwcmludGYoIlVTQiIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX0RPQyA6CXByaW50ZigiRE9DIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfTU1DIDoJcHJpbnRmKCJNTUMiKTsgYnJlYWs7CisJCWRlZmF1bHQgOgkJcHJpbnRmKCJVbmtub3duIik7CisJfQorCXByaW50ZigiXG4gIERldmljZSAlZDogIixjdXJfZGV2LT5kZXYpOworCWRldl9wcmludChjdXJfZGV2KTsKKyNlbmRpZgorCWlmKHJlYWRfYm9vdHNlY3RhbmR2aSgmYnMsICZ2b2xpbmZvLCAmZmF0c2l6ZSkpIHsKKwkJcHJpbnRmKCJcbk5vIHZhbGlkIEZBVCBmcyBmb3VuZFxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1jcHkgKHZvbF9sYWJlbCwgdm9saW5mby52b2x1bWVfbGFiZWwsIDExKTsKKwl2b2xfbGFiZWxbMTFdID0gJ1wwJzsKKwl2b2xpbmZvLmZzX3R5cGVbNV09J1wwJzsKKwlwcmludGYoIlBhcnRpdGlvbiAlZDogRmlsZXN5c3RlbTogJXMgXCIlc1wiXG4iLGN1cl9wYXJ0LHZvbGluZm8uZnNfdHlwZSx2b2xfbGFiZWwpOworCXJldHVybiAwOworfQorCisKK2ludAorZmlsZV9mYXRfbHMoY29uc3QgY2hhciAqZGlyKQoreworCXJldHVybiBkb19mYXRfcmVhZChkaXIsIE5VTEwsIDAsIExTX1lFUyk7Cit9CisKKworbG9uZworZmlsZV9mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpCit7CisJbG9uZyByZXQ7CisJcmV0ID0gZG9fZmF0X3JlYWQoZmlsZW5hbWUsIGJ1ZmZlciwgbWF4c2l6ZSwgTFNfTk8pOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvZmF0L2ZpbGUuYyBiL3gtbG9hZGVyL2ZzL2ZhdC9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTk5NDI3MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL2ZhdC9maWxlLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBmaWxlLmMKKyAqCisgKiBNaW5pICJWRlMiIGJ5IE1hcmN1cyBTdW5kYmVyZworICoKKyAqIDIwMDItMDctMjggLSByam9uZXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gcHBjYm9vdCB2MS4xLjYKKyAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHVib290CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKQorCisvKiBTdXBwb3J0ZWQgZmlsZXN5c3RlbXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZXN5c3RlbSBmaWxlc3lzdGVtc1tdID0geworCXsgZmlsZV9mYXRfZGV0ZWN0ZnMsICBmaWxlX2ZhdF9scywgIGZpbGVfZmF0X3JlYWQsICAiRkFUIiB9LAorfTsKKyNkZWZpbmUgTlVNX0ZJTEVTWVMJKHNpemVvZihmaWxlc3lzdGVtcykvc2l6ZW9mKHN0cnVjdCBmaWxlc3lzdGVtKSkKKworLyogVGhlIGZpbGVzeXN0ZW0gd2hpY2ggd2FzIGxhc3QgZGV0ZWN0ZWQgKi8KK3N0YXRpYyBpbnQgY3VycmVudF9maWxlc3lzdGVtID0gRlNUWVBFX05PTkU7CisKKy8qIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCisjZGVmaW5lIENXRF9MRU4JCTUxMQorY2hhciBmaWxlX2N3ZFtDV0RfTEVOKzFdID0gIi8iOworCitjb25zdCBjaGFyICoKK2ZpbGVfZ2V0ZnNuYW1lKGludCBpZHgpCit7CisJaWYgKGlkeCA8IDAgfHwgaWR4ID49IE5VTV9GSUxFU1lTKSByZXR1cm4gTlVMTDsKKworCXJldHVybiBmaWxlc3lzdGVtc1tpZHhdLm5hbWU7Cit9CisKKworc3RhdGljIHZvaWQKK3BhdGhjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKm9yaWdkZXN0ID0gZGVzdDsKKworCWRvIHsKKwkJaWYgKGRlc3QtZmlsZV9jd2QgPj0gQ1dEX0xFTikgeworCQkJKmRlc3QgPSAnXDAnOworCQkJcmV0dXJuOworCQl9CisJCSooZGVzdCkgPSAqKHNyYyk7CisJCWlmICgqc3JjID09ICdcMCcpIHsKKwkJCWlmIChkZXN0LS0gIT0gb3JpZ2Rlc3QgJiYgSVNESVJERUxJTSgqZGVzdCkpIHsKKwkJCQkqZGVzdCA9ICdcMCc7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJKytkZXN0OworCQlpZiAoSVNESVJERUxJTSgqc3JjKSkgeworCQkJd2hpbGUgKElTRElSREVMSU0oKnNyYykpIHNyYysrOworCQl9IGVsc2UgeworCQkJc3JjKys7CisJCX0KKwl9IHdoaWxlICgxKTsKK30KKworCitpbnQKK2ZpbGVfY2QoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpZiAoSVNESVJERUxJTSgqcGF0aCkpIHsKKwkJd2hpbGUgKElTRElSREVMSU0oKnBhdGgpKSBwYXRoKys7CisJCXN0cm5jcHkoZmlsZV9jd2QrMSwgcGF0aCwgQ1dEX0xFTi0xKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICpvcmlncGF0aCA9IHBhdGg7CisJCWNoYXIgKnRtcHN0ciA9IGZpbGVfY3dkOworCQlpbnQgYmFjayA9IDA7CisKKwkJd2hpbGUgKCp0bXBzdHIgIT0gJ1wwJykgdG1wc3RyKys7CisJCWRvIHsKKwkJCXRtcHN0ci0tOworCQl9IHdoaWxlIChJU0RJUkRFTElNKCp0bXBzdHIpKTsKKworCQl3aGlsZSAoKnBhdGggPT0gJy4nKSB7CisJCQlwYXRoKys7CisJCQl3aGlsZSAoKnBhdGggPT0gJy4nKSB7CisJCQkJcGF0aCsrOworCQkJCWJhY2srKzsKKwkJCX0KKwkJCWlmICgqcGF0aCAhPSAnXDAnICYmICFJU0RJUkRFTElNKCpwYXRoKSkgeworCQkJCXBhdGggPSBvcmlncGF0aDsKKwkJCQliYWNrID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXdoaWxlIChJU0RJUkRFTElNKCpwYXRoKSkgcGF0aCsrOworCQkJb3JpZ3BhdGggPSBwYXRoOworCQl9CisKKwkJd2hpbGUgKGJhY2stLSkgeworCQkJLyogU3RyaXAgb2ZmIHBhdGggY29tcG9uZW50ICovCisJCQl3aGlsZSAoIUlTRElSREVMSU0oKnRtcHN0cikpIHsKKwkJCQl0bXBzdHItLTsKKwkJCX0KKwkJCWlmICh0bXBzdHIgPT0gZmlsZV9jd2QpIHsKKwkJCQkvKiBJbmNyZW1lbnRlZCBhZ2FpbiByaWdodCBhZnRlciB0aGUgbG9vcC4gKi8KKwkJCQl0bXBzdHItLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFNraXAgZGVsaW1pdGVycyAqLworCQkJd2hpbGUgKElTRElSREVMSU0oKnRtcHN0cikpIHRtcHN0ci0tOworCQl9CisJCXRtcHN0cisrOworCQlpZiAoKnBhdGggPT0gJ1wwJykgeworCQkJaWYgKHRtcHN0ciA9PSBmaWxlX2N3ZCkgeworCQkJCSp0bXBzdHIgPSAnLyc7CisJCQkJdG1wc3RyKys7CisJCQl9CisJCQkqdG1wc3RyID0gJ1wwJzsKKwkJCXJldHVybiAwOworCQl9CisJCSp0bXBzdHIgPSAnLyc7CisJCXBhdGhjcHkodG1wc3RyKzEsIHBhdGgpOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludAorZmlsZV9kZXRlY3Rmcyh2b2lkKQoreworCWludCBpOworCisJY3VycmVudF9maWxlc3lzdGVtID0gRlNUWVBFX05PTkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZJTEVTWVM7IGkrKykgeworCQlpZiAoZmlsZXN5c3RlbXNbaV0uZGV0ZWN0KCkgPT0gMCkgeworCQkJc3RyY3B5KGZpbGVfY3dkLCAiLyIpOworCQkJY3VycmVudF9maWxlc3lzdGVtID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGN1cnJlbnRfZmlsZXN5c3RlbTsKK30KKworCitpbnQKK2ZpbGVfbHMoY29uc3QgY2hhciAqZGlyKQoreworCWNoYXIgZnVsbHBhdGhbMTAyNF07CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGN1cnJlbnRfZmlsZXN5c3RlbSA9PSBGU1RZUEVfTk9ORSkgeworCQlwcmludGYoIkNhbid0IGxpc3QgZmlsZXMgd2l0aG91dCBhIGZpbGVzeXN0ZW0hXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChJU0RJUkRFTElNKCpkaXIpKSB7CisJCWFyZyA9IGRpcjsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGZ1bGxwYXRoLCAiJXMvJXMiLCBmaWxlX2N3ZCwgZGlyKTsKKwkJYXJnID0gZnVsbHBhdGg7CisJfQorCXJldHVybiBmaWxlc3lzdGVtc1tjdXJyZW50X2ZpbGVzeXN0ZW1dLmxzKGFyZyk7Cit9CisKKworbG9uZworZmlsZV9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKK3sKKwljaGFyIGZ1bGxwYXRoWzEwMjRdOworCWNvbnN0IGNoYXIgKmFyZzsKKworCWlmIChjdXJyZW50X2ZpbGVzeXN0ZW0gPT0gRlNUWVBFX05PTkUpIHsKKwkJcHJpbnRmKCJDYW4ndCBsb2FkIGZpbGUgd2l0aG91dCBhIGZpbGVzeXN0ZW0hXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChJU0RJUkRFTElNKCpmaWxlbmFtZSkpIHsKKwkJYXJnID0gZmlsZW5hbWU7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihmdWxscGF0aCwgIiVzLyVzIiwgZmlsZV9jd2QsIGZpbGVuYW1lKTsKKwkJYXJnID0gZnVsbHBhdGg7CisJfQorCisJcmV0dXJuIGZpbGVzeXN0ZW1zW2N1cnJlbnRfZmlsZXN5c3RlbV0ucmVhZChhcmcsIGJ1ZmZlciwgbWF4c2l6ZSk7Cit9CisKKyNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkFUKSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2JpdHMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMjczZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmgKQEAgLTAsMCArMSw0OSBAQAorLyogYml0cy5oCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBmb3VuZCBpbiB0aGUgZmlsZQorICogbmFtZWQgQ09QWUlORyB0aGF0IHNob3VsZCBoYXZlIGFjY29tcGFuaWVkIHRoaXMgZmlsZS4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaWZuZGVmIF9fYml0c19oCisjZGVmaW5lIF9fYml0c19oIDEKKworI2RlZmluZSBCSVQwICAoMTw8MCkKKyNkZWZpbmUgQklUMSAgKDE8PDEpCisjZGVmaW5lIEJJVDIgICgxPDwyKQorI2RlZmluZSBCSVQzICAoMTw8MykKKyNkZWZpbmUgQklUNCAgKDE8PDQpCisjZGVmaW5lIEJJVDUgICgxPDw1KQorI2RlZmluZSBCSVQ2ICAoMTw8NikKKyNkZWZpbmUgQklUNyAgKDE8PDcpCisjZGVmaW5lIEJJVDggICgxPDw4KQorI2RlZmluZSBCSVQ5ICAoMTw8OSkKKyNkZWZpbmUgQklUMTAgKDE8PDEwKQorI2RlZmluZSBCSVQxMSAoMTw8MTEpCisjZGVmaW5lIEJJVDEyICgxPDwxMikKKyNkZWZpbmUgQklUMTMgKDE8PDEzKQorI2RlZmluZSBCSVQxNCAoMTw8MTQpCisjZGVmaW5lIEJJVDE1ICgxPDwxNSkKKyNkZWZpbmUgQklUMTYgKDE8PDE2KQorI2RlZmluZSBCSVQxNyAoMTw8MTcpCisjZGVmaW5lIEJJVDE4ICgxPDwxOCkKKyNkZWZpbmUgQklUMTkgKDE8PDE5KQorI2RlZmluZSBCSVQyMCAoMTw8MjApCisjZGVmaW5lIEJJVDIxICgxPDwyMSkKKyNkZWZpbmUgQklUMjIgKDE8PDIyKQorI2RlZmluZSBCSVQyMyAoMTw8MjMpCisjZGVmaW5lIEJJVDI0ICgxPDwyNCkKKyNkZWZpbmUgQklUMjUgKDE8PDI1KQorI2RlZmluZSBCSVQyNiAoMTw8MjYpCisjZGVmaW5lIEJJVDI3ICgxPDwyNykKKyNkZWZpbmUgQklUMjggKDE8PDI4KQorI2RlZmluZSBCSVQyOSAoMTw8MjkpCisjZGVmaW5lIEJJVDMwICgxPDwzMCkKKyNkZWZpbmUgQklUMzEgKDE8PDMxKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDBkMmUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAyNFhYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDI0WFhfQ0xPQ0tTX0hfCisKKyNkZWZpbmUgQ09NTUlUX0RJVklERVJTICAweDEKKyNkZWZpbmUgTU9ERV9CWVBBU1NfRkFTVCAweDIKKyNkZWZpbmUgQVBMTF9MT0NLICAgICAgICAweGMKKyNkZWZpbmUgRFBMTF9MT0NLICAgICAgICAweDMgICAvKiBEUExMIGxvY2sgKi8KKyNkZWZpbmUgTERFTEFZICAgICAgICAgICAxMjAwMDAwMAorCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDI0MlgpCisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzMjQyeC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfT01BUDI0M1gpCisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzMjQzeC5oPgorI2VuZGlmCisKKyNkZWZpbmUgUzEyTQkJMTIwMDAwMDAKKyNkZWZpbmUgUzEzTQkJMTMwMDAwMDAKKyNkZWZpbmUgUzE5XzJNCQkxOTIwMDAwMAorI2RlZmluZSBTMjRNCQkyNDAwMDAwMAorI2RlZmluZSBTMjZNCQkyNjAwMDAwMAorI2RlZmluZSBTMzhfNE0JCTM4NDAwMDAwCisKKyNlbmRpZgorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDJ4LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDI0MlhfQ0xPQ0tTX0hfCisjZGVmaW5lIF9PTUFQMjQyWF9DTE9DS1NfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio7Cis7IFBSQ00gU2NoZW1lIEkKKzsKKzsgRW5hYmxlIGNsb2NrcyBhbmQgRFBMTCBmb3I6Cis7ICBEUExMPTMzMCwgCURQTExvdXQ9NjYwICAgCU09MSxOPTU1ICAgQ01fQ0xLU0VMMV9QTExbMjE6OF0gIDEyLzIqNTUKKzsgIENvcmU9NjYwICAJKGNvcmUgZG9tYWluKSAgIERQTEx4MiAgICAgQ01fQ0xLU0VMMl9QTExbMTowXQorOyAgTVBVRj0zMzAgICAJKG1wdSBkb21haW4pICAgIDIgICAgICAgICAgQ01fQ0xLU0VMX01QVVs0OjBdCis7ICBEU1BGPTIyMCAgICAgKGRzcCBkb21haW4pICAgIDMgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs0OjBdCis7ICBEU1BJPTExMCAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs2OjVdCis7ICBEU1BfUyAgICAgICAgYWN0aXZhdGVkCSAgICAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbN10KKzsgIElWQUY9MTY1ICAgICAoZHNwIGRvbWFpbikgICAgNCAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEyOjhdCis7ICBJVkFGPTgyLjUgICAgICAgYXV0bworOyAgSVZBSSAgICAgICAgICAgIGF1dG8KKzsgIElWQV9NUFUgICAgICAgICBhdXRvCis7ICBJVkFfUyAgICAgICAgICBieXBhc3MgICAgICAgICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxM10KKzsgIEdGWEY9ODIuNSAgICAoZ2Z4IGRvbWFpbikJOCAgICAgICAgICBDTV9DTEtTRUxfRkdYWzI6MF0KKzsgIFNTSV9TU1JGPTIyMCAgICAgICAgICAgICAgICAgMyAgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbMjQ6MjBdCis7ICBTU0lfU1NURj0xMTAgICAgYXV0bworOyAgTDM9MTY1TWh6ICAgIChzZHJhbSkgICAgICAgICA0ICAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs0OjBdCis7ICBMND04Mi41TWh6ICAgICAgICAgICAgICAgICAgIDggICAgICAgICAgCis7ICBDX0w0X1VTQj00MS4yNSAgICAgICAgICAgICAgIDE2ICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzY6NV0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSV9EUExMX09VVF9YMiAgIDB4MiAgICAvKiB4MiBjb3JlIG91dCAqLworI2RlZmluZSBJX01QVV9ESVYgICAgICAgMHgyICAgIC8qIG1wdSA9IGNvcmUvMiAqLworI2RlZmluZSBJX0RTUF9ESVYgICAgICAgMHgzYzMgIC8qIGRzcCAmIGl2YSBkaXZpZGVyICovCisjZGVmaW5lIElfR0ZYX0RJViAgICAgICAweDIKKyNkZWZpbmUgSV9CVVNfRElWICAgICAgIDB4MDQ2MDEwNDQKKyNpZmRlZiBJTlBVVF9DTEtfMTNNSFoKKyNkZWZpbmUgSV9EUExMXzMzMCAgICAgIDB4MDExNEFDMDAgIC8qIDEzTUh6ICovCisjZWxzZQorI2RlZmluZSBJX0RQTExfMzMwICAgICAgMHgwMTgzNzEwMCAgLyogMTJNSHogKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjsKKzsgUFJDTSBTY2hlbWUgSUkgICA8dGVzdGVkPgorOworOyBFbmFibGUgY2xvY2tzIGFuZCBEUExMIGZvcjoKKzsgIERQTEw9MzAwLCAJRFBMTG91dD02MDAgICAJTT0xLE49NTAgICBDTV9DTEtTRUwxX1BMTFsyMTo4XSAgMTIvMio1MAorOyAgQ29yZT02MDAgIAkoY29yZSBkb21haW4pICAgRFBMTHgyICAgICBDTV9DTEtTRUwyX1BMTFsxOjBdCis7ICBNUFVGPTMwMCAgIAkobXB1IGRvbWFpbikgICAgMiAgICAgICAgICBDTV9DTEtTRUxfTVBVWzQ6MF0KKzsgIERTUEY9MjAwICAgIChkc3AgZG9tYWluKSAgICAzICAgICAgICAgIENNX0NMS1NFTF9EU1BbNDowXQorOyAgRFNQST0xMDAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs2OjVdCis7ICBEU1BfUyAgICAgICAgICBieXBhc3MJICAgICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs3XQorOyAgSVZBRj0yMDAgICAgKGRzcCBkb21haW4pICAgIDMgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxMjo4XQorOyAgSVZBRj0xMDAgICAgICAgIGF1dG8KKzsgIElWQUkgICAgICAgICAgICBhdXRvCis7ICBJVkFfTVBVICAgICAgICAgYXV0bworOyAgSVZBX1MgICAgICAgICAgYnlwYXNzICAgICAgICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxM10KKzsgIEdGWEY9NTAgICAgICAoZ2Z4IGRvbWFpbikJMTIgICAgICAgICBDTV9DTEtTRUxfRkdYWzI6MF0KKzsgIFNTSV9TU1JGPTIwMCAgICAgICAgICAgICAgICAgMyAgICAgICAgIENNX0NMS1NFTDFfQ09SRVsyNDoyMF0KKzsgIFNTSV9TU1RGPTEwMCAgICAgYXV0bworOyAgTDM9MTAwTWh6IChzZHJhbSkgICAgICAgICAgICA2ICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzQ6MF0KKzsgIEw0PTEwME1oeiAgICAgICAgICAgICAgICAgICAgNgorOyAgQ19MNF9VU0I9NTAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzY6NV0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSUlfRFBMTF9PVVRfWDIgICAweDIgICAgLyogeDIgY29yZSBvdXQgKi8KKyNkZWZpbmUgSUlfTVBVX0RJViAgICAgICAweDIgICAgLyogbXB1ID0gY29yZS8yICovCisjZGVmaW5lIElJX0RTUF9ESVYgICAgICAgMHgzNDMgIC8qIGRzcCAmIGl2YSBkaXZpZGVyICovCisjZGVmaW5lIElJX0dGWF9ESVYgICAgICAgMHgyCisjZGVmaW5lIElJX0JVU19ESVYgICAgICAgMHgwNDYwMTAyNgorI2lmZGVmIElOUFVUX0NMS18xM01IWgorI2RlZmluZSBJSV9EUExMXzMwMCAgICAgIDB4MDExMkNDMDAgIC8qIDEzTUh6ICovCisjZWxzZQorI2RlZmluZSBJSV9EUExMXzMwMCAgICAgIDB4MDE4MzIxMDAgIC8qIDEyTUh6ICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio7Cis7IFBSQ00gU2NoZW1lIElJSSAgPHRlc3RlZD4KKzsKKzsgRW5hYmxlIGNsb2NrcyBhbmQgRFBMTCBmb3I6Cis7ICBEUExMPTI2NiwgCURQTExvdXQ9NTMyICAgCU09NSsxLE49MTMzIENNX0NMS1NFTDFfUExMWzIxOjhdICAxMi82KjEzMz0yNjYKKzsgIENvcmU9NTMyICAJKGNvcmUgZG9tYWluKSAgIERQTEx4MiAgICAgIENNX0NMS1NFTDJfUExMWzE6MF0KKzsgIE1QVUY9MjY2ICAgCShtcHUgZG9tYWluKSAgICAvMiAgICAgICAgICBDTV9DTEtTRUxfTVBVWzQ6MF0KKzsgIERTUEY9MTc3LjMgICAgIChkc3AgZG9tYWluKSAgLzMgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs0OjBdCis7ICBEU1BJPTg4LjY3ICAgICAgICAgICAgICAgICAgIC82ICAgICAgICAgIENNX0NMS1NFTF9EU1BbNjo1XQorOyAgRFNQX1MgICAgICAgICBBQ1RJVkFURUQJICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFs3XQorOyAgSVZBRj04OC42NyAgICAoZHNwIGRvbWFpbikgICAvMyAgICAgICAgICBDTV9DTEtTRUxfRFNQWzEyOjhdCis7ICBJVkFGPTg4LjY3ICAgICAgICBhdXRvCis7ICBJVkFJICAgICAgICAgICAgYXV0bworOyAgSVZBX01QVSAgICAgICAgIGF1dG8KKzsgIElWQV9TICAgICAgICAgQUNUSVZBVEVEICAgICAgICAgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxM10KKzsgIEdGWEY9NjYuNSAgICAgIChnZnggZG9tYWluKQkvOCAgICAgICAgICBDTV9DTEtTRUxfRkdYWzI6MF06Cis7ICBTU0lfU1NSRj0xNzcuMyAgICAgICAgICAgICAgIC8zICAgICAgICAgIENNX0NMS1NFTDFfQ09SRVsyNDoyMF0KKzsgIFNTSV9TU1RGPTg4LjY3ICAgICBhdXRvCis7ICBMMz0xMzNNaHogKHNkcmFtKSAgICAgICAgICAgIC80ICAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs0OjBdCis7ICBMND02Ni41TWh6ICAgICAgICAgICAgICAgICAgIC84Cis7ICBDX0w0X1VTQj0zMy4yNSAgICAgICAgICAgICAgIC8xNiAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs2OjVdCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElJSV9EUExMX09VVF9YMiAgIDB4MiAgICAvKiB4MiBjb3JlIG91dCAqLworI2RlZmluZSBJSUlfTVBVX0RJViAgICAgICAweDIgICAgLyogbXB1ID0gY29yZS8yICovCisjZGVmaW5lIElJSV9EU1BfRElWICAgICAgIDB4MjNDMyAvKiBkc3AgJiBpdmEgZGl2aWRlciBzeWNoIGVuYWJsZWQqLworI2RlZmluZSBJSUlfR0ZYX0RJViAgICAgICAweDIKKyNkZWZpbmUgSUlJX0JVU19ESVYgICAgICAgMHgwODMwMTA0NAorI2lmZGVmIElOUFVUX0NMS18xM01IWgorI2RlZmluZSBJSUlfRFBMTF8yNjYgICAgICAweDAxMTBBQzAwICAgLyogMTNNSHogKi8KKyNlbHNlCisjZGVmaW5lIElJSV9EUExMXzI2NiAgICAgIDB4MDE4ODU1MDAgICAvKiAxMk1IeiAqLworI2VuZGlmCisKKy8qIHNldCBkZWZhdWx0cyBmb3IgYm9vdCB1cCAqLworI2lmZGVmIFBSQ01fQ09ORklHX0kKKyMgZGVmaW5lIERQTExfT1VUICAgICAgICAgSV9EUExMX09VVF9YMgorIyBkZWZpbmUgTVBVX0RJViAgICAgICAgICBJX01QVV9ESVYKKyMgZGVmaW5lIERTUF9ESVYgICAgICAgICAgSV9EU1BfRElWCisjIGRlZmluZSBHRlhfRElWICAgICAgICAgIElfR0ZYX0RJVgorIyBkZWZpbmUgQlVTX0RJViAgICAgICAgICBJX0JVU19ESVYKKyMgZGVmaW5lIERQTExfVkFMICAgICAgICAgSV9EUExMXzI2NgorI2VsaWYgUFJDTV9DT05GSUdfSUkKKyMgZGVmaW5lIERQTExfT1VUICAgICAgICAgSUlfRFBMTF9PVVRfWDIKKyMgZGVmaW5lIE1QVV9ESVYgICAgICAgICAgSUlfTVBVX0RJVgorIyBkZWZpbmUgRFNQX0RJViAgICAgICAgICBJSV9EU1BfRElWCisjIGRlZmluZSBHRlhfRElWICAgICAgICAgIElJX0dGWF9ESVYKKyMgZGVmaW5lIEJVU19ESVYgICAgICAgICAgSUlfQlVTX0RJVgorIyBkZWZpbmUgRFBMTF9WQUwgICAgICAgICBJSV9EUExMXzMwMAorI2VsaWYgUFJDTV9DT05GSUdfSUlJCisjIGRlZmluZSBEUExMX09VVCAgICAgICAgIElJSV9EUExMX09VVF9YMgorIyBkZWZpbmUgTVBVX0RJViAgICAgICAgICBJSUlfTVBVX0RJVgorIyBkZWZpbmUgRFNQX0RJViAgICAgICAgICBJSUlfRFNQX0RJVgorIyBkZWZpbmUgR0ZYX0RJViAgICAgICAgICBJSUlfR0ZYX0RJVgorIyBkZWZpbmUgQlVTX0RJViAgICAgICAgICBJSUlfQlVTX0RJVgorIyBkZWZpbmUgRFBMTF9WQUwgICAgICAgICBJSUlfRFBMTF8yNjYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDN4LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQzeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDJlNDYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQzeC5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDI0M1hfQ0xPQ0tTX0hfCisjZGVmaW5lIF9PTUFQMjQzWF9DTE9DS1NfSF8KKworLyogY21fY2xrc2VsIGNvcmUgZmllbGRzIG5vdCByYXRpbyBnb3Zlcm5lZCAqLworI2RlZmluZSBSWF9DTEtTRUxfRFNTMQkJKDB4MTAgPDwgOCkKKyNkZWZpbmUgUlhfQ0xLU0VMX0RTUzIJCSgweDAgPDwgMTMpCisjZGVmaW5lIFJYX0NMS1NFTF9TU0kJCSgweDUgPDwgMjApCisKKy8qIDI0MzAgUmF0aW8ncyAqLworLyogMjQzMC1SYXRpbyBDb25maWcgMSAqLworI2RlZmluZSBSMV9DTEtTRUxfTDMJCSg0IDw8IDApCisjZGVmaW5lIFIxX0NMS1NFTF9MNAkJKDIgPDwgNSkKKyNkZWZpbmUgUjFfQ0xLU0VMX1VTQgkJKDQgPDwgMjUpCisjZGVmaW5lIFIxX0NNX0NMS1NFTDFfQ09SRV9WQUwJUjFfQ0xLU0VMX1VTQiB8IFJYX0NMS1NFTF9TU0kgfCBSWF9DTEtTRUxfRFNTMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlhfQ0xLU0VMX0RTUzEgfCBSMV9DTEtTRUxfTDQgfCBSMV9DTEtTRUxfTDMKKyNkZWZpbmUgUjFfQ0xLU0VMX01QVQkJKDIgPDwgMCkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMX01QVV9WQUwJUjFfQ0xLU0VMX01QVQorI2RlZmluZSBSMV9DTEtTRUxfRFNQCQkoMiA8PCAwKQorI2RlZmluZSBSMV9DTEtTRUxfRFNQX0lGCSgyIDw8IDUpCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9EU1BfVkFMCVIxX0NMS1NFTF9EU1AgfCBSMV9DTEtTRUxfRFNQX0lGCisjZGVmaW5lIFIxX0NMS1NFTF9HRlgJCSgyIDw8IDApCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9HRlhfVkFMCVIxX0NMS1NFTF9HRlgKKyNkZWZpbmUgUjFfQ0xLU0VMX01ETQkJKDQgPDwgMCkKKyNkZWZpbmUgUjFfQ01fQ0xLU0VMX01ETV9WQUwJUjFfQ0xLU0VMX01ETQorCisvKiAyNDMwLVJhdGlvIENvbmZpZyAyICovCisjZGVmaW5lIFIyX0NMS1NFTF9MMwkJKDYgPDwgMCkKKyNkZWZpbmUgUjJfQ0xLU0VMX0w0CQkoMiA8PCA1KQorI2RlZmluZSBSMl9DTEtTRUxfVVNCCQkoMiA8PCAyNSkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMMV9DT1JFX1ZBTAlSMl9DTEtTRUxfVVNCIHwgUlhfQ0xLU0VMX1NTSSB8IFJYX0NMS1NFTF9EU1MyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSWF9DTEtTRUxfRFNTMSB8IFIyX0NMS1NFTF9MNCB8IFIyX0NMS1NFTF9MMworI2RlZmluZSBSMl9DTEtTRUxfTVBVCQkoMiA8PCAwKQorI2RlZmluZSBSMl9DTV9DTEtTRUxfTVBVX1ZBTAlSMl9DTEtTRUxfTVBVCisjZGVmaW5lIFIyX0NMS1NFTF9EU1AJCSgyIDw8IDApCisjZGVmaW5lIFIyX0NMS1NFTF9EU1BfSUYJKDMgPDwgNSkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX0RTUF9WQUwJUjJfQ0xLU0VMX0RTUCB8IFIyX0NMS1NFTF9EU1BfSUYKKyNkZWZpbmUgUjJfQ0xLU0VMX0dGWAkJKDIgPDwgMCkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX0dGWF9WQUwgICAgUjJfQ0xLU0VMX0dGWAorI2RlZmluZSBSMl9DTEtTRUxfTURNCQkoNiA8PCAwKQorI2RlZmluZSBSMl9DTV9DTEtTRUxfTURNX1ZBTAlSMl9DTEtTRUxfTURNCisKKy8qIDI0MzAtUmF0aW8gQm9vdCAqLworI2RlZmluZSBSQl9DTEtTRUxfTDMJCSgxIDw8IDApCisjZGVmaW5lIFJCX0NMS1NFTF9MNAkJKDEgPDwgNSkKKyNkZWZpbmUgUkJfQ0xLU0VMX1VTQgkJKDEgPDwgMjUpCisjZGVmaW5lIFJCX0NNX0NMS1NFTDFfQ09SRV9WQUwJUkJfQ0xLU0VMX1VTQiB8IFJYX0NMS1NFTF9TU0kgfCBSWF9DTEtTRUxfRFNTMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlhfQ0xLU0VMX0RTUzEgfCBSQl9DTEtTRUxfTDQgfCBSQl9DTEtTRUxfTDMKKyNkZWZpbmUgUkJfQ0xLU0VMX01QVQkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMX01QVV9WQUwJUkJfQ0xLU0VMX01QVQorI2RlZmluZSBSQl9DTEtTRUxfRFNQCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTEtTRUxfRFNQX0lGCSgxIDw8IDUpCisjZGVmaW5lIFJCX0NNX0NMS1NFTF9EU1BfVkFMCVJCX0NMS1NFTF9EU1AgfCBSQl9DTEtTRUxfRFNQX0lGCisjZGVmaW5lIFJCX0NMS1NFTF9HRlgJCSgxIDw8IDApCisjZGVmaW5lIFJCX0NNX0NMS1NFTF9HRlhfVkFMCVJCX0NMS1NFTF9HRlgKKyNkZWZpbmUgUkJfQ0xLU0VMX01ETQkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ01fQ0xLU0VMX01ETV9WQUwJUkJfQ0xLU0VMX01ETQorCisvKiAyNDMwIFRhcmdldCBtb2RlczogQWxvbmcgd2l0aCBlYWNoIGNvbmZpZ3VyYXRpb24gdGhlIENQVSBoYXMgc2V2ZXJhbCBtb2RlcworICogd2hpY2ggZ29lcyBhbG9uZyB3aXRoIHRoZW0uIE1vZGVzIG1haW5seSBhcmUgdGhlIGFkZGl0aW9uIG9mIGRlc2NyaXRlIERQTEwKKyAqIGNvbWJpbmF0aW9ucyB0byBnbyBhbG9uZyB3aXRoIGEgcmF0aW8uCisgKi8KKy8qIGhhcmR3YXJlIGdvdmVyZW5kICovCisjZGVmaW5lIE1YXzQ4TV9TUkMJCSgwIDw8IDMpCisjZGVmaW5lIE1YXzU0TV9TUkMJCSgwIDw8IDUpCisjZGVmaW5lIE1YX0FQTExTX0NMSUtJTl8xMgkoMyA8PCAyMykKKyNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzEzCSgyIDw8IDIzKQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTlfMgkoMCA8PCAyMykKKworLyogMjQzMCAtIHN0YW5kYWxvbmUsIDIqcmVmKk0vKG4rMSksIE0vTiBpcyBmb3IgZXhhY3RuZXNzIG5vdCByZWxvY2sgc3BlZWQgKi8KKworLyogYm9vdCAoYm9vdCkgKi8KKyNkZWZpbmUgTUJfRFBMTF9NVUxUCQkJCSgxIDw8IDEyKQorI2RlZmluZSBNQl9EUExMX0RJVgkJCQkJKDAgPDwgOCkKKyNkZWZpbmUgTUJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMICAgICBNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTUJfRFBMTF9NVUxUIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisKKyNkZWZpbmUgTUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMICAgIE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTUJfRFBMTF9ESVYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9EUExMX01VTFQgfCBNWF9BUExMU19DTElLSU5fMTMKKworI2RlZmluZSBNQl9DTV9DTEtTRUwxX1BMTF8xOV9WQUwgICAgTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNQl9EUExMX0RJViBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xOQorCisvKiAjMiAgIChyYXRpbzEpIERQTEwgPSAzMzAqMiA9IDY2ME1IeiwgTDM9MTY1TUh6ICovCisKKyNkZWZpbmUgTTJfRFBMTF9NVUxUXzEyCQkgICAgICAgICg1NSA8PCAxMikKKyNkZWZpbmUgTTJfRFBMTF9ESVZfMTIJCSAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgTTJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTJfRFBMTF9ESVZfMTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNMl9EUExMX01VTFRfMTIgfCBNWF9BUExMU19DTElLSU5fMTIKKy8qIFVzZSA2NTguN01IeiBpbnN0ZWFkIG9mIDY2ME1IeiBmb3IgTFAtUmVmcmVzaCBNPTc2IE49MiwgcmVsb2NrIHRpbWUgaXNzdWUgKi8KKyNkZWZpbmUgTTJfRFBMTF9NVUxUXzEzCQkgICAgICAgICgzMzAgPDwgMTIpCisjZGVmaW5lIE0yX0RQTExfRElWXzEzCQkgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNMl9EUExMX0RJVl8xMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0yX0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMworI2RlZmluZSBNMl9EUExMX01VTFRfMTkJCSAgICAgICAgKDI3NSA8PCAxMikKKyNkZWZpbmUgTTJfRFBMTF9ESVZfMTkJCSAgICAgICAgKDE1IDw8IDgpCisjZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0yX0RQTExfRElWXzE5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTJfRFBMTF9NVUxUXzE5IHwgTVhfQVBMTFNfQ0xJS0lOXzE5XzIKKworLyogIzMgICAocmF0aW8yKSBEUExMID0gMzMwKjIgPSA2NjBNSHosIEwzPTExME1IeiAqLworI2RlZmluZSBNM19EUExMX01VTFRfMTIJCSAgICAgICAgKDU1IDw8IDEyKQorI2RlZmluZSBNM19EUExMX0RJVl8xMgkJICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBNM19DTV9DTEtTRUwxX1BMTF8xMl9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNM19EUExMX0RJVl8xMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0zX0RQTExfTVVMVF8xMiB8IE1YX0FQTExTX0NMSUtJTl8xMgorI2RlZmluZSBNM19EUExMX01VTFRfMTMJCSAgICAgICAgKDMzMCA8PCAxMikKKyNkZWZpbmUgTTNfRFBMTF9ESVZfMTMJCSAgICAgICAgKDEyIDw8IDgpCisjZGVmaW5lIE0zX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0zX0RQTExfRElWXzEzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTNfRFBMTF9NVUxUXzEzIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisjZGVmaW5lIE0zX0RQTExfTVVMVF8xOQkJICAgICAgICAoMjc1IDw8IDEyKQorI2RlZmluZSBNM19EUExMX0RJVl8xOQkJICAgICAgICAoMTUgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTNfRFBMTF9ESVZfMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNM19EUExMX01VTFRfMTkgfCBNWF9BUExMU19DTElLSU5fMTlfMgorCisvKiAjNCAgIChyYXRpbzIpLCBEUExMID0gMzk5KjIgPSA3OThNSHosIEwzPTEzM01IeiovCisjZGVmaW5lIE00X0RQTExfTVVMVF8xMgkJICAgICAgICAoMTMzIDw8IDEyKQorI2RlZmluZSBNNF9EUExMX0RJVl8xMgkJICAgICAgICAoMyA8PCA4KQorI2RlZmluZSBNNF9DTV9DTEtTRUwxX1BMTF8xMl9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNF9EUExMX0RJVl8xMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE00X0RQTExfTVVMVF8xMiB8IE1YX0FQTExTX0NMSUtJTl8xMgorI2RlZmluZSBNNF9EUExMX01VTFRfMTMJCSAgICAgICAgKDM5OSA8PCAxMikKKyNkZWZpbmUgTTRfRFBMTF9ESVZfMTMJCSAgICAgICAgKDEyIDw8IDgpCisjZGVmaW5lIE00X0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE00X0RQTExfRElWXzEzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTRfRFBMTF9NVUxUXzEzIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisjZGVmaW5lIE00X0RQTExfTVVMVF8xOQkJICAgICAgICAoMTQ1IDw8IDEyKQorI2RlZmluZSBNNF9EUExMX0RJVl8xOQkJICAgICAgICAoNiA8PCA4KQorI2RlZmluZSBNNF9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNF9EUExMX0RJVl8xOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE00X0RQTExfTVVMVF8xOSB8IE1YX0FQTExTX0NMSUtJTl8xOV8yCisKKy8qICM1YSAgKHJhdGlvMSkgYmFzZXBvcnQtdGFyZ2V0LCB0YXJnZXQgRFBMTCA9IDI2NioyID0gNTMyTUh6LCBMMz0xMzNNSHogKi8KKyNkZWZpbmUgTTVBX0RQTExfTVVMVF8xMgkgICAgICAgICgxMzMgPDwgMTIpCisjZGVmaW5lIE01QV9EUExMX0RJVl8xMgkJICAgICAgICAoNSA8PCA4KQorI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVBX0RQTExfRElWXzEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVBX0RQTExfTVVMVF8xMiB8IE1YX0FQTExTX0NMSUtJTl8xMgorI2RlZmluZSBNNUFfRFBMTF9NVUxUXzEzCSAgICAgICAgKDI2NiA8PCAxMikKKyNkZWZpbmUgTTVBX0RQTExfRElWXzEzCQkgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVBX0RQTExfRElWXzEzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVBX0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMworI2RlZmluZSBNNUFfRFBMTF9NVUxUXzE5CSAgICAgICAgKDE4MCA8PCAxMikKKyNkZWZpbmUgTTVBX0RQTExfRElWXzE5CQkgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBNNUFfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVBX0RQTExfRElWXzE5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVBX0RQTExfTVVMVF8xOSB8IE1YX0FQTExTX0NMSUtJTl8xOV8yCisKKy8qICM1YiAgKHJhdGlvMSkgdGFyZ2V0IERQTEwgPSAyMDAqMiA9IDQwME1IeiwgTDM9MTAwTUh6ICovCisjZGVmaW5lIE01Ql9EUExMX01VTFRfMTIJICAgICAgICAoNTAgPDwgMTIpCisjZGVmaW5lIE01Ql9EUExMX0RJVl8xMgkJICAgICAgICAoMiA8PCA4KQorI2RlZmluZSBNNUJfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVCX0RQTExfRElWXzEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVCX0RQTExfTVVMVF8xMiB8IE1YX0FQTExTX0NMSUtJTl8xMgorI2RlZmluZSBNNUJfRFBMTF9NVUxUXzEzCSAgICAgICAgKDIwMCA8PCAxMikKKyNkZWZpbmUgTTVCX0RQTExfRElWXzEzCQkgICAgICAgICgxMiA8PCA4KQorCisjZGVmaW5lIE01Ql9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUJfRFBMTF9ESVZfMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUJfRFBMTF9NVUxUXzEzIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisjZGVmaW5lIE01Ql9EUExMX01VTFRfMTkJICAgICAgICAoMTI1IDw8IDEyKQorI2RlZmluZSBNNUJfRFBMTF9ESVZfMTkJCSAgICAgICAgKDMxIDw8IDgpCisjZGVmaW5lIE01Ql9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNUJfRFBMTF9ESVZfMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNUJfRFBMTF9NVUxUXzE5IHwgTVhfQVBMTFNfQ0xJS0lOXzE5XzIKKworLyogMjQzMCAtIGNoYXNzaXMgKHNlZG5hKSAqLworCS8qIDE2NSAocmF0aW8xKSBzYW1lIGFzIGFib3ZlICMyICovCisJLyogMTUwIChyYXRpbzEpKi8KKwkvKiAxMzMgKHJhdGlvMikgc2FtZSBhcyBhYm92ZSAjNCAqLworCS8qIDExMCAocmF0aW8yKSBzYW1lIGFzIGFib3ZlICMzKi8KKwkvKiAxMDQgKHJhdGlvMikqLworCS8qIGJvb3QgKGJvb3QpICovCisKKy8qIGhpZ2ggYW5kIGxvdyBvcGVyYXRpb24gdmFsdWUgKi8KKyNkZWZpbmUgTVhfQ0xLU0VMMl9QTExfMnhfVkFMICAgKDIgPDwgMCkKKyNkZWZpbmUgTVhfQ0xLU0VMMl9QTExfMXhfVkFMICAgKDEgPDwgMCkKKworLyogc2V0IGRlZmF1bHRzIGZvciBib290IHVwICovCisjaWYgZGVmaW5lZChQUkNNX0NPTkZJR18yKSAgICAgLyogQVJNLTMzME1IeiBJVkEyLTMzME1IeiBMMy0xNjVNSHogKi8KKyMgZGVmaW5lIERQTExfT1VUCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTAorIyBkZWZpbmUgTVBVX0RJVglSMV9DTEtTRUxfTVBVCisjIGRlZmluZSBEU1BfRElWCVIxX0NNX0NMS1NFTF9EU1BfVkFMCisjIGRlZmluZSBHRlhfRElWCVIxX0NNX0NMS1NFTF9HRlhfVkFMCisjIGRlZmluZSBCVVNfRElWCVIxX0NNX0NMS1NFTDFfQ09SRV9WQUwKKyMgZGVmaW5lIERQTExfVkFMCU0yX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAorIyBkZWZpbmUgTURNX0RJVglSMl9DTV9DTEtTRUxfTURNX1ZBTAorI2VsaWYgZGVmaW5lZChQUkNNX0NPTkZJR18zKSAgICAgLyogQVJNLTMzME1IeiBJVkEyLTMzME1IeiBMMy0xMTBNSHogKi8KKyMgZGVmaW5lIERQTExfT1VUCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTAorIyBkZWZpbmUgTVBVX0RJVglSMl9DTEtTRUxfTVBVCisjIGRlZmluZSBEU1BfRElWCVIyX0NNX0NMS1NFTF9EU1BfVkFMCisjIGRlZmluZSBHRlhfRElWCVIyX0NNX0NMS1NFTF9HRlhfVkFMCisjIGRlZmluZSBCVVNfRElWCVIyX0NNX0NMS1NFTDFfQ09SRV9WQUwKKyMgZGVmaW5lIERQTExfVkFMCU0zX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAorIyBkZWZpbmUgTURNX0RJVglSMl9DTV9DTEtTRUxfTURNX1ZBTAorI2VsaWYgZGVmaW5lZChQUkNNX0NPTkZJR181QSkgIC8qIEFSTS0yNjZNSHogSVZBMi0yNjZNSHogTDMtMTMzTUh6ICovCisjIGRlZmluZSBEUExMX09VVAlNWF9DTEtTRUwyX1BMTF8yeF9WQUwKKyMgZGVmaW5lIE1QVV9ESVYJUjFfQ0xLU0VMX01QVQorIyBkZWZpbmUgRFNQX0RJVglSMV9DTV9DTEtTRUxfRFNQX1ZBTAorIyBkZWZpbmUgR0ZYX0RJVglSMV9DTV9DTEtTRUxfR0ZYX1ZBTAorIyBkZWZpbmUgQlVTX0RJVglSMV9DTV9DTEtTRUwxX0NPUkVfVkFMCisjIGRlZmluZSBEUExMX1ZBTAlNNUFfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCisjIGRlZmluZSBNRE1fRElWCVIyX0NNX0NMS1NFTF9NRE1fVkFMCisjZWxpZiBkZWZpbmVkKFBSQ01fQ09ORklHXzVCKSAgLyogQVJNLTIwME1IeiBJVkEyLTIwME1IeiBMMy0xMDBNSHogKi8KKyMgZGVmaW5lIERQTExfT1VUCU1YX0NMS1NFTDJfUExMXzJ4X1ZBTAorIyBkZWZpbmUgTVBVX0RJVglSMV9DTEtTRUxfTVBVCisjIGRlZmluZSBEU1BfRElWCVIxX0NNX0NMS1NFTF9EU1BfVkFMCisjIGRlZmluZSBHRlhfRElWCVIxX0NNX0NMS1NFTF9HRlhfVkFMCisjIGRlZmluZSBCVVNfRElWCVIxX0NNX0NMS1NFTDFfQ09SRV9WQUwKKyMgZGVmaW5lIERQTExfVkFMCU01Ql9DTV9DTEtTRUwxX1BMTF8xM19WQUwKKyMgZGVmaW5lIE1ETV9ESVYJUjFfQ01fQ0xLU0VMX01ETV9WQUwKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9tZW0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNkYTczCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L21lbS5oCkBAIC0wLDAgKzEsMzgzIEBACisKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAyNFhYX01FTV9IXworI2RlZmluZSBfT01BUDI0WFhfTUVNX0hfCisKKyNkZWZpbmUgU0RSQ19DUzBfT1NFVCAgICAweDAKKyNkZWZpbmUgU0RSQ19DUzFfT1NFVCAgICAweDMwICAvKiBtaXJyb3IgQ1MxIHJlZ3MgYXBwZWFyIG9mZnNldCAweDMwIGZyb20gQ1MwICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKiBzdHJ1Y3QncyBmb3IgaG9sZGluZyBkYXRhIHRhYmxlcyBmb3IgY3VycmVudCBib2FyZHMsIHRoZXkgYXJlIGdldHRpbmcgdXNlZAorICAgZWFybHkgaW4gaW5pdCB3aGVuIE5PIGdsb2JhbCBhY2Nlc3MgYXJlIHRoZXJlICovCitzdHJ1Y3Qgc2RyY19kYXRhX3MgeworCXUzMiAgICBzZHJjX3NoYXJpbmc7CisJdTMyICAgIHNkcmNfbWRjZmdfMF9kZHI7CisJdTMyICAgIHNkcmNfbWRjZmdfMF9zZHI7CisJdTMyICAgIHNkcmNfYWN0aW1fY3RybGFfMDsKKwl1MzIgICAgc2RyY19hY3RpbV9jdHJsYl8wOworCXUzMiAgICBzZHJjX3Jmcl9jdHJsOworCXUzMiAgICBzZHJjX21yXzBfZGRyOworCXUzMiAgICBzZHJjX21yXzBfc2RyOworCXUzMiAgICBzZHJjX2RsbGFiX2N0cmw7Cit9IC8qX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpKi87Cit0eXBlZGVmIHN0cnVjdCBzZHJjX2RhdGFfcyBzZHJjX2RhdGFfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlTVEFDS0VECQk9IDAsCisJSVBfRERSCQk9IDEsCisJQ09NQk9fRERSCT0gMiwKKwlJUF9TRFIJIAk9IDMsCit9IG1lbV90OworCisjZW5kaWYKKworLyogc2V0IHRoZSAyNDN4LVNEUkMgaW5jb21pbmcgYWRkcmVzcyBjb252ZW50aW9uICovCisjaWYgZGVmaW5lZChTRFJDX0JfUl9DKQorI2RlZmluZSBCX0FMTAkoMCA8PCA2KQkvKiBiYW5rLXJvdy1jb2x1bW4gKi8KKyNlbGlmIGRlZmluZWQoU0RSQ19CMV9SX0IwX0MpCisjZGVmaW5lIEJfQUxMCSgxIDw8IDYpCS8qIGJhbmsxLXJvdy1iYW5rMC1jb2x1bW4gKi8KKyNlbGlmIGRlZmluZWQoU0RSQ19SX0JfQykKKyNkZWZpbmUgQl9BTEwJKDIgPDwgNikJLyogcm93LWJhbmstY29sdW1uICovCisjZW5kaWYKKworLyogU2xvd2VyIGZ1bGwgZnJlcXVlbmN5IHJhbmdlIGRlZmF1bHQgdGltaW5ncyBmb3IgeDMyIG9wZXJhdGlvbiovCisjZGVmaW5lIEg0XzI0MjBfU0RSQ19TSEFSSU5HCQkweDAwMDAwMTAwCisjZGVmaW5lIEg0XzI0MjBfU0RSQ19NRENGR18wX1NEUgkweDAwRDA0MDEwIC8qIGRpc2NyZXRlIHNkciBtb2R1bGUgKi8KKyNkZWZpbmUgSDRfMjQyMF9TRFJDX01SXzBfU0RSCQkweDAwMDAwMDMxCisjZGVmaW5lIEg0XzI0MjBfU0RSQ19NRENGR18wX0REUgkweDAxNzAyMDExIC8qIGRlc2NyaXRlIGRkciBtb2R1bGUgKi8KKyNkZWZpbmUgU0RQXzI0MzBfU0RSQ19NRENGR18wX0REUgkoMHgwMjU4NDAxOXxCX0FMTCkgLyogSW5maW4gZGRyIG1vZHVsZSAqLworI2RlZmluZSBINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSCTB4MDA4MDEwMTEgLyogY29tYm8gbW9kdWxlICovCisjZGVmaW5lIEg0XzI0MjBfU0RSQ19NUl8wX0REUgkJMHgwMDAwMDAzMgorCisjZGVmaW5lIEg0XzI0MjJfU0RSQ19TSEFSSU5HCQkweDAwMDA0YjAwCisjZGVmaW5lIEg0XzI0MjJfU0RSQ19NRENGR19NT05PX0REUgkweDAxQTAyMDExIC8qIHN0YWNrZWQgbW9ubyBkaWUgZGRyIG9uIDI0MjIgKi8KKyNkZWZpbmUgSDRfMjQyMl9TRFJDX01EQ0ZHXzBfRERSCTB4MDA4MDEwMTEgLyogc3RhY2tlZCBkdWFsIGRpZSBkZHIgb24gMjQyMiAqLworI2RlZmluZSBINF8yNDIyX1NEUkNfTVJfMF9ERFIJCTB4MDAwMDAwMzIKKworI2RlZmluZSBINF8yNDIzX1NEUkNfU0hBUklORwkJMHgwMDAwNDkwMCAvKiAyNDIwUE9QIGJvYXJkIGNrZTEgbm90IGNvbm5lY3RlZCAqLworI2RlZmluZSBINF8yNDIzX1NEUkNfTURDRkdfMF9ERFIJMHgwMUEwMjAxMSAvKiBzdGFja2VkIGR1YWwgZGllIGRkciBvbiAyNDIzICovCisjZGVmaW5lIEg0XzI0MjNfU0RSQ19NRENGR18xX0REUgkweDAwODAxMDExIC8qIHN0YWNrZWQgZHVhbCBkaWUgZGRyIG9uIDI0MjMgKi8KKworLyogRVMxIHdvcmsgYXJvdW5kIHRpbWluZ3MgKi8KKyNkZWZpbmUgSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxBXzBfRVMxCTB4OWJlYWQ5MDkgIC8qIDE2NU1oeiBmb3IgdXNlIHdpdGggMTAwLzEzMyAqLworI2RlZmluZSBINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEJfMF9FUzEgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMQkweDAwMDAyNDAxICAvKiB1c2Ugb3ZlciByZWZyZXNoIGZvciBFUzEgKi8KKworLyogb3B0aW1pemVkIHRpbWluZ3MgZ29vZCBmb3IgY3VycmVudCBzaGlwcGluZyBwYXJ0cyAqLworI2RlZmluZSBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHogICAweDVBNTlCNDg1CisjZGVmaW5lIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEwME1IeiAgIDB4MDAwMDAwMGUKKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTMzTUh6ICAgMHg4QkE2RTZDOCAvKiB0ZW1wIHdhcm4gMCBzZXR0aW5ncyAqLworI2RlZmluZSBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMzNNSHogICAweDAwMDAwMDEwIC8qIHRlbXAgd2FybiAwIHNldHRpbmdzICovCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMDBNSHoJICAgIDB4MDAwMmRhMDEKKyNkZWZpbmUgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEzM01IegkgICAgMHgwMDAzZGUwMSAvKiA3Ljh1cy83LjVucyAtIDUwID0gMHgzZGUgKi8KKyNkZWZpbmUgU0RQXzI0WFhfU0RSQ19SRlJfQ1RSTF8xNjVNSHoJICAgIDB4MDAwNGUyMDEgLyogNy44dXMvNm5zIC0gNTAgPSAweDRlMiAqLworI2RlZmluZSBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMDBNSHogICAgICAweDAwMDA5ODBFIC8qIDkwZGVnLCBhbGxvdyBEUExMb3V0KjEgdG8gd29yayAoY29tYm8pKi8KKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTMzTUh6ICAgICAgMHgwMDAwNjkwRSAvKiA5MGRlZywgZm9yIEVTMiAqLworI2RlZmluZSBTRFBfMjRYWF9TRFJDX0RMTEFCX0NUUkxfMTY1TUh6ICAgICAweDAwMDAxNzBDIC8qIDcyZGVnLCBjb2RlIHdpbGwgcmVjYWxjIGRsbCBsb2FkICovCisKKy8qIEluZmluZW9uIHBhcnQgb2YgMjQzMFNEUCAoMTMzTUh6IG9wdGltaXplZCkgfiA3LjVucworICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNy41ICsgMjIuNS83LjUgPSAyICsgMyA9IDUKKyAqCVREUEwgPSAxNS83LjUJPSAyCisgKglUUlJEID0gMTUvMi41CT0gMgorICoJVFJDRCA9IDIyLjUvNy41CT0gMworICoJVFJQID0gMjIuNS83LjUJPSAzCisgKglUUkFTID0gNDUvNy41CT0gNgorICoJVFJDID0gNjUvNy41CT0gOC42LT45CisgKglUUkZDID0gNzUvNy41CT0gMTAKKyAqICAgQUNUSU1CCisgKglUQ0tFID0gMgk8bmV3IGluIDI0MzA+CisgKglYU1IgPSAxMjAvNy41ID0gMTYKKyAqLworI2RlZmluZSBUREFMXzEzMyAgIDUKKyNkZWZpbmUgVERQTF8xMzMgICAyCisjZGVmaW5lIFRSUkRfMTMzICAgMgorI2RlZmluZSBUUkNEXzEzMyAgIDMKKyNkZWZpbmUgVFJQXzEzMyAgICAzCisjZGVmaW5lIFRSQVNfMTMzICAgNgorI2RlZmluZSBUUkNfMTMzICAgIDkKKyNkZWZpbmUgVFJGQ18xMzMgIDEwCisjZGVmaW5lIFZfQUNUSU1BXzEzMyAoKFRSRkNfMTMzIDw8IDI3KSB8IChUUkNfMTMzIDw8IDIyKSB8IChUUkFTXzEzMyA8PCAxOCkgfChUUlBfMTMzIDw8IDE1KSB8IFwKKwkJKFRSQ0RfMTMzIDw8IDEyKSB8KFRSUkRfMTMzIDw8IDkpIHwoVERQTF8xMzMgPDwgNikgfCAoVERBTF8xMzMpKQorCisjZGVmaW5lIFRDS0VfMTMzICAgMgorI2RlZmluZSBYU1JfMTMzICAgMTYKKyNkZWZpbmUgVl9BQ1RJTUJfMTMzICgoVENLRV8xMzMgPDwgMTIpIHwgKFhTUl8xMzMgPDwgMCkpCisKKy8qIEluZmluZW9uIHBhcnQgb2YgMjQzMFNEUCAoMTY1TUh6IG9wdGltaXplZCkgNi4wNm5zCisgKiAgIEFDVElNQQorICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNiArIDE4LzYgPSAyLjUgKyAzID0gNS41IC0+IDYKKyAqCVREUEwgKFR3cikgPSAxNS82CT0gMi41IC0+IDMKKyAqCVRSUkQgPSAxMi82CT0gMgorICoJVFJDRCA9IDE4LzYJPSAzCisgKglUUlAgPSAxOC82CT0gMworICoJVFJBUyA9IDQyLzYJPSA3CisgKglUUkMgPSA2MC82CT0gMTAKKyAqCVRSRkMgPSA3Mi82CT0gMTIKKyAqICAgQUNUSU1CCisgKglUQ0tFID0gMgk8bmV3IGluIDI0MzA+CisgKglYU1IgPSAxMjAvNiA9IDIwCisgKi8KKyNkZWZpbmUgVERBTF8xNjUgICA2CisjZGVmaW5lIFREUExfMTY1ICAgMworI2RlZmluZSBUUlJEXzE2NSAgIDIKKyNkZWZpbmUgVFJDRF8xNjUgICAzCisjZGVmaW5lIFRSUF8xNjUgICAgMworI2RlZmluZSBUUkFTXzE2NSAgIDcKKyNkZWZpbmUgVFJDXzE2NSAgIDEwCisjZGVmaW5lIFRSRkNfMTY1ICAxMgorI2RlZmluZSBWX0FDVElNQV8xNjUgKChUUkZDXzE2NSA8PCAyNykgfCAoVFJDXzE2NSA8PCAyMikgfCAoVFJBU18xNjUgPDwgMTgpIHwoVFJQXzE2NSA8PCAxNSkgfCBcCisJCShUUkNEXzE2NSA8PCAxMikgfChUUlJEXzE2NSA8PCA5KSB8KFREUExfMTY1IDw8IDYpIHwgKFREQUxfMTY1KSkKKworI2RlZmluZSBUQ0tFXzE2NSAgIDIKKyNkZWZpbmUgWFNSXzE2NSAgIDIwCisjZGVmaW5lIFZfQUNUSU1CXzE2NSAoKFRDS0VfMTY1IDw8IDEyKSB8IChYU1JfMTY1IDw8IDApKQorCisjaWYgZGVmaW5lZChQUkNNX0NPTkZJR19JSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QikKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHoKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfQUNUSU1fQ1RSTEFfMCBWX0FDVElNQV8xMzMKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMDBNSHoKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19SRlJfQ1RSTCAgICAgICBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTAwTUh6CisjIGRlZmluZSBINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAgICAgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTAwTUh6CisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0RMTEFCX0NUUkwgICAgMHgwMDAwNzMwRQorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxBXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxCXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEwME1IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX1JGUl9DVFJMICAgICAgIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMDBNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19ETExBQl9DVFJMICAgICBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMDBNSHoKKyNlbGlmIGRlZmluZWQoUFJDTV9DT05GSUdfSUlJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVBKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzMpCisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTMzTUh6CisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0FDVElNX0NUUkxBXzAgVl9BQ1RJTUFfMTMzCisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTMzTUh6CisjIGRlZmluZSBINF8yNDIwX1NEUkNfUkZSX0NUUkwgICAgICAgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEzM01IegorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgICAgIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEzM01IegorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19ETExBQl9DVFJMICAgIDB4MDAwMDczMEUKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQV8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMzNNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQl8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMzNNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19SRlJfQ1RSTCAgICAgICBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTMzTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfRExMQUJfQ1RSTCAgICAgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTMzTUh6CisjZWxpZiBkZWZpbmVkKFBSQ01fQ09ORklHX0kpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfMikKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wICBWX0FDVElNQV8xNjUgCisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0FDVElNX0NUUkxBXzAgVl9BQ1RJTUFfMTY1CisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCAgVl9BQ1RJTUJfMTY1IAorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX1JGUl9DVFJMICAgICAgIFNEUF8yNFhYX1NEUkNfUkZSX0NUUkxfMTY1TUh6CisjIGRlZmluZSBINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAgICAgU0RQXzI0WFhfU0RSQ19ETExBQl9DVFJMXzE2NU1IegorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19ETExBQl9DVFJMICAgIFNEUF8yNFhYX1NEUkNfRExMQUJfQ1RSTF8xNjVNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQV8wICBWX0FDVElNQV8xNjUgCisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEJfMCAgVl9BQ1RJTUJfMTY1IAorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX1JGUl9DVFJMICAgICAgIFNEUF8yNFhYX1NEUkNfUkZSX0NUUkxfMTY1TUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfRExMQUJfQ1RSTCAgICAgU0RQXzI0WFhfU0RSQ19ETExBQl9DVFJMXzE2NU1IegorI2VuZGlmCisKKy8qCisgKiBHUE1DIHNldHRpbmdzIC0KKyAqIERlZmluaXRpb25zIGlzIGFzIHBlciB0aGUgZm9sbG93aW5nIGZvcm1hdAorICogIyBkZWZpbmUgPFBBUlQ+X0dQTUNfQ09ORklHPHg+IDx2YWx1ZT4KKyAqIFdoZXJlOgorICogUEFSVCBpcyB0aGUgcGFydCBuYW1lIGUuZy4gU1ROT1IgLSBJbnRlbCBTdHJhdGEgRmxhc2gKKyAqIHggaXMgR1BNQyBjb25maWcgcmVnaXN0ZXJzIGZyb20gMSB0byA2ICh0aGVyZSB3aWxsIGJlIDYgbWFjcm9zKQorICogVmFsdWUgaXMgY29ycmVzcG9uZGluZyB2YWx1ZQorICoKKyAqIEZvciBldmVyeSB2YWxpZCBQUkNNIGNvbmZpZ3VyYXRpb24gdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGRlZmluaXRpb24gb2YgdGhlIHNhbWUuCisgKiBpZiB2YWx1ZXMgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBib2FyZCwgdGhpcyBkZWZpbml0aW9uIHdpbGwgYmUgcHJlc2VudCBpbiB0aGlzIGZpbGUKKyAqIGlmIHZhbHVlcyBhcmUgZGVwZW5kZW50IG9uIHRoZSBib2FyZCwgdGhlbiB0aGlzIHNob3VsZCBnbyBpbnRvIGNvcnJlc3BvbmRpbmcgbWVtLWJvYXJkTmFtZS5oIGZpbGUKKyAqCisgKiBDdXJyZW50bHkgdmFsaWQgcGFydCBOYW1lcyBhcmUgKFBBUlQpOgorICogU1ROT1IgLSBJbnRlbCBTdHJhdGEgRmxhc2gKKyAqIFNNTkFORCAtIFNhbXN1bmcgTkFORAorICogTVBEQiAtIEg0IE1QREIgYm9hcmQKKyAqIFNCTk9SIC0gU2libGV5IE5PUgorICogT05OQU5EIC0gU2Ftc3VuZyBPbmUgTkFORAorICoKKyAqIGluY2x1ZGUvY29uZmlncy9maWxlLmggY29udGFpbnMgdGhlIGZvbGxvd2luZyBkZWZuIC0gZm9yIGFsbCBDUyB3ZSBhcmUgaW50ZXJlc3RlZAorICogI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTeCBQQVJUCisgKiAjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1N4X1NJWkUgU2l6ZQorICogI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTeF9NQVAgTWFwCisgKiBXaGVyZToKKyAqIHggLSBDUyBudW1iZXIKKyAqIFBBUlQgLSBQYXJ0IE5hbWUgYXMgZGVmaW5lZCBhYm92ZQorICogU0laRSAtIGhvdyBiaWcgaXMgdGhlIG1hcHBpbmcgdG8gYmUKKyAqICAgR1BNQ19TSVpFXzEyOE0gLSAweDgKKyAqICAgR1BNQ19TSVpFXzY0TSAgLSAweEMKKyAqICAgR1BNQ19TSVpFXzMyTSAgLSAweEUKKyAqICAgR1BNQ19TSVpFXzE2TSAgLSAweEYKKyAqIE1BUCAgLSBNYXAgdGhpcyBDUyB0byB3aGljaCBhZGRyZXNzKEdQTUMgYWRkcmVzcyBzcGFjZSktIEFic29sdXRlIGFkZHJlc3MKKyAqICAgPj4yNCBiZWZvcmUgYmVpbmcgdXNlZC4KKyAqLworCisjZGVmaW5lIEdQTUNfU0laRV8yNTZNICAweDAKKyNkZWZpbmUgR1BNQ19TSVpFXzEyOE0gIDB4OAorI2RlZmluZSBHUE1DX1NJWkVfNjRNICAgMHhDCisjZGVmaW5lIEdQTUNfU0laRV8zMk0gICAweEUKKyNkZWZpbmUgR1BNQ19TSVpFXzE2TSAgIDB4RgorCisjaWYgZGVmaW5lZChQUkNNX0NPTkZJR19JSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QikgLyogTDMgYXQgMTAwTUh6ICovCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDBBODAKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAwZjBmMDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA1MDUwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDBDMDYwQzA2CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwICAvKiAwPyBOb3QgZGVmaW5lZCBzbyBmYXIuLi4gdGhpcyB2YWx1ZSBpcyByZXNldCB2YWwgYXMgcGVyIGdwbWMgZG9jICovCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAgMHgwMDFGMUYwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgICAweDAwMDgwODAyCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAgMHgwMzFBMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgICAweDAwMDAwM0MyCisjZW5kaWYKKworI2lmIGRlZmluZWQoUFJDTV9DT05GSUdfSUlJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVBKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzMpIC8qIEwzIGF0IDEzM01IeiAqLworIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMEE4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwQzQ0CisKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDEwMDgxMDA4CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRjNAorCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAweDAwMDgwODAzCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgMHgxQzA5MUMwOQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgIDB4MDQxZjFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAweDAwMDAwNEM0CisKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNCAgMHgxMDA4MTAwOAorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDAwMAorCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxMjAwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMiAweDAwMGMwYzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMyAweDAwMDMwMzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNCAweDBjMDQwYzA0CisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxMDEwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwMDAwCisKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzEgMHgwMUU5MTIwMAorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMiAweDAwMUUxRTAxCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUczIDB4MDAwMjAyMDMKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzQgMHgxRDA0MUQwNAorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNSAweDAzMUQxRjFGCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc2IDB4MDAwMDA0QzQKKyNlbmRpZiAvKiBlbmRpZiBDRkdfUFJDTV9JSUkgKi8KKworI2lmIGRlZmluZWQgKFBSQ01fQ09ORklHX0kpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfMikgLyogTDMgYXQgMTY1TUh6ICovCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwQTgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDBDNDQKKworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MTEwOTExMDkKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTE0MUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwNGM0CisKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDMKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAweDFjMGIxYzBhCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgMHgwNDFmMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0QzQKKworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc0ICAweDExMDkxMTA5CisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc1ICAweDAxMTQxRjFGCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwMDAwCisKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDEyMDAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcyIDB4MDAwRjBGMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUczIDB4MDAwMzAzMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwNDBGMDQKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwRjEwMTAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAwMDAKKworIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMSAweDAxRTkxMjAwCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUcyIDB4MDAxRTFFMDEKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzMgMHgwMDAyMDIwMworIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNCAweDFEMDQxRDA0CisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc1IDB4MDMxRDFGMUYKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzYgMHgwMDAwMDRDNAorCisjZW5kaWYKKworI2lmIDAKKy8qIEJvYXJkIFNwZWNpZmljIFNldHRpbmdzIGZvciBlYWNoIG9mIHRoZSBjb25maWd1cmF0aW9ucyBmb3IgY2hpcHMKKyAqIHdob3NlIHZhbHVlcyBjaGFuZ2UgYXMgcGVyIHBsYXRmb3JtLiAtIE5vbmUgY3VycmVudGx5CisgKi8KKyNpZiBDT05GSUdfT01BUDI0WFhINAorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS1oNC5oPgorI2VuZGlmCisKKyNpZiBDT05GSUdfMjQzMFNEUAorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS1zZHAyNDMwLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIGlmIDAgKi8KKworLyogbWF4IG51bWJlciBvZiBHUE1DIENoaXAgU2VsZWN0cyAqLworI2RlZmluZSBHUE1DX01BWF9DUyAgICA4CisvKiBtYXggbnVtYmVyIG9mIEdQTUMgcmVncyAqLworI2RlZmluZSBHUE1DX01BWF9SRUcgICA3CisKKyNkZWZpbmUgUFJPQ19OT1IgICAgICAgMQorI2RlZmluZSBQUk9DX05BTkQgICAgICAyCisjZGVmaW5lIFBJU01PX1NJQkxFWTAgIDMKKyNkZWZpbmUgUElTTU9fU0lCTEVZMSAgNAorI2RlZmluZSBQSVNNT19PTkVOQU5EICA1CisjZGVmaW5lIERCR19NUERCICAgICAgIDYKKyNkZWZpbmUgUElTTU9fUENNQ0lBICAgNworCisvKiBtYWtlIGl0IHJlYWRhYmxlIGZvciB0aGUgZ3BtY19pbml0ICovCisjZGVmaW5lIFBST0NfTk9SX0JBU0UgICAJRkxBU0hfQkFTRQorI2RlZmluZSBQUk9DX05BTkRfQkFTRSAgCU5BTkRfQkFTRQorI2RlZmluZSBQSVNNT19TSUIwX0JBU0UgCVNJQkxFWV9NQVAxCisjZGVmaW5lIFBJU01PX1NJQjFfQkFTRSAJU0lCTEVZX01BUDIKKyNkZWZpbmUgUElTTU9fT05FTl9CQVNFIAlPTkVOQU5EX01BUAorI2RlZmluZSBEQkdfTVBEQl9CQVNFICAgCURFQlVHX0JBU0UKKyNkZWZpbmUgUElTTU9fUENNQ0lBX0JBU0UgIAlQQ01DSUFfQkFTRQorCisjZW5kaWYgLyogZW5kaWYgX09NQVAyNFhYX01FTV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDIwLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWU2NzlmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDIwLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAyNDIwX1NZU19IXworI2RlZmluZSBfT01BUDI0MjBfU1lTX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9zaXplcy5oPgorCisvKgorICogMjQyMCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyogQ09OVFJPTCAqLworI2RlZmluZSBPTUFQMjQyMF9DVFJMX0JBU0UgICAgKDB4NDgwMDAwMDApCisjZGVmaW5lIENPTlRST0xfU1RBVFVTICAgICAgICAoT01BUDI0MjBfQ1RSTF9CQVNFICsgMHgyRjgpCisKKy8qIFRBUCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBPTUFQMjQyMF9UQVBfQkFTRSAgICAgKDB4NDgwMTQwMDApCisjZGVmaW5lIFRBUF9JRENPREVfUkVHICAgICAgICAoT01BUDI0MjBfVEFQX0JBU0UrMHgyMDQpCisKKy8qIEdQTUMgKi8KKyNkZWZpbmUgT01BUDI0MjBfR1BNQ19CQVNFICAgICgweDY4MDBBMDAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJRyAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDEwKQorI2RlZmluZSBHUE1DX1NZU1NUQVRVUwkgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4MTQpCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4MUMpCisjZGVmaW5lIEdQTUNfVElNRU9VVF9DT05UUk9MICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NDApCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfQ09ORklHMV8wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NjApCisjZGVmaW5lIEdQTUNfQ09ORklHMl8wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NjQpCisjZGVmaW5lIEdQTUNfQ09ORklHM18wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NjgpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NkMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NzApCisjZGVmaW5lIEdQTUNfQ09ORklHNl8wICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NzQpCisjZGVmaW5lIEdQTUNfQ09ORklHN18wCSAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg3OCkKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg5MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg5NCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg5OCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHg5QykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHhBMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzEgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHhBNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzEJICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweEE4KQorCisvKiBTTVMgKi8KKyNkZWZpbmUgT01BUDI0MjBfU01TX0JBU0UgMHg2ODAwODAwMAorI2RlZmluZSBTTVNfU1lTQ09ORklHICAgICAoT01BUDI0MjBfU01TX0JBU0UrMHgxMCkKKworLyogU0RSQyAqLworI2RlZmluZSBPTUFQMjQyMF9TRFJDX0JBU0UgMHg2ODAwOTAwMAorI2RlZmluZSBTRFJDX1NZU0NPTkZJRyAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDEwKQorI2RlZmluZSBTRFJDX1NUQVRVUyAgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDE0KQorI2RlZmluZSBTRFJDX1NIQVJJTkcgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDQ0KQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTCAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDYwKQorI2RlZmluZSBTRFJDX0RMTEFfU1RBVFVTICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDY0KQorI2RlZmluZSBTRFJDX0RMTEJfQ1RSTCAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDY4KQorI2RlZmluZSBTRFJDX1BPV0VSICAgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDcwKQorI2RlZmluZSBTRFJDX01DRkdfMCAgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDgwKQorI2RlZmluZSBTRFJDX01SXzAgICAgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDg0KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweDlDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEEwKQorI2RlZmluZSBTRFJDX01DRkdfMSAgICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEIwKQorI2RlZmluZSBTRFJDX01SXzEJICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEI0KQorI2RlZmluZSBTRFJDX0VNUjJfMQkgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QkMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMSAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QzQpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMSAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QzgpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkwgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QTQpCisjZGVmaW5lIFNEUkNfTUFOVUFMXzAgICAgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4QTgpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkwxCSAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhENCkKKyNkZWZpbmUgU0RSQ19NQU5VQUxfMQkgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4RDgpCisKKyNkZWZpbmUgT01BUDI0MjBfU0RSQ19DUzAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgT01BUDI0MjBfU0RSQ19DUzEgIDB4QTAwMDAwMDAKKworI2RlZmluZSBMT0FERExMICAgICAgICAgICAgQklUMgorI2RlZmluZSBDTURfTk9QICAgICAgICAgICAgMHgwCisjZGVmaW5lIENNRF9QUkVDSEFSR0UgICAgICAweDEKKyNkZWZpbmUgQ01EX0FVVE9SRUZSRVNIICAgIDB4MgorI2RlZmluZSBDTURfRU5UUl9QV1JET1dOICAgMHgzCisjZGVmaW5lIENNRF9FWElUX1BXUkRPV04gICAweDQKKyNkZWZpbmUgQ01EX0VOVFJfU1JGUlNIICAgIDB4NQorI2RlZmluZSBDTURfQ0tFX0hJR0ggICAgICAgMHg2CisjZGVmaW5lIENNRF9DS0VfTE9XICAgICAgICAweDcKKyNkZWZpbmUgU09GVFJFU0VUICAgICAgICAgIEJJVDEKKyNkZWZpbmUgU01BUlRfSURMRSAgICAgICAgICgweDIgPDwgMykKKyNkZWZpbmUgUkVGX09OX0lETEUgICAgICAgICgweDEgPDwgNikKKworCisvKiBVQVJUICovCisjZGVmaW5lIE9NQVAyNDIwX1VBUlQxCSAgICAgIDB4NDgwNkEwMDAKKyNkZWZpbmUgT01BUDI0MjBfVUFSVDIJICAgICAgMHg0ODA2QzAwMAorI2RlZmluZSBPTUFQMjQyMF9VQVJUMyAgICAgICAgMHg0ODA2RTAwMAorCisvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXJzICovCisjZGVmaW5lIE9NQVAyNDIwX0dQVDEgICAgICAgICAweDQ4MDI4MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDIgICAgICAgICAweDQ4MDJBMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDMgICAgICAgICAweDQ4MDc4MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDQgICAgICAgICAweDQ4MDdBMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDUgICAgICAgICAweDQ4MDdDMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDYgICAgICAgICAweDQ4MDdFMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDcgICAgICAgICAweDQ4MDgwMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDggICAgICAgICAweDQ4MDgyMDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDkgICAgICAgICAweDQ4MDg0MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDEwICAgICAgICAweDQ4MDg2MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDExICAgICAgICAweDQ4MDg4MDAwCisjZGVmaW5lIE9NQVAyNDIwX0dQVDEyICAgICAgICAweDQ4MDhBMDAwCisKKy8qIHRpbWVyIHJlZ3Mgb2Zmc2V0cyAoMzIgYml0IHJlZ3MpICovCisjZGVmaW5lIFRJRFIgICAgICAgMHgwICAgICAgLyogciAqLworI2RlZmluZSBUSU9DUF9DRkcgIDB4MTAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJU1RBVCAgICAgMHgxNCAgICAgLyogciAqLworI2RlZmluZSBUSVNSICAgICAgIDB4MTggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJRVIgICAgICAgMHgxQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdFUiAgICAgICAweDIwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0xSICAgICAgIDB4MjQgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDUlIgICAgICAgMHgyOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVExEUiAgICAgICAweDJDICAgICAvKiBydyAqLworI2RlZmluZSBUVEdSICAgICAgIDB4MzAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXUFMgICAgICAgMHgzNCAgICAgLyogciAqLworI2RlZmluZSBUTUFSICAgICAgIDB4MzggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIxICAgICAgMHgzYyAgICAgLyogciAqLworI2RlZmluZSBUU0lDUiAgICAgIDB4NDAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIyICAgICAgMHg0NCAgICAgLyogciAqLworCisvKiBXYXRjaERvZyBUaW1lcnMgKDEgc2VjdXJlLCAzIEdQKSAqLworI2RlZmluZSBXRDFfQkFTRSAgICAgICAgICAgICAgMHg0ODAyMDAwMAorI2RlZmluZSBXRDJfQkFTRSAgICAgICAgICAgICAgMHg0ODAyMjAwMAorI2RlZmluZSBXRDNfQkFTRSAgICAgICAgICAgICAgMHg0ODAyNDAwMAorI2RlZmluZSBXRDRfQkFTRSAgICAgICAgICAgICAgMHg0ODAyNjAwMAorI2RlZmluZSBXV1BTICAgICAgIDB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgV1NQUiAgICAgICAweDQ4ICAgICAvKiBydyAqLworI2RlZmluZSBXRF9VTkxPQ0sxIDB4QUFBQQorI2RlZmluZSBXRF9VTkxPQ0syIDB4NTU1NQorCisvKiBQUkNNICovCisjZGVmaW5lIE9NQVAyNDIwX0NNX0JBU0UgMHg0ODAwODAwMAorI2RlZmluZSBQUkNNX0NMS0NGR19DVFJMIChPTUFQMjQyMF9DTV9CQVNFKzB4MDgwKQorI2RlZmluZSBDTV9DTEtTRUxfTVBVICAgIChPTUFQMjQyMF9DTV9CQVNFKzB4MTQwKQorI2RlZmluZSBDTV9GQ0xLRU4xX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjAwKQorI2RlZmluZSBDTV9GQ0xLRU4yX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjA0KQorI2RlZmluZSBDTV9JQ0xLRU4xX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjEwKQorI2RlZmluZSBDTV9JQ0xLRU4yX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjE0KQorI2RlZmluZSBDTV9DTEtTRUwxX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjQwKQorI2RlZmluZSBDTV9DTEtTRUxfV0tVUCAgIChPTUFQMjQyMF9DTV9CQVNFKzB4NDQwKQorI2RlZmluZSBDTV9DTEtTRUwyX0NPUkUgIChPTUFQMjQyMF9DTV9CQVNFKzB4MjQ0KQorI2RlZmluZSBDTV9DTEtTRUxfR0ZYICAgIChPTUFQMjQyMF9DTV9CQVNFKzB4MzQwKQorI2RlZmluZSBQTV9SU1RDVFJMX1dLVVAgIChPTUFQMjQyMF9DTV9CQVNFKzB4NDUwKQorI2RlZmluZSBDTV9DTEtFTl9QTEwgICAgIChPTUFQMjQyMF9DTV9CQVNFKzB4NTAwKQorI2RlZmluZSBDTV9JRExFU1RfQ0tHRU4gIChPTUFQMjQyMF9DTV9CQVNFKzB4NTIwKQorI2RlZmluZSBDTV9DTEtTRUwxX1BMTCAgIChPTUFQMjQyMF9DTV9CQVNFKzB4NTQwKQorI2RlZmluZSBDTV9DTEtTRUwyX1BMTCAgIChPTUFQMjQyMF9DTV9CQVNFKzB4NTQ0KQorI2RlZmluZSBDTV9DTEtTRUxfRFNQICAgIChPTUFQMjQyMF9DTV9CQVNFKzB4ODQwKQorCisvKgorICogSDQgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qCisgKiAgVGhlIDI0MjAncyBjaGlwIHNlbGVjdHMgYXJlIHByb2dyYW1tYWJsZS4gIFRoZSBtYXNrIFJPTQorICogIGRvZXMgY29uZmlndXJlIENTMCB0byAweDA4MDAwMDAwIGJlZm9yZSBkaXNwYXRjaC4gIFNvLCBpZgorICogIHlvdSB3YW50IHlvdXIgY29kZSB0byBsaXZlIGJlbG93IHRoYXQgYWRkcmVzcywgeW91IGhhdmUgdG8KKyAqICBiZSBwcmVwYXJlZCB0byBqdW1wIHRob3VnaCBob29wcywgdG8gcmVzZXQgdGhlIGJhc2UgYWRkcmVzcy4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVAyNDIwSDQpCisvKiBHUE1DICovCisjaWZkZWYgQ09ORklHX1ZJUlRJT19BICAgICAgICAvKiBQcmUgdmVyc2lvbiBCICovCisjIGRlZmluZSBINF9DUzBfQkFTRSAgICAgICAgICAgMHgwODAwMDAwMCAgLyogZmxhc2ggKDY0IE1lZyBhbGlnbmVkKSAqLworIyBkZWZpbmUgSDRfQ1MxX0JBU0UgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIGRlYnVnIGJvYXJkICovCisjIGRlZmluZSBINF9DUzJfQkFTRSAgICAgICAgICAgMHgwQTAwMDAwMCAgLyogd2lmaSBib2FyZCAqLworI2Vsc2UKKyMgZGVmaW5lIEg0X0NTMF9CQVNFICAgICAgICAgICAweDA0MDAwMDAwICAvKiBmbGFzaCAoNjQgTWVnIGFsaWduZWQpICovCisjIGRlZmluZSBINF9DUzFfQkFTRSAgICAgICAgICAgMHgwODAwMDAwMCAgLyogZGVidWcgYm9hcmQgKi8KKyMgZGVmaW5lIEg0X0NTMl9CQVNFICAgICAgICAgICAweDBBMDAwMDAwICAvKiB3aWZpIGJvYXJkICovCisjZW5kaWYKKworLyogYmFzZSBhZGRyZXNzIGZvciBpbmRpcmVjdCB2ZWN0b3JzIChpbnRlcm5hbCBib290IG1vZGUpICovCisjZGVmaW5lIFNSQU1fT0ZGU0VUMCAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMSAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMiAgICAgICAgICAweDAwMDBGODAwCisjZGVmaW5lIFNSQU1fVkVDVF9DT0RFICAgICAgIChTUkFNX09GRlNFVDB8U1JBTV9PRkZTRVQxfFNSQU1fT0ZGU0VUMikKKworI2RlZmluZSBMT1dfTEVWRUxfU1JBTV9TVEFDSyAgMHg0MDIwRkZGQworCisjZGVmaW5lIFBFUklGRVJBTF9QT1JUX0JBU0UgICAweDQ4MEZFMDAzCisKKy8qIEZQR0Egb24gRGVidWcgYm9hcmQuKi8KKyNkZWZpbmUgRVRIX0NPTlRST0xfUkVHICAgICAgIChINF9DUzFfQkFTRSsweDMwYikKKyNkZWZpbmUgTEFOX1JFU0VUX1JFR0lTVEVSICAgIChINF9DUzFfQkFTRSsweDFjKQorI2VuZGlmICAvKiBlbmRpZiBDT05GSUdfMjQyMEg0ICovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MzAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjg4YWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MzAuaApAQCAtMCwwICsxLDI0NiBAQAorLyogCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAyNDMwX1NZU19IXworI2RlZmluZSBfT01BUDI0MzBfU1lTX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9zaXplcy5oPgorCisvKiBkZXZpY2UgdHlwZSAqLworI2RlZmluZSBERVZJQ0VfTUFTSyAgICAgICAgICAoQklUOHxCSVQ5fEJJVDEwKQorI2RlZmluZSBUU1RfREVWSUNFICAgICAgICAgICAweDAKKyNkZWZpbmUgRU1VX0RFVklDRSAgICAgICAgICAgMHgxCisjZGVmaW5lIEhTX0RFVklDRSAgICAgICAgICAgIDB4MgorI2RlZmluZSBHUF9ERVZJQ0UgICAgICAgICAgICAweDMKKworLyoKKyAqIDI0MzAgc3BlY2lmaWMgU2VjdGlvbgorICovCisjZGVmaW5lIE9NQVAyNDNYX0NPUkVfTDRfSU9fQkFTRSAgICAgICAgMHg0ODAwMDAwMAorI2RlZmluZSBPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSAgICAgIDB4NDkwMDAwMDAKKyNkZWZpbmUgT01BUDI0WFhfTDRfSU9fQkFTRSAgICAgT01BUDI0M1hfQ09SRV9MNF9JT19CQVNFCisKKworLyogQ09OVFJPTCAqLworI2RlZmluZSBPTUFQMjRYWF9DVFJMX0JBU0UgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MjAwMCkKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVMgICAgICAgIChPTUFQMjRYWF9DVFJMX0JBU0UgKyAweDJGOCkKKworLyogVEFQIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE9NQVAyNFhYX1RBUF9CQVNFICAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHhBMDAwKQorI2RlZmluZSBUQVBfSURDT0RFX1JFRyAgICAgICAgKE9NQVAyNFhYX1RBUF9CQVNFKzB4MjA0KQorCisvKiAKKwlHUE1DIDogSW4gMjQzMCBOT1IgYW5kIE5BTkQgY2FuIGNvZXhpc3QuCisJRHVyaW5nIE5BTkQgYm9vdGluZyAsIE5BTkQgaXMgYXQgQ1MwIGFuZCBOT1IgYXQgQ1MxCisJYW5kIERlYnVnIEZQR0EgaXMgR1BNQ19DUzUgCisqLworI2RlZmluZSBPTUFQMjRYWF9HUE1DX0JBU0UgICAgKDB4NkUwMDAwMDApCisKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUcgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxMCkKKyNkZWZpbmUgR1BNQ19TWVNTVEFUVVMJICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE0KQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDFDKQorI2RlZmluZSBHUE1DX1RJTUVPVVRfQ09OVFJPTCAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDQwKQorI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX0NPTkZJRzFfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDYwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDY0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDY4KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDZDKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDcwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMCAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDc0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMAkgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4NzgpCisjZGVmaW5lIEdQTUNfQ09ORklHMV8xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4OTApCisjZGVmaW5lIEdQTUNfQ09ORklHMl8xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4OTQpCisjZGVmaW5lIEdQTUNfQ09ORklHM18xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4OTgpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4OUMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4QTApCisjZGVmaW5lIEdQTUNfQ09ORklHNl8xICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4QTQpCisjZGVmaW5lIEdQTUNfQ09ORklHN18xCSAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHhBOCkKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNTApCisjZGVmaW5lIEdQTUNfQ09ORklHMl81ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTU0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE1OCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNUMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV81ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTYwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE2NCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNjgpCisKKworLyogU01TICovCisjZGVmaW5lIE9NQVAyNFhYX1NNU19CQVNFIDB4NkMwMDAwMDAKKyNkZWZpbmUgU01TX1NZU0NPTkZJRyAgICAgKE9NQVAyNFhYX1NNU19CQVNFKzB4MTApCisKKy8qIFNEUkMgKi8KKyNkZWZpbmUgT01BUDI0WFhfU0RSQ19CQVNFIDB4NkQwMDAwMDAKKyNkZWZpbmUgT01BUDI0WFhfU0RSQ19DUzAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgT01BUDI0WFhfU0RSQ19DUzEgIDB4QTAwMDAwMDAKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUcgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHgxMCkKKyNkZWZpbmUgU0RSQ19TVEFUVVMgICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHgxNCkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg0NCkKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkwgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg2MCkKKyNkZWZpbmUgU0RSQ19ETExBX1NUQVRVUyAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg2NCkKKyNkZWZpbmUgU0RSQ19ETExCX0NUUkwgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg2OCkKKyNkZWZpbmUgU0RSQ19QT1dFUiAgICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg3MCkKKyNkZWZpbmUgU0RSQ19NQ0ZHXzAgICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg4MCkKKyNkZWZpbmUgU0RSQ19NUl8wICAgICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg4NCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8wIChPTUFQMjRYWF9TRFJDX0JBU0UrMHg5QykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8wIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhBMCkKKyNkZWZpbmUgU0RSQ19NQ0ZHXzEgICAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhCMCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8xIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhDNCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8xIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhDOCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTCAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhBNCkKKyNkZWZpbmUgU0RSQ19NQU5VQUxfMCAgICAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhBOCkKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTDEJICAgKE9NQVAyNFhYX1NEUkNfQkFTRSsweEQ0KQorCisjZGVmaW5lIExPQURETEwgICAgICAgICAgICBCSVQyCisjZGVmaW5lIENNRF9OT1AgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ01EX1BSRUNIQVJHRSAgICAgIDB4MQorI2RlZmluZSBDTURfQVVUT1JFRlJFU0ggICAgMHgyCisjZGVmaW5lIENNRF9FTlRSX1BXUkRPV04gICAweDMKKyNkZWZpbmUgQ01EX0VYSVRfUFdSRE9XTiAgIDB4NAorI2RlZmluZSBDTURfRU5UUl9TUkZSU0ggICAgMHg1CisjZGVmaW5lIENNRF9DS0VfSElHSCAgICAgICAweDYKKyNkZWZpbmUgQ01EX0NLRV9MT1cgICAgICAgIDB4NworI2RlZmluZSBTT0ZUUkVTRVQgICAgICAgICAgQklUMQorI2RlZmluZSBTTUFSVF9JRExFICAgICAgICAgKDB4MiA8PCAzKQorI2RlZmluZSBSRUZfT05fSURMRSAgICAgICAgKDB4MSA8PCA2KQorCisKKy8qIFVBUlQgKi8KKyNkZWZpbmUgT01BUDI0MzBfVUFSVDEJICAgICAgMHg0ODA2QTAwMAorI2RlZmluZSBPTUFQMjQzMF9VQVJUMgkgICAgICAweDQ4MDZDMDAwCisjZGVmaW5lIE9NQVAyNDMwX1VBUlQzICAgICAgICAweDQ4MDZFMDAwCisKKy8qIEdlbmVyYWwgUHVycG9zZSBUaW1lcnMgKi8KKyNkZWZpbmUgT01BUDI0WFhfR1BUMSAgICAgICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDE4MDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQyICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHgyQTAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUMyAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4NzgwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDQgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDdBMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ1ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg3QzAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUNiAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4N0UwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDcgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDgwMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ4ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4MjAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUOSAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4ODQwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDEwICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDg2MDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQxMSAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4ODAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUMTIgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4OEEwMDAKKworLyogdGltZXIgcmVncyBvZmZzZXRzICgzMiBiaXQgcmVncykgKi8KKyNkZWZpbmUgVElEUiAgICAgICAweDAgICAgICAvKiByICovCisjZGVmaW5lIFRJT0NQX0NGRyAgMHgxMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElTVEFUICAgICAweDE0ICAgICAvKiByICovCisjZGVmaW5lIFRJU1IgICAgICAgMHgxOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVElFUiAgICAgICAweDFDICAgICAvKiBydyAqLworI2RlZmluZSBUV0VSICAgICAgIDB4MjAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDTFIgICAgICAgMHgyNCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENSUiAgICAgICAweDI4ICAgICAvKiBydyAqLworI2RlZmluZSBUTERSICAgICAgIDB4MkMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRUR1IgICAgICAgMHgzMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdQUyAgICAgICAweDM0ICAgICAvKiByICovCisjZGVmaW5lIFRNQVIgICAgICAgMHgzOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjEgICAgICAweDNjICAgICAvKiByICovCisjZGVmaW5lIFRTSUNSICAgICAgMHg0MCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjIgICAgICAweDQ0ICAgICAvKiByICovCisKKy8qIFdhdGNoRG9nIFRpbWVycyAoMSBzZWN1cmUsIDMgR1ApICovCisjZGVmaW5lIFdEMV9CQVNFICAgICAgICAgICAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgxNDAwMCkKKyNkZWZpbmUgV0QyX0JBU0UgICAgICAgICAgICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDE2MDAwKQorI2RlZmluZSBXRDNfQkFTRSAgICAgICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHgyNDAwMCkgLyogbm90IHByZXNlbnQgKi8KKyNkZWZpbmUgV0Q0X0JBU0UgICAgICAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4MjYwMDApCisKKy8qIDMyS1RJTUVSICovCisjZGVmaW5lIFNZTkNfMzJLVElNRVJfQkFTRSAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgyMDAwMCkKKyNkZWZpbmUgUzMyS19DUiAgICAgICAgICAgICAgIChTWU5DXzMyS1RJTUVSX0JBU0UrMHgxMCkKKworI2RlZmluZSBXV1BTICAgICAgIDB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgV1NQUiAgICAgICAweDQ4ICAgICAvKiBydyAqLworI2RlZmluZSBXRF9VTkxPQ0sxIDB4QUFBQQorI2RlZmluZSBXRF9VTkxPQ0syIDB4NTU1NQorCisvKiBQUkNNICovCisjZGVmaW5lIE9NQVAyNFhYX0NNX0JBU0UgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MDYwMDApCisKKyNkZWZpbmUgUFJDTV9DTEtTUkNfQ1RSTCAoT01BUDI0WFhfQ01fQkFTRSsweDA2MCkKKyNkZWZpbmUgUFJDTV9DTEtPVVRfQ1RSTCAoT01BUDI0WFhfQ01fQkFTRSsweDA3MCkKKyNkZWZpbmUgUFJDTV9DTEtFTVVMX0NUUkwgKE9NQVAyNFhYX0NNX0JBU0UrMHgwNzgpCisjZGVmaW5lIFBSQ01fQ0xLQ0ZHX0NUUkwgKE9NQVAyNFhYX0NNX0JBU0UrMHgwODApCisjZGVmaW5lIFBSQ01fQ0xLQ0ZHX1NUQVRVUyAoT01BUDI0WFhfQ01fQkFTRSsweDA4NCkKKyNkZWZpbmUgQ01fQ0xLU0VMX01QVSAgICAoT01BUDI0WFhfQ01fQkFTRSsweDE0MCkKKyNkZWZpbmUgQ01fRkNMS0VOMV9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDIwMCkKKyNkZWZpbmUgQ01fRkNMS0VOMl9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDIwNCkKKyNkZWZpbmUgQ01fSUNMS0VOMV9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDIxMCkKKyNkZWZpbmUgQ01fSUNMS0VOMl9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDIxNCkKKyNkZWZpbmUgQ01fQ0xLU0VMMV9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDI0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMX1dLVVAgICAoT01BUDI0WFhfQ01fQkFTRSsweDQ0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMMl9DT1JFICAoT01BUDI0WFhfQ01fQkFTRSsweDI0NCkKKyNkZWZpbmUgQ01fRkNMS0VOX0dGWCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDMwMCkKKyNkZWZpbmUgQ01fSUNMS0VOX0dGWCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDMxMCkKKyNkZWZpbmUgQ01fQ0xLU0VMX0dGWCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDM0MCkKKyNkZWZpbmUgUk1fUlNUQ1RSTF9HRlggICAgKE9NQVAyNFhYX0NNX0JBU0UrMHgzNTApCisjZGVmaW5lIENNX0ZDTEtFTl9XS1VQICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4NDAwKQorI2RlZmluZSBDTV9JQ0xLRU5fV0tVUCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDQxMCkKKyNkZWZpbmUgUE1fUlNUQ1RSTF9XS1VQICAoT01BUDI0WFhfQ01fQkFTRSsweDQ1MCkKKyNkZWZpbmUgQ01fQ0xLRU5fUExMICAgICAoT01BUDI0WFhfQ01fQkFTRSsweDUwMCkKKyNkZWZpbmUgQ01fSURMRVNUX0NLR0VOICAoT01BUDI0WFhfQ01fQkFTRSsweDUyMCkKKyNkZWZpbmUgQ01fQ0xLU0VMMV9QTEwgICAoT01BUDI0WFhfQ01fQkFTRSsweDU0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMMl9QTEwgICAoT01BUDI0WFhfQ01fQkFTRSsweDU0NCkKKyNkZWZpbmUgQ01fQ0xLU0VMX0RTUCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDg0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMX01ETSAgICAoT01BUDI0WFhfQ01fQkFTRSsweEM0MCkKKworLyogU01YLUFQRSAqLworI2RlZmluZSBTTVhfQVBFX0JBU0UgMHg2ODAwMDAwMAorI2RlZmluZSBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSAgKFNNWF9BUEVfQkFTRSArIDB4MTAwMDApCisjZGVmaW5lIFBNX0dQTUNfQkFTRV9BRERSX0FSTSAgICAoU01YX0FQRV9CQVNFICsgMHgxMjQwMCkKKyNkZWZpbmUgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNIChTTVhfQVBFX0JBU0UgKyAweDEyODAwKQorI2RlZmluZSBQTV9PQ01fUk9NX0JBU0VfQUREUl9BUk0gKFNNWF9BUEVfQkFTRSArIDB4MTJDMDApCisKKy8qIElWQTIgKi8KKyNkZWZpbmUgUE1fSVZBMl9CQVNFX0FERFJfQVJNICAgIChTTVhfQVBFX0JBU0UgKyAweDE0MDAwKQorCisvKgorICogIFRoZSAyNDMwJ3MgY2hpcCBzZWxlY3RzIGFyZSBwcm9ncmFtbWFibGUuICBUaGUgbWFzayBST00KKyAqICBkb2VzIGNvbmZpZ3VyZSBDUzAgdG8gMHgwODAwMDAwMCBiZWZvcmUgZGlzcGF0Y2guICBTbywgaWYKKyAqICB5b3Ugd2FudCB5b3VyIGNvZGUgdG8gbGl2ZSBiZWxvdyB0aGF0IGFkZHJlc3MsIHlvdSBoYXZlIHRvCisgKiAgYmUgcHJlcGFyZWQgdG8ganVtcCB0aG91Z2ggaG9vcHMsIHRvIHJlc2V0IHRoZSBiYXNlIGFkZHJlc3MuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMjQzWCkKKworLyogR1BNQyAqLworLyogVGhpcyBpcyBiZWluZyB1c2VkIGJ5IHRoZSBtYWNyb3MgaW4gbWVtLmguIFBIWVNfRkxBU0hfMSBpcyBkZWZpbmVkIHRvIEg0X0NTMF9CQVNFICovCisjIGRlZmluZSBINF9DUzFfQkFTRSAgICAgICAgICAgMHgwOTAwMDAwMCAgLyogZmxhc2ggKDY0IE1lZyBhbGlnbmVkKSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRSBINF9DUzFfQkFTRQorI2RlZmluZSBERUJVR19CQVNFCTB4MDgwMDAwMDAKKworLyogYmFzZSBhZGRyZXNzIGZvciBpbmRpcmVjdCB2ZWN0b3JzIChpbnRlcm5hbCBib290IG1vZGUpICovCisjZGVmaW5lIFNSQU1fT0ZGU0VUMCAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMSAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMiAgICAgICAgICAweDAwMDBGODAwCisjZGVmaW5lIFNSQU1fVkVDVF9DT0RFICAgICAgIChTUkFNX09GRlNFVDB8U1JBTV9PRkZTRVQxfFNSQU1fT0ZGU0VUMikKKworI2RlZmluZSBMT1dfTEVWRUxfU1JBTV9TVEFDSyAgMHg0MDIwRkZGQworCisjZGVmaW5lIFBFUklGRVJBTF9QT1JUX0JBU0UgICAweDQ4MEZFMDAzCisKKyNlbmRpZiAgLyogZW5kaWYgQ09ORklHXzI0MzBTRFAgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zaXplcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3NpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkZGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zaXplcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNwkgVVNBCisgKi8KKy8qICBTaXplIGRlZmludGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIEFSTSBMaW1pdGVkIDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX3NpemVzX2gKKyNkZWZpbmUgX19zaXplc19oCQkJMQorCisvKiBoYW5keSBzaXplcyAqLworI2RlZmluZSBTWl8xSwkJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNaXzRLCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU1pfOEsJCQkJMHgwMDAwMjAwMAorI2RlZmluZSBTWl8xNksJCQkJMHgwMDAwNDAwMAorI2RlZmluZSBTWl8zMksJCQkJMHgwMDAwODAwMAorI2RlZmluZSBTWl82NEsJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBTWl8xMjhLCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU1pfMjU2SwkJCQkweDAwMDQwMDAwCisjZGVmaW5lIFNaXzUxMksJCQkJMHgwMDA4MDAwMAorCisjZGVmaW5lIFNaXzFNCQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU1pfMk0JCQkJMHgwMDIwMDAwMAorI2RlZmluZSBTWl80TQkJCQkweDAwNDAwMDAwCisjZGVmaW5lIFNaXzhNCQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgU1pfMTZNCQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU1pfMzFNCQkJCTB4MDFGMDAwMDAKKyNkZWZpbmUgU1pfMzJNCQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgU1pfNjRNCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgU1pfMTI4TQkJCQkweDA4MDAwMDAwCisjZGVmaW5lIFNaXzI1Nk0JCQkJMHgxMDAwMDAwMAorI2RlZmluZSBTWl81MTJNCQkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBTWl8xRwkJCQkweDQwMDAwMDAwCisjZGVmaW5lIFNaXzJHCQkJCTB4ODAwMDAwMDAKKworI2VuZGlmCS8qIF9fc2l6ZXNfaCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc3lzX2luZm8uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zeXNfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTA5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc3lzX2luZm8uaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IChDKSBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMjRYWF9TWVNfSU5GT19IXworI2RlZmluZSBfT01BUDI0WFhfU1lTX0lORk9fSF8KKworI2lmIDAKK3R5cGVkZWYgc3RydWN0ICBoNF9zeXN0ZW1fZGF0YSB7CisJLyogYmFzZSBib2FyZCBpbmZvICovCisJdTMyIGJhc2VfYl9yZXY7CQkvKiByZXYgZnJvbSBiYXNlIGJvYXJkIGkyYyAqLworCS8qIGNwdSBib2FyZCBpbmZvICovCisJdTMyIGNwdV9iX3JldjsJCS8qIHJldiBmcm9tIGNwdSBib2FyZCBpMmMgKi8KKwl1MzIgY3B1X2JfbXV4OwkJLyogbXV4IHR5cGUgb24gZGF1Z2h0ZXIgYm9hcmQgKi8KKwl1MzIgY3B1X2JfZGRyX3R5cGU7CS8qIG1lbSB0eXBlICovCisJdTMyIGNwdV9iX2Rkcl9zcGVlZDsJLyogZGRyIHNwZWVkIHJhdGluZyAqLworCXUzMiBjcHVfYl9zd2l0Y2hlczsJLyogYm9vdCBjdHJsIHN3aXRjaCBzZXR0aW5ncyAqLworCS8qIGNwdSBpbmZvICovCisJdTMyIGNwdV90eXBlOwkJLyogdHlwZSBvZiBjcHU7IDI0MjAsIDI0MjIsIDI0MzAsLi4uKi8KKwl1MzIgY3B1X3JldjsJCS8qIHJldiBvZiBnaXZlbiBjcHU7IEVTMSwgRVMyLC4uLiovCit9IGg0X3N5c19kYXRhOworCisjZW5kaWYKKworI2RlZmluZSBYRFJfUE9QICAgICAgICAgICA1ICAgICAgLyogcGFja2FnZSBvbiBwYWNrYWdlIHBhcnQgKi8KKyNkZWZpbmUgU0RSX0RJU0NSRVRFICAgICAgNCAgICAgIC8qIDEyOE0gbWVtb3J5IFNEUiBtb2R1bGUqLworI2RlZmluZSBERFJfU1RBQ0tFRCAgICAgICAzICAgICAgLyogc3RhY2tlZCBwYXJ0IG9uIDI0MjIgKi8KKyNkZWZpbmUgRERSX0NPTUJPICAgICAgICAgMiAgICAgIC8qIGNvbWJvIHBhcnQgb24gY3B1IGRhdWdodGVyIGNhcmQgKG1lbmFsYWV1cykgKi8KKyNkZWZpbmUgRERSX0RJU0NSRVRFICAgICAgMSAgICAgIC8qIDJ4MTYgcGFydHMgb24gZGF1Z2h0ZXIgY2FyZCAqLworCisjZGVmaW5lIEREUl8xMDAgICAgICAgICAgIDEwMCAgICAvKiB0eXBlIGZvdW5kIG9uIG1vc3QgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xMTEgICAgICAgICAgIDExMSAgICAvKiBzb21lIGNvbWJvIHBhcnRzICovCisjZGVmaW5lIEREUl8xMzMgICAgICAgICAgIDEzMyAgICAvKiBtb3N0IGNvbWJvLCBzb21lIG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTY1ICAgICAgICAgICAxNjUgICAgLyogZnV0dXJlIHBhcnRzICovCisKKyNkZWZpbmUgQ1BVXzI0MjAgICAgICAgICAgMHgyNDIwCisjZGVmaW5lIENQVV8yNDIyICAgICAgICAgIDB4MjQyMiAvKiAyNDIwICsgNjRNIHN0YWNrZWQgKi8KKyNkZWZpbmUgQ1BVXzI0MjMgICAgICAgICAgMHgyNDIzIC8qIDI0MjAgKyA5Nk0gc3RhY2tlZCAqLworI2RlZmluZSBDUFVfMjQzMCAgICAgICAgICAweDI0MzAKKworLyogMjQyeCByZWFsIGhhcmR3YXJlOgorICogIEVTMSAgICAgPSByZXYgMAorICogIEVTMiAgICAgPSByZXYgMQorICogIEVTMi4wNSAgPSByZXYgMgorICogIEVTMi4xICAgPSByZXYgMworICogIEVTMi4xLjEgPSByZXYgNAorICovCisKKy8qIDI0MnggY29kZSBkZWZpbmVzOgorICogRVMxICAgICA9IDArMSA9IDEKKyAqIEVTMiAgICAgPSAxKzEgPSAyCisgKiBFUzIuMDUgID0gMisxID0gMworICogRVMyLjEgICA9IDMrMSA9IDQKKyAqIEVzMi4xLjEgPSA0KzEgPSA1CisgKi8KKyNkZWZpbmUgQ1BVXzI0MjJfRVMxICAgICAgMQorI2RlZmluZSBDUFVfMjQyMl9FUzIgICAgICAyCisjZGVmaW5lIENQVV8yNDIyX0VTMl8wNSAgIDMKKyNkZWZpbmUgQ1BVXzI0MjJfRVMyXzEgICAgNAorI2RlZmluZSBDUFVfMjQyMl9FUzJfMV8xICA1CisKKyNkZWZpbmUgQ1BVXzI0MjBfRVMxICAgICAgMQorI2RlZmluZSBDUFVfMjQyMF9FUzIgICAgICAyCisjZGVmaW5lIENQVV8yNDIwX0VTMl8wNSAgIDMKKyNkZWZpbmUgQ1BVXzI0MjBfRVMyXzEgICAgNAorI2RlZmluZSBDUFVfMjQyMF9FUzJfMV8xICA1CisKKyNkZWZpbmUgQ1BVXzI0MlhfRVMxICAgICAgMQorI2RlZmluZSBDUFVfMjQyWF9FUzIgICAgICAyCisjZGVmaW5lIENQVV8yNDJYX0VTMl8wNSAgIDMKKyNkZWZpbmUgQ1BVXzI0MlhfRVMyXzEgICAgNAorI2RlZmluZSBDUFVfMjQyWF9FUzJfMV8xICA1CisKKyNkZWZpbmUgQ1BVXzI0MjBfMjQyMl9FUzEgMQorI2RlZmluZSBDUFVfMjQyMF8yNDIyX0VTMl8xIDQKKworLyogMjQzeCByZWFsIGhhcmR3YXJlOgorICogIEVTMSAgICAgPSByZXYgMAorICogIEVTMiAgICAgPSByZXYgMQorICoKKyAqIDI0M3ggY29kZSBkZWZpbmVzOgorICogRVMxICAgICA9IDArMSA9IDEKKyAqIEVTMiAgICAgPSAxKzEgPSAyCisgKi8KKyNkZWZpbmUgQ1BVXzI0MzBfRVMxICAgICAxCisjZGVmaW5lIENQVV8yNDMwX0VTMiAgICAgMgorCisjaWZkZWYgVlBPTTI0MzAKKyMgZGVmaW5lIENQVV8yNDMwX1ZJUlRJTyAgIDMKKyNlbHNlCisjIGRlZmluZSBDUFVfMjQzMF9WSVJUSU8gICAxCisjZW5kaWYKKyNkZWZpbmUgQ1BVXzI0MzBfWkVCVSAgICAgMHhECisKKyNkZWZpbmUgQ1BVXzI0MjBfQ0hJUElEICAgMHgwQjVEOTAwMAorI2RlZmluZSBDUFVfMjQzMF9DSElQSUQgICAweDBCNjhBMDAwCisjZGVmaW5lIENQVV8yNFhYX0lEX01BU0sgIDB4MEZGRkYwMDAKKyNkZWZpbmUgQ1BVXzI0MlhfUkVWX01BU0sgMHhGMDAwMDAwMAorI2RlZmluZSBDUFVfMjQyWF9QSURfTUFTSyAweDAwMEYwMDAwCisKKyNkZWZpbmUgQk9BUkRfSDRfTUVORUxBVVMgICAgIDEKKyNkZWZpbmUgQk9BUkRfSDRfU0RQICAgICAgICAgIDIKKyNkZWZpbmUgQk9BUkRfSDRfTUVORUxBVVNfSFJQIDMKKyNkZWZpbmUgQk9BUkRfU0RQXzI0MzAgICAgICAgIDQKKworI2RlZmluZSBHUE1DX01VWEVEICAgICAgICAxCisjZGVmaW5lIEdQTUNfTk9OTVVYRUQgICAgIDAKKworI2RlZmluZSBUWVBFX05BTkQgICAgICAgICAweDgwMCAgIC8qIGJpdCBwb3MgZm9yIG5hbmQgaW4gZ3BtYyByZWcgKi8KKyNkZWZpbmUgVFlQRV9OT1IgICAgICAgICAgMHgwMDAKKyNkZWZpbmUgVFlQRV9PTkVOQU5EICAgICAgMHg4MDAKKworI2RlZmluZSBXSURUSF84QklUICAgICAgICAweDAwMDAKKyNkZWZpbmUgV0lEVEhfMTZCSVQgICAgICAgMHgxMDAwICAvKiBiaXQgcG9zIGZvciAxNiBiaXQgaW4gZ3BtYyAqLworCisjZGVmaW5lIEkyQ19NRU5FTEFVUyAweDcyCS8qIGkyYyBpZCBmb3IgY29tcGFuaW9uIGNoaXAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqcy9zaXplcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanMvc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBiOTliCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanMvc2l6ZXMuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEwIDIxMTEtMTMwNworICogVVNBCisgKi8KKy8qIERPIE5PVCBFRElUISEgLSB0aGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKyAqCQkgICBmcm9tIC5zIGZpbGUgYnkgYXdrIC1mIHMyaC5hd2sKKyAqLworLyogIFNpemUgZGVmaW50aW9ucworICogIENvcHlyaWdodCAoQykgQVJNIExpbWl0ZWQgMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9fc2l6ZXNfaAorI2RlZmluZSBfX3NpemVzX2gJCQkxCisKKy8qIGhhbmR5IHNpemVzICovCisjZGVmaW5lIFNaXzFLCQkweDAwMDAwNDAwCisjZGVmaW5lIFNaXzRLCQkweDAwMDAxMDAwCisjZGVmaW5lIFNaXzhLCQkweDAwMDAyMDAwCisjZGVmaW5lIFNaXzE2SwkJMHgwMDAwNDAwMAorI2RlZmluZSBTWl82NEsJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1pfMTI4SwkweDAwMDIwMDAwCisjZGVmaW5lIFNaXzI1NksJMHgwMDA0MDAwMAorI2RlZmluZSBTWl81MTJLCTB4MDAwODAwMDAKKworI2RlZmluZSBTWl8xTQkJMHgwMDEwMDAwMAorI2RlZmluZSBTWl8yTQkJMHgwMDIwMDAwMAorI2RlZmluZSBTWl80TQkJMHgwMDQwMDAwMAorI2RlZmluZSBTWl84TQkJMHgwMDgwMDAwMAorI2RlZmluZSBTWl8xNk0JCTB4MDEwMDAwMDAKKyNkZWZpbmUgU1pfMzJNCQkweDAyMDAwMDAwCisjZGVmaW5lIFNaXzY0TQkJMHgwNDAwMDAwMAorI2RlZmluZSBTWl8xMjhNCTB4MDgwMDAwMDAKKyNkZWZpbmUgU1pfMjU2TQkweDEwMDAwMDAwCisjZGVmaW5lIFNaXzUxMk0JMHgyMDAwMDAwMAorCisjZGVmaW5lIFNaXzFHCQkweDQwMDAwMDAwCisjZGVmaW5lIFNaXzJHCQkweDgwMDAwMDAwCisKKyNlbmRpZgkvKiBfX3NpemVzX2ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvYml0cy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0NjhiZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvYml0cy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIGJpdHMuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBmb3VuZCBpbiB0aGUgZmlsZQorICogbmFtZWQgQ09QWUlORyB0aGF0IHNob3VsZCBoYXZlIGFjY29tcGFuaWVkIHRoaXMgZmlsZS4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaWZuZGVmIF9fYml0c19oCisjZGVmaW5lIF9fYml0c19oIDEKKworI2RlZmluZSBBUk1fUkVHX01BU0soYml0cykJCQkJCQkoKDEgPDwgKGJpdHMpKSAtIDEpCisjZGVmaW5lIEFSTV9SRUdfVkFMKGJpdCwgbWFzaykJCQkJCSgobWFzaykgPDwgKGJpdCkpCisjZGVmaW5lIEFSTV9SRUdfVkFMX0VOQ09ERShzaGlmdCwgbWFzaywgdmFsdWUpCSgoKHZhbHVlKSA8PCAoc2hpZnQpKSAmIChtYXNrKSkKKyNkZWZpbmUgQVJNX1JFR19WQUxfREVDT0RFKHNoaWZ0LCBtYXNrLCB2YWx1ZSkJKCgodmFsdWUpICYgKG1hc2spKSA+PiAoc2hpZnQpKQorCisKKyNkZWZpbmUgQklUMCAgQVJNX1JFR19WQUwoIDAsIDEpCisjZGVmaW5lIEJJVDEgIEFSTV9SRUdfVkFMKCAxLCAxKQorI2RlZmluZSBCSVQyICBBUk1fUkVHX1ZBTCggMiwgMSkKKyNkZWZpbmUgQklUMyAgQVJNX1JFR19WQUwoIDMsIDEpCisjZGVmaW5lIEJJVDQgIEFSTV9SRUdfVkFMKCA0LCAxKQorI2RlZmluZSBCSVQ1ICBBUk1fUkVHX1ZBTCggNSwgMSkKKyNkZWZpbmUgQklUNiAgQVJNX1JFR19WQUwoIDYsIDEpCisjZGVmaW5lIEJJVDcgIEFSTV9SRUdfVkFMKCA3LCAxKQorI2RlZmluZSBCSVQ4ICBBUk1fUkVHX1ZBTCggOCwgMSkKKyNkZWZpbmUgQklUOSAgQVJNX1JFR19WQUwoIDksIDEpCisjZGVmaW5lIEJJVDEwIEFSTV9SRUdfVkFMKDEwLCAxKQorI2RlZmluZSBCSVQxMSBBUk1fUkVHX1ZBTCgxMSwgMSkKKyNkZWZpbmUgQklUMTIgQVJNX1JFR19WQUwoMTIsIDEpCisjZGVmaW5lIEJJVDEzIEFSTV9SRUdfVkFMKDEzLCAxKQorI2RlZmluZSBCSVQxNCBBUk1fUkVHX1ZBTCgxNCwgMSkKKyNkZWZpbmUgQklUMTUgQVJNX1JFR19WQUwoMTUsIDEpCisjZGVmaW5lIEJJVDE2IEFSTV9SRUdfVkFMKDE2LCAxKQorI2RlZmluZSBCSVQxNyBBUk1fUkVHX1ZBTCgxNywgMSkKKyNkZWZpbmUgQklUMTggQVJNX1JFR19WQUwoMTgsIDEpCisjZGVmaW5lIEJJVDE5IEFSTV9SRUdfVkFMKDE5LCAxKQorI2RlZmluZSBCSVQyMCBBUk1fUkVHX1ZBTCgyMCwgMSkKKyNkZWZpbmUgQklUMjEgQVJNX1JFR19WQUwoMjEsIDEpCisjZGVmaW5lIEJJVDIyIEFSTV9SRUdfVkFMKDIyLCAxKQorI2RlZmluZSBCSVQyMyBBUk1fUkVHX1ZBTCgyMywgMSkKKyNkZWZpbmUgQklUMjQgQVJNX1JFR19WQUwoMjQsIDEpCisjZGVmaW5lIEJJVDI1IEFSTV9SRUdfVkFMKDI1LCAxKQorI2RlZmluZSBCSVQyNiBBUk1fUkVHX1ZBTCgyNiwgMSkKKyNkZWZpbmUgQklUMjcgQVJNX1JFR19WQUwoMjcsIDEpCisjZGVmaW5lIEJJVDI4IEFSTV9SRUdfVkFMKDI4LCAxKQorI2RlZmluZSBCSVQyOSBBUk1fUkVHX1ZBTCgyOSwgMSkKKyNkZWZpbmUgQklUMzAgQVJNX1JFR19WQUwoMzAsIDEpCisjZGVmaW5lIEJJVDMxIEFSTV9SRUdfVkFMKDMxLCAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDIxZDMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2Nrcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMzRYWF9DTE9DS1NfSF8KKyNkZWZpbmUgX09NQVAzNFhYX0NMT0NLU19IXworCisjZGVmaW5lIExERUxBWSAgICAgIDEyMDAwMDAwCisKKyNkZWZpbmUgUzEyTQkJMTIwMDAwMDAKKyNkZWZpbmUgUzEzTQkJMTMwMDAwMDAKKyNkZWZpbmUgUzE2XzhNCQkxNjgwMDAwMAorI2RlZmluZSBTMTlfMk0JCTE5MjAwMDAwCisjZGVmaW5lIFMyNE0JCTI0MDAwMDAwCisjZGVmaW5lIFMyNk0JCTI2MDAwMDAwCisjZGVmaW5lIFMzOF80TQkJMzg0MDAwMDAKKworI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrczM0M3guaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2NrczM0M3guaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzMzQzeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzM2VkZDEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2NrczM0M3guaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAzNDNYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDM0M1hfQ0xPQ0tTX0hfCisKKyNkZWZpbmUgUExMX1NUT1AgICAgICAgIDEgICAgICAgICAvKiBQRVIgJiBJVkEgKi8KKyNkZWZpbmUgUExMX0xPV19QT1dFUl9CWVBBU1MgICA1ICAvKiBNUFUsIElWQSAmIENPUkUgKi8KKyNkZWZpbmUgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyA2ICAvKiBDT1JFICovCisjZGVmaW5lIFBMTF9MT0NLICAgICAgICA3ICAgICAgICAgLyogTVBVLCBJVkEsIENPUkUgJiBQRVIgKi8KKworLyogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9ucyBhcmUgT1BQIGFuZCBTeXNDbGsgdmFsdWUgaW5kZXBlbmRhbnQKKyAqIGFuZCBoZW5jZSBhcmUgZGVmaW5lZCBoZXJlLiBBbGwgdGhlIG90aGVyIERQTEwgcmVsYXRlZCB2YWx1ZXMgYXJlCisgKiB0YWJ1bGF0ZWQgaW4gbG93bGV2ZWxfaW5pdC5TLgorICovCisKKy8qIENPUkUgRFBMTCAqLworIyAgZGVmaW5lIENPUkVfTTNYMiAgICAgIDIgICAgICAgIC8qIDMzMk1IeiA6IENNX0NMS1NFTDFfRU1VICovCisjICBkZWZpbmUgQ09SRV9TU0lfRElWICAgMyAgICAgICAgLyogMjIxTUh6IDogQ01fQ0xLU0VMX0NPUkUgKi8KKyMgIGRlZmluZSBDT1JFX0ZVU0JfRElWICAyICAgICAgICAvKiA0MS41TUh6OiAqLworIyAgZGVmaW5lIENPUkVfTDRfRElWICAgIDIgICAgICAgIC8qICA4M01IeiA6IEw0ICovCisjICBkZWZpbmUgQ09SRV9MM19ESVYgICAgMiAgICAgICAgLyogMTY2TUh6IDogTDMge0REUn0gKi8KKyMgIGRlZmluZSBHRlhfRElWXzM0WCAgICAzICAgICAgICAvKiAgOTZNSHogOiBDTV9DTEtTRUxfR0ZYICovCisjICBkZWZpbmUgR0ZYX0RJVl8zNlggICAgNSAgICAgICAgLyogIDIwME1IeiA6IENNX0NMS1NFTF9HRlggKi8KKy8qIEtlZXAgZGVmYXVsdCB0byA5Nk1oeiAqLworIyAgZGVmaW5lIEdGWF9ESVYgICAgICAgIDMgICAgICAgIC8qICA5Nk1IeiA6IENNX0NMS1NFTF9HRlggKi8KKyMgIGRlZmluZSBXS1VQX1JTTSAgICAgICAyICAgICAgICAvKiA0MS41TUh6OiBDTV9DTEtTRUxfV0tVUCAqLworCisvKiBQRVIgRFBMTCAqLworIyBkZWZpbmUgUEVSX002WDIgICAgICAgMyAgICAgICAgIC8qIDI4OE1IejogQ01fQ0xLU0VMMV9FTVUgKi8KKyMgZGVmaW5lIFBFUl9NNVgyICAgICAgIDQgICAgICAgICAvKiAyMTZNSHo6IENNX0NMS1NFTF9DQU0gKi8KKyMgZGVmaW5lIFBFUl9NNFgyICAgICAgIDkgICAgICAgICAvKiA5Nk1IeiA6IENNX0NMS1NFTF9EU1MtZHNzMSAqLworIyBkZWZpbmUgUEVSX00zWDIgICAgICAgMTYgICAgICAgIC8qIDU0TUh6IDogQ01fQ0xLU0VMX0RTUy10diAqLworCisjICBkZWZpbmUgQ0xTRUwxX0VNVV9WQUwgKChDT1JFX00zWDIgPDwgMTYpIHwgKFBFUl9NNlgyIDw8IDI0KSB8ICgweDBhNTApKQorCisjaWZkZWYgUFJDTV9DTEtfQ0ZHMl8zMzJNSFoKKyMgZGVmaW5lIE1fMTIJCTB4QTYKKyMgZGVmaW5lIE5fMTIJCTB4MDUKKyMgZGVmaW5lIEZTRUxfMTIJMHgwNworIyBkZWZpbmUgTTJfMTIJCTB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzEyX0VTMQkweDBFCisjIGRlZmluZSBGU0xfMTJfRVMxIDB4MDMKKyMgZGVmaW5lIE0yXzEyX0VTMSAgMHgxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xMyAgICAgICAweDE0QworIyBkZWZpbmUgTl8xMyAgICAgICAweDBDCisjIGRlZmluZSBGU0VMXzEzCTB4MDMKKyMgZGVmaW5lIE0yXzEzCQkweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xM19FUzEJMHgxQjIKKyMgZGVmaW5lIE5fMTNfRVMxCTB4MTAKKyMgZGVmaW5lIEZTTF8xM19FUzEgMHgwMworIyBkZWZpbmUgTTJfMTNfRVMxCTB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzE5cDIgICAgIDB4MTlGCisjIGRlZmluZSBOXzE5cDIgICAgIDB4MTcKKyMgZGVmaW5lIEZTRUxfMTlwMiAgMHgwMworIyBkZWZpbmUgTTJfMTlwMiAgICAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xOXAyX0VTMQkweDE5RgorIyBkZWZpbmUgTl8xOXAyX0VTMQkweDE3CisjIGRlZmluZSBGU0xfMTlwMl9FUzEgMHgwMworIyBkZWZpbmUgTTJfMTlwMl9FUzEgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMjYgICAgICAgMHhBNgorIyBkZWZpbmUgTl8yNiAgICAgICAweDBDCisjIGRlZmluZSBGU0VMXzI2ICAgIDB4MDcKKyMgZGVmaW5lIE0yXzI2ICAgICAgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMjZfRVMxCTB4MUIyCisjIGRlZmluZSBOXzI2X0VTMQkweDIxCisjIGRlZmluZSBGU0xfMjZfRVMxCTB4MDMKKyMgZGVmaW5lIE0yXzI2X0VTMQkweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8zOHA0ICAgICAweDE5RgorIyBkZWZpbmUgTl8zOHA0ICAgICAweDJGCisjIGRlZmluZSBGU0VMXzM4cDQgIDB4MDMKKyMgZGVmaW5lIE0yXzM4cDQgICAgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMzhwNF9FUzEJMHgxOUYKKyMgZGVmaW5lIE5fMzhwNF9FUzEJMHgyRgorIyBkZWZpbmUgRlNMXzM4cDRfRVMxIDB4MDMKKyMgZGVmaW5lIE0yXzM4cDRfRVMxIDB4MDEgLyogTTMgb2YgMiAqLworCisjZWxpZiBkZWZpbmVkKFBSQ01fQ0xLX0NGRzJfMjY2TUhaKQorIyBkZWZpbmUgTV8xMgkJMHg4NQorIyBkZWZpbmUgTl8xMiAgICAgICAweDA1CisjIGRlZmluZSBGU0VMXzEyICAgIDB4MDcKKyMgZGVmaW5lIE0yXzEyICAgICAgMHgwMiAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTJfRVMxCTB4ODUgIC8qIDB4MTBBICovCisjIGRlZmluZSBOXzEyX0VTMQkweDA1ICAvKiAweDA1ICovCisjIGRlZmluZSBGU0xfMTJfRVMxIDB4MDcgIC8qIDB4NyAqLworIyBkZWZpbmUgTTJfMTJfRVMxICAweDIgICAvKiAweDIgd2l0aCBhbiBNMyBvZiA0Ki8KKworIyBkZWZpbmUgTV8xMyAgICAgICAweDEwQQorIyBkZWZpbmUgTl8xMyAgICAgICAweDBDCisjIGRlZmluZSBGU0VMXzEzICAgIDB4MworIyBkZWZpbmUgTTJfMTMgICAgICAweDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzEzX0VTMQkweDEwQSAvKiAweDIxNCAqLworIyBkZWZpbmUgTl8xM19FUzEJMHgwQyAgLyogMHhDICovCisjIGRlZmluZSBGU0xfMTNfRVMxIDB4MyAgIC8qIDB4MyAqLworIyBkZWZpbmUgTTJfMTNfRVMxCTB4MSAgIC8qIDB4MiB3aXRoIGFuIE0zIG9mIDQqLworCisjIGRlZmluZSBNXzE5cDIgICAgIDB4MTE1CisjIGRlZmluZSBOXzE5cDIgICAgIDB4MTMKKyMgZGVmaW5lIEZTRUxfMTlwMiAgMHgwMworIyBkZWZpbmUgTTJfMTlwMiAgICAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xOXAyX0VTMQkweDExNSAgLyogMHgyOTkgKi8KKyMgZGVmaW5lIE5fMTlwMl9FUzEJMHgxMyAgIC8qIDB4MTcgKi8KKyMgZGVmaW5lIEZTTF8xOXAyX0VTMSAweDAzIC8qIDB4MDMgKi8KKyMgZGVmaW5lIE0yXzE5cDJfRVMxIDB4MDEgIC8qIDB4MiB3aXRoIE0zIG9mIDQgKi8KKworIyBkZWZpbmUgTV8yNgkJMHg4NQorIyBkZWZpbmUgTl8yNgkJMHgwQworIyBkZWZpbmUgRlNFTF8yNgkweDA3CisjIGRlZmluZSBNMl8yNgkJMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMjZfRVMxCTB4ODUgIC8qIDB4MTBBICovCisjIGRlZmluZSBOXzI2X0VTMQkweDBDICAvKiAweEMgKi8KKyMgZGVmaW5lIEZTTF8yNl9FUzEgMHgwNyAgLyogMHg3ICovCisjIGRlZmluZSBNMl8yNl9FUzEJMHgwMSAgLyogMHgyIHdpdGggYW4gTTMgb2YgNCAqLworCisjIGRlZmluZSBNXzM4cDQgICAgIDB4MTFDCisjIGRlZmluZSBOXzM4cDQgICAgIDB4MjgKKyMgZGVmaW5lIEZTRUxfMzhwNCAgMHgwMworIyBkZWZpbmUgTTJfMzhwNCAgICAweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8zOHA0X0VTMQkweDExQyAgLyogMHgyOTkgKi8KKyMgZGVmaW5lIE5fMzhwNF9FUzEJMHgyOCAgIC8qIDB4MmYgKi8KKyMgZGVmaW5lIEZTTF8zOHA0X0VTMSAweDAzIC8qIDB4MyAqLworIyBkZWZpbmUgTTJfMzhwNF9FUzEgMHgwMSAgLyogMHgyIHdpdGggYW4gTTMgb2YgNCovCisKKwkjIGVuZGlmCisKKyNlbmRpZiAgLyogZW5kaWYgX09NQVAzNDNYX0NMT0NLU19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jcHUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNzgzMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY3B1LmgKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfT01BUDM0WFhfQ1BVX0gKKyNkZWZpbmUgIF9PTUFQMzRYWF9DUFVfSAorI2lmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDMuaD4KKyNlbGlmIGRlZmluZWQgKENPTkZJR19PTUFQMzQzMCkKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMzQzMC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncG1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHJjbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3NkcmMuaD4KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBvZiBjb21tb24gbW9kdWxlcyAqLworLyogQ29udHJvbCAqLworI2RlZmluZSBDT05UUk9MX1NUQVRVUwkJKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4MkYwKQorI2RlZmluZSBPTUFQMzRYWF9NQ1IJCShPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDhDKQorI2RlZmluZSBDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTCShPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDQ0QykKKyNkZWZpbmUgQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUAkoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1MzQpCisKKworLyogVGFwIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFRBUF9JRENPREVfUkVHCQkoT01BUDM0WFhfVEFQX0JBU0UrMHgyMDQpCisjZGVmaW5lIFBST0RVQ1RJT05fSUQJCShPTUFQMzRYWF9UQVBfQkFTRSsweDIwOCkKKworLyogT01BUCAzNFhYLzM1WFgvMzZ4eC8zN3h4IENvbnRyb2wgSUQgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ09OVFJPTF9JRAkJKE9NQVAzNFhYX1dBS0VVUF9MNF9JT19CQVNFICsgMHhhMjA0KQorCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfTUFTSwkJCUFSTV9SRUdfVkFMKDgsIDB4NykKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9FTkNPREUodikJCSgoKHYpIDw8IDgpICYgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9NQVNLKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2KQkJKCgodikgJiBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX01BU0spID4+IDgpCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfVFNUCQkJCTB4MAorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0VNVQkJCQkweDEKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9IUwkJCQkweDIKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUAkJCQkweDMKKworLyoKKyAqIExlZ2FjeSBtbmVtb25pY3MKKyAqLworI2RlZmluZSBERVZJQ0VfTUFTSwkJCQkJCQkJCUNPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfTUFTSworI2RlZmluZSBUU1RfREVWSUNFCQkJCQkJCQkJQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9UU1QKKyNkZWZpbmUgRU1VX0RFVklDRQkJCQkJCQkJCUNPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfRU1VCisjZGVmaW5lIEhTX0RFVklDRQkJCQkJCQkJCUNPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfSFMKKyNkZWZpbmUgR1BfREVWSUNFCQkJCQkJCQkJQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUAorCisjZGVmaW5lCUNPTlRST0xfU1RBVFVTX1NZU0JPT1RfTUFTSwkJCQlBUk1fUkVHX1ZBTCgwLCAweDNGKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX0VOQ09ERSh2KQkJKCgodikgPDwgMCkgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX01BU0spCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfREVDT0RFKHYpCQkoKCh2KSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfTUFTSykgPj4gMCkKKworI2RlZmluZQlDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfTUFTSwkJQVJNX1JFR19WQUwoNSwgMHgxKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfRU5DT0RFKHYpCSgoKHYpIDw8IDApICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX01BU0spCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodikJKCgodikgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfTUFTSykgPj4gMCkKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX01FTU9SWQkJCTB4MAorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTAkJMHgxCisKKyNkZWZpbmUJQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9NQVNLCQlBUk1fUkVHX1ZBTCgwLCAweDFGKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0VOQ09ERSh2KQkoKCh2KSA8PCAwKSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfTUFTSykKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodikJKCgodikgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX01BU0spID4+IDApCisKKy8qCisgKiBMZWdhY3kgbW5lb21uaWMKKyAqCisgKiBXZSBhcmUgbm90IGNvbmNlcm5lZCB3aXRoIEJJVDUgYXMgaXQgb25seSBkZXRlcm1pbmVzIHRoZSBwcmlyb3RpeQorICogYmV0d2VlbiBtZW1vcnkgb3IgcGVycGhlcmFsIGJvb3RpbmcKKyAqLworI2RlZmluZSBTWVNCT09UX01BU0sJCQkJCQkJQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9NQVNLCisKKy8qIEdQTUMgQ1MzL2NzNC9jczYgbm90IGF2YWxpYWJsZSAqLworCisjZGVmaW5lIEdQTUNfQkFTRQkJCQkJCShPTUFQMzRYWF9HUE1DX0JBU0UpCisKKyNkZWZpbmUgR1BNQ19SRVZJU0lPTgkJCQkJKEdQTUNfQkFTRSArIDB4MDAwMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUcgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDEwKQorI2RlZmluZSBHUE1DX1NZU1NUQVRVUyAJCQkJCShHUE1DX0JBU0UgKyAweDAwMTQpCisjZGVmaW5lIEdQTUNfSVJRU1RBVFVTIAkJCQkJKEdQTUNfQkFTRSArIDB4MDAxOCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEUgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDFDKQorI2RlZmluZSBHUE1DX1RJTUVPVVRfQ09OVFJPTCAJCQkoR1BNQ19CQVNFICsgMHgwMDQwKQorI2RlZmluZSBHUE1DX0VSUl9BRERSRVNTCQkJCShHUE1DX0JBU0UgKyAweDAwNDQpCisjZGVmaW5lIEdQTUNfRVJSX1RZUEUgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDQ4KQorI2RlZmluZSBHUE1DX0NPTkZJRyAJCQkJCShHUE1DX0JBU0UgKyAweDAwNTApCisjZGVmaW5lIEdQTUNfU1RBVFVTIAkJCQkJKEdQTUNfQkFTRSArIDB4MDA1NCkKKworI2RlZmluZSBHUE1DX0NPTkZJR19CQVNFCQkJCShHUE1DX0JBU0UgKyAweDAwNjApCisjZGVmaW5lIEdQTUNfQ09ORklHX1NJWkUJCQkJMHgwMDMwCisjZGVmaW5lIEdQTUNfQ09ORklHWF9CQVNFKHJlZykJCQkoR1BNQ19DT05GSUdfQkFTRSArICgoKHJlZykgLSAxKSAqIDQpKQorI2RlZmluZSBHUE1DX0NPTkZJR1gocmVnLCBjcykJCQkoR1BNQ19DT05GSUdYX0JBU0UocmVnKSArICgoY3MpICogR1BNQ19DT05GSUdfU0laRSkpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxKGNzKQkJCQlHUE1DX0NPTkZJR1goMSwgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHMihjcykJCQkJR1BNQ19DT05GSUdYKDIsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzMoY3MpCQkJCUdQTUNfQ09ORklHWCgzLCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUc0KGNzKQkJCQlHUE1DX0NPTkZJR1goNCwgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHNShjcykJCQkJR1BNQ19DT05GSUdYKDUsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzYoY3MpCQkJCUdQTUNfQ09ORklHWCg2LCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUc3KGNzKQkJCQlHUE1DX0NPTkZJR1goNywgY3MpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzAJCQkJCUdQTUNfQ09ORklHMSgwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMAkJCQkJR1BNQ19DT05GSUcyKDApCisjZGVmaW5lIEdQTUNfQ09ORklHM18wCQkJCQlHUE1DX0NPTkZJRzMoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzAJCQkJCUdQTUNfQ09ORklHNCgwKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMAkJCQkJR1BNQ19DT05GSUc1KDApCisjZGVmaW5lIEdQTUNfQ09ORklHNl8wCQkJCQlHUE1DX0NPTkZJRzYoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzAJCQkJCUdQTUNfQ09ORklHNygwKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV8xCQkJCQlHUE1DX0NPTkZJRzEoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzEJCQkJCUdQTUNfQ09ORklHMigxKQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMQkJCQkJR1BNQ19DT05GSUczKDEpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8xCQkJCQlHUE1DX0NPTkZJRzQoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzEJCQkJCUdQTUNfQ09ORklHNSgxKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMQkJCQkJR1BNQ19DT05GSUc2KDEpCisjZGVmaW5lIEdQTUNfQ09ORklHN18xCQkJCQlHUE1DX0NPTkZJRzcoMSkKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfMgkJCQkJR1BNQ19DT05GSUcxKDIpCisjZGVmaW5lIEdQTUNfQ09ORklHMl8yCQkJCQlHUE1DX0NPTkZJRzIoMikKKyNkZWZpbmUgR1BNQ19DT05GSUczXzIJCQkJCUdQTUNfQ09ORklHMygyKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMgkJCQkJR1BNQ19DT05GSUc1KDIpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8yCQkJCQlHUE1DX0NPTkZJRzQoMikKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzIJCQkJCUdQTUNfQ09ORklHNigyKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMgkJCQkJR1BNQ19DT05GSUc3KDIpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzMJCQkJCUdQTUNfQ09ORklHMSgzKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMwkJCQkJR1BNQ19DT05GSUcyKDMpCisjZGVmaW5lIEdQTUNfQ09ORklHM18zCQkJCQlHUE1DX0NPTkZJRzMoMykKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzMJCQkJCUdQTUNfQ09ORklHNCgzKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMwkJCQkJR1BNQ19DT05GSUc1KDMpCisjZGVmaW5lIEdQTUNfQ09ORklHNl8zCQkJCQlHUE1DX0NPTkZJRzYoMykKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzMJCQkJCUdQTUNfQ09ORklHNygzKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV80CQkJCQlHUE1DX0NPTkZJRzEoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzQJCQkJCUdQTUNfQ09ORklHMig0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfNAkJCQkJR1BNQ19DT05GSUczKDQpCisjZGVmaW5lIEdQTUNfQ09ORklHNF80CQkJCQlHUE1DX0NPTkZJRzQoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzQJCQkJCUdQTUNfQ09ORklHNSg0KQorI2RlZmluZSBHUE1DX0NPTkZJRzZfNAkJCQkJR1BNQ19DT05GSUc2KDQpCisjZGVmaW5lIEdQTUNfQ09ORklHN180CQkJCQlHUE1DX0NPTkZJRzcoNCkKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfNQkJCQkJR1BNQ19DT05GSUcxKDUpCisjZGVmaW5lIEdQTUNfQ09ORklHMl81CQkJCQlHUE1DX0NPTkZJRzIoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzUJCQkJCUdQTUNfQ09ORklHMyg1KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfNQkJCQkJR1BNQ19DT05GSUc0KDUpCisjZGVmaW5lIEdQTUNfQ09ORklHNV81CQkJCQlHUE1DX0NPTkZJRzUoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzUJCQkJCUdQTUNfQ09ORklHNig1KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfNQkJCQkJR1BNQ19DT05GSUc3KDUpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzYJCQkJCUdQTUNfQ09ORklHMSg2KQorI2RlZmluZSBHUE1DX0NPTkZJRzJfNgkJCQkJR1BNQ19DT05GSUcyKDYpCisjZGVmaW5lIEdQTUNfQ09ORklHM182CQkJCQlHUE1DX0NPTkZJRzMoNikKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzYJCQkJCUdQTUNfQ09ORklHNCg2KQorI2RlZmluZSBHUE1DX0NPTkZJRzVfNgkJCQkJR1BNQ19DT05GSUc1KDYpCisjZGVmaW5lIEdQTUNfQ09ORklHNl82CQkJCQlHUE1DX0NPTkZJRzYoNikKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzYJCQkJCUdQTUNfQ09ORklHNyg2KQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV83CQkJCQlHUE1DX0NPTkZJRzEoNykKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzcJCQkJCUdQTUNfQ09ORklHMig3KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfNwkJCQkJR1BNQ19DT05GSUczKDcpCisjZGVmaW5lIEdQTUNfQ09ORklHNF83CQkJCQlHUE1DX0NPTkZJRzQoNykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzcJCQkJCUdQTUNfQ09ORklHNSg3KQorI2RlZmluZSBHUE1DX0NPTkZJRzZfNwkJCQkJR1BNQ19DT05GSUc2KDcpCisjZGVmaW5lIEdQTUNfQ09ORklHN183CQkJCQlHUE1DX0NPTkZJRzcoNykKKworI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORChpKQkJCShHUE1DX0JBU0UgKyAweDAwN0MgKyAoKGkpICogMHgwMDMwKSkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMAkJCQlHUE1DX05BTkRfQ09NTUFORCgwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8xCQkJCUdQTUNfTkFORF9DT01NQU5EKDEpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzIJCQkJR1BNQ19OQU5EX0NPTU1BTkQoMikKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMwkJCQlHUE1DX05BTkRfQ09NTUFORCgzKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF80CQkJCUdQTUNfTkFORF9DT01NQU5EKDQpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzUJCQkJR1BNQ19OQU5EX0NPTU1BTkQoNSkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfNgkJCQlHUE1DX05BTkRfQ09NTUFORCg2KQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF83CQkJCUdQTUNfTkFORF9DT01NQU5EKDcpCisKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1MoaSkJCQkoR1BNQ19CQVNFICsgMHgwMDgwICsgKChpKSAqIDB4MDAzMCkpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAJCQkJR1BNQ19OQU5EX0FERFJFU1MoMCkKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMQkJCQlHUE1DX05BTkRfQUREUkVTUygxKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18yCQkJCUdQTUNfTkFORF9BRERSRVNTKDIpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzMJCQkJR1BNQ19OQU5EX0FERFJFU1MoMykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfNAkJCQlHUE1DX05BTkRfQUREUkVTUyg0KQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU181CQkJCUdQTUNfTkFORF9BRERSRVNTKDUpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzYJCQkJR1BNQ19OQU5EX0FERFJFU1MoNikKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfNwkJCQlHUE1DX05BTkRfQUREUkVTUyg3KQorCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBKGkpCQkJCShHUE1DX0JBU0UgKyAweDAwODQgKyAoKGkpICogMHgwMDMwKSkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMAkJCQlHUE1DX05BTkRfREFUQSgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8xCQkJCUdQTUNfTkFORF9EQVRBKDEpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzIJCQkJR1BNQ19OQU5EX0RBVEEoMikKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMwkJCQlHUE1DX05BTkRfREFUQSgzKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV80CQkJCUdQTUNfTkFORF9EQVRBKDQpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzUJCQkJR1BNQ19OQU5EX0RBVEEoNSkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfNgkJCQlHUE1DX05BTkRfREFUQSg2KQorI2RlZmluZSBHUE1DX05BTkRfREFUQV83CQkJCUdQTUNfTkFORF9EQVRBKDcpCisKKyNkZWZpbmUgR1BNQ19QUkVGRVRDSF9DT05GSUcxCQkJKEdQTUNfQkFTRSArIDB4MDFFMCkKKyNkZWZpbmUgR1BNQ19QUkVGRVRDSF9DT05GSUcyCQkJKEdQTUNfQkFTRSArIDB4MDFFNCkKKyNkZWZpbmUgR1BNQ19QUkVGRVRDSF9DT05UUk9MCQkJKEdQTUNfQkFTRSArIDB4MDFFQykKKyNkZWZpbmUgR1BNQ19QUkVGRVRDSF9TVEFUVVMJCQkoR1BNQ19CQVNFICsgMHgwMUYwKQorCisjZGVmaW5lIEdQTUNfRUNDX0NPTkZJRwkJCQkJKEdQTUNfQkFTRSArIDB4MDFGNCkKKyNkZWZpbmUgR1BNQ19FQ0NfQ09OVFJPTAkJCQkoR1BNQ19CQVNFICsgMHgwMUY4KQorI2RlZmluZSBHUE1DX0VDQ19TSVpFX0NPTkZJRwkJCShHUE1DX0JBU0UgKyAweDAxRkMpCisjZGVmaW5lIEdQTUNfRUNDX1JFU1VMVChqKQkJCQkoR1BNQ19CQVNFICsgMHgwMjAwICsgXAorCQkJCQkJCQkJCSAoKChqKSAtIDEpICogMHgwMDA0KSkKKyNkZWZpbmUgR1BNQ19FQ0MxX1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoMSkKKyNkZWZpbmUgR1BNQ19FQ0MyX1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoMikKKyNkZWZpbmUgR1BNQ19FQ0MzX1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoMykKKyNkZWZpbmUgR1BNQ19FQ0M0X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoNCkKKyNkZWZpbmUgR1BNQ19FQ0M1X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoNSkKKyNkZWZpbmUgR1BNQ19FQ0M2X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoNikKKyNkZWZpbmUgR1BNQ19FQ0M3X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoNykKKyNkZWZpbmUgR1BNQ19FQ0M4X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoOCkKKyNkZWZpbmUgR1BNQ19FQ0M5X1JFU1VMVAkJCQlHUE1DX0VDQ19SRVNVTFQoOSkKKworI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQwKGkpCQkJCShHUE1DX0JBU0UgKyAweDAyNDAgKyAoKGkpICogMHgwMDEwKSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF8wCQkJCUdQTUNfQkNIX1JFU1VMVDAoMCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF8xCQkJCUdQTUNfQkNIX1JFU1VMVDAoMSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF8yCQkJCUdQTUNfQkNIX1JFU1VMVDAoMikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF8zCQkJCUdQTUNfQkNIX1JFU1VMVDAoMykKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF80CQkJCUdQTUNfQkNIX1JFU1VMVDAoNCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF81CQkJCUdQTUNfQkNIX1JFU1VMVDAoNSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF82CQkJCUdQTUNfQkNIX1JFU1VMVDAoNikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMF83CQkJCUdQTUNfQkNIX1JFU1VMVDAoNykKKworI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQxKGkpIAkJCShHUE1DX0JBU0UgKyAweDAyNDQgKyAoKGkpICogMHgwMDEwKSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV8wCQkJCUdQTUNfQkNIX1JFU1VMVDEoMCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV8xCQkJCUdQTUNfQkNIX1JFU1VMVDEoMSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV8yCQkJCUdQTUNfQkNIX1JFU1VMVDEoMikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV8zCQkJCUdQTUNfQkNIX1JFU1VMVDEoMykKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV80CQkJCUdQTUNfQkNIX1JFU1VMVDEoNCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV81CQkJCUdQTUNfQkNIX1JFU1VMVDEoNSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV82CQkJCUdQTUNfQkNIX1JFU1VMVDEoNikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMV83CQkJCUdQTUNfQkNIX1JFU1VMVDEoNykKKworI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQyKGkpIAkJCShHUE1DX0JBU0UgKyAweDAyNDggKyAoKGkpICogMHgwMDEwKSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl8wCQkJCUdQTUNfQkNIX1JFU1VMVDIoMCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl8xCQkJCUdQTUNfQkNIX1JFU1VMVDIoMSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl8yCQkJCUdQTUNfQkNIX1JFU1VMVDIoMikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl8zCQkJCUdQTUNfQkNIX1JFU1VMVDIoMykKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl80CQkJCUdQTUNfQkNIX1JFU1VMVDIoNCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl81CQkJCUdQTUNfQkNIX1JFU1VMVDIoNSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl82CQkJCUdQTUNfQkNIX1JFU1VMVDIoNikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMl83CQkJCUdQTUNfQkNIX1JFU1VMVDIoNykKKworI2RlZmluZSBHUE1DX0JDSF9SRVNVTFQzKGkpIAkJCShHUE1DX0JBU0UgKyAweDAyNEMgKyAoKGkpICogMHgwMDEwKSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM18wCQkJCUdQTUNfQkNIX1JFU1VMVDMoMCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM18xCQkJCUdQTUNfQkNIX1JFU1VMVDMoMSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM18yCQkJCUdQTUNfQkNIX1JFU1VMVDMoMikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM18zCQkJCUdQTUNfQkNIX1JFU1VMVDMoMykKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM180CQkJCUdQTUNfQkNIX1JFU1VMVDMoNCkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM181CQkJCUdQTUNfQkNIX1JFU1VMVDMoNSkKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM182CQkJCUdQTUNfQkNIX1JFU1VMVDMoNikKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUM183CQkJCUdQTUNfQkNIX1JFU1VMVDMoNykKKworI2RlZmluZSBHUE1DX0JDSF9TV0RBVEEgCQkJCShHUE1DX0JBU0UgKyAweDAyRDApCisKKyNpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0WFgpIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pCisjZGVmaW5lIEdQTUNfQ09ORklHX0NTMAkJKE9NQVAzNFhYX0dQTUNfQkFTRSsweDYwKQorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKyNkZWZpbmUgR1BNQ19DT05GSUdfQ1MwCQkoT01BUDM0WFhfR1BNQ19CQVNFKzB4QzApCisjZW5kaWYKKworLyogR1BNQyBNYXBwaW5nICovCisjIGRlZmluZSBGTEFTSF9CQVNFCQkweDEwMDAwMDAwICAvKiBOT1IgZmxhc2ggKGFsaWduZWQgdG8gMjU2IE1lZykgKi8KKyMgZGVmaW5lIEZMQVNIX0JBU0VfU0RQVjEJMHgwNDAwMDAwMCAgLyogTk9SIGZsYXNoIChhbGlnbmVkIHRvIDY0IE1lZykgKi8KKyMgZGVmaW5lIEZMQVNIX0JBU0VfU0RQVjIJMHgxMDAwMDAwMCAgLyogTk9SIGZsYXNoIChhbGlnbmVkIHRvIDI1NiBNZWcpICovCisjIGRlZmluZSBERUJVR19CQVNFCQkweDA4MDAwMDAwICAvKiBkZWJ1ZyBib2FyZCAqLworIyBkZWZpbmUgTkFORF9CQVNFCQkweDMwMDAwMDAwICAvKiBOQU5EIGFkZHIgKGFjdHVhbCBzaXplIHNtYWxsIHBvcnQpKi8KKyMgZGVmaW5lIFBJU01PMl9CQVNFCQkweDE4MDAwMDAwICAvKiBQSVNNTzIgQ1MxLzIgKi8KKyMgZGVmaW5lIE9ORU5BTkRfTUFQCQkweDIwMDAwMDAwICAvKiBPbmVOYW5kIGFkZHIgKGFjdHVhbCBzaXplIHNtYWxsIHBvcnQgKi8KKworLyogU01TICovCisjZGVmaW5lIFNNU19TWVNDT05GSUcJCShPTUFQMzRYWF9TTVNfQkFTRSsweDEwKQorI2RlZmluZSBTTVNfUkdfQVRUMAkJKE9NQVAzNFhYX1NNU19CQVNFKzB4NDgpCisjZGVmaW5lIFNNU19DTEFTU19BUkIwCQkoT01BUDM0WFhfU01TX0JBU0UrMHhEMCkKKyNkZWZpbmUgQlVSU1RDT01QTEVURV9HUk9VUDcJQklUMzEKKworLyogU0RSQyAqLworI2RlZmluZSBTRFJDX1JFVklTSU9OCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUcJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDEwKQorI2RlZmluZSBTRFJDX1NZU1NUQVRVUwkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4MTQpCisjZGVmaW5lCVNEUkNfU1RBVFVTCQkJU0RSQ19TWVNTVEFUVVMKKyNkZWZpbmUgU0RSQ19DU19DRkcJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg0MCkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg0NCkKKyNkZWZpbmUgU0RSQ19FUlJfQUREUgkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NDgpCisjZGVmaW5lIFNEUkNfRVJSX1RZUEUJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDRDKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTAkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NjApCisjZGVmaW5lIFNEUkNfRExMQV9TVEFUVVMJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NjQpCisjZGVmaW5lIFNEUkNfRExMQl9DVFJMCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg2OCkKKyNkZWZpbmUgU0RSQ19ETExCX1NUQVRVUwkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg2QykKKyNkZWZpbmUgRExMUEhBU0UJCUJJVDEKKyNkZWZpbmUgTE9BRERMTAkJCUJJVDIKKyNkZWZpbmUgRExMX0RFTEFZX01BU0sJCTB4RkYwMAorI2RlZmluZSBETExfTk9fRklMVEVSX01BU0sJKEJJVDh8QklUOSkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUcJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDcwKQorI2RlZmluZSBTRFJDX1BPV0VSCQkJU0RSQ19QT1dFUl9SRUcKKyNkZWZpbmUgV0FLRVVQUFJPQwkJQklUMjYKKworI2RlZmluZSBTRFJDX01DRkdfMAkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDgwKQorI2RlZmluZSBTRFJDX01SXzAJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg4NCkKKyNkZWZpbmUgU0RSQ19FTVIyXzAJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg4QykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8wCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDlDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzAJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QTApCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfMAkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QTQpCisjZGVmaW5lIFNEUkNfTUFOVUFMXzAJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEE4KQorI2RlZmluZSBTRFJDX01DRkdfMQkJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEIwKQorI2RlZmluZSBTRFJDX01SXzEJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhCNCkKKyNkZWZpbmUgU0RSQ19FTVIyXzEJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhCQykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8xCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEM0KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzEJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QzgpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfMQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4RDQpCisjZGVmaW5lIFNEUkNfTUFOVUFMXzEJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEQ4KQorI2RlZmluZSBPTUFQMzRYWF9TRFJDX0NTMAkweDgwMDAwMDAwCisjZGVmaW5lIE9NQVAzNFhYX1NEUkNfQ1MxCTB4QTAwMDAwMDAKKyNkZWZpbmUgQ01EX05PUAkJCTB4MAorI2RlZmluZSBDTURfUFJFQ0hBUkdFCQkweDEKKyNkZWZpbmUgQ01EX0FVVE9SRUZSRVNICQkweDIKKyNkZWZpbmUgQ01EX0VOVFJfUFdSRE9XTgkweDMKKyNkZWZpbmUgQ01EX0VYSVRfUFdSRE9XTgkweDQKKyNkZWZpbmUgQ01EX0VOVFJfU1JGUlNICQkweDUKKyNkZWZpbmUgQ01EX0NLRV9ISUdICQkweDYKKyNkZWZpbmUgQ01EX0NLRV9MT1cJCTB4NworI2RlZmluZSBTT0ZUUkVTRVQJCUJJVDEKKyNkZWZpbmUgU01BUlRfSURMRQkJKDB4MiA8PCAzKQorI2RlZmluZSBSRUZfT05fSURMRQkJKDB4MSA8PCA2KQorCisvKiBFTUlGNCByZWdpc3RlciAqLworI2RlZmluZQlFTUlGNF9CQVNFCQlPTUFQMzRYWF9TRFJDX0JBU0UKKyNkZWZpbmUJRU1JRjRfTU9EX0lECQkoRU1JRjRfQkFTRSArIDB4MDApCisjZGVmaW5lCUVNSUY0X1NEUkFNX1NUUwkJKEVNSUY0X0JBU0UgKyAweDA0KQorI2RlZmluZQlFTUlGNF9TRFJBTV9DRkcJCShFTUlGNF9CQVNFICsgMHgwOCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fUkZDUgkoRU1JRjRfQkFTRSArIDB4MTApCisjZGVmaW5lCUVNSUY0X1NEUkFNX1JGQ1JfU0hEVwkoRU1JRjRfQkFTRSArIDB4MTQpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTEJKEVNSUY0X0JBU0UgKyAweDE4KQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0xX1NIRFcJKEVNSUY0X0JBU0UgKyAweDFDKQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0yCShFTUlGNF9CQVNFICsgMHgyMCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNMl9TSERXCShFTUlGNF9CQVNFICsgMHgyNCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNMwkoRU1JRjRfQkFTRSArIDB4MjgpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTNfU0hEVwkoRU1JRjRfQkFTRSArIDB4MmMpCisjZGVmaW5lCUVNSUY0X1BXUl9NR1RfQ1RSTAkoRU1JRjRfQkFTRSArIDB4MzgpCisjZGVmaW5lCUVNSUY0X1BXUl9NR1RfQ1RSTF9TSERXCShFTUlGNF9CQVNFICsgMHgzQykKKyNkZWZpbmUJRU1JRjRfSU9ERlRfVExHQwkoRU1JRjRfQkFTRSArIDB4NjApCisjZGVmaW5lCUVNSUY0X0REUl9QSFlDVEwxCShFTUlGNF9CQVNFICsgMHhFNCkKKyNkZWZpbmUJRU1JRjRfRERSX1BIWUNUTDFfU0hEVwkoRU1JRjRfQkFTRSArIDB4RTgpCisjZGVmaW5lCUVNSUY0X0REUl9QSFlDVEwyCShFTUlGNF9CQVNFICsgMHhFQykKKworCisvKiB0aW1lciByZWdzIG9mZnNldHMgKDMyIGJpdCByZWdzKSAqLworI2RlZmluZSBUSURSCQkJMHgwICAgICAgLyogciAqLworI2RlZmluZSBUSU9DUF9DRkcJCTB4MTAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJU1RBVAkJCTB4MTQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElTUgkJCTB4MTggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJRVIJCQkweDFDICAgICAvKiBydyAqLworI2RlZmluZSBUV0VSCQkJMHgyMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENMUgkJCTB4MjQgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDUlIJCQkweDI4ICAgICAvKiBydyAqLworI2RlZmluZSBUTERSCQkJMHgyQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFRHUgkJCTB4MzAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXUFMJCQkweDM0ICAgICAvKiByICovCisjZGVmaW5lIFRNQVIJCQkweDM4ICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMQkJCTB4M2MgICAgIC8qIHIgKi8KKyNkZWZpbmUgVFNJQ1IJCQkweDQwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMgkJCTB4NDQgICAgIC8qIHIgKi8KKyNkZWZpbmUgR1BUX0VOCQkJKCgwPDwyKXxCSVQxfEJJVDApIC8qIGVuYWJsZSBzeXNfY2xrIE5PLXByZXNjYWxlIC8xICovCisKKy8qIFdhdGNoZG9nICovCisjZGVmaW5lIFdXUFMJCQkweDM0ICAgICAvKiByICovCisjZGVmaW5lIFdTUFIJCQkweDQ4ICAgICAvKiBydyAqLworI2RlZmluZSBXRF9VTkxPQ0sxCQkweEFBQUEKKyNkZWZpbmUgV0RfVU5MT0NLMgkJMHg1NTU1CisKKy8qIFBSQ00gKi8KKyNkZWZpbmUgQ01fRkNMS0VOX0lWQTIgICAgICAweDQ4MDA0MDAwCisjZGVmaW5lIENNX0NMS0VOX1BMTF9JVkEyICAgMHg0ODAwNDAwNAorI2RlZmluZSBDTV9JRExFU1RfUExMX0lWQTIgIDB4NDgwMDQwMjQKKyNkZWZpbmUgQ01fQ0xLU0VMMV9QTExfSVZBMiAweDQ4MDA0MDQwCisjZGVmaW5lIENNX0NMS1NFTDJfUExMX0lWQTIgMHg0ODAwNDA0NAorI2RlZmluZSBDTV9DTEtFTl9QTExfTVBVICAgIDB4NDgwMDQ5MDQKKyNkZWZpbmUgQ01fSURMRVNUX1BMTF9NUFUgICAweDQ4MDA0OTI0CisjZGVmaW5lIENNX0NMS1NFTDFfUExMX01QVSAgMHg0ODAwNDk0MAorI2RlZmluZSBDTV9DTEtTRUwyX1BMTF9NUFUgIDB4NDgwMDQ5NDQKKyNkZWZpbmUgQ01fRkNMS0VOMV9DT1JFICAgICAweDQ4MDA0YTAwCisjZGVmaW5lIENNX0lDTEtFTjFfQ09SRSAgICAgMHg0ODAwNGExMAorI2RlZmluZSBDTV9JQ0xLRU4yX0NPUkUgICAgIDB4NDgwMDRhMTQKKyNkZWZpbmUgQ01fQ0xLU0VMX0NPUkUgICAgICAweDQ4MDA0YTQwCisjZGVmaW5lIENNX0ZDTEtFTl9HRlggICAgICAgMHg0ODAwNGIwMAorI2RlZmluZSBDTV9JQ0xLRU5fR0ZYICAgICAgIDB4NDgwMDRiMTAKKyNkZWZpbmUgQ01fQ0xLU0VMX0dGWCAgICAgICAweDQ4MDA0YjQwCisjZGVmaW5lIENNX0ZDTEtFTl9XS1VQICAgICAgMHg0ODAwNGMwMAorI2RlZmluZSBDTV9JQ0xLRU5fV0tVUCAgICAgIDB4NDgwMDRjMTAKKyNkZWZpbmUgQ01fQ0xLU0VMX1dLVVAgICAgICAweDQ4MDA0YzQwCisjZGVmaW5lIENNX0lETEVTVF9XS1VQICAgICAgMHg0ODAwNGMyMAorI2RlZmluZSBDTV9DTEtFTl9QTEwgICAgICAgIDB4NDgwMDRkMDAKKyNkZWZpbmUgQ01fSURMRVNUX0NLR0VOICAgICAweDQ4MDA0ZDIwCisjZGVmaW5lIENNX0NMS1NFTDFfUExMICAgICAgMHg0ODAwNGQ0MAorI2RlZmluZSBDTV9DTEtTRUwyX1BMTCAgICAgIDB4NDgwMDRkNDQKKyNkZWZpbmUgQ01fQ0xLU0VMM19QTEwgICAgICAweDQ4MDA0ZDQ4CisjZGVmaW5lIENNX0ZDTEtFTl9EU1MgICAgICAgMHg0ODAwNGUwMAorI2RlZmluZSBDTV9JQ0xLRU5fRFNTICAgICAgIDB4NDgwMDRlMTAKKyNkZWZpbmUgQ01fQ0xLU0VMX0RTUyAgICAgICAweDQ4MDA0ZTQwCisjZGVmaW5lIENNX0ZDTEtFTl9DQU0gICAgICAgMHg0ODAwNGYwMAorI2RlZmluZSBDTV9JQ0xLRU5fQ0FNICAgICAgIDB4NDgwMDRmMTAKKyNkZWZpbmUgQ01fQ0xLU0VMX0NBTSAgICAgICAweDQ4MDA0RjQwCisjZGVmaW5lIENNX0ZDTEtFTl9QRVIgICAgICAgMHg0ODAwNTAwMAorI2RlZmluZSBDTV9JQ0xLRU5fUEVSICAgICAgIDB4NDgwMDUwMTAKKyNkZWZpbmUgQ01fQ0xLU0VMX1BFUiAgICAgICAweDQ4MDA1MDQwCisjZGVmaW5lIENNX0NMS1NFTDFfRU1VICAgICAgMHg0ODAwNTE0MAorCisvKiBTTVgtQVBFICovCisjZGVmaW5lIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNCQkoU01YX0FQRV9CQVNFICsgMHgxMDAwMCkKKyNkZWZpbmUgUE1fR1BNQ19CQVNFX0FERFJfQVJNCQkoU01YX0FQRV9CQVNFICsgMHgxMjQwMCkKKyNkZWZpbmUgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNCShTTVhfQVBFX0JBU0UgKyAweDEyODAwKQorI2RlZmluZSBQTV9PQ01fUk9NX0JBU0VfQUREUl9BUk0JKFNNWF9BUEVfQkFTRSArIDB4MTJDMDApCisjZGVmaW5lIFBNX0lWQTJfQkFTRV9BRERSX0FSTQkJKFNNWF9BUEVfQkFTRSArIDB4MTQwMDApCisKKyNkZWZpbmUgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xCShQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjgpCisjZGVmaW5lIFJUX1JFQURfUEVSTUlTU0lPTl8wCShQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTApCisjZGVmaW5lIFJUX1dSSVRFX1BFUk1JU1NJT05fMAkoUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDU4KQorI2RlZmluZSBSVF9BRERSX01BVENIXzEJKFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg2MCkKKworI2RlZmluZSBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMAkoUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg0OCkKKyNkZWZpbmUgR1BNQ19SRUFEX1BFUk1JU1NJT05fMAkoUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg1MCkKKyNkZWZpbmUgR1BNQ19XUklURV9QRVJNSVNTSU9OXzAJKFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTgpCisKKyNkZWZpbmUgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMAkoUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg0OCkKKyNkZWZpbmUgT0NNX1JFQURfUEVSTUlTU0lPTl8wCShQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDUwKQorI2RlZmluZSBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wCShQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDU4KQorI2RlZmluZSBPQ01fQUREUl9NQVRDSF8yCShQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDgwKQorCisjZGVmaW5lIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDQ4KQorI2RlZmluZSBJVkEyX1JFQURfUEVSTUlTU0lPTl8wCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDUwKQorI2RlZmluZSBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMAkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg1OCkKKworI2RlZmluZSBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg2OCkKKyNkZWZpbmUgSVZBMl9SRUFEX1BFUk1JU1NJT05fMQkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NzApCisjZGVmaW5lIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8xCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg3OCkKKworI2RlZmluZSBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMgkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg4OCkKKyNkZWZpbmUgSVZBMl9SRUFEX1BFUk1JU1NJT05fMgkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4OTApCisjZGVmaW5lIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8yCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg5OCkKKworI2RlZmluZSBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMwkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHhBOCkKKyNkZWZpbmUgSVZBMl9SRUFEX1BFUk1JU1NJT05fMwkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4QjApCisjZGVmaW5lIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8zCQkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHhCOCkKKworLyogSTJDIGJhc2UgKi8KKyNkZWZpbmUgSTJDX0JBU0UxCQkoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHg3MDAwMCkKKyNkZWZpbmUgSTJDX0JBU0UyCQkoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHg3MjAwMCkKKyNkZWZpbmUgSTJDX0JBU0UzCQkoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHg2MDAwMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2dwbWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvZ3BtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjExZDkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2dwbWMuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIGZpZWxkIGNvbnN0YW50cyBhbmQKKyAqICAgICAgbWFjcm9zIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT3BlbiBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uCisgKiAgICAgIFBsYXRmb3JtIChPTUFQKSAzIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykuCisgKi8KKworI2lmbmRlZiBfT01BUDNfR1BNQ19ICisjZGVmaW5lIF9PTUFQM19HUE1DX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKworLyoKKyAqIEdQTUMgSW50ZXJjb25uZWN0IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBHUE1DX1NZU0NPTkZJR19BVVRPSURMRV9ESVNBQkxFCQkJCQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19BVVRPSURMRV9FTkFCTEUJCQkJCUFSTV9SRUdfVkFMKDAsIDEpCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX1NPRlRSRVNFVAkJCQkJCUFSTV9SRUdfVkFMKDEsIDEpCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX0ZPUkNFCQkJCQlBUk1fUkVHX1ZBTCgzLCAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9OT05FCQkJCQlBUk1fUkVHX1ZBTCgzLCAxKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVAkJCQkJQVJNX1JFR19WQUwoMywgMikKKworI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfRklGT0VWRU5UX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9GSUZPRVZFTlRfRU5BQkxFCQlBUk1fUkVHX1ZBTCgwLCAxKQorCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9URVJNSU5BTENPVU5UX0RJU0FCTEUJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRfRU5BQkxFCUFSTV9SRUdfVkFMKDAsIDEpCisKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRfRElTQUJMRQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVF9FTkFCTEUJQVJNX1JFR19WQUwoMCwgMSkKKworLyoKKyAqIEdQTUMgSW50ZXJydXB0IENvbnRyb2wKKyAqLworCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQzRURHRURFVEVDVElPTl9ESVNBQkxFCQlBUk1fUkVHX1ZBTCgxMSwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDNFREdFREVURUNUSU9OX0VOQUJMRQkJQVJNX1JFR19WQUwoMTEsIDEpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDJFREdFREVURUNUSU9OX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDEwLCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMkVER0VERVRFQ1RJT05fRU5BQkxFCQlBUk1fUkVHX1ZBTCgxMCwgMSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMUVER0VERVRFQ1RJT05fRElTQUJMRQkJQVJNX1JFR19WQUwoOSwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDFFREdFREVURUNUSU9OX0VOQUJMRQkJQVJNX1JFR19WQUwoOSwgMSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUMEVER0VERVRFQ1RJT05fRElTQUJMRQkJQVJNX1JFR19WQUwoOCwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDBFREdFREVURUNUSU9OX0VOQUJMRQkJQVJNX1JFR19WQUwoOCwgMSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9URVJNSU5BTENPVU5URVZFTlRfRElTQUJMRQkJQVJNX1JFR19WQUwoMSwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVEVWRU5UX0VOQUJMRQkJQVJNX1JFR19WQUwoMSwgMSkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9GSUZPRVZFTlRFTkFCTEVfRElTQUJMRQkJCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX0ZJRk9FVkVOVEVOQUJMRV9FTkFCTEUJCQlBUk1fUkVHX1ZBTCgwLCAwKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFCQkJCQlcCisJKEdQTUNfSVJRRU5BQkxFX1dBSVQzRURHRURFVEVDVElPTl9ESVNBQkxFIHwJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMkVER0VERVRFQ1RJT05fRElTQUJMRSB8CVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDFFREdFREVURUNUSU9OX0RJU0FCTEUgfAlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQwRURHRURFVEVDVElPTl9ESVNBQkxFIHwJXAorCSBHUE1DX0lSUUVOQUJMRV9URVJNSU5BTENPVU5URVZFTlRfRElTQUJMRSB8CVwKKwkgR1BNQ19JUlFFTkFCTEVfRklGT0VWRU5URU5BQkxFX0RJU0FCTEUpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfQUxMX0VOQUJMRQkJCQkJXAorCShHUE1DX0lSUUVOQUJMRV9XQUlUM0VER0VERVRFQ1RJT05fRU5BQkxFIHwJCVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDJFREdFREVURUNUSU9OX0VOQUJMRSB8CQlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQxRURHRURFVEVDVElPTl9FTkFCTEUgfAkJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMEVER0VERVRFQ1RJT05fRU5BQkxFIHwJCVwKKwkgR1BNQ19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVEVWRU5UX0VOQUJMRSB8CQlcCisJIEdQTUNfSVJRRU5BQkxFX0ZJRk9FVkVOVEVOQUJMRV9FTkFCTEUpCisKKy8qCisgKiBHUE1DIFRpbWVvdXQgQ291bnRlciBDb250cm9sCisgKi8KKworI2RlZmluZSBHUE1DX1RJTUVPVVRTVEFSVFZBTFVFX01BU0sJCQkJCQlBUk1fUkVHX1ZBTCg0LCAweDFGRikKKyNkZWZpbmUgR1BNQ19USU1FT1VUU1RBUlRWQUxVRV9FTkNPREUodikJCQkJQVJNX1JFR19WQUxfRU5DT0RFKDQsIEdQTUNfVElNRU9VVFNUQVJUVkFMVUVfTUFTSywgdikKKyNkZWZpbmUgR1BNQ19USU1FT1VUU1RBUlRWQUxVRV9ERUNPREUodikJCQkJQVJNX1JFR19WQUxfREVDT0RFKDQsIEdQTUNfVElNRU9VVFNUQVJUVkFMVUVfTUFTSywgdikKKworI2RlZmluZSBHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGCQkJCQkJCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfVElNRU9VVEVOQUJMRV9PTgkJCQkJCQlBUk1fUkVHX1ZBTCgwLCAxKQorCisvKgorICogR1BNQyBHbG9iYWwgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEdQTUNfV0FJVDNQSU5QT0xBUklUWV9BQ1RJVkVfTE9XCQkJCUFSTV9SRUdfVkFMKDExLCAwKQorI2RlZmluZSBHUE1DX1dBSVQzUElOUE9MQVJJVFlfQUNUSVZFX0hJR0gJCQkJQVJNX1JFR19WQUwoMTEsIDEpCisKKyNkZWZpbmUgR1BNQ19XQUlUMlBJTlBPTEFSSVRZX0FDVElWRV9MT1cJCQkJQVJNX1JFR19WQUwoMTAsIDApCisjZGVmaW5lIEdQTUNfV0FJVDJQSU5QT0xBUklUWV9BQ1RJVkVfSElHSAkJCQlBUk1fUkVHX1ZBTCgxMCwgMSkKKworI2RlZmluZSBHUE1DX1dBSVQxUElOUE9MQVJJVFlfQUNUSVZFX0xPVwkJCQlBUk1fUkVHX1ZBTCg5LCAwKQorI2RlZmluZSBHUE1DX1dBSVQxUElOUE9MQVJJVFlfQUNUSVZFX0hJR0gJCQkJQVJNX1JFR19WQUwoOSwgMSkKKworI2RlZmluZSBHUE1DX1dBSVQwUElOUE9MQVJJVFlfQUNUSVZFX0xPVwkJCQlBUk1fUkVHX1ZBTCg4LCAwKQorI2RlZmluZSBHUE1DX1dBSVQwUElOUE9MQVJJVFlfQUNUSVZFX0hJR0gJCQkJQVJNX1JFR19WQUwoOCwgMSkKKworI2RlZmluZSBHUE1DX1dSSVRFUFJPVEVDVF9MT1cJCQkJCQkJQVJNX1JFR19WQUwoNCwgMCkKKyNkZWZpbmUgR1BNQ19XUklURVBST1RFQ1RfSElHSAkJCQkJCQlBUk1fUkVHX1ZBTCg0LCAxKQorCisjZGVmaW5lIEdQTUNfTElNSVRFREFERFJFU1NfRElTQUJMRUQJCQkJCUFSTV9SRUdfVkFMKDEsIDApCisjZGVmaW5lIEdQTUNfTElNSVRFREFERFJFU1NfRU5BQkxFRAkJCQkJCUFSTV9SRUdfVkFMKDEsIDEpCisKKyNkZWZpbmUgR1BNQ19OQU5ERk9SQ0VQT1NURURXUklURV9ESVNBQkxFRAkJCQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX05BTkRGT1JDRVBPU1RFRFdSSVRFX0VOQUJMRUQJCQkJQVJNX1JFR19WQUwoMCwgMSkKKworI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfTUFTSwkJCQkJQVJNX1JFR19WQUwoOCwgMHhGKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfRU5DT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0VOQ09ERSg4LCBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfTUFTSywgdikKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX0RFQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9ERUNPREUoOCwgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX01BU0ssIHYpCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU18yNTZfTUIJCQkJCSAgMHgwCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU18xMjhfTUIJCQkJCSAgMHg4CisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU182NF9NQgkJCQkJICAweEMKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTXzMyX01CCQkJCQkgIDB4RQorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfMTZfTUIJCQkJCSAgMHhGCisKKyNkZWZpbmUgR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQJCQkJCUFSTV9SRUdfVkFMKDYsIDApCisjZGVmaW5lIEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQJCQkJCUFSTV9SRUdfVkFMKDYsIDEpCisKKyNkZWZpbmUgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX01BU0sJCQkJCUFSTV9SRUdfVkFMKDAsIDB4M0YpCisjZGVmaW5lIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19FTkNPREUodikJCQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19NQVNLLCAoKHYpID4+IDI0KSkKKyNkZWZpbmUgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX0RFQ09ERSh2KQkJCQkoQVJNX1JFR19WQUxfREVDT0RFKDAsIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19NQVNLLCB2KSA8PCAyNCkKKworCisjZW5kaWYgLyogX09NQVAzX0dQTUNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9pMmMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWZjZGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvaTJjLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9PTUFQMzRYWF9JMkNfSF8KKyNkZWZpbmUgX09NQVAzNFhYX0kyQ19IXworCisvKiBHZXQgdGhlIGkyYyBiYXNlIGFkZHJlc3NlcyAqLworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorCisjZGVmaW5lIEkyQ19ERUZBVUxUX0JBU0UgSTJDX0JBU0UxCisKKyNkZWZpbmUgSTJDX1JFViAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIEkyQ19JRSAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBJMkNfU1RBVCAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgSTJDX0lWICAgICAgICAgICAgICAgICAgKDB4MGMpCisjZGVmaW5lIEkyQ19CVUYgICAgICAgICAgICAgICAgICgweDE0KQorI2RlZmluZSBJMkNfQ05UICAgICAgICAgICAgICAgICAoMHgxOCkKKyNkZWZpbmUgSTJDX0RBVEEgICAgICAgICAgICAgICAgKDB4MWMpCisjZGVmaW5lIEkyQ19TWVNDICAgICAgICAgICAgICAgICgweDIwKSAKKyNkZWZpbmUgSTJDX0NPTiAgICAgICAgICAgICAgICAgKDB4MjQpCisjZGVmaW5lIEkyQ19PQSAgICAgICAgICAgICAgICAgICgweDI4KQorI2RlZmluZSBJMkNfU0EgICAgICAgICAgICAgICAgICAoMHgyYykKKyNkZWZpbmUgSTJDX1BTQyAgICAgICAgICAgICAgICAgKDB4MzApCisjZGVmaW5lIEkyQ19TQ0xMICAgICAgICAgICAgICAgICgweDM0KQorI2RlZmluZSBJMkNfU0NMSCAgICAgICAgICAgICAgICAoMHgzOCkKKyNkZWZpbmUgSTJDX1NZU1RFU1QgICAgICAgICAgICAgKDB4M2MpCisKKy8qIEkyQyBtYXNrcyAqLworCisvKiBJMkMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoSTJDX0lFKTogKi8KKyNkZWZpbmUgSTJDX0lFX0dDX0lFICAgICgxIDw8IDUpCisjZGVmaW5lIEkyQ19JRV9YUkRZX0lFICAoMSA8PCA0KSAgICAgICAgLyogVHJhbnNtaXQgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9SUkRZX0lFICAoMSA8PCAzKSAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX0FSRFlfSUUgICgxIDw8IDIpICAgICAgICAvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfTkFDS19JRSAgKDEgPDwgMSkgICAgICAgIC8qIE5vIGFja25vd2xlZGdtZW50IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX0FMX0lFICAgICgxIDw8IDApICAgICAgICAvKiBBcmJpdHJhdGlvbiBsb3N0IGludGVycnVwdCBlbmFibGUgKi8KKworLyogSTJDIFN0YXR1cyBSZWdpc3RlciAoSTJDX1NUQVQpOiAqLworCisjZGVmaW5lIEkyQ19TVEFUX1NCRCAgICAoMSA8PCAxNSkgICAgICAgLyogU2luZ2xlIGJ5dGUgZGF0YSAqLworI2RlZmluZSBJMkNfU1RBVF9CQiAgICAgKDEgPDwgMTIpICAgICAgIC8qIEJ1cyBidXN5ICovCisjZGVmaW5lIEkyQ19TVEFUX1JPVlIgICAoMSA8PCAxMSkgICAgICAgLyogUmVjZWl2ZSBvdmVycnVuICovCisjZGVmaW5lIEkyQ19TVEFUX1hVREYgICAoMSA8PCAxMCkgICAgICAgLyogVHJhbnNtaXQgdW5kZXJmbG93ICovCisjZGVmaW5lIEkyQ19TVEFUX0FBUyAgICAoMSA8PCA5KSAgICAgICAgLyogQWRkcmVzcyBhcyBzbGF2ZSAqLworI2RlZmluZSBJMkNfU1RBVF9HQyAgICAgKDEgPDwgNSkKKyNkZWZpbmUgSTJDX1NUQVRfWFJEWSAgICgxIDw8IDQpICAgICAgICAvKiBUcmFuc21pdCBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19TVEFUX1JSRFkgICAoMSA8PCAzKSAgICAgICAgLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19TVEFUX0FSRFkgICAoMSA8PCAyKSAgICAgICAgLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5ICovCisjZGVmaW5lIEkyQ19TVEFUX05BQ0sgICAoMSA8PCAxKSAgICAgICAgLyogTm8gYWNrbm93bGVkZ21lbnQgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfU1RBVF9BTCAgICAgKDEgPDwgMCkgICAgICAgIC8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisKKy8qIEkyQyBJbnRlcnJ1cHQgQ29kZSBSZWdpc3RlciAoSTJDX0lOVENPREUpOiAqLworCisjZGVmaW5lIEkyQ19JTlRDT0RFX01BU0sgICAgICAgIDcKKyNkZWZpbmUgSTJDX0lOVENPREVfTk9ORSAgICAgICAgMAorI2RlZmluZSBJMkNfSU5UQ09ERV9BTCAgICAgICAgICAxICAgICAgIC8qIEFyYml0cmF0aW9uIGxvc3QgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfTkFLICAgICAgICAgMiAgICAgICAvKiBObyBhY2tub3dsZWRnZW1lbnQvZ2VuZXJhbCBjYWxsICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX0FSRFkgICAgICAgIDMgICAgICAgLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1JSRFkgICAgICAgIDQgICAgICAgLyogUmN2IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX0lOVENPREVfWFJEWSAgICAgICAgNSAgICAgICAvKiBYbWl0IGRhdGEgcmVhZHkgKi8KKworLyogSTJDIEJ1ZmZlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChJMkNfQlVGKTogKi8KKworI2RlZmluZSBJMkNfQlVGX1JETUFfRU4gICAgICAgICAoMSA8PCAxNSkgICAgICAgLyogUmVjZWl2ZSBETUEgY2hhbm5lbCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0JVRl9YRE1BX0VOICAgICAgICAgKDEgPDwgNykgICAgICAgIC8qIFRyYW5zbWl0IERNQSBjaGFubmVsIGVuYWJsZSAqLworCisvKiBJMkMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSTJDX0NPTik6ICovCisKKyNkZWZpbmUgSTJDX0NPTl9FTiAgICAgICgxIDw8IDE1KSAgICAgICAvKiBJMkMgbW9kdWxlIGVuYWJsZSAqLworI2RlZmluZSBJMkNfQ09OX0JFICAgICAgKDEgPDwgMTQpICAgICAgIC8qIEJpZyBlbmRpYW4gbW9kZSAqLworI2RlZmluZSBJMkNfQ09OX1NUQiAgICAgKDEgPDwgMTEpICAgICAgIC8qIFN0YXJ0IGJ5dGUgbW9kZSAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9NU1QgICAgICgxIDw8IDEwKSAgICAgICAvKiBNYXN0ZXIvc2xhdmUgbW9kZSAqLworI2RlZmluZSBJMkNfQ09OX1RSWCAgICAgKDEgPDwgOSkgICAgICAgIC8qIFRyYW5zbWl0dGVyL3JlY2VpdmVyIG1vZGUgKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fWEEgICAgICAoMSA8PCA4KSAgICAgICAgLyogRXhwYW5kIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVFAgICAgICgxIDw8IDEpICAgICAgICAvKiBTdG9wIGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVFQgICAgICgxIDw8IDApICAgICAgICAvKiBTdGFydCBjb25kaXRpb24gKG1hc3RlciBtb2RlIG9ubHkpICovCisKKy8qIEkyQyBTeXN0ZW0gVGVzdCBSZWdpc3RlciAoSTJDX1NZU1RFU1QpOiAqLworCisjZGVmaW5lIEkyQ19TWVNURVNUX1NUX0VOICAgICAgICgxIDw8IDE1KSAgICAgICAvKiBTeXN0ZW0gdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfRlJFRSAgICAgICAgKDEgPDwgMTQpICAgICAgIC8qIEZyZWUgcnVubmluZyBtb2RlIChvbiBicmVha3BvaW50KSAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9UTU9ERV9NQVNLICAoMyA8PCAxMikgICAgICAgLyogVGVzdCBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9UTU9ERV9TSElGVCAoMTIpICAgICAgICAgICAgLyogVGVzdCBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9TQ0xfSSAgICAgICAoMSA8PCAzKSAgICAgICAgLyogU0NMIGxpbmUgc2Vuc2UgaW5wdXQgdmFsdWUgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfU0NMX08gICAgICAgKDEgPDwgMikgICAgICAgIC8qIFNDTCBsaW5lIGRyaXZlIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBJMkNfU1lTVEVTVF9TREFfSSAgICAgICAoMSA8PCAxKSAgICAgICAgLyogU0RBIGxpbmUgc2Vuc2UgaW5wdXQgdmFsdWUgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfU0RBX08gICAgICAgKDEgPDwgMCkgICAgICAgIC8qIFNEQSBsaW5lIGRyaXZlIG91dHB1dCB2YWx1ZSAqLworCisjZGVmaW5lIEkyQ19TQ0xMX1NDTEwgICAgICAgICgwKQorI2RlZmluZSBJMkNfU0NMTF9TQ0xMX00gICAgICAoMHhGRikKKyNkZWZpbmUgSTJDX1NDTExfSFNTQ0xMICAgICAgKDgpCisjZGVmaW5lIEkyQ19TQ0xIX0hTU0NMTF9NICAgICgweEZGKQorI2RlZmluZSBJMkNfU0NMSF9TQ0xIICAgICAgICAoMCkKKyNkZWZpbmUgSTJDX1NDTEhfU0NMSF9NICAgICAgKDB4RkYpCisjZGVmaW5lIEkyQ19TQ0xIX0hTU0NMSCAgICAgICg4KQorI2RlZmluZSBJMkNfU0NMSF9IU1NDTEhfTSAgICAoMHhGRikKKworI2RlZmluZSBPTUFQX0kyQ19TVEFOREFSRCAgICAgICAgICAxMDAKKyNkZWZpbmUgT01BUF9JMkNfRkFTVF9NT0RFICAgICAgICAgNDAwCisjZGVmaW5lIE9NQVBfSTJDX0hJR0hfU1BFRUQgICAgICAgIDM0MDAKKworI2RlZmluZSBTWVNURU1fQ0xPQ0tfMTIgICAgICAgMTIwMDAKKyNkZWZpbmUgU1lTVEVNX0NMT0NLXzEzICAgICAgIDEzMDAwCisjZGVmaW5lIFNZU1RFTV9DTE9DS18xOTIgICAgICAxOTIwMAorI2RlZmluZSBTWVNURU1fQ0xPQ0tfOTYgICAgICAgOTYwMDAKKworI2RlZmluZSBJMkNfSVBfQ0xLIFNZU1RFTV9DTE9DS185NgorI2RlZmluZSBJMkNfUFNDX01BWCAgICAgICAgICAoMHgwZikKKyNkZWZpbmUgSTJDX1BTQ19NSU4gICAgICAgICAgKDB4MDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tZW0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwYmNlNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbWVtLmgKQEAgLTAsMCArMSw1ODYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMzRYWF9NRU1fSF8KKyNkZWZpbmUgX09NQVAzNFhYX01FTV9IXworCisjZGVmaW5lIFNEUkNfQ1MwX09TRVQgICAgMHgwCisjZGVmaW5lIFNEUkNfQ1MxX09TRVQgICAgMHgzMCAgLyogbWlycm9yIENTMSByZWdzIGFwcGVhciBvZmZzZXQgMHgzMCBmcm9tIENTMCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIGVudW0geworCVNUQUNLRUQJCT0gMCwKKwlJUF9ERFIJCT0gMSwKKwlDT01CT19ERFIJPSAyLAorCUlQX1NEUgkgCT0gMywKK30gbWVtX3Q7CisKKworLyogTWVtb3J5IHRoYXQgY2FuIGJlIGNvbm5lY3RlZCB0byBHUE1DICovCisjZGVmaW5lIEdQTUNfTk9SICAgICAgICAgICAgMAorI2RlZmluZSBHUE1DX05BTkQgICAgICAgICAgIDEKKyNkZWZpbmUgR1BNQ19NRE9DICAgICAgICAgICAyCisjZGVmaW5lIEdQTUNfT05FTkFORCAgICAgICAgMworI2RlZmluZSBNTUNfTkFORAkJCTQKKyNkZWZpbmUgTU1DX09ORU5BTkQJCQk1CisjZGVmaW5lIFVTQl9QRVJJUEhFUkFMICAgICAgNgorCisjZW5kaWYKKworLyogc2V0IHRoZSAzNDN4LVNEUkMgaW5jb21pbmcgYWRkcmVzcyBjb252ZW50aW9uICovCisjaWYgZGVmaW5lZChTRFJDX0JfUl9DKQorI2RlZmluZSBCX0FMTAkoMCA8PCA2KQkvKiBiYW5rLXJvdy1jb2x1bW4gKi8KKyNlbGlmIGRlZmluZWQoU0RSQ19CMV9SX0IwX0MpCisjZGVmaW5lIEJfQUxMCSgxIDw8IDYpCS8qIGJhbmsxLXJvdy1iYW5rMC1jb2x1bW4gKi8KKyNlbGlmIGRlZmluZWQoU0RSQ19SX0JfQykKKyNkZWZpbmUgQl9BTEwJKDIgPDwgNikJLyogcm93LWJhbmstY29sdW1uICovCisjZW5kaWYKKworLyogRnV0dXJlIG1lbW9yeSBjb21iaW5hdGlvbnMgYmFzZWQgb24gcGFzdCAqLworI2RlZmluZSBTRFBfU0RSQ19NRENGR19NT05PX0REUiAgICAweDAKKyNkZWZpbmUgU0RQX0NPTUJPX01EQ0ZHXzBfRERSICAgICAgMHgwCisjZGVmaW5lIFNEUF9TRFJDX01EQ0ZHXzBfU0RSICAgICAgIDB4MAorCisvKiBTbG93ZXIgZnVsbCBmcmVxdWVuY3kgcmFuZ2UgZGVmYXVsdCB0aW1pbmdzIGZvciB4MzIgb3BlcmF0aW9uKi8KKyNkZWZpbmUgU0RQX1NEUkNfU0hBUklORwkJMHgwMDAwMDEwMAorI2RlZmluZSBTRFBfU0RSQ19NUl8wX1NEUgkJMHgwMDAwMDAzMQorCisjaWZkZWYgQ09ORklHXzM0MzBaRUJVCisjZGVmaW5lIFNEUF9TRFJDX01EQ0ZHXzBfRERSCSgweDAyNTgyMDE5fEJfQUxMKSAvKiBJbmZpbiBkZHIgbW9kdWxlICovCisjZWxzZQorI2RlZmluZSBTRFBfU0RSQ19NRENGR18wX0REUgkoMHgwMjU4NDAxOXxCX0FMTCkgLyogSW5maW4gZGRyIG1vZHVsZSAqLworI2VuZGlmCisKKyNkZWZpbmUgU0RQX1NEUkNfTVJfMF9ERFIJCTB4MDAwMDAwMzIKKworLyogRGlhYmxpbmcgcG93ZXIgZG93biBtb2RlIHVzaW5nIENLRSBwaW4gKi8KKyNkZWZpbmUgU0RQX1NEUkNfUE9XRVJfUE9QICAgICAgMHgwMDAwMDA4MQorCisvKiBvcHRpbWl6ZWQgdGltaW5ncyBnb29kIGZvciBjdXJyZW50IHNoaXBwaW5nIHBhcnRzICovCisjZGVmaW5lIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTAwTUh6ICAgMHgwMDAyZGEwMQorI2RlZmluZSBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzEzM01IeiAgIDB4MDAwM2RlMDEgLyogNy44dXMvNy41bnMgLSA1MD0weDNkZSAqLworI2RlZmluZSBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzE2NU1IeiAgIDB4MDAwNGUyMDEgLyogNy44dXMvNm5zIC0gNTA9MHg0ZTIgKi8KKworI2RlZmluZSBETExfT0ZGU0VUICAgICAgICAgICAgICAwCisjZGVmaW5lIERMTF9XUklURUREUkNMS1gyRElTICAgIDEKKyNkZWZpbmUgRExMX0VOQURMTCAgICAgICAgICAgICAgMQorI2RlZmluZSBETExfTE9DS0RMTCAgICAgICAgICAgICAwCisjZGVmaW5lIERMTF9ETExQSEFTRV83MiAgICAgICAgIDAKKyNkZWZpbmUgRExMX0RMTFBIQVNFXzkwICAgICAgICAgMQorCisvLyBya3cgLSBuZWVkIHRvIGZpbmQgb2YgOTAvNzIgZGVncmVlIHJlY29tbWVuZGF0aW9uIGZvciBzcGVlZCBsaWtlIGJlZm9yZS4KKyNkZWZpbmUgU0RQX1NEUkNfRExMQUJfQ1RSTCAoKERMTF9FTkFETEwgPDwgMykgfCBcCisgICAgKERMTF9MT0NLRExMIDw8IDIpIHwgKERMTF9ETExQSEFTRV85MCA8PCAxKSkKKworLyogSW5maW5lb24gcGFydCBvZiAzNDMwU0RQICgxMzNNSHogb3B0aW1pemVkKSB+IDcuNW5zCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS83LjUgKyAyMi41LzcuNSA9IDIgKyAzID0gNQorICoJVERQTCA9IDE1LzcuNQk9IDIKKyAqCVRSUkQgPSAxNS8yLjUJPSAyCisgKglUUkNEID0gMjIuNS83LjUJPSAzCisgKglUUlAgPSAyMi41LzcuNQk9IDMKKyAqCVRSQVMgPSA0NS83LjUJPSA2CisgKglUUkMgPSA2NS83LjUJPSA4LjYtPjkKKyAqCVRSRkMgPSA3NS83LjUJPSAxMAorICogICBBQ1RJTUIKKyAqCVRDS0UgPSAyCisgKglYU1IgPSAxMjAvNy41ID0gMTYKKyAqLworI2RlZmluZSBJTkZJTkVPTl9UREFMXzEzMyAgIDUKKyNkZWZpbmUgSU5GSU5FT05fVERQTF8xMzMgICAyCisjZGVmaW5lIElORklORU9OX1RSUkRfMTMzICAgMgorI2RlZmluZSBJTkZJTkVPTl9UUkNEXzEzMyAgIDMKKyNkZWZpbmUgSU5GSU5FT05fVFJQXzEzMyAgICAzCisjZGVmaW5lIElORklORU9OX1RSQVNfMTMzICAgNgorI2RlZmluZSBJTkZJTkVPTl9UUkNfMTMzICAgIDkKKyNkZWZpbmUgSU5GSU5FT05fVFJGQ18xMzMgIDEwCisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1BXzEzMyAoKElORklORU9OX1RSRkNfMTMzIDw8IDI3KSB8IChJTkZJTkVPTl9UUkNfMTMzIDw8IDIyKSB8IChJTkZJTkVPTl9UUkFTXzEzMyA8PCAxOCkgXAorCQl8KElORklORU9OX1RSUF8xMzMgPDwgMTUpIHwgKElORklORU9OX1RSQ0RfMTMzIDw8IDEyKSB8KElORklORU9OX1RSUkRfMTMzIDw8IDkpIHwoSU5GSU5FT05fVERQTF8xMzMgPDwgNikgXAorCQl8IChJTkZJTkVPTl9UREFMXzEzMykpCisKKyNkZWZpbmUgSU5GSU5FT05fVFdUUl8xMzMgICAxCisjZGVmaW5lIElORklORU9OX1RDS0VfMTMzICAgMgorI2RlZmluZSBJTkZJTkVPTl9UWFBfMTMzICAgIDIKKyNkZWZpbmUgSU5GSU5FT05fWFNSXzEzMyAgIDE2CisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1CXzEzMyAoKElORklORU9OX1RDS0VfMTMzIDw8IDEyKSB8IChJTkZJTkVPTl9YU1JfMTMzIDw8IDApKSB8IFwKKwkJCQkoSU5GSU5FT05fVFhQXzEzMyA8PCA4KSB8IChJTkZJTkVPTl9UV1RSXzEzMyA8PCAxNikKKworI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQV8xMDAgSU5GSU5FT05fVl9BQ1RJTUFfMTMzCisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1CXzEwMCBJTkZJTkVPTl9WX0FDVElNQl8xMzMKKworCisvKiBJbmZpbmVvbiBwYXJ0IG9mIDM0MzBTRFAgKDE2NU1IeiBvcHRpbWl6ZWQpIDYuMDZucworICogICBBQ1RJTUEKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzYgKyAxOC82ID0gMi41ICsgMyA9IDUuNSAtPiA2CisgKglURFBMIChUd3IpID0gMTUvNgk9IDIuNSAtPiAzCisgKglUUlJEID0gMTIvNgk9IDIKKyAqCVRSQ0QgPSAxOC82CT0gMworICoJVFJQID0gMTgvNgk9IDMKKyAqCVRSQVMgPSA0Mi82CT0gNworICoJVFJDID0gNjAvNgk9IDEwCisgKglUUkZDID0gNzIvNgk9IDEyCisgKiAgIEFDVElNQgorICoJVENLRSA9IDIKKyAqCVhTUiA9IDEyMC82ID0gMjAKKyAqLworI2RlZmluZSBJTkZJTkVPTl9UREFMXzE2NSAgIDYKKyNkZWZpbmUgSU5GSU5FT05fVERQTF8xNjUgICAzCisjZGVmaW5lIElORklORU9OX1RSUkRfMTY1ICAgMgorI2RlZmluZSBJTkZJTkVPTl9UUkNEXzE2NSAgIDMKKyNkZWZpbmUgSU5GSU5FT05fVFJQXzE2NSAgICAzCisjZGVmaW5lIElORklORU9OX1RSQVNfMTY1ICAgNworI2RlZmluZSBJTkZJTkVPTl9UUkNfMTY1ICAgMTAKKyNkZWZpbmUgSU5GSU5FT05fVFJGQ18xNjUgIDEyCisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1BXzE2NSAoKElORklORU9OX1RSRkNfMTY1IDw8IDI3KSB8IChJTkZJTkVPTl9UUkNfMTY1IDw8IDIyKSB8IChJTkZJTkVPTl9UUkFTXzE2NSA8PCAxOCkgXAorCQl8IChJTkZJTkVPTl9UUlBfMTY1IDw8IDE1KSB8IChJTkZJTkVPTl9UUkNEXzE2NSA8PCAxMikgfChJTkZJTkVPTl9UUlJEXzE2NSA8PCA5KSB8IFwKKwkJKElORklORU9OX1REUExfMTY1IDw8IDYpIHwgKElORklORU9OX1REQUxfMTY1KSkKKworI2RlZmluZSBJTkZJTkVPTl9UV1RSXzE2NSAgIDEKKyNkZWZpbmUgSU5GSU5FT05fVENLRV8xNjUgICAyCisjZGVmaW5lIElORklORU9OX1RYUF8xNjUgICAgMgorI2RlZmluZSBJTkZJTkVPTl9YU1JfMTY1ICAgIDIwCisjZGVmaW5lIElORklORU9OX1ZfQUNUSU1CXzE2NSAoKElORklORU9OX1RDS0VfMTY1IDw8IDEyKSB8IChJTkZJTkVPTl9YU1JfMTY1IDw8IDApKSB8IFwKKwkJCQkoSU5GSU5FT05fVFhQXzE2NSA8PCA4KSB8IChJTkZJTkVPTl9UV1RSXzE2NSA8PCAxNikKKworLyogTWljcm9uIHBhcnQgb2YgMzQzMCBFVk0gKDEzM01IeiBvcHRpbWl6ZWQpIH4gNy41bnMKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzcuNSArIDIyLjUvNy41ID0gMiArIDMgPSA1CisgKglURFBMID0gIDE1LzcuNSAgID0gMgorICoJVFJSRCA9ICAxNS83LjUgICA9IDIKKyAqCVRSQ0QgPSAgMjIuNS83LjUgPSAzCisgKglUUlAgID0gIDIyLjUvNy41ID0gMworICoJVFJBUyA9ICA0NS83LjUgICA9IDYKKyAqCVRSQyAgPSAgNzUvNy41ICAgPSAxMAorICoJVFJGQyA9ICAxMjUvNy41ICA9IDE2LjYtPjE3CisgKiAgIEFDVElNQgorICoJVFdUUiA9ICAxCisgKglUQ0tFID0gIDEKKyAqCVRYU1IgPSAgMTM4LzcuNSAgPSAxOC4zLT4xOQorICoJVFhQICA9ICAyNS83LjUgICA9IDMuMy0+NAorICovCisjZGVmaW5lIE1JQ1JPTl9UREFMXzEzMyAgIDUKKyNkZWZpbmUgTUlDUk9OX1REUExfMTMzICAgMgorI2RlZmluZSBNSUNST05fVFJSRF8xMzMgICAyCisjZGVmaW5lIE1JQ1JPTl9UUkNEXzEzMyAgIDMKKyNkZWZpbmUgTUlDUk9OX1RSUF8xMzMgICAgMworI2RlZmluZSBNSUNST05fVFJBU18xMzMgICA2CisjZGVmaW5lIE1JQ1JPTl9UUkNfMTMzICAgIDEwCisjZGVmaW5lIE1JQ1JPTl9UUkZDXzEzMyAgIDE3CisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQV8xMzMgKChNSUNST05fVFJGQ18xMzMgPDwgMjcpIHwgKE1JQ1JPTl9UUkNfMTMzIDw8IDIyKSB8IChNSUNST05fVFJBU18xMzMgPDwgMTgpIFwKKwkJfChNSUNST05fVFJQXzEzMyA8PCAxNSkgfCAoTUlDUk9OX1RSQ0RfMTMzIDw8IDEyKSB8KE1JQ1JPTl9UUlJEXzEzMyA8PCA5KSB8KE1JQ1JPTl9URFBMXzEzMyA8PCA2KSBcCisJCXwgKE1JQ1JPTl9UREFMXzEzMykpCisKKyNkZWZpbmUgTUlDUk9OX1RXVFJfMTMzICAgMQorI2RlZmluZSBNSUNST05fVENLRV8xMzMgICAxCisjZGVmaW5lIE1JQ1JPTl9UWFNSXzEzMyAgIDE5CisjZGVmaW5lIE1JQ1JPTl9UWFBfMTMzICAgIDQKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1CXzEzMyAoKE1JQ1JPTl9UV1RSXzEzMyA8PCAxNikgfCAoTUlDUk9OX1RDS0VfMTMzIDw8IDEyKSB8IChNSUNST05fVFhQXzEzMyA8PCA4KSBcCisJCXwgKE1JQ1JPTl9UWFNSXzEzMyA8PCAwKSkKKworI2RlZmluZSBNSUNST05fVl9BQ1RJTUFfMTAwIE1JQ1JPTl9WX0FDVElNQV8xMzMKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1CXzEwMCBNSUNST05fVl9BQ1RJTUJfMTMzCisKKy8qIE1pY3JvbiBwYXJ0IG9mIDM0MzAgRVZNICgxNjVNSHogb3B0aW1pemVkKSA2LjA2bnMKKyAqICAgQUNUSU1BCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS82ICsgMTggLzYgPSAyLjUgKyAzID0gNS41IC0+IDYKKyAqCVREUEwgKFR3cikgPSAxNS82CT0gMi41IC0+IDMKKyAqCVRSUkQgPSAxMi82CT0gMgorICoJVFJDRCA9IDE4LzYgPSAzCisgKglUUlAgPSAxOC82CT0gMworICoJVFJBUyA9IDQyLzYJPSA3CisgKglUUkMgPSA2MC82CT0gMTAKKyAqCVRSRkMgPSAxMjUvNgk9IDIxCisgKiAgIEFDVElNQgorICoJVFdUUiA9ICAxCisgKglUQ0tFID0gIDEKKyAqCVRYU1IgPSAgMTM4LzYgID0gMjMKKyAqCVRYUCAgPSAgMjUvNiAgID0gNC4xIH41CisgKi8KKyNkZWZpbmUgTUlDUk9OX1REQUxfMTY1ICAgNgorI2RlZmluZSBNSUNST05fVERQTF8xNjUgICAzCisjZGVmaW5lIE1JQ1JPTl9UUlJEXzE2NSAgIDIKKyNkZWZpbmUgTUlDUk9OX1RSQ0RfMTY1ICAgMworI2RlZmluZSBNSUNST05fVFJQXzE2NSAgICAzCisjZGVmaW5lIE1JQ1JPTl9UUkFTXzE2NSAgIDcKKyNkZWZpbmUgTUlDUk9OX1RSQ18xNjUgICAxMAorI2RlZmluZSBNSUNST05fVFJGQ18xNjUgIDIxCisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQV8xNjUgKChNSUNST05fVFJGQ18xNjUgPDwgMjcpIHwgKE1JQ1JPTl9UUkNfMTY1IDw8IDIyKSB8IChNSUNST05fVFJBU18xNjUgPDwgMTgpIFwKKwkJfCAoTUlDUk9OX1RSUF8xNjUgPDwgMTUpIHwgKE1JQ1JPTl9UUkNEXzE2NSA8PCAxMikgfChNSUNST05fVFJSRF8xNjUgPDwgOSkgfCBcCisJCShNSUNST05fVERQTF8xNjUgPDwgNikgfCAoTUlDUk9OX1REQUxfMTY1KSkKKworI2RlZmluZSBNSUNST05fVFdUUl8xNjUgICAxCisjZGVmaW5lIE1JQ1JPTl9UQ0tFXzE2NSAgIDEKKyNkZWZpbmUgTUlDUk9OX1RYUF8xNjUgICAgNQorI2RlZmluZSBNSUNST05fWFNSXzE2NSAgICAyMworI2RlZmluZSBNSUNST05fVl9BQ1RJTUJfMTY1ICgoTUlDUk9OX1RDS0VfMTY1IDw8IDEyKSB8IChNSUNST05fWFNSXzE2NSA8PCAwKSkgfCBcCisJCQkJKE1JQ1JPTl9UWFBfMTY1IDw8IDgpIHwgKE1JQ1JPTl9UV1RSXzE2NSA8PCAxNikKKworCisKKy8qIEh5bml4IHBhcnQgb2YgQU0vRE0zN3hFVk0gKDIwME1IeiBvcHRpbWl6ZWQpCisgKiAgIEFDVElNQQorICoJVERBTAkJPSA2CisgKglURFBMIChUd3IpCT0gMworICoJVFJSRAkJPSAyCisgKglUUkNECQk9IDQKKyAqCVRSUAkJPSAzCisgKglUUkFTCQk9IDgKKyAqCVRSQwkJPSAxMQorICoJVFJGQwkJPSAxOAorICogICBBQ1RJTUIKKyAqCVRXVFIJCT0gMgorICoJVENLRQkJPSAxCisgKglUWFAJCT0gMQorICoJVFhTUgkJPSAyOAorICovCisjZGVmaW5lIEhZTklYX1REQUxfMjAwCTYKKyNkZWZpbmUgSFlOSVhfVERQTF8yMDAJMworI2RlZmluZSBIWU5JWF9UUlJEXzIwMAkyCisjZGVmaW5lIEhZTklYX1RSQ0RfMjAwCTQKKyNkZWZpbmUgSFlOSVhfVFJQXzIwMAkJMworI2RlZmluZSBIWU5JWF9UUkFTXzIwMAk4CisjZGVmaW5lIEhZTklYX1RSQ18yMDAJCTExCisjZGVmaW5lIEhZTklYX1RSRkNfMjAwCTE4CisjZGVmaW5lIEhZTklYX1ZfQUNUSU1BXzIwMAkoKEhZTklYX1RSRkNfMjAwIDw8IDI3KSB8IChIWU5JWF9UUkNfMjAwIDw8IDIyKSB8IFwKKwkJCShIWU5JWF9UUkFTXzIwMCA8PCAxOCkgfCAoSFlOSVhfVFJQXzIwMCA8PCAxNSkgfCAgXAorCQkJKEhZTklYX1RSQ0RfMjAwIDw8IDEyKSB8IChIWU5JWF9UUlJEXzIwMCA8PCA5KSB8ICBcCisJCQkoSFlOSVhfVERQTF8yMDAgPDwgNikgfCAoSFlOSVhfVERBTF8yMDApKQorCisjZGVmaW5lIEhZTklYX1RXVFJfMjAwCTIKKyNkZWZpbmUgSFlOSVhfVENLRV8yMDAJMQorI2RlZmluZSBIWU5JWF9UWFBfMjAwCQkxCisjZGVmaW5lIEhZTklYX1hTUl8yMDAJCTI4CisjZGVmaW5lIEhZTklYX1ZfQUNUSU1CXzIwMAkoKChIWU5JWF9UQ0tFXzIwMCA8PCAxMikgfCAoSFlOSVhfWFNSXzIwMCA8PCAwKSkgfAlcCisJCQkoSFlOSVhfVFhQXzIwMCA8PCA4KSB8IChIWU5JWF9UV1RSXzIwMCA8PCAxNikpCisKKyNkZWZpbmUgSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQV8wCUhZTklYX1ZfQUNUSU1BXzIwMAorI2RlZmluZSBIWU5JWF9TRFJDX0FDVElNX0NUUkxCXzAJSFlOSVhfVl9BQ1RJTUJfMjAwCisKKworCisvKiBOZXcgYW5kIGNvbXBhdGFiaWxpdHkgc3BlZWQgZGVmaW5lcyAqLworI2lmIGRlZmluZWQoUFJDTV9DTEtfQ0ZHMl8yMDBNSFopIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUIpCisjIGRlZmluZSBMM18xMDBNSFogICAvKiBVc2Ugd2l0aCA8PSAxMDBNSHogU0RSQU0gKi8KKyNlbGlmIGRlZmluZWQgKFBSQ01fQ0xLX0NGRzJfMjY2TUhaKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHX0lJSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QSkKKyMgZGVmaW5lIEwzXzEzM01IWiAgICAvKiBVc2Ugd2l0aCA8PSAxMzNNSHogU0RSQU0qLworI2VsaWYgIGRlZmluZWQoUFJDTV9DTEtfQ0ZHMl8zMzJNSFopIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR18yKQorIyBkZWZpbmUgTDNfMTY1TUhaICAgIC8qIFVzZSB3aXRoIDw9IDE2NU1IeiBTRFJBTSAoTDM9MTY2IG9uIDM0MzApICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoTDNfMTAwTUhaKQorIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgTUlDUk9OX1ZfQUNUSU1BXzEwMAorIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgTUlDUk9OX1ZfQUNUSU1CXzEwMAorI2VsaWYgZGVmaW5lZChMM18xMzNNSFopCisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBNSUNST05fVl9BQ1RJTUFfMTMzCisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBNSUNST05fVl9BQ1RJTUJfMTMzCisjZWxpZiAgZGVmaW5lZChMM18xNjVNSFopCisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBNSUNST05fVl9BQ1RJTUFfMTY1CisjIGRlZmluZSBNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBNSUNST05fVl9BQ1RJTUJfMTY1CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChMM18xMDBNSFopCisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIElORklORU9OX1ZfQUNUSU1BXzEwMAorIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBJTkZJTkVPTl9WX0FDVElNQl8xMDAKKyNlbGlmIGRlZmluZWQoTDNfMTMzTUhaKQorIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBJTkZJTkVPTl9WX0FDVElNQV8xMzMKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUJfMTMzCisjZWxpZiAgZGVmaW5lZChMM18xNjVNSFopCisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIElORklORU9OX1ZfQUNUSU1BXzE2NQorIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQl8wICAgICBJTkZJTkVPTl9WX0FDVElNQl8xNjUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMM18xMDBNSFopCisjIGRlZmluZSBTRFBfU0RSQ19SRlJfQ1RSTCAgICAgICAgICBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzEwME1IegorI2VsaWYgZGVmaW5lZChMM18xMzNNSFopCisjIGRlZmluZSBTRFBfU0RSQ19SRlJfQ1RSTCAgICAgICAgICBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzEzM01IegorI2VsaWYgIGRlZmluZWQoTDNfMTY1TUhaKQorIyBkZWZpbmUgU0RQX1NEUkNfUkZSX0NUUkwgICAgICAgICAgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xNjVNSHoKKyNlbmRpZgorCisvKgorICogR1BNQyBzZXR0aW5ncyAtCisgKiBEZWZpbml0aW9ucyBpcyBhcyBwZXIgdGhlIGZvbGxvd2luZyBmb3JtYXQKKyAqICMgZGVmaW5lIDxQQVJUPl9HUE1DX0NPTkZJRzx4PiA8dmFsdWU+CisgKiBXaGVyZToKKyAqIFBBUlQgaXMgdGhlIHBhcnQgbmFtZSBlLmcuIFNUTk9SIC0gSW50ZWwgU3RyYXRhIEZsYXNoCisgKiB4IGlzIEdQTUMgY29uZmlnIHJlZ2lzdGVycyBmcm9tIDEgdG8gNiAodGhlcmUgd2lsbCBiZSA2IG1hY3JvcykKKyAqIFZhbHVlIGlzIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAqCisgKiBGb3IgZXZlcnkgdmFsaWQgUFJDTSBjb25maWd1cmF0aW9uIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBkZWZpbml0aW9uIG9mCisgKiB0aGUgc2FtZS4gaWYgdmFsdWVzIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgYm9hcmQsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlCisgKiBwcmVzZW50IGluIHRoaXMgZmlsZSBpZiB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiB0aGUgYm9hcmQsIHRoZW4gdGhpcyBzaG91bGQKKyAqIGdvIGludG8gY29ycmVzcG9uZGluZyBtZW0tYm9hcmROYW1lLmggZmlsZQorICoKKyAqIEN1cnJlbnRseSB2YWxpZCBwYXJ0IE5hbWVzIGFyZSAoUEFSVCk6CisgKiBTVE5PUiAtIEludGVsIFN0cmF0YSBGbGFzaAorICogU01OQU5EIC0gU2Ftc3VuZyBOQU5ECisgKiBNX05BTkQgLSBNaWNyb24gTGFyZ2UgcGFnZSB4MTYgTkFORAorICogTVBEQiAtIEg0IE1QREIgYm9hcmQKKyAqIFNCTk9SIC0gU2libGV5IE5PUgorICogT05OQU5EIC0gU2Ftc3VuZyBPbmUgTkFORAorICoKKyAqIGluY2x1ZGUvY29uZmlncy9maWxlLmggY29udGFpbnMgdGhlIGRlZm4gLSBmb3IgYWxsIENTIHdlIGFyZSBpbnRlcmVzdGVkCisgKiAjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1N4IFBBUlQKKyAqICNkZWZpbmUgT01BUDM0WFhfR1BNQ19DU3hfU0laRSBTaXplCisgKiAjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1N4X01BUCBNYXAKKyAqIFdoZXJlOgorICogeCAtIENTIG51bWJlcgorICogUEFSVCAtIFBhcnQgTmFtZSBhcyBkZWZpbmVkIGFib3ZlCisgKiBTSVpFIC0gaG93IGJpZyBpcyB0aGUgbWFwcGluZyB0byBiZQorICogICBHUE1DX1NJWkVfMTI4TSAtIDB4OAorICogICBHUE1DX1NJWkVfNjRNICAtIDB4QworICogICBHUE1DX1NJWkVfMzJNICAtIDB4RQorICogICBHUE1DX1NJWkVfMTZNICAtIDB4RgorICogTUFQICAtIE1hcCB0aGlzIENTIHRvIHdoaWNoIGFkZHJlc3MoR1BNQyBhZGRyZXNzIHNwYWNlKS0gQWJzb2x1dGUgYWRkcmVzcworICogICA+PjI0IGJlZm9yZSBiZWluZyB1c2VkLgorICovCisjZGVmaW5lIEdQTUNfU0laRV8xMjhNICAweDgKKyNkZWZpbmUgR1BNQ19TSVpFXzY0TSAgIDB4QworI2RlZmluZSBHUE1DX1NJWkVfMzJNICAgMHhFCisjZGVmaW5lIEdQTUNfU0laRV8xNk0gICAweEYKKworI2lmIGRlZmluZWQoTDNfMTAwTUhaKQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwQTgwCisKKyNpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0WFgpCisKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiAweDAwMDkwOTAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIDB4MDAwOTA5MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgMHgwNzAxMDcwMgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSAweDAxMDUwOTA4CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IDB4MUYwRjAzODAKKworI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKworI2lmZGVmIE5BTkRfMTZCSVQKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorI2Vsc2UKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMDgwMAorI2VuZGlmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCAweDA2MDAwNjAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IDB4MDAwNzA4MDgKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDNjZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwODQ4CisKKyNlbmRpZgorCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMGYwZjAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNTA1MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgwQzA2MEMwNgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MCAgLyogMD8gKi8KKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgICAweDAwMUYxRjAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgIDB4MDAwODA4MDIKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAgMHgxQzA5MUMwOQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgICAweDAzMUExRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgIDB4MDAwMDAzQzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChMM18xMzNNSFopCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDA4MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwQTgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDBDNDQKKworI2lmIGRlZmluZWQgKENPTkZJR19PTUFQMzRYWCkKKworIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIFNNTkFORF9HUE1DX0NPTkZJRzIKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgU01OQU5EX0dQTUNfQ09ORklHMworIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCBTTU5BTkRfR1BNQ19DT05GSUc0CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IFNNTkFORF9HUE1DX0NPTkZJRzUKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgU01OQU5EX0dQTUNfQ09ORklHNgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNyBTTU5BTkRfR1BNQ19DT05GSUc3CisKKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyNlbHNlCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDA4MDAKKyNlbmRpZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgMHgwNjAwMDYwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSAweDAwMDcwODA4CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAzY2YKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMDg0OAorCisjZW5kaWYKKworCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MTIwMworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgxMDA4MTAwOAorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0YzQKKworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMSAgMHgxMjAwCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcyICAweDAwMWYxZjAwCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUczICAweDAwMDgwODAyCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc0ICAweDFDMDkxQzA5CisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwM0MyCisKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcxICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDMKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc0ICAweDFDMDkxQzA5CisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgMHgwNDFmMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0QzQKKworIyBkZWZpbmUgUDJfR1BNQ19DT05GSUcxICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMiAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzMgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc0ICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNSAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzYgIDB4MAorCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxMjAwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMiAweDAwMGMwYzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMyAweDAwMDMwMzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNCAweDBjMDQwYzA0CisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxMDEwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwMDAwCisKKyNlbmRpZiAvKiBlbmRpZiBMM18xMzNNSFogKi8KKworI2lmIGRlZmluZWQgKEwzXzE2NU1IWikKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMDgwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MUYwRjBBODAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMEM0NAorCisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKQorCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgU01OQU5EX0dQTUNfQ09ORklHMgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyBTTU5BTkRfR1BNQ19DT05GSUczCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IFNNTkFORF9HUE1DX0NPTkZJRzQKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgU01OQU5EX0dQTUNfQ09ORklHNQorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiBTTU5BTkRfR1BNQ19DT05GSUc2CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc3IFNNTkFORF9HUE1DX0NPTkZJRzcKKworI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKworI2lmZGVmIE5BTkRfMTZCSVQKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorI2Vsc2UKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMDgwMAorI2VuZGlmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCAweDA2MDAwNjAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IDB4MDAwNzA4MDgKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDNjZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwODQ4CisKKyNlbmRpZgorCisKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDExMDkxMTA5CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExNDFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRjNAorCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcxICAweDEyMDAKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDAKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDIKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzQgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzYgIDB4MUYwRjAzQzIKKworIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzEgIDB4MDA2MTEyMDAKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUcyICAweDAwMUYxRjAxCisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMworIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzQgIDB4MUQwOTFEMDkKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUc1ICAweDA0MUQxRjFGCisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHNiAgMHgxRDA5MDRDNAorCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAweDAwMDgwODAzCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgMHgxYzBiMWMwYQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgIDB4MDQxZjFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAweDFGMEYwNEM0CisKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMSAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzIgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUczICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNCAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzUgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc2ICAweDAKKworIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTIwMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzIgMHgwMDBGMEYwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzMgMHgwMDAzMDMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzQgMHgwRjA0MEYwNAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBGMTAxMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzYgMHgxRjA2MDAwMAorCisjZW5kaWYKKworLyogbWF4IG51bWJlciBvZiBHUE1DIENoaXAgU2VsZWN0cyAqLworI2RlZmluZSBHUE1DX01BWF9DUyAgICA4CisvKiBtYXggbnVtYmVyIG9mIEdQTUMgcmVncyAqLworI2RlZmluZSBHUE1DX01BWF9SRUcgICA3CisKKyNkZWZpbmUgUElTTU8xX05PUiAgICAgICAxCisjZGVmaW5lIFBJU01PMV9OQU5EICAgICAgMgorI2RlZmluZSBQSVNNTzJfQ1MwICAzCisjZGVmaW5lIFBJU01PMl9DUzEgIDQKKyNkZWZpbmUgUElTTU8xX09ORU5BTkQgIDUKKyNkZWZpbmUgUE9QX09ORU5BTkQJNQorI2RlZmluZSBEQkdfTVBEQiAgICAgICA2CisjZGVmaW5lIFBJU01PMl9OQU5EX0NTMCA3CisjZGVmaW5lIFBJU01PMl9OQU5EX0NTMSA4CisKKy8qIG1ha2UgaXQgcmVhZGFibGUgZm9yIHRoZSBncG1jX2luaXQgKi8KKyNkZWZpbmUgUElTTU8xX05PUl9CQVNFCQlGTEFTSF9CQVNFCisjZGVmaW5lIFBJU01PMV9OQU5EX0JBU0UJTkFORF9CQVNFCisjZGVmaW5lIFBJU01PMl9DUzBfQkFTRQkJUElTTU8yX01BUDEKKyNkZWZpbmUgUElTTU8xX09ORU5fQkFTRQlPTkVOQU5EX01BUAorI2RlZmluZSBQT1BfT05FTl9CQVNFCQlPTkVOQU5EX01BUAorI2RlZmluZSBEQkdfTVBEQl9CQVNFCQlERUJVR19CQVNFCisKKyNlbmRpZiAvKiBlbmRpZiBfT01BUDM0WFhfTUVNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21tYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tbWMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmNlYjVmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tbWMuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL21tYy9tbWNfcHhhLmgKKyAqCisgKiAgQXV0aG9yOiBWbGFkaW1pciBTaGVib3JkYWV2LCBJZ29yIE9ibGFrb3YKKyAqICBDb3B5cmlnaHQ6ICBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgJElkOiBtbWNfcHhhLmgsdiAwLjMuMS42IDIwMDIvMDkvMjUgMTk6MjU6NDggdGVkIEV4cCB0ZWQgJAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19NTUNfUFhBX1BfSF9fCisjZGVmaW5lIF9fTU1DX1BYQV9QX0hfXworCisvKiBQWEEtMjUwIE1NQyBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCisvKiBNTUNfU1RSUENMICovCisjZGVmaW5lIE1NQ19TVFJQQ0xfU1RPUF9DTEsgICAgIAkoMHgwMDAxVUwpCisjZGVmaW5lIE1NQ19TVFJQQ0xfU1RBUlRfQ0xLCQkoMHgwMDAyVUwpCisKKy8qIE1NQ19TVEFUICovCisKKyNkZWZpbmUgTU1DX1NUQVRfRVJST1JTIChNTUNfU1RBVF9SRVNfQ1JDX0VSUk9SIHwgTU1DX1NUQVRfU1BJX1JFQURfRVJST1JfVE9LRU5cCisJfCBNTUNfU1RBVF9DUkNfUkVBRF9FUlJPUiB8IE1NQ19TVEFUX1RJTUVfT1VUX1JFU1BPTlNFIFwKKwl8IE1NQ19TVEFUX1JFQURfVElNRV9PVVQgfCBNTUNfU1RBVF9DUkNfV1JJVEVfRVJST1IpCisKKy8qIE1NQ19DTEtSVCAqLworI2RlZmluZSBNTUNfQ0xLUlRfMjBNSFoJIAkJKDB4MDAwMFVMKQorI2RlZmluZSBNTUNfQ0xLUlRfMTBNSFoJIAkJKDB4MDAwMVVMKQorI2RlZmluZSBNTUNfQ0xLUlRfNU1IWgkgIAkJKDB4MDAwMlVMKQorI2RlZmluZSBNTUNfQ0xLUlRfMl81TUhaCQkoMHgwMDAzVUwpCisjZGVmaW5lIE1NQ19DTEtSVF8xXzI1TUhaICAgICAgIAkoMHgwMDA0VUwpCisjZGVmaW5lIE1NQ19DTEtSVF8wXzYyNU1IWiAgICAgIAkoMHgwMDA1VUwpCisjZGVmaW5lIE1NQ19DTEtSVF8wXzMxMjVNSFogICAgIAkoMHgwMDA2VUwpCisKKy8qIE1NQ19TUEkgKi8KKyNkZWZpbmUgTU1DX1NQSV9ESVNBQkxFCSAJCSgweDAwVUwpCisjZGVmaW5lIE1NQ19TUElfRU4JICAJCSgweDAxVUwpCisjZGVmaW5lIE1NQ19TUElfQ1NfRU4JICAgCQkoMHgwMVVMIDw8IDIpCisjZGVmaW5lIE1NQ19TUElfQ1NfQUREUkVTUyAgICAgIAkoMHgwMVVMIDw8IDMpCisjZGVmaW5lIE1NQ19TUElfQ1JDX09OCSAgCQkoMHgwMVVMIDw8IDEpCisKKy8qIE1NQ19DTURBVCAqLworI2RlZmluZSBNTUNfQ01EQVRfTU1DX0RNQV9FTgkJKDB4MDAwMVVMIDw8IDcpCisjZGVmaW5lIE1NQ19DTURBVF9JTklUCSAgCQkoMHgwMDAxVUwgPDwgNikKKyNkZWZpbmUgTU1DX0NNREFUX0JVU1kJICAJCSgweDAwMDFVTCA8PCA1KQorI2RlZmluZSBNTUNfQ01EQVRfU1RSRUFNCQkoMHgwMDAxVUwgPDwgNCkKKyNkZWZpbmUgTU1DX0NNREFUX0JMT0NLCSAJCSgweDAwMDBVTCA8PCA0KQorI2RlZmluZSBNTUNfQ01EQVRfV1JJVEUJIAkJKDB4MDAwMVVMIDw8IDMpCisjZGVmaW5lIE1NQ19DTURBVF9SRUFECSAgCQkoMHgwMDAwVUwgPDwgMykKKyNkZWZpbmUgTU1DX0NNREFUX0RBVEFfRU4gICAgICAgCSgweDAwMDFVTCA8PCAyKQorI2RlZmluZSBNTUNfQ01EQVRfUjEJICAgIAkJKDB4MDAwMVVMKQorI2RlZmluZSBNTUNfQ01EQVRfUjIJICAgIAkJKDB4MDAwMlVMKQorI2RlZmluZSBNTUNfQ01EQVRfUjMJICAgIAkJKDB4MDAwM1VMKQorCisvKiBNTUNfUkVTVE8gKi8KKyNkZWZpbmUgTU1DX1JFU19UT19NQVgJICAJCSgweDAwN2ZVTCkgLyogWzY6MF0gKi8KKworLyogTU1DX1JEVE8gKi8KKyNkZWZpbmUgTU1DX1JFQURfVE9fTUFYCSAJCSgweDBmZmZmVUwpIC8qIFsxNTowXSAqLworCisvKiBNTUNfQkxLTEVOICovCisjZGVmaW5lIE1NQ19CTEtfTEVOX01BWAkgCQkoMHgwM2ZmVUwpIC8qIFs5OjBdICovCisKKy8qIE1NQ19QUlRCVUYgKi8KKyNkZWZpbmUgTU1DX1BSVEJVRl9CVUZfUEFSVF9GVUxMICAgICAgIAkoMHgwMVVMKQorI2RlZmluZSBNTUNfUFJUQlVGX0JVRl9GVUxMCQkoMHgwMFVMKQorCisvKiBNTUNfSV9NQVNLICovCisjZGVmaW5lIE1NQ19JX01BU0tfVFhGSUZPX1dSX1JFUQkoMHgwMVVMIDw8IDYpCisjZGVmaW5lIE1NQ19JX01BU0tfUlhGSUZPX1JEX1JFUQkoMHgwMVVMIDw8IDUpCisjZGVmaW5lIE1NQ19JX01BU0tfQ0xLX0lTX09GRgkgICAJKDB4MDFVTCA8PCA0KQorI2RlZmluZSBNTUNfSV9NQVNLX1NUT1BfQ01ECSAJKDB4MDFVTCA8PCAzKQorI2RlZmluZSBNTUNfSV9NQVNLX0VORF9DTURfUkVTCSAgCSgweDAxVUwgPDwgMikKKyNkZWZpbmUgTU1DX0lfTUFTS19QUkdfRE9ORQkgCSgweDAxVUwgPDwgMSkKKyNkZWZpbmUgTU1DX0lfTUFTS19EQVRBX1RSQU5fRE9ORSAgICAgICAoMHgwMVVMKQorI2RlZmluZSBNTUNfSV9NQVNLX0FMTAkgICAgICAJCSgweDA3ZlVMKQorCisKKy8qIE1NQ19JX1JFRyAqLworI2RlZmluZSBNTUNfSV9SRUdfVFhGSUZPX1dSX1JFUSAgICAgCSgweDAxVUwgPDwgNikKKyNkZWZpbmUgTU1DX0lfUkVHX1JYRklGT19SRF9SRVEgICAgIAkoMHgwMVVMIDw8IDUpCisjZGVmaW5lIE1NQ19JX1JFR19DTEtfSVNfT0ZGCQkoMHgwMVVMIDw8IDQpCisjZGVmaW5lIE1NQ19JX1JFR19TVE9QX0NNRCAgICAgIAkoMHgwMVVMIDw8IDMpCisjZGVmaW5lIE1NQ19JX1JFR19FTkRfQ01EX1JFUyAgICAgICAJKDB4MDFVTCA8PCAyKQorI2RlZmluZSBNTUNfSV9SRUdfUFJHX0RPTkUgICAgICAJKDB4MDFVTCA8PCAxKQorI2RlZmluZSBNTUNfSV9SRUdfREFUQV9UUkFOX0RPTkUgICAgCSgweDAxVUwpCisjZGVmaW5lIE1NQ19JX1JFR19BTEwJICAgCQkoMHgwMDdmVUwpCisKKy8qIE1NQ19DTUQgKi8KKyNkZWZpbmUgTU1DX0NNRF9JTkRFWF9NQVggICAgICAgCSgweDAwNmZVTCkgIC8qIFs1OjBdICovCisjZGVmaW5lIENNRCh4KSAgKHgpCisKKyNkZWZpbmUgTU1DX0RFRkFVTFRfUkNBCQkJMQorCisjZGVmaW5lIE1NQ19CTE9DS19TSVpFCQkJNTEyCisjZGVmaW5lIE1NQ19DTURfUkVTRVQJCQkwCisjZGVmaW5lIE1NQ19DTURfU0VORF9PUF9DT05ECQkxCisjZGVmaW5lIE1NQ19DTURfQUxMX1NFTkRfQ0lEIAkJMgorI2RlZmluZSBNTUNfQ01EX1NFVF9SQ0EJCQkzCisjZGVmaW5lIE1NQ19DTURfU0VORF9DU0QgCQk5CisjZGVmaW5lIE1NQ19DTURfU0VORF9DSUQgCQkxMAorI2RlZmluZSBNTUNfQ01EX1NFTkRfU1RBVFVTCQkxMworI2RlZmluZSBNTUNfQ01EX1NFVF9CTE9DS0xFTgkJMTYKKyNkZWZpbmUgTU1DX0NNRF9SRUFEX0JMT0NLCQkxNworI2RlZmluZSBNTUNfQ01EX1JEX0JMS19NVUxUSQkJMTgKKyNkZWZpbmUgTU1DX0NNRF9XUklURV9CTE9DSwkJMjQKKworI2RlZmluZSBNTUNfTUFYX0JMT0NLX1NJWkUJCTUxMgorCisjZGVmaW5lIE1NQ19SMV9JRExFX1NUQVRFCQkweDAxCisjZGVmaW5lIE1NQ19SMV9FUkFTRV9TVEFURQkJMHgwMgorI2RlZmluZSBNTUNfUjFfSUxMRUdBTF9DTUQJCTB4MDQKKyNkZWZpbmUgTU1DX1IxX0NPTV9DUkNfRVJSCQkweDA4CisjZGVmaW5lIE1NQ19SMV9FUkFTRV9TRVFfRVJSCQkweDAxCisjZGVmaW5lIE1NQ19SMV9BRERSX0VSUgkJCTB4MDIKKyNkZWZpbmUgTU1DX1IxX1BBUkFNX0VSUgkJMHgwNAorCisjZGVmaW5lIE1NQ19SMUJfV1BfRVJBU0VfU0tJUAkJMHgwMDAyCisjZGVmaW5lIE1NQ19SMUJfRVJSCQkJMHgwMDA0CisjZGVmaW5lIE1NQ19SMUJfQ0NfRVJSCQkJMHgwMDA4CisjZGVmaW5lIE1NQ19SMUJfQ0FSRF9FQ0NfRVJSCQkweDAwMTAKKyNkZWZpbmUgTU1DX1IxQl9XUF9WSU9MQVRJT04JCTB4MDAyMAorI2RlZmluZSBNTUNfUjFCX0VSQVNFX1BBUkFNCQkweDAwNDAKKyNkZWZpbmUgTU1DX1IxQl9PT1IJCQkweDAwODAKKyNkZWZpbmUgTU1DX1IxQl9JRExFX1NUQVRFCQkweDAxMDAKKyNkZWZpbmUgTU1DX1IxQl9FUkFTRV9SRVNFVAkJMHgwMjAwCisjZGVmaW5lIE1NQ19SMUJfSUxMRUdBTF9DTUQJCTB4MDQwMAorI2RlZmluZSBNTUNfUjFCX0NPTV9DUkNfRVJSCQkweDA4MDAKKyNkZWZpbmUgTU1DX1IxQl9FUkFTRV9TRVFfRVJSCQkweDEwMDAKKyNkZWZpbmUgTU1DX1IxQl9BRERSX0VSUgkJMHgyMDAwCisjZGVmaW5lIE1NQ19SMUJfUEFSQU1fRVJSCQkweDQwMDAKKwordHlwZWRlZiBzdHJ1Y3QgbW1jX2NpZCB7CisvKiBGSVhNRTogQllURV9PUkRFUiAqLworCXVuc2lnbmVkIGNoYXIgeWVhcjo0LAorCQltb250aDo0OworCXVuc2lnbmVkIGNoYXIgc25bM107CisJdW5zaWduZWQgY2hhciBmd3Jldjo0LAorCQlod3Jldjo0OworCXVuc2lnbmVkIGNoYXIgbmFtZVs2XTsKKwl1bnNpZ25lZCBjaGFyIGlkWzNdOworfSBtbWNfY2lkX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1tY19jc2QKK3sKKwl1bnNpZ25lZCBjaGFyCWVjYzoyLAorCQlmaWxlX2Zvcm1hdDoyLAorCQl0bXBfd3JpdGVfcHJvdGVjdDoxLAorCQlwZXJtX3dyaXRlX3Byb3RlY3Q6MSwKKwkJY29weToxLAorCQlmaWxlX2Zvcm1hdF9ncnA6MTsKKwl1bnNpZ25lZCBsb25nIGludCBjb250ZW50X3Byb3RfYXBwOjEsCisJCXJzdmQzOjQsCisJCXdyaXRlX2JsX3BhcnRpYWw6MSwKKwkJd3JpdGVfYmxfbGVuOjQsCisJCXIyd19mYWN0b3I6MywKKwkJZGVmYXVsdF9lY2M6MiwKKwkJd3BfZ3JwX2VuYWJsZToxLAorCQl3cF9ncnBfc2l6ZTo1LAorCQllcmFzZV9ncnBfbXVsdDo1LAorCQllcmFzZV9ncnBfc2l6ZTo1LAorCQljX3NpemVfbXVsdDE6MywKKwkJdmRkX3dfY3Vycl9tYXg6MywKKwkJdmRkX3dfY3Vycl9taW46MywKKwkJdmRkX3JfY3Vycl9tYXg6MywKKwkJdmRkX3JfY3Vycl9taW46MywKKwkJY19zaXplOjEyLAorCQlyc3ZkMjoyLAorCQlkc3JfaW1wOjEsCisJCXJlYWRfYmxrX21pc2FsaWduOjEsCisJCXdyaXRlX2Jsa19taXNhbGlnbjoxLAorCQlyZWFkX2JsX3BhcnRpYWw6MTsKKworCXVuc2lnbmVkIHNob3J0CXJlYWRfYmxfbGVuOjQsCisJCWNjYzoxMjsKKwl1bnNpZ25lZCBjaGFyCXRyYW5fc3BlZWQ7CisJdW5zaWduZWQgY2hhcgluc2FjOworCXVuc2lnbmVkIGNoYXIJdGFhYzsKKwl1bnNpZ25lZCBjaGFyCXJzdmQxOjIsCisgIAkJc3BlY192ZXJzOjQsCisJCWNzZF9zdHJ1Y3R1cmU6MjsKK30gbW1jX2NzZF90OworCisKKyNlbmRpZiAvKiBfX01NQ19QWEFfUF9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbXV4LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMDFjNzMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL211eC5oCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2LTIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX01VWF9IXworI2RlZmluZSBfTVVYX0hfCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKi8KKworI2RlZmluZSBJRU4JKDEgPDwgOCkKKworI2RlZmluZSBJRElTCSgwIDw8IDgpCisjZGVmaW5lIFBUVQkoMSA8PCA0KQorI2RlZmluZSBQVEQJKDAgPDwgNCkKKyNkZWZpbmUgRU4JKDEgPDwgMykKKyNkZWZpbmUgRElTCSgwIDw8IDMpCisKKyNkZWZpbmUgTTAJMAorI2RlZmluZSBNMQkxCisjZGVmaW5lIE0yCTIKKyNkZWZpbmUgTTMJMworI2RlZmluZSBNNAk0CisjZGVmaW5lIE01CTUKKyNkZWZpbmUgTTYJNgorI2RlZmluZSBNNwk3CisKKy8qCisgKiBUbyBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzIHRoZSBvZmZzZXQgaGFzIHRvIGFkZGVkCisgKiB3aXRoIE9NQVAzNFhYX0NUUkxfQkFTRSB0byBnZXQgdGhlIGFjdHVhbCBhZGRyZXNzCisgKi8KKworLypTRFJDKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDAJCTB4MDAzMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMQkJMHgwMDMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyCQkweDAwMzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDMJCTB4MDAzNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19ENAkJMHgwMDM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q1CQkweDAwM0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDYJCTB4MDAzQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19ENwkJMHgwMDNFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q4CQkweDAwNDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDkJCTB4MDA0MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTAJMHgwMDQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxMQkweDAwNDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDEyCTB4MDA0OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTMJMHgwMDRBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxNAkweDAwNEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE1CTB4MDA0RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTYJMHgwMDUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxNwkweDAwNTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE4CTB4MDA1NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTkJMHgwMDU2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyMAkweDAwNTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDIxCTB4MDA1QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjIJMHgwMDVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyMwkweDAwNUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI0CTB4MDA2MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjUJMHgwMDYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyNgkweDAwNjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI3CTB4MDA2NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjgJMHgwMDY4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyOQkweDAwNkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDMwCTB4MDA2QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMzEJMHgwMDZFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0NMSwkweDAwNzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTMAkweDAwNzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTMQkweDAwNzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTMgkweDAwNzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRFFTMwkweDAwNzgKKy8qR1BNQyovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0ExCQkweDAwN0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTIJCTB4MDA3QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BMwkJMHgwMDdFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E0CQkweDAwODAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTUJCTB4MDA4MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BNgkJMHgwMDg0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E3CQkweDAwODYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTgJCTB4MDA4OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BOQkJMHgwMDhBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0ExMAkweDAwOEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDAJCTB4MDA4RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMQkJMHgwMDkwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QyCQkweDAwOTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDMJCTB4MDA5NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19ENAkJMHgwMDk2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q1CQkweDAwOTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDYJCTB4MDA5QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19ENwkJMHgwMDlDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q4CQkweDAwOUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDkJCTB4MDBBMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTAJMHgwMEEyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxMQkweDAwQTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDEyCTB4MDBBNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTMJMHgwMEE4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxNAkweDAwQUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDE1CTB4MDBBQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1MwCTB4MDBBRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1MxCTB4MDBCMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1MyCTB4MDBCMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1MzCTB4MDBCNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M0CTB4MDBCNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M1CTB4MDBCOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M2CTB4MDBCQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQ1M3CTB4MDBCQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19DTEsJMHgwMEJFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05BRFZfQUxFCTB4MDBDMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OT0UJMHgwMEMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05XRQkweDAwQzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkJFMF9DTEUJMHgwMEM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05CRTEJMHgwMEM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05XUAkweDAwQ0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfV0FJVDAJMHgwMENDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX1dBSVQxCTB4MDBDRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMgkweDAwRDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfV0FJVDMJMHgwMEQyCisvKkRTUyovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfUENMSwkweDAwRDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19IU1lOQwkweDAwRDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19WU1lOQwkweDAwRDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19BQ0JJQVMJMHgwMERBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTAJMHgwMERDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTEJMHgwMERFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTIJMHgwMEUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTMJMHgwMEUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTQJMHgwMEU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTUJMHgwMEU2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTYJMHgwMEU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTcJMHgwMEVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTgJMHgwMEVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTkJMHgwMEVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTEwCTB4MDBGMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExMQkweDAwRjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTIJMHgwMEY0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTEzCTB4MDBGNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExNAkweDAwRjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTUJMHgwMEZBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE2CTB4MDBGQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExNwkweDAwRkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTgJMHgwMTAwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE5CTB4MDEwMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyMAkweDAxMDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjEJMHgwMTA2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTIyCTB4MDEwOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyMwkweDAxMEEKKy8qQ0FNRVJBKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9IUwkJMHgwMTBDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fVlMJCTB4MDEwRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1hDTEtBCTB4MDExMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1BDTEsJMHgwMTEyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRkxECQkweDAxMTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMAkJMHgwMTE2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDEJCTB4MDExOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QyCQkweDAxMUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMwkJMHgwMTFDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDQJCTB4MDExRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q1CQkweDAxMjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9ENgkJMHgwMTIyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDcJCTB4MDEyNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q4CQkweDAxMjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EOQkJMHgwMTI4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDEwCQkweDAxMkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMTEJCTB4MDEyQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1hDTEtCCTB4MDEyRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1dFTgkJMHgwMTMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fU1RST0JFCTB4MDEzMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ1NJMl9EWDAJMHgwMTM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DU0kyX0RZMAkweDAxMzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NTSTJfRFgxCTB4MDEzOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ1NJMl9EWTEJMHgwMTNBCisvKkF1ZGlvIEludGVyZmFjZSAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AyX0ZTWAkweDAxM0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMl9DTEtYCTB4MDEzRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AyX0RSCTB4MDE0MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AyX0RYCTB4MDE0MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9DTEsJMHgwMTQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0NNRAkweDAxNDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUMAkweDAxNDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUMQkweDAxNEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUMgkweDAxNEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUMwkweDAxNEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUNAkweDAxNTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUNQkweDAxNTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUNgkweDAxNTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfREFUNwkweDAxNTYKKy8qV2lyZWxlc3MgTEFOICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0NMSwkweDAxNTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfQ01ECTB4MDE1QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQwCTB4MDE1QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQxCTB4MDE1RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQyCTB4MDE2MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQzCTB4MDE2MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQ0CTB4MDE2NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQ1CTB4MDE2NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQ2CTB4MDE2OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9EQVQ3CTB4MDE2QQorLypCbHVldG9vdGgqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AzX0RYCTB4MDE2QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AzX0RSCTB4MDE2RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AzX0NMS1gJMHgwMTcwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDNfRlNYCTB4MDE3MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDJfQ1RTCTB4MDE3NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDJfUlRTCTB4MDE3NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDJfVFgJMHgwMTc4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMl9SWAkweDAxN0EKKy8qTW9kZW0gSW50ZXJmYWNlICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9UWAkweDAxN0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1JUUwkweDAxN0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX0NUUwkweDAxODAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1JYCTB4MDE4MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1A0X0NMS1gJMHgwMTg0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDRfRFIJMHgwMTg2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDRfRFgJMHgwMTg4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDRfRlNYCTB4MDE4QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0NMS1IJMHgwMThDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfRlNSCTB4MDE4RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0RYCTB4MDE5MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0RSCTB4MDE5MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1BfQ0xLUwkweDAxOTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9GU1gJMHgwMTk2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfQ0xLWAkweDAxOTgKKy8qU2VyaWFsIEludGVyZmFjZSovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUM19DVFNfUkNUWAkweDAxOUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQzX1JUU19TRAkweDAxOUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQzX1JYX0lSUlgJMHgwMTlFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUM19UWF9JUlRYCTB4MDFBMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0NMSwkweDAxQTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9TVFAJMHgwMUE0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfRElSCTB4MDFBNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX05YVAkweDAxQTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBMAkweDAxQUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBMQkweDAxQUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBMgkweDAxQUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBMwkweDAxQjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBNAkweDAxQjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBNQkweDAxQjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBNgkweDAxQjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9EQVRBNwkweDAxQjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzFfU0NMCTB4MDFCQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDMV9TREEJMHgwMUJDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMyX1NDTAkweDAxQkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzJfU0RBCTB4MDFDMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDM19TQ0wJMHgwMUMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMzX1NEQQkweDAxQzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzRfU0NMCTB4MEEwMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDNF9TREEJMHgwQTAyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IRFFfU0lPCQkweDAxQzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9DTEsJMHgwMUM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfU0lNTwkweDAxQ0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9TT01JCTB4MDFDQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMAkweDAxQ0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9DUzEJMHgwMUQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfQ1MyCTB4MDFEMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMwkweDAxRDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMl9DTEsJMHgwMUQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTJfU0lNTwkweDAxRDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMl9TT01JCTB4MDFEQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkyX0NTMAkweDAxREMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMl9DUzEJMHgwMURFCisvKkNvbnRyb2wgYW5kIGRlYnVnICovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfMzJLCQkweDBBMDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19DTEtSRVEJMHgwQTA2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfTklSUQkweDAxRTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UMAkweDBBMEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UMQkweDBBMEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UMgkweDBBMEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UMwkweDBBMTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UNAkweDBBMTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UNQkweDBBMTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19CT09UNgkweDBBMTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19PRkZfTU9ERQkweDBBMTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19DTEtPVVQxCTB4MEExQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX0NMS09VVDIJMHgwMUUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX25UUlNUCTB4MEExQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19UQ0sJMHgwQTFFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX1RNUwkweDBBMjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfVERJCTB4MEEyMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19FTVUwCTB4MEEyNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19FTVUxCTB4MEEyNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0NMSwkJMHgwQTI4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfQ1RMCQkweDBBMkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMAkJMHgwQTJDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEJCTB4MEEyRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QyCQkweDBBMzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMwkJMHgwQTMyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDQJCTB4MEEzNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q1CQkweDBBMzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENgkJMHgwQTM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDcJCTB4MEEzQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q4CQkweDBBM0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EOQkJMHgwQTNFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEwCQkweDBBNDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTEJCTB4MEE0MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMgkJMHgwQTQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEzCQkweDBBNDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTQJCTB4MEE0OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxNQkJMHgwQTRBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfQ0xLX0VTMgkweDA1RDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19DVExfRVMyCTB4MDVEQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QwX0VTMgkweDA1REMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMV9FUzIJMHgwNURFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDJfRVMyCTB4MDVFMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QzX0VTMgkweDA1RTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENF9FUzIJMHgwNUU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDVfRVMyCTB4MDVFNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q2X0VTMgkweDA1RTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EN19FUzIJMHgwNUVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDhfRVMyCTB4MDVFQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q5X0VTMgkweDA1RUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTBfRVMyCTB4MDVGMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMV9FUzIJMHgwNUYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEyX0VTMgkweDA1RjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTNfRVMyCTB4MDVGNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxNF9FUzIJMHgwNUY4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDE1X0VTMgkweDA1RkEKKy8qRGllIHRvIERpZSAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQwCTB4MDFFNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxCTB4MDFFNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyCTB4MDFFOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzCTB4MDFFQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ0CTB4MDFFQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ1CTB4MDFFRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ2CTB4MDFGMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ3CTB4MDFGMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ4CTB4MDFGNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQ5CTB4MDFGNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxMAkweDAxRjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTEJMHgwMUZBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDEyCTB4MDFGQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxMwkweDAxRkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTQJMHgwMjAwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE1CTB4MDIwMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxNgkweDAyMDQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTcJMHgwMjA2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE4CTB4MDIwOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxOQkweDAyMEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjAJMHgwMjBDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDIxCTB4MDIwRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyMgkweDAyMTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjMJMHgwMjEyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI0CTB4MDIxNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyNQkweDAyMTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjYJMHgwMjE4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI3CTB4MDIxQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyOAkweDAyMUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjkJMHgwMjFFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDMwCTB4MDIyMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzMQkweDAyMjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzIJMHgwMjI0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDMzCTB4MDIyNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzNAkweDAyMjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzUJMHgwMjJBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDM2CTB4MDIyQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0NMSzI2TUkJMHgwMjJFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTlJFU1BXUk9OCTB4MDIzMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX05SRVNXQVJNCTB4MDIzMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0FSTTlOSVJRCTB4MDIzNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1VNQTJQNkZJUQkweDAyMzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9TUElOVAkweDAyMzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9GUklOVAkweDAyM0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9ETUFSRVEwCTB4MDIzQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0RNQVJFUTEJMHgwMjNFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfRE1BUkVRMgkweDAyNDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9ETUFSRVEzCTB4MDI0MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1RSU1QJMHgwMjQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHVERJCTB4MDI0NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1RETwkweDAyNDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dUTVMJMHgwMjRBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHVENLCTB4MDI0QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1JUQ0sJMHgwMjRFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTVNUREJZCTB4MDI1MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1NXQUtFVVAJMHgwQTRDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfSURMRVJFUQkweDAyNTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9JRExFQUNLCTB4MDI1NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01XUklURQkweDAyNTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9TV1JJVEUJMHgwMjU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTVJFQUQJMHgwMjVBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfU1JFQUQJMHgwMjVDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUJVU0ZMQUcJMHgwMjVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfU0JVU0ZMQUcJMHgwMjYwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0NLRTAJMHgwMjYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0NLRTEJMHgwMjY0CisKKyNkZWZpbmUgTVVYX1ZBTChPRkZTRVQsVkFMVUUpXAorCXdyaXRldygoVkFMVUUpLCBPTUFQMzRYWF9DVFJMX0JBU0UgKyAoT0ZGU0VUKSk7CisKKyNkZWZpbmUJQ1AoeCkJKENPTlRST0xfUEFEQ09ORl8jI3gpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzkyY2MKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDNfU1lTX0hfCisjZGVmaW5lIF9PTUFQM19TWVNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qCisgKiBPTUFQMyBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyogU3R1ZmYgb24gTDMgSW50ZXJjb25uZWN0ICovCisjZGVmaW5lIFNNWF9BUEVfQkFTRQkJCTB4NjgwMDAwMDAKKworLyogTDMgRmlyZXdhbGwgKi8KKyNkZWZpbmUgQV9SRVFJTkZPUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDQ4KQorI2RlZmluZSBBX1JFQURQRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNTApCisjZGVmaW5lIEFfV1JJVEVQRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNTgpCisKKy8qIEdQTUMgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19CQVNFCQkoMHg2RTAwMDAwMCkKKworLyogU01TICovCisjZGVmaW5lIE9NQVAzNFhYX1NNU19CQVNFCQkweDZDMDAwMDAwCisKKy8qIFNEUkMgKi8KKyNkZWZpbmUgT01BUDM0WFhfU0RSQ19CQVNFCQkweDZEMDAwMDAwCisKKy8qCisgKiBMNCBQZXJpcGhlcmFscyAtIEw0IFdha2V1cCBhbmQgTDQgQ29yZSBub3cKKyAqLworI2RlZmluZSBPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UJMHg0ODAwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX1dBS0VVUF9MNF9JT19CQVNFCTB4NDgzMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9MNF9QRVIJCQkweDQ5MDAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfTDRfSU9fQkFTRQkJT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFCisKKy8qIENPTlRST0wgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ1RSTF9CQVNFCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDIwMDApCisKKy8qIFRBUCBpbmZvcm1hdGlvbiAgZG9udCBrbm93IGZvciAzNDMwKi8KKyNkZWZpbmUgT01BUDM0WFhfVEFQX0JBU0UJCSgweDQ5MDAwMDAwKSAvKmdpdmluZyBzb21lIGp1bmsgZm9yIHZpcnRpbyAqLworCisvKiBVQVJUICovCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQxCQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHg2YTAwMCkKKyNkZWZpbmUgT01BUDM0WFhfVUFSVDIJCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDZjMDAwKQorI2RlZmluZSBPTUFQMzRYWF9VQVJUMwkJCShPTUFQMzRYWF9MNF9QRVIrMHgyMDAwMCkKKworLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVycyAqLworI2RlZmluZSBPTUFQMzRYWF9HUFQxCQkJMHg0ODMxODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQyCQkJMHg0OTAzMjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQzCQkJMHg0OTAzNDAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ0CQkJMHg0OTAzNjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ1CQkJMHg0OTAzODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ2CQkJMHg0OTAzQTAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ3CQkJMHg0OTAzQzAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ4CQkJMHg0OTAzRTAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQ5CQkJMHg0OTA0MDAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMAkJCTB4NDgwODYwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTEJCQkweDQ4MDg4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEyCQkJMHg0ODMwNDAwMAorCisvKiBXYXRjaERvZyBUaW1lcnMgKDEgc2VjdXJlLCAzIEdQKSAqLworI2RlZmluZSBXRDFfQkFTRQkJCSgweDQ4MzBDMDAwKQorI2RlZmluZSBXRDJfQkFTRQkJCSgweDQ4MzE0MDAwKQorI2RlZmluZSBXRDNfQkFTRQkJCSgweDQ5MDMwMDAwKQorCisvKiAzMktUSU1FUiAqLworI2RlZmluZSBTWU5DXzMyS1RJTUVSX0JBU0UJCSgweDQ4MzIwMDAwKQorI2RlZmluZSBTMzJLX0NSCQkJCShTWU5DXzMyS1RJTUVSX0JBU0UrMHgxMCkKKworLyoKKyAqIFNEUDM0MzAgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qCisgKiAgVGhlIDM0M3gncyBjaGlwIHNlbGVjdHMgYXJlIHByb2dyYW1tYWJsZS4gIFRoZSBtYXNrIFJPTQorICogIGRvZXMgY29uZmlndXJlIENTMCB0byAweDA4MDAwMDAwIGJlZm9yZSBkaXNwYXRjaC4gIFNvLCBpZgorICogIHlvdSB3YW50IHlvdXIgY29kZSB0byBsaXZlIGJlbG93IHRoYXQgYWRkcmVzcywgeW91IGhhdmUgdG8KKyAqICBiZSBwcmVwYXJlZCB0byBqdW1wIHRob3VnaCBob29wcywgdG8gcmVzZXQgdGhlIGJhc2UgYWRkcmVzcy4KKyAqICBTYW1lIGFzIGluIFNEUDM0MzAKKyAqLworLyogYmFzZSBhZGRyZXNzIGZvciBpbmRpcmVjdCB2ZWN0b3JzIChpbnRlcm5hbCBib290IG1vZGUpICovCisjZGVmaW5lIFNSQU1fT0ZGU0VUMAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQxCQkJMHgwMDIwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDIJCQkweDAwMDBGODAwCisjZGVmaW5lIFNSQU1fVkVDVF9DT0RFCQkJKFNSQU1fT0ZGU0VUMHxTUkFNX09GRlNFVDF8U1JBTV9PRkZTRVQyKQorCisjZGVmaW5lIExPV19MRVZFTF9TUkFNX1NUQUNLCQkweDQwMjBGRkZDCisKKy8qCisgKiBUT0RPOiBBcmUgdGhleSByZXF1aXJlZCBmb3IgQU0zNTE3PworICovCisjaWYgZGVmaW5lZChDT05GSUdfMzQzMFNEUCkgfHwgZGVmaW5lZChDT05GSUdfT01BUDNFVk0pCisvKiBGUEdBIG9uIERlYnVnIGJvYXJkLiovCisjZGVmaW5lIEVUSF9DT05UUk9MX1JFRwkJCShERUJVR19CQVNFKzB4MzBiKQorI2RlZmluZSBMQU5fUkVTRVRfUkVHSVNURVIJCShERUJVR19CQVNFKzB4MWMpCisKKyNkZWZpbmUgRElQX1NXSVRDSF9JTlBVVF9SRUcyCQkoREVCVUdfQkFTRSsweDYwKQorI2RlZmluZSBMRURfUkVHSVNURVIJCQkoREVCVUdfQkFTRSsweDQwKQorI2RlZmluZSBGUEdBX1JFVl9SRUdJU1RFUgkJKERFQlVHX0JBU0UrMHgxMCkKKyNkZWZpbmUgRUVQUk9NX01BSU5fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDE4MDApCisjZGVmaW5lIEVFUFJPTV9DT05OX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxOTAwKQorI2RlZmluZSBFRVBST01fVUlfQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDFBMDApCisjZGVmaW5lIEVFUFJPTV9NQ0FNX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxQjAwKQorI2RlZmluZSBFTkhBTkNFRF9VSV9FRV9OQU1FCQkiNzUwLTIwNzUiCisjZW5kaWYKKworI2VuZGlmICAvKiBfT01BUDM0MzBfU1lTX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzNDMwLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzNDMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZGU2MwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDM0MzAuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPHgwa2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMzQzMF9TWVNfSF8KKyNkZWZpbmUgX09NQVAzNDMwX1NZU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyoKKyAqIDM0MzAgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qIFN0dWZmIG9uIEwzIEludGVyY29ubmVjdCAqLworI2RlZmluZSBTTVhfQVBFX0JBU0UJCQkweDY4MDAwMDAwCisKKy8qIEwzIEZpcmV3YWxsICovCisjZGVmaW5lIEFfUkVRSU5GT1BFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA0OCkKKyNkZWZpbmUgQV9SRUFEUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDUwKQorI2RlZmluZSBBX1dSSVRFUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDU4KQorCisvKiBHUE1DICovCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQkFTRQkJKDB4NkUwMDAwMDApCisKKy8qIFNNUyAqLworI2RlZmluZSBPTUFQMzRYWF9TTVNfQkFTRQkJMHg2QzAwMDAwMAorCisvKiBTRFJDICovCisjZGVmaW5lIE9NQVAzNFhYX1NEUkNfQkFTRQkJMHg2RDAwMDAwMAorCisvKgorICogTDQgUGVyaXBoZXJhbHMgLSBMNCBXYWtldXAgYW5kIEw0IENvcmUgbm93CisgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFCTB4NDgwMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9XQUtFVVBfTDRfSU9fQkFTRQkweDQ4MzAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfTDRfUEVSCQkJMHg0OTAwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX0w0X0lPX0JBU0UJCU9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRQorCisvKiBDT05UUk9MICovCisjZGVmaW5lIE9NQVAzNFhYX0NUUkxfQkFTRQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHgyMDAwKQorCisvKiBUQVAgaW5mb3JtYXRpb24gIGRvbnQga25vdyBmb3IgMzQzMCovCisjZGVmaW5lIE9NQVAzNFhYX1RBUF9CQVNFCQkoMHg0OTAwMDAwMCkgLypnaXZpbmcgc29tZSBqdW5rIGZvciB2aXJ0aW8gKi8KKworLyogVUFSVCAqLworI2RlZmluZSBPTUFQMzRYWF9VQVJUMQkJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4NmEwMDApCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQyCQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHg2YzAwMCkKKyNkZWZpbmUgT01BUDM0WFhfVUFSVDMJCQkoT01BUDM0WFhfTDRfUEVSKzB4MjAwMDApCisKKy8qIEdlbmVyYWwgUHVycG9zZSBUaW1lcnMgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BUMQkJCTB4NDgzMTgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMgkJCTB4NDkwMzIwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMwkJCTB4NDkwMzQwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNAkJCTB4NDkwMzYwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNQkJCTB4NDkwMzgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNgkJCTB4NDkwM0EwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNwkJCTB4NDkwM0MwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUOAkJCTB4NDkwM0UwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUOQkJCTB4NDkwNDAwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTAJCQkweDQ4MDg2MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDExCQkJMHg0ODA4ODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMgkJCTB4NDgzMDQwMDAKKworLyogV2F0Y2hEb2cgVGltZXJzICgxIHNlY3VyZSwgMyBHUCkgKi8KKyNkZWZpbmUgV0QxX0JBU0UJCQkoMHg0ODMwQzAwMCkKKyNkZWZpbmUgV0QyX0JBU0UJCQkoMHg0ODMxNDAwMCkKKyNkZWZpbmUgV0QzX0JBU0UJCQkoMHg0OTAzMDAwMCkKKworLyogMzJLVElNRVIgKi8KKyNkZWZpbmUgU1lOQ18zMktUSU1FUl9CQVNFCQkoMHg0ODMyMDAwMCkKKyNkZWZpbmUgUzMyS19DUgkJCQkoU1lOQ18zMktUSU1FUl9CQVNFKzB4MTApCisKKy8qCisgKiBTRFAzNDMwIHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKgorICogIFRoZSAzNDN4J3MgY2hpcCBzZWxlY3RzIGFyZSBwcm9ncmFtbWFibGUuICBUaGUgbWFzayBST00KKyAqICBkb2VzIGNvbmZpZ3VyZSBDUzAgdG8gMHgwODAwMDAwMCBiZWZvcmUgZGlzcGF0Y2guICBTbywgaWYKKyAqICB5b3Ugd2FudCB5b3VyIGNvZGUgdG8gbGl2ZSBiZWxvdyB0aGF0IGFkZHJlc3MsIHlvdSBoYXZlIHRvCisgKiAgYmUgcHJlcGFyZWQgdG8ganVtcCB0aG91Z2ggaG9vcHMsIHRvIHJlc2V0IHRoZSBiYXNlIGFkZHJlc3MuCisgKiAgU2FtZSBhcyBpbiBTRFAzNDMwCisgKi8KKyNpZmRlZiBDT05GSUdfT01BUDM0WFgKKy8qIGJhc2UgYWRkcmVzcyBmb3IgaW5kaXJlY3QgdmVjdG9ycyAoaW50ZXJuYWwgYm9vdCBtb2RlKSAqLworI2RlZmluZSBTUkFNX09GRlNFVDAJCQkweDQwMDAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQyCQkJMHgwMDAwRjgwMAorI2RlZmluZSBTUkFNX1ZFQ1RfQ09ERQkJCShTUkFNX09GRlNFVDB8U1JBTV9PRkZTRVQxfFNSQU1fT0ZGU0VUMikKKworI2RlZmluZSBMT1dfTEVWRUxfU1JBTV9TVEFDSwkJMHg0MDIwRkZGQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR18zNDMwU0RQKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQM0VWTSkKKy8qIEZQR0Egb24gRGVidWcgYm9hcmQuKi8KKyNkZWZpbmUgRVRIX0NPTlRST0xfUkVHCQkJKERFQlVHX0JBU0UrMHgzMGIpCisjZGVmaW5lIExBTl9SRVNFVF9SRUdJU1RFUgkJKERFQlVHX0JBU0UrMHgxYykKKworI2RlZmluZSBESVBfU1dJVENIX0lOUFVUX1JFRzIJCShERUJVR19CQVNFKzB4NjApCisjZGVmaW5lIExFRF9SRUdJU1RFUgkJCShERUJVR19CQVNFKzB4NDApCisjZGVmaW5lIEZQR0FfUkVWX1JFR0lTVEVSCQkoREVCVUdfQkFTRSsweDEwKQorI2RlZmluZSBFRVBST01fTUFJTl9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MTgwMCkKKyNkZWZpbmUgRUVQUk9NX0NPTk5fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDE5MDApCisjZGVmaW5lIEVFUFJPTV9VSV9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MUEwMCkKKyNkZWZpbmUgRUVQUk9NX01DQU1fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDFCMDApCisjZGVmaW5lIEVOSEFOQ0VEX1VJX0VFX05BTUUJCSI3NTAtMjA3NSIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkgfHwgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKy8qIEVNSUYgNCByZXBsYWNlcyBTRFJDIGluIEFNMzUxNyBmb3IgRERSICovCisjZGVmaW5lIEVNSUY0X01PRF9JRAkJCTB4MDAKKyNkZWZpbmUgRU1JRjRfU1RBVFVTCQkJMHgwNAorI2RlZmluZSBFTUlGNF9TRFJfQ09ORklHCQkweDA4CisjZGVmaW5lIEVNSUY0X0xQRERSMl9DT05GSUYJCTB4MEMKKyNkZWZpbmUgRU1JRjRfU0RSX1JFRl9DVFJMCQkweDEwCisjZGVmaW5lIEVNSUY0X1NEUl9SRUZfQ1RSTF9TSERXCQkweDE0CisjZGVmaW5lIEVNSUY0X1NEUl9USU0xCQkJMHgxOAorI2RlZmluZSBFTUlGNF9TRFJfVElNMV9TSERXCQkweDFDCisjZGVmaW5lIEVNSUY0X1NEUl9USU0yICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBFTUlGNF9TRFJfVElNMl9TSERXICAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTMgICAgICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIEVNSUY0X1NEUl9USU0zX1NIRFcgICAgICAgICAgICAgMHgyQworI2RlZmluZSBFTUlGNF9MUEREUjJfTlZNX1RJTQkJMHgzMAorI2RlZmluZSBFTUlGNF9MUEREUjJfTlZNX1RJTV9TSERXCTB4MzQKKyNkZWZpbmUgRU1JRjRfUFdSX01HTVRfQ1RSTAkJMHgzOAorI2RlZmluZSBFTUlGNF9QV1JfTUdNVF9DVFJMX1NIRFcJMHgzQworI2RlZmluZSBFTUlGNF9MUEREUjJfUkVHX0RBVEEJCTB4NDAKKyNkZWZpbmUgRU1JRjRfTFBERFIyX1JFR19DRkcJCTB4NTAKKyNkZWZpbmUgRU1JRjRfT0NQX0NPTkZJRwkJMHg1NAorI2RlZmluZSBFTUlGNF9PQ1BfQ0ZHX1ZBTDEJCTB4NTgKKyNkZWZpbmUgRU1JRjRfT0NQX0NGR19WQUwyCQkweDVDCisjZGVmaW5lIEVNSUY0X1BFUkZfQ05UMQkJCTB4ODAKKyNkZWZpbmUgRU1JRjRfUEVSRl9DTlQyCQkJMHg4NAorI2RlZmluZSBFTUlGNF9QRVJGX0NOVF9DRkcJCTB4ODgKKyNkZWZpbmUgRU1JRjRfUEVSRl9DTlRfU0VMCQkweDhDCisjZGVmaW5lIEVNSUY0X1BFUkZfQ05UX1RJTQkJMHg5MAorI2RlZmluZSBFTUlGNF9JUlFfRU9JCQkJMHhBMAorI2RlZmluZSBFTUlGNF9JUlFTVFNfUkFXCQkweEE0CisjZGVmaW5lIEVNSUY0X0lSUVNUUwkJCTB4QUMKKyNkZWZpbmUgRU1JRjRfSVJRRU5fU0VUCQkJMHhCNAorI2RlZmluZSBFTUlGNF9JUlFFTl9DTFIJCQkweEJDCisjZGVmaW5lIEVNSUY0X0REUl9QSFlfQ1RSTDEJCTB4RTQKKyNkZWZpbmUgRU1JRjRfRERSX1BIWV9DVFJMMV9TSERXCTB4RTgKKyNkZWZpbmUgRU1JRjRfRERSX1BIWV9DVFJMMgkJMHhFQworI2VuZGlmCisKKyNlbmRpZiAgLyogX09NQVAzNDMwX1NZU19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9wcmNtLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3ByY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBmZGFlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9wcmNtLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIGZpZWxkIGNvbnN0YW50cyBhbmQKKyAqICAgICAgbWFjcm9zIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT3BlbiBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uCisgKiAgICAgIFBsYXRmb3JtIChPTUFQKSAzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlbWVudCAoUFJDTSkKKyAqICAgICAgbW9kdWxlLgorICovCisKKyNpZm5kZWYgX09NQVAzX1BSQ01fSAorI2RlZmluZSBfT01BUDNfUFJDTV9ICisKKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisKKyNkZWZpbmUgUFJDTV9CQVNFCQkJCQkJMHg0ODAwMDAwMAorCisjZGVmaW5lIFBSQ01fQ01fQkFTRQkJCQkJCShQUkNNX0JBU0UgKyAweDAwMDA0MDAwKQorCisjZGVmaW5lIFBSQ01fUFJNX0JBU0UJCQkJCQkoUFJDTV9CQVNFICsgMHgwMDMwNjAwMCkKKworI2RlZmluZSBQUkNNX1BSTV9DQ1JfQkFTRQkJCQkJKFBSQ01fUFJNX0JBU0UgKyAweDAwMDAwRDAwKQorCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUwJCQkJCQkoUFJDTV9QUk1fQ0NSX0JBU0UgKyAweDAwMDAwMDQwKQorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQJCTAKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMJCTMKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX01BU0sJCUFSTV9SRUdfVkFMKDAsIEFSTV9SRUdfTUFTSyhQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUykpCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9NQVNLLCB2KQorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfTUFTSywgdikKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaCQkweDAKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaCQkweDEKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaCQkweDIKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaCQkweDMKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaCQkweDQKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaCQkweDUKKworI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLT1VUX0NUUkwJCQkJKFBSQ01fUFJNX0NDUl9CQVNFICsgMHgwMDAwMDA3MCkKKworI2RlZmluZSBQUkNNX1BSTV9HUl9CQVNFCQkJCQkoUFJDTV9QUk1fQkFTRSArIDB4MDAwMDEyMDApCisKKyNkZWZpbmUJUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwJCQkJCShQUkNNX1BSTV9HUl9CQVNFICsgMHgwMDAwMDA3MCkKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJUCQk2CisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTCQkyCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9NQVNLCQlBUk1fUkVHX1ZBTCgwLCBBUk1fUkVHX01BU0soUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMpKQorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfTUFTSywgdikKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX01BU0ssIHYpCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xCQkJMQorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMgkJCTIKKworI2RlZmluZSBQUkNNX1NSX0JBU0UJCQkJCShQUkNNX0JBU0UgKyAweDAwMEM5MDAwKQorCisjZGVmaW5lIFBSTV9DTEtTRUwgICAgICAgICAgIFBSQ01fUFJNX0NDUl9DTEtTRUwKKyNkZWZpbmUgUFJNX1JTVENUUkwgICAgICAgICAgMHg0ODMwNzI1MAorI2RlZmluZSBQUk1fQ0xLU1JDX0NUUkwgICAgICBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTAorCisjZW5kaWYgLyogX09NQVAzX1BSQ01fSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9yZXYuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcmV2LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzBlOTVkNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcmV2LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogCisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAzNFhYX1JFVl9IXworI2RlZmluZSBfT01BUDM0WFhfUkVWX0hfCisKKyNkZWZpbmUgQ0RCX0REUl9DT01CTyAgICAgICAgICAgICAgICAgICAvKiBjb21ibyBwYXJ0IG9uIGNwdSBkYXVnaHRlciBjYXJkICovCisjZGVmaW5lIENEQl9ERFJfSVBEQiAgICAgICAgICAgICAgICAgICAgLyogMngxNiBwYXJ0cyBvbiBkYXVnaHRlciBjYXJkICovCisKKyNkZWZpbmUgRERSXzEwMAkJMTAwICAgICAgICAgICAgIC8qIHR5cGUgZm91bmQgb24gbW9zdCBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzExMQkJMTExICAgICAgICAgICAgIC8qIHNvbWUgY29tYm8gcGFydHMgKi8KKyNkZWZpbmUgRERSXzEzMwkJMTMzICAgICAgICAgICAgIC8qIG1vc3QgY29tYm8sIHNvbWUgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xNjUJCTE2NSAgICAgICAgICAgICAvKiBmdXR1cmUgcGFydHMgKi8KKworI2RlZmluZSBDUFVfMzQzMAkweDM0MzAKKworI2RlZmluZSBDUFVfMzQzMF9FUzEJMQorI2RlZmluZSBDUFVfMzQzMF9FUzIJMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2RyYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zZHJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MjAxYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2RyYy5oCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyByZWdpc3RlciBhbmQgcmVnaXN0ZXIgZmllbGQgY29uc3RhbnRzIGFuZAorICogICAgICBtYWNyb3MgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPcGVuIE11bHRpbWVkaWEgQXBwbGljYXRpb24KKyAqICAgICAgUGxhdGZvcm0gKE9NQVApIDMgU0RSQU0gQ29udHJvbGxlciAoU0RSQykuCisgKi8KKworI2lmbmRlZiBfT01BUDNfU0RSQ19ICisjZGVmaW5lIF9PTUFQM19TRFJDX0gKKworI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgUmV2aXNpb24KKyAqLworI2RlZmluZSBTRFJDX1JFVklTSU9OX1JFVl9NQVNLCQkJCUFSTV9SRUdfVkFMKDAsIDB4RkYpCisjZGVmaW5lIFNEUkNfUkVWSVNJT05fUkVWX01BSk9SX01BU0sJCUFSTV9SRUdfVkFMKDQsIDB4RikKKyNkZWZpbmUgU0RSQ19SRVZJU0lPTl9SRVZfTUlOT1JfTUFTSwkJQVJNX1JFR19WQUwoMCwgMHhGKQorI2RlZmluZSBTRFJDX1JFVklTSU9OX1JFVl9NQUpPUl9ERUNPREUoeCkJQVJNX1JFR19WQUxfREVDT0RFKDQsIFNEUkNfUkVWSVNJT05fUkVWX01BSk9SX01BU0ssIHgpCisjZGVmaW5lIFNEUkNfUkVWSVNJT05fUkVWX01JTk9SX0RFQ09ERSh4KQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19SRVZJU0lPTl9SRVZfTUlOT1JfTUFTSyksIHgpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIFN5c3RlbSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgU0RSQ19TWVNDT05GSUdfTk9NRU1PUllNUlNfRElTQUJMRQlBUk1fUkVHX1ZBTCg4LCAwKQorI2RlZmluZSBTRFJDX1NZU0NPTkZJR19OT01FTU9SWU1SU19FTkFCTEUJQVJNX1JFR19WQUwoOCwgMSkKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQJCUFSTV9SRUdfVkFMKDMsIDB4MikKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSCQlBUk1fUkVHX1ZBTCgxLCAweDApCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9TRVQJCUFSTV9SRUdfVkFMKDEsIDB4MSkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgU3lzdGVtIFN0YXR1cworICovCisjZGVmaW5lIFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORQkJCUFSTV9SRUdfVkFMKDAsIDEpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIENoaXAgU2VsZWN0IENvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBNdWx0aXBsZXhpbmcKKyAqLworI2RlZmluZSBTRFJDX1NIQVJJTkdfTE9DS19PRkYJCQkJQVJNX1JFR19WQUwoMzAsIDApCisjZGVmaW5lIFNEUkNfU0hBUklOR19MT0NLX09OCQkJCUFSTV9SRUdfVkFMKDMwLCAxKQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX01BU0sJCQlBUk1fUkVHX1ZBTCgxMiwgMHg3KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoMTIsIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDEyLCBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMzJfQklUXzMxXzAJCTB4MAorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8zMV8xNgkJMHgyCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzAJCTB4MworI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX01BU0sJCQlBUk1fUkVHX1ZBTCg5LCAweDcpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSg5LCBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSg5LCBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX01BU0spLCB2KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzMyX0JJVF8zMV8wCQkweDAKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMzFfMTYJCTB4MgorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8xNl8wCQkweDMKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PTgkJQVJNX1JFR19WQUwoOCwgMCkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYJCUFSTV9SRUdfVkFMKDgsIDEpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEVycm9yIEFkZHJlc3MKKyAqLworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBFcnJvciBUeXBlCisgKi8KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRERSIEEgRmluZSBUdW5pbmcgQ29udHJvbAorICovCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX01BU0sJCUFSTV9SRUdfVkFMKDI0LCAweEZGKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDI0LCBTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDI0LCBTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9NQVNLLCB2KQorCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX01BU0sJCUFSTV9SRUdfVkFMKDE2LCAweEZGKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDE2LCBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9NQVNLLCB2IC8gMikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfREVDT0RFKHYpCShBUk1fUkVHX1ZBTF9ERUNPREUoMTYsIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX01BU0ssIHYpICogMikKKworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfTUFTSwlBUk1fUkVHX1ZBTCg1LCAweDMpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDUsIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSg1LCBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRAkJCTB4MAorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfSURMRQkJMHgxCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9JR05PUkUJCTB4MgorCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0lETEVfRElTQUJMRQkJCUFSTV9SRUdfVkFMKDQsIDApCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0lETEVfRU5BQkxFCQkJQVJNX1JFR19WQUwoNCwgMSkKKworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9ETExfRElTQUJMRQkJCUFSTV9SRUdfVkFMKDMsIDApCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQlBUk1fUkVHX1ZBTCgzLCAxKQorCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWQlBUk1fUkVHX1ZBTCgyLCAwKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9MT0NLX0ZJWEVEREVMQVkJCUFSTV9SRUdfVkFMKDIsIDEpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEREUiBBIEZpbmUgVHVuaW5nIFN0YXR1cworICovCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIFBvd2VyIE1hbmFnZW1lbnQgUG9saWN5CisgKi8KKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19XQUtFVVBfREVMQVlFRAkJQVJNX1JFR19WQUwoMjYsIDApCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9JTU1FRAkJCUFSTV9SRUdfVkFMKDI2LCAxKQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9NQVNLCQlBUk1fUkVHX1ZBTCg4LCAweEZGRkYpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDgsIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSg4LCBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRElTQUJMRQlBUk1fUkVHX1ZBTCg3LCAwKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJQVJNX1JFR19WQUwoNywgMSkKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQlBUk1fUkVHX1ZBTCg2LCAwKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRU5BQkxFCUFSTV9SRUdfVkFMKDYsIDEpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9NQVNLCQkJQVJNX1JFR19WQUwoNCwgMHgzKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoNCwgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoNCwgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FCQkJCTB4MAorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX1NFTEZfR0FURQkJMHgxCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfU0VMRl9SRUZSRVNICQkweDIKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19FWFRDTEtESVNfT04JCQlBUk1fUkVHX1ZBTCgzLCAxKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19FWFRDTEtESVNfT04JCQlBUk1fUkVHX1ZBTCgzLCAxKQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1BXRF9ESVNBQkxFCQkJQVJNX1JFR19WQUwoMiwgMCkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfUFdEX0VOQUJMRQkJCUFSTV9SRUdfVkFMKDIsIDEpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCCQlBUk1fUkVHX1ZBTCgwLCAxKQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCUFSTV9SRUdfVkFMKDMwLCAwKQorI2RlZmluZSBTRFJDX01DRkdfTE9DS1NUQVRVU19STwkJCQlBUk1fUkVHX1ZBTCgzMCwgMSkKKworI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfTUFTSwkJCQlBUk1fUkVHX1ZBTCgyNCwgMHg3KQorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMjQsIFNEUkNfTUNGR19SQVNXSURUSF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMjQsIFNEUkNfTUNGR19SQVNXSURUSF9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzExX0JJVFMJCQkJMHgwCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xMl9CSVRTCQkJCTB4MQorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTNfQklUUwkJCQkweDIKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMJCQkJMHgzCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xNV9CSVRTCQkJCTB4NAorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTZfQklUUwkJCQkweDUKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzE3X0JJVFMJCQkJMHg2CisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xOF9CSVRTCQkJCTB4NworCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF9NQVNLCQkJCUFSTV9SRUdfVkFMKDIwLCAweDcpCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgyMCwgU0RSQ19NQ0ZHX0NBU1dJRFRIX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgyMCwgU0RSQ19NQ0ZHX0NBU1dJRFRIX01BU0spLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfNV9CSVRTCQkJCTB4MAorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfNl9CSVRTCQkJCTB4MQorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfN19CSVRTCQkJCTB4MgorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfOF9CSVRTCQkJCTB4MworI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfOV9CSVRTCQkJCTB4NAorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUwkJCQkweDUKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzExX0JJVFMJCQkJMHg2CisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF8xMl9CSVRTCQkJCTB4NworCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX01BU0sJCQkJQVJNX1JFR19WQUwoMjAsIDB4MUYpCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX0VOQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgyMCwgU0RSQ19NQ0ZHX0FERFJNVVhfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfREVDT0RFKHYpCQkJQVJNX1JFR19WQUxfREVDT0RFKDIwLCBTRFJDX01DRkdfQUREUk1VWF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMSAgIAkJCTB4MAorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMiAgCQkJMHgxCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8zICAJCQkweDIKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzQgIAkJCTB4MworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfNSAgCQkJMHg0CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV82CQkJCTB4NQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfNwkJCQkweDYKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzgJCQkJMHg3CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV85ICAgCQkJMHg4CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xMCAgCQkJMHg5CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xMSAgCQkJMHhBCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xMiAJCQkweEIKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzEzICAJCQkweEMKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzE0CQkJCTB4RAorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTUJCQkJMHhFCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xNgkJCQkweEYKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzIzICAJCQkweDE2CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yNCAgCQkJMHgxNworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjUgCQkJMHgxOAorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjYgIAkJCTB4MTkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI3CQkJCTB4MUEKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI4CQkJCTB4MUIKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI5CQkJCTB4MUMKKworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GSVhFRAkJQVJNX1JFR19WQUwoMTksIDApCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCUFSTV9SRUdfVkFMKDE5LCAxKQorCisjZGVmaW5lIFNEUkNfTUNGR19SQU1TSVpFX01BU0sJCQkJQVJNX1JFR19WQUwoOCwgMHgzRkYpCisjZGVmaW5lIFNEUkNfTUNGR19SQU1TSVpFX0VOQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0VOQ09ERSg4LCBTRFJDX01DRkdfUkFNU0laRV9NQVNLLCAoKHYpIC8gMikpCisjZGVmaW5lIFNEUkNfTUNGR19SQU1TSVpFX0RFQ09ERSh2KQkJCShBUk1fUkVHX1ZBTF9ERUNPREUoOCwgU0RSQ19NQ0ZHX1JBTVNJWkVfTUFTSywgdikgKiAyKQorCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9NQVNLCQlBUk1fUkVHX1ZBTCg2LCAweDMpCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDYsIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSg2LCBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9CX1JfQwkJCTB4MAorI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fQjFfUl9CMF9DCQkweDEKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX1JfQl9DCQkJMHgyCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQlBUk1fUkVHX1ZBTCg0LCAwKQorI2RlZmluZSBTRFJDX01DRkdfQjMyTk9UMTZfT04JCQkJQVJNX1JFR19WQUwoNCwgMSkKKworI2RlZmluZSBTRFJDX01DRkdfREVFUFBEX1VOU1VQUE9SVEVECQlBUk1fUkVHX1ZBTCgzLCAwKQorI2RlZmluZQlTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCUFSTV9SRUdfVkFMKDMsIDEpCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0REUlRZUEVfTUFTSwkJCQlBUk1fUkVHX1ZBTCgyLCAweDEpCisjZGVmaW5lIFNEUkNfTUNGR19ERFJUWVBFX0VOQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgyLCBTRFJDX01DRkdfRERSVFlQRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfRERSVFlQRV9ERUNPREUodikJCQlBUk1fUkVHX1ZBTF9ERUNPREUoMiwgU0RSQ19NQ0ZHX0REUlRZUEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUgkJCTAKKworI2RlZmluZSBTRFJDX01DRkdfUkFNVFlQRV9NQVNLCQkJCUFSTV9SRUdfVkFMKDAsIDB4MykKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKHYpCQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfTUNGR19SQU1UWVBFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19SQU1UWVBFX0RFQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX01DRkdfUkFNVFlQRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfUkFNVFlQRV9TRFIJCQkJCTB4MAorI2RlZmluZSBTRFJDX01DRkdfUkFNVFlQRV9ERFIJCQkJCTB4MQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBERFIgTW9kZSBSZWdpc3RlciAoQ29ycmVzcG9uZHMgMToxIHcvIEpFREVDIE1vZGUKKyAqIFJlZ2lzdGVyKQorICovCisKKyNkZWZpbmUgU0RSQ19NUl9aRVJPXzEJCQkJCQlBUk1fUkVHX1ZBTCgxMCwgMCkKKworI2RlZmluZSBTRFJDX01SX1dCU1RfRU5BQkxFCQkJCQlBUk1fUkVHX1ZBTCg5LCAwKQorI2RlZmluZSBTRFJDX01SX1dCU1RfRElTQUJMRQkJCQlBUk1fUkVHX1ZBTCg5LCAxKQorCisjZGVmaW5lIFNEUkNfTVJfWkVST18wCQkJCQkJQVJNX1JFR19WQUwoNywgMCkKKworI2RlZmluZSBTRFJDX01SX0NBU0xfTUFTSwkJCQkJQVJNX1JFR19WQUwoNCwgMHg3KQorI2RlZmluZSBTRFJDX01SX0NBU0xfRU5DT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0VOQ09ERSg0LCBTRFJDX01SX0NBU0xfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NUl9DQVNMX0RFQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9ERUNPREUoNCwgU0RSQ19NUl9DQVNMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF8xCQkJCQkJCTB4MQorI2RlZmluZSBTRFJDX01SX0NBU0xfMgkJCQkJCQkweDIKKyNkZWZpbmUgU0RSQ19NUl9DQVNMXzMJCQkJCQkJMHgzCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF80CQkJCQkJCTB4NAorI2RlZmluZSBTRFJDX01SX0NBU0xfNQkJCQkJCQkweDUKKworI2RlZmluZSBTRFJDX01SX1NJTF9TRVJJQUwJCQkJCUFSTV9SRUdfVkFMKDMsIDApCisjZGVmaW5lIFNEUkNfTVJfU0lMX0lOVEVSTEVBVkVECQkJCUFSTV9SRUdfVkFMKDMsIDEpCisKKyNkZWZpbmUgU0RSQ19NUl9CTF9NQVNLCQkJCQkJQVJNX1JFR19WQUwoMCwgMHg3KQorI2RlZmluZSBTRFJDX01SX0JMX0VOQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19NUl9CTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01SX0JMX0RFQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19NUl9CTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01SX0JMXzEJCQkJCQkJMHgwCisjZGVmaW5lIFNEUkNfTVJfQkxfMgkJCQkJCQkweDEKKyNkZWZpbmUgU0RSQ19NUl9CTF80CQkJCQkJCTB4MgorI2RlZmluZSBTRFJDX01SX0JMXzgJCQkJCQkJMHgzCisjZGVmaW5lIFNEUkNfTVJfQkxfRlVMTF9QQUdFCQkJCQkweDcKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRERSIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgKENvcnJlc3BvbmRzIDE6MSB3LworICogSkVERUMgTW9kZSBSZWdpc3RlcikKKyAqLworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBBQyBUaW1pbmcgQ29udHJvbCBBCisgKi8KKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX01BU0sJCQlBUk1fUkVHX1ZBTCgyNywgMHgxRikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDI3LCBTRFJDX0FDVElNX0NUUkxBX1RSRkNfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDI3LCBTRFJDX0FDVElNX0NUUkxBX1RSRkNfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfTUFTSwkJCUFSTV9SRUdfVkFMKDIyLCAweDFGKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgyMiwgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMjIsIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19NQVNLCQkJQVJNX1JFR19WQUwoMTgsIDB4RikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDE4LCBTRFJDX0FDVElNX0NUUkxBX1RSQVNfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDE4LCBTRFJDX0FDVElNX0NUUkxBX1RSQVNfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfTUFTSwkJCUFSTV9SRUdfVkFMKDE1LCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDE1LCBTRFJDX0FDVElNX0NUUkxBX1RSUF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxNSwgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX01BU0sJCQlBUk1fUkVHX1ZBTCgxMiwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTIsIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTIsIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUkRfTUFTSwkJCUFSTV9SRUdfVkFMKDksIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDksIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUkRfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoOSwgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9NQVNLCQkJQVJNX1JFR19WQUwoNiwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoNiwgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSg2LCBTRFJDX0FDVElNX0NUUkxBX1REUExfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX01BU0sJCQlBUk1fUkVHX1ZBTCgwLCAweDFGKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REQUxfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX0FDVElNX0NUUkxBX1REQUxfTUFTSyksIHYpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEFDIFRpbWluZyBDb250cm9sIEIKKyAqLworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RXVFJfTUFTSwkJCUFSTV9SRUdfVkFMKDE2LCAweDMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxNiwgU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxNiwgU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9NQVNLCQkJQVJNX1JFR19WQUwoMTIsIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDEyLCBTRFJDX0FDVElNX0NUUkxCX1RDS0VfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDEyLCBTRFJDX0FDVElNX0NUUkxCX1RDS0VfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfTUFTSwkJCUFSTV9SRUdfVkFMKDgsIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoOCwgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoOCwgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX01BU0sJCQlBUk1fUkVHX1ZBTCgwLCAweEZGKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYU1JfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX0FDVElNX0NUUkxCX1RYU1JfTUFTSyksIHYpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEF1dG9yZWZyZXNoIENvbnRyb2wKKyAqLworI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSQ1ZfTUFTSwkJCQlBUk1fUkVHX1ZBTCg4LCAweEZGRkYpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSg4LCBTRFJDX1JGUl9DVFJMX0FSQ1ZfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkNWX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDgsIFNEUkNfUkZSX0NUUkxfQVJDVl9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV9NQVNLCQkJCUFSTV9SRUdfVkFMKDAsIDB4MykKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKHYpCQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfUkZSX0NUUkxfQVJFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFX0RFQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX1JGUl9DVFJMX0FSRV9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfRElTQUJMRUQJCQkJMHgwCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVgkJCQkweDEKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfNF9BUkNWCQkJCTB4MgorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV84X0FSQ1YJCQkJMHgzCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIE1hbnVhbCBDb250cm9sCisgKi8KKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EUEFSQU1fTUFTSwkJCUFSTV9SRUdfVkFMKDE2LCAweEZGRkYpCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRFBBUkFNX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDE2LCBTRFJDX01BTlVBTF9DTURQQVJBTV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURQQVJBTV9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxNiwgU0RSQ19NQU5VQUxfQ01EUEFSQU1fTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9NQVNLCQkJQVJNX1JFR19WQUwoMCwgMHg3KQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfTUFOVUFMX0NNRENPREVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgwLCBTRFJDX01BTlVBTF9DTURDT0RFX01BU0spLCB2KQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX05PUAkJCQkJMHgwCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTAkJMHgxCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gJCQkweDIKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9FTlRFUl9QV0QJCQkweDMKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9FWElUX1BXRAkJCTB4NAorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0VOVEVSX1NFTEZSRUZSRVNICTB4NQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0VYSVRfU0VMRlJFRlJFU0gJMHg2CisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfU0VUX0NLRV9ISUdICQkweDcKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9TRVRfQ0tFX0xPVwkJCTB4OAorCisjZW5kaWYgLyogX09NQVAzX1NEUkNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zaXplcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmExOGYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NpemVzLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CSBVU0EKKyAqLworLyogIFNpemUgZGVmaW50aW9ucworICogIENvcHlyaWdodCAoQykgQVJNIExpbWl0ZWQgMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9fc2l6ZXNfaAorI2RlZmluZSBfX3NpemVzX2gJCQkxCisKKy8qIGhhbmR5IHNpemVzICovCisjZGVmaW5lIFNaXzFLCQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1pfNEsJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBTWl84SwkJCQkweDAwMDAyMDAwCisjZGVmaW5lIFNaXzE2SwkJCQkweDAwMDA0MDAwCisjZGVmaW5lIFNaXzMySwkJCQkweDAwMDA4MDAwCisjZGVmaW5lIFNaXzY0SwkJCQkweDAwMDEwMDAwCisjZGVmaW5lIFNaXzEyOEsJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBTWl8yNTZLCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgU1pfNTEySwkJCQkweDAwMDgwMDAwCisKKyNkZWZpbmUgU1pfMU0JCQkJMHgwMDEwMDAwMAorI2RlZmluZSBTWl8yTQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIFNaXzRNCQkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgU1pfOE0JCQkJMHgwMDgwMDAwMAorI2RlZmluZSBTWl8xNk0JCQkJMHgwMTAwMDAwMAorI2RlZmluZSBTWl8zMU0JCQkJMHgwMUYwMDAwMAorI2RlZmluZSBTWl8zMk0JCQkJMHgwMjAwMDAwMAorI2RlZmluZSBTWl82NE0JCQkJMHgwNDAwMDAwMAorI2RlZmluZSBTWl8xMjhNCQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgU1pfMjU2TQkJCQkweDEwMDAwMDAwCisjZGVmaW5lIFNaXzUxMk0JCQkJMHgyMDAwMDAwMAorCisjZGVmaW5lIFNaXzFHCQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU1pfMkcJCQkJMHg4MDAwMDAwMAorCisjZW5kaWYJLyogX19zaXplc19oICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19pbmZvLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNWRkMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX2luZm8uaApAQCAtMCwwICsxLDkzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDM0WFhfU1lTX0lORk9fSF8KKyNkZWZpbmUgX09NQVAzNFhYX1NZU19JTkZPX0hfCisKKyNkZWZpbmUgWERSX1BPUAkJNSAgICAgIC8qIHBhY2thZ2Ugb24gcGFja2FnZSBwYXJ0ICovCisjZGVmaW5lIFNEUl9ESVNDUkVURQk0ICAgICAgLyogMTI4TSBtZW1vcnkgU0RSIG1vZHVsZSovCisjZGVmaW5lIEREUl9TVEFDS0VECTMgICAgICAvKiBzdGFja2VkIHBhcnQgb24gMjQyMiAqLworI2RlZmluZSBERFJfQ09NQk8JMiAgICAgIC8qIGNvbWJvIHBhcnQgb24gY3B1IGRhdWdodGVyIGNhcmQgKG1lbmFsYWV1cykgKi8KKyNkZWZpbmUgRERSX0RJU0NSRVRFCTEgICAgICAvKiAyeDE2IHBhcnRzIG9uIGRhdWdodGVyIGNhcmQgKi8KKworI2RlZmluZSBERFJfMTAwCQkxMDAgICAgLyogdHlwZSBmb3VuZCBvbiBtb3N0IG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTExCQkxMTEgICAgLyogc29tZSBjb21ibyBwYXJ0cyAqLworI2RlZmluZSBERFJfMTMzCQkxMzMgICAgLyogbW9zdCBjb21ibywgc29tZSBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzE2NQkJMTY1ICAgIC8qIGZ1dHVyZSBwYXJ0cyAqLworCisjZGVmaW5lIENQVV8zNDMwCTB4MzQzMAorCisvKiAzNDN4IHJlYWwgaGFyZHdhcmU6CisgKiAgRVMxICAgICA9IHJldiAwCisgKi8KKworLyogMzQzeCBjb2RlIGRlZmluZXM6CisgKiBFUzEgICAgID0gMCsxID0gMQorICogRVMxICAgICA9IDErMSA9IDEKKyAqLworI2RlZmluZSBDUFVfMzQzMF9FUzEJCTEKKyNkZWZpbmUgQ1BVXzM0MzBfRVMyCQkyCisKKy8qCisgKiBIYXdrZXllIHZhbHVlcworICovCisjZGVmaW5lIEhBV0tFWUVfT01BUDM0WFggICAgICAgIDB4YjdhZQorI2RlZmluZSBIQVdLRVlFX0FNMzVYWCAgICAgICAgICAweGI4NjgKKyNkZWZpbmUgSEFXS0VZRV9PTUFQMzZYWCAgICAgICAgMHhiODkxCisKKyNkZWZpbmUgSEFXS0VZRV9TSElGVCAgICAgICAgICAgMTIKKworLyoKKyAqIERlZmluZSBDUFUgZmFtaWxpZXMKKyAqLworI2RlZmluZSBDUFVfT01BUDM0WFggICAgICAgICAgICAweDM0MDAgIC8qIE9NQVAzNHh4L09NQVAzNSBkZXZpY2VzICovCisjZGVmaW5lIENQVV9BTTM1WFggICAgICAgICAgICAgIDB4MzUwMCAgLyogQU0zNXh4IGRldmljZXMgICAgICAgICAgKi8KKyNkZWZpbmUgQ1BVX09NQVAzNlhYICAgICAgICAgICAgMHgzNjAwICAvKiBPTUFQMzZ4eCBkZXZpY2VzICAgICAgICAqLworCisvKiBDdXJyZW50bHkgVmlydGlvIG1vZGVscyB0aGlzIG9uZSAqLworI2RlZmluZSBDUFVfMzQzMF9DSElQSUQJCTB4MEI2OEEwMDAKKworI2RlZmluZSBHUE1DX01VWEVECQkxCisjZGVmaW5lIEdQTUNfTk9OTVVYRUQJCTAKKworI2RlZmluZSBUWVBFX05BTkQJCTB4ODAwCS8qIGJpdCBwb3MgZm9yIG5hbmQgaW4gZ3BtYyByZWcgKi8KKyNkZWZpbmUgVFlQRV9OT1IJCTB4MDAwCisjZGVmaW5lIFRZUEVfT05FTkFORAkJMHg4MDAKKworI2RlZmluZSBXSURUSF84QklUCQkweDAwMDAKKyNkZWZpbmUgV0lEVEhfMTZCSVQJCTB4MTAwMAkvKiBiaXQgcG9zIGZvciAxNiBiaXQgaW4gZ3BtYyAqLworCisjZGVmaW5lIEkyQ19NRU5FTEFVUwkJMHg3MgkvKiBpMmMgaWQgZm9yIGNvbXBhbmlvbiBjaGlwICovCisjZGVmaW5lIEkyQ19UUklUT04yCQkweDRCCS8qIGFkZHJlcyBvZiBwb3dlciBncm91cCAqLworCisjZGVmaW5lIEJPT1RfRkFTVF9YSVAJCTB4MWYKKworLyogU0RQIGRlZmluaXRpb25zIGFjY29yZGluZyB0byBGUEdBIFJldi4gSXMgdGhpcyBPSz8/ICovCisjZGVmaW5lIFNEUF8zNDMwX1YxCQkweDEKKyNkZWZpbmUgU0RQXzM0MzBfVjIJCTB4MgorCisjZGVmaW5lIEJPQVJEXzM0MzBfTEFCUkFET1IJMHg4MAorI2RlZmluZSBCT0FSRF8zNDMwX0xBQlJBRE9SX1YxCTB4MQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX3Byb3RvLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGZiMjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19wcm90by5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAzNFhYX1NZU19QUk9UT19IXworI2RlZmluZSBfT01BUDM0WFhfU1lTX1BST1RPX0hfCisKK3ZvaWQgcHJjbV9pbml0KHZvaWQpOwordm9pZCBwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKTsKKwordm9pZCBtZW1pZl9pbml0KHZvaWQpOwordm9pZCBzZHJjX2luaXQodm9pZCk7Cit2b2lkIGRvX3NkcmNfaW5pdCh1MzIsdTMyKTsKK3ZvaWQgZ3BtY19pbml0KHZvaWQpOworCit2b2lkIGV0aGVyX2luaXQodm9pZCk7Cit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCk7Cit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCk7Cit1MzIgaXNfY3B1X2ZhbWlseSh2b2lkKTsKK3UzMiBnZXRfY3B1X3R5cGUodm9pZCk7Cit1MzIgZ2V0X2NwdV9yZXYodm9pZCk7Cit1MzIgY3B1X2lzXzM0MTAodm9pZCk7Cit1MzIgZ2V0X21lbV90eXBlKHZvaWQpOwordTMyIGdldF9zeXNib290X3ZhbHVlKHZvaWQpOwordTMyIGdldF9ncG1jMF9iYXNlKHZvaWQpOwordTMyIGlzX2dwbWNfbXV4ZWQodm9pZCk7Cit1MzIgZ2V0X2dwbWMwX3R5cGUodm9pZCk7Cit1MzIgZ2V0X2dwbWMwX3dpZHRoKHZvaWQpOwordTMyIGdldF9ib2FyZF90eXBlKHZvaWQpOwordm9pZCBkaXNwbGF5X2JvYXJkX2luZm8odTMyKTsKK3ZvaWQgdXBkYXRlX211eCh1MzIsdTMyKTsKK3UzMiBnZXRfc2RyX2NzX3NpemUodTMyIG9mZnNldCk7Cit1MzIgcnVubmluZ19pbl9zZHJhbSh2b2lkKTsKK3UzMiBydW5uaW5nX2luX3NyYW0odm9pZCk7Cit1MzIgcnVubmluZ19pbl9mbGFzaCh2b2lkKTsKK3UzMiBydW5uaW5nX2Zyb21faW50ZXJuYWxfYm9vdCh2b2lkKTsKK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCk7CisKK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpOwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKTsKK3ZvaWQgc2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZTRiNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hdG9taWMuaAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTYgUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIENoYW5nZWxvZzoKKyAqICAgMjctMDYtMTk5NglSTUsJQ3JlYXRlZAorICogICAxMy0wNC0xOTk3CVJNSwlNYWRlIGZ1bmN0aW9ucyBhdG9taWMhCisgKiAgIDA3LTEyLTE5OTcJUk1LCVVwZ3JhZGVkIGZvciB2Mi4xLgorICogICAyNi0wOC0xOTk4CVBKQglBZGRlZCAjaWZkZWYgX19LRVJORUxfXworICovCisjaWZuZGVmIF9fQVNNX0FSTV9BVE9NSUNfSAorI2RlZmluZSBfX0FTTV9BUk1fQVRPTUlDX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX1NNUAorI2Vycm9yIFNNUCBub3Qgc3VwcG9ydGVkCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL3Byb2Mvc3lzdGVtLmg+CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdi0+Y291bnRlciArPSBpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zdWIoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdi0+Y291bnRlciAtPSBpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbmModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2LT5jb3VudGVyICs9IDE7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXYtPmNvdW50ZXIgLT0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19kZWNfYW5kX3Rlc3Qodm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmFsOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXZhbCA9IHYtPmNvdW50ZXI7CisJdi0+Y291bnRlciA9IHZhbCAtPSAxOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiB2YWwgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9uZWdhdGl2ZShpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmFsOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXZhbCA9IHYtPmNvdW50ZXI7CisJdi0+Y291bnRlciA9IHZhbCArPSBpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiB2YWwgPCAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJKmFkZHIgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyBvbiBBUk0gKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzM0ODlmMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2J5dGVvcmRlci5oCisgKgorICogQVJNIEVuZGlhbi1uZXNzLiAgSW4gbGl0dGxlIGVuZGlhbiBtb2RlLCB0aGUgZGF0YSBidXMgaXMgY29ubmVjdGVkIHN1Y2gKKyAqIHRoYXQgYnl0ZSBhY2Nlc3NlcyBhcHBlYXIgYXM6CisgKiAgMCA9IGQwLi4uZDcsIDEgPSBkOC4uLmQxNSwgMiA9IGQxNi4uLmQyMywgMyA9IGQyNC4uLmQzMQorICogYW5kIHdvcmQgYWNjZXNzZXMgKGRhdGEgb3IgaW5zdHJ1Y3Rpb24pIGFwcGVhciBhczoKKyAqICBkMC4uLmQzMQorICoKKyAqIFdoZW4gaW4gYmlnIGVuZGlhbiBtb2RlLCBieXRlIGFjY2Vzc2VzIGFwcGVhciBhczoKKyAqICAwID0gZDI0Li4uZDMxLCAxID0gZDE2Li4uZDIzLCAyID0gZDguLi5kMTUsIDMgPSBkMC4uLmQ3CisgKiBhbmQgd29yZCBhY2Nlc3NlcyAoZGF0YSBvciBpbnN0cnVjdGlvbikgYXBwZWFyIGFzOgorICogIGQwLi4uZDMxCisgKi8KKyNpZm5kZWYgX19BU01fQVJNX0JZVEVPUkRFUl9ICisjZGVmaW5lIF9fQVNNX0FSTV9CWVRFT1JERVJfSAorCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXworIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjaWZkZWYgX19BUk1FQl9fCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2NvbmZpZy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmOThmOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2NvbmZpZy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfQVNNX0NPTkZJR19IXworI2RlZmluZSBfQVNNX0NPTkZJR19IXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2lvLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTUxOGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9pby5oCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9pby5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTW9kaWZpY2F0aW9uczoKKyAqICAxNi1TZXAtMTk5NglSTUsJSW5saW5lZCB0aGUgaW54L291dHggZnVuY3Rpb25zICYgb3B0aW1pc2VkIGZvciBib3RoCisgKgkJCWNvbnN0YW50IGFkZHJlc3NlcyBhbmQgdmFyaWFibGUgYWRkcmVzc2VzLgorICogIDA0LURlYy0xOTk3CVJNSwlNb3ZlZCBhIGxvdCBvZiB0aGlzIHN0dWZmIHRvIHRoZSBuZXcgYXJjaGl0ZWN0dXJlCisgKgkJCXNwZWNpZmljIElPIGhlYWRlciBmaWxlcy4KKyAqICAyNy1NYXItMTk5OQlQSkIJU2Vjb25kIHBhcmFtZXRlciBvZiBtZW1jcHlfdG9pbyBpcyBjb25zdC4uCisgKiAgMDQtQXByLTE5OTkJUEpCCUFkZGVkIGNoZWNrX3NpZ25hdHVyZS4KKyAqICAxMi1EZWMtMTk5OQlSTUsJTW9yZSBjbGVhbnVwcworICogIDE4LUp1bi0yMDAwIFJNSwlSZW1vdmVkIHZpcnRfdG9fKiBhbmQgZnJpZW5kcyBkZWZpbml0aW9ucworICovCisjaWZuZGVmIF9fQVNNX0FSTV9JT19ICisjZGVmaW5lIF9fQVNNX0FSTV9JT19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaWYgMAkvKiBYWFgjIyNYWFggKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2VuZGlmCS8qIFhYWCMjI1hYWCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3luYyh2b2lkKQoreworfQorCisvKgorICogR2l2ZW4gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBhIGxlbmd0aCwgcmV0dXJuIGEgdmlydHVhbCBhZGRyZXNzCisgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgbWVtb3J5IHJhbmdlIHdpdGggdGhlIGNhY2hpbmcKKyAqIHByb3BlcnRpZXMgc3BlY2lmaWVkIGJ5ICJmbGFncyIuCisgKi8KKyNkZWZpbmUgTUFQX05PQ0FDSEUJKDApCisjZGVmaW5lIE1BUF9XUkNPTUJJTkUJKDApCisjZGVmaW5lIE1BUF9XUkJBQ0sJKDApCisjZGVmaW5lIE1BUF9XUlRIUk9VR0gJKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCittYXBfcGh5c21lbShwaHlzX2FkZHJfdCBwYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuICh2b2lkICopcGFkZHI7Cit9CisKKy8qCisgKiBUYWtlIGRvd24gYSBtYXBwaW5nIHNldCB1cCBieSBtYXBfcGh5c21lbSgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfcGh5c21lbSh2b2lkICp2YWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKworfQorCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IHZpcnRfdG9fcGh5cyh2b2lkICogdmFkZHIpCit7CisJcmV0dXJuIChwaHlzX2FkZHJfdCkodmFkZHIpOworfQorCisvKgorICogR2VuZXJpYyB2aXJ0dWFsIHJlYWQvd3JpdGUuICBOb3RlIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydCBoYWxmLXdvcmQKKyAqIHJlYWQvd3JpdGVzLiAgV2UgZGVmaW5lIF9fYXJjaF8qW2JsXSBoZXJlLCBhbmQgbGVhdmUgX19hcmNoXyp3CisgKiB0byB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvZGUuCisgKi8KKyNkZWZpbmUgX19hcmNoX2dldGIoYSkJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGEpKQorI2RlZmluZSBfX2FyY2hfZ2V0dyhhKQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKQorI2RlZmluZSBfX2FyY2hfZ2V0bChhKQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhKSkKKworI2RlZmluZSBfX2FyY2hfcHV0Yih2LGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGEpID0gKHYpKQorI2RlZmluZSBfX2FyY2hfcHV0dyh2LGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSA9ICh2KSkKKyNkZWZpbmUgX19hcmNoX3B1dGwodixhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpID0gKHYpKQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfd3JpdGVzYih1bnNpZ25lZCBpbnQgYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGJ5dGVsZW4pCit7CisJdWludDhfdCAqYnVmID0gKHVpbnQ4X3QgKilkYXRhOworCXdoaWxlKGJ5dGVsZW4tLSkKKwkJX19hcmNoX3B1dGIoKmJ1ZisrLCBhZGRyKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlc3codW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKQoreworCXVpbnQxNl90ICpidWYgPSAodWludDE2X3QgKilkYXRhOworCXdoaWxlKHdvcmRsZW4tLSkKKwkJX19hcmNoX3B1dHcoKmJ1ZisrLCBhZGRyKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlc2wodW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsb25nbGVuKQoreworCXVpbnQzMl90ICpidWYgPSAodWludDMyX3QgKilkYXRhOworCXdoaWxlKGxvbmdsZW4tLSkKKwkJX19hcmNoX3B1dGwoKmJ1ZisrLCBhZGRyKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3JlYWRzYih1bnNpZ25lZCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IGJ5dGVsZW4pCit7CisJdWludDhfdCAqYnVmID0gKHVpbnQ4X3QgKilkYXRhOworCXdoaWxlKGJ5dGVsZW4tLSkKKwkJKmJ1ZisrID0gX19hcmNoX2dldGIoYWRkcik7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkc3codW5zaWduZWQgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKQoreworCXVpbnQxNl90ICpidWYgPSAodWludDE2X3QgKilkYXRhOworCXdoaWxlKHdvcmRsZW4tLSkKKwkJKmJ1ZisrID0gX19hcmNoX2dldHcoYWRkcik7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkc2wodW5zaWduZWQgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCBsb25nbGVuKQoreworCXVpbnQzMl90ICpidWYgPSAodWludDMyX3QgKilkYXRhOworCXdoaWxlKGxvbmdsZW4tLSkKKwkJKmJ1ZisrID0gX19hcmNoX2dldGwoYWRkcik7Cit9CisKKyNkZWZpbmUgX19yYXdfd3JpdGViKHYsYSkJCV9fYXJjaF9wdXRiKHYsYSkKKyNkZWZpbmUgX19yYXdfd3JpdGV3KHYsYSkJCV9fYXJjaF9wdXR3KHYsYSkKKyNkZWZpbmUgX19yYXdfd3JpdGVsKHYsYSkJCV9fYXJjaF9wdXRsKHYsYSkKKworI2RlZmluZSBfX3Jhd19yZWFkYihhKQkJCV9fYXJjaF9nZXRiKGEpCisjZGVmaW5lIF9fcmF3X3JlYWR3KGEpCQkJX19hcmNoX2dldHcoYSkKKyNkZWZpbmUgX19yYXdfcmVhZGwoYSkJCQlfX2FyY2hfZ2V0bChhKQorCisjZGVmaW5lIHdyaXRlYih2LGEpCQkJX19hcmNoX3B1dGIodixhKQorI2RlZmluZSB3cml0ZXcodixhKQkJCV9fYXJjaF9wdXR3KHYsYSkKKyNkZWZpbmUgd3JpdGVsKHYsYSkJCQlfX2FyY2hfcHV0bCh2LGEpCisKKyNkZWZpbmUgcmVhZGIoYSkJCQlfX2FyY2hfZ2V0YihhKQorI2RlZmluZSByZWFkdyhhKQkJCV9fYXJjaF9nZXR3KGEpCisjZGVmaW5lIHJlYWRsKGEpCQkJX19hcmNoX2dldGwoYSkKKworLyoKKyAqIFRoZSBjb21waWxlciBzZWVtcyB0byBiZSBpbmNhcGFibGUgb2Ygb3B0aW1pc2luZyBjb25zdGFudHMKKyAqIHByb3Blcmx5LiAgU3BlbGwgaXQgb3V0IHRvIHRoZSBjb21waWxlciBpbiBzb21lIGNhc2VzLgorICogVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHNtYWxsIHZhbHVlcyBvZiAib2ZmIiAoPCAxPDwxMikKKyAqLworI2RlZmluZSBfX3Jhd19iYXNlX3dyaXRlYih2YWwsYmFzZSxvZmYpCV9fYXJjaF9iYXNlX3B1dGIodmFsLGJhc2Usb2ZmKQorI2RlZmluZSBfX3Jhd19iYXNlX3dyaXRldyh2YWwsYmFzZSxvZmYpCV9fYXJjaF9iYXNlX3B1dHcodmFsLGJhc2Usb2ZmKQorI2RlZmluZSBfX3Jhd19iYXNlX3dyaXRlbCh2YWwsYmFzZSxvZmYpCV9fYXJjaF9iYXNlX3B1dGwodmFsLGJhc2Usb2ZmKQorCisjZGVmaW5lIF9fcmF3X2Jhc2VfcmVhZGIoYmFzZSxvZmYpCV9fYXJjaF9iYXNlX2dldGIoYmFzZSxvZmYpCisjZGVmaW5lIF9fcmF3X2Jhc2VfcmVhZHcoYmFzZSxvZmYpCV9fYXJjaF9iYXNlX2dldHcoYmFzZSxvZmYpCisjZGVmaW5lIF9fcmF3X2Jhc2VfcmVhZGwoYmFzZSxvZmYpCV9fYXJjaF9iYXNlX2dldGwoYmFzZSxvZmYpCisKKy8qCisgKiBDbGVhciBhbmQgc2V0IGJpdHMgaW4gb25lIHNob3QuIFRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCB0byBjbGVhciBhbmQKKyAqIHNldCBtdWx0aXBsZSBiaXRzIGluIGEgcmVnaXN0ZXIgdXNpbmcgYSBzaW5nbGUgY2FsbC4gVGhlc2UgbWFjcm9zIGNhbgorICogYWxzbyBiZSB1c2VkIHRvIHNldCBhIG11bHRpcGxlLWJpdCBiaXQgcGF0dGVybiB1c2luZyBhIG1hc2ssIGJ5CisgKiBzcGVjaWZ5aW5nIHRoZSBtYXNrIGluIHRoZSAnY2xlYXInIHBhcmFtZXRlciBhbmQgdGhlIG5ldyBiaXQgcGF0dGVybgorICogaW4gdGhlICdzZXQnIHBhcmFtZXRlci4KKyAqLworCisjZGVmaW5lIG91dF9hcmNoKHR5cGUsZW5kaWFuLGEsdikJX19yYXdfd3JpdGUjI3R5cGUoY3B1X3RvXyMjZW5kaWFuKHYpLGEpCisjZGVmaW5lIGluX2FyY2godHlwZSxlbmRpYW4sYSkJCWVuZGlhbiMjX3RvX2NwdShfX3Jhd19yZWFkIyN0eXBlKGEpKQorCisjZGVmaW5lIG91dF9sZTMyKGEsdikJb3V0X2FyY2gobCxsZTMyLGEsdikKKyNkZWZpbmUgb3V0X2xlMTYoYSx2KQlvdXRfYXJjaCh3LGxlMTYsYSx2KQorCisjZGVmaW5lIGluX2xlMzIoYSkJaW5fYXJjaChsLGxlMzIsYSkKKyNkZWZpbmUgaW5fbGUxNihhKQlpbl9hcmNoKHcsbGUxNixhKQorCisjZGVmaW5lIG91dF9iZTMyKGEsdikJb3V0X2FyY2gobCxiZTMyLGEsdikKKyNkZWZpbmUgb3V0X2JlMTYoYSx2KQlvdXRfYXJjaCh3LGJlMTYsYSx2KQorCisjZGVmaW5lIGluX2JlMzIoYSkJaW5fYXJjaChsLGJlMzIsYSkKKyNkZWZpbmUgaW5fYmUxNihhKQlpbl9hcmNoKHcsYmUxNixhKQorCisjZGVmaW5lIG91dF84KGEsdikJX19yYXdfd3JpdGViKHYsYSkKKyNkZWZpbmUgaW5fOChhKQkJX19yYXdfcmVhZGIoYSkKKworI2RlZmluZSBjbHJiaXRzKHR5cGUsIGFkZHIsIGNsZWFyKSBcCisJb3V0XyMjdHlwZSgoYWRkciksIGluXyMjdHlwZShhZGRyKSAmIH4oY2xlYXIpKQorCisjZGVmaW5lIHNldGJpdHModHlwZSwgYWRkciwgc2V0KSBcCisJb3V0XyMjdHlwZSgoYWRkciksIGluXyMjdHlwZShhZGRyKSB8IChzZXQpKQorCisjZGVmaW5lIGNscnNldGJpdHModHlwZSwgYWRkciwgY2xlYXIsIHNldCkgXAorCW91dF8jI3R5cGUoKGFkZHIpLCAoaW5fIyN0eXBlKGFkZHIpICYgfihjbGVhcikpIHwgKHNldCkpCisKKyNkZWZpbmUgY2xyYml0c19iZTMyKGFkZHIsIGNsZWFyKSBjbHJiaXRzKGJlMzIsIGFkZHIsIGNsZWFyKQorI2RlZmluZSBzZXRiaXRzX2JlMzIoYWRkciwgc2V0KSBzZXRiaXRzKGJlMzIsIGFkZHIsIHNldCkKKyNkZWZpbmUgY2xyc2V0Yml0c19iZTMyKGFkZHIsIGNsZWFyLCBzZXQpIGNscnNldGJpdHMoYmUzMiwgYWRkciwgY2xlYXIsIHNldCkKKworI2RlZmluZSBjbHJiaXRzX2xlMzIoYWRkciwgY2xlYXIpIGNscmJpdHMobGUzMiwgYWRkciwgY2xlYXIpCisjZGVmaW5lIHNldGJpdHNfbGUzMihhZGRyLCBzZXQpIHNldGJpdHMobGUzMiwgYWRkciwgc2V0KQorI2RlZmluZSBjbHJzZXRiaXRzX2xlMzIoYWRkciwgY2xlYXIsIHNldCkgY2xyc2V0Yml0cyhsZTMyLCBhZGRyLCBjbGVhciwgc2V0KQorCisjZGVmaW5lIGNscmJpdHNfYmUxNihhZGRyLCBjbGVhcikgY2xyYml0cyhiZTE2LCBhZGRyLCBjbGVhcikKKyNkZWZpbmUgc2V0Yml0c19iZTE2KGFkZHIsIHNldCkgc2V0Yml0cyhiZTE2LCBhZGRyLCBzZXQpCisjZGVmaW5lIGNscnNldGJpdHNfYmUxNihhZGRyLCBjbGVhciwgc2V0KSBjbHJzZXRiaXRzKGJlMTYsIGFkZHIsIGNsZWFyLCBzZXQpCisKKyNkZWZpbmUgY2xyYml0c19sZTE2KGFkZHIsIGNsZWFyKSBjbHJiaXRzKGxlMTYsIGFkZHIsIGNsZWFyKQorI2RlZmluZSBzZXRiaXRzX2xlMTYoYWRkciwgc2V0KSBzZXRiaXRzKGxlMTYsIGFkZHIsIHNldCkKKyNkZWZpbmUgY2xyc2V0Yml0c19sZTE2KGFkZHIsIGNsZWFyLCBzZXQpIGNscnNldGJpdHMobGUxNiwgYWRkciwgY2xlYXIsIHNldCkKKworI2RlZmluZSBjbHJiaXRzXzgoYWRkciwgY2xlYXIpIGNscmJpdHMoOCwgYWRkciwgY2xlYXIpCisjZGVmaW5lIHNldGJpdHNfOChhZGRyLCBzZXQpIHNldGJpdHMoOCwgYWRkciwgc2V0KQorI2RlZmluZSBjbHJzZXRiaXRzXzgoYWRkciwgY2xlYXIsIHNldCkgY2xyc2V0Yml0cyg4LCBhZGRyLCBjbGVhciwgc2V0KQorCisvKgorICogTm93LCBwaWNrIHVwIHRoZSBtYWNoaW5lLWRlZmluZWQgSU8gZGVmaW5pdGlvbnMKKyAqLworI2lmIDAJLyogWFhYIyMjWFhYICovCisjaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KKyNlbmRpZgkvKiBYWFgjIyNYWFggKi8KKworLyoKKyAqICBJTyBwb3J0IGFjY2VzcyBwcmltaXRpdmVzCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoZSBBUk0gZG9lc24ndCBoYXZlIHNwZWNpYWwgSU8gYWNjZXNzIGluc3RydWN0aW9uczsgYWxsIElPIGlzIG1lbW9yeQorICogbWFwcGVkLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBkZWZpbmVkIHRvIHBlcmZvcm0gbGl0dGxlIGVuZGlhbiBhY2Nlc3NlcworICogb25seS4gIFRoZWlyIHByaW1hcnkgcHVycG9zZSBpcyB0byBhY2Nlc3MgUENJIGFuZCBJU0EgcGVyaXBoZXJhbHMuCisgKgorICogTm90ZSB0aGF0IGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZworICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZSwgYXMgZGVzY3JpYmVkIGJ5IG51bWVyb3VzCisgKiBBUk0gZG9jdW1lbnRzOgorICoKKyAqICAgIFBDSTogIEQwLUQ3ICAgRDgtRDE1IEQxNi1EMjMgRDI0LUQzMQorICogICAgQVJNOiBEMjQtRDMxIEQxNi1EMjMgIEQ4LUQxNSAgRDAtRDcKKyAqCisgKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBpby5oIGluY2x1ZGUgZGVmaW5lcyBfX2lvIHRvIHRyYW5zbGF0ZSBhbiAiSU8iCisgKiBhZGRyZXNzIHRvIGEgbWVtb3J5IGFkZHJlc3MuCisgKgorICogTm90ZSB0aGF0IHdlIHByZXZlbnQgR0NDIHJlLW9yZGVyaW5nIG9yIGNhY2hpbmcgdmFsdWVzIGluIGV4cHJlc3Npb25zCisgKiBieSBpbnRyb2R1Y2luZyBzZXF1ZW5jZSBwb2ludHMgaW50byB0aGUgaW4qKCkgZGVmaW5pdGlvbnMuICBOb3RlIHRoYXQKKyAqIF9fcmF3XyogZG8gbm90IGd1YXJhbnRlZSB0aGlzIGJlaGF2aW91ci4KKyAqCisgKiBUaGUge2luLG91dH1bYndsXSBtYWNyb3MgYXJlIGZvciBlbXVsYXRpbmcgeDg2LXN0eWxlIFBDSS9JU0EgSU8gc3BhY2UuCisgKi8KKyNpZmRlZiBfX2lvCisjZGVmaW5lIG91dGIodixwKQkJCV9fcmF3X3dyaXRlYih2LF9faW8ocCkpCisjZGVmaW5lIG91dHcodixwKQkJCV9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNih2KSxfX2lvKHApKQorI2RlZmluZSBvdXRsKHYscCkJCQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksX19pbyhwKSkKKworI2RlZmluZSBpbmIocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKF9faW8ocCkpOyBfX3Y7IH0pCisjZGVmaW5lIGludyhwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcoX19pbyhwKSkpOyBfX3Y7IH0pCisjZGVmaW5lIGlubChwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoX19yYXdfcmVhZGwoX19pbyhwKSkpOyBfX3Y7IH0pCisKKyNkZWZpbmUgb3V0c2IocCxkLGwpCQkJX19yYXdfd3JpdGVzYihfX2lvKHApLGQsbCkKKyNkZWZpbmUgb3V0c3cocCxkLGwpCQkJX19yYXdfd3JpdGVzdyhfX2lvKHApLGQsbCkKKyNkZWZpbmUgb3V0c2wocCxkLGwpCQkJX19yYXdfd3JpdGVzbChfX2lvKHApLGQsbCkKKworI2RlZmluZSBpbnNiKHAsZCxsKQkJCV9fcmF3X3JlYWRzYihfX2lvKHApLGQsbCkKKyNkZWZpbmUgaW5zdyhwLGQsbCkJCQlfX3Jhd19yZWFkc3coX19pbyhwKSxkLGwpCisjZGVmaW5lIGluc2wocCxkLGwpCQkJX19yYXdfcmVhZHNsKF9faW8ocCksZCxsKQorI2VuZGlmCisKKyNkZWZpbmUgb3V0Yl9wKHZhbCxwb3J0KQkJb3V0YigodmFsKSwocG9ydCkpCisjZGVmaW5lIG91dHdfcCh2YWwscG9ydCkJCW91dHcoKHZhbCksKHBvcnQpKQorI2RlZmluZSBvdXRsX3AodmFsLHBvcnQpCQlvdXRsKCh2YWwpLChwb3J0KSkKKyNkZWZpbmUgaW5iX3AocG9ydCkJCQlpbmIoKHBvcnQpKQorI2RlZmluZSBpbndfcChwb3J0KQkJCWludygocG9ydCkpCisjZGVmaW5lIGlubF9wKHBvcnQpCQkJaW5sKChwb3J0KSkKKworI2RlZmluZSBvdXRzYl9wKHBvcnQsZnJvbSxsZW4pCQlvdXRzYihwb3J0LGZyb20sbGVuKQorI2RlZmluZSBvdXRzd19wKHBvcnQsZnJvbSxsZW4pCQlvdXRzdyhwb3J0LGZyb20sbGVuKQorI2RlZmluZSBvdXRzbF9wKHBvcnQsZnJvbSxsZW4pCQlvdXRzbChwb3J0LGZyb20sbGVuKQorI2RlZmluZSBpbnNiX3AocG9ydCx0byxsZW4pCQlpbnNiKHBvcnQsdG8sbGVuKQorI2RlZmluZSBpbnN3X3AocG9ydCx0byxsZW4pCQlpbnN3KHBvcnQsdG8sbGVuKQorI2RlZmluZSBpbnNsX3AocG9ydCx0byxsZW4pCQlpbnNsKHBvcnQsdG8sbGVuKQorCisvKgorICogaW9yZW1hcCBhbmQgZnJpZW5kcy4KKyAqCisgKiBpb3JlbWFwIHRha2VzIGEgUENJIG1lbW9yeSBhZGRyZXNzLCBhcyBzcGVjaWZpZWQgaW4KKyAqIGxpbnV4L0RvY3VtZW50YXRpb24vSU8tbWFwcGluZy50eHQuICBJZiB5b3Ugd2FudCBhCisgKiBwaHlzaWNhbCBhZGRyZXNzLCB1c2UgX19pb3JlbWFwIGluc3RlYWQuCisgKi8KK2V4dGVybiB2b2lkICogX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9pZCAqYWRkcik7CisKKy8qCisgKiBHZW5lcmljIGlvcmVtYXAgc3VwcG9ydC4KKyAqCisgKiBEZWZpbmU6CisgKiAgaW9tZW1fdmFsaWRfYWRkcihvZmYsc2l6ZSkKKyAqICBpb21lbV90b19waHlzKG9mZikKKyAqLworI2lmZGVmIGlvbWVtX3ZhbGlkX2FkZHIKKyNkZWZpbmUgX19hcmNoX2lvcmVtYXAob2ZmLHN6LG5vY2FjaGUpCQkJCQlcCisgKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfb2ZmID0gKG9mZiksIF9zaXplID0gKHN6KTsJCQlcCisJdm9pZCAqX3JldCA9ICh2b2lkICopMDsJCQkJCQlcCisJaWYgKGlvbWVtX3ZhbGlkX2FkZHIoX29mZiwgX3NpemUpKQkJCQlcCisJCV9yZXQgPSBfX2lvcmVtYXAoaW9tZW1fdG9fcGh5cyhfb2ZmKSxfc2l6ZSxub2NhY2hlKTsJXAorCV9yZXQ7CQkJCQkJCQlcCisgfSkKKworI2RlZmluZSBfX2FyY2hfaW91bm1hcCBfX2lvdW5tYXAKKyNlbmRpZgorCisjZGVmaW5lIGlvcmVtYXAob2ZmLHN6KQkJCV9fYXJjaF9pb3JlbWFwKChvZmYpLChzeiksMCkKKyNkZWZpbmUgaW9yZW1hcF9ub2NhY2hlKG9mZixzeikJCV9fYXJjaF9pb3JlbWFwKChvZmYpLChzeiksMSkKKyNkZWZpbmUgaW91bm1hcChfYWRkcikJCQlfX2FyY2hfaW91bm1hcChfYWRkcikKKworLyoKKyAqIERNQS1jb25zaXN0ZW50IG1hcHBpbmcgZnVuY3Rpb25zLiAgVGhlc2UgYWxsb2NhdGUvZnJlZSBhIHJlZ2lvbiBvZgorICogdW5jYWNoZWQsIHVud3JpdGUtYnVmZmVyZWQgbWFwcGVkIG1lbW9yeSBzcGFjZSBmb3IgdXNlIHdpdGggRE1BCisgKiBkZXZpY2VzLiAgVGhpcyBpcyB0aGUgImdlbmVyaWMiIHZlcnNpb24uICBUaGUgUENJIHNwZWNpZmljIHZlcnNpb24KKyAqIGlzIGluIHBjaS5oCisgKi8KK2V4dGVybiB2b2lkICpjb25zaXN0ZW50X2FsbG9jKGludCBnZnAsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUpOworZXh0ZXJuIHZvaWQgY29uc2lzdGVudF9mcmVlKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCBoYW5kbGUpOworZXh0ZXJuIHZvaWQgY29uc2lzdGVudF9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHJ3KTsKKworLyoKKyAqIFN0cmluZyB2ZXJzaW9uIG9mIElPIG1lbW9yeSBhY2Nlc3Mgb3BzOgorICovCitleHRlcm4gdm9pZCBfbWVtY3B5X2Zyb21pbyh2b2lkICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCk7CitleHRlcm4gdm9pZCBfbWVtY3B5X3RvaW8odW5zaWduZWQgbG9uZywgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgX21lbXNldF9pbyh1bnNpZ25lZCBsb25nLCBpbnQsIHNpemVfdCk7CisKK2V4dGVybiB2b2lkIF9fcmVhZHdyaXRlX2J1Zyhjb25zdCBjaGFyICpmbik7CisKKy8qCisgKiBJZiB0aGlzIGFyY2hpdGVjdHVyZSBoYXMgUENJIG1lbW9yeSBJTywgdGhlbiBkZWZpbmUgdGhlIHJlYWQvd3JpdGUKKyAqIG1hY3Jvcy4gIFRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgY29va2llIHBhc3NlZCBmcm9tCisgKiBpb3JlbWFwLgorICovCisjaWZkZWYgX19tZW1fcGNpCisKKyNkZWZpbmUgcmVhZGIoYykgKHsgdW5zaWduZWQgaW50IF9fdiA9IF9fcmF3X3JlYWRiKF9fbWVtX3BjaShjKSk7IF9fdjsgfSkKKyNkZWZpbmUgcmVhZHcoYykgKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KF9fbWVtX3BjaShjKSkpOyBfX3Y7IH0pCisjZGVmaW5lIHJlYWRsKGMpICh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChfX21lbV9wY2koYykpKTsgX192OyB9KQorCisjZGVmaW5lIHdyaXRlYih2LGMpCQlfX3Jhd193cml0ZWIodixfX21lbV9wY2koYykpCisjZGVmaW5lIHdyaXRldyh2LGMpCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksX19tZW1fcGNpKGMpKQorI2RlZmluZSB3cml0ZWwodixjKQkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHYpLF9fbWVtX3BjaShjKSkKKworI2RlZmluZSBtZW1zZXRfaW8oYyx2LGwpCQlfbWVtc2V0X2lvKF9fbWVtX3BjaShjKSwodiksKGwpKQorI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYyxsKQkJX21lbWNweV9mcm9taW8oKGEpLF9fbWVtX3BjaShjKSwobCkpCisjZGVmaW5lIG1lbWNweV90b2lvKGMsYSxsKQkJX21lbWNweV90b2lvKF9fbWVtX3BjaShjKSwoYSksKGwpKQorCisjZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0ocyxjLGwsYikgXAorCQkJCWV0aF9jb3B5X2FuZF9zdW0oKHMpLF9fbWVtX3BjaShjKSwobCksKGIpKQorCitzdGF0aWMgaW5saW5lIGludAorY2hlY2tfc2lnbmF0dXJlKHVuc2lnbmVkIGxvbmcgaW9fYWRkciwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLAorCQlpbnQgbGVuZ3RoKQoreworCWludCByZXR2YWwgPSAwOworCWRvIHsKKwkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCisJCQlnb3RvIG91dDsKKwkJaW9fYWRkcisrOworCQlzaWduYXR1cmUrKzsKKwkJbGVuZ3RoLS07CisJfSB3aGlsZSAobGVuZ3RoKTsKKwlyZXR2YWwgPSAxOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNlbGlmICFkZWZpbmVkKHJlYWRiKQorCisjZGVmaW5lIHJlYWRiKGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygicmVhZGIiKSwwKQorI2RlZmluZSByZWFkdyhhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoInJlYWR3IiksMCkKKyNkZWZpbmUgcmVhZGwoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJyZWFkbCIpLDApCisjZGVmaW5lIHdyaXRlYih2LGFkZHIpCQkJX19yZWFkd3JpdGVfYnVnKCJ3cml0ZWIiKQorI2RlZmluZSB3cml0ZXcodixhZGRyKQkJCV9fcmVhZHdyaXRlX2J1Zygid3JpdGV3IikKKyNkZWZpbmUgd3JpdGVsKHYsYWRkcikJCQlfX3JlYWR3cml0ZV9idWcoIndyaXRlbCIpCisKKyNkZWZpbmUgZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKQlfX3JlYWR3cml0ZV9idWcoImV0aF9pb19jb3B5X2FuZF9zdW0iKQorCisjZGVmaW5lIGNoZWNrX3NpZ25hdHVyZShpbyxzaWcsbGVuKQkoMCkKKworI2VuZGlmCS8qIF9fbWVtX3BjaSAqLworCisvKgorICogSWYgdGhpcyBhcmNoaXRlY3R1cmUgaGFzIElTQSBJTywgdGhlbiBkZWZpbmUgdGhlIGlzYV9yZWFkL2lzYV93cml0ZQorICogbWFjcm9zLgorICovCisjaWZkZWYgX19tZW1faXNhCisKKyNkZWZpbmUgaXNhX3JlYWRiKGFkZHIpCQkJX19yYXdfcmVhZGIoX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2FfcmVhZHcoYWRkcikJCQlfX3Jhd19yZWFkdyhfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV9yZWFkbChhZGRyKQkJCV9fcmF3X3JlYWRsKF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX3dyaXRlYih2YWwsYWRkcikJCV9fcmF3X3dyaXRlYih2YWwsX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2Ffd3JpdGV3KHZhbCxhZGRyKQkJX19yYXdfd3JpdGV3KHZhbCxfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV93cml0ZWwodmFsLGFkZHIpCQlfX3Jhd193cml0ZWwodmFsLF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX21lbXNldF9pbyhhLGIsYykJCV9tZW1zZXRfaW8oX19tZW1faXNhKGEpLChiKSwoYykpCisjZGVmaW5lIGlzYV9tZW1jcHlfZnJvbWlvKGEsYixjKQlfbWVtY3B5X2Zyb21pbygoYSksX19tZW1faXNhKGIpLChjKSkKKyNkZWZpbmUgaXNhX21lbWNweV90b2lvKGEsYixjKQkJX21lbWNweV90b2lvKF9fbWVtX2lzYSgoYSkpLChiKSwoYykpCisKKyNkZWZpbmUgaXNhX2V0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkgXAorCQkJCWV0aF9jb3B5X2FuZF9zdW0oKGEpLF9fbWVtX2lzYShiKSwoYyksKGQpKQorCitzdGF0aWMgaW5saW5lIGludAoraXNhX2NoZWNrX3NpZ25hdHVyZSh1bnNpZ25lZCBsb25nIGlvX2FkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgIGludCBsZW5ndGgpCit7CisJaW50IHJldHZhbCA9IDA7CisJZG8geworCQlpZiAoaXNhX3JlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCisJCQlnb3RvIG91dDsKKwkJaW9fYWRkcisrOworCQlzaWduYXR1cmUrKzsKKwkJbGVuZ3RoLS07CisJfSB3aGlsZSAobGVuZ3RoKTsKKwlyZXR2YWwgPSAxOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNlbHNlCS8qIF9fbWVtX2lzYSAqLworCisjZGVmaW5lIGlzYV9yZWFkYihhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoImlzYV9yZWFkYiIpLDApCisjZGVmaW5lIGlzYV9yZWFkdyhhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoImlzYV9yZWFkdyIpLDApCisjZGVmaW5lIGlzYV9yZWFkbChhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoImlzYV9yZWFkbCIpLDApCisjZGVmaW5lIGlzYV93cml0ZWIodmFsLGFkZHIpCQlfX3JlYWR3cml0ZV9idWcoImlzYV93cml0ZWIiKQorI2RlZmluZSBpc2Ffd3JpdGV3KHZhbCxhZGRyKQkJX19yZWFkd3JpdGVfYnVnKCJpc2Ffd3JpdGV3IikKKyNkZWZpbmUgaXNhX3dyaXRlbCh2YWwsYWRkcikJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX3dyaXRlbCIpCisjZGVmaW5lIGlzYV9tZW1zZXRfaW8oYSxiLGMpCQlfX3JlYWR3cml0ZV9idWcoImlzYV9tZW1zZXRfaW8iKQorI2RlZmluZSBpc2FfbWVtY3B5X2Zyb21pbyhhLGIsYykJX19yZWFkd3JpdGVfYnVnKCJpc2FfbWVtY3B5X2Zyb21pbyIpCisjZGVmaW5lIGlzYV9tZW1jcHlfdG9pbyhhLGIsYykJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX21lbWNweV90b2lvIikKKworI2RlZmluZSBpc2FfZXRoX2lvX2NvcHlfYW5kX3N1bShhLGIsYyxkKSBcCisJCQkJX19yZWFkd3JpdGVfYnVnKCJpc2FfZXRoX2lvX2NvcHlfYW5kX3N1bSIpCisKKyNkZWZpbmUgaXNhX2NoZWNrX3NpZ25hdHVyZShpbyxzaWcsbGVuKQkoMCkKKworI2VuZGlmCS8qIF9fbWVtX2lzYSAqLworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0FTTV9BUk1fSU9fSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vbWVtb3J5LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IyYWZkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vbWVtb3J5LmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIE5vdGU6IHRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGJ5IG5vbi1hc20vLmggZmlsZXMKKyAqLworI2lmbmRlZiBfX0FTTV9BUk1fTUVNT1JZX0gKKyNkZWZpbmUgX19BU01fQVJNX01FTU9SWV9ICisKKyNpZiAwCS8qIFhYWCMjI1hYWCAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtb3J5Lmg+CisKKy8qCisgKiBQRk5zIGFyZSB1c2VkIHRvIGRlc2NyaWJlIGFueSBwaHlzaWNhbCBwYWdlOyB0aGlzIG1lYW5zCisgKiBQRk4gMCA9PSBwaHlzaWNhbCBhZGRyZXNzIDAuCisgKgorICogVGhpcyBpcyB0aGUgUEZOIG9mIHRoZSBmaXJzdCBSQU0gcGFnZSBpbiB0aGUga2VybmVsCisgKiBkaXJlY3QtbWFwcGVkIHZpZXcuICBXZSBhc3N1bWUgdGhpcyBpcyB0aGUgZmlyc3QgcGFnZQorICogb2YgUkFNIGluIHRoZSBtZW1fbWFwIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgUEhZU19QRk5fT0ZGU0VUCShQSFlTX09GRlNFVCA+PiBQQUdFX1NISUZUKQorCisvKgorICogVGhlc2UgYXJlICpvbmx5KiB2YWxpZCBvbiB0aGUga2VybmVsIGRpcmVjdCBtYXBwZWQgUkFNIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2lkICp4KQoreworCXJldHVybiBfX3ZpcnRfdG9fcGh5cygodW5zaWduZWQgbG9uZykoeCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnBoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIHgpCit7CisJcmV0dXJuICh2b2lkICopKF9fcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSh4KSkpOworfQorCisjZGVmaW5lIF9fcGEoeCkJCQlfX3ZpcnRfdG9fcGh5cygodW5zaWduZWQgbG9uZykoeCkpCisjZGVmaW5lIF9fdmEoeCkJCQkoKHZvaWQgKilfX3BoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykoeCkpKQorCisvKgorICogVmlydHVhbCA8LT4gRE1BIHZpZXcgbWVtb3J5IGFkZHJlc3MgdHJhbnNsYXRpb25zCisgKiBBZ2FpbiwgdGhlc2UgYXJlICpvbmx5KiB2YWxpZCBvbiB0aGUga2VybmVsIGRpcmVjdCBtYXBwZWQgUkFNCisgKiBtZW1vcnkuICBVc2Ugb2YgdGhlc2UgaXMgKmRlcHJlY2lhdGVkKi4KKyAqLworI2RlZmluZSB2aXJ0X3RvX2J1cyh4KQkJKF9fdmlydF90b19idXMoKHVuc2lnbmVkIGxvbmcpKHgpKSkKKyNkZWZpbmUgYnVzX3RvX3ZpcnQoeCkJCSgodm9pZCAqKShfX2J1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSh4KSkpKQorCisvKgorICogQ29udmVyc2lvbiBiZXR3ZWVuIGEgc3RydWN0IHBhZ2UgYW5kIGEgcGh5c2ljYWwgYWRkcmVzcy4KKyAqCisgKiBOb3RlOiB3aGVuIGNvbnZlcnRpbmcgYW4gdW5rbm93biBwaHlzaWNhbCBhZGRyZXNzIHRvIGEKKyAqIHN0cnVjdCBwYWdlLCB0aGUgcmVzdWx0aW5nIHBvaW50ZXIgbXVzdCBiZSB2YWxpZGF0ZWQKKyAqIHVzaW5nIFZBTElEX1BBR0UoKS4gIEl0IG11c3QgcmV0dXJuIGFuIGludmFsaWQgc3RydWN0IHBhZ2UKKyAqIGZvciBhbnkgcGh5c2ljYWwgYWRkcmVzcyBub3QgY29ycmVzcG9uZGluZyB0byBhIHN5c3RlbQorICogUkFNIGFkZHJlc3MuCisgKgorICogIHBhZ2VfdG9fcGZuKHBhZ2UpCWNvbnZlcnQgYSBzdHJ1Y3QgcGFnZSAqIHRvIGEgUEZOIG51bWJlcgorICogIHBmbl90b19wYWdlKHBmbikJY29udmVydCBhIF92YWxpZF8gUEZOIG51bWJlciB0byBzdHJ1Y3QgcGFnZSAqCisgKiAgcGZuX3ZhbGlkKHBmbikJaW5kaWNhdGVzIHdoZXRoZXIgYSBQRk4gbnVtYmVyIGlzIHZhbGlkCisgKgorICogIHZpcnRfdG9fcGFnZShrKQljb252ZXJ0IGEgX3ZhbGlkXyB2aXJ0dWFsIGFkZHJlc3MgdG8gc3RydWN0IHBhZ2UgKgorICogIHZpcnRfYWRkcl92YWxpZChrKQlpbmRpY2F0ZXMgd2hldGhlciBhIHZpcnR1YWwgYWRkcmVzcyBpcyB2YWxpZAorICovCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KKworI2RlZmluZSBwYWdlX3RvX3BmbihwYWdlKQkoKChwYWdlKSAtIG1lbV9tYXApICsgUEhZU19QRk5fT0ZGU0VUKQorI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pCSgobWVtX21hcCArIChwZm4pKSAtIFBIWVNfUEZOX09GRlNFVCkKKyNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgocGZuKSA+PSBQSFlTX1BGTl9PRkZTRVQgJiYgKHBmbikgPCAoUEhZU19QRk5fT0ZGU0VUICsgbWF4X21hcG5yKSkKKworI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCShwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKSkKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQkoKGthZGRyKSA+PSBQQUdFX09GRlNFVCAmJiAoa2FkZHIpIDwgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpCisKKyNkZWZpbmUgUEhZU19UT19OSUQoYWRkcikJKDApCisKKyNkZWZpbmUgVkFMSURfUEFHRShwYWdlKQkoKHBhZ2UgLSBtZW1fbWFwKSA8IG1heF9tYXBucikKKworI2Vsc2UKKworLyoKKyAqIFRoaXMgaXMgbW9yZSBjb21wbGV4LiAgV2UgaGF2ZSBhIHNldCBvZiBtZW1fbWFwIGFycmF5cyBzcHJlYWQKKyAqIGFyb3VuZCBpbiBtZW1vcnkuCisgKi8KKyNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJCQkJCVwKKwkoKChwYWdlKSAtIHBhZ2Vfem9uZShwYWdlKS0+em9uZV9tZW1fbWFwKQkJXAorCSAgKyAocGFnZV96b25lKHBhZ2UpLT56b25lX3N0YXJ0X3BhZGRyID4+IFBBR0VfU0hJRlQpKQorCisjZGVmaW5lIHBmbl90b19wYWdlKHBmbikJCQkJCVwKKwkoUEZOX1RPX01BUEJBU0UocGZuKSArIExPQ0FMX01BUF9OUigocGZuKSA8PCBQQUdFX1NISUZUKSkKKworI2RlZmluZSBwZm5fdmFsaWQocGZuKQkJCQkJCVwKKyAgKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgbm9kZSA9IFBGTl9UT19OSUQocGZuKTsJCQlcCisJc3RydWN0IHBnbGlzdF9kYXRhICpuZCA9IE5PREVfREFUQShub2RlKTsJCVwKKwkoKG5vZGUgPCBOUl9OT0RFUykgJiYJCQkJCVwKKwkgKChwZm4gLSAobmQtPm5vZGVfc3RhcnRfcGFkZHIgPj4gUEFHRV9TSElGVCkpIDwgbmQtPm5vZGVfc2l6ZSkpO1wKKyAgIH0pCisKKyNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQkJCQkJXAorCShBRERSX1RPX01BUEJBU0Uoa2FkZHIpICsgTE9DQUxfTUFQX05SKGthZGRyKSkKKworI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCShLVkFERFJfVE9fTklEKGthZGRyKSA8IE5SX05PREVTKQorCisvKgorICogQ29tbW9uIGRpc2NvbnRpZ21lbSBzdHVmZi4KKyAqICBQSFlTX1RPX05JRCBpcyB1c2VkIGJ5IHRoZSBBUk0ga2VybmVsL3NldHVwLmMKKyAqLworI2RlZmluZSBQSFlTX1RPX05JRChhZGRyKQlQRk5fVE9fTklEKChhZGRyKSA+PiBQQUdFX1NISUZUKQorCisvKgorICogMi40IGNvbXBhdGliaWxpdHkKKyAqCisgKiBWQUxJRF9QQUdFIHJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiBnaXZlbiBwYWdlIHBvaW50ZXIgaXMgdmFsaWQuCisgKiBUaGlzIGFzc3VtZXMgYWxsIG5vZGUncyBtZW1fbWFwcyBhcmUgc3RvcmVkIHdpdGhpbiB0aGUgbm9kZSB0aGV5CisgKiByZWZlciB0by4gIFRoaXMgaXMgYWN0dWFsbHkgaW5oZXJlbnRseSBidWdneS4KKyAqLworI2RlZmluZSBWQUxJRF9QQUdFKHBhZ2UpIFwKKyh7IHVuc2lnbmVkIGludCBub2RlID0gS1ZBRERSX1RPX05JRChwYWdlKTsgXAorICAgKChub2RlIDwgTlJfTk9ERVMpICYmIFwKKyAgICAgKCh1bnNpZ25lZCkoKHBhZ2UpIC0gTk9ERV9NRU1fTUFQKG5vZGUpKSA8IE5PREVfREFUQShub2RlKS0+bm9kZV9zaXplKSk7IFwKK30pCisKKyNlbmRpZgorCisvKgorICogV2Ugc2hvdWxkIHJlYWxseSBlbGltaW5hdGUgdmlydF90b19idXMoKSBoZXJlIC0gaXQncyBkZXByZWNpYXRlZC4KKyAqLworI2RlZmluZSBwYWdlX3RvX2J1cyhwYWdlKQkodmlydF90b19idXMocGFnZV9hZGRyZXNzKHBhZ2UpKSkKKworI2VuZGlmCS8qIFhYWCMjI1hYWCAqLworCisjZW5kaWYJLyogX19BU01fQVJNX01FTU9SWV9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEyNDg2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9wb3NpeF90eXBlcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDI3LTA2LTE5OTYJUk1LCUNyZWF0ZWQKKyAqLworI2lmbmRlZiBfX0FSQ0hfQVJNX1BPU0lYX1RZUEVTX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9QT1NJWF9UWVBFU19ICisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KKyAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKKyAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9kZXZfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJX19rZXJuZWxfaW5vX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQkJX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGludAkJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfaXBjX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludAkJCV9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGludAkJCV9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZwkJCV9fa2VybmVsX3RpbWVfdDsKK3R5cGVkZWYgbG9uZwkJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQkJX19rZXJuZWxfZGFkZHJfdDsKK3R5cGVkZWYgY2hhciAqCQkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF9naWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCV9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfb2xkX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfb2xkX2dpZF90OworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nCQlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCisJaW50CXZhbFsyXTsKKyNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KKwlpbnQJX192YWxbMl07CisjZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLworfSBfX2tlcm5lbF9mc2lkX3Q7CisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisKKyN1bmRlZglfX0ZEX1NFVAorI2RlZmluZSBfX0ZEX1NFVChmZCwgZmRzZXRwKSBcCisJCSgoKGZkX3NldCAqKWZkc2V0cCktPmZkc19iaXRzW2ZkID4+IDVdIHw9ICgxPDwoZmQgJiAzMSkpKQorCisjdW5kZWYJX19GRF9DTFIKKyNkZWZpbmUgX19GRF9DTFIoZmQsIGZkc2V0cCkgXAorCQkoKChmZF9zZXQgKilmZHNldHApLT5mZHNfYml0c1tmZCA+PiA1XSAmPSB+KDE8PChmZCAmIDMxKSkpCisKKyN1bmRlZglfX0ZEX0lTU0VUCisjZGVmaW5lIF9fRkRfSVNTRVQoZmQsIGZkc2V0cCkgXAorCQkoKCgoZmRfc2V0ICopZmRzZXRwKS0+ZmRzX2JpdHNbZmQgPj4gNV0gJiAoMTw8KGZkICYgMzEpKSkgIT0gMCkKKworI3VuZGVmCV9fRkRfWkVSTworI2RlZmluZSBfX0ZEX1pFUk8oZmRzZXRwKSBcCisJCShtZW1zZXQgKGZkc2V0cCwgMCwgc2l6ZW9mICgqKGZkX3NldCAqKWZkc2V0cCkpKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9zZXR1cC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRmNGRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS9zZXR1cC5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFN0cnVjdHVyZSBwYXNzZWQgdG8ga2VybmVsIHRvIHRlbGwgaXQgYWJvdXQgdGhlCisgKiAgaGFyZHdhcmUgaXQncyBydW5uaW5nIG9uLiAgU2VlIGxpbnV4L0RvY3VtZW50YXRpb24vYXJtL1NldHVwCisgKiAgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBOT1RFOgorICogIFRoaXMgZmlsZSBjb250YWlucyB0d28gd2F5cyB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIGJvb3QKKyAqICBsb2FkZXIgdG8gdGhlIGtlcm5lbC4gVGhlIG9sZCBzdHJ1Y3QgcGFyYW1fc3RydWN0IGlzIGRlcHJlY2F0ZWQsCisgKiAgYnV0IGl0IHdpbGwgYmUga2VwdCBpbiB0aGUga2VybmVsIGZvciA1IHllYXJzIGZyb20gbm93CisgKiAgKDIwMDEpLiBUaGlzIHdpbGwgYWxsb3cgYm9vdCBsb2FkZXJzIHRvIGNvbnZlcnQgdG8gdGhlIG5ldyBzdHJ1Y3QKKyAqICB0YWcgd2F5LgorICovCisjaWZuZGVmIF9fQVNNQVJNX1NFVFVQX0gKKyNkZWZpbmUgX19BU01BUk1fU0VUVVBfSAorCisvKgorICogVXNhZ2U6CisgKiAgLSBkbyBub3QgZ28gYmxpbmRseSBhZGRpbmcgZmllbGRzLCBhZGQgdGhlbSBhdCB0aGUgZW5kCisgKiAgLSB3aGVuIGFkZGluZyBmaWVsZHMsIGRvbid0IHJlbHkgb24gdGhlIGFkZHJlc3MgdW50aWwKKyAqICAgIGEgcGF0Y2ggZnJvbSBtZSBoYXMgYmVlbiByZWxlYXNlZAorICogIC0gdW51c2VkIGZpZWxkcyBzaG91bGQgYmUgemVybyAoZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKiAgLSB0aGlzIHN0cnVjdHVyZSBpcyByZWxhdGl2ZWx5IHNob3J0LWxpdmVkIC0gb25seQorICogICAgZ3VhcmFudGVlZCB0byBjb250YWluIHVzZWZ1bCBkYXRhIGluIHNldHVwX2FyY2goKQorICovCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDEwMjQKKworLyogVGhpcyBpcyB0aGUgb2xkIGRlcHJlY2F0ZWQgd2F5IHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUga2VybmVsICovCitzdHJ1Y3QgcGFyYW1fc3RydWN0IHsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CQkvKiAgMCAqLworCSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwkJLyogIDQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyByYW1kaXNrX3NpemU7CQkvKiAgOCAqLworCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogMTIgKi8KKyNkZWZpbmUgRkxBR19SRUFET05MWQkxCisjZGVmaW5lIEZMQUdfUkRMT0FECTQKKyNkZWZpbmUgRkxBR19SRFBST01QVAk4CisJICAgIHVuc2lnbmVkIGxvbmcgcm9vdGRldjsJCS8qIDE2ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX2NvbHM7CS8qIDIwICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX3Jvd3M7CS8qIDI0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feDsJCS8qIDI4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feTsJCS8qIDMyICovCisJICAgIHVuc2lnbmVkIGxvbmcgbWVtY19jb250cm9sX3JlZzsJLyogMzYgKi8KKwkgICAgdW5zaWduZWQgY2hhciBzb3VuZGRlZmF1bHQ7CQkvKiA0MCAqLworCSAgICB1bnNpZ25lZCBjaGFyIGFkZnNkcml2ZXM7CQkvKiA0MSAqLworCSAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX2g7CS8qIDQyICovCisJICAgIHVuc2lnbmVkIGNoYXIgYnl0ZXNfcGVyX2NoYXJfdjsJLyogNDMgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlc19pbl9iYW5rWzRdOwkvKiA0NCAqLworCSAgICB1bnNpZ25lZCBsb25nIHBhZ2VzX2luX3ZyYW07CS8qIDYwICovCisJICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0OwkJLyogNjQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZTsJCS8qIDY4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgcmRfc3RhcnQ7CQkvKiA3MiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9yZXY7CQkvKiA3NiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfbG93OwkvKiA4MCAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfaGlnaDsJLyogODQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBtZW1fZmNsa18yMTI4NTsgICAgICAgLyogODggKi8KKwl9IHM7CisJY2hhciB1bnVzZWRbMjU2XTsKKyAgICB9IHUxOworICAgIHVuaW9uIHsKKwljaGFyIHBhdGhzWzhdWzEyOF07CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBtYWdpYzsKKwkgICAgY2hhciBuWzEwMjQgLSBzaXplb2YodW5zaWduZWQgbG9uZyldOworCX0gczsKKyAgICB9IHUyOworICAgIGNoYXIgY29tbWFuZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworfTsKKworCisvKgorICogVGhlIG5ldyB3YXkgb2YgcGFzc2luZyBpbmZvcm1hdGlvbjogYSBsaXN0IG9mIHRhZ2dlZCBlbnRyaWVzCisgKi8KKworLyogVGhlIGxpc3QgZW5kcyB3aXRoIGFuIEFUQUdfTk9ORSBub2RlLiAqLworI2RlZmluZSBBVEFHX05PTkUJMHgwMDAwMDAwMAorCitzdHJ1Y3QgdGFnX2hlYWRlciB7CisJdTMyIHNpemU7CisJdTMyIHRhZzsKK307CisKKy8qIFRoZSBsaXN0IG11c3Qgc3RhcnQgd2l0aCBhbiBBVEFHX0NPUkUgbm9kZSAqLworI2RlZmluZSBBVEFHX0NPUkUJMHg1NDQxMDAwMQorCitzdHJ1Y3QgdGFnX2NvcmUgeworCXUzMiBmbGFnczsJCS8qIGJpdCAwID0gcmVhZC1vbmx5ICovCisJdTMyIHBhZ2VzaXplOworCXUzMiByb290ZGV2OworfTsKKworLyogaXQgaXMgYWxsb3dlZCB0byBoYXZlIG11bHRpcGxlIEFUQUdfTUVNIG5vZGVzICovCisjZGVmaW5lIEFUQUdfTUVNCTB4NTQ0MTAwMDIKKworc3RydWN0IHRhZ19tZW0zMiB7CisJdTMyCXNpemU7CisJdTMyCXN0YXJ0OwkvKiBwaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCit9OworCisvKiBWR0EgdGV4dCB0eXBlIGRpc3BsYXlzICovCisjZGVmaW5lIEFUQUdfVklERU9URVhUCTB4NTQ0MTAwMDMKKworc3RydWN0IHRhZ192aWRlb3RleHQgeworCXU4CQl4OworCXU4CQl5OworCXUxNgkJdmlkZW9fcGFnZTsKKwl1OAkJdmlkZW9fbW9kZTsKKwl1OAkJdmlkZW9fY29sczsKKwl1MTYJCXZpZGVvX2VnYV9ieDsKKwl1OAkJdmlkZW9fbGluZXM7CisJdTgJCXZpZGVvX2lzdmdhOworCXUxNgkJdmlkZW9fcG9pbnRzOworfTsKKworLyogZGVzY3JpYmVzIGhvdyB0aGUgcmFtZGlzayB3aWxsIGJlIHVzZWQgaW4ga2VybmVsICovCisjZGVmaW5lIEFUQUdfUkFNRElTSwkweDU0NDEwMDA0CisKK3N0cnVjdCB0YWdfcmFtZGlzayB7CisJdTMyIGZsYWdzOwkvKiBiaXQgMCA9IGxvYWQsIGJpdCAxID0gcHJvbXB0ICovCisJdTMyIHNpemU7CS8qIGRlY29tcHJlc3NlZCByYW1kaXNrIHNpemUgaW4gX2tpbG9fIGJ5dGVzICovCisJdTMyIHN0YXJ0OwkvKiBzdGFydGluZyBibG9jayBvZiBmbG9wcHktYmFzZWQgUkFNIGRpc2sgaW1hZ2UgKi8KK307CisKKy8qIGRlc2NyaWJlcyB3aGVyZSB0aGUgY29tcHJlc3NlZCByYW1kaXNrIGltYWdlIGxpdmVzICh2aXJ0dWFsIGFkZHJlc3MpICovCisvKgorICogdGhpcyBvbmUgYWNjaWRlbnRhbGx5IHVzZWQgdmlydHVhbCBhZGRyZXNzZXMgLSBhcyBzdWNoLAorICogaXRzIGRlcHJlY2lhdGVkLgorICovCisjZGVmaW5lIEFUQUdfSU5JVFJECTB4NTQ0MTAwMDUKKworLyogZGVzY3JpYmVzIHdoZXJlIHRoZSBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgbGl2ZXMgKHBoeXNpY2FsIGFkZHJlc3MpICovCisjZGVmaW5lIEFUQUdfSU5JVFJEMgkweDU0NDIwMDA1CisKK3N0cnVjdCB0YWdfaW5pdHJkIHsKKwl1MzIgc3RhcnQ7CS8qIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3MgKi8KKwl1MzIgc2l6ZTsJLyogc2l6ZSBvZiBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgaW4gYnl0ZXMgKi8KK307CisKKy8qIGJvYXJkIHNlcmlhbCBudW1iZXIuICI2NCBiaXRzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGV2ZXJ5Ym9keSIgKi8KKyNkZWZpbmUgQVRBR19TRVJJQUwJMHg1NDQxMDAwNgorCitzdHJ1Y3QgdGFnX3NlcmlhbG5yIHsKKwl1MzIgbG93OworCXUzMiBoaWdoOworfTsKKworLyogYm9hcmQgcmV2aXNpb24gKi8KKyNkZWZpbmUgQVRBR19SRVZJU0lPTgkweDU0NDEwMDA3CisKK3N0cnVjdCB0YWdfcmV2aXNpb24geworCXUzMiByZXY7Cit9OworCisvKiBpbml0aWFsIHZhbHVlcyBmb3IgdmVzYWZiLXR5cGUgZnJhbWVidWZmZXJzLiBzZWUgc3RydWN0IHNjcmVlbl9pbmZvCisgKiBpbiBpbmNsdWRlL2xpbnV4L3R0eS5oCisgKi8KKyNkZWZpbmUgQVRBR19WSURFT0xGQgkweDU0NDEwMDA4CisKK3N0cnVjdCB0YWdfdmlkZW9sZmIgeworCXUxNgkJbGZiX3dpZHRoOworCXUxNgkJbGZiX2hlaWdodDsKKwl1MTYJCWxmYl9kZXB0aDsKKwl1MTYJCWxmYl9saW5lbGVuZ3RoOworCXUzMgkJbGZiX2Jhc2U7CisJdTMyCQlsZmJfc2l6ZTsKKwl1OAkJcmVkX3NpemU7CisJdTgJCXJlZF9wb3M7CisJdTgJCWdyZWVuX3NpemU7CisJdTgJCWdyZWVuX3BvczsKKwl1OAkJYmx1ZV9zaXplOworCXU4CQlibHVlX3BvczsKKwl1OAkJcnN2ZF9zaXplOworCXU4CQlyc3ZkX3BvczsKK307CisKKy8qIGNvbW1hbmQgbGluZTogXDAgdGVybWluYXRlZCBzdHJpbmcgKi8KKyNkZWZpbmUgQVRBR19DTURMSU5FCTB4NTQ0MTAwMDkKKworc3RydWN0IHRhZ19jbWRsaW5lIHsKKwljaGFyCWNtZGxpbmVbMV07CS8qIHRoaXMgaXMgdGhlIG1pbmltdW0gc2l6ZSAqLworfTsKKworLyogYWNvcm4gUmlzY1BDIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFUQUdfQUNPUk4JMHg0MTAwMDEwMQorCitzdHJ1Y3QgdGFnX2Fjb3JuIHsKKwl1MzIgbWVtY19jb250cm9sX3JlZzsKKwl1MzIgdnJhbV9wYWdlczsKKwl1OCBzb3VuZGRlZmF1bHQ7CisJdTggYWRmc2RyaXZlczsKK307CisKKy8qIGZvb3RicmlkZ2UgbWVtb3J5IGNsb2NrLCBzZWUgYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2FyY2guYyAqLworI2RlZmluZSBBVEFHX01FTUNMSwkweDQxMDAwNDAyCisKK3N0cnVjdCB0YWdfbWVtY2xrIHsKKwl1MzIgZm1lbWNsazsKK307CisKK3N0cnVjdCB0YWcgeworCXN0cnVjdCB0YWdfaGVhZGVyIGhkcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB0YWdfY29yZQkJY29yZTsKKwkJc3RydWN0IHRhZ19tZW0zMgltZW07CisJCXN0cnVjdCB0YWdfdmlkZW90ZXh0CXZpZGVvdGV4dDsKKwkJc3RydWN0IHRhZ19yYW1kaXNrCXJhbWRpc2s7CisJCXN0cnVjdCB0YWdfaW5pdHJkCWluaXRyZDsKKwkJc3RydWN0IHRhZ19zZXJpYWxucglzZXJpYWxucjsKKwkJc3RydWN0IHRhZ19yZXZpc2lvbglyZXZpc2lvbjsKKwkJc3RydWN0IHRhZ192aWRlb2xmYgl2aWRlb2xmYjsKKwkJc3RydWN0IHRhZ19jbWRsaW5lCWNtZGxpbmU7CisKKwkJLyoKKwkJICogQWNvcm4gc3BlY2lmaWMKKwkJICovCisJCXN0cnVjdCB0YWdfYWNvcm4JYWNvcm47CisKKwkJLyoKKwkJICogREMyMTI4NSBzcGVjaWZpYworCQkgKi8KKwkJc3RydWN0IHRhZ19tZW1jbGsJbWVtY2xrOworCX0gdTsKK307CisKK3N0cnVjdCB0YWd0YWJsZSB7CisJdTMyIHRhZzsKKwlpbnQgKCpwYXJzZSkoY29uc3Qgc3RydWN0IHRhZyAqKTsKK307CisKKyNkZWZpbmUgX190YWcgX19hdHRyaWJ1dGVfXygodW51c2VkLCBfX3NlY3Rpb25fXygiLnRhZ2xpc3QiKSkpCisjZGVmaW5lIF9fdGFndGFibGUodGFnLCBmbikgXAorc3RhdGljIHN0cnVjdCB0YWd0YWJsZSBfX3RhZ3RhYmxlXyMjZm4gX190YWcgPSB7IHRhZywgZm4gfQorCisjZGVmaW5lIHRhZ19tZW1iZXJfcHJlc2VudCh0YWcsbWVtYmVyKQkJCQlcCisJKCh1bnNpZ25lZCBsb25nKSgmKChzdHJ1Y3QgdGFnICopMEwpLT5tZW1iZXIgKyAxKQlcCisJCTw9ICh0YWcpLT5oZHIuc2l6ZSAqIDQpCisKKyNkZWZpbmUgdGFnX25leHQodCkJKChzdHJ1Y3QgdGFnICopKCh1MzIgKikodCkgKyAodCktPmhkci5zaXplKSkKKyNkZWZpbmUgdGFnX3NpemUodHlwZSkJKChzaXplb2Yoc3RydWN0IHRhZ19oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCB0eXBlKSkgPj4gMikKKworI2RlZmluZSBmb3JfZWFjaF90YWcodCxiYXNlKQkJXAorCWZvciAodCA9IGJhc2U7IHQtPmhkci5zaXplOyB0ID0gdGFnX25leHQodCkpCisKKy8qCisgKiBNZW1vcnkgbWFwIGRlc2NyaXB0aW9uCisgKi8KKyNkZWZpbmUgTlJfQkFOS1MgOAorCitzdHJ1Y3QgbWVtaW5mbyB7CisJaW50IG5yX2JhbmtzOworCXVuc2lnbmVkIGxvbmcgZW5kOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJaW50ICAgICAgICAgICBub2RlOworCX0gYmFua1tOUl9CQU5LU107Cit9OworCitleHRlcm4gc3RydWN0IG1lbWluZm8gbWVtaW5mbzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9zaXplcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ5MmNhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2l6ZXMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKiBETyBOT1QgRURJVCEhIC0gdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgZnJvbSAucyBmaWxlIGJ5IGF3ayAtZiBzMmguYXdrCisgKi8KKy8qICBTaXplIGRlZmludGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIEFSTSBMaW1pdGVkIDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX3NpemVzX2gKKyNkZWZpbmUgX19zaXplc19oICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIGhhbmR5IHNpemVzICovCisjZGVmaW5lIFNaXzFLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBTWl80SyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU1pfOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFNaXzE2SyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTWl82NEsgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU1pfMTI4SyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFNaXzI1NksgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBTWl81MTJLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKworI2RlZmluZSBTWl8xTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgU1pfMk0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNaXzRNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBTWl84TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgU1pfMTZNICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIFNaXzMyTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBTWl82NE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgU1pfMTI4TSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIFNaXzI1Nk0gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBTWl81MTJNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKworI2RlZmluZSBTWl8xRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgU1pfMkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNlbmRpZgorCisvKiAgICAgICAgIEVORCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vc3RyaW5nLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2VhNTgyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc3RyaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfX0FTTV9BUk1fU1RSSU5HX0gKKyNkZWZpbmUgX19BU01fQVJNX1NUUklOR19ICisKKy8qCisgKiBXZSBkb24ndCBkbyBpbmxpbmUgc3RyaW5nIGZ1bmN0aW9ucywgc2luY2UgdGhlCisgKiBvcHRpbWlzZWQgaW5saW5lIGFzbSB2ZXJzaW9ucyBhcmUgbm90IHNtYWxsLgorICovCisKKyN1bmRlZiBfX0hBVkVfQVJDSF9TVFJSQ0hSCitleHRlcm4gY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX01FTUNQWQorZXh0ZXJuIHZvaWQgKiBtZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gdm9pZCAqIG1lbW1vdmUodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1DSFIKK2V4dGVybiB2b2lkICogbWVtY2hyKGNvbnN0IHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNWkVSTworI3VuZGVmIF9fSEFWRV9BUkNIX01FTVNFVAorZXh0ZXJuIHZvaWQgKiBtZW1zZXQodm9pZCAqLCBpbnQsIF9fa2VybmVsX3NpemVfdCk7CisKKyNpZiAwCitleHRlcm4gdm9pZCBfX21lbXplcm8odm9pZCAqcHRyLCBfX2tlcm5lbF9zaXplX3Qgbik7CisKKyNkZWZpbmUgbWVtc2V0KHAsdixuKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJaWYgKChuKSAhPSAwKSB7CQkJCQkJXAorCQkJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKCh2KSkgJiYgKHYpID09IDApCVwKKwkJCQlfX21lbXplcm8oKHApLChuKSk7CQkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQltZW1zZXQoKHApLCh2KSwobikpOwkJCVwKKwkJfQkJCQkJCQlcCisJCShwKTsJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgbWVtemVybyhwLG4pICh7IGlmICgobikgIT0gMCkgX19tZW16ZXJvKChwKSwobikpOyAocCk7IH0pCisjZWxzZQorZXh0ZXJuIHZvaWQgbWVtemVybyh2b2lkICpwdHIsIF9fa2VybmVsX3NpemVfdCBuKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzk5MjMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX19BU01fQVJNX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fQVJNX1RZUEVTX0gKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bW9kZV90OworCisvKgorICogX194eCBpcyBvazogaXQgZG9lc24ndCBwb2xsdXRlIHRoZSBQT1NJWCBuYW1lc3BhY2UuIFVzZSB0aGVzZSBpbiB0aGUKKyAqIGhlYWRlciBmaWxlcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBsb25nIF9fczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZW4ndCBleHBvcnRlZCBvdXRzaWRlIHRoZSBrZXJuZWwgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzCisgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OworCit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKKworLyogRG1hIGFkZHJlc3NlcyBhcmUgMzItYml0cyB3aWRlLiAgKi8KKwordHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfc2l6ZV90OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWYyNjhlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20veC1sb2FkLWFybS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9YX0xPQURfQVJNX0hfCisjZGVmaW5lIF9YX0xPQURfQVJNX0hfCTEKKworLyogZm9yIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLCBzZWUgc3RhcnQuUyAqLworZXh0ZXJuIHVsb25nIF9hcm1ib290X3N0YXJ0OwkvKiBjb2RlIHN0YXJ0ICovCitleHRlcm4gdWxvbmcgX2Jzc19zdGFydDsJLyogY29kZSArIGRhdGEgZW5kID09IEJTUyBzdGFydCAqLworZXh0ZXJuIHVsb25nIF9ic3NfZW5kOwkJLyogQlNTIGVuZCAqLworICAgCisjZW5kaWYJLyogX1hfTE9BRF9BUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYmNkLmggYi94LWxvYWRlci9pbmNsdWRlL2JjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNGFhOWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2JjZC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlCisgKiBpbiB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyIG9yIGxhdGVyLAorICogYXQgeW91ciBvcHRpb24uCisgKi8KKworLyogaW5saW5lIGZ1bmN0aW9ucyB0byB0cmFuc2xhdGUgdG8vZnJvbSBiaW5hcnkgYW5kIGJpbmFyeS1jb2RlZCBkZWNpbWFsCisgKiAoZnJlcXVlbnRseSBmb3VuZCBpbiBSVEMgY2hpcHMpLgorICovCisKKyNpZm5kZWYgX0JDRF9ICisjZGVmaW5lIF9CQ0RfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmNkMmJpbih1OCB2YWwpCit7CisJcmV0dXJuICgodmFsKSAmIDB4MGYpICsgKCh2YWwpID4+IDQpICogMTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYmluMmJjZCAodW5zaWduZWQgaW50IHZhbCkKK3sKKwlyZXR1cm4gKCgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKSk7Cit9CisKKyNlbmRpZiAvKiBfQkNEX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYm9vdG0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYm9vdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkMjU5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9ib290bS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgR3JhbnQgRXJpY2tzb24gPG1hcmF0aG9uOTZAZ21haWwuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfX0JPT1RNX0hfXworI2RlZmluZQlfX0JPT1RNX0hfXworCisjaW5jbHVkZSAiY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGltYWdlLmg+CisKKyNkZWZpbmUgQk9PVE1fU1RBVFVTX0ZBSUxVUkUgMAorI2RlZmluZSBCT09UTV9TVEFUVVNfU1VDQ0VTUyAxCisKKyNkZWZpbmUgQk9PVE1fSU5ERVhfU1RBUlQgIDAKKyNkZWZpbmUgQk9PVE1fSU5ERVhfU1RPUCAgLTEKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdF9leHRlbnQgeworCXVsb25nIHN0YXJ0OworCXVsb25nIHNpemU7Cit9IGJvb3RfZXh0ZW50X3Q7CisKK3R5cGVkZWYgaW50ICgqZGV2aWNlX2xvYWQpKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJvb3RtX2xvYWRfc3VjY2Vzc2Z1bChpbnQgc3RhdHVzKQoreworCXJldHVybiAoc3RhdHVzID09IEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm9vdG1fbG9hZF9jb250aW51ZShpbnQgc3RhdHVzLCBpbnQgaW5kZXgpCit7CisJcmV0dXJuICgoc3RhdHVzICE9IEJPT1RNX1NUQVRVU19TVUNDRVNTKSAmJiAoaW5kZXggIT0gQk9PVE1fSU5ERVhfU1RPUCkpOworfQorCitleHRlcm4gaW50IGJvb3RtKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcik7CitleHRlcm4gaW50IGJvb3RtX2JpbmFyeShjb25zdCB1aW50OF90ICpidWZmZXIpOworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorZXh0ZXJuIGludCBib290bV9pbWFnZShjb25zdCBpbWFnZV9oZWFkZXJfdCAqaW1hZ2UpOworI2VuZGlmCisKKyNlbmRpZgkvKiBfX0JPT1RNX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21tYW5kLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkzNmFkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb21tYW5kLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqICBEZWZpbml0aW9ucyBmb3IgQ29tbWFuZCBQcm9jZXNzb3IKKyAqLworI2lmbmRlZiBfX0NPTU1BTkRfSAorI2RlZmluZSBfX0NPTU1BTkRfSAorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTAkwCisjZW5kaWYKKworI2lmbmRlZglfX0FTU0VNQkxZX18KKy8qCisgKiBNb25pdG9yIENvbW1hbmQgVGFibGUKKyAqLworCitzdHJ1Y3QgY21kX3RibF9zIHsKKwljaGFyCQkqbmFtZTsJCS8qIENvbW1hbmQgTmFtZQkJCSovCisJaW50CQltYXhhcmdzOwkvKiBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMJKi8KKwlpbnQJCXJlcGVhdGFibGU7CS8qIGF1dG9yZXBlYXQgYWxsb3dlZD8JCSovCisJCQkJCS8qIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9uCSovCisJaW50CQkoKmNtZCkoc3RydWN0IGNtZF90YmxfcyAqLCBpbnQsIGludCwgY2hhciAqW10pOworCWNoYXIJCSp1c2FnZTsJCS8qIFVzYWdlIG1lc3NhZ2UJKHNob3J0KQkqLworI2lmZGVmCUNGR19MT05HSEVMUAorCWNoYXIJCSpoZWxwOwkJLyogSGVscCAgbWVzc2FnZQkobG9uZykJKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVVRPX0NPTVBMRVRFCisJLyogZG8gYXV0byBjb21wbGV0aW9uIG9uIHRoZSBhcmd1bWVudHMgKi8KKwlpbnQJCSgqY29tcGxldGUpKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgbGFzdF9jaGFyLCBpbnQgbWF4diwgY2hhciAqY21kdltdKTsKKyNlbmRpZgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgY21kX3RibF9zCWNtZF90YmxfdDsKKworZXh0ZXJuIGNtZF90YmxfdCAgX191X2Jvb3RfY21kX3N0YXJ0OworZXh0ZXJuIGNtZF90YmxfdCAgX191X2Jvb3RfY21kX2VuZDsKKworCisvKiBjb21tb24vY29tbWFuZC5jICovCitjbWRfdGJsX3QgKmZpbmRfY21kKGNvbnN0IGNoYXIgKmNtZCk7CisKKyNpZmRlZiBDT05GSUdfQVVUT19DT01QTEVURQorZXh0ZXJuIHZvaWQgaW5zdGFsbF9hdXRvX2NvbXBsZXRlKHZvaWQpOworZXh0ZXJuIGludCBjbWRfYXV0b19jb21wbGV0ZShjb25zdCBjaGFyICpjb25zdCBwcm9tcHQsIGNoYXIgKmJ1ZiwgaW50ICpucCwgaW50ICpjb2xwKTsKKyNlbmRpZgorCisvKgorICogTW9uaXRvciBDb21tYW5kCisgKgorICogQWxsIGNvbW1hbmRzIHVzZSBhIGNvbW1vbiBhcmd1bWVudCBmb3JtYXQ6CisgKgorICogdm9pZCBmdW5jdGlvbiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworICovCisKK3R5cGVkZWYJdm9pZCAJY29tbWFuZF90IChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisvKgorICogQ29tbWFuZCBGbGFnczoKKyAqLworI2RlZmluZSBDTURfRkxBR19SRVBFQVQJCTB4MDAwMQkvKiByZXBlYXQgbGFzdCBjb21tYW5kCQkqLworI2RlZmluZSBDTURfRkxBR19CT09URAkJMHgwMDAyCS8qIGNvbW1hbmQgaXMgZnJvbSBib290ZAkqLworCisvKgorICogQ29uZmlndXJhYmxlIG1vbml0b3IgY29tbWFuZHMgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1vdmVkCisgKiB0byBpbmNsdWRlL2NtZF9jb25mZGVmcy5oCisgKi8KKworCisjZGVmaW5lIFN0cnVjdF9TZWN0aW9uICBfX2F0dHJpYnV0ZV9fICgodW51c2VkLHNlY3Rpb24gKCIudV9ib290X2NtZCIpKSkKKworI2lmZGVmICBDRkdfTE9OR0hFTFAKKworI2RlZmluZSBVX0JPT1RfQ01EKG5hbWUsbWF4YXJncyxyZXAsY21kLHVzYWdlLGhlbHApIFwKK2NtZF90YmxfdCBfX3VfYm9vdF9jbWRfIyNuYW1lIFN0cnVjdF9TZWN0aW9uID0geyNuYW1lLCBtYXhhcmdzLCByZXAsIGNtZCwgdXNhZ2UsIGhlbHB9CisKKyNlbHNlCS8qIG5vIGxvbmcgaGVscCBpbmZvICovCisKKyNkZWZpbmUgVV9CT09UX0NNRChuYW1lLG1heGFyZ3MscmVwLGNtZCx1c2FnZSxoZWxwKSBcCitjbWRfdGJsX3QgX191X2Jvb3RfY21kXyMjbmFtZSBTdHJ1Y3RfU2VjdGlvbiA9IHsjbmFtZSwgbWF4YXJncywgcmVwLCBjbWQsIHVzYWdlfQorCisjZW5kaWYJLyogQ0ZHX0xPTkdIRUxQICovCisKKyNlbmRpZgkvKiBfX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21tb24uaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxOGFjOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbW9uLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDkKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTU1PTl9IXworI2RlZmluZSBfX0NPTU1PTl9IXwkxCisKKyN1bmRlZglfTElOVVhfQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUJKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18JCS8qIHB1dCBDIG9ubHkgc3R1ZmYgaW4gdGhpcyBzZWN0aW9uICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWNoYXI7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJdnVfbG9uZzsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgdnVfc2hvcnQ7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJdnVfY2hhcjsKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBDT05GSUdfQVJNCisjZGVmaW5lIGFzbWxpbmthZ2UJLyogbm90aGluZyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJNCisjIGluY2x1ZGUgPGFzbS9zZXR1cC5oPgorIyBpbmNsdWRlIDxhc20veC1sb2FkLWFybS5oPgkvKiBBUk0gdmVyc2lvbiB0byBiZSBmaXhlZCEgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJNICovCisKKyNpZmRlZglDRkdfUFJJTlRGCisjZGVmaW5lIHByaW50ZihmbXQsYXJncy4uLikJc2VyaWFsX3ByaW50ZiAoZm10ICwjI2FyZ3MpCisjZGVmaW5lIGdldGMoKSBzZXJpYWxfZ2V0YygpCisjZWxzZQorI2RlZmluZSBwcmludGYoZm10LGFyZ3MuLi4pCisjZGVmaW5lIGdldGMoKSAnICcKKyNlbmRpZgkvKiBDRkdfUFJJTlRGICovCisKKyNkZWZpbmUgRFVNUF9SRUcodGFnLCByZWcsIHR5cGUsIG9wLCBmb3JtYXQpIGRvIHsJCQlcCisgICAgICAgIHJlZ2lzdGVyIHUzMiBfcmVndmFyID0gcmVnOwkJCQkJCQlcCisJCXJlZ2lzdGVyIHR5cGUgX2RhdGF2YXIgPSBvcChfcmVndmFyKTsJCQkJXAorICAgICAgICBwcmludGYoIiAgICAlLTMwcyBAIDB4JTA4eCA9ICIgI2Zvcm1hdCAiXG4iLAkJXAorCQkJICAgdGFnLCBfcmVndmFyLCBfZGF0YXZhcik7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEVU1QX1JFR0IobW5lbW9uaWMpCQkJCQkJCQkJXAorCURVTVBfUkVHKCNtbmVtb25pYywgbW5lbW9uaWMsIHU4LCBfX3Jhd19yZWFkYiwgMHglMDJ4KQorCisjZGVmaW5lIERVTVBfUkVHVyhtbmVtb25pYykJCQkJCQkJCQlcCisJRFVNUF9SRUcoI21uZW1vbmljLCBtbmVtb25pYywgdTE2LCBfX3Jhd19yZWFkdywgMHglMDR4KQorCisjZGVmaW5lIERVTVBfUkVHTChtbmVtb25pYykJCQkJCQkJCQlcCisJRFVNUF9SRUcoI21uZW1vbmljLCBtbmVtb25pYywgdTMyLCBfX3Jhd19yZWFkbCwgMHglMDh4KQorCisjaWZkZWYJREVCVUcKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZGVmaW5lIGRlYnVnWChsZXZlbCxmbXQsYXJncy4uLikgaWYgKERFQlVHPj1sZXZlbCkgcHJpbnRmKGZtdCwjI2FyZ3MpOworI2Vsc2UKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCisjZGVmaW5lIGRlYnVnWChsZXZlbCxmbXQsYXJncy4uLikKKyNlbmRpZgkvKiBERUJVRyAqLworCisjZGVmaW5lIGVycm9yKGZtdCwgYXJncy4uLikgZG8gewkJCQkJXAorCQlwcmludGYoIkVSUk9SOiAiIGZtdCAiXG5hdCAlczolZC8lcygpXG4iLAkJXAorCQkJIyNhcmdzLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNpZm5kZWYgQlVHCisjZGVmaW5lIEJVRygpIGRvIHsgXAorCXByaW50ZigiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IFwKKwlwYW5pYygiQlVHISIpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIEJVRygpOyB9IHdoaWxlKDApCisjZW5kaWYgLyogQlVHICovCisKKy8qCisgKiBHZW5lcmFsIFB1cnBvc2UgVXRpbGl0aWVzCisgKi8KKyNkZWZpbmUgbWluKFgsIFkpCQkJCVwKKwkoeyB0eXBlb2YgKFgpIF9feCA9IChYKSwgX195ID0gKFkpOwlcCisJCShfX3ggPCBfX3kpID8gX194IDogX195OyB9KQorCisjZGVmaW5lIG1heChYLCBZKQkJCQlcCisJKHsgdHlwZW9mIChYKSBfX3ggPSAoWCksIF9feSA9IChZKTsJXAorCQkoX194ID4gX195KSA/IF9feCA6IF9feTsgfSkKKworI2RlZmluZSBNSU4oeCwgeSkgIG1pbih4LCB5KQorI2RlZmluZSBNQVgoeCwgeSkgIG1heCh4LCB5KQorCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKy8qICovCitpbnQJZGlzcGxheV9vcHRpb25zICh2b2lkKTsKK3ZvaWQJcHJpbnRfc2l6ZSh1bnNpZ25lZCBsb25nIGxvbmcsIGNvbnN0IGNoYXIgKik7CitpbnQJcHJpbnRfYnVmZmVyICh1bG9uZyBhZGRyLCB2b2lkKiBkYXRhLCB1aW50IHdpZHRoLCB1aW50IGNvdW50LCB1aW50IGxpbmVsZW4pOworCisvKiBib2FyZC8kKEJPQVJEKS8kKEJPQVJEKS5jICovCitpbnQgCWJvYXJkX2luaXQgKHZvaWQpOworaW50IAluYW5kX2luaXQgKHZvaWQpOworaW50ICAgICBtbWNfYm9vdCAodW5zaWduZWQgY2hhciAqYnVmKTsKK3ZvaWQJYm9hcmRfaGFuZyAodm9pZCk7Cit2b2lkICAgIGRvX3VzYih2b2lkKTsKKworCisvKiBjcHUvJChDUFUpL2NwdS5jICovCitpbnQgCWNwdV9pbml0ICh2b2lkKTsKKyNpZmRlZiAgQ0ZHX1VERUxBWQordm9pZCAJdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpOworI2VuZGlmCisKKy8qIG5hbmQgZHJpdmVyICovCisjZGVmaW5lIE5BTkRfQ01EX1JFQUQwCQkwCisjZGVmaW5lIE5BTkRfQ01EX1JFQUQxCQkxCisjZGVmaW5lIE5BTkRfQ01EX1JFQURPT0IJMHg1MAorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVMJCTB4NzAKKyNkZWZpbmUgTkFORF9DTURfUkVBRElECQkweDkwCisjZGVmaW5lIE5BTkRfQ01EX1JFU0VUCQkweGZmCisKKy8qIEV4dGVuZGVkIENvbW1hbmRzIGZvciBMYXJnZSBwYWdlIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9DTURfUkVBRFNUQVJUCTB4MzAKKworLyogUmV0dXJuIGNvZGVzIGZvciBuYW5kIHJlYWRzICovCisjZGVmaW5lIE5BTkRfUkVBRF9TVUNDRVNTICAgICAgICAgICAgICAwCisjZGVmaW5lIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSyAgICAxCisjZGVmaW5lIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRSAgICAgICAgICAyCisKK2ludCAJbmFuZF9jaGlwKHZvaWQpOworaW50IAluYW5kX3JlYWRfYmxvY2sodWNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcik7CisKK2ludCAJb25lbmFuZF9jaGlwKHZvaWQpOworaW50CW9uZW5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrKTsKKworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisvKiBzZXJpYWwgZHJpdmVyICovCitpbnQJc2VyaWFsX2luaXQgICAodm9pZCk7Cit2b2lkCXNlcmlhbF9zZXRicmcgKHZvaWQpOwordm9pZAlzZXJpYWxfcHV0YyAgIChjb25zdCBjaGFyKTsKK3ZvaWQJc2VyaWFsX3B1dHMgICAoY29uc3QgY2hhciAqKTsKK2ludAlzZXJpYWxfZ2V0YyAgICh2b2lkKTsKK2ludAlzZXJpYWxfdHN0YyAgICh2b2lkKTsKKworLyogbGliL3ByaW50Zi5jICovCit2b2lkCXNlcmlhbF9wcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisvKiBsaWIvY3JjLmMgKi8KK3ZvaWQgCW5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpOworCisvKiBsaWIvdnNwcmludGYuYyAqLworCitpbnQgCW5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYyk7CisKKy8qIGxpYi9ib2FyZC5jICovCit2b2lkCWhhbmcJCSh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworLyogc3Rkb3V0ICovCit2b2lkCXB1dHMoY29uc3QgY2hhciAqcyk7CisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qIFB1dCBvbmx5IHN0dWZmIGhlcmUgdGhhdCB0aGUgYXNzZW1ibGVyIGNhbiBkaWdlc3QgKi8KKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKKworI2RlZmluZSBST1VORChhLGIpCQkoKChhKSArIChiKSkgJiB+KChiKSAtIDEpKQorI2RlZmluZSBESVZfUk9VTkQobixkKQkJKCgobikgKyAoKGQpLzIpKSAvIChkKSkKKyNkZWZpbmUgRElWX1JPVU5EX1VQKG4sZCkJKCgobikgKyAoZCkgLSAxKSAvIChkKSkKKyNkZWZpbmUgcm91bmR1cCh4LCB5KQkJKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisKKyNkZWZpbmUgQUxJR04oeCxhKQkJX19BTElHTl9NQVNLKCh4KSwodHlwZW9mKHgpKShhKS0xKQorI2RlZmluZSBfX0FMSUdOX01BU0soeCxtYXNrKQkoKCh4KSsobWFzaykpJn4obWFzaykpCisKKyNlbmRpZgkvKiBfX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21waWxlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjRiODMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbXBpbGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBLZWVwIGFsbCB0aGUgdWdseSAjaWZkZWYgZm9yIHN5c3RlbSBzdHVmZiBoZXJlCisgKi8KKworI2lmbmRlZiBfX0NPTVBJTEVSX0hfXworI2RlZmluZSBfX0NPTVBJTEVSX0hfXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBVU0VfSE9TVENDCisKKyNpZiBkZWZpbmVkKF9fQkVPU19fKQkgfHwgXAorICAgIGRlZmluZWQoX19OZXRCU0RfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBcCisgICAgZGVmaW5lZChfX3N1bl9fKQkgfHwgXAorICAgIGRlZmluZWQoX19BUFBMRV9fKQorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgIWRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorCisvKiBOb3QgYWxsIHN5c3RlbXMgKGxpa2UgV2luZG93cykgaGFzIHRoaXMgZGVmaW5lLCBhbmQgeWVzCisgKiB3ZSBkbyByZXBsYWNlL2VtdWxhdGUgbW1hcCgpIG9uIHRob3NlIHN5c3RlbXMgLi4uCisgKi8KKyNpZm5kZWYgTUFQX0ZBSUxFRAorIyBkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQgKiktMSkKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgT19CSU5BUlkJCS8qIHNob3VsZCBiZSBkZWZpbmUnZCBvbiBfX1dJTjMyX18gKi8KKyNkZWZpbmUgT19CSU5BUlkJMAorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZWxpZiBkZWZpbmVkKF9fTUFDSF9fKQorIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVpbnQ7CisjZW5kaWYKKwordHlwZWRlZiB1aW50OF90IF9fdTg7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiB1aW50MzJfdCBfX3UzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisKKyNkZWZpbmUgdXN3YXBfMTYoeCkgXAorCSgoKCh4KSAmIDB4ZmYwMCkgPj4gOCkgfCBcCisJICgoKHgpICYgMHgwMGZmKSA8PCA4KSkKKyNkZWZpbmUgdXN3YXBfMzIoeCkgXAorCSgoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKwkgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKyNkZWZpbmUgX3Vzd2FwXzY0KHgsIHNmeCkgXAorCSgoKCh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMCMjc2Z4KSA+PiA1NikgfCBcCisJICgoKHgpICYgMHgwMGZmMDAwMDAwMDAwMDAwIyNzZngpID4+IDQwKSB8IFwKKwkgKCgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDAjI3NmeCkgPj4gMjQpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMCMjc2Z4KSA+PiAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMGZmMDAwMDAwIyNzZngpIDw8ICA4KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMDAwMDBmZjAwMDAjI3NmeCkgPDwgMjQpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMCMjc2Z4KSA8PCA0MCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMDAwMDAwMGZmIyNzZngpIDw8IDU2KSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgdXN3YXBfNjQoeCkgX3Vzd2FwXzY0KHgsIHVsbCkKKyNlbHNlCisjIGRlZmluZSB1c3dhcF82NCh4KSBfdXN3YXBfNjQoeCwgKQorI2VuZGlmCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBjcHVfdG9fbGUxNih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fbGUzMih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fbGU2NCh4KQkJKHgpCisjIGRlZmluZSBsZTE2X3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBsZTMyX3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBsZTY0X3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fYmUxNih4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGNwdV90b19iZTMyKHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgY3B1X3RvX2JlNjQoeCkJCXVzd2FwXzY0KHgpCisjIGRlZmluZSBiZTE2X3RvX2NwdSh4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGJlMzJfdG9fY3B1KHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgYmU2NF90b19jcHUoeCkJCXVzd2FwXzY0KHgpCisjZWxzZQorIyBkZWZpbmUgY3B1X3RvX2xlMTYoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBjcHVfdG9fbGUzMih4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGNwdV90b19sZTY0KHgpCQl1c3dhcF82NCh4KQorIyBkZWZpbmUgbGUxNl90b19jcHUoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBsZTMyX3RvX2NwdSh4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGxlNjRfdG9fY3B1KHgpCQl1c3dhcF82NCh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMTYoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMzIoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlNjQoeCkJCSh4KQorIyBkZWZpbmUgYmUxNl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgYmUzMl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgYmU2NF90b19jcHUoeCkJCSh4KQorI2VuZGlmCisKKyNlbHNlIC8qICFVU0VfSE9TVENDICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogVHlwZXMgZm9yIGB2b2lkIConIHBvaW50ZXJzLiAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgdWludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgdWludHB0cl90OworI2VuZGlmCisKKyNlbmRpZgorCisvKiBjb21waWxlciBvcHRpb25zICovCisjZGVmaW5lIHVuaW5pdGlhbGl6ZWRfdmFyKHgpCQl4ID0geAorCisjZGVmaW5lIGxpa2VseSh4KQlfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQorI2RlZmluZSB1bmxpa2VseSh4KQlfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlnX2RlZmF1bHRzLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ19kZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjA0OGEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ19kZWZhdWx0cy5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIGNvbmZpZ19kZWZhdWx0cy5oIC0gc2FuZSBkZWZhdWx0cyBmb3IgZXZlcnlvbmUKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQ09ORklHX0RFRkFVTFRTX0hfCisjZGVmaW5lIF9DT05GSUdfREVGQVVMVFNfSF8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2FtMzUxN2V2bS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2FtMzUxN2V2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmI5MjYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvYW0zNTE3ZXZtLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIEFNMzUxN0VWTSBib2FyZC4KKyAqCisgKiBEZXJpdmVkIGZyb20gL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKworI2RlZmluZSBDT05GSUdfQU0zNTE3RVZNICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEFNMzUxNyBFVk0gKi8KKy8vI2RlZmluZSBDT05GSUdfQU0zNTE3VEVCICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEFNMzUxNyBURUIgKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisjZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDI2MDAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTM4MU1IeiAtIFZERDE9MS4yMHYgKi8KKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTMgICAgICAgICBPTUFQMzRYWF9VQVJUMworCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMyAgICAgICAgICAgMyAgICAvKiBVQVJUMSBvbiBPTUFQM0VWTSAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDIzRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMjQwMDAwIC0gMHgwMDI3RkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMjgwMDAwIC0gMHgwMDc3RkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwNzgwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAyNDAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisKKyNpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhEQykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhFMCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhFNCkKKyNlbmRpZgorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQJMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyCisgKiAgIDB4MDA4MDAwMCAtIDB4MDI0MDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAyNDAwMDAgLSAweDAyODAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMjgwMDAwIC0gMHgwNzgwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDc4MDAwMCAtIDB4ODAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICAxOAorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC11c2ItbG9hZGVyLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC11c2ItbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5Mjc0MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLXVzYi1sb2FkZXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDE2IE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19ESUFNT05EX1VTQl9MT0FERVJfQ09ORklHX0gKKyNkZWZpbmUgX19ESUFNT05EX1VTQl9MT0FERVJfQ09ORklHX0gKKworI2luY2x1ZGUgImRpYW1vbmQuaCIKKworI2RlZmluZSBDT05GSUdfVVNCIDEKKworI2VuZGlmIC8qIF9fRElBTU9ORF9VU0JfTE9BREVSX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9kaWFtb25kLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNmZlMTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgVGhlIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGVyaXZlZCBmcm9tIG9tYXAzZXZtLmguCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fRElBTU9ORF9DT05GSUdfSAorI2RlZmluZSBfX0RJQU1PTkRfQ09ORklHX0gKKworLyoKKyAqIEFSTSBQcm9jZXNzb3IgQXJjaGl0ZWN0dXJlLCBGYW1pbHkgYW5kIFByb2R1Y3QgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOAkJMQorI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAxCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgMQorCisvKgorICogV2l0aCB0aGUgYXJjaGl0ZWN0dXJlLCBmYW1pbHkgYW5kIHByb2R1Y3QgY29uZmlndXJhdGlvbiBkZWZpbmVkLAorICogaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgQ1BVIGhlYWRlciBmaWxlLgorICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfRVZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfRFZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfUFZUCisjdW5kZWYgQ09ORklHX0RJQU1PTkRfQk9BUkRfTVAKKyNkZWZpbmUgQ09ORklHX0RJQU1PTkRfQk9BUkRfTVVMVEkJCQkxCisKKy8qCisgKiBFbmFibGUgc2VyaWFsIGNvbnNvbGUgcHJpbnRmIGZhY2lsaXR5IChjb25zdW1lcyBhYm91dCAzLjUgS2lCKQorICovCisjZGVmaW5lIENGR19QUklOVEYKKworLyoKKyAqIENPTkZJR19CT09UTV9JTUFHRSAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIFgtTG9hZGVyCisgKiBzdXBwb3J0cyBib290aW5nIGZyb20gJ21raW1hZ2UnIHUtYm9vdCBpbWFnZSBmaWxlcyByYXRoZXIgdGhhbiBqdXN0CisgKiByYXcsIHUtYm9vdCBiaW5hcmllcy4KKyAqCisgKiBFbmFibGluZyB0aGlzIGFkZHMgc3VwcG9ydCBmb3IgYXR0ZW1wdGluZyB0byBib290IGZyb20gb25lIG9yIG1vcmUKKyAqIGltYWdlcyBiZWNhdXNlIGl0IGFsbG93cyBhbiBpbWFnZSB0byBiZSBzYW5pdHktY2hlY2tlZCBiZWZvcmUKKyAqIGF0dGVtcHRpbmcgdG8gYm9vdCBpdC4KKyAqLworI2RlZmluZSBDT05GSUdfQk9PVE1fSU1BR0UKKworLyoKKyAqIERpc3BsYXkgaW1hZ2UgaW5mb3JtYXRpb24gd2l0aCB0aW1lc3RhbXBzCisgKi8KKyNpZmRlZiBDT05GSUdfQk9PVE1fSU1BR0UKKyNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19QUklOVEYpCisvKgorICogVXNlIGEgcHJpbnRmIGJ1ZmZlciBzaXplIG9mIDI1NiBCCisgKi8KKyMgZGVmaW5lIENGR19QQlNJWkUJCQkJMjU2CisKKy8qCisgKiBJbmRpY2F0ZSB0aGF0IHdlIHdhbnQgdG8gdXNlIENGR19OUzE2NTUwX0NPTTEgKHNlZSBiZWxvdykgYXQgYSBiYXVkCisgKiByYXRlIG9mIDExNSwyMDAgYnBzIGZvciB0aGUgc2VyaWFsIGNvbnNvbGUuCisgKi8KKyMgZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgMQorIyBkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAxMTUyMDAKKworLyoKKyAqIE5TMTY1NTAtY29tcGF0aWJsZSBzZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyAqLworIyBkZWZpbmUgQ0ZHX05TMTY1NTAKKyMgZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAoLTQpCisjIGRlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICg0ODAwMDAwMCkKKyMgZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgT01BUDM0WFhfVUFSVDEKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19QUklOVEYpICovCisKKy8qCisgKiBEaXNhYmxlIHRpbWVyLWJhc2VkIGRlbGF5IChjb25zdW1lcyBhYm91dCAyNTAgQikgc2luY2UgdGhpcyBpcyBvbmx5CisgKiBhdmFpbGFibGUgYXQgcHJlc2VudCBvbiB0aGUgQVJNOTI2RUpTLgorICovCisjdW5kZWYJQ0ZHX1VERUxBWQorCisvKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBkZXZlbG9wbWVudCBib2FyZCBoYXMgYW4gU0QvTU1DCisgKiBjb25uZWN0b3IsIHNvIGVuYWJsZSBzdXBwb3J0IGZvciBpdCwgd2hpY2ggaW1wbGljaXRseSBlbmFibGVzCisgKiBydWRpbWVudGFyeSBzdXBwb3J0IGZvciBNUy1ET1MgKE1CUikgcGFydGl0aW9ucyBhbmQgRkFUIGZpbGUKKyAqIHN5c3RlbXMuCisgKi8KKyNkZWZpbmUgQ09ORklHX01NQwkJCQkxCisKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisjIGRlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgIDEKKyMgZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgMQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01NQykgKi8KKworLyoKKyAqIENsb2NrIENvbmZpZ3VyYXRpb24KKyAqCisgKiAgQ2hvb3NlIFBSQ00gQ29uZmlndXJhdGlvbiAyIHdoaWNoIHN1YnNlbGVjdHMgYSBMMyBpbnRlcmNvbm5lY3QKKyAqICBjbG9jayBvZiAxNjYgTUh6IGZvciBTRFJBTS4KKyAqLworCisjdW5kZWYgQ0ZHX1BSQ01fREVCVUcKKworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgCQkxCisKKyNkZWZpbmUJQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFoJCTEKKyN1bmRlZglDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWgorCisjZGVmaW5lCUNPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWgkJMQorI3VuZGVmCUNPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWgorI3VuZGVmCUNPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWgorCisjZGVmaW5lIENGR19TRFJBTV9TSVpFX01CCQkJCTY0CisjdW5kZWYgQ0ZHX1NEUkFNX0RFQlVHCisKKy8qCisgKiBUaGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IG1heSBoYXZlIG9uZSBvZiB0aHJlZSBTRFJBTXMKKyAqIDFhKVNhbXN1bmcgSS1EaWUgNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKiAKKyAqIDFiKVNhbXN1bmcgSy1EaWUgNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKgorICogMikgTmFueWEgTlQ2RE0gNjRNQgorICogICAgMzJNYngxNgorICogICAgVkREPTEuOFYKKyAqICAgIDZucyBjeWNsZSB0aW1lCisgKiAgICBDTD0zCisgKgorICovCisKKyN1bmRlZiBDRkdfU0RSQU1fU01HX0s0WAorI3VuZGVmIENGR19TRFJBTV9OWUFfTlRENgorI2RlZmluZSBDRkdfU0RSQU1fQ09NQklORUQKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEstRkdDNiBkYXRhc2hlZXQgCisgKiAoYXBwbGljYWJsZSB0byB0aGUgSS1kaWUgYW5kIHRoZSBLLWRpZSkgYW5kIHRoZSBUSSBzcHJlYWRzaGVldCAKKyAqIGF0IGh0dHA6Ly9wcm9jZXNzb3JzLndpa2kudGkuY29tL2luZGV4LnBocD90aXRsZT0KKyAqIFNldHRpbmdfdXBfQU0zN3hfU0RSQ19yZWdpc3RlcnMuCisgKi8KKyNpZiBkZWZpbmVkKENGR19TRFJBTV9TTUdfSzRYKQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkJIDUKKworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFCQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFAJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IJCTIwCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIE5hbnlhIE5UNkRNIGRhdGFzaGVldCBhbmQgdGhlIFRJCisgKiBzcHJlYWRzaGVldCBhdCBodHRwOi8vcHJvY2Vzc29ycy53aWtpLnRpLmNvbS9pbmRleC5waHA/dGl0bGU9CisgKiBTZXR0aW5nX3VwX0FNMzd4X1NEUkNfcmVnaXN0ZXJzLgorICovCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fTllBX05URDYpCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMJCTEyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQwkJMTAKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUwkJIDcKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNECQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJECQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMCQkgMworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMCSAgICAgICAgIDYJCisKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUgkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRQkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSCQkxOQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0NPTUJJTkVEKQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkgICAgICAgICA2CQorCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYUAkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUgkgICAgICAgIDIwCQorI2VuZGlmCisKKworCisvKgorICogTkFORCBDb25maWd1cmF0aW9uCisgKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZCBtYXkgaGF2ZSB0d28gTkFORCBkZXZpY2VzOgorICoKKyAqICAgMWEpIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCBAIEdQTUMgQ1MwCisgKgorICogICAgICAtIDIgR2IgeCAxNiAoMjU2IE1pQikKKyAqICAgICAgLSAyIEtpQiBwYWdlIHNpemUKKyAqICAgICAgLSAxMjggS2lCIGVyYXNlIHNpemUKKyAqICAgICAgLSAxLjhWCisgKiAgICAgIC0gU0xDCisgKiAgICAgIC0gMS1iaXQgRUNDCisgKgorICogICAxYikgTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgQCBHUE1DIENTMAorICoKKyAqICAgICAgLSAyIEdiIHggMTYgKDI1NiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMS44VgorICogICAgICAtIFNMQworICogICAgICAtIDQtYml0IEVDQworICoKKyAqICAgMikgU2Ftc3VuZyBLOUY0RzA4VTBDIEAgR1BNQyBDUzMKKyAqCisgKiAgICAgIC0gNCBHYiB4IDggKDUxMiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMy4zVgorICogICAgICAtIFNMQworICovCisKKyNkZWZpbmUgQ0ZHX0dQTUNfTkFORAorI2RlZmluZSBDRkdfTU1DX05BTkQKKyN1bmRlZglDRkdfR1BNQ19PTkVOQU5ECisjdW5kZWYJQ0ZHX01NQ19PTkVOQU5ECisKKyN1bmRlZiBDRkdfR1BNQ19ERUJVRworCisjdW5kZWYJQ0ZHX05BTkRfSzlGNEcwOFUwQwkJLy8gU2Ftc3VuZyBLOUY0RzA4VTBDCisjZGVmaW5lIENGR19OQU5EX01UMjlGMkcxNgkJLy8gTWljcm9uIE1UMjlGMkcxNgorCisjdW5kZWYgIENGR19OQU5EX0VDQ18xQklUCisjZGVmaW5lIENGR19OQU5EX0VDQ180QklUCTEKKyN1bmRlZiAgQ0ZHX05BTkRfRUNDXzhCSVQKKworI2RlZmluZSBDRkdfR1BNQ19OQU5EX0JBU0UJTkFORF9CQVNFCisjZGVmaW5lIENGR19HUE1DX05BTkRfU0laRQlHUE1DX1NJWkVfMTI4TQorCisjaWYgZGVmaW5lZChDRkdfTkFORF9NVDI5RjJHMTYpCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzFfMAlNX05BTkRfR1BNQ19DT05GSUcxCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzJfMAlNX05BTkRfR1BNQ19DT05GSUcyCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzNfMAlNX05BTkRfR1BNQ19DT05GSUczCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzRfMAlNX05BTkRfR1BNQ19DT05GSUc0CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzVfMAlNX05BTkRfR1BNQ19DT05GSUc1CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzZfMAlNX05BTkRfR1BNQ19DT05GSUc2CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzdfMAlcCisJKEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9TSVpFKSB8IFwKKwkgR1BNQ19DT05GSUc3X0JBU0VBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX0JBU0UpKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KSAqLworCisjaWYgZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcxXzMJTV9OQU5EX0dQTUNfQ09ORklHMSAvL1NNTkFORF9HUE1DX0NPTkZJRzEKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMl8zCU1fTkFORF9HUE1DX0NPTkZJRzIgLy9TTU5BTkRfR1BNQ19DT05GSUcyCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzNfMwlNX05BTkRfR1BNQ19DT05GSUczIC8vU01OQU5EX0dQTUNfQ09ORklHMworI2RlZmluZSBDRkdfR1BNQ19DT05GSUc0XzMJTV9OQU5EX0dQTUNfQ09ORklHNCAvL1NNTkFORF9HUE1DX0NPTkZJRzQKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNV8zCU1fTkFORF9HUE1DX0NPTkZJRzUgLy9TTU5BTkRfR1BNQ19DT05GSUc1CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzZfMwlNX05BTkRfR1BNQ19DT05GSUc2IC8vU01OQU5EX0dQTUNfQ09ORklHNgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc3XzMJXAorCShHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfU0laRSkgfCBcCisJIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9CQVNFKSkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpICovCisKKy8qCisgKiBBcmNoaXRlY3R1cmUsIHByb2Nlc3NvciBhbmQvb3IgYm9hcmQtc3BlY2lmaWMgTkFORCBhY2Nlc3MgbWFjcm9zCisgKiBhbmQgZHJpdmVyIHBhcmFtZXRlcnMuCisgKi8KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorIyBkZWZpbmUgTkFORF8xNkJJVAorIyBkZWZpbmUgTkFORF9CTE9DS19TSVpFCSgxMjggPDwgMTApCisjZWxpZiBkZWZpbmVkKENGR19OQU5EX0s5RjRHMDhVMEMpCisjIHVuZGVmCU5BTkRfMTZCSVQKKyMgZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkoMTI4IDw8IDEwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KSAqLworCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gR1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH5HUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IEdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+R1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisjZW5kaWYgLyogTkFORF8xNkJJVCAqLworCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyoKKyAqIExvY2F0aW9uIHdoZXJlIHdlIGV4cGVjdCB0byBmaW5kIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIgaW4KKyAqIHRoZSBib290IE5BTkQgZGV2aWNlLgorICoKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBBbGlhcyBEZXNjcmlwdGlvbiAgICAgICAgICAgIFNpemUgICAgQmxvY2tzICBCbG9jayAgICAgQWRkcmVzcyAgICAgU2l6ZQorICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgaXBsCSBYLUxvYWRlciBJbWFnZQkgICAgICAyNTYgS2lCICAgICAgMiAgICAgIDAJICAweDAwMDAwMDAwICAgIDAgQgorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgc3BsMAkgUHJpbWFyeSBVLUJvb3QgSW1hZ2UgMS41IE1pQiAgICAgMTIgICAgICAyCSAgMHgwMDA0MDAwMCAgMjU2IEtpQgorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgc3BsMQkgUmVzZXJ2ZWQgZm9yIEZ1dHVyZSAgMS41IE1pQiAgICAgMTIgICAgIDE0CSAgMHgwMDFDMDAwMCAxLjc1IE1pQgorICogICAgICAgICAgIFNlY29uZGFyeSBVLUJvb3QKKyAqICAgICAgICAgICBJbWFnZQorICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UMF9TVEFSVAkJMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UMV9TVEFSVAkJMHgwMDFDMDAwMAorI2RlZmluZSBDRkdfTkFORF9CT09URVhURU5UX1NJWkUJCTB4MTgwMDAwCisKKyNpZmRlZiBDT05GSUdfQk9PVE1fSU1BR0UKKyNkZWZpbmUgQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUCQl7IHsgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQsIFwKKwkJCQkJCQkJCQkJQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFIH0sCVwKKwkJCQkJCQkJCQkgIHsgQ0ZHX05BTkRfQk9PVEVYVEVOVDFfU1RBUlQsIFwKKwkJCQkJCQkJCQkJQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFIH0gfQorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX05BTkRfQk9PVEVYVEVOVAkJCXsgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQsIFwKKwkJCQkJCQkJCQkgIENGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9CisjZW5kaWYKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworCisvKgorICogQ09ORklHX0JPT1RGSUxFIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKyAqIHNlY29uZC1zdGFnZSBib290IGZpbGUgbG9hZGVkIGZyb20gU0QgY2FyZCBpZiB0aGUgc3lzdGVtIGhhcyBiZWVuCisgKiBjb25maWd1cmVkIHRvIGJvb3QgYXMgc3VjaC4KKyAqCisgKiBDT05GSUdfQk9PVEZJTEVfTElTVCAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gYSBsaXN0IG9mIGRlZmF1bHQgdmFsdWVzCisgKiBmb3IgdGhlIHNlY29uZC1zdGFnZSBib290IGZpbGUgbG9hZGVkIGZyb20gU0QgY2FyZCBpZiB0aGUgc3lzdGVtIGhhcyBiZWVuCisgKiBjb25maWd1cmVkIHRvIGJvb3QgYXMgc3VjaC4KKyAqCisgKiBUcnkgdG8gYm9vdCBhbiAnbWtpbWFnZScgdS1ib290IGltYWdlIGZpcnN0OyBvdGhlcndpc2UsIHRyeSB0byBib290IGEKKyAqIHJhdyB1LWJvb3QgYmluYXJ5IGlmIGl0IGV4aXN0cyBhcyBhIGZhbGxiYWNrLgorICovCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lIENPTkZJR19CT09URklMRV9MSVNUIAkJCXsgInUtYm9vdC5pbWciLCAidS1ib290LmJpbiIgfQorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkJCQkidS1ib290LmltZyIKKyNlbmRpZgorCisvKgorICogTG9jYXRpb24gaW4gU0RSQU0gd2hlcmUgdGhlIHNlY29uZC1zdGFnZSBib290IGxvYWRlciB3aWxsIGJlIGxvYWRlZAorICogdG8gYW5kIGV4ZWN1dGVkIGZyb20uCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIAkJMHg4MDAwODAwMAorCisjZW5kaWYgLyogX19ESUFNT05EX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS11c2ItbG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxNGM3YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IEo0OSBib2FyZC4gIFRoZSBpdGVtcyBiZWxvdyBzaG91bGQKKyAqICAgICAgYmUgdXBkYXRlZCBhcyB0aGUgaGFyZHdhcmUgc2V0dGxlcy4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19KNDlfQ09ORklHX0gKKyNkZWZpbmUgX19KNDlfQ09ORklHX0gKKworI2luY2x1ZGUgImRpYW1vbmQuaCIKKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9FVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJFX1BWVAorI2RlZmluZSBDT05GSUdfSjQ5X0JPQVJEX01VTFRJCQkJMQorCisjZGVmaW5lIENPTkZJR19VU0IgMQorCisjZW5kaWYgLyogX19KNDlfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjU4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMiBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHgtbG9hZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZQorICogICAgICBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgSjQ5IGJvYXJkLiAgVGhlIGl0ZW1zIGJlbG93IHNob3VsZAorICogICAgICBiZSB1cGRhdGVkIGFzIHRoZSBoYXJkd2FyZSBzZXR0bGVzLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0o0OV9DT05GSUdfSAorI2RlZmluZSBfX0o0OV9DT05GSUdfSAorCisjaW5jbHVkZSAiZGlhbW9uZC5oIgorCisvKgorICogQXNzZXJ0IHRoZSBib2FyZCB0eXBlKHMpIHdlIGFyZSBidWlsZGluZyBmb3IuCisgKgorICovCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUk9UT1RZUEUKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0VWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRFZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9QUkVfUFZUCisjZGVmaW5lIENPTkZJR19KNDlfQk9BUkRfTVVMVEkJCQkxCisKKyNlbmRpZiAvKiBfX0o0OV9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZGVhY2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaApAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqICAgT01BUCBoYXJkd2FyZSBtYXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4gKGh0dHA6Ly93d3cucmlkZ2VydW4uY29tKQorICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgorICoJICAgR3JlZyBMb25ub24gKGdsb25ub25AcmlkZ2VydW4uY29tKSBvciBpbmZvQHJpZGdlcnVuLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyoKKyAgVGhlcmUgYXJlIDIgc2V0cyBvZiBnZW5lcmFsIEkvTyAtLT4KKyAgMS4gR1BJTyAoc2hhcmVkIGJldHdlZW4gQVJNICYgRFNQLCBjb25maWd1cmVkIGJ5IEFSTSkKKyAgMi4gTVBVSU8gd2hpY2ggY2FuIGJlIHVzZWQgb25seSBieSB0aGUgQVJNLgorCisgIEJhc2UgYWRkcmVzcyBGRkZCOjUwMDAgaXMgd2hlcmUgdGhlIEFSTSBhY2Nlc3NlcyB0aGUgTVBVSU8gY29udHJvbCByZWdpc3RlcnMKKyAgKHNlZSA3LjIuMiBvZiB0aGUgVFJNIGZvciBNUFVJTyByZWcgZGVmaW5pdGlvbnMpLgorCisgIEJhc2UgYWRkcmVzcyBFMTAxOjUwMDAgaXMgcmVzZXJ2ZWQgZm9yIEFSTSBhY2Nlc3Mgb2YgdGhlIHNhbWUgTVBVSU8gY29udHJvbAorICByZWdzLCBidXQgdmlhIHRoZSBEU1AgSS9PIG1hcC4gIFRoaXMgYWRkcmVzcyBpcyB1bmF2YWlsYWJsZSBvbiAxNTEwLgorCisgIEJhc2UgYWRkcmVzcyBGRkZDOkUwMDAgaXMgd2hlcmUgdGhlIEFSTSBhY2Nlc3NlcyB0aGUgR1BJTyBjb25maWcgcmVnaXN0ZXJzCisgIGRpcmVjdGx5IHZpYSBpdHMgb3duIHBlcmlwaGVyYWwgYnVzLgorCisgIEJhc2UgYWRkcmVzcyBFMTAxOkUwMDAgaXMgd2hlcmUgdGhlIEFSTSBjYW4gYWNjZXNzIHRoZSBzYW1lIEdQSU8gY29uZmlnCisgIHJlZ2lzdGVycywgYnV0IHRoZSBhY2Nlc3MgdGFrZXMgcGxhY2UgdGhyb3VnaCB0aGUgQVJNIHBvcnQgaW50ZXJmYWNlIChjYWxsZWQKKyAgQVBJIG9yIE1QVUkpIHZpYSB0aGUgRFNQJ3MgcGVyaXBoZXJhbCBidXMgKERTUCBJL08gc3BhY2UpLgorCisgIFRoZXJlZm9yZSwgdGhlIEFSTSBzaG91bGQgc2V0dXAgdGhlIEdQSU8gcmVncyB0aHJ1IHRoZSBGRkZDOkUwMDAgYWRkcmVzc2VzCisgIGluc3RlYWQgb2YgdGhlIEUxMDE6RTAwMCBhZGRyZXNzZXMuICBUaGUgRFNQIGhhcyBvbmx5IHJlYWQgYWNjZXNzIG9mIHRoZSBwaW4KKyAgY29udHJvbCByZWdpc3Rlciwgc28gdGhpcyBtYXkgZXhwbGFpbiB0aGUgaW5hYmlsaXR5IHRvIHdyaXRlIHRvIEUxMDE6RTAxOC4KKyAgVHJ5IGFjY2Vzc2luZyBwaW4gY29udHJvbCByZWcgYXQgRkZGQzpFMDE4LgorICovCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkgMHhmZmZjZTAwMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX1NUQVJUCSBPTUFQMTUxMF9HUElPX0JBU0UKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19TSVpFCSBTWl80SworCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9CQVNFCSAweEUxMDExMDAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQMV9TSVpFCSBTWl80SworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfU1RBUlQJIDB4RTEwMTEwMDAKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDJfQkFTRQkgMHhGRkZCMTAwMAorCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19CQVNFCSAweEUxMDE3MDAwCisjZGVmaW5lIE9NQVAxNTEwX01DQlNQM19TSVpFCSBTWl80SworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfU1RBUlQJIDB4RTEwMTcwMDAKKworLyoKKyAqIFdoZXJlJ3MgdGhlIGZsdXNoIGFkZHJlc3MgKGZvciBmbHVzaGluZyBEIGFuZCBJIGNhY2hlPykKKyAqLworI2RlZmluZSBGTFVTSF9CQVNFCQkweGRmMDAwMDAwCisjZGVmaW5lIEZMVVNIX0JBU0VfUEhZUyAweDAwMDAwMDAwCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworCisjZGVmaW5lIFBDSU9fQkFTRQkJMAorCisvKgorICogUkFNIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgTUFQVE9QSFlTKGEpCQkoKHVuc2lnbmVkIGxvbmcpKGEpIC0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIEtFUk5UT1BIWVMoYSkJCSgodW5zaWduZWQgbG9uZykoJmEpKQorI2RlZmluZSBLRVJORUxfQkFTRQkJKDB4MTAwMDgwMDApCisjZW5kaWYKKworLyogbWFjcm8gdG8gZ2V0IGF0IElPIHNwYWNlIHdoZW4gcnVubmluZyB2aXJ0dWFsbHkgKi8KKyNkZWZpbmUgSU9fQUREUkVTUyh4KSAoKHgpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgc3lzdGVtIHJlZ2lzdGVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgT01BUDE1MTBfVUFSVDFfQkFTRQkgICAgMHhmZmZiMDAwMAkgLyogIkJMVUVUT09USC1VQVJUIiAqLworI2RlZmluZSBPTUFQMTUxMF9VQVJUMl9CQVNFCSAgICAweGZmZmIwODAwCSAvKiAiTU9ERU0tVUFSVCIgKi8KKyNkZWZpbmUgT01BUDE1MTBfUlRDX0JBU0UJICAgIDB4ZmZmYjQ4MDAJIC8qIFJUQyAqLworI2RlZmluZSBPTUFQMTUxMF9VQVJUM19CQVNFCSAgICAweGZmZmI5ODAwCSAvKiBTaGFyZWQgTVBVL0RTUCBVQVJUICovCisjZGVmaW5lIE9NQVAxNTEwX0NPTV9NQ0JTUDJfQkFTRSAgICAweGZmZmYxMDAwCSAvKiBDb20gTWNCU1AyICovCisjZGVmaW5lIE9NQVAxNTEwX0FVRElPX01DQlNQX0JBU0UgICAweGZmZmYxODAwCSAvKiBBdWRpbyBNY0JTUDIgKi8KKyNkZWZpbmUgT01BUDE1MTBfQVJNSU9fQkFTRQkgICAgMHhmZmZiNTAwMAkgLyoga2V5Ym9hcmQvZ3BpbyAqLworCisvKgorICogT01BUDE1MTAgVUFSVDMgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBPTUFQX01QVV9VQVJUM19CQVNFICAweEZGRkI5ODAwIC8qIFVBUlQzIHRocm91Z2ggTVBVIGJ1cyAqLworCisvKiBVQVJUMyBSZWdpc3RlcnMgTWFwaW5nIHRocm91Z2ggTVBVIGJ1cyAqLworCisjZGVmaW5lIFVBUlQzX1JIUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAwKQorI2RlZmluZSBVQVJUM19USFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMCkKKyNkZWZpbmUgVUFSVDNfRExMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDApCisjZGVmaW5lIFVBUlQzX0lFUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA0KQorI2RlZmluZSBVQVJUM19ETEgJIChPTUFQX01QVV9VQVJUM19CQVNFICsgNCkKKyNkZWZpbmUgVUFSVDNfSUlSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDgpCisjZGVmaW5lIFVBUlQzX0ZDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA4KQorI2RlZmluZSBVQVJUM19FRlIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgOCkKKyNkZWZpbmUgVUFSVDNfTENSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MEMpCisjZGVmaW5lIFVBUlQzX01DUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDEwKQorI2RlZmluZSBVQVJUM19YT04xX0FERFIxIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxMCkKKyNkZWZpbmUgVUFSVDNfWE9OMl9BRERSMiAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTQpCisjZGVmaW5lIFVBUlQzX0xTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE0KQorI2RlZmluZSBVQVJUM19UQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxOCkKKyNkZWZpbmUgVUFSVDNfTVNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX1hPRkYxCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX1hPRkYyCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MUMpCisjZGVmaW5lIFVBUlQzX1NQUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDFDKQorI2RlZmluZSBVQVJUM19UTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxQykKKyNkZWZpbmUgVUFSVDNfTURSMQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDIwKQorI2RlZmluZSBVQVJUM19NRFIyCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjQpCisjZGVmaW5lIFVBUlQzX1NGTFNSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjgpCisjZGVmaW5lIFVBUlQzX1RYRkxMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MjgpCisjZGVmaW5lIFVBUlQzX1JFU1VNRQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDJDKQorI2RlZmluZSBVQVJUM19UWEZMSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDJDKQorI2RlZmluZSBVQVJUM19TRlJFR0wJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzMCkKKyNkZWZpbmUgVUFSVDNfUlhGTEwJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzMCkKKyNkZWZpbmUgVUFSVDNfU0ZSRUdICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzQpCisjZGVmaW5lIFVBUlQzX1JYRkxICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzQpCisjZGVmaW5lIFVBUlQzX0JMUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM4KQorI2RlZmluZSBVQVJUM19BQ1JFRwkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDNDKQorI2RlZmluZSBVQVJUM19ESVYxNgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDNDKQorI2RlZmluZSBVQVJUM19TQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0MCkKKyNkZWZpbmUgVUFSVDNfU1NSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDQpCisjZGVmaW5lIFVBUlQzX0VCTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0OCkKKyNkZWZpbmUgVUFSVDNfT1NDXzEyTV9TRUwgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDRDKQorI2RlZmluZSBVQVJUM19NVlIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg1MCkKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8wCQkweGZmZmUxMDAwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMQkJMHhmZmZlMTAwNAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzIJCTB4ZmZmZTEwMDgKKyNkZWZpbmUgQ09NUF9NT0RFX0NUUkxfMAkweGZmZmUxMDBjCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMwkJMHhmZmZlMTAxMAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzQJCTB4ZmZmZTEwMTQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF81CQkweGZmZmUxMDE4CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNgkJMHhmZmZlMTAxQworI2RlZmluZSBGVU5DX01VWF9DVFJMXzcJCTB4ZmZmZTEwMjAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF84CQkweGZmZmUxMDI0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfOQkJMHhmZmZlMTAyOAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0EJCTB4ZmZmZTEwMkMKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9CCQkweGZmZmUxMDMwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfQwkJMHhmZmZlMTAzNAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0QJCTB4ZmZmZTEwMzgKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8wCQkweGZmZmUxMDQwCisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMQkJMHhmZmZlMTA0NAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzIJCTB4ZmZmZTEwNDgKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8zCQkweGZmZmUxMDRjCisjZGVmaW5lIEdBVEVfSU5IX0NUUkxfMAkJMHhmZmZlMTA1MAorI2RlZmluZSBWT0xUQUdFX0NUUkxfMAkJMHhmZmZlMTA2MAorI2RlZmluZSBURVNUX0RCR19DVFJMXzAJCTB4ZmZmZTEwNzAKKworI2RlZmluZSBNT0RfQ09ORl9DVFJMXzAJCTB4ZmZmZTEwODAKKworLyogMTYxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2RlZmluZSBVU0JfT1RHX0NUUkwJCTB4RkZGQjA0MEMKKyNkZWZpbmUgVVNCX1RSQU5TQ0VJVkVSX0NUUkwJMHhGRkZFMTA2NAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzQJCTB4RkZGRTEwQUMKKyNkZWZpbmUgUFVfUERfU0VMXzAJCTB4RkZGRTEwQjQKKyNkZWZpbmUgUFVfUERfU0VMXzEJCTB4RkZGRTEwQjgKKyNkZWZpbmUgUFVfUERfU0VMXzIJCTB4RkZGRTEwQkMKKyNkZWZpbmUgUFVfUERfU0VMXzMJCTB4RkZGRTEwQzAKKyNkZWZpbmUgUFVfUERfU0VMXzQJCTB4RkZGRTEwQzQKKworI2VuZGlmCisvKgorICogVHJhZmZpYyBDb250cm9sbGVyIE1lbW9yeSBJbnRlcmZhY2UgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgVENNSUZfQkFTRQkJMHhmZmZlY2MwMAorI2RlZmluZSBJTUlGX1BSSU8JCShUQ01JRl9CQVNFICsgMHgwMCkKKyNkZWZpbmUgRU1JRlNfUFJJT19SRUcJCShUQ01JRl9CQVNFICsgMHgwNCkKKyNkZWZpbmUgRU1JRkZfUFJJT19SRUcJCShUQ01JRl9CQVNFICsgMHgwOCkKKyNkZWZpbmUgRU1JRlNfQ09ORklHX1JFRwkoVENNSUZfQkFTRSArIDB4MGMpCisjZGVmaW5lIEVNSUZTX0NTMF9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDEwKQorI2RlZmluZSBFTUlGU19DUzFfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxNCkKKyNkZWZpbmUgRU1JRlNfQ1MyX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MTgpCisjZGVmaW5lIEVNSUZTX0NTM19DT05GSUcJKFRDTUlGX0JBU0UgKyAweDFjKQorI2RlZmluZSBFTUlGRl9TRFJBTV9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDIwKQorI2RlZmluZSBFTUlGRl9NUlMJCShUQ01JRl9CQVNFICsgMHgyNCkKKyNkZWZpbmUgVENfVElNRU9VVDEJCShUQ01JRl9CQVNFICsgMHgyOCkKKyNkZWZpbmUgVENfVElNRU9VVDIJCShUQ01JRl9CQVNFICsgMHgyYykKKyNkZWZpbmUgVENfVElNRU9VVDMJCShUQ01JRl9CQVNFICsgMHgzMCkKKyNkZWZpbmUgVENfRU5ESUFOSVNNCQkoVENNSUZfQkFTRSArIDB4MzQpCisjZGVmaW5lIEVNSUZGX1NEUkFNX0NPTkZJR18yCShUQ01JRl9CQVNFICsgMHgzYykKKyNkZWZpbmUgRU1JRl9DRkdfRFlOQU1JQ19XUwkoVENNSUZfQkFTRSArIDB4NDApCisKKy8qCisgKiBMQ0QgUGFuZWwKKyAqLworI2RlZmluZSBUSTkyNV9MQ0RfQkFTRQkJMHhGRkZFQzAwMAorI2RlZmluZSBUSTkyNV9MQ0RfQ09OVFJPTAkoVEk5MjVfTENEX0JBU0UpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcwCShUSTkyNV9MQ0RfQkFTRSsweDQpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcxCShUSTkyNV9MQ0RfQkFTRSsweDgpCisjZGVmaW5lIFRJOTI1X0xDRF9USU1JTkcyCShUSTkyNV9MQ0RfQkFTRSsweGMpCisjZGVmaW5lIFRJOTI1X0xDRF9TVEFUVVMJKFRJOTI1X0xDRF9CQVNFKzB4MTApCisjZGVmaW5lIFRJOTI1X0xDRF9TVUJQQU5FTAkoVEk5MjVfTENEX0JBU0UrMHgxNCkKKworI2RlZmluZSBPTUFQX0xDRF9DT05UUk9MCVRJOTI1X0xDRF9DT05UUk9MCisKKy8qCisgKiBNTUMvU0QgSG9zdCBDb250cm9sbGVyIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgT01BUF9NTUNfQ01ECSAweEZGRkI3ODAwIC8qIE1NQyBDb21tYW5kICovCisjZGVmaW5lIE9NQVBfTU1DX0FSR0wJIDB4RkZGQjc4MDQgLyogTU1DIGFyZ3VtZW50IGxvdyAqLworI2RlZmluZSBPTUFQX01NQ19BUkdICSAweEZGRkI3ODA4IC8qIE1NQyBhcmd1bWVudCBoaWdoICovCisjZGVmaW5lIE9NQVBfTU1DX0NPTgkgMHhGRkZCNzgwQyAvKiBNTUMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfU1RBVAkgMHhGRkZCNzgxMCAvKiBNTUMgc3RhdHVzICovCisjZGVmaW5lIE9NQVBfTU1DX0lFCSAweEZGRkI3ODE0IC8qIE1NQyBzeXN0ZW0gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBPTUFQX01NQ19DVE8JIDB4RkZGQjc4MTggLyogTU1DIGNvbW1hbmQgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfRFRPCSAweEZGRkI3ODFDIC8qIE1NQyBkYXRhIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0RBVEEJIDB4RkZGQjc4MjAgLyogTU1DIFRYL1JYIEZJRk8gZGF0YSAqLworI2RlZmluZSBPTUFQX01NQ19CTEVOCSAweEZGRkI3ODI0IC8qIE1NQyBibG9jayBsZW5ndGggKi8KKyNkZWZpbmUgT01BUF9NTUNfTkJMSwkgMHhGRkZCNzgyOCAvKiBNTUMgbnVtYmVyIG9mIGJsb2NrcyAqLworI2RlZmluZSBPTUFQX01NQ19CVUYJIDB4RkZGQjc4MkMgLyogTU1DIGJ1ZmZlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NQSQkgMHhGRkZCNzgzMCAvKiBNTUMgc2VyaWFsIHBvcnQgaW50ZXJmYWNlICovCisjZGVmaW5lIE9NQVBfTU1DX1NESU8JIDB4RkZGQjc4MzQgLyogTU1DIFNESU8gbW9kZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NZU1QJIDB4RkZGQjc4MzggLyogTU1DIHN5c3RlbSB0ZXN0ICovCisjZGVmaW5lIE9NQVBfTU1DX1JFVgkgMHhGRkZCNzgzQyAvKiBNTUMgbW9kdWxlIHZlcnNpb24gKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMAkgMHhGRkZCNzg0MCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAwICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDEJIDB4RkZGQjc4NDQgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMSAqLworI2RlZmluZSBPTUFQX01NQ19SU1AyCSAweEZGRkI3ODQ4IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDIgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMwkgMHhGRkZCNzg0QyAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAzICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDQJIDB4RkZGQjc4NTAgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNCAqLworI2RlZmluZSBPTUFQX01NQ19SU1A1CSAweEZGRkI3ODU0IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDUgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNgkgMHhGRkZCNzg1OCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA2ICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDcJIDB4RkZGQjc4NUMgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNCAqLworCisvKiBNTUMgbWFza3MgKi8KKworI2RlZmluZSBPTUFQX01NQ19FTkRfT0ZfQ01ECSgxIDw8IDApCS8qIEVuZCBvZiBjb21tYW5kIHBoYXNlICovCisjZGVmaW5lIE9NQVBfTU1DX0NBUkRfQlVTWQkoMSA8PCAyKQkvKiBDYXJkIGVudGVyIGJ1c3kgc3RhdGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfQkxPQ0tfUlMJKDEgPDwgMykJLyogQmxvY2sgcmVjZWl2ZWQvc2VudCAqLworI2RlZmluZSBPTUFQX01NQ19FT0ZfQlVTWQkoMSA8PCA0KQkvKiBDYXJkIGV4aXQgYnVzeSBzdGF0ZSAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBX1RJTUVPVVQJKDEgPDwgNSkJLyogRGF0YSByZXNwb25zZSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBX0NSQwkoMSA8PCA2KQkvKiBEYXRlIENSQyBlcnJvciAqLworI2RlZmluZSBPTUFQX01NQ19DTURfVElNRU9VVAkoMSA8PCA3KQkvKiBDb21tYW5kIHJlc3BvbnNlIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0NNRF9DUkMJKDEgPDwgOCkJLyogQ29tbWFuZCBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgT01BUF9NTUNfQV9GVUxMCQkoMSA8PCAxMCkJLyogQnVmZmVyIGFsbW9zdCBmdWxsICovCisjZGVmaW5lIE9NQVBfTU1DX0FfRU1QVFkJKDEgPDwgMTEpCS8qIEJ1ZmZlciBhbG1vc3QgZW1wdHkgKi8KKyNkZWZpbmUgT01BUF9NTUNfT0NSX0JVU1kJKDEgPDwgMTIpCS8qIE9DUiBidXN5ICovCisjZGVmaW5lIE9NQVBfTU1DX0NBUkRfSVJRCSgxIDw8IDEzKQkvKiBDYXJkIElSUSByZWNlaXZlZCAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0VSUgkoMSA8PCAxNCkJLyogQ2FyZCBzdGF0dXMgZXJyb3IgaW4gcmVzcG9uc2UgKi8KKworLyogMi45LjIgTVBVSSBJbnRlcmZhY2UgUmVnaXN0ZXJzIEZGRkU6QzkwMCAqLworCisjZGVmaW5lIE1QVUlfQ1RSTF9SRUcJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTAwKQorI2RlZmluZSBNUFVJX0RFQlVHX0FERFIJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTA0KQorI2RlZmluZSBNUFVJX0RFQlVHX0RBVEEJCSh2b2xhdGlsZSBfX3UzMiAqKSgweGZmZmVjOTA4KQorI2RlZmluZSBNUFVJX0RFQlVHX0ZMQUcJCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTBjKQorI2RlZmluZSBNUFVJX1NUQVRVU19SRUcJCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTEwKQorI2RlZmluZSBNUFVJX0RTUF9TVEFUVVNfUkVHCSh2b2xhdGlsZSBfX3UxNiAqKSgweGZmZmVjOTE0KQorI2RlZmluZSBNUFVJX0RTUF9CT09UX0NPTkZJRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxOCkKKyNkZWZpbmUgTVBVSV9EU1BfQVBJX0NPTkZJRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxYykKKworLyogMi45LjYgVHJhZmZpYyBDb250cm9sbGVyIE1lbW9yeSBJbnRlcmZhY2UgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBPTUFQX0lNSUZfUFJJT19SRUcJCTB4ZmZmZWNjMDAKKyNkZWZpbmUgT01BUF9FTUlGU19QUklPX1JFRwkJMHhmZmZlY2MwNAorI2RlZmluZSBPTUFQX0VNSUZGX1BSSU9fUkVHCQkweGZmZmVjYzA4CisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1JFRwkJMHhmZmZlY2MwYworI2RlZmluZSBPTUFQX0VNSUZTX0NTMF9DT05GSUcJCTB4ZmZmZWNjMTAKKyNkZWZpbmUgT01BUF9FTUlGU19DUzFfQ09ORklHCQkweGZmZmVjYzE0CisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MyX0NPTkZJRwkJMHhmZmZlY2MxOAorI2RlZmluZSBPTUFQX0VNSUZTX0NTM19DT05GSUcJCTB4ZmZmZWNjMWMKKyNkZWZpbmUgT01BUF9FTUlGRl9TRFJBTV9DT05GSUcJCTB4ZmZmZWNjMjAKKyNkZWZpbmUgT01BUF9FTUlGRl9NUlMJCQkweGZmZmVjYzI0CisjZGVmaW5lIE9NQVBfVElNRU9VVDEJCQkweGZmZmVjYzI4CisjZGVmaW5lIE9NQVBfVElNRU9VVDIJCQkweGZmZmVjYzJjCisjZGVmaW5lIE9NQVBfVElNRU9VVDMJCQkweGZmZmVjYzMwCisjZGVmaW5lIE9NQVBfRU5ESUFOSVNNCQkJMHhmZmZlY2MzNAorCisvKiAyLjkuMTAgRU1JRiBTbG93IEludGVyZmFjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChFTUlGU19DT05GSUdfUkVHKTogKi8KKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfRlIJCSgxIDw8IDQpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1BERQkJKDEgPDwgMykKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfUFdEX0VOCSgxIDw8IDIpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX0JNCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19XUAkJKDEgPDwgMCkKKworLyoKKyAqIE1lbW9yeSBjaHVuayBzZXQgYXNpZGUgZm9yIHRoZSBGcmFtZWJ1ZmZlciBpbiBTUkFNCisgKi8KKyNkZWZpbmUgU1JBTV9GUkFNRUJVRkZFUl9NRU1PUlkgT01BUDE1MTBfU1JBTV9CQVNFCisKKworLyoKKyAqIERNQQorICovCisKKyNkZWZpbmUgT01BUDE1MTBfRE1BX0JBU0UgMHhGRkZFRDgwMAorI2RlZmluZSBPTUFQX0RNQV9CQVNFCSAgT01BUDE1MTBfRE1BX0JBU0UKKworLyogR2xvYmFsIFJlZ2lzdGVyIHNlbGVjdGlvbiAqLworI2RlZmluZSBOT19HTE9CQUxfRE1BX0FDQ0VTUyAwCisKKy8qIENoYW5uZWwgc2VsZWN0IGZpZWxkCisgKiBOT1RFOiBhbGwgb3RoZXIgY2hhbm5lbHMgYXJlIGxpbmVhciwgY2hhbjAgaXMgMCwgY2hhbjEgaXMgMSwgZXRjLi4uCisgKi8KKyNkZWZpbmUgTENEX0NIQU5ORUwgMHhjCisKKy8qIFJlZ2lzdGVyIFNlbGVjdCBGaWVsZCAoTENEKSAqLworI2RlZmluZSBETUFfTENEX0NUUkwJCTAKKyNkZWZpbmUgRE1BX0xDRF9UT1BfRjFfTAkxCisjZGVmaW5lIERNQV9MQ0RfVE9QX0YxX1UJMgorI2RlZmluZSBETUFfTENEX0JPVF9GMV9MCTMKKyNkZWZpbmUgRE1BX0xDRF9CT1RfRjFfVQk0CisKKyNkZWZpbmUgTENEX0ZSQU1FX01PREUJCSgxPDwwKQorI2RlZmluZSBMQ0RfRlJBTUVfSVRfSUUJCSgxPDwxKQorI2RlZmluZSBMQ0RfQlVTX0VSUk9SX0lUX0lFCSgxPDwyKQorI2RlZmluZSBMQ0RfRlJBTUVfMV9JVF9DT05ECSgxPDwzKQorI2RlZmluZSBMQ0RfRlJBTUVfMl9JVF9DT05ECSgxPDw0KQorI2RlZmluZSBMQ0RfQlVTX0VSUk9SX0lUX0NPTkQJKDE8PDUpCisjZGVmaW5lIExDRF9TT1VSQ0VfSU1JRgkJKDE8PDYpCisKKy8qCisgKiBSZWFsLVRpbWUgQ2xvY2sKKyAqLworCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MDApCisjZGVmaW5lIFJUQ19NSU5VVEVTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MDQpCisjZGVmaW5lIFJUQ19IT1VSUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDA4KQorI2RlZmluZSBSVENfREFZUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDBDKQorI2RlZmluZSBSVENfTU9OVEhTCQkodm9sYXRpbGUgX191OCAqKShPTUFQMTUxMF9SVENfQkFTRSArIDB4MTApCisjZGVmaW5lIFJUQ19ZRUFSUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDE0KQorI2RlZmluZSBSVENfQ1RSTAkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDQwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIEludGVycnVwdCBIYW5kbGVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIE9NQVBfSUgxX0JBU0UJCTB4ZmZmZWNiMDAKKyNkZWZpbmUgT01BUF9JSDJfQkFTRQkJMHhmZmZlMDAwMAorI2RlZmluZSBPTUFQMTUxMF9JVFIJCTB4MAorI2RlZmluZSBPTUFQMTUxMF9NQVNLCQkweDQKKworI2RlZmluZSBJTlRFUlJVUFRfSEFORExFUl9CQVNFCSBPTUFQX0lIMV9CQVNFCisjZGVmaW5lIElOVEVSUlVQVF9JTlBVVF9SRUdJU1RFUiBPTUFQMTUxMF9JVFIKKyNkZWZpbmUgSU5URVJSVVBUX01BU0tfUkVHSVNURVIJIE9NQVAxNTEwX01BU0sKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBUSU1FUlMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworCisjZGVmaW5lIE9NQVAxNTEwXzMya0h6X1RJTUVSX0JBU0UgMHhmZmZiOTAwMAorCisvKiAzMmsgVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFRJTUVSMzJrX0NSCTB4MDgKKyNkZWZpbmUgVElNRVIzMmtfVFZSCTB4MDAKKyNkZWZpbmUgVElNRVIzMmtfVENSCTB4MDQKKworLyogMzJrIFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBUSU1FUjMya19UU1MJKDE8PDApCisjZGVmaW5lIFRJTUVSMzJrX1RSQgkoMTw8MSkKKyNkZWZpbmUgVElNRVIzMmtfSU5UCSgxPDwyKQorI2RlZmluZSBUSU1FUjMya19BUkwJKDE8PDMpCisKKy8qIE1QVSBUaW1lciBiYXNlIGFkZHJlc3NlcyAgKi8KKyNkZWZpbmUgT01BUDE1MTBfTVBVVElNRVJfQkFTRQkweGZmZmVjNTAwCisjZGVmaW5lIE9NQVAxNTEwX01QVVRJTUVSX09GRgkweDAwMDAwMTAwCisKKyNkZWZpbmUgT01BUDE1MTBfVElNRVIxX0JBU0UJMHhmZmZlYzUwMAorI2RlZmluZSBPTUFQMTUxMF9USU1FUjJfQkFTRQkweGZmZmVjNjAwCisjZGVmaW5lIE9NQVAxNTEwX1RJTUVSM19CQVNFCTB4ZmZmZWM3MDAKKworLyogTVBVIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBDTlRMX1RJTUVSCTAKKyNkZWZpbmUgTE9BRF9USU0JNAorI2RlZmluZSBSRUFEX1RJTQk4CisKKy8qICBDTlRMX1RJTUVSIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTVBVVElNX0ZSRUUJCSgxPDw2KQorI2RlZmluZSBNUFVUSU1fQ0xPQ0tfRU5BQkxFCSgxPDw1KQorI2RlZmluZSBNUFVUSU1fUFRWX01BU0sJCSgweDc8PFBUVl9CSVQpCisjZGVmaW5lIE1QVVRJTV9QVFZfQklUCQkyCisjZGVmaW5lIE1QVVRJTV9BUgkJKDE8PDEpCisjZGVmaW5lIE1QVVRJTV9TVAkJKDE8PDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIEdQSU8gKFNIQVJFRCkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBHUElPX0RBVEFfSU5QVVRfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDApCisjZGVmaW5lIEdQSU9fREFUQV9PVVRQVVRfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDQpCisjZGVmaW5lIEdQSU9fRElSX0NPTlRST0xfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDgpCisjZGVmaW5lIEdQSU9fSU5UX0NPTlRST0xfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweGMpCisjZGVmaW5lIEdQSU9fSU5UX01BU0tfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDEwKQorI2RlZmluZSBHUElPX0lOVF9TVEFUVVNfUkVHCShPTUFQMTUxMF9HUElPX0JBU0UgKyAweDE0KQorI2RlZmluZSBHUElPX1BJTl9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxOCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9NQVAxNTEwIE1QVUlPIChBUk0gb25seSkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVAxNTEwX01QVUlPX0JBU0UJMHhGRkZCNTAwMAorI2RlZmluZSBNUFVJT19EQVRBX0lOUFVUX1JFRwkoT01BUDE1MTBfTVBVSU9fQkFTRSArIDB4MCkKKyNkZWZpbmUgTVBVSU9fREFUQV9PVVRQVVRfUkVHCShPTUFQMTUxMF9NUFVJT19CQVNFICsgMHg0KQorI2RlZmluZSBNUFVJT19ESVJfQ09OVFJPTF9SRUcJKE9NQVAxNTEwX01QVUlPX0JBU0UgKyAweDgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIFRJUEIgKG9ubHkpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgVElQQl9QVUJMSUNfQ05UTF9CQVNFCQkweGZmZmVkMzAwCisjZGVmaW5lIE1QVV9QVUJMSUNfVElQQl9DTlRMX1JFRwkoVElQQl9QVUJMSUNfQ05UTF9CQVNFICsgMHg4KQorI2RlZmluZSBUSVBCX1BSSVZBVEVfQ05UTF9CQVNFCQkweGZmZmVjYTAwCisjZGVmaW5lIE1QVV9QUklWQVRFX1RJUEJfQ05UTF9SRUcJKFRJUEJfUFJJVkFURV9DTlRMX0JBU0UgKyAweDgpCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBDYW1lcmEgSW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBDQU1FUkFfQkFTRQkJKElPX0JBU0UgKyAweDY4MDApCisjZGVmaW5lIENBTV9DVFJMQ0xPQ0tfUkVHCShDQU1FUkFfQkFTRSArIDB4MDApCisjZGVmaW5lIENBTV9JVF9TVEFUVVNfUkVHCShDQU1FUkFfQkFTRSArIDB4MDQpCisjZGVmaW5lIENBTV9NT0RFX1JFRwkJKENBTUVSQV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgQ0FNX1NUQVRVU19SRUcJCShDQU1FUkFfQkFTRSArIDB4MEMpCisjZGVmaW5lIENBTV9DQU1EQVRBX1JFRwkJKENBTUVSQV9CQVNFICsgMHgxMCkKKyNkZWZpbmUgQ0FNX0dQSU9fUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDE0KQorI2RlZmluZSBDQU1fUEVBS19DVFJfUkVHCShDQU1FUkFfQkFTRSArIDB4MTgpCisKKyNpZiAwCisjaWZuZGVmIF9fQVNTRU1CTFlfXwordHlwZWRlZiBzdHJ1Y3QgeworCV9fdTMyIGN0cmxjbG9jazsKKwlfX3UzMiBpdF9zdGF0dXM7CisJX191MzIgbW9kZTsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgY2FtZGF0YTsKKwlfX3UzMiBncGlvOworCV9fdTMyIHBlYWtfY291bnRlcjsKK30gY2FtZXJhX3JlZ3NfdDsKKyNlbmRpZgorI2VuZGlmCisKKy8qIENUUkxDTE9DSyBiaXQgc2hpZnRzICovCisjZGVmaW5lIEZPU0NNT0RfQklUCTAKKyNkZWZpbmUgRk9TQ01PRF9NQVNLCSgweDcgPDwgRk9TQ01PRF9CSVQpCisjZGVmaW5lCSBGT1NDTU9EXzEyTUh6CTB4MAorI2RlZmluZQkgRk9TQ01PRF82TUh6CTB4MgorI2RlZmluZQkgRk9TQ01PRF85XzZNSHogMHg0CisjZGVmaW5lCSBGT1NDTU9EXzI0TUh6CTB4NQorI2RlZmluZQkgRk9TQ01PRF84TUh6CTB4NgorI2RlZmluZSBQT0xDTEsJCSgxPDwzKQorI2RlZmluZSBDQU1FWENMS19FTgkoMTw8NCkKKyNkZWZpbmUgTUNMS19FTgkJKDE8PDUpCisjZGVmaW5lIERQTExfRU4JCSgxPDw2KQorI2RlZmluZSBMQ0xLX0VOCQkoMTw8NykKKworLyogSVRfU1RBVFVTIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgVl9VUAkJKDE8PDApCisjZGVmaW5lIFZfRE9XTgkJKDE8PDEpCisjZGVmaW5lIEhfVVAJCSgxPDwyKQorI2RlZmluZSBIX0RPV04JCSgxPDwzKQorI2RlZmluZSBGSUZPX0ZVTEwJKDE8PDQpCisjZGVmaW5lIERBVEFfWEZFUgkoMTw8NSkKKworLyogTU9ERSBiaXQgc2hpZnRzICovCisjZGVmaW5lIENBTU9TQwkJKDE8PDApCisjZGVmaW5lIElNR1NJWkVfQklUCTEKKyNkZWZpbmUgSU1HU0laRV9NQVNLCSgweDMgPDwgSU1HU0laRV9CSVQpCisjZGVmaW5lCSBJTUdTSVpFX0NJRgkoMHgwIDw8IElNR1NJWkVfQklUKQkvKiAzNTJ4Mjg4ICovCisjZGVmaW5lCSBJTUdTSVpFX1FDSUYJKDB4MSA8PCBJTUdTSVpFX0JJVCkJLyogMTc2eDE0NCAqLworI2RlZmluZQkgSU1HU0laRV9WR0EJKDB4MiA8PCBJTUdTSVpFX0JJVCkJLyogNjQweDQ4MCAqLworI2RlZmluZQkgSU1HU0laRV9RVkdBCSgweDMgPDwgSU1HU0laRV9CSVQpCS8qIDMyMHgyNDAgKi8KKyNkZWZpbmUgT1JERVJDQU1ECSgxPDwzKQorI2RlZmluZSBFTl9WX1VQCQkoMTw8NCkKKyNkZWZpbmUgRU5fVl9ET1dOCSgxPDw1KQorI2RlZmluZSBFTl9IX1VQCQkoMTw8NikKKyNkZWZpbmUgRU5fSF9ET1dOCSgxPDw3KQorI2RlZmluZSBFTl9ETUEJCSgxPDw4KQorI2RlZmluZSBUSFJFU0hPTEQJKDE8PDkpCisjZGVmaW5lIFRIUkVTSE9MRF9CSVQJOQorI2RlZmluZSBUSFJFU0hPTERfTUFTSwkoMHg3Zjw8OSkKKyNkZWZpbmUgRU5fTklSUQkJKDE8PDE2KQorI2RlZmluZSBFTl9GSUZPX0ZVTEwJKDE8PDE3KQorI2RlZmluZSBSQVpfRklGTwkoMTw8MTgpCisKKy8qIFNUQVRVUyBiaXQgc2hpZnRzICovCisjZGVmaW5lIFZTVEFUVVMJCSgxPDwwKQorI2RlZmluZSBIU1RBVFVTCQkoMTw8MSkKKworLyogR1BJTyBiaXQgc2hpZnRzICovCisjZGVmaW5lIENBTV9SU1QJCSgxPDwwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAqIFdhdGNoZG9nIHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0RUSU1fQkFTRQkweGZmZmVjODAwCisjZGVmaW5lIFdEVElNX0NPTlRST0wJKFdEVElNX0JBU0UrMHgwMCkKKyNkZWZpbmUgV0RUSU1fTE9BRAkoV0RUSU1fQkFTRSsweDA0KQorI2RlZmluZSBXRFRJTV9SRUFECShXRFRJTV9CQVNFKzB4MDQpCisjZGVmaW5lIFdEVElNX01PREUJKFdEVElNX0JBU0UrMHgwOCkKKworLyogVmFsdWVzIHRvIHdyaXRlIHRvIG1vZGUgcmVnaXN0ZXIgdG8gZGlzYWJsZSB0aGUgd2F0Y2hkb2cgZnVuY3Rpb24uICovCisjZGVmaW5lIERJU0FCTEVfU0VRMQkweEY1CisjZGVmaW5lIERJU0FCTEVfU0VRMgkweEEwCisKKy8qIFdEVElNX0NPTlRST0wgYml0IGRlZmluaXRpb25zLiAqLworI2RlZmluZSBXRFRJTV9DT05UUk9MX1NUCUJJVDcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBEaWZmZXJlbnRpYXRpbmcgcHJvY2Vzc29yIHZlcnNpb25zIGZvciB0aG9zZSB3aG8gY2FyZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBPTUFQMTUwOSAwCisjZGVmaW5lIE9NQVAxNTEwIDEKKworI2RlZmluZSBPTUFQMTUxMF9JRF9DT0RFX1JFRyAweGZmZmVkNDA0CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitpbnQgY3B1X3R5cGUodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEVWTSBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpY3MuCisgKgorICogKioqIE5PVEUgKioqCisgKiBBbnkgZGVmaW5pdGlvbnMgaW4gdGhlc2UgZmlsZXMgc2hvdWxkIGJlIHByZWZpeGVkIGJ5IGFuIGlkZW50aWZpZXIgLQorICogZWcuIE9NQVAxNTEwUDFfRkxBU0gwX0JBU0UgLgorICoKKyAqLworI2lmZGVmIENPTkZJR19PTUFQX0lOTk9WQVRPUgorI2luY2x1ZGUgImlubm92YXRvci5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT01BUF8xNTEwUDEKKyNpbmNsdWRlICJvbWFwMTUxMHAxLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENMS0dFTl9SRVNFVF9CQVNFICgweGZmZmVjZTAwKQorI2RlZmluZSBBUk1fQ0tDVEwJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgwKQorI2RlZmluZSBBUk1fSURMRUNUMQkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDQpCisjZGVmaW5lIEFSTV9JRExFQ1QyCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4OCkKKyNkZWZpbmUgQVJNX0VXVVBDVAkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweEMpCisjZGVmaW5lIEFSTV9SU1RDVDEJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxMCkKKyNkZWZpbmUgQVJNX1JTVENUMgkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDE0KQorI2RlZmluZSBBUk1fU1lTU1QJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxOCkKKworCisjZGVmaW5lIENLX0NMS0lOCTEyIC8qIE1IeiAqLworI2RlZmluZSBDS19SQVRFRgkxCisjZGVmaW5lIENLX0lETEVGCTIKKyNkZWZpbmUgQ0tfRU5BQkxFRgk0CisjZGVmaW5lIENLX1NFTEVDVEYJOAorI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjZGVmaW5lIENLX0RQTEwxCSgodm9sYXRpbGUgX191MTYgKikweGZmZmVjZjAwKQorI2Vsc2UKKyNkZWZpbmUgQ0tfRFBMTDEgKDB4ZmZmZWNmMDApCisjZW5kaWYKKyNkZWZpbmUgU0VUQVJNX0lETEVfU0hJRlQKKworLyogQVJNX0NLQ1RMIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgUEVSRElWCQkwCisjZGVmaW5lIExDRERJVgkJMgorI2RlZmluZSBBUk1ESVYJCTQKKyNkZWZpbmUgRFNQRElWCQk2CisjZGVmaW5lIFRDRElWCQk4CisjZGVmaW5lIERTUE1NVURJVgkxMAorI2RlZmluZSBBUk1fVElNWE8JMTIKKyNkZWZpbmUgRU5fRFNQQ0sJMTMKKyNkZWZpbmUgQVJNX0lOVEhDS19TRUwJMTQgLyogUkVWSVNJVCAtLSB3aGVyZSBpcyB0aGlzIHVzZWQ/ICovCisKKyNkZWZpbmUgQVJNX0NLQ1RMX1JTUlZEX0JJVDE1CQkoMSA8PCAxNSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTV9JTlRIQ0tfU0VMCSgxIDw8IDE0KQorI2RlZmluZSBBUk1fQ0tDVExfRU5fRFNQQ0sJCSgxIDw8IDEzKQorI2RlZmluZSBBUk1fQ0tDVExfQVJNX1RJTVhPCQkoMSA8PCAxMikKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUE1NVV9ESVYxCQkoMSA8PCAxMSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUE1NVV9ESVYyCQkoMSA8PCAxMCkKKyNkZWZpbmUgQVJNX0NLQ1RMX1RDRElWMQkJKDEgPDwgOSkKKyNkZWZpbmUgQVJNX0NLQ1RMX1RDRElWMgkJKDEgPDwgOCkKKyNkZWZpbmUgQVJNX0NLQ1RMX0RTUERJVjEJCSgxIDw8IDcpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BESVYwCQkoMSA8PCA2KQorI2RlZmluZSBBUk1fQ0tDVExfQVJNRElWMQkJKDEgPDwgNSkKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTURJVjAJCSgxIDw8IDQpCisjZGVmaW5lIEFSTV9DS0NUTF9MQ0RESVYxCQkoMSA8PCAzKQorI2RlZmluZSBBUk1fQ0tDVExfTENERElWMAkJKDEgPDwgMikKKyNkZWZpbmUgQVJNX0NLQ1RMX1BFUkRJVjEJCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9DS0NUTF9QRVJESVYwCQkoMSA8PCAwKQorCisvKiBBUk1fSURMRUNUMSBiaXQgc2hpZnRzICovCisjZGVmaW5lIElETFdEVF9BUk0JMAorI2RlZmluZSBJRExYT1JQX0FSTQkxCisjZGVmaW5lIElETFBFUl9BUk0JMgorI2RlZmluZSBJRExMQ0RfQVJNCTMKKyNkZWZpbmUgSURMTEJfQVJNCTQKKyNkZWZpbmUgSURMSFNBQl9BUk0JNQorI2RlZmluZSBJRExJRl9BUk0JNgorI2RlZmluZSBJRExEUExMX0FSTQk3CisjZGVmaW5lIElETEFQSV9BUk0JOAorI2RlZmluZSBJRExUSU1fQVJNCTkKKyNkZWZpbmUgU0VUQVJNX0lETEUJMTEKKworLyogQVJNX0lETEVDVDIgYml0IHNoaWZ0cyAqLworI2RlZmluZSBFTl9XRFRDSwkwCisjZGVmaW5lIEVOX1hPUlBDSwkxCisjZGVmaW5lIEVOX1BFUkNLCTIKKyNkZWZpbmUgRU5fTENEQ0sJMworI2RlZmluZSBFTl9MQkNLCQk0CisjZGVmaW5lIEVOX0hTQUJDSwk1CisjZGVmaW5lIEVOX0FQSUNLCTYKKyNkZWZpbmUgRU5fVElNQ0sJNworI2RlZmluZSBETUFDS19SRVEJOAorI2RlZmluZSBFTl9HUElPQ0sJOQorI2RlZmluZSBFTl9MQkZSRUVDSwkxMAorCisjZGVmaW5lIEFSTV9SU1RDVDFfU1dfUlNUCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9SU1RDVDFfRFNQX1JTVAkoMSA8PCAyKQorI2RlZmluZSBBUk1fUlNUQ1QxX0RTUF9FTgkoMSA8PCAxKQorI2RlZmluZSBBUk1fUlNUQ1QxX0FSTV9SU1QJKDEgPDwgMCkKKworLyogQVJNX1JTVENUMiBiaXQgc2hpZnRzICovCisjZGVmaW5lIEVOX1BFUgkJMAorCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQxNQkoMSA8PCAxNSkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDE0CSgxIDw8IDE0KQorI2RlZmluZSBBUk1fU1lTU1RfQ0xPQ0tfU0VMRUNUMiAoMSA8PCAxMykKKyNkZWZpbmUgQVJNX1NZU1NUX0NMT0NLX1NFTEVDVDEgKDEgPDwgMTIpCisjZGVmaW5lIEFSTV9TWVNTVF9DTE9DS19TRUxFQ1QwICgxIDw8IDExKQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUMTAJKDEgPDwgMTApCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ5CSgxIDw8IDkpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ4CSgxIDw8IDgpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQ3CSgxIDw8IDcpCisjZGVmaW5lIEFSTV9TWVNTVF9JRExFX0RTUAkoMSA8PCA2KQorI2RlZmluZSBBUk1fU1lTU1RfUE9SCQkoMSA8PCA1KQorI2RlZmluZSBBUk1fU1lTU1RfRVhUX1JTVAkoMSA8PCA0KQorI2RlZmluZSBBUk1fU1lTU1RfQVJNX01DUlNUCSgxIDw8IDMpCisjZGVmaW5lIEFSTV9TWVNTVF9BUk1fV0RSU1QJKDEgPDwgMikKKyNkZWZpbmUgQVJNX1NZU1NUX0dMT0JfU1dSU1QJKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1NZU1NUX0RTUF9XRFJTVAkoMSA8PCAwKQorCisvKiBUYWJsZSAxNS0yMy4gRFBMTCBDb250cm9sIFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgRFBMTF9DVExfUkVHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlY2YwMCkKKworLyogVGFibGUgMTUtMjQuIENvbnRyb2wgUmVnaXN0ZXIgKENUTF9SRUcpOiAqLworCisjZGVmaW5lIERQTExfQ1RMX1JFR19JT0IJCSgxIDw8IDEzKQorI2RlZmluZSBEUExMX0NUTF9SRUdfUExMX01VTFQJCUZsZCg1LDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT01BUCBJTlRFUlJVUFQgUkVHSVNURVJTICovCisjZGVmaW5lIElSUV9JVFIJCQkweDAwCisjZGVmaW5lIElSUV9NSVIJCQkweDA0CisjZGVmaW5lIElSUV9TSVJfSVJRCQkweDEwCisjZGVmaW5lIElSUV9TSVJfRklRCQkweDE0CisjZGVmaW5lIElSUV9DT05UUk9MX1JFRwkJMHgxOAorI2RlZmluZSBJUlFfSVNSCQkJMHg5YworI2RlZmluZSBJUlFfSUxSMAkJMHgxYworCisjZGVmaW5lIFJFR19JSEwxX01JUiAgKE9NQVBfSUgxX0JBU0UrSVJRX01JUikKKyNkZWZpbmUgUkVHX0lITDJfTUlSICAoT01BUF9JSDJfQkFTRStJUlFfTUlSKQorCisvKiBJTlRFUlJVUFQgTEVWRUwgUkVHSVNURVIgQklUUyAqLworI2RlZmluZSBJTFJfUFJJT1JJVFlfTUFTSwkoMHgzYykKKyNkZWZpbmUgSUxSX1BSSU9SSVRZX1NISUZUCSgyKQorI2RlZmluZSBJTFJfTEVWRUxfVFJJR0dFUgkoMTw8MSkKKyNkZWZpbmUgSUxSX0ZJUQkJCSgxPDwwKQorCisjZGVmaW5lIElSUV9MRVZFTF9JTlQJCTEKKyNkZWZpbmUgSVJRX0VER0VfSU5UCQkwCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg4MWJkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPiwgS3NoaXRpaiBHdXB0YSA8a3NoaXRpakB0aS5jb20+CisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEgzIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIGV4YWN0bHkgdW5jb21tZW50IG9uZSAqLworI2RlZmluZSBDRkdfQk9PVF9DUzAJICAvKiBST00gY29kZSAtPiBzaWduZWQgWC1Mb2FkZXIgaW4gTk5BRCAqLworLy8jZGVmaW5lIENGR19CT09UX0NTMwkgIC8qIHVuc2lnbmVkIFgtbG9hZGVyIGluIE5PUiBmb3IgZGV2ZWxvcG1lbnQgKi8KKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJMQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgY29yZSAgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAJMQkJCS8qIGluIGEgVEkgT01BUCBjb3JlICAgICovCisjZGVmaW5lIENPTkZJR19PTUFQMTcxMAkxCQkvKiB3aGljaCBpcyBpbiBhIDE3MTAgICovCisjZGVmaW5lIENPTkZJR19IM19PTUFQMTcxMAkxCS8qICBhIEgzIEJvYXJkICAqLworCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMTcxMCBIMyBoYXMgMTJNSHogaW5wdXQgY2xvY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkxMjAwMDAwMAorCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCSgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoNDgwMDAwMDApCS8qIGNhbiBiZSAxMk0vMzJLaHogb3IgNDhNaHogKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweGZmZmIwMDAwCS8qIHVhcnQxLCBibHVldG9vdGggdWFydCBvbiBoZWxlbiAqLworCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisjaW5jbHVkZSA8Y29uZmlncy9vbWFwMTUxMC5oPgorCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisjZGVmaW5lIENGR19MT0FEQUREUiAJMHgxMTAwMDAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyogVGhlIDE3MTAgaGFzIDYgdGltZXJzLCB0aGV5IGNhbiBiZSBkcml2ZW4gYnkgdGhlIFJlZkNsayAoMTJNaHopIG9yIGJ5CisgKiBEUExMMS4gVGhpcyB0aW1lIGlzIGZ1cnRoZXIgc3ViZGl2aWRlZCBieSBhIGxvY2FsIGRpdmlzb3IuCisgKi8KKyNkZWZpbmUgQ0ZHX1RJTUVSQkFTRQkweEZGRkVDNTAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENGR19QVlQJNwkvKiAyXihwdnQrMSksIGRpdmlkZSBieSAyNTYgKi8KKyNkZWZpbmUgQ0ZHX0haCSgoQ09ORklHX1NZU19DTEtfRlJFUSkvKDIgPDwgQ0ZHX1BWVCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlGNTYxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCAzMk1CIGNoaXAgKi8KKworI2lmZGVmIENGR19CT09UX0NTMAorI2RlZmluZSBOQU5EX0FERFIgMHgwYzAwMDAwMCAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgbmFuZCBhdCBDUzMqLworI2Vsc2UKKyNkZWZpbmUgTkFORF9BRERSIDB4MGEwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MyQiovCisjZW5kaWYKKworLyogSDMgTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDIwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDAxMDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDUwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4ICopKCh1bnNpZ25lZCBsb25nKWFkciArIDIpID0gKF9fdTgpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTggKikoKHVuc2lnbmVkIGxvbmcpYWRyICsgNCkgPSAoX191OCkoZCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRveyAqKHZvbGF0aWxlIF9fdTE2ICopKCh1bnNpZ25lZCBsb25nKWFkcikgPSAoX191MTYpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgX191MTYpKCoodm9sYXRpbGUgX191MTYgKikodW5zaWduZWQgbG9uZylhZHIpKQorCisjZGVmaW5lIEdQSU8xX0RBVEFJTgkJMHhmZmZiZTQyYworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKSAgCXdoaWxlKCEoKCoodm9sYXRpbGUgX191MTYgKikoR1BJTzFfREFUQUlOKSAmIDB4MDQwMCkgPT0gMHgwNDAwKSk7CisgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgICAgIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpICAgICAgIAorCisKKyNlbmRpZgkJCQkJCQkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk1ZDdmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiAKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgSDQgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk0xMTM2ICAgICAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gYXJtMTEzNiBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDI0MjAJICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDI0MjAgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDIwSDQgICAgICAgIDEgICAgLyogYW5kIG9uIGEgSDQgYm9hcmQgKi8KKworI2RlZmluZSBDT05GSUdfT01BUDI0MlgKKworI2RlZmluZSBQUkNNX0NPTkZJR19JSSAgICAgICAgICAgMSAgICAKKy8vI2RlZmluZSBQUkNNX0NPTkZJR19JSUkgICAgICAgICAgIDEgICAgCisjZGVmaW5lIENPTkZJR19QQVJUSUFMX1NSQU0gICAgICAxCisKKy8vI2RlZmluZSBDRkdfU0RSQU1fRERSCQkJMQorI2RlZmluZSBDRkdfU0RSQU1fQ09NQk8JCTIKKy8vI2RlZmluZSBDRkdfU0RSQU1fU0RSCQkJMworLy8jZGVmaW5lIENGR19TRFJBTV9TVEFDS0VECQk0CisJIAorLyogQ2hpcHNlbGVjdCBhbmQgTkFORCBpbmZvcm1hdGlvbiA6CisgICBTaW5jZSB3ZSBzaGFyZSB0aGUgbWVtLmggZnJvbSB1LWJvb3QsIHdlIGRlZmluZSBmZXcgbWFjcm9zIGhlcmUKKyAgIHNvIGFzIHRvIHBpY2sgdGhlIHJpZ2h0IGdwbWMgdmFsdWVzIGZyb20gdGhlcmUgZm9yIHRoZSBtYWNyb3MgaW4gbWVtLmgKKyovCisvKiBOQU5EIGZpeGVkIGF0IENTNSAqLworI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMCBTTU5BTkQKKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfNjRNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfTkFORF9CT09UCisjZGVmaW5lIE5BTkRfTEVHQUNZCisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQyMC5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgMTIwMDAwMDAKKy8qIGlucHV0IGNsb2NrIG9mIFBMTCAqLworLyogdGhlIE9NQVAyNDIwIEg0IGhhcyAxMk1IeiwgMTNNSHosIG9yIDE5LjJNaHogY3J5c3RhbCBpbnB1dCAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICAgVl9TQ0xLCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCSgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkoNDgwMDAwMDApCS8qIGNhbiBiZSAxMk0vMzJLaHogb3IgNDhNaHogKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAyNDIwX1VBUlQxCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiBINCAqLworCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRQkyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgCTB4ODAwMDAwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlLMTIxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCA2NE1CIGNoaXAgKi8KKworI2RlZmluZSBOQU5EX0FERFIgMHgwNDAwMDAwMCAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgbmFuZCBhdCBDUzAqLworIAorLyogSDQgTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDQwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDA0MDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDgwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDdDID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODQgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgKCoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA4NCkKKworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorICAKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgZG8geyoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwNTApIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDUwKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworCisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRhNjFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiAKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgSDQgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk0xMTM2ICAgICAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gYXJtMTEzNiBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDI0MzBINCAgICAgICAgMSAgICAvKiBhbmQgb24gYSBINCBib2FyZCAqLworCisjZGVmaW5lIENPTkZJR19PTUFQMjQzWCAxCisKKy8vI2RlZmluZSBQUkNNX0NPTkZJR181QQkJIDEKKyNkZWZpbmUgUFJDTV9DT05GSUdfMiAgICAgICAgICAgMSAvKiAyNDMwIEVTMiszMzBBUk0rRERSLTE2NS1QSVNNTyAqLworCisjZGVmaW5lIE9NQVAyNDMwX1NRVUFSRV9DTE9DS19JTlBVVCAxCisKKy8qIE1lbW9yeSB0eXBlICovCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX0REUgkJCTEgLyogbm90IHRlc3RlZCAqLworLy8jZGVmaW5lIENGR19TRFJBTV9DT01CTwkJMiAvKiBub3QgdGVzdGVkICovCisjZGVmaW5lIENGR18yNDMwU0RSQU1fRERSCQkzCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX1NUQUNLRUQJCTQgLyogbm90IHRlc3RlZCAqLworCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworLy8jZGVmaW5lIENGR19OQU5EIDEKKyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0UgICAgICAgICAgICAweDBDMDAwMDAwICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UJICAgICAgMHgyMDAwMDAwMCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjaWZkZWYgQ0ZHX05BTkQKKyNkZWZpbmUgTkFORF9MRUdBQ1kKKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfNjRNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBOQU5EX0JBU0UKKyNlbHNlCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBPbmVOQU5EIGF0IENTMCovCisjZW5kaWYKKworLyogQW5vdGhlciBkZXBlbmRlbmN5IG9uIHUtYm9vdCAqLworI2RlZmluZSBzZGVsYXkgZGVsYXkKKwkgCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MzAuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIDEzMDAwMDAwCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMjQyMCBINCBoYXMgMTJNSHosIDEzTUh6LCBvciAxOS4yTWh6IGNyeXN0YWwgaW5wdXQgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgIFZfU0NMSworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMjQzMF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gMjQzMFNEUCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSIAkweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworI2lmZGVmIENGR19OQU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfTkFORF9LOUsxMjE2ICAgIC8qIFNhbXN1bmcgMTYtYml0IDY0TUIgY2hpcCAqLworCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwIC0gMHgwMDEwMDAwIAlCb290aW5nIEltYWdlCisgKiAweDAwMTAwMDAgLSAweDAwNTAwMDAgCVUtQm9vdCBJbWFnZQorICogMHgwMDUwMDAwIC0gMHgwMDgwMDAwIAlVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDA4MDAwMCAtIDB4MDBCMDAwMCAJS2VybmVsIEltYWdlCisgKiAweDAwQjAwMDAgLSAweDQwMDAwMDAgCWRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUCTB4MDA0MDAwMAorI2RlZmluZSBOQU5EX1VCT09UX0VORAkJMHgwMDgwMDAwCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkJMHg0MDAwCisgIAorI2RlZmluZSBHUE1DX0NPTkZJRwkJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMAkoT01BUDI0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDg0KQorCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgICAgICAgICAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgICAgIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpICAgICAgIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICAgICAgICBYLUxvYWRlciAKKyAqICAgMHgwMDgwMDAwIC0gMHgwMGMwMDAwICAgICAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMGMwMDAwIC0gMHgwMGUwMDAwICAgICAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgICAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwMTIwMDAwIC0gMHg0MDAwMDAwICAgICAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgICAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgICAgICAgCTYKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgICAgICAgICAyMDQ4ICAgICAgICAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAgICAgMHgyMDAwMCAgICAgICAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvLyBvbmVOQU5ECisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwbGFicmFkb3IuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYwODg3MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgCisgKiBUZXhhcyBJbnN0cnVtZW50cyA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIFNEUDM0MzAgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBhIDM0WFggKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAzNDMwICovCisjZGVmaW5lIENPTkZJR18zNDMwTEFCUkFET1IgICAgICAxICAgIC8qIHdvcmtpbmcgb24gTGFicmFkb3IgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwICAgIDEgICAgLyogdHJ1ZSBmb3IgMzQzMCBpbiAzNDEwIG1vZGUgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAyNjAwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkgICAgICAgICAgCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09NTAwTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfMzQzMFNEUkFNX0REUiAgICAgICAgMQorCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworI2RlZmluZSBDRkdfTkFORCAxCisvLyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNpZmRlZiBDRkdfTkFORAorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNICAvKiB1ID0gb2Zkb24ndCBuZWVkIHNvIG11Y2ggZm9yIG5hbmQgcG9ydCAqLworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgTkFORF9CQVNFX0FEUgorI2Vsc2UKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9NQVAgT05FTkFORF9CQVNFCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworI2VuZGlmCisKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMyAgICAgICAgIE9NQVAzNFhYX1VBUlQzCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMyAgICAgICAgICAgMyAgICAvKiBVQVJUMyBvbiBib2FyZCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisjaWZkZWYgQ0ZHX05BTkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIE1pY3JvbiAxNi1iaXQgMjU2TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDBCRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMEMwMDAwIC0gMHgwMDBGRkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMTAwMDAwIC0gMHgwMDJGRkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwMzAwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAwQzAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorICAKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZW5kaWYKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgCisKKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlciAKKyAqICAgMHgwMDgwMDAwIC0gMHgwMGMwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDBjMDAwMCAtIDB4MDBlMDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAwZTAwMDAgLSAweDAxMjAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwMTIwMDAwIC0gMHg0MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDYKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmICAvKiBvbmVOQU5EICovCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODgwZWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiAKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFRJIE9NQVAgU0RQMzQzMCBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBzZXJpYWwgcHJpbnRmIGZhY2lsaXR5IHRha2VzIGFib3V0IDMuNUsgKi8KKyNkZWZpbmUgQ0ZHX1BSSU5URiAKKy8vI3VuZGVmIENGR19QUklOVEYgCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGEgMzRYWCAqLworI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDM0MzAgKi8KKyNkZWZpbmUgQ09ORklHXzM0MzBTRFAgICAgICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIFNEUCAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwX0FTXzM0MTAJIDEgICAgLyogdHJ1ZSBmb3IgMzQzMCBpbiAzNDEwIG1vZGUgKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisvLyNkZWZpbmUgQ09ORklHX01NQyAgICAgICAgICAgICAgIDEKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisJI2RlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgICAgMQorCSNkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKyAKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDE5MjAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKSAgICAgICAgICAKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIChWX09TQ0sgPj4gMSkKKyNlbHNlCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICBWX09TQ0sKKyNlbmRpZgorCisvLyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAxICAgIC8qIFZERDI9MS4xNXYgLSAxMzNNSHogRERSICovCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgICAxICAgIC8qIFZERDI9MS4xNXYgLSAxNjZNSHogRERSICovCisjZGVmaW5lIFBSQ01fUENMS19PUFAyICAgICAgICAgICAxICAgIC8qIEFSTT0zODFNSHogLSBWREQxPTEuMjB2ICovCisKKy8qIE1lbW9yeSB0eXBlICovCisjZGVmaW5lIENGR18zNDMwU0RSQU1fRERSICAgICAgICAxCisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgICAgIDEKKworLyogQm9vdCB0eXBlICovCisjZGVmaW5lIENGR19OQU5EIDEKKy8vI2RlZmluZSBDRkdfT05FTkFORCAxCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2lmZGVmIENGR19OQU5ECisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE5BTkRfQkFTRV9BRFIKKyNlbHNlCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKyNlbmRpZgorIAorI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAzNFhYX1VBUlQxCisgCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMSAgICAgICAgICAgMSAgICAvKiBVQVJUMSBvbiAzNDMwU0RQICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKyNpZmRlZiBDRkdfTkFORAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworCisjZGVmaW5lIENGR19OQU5EX0s5RjFHMDhSMEEgICAgLyogU2Ftc3VuZyA4LWJpdCAxMjhNQiBjaGlwIGxhcmdlIHBhZ2UgTkFORCBjaGlwKi8KKyNkZWZpbmUgTkFORF84QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAwQkZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDBDMDAwMCAtIDB4MDAwRkZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDEwMDAwMCAtIDB4MDAyRkZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDMwMDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMEMwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKyAgCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAwYzAwMDAgLSAweDAwZTAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICA2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAgLyogb25lTkFORCAqLworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDNldm0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODEwYTE3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWlzdHJhbCBTb2x1dGlvbnMgUHZ0IEx0ZC4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBPTUFQM0VWTSBib2FyZC4KKyAqCisgKiBEZXJpdmVkIGZyb20gL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMHNkcC5oCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYKKy8vI3VuZGVmIENGR19QUklOVEYKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgYSAzNFhYICovCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMzQzMCAqLworLy8jZGVmaW5lIENPTkZJR18zNDMwU0RQICAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBTRFAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwCSAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKyNkZWZpbmUgQ09ORklHX09NQVAzRVZNICAgICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEVWTSAqLworCisvKiBFbmFibGUgdGhlIGJlbG93IG1hY3JvIGlmIE1NQyBib290IHN1cHBvcnQgaXMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQ09ORklHX01NQyAgICAgICAgICAgICAgIDEKKyNpZiBkZWZpbmVkKENPTkZJR19NTUMpCisJI2RlZmluZSBDRkdfQ01EX01NQyAgICAgICAgICAgICAgMQorCSNkZWZpbmUgQ0ZHX0NNRF9GQVQgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisvKiB1bmNvbW1lbnQgaXQgaWYgeW91IG5lZWQgdGltZXIgYmFzZWQgdWRlbGF5KCkuIGl0IHRha2VzIGFib3V0IDI1MCBieXRlcyAqLworLy8jZGVmaW5lIENGR19VREVMQVkKKworLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMjYwMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfT01BUEVWTV9ERFIJCTEKKyNkZWZpbmUgQ0ZHXzM0MzBTRFJBTV9ERFIJMQorI2RlZmluZSBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgICAgMQorCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAgKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICAgKDQ4MDAwMDAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDM0WFhfVUFSVDEKKworLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gT01BUDNFVk0gKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDIzRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMjQwMDAwIC0gMHgwMDI3RkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMjgwMDAwIC0gMHgwMDc3RkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwNzgwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAyNDAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikKKyNkZWZpbmUgTkFORF9ESVNBQkxFX0NFKCkKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBvbmVOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX1NZTkNfQlVSU1RfUkVBRCAgICAgIDEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlcgorICogICAweDAwODAwMDAgLSAweDAyNDAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMjQwMDAwIC0gMHgwMjgwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDI4MDAwMCAtIDB4MDc4MDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDA3ODAwMDAgLSAweDgwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgMTgKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9mYXQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NzNiYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBSL08gKFYpRkFUIDEyLzE2LzMyIGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24gYnkgTWFyY3VzIFN1bmRiZXJnCisgKgorICogMjAwMi0wNy0yOCAtIHJqb25lc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byBwcGNib290IHYxLjEuNgorICogMjAwMy0wMy0xMCAtIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gdS1ib290CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0ZBVF9IXworI2RlZmluZSBfRkFUX0hfCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAorCisjZGVmaW5lIFNFQ1RPUl9TSVpFIEZTX0JMT0NLX1NJWkUKKworI2RlZmluZSBGU19CTE9DS19TSVpFIDUxMgorCisjaWYgRlNfQkxPQ0tfU0laRSAhPSBTRUNUT1JfU0laRQorI2Vycm9yIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUgLSBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgZml4ZWQhCisjZW5kaWYKKworI2RlZmluZSBNQVhfQ0xVU1RTSVpFCTY1NTM2CisjZGVmaW5lIERJUkVOVFNQRVJCTE9DSwkoRlNfQkxPQ0tfU0laRS9zaXplb2YoZGlyX2VudHJ5KSkKKyNkZWZpbmUgRElSRU5UU1BFUkNMVVNUCSgobXlkYXRhLT5jbHVzdF9zaXplKlNFQ1RPUl9TSVpFKS9zaXplb2YoZGlyX2VudHJ5KSkKKworI2RlZmluZSBGQVRCVUZCTE9DS1MJNgorI2RlZmluZSBGQVRCVUZTSVpFCShGU19CTE9DS19TSVpFKkZBVEJVRkJMT0NLUykKKyNkZWZpbmUgRkFUMTJCVUZTSVpFCSgoRkFUQlVGU0laRSoyKS8zKQorI2RlZmluZSBGQVQxNkJVRlNJWkUJKEZBVEJVRlNJWkUvMikKKyNkZWZpbmUgRkFUMzJCVUZTSVpFCShGQVRCVUZTSVpFLzQpCisKKworLyogRmlsZXN5c3RlbSBpZGVudGlmaWVycyAqLworI2RlZmluZSBGQVQxMl9TSUdOCSJGQVQxMiAgICIKKyNkZWZpbmUgRkFUMTZfU0lHTgkiRkFUMTYgICAiCisjZGVmaW5lIEZBVDMyX1NJR04JIkZBVDMyICAgIgorI2RlZmluZSBTSUdOTEVOCQk3CisKKy8qIEZpbGUgYXR0cmlidXRlcyAqLworI2RlZmluZSBBVFRSX1JPICAgICAgMQorI2RlZmluZSBBVFRSX0hJRERFTiAgMgorI2RlZmluZSBBVFRSX1NZUyAgICAgNAorI2RlZmluZSBBVFRSX1ZPTFVNRSAgOAorI2RlZmluZSBBVFRSX0RJUiAgICAgMTYKKyNkZWZpbmUgQVRUUl9BUkNIICAgIDMyCisKKyNkZWZpbmUgQVRUUl9WRkFUICAgICAoQVRUUl9STyB8IEFUVFJfSElEREVOIHwgQVRUUl9TWVMgfCBBVFRSX1ZPTFVNRSkKKworI2RlZmluZSBERUxFVEVEX0ZMQUcJKChjaGFyKTB4ZTUpIC8qIE1hcmtzIGRlbGV0ZWQgZmlsZXMgd2hlbiBpbiBuYW1lWzBdICovCisjZGVmaW5lIGFSSU5HCQkweDA1CSAgICAgLyogVXNlZCB0byByZXByZXNlbnQgJ+UnIGluIG5hbWVbMF0gKi8KKworLyogSW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IGlzIHRoZSBsYXN0IGxvbmcgZW50cnkgaW4gYSBzZXQgb2YgbG9uZworICogZGlyIGVudHJpZXMKKyAqLworI2RlZmluZSBMQVNUX0xPTkdfRU5UUllfTUFTSwkweDQwCisKKy8qIEZsYWdzIHRlbGxpbmcgd2hldGhlciB3ZSBzaG91bGQgcmVhZCBhIGZpbGUgb3IgbGlzdCBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBMU19OTwkwCisjZGVmaW5lIExTX1lFUwkxCisjZGVmaW5lIExTX0RJUgkxCisjZGVmaW5lIExTX1JPT1QJMgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgRkFUX0RQUklOVChhcmdzLi4uKQlwcmludGYoYXJncykKKyNlbHNlCisjZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikKKyNlbmRpZgorI2RlZmluZSBGQVRfRVJST1IoYXJnKQkJcHJpbnRmKGFyZykKKworI2RlZmluZSBJU0RJUkRFTElNKGMpICAgKChjKSA9PSAnLycgfHwgKGMpID09ICdcXCcpCisKKyNkZWZpbmUgRlNUWVBFX05PTkUJKC0xKQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgRkFUMkNQVTE2CWxlMTZfdG9fY3B1CisjZGVmaW5lIEZBVDJDUFUzMglsZTMyX3RvX2NwdQorI2Vsc2UKKyNpZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgRkFUMkNQVTE2KHgpCSh4KQorI2RlZmluZSBGQVQyQ1BVMzIoeCkJKHgpCisjZWxzZQorI2RlZmluZSBGQVQyQ1BVMTYoeCkJKCgoKHgpICYgMHgwMGZmKSA8PCA4KSB8ICgoKHgpICYgMHhmZjAwKSA+PiA4KSkKKyNkZWZpbmUgRkFUMkNQVTMyKHgpCSgoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSAgfAlcCisJIAkJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwJXAorCQkJICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gOCkgIHwJXAorCQkJICgoKHgpICYgMHhmZjAwMDAwMCkgPj4gMjQpKQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBUT0xPV0VSKGMpCWlmKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJyl7KGMpKz0oJ2EnIC0gJ0EnKTt9CisjZGVmaW5lIFNUQVJUKGRlbnQpCShGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydCkgXAorCQkJKyAobXlkYXRhLT5mYXRzaXplICE9IDMyID8gMCA6IFwKKwkJCSAgKEZBVDJDUFUxNigoZGVudCktPnN0YXJ0aGkpIDw8IDE2KSkpCisKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdF9zZWN0b3IgeworCV9fdTgJaWdub3JlZFszXTsJLyogQm9vdHN0cmFwIGNvZGUgKi8KKwljaGFyCXN5c3RlbV9pZFs4XTsJLyogTmFtZSBvZiBmcyAqLworCV9fdTgJc2VjdG9yX3NpemVbMl07CS8qIEJ5dGVzL3NlY3RvciAqLworCV9fdTgJY2x1c3Rlcl9zaXplOwkvKiBTZWN0b3JzL2NsdXN0ZXIgKi8KKwlfX3UxNglyZXNlcnZlZDsJLyogTnVtYmVyIG9mIHJlc2VydmVkIHNlY3RvcnMgKi8KKwlfX3U4CWZhdHM7CQkvKiBOdW1iZXIgb2YgRkFUcyAqLworCV9fdTgJZGlyX2VudHJpZXNbMl07CS8qIE51bWJlciBvZiByb290IGRpcmVjdG9yeSBlbnRyaWVzICovCisJX191OAlzZWN0b3JzWzJdOwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyAqLworCV9fdTgJbWVkaWE7CQkvKiBNZWRpYSBjb2RlICovCisJX191MTYJZmF0X2xlbmd0aDsJLyogU2VjdG9ycy9GQVQgKi8KKwlfX3UxNglzZWNzX3RyYWNrOwkvKiBTZWN0b3JzL3RyYWNrICovCisJX191MTYJaGVhZHM7CQkvKiBOdW1iZXIgb2YgaGVhZHMgKi8KKwlfX3UzMgloaWRkZW47CQkvKiBOdW1iZXIgb2YgaGlkZGVuIHNlY3RvcnMgKi8KKwlfX3UzMgl0b3RhbF9zZWN0OwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyAoaWYgc2VjdG9ycyA9PSAwKSAqLworCisJLyogRkFUMzIgb25seSAqLworCV9fdTMyCWZhdDMyX2xlbmd0aDsJLyogU2VjdG9ycy9GQVQgKi8KKwlfX3UxNglmbGFnczsJCS8qIEJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLworCV9fdTgJdmVyc2lvblsyXTsJLyogRmlsZXN5c3RlbSB2ZXJzaW9uICovCisJX191MzIJcm9vdF9jbHVzdGVyOwkvKiBGaXJzdCBjbHVzdGVyIGluIHJvb3QgZGlyZWN0b3J5ICovCisJX191MTYJaW5mb19zZWN0b3I7CS8qIEZpbGVzeXN0ZW0gaW5mbyBzZWN0b3IgKi8KKwlfX3UxNgliYWNrdXBfYm9vdDsJLyogQmFja3VwIGJvb3Qgc2VjdG9yICovCisJX191MTYJcmVzZXJ2ZWQyWzZdOwkvKiBVbnVzZWQgKi8KK30gYm9vdF9zZWN0b3I7CisKK3R5cGVkZWYgc3RydWN0IHZvbHVtZV9pbmZvCit7CisJX191OCBkcml2ZV9udW1iZXI7CS8qIEJJT1MgZHJpdmUgbnVtYmVyICovCisJX191OCByZXNlcnZlZDsJCS8qIFVudXNlZCAqLworCV9fdTggZXh0X2Jvb3Rfc2lnbjsJLyogMHgyOSBpZiBmaWVsZHMgYmVsb3cgZXhpc3QgKERPUyAzLjMrKSAqLworCV9fdTggdm9sdW1lX2lkWzRdOwkvKiBWb2x1bWUgSUQgbnVtYmVyICovCisJY2hhciB2b2x1bWVfbGFiZWxbMTFdOwkvKiBWb2x1bWUgbGFiZWwgKi8KKwljaGFyIGZzX3R5cGVbOF07CS8qIFR5cGljYWxseSBGQVQxMiwgRkFUMTYsIG9yIEZBVDMyICovCisJLyogQm9vdCBjb2RlIGNvbWVzIG5leHQsIGFsbCBidXQgMiBieXRlcyB0byBmaWxsIHVwIHNlY3RvciAqLworCS8qIEJvb3Qgc2lnbiBjb21lcyBsYXN0LCAyIGJ5dGVzICovCit9IHZvbHVtZV9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBkaXJfZW50cnkgeworCWNoYXIJbmFtZVs4XSxleHRbM107CS8qIE5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJYXR0cjsJCS8qIEF0dHJpYnV0ZSBiaXRzICovCisJX191OAlsY2FzZTsJCS8qIENhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJY3RpbWVfbXM7CS8qIENyZWF0aW9uIHRpbWUsIG1pbGxpc2Vjb25kcyAqLworCV9fdTE2CWN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLworCV9fdTE2CWNkYXRlOwkJLyogQ3JlYXRpb24gZGF0ZSAqLworCV9fdTE2CWFkYXRlOwkJLyogTGFzdCBhY2Nlc3MgZGF0ZSAqLworCV9fdTE2CXN0YXJ0aGk7CS8qIEhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJX191MTYJdGltZSxkYXRlLHN0YXJ0Oy8qIFRpbWUsIGRhdGUgYW5kIGZpcnN0IGNsdXN0ZXIgKi8KKwlfX3UzMglzaXplOwkJLyogRmlsZSBzaXplIGluIGJ5dGVzICovCit9IGRpcl9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX3Nsb3QgeworCV9fdTggICAgaWQ7CQkvKiBTZXF1ZW5jZSBudW1iZXIgZm9yIHNsb3QgKi8KKwlfX3U4ICAgIG5hbWUwXzRbMTBdOwkvKiBGaXJzdCA1IGNoYXJhY3RlcnMgaW4gbmFtZSAqLworCV9fdTggICAgYXR0cjsJCS8qIEF0dHJpYnV0ZSBieXRlICovCisJX191OCAgICByZXNlcnZlZDsJLyogVW51c2VkICovCisJX191OCAgICBhbGlhc19jaGVja3N1bTsvKiBDaGVja3N1bSBmb3IgOC4zIGFsaWFzICovCisJX191OCAgICBuYW1lNV8xMFsxMl07CS8qIDYgbW9yZSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3UxNiAgIHN0YXJ0OwkJLyogVW51c2VkICovCisJX191OCAgICBuYW1lMTFfMTJbNF07CS8qIExhc3QgMiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KK30gZGlyX3Nsb3Q7CisKKy8qIFByaXZhdGUgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50CWZhdHNpemU7CS8qIFNpemUgb2YgRkFUIGluIGJpdHMgKi8KKwlfX3UxNglmYXRsZW5ndGg7CS8qIExlbmd0aCBvZiBGQVQgaW4gc2VjdG9ycyAqLworCV9fdTE2CWZhdF9zZWN0OwkvKiBTdGFydGluZyBzZWN0b3Igb2YgdGhlIEZBVCAqLworCV9fdTE2CXJvb3RkaXJfc2VjdDsJLyogU3RhcnQgc2VjdG9yIG9mIHJvb3QgZGlyZWN0b3J5ICovCisJX191MTYJY2x1c3Rfc2l6ZTsJLyogU2l6ZSBvZiBjbHVzdGVycyBpbiBzZWN0b3JzICovCisJc2hvcnQJZGF0YV9iZWdpbjsJLyogVGhlIHNlY3RvciBvZiB0aGUgZmlyc3QgY2x1c3RlciwgY2FuIGJlIG5lZ2F0aXZlICovCisJX191MzIJZmF0YnVmW0ZBVEJVRlNJWkVdOyAvKiBDdXJyZW50IEZBVCBidWZmZXIgKi8KKwlpbnQJZmF0YnVmbnVtOwkvKiBVc2VkIGJ5IGdldF9mYXRlbnQsIGluaXQgdG8gLTEgKi8KK30gZnNkYXRhOworCit0eXBlZGVmIGludAkoZmlsZV9kZXRlY3Rmc19mdW5jKSh2b2lkKTsKK3R5cGVkZWYgaW50CShmaWxlX2xzX2Z1bmMpKGNvbnN0IGNoYXIgKmRpcik7Cit0eXBlZGVmIGxvbmcJKGZpbGVfcmVhZF9mdW5jKShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLAorCQkJCSB1bnNpZ25lZCBsb25nIG1heHNpemUpOworCitzdHJ1Y3QgZmlsZXN5c3RlbSB7CisJZmlsZV9kZXRlY3Rmc19mdW5jICpkZXRlY3Q7CisJZmlsZV9sc19mdW5jCSAgICpsczsKKwlmaWxlX3JlYWRfZnVuYwkgICAqcmVhZDsKKwljb25zdCBjaGFyCSAgICBuYW1lWzEyXTsKK307CisKKy8qIEZBVCB0YWJsZXMgKi8KK2ZpbGVfZGV0ZWN0ZnNfZnVuYwlmaWxlX2ZhdF9kZXRlY3RmczsKK2ZpbGVfbHNfZnVuYwkJZmlsZV9mYXRfbHM7CitmaWxlX3JlYWRfZnVuYwkJZmlsZV9mYXRfcmVhZDsKKworLyogQ3VycmVudGx5IHRoaXMgZG9lc24ndCBjaGVjayBpZiB0aGUgZGlyIGV4aXN0cyBvciBpcyB2YWxpZC4uLiAqLworaW50IGZpbGVfY2QoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgZmlsZV9mYXRfZGV0ZWN0ZnModm9pZCk7CitpbnQgZmlsZV9mYXRfbHMoY29uc3QgY2hhciAqZGlyKTsKK2xvbmcgZmlsZV9mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpOworY29uc3QgY2hhciAqZmlsZV9nZXRmc25hbWUoaW50IGlkeCk7CitpbnQgZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnRfbm8pOworCisjZW5kaWYgLyogX0ZBVF9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9pZGUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZjMyZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9JREVfSAorI2RlZmluZSBfSURFX0gKKworI2RlZmluZQlJREVfQlVTKGRldikJKGRldiA+PiAxKQorCisjaWZkZWYgQ09ORklHX0lERV9MRUQKKworLyoKKyAqIExFRCBQb3J0CisgKi8KKyNkZWZpbmUJTEVEX1BPUlQJKCh1Y2hhciAqKShQRVI4X0JBU0UgKyAweDMwMDApKQorI2RlZmluZSBMRURfSURFMQkweDAxCisjZGVmaW5lIExFRF9JREUyCTB4MDIKKyNkZWZpbmUJREVWSUNFX0xFRChkKQkoKGQgJiAyKSB8ICgoZCAmIDIpID09IDApKSAvKiBkZXBlbmRzIG9uIGJpdCBwb3NpdGlvbnMhICovCisKKyNlbmRpZiAvKiBDT05GSUdfSURFX0xFRCAqLworCisjaWZkZWYgQ0ZHXzY0QklUX0xCQQordHlwZWRlZiB1aW50NjRfdCBsYmFpbnRfdDsKKyNlbHNlCit0eXBlZGVmIHVsb25nIGxiYWludF90OworI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKwordm9pZCAgaWRlX2luaXQgICh2b2lkKTsKK3Vsb25nIGlkZV9yZWFkCShpbnQgZGV2aWNlLCBsYmFpbnRfdCBibGtuciwgdWxvbmcgYmxrY250LCB1bG9uZyAqYnVmZmVyKTsKK3Vsb25nIGlkZV93cml0ZSAoaW50IGRldmljZSwgbGJhaW50X3QgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmJ1ZmZlcik7CisKKyNlbmRpZiAvKiBfSURFX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaCBiL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc4ZTkwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9pbWFnZS5oCkBAIC0wLDAgKzEsNjc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4IFNlbWloYWxmCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDUKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHRvIFUtQm9vdC4gSW5jbHVkaW5nCisgKiB0aGlzICh1bm1vZGlmaWVkKSBoZWFkZXIgZmlsZSBpbiBhbm90aGVyIGZpbGUgaXMgY29uc2lkZXJlZCBub3JtYWwKKyAqIHVzZSBvZiBVLUJvb3QsIGFuZCBkb2VzICpub3QqIGZhbGwgdW5kZXIgdGhlIGhlYWRpbmcgb2YgImRlcml2ZWQKKyAqIHdvcmsiLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0lNQUdFX0hfXworI2RlZmluZSBfX0lNQUdFX0hfXworCisjaW5jbHVkZSAiY29tcGlsZXIuaCIKKworI2lmZGVmIFVTRV9IT1NUQ0MKKworLyogbmV3IHVJbWFnZSBmb3JtYXQgc3VwcG9ydCBlbmFibGVkIG9uIGhvc3QgKi8KKyNkZWZpbmUgQ09ORklHX0ZJVAkJMQorI2RlZmluZSBDT05GSUdfT0ZfTElCRkRUCTEKKyNkZWZpbmUgQ09ORklHX0ZJVF9WRVJCT1NFCTEgLyogZW5hYmxlIGZpdF9mb3JtYXRfe2Vycm9yLHdhcm5pbmd9KCkgKi8KKworI2Vsc2UKKworI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2RlZmluZSBDT05GSUdfTUQ1CQkvKiBGSVQgaW1hZ2VzIG5lZWQgTUQ1IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX1NIQTEJCS8qIGFuZCBTSEExICovCisjZW5kaWYKKworLyoKKyAqIE9wZXJhdGluZyBTeXN0ZW0gQ29kZXMKKyAqLworI2RlZmluZSBJSF9PU19JTlZBTElECQkwCS8qIEludmFsaWQgT1MJKi8KKyNkZWZpbmUgSUhfT1NfT1BFTkJTRAkJMQkvKiBPcGVuQlNECSovCisjZGVmaW5lIElIX09TX05FVEJTRAkJMgkvKiBOZXRCU0QJKi8KKyNkZWZpbmUgSUhfT1NfRlJFRUJTRAkJMwkvKiBGcmVlQlNECSovCisjZGVmaW5lIElIX09TXzRfNEJTRAkJNAkvKiA0LjRCU0QJKi8KKyNkZWZpbmUgSUhfT1NfTElOVVgJCTUJLyogTGludXgJKi8KKyNkZWZpbmUgSUhfT1NfU1ZSNAkJNgkvKiBTVlI0CQkqLworI2RlZmluZSBJSF9PU19FU0lYCQk3CS8qIEVzaXgJCSovCisjZGVmaW5lIElIX09TX1NPTEFSSVMJCTgJLyogU29sYXJpcwkqLworI2RlZmluZSBJSF9PU19JUklYCQk5CS8qIElyaXgJCSovCisjZGVmaW5lIElIX09TX1NDTwkJMTAJLyogU0NPCQkqLworI2RlZmluZSBJSF9PU19ERUxMCQkxMQkvKiBEZWxsCQkqLworI2RlZmluZSBJSF9PU19OQ1IJCTEyCS8qIE5DUgkJKi8KKyNkZWZpbmUgSUhfT1NfTFlOWE9TCQkxMwkvKiBMeW54T1MJKi8KKyNkZWZpbmUgSUhfT1NfVlhXT1JLUwkJMTQJLyogVnhXb3JrcwkqLworI2RlZmluZSBJSF9PU19QU09TCQkxNQkvKiBwU09TCQkqLworI2RlZmluZSBJSF9PU19RTlgJCTE2CS8qIFFOWAkJKi8KKyNkZWZpbmUgSUhfT1NfVV9CT09UCQkxNwkvKiBGaXJtd2FyZQkqLworI2RlZmluZSBJSF9PU19SVEVNUwkJMTgJLyogUlRFTVMJKi8KKyNkZWZpbmUgSUhfT1NfQVJUT1MJCTE5CS8qIEFSVE9TCSovCisjZGVmaW5lIElIX09TX1VOSVRZCQkyMAkvKiBVbml0eSBPUwkqLworI2RlZmluZSBJSF9PU19JTlRFR1JJVFkJCTIxCS8qIElOVEVHUklUWQkqLworCisvKgorICogQ1BVIEFyY2hpdGVjdHVyZSBDb2RlcyAoc3VwcG9ydGVkIGJ5IExpbnV4KQorICovCisjZGVmaW5lIElIX0FSQ0hfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIENQVQkqLworI2RlZmluZSBJSF9BUkNIX0FMUEhBCQkxCS8qIEFscGhhCSovCisjZGVmaW5lIElIX0FSQ0hfQVJNCQkyCS8qIEFSTQkJKi8KKyNkZWZpbmUgSUhfQVJDSF9JMzg2CQkzCS8qIEludGVsIHg4NgkqLworI2RlZmluZSBJSF9BUkNIX0lBNjQJCTQJLyogSUE2NAkJKi8KKyNkZWZpbmUgSUhfQVJDSF9NSVBTCQk1CS8qIE1JUFMJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlQUzY0CQk2CS8qIE1JUFMJIDY0IEJpdCAqLworI2RlZmluZSBJSF9BUkNIX1BQQwkJNwkvKiBQb3dlclBDCSovCisjZGVmaW5lIElIX0FSQ0hfUzM5MAkJOAkvKiBJQk0gUzM5MAkqLworI2RlZmluZSBJSF9BUkNIX1NICQk5CS8qIFN1cGVySAkqLworI2RlZmluZSBJSF9BUkNIX1NQQVJDCQkxMAkvKiBTcGFyYwkqLworI2RlZmluZSBJSF9BUkNIX1NQQVJDNjQJCTExCS8qIFNwYXJjIDY0IEJpdCAqLworI2RlZmluZSBJSF9BUkNIX002OEsJCTEyCS8qIE02OEsJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlDUk9CTEFaRQkxNAkvKiBNaWNyb0JsYXplICAgKi8KKyNkZWZpbmUgSUhfQVJDSF9OSU9TMgkJMTUJLyogTmlvcy1JSQkqLworI2RlZmluZSBJSF9BUkNIX0JMQUNLRklOCTE2CS8qIEJsYWNrZmluCSovCisjZGVmaW5lIElIX0FSQ0hfQVZSMzIJCTE3CS8qIEFWUjMyCSovCisjZGVmaW5lIElIX0FSQ0hfU1QyMDAJICAgICAgICAxOAkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1QyMDAgICovCisKKy8qCisgKiBJbWFnZSBUeXBlcworICoKKyAqICJTdGFuZGFsb25lIFByb2dyYW1zIiBhcmUgZGlyZWN0bHkgcnVubmFibGUgaW4gdGhlIGVudmlyb25tZW50CisgKglwcm92aWRlZCBieSBVLUJvb3Q7IGl0IGlzIGV4cGVjdGVkIHRoYXQgKGlmIHRoZXkgYmVoYXZlCisgKgl3ZWxsKSB5b3UgY2FuIGNvbnRpbnVlIHRvIHdvcmsgaW4gVS1Cb290IGFmdGVyIHJldHVybiBmcm9tCisgKgl0aGUgU3RhbmRhbG9uZSBQcm9ncmFtLgorICogIk9TIEtlcm5lbCBJbWFnZXMiIGFyZSB1c3VhbGx5IGltYWdlcyBvZiBzb21lIEVtYmVkZGVkIE9TIHdoaWNoCisgKgl3aWxsIHRha2Ugb3ZlciBjb250cm9sIGNvbXBsZXRlbHkuIFVzdWFsbHkgdGhlc2UgcHJvZ3JhbXMKKyAqCXdpbGwgaW5zdGFsbCB0aGVpciBvd24gc2V0IG9mIGV4Y2VwdGlvbiBoYW5kbGVycywgZGV2aWNlCisgKglkcml2ZXJzLCBzZXQgdXAgdGhlIE1NVSwgZXRjLiAtIHRoaXMgbWVhbnMsIHRoYXQgeW91IGNhbm5vdAorICoJZXhwZWN0IHRvIHJlLWVudGVyIFUtQm9vdCBleGNlcHQgYnkgcmVzZXR0aW5nIHRoZSBDUFUuCisgKiAiUkFNRGlzayBJbWFnZXMiIGFyZSBtb3JlIG9yIGxlc3MganVzdCBkYXRhIGJsb2NrcywgYW5kIHRoZWlyCisgKglwYXJhbWV0ZXJzIChhZGRyZXNzLCBzaXplKSBhcmUgcGFzc2VkIHRvIGFuIE9TIGtlcm5lbCB0aGF0IGlzCisgKgliZWluZyBzdGFydGVkLgorICogIk11bHRpLUZpbGUgSW1hZ2VzIiBjb250YWluIHNldmVyYWwgaW1hZ2VzLCB0eXBpY2FsbHkgYW4gT1MKKyAqCShMaW51eCkga2VybmVsIGltYWdlIGFuZCBvbmUgb3IgbW9yZSBkYXRhIGltYWdlcyBsaWtlCisgKglSQU1EaXNrcy4gVGhpcyBjb25zdHJ1Y3QgaXMgdXNlZnVsIGZvciBpbnN0YW5jZSB3aGVuIHlvdSB3YW50CisgKgl0byBib290IG92ZXIgdGhlIG5ldHdvcmsgdXNpbmcgQk9PVFAgZXRjLiwgd2hlcmUgdGhlIGJvb3QKKyAqCXNlcnZlciBwcm92aWRlcyBqdXN0IGEgc2luZ2xlIGltYWdlIGZpbGUsIGJ1dCB5b3Ugd2FudCB0byBnZXQKKyAqCWZvciBpbnN0YW5jZSBhbiBPUyBrZXJuZWwgYW5kIGEgUkFNRGlzayBpbWFnZS4KKyAqCisgKgkiTXVsdGktRmlsZSBJbWFnZXMiIHN0YXJ0IHdpdGggYSBsaXN0IG9mIGltYWdlIHNpemVzLCBlYWNoCisgKglpbWFnZSBzaXplIChpbiBieXRlcykgc3BlY2lmaWVkIGJ5IGFuICJ1aW50MzJfdCIgaW4gbmV0d29yaworICoJYnl0ZSBvcmRlci4gVGhpcyBsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gIih1aW50MzJfdCkwIi4KKyAqCUltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hdGluZyAwIGZvbGxvdyB0aGUgaW1hZ2VzLCBvbmUgYnkKKyAqCW9uZSwgYWxsIGFsaWduZWQgb24gInVpbnQzMl90IiBib3VuZGFyaWVzIChzaXplIHJvdW5kZWQgdXAgdG8KKyAqCWEgbXVsdGlwbGUgb2YgNCBieXRlcyAtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZmlsZSkuCisgKgorICogIkZpcm13YXJlIEltYWdlcyIgYXJlIGJpbmFyeSBpbWFnZXMgY29udGFpbmluZyBmaXJtd2FyZSAobGlrZQorICoJVS1Cb290IG9yIEZQR0EgaW1hZ2VzKSB3aGljaCB1c3VhbGx5IHdpbGwgYmUgcHJvZ3JhbW1lZCB0bworICoJZmxhc2ggbWVtb3J5LgorICoKKyAqICJTY3JpcHQgZmlsZXMiIGFyZSBjb21tYW5kIHNlcXVlbmNlcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkKKyAqCVUtQm9vdCdzIGNvbW1hbmQgaW50ZXJwcmV0ZXI7IHRoaXMgZmVhdHVyZSBpcyBlc3BlY2lhbGx5CisgKgl1c2VmdWwgd2hlbiB5b3UgY29uZmlndXJlIFUtQm9vdCB0byB1c2UgYSByZWFsIHNoZWxsIChodXNoKQorICoJYXMgY29tbWFuZCBpbnRlcnByZXRlciAoPT4gU2hlbGwgU2NyaXB0cykuCisgKi8KKworI2RlZmluZSBJSF9UWVBFX0lOVkFMSUQJCTAJLyogSW52YWxpZCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TVEFOREFMT05FCTEJLyogU3RhbmRhbG9uZSBQcm9ncmFtCQkqLworI2RlZmluZSBJSF9UWVBFX0tFUk5FTAkJMgkvKiBPUyBLZXJuZWwgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfUkFNRElTSwkJMwkvKiBSQU1EaXNrIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX01VTFRJCQk0CS8qIE11bHRpLUZpbGUgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfRklSTVdBUkUJNQkvKiBGaXJtd2FyZSBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TQ1JJUFQJCTYJLyogU2NyaXB0IGZpbGUJCQkqLworI2RlZmluZSBJSF9UWVBFX0ZJTEVTWVNURU0JNwkvKiBGaWxlc3lzdGVtIEltYWdlIChhbnkgdHlwZSkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GTEFURFQJCTgJLyogQmluYXJ5IEZsYXQgRGV2aWNlIFRyZWUgQmxvYgkqLworI2RlZmluZSBJSF9UWVBFX0tXQklNQUdFCTkJLyogS2lya3dvb2QgQm9vdCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9JTVhJTUFHRQkxMAkvKiBGcmVlc2NhbGUgSU1YQm9vdCBJbWFnZQkqLworCisvKgorICogQ29tcHJlc3Npb24gVHlwZXMKKyAqLworI2RlZmluZSBJSF9DT01QX05PTkUJCTAJLyogIE5vCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfR1pJUAkJMQkvKiBnemlwCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfQlpJUDIJCTIJLyogYnppcDIgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0xaTUEJCTMJLyogbHptYSAgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0xaTwkJNAkvKiBsem8gICBDb21wcmVzc2lvbiBVc2VkCSovCisKKyNkZWZpbmUgSUhfTUFHSUMJMHgyNzA1MTk1NgkvKiBJbWFnZSBNYWdpYyBOdW1iZXIJCSovCisjZGVmaW5lIElIX05NTEVOCQkzMgkvKiBJbWFnZSBOYW1lIExlbmd0aAkJKi8KKworLyoKKyAqIExlZ2FjeSBmb3JtYXQgaW1hZ2UgaGVhZGVyLAorICogYWxsIGRhdGEgaW4gbmV0d29yayBieXRlIG9yZGVyIChha2EgbmF0dXJhbCBha2EgYmlnZW5kaWFuKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfaGVhZGVyIHsKKwl1aW50MzJfdAlpaF9tYWdpYzsJLyogSW1hZ2UgSGVhZGVyIE1hZ2ljIE51bWJlcgkqLworCXVpbnQzMl90CWloX2hjcmM7CS8qIEltYWdlIEhlYWRlciBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50MzJfdAlpaF90aW1lOwkvKiBJbWFnZSBDcmVhdGlvbiBUaW1lc3RhbXAJKi8KKwl1aW50MzJfdAlpaF9zaXplOwkvKiBJbWFnZSBEYXRhIFNpemUJCSovCisJdWludDMyX3QJaWhfbG9hZDsJLyogRGF0YQkgTG9hZCAgQWRkcmVzcwkJKi8KKwl1aW50MzJfdAlpaF9lcDsJCS8qIEVudHJ5IFBvaW50IEFkZHJlc3MJCSovCisJdWludDMyX3QJaWhfZGNyYzsJLyogSW1hZ2UgRGF0YSBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50OF90CQlpaF9vczsJCS8qIE9wZXJhdGluZyBTeXN0ZW0JCSovCisJdWludDhfdAkJaWhfYXJjaDsJLyogQ1BVIGFyY2hpdGVjdHVyZQkJKi8KKwl1aW50OF90CQlpaF90eXBlOwkvKiBJbWFnZSBUeXBlCQkJKi8KKwl1aW50OF90CQlpaF9jb21wOwkvKiBDb21wcmVzc2lvbiBUeXBlCQkqLworCXVpbnQ4X3QJCWloX25hbWVbSUhfTk1MRU5dOwkvKiBJbWFnZSBOYW1lCQkqLworfSBpbWFnZV9oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfaW5mbyB7CisJdWxvbmcJCXN0YXJ0LCBlbmQ7CQkvKiBzdGFydC9lbmQgb2YgYmxvYiAqLworCXVsb25nCQlpbWFnZV9zdGFydCwgaW1hZ2VfbGVuOyAvKiBzdGFydCBvZiBpbWFnZSB3aXRoaW4gYmxvYiwgbGVuIG9mIGltYWdlICovCisJdWxvbmcJCWxvYWQ7CQkJLyogbG9hZCBhZGRyIGZvciB0aGUgaW1hZ2UgKi8KKwl1aW50OF90CQljb21wLCB0eXBlLCBvczsJCS8qIGNvbXByZXNzaW9uLCB0eXBlIG9mIGltYWdlLCBvcyB0eXBlICovCit9IGltYWdlX2luZm9fdDsKKworLyoKKyAqIExlZ2FjeSBhbmQgRklUIGZvcm1hdCBoZWFkZXJzIHVzZWQgYnkgZG9fYm9vdG0oKSBhbmQgZG9fYm9vdG1fPG9zPigpCisgKiByb3V0aW5lcy4KKyAqLworc3RydWN0IGJkOworCit0eXBlZGVmIHN0cnVjdCBib290bV9oZWFkZXJzIHsKKwkvKgorCSAqIExlZ2FjeSBvcyBpbWFnZSBoZWFkZXIsIGlmIGl0IGlzIGEgbXVsdGkgY29tcG9uZW50IGltYWdlCisJICogdGhlbiBib290X2dldF9yYW1kaXNrKCkgYW5kIGdldF9mZHQoKSB3aWxsIGF0dGVtcHQgdG8gZ2V0CisJICogZGF0YSBmcm9tIHNlY29uZCBhbmQgdGhpcmQgY29tcG9uZW50IGFjY29yZGluZ2x5LgorCSAqLworCWltYWdlX2hlYWRlcl90CSpsZWdhY3lfaGRyX29zOwkJLyogaW1hZ2UgaGVhZGVyIHBvaW50ZXIgKi8KKwlpbWFnZV9oZWFkZXJfdAlsZWdhY3lfaGRyX29zX2NvcHk7CS8qIGhlYWRlciBjb3B5ICovCisJdWxvbmcJCWxlZ2FjeV9oZHJfdmFsaWQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2NmZzsJLyogY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZSAqLworCisJdm9pZAkJKmZpdF9oZHJfb3M7CS8qIG9zIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfb3M7CS8qIG9zIHN1YmltYWdlIG5vZGUgdW5pdCBuYW1lICovCisJaW50CQlmaXRfbm9mZnNldF9vczsJLyogb3Mgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgKi8KKworCXZvaWQJCSpmaXRfaGRyX3JkOwkvKiBpbml0IHJhbWRpc2sgRklUIGltYWdlIGhlYWRlciAqLworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9yZDsJLyogaW5pdCByYW1kaXNrIHN1YmltYWdlIG5vZGUgdW5pdCBuYW1lICovCisJaW50CQlmaXRfbm9mZnNldF9yZDsJLyogaW5pdCByYW1kaXNrIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisKKwl2b2lkCQkqZml0X2hkcl9mZHQ7CS8qIEZEVCBibG9iIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfZmR0OwkvKiBGRFQgYmxvYiBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfZmR0Oy8qIEZEVCBibG9iIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisjZW5kaWYKKworI2lmbmRlZiBVU0VfSE9TVENDCisJaW1hZ2VfaW5mb190CW9zOwkJLyogb3MgaW1hZ2UgaW5mbyAqLworCXVsb25nCQllcDsJCS8qIGVudHJ5IHBvaW50IG9mIE9TICovCisKKwl1bG9uZwkJcmRfc3RhcnQsIHJkX2VuZDsvKiByYW1kaXNrIHN0YXJ0L2VuZCAqLworCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorCWNoYXIJCSpmdF9hZGRyOwkvKiBmbGF0IGRldiB0cmVlIGFkZHJlc3MgKi8KKyNlbmRpZgorCXVsb25nCQlmdF9sZW47CQkvKiBsZW5ndGggb2YgZmxhdCBkZXZpY2UgdHJlZSAqLworCisJdWxvbmcJCWluaXRyZF9zdGFydDsKKwl1bG9uZwkJaW5pdHJkX2VuZDsKKwl1bG9uZwkJY21kbGluZV9zdGFydDsKKwl1bG9uZwkJY21kbGluZV9lbmQ7CisJc3RydWN0IGJkCSprYmQ7CisjZW5kaWYKKworCWludAkJdmVyaWZ5OwkJLyogZ2V0ZW52KCJ2ZXJpZnkiKVswXSAhPSAnbicgKi8KKworI2RlZmluZQlCT09UTV9TVEFURV9TVEFSVAkoMHgwMDAwMDAwMSkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfTE9BRE9TCSgweDAwMDAwMDAyKQorI2RlZmluZQlCT09UTV9TVEFURV9SQU1ESVNLCSgweDAwMDAwMDA0KQorI2RlZmluZQlCT09UTV9TVEFURV9GRFQJCSgweDAwMDAwMDA4KQorI2RlZmluZQlCT09UTV9TVEFURV9PU19DTURMSU5FCSgweDAwMDAwMDEwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19CRF9UCSgweDAwMDAwMDIwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19QUkVQCSgweDAwMDAwMDQwKQorI2RlZmluZQlCT09UTV9TVEFURV9PU19HTwkoMHgwMDAwMDA4MCkKKwlpbnQJCXN0YXRlOworCisjaWZkZWYgQ09ORklHX0xNQgorCXN0cnVjdCBsbWIJbG1iOwkJLyogZm9yIG1lbW9yeSBtZ210ICovCisjZW5kaWYKK30gYm9vdG1faGVhZGVyc190OworCisvKgorICogU29tZSBzeXN0ZW1zIChmb3IgZXhhbXBsZSBMV01PTikgaGF2ZSB2ZXJ5IHNob3J0IHdhdGNoZG9nIHBlcmlvZHM7CisgKiB3ZSBtdXN0IG1ha2Ugc3VyZSB0byBzcGxpdCBsb25nIG9wZXJhdGlvbnMgbGlrZSBtZW1tb3ZlKCkgb3IKKyAqIGNoZWNrc3VtIGNhbGN1bGF0aW9ucyBpbnRvIHJlYXNvbmFibGUgY2h1bmtzLgorICovCisjaWZuZGVmIENIVU5LU1oKKyNkZWZpbmUgQ0hVTktTWiAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9DUkMzMgorI2RlZmluZSBDSFVOS1NaX0NSQzMyICg2NCAqIDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBDSFVOS1NaX01ENQorI2RlZmluZSBDSFVOS1NaX01ENSAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9TSEExCisjZGVmaW5lIENIVU5LU1pfU0hBMSAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNkZWZpbmUgdWltYWdlX3RvX2NwdSh4KQkJYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgY3B1X3RvX3VpbWFnZSh4KQkJY3B1X3RvX2JlMzIoeCkKKworLyoKKyAqIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBlbnRyaWVzIG9mIGEgc3BlY2lmaWMgdHlwZTsgdXNlZCBieQorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgYW5kIGdldF90YWJsZV9lbnRyeV9uYW1lKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRhYmxlX2VudHJ5IHsKKwlpbnQJaWQ7CisJY2hhcgkqc25hbWU7CQkvKiBzaG9ydCAoaW5wdXQpIG5hbWUgdG8gZmluZCB0YWJsZSBlbnRyeSAqLworCWNoYXIJKmxuYW1lOwkJLyogbG9uZyAob3V0cHV0KSBuYW1lIHRvIHByaW50IGZvciBtZXNzYWdlcyAqLworfSB0YWJsZV9lbnRyeV90OworCisvKgorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgc2NhbnMgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kIGFuCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNob3J0IG5hbWUuIElmIGEgbWF0Y2hpbmcgZW50cnkgaXMKKyAqIGZvdW5kLCBpdCdzIGlkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKi8KK2ludCBnZXRfdGFibGVfZW50cnlfaWQgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLAorCQljb25zdCBjaGFyICp0YWJsZV9uYW1lLCBjb25zdCBjaGFyICpuYW1lKTsKKy8qCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSgpIHNjYW5zIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZAorICogYW4gZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBpZC4gSWYgYSBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwKKyAqIGl0cyBsb25nIG5hbWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqLworY2hhciAqZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLCBjaGFyICptc2csIGludCBpZCk7CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfb3NfbmFtZSAodWludDhfdCBvcyk7Citjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2FyY2hfbmFtZSAodWludDhfdCBhcmNoKTsKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfdHlwZV9uYW1lICh1aW50OF90IHR5cGUpOworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9jb21wX25hbWUgKHVpbnQ4X3QgY29tcCk7CitpbnQgZ2VuaW1nX2dldF9vc19pZCAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2VuaW1nX2dldF9hcmNoX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZW5pbWdfZ2V0X3R5cGVfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdlbmltZ19nZXRfY29tcF9pZCAoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGdlbmltZ19wcmludF9zaXplICh1aW50MzJfdCBzaXplKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCisvKiBJbWFnZSBmb3JtYXQgdHlwZXMsIHJldHVybmVkIGJ5IF9nZXRfZm9ybWF0KCkgcm91dGluZSAqLworI2RlZmluZSBJTUFHRV9GT1JNQVRfSU5WQUxJRAkweDAwCisjZGVmaW5lIElNQUdFX0ZPUk1BVF9MRUdBQ1kJMHgwMQkvKiBsZWdhY3kgaW1hZ2VfaGVhZGVyIGJhc2VkIGZvcm1hdCAqLworI2RlZmluZSBJTUFHRV9GT1JNQVRfRklUCTB4MDIJLyogbmV3LCBsaWJmZHQgYmFzZWQgZm9ybWF0ICovCisKK2ludCBnZW5pbWdfZ2V0X2Zvcm1hdCAodm9pZCAqaW1nX2FkZHIpOworaW50IGdlbmltZ19oYXNfY29uZmlnIChib290bV9oZWFkZXJzX3QgKmltYWdlcyk7Cit1bG9uZyBnZW5pbWdfZ2V0X2ltYWdlICh1bG9uZyBpbWdfYWRkcik7CisKK2ludCBib290X2dldF9yYW1kaXNrIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMsCisJCXVpbnQ4X3QgYXJjaCwgdWxvbmcgKnJkX3N0YXJ0LCB1bG9uZyAqcmRfZW5kKTsKKworCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAoraW50IGJvb3RfZ2V0X2ZkdCAoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcywKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpOworaW50IGJvb3RfcmVsb2NhdGVfZmR0IChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nIGJvb3RtYXBfYmFzZSwKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEMpIHx8IGRlZmluZWQoQ09ORklHX002OEspCitpbnQgYm9vdF9yYW1kaXNrX2hpZ2ggKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgcmRfZGF0YSwgdWxvbmcgcmRfbGVuLAorCQkgIHVsb25nICppbml0cmRfc3RhcnQsIHVsb25nICppbml0cmRfZW5kKTsKKworaW50IGJvb3RfZ2V0X2NtZGxpbmUgKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgKmNtZF9zdGFydCwgdWxvbmcgKmNtZF9lbmQsCisJCQl1bG9uZyBib290bWFwX2Jhc2UpOworaW50IGJvb3RfZ2V0X2tiZCAoc3RydWN0IGxtYiAqbG1iLCBiZF90ICoqa2JkLCB1bG9uZyBib290bWFwX2Jhc2UpOworI2VuZGlmIC8qIENPTkZJR19QUEMgfHwgQ09ORklHX002OEsgKi8KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExlZ2FjeSBmb3JtYXQgc3BlY2lmaWMgY29kZSAocHJlZml4ZWQgd2l0aCBpbWFnZV8pICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICh2b2lkKQoreworCXJldHVybiAoc2l6ZW9mIChpbWFnZV9oZWFkZXJfdCkpOworfQorCisjZGVmaW5lIGltYWdlX2dldF9oZHJfbChmKSBcCisJc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfIyNmKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpIFwKKwl7IFwKKwkJcmV0dXJuIHVpbWFnZV90b19jcHUgKGhkci0+aWhfIyNmKTsgXAorCX0KK2ltYWdlX2dldF9oZHJfbCAobWFnaWMpCQkvKiBpbWFnZV9nZXRfbWFnaWMgKi8KK2ltYWdlX2dldF9oZHJfbCAoaGNyYykJCS8qIGltYWdlX2dldF9oY3JjICovCitpbWFnZV9nZXRfaGRyX2wgKHRpbWUpCQkvKiBpbWFnZV9nZXRfdGltZSAqLworaW1hZ2VfZ2V0X2hkcl9sIChzaXplKQkJLyogaW1hZ2VfZ2V0X3NpemUgKi8KK2ltYWdlX2dldF9oZHJfbCAobG9hZCkJCS8qIGltYWdlX2dldF9sb2FkICovCitpbWFnZV9nZXRfaGRyX2wgKGVwKQkJLyogaW1hZ2VfZ2V0X2VwICovCitpbWFnZV9nZXRfaGRyX2wgKGRjcmMpCQkvKiBpbWFnZV9nZXRfZGNyYyAqLworCisjZGVmaW5lIGltYWdlX2dldF9oZHJfYihmKSBcCisJc3RhdGljIGlubGluZSB1aW50OF90IGltYWdlX2dldF8jI2YoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikgXAorCXsgXAorCQlyZXR1cm4gaGRyLT5paF8jI2Y7IFwKKwl9CitpbWFnZV9nZXRfaGRyX2IgKG9zKQkJLyogaW1hZ2VfZ2V0X29zICovCitpbWFnZV9nZXRfaGRyX2IgKGFyY2gpCQkvKiBpbWFnZV9nZXRfYXJjaCAqLworaW1hZ2VfZ2V0X2hkcl9iICh0eXBlKQkJLyogaW1hZ2VfZ2V0X3R5cGUgKi8KK2ltYWdlX2dldF9oZHJfYiAoY29tcCkJCS8qIGltYWdlX2dldF9jb21wICovCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqaW1hZ2VfZ2V0X25hbWUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChjaGFyICopaGRyLT5paF9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9kYXRhX3NpemUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIGltYWdlX2dldF9zaXplIChoZHIpOworfQorCisvKioKKyAqIGltYWdlX2dldF9kYXRhIC0gZ2V0IGltYWdlIHBheWxvYWQgc3RhcnQgYWRkcmVzcworICogQGhkcjogaW1hZ2UgaGVhZGVyCisgKgorICogaW1hZ2VfZ2V0X2RhdGEoKSByZXR1cm5zIGFkZHJlc3Mgb2YgdGhlIGltYWdlIHBheWxvYWQuIEZvciBzaW5nbGUKKyAqIGNvbXBvbmVudCBpbWFnZXMgaXQgaXMgaW1hZ2UgZGF0YSBzdGFydC4gRm9yIG11bHRpIGNvbXBvbmVudAorICogaW1hZ2VzIGl0IHBvaW50cyB0byB0aGUgbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIHN1Yi1pbWFnZXMgc2l6ZXMuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBwYXlsb2FkIGRhdGEgc3RhcnQgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIHVsb25nIGltYWdlX2dldF9kYXRhIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoKHVsb25nKWhkciArIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0X2ltYWdlX3NpemUgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfc2l6ZSAoaGRyKSArIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGltYWdlX2dldF9pbWFnZV9lbmQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuICgodWxvbmcpaGRyICsgaW1hZ2VfZ2V0X2ltYWdlX3NpemUgKGhkcikpOworfQorCisjZGVmaW5lIGltYWdlX3NldF9oZHJfbChmKSBcCisJc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3NldF8jI2YoaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDMyX3QgdmFsKSBcCisJeyBcCisJCWhkci0+aWhfIyNmID0gY3B1X3RvX3VpbWFnZSAodmFsKTsgXAorCX0KK2ltYWdlX3NldF9oZHJfbCAobWFnaWMpCQkvKiBpbWFnZV9zZXRfbWFnaWMgKi8KK2ltYWdlX3NldF9oZHJfbCAoaGNyYykJCS8qIGltYWdlX3NldF9oY3JjICovCitpbWFnZV9zZXRfaGRyX2wgKHRpbWUpCQkvKiBpbWFnZV9zZXRfdGltZSAqLworaW1hZ2Vfc2V0X2hkcl9sIChzaXplKQkJLyogaW1hZ2Vfc2V0X3NpemUgKi8KK2ltYWdlX3NldF9oZHJfbCAobG9hZCkJCS8qIGltYWdlX3NldF9sb2FkICovCitpbWFnZV9zZXRfaGRyX2wgKGVwKQkJLyogaW1hZ2Vfc2V0X2VwICovCitpbWFnZV9zZXRfaGRyX2wgKGRjcmMpCQkvKiBpbWFnZV9zZXRfZGNyYyAqLworCisjZGVmaW5lIGltYWdlX3NldF9oZHJfYihmKSBcCisJc3RhdGljIGlubGluZSB2b2lkIGltYWdlX3NldF8jI2YoaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCB2YWwpIFwKKwl7IFwKKwkJaGRyLT5paF8jI2YgPSB2YWw7IFwKKwl9CitpbWFnZV9zZXRfaGRyX2IgKG9zKQkJLyogaW1hZ2Vfc2V0X29zICovCitpbWFnZV9zZXRfaGRyX2IgKGFyY2gpCQkvKiBpbWFnZV9zZXRfYXJjaCAqLworaW1hZ2Vfc2V0X2hkcl9iICh0eXBlKQkJLyogaW1hZ2Vfc2V0X3R5cGUgKi8KK2ltYWdlX3NldF9oZHJfYiAoY29tcCkJCS8qIGltYWdlX3NldF9jb21wICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfbmFtZSAoaW1hZ2VfaGVhZGVyX3QgKmhkciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJuY3B5IChpbWFnZV9nZXRfbmFtZSAoaGRyKSwgbmFtZSwgSUhfTk1MRU4pOworfQorCitpbnQgaW1hZ2VfY2hlY2tfaGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7CitpbnQgaW1hZ2VfY2hlY2tfZGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7CisjaWZuZGVmIFVTRV9IT1NUQ0MKK2ludCBnZXRlbnZfeWVzbm8gKGNoYXIgKnZhcik7Cit1bG9uZyBnZXRlbnZfYm9vdG1fbG93KHZvaWQpOworcGh5c19zaXplX3QgZ2V0ZW52X2Jvb3RtX3NpemUodm9pZCk7Cit2b2lkIG1lbW1vdmVfd2QgKHZvaWQgKnRvLCB2b2lkICpmcm9tLCBzaXplX3QgbGVuLCB1bG9uZyBjaHVua3N6KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja19tYWdpYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9tYWdpYyAoaGRyKSA9PSBJSF9NQUdJQyk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja190eXBlIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IHR5cGUpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfdHlwZSAoaGRyKSA9PSB0eXBlKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3QgYXJjaCkKK3sKKwlyZXR1cm4gKGltYWdlX2dldF9hcmNoIChoZHIpID09IGFyY2gpOworfQorc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfb3MgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3Qgb3MpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfb3MgKGhkcikgPT0gb3MpOworfQorCit1bG9uZyBpbWFnZV9tdWx0aV9jb3VudCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcik7Cit2b2lkIGltYWdlX211bHRpX2dldGltZyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWxvbmcgaWR4LAorCQkJdWxvbmcgKmRhdGEsIHVsb25nICpsZW4pOworCit2b2lkIGltYWdlX3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpoZHIpOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX3RhcmdldF9hcmNoIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworI2lmIGRlZmluZWQoX19BUk1fXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9BUk0pKQorI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQVZSMzIpKQorI2VsaWYgZGVmaW5lZChfX2JmaW5fXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9CTEFDS0ZJTikpCisjZWxpZiBkZWZpbmVkKF9fSTM4Nl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0kzODYpKQorI2VsaWYgZGVmaW5lZChfX002OEtfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9NNjhLKSkKKyNlbGlmIGRlZmluZWQoX19taWNyb2JsYXplX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTUlDUk9CTEFaRSkpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX01JUFMpKQorI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTklPUzIpKQorI2VsaWYgZGVmaW5lZChfX1BQQ19fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX1BQQykpCisjZWxpZiBkZWZpbmVkKF9fc2hfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9TSCkpCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9TUEFSQykpCisjZWxzZQorIyBlcnJvciBVbmtub3duIENQVSB0eXBlCisjZW5kaWYKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmV3IHVJbWFnZSBmb3JtYXQgc3BlY2lmaWMgY29kZSAocHJlZml4ZWQgd2l0aCBmaXRfKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCisjZGVmaW5lIEZJVF9JTUFHRVNfUEFUSAkJIi9pbWFnZXMiCisjZGVmaW5lIEZJVF9DT05GU19QQVRICQkiL2NvbmZpZ3VyYXRpb25zIgorCisvKiBoYXNoIG5vZGUgKi8KKyNkZWZpbmUgRklUX0hBU0hfTk9ERU5BTUUJImhhc2giCisjZGVmaW5lIEZJVF9BTEdPX1BST1AJCSJhbGdvIgorI2RlZmluZSBGSVRfVkFMVUVfUFJPUAkJInZhbHVlIgorCisvKiBpbWFnZSBub2RlICovCisjZGVmaW5lIEZJVF9EQVRBX1BST1AJCSJkYXRhIgorI2RlZmluZSBGSVRfVElNRVNUQU1QX1BST1AJInRpbWVzdGFtcCIKKyNkZWZpbmUgRklUX0RFU0NfUFJPUAkJImRlc2NyaXB0aW9uIgorI2RlZmluZSBGSVRfQVJDSF9QUk9QCQkiYXJjaCIKKyNkZWZpbmUgRklUX1RZUEVfUFJPUAkJInR5cGUiCisjZGVmaW5lIEZJVF9PU19QUk9QCQkib3MiCisjZGVmaW5lIEZJVF9DT01QX1BST1AJCSJjb21wcmVzc2lvbiIKKyNkZWZpbmUgRklUX0VOVFJZX1BST1AJCSJlbnRyeSIKKyNkZWZpbmUgRklUX0xPQURfUFJPUAkJImxvYWQiCisKKy8qIGNvbmZpZ3VyYXRpb24gbm9kZSAqLworI2RlZmluZSBGSVRfS0VSTkVMX1BST1AJCSJrZXJuZWwiCisjZGVmaW5lIEZJVF9SQU1ESVNLX1BST1AJInJhbWRpc2siCisjZGVmaW5lIEZJVF9GRFRfUFJPUAkJImZkdCIKKyNkZWZpbmUgRklUX0RFRkFVTFRfUFJPUAkiZGVmYXVsdCIKKworI2RlZmluZSBGSVRfTUFYX0hBU0hfTEVOCTIwCS8qIG1heChjcmMzMl9sZW4oNCksIHNoYTFfbGVuKDIwKSkgKi8KKworLyogY21kbGluZSBhcmd1bWVudCBmb3JtYXQgcGFyc2luZyAqLworaW5saW5lIGludCBmaXRfcGFyc2VfY29uZiAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmNvbmZfbmFtZSk7CitpbmxpbmUgaW50IGZpdF9wYXJzZV9zdWJpbWFnZSAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmltYWdlX25hbWUpOworCit2b2lkIGZpdF9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqZml0KTsKK3ZvaWQgZml0X2ltYWdlX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKK3ZvaWQgZml0X2ltYWdlX3ByaW50X2hhc2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApOworCisvKioKKyAqIGZpdF9nZXRfZW5kIC0gZ2V0IEZJVCBpbWFnZSBzaXplCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgc2l6ZSBvZiB0aGUgRklUIGltYWdlIChibG9iKSBpbiBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSB1bG9uZyBmaXRfZ2V0X3NpemUgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwlyZXR1cm4gZmR0X3RvdGFsc2l6ZSAoZml0KTsKK30KKworLyoqCisgKiBmaXRfZ2V0X2VuZCAtIGdldCBGSVQgaW1hZ2UgZW5kCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZW5kIGFkZHJlc3Mgb2YgdGhlIEZJVCBpbWFnZSAoYmxvYikgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZml0X2dldF9lbmQgKGNvbnN0IHZvaWQgKmZpdCkKK3sKKwlyZXR1cm4gKHVsb25nKWZpdCArIGZkdF90b3RhbHNpemUgKGZpdCk7Cit9CisKKy8qKgorICogZml0X2dldF9uYW1lIC0gZ2V0IEZJVCBub2RlIG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogcmV0dXJuczoKKyAqICAgICBOVUxMLCBvbiBlcnJvcgorICogICAgIHBvaW50ZXIgdG8gbm9kZSBuYW1lLCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZml0X2dldF9uYW1lIChjb25zdCB2b2lkICpmaXRfaGRyLAorCQlpbnQgbm9mZnNldCwgaW50ICpsZW4pCit7CisJcmV0dXJuIGZkdF9nZXRfbmFtZSAoZml0X2hkciwgbm9mZnNldCwgbGVuKTsKK30KKworaW50IGZpdF9nZXRfZGVzYyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmRlc2MpOworaW50IGZpdF9nZXRfdGltZXN0YW1wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgKnRpbWVzdGFtcCk7CisKK2ludCBmaXRfaW1hZ2VfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqaW1hZ2VfdW5hbWUpOworaW50IGZpdF9pbWFnZV9nZXRfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKm9zKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmFyY2gpOworaW50IGZpdF9pbWFnZV9nZXRfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdHlwZSk7CitpbnQgZml0X2ltYWdlX2dldF9jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpjb21wKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2xvYWQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICpsb2FkKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2VudHJ5IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqZW50cnkpOworaW50IGZpdF9pbWFnZV9nZXRfZGF0YSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJCQljb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKTsKKworaW50IGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqYWxnbyk7CitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICoqdmFsdWUsCisJCQkJaW50ICp2YWx1ZV9sZW4pOworCitpbnQgZml0X3NldF90aW1lc3RhbXAgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCB0aW1lc3RhbXApOworaW50IGZpdF9zZXRfaGFzaGVzICh2b2lkICpmaXQpOworaW50IGZpdF9pbWFnZV9zZXRfaGFzaGVzICh2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0KTsKK2ludCBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgKHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnZhbHVlLAorCQkJCWludCB2YWx1ZV9sZW4pOworCitpbnQgZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2FsbF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCk7CitpbnQgZml0X2ltYWdlX2NoZWNrX29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IG9zKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBhcmNoKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCB0eXBlKTsKK2ludCBmaXRfaW1hZ2VfY2hlY2tfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBjb21wKTsKK2ludCBmaXRfY2hlY2tfZm9ybWF0IChjb25zdCB2b2lkICpmaXQpOworCitpbnQgZml0X2NvbmZfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqY29uZl91bmFtZSk7CitpbnQgZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKK2ludCBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKK2ludCBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworCit2b2lkIGZpdF9jb25mX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW5saW5lIGludCBmaXRfaW1hZ2VfY2hlY2tfdGFyZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGUpCit7CisjaWYgZGVmaW5lZChfX0FSTV9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9BUk0pKQorI2VsaWYgZGVmaW5lZChfX2F2cjMyX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0FWUjMyKSkKKyNlbGlmIGRlZmluZWQoX19iZmluX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0JMQUNLRklOKSkKKyNlbGlmIGRlZmluZWQoX19JMzg2X18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX0kzODYpKQorI2VsaWYgZGVmaW5lZChfX002OEtfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTTY4SykpCisjZWxpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9NSUNST0JMQVpFKSkKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX01JUFMpKQorI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX05JT1MyKSkKKyNlbGlmIGRlZmluZWQoX19QUENfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfUFBDKSkKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9TSCkpCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfU1BBUkMpKQorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBDUFUgdHlwZQorI2VuZGlmCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisjaWZkZWYgQ09ORklHX0ZJVF9WRVJCT1NFCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZChtc2cpCXByaW50ZiAoIiEgJXM6JWQgIiBcCisJCQkJIkZJVCBpbWFnZXMgbm90IHN1cHBvcnRlZCBmb3IgJyVzJ1xuIiwgXAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgKG1zZykpCisKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkX3Jlc2V0KG1zZykJcHJpbnRmICgiISAlczolZCAiIFwKKwkJCQkiRklUIGltYWdlcyBub3Qgc3VwcG9ydGVkIGZvciAnJXMnICIgXAorCQkJCSItIG11c3QgcmVzZXQgYm9hcmQgdG8gcmVjb3ZlciFcbiIsIFwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIChtc2cpKQorI2Vsc2UKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkKG1zZykKKyNkZWZpbmUgZml0X3Vuc3VwcG9ydGVkX3Jlc2V0KG1zZykKKyNlbmRpZiAvKiBDT05GSUdfRklUX1ZFUkJPU0UgKi8KKyNlbmRpZiAvKiBDT05GSUdfRklUICovCisKKyNlbmRpZgkvKiBfX0lNQUdFX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5YjBjODYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorCisjaWZuZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gNDMyMQorI2VuZGlmCisjaWZuZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBfX0JJR19FTkRJQU5fQklURklFTEQKKyNlbmRpZgorI2RlZmluZQlfX0JZVEVfT1JERVIJX19CSUdfRU5ESUFOCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgX19fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSBfX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpIF9fX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUzMl90b19jcHUoeCkgX19fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSBfX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpIF9fX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgKChfX3U2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgKChfX3UzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKChfX3UxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHVwKHgpIF9fc3dhYjY0cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHVwKHgpIF9fc3dhYjMycCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHVwKHgpIF9fc3dhYjE2cCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHVwKHgpICgqKF9fdTY0KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHVwKHgpICgqKF9fdTMyKikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHVwKHgpICgqKF9fdTE2KikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjRzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fbGU2NF90b19jcHVzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fbGUzMl90b19jcHVzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHVzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmUzMl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTE2cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmY4NTBmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMTgwIEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19ICisKKy8qCisgKiBsaW51eC9ieXRlb3JkZXJfZ2VuZXJpYy5oCisgKiBHZW5lcmljIEJ5dGUtcmVvcmRlcmluZyBzdXBwb3J0CisgKgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MDcwNworICogICAgZ2F0aGVyZWQgYWxsIHRoZSBnb29kIGlkZWFzIGZyb20gYWxsIGFzbS1mb28vYnl0ZW9yZGVyLmggaW50byBvbmUgZmlsZSwKKyAqICAgIGNsZWFuZWQgdGhlbSB1cC4KKyAqICAgIEkgaG9wZSBpdCBpcyBjb21wbGlhbnQgd2l0aCBub24tR0NDIGNvbXBpbGVycy4KKyAqICAgIEkgZGVjaWRlZCB0byBwdXQgX19CWVRFT1JERVJfSEFTX1U2NF9fIGluIGJ5dGVvcmRlci5oLAorICogICAgYmVjYXVzZSBJIHdhc24ndCBzdXJlIGl0IHdvdWxkIGJlIG9rIHRvIHB1dCBpdCBpbiB0eXBlcy5oCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNDMKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEwMTIKKyAqICAgIFVwZ3JhZGVkIGl0IHRvIDIuMS41NworICogICAgdG8gcGxlYXNlIExpbnVzIFQuLCByZXBsYWNlZCBodWdlICNpZmRlZidzIGJldHdlZW4gbGl0dGxlL2JpZyBlbmRpYW4KKyAqICAgIGJ5IG5lc3RlZGx5ICNpbmNsdWRlJ2QgZmlsZXMuCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMjA1CisgKiAgICBNYWRlIGl0IHRvIDIuMS43MTsgbm93IGEgZmFjZWxpZnQ6CisgKiAgICBQdXQgZmlsZXMgdW5kZXIgaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvCisgKiAgICBTcGxpdCBzd2FiIGZyb20gZ2VuZXJpYyBzdXBwb3J0LgorICoKKyAqIFRPRE86CisgKiAgID0gUmVndWxhciBrZXJuZWwgbWFpbnRhaW5lcnMgY291bGQgYWxzbyByZXBsYWNlIGFsbCB0aGVzZSBtYW51YWwKKyAqICAgIGJ5dGVzd2FwIG1hY3JvcyB0aGF0IHJlbWFpbiwgZGlzc2VtaW5hdGVkIGFtb25nIGRyaXZlcnMsCisgKiAgICBhZnRlciBzb21lIGdyZXAgb3IgdGhlIHNvdXJjZXMuLi4KKyAqICAgPSBMaW51cyBtaWdodCB3YW50IHRvIHJlbmFtZSBhbGwgdGhlc2UgbWFjcm9zIGFuZCBmaWxlcyB0byBmaXQgaGlzIHRhc3RlLAorICogICAgdG8gZml0IGhpcyBwZXJzb25hbCBuYW1pbmcgc2NoZW1lLgorICogICA9IGl0IHNlZW1zIHRoYXQgYSBmZXcgZHJpdmVycyB3b3VsZCBhbHNvIGFwcHJlY2lhdGUKKyAqICAgIG55YmJsZSBzd2FwcGluZyBzdXBwb3J0Li4uCisgKiAgID0gZXZlcnkgYXJjaGl0ZWN0dXJlIGNvdWxkIGFkZCB0aGVpciBieXRlc3dhcCBtYWNybyBpbiBhc20vYnl0ZW9yZGVyLmgKKyAqICAgIHNlZSBob3cgc29tZSBhcmNoaXRlY3R1cmVzIGFscmVhZHkgZG8gKGkzODYsIGFscGhhLCBwcGMsIGV0YykKKyAqICAgPSBjcHVfdG9fYmVYWCBhbmQgYmVYWF90b19jcHUgbWlnaHQgc29tZSBkYXkgbmVlZCB0byBiZSB3ZWxsCisgKiAgICBkaXN0aW5ndWlzaGVkIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4gVGhpcyBpcyBub3QgdGhlIGNhc2UgY3VycmVudGx5LAorICogICAgc2luY2UgbGl0dGxlIGVuZGlhbiwgYmlnIGVuZGlhbiwgYW5kIHBkcCBlbmRpYW4gbWFjaGluZXMgbmVlZG4ndCBpdC4KKyAqICAgIEJ1dCB0aGlzIG1pZ2h0IGJlIHRoZSBjYXNlIGZvciwgc2F5LCBhIHBvcnQgb2YgTGludXggdG8gMjAvMjEgYml0CisgKiAgICBhcmNoaXRlY3R1cmVzIChhbmQgRjIxIExpbnV4IGFkZGljdCBhcm91bmQ/KS4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHRvIGJlIGRlZmluZWQgYnkgPGFzbS9ieXRlb3JkZXIuaD46CisgKgorICogQ29udmVyc2lvbiBvZiBsb25nIGFuZCBzaG9ydCBpbnQgYmV0d2VlbiBuZXR3b3JrIGFuZCBob3N0IGZvcm1hdAorICoJbnRvaGwoX191MzIgeCkKKyAqCW50b2hzKF9fdTE2IHgpCisgKglodG9ubChfX3UzMiB4KQorICoJaHRvbnMoX191MTYgeCkKKyAqIEl0IHNlZW1zIHRoYXQgc29tZSBwcm9ncmFtcyAod2hpY2g/IHdoZXJlPyBvciBwZXJoYXBzIGEgc3RhbmRhcmQ/IFBPU0lYPykKKyAqIG1pZ2h0IGxpa2UgdGhlIGFib3ZlIHRvIGJlIGZ1bmN0aW9ucywgbm90IG1hY3JvcyAod2h5PykuCisgKiBpZiB0aGF0J3MgdHJ1ZSwgdGhlbiBkZXRlY3QgdGhlbSwgYW5kIHRha2UgbWVhc3VyZXMuCisgKiBBbnl3YXksIHRoZSBtZWFzdXJlIGlzOiBkZWZpbmUgb25seSBfX19udG9obCBhcyBhIG1hY3JvIGluc3RlYWQsCisgKiBhbmQgaW4gYSBzZXBhcmF0ZSBmaWxlLCBoYXZlCisgKiB1bnNpZ25lZCBsb25nIGlubGluZSBudG9obCh4KXtyZXR1cm4gX19fbnRvaGwoeCk7fQorICoKKyAqIFRoZSBzYW1lIGZvciBjb25zdGFudCBhcmd1bWVudHMKKyAqCV9fY29uc3RhbnRfbnRvaGwoX191MzIgeCkKKyAqCV9fY29uc3RhbnRfbnRvaHMoX191MTYgeCkKKyAqCV9fY29uc3RhbnRfaHRvbmwoX191MzIgeCkKKyAqCV9fY29uc3RhbnRfaHRvbnMoX191MTYgeCkKKyAqCisgKiBDb252ZXJzaW9uIG9mIFhYLWJpdCBpbnRlZ2VycyAoMTYtIDMyLSBvciA2NC0pCisgKiBiZXR3ZWVuIG5hdGl2ZSBDUFUgZm9ybWF0IGFuZCBsaXR0bGUvYmlnIGVuZGlhbiBmb3JtYXQKKyAqIDY0LWJpdCBzdHVmZiBvbmx5IGRlZmluZWQgZm9yIHByb3BlciBhcmNoaXRlY3R1cmVzCisgKgljcHVfdG9fW2JsXWVYWChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHUoX191WFggeCkKKyAqCisgKiBUaGUgc2FtZSwgYnV0IHRha2VzIGEgcG9pbnRlciB0byB0aGUgdmFsdWUgdG8gY29udmVydAorICoJY3B1X3RvX1tibF1lWFhwKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXAoX191WFggeCkKKyAqCisgKiBUaGUgc2FtZSwgYnV0IGNoYW5nZSBpbiBzaXR1CisgKgljcHVfdG9fW2JsXWVYWHMoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1cyhfX3VYWCB4KQorICoKKyAqIFNlZSBhc20tZm9vL2J5dGVvcmRlci5oIGZvciBleGFtcGxlcyBvZiBob3cgdG8gcHJvdmlkZQorICogYXJjaGl0ZWN0dXJlLW9wdGltaXplZCB2ZXJzaW9ucworICoKKyAqLworCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCisvKgorICogaW5zaWRlIHRoZSBrZXJuZWwsIHdlIGNhbiB1c2Ugbmlja25hbWVzOworICogb3V0c2lkZSBvZiBpdCwgd2UgbXVzdCBhdm9pZCBQT1NJWCBuYW1lc3BhY2UgcG9sbHV0aW9uLi4uCisgKi8KKyNkZWZpbmUgY3B1X3RvX2xlNjQgX19jcHVfdG9fbGU2NAorI2RlZmluZSBsZTY0X3RvX2NwdSBfX2xlNjRfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTMyIF9fY3B1X3RvX2xlMzIKKyNkZWZpbmUgbGUzMl90b19jcHUgX19sZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGUxNiBfX2NwdV90b19sZTE2CisjZGVmaW5lIGxlMTZfdG9fY3B1IF9fbGUxNl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlNjQgX19jcHVfdG9fYmU2NAorI2RlZmluZSBiZTY0X3RvX2NwdSBfX2JlNjRfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTMyIF9fY3B1X3RvX2JlMzIKKyNkZWZpbmUgYmUzMl90b19jcHUgX19iZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmUxNiBfX2NwdV90b19iZTE2CisjZGVmaW5lIGJlMTZfdG9fY3B1IF9fYmUxNl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlNjRwIF9fY3B1X3RvX2xlNjRwCisjZGVmaW5lIGxlNjRfdG9fY3B1cCBfX2xlNjRfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGUzMnAgX19jcHVfdG9fbGUzMnAKKyNkZWZpbmUgbGUzMl90b19jcHVwIF9fbGUzMl90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTE2cCBfX2NwdV90b19sZTE2cAorI2RlZmluZSBsZTE2X3RvX2NwdXAgX19sZTE2X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlNjRwIF9fY3B1X3RvX2JlNjRwCisjZGVmaW5lIGJlNjRfdG9fY3B1cCBfX2JlNjRfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmUzMnAgX19jcHVfdG9fYmUzMnAKKyNkZWZpbmUgYmUzMl90b19jcHVwIF9fYmUzMl90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTE2cCBfX2NwdV90b19iZTE2cAorI2RlZmluZSBiZTE2X3RvX2NwdXAgX19iZTE2X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlNjRzIF9fY3B1X3RvX2xlNjRzCisjZGVmaW5lIGxlNjRfdG9fY3B1cyBfX2xlNjRfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fbGUzMnMgX19jcHVfdG9fbGUzMnMKKyNkZWZpbmUgbGUzMl90b19jcHVzIF9fbGUzMl90b19jcHVzCisjZGVmaW5lIGNwdV90b19sZTE2cyBfX2NwdV90b19sZTE2cworI2RlZmluZSBsZTE2X3RvX2NwdXMgX19sZTE2X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlNjRzIF9fY3B1X3RvX2JlNjRzCisjZGVmaW5lIGJlNjRfdG9fY3B1cyBfX2JlNjRfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmUzMnMgX19jcHVfdG9fYmUzMnMKKyNkZWZpbmUgYmUzMl90b19jcHVzIF9fYmUzMl90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTE2cyBfX2NwdV90b19iZTE2cworI2RlZmluZSBiZTE2X3RvX2NwdXMgX19iZTE2X3RvX2NwdXMKKyNlbmRpZgorCisKKy8qCisgKiBIYW5kbGUgbnRvaGwgYW5kIHN1Y2hlcy4gVGhlc2UgaGF2ZSB2YXJpb3VzIGNvbXBhdGliaWxpdHkKKyAqIGlzc3VlcyAtIGxpa2Ugd2Ugd2FudCB0byBnaXZlIHRoZSBwcm90b3R5cGUgZXZlbiB0aG91Z2ggd2UKKyAqIGFsc28gaGF2ZSBhIG1hY3JvIGZvciB0aGVtIGluIGNhc2Ugc29tZSBzdHJhbmdlIHByb2dyYW0KKyAqIHdhbnRzIHRvIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIG9yIHNvbWV0aGluZy4uCisgKgorICogTm90ZSB0aGF0IHRoZXNlIHVzZWQgdG8gcmV0dXJuIGEgImxvbmciIGluIGxpYmM1LCBldmVuIHRob3VnaAorICogbG9uZyBpcyBvZnRlbiA2NC1iaXQgdGhlc2UgZGF5cy4uIFRodXMgdGhlIGNhc3RzLgorICoKKyAqIFRoZXkgaGF2ZSB0byBiZSBtYWNyb3MgaW4gb3JkZXIgdG8gZG8gdGhlIGNvbnN0YW50IGZvbGRpbmcKKyAqIGNvcnJlY3RseSAtIGlmIHRoZSBhcmd1bWVudCBwYXNzZWQgaW50byBhIGlubGluZSBmdW5jdGlvbgorICogaXQgaXMgbm8gbG9uZ2VyIGNvbnN0YW50IGFjY29yZGluZyB0byBnY2MuLgorICovCisKKyN1bmRlZiBudG9obAorI3VuZGVmIG50b2hzCisjdW5kZWYgaHRvbmwKKyN1bmRlZiBodG9ucworCisvKgorICogRG8gdGhlIHByb3RvdHlwZXMuIFNvbWVib2R5IG1pZ2h0IHdhbnQgdG8gdGFrZSB0aGUKKyAqIGFkZHJlc3Mgb3Igc29tZSBzdWNoIHNpY2sgdGhpbmcuLgorICovCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAoZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMikKK2V4dGVybiBfX3UzMgkJCW50b2hsKF9fdTMyKTsKK2V4dGVybiBfX3UzMgkJCWh0b25sKF9fdTMyKTsKKyNlbHNlCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQJbnRvaGwodW5zaWduZWQgbG9uZyBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50CWh0b25sKHVuc2lnbmVkIGxvbmcgaW50KTsKKyNlbmRpZgorZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludAludG9ocyh1bnNpZ25lZCBzaG9ydCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludAlodG9ucyh1bnNpZ25lZCBzaG9ydCBpbnQpOworCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikKKworI2RlZmluZSBfX19odG9ubCh4KSBfX2NwdV90b19iZTMyKHgpCisjZGVmaW5lIF9fX2h0b25zKHgpIF9fY3B1X3RvX2JlMTYoeCkKKyNkZWZpbmUgX19fbnRvaGwoeCkgX19iZTMyX3RvX2NwdSh4KQorI2RlZmluZSBfX19udG9ocyh4KSBfX2JlMTZfdG9fY3B1KHgpCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IChkZWZpbmVkIChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA+PSAyKQorI2RlZmluZSBodG9ubCh4KSBfX19odG9ubCh4KQorI2RlZmluZSBudG9obCh4KSBfX19udG9obCh4KQorI2Vsc2UKKyNkZWZpbmUgaHRvbmwoeCkgKCh1bnNpZ25lZCBsb25nKV9fX2h0b25sKHgpKQorI2RlZmluZSBudG9obCh4KSAoKHVuc2lnbmVkIGxvbmcpX19fbnRvaGwoeCkpCisjZW5kaWYKKyNkZWZpbmUgaHRvbnMoeCkgX19faHRvbnMoeCkKKyNkZWZpbmUgbnRvaHMoeCkgX19fbnRvaHMoeCkKKworI2VuZGlmIC8qIE9QVElNSVpFICovCisKKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfR0VORVJJQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQ2ZjNlYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApAQCAtMCwwICsxLDY5IEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICisKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2VuZGlmCisjZGVmaW5lCV9fQllURV9PUkRFUglfX0xJVFRMRV9FTkRJQU4KKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CisKKyNkZWZpbmUgX19jb25zdGFudF9odG9ubCh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9ocyh4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpIF9fX2NvbnN0YW50X3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUzMih4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTE2X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMzJzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFkNTcwZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaApAQCAtMCwwICsxLDE1OCBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX1NXQUJfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX1NXQUJfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyL3N3YWIuaAorICogQnl0ZS1zd2FwcGluZywgaW5kZXBlbmRlbnRseSBmcm9tIENQVSBlbmRpYW5uZXNzCisgKglzd2FiWFhbcHNdPyhmb28pCisgKgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQorICogICAgc2VwYXJhdGVkIHN3YWIgZnVuY3Rpb25zIGZyb20gY3B1X3RvX1hYLAorICogICAgdG8gY2xlYW4gdXAgc3VwcG9ydCBmb3IgYml6YXJyZS1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKyAqCisgKiBTZWUgYXNtLWkzODYvYnl0ZW9yZGVyLmggYW5kIHN1Y2hlcyBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgb3B0aW1pemVkIHZlcnNpb25zCisgKgorICovCisKKy8qIGNhc3RzIGFyZSBuZWNlc3NhcnkgZm9yIGNvbnN0YW50cywgYmVjYXVzZSB3ZSBuZXZlciBrbm93IGhvdyBmb3Igc3VyZQorICogaG93IFUvVUwvVUxMIG1hcCB0byBfX3UxNiwgX191MzIsIF9fdTY0LiBBdCBsZWFzdCBub3QgaW4gYSBwb3J0YWJsZSB3YXkuCisgKi8KKyNkZWZpbmUgX19fc3dhYjE2KHgpIFwKKwkoKF9fdTE2KSggXAorCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfCBcCisJCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweGZmMDBVKSA+PiA4KSApKQorI2RlZmluZSBfX19zd2FiMzIoeCkgXAorCSgoX191MzIpKCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSApKQorI2RlZmluZSBfX19zd2FiNjQoeCkgXAorCSgoX191NjQpKCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKworLyoKKyAqIHByb3ZpZGUgZGVmYXVsdHMgd2hlbiBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgb3B0aW1pemF0aW9uIGlzIGRldGVjdGVkCisgKi8KKyNpZm5kZWYgX19hcmNoX19zd2FiMTYKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19zd2FiMTYoeCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMgorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX3N3YWIzMih4KQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjY0CisjICBkZWZpbmUgX19hcmNoX19zd2FiNjQoeCkgX19fc3dhYjY0KHgpCisjZW5kaWYKKworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnAoeCkgX19zd2FiMTYoKih4KSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnAoeCkgX19zd2FiMzIoKih4KSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NHAKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NHAoeCkgX19zd2FiNjQoKih4KSkKKyNlbmRpZgorCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2cworIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2cyh4KSBkbyB7ICooeCkgPSBfX3N3YWIxNnAoKHgpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnMoeCkgZG8geyAqKHgpID0gX19zd2FiMzJwKCh4KSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjRzCisjICBkZWZpbmUgX19hcmNoX19zd2FiNjRzKHgpIGRvIHsgKih4KSA9IF9fc3dhYjY0cCgoeCkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFsbG93IGNvbnN0YW50IGZvbGRpbmcKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+PSAyKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKKyMgIGRlZmluZSBfX3N3YWIxNih4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPyBcCisgX19fc3dhYjE2KCh4KSkgOiBcCisgX19mc3dhYjE2KCh4KSkpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8gXAorIF9fX3N3YWIzMigoeCkpIDogXAorIF9fZnN3YWIzMigoeCkpKQorIyAgZGVmaW5lIF9fc3dhYjY0KHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191NjQpKHgpKSA/IFwKKyBfX19zd2FiNjQoKHgpKSA6IFwKKyBfX2Zzd2FiNjQoKHgpKSkKKyNlbHNlCisjICBkZWZpbmUgX19zd2FiMTYoeCkgX19mc3dhYjE2KHgpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgX19mc3dhYjMyKHgpCisjICBkZWZpbmUgX19zd2FiNjQoeCkgX19mc3dhYjY0KHgpCisjZW5kaWYgLyogT1BUSU1JWkUgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTE2IF9fZnN3YWIxNihfX3UxNiB4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIxNih4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fc3dhYjE2cChfX3UxNiAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMTZwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIxNnMoX191MTYgKmFkZHIpCit7CisJX19hcmNoX19zd2FiMTZzKGFkZHIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTMyIF9fZnN3YWIzMihfX3UzMiB4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIzMih4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fc3dhYjMycChfX3UzMiAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMzJwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWIzMnMoX191MzIgKmFkZHIpCit7CisJX19hcmNoX19zd2FiMzJzKGFkZHIpOworfQorCisjaWZkZWYgX19CWVRFT1JERVJfSEFTX1U2NF9fCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB4KQoreworIyAgaWZkZWYgX19TV0FCXzY0X1RIUlVfMzJfXworCV9fdTMyIGggPSB4ID4+IDMyOworCV9fdTMyIGwgPSB4ICYgKCgxVUxMPDwzMiktMSk7CisJcmV0dXJuICgoKF9fdTY0KV9fc3dhYjMyKGwpKSA8PCAzMikgfCAoKF9fdTY0KShfX3N3YWIzMihoKSkpOworIyAgZWxzZQorCXJldHVybiBfX2FyY2hfX3N3YWI2NCh4KTsKKyMgIGVuZGlmCit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX3N3YWI2NHAoX191NjQgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjY0cCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiNjRzKF9fdTY0ICphZGRyKQoreworCV9fYXJjaF9fc3dhYjY0cyhhZGRyKTsKK30KKyNlbmRpZiAvKiBfX0JZVEVPUkRFUl9IQVNfVTY0X18gKi8KKworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgc3dhYjE2IF9fc3dhYjE2CisjZGVmaW5lIHN3YWIzMiBfX3N3YWIzMgorI2RlZmluZSBzd2FiNjQgX19zd2FiNjQKKyNkZWZpbmUgc3dhYjE2cCBfX3N3YWIxNnAKKyNkZWZpbmUgc3dhYjMycCBfX3N3YWIzMnAKKyNkZWZpbmUgc3dhYjY0cCBfX3N3YWI2NHAKKyNkZWZpbmUgc3dhYjE2cyBfX3N3YWIxNnMKKyNkZWZpbmUgc3dhYjMycyBfX3N3YWIzMnMKKyNkZWZpbmUgc3dhYjY0cyBfX3N3YWI2NHMKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY29uZmlnLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTk0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfTElOVVhfQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19ICisKKy8qICNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jdHlwZS5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgX0xJTlVYX0NUWVBFX0gKKyNkZWZpbmUgX0xJTlVYX0NUWVBFX0gKKworLyoKKyAqIE5PVEUhIFRoaXMgY3R5cGUgZG9lcyBub3QgaGFuZGxlIEVPRiBsaWtlIHRoZSBzdGFuZGFyZCBDCisgKiBsaWJyYXJ5IGlzIHJlcXVpcmVkIHRvLgorICovCisKKyNkZWZpbmUgX1UJMHgwMQkvKiB1cHBlciAqLworI2RlZmluZSBfTAkweDAyCS8qIGxvd2VyICovCisjZGVmaW5lIF9ECTB4MDQJLyogZGlnaXQgKi8KKyNkZWZpbmUgX0MJMHgwOAkvKiBjbnRybCAqLworI2RlZmluZSBfUAkweDEwCS8qIHB1bmN0ICovCisjZGVmaW5lIF9TCTB4MjAJLyogd2hpdGUgc3BhY2UgKHNwYWNlL2xmL3RhYikgKi8KKyNkZWZpbmUgX1gJMHg0MAkvKiBoZXggZGlnaXQgKi8KKyNkZWZpbmUgX1NQCTB4ODAJLyogaGFyZCBzcGFjZSAoMHgyMCkgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgX2N0eXBlW107CisKKyNkZWZpbmUgX19pc21hc2soeCkgKF9jdHlwZVsoaW50KSh1bnNpZ25lZCBjaGFyKSh4KV0pCisKKyNkZWZpbmUgaXNhbG51bShjKQkoKF9faXNtYXNrKGMpJihfVXxfTHxfRCkpICE9IDApCisjZGVmaW5lIGlzYWxwaGEoYykJKChfX2lzbWFzayhjKSYoX1V8X0wpKSAhPSAwKQorI2RlZmluZSBpc2NudHJsKGMpCSgoX19pc21hc2soYykmKF9DKSkgIT0gMCkKKyNkZWZpbmUgaXNkaWdpdChjKQkoKF9faXNtYXNrKGMpJihfRCkpICE9IDApCisjZGVmaW5lIGlzZ3JhcGgoYykJKChfX2lzbWFzayhjKSYoX1B8X1V8X0x8X0QpKSAhPSAwKQorI2RlZmluZSBpc2xvd2VyKGMpCSgoX19pc21hc2soYykmKF9MKSkgIT0gMCkKKyNkZWZpbmUgaXNwcmludChjKQkoKF9faXNtYXNrKGMpJihfUHxfVXxfTHxfRHxfU1ApKSAhPSAwKQorI2RlZmluZSBpc3B1bmN0KGMpCSgoX19pc21hc2soYykmKF9QKSkgIT0gMCkKKyNkZWZpbmUgaXNzcGFjZShjKQkoKF9faXNtYXNrKGMpJihfUykpICE9IDApCisjZGVmaW5lIGlzdXBwZXIoYykJKChfX2lzbWFzayhjKSYoX1UpKSAhPSAwKQorI2RlZmluZSBpc3hkaWdpdChjKQkoKF9faXNtYXNrKGMpJihfRHxfWCkpICE9IDApCisKKyNkZWZpbmUgaXNhc2NpaShjKSAoKCh1bnNpZ25lZCBjaGFyKShjKSk8PTB4N2YpCisjZGVmaW5lIHRvYXNjaWkoYykgKCgodW5zaWduZWQgY2hhcikoYykpJjB4N2YpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3RvbG93ZXIodW5zaWduZWQgY2hhciBjKQoreworCWlmIChpc3VwcGVyKGMpKQorCQljIC09ICdBJy0nYSc7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3RvdXBwZXIodW5zaWduZWQgY2hhciBjKQoreworCWlmIChpc2xvd2VyKGMpKQorCQljIC09ICdhJy0nQSc7CisJcmV0dXJuIGM7Cit9CisKKyNkZWZpbmUgdG9sb3dlcihjKSBfX3RvbG93ZXIoYykKKyNkZWZpbmUgdG91cHBlcihjKSBfX3RvdXBwZXIoYykKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzN2UxZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIF9MSU5VWF9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9QT1NJWF9UWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKworLyoKKyAqIFRoaXMgYWxsb3dzIGZvciAxMDI0IGZpbGUgZGVzY3JpcHRvcnM6IGlmIE5SX09QRU4gaXMgZXZlciBncm93bgorICogYmV5b25kIHRoYXQgeW91J2xsIGhhdmUgdG8gY2hhbmdlIHRoaXMgdG9vLiBCdXQgMTAyNCBmZCdzIHNlZW0gdG8gYmUKKyAqIGVub3VnaCBldmVuIGZvciBzdWNoICJyZWFsIiB1bmljZXMgbGlrZSBPU0YvMSwgc28gaG9wZWZ1bGx5IHRoaXMgaXMKKyAqIG9uZSBsaW1pdCB0aGF0IGRvZXNuJ3QgaGF2ZSB0byBiZSBjaGFuZ2VkIFthZ2Fpbl0uCisgKgorICogTm90ZSB0aGF0IFBPU0lYIHdhbnRzIHRoZSBGRF9DTEVBUihmZCxmZHNldHApIGRlZmluZXMgdG8gYmUgaW4KKyAqIDxzeXMvdGltZS5oPiAoYW5kIHRodXMgPGxpbnV4L3RpbWUuaD4pIC0gYnV0IHRoaXMgaXMgYSBtb3JlIGxvZ2ljYWwKKyAqIHBsYWNlIGZvciB0aGVtLiBTb2x2ZWQgYnkgaGF2aW5nIGR1bW15IGRlZmluZXMgaW4gPHN5cy90aW1lLmg+LgorICovCisKKy8qCisgKiBUaG9zZSBtYWNyb3MgbWF5IGhhdmUgYmVlbiBkZWZpbmVkIGluIDxnbnUvdHlwZXMuaD4uIEJ1dCB3ZSBhbHdheXMKKyAqIHVzZSB0aGUgb25lcyBoZXJlLgorICovCisjdW5kZWYgX19ORkRCSVRTCisjZGVmaW5lIF9fTkZEQklUUwkoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworI3VuZGVmIF9fRkRfU0VUU0laRQorI2RlZmluZSBfX0ZEX1NFVFNJWkUJMTAyNAorCisjdW5kZWYgX19GRFNFVF9MT05HUworI2RlZmluZSBfX0ZEU0VUX0xPTkdTCShfX0ZEX1NFVFNJWkUvX19ORkRCSVRTKQorCisjdW5kZWYgX19GREVMVAorI2RlZmluZQlfX0ZERUxUKGQpCSgoZCkgLyBfX05GREJJVFMpCisKKyN1bmRlZiBfX0ZETUFTSworI2RlZmluZQlfX0ZETUFTSyhkKQkoMVVMIDw8ICgoZCkgJSBfX05GREJJVFMpKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmZHNfYml0cyBbX19GRFNFVF9MT05HU107Cit9IF9fa2VybmVsX2ZkX3NldDsKKworLyogVHlwZSBvZiBhIHNpZ25hbCBoYW5kbGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAoKl9fa2VybmVsX3NpZ2hhbmRsZXJfdCkoaW50KTsKKworLyogVHlwZSBvZiBhIFNZU1YgSVBDIGtleS4gICovCit0eXBlZGVmIGludCBfX2tlcm5lbF9rZXlfdDsKKworI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlcy5oPgorCisjZW5kaWYgLyogX0xJTlVYX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjk0MjJjYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oCkBAIC0wLDAgKzEsMTMyIEBACisjaWZuZGVmIF9MSU5VWF9TVEFUX0gKKyNkZWZpbmUgX0xJTlVYX1NUQVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAJLyogdHlwZSBvZiBmaWxlICovCisjZGVmaW5lIFNfSUZTT0NLIDAxNDAwMDAJLyogbmFtZWQgc29ja2V0ICovCisjZGVmaW5lIFNfSUZMTksJIDAxMjAwMDAJLyogc3ltYm9saWMgbGluayAqLworI2RlZmluZSBTX0lGUkVHICAwMTAwMDAwCS8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUgU19JRkJMSyAgMDA2MDAwMAkvKiBibG9jayBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZESVIgIDAwNDAwMDAJLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIFNfSUZDSFIgIDAwMjAwMDAJLyogY2hhcmFjdGVyIHNwZWNpYWwgKi8KKyNkZWZpbmUgU19JRklGTyAgMDAxMDAwMAkvKiBmaWZvICovCisjZGVmaW5lIFNfSVNVSUQgIDAwMDQwMDAJLyogc2V0IHVzZXIgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lIFNfSVNHSUQgIDAwMDIwMDAJLyogc2V0IGdyb3VwIGlkIG9uIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTX0lTVlRYICAwMDAxMDAwCS8qIHNhdmUgc3dhcHBlZCB0ZXh0IGV2ZW4gYWZ0ZXIgdXNlICovCisKKyNkZWZpbmUgU19JU0xOSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNkZWZpbmUgU19JU1JFRyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNkZWZpbmUgU19JU0RJUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNkZWZpbmUgU19JU0NIUihtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkNIUikKKyNkZWZpbmUgU19JU0JMSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKKyNkZWZpbmUgU19JU0ZJRk8obSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZJRk8pCisjZGVmaW5lIFNfSVNTT0NLKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGU09DSykKKworI2RlZmluZSBTX0lSV1hVIDAwNzAwCQkvKiByd3ggZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVJVU1IgMDA0MDAJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKyNkZWZpbmUgU19JV1VTUiAwMDIwMAkJLyogd3JpdGUgcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKyNkZWZpbmUgU19JWFVTUiAwMDEwMAkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3Igb3duZXIgKi8KKworI2RlZmluZSBTX0lSV1hHIDAwMDcwCQkvKiByd3ggZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVJHUlAgMDAwNDAJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKyNkZWZpbmUgU19JV0dSUCAwMDAyMAkJLyogd3JpdGUgcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKyNkZWZpbmUgU19JWEdSUCAwMDAxMAkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3IgZ3JvdXAgKi8KKworI2RlZmluZSBTX0lSV1hPIDAwMDA3CQkvKiByd3ggZm9yIG90aGVyICovCisjZGVmaW5lIFNfSVJPVEggMDAwMDQJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKyNkZWZpbmUgU19JV09USCAwMDAwMgkJLyogcmVhZCBwZXJtaXNzaW9uIGZvciBvdGhlciAqLworI2RlZmluZSBTX0lYT1RIIDAwMDAxCQkvKiBleGVjdXRlL3NlYXJjaCBwZXJtaXNzaW9uIGZvciBvdGhlciAqLworCisjaWZkZWYJX19QUENfXworCitzdHJ1Y3Qgc3RhdCB7CisJZGV2X3QJCXN0X2RldjsJCS8qIGZpbGUgc3lzdGVtIGlkICovCisJaW5vX3QJCXN0X2lubzsJCS8qIGZpbGUgaWQgKi8KKwltb2RlX3QJCXN0X21vZGU7CS8qIG93bmVyc2hpcC9wcm90ZWN0aW9uICovCisJbmxpbmtfdAkJc3Rfbmxpbms7CS8qIG51bWJlciBvZiBsaW5rcyAqLworCXVpZF90IAkJc3RfdWlkOwkJLyogdXNlciBpZCAqLworCWdpZF90IAkJc3RfZ2lkOwkJLyogZ3JvdXAgaWQgKi8KKwlkZXZfdAkJc3RfcmRldjsKKwlvZmZfdAkJc3Rfc2l6ZTsJLyogZmlsZSBzaXplIGluICMgb2YgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYmxrc2l6ZTsJLyogYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgIAlzdF9ibG9ja3M7CS8qIGZpbGUgc2l6ZSBpbiAjIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGxvbmcgIAlzdF9hdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IGFjY2Vzc2VkICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nICAJc3RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAqLworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZyAgCXN0X2N0aW1lOwkvKiB0aW1lIGZpbGUgc3RhdHVzIHdhcyBsYXN0IGNoYW5nZWQgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkNTsKK307CisKKyNlbmRpZgkvKiBfX1BQQ19fICovCisKKyNpZiBkZWZpbmVkIChfX0FSTV9fKSB8fCBkZWZpbmVkIChfX0kzODZfXykgfHwgZGVmaW5lZCAoX19NNjhLX18pIHx8IGRlZmluZWQgKF9fYmxhY2tmaW5fXykKKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIHNob3J0IHN0X2RldjsKKwl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7CisJdW5zaWduZWQgbG9uZyBzdF9pbm87CisJdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBzdF9ubGluazsKKwl1bnNpZ25lZCBzaG9ydCBzdF91aWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfZ2lkOworCXVuc2lnbmVkIHNob3J0IHN0X3JkZXY7CisJdW5zaWduZWQgc2hvcnQgX19wYWQyOworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNTsKK307CisKKyNlbmRpZgkvKiBfX0FSTV9fICovCisKKyNpZiBkZWZpbmVkIChfX01JUFNfXykKKworc3RydWN0IHN0YXQgeworCWRldl90ICAgICAgICAgICBzdF9kZXY7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDFbM107CisJaW5vX3QgICAgICAgICAgIHN0X2lubzsKKwltb2RlX3QgICAgICAgICAgc3RfbW9kZTsKKwlubGlua190ICAgICAgICAgc3Rfbmxpbms7CisJdWlkX3QgICAgICAgICAgIHN0X3VpZDsKKwlnaWRfdCAgICAgICAgICAgc3RfZ2lkOworCWRldl90ICAgICAgICAgICBzdF9yZGV2OworCWxvbmcgICAgICAgICAgICBzdF9wYWQyWzJdOworCW9mZl90ICAgICAgICAgICBzdF9zaXplOworCWxvbmcgICAgICAgICAgICBzdF9wYWQzOworCS8qCisJICogQWN0dWFsbHkgdGhpcyBzaG91bGQgYmUgdGltZXN0cnVjX3Qgc3RfYXRpbWUsIHN0X210aW1lIGFuZCBzdF9jdGltZQorCSAqIGJ1dCB3ZSBkb24ndCBoYXZlIGl0IHVuZGVyIExpbnV4LgorCSAqLworCXRpbWVfdCAgICAgICAgICBzdF9hdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQwOworCXRpbWVfdCAgICAgICAgICBzdF9tdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQxOworCXRpbWVfdCAgICAgICAgICBzdF9jdGltZTsKKwlsb25nICAgICAgICAgICAgcmVzZXJ2ZWQyOworCWxvbmcgICAgICAgICAgICBzdF9ibGtzaXplOworCWxvbmcgICAgICAgICAgICBzdF9ibG9ja3M7CisJbG9uZyAgICAgICAgICAgIHN0X3BhZDRbMTRdOworfTsKKworI2VuZGlmCS8qIF9fTUlQU19fICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMzRjMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfTElOVVhfU1REREVGX0gKKyNkZWZpbmUgX0xJTlVYX1NURERFRl9ICisKKyN1bmRlZiBOVUxMCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTlVMTCAwCisjZWxzZQorI2RlZmluZSBOVUxMICgodm9pZCAqKTApCisjZW5kaWYKKworI2lmbmRlZiBfU0laRV9UCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCisjdW5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzOTAzOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBfTElOVVhfU1RSSU5HX0hfCisjZGVmaW5lIF9MSU5VWF9TVFJJTkdfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIGZvciBzaXplX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIE5VTEwgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gY2hhciAqIF9fX3N0cnRvazsKK2V4dGVybiBjaGFyICogc3RycGJyayhjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBjaGFyICogc3RydG9rKGNoYXIgKixjb25zdCBjaGFyICopOworZXh0ZXJuIGNoYXIgKiBzdHJzZXAoY2hhciAqKixjb25zdCBjaGFyICopOworZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CisKKworLyoKKyAqIEluY2x1ZGUgbWFjaGluZSBzcGVjaWZpYyBpbmxpbmUgcm91dGluZXMKKyAqLworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDUFkKK2V4dGVybiBjaGFyICogc3RyY3B5KGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DUFkKK2V4dGVybiBjaGFyICogc3RybmNweShjaGFyICosY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNBVAorZXh0ZXJuIGNoYXIgKiBzdHJjYXQoY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DQVQKK2V4dGVybiBjaGFyICogc3RybmNhdChjaGFyICosIGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDTVAKK2V4dGVybiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5DTVAKK2V4dGVybiBpbnQgc3RybmNtcChjb25zdCBjaGFyICosY29uc3QgY2hhciAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZiAwIC8qIG5vdCB1c2VkIC0gd2FzOiAjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5JQ01QICovCitleHRlcm4gaW50IHN0cm5pY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqLGludCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJyY2hyKGNvbnN0IGNoYXIgKixpbnQpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNUUgorZXh0ZXJuIGNoYXIgKiBzdHJzdHIoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTEVOCitleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5MRU4KK2V4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJEVVAKK2V4dGVybiBjaGFyICogc3RyZHVwKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1dBQgorZXh0ZXJuIGNoYXIgKiBzdHJzd2FiKGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQKK2V4dGVybiB2b2lkICogbWVtc2V0KHZvaWQgKixpbnQsX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkKK2V4dGVybiB2b2lkICogbWVtY3B5KHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gdm9pZCAqIG1lbW1vdmUodm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTVNDQU4KK2V4dGVybiB2b2lkICogbWVtc2Nhbih2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ01QCitleHRlcm4gaW50IG1lbWNtcChjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ0hSCitleHRlcm4gdm9pZCAqIG1lbWNocihjb25zdCB2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9TVFJJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmYxMmI5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0wLDAgKzEsMTU4IEBACisjaWZuZGVmIF9MSU5VWF9USU1FX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBfREVGVU4oYSxiLGMpIGEoYykKKyNkZWZpbmUgX0NPTlNUIGNvbnN0CisjZGVmaW5lIF9BTkQgLAorCisjZGVmaW5lIF9SRUVOVF9PTkxZCisKKyNkZWZpbmUgU0VDU1BFUk1JTgk2MEwKKyNkZWZpbmUgTUlOU1BFUkhPVVIJNjBMCisjZGVmaW5lIEhPVVJTUEVSREFZCTI0TAorI2RlZmluZSBTRUNTUEVSSE9VUgkoU0VDU1BFUk1JTiAqIE1JTlNQRVJIT1VSKQorI2RlZmluZSBTRUNTUEVSREFZCShTRUNTUEVSSE9VUiAqIEhPVVJTUEVSREFZKQorI2RlZmluZSBEQVlTUEVSV0VFSwk3CisjZGVmaW5lIE1PTlNQRVJZRUFSCTEyCisKKyNkZWZpbmUgWUVBUl9CQVNFCTE5MDAKKyNkZWZpbmUgRVBPQ0hfWUVBUiAgICAgIDE5NzAKKyNkZWZpbmUgRVBPQ0hfV0RBWSAgICAgIDQKKworI2RlZmluZSBpc2xlYXAoeSkgKCgoKHkpICUgNCkgPT0gMCAmJiAoKHkpICUgMTAwKSAhPSAwKSB8fCAoKHkpICUgNDAwKSA9PSAwKQorCisKKy8qIFVzZWQgYnkgb3RoZXIgdGltZSBmdW5jdGlvbnMuICAqLworc3RydWN0IHRtIHsKKyAgICBpbnQgdG1fc2VjOyAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmRzLiAgICAgWzAtNjBdICgxIGxlYXAgc2Vjb25kKSAqLworICAgIGludCB0bV9taW47ICAgICAgICAgICAgICAgICAgIC8qIE1pbnV0ZXMuICAgICBbMC01OV0gKi8KKyAgICBpbnQgdG1faG91cjsgICAgICAgICAgICAgICAgICAvKiBIb3Vycy4gICAgICAgWzAtMjNdICovCisgICAgaW50IHRtX21kYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5LiAgICAgICAgIFsxLTMxXSAqLworICAgIGludCB0bV9tb247ICAgICAgICAgICAgICAgICAgIC8qIE1vbnRoLiAgICAgICBbMC0xMV0gKi8KKyAgICBpbnQgdG1feWVhcjsgICAgICAgICAgICAgICAgICAvKiBZZWFyIC0gMTkwMC4gICovCisgICAgaW50IHRtX3dkYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5IG9mIHdlZWsuIFswLTZdICovCisgICAgaW50IHRtX3lkYXk7ICAgICAgICAgICAgICAgICAgLyogRGF5cyBpbiB5ZWFyLlswLTM2NV0gKi8KKyAgICBpbnQgdG1faXNkc3Q7ICAgICAgICAgICAgICAgICAvKiBEU1QuICAgICAgICAgWy0xLzAvMV0qLworCisjIGlmZGVmIF9fVVNFX0JTRAorICAgIGxvbmcgaW50IHRtX2dtdG9mZjsgICAgICAgICAgIC8qIFNlY29uZHMgZWFzdCBvZiBVVEMuICAqLworICAgIF9fY29uc3QgY2hhciAqdG1fem9uZTsgICAgICAgIC8qIFRpbWV6b25lIGFiYnJldmlhdGlvbi4gICovCisjIGVsc2UKKyAgICBsb25nIGludCBfX3RtX2dtdG9mZjsgICAgICAgICAvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgICBfX2NvbnN0IGNoYXIgKl9fdG1fem9uZTsgICAgICAvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworIyBlbmRpZgorfTsKKworc3RhdGljIGlubGluZSBjaGFyICoKK19ERUZVTiAoYXNjdGltZV9yLCAodGltX3AsIHJlc3VsdCksCisJX0NPTlNUIHN0cnVjdCB0bSAqdGltX3AgX0FORAorCWNoYXIgKnJlc3VsdCkKK3sKKyAgICBzdGF0aWMgX0NPTlNUIGNoYXIgZGF5X25hbWVbN11bM10gPSB7CisJIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKKyAgICB9OworICAgIHN0YXRpYyBfQ09OU1QgY2hhciBtb25fbmFtZVsxMl1bM10gPSB7CisJIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKwkiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgICAgfTsKKworICAgIHNwcmludGYgKHJlc3VsdCwgIiUuM3MgJS4zcyAlLjJkICUuMmQ6JS4yZDolLjJkICVkXG4iLAorCSAgICBkYXlfbmFtZVt0aW1fcC0+dG1fd2RheV0sCisJICAgIG1vbl9uYW1lW3RpbV9wLT50bV9tb25dLAorCSAgICB0aW1fcC0+dG1fbWRheSwgdGltX3AtPnRtX2hvdXIsIHRpbV9wLT50bV9taW4sCisJICAgIHRpbV9wLT50bV9zZWMsIDE5MDAgKyB0aW1fcC0+dG1feWVhcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdG0gKgorX0RFRlVOIChsb2NhbHRpbWVfciwgKHRpbV9wLCByZXMpLAorCV9DT05TVCB0aW1lX3QgKiB0aW1fcCBfQU5ECisJc3RydWN0IHRtICpyZXMpCit7CisgICAgc3RhdGljIF9DT05TVCBpbnQgbW9uX2xlbmd0aHNbMl1bTU9OU1BFUllFQVJdID0geworICAgICAgezMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9LAorICAgICAgezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9CisgICAgfSA7CisKKyAgICBzdGF0aWMgX0NPTlNUIGludCB5ZWFyX2xlbmd0aHNbMl0gPSB7CisgICAgICAzNjUsCisgICAgICAzNjYKKyAgICB9IDsKKworICAgIGxvbmcgZGF5cywgcmVtOworICAgIGludCB5OworICAgIGludCB5bGVhcDsKKyAgICBfQ09OU1QgaW50ICppcDsKKworICAgIGRheXMgPSAoKGxvbmcpICp0aW1fcCkgLyBTRUNTUEVSREFZOworICAgIHJlbSA9ICgobG9uZykgKnRpbV9wKSAlIFNFQ1NQRVJEQVk7CisgICAgd2hpbGUgKHJlbSA8IDApCisgICAgeworCXJlbSArPSBTRUNTUEVSREFZOworCS0tZGF5czsKKyAgICB9CisgICAgd2hpbGUgKHJlbSA+PSBTRUNTUEVSREFZKQorICAgIHsKKwlyZW0gLT0gU0VDU1BFUkRBWTsKKwkrK2RheXM7CisgICAgfQorCisgICAgLyogY29tcHV0ZSBob3VyLCBtaW4sIGFuZCBzZWMgKi8KKyAgICByZXMtPnRtX2hvdXIgPSAoaW50KSAocmVtIC8gU0VDU1BFUkhPVVIpOworICAgIHJlbSAlPSBTRUNTUEVSSE9VUjsKKyAgICByZXMtPnRtX21pbiA9IChpbnQpIChyZW0gLyBTRUNTUEVSTUlOKTsKKyAgICByZXMtPnRtX3NlYyA9IChpbnQpIChyZW0gJSBTRUNTUEVSTUlOKTsKKworICAgIC8qIGNvbXB1dGUgZGF5IG9mIHdlZWsgKi8KKyAgICBpZiAoKHJlcy0+dG1fd2RheSA9ICgoRVBPQ0hfV0RBWSArIGRheXMpICUgREFZU1BFUldFRUspKSA8IDApCisJcmVzLT50bV93ZGF5ICs9IERBWVNQRVJXRUVLOworCisgICAgLyogY29tcHV0ZSB5ZWFyICYgZGF5IG9mIHllYXIgKi8KKyAgICB5ID0gRVBPQ0hfWUVBUjsKKyAgICBpZiAoZGF5cyA+PSAwKQorICAgIHsKKwlmb3IgKDs7KQorCXsKKwkgICAgeWxlYXAgPSBpc2xlYXAoeSk7CisJICAgIGlmIChkYXlzIDwgeWVhcl9sZW5ndGhzW3lsZWFwXSkKKwkJYnJlYWs7CisJICAgIHkrKzsKKwkgICAgZGF5cyAtPSB5ZWFyX2xlbmd0aHNbeWxlYXBdOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlkbworCXsKKwkgICAgLS15OworCSAgICB5bGVhcCA9IGlzbGVhcCh5KTsKKwkgICAgZGF5cyArPSB5ZWFyX2xlbmd0aHNbeWxlYXBdOworCX0gd2hpbGUgKGRheXMgPCAwKTsKKyAgICB9CisKKyAgICByZXMtPnRtX3llYXIgPSB5IC0gWUVBUl9CQVNFOworICAgIHJlcy0+dG1feWRheSA9IGRheXM7CisgICAgaXAgPSBtb25fbGVuZ3Roc1t5bGVhcF07CisgICAgZm9yIChyZXMtPnRtX21vbiA9IDA7IGRheXMgPj0gaXBbcmVzLT50bV9tb25dOyArK3Jlcy0+dG1fbW9uKQorCWRheXMgLT0gaXBbcmVzLT50bV9tb25dOworICAgIHJlcy0+dG1fbWRheSA9IGRheXMgKyAxOworCisgICAgLyogc2V0IGRheWxpZ2h0IHNhdmluZyB0aW1lIGZsYWcgKi8KKyAgICByZXMtPnRtX2lzZHN0ID0gLTE7CisKKyAgICByZXR1cm4gKHJlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitfREVGVU4gKGN0aW1lX3IsICh0aW1fcCwgcmVzdWx0KSwKKwlfQ09OU1QgdGltZV90ICogdGltX3AgX0FORAorCWNoYXIgKiByZXN1bHQpCisKK3sKKyAgICBzdHJ1Y3QgdG0gdG07CisgICAgcmV0dXJuIGFzY3RpbWVfciAobG9jYWx0aW1lX3IgKHRpbV9wLCAmdG0pLCByZXN1bHQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ4MDhmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9UWVBFU19ICisKKyNpZmRlZglfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19LRVJORUxfU1RSSUNUX05BTUVTCisKK3R5cGVkZWYgX19rZXJuZWxfZmRfc2V0CQlmZF9zZXQ7Cit0eXBlZGVmIF9fa2VybmVsX2Rldl90CQlkZXZfdDsKK3R5cGVkZWYgX19rZXJuZWxfaW5vX3QJCWlub190OwordHlwZWRlZiBfX2tlcm5lbF9tb2RlX3QJCW1vZGVfdDsKK3R5cGVkZWYgX19rZXJuZWxfbmxpbmtfdAlubGlua190OwordHlwZWRlZiBfX2tlcm5lbF9vZmZfdAkJb2ZmX3Q7Cit0eXBlZGVmIF9fa2VybmVsX3BpZF90CQlwaWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZGFkZHJfdAlkYWRkcl90OwordHlwZWRlZiBfX2tlcm5lbF9rZXlfdAkJa2V5X3Q7Cit0eXBlZGVmIF9fa2VybmVsX3N1c2Vjb25kc190CXN1c2Vjb25kc190OworCisjaWZkZWYgX19LRVJORUxfXwordHlwZWRlZiBfX2tlcm5lbF91aWQzMl90CXVpZF90OwordHlwZWRlZiBfX2tlcm5lbF9naWQzMl90CWdpZF90OwordHlwZWRlZiBfX2tlcm5lbF91aWQxNl90ICAgICAgICB1aWQxNl90OwordHlwZWRlZiBfX2tlcm5lbF9naWQxNl90ICAgICAgICBnaWQxNl90OworCisjaWZkZWYgQ09ORklHX1VJRDE2CisvKiBUaGlzIGlzIGRlZmluZWQgYnkgaW5jbHVkZS9hc20te2FyY2h9L3Bvc2l4X3R5cGVzLmggKi8KK3R5cGVkZWYgX19rZXJuZWxfb2xkX3VpZF90CW9sZF91aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfb2xkX2dpZF90CW9sZF9naWRfdDsKKyNlbmRpZiAvKiBDT05GSUdfVUlEMTYgKi8KKworLyogbGliYzUgaW5jbHVkZXMgdGhpcyBmaWxlIHRvIGRlZmluZSB1aWRfdCwgdGh1cyB1aWRfdCBjYW4gbmV2ZXIgY2hhbmdlCisgKiB3aGVuIGl0IGlzIGluY2x1ZGVkIGJ5IG5vbi1rZXJuZWwgY29kZQorICovCisjZWxzZQordHlwZWRlZiBfX2tlcm5lbF91aWRfdAkJdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2dpZF90CQlnaWRfdDsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fa2VybmVsX2xvZmZfdAkJbG9mZl90OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBhbHNvIHByb3RlY3RlZCBieSBpbmRpdmlkdWFsIGlmZGVmcyBmb3IKKyAqIGhpc3RvcmljYWwgcmVhc29uczoKKyAqLworI2lmbmRlZiBfU0laRV9UCisjZGVmaW5lIF9TSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc2l6ZV90CQlzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfU1NJWkVfVAorI2RlZmluZSBfU1NJWkVfVAordHlwZWRlZiBfX2tlcm5lbF9zc2l6ZV90CXNzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgX19rZXJuZWxfcHRyZGlmZl90CXB0cmRpZmZfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9USU1FX1QKKyNkZWZpbmUgX1RJTUVfVAordHlwZWRlZiBfX2tlcm5lbF90aW1lX3QJCXRpbWVfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DTE9DS19UCisjZGVmaW5lIF9DTE9DS19UCit0eXBlZGVmIF9fa2VybmVsX2Nsb2NrX3QJY2xvY2tfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9DQUREUl9UCisjZGVmaW5lIF9DQUREUl9UCit0eXBlZGVmIF9fa2VybmVsX2NhZGRyX3QJY2FkZHJfdDsKKyNlbmRpZgorCisvKiBic2QgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdV9zaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdV9sb25nOworCisvKiBzeXN2ICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVuY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQl1bG9uZzsKKworI2lmbmRlZiBfX0JJVF9UWVBFU19ERUZJTkVEX18KKyNkZWZpbmUgX19CSVRfVFlQRVNfREVGSU5FRF9fCisKK3R5cGVkZWYJCV9fdTgJCXVfaW50OF90OwordHlwZWRlZgkJX19zOAkJaW50OF90OwordHlwZWRlZgkJX191MTYJCXVfaW50MTZfdDsKK3R5cGVkZWYJCV9fczE2CQlpbnQxNl90OwordHlwZWRlZgkJX191MzIJCXVfaW50MzJfdDsKK3R5cGVkZWYJCV9fczMyCQlpbnQzMl90OworCisjZW5kaWYgLyogIShfX0JJVF9UWVBFU19ERUZJTkVEX18pICovCisKK3R5cGVkZWYJCV9fdTgJCXVpbnQ4X3Q7Cit0eXBlZGVmCQlfX3UxNgkJdWludDE2X3Q7Cit0eXBlZGVmCQlfX3UzMgkJdWludDMyX3Q7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmCQlfX3U2NAkJdWludDY0X3Q7Cit0eXBlZGVmCQlfX3U2NAkJdV9pbnQ2NF90OwordHlwZWRlZgkJX19zNjQJCWludDY0X3Q7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX1NUUklDVF9OQU1FUyAqLworCisvKgorICogQmVsb3cgYXJlIHRydWx5IExpbnV4LXNwZWNpZmljIHR5cGVzIHRoYXQgc2hvdWxkIG5ldmVyIGNvbGxpZGUgd2l0aAorICogYW55IGFwcGxpY2F0aW9uL2xpYnJhcnkgdGhhdCB3YW50cyBsaW51eC90eXBlcy5oLgorICovCisKK3N0cnVjdCB1c3RhdCB7CisJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOworCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKKwljaGFyCQkJZl9mbmFtZVs2XTsKKwljaGFyCQkJZl9mcGFja1s2XTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9tYWxsb2MuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmgKQEAgLTAsMCArMSw5NDIgQEAKKy8qCisgIEEgdmVyc2lvbiBvZiBtYWxsb2MvZnJlZS9yZWFsbG9jIHdyaXR0ZW4gYnkgRG91ZyBMZWEgYW5kIHJlbGVhc2VkIHRvIHRoZQorICBwdWJsaWMgZG9tYWluLiAgU2VuZCBxdWVzdGlvbnMvY29tbWVudHMvY29tcGxhaW50cy9wZXJmb3JtYW5jZSBkYXRhCisgIHRvIGRsQGNzLm9zd2Vnby5lZHUKKworKiBWRVJTSU9OIDIuNi42ICBTdW4gTWFyICA1IDE5OjEwOjAzIDIwMDAgIERvdWcgTGVhICAoZGwgYXQgZ2VlKQorCisgICBOb3RlOiBUaGVyZSBtYXkgYmUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFsbG9jIG9idGFpbmFibGUgYXQKKwkgICBmdHA6Ly9nLm9zd2Vnby5lZHUvcHViL21pc2MvbWFsbG9jLmMKKwkgQ2hlY2sgYmVmb3JlIGluc3RhbGxpbmchCisKKyogV2h5IHVzZSB0aGlzIG1hbGxvYz8KKworICBUaGlzIGlzIG5vdCB0aGUgZmFzdGVzdCwgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBtb3N0IHBvcnRhYmxlLCBvcgorICBtb3N0IHR1bmFibGUgbWFsbG9jIGV2ZXIgd3JpdHRlbi4gSG93ZXZlciBpdCBpcyBhbW9uZyB0aGUgZmFzdGVzdAorICB3aGlsZSBhbHNvIGJlaW5nIGFtb25nIHRoZSBtb3N0IHNwYWNlLWNvbnNlcnZpbmcsIHBvcnRhYmxlIGFuZCB0dW5hYmxlLgorICBDb25zaXN0ZW50IGJhbGFuY2UgYWNyb3NzIHRoZXNlIGZhY3RvcnMgcmVzdWx0cyBpbiBhIGdvb2QgZ2VuZXJhbC1wdXJwb3NlCisgIGFsbG9jYXRvci4gRm9yIGEgaGlnaC1sZXZlbCBkZXNjcmlwdGlvbiwgc2VlCisgICAgIGh0dHA6Ly9nLm9zd2Vnby5lZHUvZGwvaHRtbC9tYWxsb2MuaHRtbAorCisqIFN5bm9wc2lzIG9mIHB1YmxpYyByb3V0aW5lcworCisgIChNdWNoIGZ1bGxlciBkZXNjcmlwdGlvbnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvZ3JhbSBkb2N1bWVudGF0aW9uIGJlbG93LikKKworICBtYWxsb2Moc2l6ZV90IG4pOworICAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGNodW5rIG9mIGF0IGxlYXN0IG4gYnl0ZXMsIG9yIG51bGwKKyAgICAgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLgorICBmcmVlKFZvaWRfdCogcCk7CisgICAgIFJlbGVhc2UgdGhlIGNodW5rIG9mIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHAsIG9yIG5vIGVmZmVjdCBpZiBwIGlzIG51bGwuCisgIHJlYWxsb2MoVm9pZF90KiBwLCBzaXplX3Qgbik7CisgICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBjaHVuayBvZiBzaXplIG4gdGhhdCBjb250YWlucyB0aGUgc2FtZSBkYXRhCisgICAgIGFzIGRvZXMgY2h1bmsgcCB1cCB0byB0aGUgbWluaW11bSBvZiAobiwgcCdzIHNpemUpIGJ5dGVzLCBvciBudWxsCisgICAgIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZS4gVGhlIHJldHVybmVkIHBvaW50ZXIgbWF5IG9yIG1heSBub3QgYmUKKyAgICAgdGhlIHNhbWUgYXMgcC4gSWYgcCBpcyBudWxsLCBlcXVpdmFsZW50IHRvIG1hbGxvYy4gIFVubGVzcyB0aGUKKyAgICAgI2RlZmluZSBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgYmVsb3cgaXMgc2V0LCByZWFsbG9jIHdpdGggYQorICAgICBzaXplIGFyZ3VtZW50IG9mIHplcm8gKHJlKWFsbG9jYXRlcyBhIG1pbmltdW0tc2l6ZWQgY2h1bmsuCisgIG1lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBuKTsKKyAgICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBuIGJ5dGVzLCBhbGlnbmVkCisgICAgIGluIGFjY29yZCB3aXRoIHRoZSBhbGlnbm1lbnQgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZgorICAgICB0d28uCisgIHZhbGxvYyhzaXplX3Qgbik7CisgICAgIEVxdWl2YWxlbnQgdG8gbWVtYWxpZ24ocGFnZXNpemUsIG4pLCB3aGVyZSBwYWdlc2l6ZSBpcyB0aGUgcGFnZQorICAgICBzaXplIG9mIHRoZSBzeXN0ZW0gKG9yIGFzIG5lYXIgdG8gdGhpcyBhcyBjYW4gYmUgZmlndXJlZCBvdXQgZnJvbQorICAgICBhbGwgdGhlIGluY2x1ZGVzL2RlZmluZXMgYmVsb3cuKQorICBwdmFsbG9jKHNpemVfdCBuKTsKKyAgICAgRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLAorICAgICByb3VuZCB1cCBuIHRvIG5lYXJlc3QgcGFnZXNpemUuCisgIGNhbGxvYyhzaXplX3QgdW5pdCwgc2l6ZV90IHF1YW50aXR5KTsKKyAgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gcXVhbnRpdHkgKiB1bml0IGJ5dGVzLCB3aXRoIGFsbCBsb2NhdGlvbnMKKyAgICAgc2V0IHRvIHplcm8uCisgIGNmcmVlKFZvaWRfdCogcCk7CisgICAgIEVxdWl2YWxlbnQgdG8gZnJlZShwKS4KKyAgbWFsbG9jX3RyaW0oc2l6ZV90IHBhZCk7CisgICAgIFJlbGVhc2UgYWxsIGJ1dCBwYWQgYnl0ZXMgb2YgZnJlZWQgdG9wLW1vc3QgbWVtb3J5IGJhY2sKKyAgICAgdG8gdGhlIHN5c3RlbS4gUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgZWxzZSAwLgorICBtYWxsb2NfdXNhYmxlX3NpemUoVm9pZF90KiBwKTsKKyAgICAgUmVwb3J0IHRoZSBudW1iZXIgdXNhYmxlIGFsbG9jYXRlZCBieXRlcyBhc3NvY2lhdGVkIHdpdGggYWxsb2NhdGVkCisgICAgIGNodW5rIHAuIFRoaXMgbWF5IG9yIG1heSBub3QgcmVwb3J0IG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIHJlcXVlc3RlZCwKKyAgICAgZHVlIHRvIGFsaWdubWVudCBhbmQgbWluaW11bSBzaXplIGNvbnN0cmFpbnRzLgorICBtYWxsb2Nfc3RhdHMoKTsKKyAgICAgUHJpbnRzIGJyaWVmIHN1bW1hcnkgc3RhdGlzdGljcyBvbiBzdGRlcnIuCisgIG1hbGxpbmZvKCkKKyAgICAgUmV0dXJucyAoYnkgY29weSkgYSBzdHJ1Y3QgY29udGFpbmluZyB2YXJpb3VzIHN1bW1hcnkgc3RhdGlzdGljcy4KKyAgbWFsbG9wdChpbnQgcGFyYW1ldGVyX251bWJlciwgaW50IHBhcmFtZXRlcl92YWx1ZSkKKyAgICAgQ2hhbmdlcyBvbmUgb2YgdGhlIHR1bmFibGUgcGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3cuIFJldHVybnMKKyAgICAgMSBpZiBzdWNjZXNzZnVsIGluIGNoYW5naW5nIHRoZSBwYXJhbWV0ZXIsIGVsc2UgMC4KKworKiBWaXRhbCBzdGF0aXN0aWNzOgorCisgIEFsaWdubWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgOC1ieXRlCisgICAgICAgOCBieXRlIGFsaWdubWVudCBpcyBjdXJyZW50bHkgaGFyZHdpcmVkIGludG8gdGhlIGRlc2lnbi4gIFRoaXMKKyAgICAgICBzZWVtcyB0byBzdWZmaWNlIGZvciBhbGwgY3VycmVudCBtYWNoaW5lcyBhbmQgQyBjb21waWxlcnMuCisKKyAgQXNzdW1lZCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOiAgICAgICA0IG9yIDggYnl0ZXMKKyAgICAgICBDb2RlIGZvciA4LWJ5dGUgcG9pbnRlcnMgaXMgdW50ZXN0ZWQgYnkgbWUgYnV0IGhhcyB3b3JrZWQKKyAgICAgICByZWxpYWJseSBieSBXb2xmcmFtIEdsb2dlciwgd2hvIGNvbnRyaWJ1dGVkIG1vc3Qgb2YgdGhlCisgICAgICAgY2hhbmdlcyBzdXBwb3J0aW5nIHRoaXMuCisKKyAgQXNzdW1lZCBzaXplX3QgIHJlcHJlc2VudGF0aW9uOiAgICAgICA0IG9yIDggYnl0ZXMKKyAgICAgICBOb3RlIHRoYXQgc2l6ZV90IGlzIGFsbG93ZWQgdG8gYmUgNCBieXRlcyBldmVuIGlmIHBvaW50ZXJzIGFyZSA4LgorCisgIE1pbmltdW0gb3ZlcmhlYWQgcGVyIGFsbG9jYXRlZCBjaHVuazogNCBvciA4IGJ5dGVzCisgICAgICAgRWFjaCBtYWxsb2NlZCBjaHVuayBoYXMgYSBoaWRkZW4gb3ZlcmhlYWQgb2YgNCBieXRlcyBob2xkaW5nIHNpemUKKyAgICAgICBhbmQgc3RhdHVzIGluZm9ybWF0aW9uLgorCisgIE1pbmltdW0gYWxsb2NhdGVkIHNpemU6IDQtYnl0ZSBwdHJzOiAgMTYgYnl0ZXMgICAgKGluY2x1ZGluZyA0IG92ZXJoZWFkKQorCQkJICA4LWJ5dGUgcHRyczogIDI0LzMyIGJ5dGVzIChpbmNsdWRpbmcsIDQvOCBvdmVyaGVhZCkKKworICAgICAgIFdoZW4gYSBjaHVuayBpcyBmcmVlZCwgMTIgKGZvciA0Ynl0ZSBwdHJzKSBvciAyMCAoZm9yIDggYnl0ZQorICAgICAgIHB0cnMgYnV0IDQgYnl0ZSBzaXplKSBvciAyNCAoZm9yIDgvOCkgYWRkaXRpb25hbCBieXRlcyBhcmUKKyAgICAgICBuZWVkZWQ7IDQgKDgpIGZvciBhIHRyYWlsaW5nIHNpemUgZmllbGQKKyAgICAgICBhbmQgOCAoMTYpIGJ5dGVzIGZvciBmcmVlIGxpc3QgcG9pbnRlcnMuIFRodXMsIHRoZSBtaW5pbXVtCisgICAgICAgYWxsb2NhdGFibGUgc2l6ZSBpcyAxNi8yNC8zMiBieXRlcy4KKworICAgICAgIEV2ZW4gYSByZXF1ZXN0IGZvciB6ZXJvIGJ5dGVzIChpLmUuLCBtYWxsb2MoMCkpIHJldHVybnMgYQorICAgICAgIHBvaW50ZXIgdG8gc29tZXRoaW5nIG9mIHRoZSBtaW5pbXVtIGFsbG9jYXRhYmxlIHNpemUuCisKKyAgTWF4aW11bSBhbGxvY2F0ZWQgc2l6ZTogNC1ieXRlIHNpemVfdDogMl4zMSAtICA4IGJ5dGVzCisJCQkgIDgtYnl0ZSBzaXplX3Q6IDJeNjMgLSAxNiBieXRlcworCisgICAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IChwb3NzaWJseSBzaWduZWQpIHNpemVfdCBiaXQgdmFsdWVzIHN1ZmZpY2UgdG8KKyAgICAgICByZXByZXNlbnQgY2h1bmsgc2l6ZXMuIGBQb3NzaWJseSBzaWduZWQnIGlzIGR1ZSB0byB0aGUgZmFjdAorICAgICAgIHRoYXQgYHNpemVfdCcgbWF5IGJlIGRlZmluZWQgb24gYSBzeXN0ZW0gYXMgZWl0aGVyIGEgc2lnbmVkIG9yCisgICAgICAgYW4gdW5zaWduZWQgdHlwZS4gVG8gYmUgY29uc2VydmF0aXZlLCB2YWx1ZXMgdGhhdCB3b3VsZCBhcHBlYXIKKyAgICAgICBhcyBuZWdhdGl2ZSBudW1iZXJzIGFyZSBhdm9pZGVkLgorICAgICAgIFJlcXVlc3RzIGZvciBzaXplcyB3aXRoIGEgbmVnYXRpdmUgc2lnbiBiaXQgd2hlbiB0aGUgcmVxdWVzdAorICAgICAgIHNpemUgaXMgdHJlYWRlZCBhcyBhIGxvbmcgd2lsbCByZXR1cm4gbnVsbC4KKworICBNYXhpbXVtIG92ZXJoZWFkIHdhc3RhZ2UgcGVyIGFsbG9jYXRlZCBjaHVuazogbm9ybWFsbHkgMTUgYnl0ZXMKKworICAgICAgIEFsaWdubm1lbnQgZGVtYW5kcywgcGx1cyB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplIHJlc3RyaWN0aW9uCisgICAgICAgbWFrZSB0aGUgbm9ybWFsIHdvcnN0LWNhc2Ugd2FzdGFnZSAxNSBieXRlcyAoaS5lLiwgdXAgdG8gMTUKKyAgICAgICBtb3JlIGJ5dGVzIHdpbGwgYmUgYWxsb2NhdGVkIHRoYW4gd2VyZSByZXF1ZXN0ZWQgaW4gbWFsbG9jKSwgd2l0aAorICAgICAgIHR3byBleGNlcHRpb25zOgorCSAxLiBCZWNhdXNlIHJlcXVlc3RzIGZvciB6ZXJvIGJ5dGVzIGFsbG9jYXRlIG5vbi16ZXJvIHNwYWNlLAorCSAgICB0aGUgd29yc3QgY2FzZSB3YXN0YWdlIGZvciBhIHJlcXVlc3Qgb2YgemVybyBieXRlcyBpcyAyNCBieXRlcy4KKwkgMi4gRm9yIHJlcXVlc3RzID49IG1tYXBfdGhyZXNob2xkIHRoYXQgYXJlIHNlcnZpY2VkIHZpYQorCSAgICBtbWFwKCksIHRoZSB3b3JzdCBjYXNlIHdhc3RhZ2UgaXMgOCBieXRlcyBwbHVzIHRoZSByZW1haW5kZXIKKwkgICAgZnJvbSBhIHN5c3RlbSBwYWdlICh0aGUgbWluaW1hbCBtbWFwIHVuaXQpOyB0eXBpY2FsbHkgNDA5NiBieXRlcy4KKworKiBMaW1pdGF0aW9ucworCisgICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFyZSBOT1QgY3VycmVudGx5IHN1cHBvcnRlZAorCisgICAgKiBObyB1c2VyLWRlZmluYWJsZSBob29rcyBmb3IgY2FsbGJhY2tzIGFuZCB0aGUgbGlrZS4KKyAgICAqIE5vIGF1dG9tYXRlZCBtZWNoYW5pc20gZm9yIGZ1bGx5IGNoZWNraW5nIHRoYXQgYWxsIGFjY2Vzc2VzCisgICAgICB0byBtYWxsb2NlZCBtZW1vcnkgc3RheSB3aXRoaW4gdGhlaXIgYm91bmRzLgorICAgICogTm8gc3VwcG9ydCBmb3IgY29tcGFjdGlvbi4KKworKiBTeW5vcHNpcyBvZiBjb21waWxlLXRpbWUgb3B0aW9uczoKKworICAgIFBlb3BsZSBoYXZlIHJlcG9ydGVkIHVzaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgbWFsbG9jIG9uIGFsbAorICAgIHZlcnNpb25zIG9mIFVuaXgsIHNvbWV0aW1lcyBieSB0d2Vha2luZyBzb21lIG9mIHRoZSBkZWZpbmVzCisgICAgYmVsb3cuIEl0IGhhcyBiZWVuIHRlc3RlZCBtb3N0IGV4dGVuc2l2ZWx5IG9uIFNvbGFyaXMgYW5kCisgICAgTGludXguIEl0IGlzIGFsc28gcmVwb3J0ZWQgdG8gd29yayBvbiBXSU4zMiBwbGF0Zm9ybXMuCisgICAgUGVvcGxlIGhhdmUgYWxzbyByZXBvcnRlZCBhZGFwdGluZyB0aGlzIG1hbGxvYyBmb3IgdXNlIGluCisgICAgc3RhbmQtYWxvbmUgZW1iZWRkZWQgc3lzdGVtcy4KKworICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBzdHJhaWdodCwgaGFuZC10dW5lZCBBTlNJIEMuICBBbW9uZyBvdGhlcgorICAgIGNvbnNlcXVlbmNlcywgaXQgdXNlcyBhIGxvdCBvZiBtYWNyb3MuICBCZWNhdXNlIG9mIHRoaXMsIHRvIGJlIGF0CisgICAgYWxsIHVzYWJsZSwgdGhpcyBjb2RlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBhbiBvcHRpbWl6aW5nIGNvbXBpbGVyCisgICAgKGZvciBleGFtcGxlIGdjYyAtTzIpIHRoYXQgY2FuIHNpbXBsaWZ5IGV4cHJlc3Npb25zIGFuZCBjb250cm9sCisgICAgcGF0aHMuCisKKyAgX19TVERfQyAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZXJpdmVkIGZyb20gQyBjb21waWxlciBkZWZpbmVzKQorICAgICBOb256ZXJvIGlmIHVzaW5nIEFOU0ktc3RhbmRhcmQgQyBjb21waWxlciwgYSBDKysgY29tcGlsZXIsIG9yCisgICAgIGEgQyBjb21waWxlciBzdWZmaWNpZW50bHkgY2xvc2UgdG8gQU5TSSB0byBnZXQgYXdheSB3aXRoIGl0LgorICBERUJVRyAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBEZWZpbmUgdG8gZW5hYmxlIGRlYnVnZ2luZy4gQWRkcyBmYWlybHkgZXh0ZW5zaXZlIGFzc2VydGlvbi1iYXNlZAorICAgICBjaGVja2luZyB0byBoZWxwIHRyYWNrIGRvd24gbWVtb3J5IGVycm9ycywgYnV0IG5vdGljZWFibHkgc2xvd3MgZG93bgorICAgICBleGVjdXRpb24uCisgIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIERlZmluZSB0aGlzIGlmIHlvdSB0aGluayB0aGF0IHJlYWxsb2MocCwgMCkgc2hvdWxkIGJlIGVxdWl2YWxlbnQKKyAgICAgdG8gZnJlZShwKS4gT3RoZXJ3aXNlLCBzaW5jZSBtYWxsb2MgcmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIGZvcgorICAgICBtYWxsb2MoMCksIHNvIGRvZXMgcmVhbGxvYyhwLCAwKS4KKyAgSEFWRV9NRU1DUFkgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVmaW5lZCkKKyAgICAgRGVmaW5lIGlmIHlvdSBhcmUgbm90IG90aGVyd2lzZSB1c2luZyBBTlNJIFNURCBDLCBidXQgc3RpbGwKKyAgICAgaGF2ZSBtZW1jcHkgYW5kIG1lbXNldCBpbiB5b3VyIEMgbGlicmFyeSBhbmQgd2FudCB0byB1c2UgdGhlbS4KKyAgICAgT3RoZXJ3aXNlLCBzaW1wbGUgaW50ZXJuYWwgdmVyc2lvbnMgYXJlIHN1cHBsaWVkLgorICBVU0VfTUVNQ1BZICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDEgaWYgSEFWRV9NRU1DUFkgaXMgZGVmaW5lZCwgMCBvdGhlcndpc2UpCisgICAgIERlZmluZSBhcyAxIGlmIHlvdSB3YW50IHRoZSBDIGxpYnJhcnkgdmVyc2lvbnMgb2YgbWVtc2V0IGFuZAorICAgICBtZW1jcHkgY2FsbGVkIGluIHJlYWxsb2MgYW5kIGNhbGxvYyAob3RoZXJ3aXNlIG1hY3JvIHZlcnNpb25zIGFyZSB1c2VkKS4KKyAgICAgQXQgbGVhc3Qgb24gc29tZSBwbGF0Zm9ybXMsIHRoZSBzaW1wbGUgbWFjcm8gdmVyc2lvbnMgdXN1YWxseQorICAgICBvdXRwZXJmb3JtIGxpYmMgdmVyc2lvbnMuCisgIEhBVkVfTU1BUCAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQgYXMgMSkKKyAgICAgRGVmaW5lIHRvIG5vbi16ZXJvIHRvIG9wdGlvbmFsbHkgbWFrZSBtYWxsb2MoKSB1c2UgbW1hcCgpIHRvCisgICAgIGFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLgorICBIQVZFX01SRU1BUCAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQgYXMgMCB1bmxlc3MgTGludXggbGliYyBzZXQpCisgICAgIERlZmluZSB0byBub24temVybyB0byBvcHRpb25hbGx5IG1ha2UgcmVhbGxvYygpIHVzZSBtcmVtYXAoKSB0bworICAgICByZWFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLgorICBtYWxsb2NfZ2V0cGFnZXNpemUgICAgICAgIChkZWZhdWx0OiBkZXJpdmVkIGZyb20gc3lzdGVtICNpbmNsdWRlcykKKyAgICAgRWl0aGVyIGEgY29uc3RhbnQgb3Igcm91dGluZSBjYWxsIHJldHVybmluZyB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZS4KKyAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIE9wdGlvbmFsbHkgZGVmaW5lIGlmIHlvdSBhcmUgb24gYSBzeXN0ZW0gd2l0aCBhIC91c3IvaW5jbHVkZS9tYWxsb2MuaAorICAgICB0aGF0IGRlY2xhcmVzIHN0cnVjdCBtYWxsaW5mby4gSXQgaXMgbm90IGF0IGFsbCBuZWNlc3NhcnkgdG8KKyAgICAgZGVmaW5lIHRoaXMgZXZlbiBpZiB5b3UgZG8sIGJ1dCB3aWxsIGVuc3VyZSBjb25zaXN0ZW5jeS4KKyAgSU5URVJOQUxfU0laRV9UICAgICAgICAgICAoZGVmYXVsdDogc2l6ZV90KQorICAgICBEZWZpbmUgdG8gYSAzMi1iaXQgdHlwZSAocHJvYmFibHkgYHVuc2lnbmVkIGludCcpIGlmIHlvdSBhcmUgb24gYQorICAgICA2NC1iaXQgbWFjaGluZSwgeWV0IGRvIG5vdCB3YW50IG9yIG5lZWQgdG8gYWxsb3cgbWFsbG9jIHJlcXVlc3RzIG9mCisgICAgIGdyZWF0ZXIgdGhhbiAyXjMxIHRvIGJlIGhhbmRsZWQuIFRoaXMgc2F2ZXMgc3BhY2UsIGVzcGVjaWFsbHkgZm9yCisgICAgIHZlcnkgc21hbGwgY2h1bmtzLgorICBJTlRFUk5BTF9MSU5VWF9DX0xJQiAgICAgIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgRGVmaW5lZCBvbmx5IHdoZW4gY29tcGlsZWQgYXMgcGFydCBvZiBMaW51eCBsaWJjLgorICAgICBBbHNvIG5vdGUgdGhhdCB0aGVyZSBpcyBzb21lIG9kZCBpbnRlcm5hbCBuYW1lLW1hbmdsaW5nIHZpYSBkZWZpbmVzCisgICAgIChmb3IgZXhhbXBsZSwgaW50ZXJuYWxseSwgYG1hbGxvYycgaXMgbmFtZWQgYG1BTExPYycpIG5lZWRlZAorICAgICB3aGVuIGNvbXBpbGluZyBpbiB0aGlzIGNhc2UuIFRoZXNlIGxvb2sgZnVubnkgYnV0IGRvbid0IG90aGVyd2lzZQorICAgICBhZmZlY3QgYW55dGhpbmcuCisgIFdJTjMyICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCkKKyAgICAgRGVmaW5lIHRoaXMgb24gTVMgd2luICg5NSwgbnQpIHBsYXRmb3JtcyB0byBjb21waWxlIGluIHNicmsgZW11bGF0aW9uLgorICBMQUNLU19VTklTVERfSCAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQgaWYgbm90IFdJTjMyKQorICAgICBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgPHVuaXN0ZC5oPi4KKyAgTEFDS1NfU1lTX1BBUkFNX0ggICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkIGlmIG5vdCBXSU4zMikKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIDxzeXMvcGFyYW0uaD4uCisgIE1PUkVDT1JFICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHNicmspCisgICAgIFRoZSBuYW1lIG9mIHRoZSByb3V0aW5lIHRvIGNhbGwgdG8gb2J0YWluIG1vcmUgbWVtb3J5IGZyb20gdGhlIHN5c3RlbS4KKyAgTU9SRUNPUkVfRkFJTFVSRSAgICAgICAgICAoZGVmYXVsdDogLTEpCisgICAgIFRoZSB2YWx1ZSByZXR1cm5lZCB1cG9uIGZhaWx1cmUgb2YgTU9SRUNPUkUuCisgIE1PUkVDT1JFX0NMRUFSUyAgICAgICAgICAgKGRlZmF1bHQgMSkKKyAgICAgVHJ1ZSAoMSkgaWYgdGhlIHJvdXRpbmUgbWFwcGVkIHRvIE1PUkVDT1JFIHplcm9lcyBvdXQgbWVtb3J5ICh3aGljaAorICAgICBob2xkcyBmb3Igc2JyaykuCisgIERFRkFVTFRfVFJJTV9USFJFU0hPTEQKKyAgREVGQVVMVF9UT1BfUEFECisgIERFRkFVTFRfTU1BUF9USFJFU0hPTEQKKyAgREVGQVVMVF9NTUFQX01BWAorICAgICBEZWZhdWx0IHZhbHVlcyBvZiB0dW5hYmxlIHBhcmFtZXRlcnMgKGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cpCisgICAgIGNvbnRyb2xsaW5nIGludGVyYWN0aW9uIHdpdGggaG9zdCBzeXN0ZW0gcm91dGluZXMgKHNicmssIG1tYXAsIGV0YykuCisgICAgIFRoZXNlIHZhbHVlcyBtYXkgYWxzbyBiZSBjaGFuZ2VkIGR5bmFtaWNhbGx5IHZpYSBtYWxsb3B0KCkuIFRoZQorICAgICBwcmVzZXQgZGVmYXVsdHMgYXJlIHRob3NlIHRoYXQgZ2l2ZSBiZXN0IHBlcmZvcm1hbmNlIGZvciB0eXBpY2FsCisgICAgIHByb2dyYW1zL3N5c3RlbXMuCisgIFVTRV9ETF9QUkVGSVggICAgICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCkKKyAgICAgUHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuICBVc2VmdWwgdG8KKyAgICAgcXVpY2tseSBhdm9pZCBwcm9jZWR1cmUgZGVjbGFyYXRpb24gY29uZmxpY3RzIGFuZCBsaW5rZXIgc3ltYm9sCisgICAgIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLgorCisKKyovCisKKwwKKworCisvKiBQcmVsaW1pbmFyaWVzICovCisKKyNpZm5kZWYgX19TVERfQworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIF9fU1REX0MgICAgIDEKKyNlbHNlCisjaWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19TVERfQyAgICAgMQorI2Vsc2UKKyNkZWZpbmUgX19TVERfQyAgICAgMAorI2VuZGlmIC8qX19jcGx1c3BsdXMqLworI2VuZGlmIC8qX19TVERDX18qLworI2VuZGlmIC8qX19TVERfQyovCisKKyNpZm5kZWYgVm9pZF90CisjaWYgKF9fU1REX0MgfHwgZGVmaW5lZChXSU4zMikpCisjZGVmaW5lIFZvaWRfdCAgICAgIHZvaWQKKyNlbHNlCisjZGVmaW5lIFZvaWRfdCAgICAgIGNoYXIKKyNlbmRpZgorI2VuZGlmIC8qVm9pZF90Ki8KKworI2lmIF9fU1REX0MKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogZm9yIHNpemVfdCAqLworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgkvKiBfX1NURF9DICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIDAJLyogbm90IGZvciBVLUJvb3QgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgkvKiBuZWVkZWQgZm9yIG1hbGxvY19zdGF0cyAqLworI2VuZGlmCisKKworLyoKKyAgQ29tcGlsZS10aW1lIG9wdGlvbnMKKyovCisKKworLyoKKyAgICBEZWJ1Z2dpbmc6CisKKyAgICBCZWNhdXNlIGZyZWVkIGNodW5rcyBtYXkgYmUgb3ZlcndyaXR0ZW4gd2l0aCBsaW5rIGZpZWxkcywgdGhpcworICAgIG1hbGxvYyB3aWxsIG9mdGVuIGRpZSB3aGVuIGZyZWVkIG1lbW9yeSBpcyBvdmVyd3JpdHRlbiBieSB1c2VyCisgICAgcHJvZ3JhbXMuICBUaGlzIGNhbiBiZSB2ZXJ5IGVmZmVjdGl2ZSAoYWxiZWl0IGluIGFuIGFubm95aW5nIHdheSkKKyAgICBpbiBoZWxwaW5nIHRyYWNrIGRvd24gZGFuZ2xpbmcgcG9pbnRlcnMuCisKKyAgICBJZiB5b3UgY29tcGlsZSB3aXRoIC1EREVCVUcsIGEgbnVtYmVyIG9mIGFzc2VydGlvbiBjaGVja3MgYXJlCisgICAgZW5hYmxlZCB0aGF0IHdpbGwgY2F0Y2ggbW9yZSBtZW1vcnkgZXJyb3JzLiBZb3UgcHJvYmFibHkgd29uJ3QgYmUKKyAgICBhYmxlIHRvIG1ha2UgbXVjaCBzZW5zZSBvZiB0aGUgYWN0dWFsIGFzc2VydGlvbiBlcnJvcnMsIGJ1dCB0aGV5CisgICAgc2hvdWxkIGhlbHAgeW91IGxvY2F0ZSBpbmNvcnJlY3RseSBvdmVyd3JpdHRlbiBtZW1vcnkuICBUaGUKKyAgICBjaGVja2luZyBpcyBmYWlybHkgZXh0ZW5zaXZlLCBhbmQgd2lsbCBzbG93IGRvd24gZXhlY3V0aW9uCisgICAgbm90aWNlYWJseS4gQ2FsbGluZyBtYWxsb2Nfc3RhdHMgb3IgbWFsbGluZm8gd2l0aCBERUJVRyBzZXQgd2lsbAorICAgIGF0dGVtcHQgdG8gY2hlY2sgZXZlcnkgbm9uLW1tYXBwZWQgYWxsb2NhdGVkIGFuZCBmcmVlIGNodW5rIGluIHRoZQorICAgIGNvdXJzZSBvZiBjb21wdXRpbmcgdGhlIHN1bW1tYXJpZXMuIChCeSBuYXR1cmUsIG1tYXBwZWQgcmVnaW9ucworICAgIGNhbm5vdCBiZSBjaGVja2VkIHZlcnkgbXVjaCBhdXRvbWF0aWNhbGx5LikKKworICAgIFNldHRpbmcgREVCVUcgbWF5IGFsc28gYmUgaGVscGZ1bCBpZiB5b3UgYXJlIHRyeWluZyB0byBtb2RpZnkKKyAgICB0aGlzIGNvZGUuIFRoZSBhc3NlcnRpb25zIGluIHRoZSBjaGVjayByb3V0aW5lcyBzcGVsbCBvdXQgaW4gbW9yZQorICAgIGRldGFpbCB0aGUgYXNzdW1wdGlvbnMgYW5kIGludmFyaWFudHMgdW5kZXJseWluZyB0aGUgYWxnb3JpdGhtcy4KKworKi8KKworI2lmZGVmIERFQlVHCisvKiAjaW5jbHVkZSA8YXNzZXJ0Lmg+ICovCisjZGVmaW5lIGFzc2VydCh4KSAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIGFzc2VydCh4KSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qCisgIElOVEVSTkFMX1NJWkVfVCBpcyB0aGUgd29yZC1zaXplIHVzZWQgZm9yIGludGVybmFsIGJvb2trZWVwaW5nCisgIG9mIGNodW5rIHNpemVzLiBPbiBhIDY0LWJpdCBtYWNoaW5lLCB5b3UgY2FuIHJlZHVjZSBtYWxsb2MKKyAgb3ZlcmhlYWQgYnkgZGVmaW5pbmcgSU5URVJOQUxfU0laRV9UIHRvIGJlIGEgMzIgYml0IGB1bnNpZ25lZCBpbnQnCisgIGF0IHRoZSBleHBlbnNlIG9mIG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSByZXF1ZXN0cyBncmVhdGVyIHRoYW4KKyAgMl4zMS4gVGhpcyBsaW1pdGF0aW9uIGlzIGhhcmRseSBldmVyIGEgY29uY2VybjsgeW91IGFyZSBlbmNvdXJhZ2VkCisgIHRvIHNldCB0aGlzLiBIb3dldmVyLCB0aGUgZGVmYXVsdCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHNpemVfdC4KKyovCisKKyNpZm5kZWYgSU5URVJOQUxfU0laRV9UCisjZGVmaW5lIElOVEVSTkFMX1NJWkVfVCBzaXplX3QKKyNlbmRpZgorCisvKgorICBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgc2hvdWxkIGJlIHNldCBpZiBhIGNhbGwgdG8KKyAgcmVhbGxvYyB3aXRoIHplcm8gYnl0ZXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGEgY2FsbCB0byBmcmVlLgorICBTb21lIHBlb3BsZSB0aGluayBpdCBzaG91bGQuIE90aGVyd2lzZSwgc2luY2UgdGhpcyBtYWxsb2MKKyAgcmV0dXJucyBhIHVuaXF1ZSBwb2ludGVyIGZvciBtYWxsb2MoMCksIHNvIGRvZXMgcmVhbGxvYyhwLCAwKS4KKyovCisKKworLyogICAjZGVmaW5lIFJFQUxMT0NfWkVST19CWVRFU19GUkVFUyAqLworCisKKy8qCisgIFdJTjMyIGNhdXNlcyBhbiBlbXVsYXRpb24gb2Ygc2JyayB0byBiZSBjb21waWxlZCBpbgorICBtbWFwLWJhc2VkIG9wdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFdJTjMyLgorKi8KKworLyogI2RlZmluZSBXSU4zMiAqLworI2lmZGVmIFdJTjMyCisjZGVmaW5lIE1PUkVDT1JFIHdzYnJrCisjZGVmaW5lIEhBVkVfTU1BUCAwCisKKyNkZWZpbmUgTEFDS1NfVU5JU1REX0gKKyNkZWZpbmUgTEFDS1NfU1lTX1BBUkFNX0gKKworLyoKKyAgSW5jbHVkZSAnd2luZG93cy5oJyB0byBnZXQgdGhlIG5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMgZm9yIHRoZQorICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkYXRhIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzIHVzZWQgaW4gdGhlICdzYnJrJworICBlbXVsYXRpb24uCisKKyAgRGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gc28gdGhhdCBvbmx5IHRoZSBlc3NlbnRpYWwgTWljcm9zb2Z0CisgIFZpc3VhbCBDKysgaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKyovCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworCisvKgorICBIQVZFX01FTUNQWSBzaG91bGQgYmUgZGVmaW5lZCBpZiB5b3UgYXJlIG5vdCBvdGhlcndpc2UgdXNpbmcKKyAgQU5TSSBTVEQgQywgYnV0IHN0aWxsIGhhdmUgbWVtY3B5IGFuZCBtZW1zZXQgaW4geW91ciBDIGxpYnJhcnkKKyAgYW5kIHdhbnQgdG8gdXNlIHRoZW0gaW4gY2FsbG9jIGFuZCByZWFsbG9jLiBPdGhlcndpc2Ugc2ltcGxlCisgIG1hY3JvIHZlcnNpb25zIGFyZSBkZWZpbmVkIGhlcmUuCisKKyAgVVNFX01FTUNQWSBzaG91bGQgYmUgZGVmaW5lZCBhcyAxIGlmIHlvdSBhY3R1YWxseSB3YW50IHRvCisgIGhhdmUgbWVtc2V0IGFuZCBtZW1jcHkgY2FsbGVkLiBQZW9wbGUgcmVwb3J0IHRoYXQgdGhlIG1hY3JvCisgIHZlcnNpb25zIGFyZSBvZnRlbiBlbm91Z2ggZmFzdGVyIHRoYW4gbGliYyB2ZXJzaW9ucyBvbiBtYW55CisgIHN5c3RlbXMgdGhhdCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZW0uCisKKyovCisKKyNkZWZpbmUgSEFWRV9NRU1DUFkKKworI2lmbmRlZiBVU0VfTUVNQ1BZCisjaWZkZWYgSEFWRV9NRU1DUFkKKyNkZWZpbmUgVVNFX01FTUNQWSAxCisjZWxzZQorI2RlZmluZSBVU0VfTUVNQ1BZIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAoX19TVERfQyB8fCBkZWZpbmVkKEhBVkVfTUVNQ1BZKSkKKworI2lmIF9fU1REX0MKK3ZvaWQqIG1lbXNldCh2b2lkKiwgaW50LCBzaXplX3QpOwordm9pZCogbWVtY3B5KHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKyNlbHNlCisjaWZkZWYgV0lOMzIKKy8qIE9uIFdpbjMyIHBsYXRmb3JtcywgJ21lbXNldCgpJyBhbmQgJ21lbWNweSgpJyBhcmUgYWxyZWFkeSBkZWNsYXJlZCBpbiAqLworLyogJ3dpbmRvd3MuaCcgKi8KKyNlbHNlCitWb2lkX3QqIG1lbXNldCgpOworVm9pZF90KiBtZW1jcHkoKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIFVTRV9NRU1DUFkKKworLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG9ubHkgaW52b2tlZCB3aXRoICgybisxKS1tdWx0aXBsZXMgb2YKKyAgIElOVEVSTkFMX1NJWkVfVCB1bml0cywgd2l0aCBhIHBvc2l0aXZlIGludGVnZXIgbi4gVGhpcyBpcyBleHBsb2l0ZWQKKyAgIGZvciBmYXN0IGlubGluZSBleGVjdXRpb24gd2hlbiBuIGlzIHNtYWxsLiAqLworCisjZGVmaW5lIE1BTExPQ19aRVJPKGNoYXJwLCBuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCBtenN6ID0gKG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmKG16c3ogPD0gOSpzaXplb2YobXpzeikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5URVJOQUxfU0laRV9UKiBteiA9IChJTlRFUk5BTF9TSVpFX1QqKSAoY2hhcnApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYobXpzeiA+PSA1KnNpemVvZihtenN6KSkgeyAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmKG16c3ogPj0gNypzaXplb2YobXpzeikpIHsgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmKG16c3ogPj0gOSpzaXplb2YobXpzeikpIHsgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7IH19fSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXogICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIG1lbXNldCgoY2hhcnApLCAwLCBtenN6KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBNQUxMT0NfQ09QWShkZXN0LHNyYyxuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QgbWNzeiA9IChuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZihtY3N6IDw9IDkqc2l6ZW9mKG1jc3opKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbWNzcmMgPSAoSU5URVJOQUxfU0laRV9UKikgKHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbWNkc3QgPSAoSU5URVJOQUxfU0laRV9UKikgKGRlc3QpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKG1jc3ogPj0gNSpzaXplb2YobWNzeikpIHsgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZihtY3N6ID49IDcqc2l6ZW9mKG1jc3opKSB7ICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwlpZihtY3N6ID49IDkqc2l6ZW9mKG1jc3opKSB7ICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgfX19ICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0ICAgPSAqbWNzcmMgIDsgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBtZW1jcHkoZGVzdCwgc3JjLCBtY3N6KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNlbHNlIC8qICFVU0VfTUVNQ1BZICovCisKKy8qIFVzZSBEdWZmJ3MgZGV2aWNlIGZvciBnb29kIHplcm9pbmcvY29weWluZyBwZXJmb3JtYW5jZS4gKi8KKworI2RlZmluZSBNQUxMT0NfWkVSTyhjaGFycCwgbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG16cCA9IChJTlRFUk5BTF9TSVpFX1QqKShjaGFycCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsb25nIG1jdG1wID0gKG5ieXRlcykvc2l6ZW9mKElOVEVSTkFMX1NJWkVfVCksIG1jbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobWN0bXAgPCA4KSBtY24gPSAwOyBlbHNlIHsgbWNuID0gKG1jdG1wLTEpLzg7IG1jdG1wICU9IDg7IH0gICAgICAgICAgICAgXAorICBzd2l0Y2ggKG1jdG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogZm9yKDs7KSB7ICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNzogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNjogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNTogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNDogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMjogICAgICAgICAgICptenArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogICAgICAgICAgICptenArKyA9IDA7IGlmKG1jbiA8PSAwKSBicmVhazsgbWNuLS07IH0gICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE1BTExPQ19DT1BZKGRlc3Qsc3JjLG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCogbWNzcmMgPSAoSU5URVJOQUxfU0laRV9UKikgc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOVEVSTkFMX1NJWkVfVCogbWNkc3QgPSAoSU5URVJOQUxfU0laRV9UKikgZGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxvbmcgbWN0bXAgPSAobmJ5dGVzKS9zaXplb2YoSU5URVJOQUxfU0laRV9UKSwgbWNuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChtY3RtcCA8IDgpIG1jbiA9IDA7IGVsc2UgeyBtY24gPSAobWN0bXAtMSkvODsgbWN0bXAgJT0gODsgfSAgICAgICAgICAgICBcCisgIHN3aXRjaCAobWN0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAwOiBmb3IoOzspIHsgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA3OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA2OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA1OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSA0OiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAzOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiAgICAgICAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgaWYobWNuIDw9IDApIGJyZWFrOyBtY24tLTsgfSAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNlbmRpZgorCisKKy8qCisgIERlZmluZSBIQVZFX01NQVAgdG8gb3B0aW9uYWxseSBtYWtlIG1hbGxvYygpIHVzZSBtbWFwKCkgdG8KKyAgYWxsb2NhdGUgdmVyeSBsYXJnZSBibG9ja3MuICBUaGVzZSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZQorICBvcGVyYXRpbmcgc3lzdGVtIGltbWVkaWF0ZWx5IGFmdGVyIGEgZnJlZSgpLgorKi8KKworLyoqKgorI2lmbmRlZiBIQVZFX01NQVAKKyNkZWZpbmUgSEFWRV9NTUFQIDEKKyNlbmRpZgorKioqLworI3VuZGVmCUhBVkVfTU1BUAkvKiBOb3QgYXZhaWxhYmxlIGZvciBVLUJvb3QgKi8KKworLyoKKyAgRGVmaW5lIEhBVkVfTVJFTUFQIHRvIG1ha2UgcmVhbGxvYygpIHVzZSBtcmVtYXAoKSB0byByZS1hbGxvY2F0ZQorICBsYXJnZSBibG9ja3MuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHBvc3NpYmxlIG9uIExpbnV4IHdpdGgKKyAga2VybmVsIHZlcnNpb25zIG5ld2VyIHRoYW4gMS4zLjc3LgorKi8KKworLyoqKgorI2lmbmRlZiBIQVZFX01SRU1BUAorI2lmZGVmIElOVEVSTkFMX0xJTlVYX0NfTElCCisjZGVmaW5lIEhBVkVfTVJFTUFQIDEKKyNlbHNlCisjZGVmaW5lIEhBVkVfTVJFTUFQIDAKKyNlbmRpZgorI2VuZGlmCisqKiovCisjdW5kZWYJSEFWRV9NUkVNQVAJLyogTm90IGF2YWlsYWJsZSBmb3IgVS1Cb290ICovCisKKyNpZiBIQVZFX01NQVAKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmICFkZWZpbmVkKE1BUF9BTk9OWU1PVVMpICYmIGRlZmluZWQoTUFQX0FOT04pCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMgTUFQX0FOT04KKyNlbmRpZgorCisjZW5kaWYgLyogSEFWRV9NTUFQICovCisKKy8qCisgIEFjY2VzcyB0byBzeXN0ZW0gcGFnZSBzaXplLiBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlLCB0aGlzIG1hbGxvYworICBtYW5hZ2VzIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0gaW4gcGFnZS1zaXplIHVuaXRzLgorCisgIFRoZSBmb2xsb3dpbmcgbWVjaGFuaWNzIGZvciBnZXRwYWdlc2l6ZSB3ZXJlIGFkYXB0ZWQgZnJvbQorICBic2QvZ251IGdldHBhZ2VzaXplLmgKKyovCisKKyNkZWZpbmUJTEFDS1NfVU5JU1REX0gJLyogU2hvcnRjdXQgZm9yIFUtQm9vdCAqLworI2RlZmluZQltYWxsb2NfZ2V0cGFnZXNpemUJNDA5NgorCisjaWZuZGVmIExBQ0tTX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZuZGVmIG1hbGxvY19nZXRwYWdlc2l6ZQorIyAgaWZkZWYgX1NDX1BBR0VTSVpFICAgICAgICAgLyogc29tZSBTVlI0IHN5c3RlbXMgb21pdCBhbiB1bmRlcnNjb3JlICovCisjICAgIGlmbmRlZiBfU0NfUEFHRV9TSVpFCisjICAgICAgZGVmaW5lIF9TQ19QQUdFX1NJWkUgX1NDX1BBR0VTSVpFCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX1NDX1BBR0VfU0laRQorIyAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkKKyMgIGVsc2UKKyMgICAgaWYgZGVmaW5lZChCU0QpIHx8IGRlZmluZWQoREdVWCkgfHwgZGVmaW5lZChIQVZFX0dFVFBBR0VTSVpFKQorICAgICAgIGV4dGVybiBzaXplX3QgZ2V0cGFnZXNpemUoKTsKKyMgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplKCkKKyMgICAgZWxzZQorIyAgICAgIGlmZGVmIFdJTjMyCisjICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICg0MDk2KSAvKiBUQkQ6IFVzZSAnR2V0U3lzdGVtSW5mbycgaW5zdGVhZCAqLworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmbmRlZiBMQUNLU19TWVNfUEFSQU1fSAorIyAgICAgICAgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICAgICAgIGVuZGlmCisjICAgICAgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgRVhFQ19QQUdFU0laRQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpZmRlZiBOQlBHCisjICAgICAgICAgICAgaWZuZGVmIENMU0laRQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBHCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoTkJQRyAqIENMU0laRSkKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgaWZkZWYgTkJQQworIyAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBOQlBDCisjICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBQQUdFU0laRQorIyAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplICg0MDk2KSAvKiBqdXN0IGd1ZXNzICovCisjICAgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICAgIGVuZGlmCisjICAgICAgICAgIGVuZGlmCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKworLyoKKworICBUaGlzIHZlcnNpb24gb2YgbWFsbG9jIHN1cHBvcnRzIHRoZSBzdGFuZGFyZCBTVklEL1hQRyBtYWxsaW5mbworICByb3V0aW5lIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBzYW1lIGtpbmQgb2YKKyAgaW5mb3JtYXRpb24geW91IGNhbiBnZXQgZnJvbSBtYWxsb2Nfc3RhdHMuIEl0IHNob3VsZCB3b3JrIG9uCisgIGFueSBTVklEL1hQRyBjb21wbGlhbnQgc3lzdGVtIHRoYXQgaGFzIGEgL3Vzci9pbmNsdWRlL21hbGxvYy5oCisgIGRlZmluaW5nIHN0cnVjdCBtYWxsaW5mby4gKElmIHlvdSdkIGxpa2UgdG8gaW5zdGFsbCBzdWNoIGEgdGhpbmcKKyAgeW91cnNlbGYsIGN1dCBvdXQgdGhlIHByZWxpbWluYXJ5IGRlY2xhcmF0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUKKyAgYW5kIGJlbG93IGFuZCBzYXZlIHRoZW0gaW4gYSBtYWxsb2MuaCBmaWxlLiBCdXQgdGhlcmUncyBubworICBjb21wZWxsaW5nIHJlYXNvbiB0byBib3RoZXIgdG8gZG8gdGhpcy4pCisKKyAgVGhlIG1haW4gZGVjbGFyYXRpb24gbmVlZGVkIGlzIHRoZSBtYWxsaW5mbyBzdHJ1Y3QgdGhhdCBpcyByZXR1cm5lZAorICAoYnktY29weSkgYnkgbWFsbGluZm8oKS4gIFRoZSBTVklEL1hQRyBtYWxsb2luZm8gc3RydWN0IGNvbnRhaW5zIGEKKyAgYnVuY2ggb2YgZmllbGRzLCBtb3N0IG9mIHdoaWNoIGFyZSBub3QgZXZlbiBtZWFuaW5nZnVsIGluIHRoaXMKKyAgdmVyc2lvbiBvZiBtYWxsb2MuIFNvbWUgb2YgdGhlc2UgZmllbGRzIGFyZSBhcmUgaW5zdGVhZCBmaWxsZWQgYnkKKyAgbWFsbGluZm8oKSB3aXRoIG90aGVyIG51bWJlcnMgdGhhdCBtaWdodCBwb3NzaWJseSBiZSBvZiBpbnRlcmVzdC4KKworICBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IIHNob3VsZCBiZSBzZXQgaWYgeW91IGhhdmUgYQorICAvdXNyL2luY2x1ZGUvbWFsbG9jLmggZmlsZSB0aGF0IGluY2x1ZGVzIGEgZGVjbGFyYXRpb24gb2Ygc3RydWN0CisgIG1hbGxpbmZvLiAgSWYgc28sIGl0IGlzIGluY2x1ZGVkOyBlbHNlIGFuIFNWSUQyL1hQRzIgY29tcGxpYW50CisgIHZlcnNpb24gaXMgZGVjbGFyZWQgYmVsb3cuICBUaGVzZSBtdXN0IGJlIHByZWNpc2VseSB0aGUgc2FtZSBmb3IKKyAgbWFsbGluZm8oKSB0byB3b3JrLgorCisqLworCisvKiAjZGVmaW5lIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKi8KKworI2lmIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0gKKyNpbmNsdWRlICIvdXNyL2luY2x1ZGUvbWFsbG9jLmgiCisjZWxzZQorCisvKiBTVklEMi9YUEcgbWFsbGluZm8gc3RydWN0dXJlICovCisKK3N0cnVjdCBtYWxsaW5mbyB7CisgIGludCBhcmVuYTsgICAgLyogdG90YWwgc3BhY2UgYWxsb2NhdGVkIGZyb20gc3lzdGVtICovCisgIGludCBvcmRibGtzOyAgLyogbnVtYmVyIG9mIG5vbi1pbnVzZSBjaHVua3MgKi8KKyAgaW50IHNtYmxrczsgICAvKiB1bnVzZWQgLS0gYWx3YXlzIHplcm8gKi8KKyAgaW50IGhibGtzOyAgICAvKiBudW1iZXIgb2YgbW1hcHBlZCByZWdpb25zICovCisgIGludCBoYmxraGQ7ICAgLyogdG90YWwgc3BhY2UgaW4gbW1hcHBlZCByZWdpb25zICovCisgIGludCB1c21ibGtzOyAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCBmc21ibGtzOyAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCB1b3JkYmxrczsgLyogdG90YWwgYWxsb2NhdGVkIHNwYWNlICovCisgIGludCBmb3JkYmxrczsgLyogdG90YWwgbm9uLWludXNlIHNwYWNlICovCisgIGludCBrZWVwY29zdDsgLyogdG9wLW1vc3QsIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8KK307CisKKy8qIFNWSUQyL1hQRyBtYWxsb3B0IG9wdGlvbnMgKi8KKworI2RlZmluZSBNX01YRkFTVCAgMSAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNkZWZpbmUgTV9OTEJMS1MgIDIgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZGVmaW5lIE1fR1JBSU4gICAzICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2RlZmluZSBNX0tFRVAgICAgNCAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKworI2VuZGlmCisKKy8qIG1hbGxvcHQgb3B0aW9ucyB0aGF0IGFjdHVhbGx5IGRvIHNvbWV0aGluZyAqLworCisjZGVmaW5lIE1fVFJJTV9USFJFU0hPTEQgICAgLTEKKyNkZWZpbmUgTV9UT1BfUEFEICAgICAgICAgICAtMgorI2RlZmluZSBNX01NQVBfVEhSRVNIT0xEICAgIC0zCisjZGVmaW5lIE1fTU1BUF9NQVggICAgICAgICAgLTQKKworCisjaWZuZGVmIERFRkFVTFRfVFJJTV9USFJFU0hPTEQKKyNkZWZpbmUgREVGQVVMVF9UUklNX1RIUkVTSE9MRCAoMTI4ICogMTAyNCkKKyNlbmRpZgorCisvKgorICAgIE1fVFJJTV9USFJFU0hPTEQgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIHVudXNlZCB0b3AtbW9zdCBtZW1vcnkKKyAgICAgIHRvIGtlZXAgYmVmb3JlIHJlbGVhc2luZyB2aWEgbWFsbG9jX3RyaW0gaW4gZnJlZSgpLgorCisgICAgICBBdXRvbWF0aWMgdHJpbW1pbmcgaXMgbWFpbmx5IHVzZWZ1bCBpbiBsb25nLWxpdmVkIHByb2dyYW1zLgorICAgICAgQmVjYXVzZSB0cmltbWluZyB2aWEgc2JyayBjYW4gYmUgc2xvdyBvbiBzb21lIHN5c3RlbXMsIGFuZCBjYW4KKyAgICAgIHNvbWV0aW1lcyBiZSB3YXN0ZWZ1bCAoaW4gY2FzZXMgd2hlcmUgcHJvZ3JhbXMgaW1tZWRpYXRlbHkKKyAgICAgIGFmdGVyd2FyZCBhbGxvY2F0ZSBtb3JlIGxhcmdlIGNodW5rcykgdGhlIHZhbHVlIHNob3VsZCBiZSBoaWdoCisgICAgICBlbm91Z2ggc28gdGhhdCB5b3VyIG92ZXJhbGwgc3lzdGVtIHBlcmZvcm1hbmNlIHdvdWxkIGltcHJvdmUgYnkKKyAgICAgIHJlbGVhc2luZy4KKworICAgICAgVGhlIHRyaW0gdGhyZXNob2xkIGFuZCB0aGUgbW1hcCBjb250cm9sIHBhcmFtZXRlcnMgKHNlZSBiZWxvdykKKyAgICAgIGNhbiBiZSB0cmFkZWQgb2ZmIHdpdGggb25lIGFub3RoZXIuIFRyaW1taW5nIGFuZCBtbWFwcGluZyBhcmUKKyAgICAgIHR3byBkaWZmZXJlbnQgd2F5cyBvZiByZWxlYXNpbmcgdW51c2VkIG1lbW9yeSBiYWNrIHRvIHRoZQorICAgICAgc3lzdGVtLiBCZXR3ZWVuIHRoZXNlIHR3bywgaXQgaXMgb2Z0ZW4gcG9zc2libGUgdG8ga2VlcAorICAgICAgc3lzdGVtLWxldmVsIGRlbWFuZHMgb2YgYSBsb25nLWxpdmVkIHByb2dyYW0gZG93biB0byBhIGJhcmUKKyAgICAgIG1pbmltdW0uIEZvciBleGFtcGxlLCBpbiBvbmUgdGVzdCBzdWl0ZSBvZiBzZXNzaW9ucyBtZWFzdXJpbmcKKyAgICAgIHRoZSBYRjg2IFggc2VydmVyIG9uIExpbnV4LCB1c2luZyBhIHRyaW0gdGhyZXNob2xkIG9mIDEyOEsgYW5kIGEKKyAgICAgIG1tYXAgdGhyZXNob2xkIG9mIDE5MksgbGVkIHRvIG5lYXItbWluaW1hbCBsb25nIHRlcm0gcmVzb3VyY2UKKyAgICAgIGNvbnN1bXB0aW9uLgorCisgICAgICBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgbWFsbG9jIGluIGEgbG9uZy1saXZlZCBwcm9ncmFtLCBpdCBzaG91bGQKKyAgICAgIHBheSB0byBleHBlcmltZW50IHdpdGggdGhlc2UgdmFsdWVzLiAgQXMgYSByb3VnaCBndWlkZSwgeW91CisgICAgICBtaWdodCBzZXQgdG8gYSB2YWx1ZSBjbG9zZSB0byB0aGUgYXZlcmFnZSBzaXplIG9mIGEgcHJvY2VzcworICAgICAgKHByb2dyYW0pIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0uICBSZWxlYXNpbmcgdGhpcyBtdWNoIG1lbW9yeQorICAgICAgd291bGQgYWxsb3cgc3VjaCBhIHByb2Nlc3MgdG8gcnVuIGluIG1lbW9yeS4gIEdlbmVyYWxseSwgaXQncworICAgICAgd29ydGggaXQgdG8gdHVuZSBmb3IgdHJpbW1pbmcgcmF0aGVyIHRoYW0gbWVtb3J5IG1hcHBpbmcgd2hlbiBhCisgICAgICBwcm9ncmFtIHVuZGVyZ29lcyBwaGFzZXMgd2hlcmUgc2V2ZXJhbCBsYXJnZSBjaHVua3MgYXJlCisgICAgICBhbGxvY2F0ZWQgYW5kIHJlbGVhc2VkIGluIHdheXMgdGhhdCBjYW4gcmV1c2UgZWFjaCBvdGhlcidzCisgICAgICBzdG9yYWdlLCBwZXJoYXBzIG1peGVkIHdpdGggcGhhc2VzIHdoZXJlIHRoZXJlIGFyZSBubyBzdWNoCisgICAgICBjaHVua3MgYXQgYWxsLiAgQW5kIGluIHdlbGwtYmVoYXZlZCBsb25nLWxpdmVkIHByb2dyYW1zLAorICAgICAgY29udHJvbGxpbmcgcmVsZWFzZSBvZiBsYXJnZSBibG9ja3MgdmlhIHRyaW1taW5nIHZlcnN1cyBtYXBwaW5nCisgICAgICBpcyB1c3VhbGx5IGZhc3Rlci4KKworICAgICAgSG93ZXZlciwgaW4gbW9zdCBwcm9ncmFtcywgdGhlc2UgcGFyYW1ldGVycyBzZXJ2ZSBtYWlubHkgYXMKKyAgICAgIHByb3RlY3Rpb24gYWdhaW5zdCB0aGUgc3lzdGVtLWxldmVsIGVmZmVjdHMgb2YgY2FycnlpbmcgYXJvdW5kCisgICAgICBtYXNzaXZlIGFtb3VudHMgb2YgdW5uZWVkZWQgbWVtb3J5LiBTaW5jZSBmcmVxdWVudCBjYWxscyB0bworICAgICAgc2JyaywgbW1hcCwgYW5kIG11bm1hcCBvdGhlcndpc2UgZGVncmFkZSBwZXJmb3JtYW5jZSwgdGhlIGRlZmF1bHQKKyAgICAgIHBhcmFtZXRlcnMgYXJlIHNldCB0byByZWxhdGl2ZWx5IGhpZ2ggdmFsdWVzIHRoYXQgc2VydmUgb25seSBhcworICAgICAgc2FmZWd1YXJkcy4KKworICAgICAgVGhlIGRlZmF1bHQgdHJpbSB2YWx1ZSBpcyBoaWdoIGVub3VnaCB0byBjYXVzZSB0cmltbWluZyBvbmx5IGluCisgICAgICBmYWlybHkgZXh0cmVtZSAoYnkgY3VycmVudCBtZW1vcnkgY29uc3VtcHRpb24gc3RhbmRhcmRzKSBjYXNlcy4KKyAgICAgIEl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHBhZ2Ugc2l6ZSB0byBoYXZlIGFueSB1c2VmdWwgZWZmZWN0LiAgVG8KKyAgICAgIGRpc2FibGUgdHJpbW1pbmcgY29tcGxldGVseSwgeW91IGNhbiBzZXQgdG8gKHVuc2lnbmVkIGxvbmcpKC0xKTsKKworCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9UT1BfUEFECisjZGVmaW5lIERFRkFVTFRfVE9QX1BBRCAgICAgICAgKDApCisjZW5kaWYKKworLyoKKyAgICBNX1RPUF9QQUQgaXMgdGhlIGFtb3VudCBvZiBleHRyYSBgcGFkZGluZycgc3BhY2UgdG8gYWxsb2NhdGUgb3IKKyAgICAgIHJldGFpbiB3aGVuZXZlciBzYnJrIGlzIGNhbGxlZC4gSXQgaXMgdXNlZCBpbiB0d28gd2F5cyBpbnRlcm5hbGx5OgorCisgICAgICAqIFdoZW4gc2JyayBpcyBjYWxsZWQgdG8gZXh0ZW5kIHRoZSB0b3Agb2YgdGhlIGFyZW5hIHRvIHNhdGlzZnkKKwlhIG5ldyBtYWxsb2MgcmVxdWVzdCwgdGhpcyBtdWNoIHBhZGRpbmcgaXMgYWRkZWQgdG8gdGhlIHNicmsKKwlyZXF1ZXN0LgorCisgICAgICAqIFdoZW4gbWFsbG9jX3RyaW0gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBmcmVlKCksCisJaXQgaXMgdXNlZCBhcyB0aGUgYHBhZCcgYXJndW1lbnQuCisKKyAgICAgIEluIGJvdGggY2FzZXMsIHRoZSBhY3R1YWwgYW1vdW50IG9mIHBhZGRpbmcgaXMgcm91bmRlZAorICAgICAgc28gdGhhdCB0aGUgZW5kIG9mIHRoZSBhcmVuYSBpcyBhbHdheXMgYSBzeXN0ZW0gcGFnZSBib3VuZGFyeS4KKworICAgICAgVGhlIG1haW4gcmVhc29uIGZvciB1c2luZyBwYWRkaW5nIGlzIHRvIGF2b2lkIGNhbGxpbmcgc2JyayBzbworICAgICAgb2Z0ZW4uIEhhdmluZyBldmVuIGEgc21hbGwgcGFkIGdyZWF0bHkgcmVkdWNlcyB0aGUgbGlrZWxpaG9vZAorICAgICAgdGhhdCBuZWFybHkgZXZlcnkgbWFsbG9jIHJlcXVlc3QgZHVyaW5nIHByb2dyYW0gc3RhcnQtdXAgKG9yCisgICAgICBhZnRlciB0cmltbWluZykgd2lsbCBpbnZva2Ugc2Jyaywgd2hpY2ggbmVlZGxlc3NseSB3YXN0ZXMKKyAgICAgIHRpbWUuCisKKyAgICAgIEF1dG9tYXRpYyByb3VuZGluZy11cCB0byBwYWdlLXNpemUgdW5pdHMgaXMgbm9ybWFsbHkgc3VmZmljaWVudAorICAgICAgdG8gYXZvaWQgbWVhc3VyYWJsZSBvdmVyaGVhZCwgc28gdGhlIGRlZmF1bHQgaXMgMC4gIEhvd2V2ZXIsIGluCisgICAgICBzeXN0ZW1zIHdoZXJlIHNicmsgaXMgcmVsYXRpdmVseSBzbG93LCBpdCBjYW4gcGF5IHRvIGluY3JlYXNlCisgICAgICB0aGlzIHZhbHVlLCBhdCB0aGUgZXhwZW5zZSBvZiBjYXJyeWluZyBhcm91bmQgbW9yZSBtZW1vcnkgdGhhbgorICAgICAgdGhlIHByb2dyYW0gbmVlZHMuCisKKyovCisKKworI2lmbmRlZiBERUZBVUxUX01NQVBfVEhSRVNIT0xECisjZGVmaW5lIERFRkFVTFRfTU1BUF9USFJFU0hPTEQgKDEyOCAqIDEwMjQpCisjZW5kaWYKKworLyoKKworICAgIE1fTU1BUF9USFJFU0hPTEQgaXMgdGhlIHJlcXVlc3Qgc2l6ZSB0aHJlc2hvbGQgZm9yIHVzaW5nIG1tYXAoKQorICAgICAgdG8gc2VydmljZSBhIHJlcXVlc3QuIFJlcXVlc3RzIG9mIGF0IGxlYXN0IHRoaXMgc2l6ZSB0aGF0IGNhbm5vdAorICAgICAgYmUgYWxsb2NhdGVkIHVzaW5nIGFscmVhZHktZXhpc3Rpbmcgc3BhY2Ugd2lsbCBiZSBzZXJ2aWNlZCB2aWEgbW1hcC4KKyAgICAgIChJZiBlbm91Z2ggbm9ybWFsIGZyZWVkIHNwYWNlIGFscmVhZHkgZXhpc3RzIGl0IGlzIHVzZWQgaW5zdGVhZC4pCisKKyAgICAgIFVzaW5nIG1tYXAgc2VncmVnYXRlcyByZWxhdGl2ZWx5IGxhcmdlIGNodW5rcyBvZiBtZW1vcnkgc28gdGhhdAorICAgICAgdGhleSBjYW4gYmUgaW5kaXZpZHVhbGx5IG9idGFpbmVkIGFuZCByZWxlYXNlZCBmcm9tIHRoZSBob3N0CisgICAgICBzeXN0ZW0uIEEgcmVxdWVzdCBzZXJ2aWNlZCB0aHJvdWdoIG1tYXAgaXMgbmV2ZXIgcmV1c2VkIGJ5IGFueQorICAgICAgb3RoZXIgcmVxdWVzdCAoYXQgbGVhc3Qgbm90IGRpcmVjdGx5OyB0aGUgc3lzdGVtIG1heSBqdXN0IHNvCisgICAgICBoYXBwZW4gdG8gcmVtYXAgc3VjY2Vzc2l2ZSByZXF1ZXN0cyB0byB0aGUgc2FtZSBsb2NhdGlvbnMpLgorCisgICAgICBTZWdyZWdhdGluZyBzcGFjZSBpbiB0aGlzIHdheSBoYXMgdGhlIGJlbmVmaXQgdGhhdCBtbWFwcGVkIHNwYWNlCisgICAgICBjYW4gQUxXQVlTIGJlIGluZGl2aWR1YWxseSByZWxlYXNlZCBiYWNrIHRvIHRoZSBzeXN0ZW0sIHdoaWNoCisgICAgICBoZWxwcyBrZWVwIHRoZSBzeXN0ZW0gbGV2ZWwgbWVtb3J5IGRlbWFuZHMgb2YgYSBsb25nLWxpdmVkCisgICAgICBwcm9ncmFtIGxvdy4gTWFwcGVkIG1lbW9yeSBjYW4gbmV2ZXIgYmVjb21lIGBsb2NrZWQnIGJldHdlZW4KKyAgICAgIG90aGVyIGNodW5rcywgYXMgY2FuIGhhcHBlbiB3aXRoIG5vcm1hbGx5IGFsbG9jYXRlZCBjaHVua3MsIHdoaWNoCisgICAgICBtZW5hcyB0aGF0IGV2ZW4gdHJpbW1pbmcgdmlhIG1hbGxvY190cmltIHdvdWxkIG5vdCByZWxlYXNlIHRoZW0uCisKKyAgICAgIEhvd2V2ZXIsIGl0IGhhcyB0aGUgZGlzYWR2YW50YWdlcyB0aGF0OgorCisJIDEuIFRoZSBzcGFjZSBjYW5ub3QgYmUgcmVjbGFpbWVkLCBjb25zb2xpZGF0ZWQsIGFuZCB0aGVuCisJICAgIHVzZWQgdG8gc2VydmljZSBsYXRlciByZXF1ZXN0cywgYXMgaGFwcGVucyB3aXRoIG5vcm1hbCBjaHVua3MuCisJIDIuIEl0IGNhbiBsZWFkIHRvIG1vcmUgd2FzdGFnZSBiZWNhdXNlIG9mIG1tYXAgcGFnZSBhbGlnbm1lbnQKKwkgICAgcmVxdWlyZW1lbnRzCisJIDMuIEl0IGNhdXNlcyBtYWxsb2MgcGVyZm9ybWFuY2UgdG8gYmUgbW9yZSBkZXBlbmRlbnQgb24gaG9zdAorCSAgICBzeXN0ZW0gbWVtb3J5IG1hbmFnZW1lbnQgc3VwcG9ydCByb3V0aW5lcyB3aGljaCBtYXkgdmFyeSBpbgorCSAgICBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGFuZCBtYXkgaW1wb3NlIGFyYml0cmFyeQorCSAgICBsaW1pdGF0aW9ucy4gR2VuZXJhbGx5LCBzZXJ2aWNpbmcgYSByZXF1ZXN0IHZpYSBub3JtYWwKKwkgICAgbWFsbG9jIHN0ZXBzIGlzIGZhc3RlciB0aGFuIGdvaW5nIHRocm91Z2ggYSBzeXN0ZW0ncyBtbWFwLgorCisgICAgICBBbGwgdG9nZXRoZXIsIHRoZXNlIGNvbnNpZGVyYXRpb25zIHNob3VsZCBsZWFkIHlvdSB0byB1c2UgbW1hcAorICAgICAgb25seSBmb3IgcmVsYXRpdmVseSBsYXJnZSByZXF1ZXN0cy4KKworCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9NTUFQX01BWAorI2lmIEhBVkVfTU1BUAorI2RlZmluZSBERUZBVUxUX01NQVBfTUFYICAgICAgICg2NCkKKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfTU1BUF9NQVggICAgICAgKDApCisjZW5kaWYKKyNlbmRpZgorCisvKgorICAgIE1fTU1BUF9NQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHRvIHNpbXVsdGFuZW91c2x5CisgICAgICBzZXJ2aWNlIHVzaW5nIG1tYXAuIFRoaXMgcGFyYW1ldGVyIGV4aXN0cyBiZWNhdXNlOgorCisJIDEuIFNvbWUgc3lzdGVtcyBoYXZlIGEgbGltaXRlZCBudW1iZXIgb2YgaW50ZXJuYWwgdGFibGVzIGZvcgorCSAgICB1c2UgYnkgbW1hcC4KKwkgMi4gSW4gbW9zdCBzeXN0ZW1zLCBvdmVycmVsaWFuY2Ugb24gbW1hcCBjYW4gZGVncmFkZSBvdmVyYWxsCisJICAgIHBlcmZvcm1hbmNlLgorCSAzLiBJZiBhIHByb2dyYW0gYWxsb2NhdGVzIG1hbnkgbGFyZ2UgcmVnaW9ucywgaXQgaXMgcHJvYmFibHkKKwkgICAgYmV0dGVyIG9mZiB1c2luZyBub3JtYWwgc2Jyay1iYXNlZCBhbGxvY2F0aW9uIHJvdXRpbmVzIHRoYXQKKwkgICAgY2FuIHJlY2xhaW0gYW5kIHJlYWxsb2NhdGUgbm9ybWFsIGhlYXAgbWVtb3J5LiBVc2luZyBhCisJICAgIHNtYWxsIHZhbHVlIGFsbG93cyB0cmFuc2l0aW9uIGludG8gdGhpcyBtb2RlIGFmdGVyIHRoZQorCSAgICBmaXJzdCBmZXcgYWxsb2NhdGlvbnMuCisKKyAgICAgIFNldHRpbmcgdG8gMCBkaXNhYmxlcyBhbGwgdXNlIG9mIG1tYXAuICBJZiBIQVZFX01NQVAgaXMgbm90IHNldCwKKyAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDAsIGFuZCBhdHRlbXB0cyB0byBzZXQgaXQgdG8gbm9uLXplcm8gdmFsdWVzCisgICAgICBpbiBtYWxsb3B0IHdpbGwgZmFpbC4KKyovCisKKworLyoKKyAgICBVU0VfRExfUFJFRklYIHdpbGwgcHJlZml4IGFsbCBwdWJsaWMgcm91dGluZXMgd2l0aCB0aGUgc3RyaW5nICdkbCcuCisgICAgICBVc2VmdWwgdG8gcXVpY2tseSBhdm9pZCBwcm9jZWR1cmUgZGVjbGFyYXRpb24gY29uZmxpY3RzIGFuZCBsaW5rZXIKKyAgICAgIHN5bWJvbCBjb25mbGljdHMgd2l0aCBleGlzdGluZyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKworKi8KKworLyogI2RlZmluZSBVU0VfRExfUFJFRklYICovCisKKworLyoKKworICBTcGVjaWFsIGRlZmluZXMgZm9yIGxpbnV4IGxpYmMKKworICBFeGNlcHQgd2hlbiBjb21waWxlZCB1c2luZyB0aGVzZSBzcGVjaWFsIGRlZmluZXMgZm9yIExpbnV4IGxpYmMKKyAgdXNpbmcgd2VhayBhbGlhc2VzLCB0aGlzIG1hbGxvYyBpcyBOT1QgZGVzaWduZWQgdG8gd29yayBpbgorICBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gIE5vIHNlbWFwaG9yZXMgb3Igb3RoZXIgY29uY3VycmVuY3kKKyAgY29udHJvbCBhcmUgcHJvdmlkZWQgdG8gZW5zdXJlIHRoYXQgbXVsdGlwbGUgbWFsbG9jIG9yIGZyZWUgY2FsbHMKKyAgZG9uJ3QgcnVuIGF0IHRoZSBzYW1lIHRpbWUsIHdoaWNoIGNvdWxkIGJlIGRpc2FzdGVyb3VzLiBBIHNpbmdsZQorICBzZW1hcGhvcmUgY291bGQgYmUgdXNlZCBhY3Jvc3MgbWFsbG9jLCByZWFsbG9jLCBhbmQgZnJlZSAod2hpY2ggaXMKKyAgZXNzZW50aWFsbHkgdGhlIGVmZmVjdCBvZiB0aGUgbGludXggd2VhayBhbGlhcyBhcHByb2FjaCkuIEl0IHdvdWxkCisgIGJlIGhhcmQgdG8gb2J0YWluIGZpbmVyIGdyYW51bGFyaXR5LgorCisqLworCisKKyNpZmRlZiBJTlRFUk5BTF9MSU5VWF9DX0xJQgorCisjaWYgX19TVERfQworCitWb2lkX3QgKiBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdCAocHRyZGlmZl90KTsKK1ZvaWRfdCAqKCpfX21vcmVjb3JlKShwdHJkaWZmX3QpID0gX19kZWZhdWx0X21vcmVjb3JlX2luaXQ7CisKKyNlbHNlCisKK1ZvaWRfdCAqIF9fZGVmYXVsdF9tb3JlY29yZV9pbml0ICgpOworVm9pZF90ICooKl9fbW9yZWNvcmUpKCkgPSBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdDsKKworI2VuZGlmCisKKyNkZWZpbmUgTU9SRUNPUkUgKCpfX21vcmVjb3JlKQorI2RlZmluZSBNT1JFQ09SRV9GQUlMVVJFIDAKKyNkZWZpbmUgTU9SRUNPUkVfQ0xFQVJTIDEKKworI2Vsc2UgLyogSU5URVJOQUxfTElOVVhfQ19MSUIgKi8KKworI2lmIF9fU1REX0MKK2V4dGVybiBWb2lkX3QqICAgICBzYnJrKHB0cmRpZmZfdCk7CisjZWxzZQorZXh0ZXJuIFZvaWRfdCogICAgIHNicmsoKTsKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFCisjZGVmaW5lIE1PUkVDT1JFIHNicmsKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFX0ZBSUxVUkUKKyNkZWZpbmUgTU9SRUNPUkVfRkFJTFVSRSAtMQorI2VuZGlmCisKKyNpZm5kZWYgTU9SRUNPUkVfQ0xFQVJTCisjZGVmaW5lIE1PUkVDT1JFX0NMRUFSUyAxCisjZW5kaWYKKworI2VuZGlmIC8qIElOVEVSTkFMX0xJTlVYX0NfTElCICovCisKKyNpZiBkZWZpbmVkKElOVEVSTkFMX0xJTlVYX0NfTElCKSAmJiBkZWZpbmVkKF9fRUxGX18pCisKKyNkZWZpbmUgY0FMTE9jCQlfX2xpYmNfY2FsbG9jCisjZGVmaW5lIGZSRWUJCV9fbGliY19mcmVlCisjZGVmaW5lIG1BTExPYwkJX19saWJjX21hbGxvYworI2RlZmluZSBtRU1BTElHbglfX2xpYmNfbWVtYWxpZ24KKyNkZWZpbmUgckVBTExPYwkJX19saWJjX3JlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQlfX2xpYmNfdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCV9fbGliY19wdmFsbG9jCisjZGVmaW5lIG1BTExJTkZvCV9fbGliY19tYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQlfX2xpYmNfbWFsbG9wdAorCisjcHJhZ21hIHdlYWsgY2FsbG9jID0gX19saWJjX2NhbGxvYworI3ByYWdtYSB3ZWFrIGZyZWUgPSBfX2xpYmNfZnJlZQorI3ByYWdtYSB3ZWFrIGNmcmVlID0gX19saWJjX2ZyZWUKKyNwcmFnbWEgd2VhayBtYWxsb2MgPSBfX2xpYmNfbWFsbG9jCisjcHJhZ21hIHdlYWsgbWVtYWxpZ24gPSBfX2xpYmNfbWVtYWxpZ24KKyNwcmFnbWEgd2VhayByZWFsbG9jID0gX19saWJjX3JlYWxsb2MKKyNwcmFnbWEgd2VhayB2YWxsb2MgPSBfX2xpYmNfdmFsbG9jCisjcHJhZ21hIHdlYWsgcHZhbGxvYyA9IF9fbGliY19wdmFsbG9jCisjcHJhZ21hIHdlYWsgbWFsbGluZm8gPSBfX2xpYmNfbWFsbGluZm8KKyNwcmFnbWEgd2VhayBtYWxsb3B0ID0gX19saWJjX21hbGxvcHQKKworI2Vsc2UKKworI2lmZGVmIFVTRV9ETF9QUkVGSVgKKyNkZWZpbmUgY0FMTE9jCQlkbGNhbGxvYworI2RlZmluZSBmUkVlCQlkbGZyZWUKKyNkZWZpbmUgbUFMTE9jCQlkbG1hbGxvYworI2RlZmluZSBtRU1BTElHbglkbG1lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCWRscmVhbGxvYworI2RlZmluZSB2QUxMT2MJCWRsdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCWRscHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwlkbG1hbGxpbmZvCisjZGVmaW5lIG1BTExPUHQJCWRsbWFsbG9wdAorI2Vsc2UgLyogVVNFX0RMX1BSRUZJWCAqLworI2RlZmluZSBjQUxMT2MJCWNhbGxvYworI2RlZmluZSBmUkVlCQlmcmVlCisjZGVmaW5lIG1BTExPYwkJbWFsbG9jCisjZGVmaW5lIG1FTUFMSUduCW1lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCXJlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQl2YWxsb2MKKyNkZWZpbmUgcHZBTExPYwkJcHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwltYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQltYWxsb3B0CisjZW5kaWYgLyogVVNFX0RMX1BSRUZJWCAqLworCisjZW5kaWYKKworLyogUHVibGljIHJvdXRpbmVzICovCisKKyNpZiBfX1NURF9DCisKK1ZvaWRfdCogbUFMTE9jKHNpemVfdCk7Cit2b2lkICAgIGZSRWUoVm9pZF90Kik7CitWb2lkX3QqIHJFQUxMT2MoVm9pZF90Kiwgc2l6ZV90KTsKK1ZvaWRfdCogbUVNQUxJR24oc2l6ZV90LCBzaXplX3QpOworVm9pZF90KiB2QUxMT2Moc2l6ZV90KTsKK1ZvaWRfdCogcHZBTExPYyhzaXplX3QpOworVm9pZF90KiBjQUxMT2Moc2l6ZV90LCBzaXplX3QpOwordm9pZCAgICBjZnJlZShWb2lkX3QqKTsKK2ludCAgICAgbWFsbG9jX3RyaW0oc2l6ZV90KTsKK3NpemVfdCAgbWFsbG9jX3VzYWJsZV9zaXplKFZvaWRfdCopOwordm9pZCAgICBtYWxsb2Nfc3RhdHModm9pZCk7CitpbnQgICAgIG1BTExPUHQoaW50LCBpbnQpOworc3RydWN0IG1hbGxpbmZvIG1BTExJTkZvKHZvaWQpOworI2Vsc2UKK1ZvaWRfdCogbUFMTE9jKCk7Cit2b2lkICAgIGZSRWUoKTsKK1ZvaWRfdCogckVBTExPYygpOworVm9pZF90KiBtRU1BTElHbigpOworVm9pZF90KiB2QUxMT2MoKTsKK1ZvaWRfdCogcHZBTExPYygpOworVm9pZF90KiBjQUxMT2MoKTsKK3ZvaWQgICAgY2ZyZWUoKTsKK2ludCAgICAgbWFsbG9jX3RyaW0oKTsKK3NpemVfdCAgbWFsbG9jX3VzYWJsZV9zaXplKCk7Cit2b2lkICAgIG1hbGxvY19zdGF0cygpOworaW50ICAgICBtQUxMT1B0KCk7CitzdHJ1Y3QgbWFsbGluZm8gbUFMTElORm8oKTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgIC8qIGVuZCBvZiBleHRlcm4gIkMiICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbW1jLmggYi94LWxvYWRlci9pbmNsdWRlL21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmE5MDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL21tYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9NTUNfSF8KKyNkZWZpbmUgX01NQ19IXworCisjaW5jbHVkZSA8cGFydC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbW1jLmg+CisKK2ludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitpbnQgbW1jX3JlYWQodW5zaWduZWQgaW50IHNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgc2l6ZSk7CitpbnQgbW1jX3dyaXRlKHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgbG9uZyBkc3QsIGludCBzaXplKTsKK2ludCBtbWMyaW5mbyh1bnNpZ25lZCBpbnQgYWRkcik7CisKK2Jsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisjZW5kaWYgLyogX01NQ19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmggYi94LWxvYWRlci9pbmNsdWRlL25zMTY1NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyZDQwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKlRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqICAKKyAqIE5TMTY1NTAgU2VyaWFsIFBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5oKQorICogbW9kaWZpZWQgc2xpZ2h0bHkgdG8KKyAqIGhhdmUgYWRkcmVzc2VzIGFzIG9mZnNldHMgZnJvbSBDRkdfSVNBX0JBU0UKKyAqIGFkZGVkIGEgZmV3IG1vcmUgZGVmaW5pdGlvbnMKKyAqIGFkZGVkIHByb3RvdHlwZXMgZm9yIG5zMTY1NTAuYworICogcmVkdWNlZCBubyBvZiBjb20gcG9ydHMgdG8gMgorICogbW9kaWZpY2F0aW9ucyAoYykgUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiAyMDAwLgorICovCisKKyNpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gMSkKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBjaGFyIHJicjsJCS8qIDAgKi8KKwl1bnNpZ25lZCBjaGFyIGllcjsJCS8qIDEgKi8KKwl1bnNpZ25lZCBjaGFyIGZjcjsJCS8qIDIgKi8KKwl1bnNpZ25lZCBjaGFyIGxjcjsJCS8qIDMgKi8KKwl1bnNpZ25lZCBjaGFyIG1jcjsJCS8qIDQgKi8KKwl1bnNpZ25lZCBjaGFyIGxzcjsJCS8qIDUgKi8KKwl1bnNpZ25lZCBjaGFyIG1zcjsJCS8qIDYgKi8KKwl1bnNpZ25lZCBjaGFyIHNjcjsJCS8qIDcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VsaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDIpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgc2hvcnQgcmJyOwkJLyogMCAqLworCXVuc2lnbmVkIHNob3J0IGllcjsJCS8qIDEgKi8KKwl1bnNpZ25lZCBzaG9ydCBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgc2hvcnQgbGNyOwkJLyogMyAqLworCXVuc2lnbmVkIHNob3J0IG1jcjsJCS8qIDQgKi8KKwl1bnNpZ25lZCBzaG9ydCBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgc2hvcnQgbXNyOwkJLyogNiAqLworCXVuc2lnbmVkIHNob3J0IHNjcjsJCS8qIDcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VsaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDQpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgbG9uZyByYnI7CQkvKiAwICovCisJdW5zaWduZWQgbG9uZyBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgbG9uZyBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgbG9uZyBsY3I7CQkvKiAzICovCisJdW5zaWduZWQgbG9uZyBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgbG9uZyBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgbG9uZyBtc3I7CQkvKiA2ICovCisJdW5zaWduZWQgbG9uZyBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSAtNCkKK3N0cnVjdCBOUzE2NTUwIHsKKwl1bnNpZ25lZCBjaGFyIHJicjsJCS8qIDAgKi8KKwlpbnQgcGFkMToyNDsKKwl1bnNpZ25lZCBjaGFyIGllcjsJCS8qIDEgKi8KKwlpbnQgcGFkMjoyNDsKKwl1bnNpZ25lZCBjaGFyIGZjcjsJCS8qIDIgKi8KKwlpbnQgcGFkMzoyNDsKKwl1bnNpZ25lZCBjaGFyIGxjcjsJCS8qIDMgKi8KKwlpbnQgcGFkNDoyNDsKKwl1bnNpZ25lZCBjaGFyIG1jcjsJCS8qIDQgKi8KKwlpbnQgcGFkNToyNDsKKwl1bnNpZ25lZCBjaGFyIGxzcjsJCS8qIDUgKi8KKwlpbnQgcGFkNjoyNDsKKwl1bnNpZ25lZCBjaGFyIG1zcjsJCS8qIDYgKi8KKwlpbnQgcGFkNzoyNDsKKwl1bnNpZ25lZCBjaGFyIHNjcjsJCS8qIDcgKi8KKwlpbnQgcGFkODoyNDsKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQKQorCXVuc2lnbmVkIGNoYXIgbWRyMTsJCS8qIG1vZGUgc2VsZWN0IHJlc2V0IFRMMTZDNzUwKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19PTUFQMTUxMAorCWludCBwYWQ5OjI0OworCXVuc2lnbmVkIGxvbmcgcGFkWzEwXTsKKwl1bnNpZ25lZCBjaGFyIG9zY18xMm1fc2VsOworCWludCBwYWQxMDoyNDsKKyNlbmRpZgorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxzZQorI2Vycm9yICJQbGVhc2UgZGVmaW5lIE5TMTY1NTAgcmVnaXN0ZXJzIHNpemUuIgorI2VuZGlmCisKKyNkZWZpbmUgdGhyIHJicgorI2RlZmluZSBpaXIgZmNyCisjZGVmaW5lIGRsbCByYnIKKyNkZWZpbmUgZGxtIGllcgorCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwICpOUzE2NTUwX3Q7CisKKyNkZWZpbmUgRkNSX0ZJRk9fRU4gICAgIDB4MDEJCS8qIEZpZm8gZW5hYmxlICovCisjZGVmaW5lIEZDUl9SWFNSICAgICAgICAweDAyCQkvKiBSZWNlaXZlciBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIEZDUl9UWFNSICAgICAgICAweDA0CQkvKiBUcmFuc21pdHRlciBzb2Z0IHJlc2V0ICovCisKKyNkZWZpbmUgTUNSX0RUUiAgICAgICAgIDB4MDEKKyNkZWZpbmUgTUNSX1JUUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUNSX0RNQV9FTiAgICAgIDB4MDQKKyNkZWZpbmUgTUNSX1RYX0RGUiAgICAgIDB4MDgKKworI2RlZmluZSBMQ1JfV0xTX01TSwkweDAzCQkvKiBjaGFyYWN0ZXIgbGVuZ3RoIHNsZWN0IG1hc2sgKi8KKyNkZWZpbmUgTENSX1dMU181CTB4MDAJCS8qIDUgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU182CTB4MDEJCS8qIDYgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU183CTB4MDIJCS8qIDcgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU184CTB4MDMJCS8qIDggYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1NUQgkJMHgwNAkJLyogTnVtYmVyIG9mIHN0b3AgQml0cywgb2ZmID0gMSwgb24gPSAxLjUgb3IgMikgKi8KKyNkZWZpbmUgTENSX1BFTgkJMHgwOAkJLyogUGFyaXR5IGVuZWJsZSAqLworI2RlZmluZSBMQ1JfRVBTCQkweDEwCQkvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUgTENSX1NUS1AJMHgyMAkJLyogU3RpY2sgUGFyaXR5ICovCisjZGVmaW5lIExDUl9TQlJLCTB4NDAJCS8qIFNldCBCcmVhayAqLworI2RlZmluZSBMQ1JfQktTRQkweDgwCQkvKiBCYW5rIHNlbGVjdCBlbmFibGUgKi8KKworI2RlZmluZSBMU1JfRFIJCTB4MDEJCS8qIERhdGEgcmVhZHkgKi8KKyNkZWZpbmUgTFNSX09FCQkweDAyCQkvKiBPdmVycnVuICovCisjZGVmaW5lIExTUl9QRQkJMHgwNAkJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExTUl9GRQkJMHgwOAkJLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBMU1JfQkkJCTB4MTAJCS8qIEJyZWFrICovCisjZGVmaW5lIExTUl9USFJFCTB4MjAJCS8qIFhtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSAqLworI2RlZmluZSBMU1JfVEVNVAkweDQwCQkvKiBYbWl0dGVyIGVtcHR5ICovCisjZGVmaW5lIExTUl9FUlIJCTB4ODAJCS8qIEVycm9yICovCisKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKKyNkZWZpbmUgT1NDXzEyTV9TRUwJMHgwMQkJLyogc2VsZWN0cyA2LjUgKiBjdXJyZW50IGNsayBkaXYgKi8KKyNlbmRpZgorCisvKiB1c2VmdWwgZGVmYXVsdHMgZm9yIExDUiAqLworI2RlZmluZSBMQ1JfOE4xCQkweDAzCisKK3ZvaWQJTlMxNjU1MF9pbml0ICAgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcik7Cit2b2lkCU5TMTY1NTBfcHV0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQsIGNoYXIgYyk7CitjaGFyCU5TMTY1NTBfZ2V0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQpOworaW50CU5TMTY1NTBfdHN0YyAgIChOUzE2NTUwX3QgY29tX3BvcnQpOwordm9pZAlOUzE2NTUwX3JlaW5pdCAoTlMxNjU1MF90IGNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKTsKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oIGIveC1sb2FkZXIvaW5jbHVkZS9wYXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4YWEzYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX1BBUlRfSAorI2RlZmluZSBfUEFSVF9ICisjaW5jbHVkZSA8aWRlLmg+CisKK3R5cGVkZWYgc3RydWN0IGJsb2NrX2Rldl9kZXNjIHsKKwlpbnQJCWlmX3R5cGU7CS8qIHR5cGUgb2YgdGhlIGludGVyZmFjZSAqLworCWludAkgICAgICAgIGRldjsJICAJLyogZGV2aWNlIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIJcGFydF90eXBlOyAgCS8qIHBhcnRpdGlvbiB0eXBlICovCisJdW5zaWduZWQgY2hhcgl0YXJnZXQ7CQkvKiB0YXJnZXQgU0NTSSBJRCAqLworCXVuc2lnbmVkIGNoYXIJbHVuOwkJLyogdGFyZ2V0IExVTiAqLworCXVuc2lnbmVkIGNoYXIJdHlwZTsJCS8qIGRldmljZSB0eXBlICovCisJdW5zaWduZWQgY2hhcglyZW1vdmFibGU7CS8qIHJlbW92YWJsZSBkZXZpY2UgKi8KKyNpZmRlZiBDT05GSUdfTEJBNDgKKwl1bnNpZ25lZCBjaGFyCWxiYTQ4OwkJLyogZGV2aWNlIGNhbiB1c2UgNDhiaXQgYWRkciAoQVRBL0FUQVBJIHY3KSAqLworI2VuZGlmCisJbGJhaW50X3QJCWxiYTsJICAJLyogbnVtYmVyIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGxvbmcJYmxrc3o7CQkvKiBibG9jayBzaXplICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3IgWzQwKzFdOyAJLyogSURFIG1vZGVsLCBTQ1NJIFZlbmRvciAqLworCXVuc2lnbmVkIGNoYXIJcHJvZHVjdFsyMCsxXTsJLyogSURFIFNlcmlhbCBubywgU0NTSSBwcm9kdWN0ICovCisJdW5zaWduZWQgY2hhcglyZXZpc2lvbls4KzFdOwkvKiBmaXJtd2FyZSByZXZpc2lvbiAqLworCXVuc2lnbmVkIGxvbmcJKCpibG9ja19yZWFkKShpbnQgZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICAgICAgbGJhaW50X3QgYmxrY250LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcik7Cit9YmxvY2tfZGV2X2Rlc2NfdDsKKworLyogSW50ZXJmYWNlIHR5cGVzOiAqLworI2RlZmluZSBJRl9UWVBFX1VOS05PV04JCTAKKyNkZWZpbmUgSUZfVFlQRV9JREUJCTEKKyNkZWZpbmUgSUZfVFlQRV9TQ1NJCQkyCisjZGVmaW5lIElGX1RZUEVfQVRBUEkJCTMKKyNkZWZpbmUgSUZfVFlQRV9VU0IJCTQKKyNkZWZpbmUgSUZfVFlQRV9ET0MJCTUKKyNkZWZpbmUgSUZfVFlQRV9NTUMJCTYKKworLyogUGFydCB0eXBlcyAqLworI2RlZmluZSBQQVJUX1RZUEVfVU5LTk9XTgkweDAwCisjZGVmaW5lIFBBUlRfVFlQRV9NQUMJCTB4MDEKKyNkZWZpbmUgUEFSVF9UWVBFX0RPUwkJMHgwMgorI2RlZmluZSBQQVJUX1RZUEVfSVNPCQkweDAzCisjZGVmaW5lIFBBUlRfVFlQRV9BTUlHQQkJMHgwNAorCisvKgorICogVHlwZSBzdHJpbmcgZm9yIFUtQm9vdCBib290YWJsZSBwYXJ0aXRpb25zCisgKi8KKyNkZWZpbmUgQk9PVF9QQVJUX1RZUEUJIlUtQm9vdCIJLyogcHJpbWFyeSBib290IHBhcnRpdGlvbiB0eXBlCSovCisjZGVmaW5lIEJPT1RfUEFSVF9DT01QCSJQUENCb290IgkvKiBQUENCb290IGNvbXBhdGliaWxpdHkgdHlwZQkqLworCisvKiBkZXZpY2UgdHlwZXMgKi8KKyNkZWZpbmUgREVWX1RZUEVfVU5LTk9XTgkweGZmCS8qIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgREVWX1RZUEVfSEFSRERJU0sJMHgwMAkvKiBoYXJkZGlzayAqLworI2RlZmluZSBERVZfVFlQRV9UQVBFCQkweDAxCS8qIFRhcGUgKi8KKyNkZWZpbmUgREVWX1RZUEVfQ0RST00JCTB4MDUJLyogQ0QtUk9NICovCisjZGVmaW5lIERFVl9UWVBFX09QRElTSwkJMHgwNwkvKiBvcHRpY2FsIGRpc2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGlza19wYXJ0aXRpb24geworCXVsb25nCXN0YXJ0OwkJLyogIyBvZiBmaXJzdCBibG9jayBpbiBwYXJ0aXRpb24JKi8KKwl1bG9uZwlzaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBwYXJ0aXRpb24JKi8KKwl1bG9uZwlibGtzejsJCS8qIGJsb2NrIHNpemUgaW4gYnl0ZXMJCQkqLworCXVjaGFyCW5hbWVbMzJdOwkvKiBwYXJ0aXRpb24gbmFtZQkJCSovCisJdWNoYXIJdHlwZVszMl07CS8qIHN0cmluZyB0eXBlIGRlc2NyaXB0aW9uCQkqLworfSBkaXNrX3BhcnRpdGlvbl90OworCisvKiBkaXNrL3BhcnQuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK3ZvaWQgIGluaXRfcGFydCAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOwordm9pZCBkZXZfcHJpbnQoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworCisKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X21hYy5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfbWFjIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfbWFjIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfZG9zLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fZG9zIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9kb3MgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9kb3MgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKy8qIGRpc2svcGFydF9pc28uYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19pc28gKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X2lzbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X2lzbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfYW1pZ2EuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19hbWlnYSAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9hbWlnYSAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfUEFSVF9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3J0Yy5oIGIveC1sb2FkZXIvaW5jbHVkZS9ydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9ydGMuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBHZW5lcmljIFJUQyBpbnRlcmZhY2UuCisgKi8KKyNpZm5kZWYgX1JUQ19IXworI2RlZmluZSBfUlRDX0hfCisKKy8qIGJjZDwtPmJpbiBmdW5jdGlvbnMgYXJlIG5lZWRlZCBieSBhbG1vc3QgYWxsIHRoZSBSVEMgZHJpdmVycywgbGV0J3MgaW5jbHVkZQorICogaXQgdGhlcmUgaW5zdGVhZCBvZiBpbiBldmV5IHNpbmdsZSBkcml2ZXIgKi8KKworI2luY2x1ZGUgPGJjZC5oPgorCisvKgorICogVGhlIHN0cnVjdCB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIHRoZSBnZW5lcmljIGludGVyZmFjZSBjb2RlIHRvCisgKiB0aGUgaGFyZHdhcmUgZGVwZW5kZW5kIGxvdy1sZXZlbCBjb2RlIGFuZGUgdmljZSB2ZXJzYS4gSWRlbnRpY2FsCisgKiB0byBzdHJ1Y3QgcnRjX3RpbWUgdXNlZCBieSB0aGUgTGludXgga2VybmVsLgorICoKKyAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgc21hbGwgYnV0IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIHRvIHRoZQorICogY29tbW9uICJzdHJ1Y3QgdGltZSI6CisgKgorICoJCXN0cnVjdCB0aW1lOgkJc3RydWN0IHJ0Y190aW1lOgorICogdG1fbW9uCTAgLi4uIDExCQkxIC4uLiAxMgorICogdG1feWVhcgl5ZWFycyBzaW5jZSAxOTAwCXllYXJzIHNpbmNlIDAKKyAqLworCitzdHJ1Y3QgcnRjX3RpbWUgeworCWludCB0bV9zZWM7CisJaW50IHRtX21pbjsKKwlpbnQgdG1faG91cjsKKwlpbnQgdG1fbWRheTsKKwlpbnQgdG1fbW9uOworCWludCB0bV95ZWFyOworCWludCB0bV93ZGF5OworCWludCB0bV95ZGF5OworCWludCB0bV9pc2RzdDsKK307CisKK3ZvaWQgR3JlZ29yaWFuRGF5IChzdHJ1Y3QgcnRjX3RpbWUgKik7Cit2b2lkIHRvX3RtIChpbnQsIHN0cnVjdCBydGNfdGltZSAqKTsKK3Vuc2lnbmVkIGxvbmcgbWt0aW1lICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKworI2VuZGlmCS8qIF9SVENfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvdGltZXN0YW1wLmggYi94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjRjZjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBFeHRyZW1lIEVuZ2luZWVyaW5nIFNvbHV0aW9ucywgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX19USU1FU1RBTVBfSF9fCisjZGVmaW5lCV9fVElNRVNUQU1QX0hfXworCisjaWZuZGVmIERPX0RFUFNfT05MWQorI2luY2x1ZGUgInRpbWVzdGFtcF9hdXRvZ2VuZXJhdGVkLmgiCisjZW5kaWYKKworI2VuZGlmCS8qIF9fVElNRVNUQU1QX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmggYi94LWxvYWRlci9pbmNsdWRlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQyOTFhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX19WRVJTSU9OX0hfXworI2RlZmluZQlfX1ZFUlNJT05fSF9fCisKKyNpZm5kZWYgRE9fREVQU19PTkxZCisjaW5jbHVkZSAidmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgiCisjZW5kaWYKKworI2VuZGlmCS8qIF9fVkVSU0lPTl9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaCBiL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU0MTZkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS93YXRjaGRvZy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEVyaWsgVGhlaXNlbiwgIFdhdmUgNyBPcHRpY3MsIGV0aGVpc2VuQG1pbmRzcHJpbmcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBXYXRjaGRvZyBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KKyAqLworI2lmbmRlZiBfV0FUQ0hET0dfSF8KKyNkZWZpbmUgX1dBVENIRE9HX0hfCisKKyNpZiBkZWZpbmVkKENPTkZJR19IV19XQVRDSERPRykgJiYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisjICBlcnJvciAiQ29uZmlndXJhdGlvbiBlcnJvcjogQ09ORklHX0hXX1dBVENIRE9HIGFuZCBDT05GSUdfV0FUQ0hET0cgY2FuJ3QgYmUgdXNlZCB0b2dldGhlci4iCisjZW5kaWYKKworLyoKKyAqIEhhcmR3YXJlIHdhdGNoZG9nCisgKi8KKyNpZmRlZiBDT05GSUdfSFdfV0FUQ0hET0cKKwkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgYmwgaHdfd2F0Y2hkb2dfcmVzZXQKKwkjZWxzZQorCQlleHRlcm4gdm9pZCBod193YXRjaGRvZ19yZXNldCh2b2lkKTsKKworCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGh3X3dhdGNoZG9nX3Jlc2V0CisJI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2Vsc2UKKwkvKgorCSAqIE1heWJlIGEgc29mdHdhcmUgd2F0Y2hkb2c/CisJICovCisJI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCQkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGJsIHdhdGNoZG9nX3Jlc2V0CisJCSNlbHNlCisJCQlleHRlcm4gdm9pZCB3YXRjaGRvZ19yZXNldCh2b2lkKTsKKworCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCB3YXRjaGRvZ19yZXNldAorCQkjZW5kaWYKKwkjZWxzZQorCQkvKgorCQkgKiBObyBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZy4KKwkJICovCisJCSNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgLypYWFggRE9fTk9UX0RFTF9USElTX0NPTU1FTlQqLworCQkjZWxzZQorCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCgpIHt9CisJCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwkjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICYmICFfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfSFdfV0FUQ0hET0cgKi8KKworI2VuZGlmIC8qIF9XQVRDSERPR19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmggYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC9jcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDkxY2FiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogTWFydmVsbCBTZW1pY29uZHVjdG9yIDx3d3cubWFydmVsbC5jb20+CisgKiBXcml0dGVuLWJ5OiBQcmFmdWxsYSBXYWRhc2thciA8cHJhZnVsbGFAbWFydmVsbC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCisgKiBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX1hMT0FEX0NSQ19ICisjZGVmaW5lIF9YTE9BRF9DUkNfSAorCisvKiBsaWIvY3JjMzIuYyAqLwordWludDMyX3QgY3JjMzIgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOwordWludDMyX3QgY3JjMzJfd2QgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQsIHVpbnQpOwordWludDMyX3QgY3JjMzJfbm9fY29tcCAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCk7CisKKyNlbmRpZiAvKiBfWExPQURfQ1JDX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaCBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI3MDgxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvemxpYi5oCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB6bGliLmggYW5kIHpjb25mLmggZnJvbSB0aGUgemxpYi0xLjIuMworICogZGlzdHJpYnV0aW9uIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIsIHdpdGggc29tZSBhZGRpdGlvbnMKKyAqIGJ5IFBhdWwgTWFja2VycmFzIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmcgRGVmbGF0ZSBjb21wcmVzc2lvbiBhbmQKKyAqIGRlY29tcHJlc3Npb24gZm9yIFBQUCBwYWNrZXRzLgorICovCisKKyAvKgorICAqID09RklMRVZFUlNJT04gOTYwMTIyPT0KKyAgKgorICAqIFRoaXMgbWFya2VyIGlzIHVzZWQgYnkgdGhlIExpbnV4IGluc3RhbGxhdGlvbiBzY3JpcHQgdG8gZGV0ZXJtaW5lCisgICogd2hldGhlciBhbiB1cC10by1kYXRlIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICAqLworCisvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAgdmVyc2lvbiAxLjIuMywgSnVseSAxOHRoLCAyMDA1CisKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworCisgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0CisgICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCisqLworCisjaWZuZGVmIFpMSUJfSAorI2RlZmluZSBaTElCX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjMiCisjZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTIzMAorCisvKiAjaW5jbHVkZSAiemNvbmYuaCIgKi8gICAgICAgIC8qIGluY2x1ZGVkIGRpcmVjdGx5IGhlcmUgKi8KKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEJlZ2luIG9mIG5ldyB6Y29uZi5oICovCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKi8KKyNpZmRlZiBaX1BSRUZJWAorIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorCisjICBkZWZpbmUgYWxsb2NfZnVuYyAgICAgICAgICAgIHpfYWxsb2NfZnVuYworIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGNoYXJmICAgICAgICAgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyMgIGRlZmluZSB6X29mZl90IG9mZl90CisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyMgIGlmZGVmIEZBUgorIyAgICB1bmRlZiBGQVIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisvKiBFbmQgb2YgbmV3IHpjb25mLmggKi8KKworLyoKKyAgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBzdXBwb3J0cyBvbmx5IG9uZSBjb21wcmVzc2lvbiBtZXRob2QKKyAgKGRlZmxhdGlvbikgYnV0IG90aGVyIGFsZ29yaXRobXMgd2lsbCBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIHN0cmVhbSBpbnRlcmZhY2UuCisKKyAgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UKKyAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQorICByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCisgIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAorICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCisKKyAgICAgVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluIGd6aXAgKC5neikgZm9ybWF0CisgIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbyB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQKKyAgd2l0aCAiZ3oiLiAgVGhlIGd6aXAgZm9ybWF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB6bGliIGZvcm1hdC4gIGd6aXAgaXMgYQorICBnemlwIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KKworICAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKKyAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQorICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KKyAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCisKKyAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcworICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCisgIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisqLworCit0eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqY2JfZnVuYykgICAgT0YoKEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisJQnl0ZWYJKm5leHRfaW47IC8qIG5leHQgaW5wdXQgYnl0ZSAqLworCXVJbnQJYXZhaWxfaW47IC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dF9pbiAqLworCXVMb25nCXRvdGFsX2luOyAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCUJ5dGVmCSpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisJdUludAlhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisJdUxvbmcJdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisJY2hhcgkqbXNnOwkvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKwlzdHJ1Y3QJaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCisJYWxsb2NfZnVuYwl6YWxsb2M7CS8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCisJZnJlZV9mdW5jCXpmcmVlOwkvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICovCisJdm9pZHBmCW9wYXF1ZTsJLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLworCWludAlkYXRhX3R5cGU7CS8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZToKKwkJCQkJYmluYXJ5IG9yIHRleHQgKi8KKwljYl9mdW5jCW91dGNiOwkvKiBjYWxsZWQgcmVndWxhcmx5IGp1c3QgYmVmb3JlIGJsb2NrcyBvZiBvdXRwdXQgKi8KKwl1TG9uZwlhZGxlcjsJLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKwl1TG9uZwlyZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCisgIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KKyovCit0eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7CisJaW50CXRleHQ7CS8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi8KKwl1TG9uZwl0aW1lOwkvKiBtb2RpZmljYXRpb24gdGltZSAqLworCWludAl4ZmxhZ3M7CS8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCisJaW50CW9zOwkvKiBvcGVyYXRpbmcgc3lzdGVtICovCisJQnl0ZWYJKmV4dHJhOwkvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCisJdUludAlleHRyYV9sZW47IC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLworCXVJbnQJZXh0cmFfbWF4OyAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworCUJ5dGVmCSpuYW1lOyAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCisJdUludAluYW1lX21heDsgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworCUJ5dGVmCSpjb21tZW50OyAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLworCXVJbnQJY29tbV9tYXg7IC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlpbnQJaGNyYzsgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KKwlpbnQJZG9uZTsgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKKwkJCXdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KK30gZ3pfaGVhZGVyOworCit0eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLworI2RlZmluZSBaX05PX0ZMVVNIICAgICAgMAorI2RlZmluZSBaX1BBUlRJQUxfRkxVU0ggMSAvKiB3aWxsIGJlIHJlbW92ZWQsIHVzZSBaX1NZTkNfRkxVU0ggaW5zdGVhZCAqLworI2RlZmluZSBaX1NZTkNfRkxVU0ggICAgMgorI2RlZmluZSBaX0ZVTExfRkxVU0ggICAgMworI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAorI2RlZmluZSBaX0JMT0NLICAgICAgICAgNQorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfT0sgICAgICAgICAgICAwCisjZGVmaW5lIFpfU1RSRUFNX0VORCAgICAxCisjZGVmaW5lIFpfTkVFRF9ESUNUICAgICAyCisjZGVmaW5lIFpfRVJSTk8gICAgICAgICgtMSkKKyNkZWZpbmUgWl9TVFJFQU1fRVJST1IgKC0yKQorI2RlZmluZSBaX0RBVEFfRVJST1IgICAoLTMpCisjZGVmaW5lIFpfTUVNX0VSUk9SICAgICgtNCkKKyNkZWZpbmUgWl9CVUZfRVJST1IgICAgKC01KQorI2RlZmluZSBaX1ZFUlNJT05fRVJST1IgKC02KQorLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCisgKiB2YWx1ZXMgYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgorICovCisKKyNkZWZpbmUgWl9OT19DT01QUkVTU0lPTiAgICAgICAgIDAKKyNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKKyNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKworI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQorI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgorI2RlZmluZSBaX1JMRSAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaX0ZJWEVEICAgICAgICAgICAgICAgNAorI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAorLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfQklOQVJZICAgMAorI2RlZmluZSBaX1RFWFQgICAgIDEKKyNkZWZpbmUgWl9BU0NJSSAgICBaX1RFWFQgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi4yIGFuZCBlYXJsaWVyICovCisjZGVmaW5lIFpfVU5LTk9XTiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLworCisjZGVmaW5lIFpfREVGTEFURUQgICA4CisvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLworCisjZGVmaW5lIFpfTlVMTCAgMCAgLyogZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLCBjb25zdCBjaGFyICp2ZXJzaW9uLAorCQkJCWludCBzdHJlYW1fc2l6ZSkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3NpbmcKKyAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlCisgICAgaXMgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdworICAgIGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCisgIG1vcmUgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuCisgIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKKyAgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAorICBjYWxsIG9mIGluZmxhdGUoKS4gSWYgaW5mbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0CisgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKKyAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsCisgIFpfRklOSVNILCBvciBaX0JMT0NLLiBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCisgIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwgaW5mbGF0ZSgpCisgIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdCBnZXRzIHRvCisgIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKKyAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCisgIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKKyAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgorICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQorICBsZXNzIHRoYW4gZWlnaHQuCisKKyAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgorICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAorICAoYSBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvCisgIFpfRklOSVNILiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZworICBvdXRwdXQgaXMgZmx1c2hlZDsgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCisgIGJ5IHRoZSBjb21wcmVzc29yIGZvciB0aGlzIHB1cnBvc2UuKSBUaGUgbmV4dCBvcGVyYXRpb24gb24gdGhpcyBzdHJlYW0gbXVzdAorICBiZSBpbmZsYXRlRW5kIHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gc3RhdGUuIFRoZSB1c2Ugb2YgWl9GSU5JU0gKKyAgaXMgbmV2ZXIgcmVxdWlyZWQsIGJ1dCBjYW4gYmUgdXNlZCB0byBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoCisgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgorCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKKyAgYmVjYXVzZSBaX0JMT0NLIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgd2lsbCBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gIEFueSBpbmZvcm1hdGlvbgorICBjb250YWluZWQgaW4gdGhlIGd6aXAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0CisgIGluZm9ybWF0aW9uIHNob3VsZCBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvcgorICBpbmZsYXRlQmFjaygpIGFuZCBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQKKyAgdHJhaWxlci4KKworICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKKyAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdCBjaGVjaworICB2YWx1ZSksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlCisgIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCisgIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90IGZhdGFsLCBhbmQKKyAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dCBzcGFjZSB0bworICBjb250aW51ZSBkZWNvbXByZXNzaW5nLiBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbgorICBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbCByZWNvdmVyeQorICBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlCisgICBiYXNpYyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lCisgICBkZWZhdWx0IG9wdGlvbnMgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsCisgICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKKyAgIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgaWYgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KKyovCisKK1pFWFRFUk4gIHVJbnQgWkVYUE9SVCBjcmMzMiAgT0YoKHVJbnQgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwKKyAgIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcworICAgcGVyZm9ybWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBjcmMgPSBjcmMzMihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKSk7CisjZGVmaW5lIGluZmxhdGVJbml0KHN0cm0pIFwKKwlpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSBcCisJaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisjaWYgIWRlZmluZWQoWlVUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKwlzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogWkxJQl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvTWFrZWZpbGUgYi94LWxvYWRlci9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwMzQ0MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChBUkNIKS5hCisKK1NPQkpTCSs9IF9hc2hsZGkzLm8KK1NPQkpTCSs9IF9kaXZzaTMubworU09CSlMJKz0gX2xzaHJkaTMubworU09CSlMJKz0gX21vZHNpMy5vCitTT0JKUwkrPSBfdWRpdnNpMy5vCitTT0JKUwkrPSBfdW1vZHNpMy5vCisKK0NPQkpTLXkgKz0gY3JjMzIubworQ09CSlMteSArPSBjdHlwZS5vCitDT0JKUy15ICs9IGRpc3BsYXlfb3B0aW9ucy5vCitDT0JKUy15CSs9IGRpdjAubworQ09CSlMteQkrPSBib2FyZC5vCitDT0JKUy15ICs9IHN0cmluZy5vCitDT0JKUy15CSs9IGVjYy5vCitDT0JKUy15CSs9IHByaW50Zi5vCitDT0JKUy15CSs9IG9tYXBfYmNoX2RlY29kZXIubworQ09CSlMteQkrPSBvbWFwX2JjaC5vCisKK0NPQkpTCTo9ICQoQ09CSlMteSkKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19hc2hsZGkzLlMgYi94LWxvYWRlci9saWIvX2FzaGxkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzRkZGMyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19hc2hsZGkzLlMKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCitCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKworI2lmZGVmIF9fQVJNRUJfXworI2RlZmluZSBhbCByMQorI2RlZmluZSBhaCByMAorI2Vsc2UKKyNkZWZpbmUgYWwgcjAKKyNkZWZpbmUgYWggcjEKKyNlbmRpZgorCisuZ2xvYmwgX19hc2hsZGkzCisuZ2xvYmwJX19hZWFiaV9sbHNsCitfX2FzaGxkaTM6CitfX2FlYWJpX2xsc2w6CisKKwlzdWJzCXIzLCByMiwgIzMyCisJcnNiCWlwLCByMiwgIzMyCisJbW92bWkJYWgsIGFoLCBsc2wgcjIKKwltb3ZwbAlhaCwgYWwsIGxzbCByMworCW9ycm1pCWFoLCBhaCwgYWwsIGxzciBpcAorCW1vdglhbCwgYWwsIGxzbCByMgorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fZGl2c2kzLlMgYi94LWxvYWRlci9saWIvX2RpdnNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmFkYjIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX2RpdnNpMy5TCkBAIC0wLDAgKzEsMTQyIEBACisKKy5tYWNybyBBUk1fRElWX0JPRFkgZGl2aWRlbmQsIGRpdmlzb3IsIHJlc3VsdCwgY3VyYml0CisKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNQorCisJY2x6CVxjdXJiaXQsIFxkaXZpc29yCisJY2x6CVxyZXN1bHQsIFxkaXZpZGVuZAorCXN1YglccmVzdWx0LCBcY3VyYml0LCBccmVzdWx0CisJbW92CVxjdXJiaXQsICMxCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNsIFxyZXN1bHQKKwltb3YJXGN1cmJpdCwgXGN1cmJpdCwgbHNsIFxyZXN1bHQKKwltb3YJXHJlc3VsdCwgIzAKKworI2Vsc2UKKworCUAgSW5pdGlhbGx5IHNoaWZ0IHRoZSBkaXZpc29yIGxlZnQgMyBiaXRzIGlmIHBvc3NpYmxlLAorCUAgc2V0IGN1cmJpdCBhY2NvcmRpbmdseS4gIFRoaXMgYWxsb3dzIGZvciBjdXJiaXQgdG8gYmUgbG9jYXRlZAorCUAgYXQgdGhlIGxlZnQgZW5kIG9mIGVhY2ggNCBiaXQgbmliYmxlcyBpbiB0aGUgZGl2aXNpb24gbG9vcAorCUAgdG8gc2F2ZSBvbmUgbG9vcCBpbiBtb3N0IGNhc2VzLgorCXRzdAlcZGl2aXNvciwgIzB4ZTAwMDAwMDAKKwltb3ZlcQlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMworCW1vdmVxCVxjdXJiaXQsICM4CisJbW92bmUJXGN1cmJpdCwgIzEKKworCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisxOgljbXAJXGRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICM0CisJbW92bG8JXGN1cmJpdCwgXGN1cmJpdCwgbHNsICM0CisJYmxvCTFiCisKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKzE6CWNtcAlcZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzEKKwltb3ZsbwlcY3VyYml0LCBcY3VyYml0LCBsc2wgIzEKKwlibG8JMWIKKworCW1vdglccmVzdWx0LCAjMAorCisjZW5kaWYKKworCUAgRGl2aXNpb24gbG9vcAorMToJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdAorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMxCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzEKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMQorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMyCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzIKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMzCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzMKKwlvcnJocwlccmVzdWx0LCAgIFxyZXN1bHQsICAgXGN1cmJpdCwgIGxzciAjMworCWNtcAlcZGl2aWRlbmQsICMwCQkJQCBFYXJseSB0ZXJtaW5hdGlvbj8KKwltb3ZuZXMJXGN1cmJpdCwgICBcY3VyYml0LCAgbHNyICM0CUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJXGRpdmlzb3IsICBcZGl2aXNvciwgbHNyICM0CisJYm5lCTFiCisKKy5lbmRtCisKKy5tYWNybyBBUk1fRElWMl9PUkRFUiBkaXZpc29yLCBvcmRlcgorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcb3JkZXIsIFxkaXZpc29yCisJcnNiCVxvcmRlciwgXG9yZGVyLCAjMzEKKworI2Vsc2UKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDE2KQorCW1vdmhzCVxkaXZpc29yLCBcZGl2aXNvciwgbHNyICMxNgorCW1vdmhzCVxvcmRlciwgIzE2CisJbW92bG8JXG9yZGVyLCAjMAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgOCkKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjOAorCWFkZGhzCVxvcmRlciwgXG9yZGVyLCAjOAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgNCkKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjNAorCWFkZGhzCVxvcmRlciwgXG9yZGVyLCAjNAorCisJY21wCVxkaXZpc29yLCAjKDEgPDwgMikKKwlhZGRoaQlcb3JkZXIsIFxvcmRlciwgIzMKKwlhZGRscwlcb3JkZXIsIFxvcmRlciwgXGRpdmlzb3IsIGxzciAjMQorCisjZW5kaWYKKworLmVuZG0KKworCS5hbGlnbgk1CisuZ2xvYmwgX19kaXZzaTMKKy5nbG9ibCBfX2FlYWJpX2lkaXYKK19fZGl2c2kzOgorX19hZWFiaV9pZGl2OgorCWNtcAlyMSwgIzAKKwllb3IJaXAsIHIwLCByMQkJCUAgc2F2ZSB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0LgorCWJlcQlMZGl2MAorCXJzYm1pCXIxLCByMSwgIzAJCQlAIGxvb3BzIGJlbG93IHVzZSB1bnNpZ25lZC4KKwlzdWJzCXIyLCByMSwgIzEJCQlAIGRpdmlzaW9uIGJ5IDEgb3IgLTEgPworCWJlcQkxMGYKKwltb3ZzCXIzLCByMAorCXJzYm1pCXIzLCByMCwgIzAJCQlAIHBvc2l0aXZlIGRpdmlkZW5kIHZhbHVlCisJY21wCXIzLCByMQorCWJscwkxMWYKKwl0c3QJcjEsIHIyCQkJCUAgZGl2aXNvciBpcyBwb3dlciBvZiAyID8KKwliZXEJMTJmCisKKwlBUk1fRElWX0JPRFkgcjMsIHIxLCByMCwgcjIKKworCWNtcAlpcCwgIzAKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisxMDoJdGVxCWlwLCByMAkJCQlAIHNhbWUgc2lnbiA/CisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworMTE6CW1vdmxvCXIwLCAjMAorCW1vdmVxCXIwLCBpcCwgYXNyICMzMQorCW9ycmVxCXIwLCByMCwgIzEKKwltb3YJcGMsIGxyCisKKzEyOglBUk1fRElWMl9PUkRFUiByMSwgcjIKKworCWNtcAlpcCwgIzAKKwltb3YJcjAsIHIzLCBsc3IgcjIKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCitMZGl2MDoKKworCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCV9fZGl2MAorCW1vdglyMCwgIzAJCQlAIEFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlLgorCWxkcglwYywgW3NwXSwgIzQKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TIGIveC1sb2FkZXIvbGliL19sc2hyZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmYTc5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgYWwgcjEKKyNkZWZpbmUgYWggcjAKKyNlbHNlCisjZGVmaW5lIGFsIHIwCisjZGVmaW5lIGFoIHIxCisjZW5kaWYKKworLmdsb2JsIF9fbHNocmRpMworLmdsb2JsIF9fYWVhYmlfbGxzcgorX19sc2hyZGkzOgorX19hZWFiaV9sbHNyOgorCisJc3VicwlyMywgcjIsICMzMgorCXJzYglpcCwgcjIsICMzMgorCW1vdm1pCWFsLCBhbCwgbHNyIHIyCisJbW92cGwJYWwsIGFoLCBsc3IgcjMKKwlvcnJtaQlhbCwgYWwsIGFoLCBsc2wgaXAKKwltb3YJYWgsIGFoLCBsc3IgcjIKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX21vZHNpMy5TIGIveC1sb2FkZXIvbGliL19tb2RzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzljNTg0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19tb2RzaTMuUwpAQCAtMCwwICsxLDk5IEBACisKKy5tYWNybyBBUk1fTU9EX0JPRFkgZGl2aWRlbmQsIGRpdmlzb3IsIG9yZGVyLCBzcGFyZQorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcb3JkZXIsIFxkaXZpc29yCisJY2x6CVxzcGFyZSwgXGRpdmlkZW5kCisJc3ViCVxvcmRlciwgXG9yZGVyLCBcc3BhcmUKKwltb3YJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgXG9yZGVyCisKKyNlbHNlCisKKwltb3YJXG9yZGVyLCAjMAorCisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKzE6CWNtcAlcZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzQKKwlhZGRsbwlcb3JkZXIsIFxvcmRlciwgIzQKKwlibG8JMWIKKworCUAgRm9yIHZlcnkgYmlnIGRpdmlzb3JzLCB3ZSBtdXN0IHNoaWZ0IGl0IGEgYml0IGF0IGEgdGltZSwgb3IKKwlAIHdlIHdpbGwgYmUgaW4gZGFuZ2VyIG9mIG92ZXJmbG93aW5nLgorMToJY21wCVxkaXZpc29yLCAjMHg4MDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjMQorCWFkZGxvCVxvcmRlciwgXG9yZGVyLCAjMQorCWJsbwkxYgorCisjZW5kaWYKKworCUAgUGVyZm9ybSBhbGwgbmVlZGVkIHN1YnN0cmFjdGlvbnMgdG8ga2VlcCBvbmx5IHRoZSByZW1pbmRlci4KKwlAIERvIGNvbXBhcmlzb25zIGluIGJhdGNoIG9mIDQgZmlyc3QuCisJc3Vicwlcb3JkZXIsIFxvcmRlciwgIzMJCUAgeWVzLCAzIGlzIGludGVuZGVkIGhlcmUKKwlibHQJMmYKKworMToJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMQorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMxCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzIKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMzCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzMKKwljbXAJXGRpdmlkZW5kLCAjMQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjNAorCXN1Ymdlcwlcb3JkZXIsIFxvcmRlciwgIzQKKwliZ2UJMWIKKworCXRzdAlcb3JkZXIsICMzCisJdGVxbmUJXGRpdmlkZW5kLCAjMAorCWJlcQk1ZgorCisJQCBFaXRoZXIgMSwgMiBvciAzIGNvbXBhcmlzb24vc3Vic3RyYWN0aW9ucyBhcmUgbGVmdC4KKzI6CWNtbglcb3JkZXIsICMyCisJYmx0CTRmCisJYmVxCTNmCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorMzoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKwltb3YJXGRpdmlzb3IsICBcZGl2aXNvciwgIGxzciAjMQorNDoJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IKKzU6CisuZW5kbQorCisJLmFsaWduCTUKKy5nbG9ibCBfX21vZHNpMworX19tb2RzaTM6CisJY21wCXIxLCAjMAorCWJlcQlMZGl2MAorCXJzYm1pCXIxLCByMSwgIzAJCQlAIGxvb3BzIGJlbG93IHVzZSB1bnNpZ25lZC4KKwltb3ZzCWlwLCByMAkJCQlAIHByZXNlcnZlIHNpZ24gb2YgZGl2aWRlbmQKKwlyc2JtaQlyMCwgcjAsICMwCQkJQCBpZiBuZWdhdGl2ZSBtYWtlIHBvc2l0aXZlCisJc3VicwlyMiwgcjEsICMxCQkJQCBjb21wYXJlIGRpdmlzb3Igd2l0aCAxCisJY21wbmUJcjAsIHIxCQkJCUAgY29tcGFyZSBkaXZpZGVuZCB3aXRoIGRpdmlzb3IKKwltb3ZlcQlyMCwgIzAKKwl0c3RoaQlyMSwgcjIJCQkJQCBzZWUgaWYgZGl2aXNvciBpcyBwb3dlciBvZiAyCisJYW5kZXEJcjAsIHIwLCByMgorCWJscwkxMGYKKworCUFSTV9NT0RfQk9EWSByMCwgcjEsIHIyLCByMworCisxMDoJY21wCWlwLCAjMAorCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKworTGRpdjA6CisKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAlfX2RpdjAKKwltb3YJcjAsICMwCQkJQCBBYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZS4KKwlsZHIJcGMsIFtzcF0sICM0CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX3VkaXZzaTMuUyBiL3gtbG9hZGVyL2xpYi9fdWRpdnNpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGNkNDgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX3VkaXZzaTMuUwpAQCAtMCwwICsxLDc3IEBACisvKiAjIDEgImxpYmdjYzEuUyIgKi8KK0AgbGliZ2NjMSByb3V0aW5lcyBmb3IgQVJNIGNwdS4KK0AgRGl2aXNpb24gcm91dGluZXMsIHdyaXR0ZW4gYnkgUmljaGFyZCBFYXJuc2hhdywgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKK2RpdmlkZW5kCS5yZXEJcjAKK2Rpdmlzb3IJCS5yZXEJcjEKK3Jlc3VsdAkJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCisvKiBpcAkJLnJlcQlyMTIJKi8KKy8qIHNwCQkucmVxCXIxMwkqLworLyogbHIJCS5yZXEJcjE0CSovCisvKiBwYwkJLnJlcQlyMTUJKi8KKwkudGV4dAorCS5nbG9ibAkgX191ZGl2c2kzCisJLnR5cGUgIF9fdWRpdnNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24JMAorIF9fdWRpdnNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCW1vdglyZXN1bHQsICMwCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJYmNjCUxnb3RfcmVzdWx0CitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMsIGFuZCBub3RlIHdoaWNoIGJpdHMKKwlAIGFyZSBkb25lIGluIHRoZSByZXN1bHQuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkgc3VidHJhY3QKKwlAIHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBidXQgdGhlIHJlc3VsdCB3aWxsIGJlIG9rLCBzaW5jZSB0aGUKKwlAICJiaXQiIHdpbGwgaGF2ZSBiZWVuIHNoaWZ0ZWQgb3V0IGF0IHRoZSBib3R0b20uCisJY21wCWRpdmlkZW5kLCBkaXZpc29yCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMyCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMworCWNtcAlkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwljdXJiaXQsIGN1cmJpdCwgbHNyICM0CQlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCWRpdmlzb3IsIGRpdmlzb3IsIGxzciAjNAorCWJuZQlMb29wMworTGdvdF9yZXN1bHQ6CisJbW92CXIwLCByZXN1bHQKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdWRpdnNpMyAgICAgICAsIC4gLSAgX191ZGl2c2kzCisvKiAjIDIzNSAibGliZ2NjMS5TIiAqLworLyogIyAzMjAgImxpYmdjYzEuUyIgKi8KKy8qICMgNDIxICJsaWJnY2MxLlMiICovCisvKiAjIDQzMyAibGliZ2NjMS5TIiAqLworLyogIyA0NTYgImxpYmdjYzEuUyIgKi8KKy8qICMgNTAwICJsaWJnY2MxLlMiICovCisvKiAjIDU4MCAibGliZ2NjMS5TIiAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL191bW9kc2kzLlMgYi94LWxvYWRlci9saWIvX3Vtb2RzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFlYmU4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL191bW9kc2kzLlMKQEAgLTAsMCArMSw4OCBAQAorLyogIyAxICJsaWJnY2MxLlMiICovCitAIGxpYmdjYzEgcm91dGluZXMgZm9yIEFSTSBjcHUuCitAIERpdmlzaW9uIHJvdXRpbmVzLCB3cml0dGVuIGJ5IFJpY2hhcmQgRWFybnNoYXcsIChyZWFybnNoYUBhcm1sdGQuY28udWspCisvKiAjIDE0NSAibGliZ2NjMS5TIiAqLworZGl2aWRlbmQJLnJlcQlyMAorZGl2aXNvcgkJLnJlcQlyMQorb3ZlcmRvbmUJLnJlcQlyMgorY3VyYml0CQkucmVxCXIzCisvKiBpcAkJLnJlcQlyMTIJKi8KKy8qIHNwCQkucmVxCXIxMwkqLworLyogbHIJCS5yZXEJcjE0CSovCisvKiBwYwkJLnJlcQlyMTUJKi8KKwkudGV4dAorCS5nbG9ibAkgX191bW9kc2kzCisJLnR5cGUgIF9fdW1vZHNpMyAgICAgICAsZnVuY3Rpb24KKwkuYWxpZ24gMAorIF9fdW1vZHNpMyAgICAgIDoKKwljbXAJZGl2aXNvciwgIzAKKwliZXEJTGRpdjAKKwltb3YJY3VyYml0LCAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCW1vdmNjICAJcGMsIGxyCitMb29wMToKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorCWNtcAlkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGNjCWRpdmlzb3IsIGRpdmlkZW5kCisJbW92Y2MJZGl2aXNvciwgZGl2aXNvciwgbHNsICM0CisJbW92Y2MJY3VyYml0LCBjdXJiaXQsIGxzbCAjNAorCWJjYwlMb29wMQorTGJpZ251bToKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKwljbXAJZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjMQorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzEKKwliY2MJTGJpZ251bQorTG9vcDM6CisJQCBUZXN0IGZvciBwb3NzaWJsZSBzdWJ0cmFjdGlvbnMuICBPbiB0aGUgZmluYWwgcGFzcywgdGhpcyBtYXkKKwlAIHN1YnRyYWN0IHRvbyBtdWNoIGZyb20gdGhlIGRpdmlkZW5kLCBzbyBrZWVwIHRyYWNrIG9mIHdoaWNoCisJQCBzdWJ0cmFjdGlvbnMgYXJlIGRvbmUsIHdlIGNhbiBmaXggdGhlbSB1cCBhZnRlcndhcmRzLi4uCisJbW92CW92ZXJkb25lLCAjMAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvcgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzIKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMworCW1vdglpcCwgY3VyYml0CisJY21wCWRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCWN1cmJpdCwgY3VyYml0LCBsc3IgIzQJCUAgTm8sIGFueSBtb3JlIGJpdHMgdG8gZG8/CisJbW92bmUJZGl2aXNvciwgZGl2aXNvciwgbHNyICM0CisJYm5lCUxvb3AzCisJQCBBbnkgc3VidHJhY3Rpb25zIHRoYXQgd2Ugc2hvdWxkIG5vdCBoYXZlIGRvbmUgd2lsbCBiZSByZWNvcmRlZCBpbgorCUAgdGhlIHRvcCB0aHJlZSBiaXRzIG9mICJvdmVyZG9uZSIuICBFeGFjdGx5IHdoaWNoIHdlcmUgbm90IG5lZWRlZAorCUAgYXJlIGdvdmVybmVkIGJ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0LCBzdG9yZWQgaW4gaXAuCisJQCBJZiB3ZSB0ZXJtaW5hdGVkIGVhcmx5LCBiZWNhdXNlIGRpdmlkZW5kIGJlY2FtZSB6ZXJvLAorCUAgdGhlbiBub25lIG9mIHRoZSBiZWxvdyB3aWxsIG1hdGNoLCBzaW5jZSB0aGUgYml0IGluIGlwIHdpbGwgbm90IGJlCisJQCBpbiB0aGUgYm90dG9tIG5pYmJsZS4KKwlhbmRzCW92ZXJkb25lLCBvdmVyZG9uZSwgIzB4ZTAwMDAwMDAKKwltb3ZlcSAgCXBjLCBscgkJCQlAIE5vIGZpeHVwcyBuZWVkZWQKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzMKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMgorCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMxCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzEKKwltb3YgCXBjLCBscgorTGRpdjA6CisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJIF9fZGl2MCAgICAgICAoUExUKQorCW1vdglyMCwgIzAJCQlAIGFib3V0IGFzIHdyb25nIGFzIGl0IGNvdWxkIGJlCisJbGRtaWEJc3AhLCB7cGN9CisJLnNpemUgIF9fdW1vZHNpMyAgICAgICAsIC4gLSAgX191bW9kc2kzCisvKiAjIDMyMCAibGliZ2NjMS5TIiAqLworLyogIyA0MjEgImxpYmdjYzEuUyIgKi8KKy8qICMgNDMzICJsaWJnY2MxLlMiICovCisvKiAjIDQ1NiAibGliZ2NjMS5TIiAqLworLyogIyA1MDAgImxpYmdjYzEuUyIgKi8KKy8qICMgNTgwICJsaWJnY2MxLlMiICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvYm9hcmQuYyBiL3gtbG9hZGVyL2xpYi9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTM1ODQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvYm9hcmQuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIEppYW4gWmhhbmcsIFRleGFzIEluc3RydW1lbnRzLCBqemhhbmdAdGkuY29tLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGJvb3RtLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8bW1jLmg+CisjaW5jbHVkZSA8dGltZXN0YW1wLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKgorICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zCisgKi8KKyNpZm5kZWYgQ09ORklHX0lERU5UX1NUUklORworI2RlZmluZSBDT05GSUdfSURFTlRfU1RSSU5HICIiCisjZW5kaWYKKworLyogVHlwZSBEZWZpbml0aW9uICovCisKK3R5cGVkZWYgaW50IChpbml0X2ZuY190KSh2b2lkKTsKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqLworZXh0ZXJuIGludCBtaXNjX2luaXRfciAodm9pZCk7CitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKK2V4dGVybiBpbnQgZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCk7CisKKy8qCisgKiBHbG9iYWwgVmFyaWFibGVzCisgKi8KK2NvbnN0IGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9CisJWF9MT0FERVJfVkVSU0lPTiIgKCIgWF9MT0FERVJfREFURSAiIC0gIiBYX0xPQURFUl9USU1FICIpIkNPTkZJR19JREVOVF9TVFJJTkc7CisKK2luaXRfZm5jX3QgKmluaXRfc2VxdWVuY2VbXSA9IHsKKwljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KKwlib2FyZF9pbml0LAkJLyogYmFzaWMgYm9hcmQgZGVwZW5kZW50IHNldHVwICovCisjaWZkZWYgQ0ZHX1BSSU5URgorIAlzZXJpYWxfaW5pdCwJCS8qIHNlcmlhbCBjb21tdW5pY2F0aW9ucyBzZXR1cCAqLworCWRpc3BsYXlfb3B0aW9ucywKKyNlbmRpZgorICAJbmFuZF9pbml0LAkJLyogYm9hcmQgc3BlY2lmaWMgbmFuZCBpbml0ICovCisgIAlOVUxMLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbG9hZF9wYXJhbXMoY29uc3QgdWludDhfdCAqYnVmZmVyLCBjb25zdCBpbnQgKmluZGV4LCBpbnQgY291bnQpCit7CisJaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGluZGV4ID09IE5VTEwgfHwgY291bnQgPT0gMCB8fCAqaW5kZXggPCBCT09UTV9JTkRFWF9TVEFSVCB8fCAqaW5kZXggPj0gY291bnQpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJcmV0dXJuIChCT09UTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZiAoZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQgKENGR19NTUNfTkFORCkpICYmIGRlZmluZWQoQ0ZHX0NNRF9GQVQpCisvKgorICogIGludCBmYXRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSB0aGUgZmlyc3QgaW5pdGlhbGl6ZWQKKyAqICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBkZXZpY2UsIG9uZSBvZiBvbmUgb3IgbW9yZSBkZXNpZ25hdGVkCisgKiAgICBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIGZyb20gdGhlIGEgRkFUIGZpbGUgc3lzdGVtIG9uCisgKiAgICB0aGUgZmlyc3QgcGFydGl0aW9uIG9mIGEgTWFzdGVyIEJvb3QgUmVjb3JkIHZvbHVtZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBmaWxlIHRvIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZmlsZSB0bworICogICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IGZhdF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19CT09URklMRSkKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsgQ09ORklHX0JPT1RGSUxFIH07CisjZWxpZiBkZWZpbmVkKENPTkZJR19CT09URklMRV9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IENPTkZJR19CT09URklMRV9MSVNUOworI2Vsc2UKKwljb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JPT1RGSUxFKSAqLworCWNvbnN0IGNoYXIgKiBmaWxlID0gTlVMTDsKKwljb25zdCBjaGFyICogZmFpbHVyZSA9IE5VTEw7CisJY29uc3QgaW50IGNvdW50ID0gQVJSQVlfU0laRShmaWxlcyk7CisJY29uc3QgaW50IGRldmljZSA9IDA7CisJY29uc3QgaW50IHBhcnRpdGlvbiA9IDE7CisJY29uc3QgaW50IG1heHNpemUgPSAwOworCWNvbnN0IGludCB2ZXJib3NlID0gMTsKKwlsb25nIHNpemUgPSAwOworCWJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwlpZiAoIWNoZWNrX2xvYWRfcGFyYW1zKGJ1ZmZlciwgaW5kZXgsIGNvdW50KSkgeworCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlmaWxlID0gZmlsZXNbKCppbmRleCkrK107CisKKwlpZiAoKmluZGV4ID49IGNvdW50KSB7CisJCSppbmRleCA9IEJPT1RNX0lOREVYX1NUT1A7CisJfQorCisJc3RhdHVzID0gbW1jX2luaXQodmVyYm9zZSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZmFpbHVyZSA9ICJNTUMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldihkZXZpY2UpOworCisgICAgaWYgKGRldl9kZXNjID09IE5VTEwpIHsKKwkJZmFpbHVyZSA9ICJDb3VsZCBub3QgYWNjZXNzIE1NQyBkZXZpY2VcbiI7CisJCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCBwYXJ0aXRpb24pOworCisJc2l6ZSA9IGZpbGVfZmF0X3JlYWQoZmlsZSwgYnVmZmVyLCBtYXhzaXplKTsKKworCWlmIChzaXplID09IC0xKSB7CisJCXByaW50ZigiQ291bGQgbm90IHJlYWQgZmlsZSBcIiVzXCJcbiIsIGZpbGUpOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpbnRmKCJcbiVsZCBieXRlcyByZWFkXG4iLCBzaXplKTsKKworCXByaW50ZigiTG9hZGluZyBmcm9tIE1NQyVkLCBmaWxlIFwiJXNcIlxuIiwgZGV2aWNlLCBmaWxlKTsKKworCXJldHVybiAoQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworCisgZmFpbDoKKwlpZiAoZmFpbHVyZSAhPSBOVUxMKSB7CisJCXB1dHMoZmFpbHVyZSk7CisJfQorCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisjZW5kaWYgLyogKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKSAqLworCisvKgorICogIGludCBibG9ja19sb2FkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gcmVhZCBmcm9tIGEgYmxvY2sgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyICAgICAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICBpbmRleCAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICAgICAgbG9hZC4KKyAqICAgIGNvdW50ICAgICAgLSBUaGUgdG90YWwgbnVtYmVyIG9mIGV4dGVudHMuCisgKiAgICBleHRlbnRzICAgIC0gVGhlIGFycmF5IG9mIGJvb3QgZmlsZSBleHRlbnRzIHRvIGF0dGVtcHQgdG8gbG9hZC4KKyAqICAgIGRldmljZSAgICAgLSBBIHBvaW50ZXIgdG8gYSBDIHN0cmluZyBkZXNjcmliaW5nIHRoZSBibG9jayBkZXZpY2UgCisgKiAgICAgICAgICAgICAgICAgYmVpbmcgbG9hZGVkIGZyb20uCisgKiAgICByZWFkICAgICAgIC0gQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Utc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgcmVhZCB0aGUgYmxvY2tzIHRvIGxvYWQuCisgKiAgICBibG9ja19zaXplIC0gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGV2aWNlJ3MgZnVuZGFtZW50YWwgcmVhZAorICogICAgICAgICAgICAgICAgIGJsb2NrIHNpemUuCisgKiAgICAKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyICAgICAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggICAgICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYmxvY2tfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgsIGludCBjb3VudCwgY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10sIGNvbnN0IGNoYXIgKmRldmljZSwgaW50ICgqcmVhZCkodW5zaWduZWQgY2hhciAqLCB1bG9uZyksIHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSkKK3sKKwljb25zdCBib290X2V4dGVudF90ICpleHRlbnQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlpbnQgcmVhZF9zdGF0dXM7CisKKwlpZiAoIWNoZWNrX2xvYWRfcGFyYW1zKGJ1ZmZlciwgaW5kZXgsIGNvdW50KSkgeworCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlleHRlbnQgPSAmZXh0ZW50c1soKmluZGV4KSsrXTsKKworCWlmICgqaW5kZXggPj0gY291bnQpIHsKKwkJKmluZGV4ID0gQk9PVE1fSU5ERVhfU1RPUDsKKwl9CisKKwllbmQgPSBleHRlbnQtPnN0YXJ0ICsgZXh0ZW50LT5zaXplICsgMTsKKworCWZvciAoYWRkcmVzcyA9IGV4dGVudC0+c3RhcnQ7IGFkZHJlc3MgPCBlbmQ7IGFkZHJlc3MgKz0gYmxvY2tfc2l6ZSkgeworCQlyZWFkX3N0YXR1cyA9IHJlYWQoYnVmZmVyLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAKKwkJLyogSWYgc3VjY2Vzc2Z1bCwgbW92ZSB0aGUgZGF0YSBwb2ludGVyLiAgSWYgRUNDIGZhaWxzLAorCQkgKiByZXBvcnQgZmFpbHVyZSB0byBjYWxsZXIuICBJZiBza2lwcGluZyBiYWQgYmxvY2ssCisJCSAqIGp1c3QgY29udGludWUgbG9vcGluZyB3aXRob3V0IG1vdmluZyB0aGUgZGF0YSBwb2ludGVyLgorCQkgKi8KKwkJaWYgKHJlYWRfc3RhdHVzID09IE5BTkRfUkVBRF9TVUNDRVNTKQorCQl7CisJCQlidWZmZXIgKz0gYmxvY2tfc2l6ZTsKKwkJfQorCQllbHNlIGlmIChyZWFkX3N0YXR1cyA9PSBOQU5EX1JFQURfRUNDX0ZBSUxVUkUpCisJCXsKKwkJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJcHJpbnRmKCJMb2FkaW5nIGZyb20gJXMsIG9mZnNldCAlIzA4bHhcbiIsIGRldmljZSwgZXh0ZW50LT5zdGFydCk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKy8qCisgKiAgaW50IG9uZW5hbmRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIE9uZU5BTkQgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICBsb2FkLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBvbmVuYW5kX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KQoreworI2lmIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfT05FTkFORF9CT09URVhURU5UX0xJU1QpICYmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0gQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVF9MSVNUOworI2Vsc2UKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVCkgKi8KKworCXJldHVybiBibG9ja19sb2FkKGJ1ZmZlciwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBBUlJBWV9TSVpFKGV4dGVudHMpLAorCQkJCQkgIGV4dGVudHMsCisJCQkJCSAgIk9uZU5BTkQiLAorCQkJCQkgIG9uZW5hbmRfcmVhZF9ibG9jaywKKwkJCQkJICBPTkVOQU5EX0JMT0NLX1NJWkUpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkKKy8qCisgKiAgaW50IG5hbmRfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIE5BTkQgZGV2aWNlIG9uZSBvZiBvbmUgb3IKKyAqICAgIG1vcmUgZGVzaWduYXRlZCBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXJzIChTUEwpIHNwZWNpZmllZCBieSB0aGUKKyAqICAgIGFycmF5IG9mIGJsb2NrIGV4dGVudHMuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiBib290IGV4dGVudCB0byBhdHRlbXB0IHRvCisgKiAgICAgICAgICAgICBsb2FkLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIG5leHQgYm9vdCBleHRlbnQgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBuYW5kX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4KQoreworI2lmIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVCkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgQ09ORklHX05BTkRfQk9PVEVYVEVOVCB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTkFORF9CT09URVhURU5UX0xJU1QpICYmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdID0gQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUOworI2Vsc2UKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IHsgTlVMTCB9OworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVCkgKi8KKworCXJldHVybiBibG9ja19sb2FkKGJ1ZmZlciwKKwkJCQkJICBpbmRleCwKKwkJCQkJICBBUlJBWV9TSVpFKGV4dGVudHMpLAorCQkJCQkgIGV4dGVudHMsCisJCQkJCSAgIk5BTkQiLAorCQkJCQkgIG5hbmRfcmVhZF9ibG9jaywKKwkJCQkJICBOQU5EX0JMT0NLX1NJWkUpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkgKi8KKworLyoKKyAqICB2b2lkIGRvX2FybV9ib290KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gYm9vdCB0aGUgc3lzdGVtIGZyb20gdGhlIHNwZWNpZmllZAorICogICAgYm9vdCBkZXZpY2UgYWZ0ZXIgY29weWluZyB0aGUgc2Vjb25kYXJ5LXByb2dyYW0gbG9hZGVyIGludG8KKyAqICAgIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGJ1ZmZlci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICBsb2FkZXIuCisgKiAgICB0eXBlICAgLSBUaGUgYm9vdCBkZXZpY2UgdG8gYm9vdCBmcm9tLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBidWZmZXIgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQgZG9fYXJtX2Jvb3QodWludDhfdCAqYnVmZmVyLCB1MzIgdHlwZSkKK3sKKwlpbnQgaW5kZXggPSBCT09UTV9JTkRFWF9TVEFSVDsKKyAJaW50IHN0YXR1cyA9IEJPT1RNX1NUQVRVU19GQUlMVVJFOworCWRldmljZV9sb2FkIGxvYWRfaW1hZ2UgPSBOVUxMOworCisJLyogRGV0ZXJtaW5lLCBiYXNlZCBvbiB0aGUgYm9vdCBzZXR0aW5nLCB0aGUgc291cmNlIHdlIGFyZSBnb2luZworCSAqIHRvIGF0dGVtcHQgdG8gYm9vdCBmcm9tLgorCSAqLworCisJc3dpdGNoICh0eXBlKSB7CisKKyNpZiAoKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKSkKKwljYXNlIE1NQ19OQU5EOgorCWNhc2UgTU1DX09ORU5BTkQ6CisJCWxvYWRfaW1hZ2UgPSBmYXRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKwljYXNlIEdQTUNfT05FTkFORDoKKwkJbG9hZF9pbWFnZSA9IG9uZW5hbmRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfTkFORCkKKwljYXNlIEdQTUNfTkFORDoKKwkJbG9hZF9pbWFnZSA9IG5hbmRfbG9hZDsKKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKworCX0KKworCS8qIEF0dGVtcHQgdG8gbG9hZCBhbmQgYm9vdCBhbnkgY29uZmlndXJlZCBpbWFnZXMgdW50aWwgd2UKKwkgKiBzdWNjZXNzZnVsbHkgYm9vdCBvciB1bnRpbCB3ZSd2ZSBleGhhdXN0ZWQgYWxsIHBvc3NpYmxlIGltYWdlcy4KKwkgKi8KKworCWRvIHsKKwkJc3RhdHVzID0gbG9hZF9pbWFnZShidWZmZXIsICZpbmRleCk7CisKKwkJaWYgKGJvb3RtX2xvYWRfc3VjY2Vzc2Z1bChzdGF0dXMpKSB7CisJCQlzdGF0dXMgPSBib290bShidWZmZXIpOworCQl9CisKKwl9IHdoaWxlIChib290bV9sb2FkX2NvbnRpbnVlKHN0YXR1cywgaW5kZXgpKTsKK2ZhaWw6CisJcmV0dXJuOworfQorCit2b2lkIHN0YXJ0X2FybWJvb3QgKHZvaWQpCit7CisJY29uc3QgdTMyKiBkZXZpY2VzX2xpc3QgPSBOVUxMOworCWludCBkZXZJZHg7CisJaW50IGJvb3RfZGV2aWNlc19jb3VudCA9IGdldF9ib290X2RldmljZXNfbGlzdCgmZGV2aWNlc19saXN0KTsKKwljb25zdCBjaGFyICogYm9vdF9uYW1lID0gTlVMTDsKKwlpbml0X2ZuY190ICoqaW5pdF9mbmNfcHRyOworCXVpbnQ4X3QgKmJ1ZmZlciA9ICh1aW50OF90ICopQ0ZHX0xPQURBRERSOworCisgICAJZm9yIChpbml0X2ZuY19wdHIgPSBpbml0X3NlcXVlbmNlOyAqaW5pdF9mbmNfcHRyOyArK2luaXRfZm5jX3B0cikgeworCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkgeworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJbWlzY19pbml0X3IoKTsKKworCWZvciggZGV2SWR4ID0gMDsgZGV2SWR4IDwgYm9vdF9kZXZpY2VzX2NvdW50OyBkZXZJZHgrKyApCisJeworCQl1MzIgYm9vdF9kZXYgPSBkZXZpY2VzX2xpc3RbZGV2SWR4XTsKKwkJc3dpdGNoIChib290X2RldikgeworCisJCWNhc2UgTU1DX05BTkQ6CisJCWNhc2UgTU1DX09ORU5BTkQ6CisJCQlib290X25hbWUgPSAiTU1DIjsKKwkJCWJyZWFrOworCisJCWNhc2UgR1BNQ19PTkVOQU5EOgorCQkJYm9vdF9uYW1lID0gIk9uZU5BTkQiOworCQkJYnJlYWs7CisKKwkJY2FzZSBHUE1DX05BTkQ6CisJCQlib290X25hbWUgPSAiTkFORCI7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUEVSSVBIRVJBTDoKKwkJCWJvb3RfbmFtZSA9ICIiOworCQkJcHJpbnRmKCJUcnlpbmcgbG9hZCBmcm9tIFVTQlxuIik7CisJCQlkb191c2IoKTsgIC8qIGNoZWNrIGZvciB1c2IgZG93bmxvYWQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYm9vdF9uYW1lID0gIjx1bmtub3duPiI7CisJCQlicmVhazsKKworCQl9CisKKwkJZGVidWcoIlRyeWluZyBYLUxvYWRlciBvbiAlc1xuIiwgYm9vdF9uYW1lKTsKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCQlkb19hcm1fYm9vdChidWZmZXIsIGJvb3RfZGV2KTsKKwl9CisKKwkvKiBJZiBmb3Igc29tZSByZWFzb24gaXQgZG9lcywgd2UgaGF2ZSBvbmx5IG9uZSBjaG9pY2UsIGhhbmcuICovCisJcHV0cygiSW1hZ2VzIGV4aGF1c3RlZFxuIik7CitmYWlsOgorCWhhbmcoKTsKK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCS8qIGNhbGwgYm9hcmQgc3BlY2lmaWMgaGFuZyBmdW5jdGlvbiAqLworCWJvYXJkX2hhbmcoKTsKKworCS8qIGlmIGJvYXJkX2hhbmcoKSByZXR1cm5zLCBoYW5nZSBoZXJlICovCisJcHV0cygiWC1Mb2FkZXIgaGFuZ3NcbiIpOworCisJZm9yICg7Oyk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvYm9vdG0uYyBiL3gtbG9hZGVyL2xpYi9ib290bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDEzMjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvYm9vdG0uYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBFcmlrIE1vdXcgKEouQS5LLk1vdXdAaXRzLnR1ZGVsZnQubmwpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcJIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjaW5jbHVkZSA8dS1ib290L3psaWIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCitzdGF0aWMgdm9pZCBzZXR1cF9zdGFydF90YWcgKGJkX3QgKmJkKTsKKworIyBpZmRlZiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKK3N0YXRpYyB2b2lkIHNldHVwX21lbW9yeV90YWdzIChiZF90ICpiZCk7CisjIGVuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9jb21tYW5kbGluZV90YWcgKGJkX3QgKmJkLCBjaGFyICpjb21tYW5kbGluZSk7CisKKyMgaWZkZWYgQ09ORklHX0lOSVRSRF9UQUcKK3N0YXRpYyB2b2lkIHNldHVwX2luaXRyZF90YWcgKGJkX3QgKmJkLCB1bG9uZyBpbml0cmRfc3RhcnQsCisJCQkgICAgICB1bG9uZyBpbml0cmRfZW5kKTsKKyMgZW5kaWYKK3N0YXRpYyB2b2lkIHNldHVwX2VuZF90YWcgKGJkX3QgKmJkKTsKKworc3RhdGljIHN0cnVjdCB0YWcgKnBhcmFtczsKKyNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgfHwgQ09ORklHX0NNRExJTkVfVEFHIHx8IENPTkZJR19JTklUUkRfVEFHICovCisKK2ludCBkb19ib290bV9saW51eChpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzKQoreworCWJkX3QJKmJkID0gZ2QtPmJkOworCWNoYXIJKnM7CisJaW50CW1hY2hpZCA9IGJkLT5iaV9hcmNoX251bWJlcjsKKwl2b2lkCSgqdGhlS2VybmVsKShpbnQgemVybywgaW50IGFyY2gsIHVpbnQgcGFyYW1zKTsKKworI2lmZGVmIENPTkZJR19DTURMSU5FX1RBRworCWNoYXIgKmNvbW1hbmRsaW5lID0gZ2V0ZW52ICgiYm9vdGFyZ3MiKTsKKyNlbmRpZgorCisJaWYgKChmbGFnICE9IDApICYmIChmbGFnICE9IEJPT1RNX1NUQVRFX09TX0dPKSkKKwkJcmV0dXJuIDE7CisKKwl0aGVLZXJuZWwgPSAodm9pZCAoKikoaW50LCBpbnQsIHVpbnQpKWltYWdlcy0+ZXA7CisKKwlzID0gZ2V0ZW52ICgibWFjaGlkIik7CisJaWYgKHMpIHsKKwkJbWFjaGlkID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKKwkJcHJpbnRmICgiVXNpbmcgbWFjaGlkIDB4JXggZnJvbSBlbnZpcm9ubWVudFxuIiwgbWFjaGlkKTsKKwl9CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKKworCWRlYnVnICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKKwkgICAgICAgKHVsb25nKSB0aGVLZXJuZWwpOworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCisJc2V0dXBfc3RhcnRfdGFnIChiZCk7CisjaWZkZWYgQ09ORklHX1NFUklBTF9UQUcKKwlzZXR1cF9zZXJpYWxfdGFnICgmcGFyYW1zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SRVZJU0lPTl9UQUcKKwlzZXR1cF9yZXZpc2lvbl90YWcgKCZwYXJhbXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisJc2V0dXBfbWVtb3J5X3RhZ3MgKGJkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DTURMSU5FX1RBRworCXNldHVwX2NvbW1hbmRsaW5lX3RhZyAoYmQsIGNvbW1hbmRsaW5lKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JTklUUkRfVEFHCisJaWYgKGltYWdlcy0+cmRfc3RhcnQgJiYgaW1hZ2VzLT5yZF9lbmQpCisJCXNldHVwX2luaXRyZF90YWcgKGJkLCBpbWFnZXMtPnJkX3N0YXJ0LCBpbWFnZXMtPnJkX2VuZCk7CisjZW5kaWYKKwlzZXR1cF9lbmRfdGFnIChiZCk7CisjZW5kaWYKKworCS8qIHdlIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgaXMgaW4gcGxhY2UgKi8KKwlwcmludGYgKCJcblN0YXJ0aW5nIGtlcm5lbCAuLi5cblxuIik7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFVklDRQorCXsKKwkJZXh0ZXJuIHZvaWQgdWRjX2Rpc2Nvbm5lY3QgKHZvaWQpOworCQl1ZGNfZGlzY29ubmVjdCAoKTsKKwl9CisjZW5kaWYKKworCWNsZWFudXBfYmVmb3JlX2xpbnV4ICgpOworCisJdGhlS2VybmVsICgwLCBtYWNoaWQsIGJkLT5iaV9ib290X3BhcmFtcyk7CisJLyogZG9lcyBub3QgcmV0dXJuICovCisKKwlyZXR1cm4gMTsKK30KKworCisjaWYgZGVmaW5lZCAoQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0NNRExJTkVfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX0lOSVRSRF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfU0VSSUFMX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19SRVZJU0lPTl9UQUcpCitzdGF0aWMgdm9pZCBzZXR1cF9zdGFydF90YWcgKGJkX3QgKmJkKQoreworCXBhcmFtcyA9IChzdHJ1Y3QgdGFnICopIGJkLT5iaV9ib290X3BhcmFtczsKKworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfQ09SRTsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19jb3JlKTsKKworCXBhcmFtcy0+dS5jb3JlLmZsYWdzID0gMDsKKwlwYXJhbXMtPnUuY29yZS5wYWdlc2l6ZSA9IDA7CisJcGFyYW1zLT51LmNvcmUucm9vdGRldiA9IDA7CisKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKworCisjaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyAoYmRfdCAqYmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05SX0RSQU1fQkFOS1M7IGkrKykgeworCQlwYXJhbXMtPmhkci50YWcgPSBBVEFHX01FTTsKKwkJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfbWVtMzIpOworCisJCXBhcmFtcy0+dS5tZW0uc3RhcnQgPSBiZC0+YmlfZHJhbVtpXS5zdGFydDsKKwkJcGFyYW1zLT51Lm1lbS5zaXplID0gYmQtPmJpX2RyYW1baV0uc2l6ZTsKKworCQlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTICovCisKKworc3RhdGljIHZvaWQgc2V0dXBfY29tbWFuZGxpbmVfdGFnIChiZF90ICpiZCwgY2hhciAqY29tbWFuZGxpbmUpCit7CisJY2hhciAqcDsKKworCWlmICghY29tbWFuZGxpbmUpCisJCXJldHVybjsKKworCS8qIGVhdCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisJZm9yIChwID0gY29tbWFuZGxpbmU7ICpwID09ICcgJzsgcCsrKTsKKworCS8qIHNraXAgbm9uLWV4aXN0ZW50IGNvbW1hbmQgbGluZXMgc28gdGhlIGtlcm5lbCB3aWxsIHN0aWxsCisJICogdXNlIGl0cyBkZWZhdWx0IGNvbW1hbmQgbGluZS4KKwkgKi8KKwlpZiAoKnAgPT0gJ1wwJykKKwkJcmV0dXJuOworCisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19DTURMSU5FOworCXBhcmFtcy0+aGRyLnNpemUgPQorCQkoc2l6ZW9mIChzdHJ1Y3QgdGFnX2hlYWRlcikgKyBzdHJsZW4gKHApICsgMSArIDQpID4+IDI7CisKKwlzdHJjcHkgKHBhcmFtcy0+dS5jbWRsaW5lLmNtZGxpbmUsIHApOworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisKKworI2lmZGVmIENPTkZJR19JTklUUkRfVEFHCitzdGF0aWMgdm9pZCBzZXR1cF9pbml0cmRfdGFnIChiZF90ICpiZCwgdWxvbmcgaW5pdHJkX3N0YXJ0LCB1bG9uZyBpbml0cmRfZW5kKQoreworCS8qIGFuIEFUQUdfSU5JVFJEIG5vZGUgdGVsbHMgdGhlIGtlcm5lbCB3aGVyZSB0aGUgY29tcHJlc3NlZAorCSAqIHJhbWRpc2sgY2FuIGJlIGZvdW5kLiBBVEFHX1JESU1HIGlzIGEgYmV0dGVyIG5hbWUsIGFjdHVhbGx5LgorCSAqLworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfSU5JVFJEMjsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19pbml0cmQpOworCisJcGFyYW1zLT51LmluaXRyZC5zdGFydCA9IGluaXRyZF9zdGFydDsKKwlwYXJhbXMtPnUuaW5pdHJkLnNpemUgPSBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0OworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX0lOSVRSRF9UQUcgKi8KKworI2lmZGVmIENPTkZJR19TRVJJQUxfVEFHCit2b2lkIHNldHVwX3NlcmlhbF90YWcgKHN0cnVjdCB0YWcgKip0bXApCit7CisJc3RydWN0IHRhZyAqcGFyYW1zID0gKnRtcDsKKwlzdHJ1Y3QgdGFnX3NlcmlhbG5yIHNlcmlhbG5yOworCXZvaWQgZ2V0X2JvYXJkX3NlcmlhbChzdHJ1Y3QgdGFnX3NlcmlhbG5yICpzZXJpYWxucik7CisKKwlnZXRfYm9hcmRfc2VyaWFsKCZzZXJpYWxucik7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19TRVJJQUw7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfc2VyaWFsbnIpOworCXBhcmFtcy0+dS5zZXJpYWxuci5sb3cgPSBzZXJpYWxuci5sb3c7CisJcGFyYW1zLT51LnNlcmlhbG5yLmhpZ2g9IHNlcmlhbG5yLmhpZ2g7CisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7CisJKnRtcCA9IHBhcmFtczsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JFVklTSU9OX1RBRwordm9pZCBzZXR1cF9yZXZpc2lvbl90YWcoc3RydWN0IHRhZyAqKmluX3BhcmFtcykKK3sKKwl1MzIgcmV2ID0gMDsKKwl1MzIgZ2V0X2JvYXJkX3Jldih2b2lkKTsKKworCXJldiA9IGdldF9ib2FyZF9yZXYoKTsKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX1JFVklTSU9OOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX3JldmlzaW9uKTsKKwlwYXJhbXMtPnUucmV2aXNpb24ucmV2ID0gcmV2OworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorI2VuZGlmICAvKiBDT05GSUdfUkVWSVNJT05fVEFHICovCisKKworc3RhdGljIHZvaWQgc2V0dXBfZW5kX3RhZyAoYmRfdCAqYmQpCit7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19OT05FOworCXBhcmFtcy0+aGRyLnNpemUgPSAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2NyYzMyLmMgYi94LWxvYWRlci9saWIvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc0OTRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2NyYzMyLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGNyYzMyLmMgZnJvbSB0aGUgemxpYi0xLjEuMyBkaXN0cmlidXRpb24KKyAqIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIuCisgKi8KKworLyogY3JjMzIuYyAtLSBjb21wdXRlIHRoZSBDUkMtMzIgb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpZm5kZWYgVVNFX0hPU1RDQworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y29tcGlsZXIuaD4KKyNpbmNsdWRlIDx4LWxvYWQvY3JjLmg+CisKKyNpbmNsdWRlICJ4LWxvYWQvemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworI2RlZmluZSBaRVhQT1JUCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgdG9sZSh4KSBjcHVfdG9fbGUzMih4KQorCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKworbG9jYWwgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Citsb2NhbCB1aW50MzJfdCBjcmNfdGFibGVbMjU2XTsKK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKKworLyoKKyAgR2VuZXJhdGUgYSB0YWJsZSBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKKyAgeF4zMit4XjI2K3heMjMreF4yMit4XjE2K3heMTIreF4xMSt4XjEwK3heOCt4XjcreF41K3heNCt4XjIreCsxLgorCisgIFBvbHlub21pYWxzIG92ZXIgR0YoMikgYXJlIHJlcHJlc2VudGVkIGluIGJpbmFyeSwgb25lIGJpdCBwZXIgY29lZmZpY2llbnQsCisgIHdpdGggdGhlIGxvd2VzdCBwb3dlcnMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVGhlbiBhZGRpbmcgcG9seW5vbWlhbHMKKyAgaXMganVzdCBleGNsdXNpdmUtb3IsIGFuZCBtdWx0aXBseWluZyBhIHBvbHlub21pYWwgYnkgeCBpcyBhIHJpZ2h0IHNoaWZ0IGJ5CisgIG9uZS4gIElmIHdlIGNhbGwgdGhlIGFib3ZlIHBvbHlub21pYWwgcCwgYW5kIHJlcHJlc2VudCBhIGJ5dGUgYXMgdGhlCisgIHBvbHlub21pYWwgcSwgYWxzbyB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChzbyB0aGUKKyAgYnl0ZSAweGIxIGlzIHRoZSBwb2x5bm9taWFsIHheNyt4XjMreCsxKSwgdGhlbiB0aGUgQ1JDIGlzIChxKnheMzIpIG1vZCBwLAorICB3aGVyZSBhIG1vZCBiIG1lYW5zIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYSBieSBiLgorCisgIFRoaXMgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyB0aGUgc2hpZnQtcmVnaXN0ZXIgbWV0aG9kIG9mIG11bHRpcGx5aW5nIGFuZAorICB0YWtpbmcgdGhlIHJlbWFpbmRlci4gIFRoZSByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBhbmQgZm9yIGVhY2gKKyAgaW5jb21pbmcgYml0LCB4XjMyIGlzIGFkZGVkIG1vZCBwIHRvIHRoZSByZWdpc3RlciBpZiB0aGUgYml0IGlzIGEgb25lICh3aGVyZQorICB4XjMyIG1vZCBwIGlzIHAreF4zMiA9IHheMjYrLi4uKzEpLCBhbmQgdGhlIHJlZ2lzdGVyIGlzIG11bHRpcGxpZWQgbW9kIHAgYnkKKyAgeCAod2hpY2ggaXMgc2hpZnRpbmcgcmlnaHQgYnkgb25lIGFuZCBhZGRpbmcgeF4zMiBtb2QgcCBpZiB0aGUgYml0IHNoaWZ0ZWQKKyAgb3V0IGlzIGEgb25lKS4gIFdlIHN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIgKGxlYXN0IHNpZ25pZmljYW50IGJpdCkgb2YKKyAgcSBhbmQgcmVwZWF0IGZvciBhbGwgZWlnaHQgYml0cyBvZiBxLgorCisgIFRoZSB0YWJsZSBpcyBzaW1wbHkgdGhlIENSQyBvZiBhbGwgcG9zc2libGUgZWlnaHQgYml0IHZhbHVlcy4gIFRoaXMgaXMgYWxsCisgIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZ2VuZXJhdGUgQ1JDJ3Mgb24gZGF0YSBhIGJ5dGUgYXQgYSB0aW1lIGZvciBhbGwKKyAgY29tYmluYXRpb25zIG9mIENSQyByZWdpc3RlciB2YWx1ZXMgYW5kIGluY29taW5nIGJ5dGVzLgorKi8KK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQoreworICB1aW50MzJfdCBjOworICBpbnQgbiwgazsKKyAgdUxvbmcgcG9seTsJCS8qIHBvbHlub21pYWwgZXhjbHVzaXZlLW9yIHBhdHRlcm4gKi8KKyAgLyogdGVybXMgb2YgcG9seW5vbWlhbCBkZWZpbmluZyB0aGlzIGNyYyAoZXhjZXB0IHheMzIpOiAqLworICBzdGF0aWMgY29uc3QgQnl0ZSBwW10gPSB7MCwxLDIsNCw1LDcsOCwxMCwxMSwxMiwxNiwyMiwyMywyNn07CisKKyAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBMKSAqLworICBwb2x5ID0gMEw7CisgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKEJ5dGUpOyBuKyspCisgICAgcG9seSB8PSAxTCA8PCAoMzEgLSBwW25dKTsKKworICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCisgIHsKKyAgICBjID0gKHVMb25nKW47CisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKKyAgICBjcmNfdGFibGVbbl0gPSB0b2xlKGMpOworICB9CisgIGNyY190YWJsZV9lbXB0eSA9IDA7Cit9CisjZWxzZQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUYWJsZSBvZiBDUkMtMzIncyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzIChtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKQorICovCisKK2xvY2FsIGNvbnN0IHVpbnQzMl90IGNyY190YWJsZVsyNTZdID0gewordG9sZSgweDAwMDAwMDAwTCksIHRvbGUoMHg3NzA3MzA5NkwpLCB0b2xlKDB4ZWUwZTYxMmNMKSwgdG9sZSgweDk5MDk1MWJhTCksCit0b2xlKDB4MDc2ZGM0MTlMKSwgdG9sZSgweDcwNmFmNDhmTCksIHRvbGUoMHhlOTYzYTUzNUwpLCB0b2xlKDB4OWU2NDk1YTNMKSwKK3RvbGUoMHgwZWRiODgzMkwpLCB0b2xlKDB4NzlkY2I4YTRMKSwgdG9sZSgweGUwZDVlOTFlTCksIHRvbGUoMHg5N2QyZDk4OEwpLAordG9sZSgweDA5YjY0YzJiTCksIHRvbGUoMHg3ZWIxN2NiZEwpLCB0b2xlKDB4ZTdiODJkMDdMKSwgdG9sZSgweDkwYmYxZDkxTCksCit0b2xlKDB4MWRiNzEwNjRMKSwgdG9sZSgweDZhYjAyMGYyTCksIHRvbGUoMHhmM2I5NzE0OEwpLCB0b2xlKDB4ODRiZTQxZGVMKSwKK3RvbGUoMHgxYWRhZDQ3ZEwpLCB0b2xlKDB4NmRkZGU0ZWJMKSwgdG9sZSgweGY0ZDRiNTUxTCksIHRvbGUoMHg4M2QzODVjN0wpLAordG9sZSgweDEzNmM5ODU2TCksIHRvbGUoMHg2NDZiYThjMEwpLCB0b2xlKDB4ZmQ2MmY5N2FMKSwgdG9sZSgweDhhNjVjOWVjTCksCit0b2xlKDB4MTQwMTVjNGZMKSwgdG9sZSgweDYzMDY2Y2Q5TCksIHRvbGUoMHhmYTBmM2Q2M0wpLCB0b2xlKDB4OGQwODBkZjVMKSwKK3RvbGUoMHgzYjZlMjBjOEwpLCB0b2xlKDB4NGM2OTEwNWVMKSwgdG9sZSgweGQ1NjA0MWU0TCksIHRvbGUoMHhhMjY3NzE3MkwpLAordG9sZSgweDNjMDNlNGQxTCksIHRvbGUoMHg0YjA0ZDQ0N0wpLCB0b2xlKDB4ZDIwZDg1ZmRMKSwgdG9sZSgweGE1MGFiNTZiTCksCit0b2xlKDB4MzViNWE4ZmFMKSwgdG9sZSgweDQyYjI5ODZjTCksIHRvbGUoMHhkYmJiYzlkNkwpLCB0b2xlKDB4YWNiY2Y5NDBMKSwKK3RvbGUoMHgzMmQ4NmNlM0wpLCB0b2xlKDB4NDVkZjVjNzVMKSwgdG9sZSgweGRjZDYwZGNmTCksIHRvbGUoMHhhYmQxM2Q1OUwpLAordG9sZSgweDI2ZDkzMGFjTCksIHRvbGUoMHg1MWRlMDAzYUwpLCB0b2xlKDB4YzhkNzUxODBMKSwgdG9sZSgweGJmZDA2MTE2TCksCit0b2xlKDB4MjFiNGY0YjVMKSwgdG9sZSgweDU2YjNjNDIzTCksIHRvbGUoMHhjZmJhOTU5OUwpLCB0b2xlKDB4YjhiZGE1MGZMKSwKK3RvbGUoMHgyODAyYjg5ZUwpLCB0b2xlKDB4NWYwNTg4MDhMKSwgdG9sZSgweGM2MGNkOWIyTCksIHRvbGUoMHhiMTBiZTkyNEwpLAordG9sZSgweDJmNmY3Yzg3TCksIHRvbGUoMHg1ODY4NGMxMUwpLCB0b2xlKDB4YzE2MTFkYWJMKSwgdG9sZSgweGI2NjYyZDNkTCksCit0b2xlKDB4NzZkYzQxOTBMKSwgdG9sZSgweDAxZGI3MTA2TCksIHRvbGUoMHg5OGQyMjBiY0wpLCB0b2xlKDB4ZWZkNTEwMmFMKSwKK3RvbGUoMHg3MWIxODU4OUwpLCB0b2xlKDB4MDZiNmI1MWZMKSwgdG9sZSgweDlmYmZlNGE1TCksIHRvbGUoMHhlOGI4ZDQzM0wpLAordG9sZSgweDc4MDdjOWEyTCksIHRvbGUoMHgwZjAwZjkzNEwpLCB0b2xlKDB4OTYwOWE4OGVMKSwgdG9sZSgweGUxMGU5ODE4TCksCit0b2xlKDB4N2Y2YTBkYmJMKSwgdG9sZSgweDA4NmQzZDJkTCksIHRvbGUoMHg5MTY0NmM5N0wpLCB0b2xlKDB4ZTY2MzVjMDFMKSwKK3RvbGUoMHg2YjZiNTFmNEwpLCB0b2xlKDB4MWM2YzYxNjJMKSwgdG9sZSgweDg1NjUzMGQ4TCksIHRvbGUoMHhmMjYyMDA0ZUwpLAordG9sZSgweDZjMDY5NWVkTCksIHRvbGUoMHgxYjAxYTU3YkwpLCB0b2xlKDB4ODIwOGY0YzFMKSwgdG9sZSgweGY1MGZjNDU3TCksCit0b2xlKDB4NjViMGQ5YzZMKSwgdG9sZSgweDEyYjdlOTUwTCksIHRvbGUoMHg4YmJlYjhlYUwpLCB0b2xlKDB4ZmNiOTg4N2NMKSwKK3RvbGUoMHg2MmRkMWRkZkwpLCB0b2xlKDB4MTVkYTJkNDlMKSwgdG9sZSgweDhjZDM3Y2YzTCksIHRvbGUoMHhmYmQ0NGM2NUwpLAordG9sZSgweDRkYjI2MTU4TCksIHRvbGUoMHgzYWI1NTFjZUwpLCB0b2xlKDB4YTNiYzAwNzRMKSwgdG9sZSgweGQ0YmIzMGUyTCksCit0b2xlKDB4NGFkZmE1NDFMKSwgdG9sZSgweDNkZDg5NWQ3TCksIHRvbGUoMHhhNGQxYzQ2ZEwpLCB0b2xlKDB4ZDNkNmY0ZmJMKSwKK3RvbGUoMHg0MzY5ZTk2YUwpLCB0b2xlKDB4MzQ2ZWQ5ZmNMKSwgdG9sZSgweGFkNjc4ODQ2TCksIHRvbGUoMHhkYTYwYjhkMEwpLAordG9sZSgweDQ0MDQyZDczTCksIHRvbGUoMHgzMzAzMWRlNUwpLCB0b2xlKDB4YWEwYTRjNWZMKSwgdG9sZSgweGRkMGQ3Y2M5TCksCit0b2xlKDB4NTAwNTcxM2NMKSwgdG9sZSgweDI3MDI0MWFhTCksIHRvbGUoMHhiZTBiMTAxMEwpLCB0b2xlKDB4YzkwYzIwODZMKSwKK3RvbGUoMHg1NzY4YjUyNUwpLCB0b2xlKDB4MjA2Zjg1YjNMKSwgdG9sZSgweGI5NjZkNDA5TCksIHRvbGUoMHhjZTYxZTQ5ZkwpLAordG9sZSgweDVlZGVmOTBlTCksIHRvbGUoMHgyOWQ5Yzk5OEwpLCB0b2xlKDB4YjBkMDk4MjJMKSwgdG9sZSgweGM3ZDdhOGI0TCksCit0b2xlKDB4NTliMzNkMTdMKSwgdG9sZSgweDJlYjQwZDgxTCksIHRvbGUoMHhiN2JkNWMzYkwpLCB0b2xlKDB4YzBiYTZjYWRMKSwKK3RvbGUoMHhlZGI4ODMyMEwpLCB0b2xlKDB4OWFiZmIzYjZMKSwgdG9sZSgweDAzYjZlMjBjTCksIHRvbGUoMHg3NGIxZDI5YUwpLAordG9sZSgweGVhZDU0NzM5TCksIHRvbGUoMHg5ZGQyNzdhZkwpLCB0b2xlKDB4MDRkYjI2MTVMKSwgdG9sZSgweDczZGMxNjgzTCksCit0b2xlKDB4ZTM2MzBiMTJMKSwgdG9sZSgweDk0NjQzYjg0TCksIHRvbGUoMHgwZDZkNmEzZUwpLCB0b2xlKDB4N2E2YTVhYThMKSwKK3RvbGUoMHhlNDBlY2YwYkwpLCB0b2xlKDB4OTMwOWZmOWRMKSwgdG9sZSgweDBhMDBhZTI3TCksIHRvbGUoMHg3ZDA3OWViMUwpLAordG9sZSgweGYwMGY5MzQ0TCksIHRvbGUoMHg4NzA4YTNkMkwpLCB0b2xlKDB4MWUwMWYyNjhMKSwgdG9sZSgweDY5MDZjMmZlTCksCit0b2xlKDB4Zjc2MjU3NWRMKSwgdG9sZSgweDgwNjU2N2NiTCksIHRvbGUoMHgxOTZjMzY3MUwpLCB0b2xlKDB4NmU2YjA2ZTdMKSwKK3RvbGUoMHhmZWQ0MWI3NkwpLCB0b2xlKDB4ODlkMzJiZTBMKSwgdG9sZSgweDEwZGE3YTVhTCksIHRvbGUoMHg2N2RkNGFjY0wpLAordG9sZSgweGY5YjlkZjZmTCksIHRvbGUoMHg4ZWJlZWZmOUwpLCB0b2xlKDB4MTdiN2JlNDNMKSwgdG9sZSgweDYwYjA4ZWQ1TCksCit0b2xlKDB4ZDZkNmEzZThMKSwgdG9sZSgweGExZDE5MzdlTCksIHRvbGUoMHgzOGQ4YzJjNEwpLCB0b2xlKDB4NGZkZmYyNTJMKSwKK3RvbGUoMHhkMWJiNjdmMUwpLCB0b2xlKDB4YTZiYzU3NjdMKSwgdG9sZSgweDNmYjUwNmRkTCksIHRvbGUoMHg0OGIyMzY0YkwpLAordG9sZSgweGQ4MGQyYmRhTCksIHRvbGUoMHhhZjBhMWI0Y0wpLCB0b2xlKDB4MzYwMzRhZjZMKSwgdG9sZSgweDQxMDQ3YTYwTCksCit0b2xlKDB4ZGY2MGVmYzNMKSwgdG9sZSgweGE4NjdkZjU1TCksIHRvbGUoMHgzMTZlOGVlZkwpLCB0b2xlKDB4NDY2OWJlNzlMKSwKK3RvbGUoMHhjYjYxYjM4Y0wpLCB0b2xlKDB4YmM2NjgzMWFMKSwgdG9sZSgweDI1NmZkMmEwTCksIHRvbGUoMHg1MjY4ZTIzNkwpLAordG9sZSgweGNjMGM3Nzk1TCksIHRvbGUoMHhiYjBiNDcwM0wpLCB0b2xlKDB4MjIwMjE2YjlMKSwgdG9sZSgweDU1MDUyNjJmTCksCit0b2xlKDB4YzViYTNiYmVMKSwgdG9sZSgweGIyYmQwYjI4TCksIHRvbGUoMHgyYmI0NWE5MkwpLCB0b2xlKDB4NWNiMzZhMDRMKSwKK3RvbGUoMHhjMmQ3ZmZhN0wpLCB0b2xlKDB4YjVkMGNmMzFMKSwgdG9sZSgweDJjZDk5ZThiTCksIHRvbGUoMHg1YmRlYWUxZEwpLAordG9sZSgweDliNjRjMmIwTCksIHRvbGUoMHhlYzYzZjIyNkwpLCB0b2xlKDB4NzU2YWEzOWNMKSwgdG9sZSgweDAyNmQ5MzBhTCksCit0b2xlKDB4OWMwOTA2YTlMKSwgdG9sZSgweGViMGUzNjNmTCksIHRvbGUoMHg3MjA3Njc4NUwpLCB0b2xlKDB4MDUwMDU3MTNMKSwKK3RvbGUoMHg5NWJmNGE4MkwpLCB0b2xlKDB4ZTJiODdhMTRMKSwgdG9sZSgweDdiYjEyYmFlTCksIHRvbGUoMHgwY2I2MWIzOEwpLAordG9sZSgweDkyZDI4ZTliTCksIHRvbGUoMHhlNWQ1YmUwZEwpLCB0b2xlKDB4N2NkY2VmYjdMKSwgdG9sZSgweDBiZGJkZjIxTCksCit0b2xlKDB4ODZkM2QyZDRMKSwgdG9sZSgweGYxZDRlMjQyTCksIHRvbGUoMHg2OGRkYjNmOEwpLCB0b2xlKDB4MWZkYTgzNmVMKSwKK3RvbGUoMHg4MWJlMTZjZEwpLCB0b2xlKDB4ZjZiOTI2NWJMKSwgdG9sZSgweDZmYjA3N2UxTCksIHRvbGUoMHgxOGI3NDc3N0wpLAordG9sZSgweDg4MDg1YWU2TCksIHRvbGUoMHhmZjBmNmE3MEwpLCB0b2xlKDB4NjYwNjNiY2FMKSwgdG9sZSgweDExMDEwYjVjTCksCit0b2xlKDB4OGY2NTllZmZMKSwgdG9sZSgweGY4NjJhZTY5TCksIHRvbGUoMHg2MTZiZmZkM0wpLCB0b2xlKDB4MTY2Y2NmNDVMKSwKK3RvbGUoMHhhMDBhZTI3OEwpLCB0b2xlKDB4ZDcwZGQyZWVMKSwgdG9sZSgweDRlMDQ4MzU0TCksIHRvbGUoMHgzOTAzYjNjMkwpLAordG9sZSgweGE3NjcyNjYxTCksIHRvbGUoMHhkMDYwMTZmN0wpLCB0b2xlKDB4NDk2OTQ3NGRMKSwgdG9sZSgweDNlNmU3N2RiTCksCit0b2xlKDB4YWVkMTZhNGFMKSwgdG9sZSgweGQ5ZDY1YWRjTCksIHRvbGUoMHg0MGRmMGI2NkwpLCB0b2xlKDB4MzdkODNiZjBMKSwKK3RvbGUoMHhhOWJjYWU1M0wpLCB0b2xlKDB4ZGViYjllYzVMKSwgdG9sZSgweDQ3YjJjZjdmTCksIHRvbGUoMHgzMGI1ZmZlOUwpLAordG9sZSgweGJkYmRmMjFjTCksIHRvbGUoMHhjYWJhYzI4YUwpLCB0b2xlKDB4NTNiMzkzMzBMKSwgdG9sZSgweDI0YjRhM2E2TCksCit0b2xlKDB4YmFkMDM2MDVMKSwgdG9sZSgweGNkZDcwNjkzTCksIHRvbGUoMHg1NGRlNTcyOUwpLCB0b2xlKDB4MjNkOTY3YmZMKSwKK3RvbGUoMHhiMzY2N2EyZUwpLCB0b2xlKDB4YzQ2MTRhYjhMKSwgdG9sZSgweDVkNjgxYjAyTCksIHRvbGUoMHgyYTZmMmI5NEwpLAordG9sZSgweGI0MGJiZTM3TCksIHRvbGUoMHhjMzBjOGVhMUwpLCB0b2xlKDB4NWEwNWRmMWJMKSwgdG9sZSgweDJkMDJlZjhkTCkKK307CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgRE9fQ1JDKHgpIGNyYyA9IHRhYlsoY3JjIF4gKHgpKSAmIDI1NV0gXiAoY3JjID4+IDgpCisjIGVsc2UKKyMgIGRlZmluZSBET19DUkMoeCkgY3JjID0gdGFiWygoY3JjID4+IDI0KSBeICh4KSkgJiAyNTVdIF4gKGNyYyA8PCA4KQorIyBlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIE5vIG9uZXMgY29tcGxlbWVudCB2ZXJzaW9uLiBKRkZTMiAoYW5kIG90aGVyIHRoaW5ncyA/KQorICogZG9uJ3QgdXNlIG9uZXMgY29tcGxpbWVudCBpbiB0aGVpciBDUkMgY2FsY3VsYXRpb25zLgorICovCit1aW50MzJfdCBaRVhQT1JUIGNyYzMyX25vX2NvbXAodWludDMyX3QgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqdGFiID0gY3JjX3RhYmxlOworICAgIGNvbnN0IHVpbnQzMl90ICpiID0oY29uc3QgdWludDMyX3QgKilidWY7CisgICAgc2l6ZV90IHJlbV9sZW47CisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZgorICAgIGNyYyA9IGNwdV90b19sZTMyKGNyYyk7CisgICAgLyogQWxpZ24gaXQgKi8KKyAgICBpZiAoKChsb25nKWIpICYgMyAmJiBsZW4pIHsKKwkgdWludDhfdCAqcCA9ICh1aW50OF90ICopYjsKKwkgZG8geworCSAgICAgIERPX0NSQygqcCsrKTsKKwkgfSB3aGlsZSAoKC0tbGVuKSAmJiAoKGxvbmcpcCkmMyk7CisJIGIgPSAodWludDMyX3QgKilwOworICAgIH0KKworICAgIHJlbV9sZW4gPSBsZW4gJiAzOworICAgIGxlbiA9IGxlbiA+PiAyOworICAgIGZvciAoLS1iOyBsZW47IC0tbGVuKSB7CisJIC8qIGxvYWQgZGF0YSAzMiBiaXRzIHdpZGUsIHhvciBkYXRhIDMyIGJpdHMgd2lkZS4gKi8KKwkgY3JjIF49ICorK2I7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLworCSBET19DUkMoMCk7CisJIERPX0NSQygwKTsKKwkgRE9fQ1JDKDApOworCSBET19DUkMoMCk7CisgICAgfQorICAgIGxlbiA9IHJlbV9sZW47CisgICAgLyogQW5kIHRoZSBsYXN0IGZldyBieXRlcyAqLworICAgIGlmIChsZW4pIHsKKwkgdWludDhfdCAqcCA9ICh1aW50OF90ICopKGIgKyAxKSAtIDE7CisJIGRvIHsKKwkgICAgICBET19DUkMoKisrcCk7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLworCSB9IHdoaWxlICgtLWxlbik7CisgICAgfQorCisgICAgcmV0dXJuIGxlMzJfdG9fY3B1KGNyYyk7Cit9CisjdW5kZWYgRE9fQ1JDCisKK3VpbnQzMl90IFpFWFBPUlQgY3JjMzIgKHVpbnQzMl90IGNyYywgY29uc3QgQnl0ZWYgKnAsIHVJbnQgbGVuKQoreworICAgICByZXR1cm4gY3JjMzJfbm9fY29tcChjcmMgXiAweGZmZmZmZmZmTCwgcCwgbGVuKSBeIDB4ZmZmZmZmZmZMOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBjcmMzMiBjaGVja3N1bSB0cmlnZ2VyaW5nIHRoZSB3YXRjaGRvZyBldmVyeSAnY2h1bmtfc3onIGJ5dGVzCisgKiBvZiBpbnB1dC4KKyAqLwordWludDMyX3QgWkVYUE9SVCBjcmMzMl93ZCAodWludDMyX3QgY3JjLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgdUludCBsZW4sIHVJbnQgY2h1bmtfc3opCit7CisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCwgKmN1cnI7CisJaW50IGNodW5rOworCisJY3VyciA9IGJ1ZjsKKwllbmQgPSBidWYgKyBsZW47CisJd2hpbGUgKGN1cnIgPCBlbmQpIHsKKwkJY2h1bmsgPSBlbmQgLSBjdXJyOworCQlpZiAoY2h1bmsgPiBjaHVua19zeikKKwkJCWNodW5rID0gY2h1bmtfc3o7CisJCWNyYyA9IGNyYzMyIChjcmMsIGN1cnIsIGNodW5rKTsKKwkJY3VyciArPSBjaHVuazsKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisJfQorI2Vsc2UKKwljcmMgPSBjcmMzMiAoY3JjLCBidWYsIGxlbik7CisjZW5kaWYKKworCXJldHVybiBjcmM7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvY3R5cGUuYyBiL3gtbG9hZGVyL2xpYi9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDA0NjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvY3R5cGUuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgbGludXgvbGliL2N0eXBlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCit1bnNpZ25lZCBjaGFyIF9jdHlwZVtdID0geworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJLyogMC03ICovCitfQyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQ3xfUyxfQyxfQywJCS8qIDgtMTUgKi8KK19DLF9DLF9DLF9DLF9DLF9DLF9DLF9DLAkJCS8qIDE2LTIzICovCitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkvKiAyNC0zMSAqLworX1N8X1NQLF9QLF9QLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDMyLTM5ICovCitfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiA0MC00NyAqLworX0QsX0QsX0QsX0QsX0QsX0QsX0QsX0QsCQkJLyogNDgtNTUgKi8KK19ELF9ELF9QLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDU2LTYzICovCitfUCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVXxfWCxfVSwJLyogNjQtNzEgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLAkJCS8qIDcyLTc5ICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwJCQkvKiA4MC04NyAqLworX1UsX1UsX1UsX1AsX1AsX1AsX1AsX1AsCQkJLyogODgtOTUgKi8KK19QLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MLAkvKiA5Ni0xMDMgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLAkJCS8qIDEwNC0xMTEgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLAkJCS8qIDExMi0xMTkgKi8KK19MLF9MLF9MLF9QLF9QLF9QLF9QLF9DLAkJCS8qIDEyMC0xMjcgKi8KKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCQkvKiAxMjgtMTQzICovCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAkJLyogMTQ0LTE1OSAqLworX1N8X1NQLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLCAgIC8qIDE2MC0xNzUgKi8KK19QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLCAgICAgICAvKiAxNzYtMTkxICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwgICAgICAgLyogMTkyLTIwNyAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1AsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX0wsICAgICAgIC8qIDIwOC0yMjMgKi8KK19MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLF9MLCAgICAgICAvKiAyMjQtMjM5ICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfUCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTH07ICAgICAgLyogMjQwLTI1NSAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jIGIveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDc0YmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZGlzcGxheV9vcHRpb25zLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KK2ludCBkaXNwbGF5X29wdGlvbnMgKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgdmVyc2lvbl9zdHJpbmdbXTsKKworI2lmIGRlZmluZWQoQlVJTERfVEFHKQorCXByaW50ZiAoIlxuXG4lcywgQnVpbGQ6ICVzXG5cbiIsIHZlcnNpb25fc3RyaW5nLCBCVUlMRF9UQUcpOworI2Vsc2UKKwlwcmludGYgKCJcblxuJXNcblxuIiwgdmVyc2lvbl9zdHJpbmcpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwcmludCBzaXplcyBhcyAieHh4IEtpQiIsICJ4eHgueSBLaUIiLCAieHh4IE1pQiIsICJ4eHgueSBNaUIiLAorICogeHh4IEdpQiwgeHh4LnkgR2lCLCBldGMgYXMgbmVlZGVkOyBhbGxvdyBmb3Igb3B0aW9uYWwgdHJhaWxpbmcgc3RyaW5nCisgKiAobGlrZSAiXG4iKQorICovCit2b2lkIHByaW50X3NpemUodW5zaWduZWQgbG9uZyBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnMpCit7CisJdW5zaWduZWQgbG9uZyBtID0gMCwgbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZjsKKwlzdGF0aWMgY29uc3QgY2hhciBuYW1lc1tdID0geydFJywgJ1AnLCAnVCcsICdHJywgJ00nLCAnSyd9OworCXVuc2lnbmVkIGxvbmcgZCA9IDEwICogQVJSQVlfU0laRShuYW1lcyk7CisJY2hhciBjID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5hbWVzKTsgaSsrLCBkIC09IDEwKSB7CisJCWlmIChzaXplID4+IGQpIHsKKwkJCWMgPSBuYW1lc1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFjKSB7CisJCXByaW50ZigiJWxsdSBCeXRlcyVzIiwgc2l6ZSwgcyk7CisJCXJldHVybjsKKwl9CisKKwluID0gc2l6ZSA+PiBkOworCWYgPSBzaXplICYgKCgxVUxMIDw8IGQpIC0gMSk7CisKKwkvKiBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBkZWFsIHdpdGggaXQgKi8KKwlpZiAoZikgeworCQltID0gKDEwVUxMICogZiArICgxVUxMIDw8IChkIC0gMSkpKSA+PiBkOworCisJCWlmIChtID49IDEwKSB7CisJCQltIC09IDEwOworCQkJbiArPSAxOworCQl9CisJfQorCisJcHJpbnRmICgiJWx1Iiwgbik7CisJaWYgKG0pIHsKKwkJcHJpbnRmICgiLiVsZCIsIG0pOworCX0KKwlwcmludGYgKCIgJWNpQiVzIiwgYywgcyk7Cit9CisKKy8qCisgKiBQcmludCBkYXRhIGJ1ZmZlciBpbiBoZXggYW5kIGFzY2lpIGZvcm0gdG8gdGhlIHRlcm1pbmFsLgorICoKKyAqIGRhdGEgcmVhZHMgYXJlIGJ1ZmZlcmVkIHNvIHRoYXQgZWFjaCBtZW1vcnkgYWRkcmVzcyBpcyBvbmx5IHJlYWQgb25jZS4KKyAqIFVzZWZ1bCB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzIG9mIHZvbGF0aWxlIHJlZ2lzdGVycy4KKyAqCisgKiBwYXJhbWV0ZXJzOgorICogICAgYWRkcjogU3RhcnRpbmcgYWRkcmVzcyB0byBkaXNwbGF5IGF0IHN0YXJ0IG9mIGxpbmUKKyAqICAgIGRhdGE6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAqICAgIHdpZHRoOiBkYXRhIHZhbHVlIHdpZHRoLiAgTWF5IGJlIDEsIDIsIG9yIDQuCisgKiAgICBjb3VudDogbnVtYmVyIG9mIHZhbHVlcyB0byBkaXNwbGF5CisgKiAgICBsaW5lbGVuOiBOdW1iZXIgb2YgdmFsdWVzIHRvIHByaW50IHBlciBsaW5lOyBzcGVjaWZ5IDAgZm9yIGRlZmF1bHQgbGVuZ3RoCisgKi8KKyNkZWZpbmUgTUFYX0xJTkVfTEVOR1RIX0JZVEVTICg2NCkKKyNkZWZpbmUgREVGQVVMVF9MSU5FX0xFTkdUSF9CWVRFUyAoMTYpCitpbnQgcHJpbnRfYnVmZmVyICh1bG9uZyBhZGRyLCB2b2lkKiBkYXRhLCB1aW50IHdpZHRoLCB1aW50IGNvdW50LCB1aW50IGxpbmVsZW4pCit7CisJLyogbGluZWJ1ZiBhcyBhIHVuaW9uIGNhdXNlcyBwcm9wZXIgYWxpZ25tZW50ICovCisJdW5pb24gbGluZWJ1ZiB7CisJCXVpbnQzMl90IHVpW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDMyX3QpICsgMV07CisJCXVpbnQxNl90IHVzW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDE2X3QpICsgMV07CisJCXVpbnQ4X3QgIHVjW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YodWludDhfdCkgKyAxXTsKKwl9IGxiOworCWludCBpOworCisJaWYgKGxpbmVsZW4qd2lkdGggPiBNQVhfTElORV9MRU5HVEhfQllURVMpCisJCWxpbmVsZW4gPSBNQVhfTElORV9MRU5HVEhfQllURVMgLyB3aWR0aDsKKwlpZiAobGluZWxlbiA8IDEpCisJCWxpbmVsZW4gPSBERUZBVUxUX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJcHJpbnRmKCIlMDhseDoiLCBhZGRyKTsKKworCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgY29uZGl0aW9uICovCisJCWlmIChjb3VudCA8IGxpbmVsZW4pCisJCQlsaW5lbGVuID0gY291bnQ7CisKKwkJLyogQ29weSBmcm9tIG1lbW9yeSBpbnRvIGxpbmVidWYgYW5kIHByaW50IGhleCB2YWx1ZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxpbmVsZW47IGkrKykgeworCQkJdWludDMyX3QgeDsKKwkJCWlmICh3aWR0aCA9PSA0KQorCQkJCXggPSBsYi51aVtpXSA9ICoodm9sYXRpbGUgdWludDMyX3QgKilkYXRhOworCQkJZWxzZSBpZiAod2lkdGggPT0gMikKKwkJCQl4ID0gbGIudXNbaV0gPSAqKHZvbGF0aWxlIHVpbnQxNl90ICopZGF0YTsKKwkJCWVsc2UKKwkJCQl4ID0gbGIudWNbaV0gPSAqKHZvbGF0aWxlIHVpbnQ4X3QgKilkYXRhOworCQkJcHJpbnRmKCIgJTAqeCIsIHdpZHRoICogMiwgeCk7CisJCQlkYXRhICs9IHdpZHRoOworCQl9CisKKwkJLyogUHJpbnQgZGF0YSBpbiBBU0NJSSBjaGFyYWN0ZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBsaW5lbGVuICogd2lkdGg7IGkrKykgeworCQkJaWYgKCFpc3ByaW50KGxiLnVjW2ldKSB8fCBsYi51Y1tpXSA+PSAweDgwKQorCQkJCWxiLnVjW2ldID0gJy4nOworCQl9CisJCWxiLnVjW2ldID0gJ1wwJzsKKwkJcHJpbnRmKCIgICAgJXNcbiIsIGxiLnVjKTsKKworCQkvKiB1cGRhdGUgcmVmZXJlbmNlcyAqLworCQlhZGRyICs9IGxpbmVsZW4gKiB3aWR0aDsKKwkJY291bnQgLT0gbGluZWxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9kaXYwLmMgYi94LWxvYWRlci9saWIvZGl2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjdiZjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZGl2MC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogUmVwbGFjZW1lbnQgKD1kdW1teSkgZm9yIEdOVS9MaW51eCBkaXZpc2lvbi1ieSB6ZXJvIGhhbmRsZXIgKi8KK3ZvaWQgX19kaXYwICh2b2lkKQoreworCWV4dGVybiB2b2lkIGhhbmcgKHZvaWQpOworCisJaGFuZygpOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2VjYy5jIGIveC1sb2FkZXIvbGliL2VjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvZWNjLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIAorICogVGhpcyBmaWxlIG9zIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgdS1ib290IGZpbGU6CisgKgljb21tb24vY21kX25hbmQuYworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKw0KKy8qCisgKiBQcmUtY2FsY3VsYXRlZCAyNTYtd2F5IDEgYnl0ZSBjb2x1bW4gcGFyaXR5CisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgbmFuZF9lY2NfcHJlY2FsY190YWJsZVtdID0geworCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwKKwkweDY2LCAweDMzLCAweDMwLCAweDY1LCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDY1LCAweDMwLCAweDMzLCAweDY2LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwKKwkweDBjLCAweDU5LCAweDVhLCAweDBmLCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDBmLCAweDVhLCAweDU5LCAweDBjLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwKKwkweDZhLCAweDNmLCAweDNjLCAweDY5LCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDY5LCAweDNjLCAweDNmLCAweDZhLAorCTB4MGYsIDB4NWEsIDB4NTksIDB4MGMsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4MGMsIDB4NTksIDB4NWEsIDB4MGYsCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywKKwkweDY5LCAweDNjLCAweDNmLCAweDZhLCAweDMwLCAweDY1LCAweDY2LCAweDMzLCAweDMzLCAweDY2LCAweDY1LCAweDMwLCAweDZhLCAweDNmLCAweDNjLCAweDY5LAorCTB4MDMsIDB4NTYsIDB4NTUsIDB4MDAsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwKKwkweDY1LCAweDMwLCAweDMzLCAweDY2LCAweDNjLCAweDY5LCAweDZhLCAweDNmLCAweDNmLCAweDZhLCAweDY5LCAweDNjLCAweDY2LCAweDMzLCAweDMwLCAweDY1LAorCTB4MDAsIDB4NTUsIDB4NTYsIDB4MDMsIDB4NTksIDB4MGMsIDB4MGYsIDB4NWEsIDB4NWEsIDB4MGYsIDB4MGMsIDB4NTksIDB4MDMsIDB4NTYsIDB4NTUsIDB4MDAKK307CisKKworLyoKKyAqIENyZWF0ZXMgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkKKyAqLworc3RhdGljIHZvaWQgbmFuZF90cmFuc19yZXN1bHQodV9jaGFyIHJlZzIsIHVfY2hhciByZWczLAorCXVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9jaGFyIGEsIGIsIGksIHRtcDEsIHRtcDI7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCWEgPSBiID0gMHg4MDsKKwl0bXAxID0gdG1wMiA9IDA7CisKKwkvKiBDYWxjdWxhdGUgZmlyc3QgRUNDIGJ5dGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChyZWczICYgYSkJCS8qIExQMTUsMTMsMTEsOSAtLT4gZWNjX2NvZGVbMF0gKi8KKwkJCXRtcDEgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJaWYgKHJlZzIgJiBhKQkJLyogTFAxNCwxMiwxMCw4IC0tPiBlY2NfY29kZVswXSAqLworCQkJdG1wMSB8PSBiOworCQliID4+PSAxOworCQlhID4+PSAxOworCX0KKworCS8qIENhbGN1bGF0ZSBzZWNvbmQgRUNDIGJ5dGUgKi8KKwliID0gMHg4MDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChyZWczICYgYSkJCS8qIExQNyw1LDMsMSAtLT4gZWNjX2NvZGVbMV0gKi8KKwkJCXRtcDIgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJaWYgKHJlZzIgJiBhKQkJLyogTFA2LDQsMiwwIC0tPiBlY2NfY29kZVsxXSAqLworCQkJdG1wMiB8PSBiOworCQliID4+PSAxOworCQlhID4+PSAxOworCX0KKworCS8qIFN0b3JlIHR3byBvZiB0aGUgRUNDIGJ5dGVzICovCisJZWNjX2NvZGVbMF0gPSB0bXAxOworCWVjY19jb2RlWzFdID0gdG1wMjsKK30KKworLyoKKyAqIENhbGN1bGF0ZSAzIGJ5dGUgRUNDIGNvZGUgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KKy8qIEVDQyBDYWxjdWxhdGlvbiBpcyBkaWZmZXJlbnQgYmV0d2VlbiBOQU5EIGFuZCBOQU5EIExlZ2FjeSBjb2RlCisgKiBpbiBVLUJvb3QuIElmIE5BTkRfTEVHQUNZIGlzIGVuYWJsZWQgaW4gdS1ib290IGl0IHNob3VsZCBiZSAKKyAqIGVuYWJsZWQgaW4gdGhlIGNvbmZpZyBmaWxlIGluIHgtbG9hZGVyIGFsc28gCisgKi8KKyNpZmRlZiBOQU5EX0xFR0FDWQordm9pZCBuYW5kX2NhbGN1bGF0ZV9lY2MgKGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBpZHgsIHJlZzEsIHJlZzM7CisJaW50IGo7CisKKwkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLworCXJlZzEgPSByZWczID0gMDsKKwllY2NfY29kZVswXSA9IGVjY19jb2RlWzFdID0gZWNjX2NvZGVbMl0gPSAwOworCisJLyogQnVpbGQgdXAgY29sdW1uIHBhcml0eSAqLworCWZvcihqID0gMDsgaiA8IDI1NjsgaisrKSB7CisKKwkJLyogR2V0IENQMCAtIENQNSBmcm9tIHRhYmxlICovCisJCWlkeCA9IG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbZGF0W2pdXTsKKwkJcmVnMSBePSBpZHg7CisKKwkJLyogQWxsIGJpdCBYT1IgPSAxID8gKi8KKwkJaWYgKGlkeCAmIDB4NDApIHsKKwkJCXJlZzMgXj0gKHVfY2hhcikgajsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eSAqLworCW5hbmRfdHJhbnNfcmVzdWx0KChyZWcxICYgMHg0MCkgPyB+cmVnMyA6IHJlZzMsIHJlZzMsIGVjY19jb2RlKTsKKworCS8qIENhbGN1bGF0ZSBmaW5hbCBFQ0MgY29kZSAqLworCWVjY19jb2RlWzBdID0gfmVjY19jb2RlWzBdOworCWVjY19jb2RlWzFdID0gfmVjY19jb2RlWzFdOworCWVjY19jb2RlWzJdID0gKCh+cmVnMSkgPDwgMikgfCAweDAzOworfQorI2Vsc2UKK3ZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgaWR4LCByZWcxLCByZWcyLCByZWczOworCWludCBqOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlyZWcxID0gcmVnMiA9IHJlZzMgPSAwOworCWVjY19jb2RlWzBdID0gZWNjX2NvZGVbMV0gPSBlY2NfY29kZVsyXSA9IDA7CisKKwkvKiBCdWlsZCB1cCBjb2x1bW4gcGFyaXR5ICovCisJZm9yKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKworCQkvKiBHZXQgQ1AwIC0gQ1A1IGZyb20gdGFibGUgKi8KKwkJaWR4ID0gbmFuZF9lY2NfcHJlY2FsY190YWJsZVtkYXRbal1dOworCQlyZWcxIF49IChpZHggJiAweDNmKTsKKworCQkvKiBBbGwgYml0IFhPUiA9IDEgPyAqLworCQlpZiAoaWR4ICYgMHg0MCkgeworCQkJcmVnMyBePSAodV9jaGFyKSBqOworCQkJcmVnMiBePSB+KCh1X2NoYXIpIGopOworCQl9CisJfQorCisJLyogQ3JlYXRlIG5vbi1pbnZlcnRlZCBFQ0MgY29kZSBmcm9tIGxpbmUgcGFyaXR5ICovCisJbmFuZF90cmFuc19yZXN1bHQocmVnMiwgcmVnMywgZWNjX2NvZGUpOworCisJLyogQ2FsY3VsYXRlIGZpbmFsIEVDQyBjb2RlICovCisJZWNjX2NvZGVbMF0gPSB+ZWNjX2NvZGVbMF07CisJZWNjX2NvZGVbMV0gPSB+ZWNjX2NvZGVbMV07CisJZWNjX2NvZGVbMl0gPSAoKH5yZWcxKSA8PCAyKSB8IDB4MDM7Cit9CisjZW5kaWYKKy8qCisgKiBEZXRlY3QgYW5kIGNvcnJlY3QgYSAxIGJpdCBlcnJvciBmb3IgMjU2IGJ5dGUgYmxvY2sKKyAqLworaW50IG5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYykKK3sKKwl1X2NoYXIgYSwgYiwgYywgZDEsIGQyLCBkMywgYWRkLCBiaXQsIGk7CisKKwkvKiBEbyBlcnJvciBkZXRlY3Rpb24gKi8KKwlkMSA9IGNhbGNfZWNjWzBdIF4gcmVhZF9lY2NbMF07CisJZDIgPSBjYWxjX2VjY1sxXSBeIHJlYWRfZWNjWzFdOworCWQzID0gY2FsY19lY2NbMl0gXiByZWFkX2VjY1syXTsKKworCWlmICgoZDEgfCBkMiB8IGQzKSA9PSAwKSB7CisJCS8qIE5vIGVycm9ycyAqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCWEgPSAoZDEgXiAoZDEgPj4gMSkpICYgMHg1NTsKKwkJYiA9IChkMiBeIChkMiA+PiAxKSkgJiAweDU1OworCQljID0gKGQzIF4gKGQzID4+IDEpKSAmIDB4NTQ7CisKKwkJLyogRm91bmQgYW5kIHdpbGwgY29ycmVjdCBzaW5nbGUgYml0IGVycm9yIGluIHRoZSBkYXRhICovCisJCWlmICgoYSA9PSAweDU1KSAmJiAoYiA9PSAweDU1KSAmJiAoYyA9PSAweDU0KSkgeworCQkJYyA9IDB4ODA7CisJCQlhZGQgPSAwOworCQkJYSA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDEgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJCWlmIChkMiAmIGMpCisJCQkJCWFkZCB8PSBhOworCQkJCWMgPj49IDI7CisJCQkJYSA+Pj0gMTsKKwkJCX0KKwkJCWJpdCA9IDA7CisJCQliID0gMHgwNDsKKwkJCWMgPSAweDgwOworCQkJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCQkJaWYgKGQzICYgYykKKwkJCQkJYml0IHw9IGI7CisJCQkJYyA+Pj0gMjsKKwkJCQliID4+PSAxOworCQkJfQorCQkJYiA9IDB4MDE7CisJCQlhID0gZGF0W2FkZF07CisJCQlhIF49IChiIDw8IGJpdCk7CisJCQlkYXRbYWRkXSA9IGE7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllbHNlIHsKKwkJCWkgPSAwOworCQkJd2hpbGUgKGQxKSB7CisJCQkJaWYgKGQxICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQxID4+PSAxOworCQkJfQorCQkJd2hpbGUgKGQyKSB7CisJCQkJaWYgKGQyICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQyID4+PSAxOworCQkJfQorCQkJd2hpbGUgKGQzKSB7CisJCQkJaWYgKGQzICYgMHgwMSkKKwkJCQkJKytpOworCQkJCWQzID4+PSAxOworCQkJfQorCQkJaWYgKGkgPT0gMSkgeworCQkJCS8qIEVDQyBDb2RlIEVycm9yIENvcnJlY3Rpb24gKi8KKwkJCQlyZWFkX2VjY1swXSA9IGNhbGNfZWNjWzBdOworCQkJCXJlYWRfZWNjWzFdID0gY2FsY19lY2NbMV07CisJCQkJcmVhZF9lY2NbMl0gPSBjYWxjX2VjY1syXTsKKwkJCQlyZXR1cm4gMjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qIFVuY29ycmVjdGFibGUgRXJyb3IgKi8KKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJcmV0dXJuIC0xOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvb21hcF9iY2guYyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDI0YTYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvb21hcF9iY2guYwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIG9tYXBfYmNoLmMKKyAqCisgKiBTdXBwb3J0IG1vZHVsZXMgZm9yIEJDSCA0LWJpdC84LWJpdCBlcnJvciBjb3JyZWN0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgezIwMTF9IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNkZWZpbmUgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICAgMHgyNDAKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBOQU5EX0VDQ19SRUFEICAgICAgICAgICAwCisjZGVmaW5lIE5BTkRfRUNDX1dSSVRFICAgICAgICAgIDEKKyNkZWZpbmUgX19yYXdfd3JpdGVsKHYsYSkgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpID0gKHYpKQorI2RlZmluZSBfX3Jhd19yZWFkbChhKSAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYSkpCisKK2ludCBkZWNvZGVfYmNoKGludCBzZWxlY3RfNF84LCB1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCAqZXJyX2xvYyk7CisKKy8qCisgKiAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDggLSBWZXJzaW9uIGZvciA4QklUIEJDSCBjb3JyZWN0aW9uLgorICoKKyAqICBAZGF0Ogl1bnVzZWQKKyAqICBAZWNjX2NvZGU6CWVjY19jb2RlIGJ1ZmZlcgorICovCitpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgoY29uc3QgdWludDhfdCAqZGF0LAorCQkJCSAgIHVpbnQ4X3QgKmVjY19jb2RlKQoreworICB1bnNpZ25lZCBsb25nIHJlZywgdmFsMSA9IDB4MCwgdmFsMiA9IDB4MDsKKyAgdW5zaWduZWQgbG9uZyB2YWwzID0gMHgwLCB2YWw0ID0gMHgwOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFLzUxMjsgaSsrKSB7CisgICAgLyogUmVhZGluZyBIVyBFQ0NfQkNIX1Jlc3VsdHMKKyAgICAgKiAweDI0MC0weDI0QywgMHgyNTAtMHgyNUMsIDB4MjYwLTB4MjZDLCAweDI3MC0weDI3QworICAgICAqLworICAgIHJlZyA9ICh1bnNpZ25lZCBsb25nKShHUE1DX0JBU0UgKworCQkJICBHUE1DX0VDQ19CQ0hfUkVTVUxUXzAgKyAoMHgxMCAqIGkpKTsKKyAgICB2YWwxID0gX19yYXdfcmVhZGwocmVnKTsKKyAgICB2YWwyID0gX19yYXdfcmVhZGwocmVnICsgNCk7CisgICAgdmFsMyA9IF9fcmF3X3JlYWRsKHJlZyArIDgpOworICAgIHZhbDQgPSBfX3Jhd19yZWFkbChyZWcgKyAxMik7CisKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWw0ICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDMgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwzICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMjQpICYgMHhGRik7CisKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMiA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDIgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAyNCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiAxNikgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICgodmFsMSA+PiA4KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKHZhbDEgJiAweEZGKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAqICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNCAtIFZlcnNpb24gZm9yIDRCSVQgQkNIIGNvcnJlY3Rpb24uCisgKgorICogIEBkYXQ6CXVudXNlZAorICogIEBlY2NfY29kZToJZWNjX2NvZGUgYnVmZmVyCisgKi8KK2ludCBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoNChjb25zdCB1aW50OF90ICpkYXQsCisJCQkJICAgdWludDhfdCAqZWNjX2NvZGUpCit7CisgIHVuc2lnbmVkIGxvbmcgcmVnLCB2YWwxID0gMHgwLCB2YWwyID0gMHgwOwkKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRS81MTI7IGkrKykgeworICAgIC8qIFJlYWRpbmcgSFcgRUNDX0JDSF9SZXN1bHRzCisgICAgICogMHgyNDAtMHgyNEMsIDB4MjUwLTB4MjVDLCAweDI2MC0weDI2QywgMHgyNzAtMHgyN0MKKyAgICAgKi8KKyAgICByZWcgPSAodW5zaWduZWQgbG9uZykoR1BNQ19CQVNFICsKKwkJCSAgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICsgKDB4MTAgKiBpKSk7CisgICAgdmFsMSA9IF9fcmF3X3JlYWRsKHJlZyk7CisgICAgdmFsMiA9IF9fcmF3X3JlYWRsKHJlZyArIDQpOworCisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwyICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwxICYgMHhGRik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEltcGxlbWVudGF0aW9uIGZvciA0Yi84YiBCQ0ggY29ycmVjdGlvbi4gIFBhc3MgZWl0aGVyIDQgb3IgOCBpbnRvIHRoZSAKKyAgIGNvcnJlY3RfYml0cyBwYXJhbWV0ZXIuICovCitzdGF0aWMgaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaChpbnQgY29ycmVjdF9iaXRzLCB1aW50OF90ICpkYXQsCisJCQkJIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKyAgaW50IGk9MCwgYmxvY2tDbnQ9NCwgaiwgZWNjZmxhZywgY291bnQsIGNvcnJlY3RlZD0wOworICBpbnQgZWNjc2l6ZSA9IChjb3JyZWN0X2JpdHMgPT0gOCkgPyAxMyA6IDc7CisgIGludCBtb2RlID0gKGNvcnJlY3RfYml0cyA9PSA4KSA/IDEgOiAwOworICB1bnNpZ25lZCBpbnQgZXJyX2xvY1s4XTsKKworICBpZiAoY29ycmVjdF9iaXRzID09IDQpCisgICAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQoZGF0LCBjYWxjX2VjYyk7CisgIGVsc2UgaWYgKGNvcnJlY3RfYml0cyA9PSA4KQorICAgIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGRhdCwgY2FsY19lY2MpOworICBlbHNlCisgICAgcmV0dXJuIC0xOyAgLyogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNvcnJlY3Rpb24gYml0cyAqLworCisgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NudDsgaSsrKSB7CisgICAgLyogY2hlY2sgaWYgYW55IGVjYyBlcnJvciAqLworICAgIGVjY2ZsYWcgPSAwOworICAgIGZvciAoaiA9IDA7IChqIDwgZWNjc2l6ZSkgJiYgKGVjY2ZsYWcgPT0gMCk7IGorKykKKyAgICAgIGlmIChjYWxjX2VjY1tqXSAhPSAwKQorCWVjY2ZsYWcgPSAxOworCisgICAgaWYgKGVjY2ZsYWcgPT0gMSkgeworICAgICAgZWNjZmxhZyA9IDA7CisgICAgICBmb3IgKGogPSAwOyAoaiA8IGVjY3NpemUpICYmIChlY2NmbGFnID09IDApOyBqKyspCisJaWYgKHJlYWRfZWNjW2pdICE9IDB4RkYpCisJICBlY2NmbGFnID0gMTsKKyAgICB9CisKKyAgICBpZiAoZWNjZmxhZyA9PSAxKSB7CisgICAgICBjb3VudCA9IDA7CisgICAgICAvKnByaW50ayhLRVJOX0lORk8gIi4uLmJjaCBjb3JyZWN0KCVkIDUxMiBieXRlKVxuIiwgaSsxKTsqLworICAgICAgY291bnQgPSBkZWNvZGVfYmNoKG1vZGUsIGNhbGNfZWNjLCBlcnJfbG9jKTsKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIElmIHVuY29ycmVjdGFibGUgZXJyb3IgZGV0ZWN0ZWQgaW4gc3ViLXBhZ2UsCisgICAgICAgKiBrZWVwIHVuY29ycmVjdGFibGUgZmxhZyB0byB1cHBlciBsYXllcgorICAgICAgICovCisgICAgICBpZihjb3VudCA9PSAtMSkKKyAgICAgICAgY29ycmVjdGVkID0gLTE7CisgICAgICAvKgorICAgICAgICogSWYgbm8gdW5jb3JyZWN0YWJsZSBlcnJvciB0aGVuIGluY3JlbWVudAorICAgICAgICogY29ycmVjdGVkIGNvdW50CisgICAgICAgKi8KKyAgICAgIGlmKGNvcnJlY3RlZCAhPSAtMSkKKyAgICAgICAgY29ycmVjdGVkICs9IGNvdW50OworCQkJCisgICAgICBmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKykgeworCS8qcHJpbnRrKEtFUk5fSU5GTyAiZXJyX2xvYz0lZFxuIiwgZXJyX2xvY1tqXSk7Ki8KKyAgICAgICAgcHJpbnRmKCJlcnJfbG9jPSVkXG4iLCBlcnJfbG9jW2pdKTsKKwlpZiAoZXJyX2xvY1tqXSA8IDQwOTYpCisJICBkYXRbZXJyX2xvY1tqXSA+PiAzXSBePSAxIDw8IChlcnJfbG9jW2pdICYgNyk7CisJLyogZWxzZSwgbm90IGludGVyZXN0ZWQgdG8gY29ycmVjdCBlY2MgKi8KKyAgICAgIH0KKworICAgIH0KKworICAgIGNhbGNfZWNjID0gY2FsY19lY2MgKyBlY2NzaXplOworICAgIHJlYWRfZWNjID0gcmVhZF9lY2MgKyBlY2NzaXplOworICAgIGRhdCArPSA1MTI7CisgIH0KKworICByZXR1cm4gY29ycmVjdGVkOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciA0IGJpdCBCQ0ggY29ycmVjdGlvbiAqLworaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDQodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIHJldHVybiBvbWFwX2NvcnJlY3RfZGF0YV9iY2goNCwgZGF0LCByZWFkX2VjYywgY2FsY19lY2MpOworfQorCisvKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciA4IGJpdCBCQ0ggY29ycmVjdGlvbiAqLworaW50IG9tYXBfY29ycmVjdF9kYXRhX2JjaDgodWludDhfdCAqZGF0LCB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIHJldHVybiBvbWFwX2NvcnJlY3RfZGF0YV9iY2goOCwgZGF0LCByZWFkX2VjYywgY2FsY19lY2MpOworfQorCisvKgorICogb21hcF9lbmFibGVfZWNjIC0gVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBoYXJkd2FyZSBlY2MgZnVuY3Rpb25hbGl0eQorICogQG10ZDogICAgICAgIE1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbW9kZTogICAgICAgUmVhZC9Xcml0ZSBtb2RlCisgKi8KK3ZvaWQgb21hcF9lbmFibGVfaHdlY2NfYmNoNCh1aW50MzJfdCBidXNfd2lkdGgsIGludDMyX3QgbW9kZSkKK3sKKyAgdWludDMyX3QgYmNoX21vZD0wOworICB1aW50MzJfdCBkZXZfd2lkdGggPSAoYnVzX3dpZHRoPT04KT8wOjE7CisgIHVuc2lnbmVkIGludCBlY2NzaXplMSwgZWNjc2l6ZTA7CisgIHVuc2lnbmVkIGludCBlY2NfY29uZl92YWwgPSAwLCBlY2Nfc2l6ZV9jb25mX3ZhbCA9IDA7CisKKyAgc3dpdGNoIChtb2RlKSB7CisgIGNhc2UgTkFORF9FQ0NfUkVBRCAgICA6CisgICAgZWNjc2l6ZTEgPSAweEQ7IGVjY3NpemUwID0gMHg0ODsKKyAgICAvKiBFQ0NTSVpFMT0yNiB8IEVDQ1NJWkUwPTEyICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwOSA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTkFORF9FQ0NfV1JJVEUgICA6CisgICAgZWNjc2l6ZTEgPSAweDIwOyBlY2NzaXplMCA9IDB4MDA7CisKKyAgICAvKiBFQ0NTSVpFMT0zMiB8IEVDQ1NJWkUwPTAwICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNiA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcHJpbnRmKCJFcnJvcjogVW5yZWNvZ25pemVkIE1vZGVbJWRdIVxuIiwgbW9kZSk7CisgICAgYnJlYWs7CisgIH0KKworICBfX3Jhd193cml0ZWwoMHgxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworICBfX3Jhd193cml0ZWwoZWNjX3NpemVfY29uZl92YWwsIChHUE1DX0VDQ19TSVpFX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoZWNjX2NvbmZfdmFsLCAoR1BNQ19FQ0NfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbCgweDEwMSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKK30KKworLyoKKyAqIG9tYXBfZW5hYmxlX2VjYyAtIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgZWNjIGZ1bmN0aW9uYWxpdHkKKyAqIEBtdGQ6ICAgICAgICBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1vZGU6ICAgICAgIFJlYWQvV3JpdGUgbW9kZQorICovCit2b2lkIG9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpCit7CisgIHVpbnQzMl90IGJjaF9tb2Q9MTsKKyAgdWludDMyX3QgZGV2X3dpZHRoID0gKGJ1c193aWR0aD09OCk/MDoxOworICB1bnNpZ25lZCBpbnQgZWNjc2l6ZTEsIGVjY3NpemUwOworICB1bnNpZ25lZCBpbnQgZWNjX2NvbmZfdmFsID0gMCwgZWNjX3NpemVfY29uZl92YWwgPSAwOworCisgIHN3aXRjaCAobW9kZSkgeworICBjYXNlIE5BTkRfRUNDX1JFQUQgICAgOgorICAgIGVjY3NpemUxID0gMHgxQTsgZWNjc2l6ZTAgPSAweDE4OworICAgIC8qIEVDQ1NJWkUxPTI2IHwgRUNDU0laRTA9MTIgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA0IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgY2FzZSBOQU5EX0VDQ19XUklURSAgIDoKKyAgICBlY2NzaXplMSA9IDB4MjA7IGVjY3NpemUwID0gMHgwMDsKKworICAgIC8qIEVDQ1NJWkUxPTMyIHwgRUNDU0laRTA9MDAgKi8KKyAgICBlY2Nfc2l6ZV9jb25mX3ZhbCA9IChlY2NzaXplMSA8PCAyMikgfCAoZWNjc2l6ZTAgPDwgMTIpOworCisgICAgLyogRUNDQUxHT1JJVEhNIHwgRUNDQkNIVDggfCBFQ0NXUkFQTU9ERSB8IEVDQzE2QiB8CisgICAgICogRUNDVE9QU0VDVE9SIHwgRUNDQ1MgfCBFQ0MgRW5hYmxlCisgICAgICovCisgICAgZWNjX2NvbmZfdmFsID0gKCgweDAxIDw8IDE2KSB8IChiY2hfbW9kIDw8IDEyKSB8ICgweDA2IDw8IDgpIHwKKwkJICAgIChkZXZfd2lkdGggPDwgNykgfCAoMHgwMyA8PCA0KSB8CisJCSAgICAoMCA8PCAxKSB8ICgweDEpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBwcmludGYoIkVycm9yOiBVbnJlY29nbml6ZWQgTW9kZVslZF0hXG4iLCBtb2RlKTsKKyAgICBicmVhazsKKyAgfQorCisgIF9fcmF3X3dyaXRlbCgweDEsIChHUE1DX0VDQ19DT05UUk9MKSk7CisgIF9fcmF3X3dyaXRlbChlY2Nfc2l6ZV9jb25mX3ZhbCwgKEdQTUNfRUNDX1NJWkVfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbChlY2NfY29uZl92YWwsIChHUE1DX0VDQ19DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKDB4MTAxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL29tYXBfYmNoX2RlY29kZXIuYyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBsaWIvb21hcF9iY2hfZGVjb2Rlci5jCisgKgorICogV2hvbGUgQkNIIEVDQyBEZWNvZGVyIChQb3N0IGhhcmR3YXJlIGdlbmVyYXRlZCBzeW5kcm9tZSBkZWNvZGluZykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBBdXRob3I6IFN1a3VtYXIgR2hvcmFpIDxzLWdob3JhaUB0aS5jb20KKyAqCQkgICBNaWNoYWVsIEZpbGxpbmdlciA8bS1maWxsaW5nZXJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBwcmludGsgLy9wcmludGYKKworI2RlZmluZSBtbQkJMTMKKyNkZWZpbmUga2tfc2hvcnRlbgk0MDk2CisjZGVmaW5lIG5uCQk4MTkxCS8qIExlbmd0aCBvZiBjb2Rld29yZCwgbiA9IDIqKm1tIC0gMSAqLworCisjZGVmaW5lIFBQUAkweDIwMUIJLyogUHJpbWFyeSBQb2x5bm9taWFsIDogeF4xMyArIHheNCArIHheMyArIHggKyAxICovCisjZGVmaW5lIFAJMHgwMDFCCS8qIFdpdGggb21pdHRlZCB4XjEzICovCisjZGVmaW5lIFBPTFkJMTIJLyogZGVncmVlIG9mIHRoZSBwcmltYXJ5IFBvbHlub21pYWwgbGVzcyBvbmUgKi8KKworLyoqCisgKiBtcHlfbW9kX2dmIC0gR0FMT0lTIGZpZWxkIG11bHRpcGxpZXIKKyAqIElucHV0ICA6IEEoeCksIEIoeCkKKyAqIE91dHB1dCA6IEEoeCkqQih4KSBtb2QgUCh4KQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1weV9tb2RfZ2YodW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBiKQoreworCXVuc2lnbmVkIGludCBSID0gMDsKKwl1bnNpZ25lZCBpbnQgUjEgPSAwOworCXVuc2lnbmVkIGludCBrID0gMDsKKworCWZvciAoayA9IDA7IGsgPCBtbTsgaysrKSB7CisKKwkJUiA9IChSIDw8IDEpICYgMHgxRkZFOworCQlpZiAoUjEgPT0gMSkKKwkJCVIgXj0gUDsKKworCQlpZiAoKChhID4+IChQT0xZIC0gaykpICYgMSkgPT0gMSkKKwkJCVIgXj0gYjsKKworCQlpZiAoayA8IFBPTFkpCisJCQlSMSA9IChSID4+IFBPTFkpICYgMTsKKwl9CisJcmV0dXJuIFI7Cit9CisKKy8qKgorICogY2hpZW4gLSBDSElFTiBzZWFyY2gKKyAqCisgKiBAbG9jYXRpb24gLSBFcnJvciBsb2NhdGlvbiB2ZWN0b3IgcG9pbnRlcgorICoKKyAqIElucHV0cyAgOiBFTFAoeikKKyAqCSAgICAgTm8uIG9mIGZvdW5kIGVycm9ycworICoJICAgICBTaXplIG9mIGlucHV0IGNvZGV3b3JkCisgKiBPdXRwdXRzIDogVXAgdG8gOCBsb2NhdGlvbnMKKyAqCSAgICAgTm8uIG9mIGVycm9ycworICovCitzdGF0aWMgaW50IGNoaWVuKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LCBpbnQgZXJyX251bXMsCisJCQkJdW5zaWduZWQgaW50IGVycltdLCB1bnNpZ25lZCBpbnQgKmxvY2F0aW9uKQoreworCWludCBpLCBjb3VudDsgLyogTnVtYmVyIG9mIGRlY3RlY3RlZCBlcnJvcnMgKi8KKwkvKiBDb250YWlucyBhY2N1bXVsYXRpb24gb2YgZXZhbHVhdGlvbiBhdCB4XmkgKGk6MS0+OCkgKi8KKwl1bnNpZ25lZCBpbnQgZ2FtbWFzWzhdOworCXVuc2lnbmVkIGludCBhbHBoYTsKKwl1bnNpZ25lZCBpbnQgYml0LCBlY2NfYml0czsKKwl1bnNpZ25lZCBpbnQgZWxwX3N1bTsKKworCWVjY19iaXRzID0gKHNlbGVjdF80XzggPT0gMCkgPyA1MiA6IDEwNDsKKwkKKwkvKiBTdGFydCBldmFsdWF0aW9uIGF0IEFscGhhKio4MTkyIGFuZCBkZWNyZWFzaW5nICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJZ2FtbWFzW2ldID0gZXJyW2ldOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDE7IChpIDw9IG5uKSAmJiAoY291bnQgPCBlcnJfbnVtcyk7IGkrKykgeworCisJCS8qIFJlc3VsdCBvZiBldmFsdWF0aW9uIGF0IHJvb3QgKi8KKwkJZWxwX3N1bSA9IDEgXiBnYW1tYXNbMF0gXiBnYW1tYXNbMV0gXgorCQkJCWdhbW1hc1syXSBeIGdhbW1hc1szXSBeCisJCQkJZ2FtbWFzWzRdIF4gZ2FtbWFzWzVdIF4KKwkJCQlnYW1tYXNbNl0gXiBnYW1tYXNbN107CisKKwkJYWxwaGEgPSBQUFAgPj4gMTsKKwkJZ2FtbWFzWzBdID0gbXB5X21vZF9nZihnYW1tYXNbMF0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTIgKi8KKwkJZ2FtbWFzWzFdID0gbXB5X21vZF9nZihnYW1tYXNbMV0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTIgKi8KKwkJZ2FtbWFzWzJdID0gbXB5X21vZF9nZihnYW1tYXNbMl0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTMgKi8KKwkJZ2FtbWFzWzNdID0gbXB5X21vZF9nZihnYW1tYXNbM10sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTQgKi8KKwkJZ2FtbWFzWzRdID0gbXB5X21vZF9nZihnYW1tYXNbNF0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTUgKi8KKwkJZ2FtbWFzWzVdID0gbXB5X21vZF9nZihnYW1tYXNbNV0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTYgKi8KKwkJZ2FtbWFzWzZdID0gbXB5X21vZF9nZihnYW1tYXNbNl0sIGFscGhhKTsKKwkJYWxwaGEgPSBtcHlfbW9kX2dmKGFscGhhLCAoUFBQID4+IDEpKTsJLyogeCBhbHBoaGFeLTcgKi8KKwkJZ2FtbWFzWzddID0gbXB5X21vZF9nZihnYW1tYXNbN10sIGFscGhhKTsKKworCQlpZiAoZWxwX3N1bSA9PSAwKSB7CisJCQkvKiBjYWxjdWxhdGUgbG9jYXRpb24gKi8KKwkJCWJpdCA9ICgoaS0xKSAmIH43KXwoNy0oKGktMSkgJiA3KSk7CisJCQlsb2NhdGlvbltjb3VudCsrXSA9IGtrX3Nob3J0ZW4gLSAoYml0IC0gMiAqIGVjY19iaXRzKSAtIDE7CisJCX0KKwl9CisKKwkvKiBGYWlsdXJlOiBOby4gb2YgZGV0ZWN0ZWQgZXJyb3JzICE9IE5vLiBvciBjb3JyZWN0ZWQgZXJyb3JzICovCisJaWYgKGNvdW50ICE9IGVycl9udW1zKSB7CisJCWNvdW50ID0gLTE7CisJCS8qCXByaW50ayhLRVJOX0lORk8gIkJDSCBkZWNvZGluZyBmYWlsZWRcbiIpOyovCisJfQorCS8qCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXByaW50ayhLRVJOX0lORk8gIiVkICIsIGxvY2F0aW9uW2ldKTsKKwkqLworCXJldHVybiBjb3VudDsKK30KKworLyogc3luZCA6IDE2IFN5bmRyb21lcworICogcmV0dXJuOiBnYW1hYXMgLSBDb2VmZmljaWVudHMgdG8gdGhlIGVycm9yIHBvbHlub21pYWwKKyAqIHJldHVybjogOiBOdW1iZXIgb2YgZGV0ZWN0ZWQgZXJyb3JzCisqLworc3RhdGljIHVuc2lnbmVkIGludCBiZXJsZWthbXAodW5zaWduZWQgaW50IHNlbGVjdF80XzgsCisJCQl1bnNpZ25lZCBpbnQgc3luZFtdLCB1bnNpZ25lZCBpbnQgZXJyW10pCit7CisJaW50IGxvb3AsIGl0ZXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgTEwgPSAwOwkJLyogRGV0ZWN0ZWQgZXJyb3JzICovCisJdW5zaWduZWQgaW50IGQgPSAwOwkvKiBEaXN0YW5jZSBiZXR3ZWVuIFN5bmRyb21lcyBhbmQgRUxQW25dKHopICovCisJdW5zaWduZWQgaW50IGludmQgPSAwOwkJLyogSW52ZXJzZSBvZiBkICovCisJLyogSW50ZXJtZWRpYXRlIEVMUFtuXSh6KS4KKwkgKiBGaW5hbCBFTFBbbl0oeikgaXMgRXJyb3IgTG9jYXRpb24gUG9seW5vbWlhbAorCSAqLworCXVuc2lnbmVkIGludCBnYW1tYXNbMTZdOworCS8qIEludGVybWVkaWF0ZSBub3JtYWxpemVkIEVMUFtuXSh6KSA6IERbbl0oeikgKi8KKwl1bnNpZ25lZCBpbnQgRFsxNl07CisJLyogVGVtcG9yYXJ5IHZhbHVlIHRoYXQgaG9sZHMgYW4gRUxQW25dKHopIGNvZWZmaWNpZW50ICovCisJdW5zaWduZWQgaW50IG5leHRfZ2FtbWEgPSAwOworCisJaW50IGUgPSAwOworCXVuc2lnbmVkIGludCBzaWduID0gMDsKKwl1bnNpZ25lZCBpbnQgdSA9IDA7CisJdW5zaWduZWQgaW50IHYgPSAwOworCXVuc2lnbmVkIGludCBDMSA9IDAsIEMyID0gMDsKKwl1bnNpZ25lZCBpbnQgc3MgPSAwOworCXVuc2lnbmVkIGludCB0bXBfdiA9IDAsIHRtcF9zID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wX3BvbHk7CisKKwkvKi0tLS0tLS0tLS0tLS0tIFN0ZXAgMCAtLS0tLS0tLS0tLS0tLS0tLS0qLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxNjsgbG9vcCsrKSB7CisJCWdhbW1hc1tsb29wXSA9IDA7CisJCURbbG9vcF0gPSAwOworCX0KKworCWdhbW1hc1swXSA9IDE7CisJRFsxXSA9IDE7CisKKwlpdGVyYXRpb24gPSAwOworCUxMID0gMDsKKwl3aGlsZSAoKGl0ZXJhdGlvbiA8ICgoc2VsZWN0XzRfOCsxKSoyKjQpKSAmJgorCQkJKExMIDw9ICgoc2VsZWN0XzRfOCsxKSo0KSkpIHsKKworCSAgLypwcmludGsoS0VSTl9JTkZPICJcbkl0ZXJhdGlvbi4uLi4uLi4uLi4uLi4lZFxuIiwgaXRlcmF0aW9uKTsqLworCQlkID0gMDsKKwkJLyogU3RlcDogMCAqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDw9IExMOyBsb29wKyspIHsKKwkJCXRtcF9wb2x5ID0gbXB5X21vZF9nZigKKwkJCQkJZ2FtbWFzW2xvb3BdLCBzeW5kW2l0ZXJhdGlvbiAtIGxvb3BdKTsKKwkJCWQgXj0gdG1wX3BvbHk7CisJCQkvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MCBMTD0leCBwb2x5ICV4XG4iLAorCQkJICBsb29wLCBMTCwgdG1wX3BvbHkpOyovCisJCX0KKworCQkvKiBTdGVwIDE6IDEgY3ljbGUgb25seSB0byBwZXJmb3JtIGludmVyc2lvbiAqLworCQl2ID0gZCA8PCAxOworCQllID0gLTE7CisJCXNpZ24gPSAxOworCQlzcyA9IDB4MjAwMDsKKwkJaW52ZCA9IDA7CisJCXUgPSBQUFA7CisJCWZvciAobG9vcCA9IDA7IChkICE9IDApICYmIChsb29wIDw9ICgyICogUE9MWSkpOyBsb29wKyspIHsKKwkJICAvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MSBMTD0leCBwb2x5IE5VTExcbiIsCisJCSAgICBsb29wLCBMTCk7Ki8KKwkJCUMxID0gKHYgPj4gMTMpICYgMTsKKwkJCUMyID0gQzEgJiBzaWduOworCisJCQlzaWduIF49IEMyIF4gKGUgPT0gMCk7CisKKwkJCXRtcF92ID0gdjsKKwkJCXRtcF9zID0gc3M7CisKKwkJCWlmIChDMSA9PSAxKSB7CisJCQkJdiBePSB1OworCQkJCXNzIF49IGludmQ7CisJCQl9CisJCQl2ID0gKHYgPDwgMSkgJiAweDNGRkY7CisJCQlpZiAoQzIgPT0gMSkgeworCQkJCXUgPSB0bXBfdjsKKwkJCQlpbnZkID0gdG1wX3M7CisJCQkJZSA9IC1lOworCQkJfQorCQkJaW52ZCA+Pj0gMTsKKwkJCWUtLTsKKwkJfQorCisJCWZvciAobG9vcCA9IDA7IChkICE9IDApICYmIChsb29wIDw9IChpdGVyYXRpb24gKyAxKSk7IGxvb3ArKykgeworCQkJLyogU3RlcCAyCisJCQkgKiBJbnRlcmxlYXZlZCB3aXRoIFN0ZXAgMywgaWYgTDwobi1rKQorCQkJICogaW52ZDogVXBkYXRlIG9mIEVMUFtuXSh6KSA9IEVMUFtuLTFdKHopIC0gZC5EW24tMV0oeikKKwkJCSAqLworCisJCQkvKiBIb2xkcyB2YWx1ZSBvZiBFTFAgY29lZmZpY2llbnQgdW50aWwgcHJlY2VkZW50CisJCQkgKiB2YWx1ZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHVzZWQgYW55bW9yZQorCQkJICovCisJCQl0bXBfcG9seSA9IG1weV9tb2RfZ2YoZCwgRFtsb29wXSk7CisJCQkvKnByaW50ayhLRVJOX0lORk8gIiUwMmQuIHM9MiBMTD0leCBwb2x5ICV4XG4iLAorCQkJICBsb29wLCBMTCwgdG1wX3BvbHkpOyovCisKKwkJCW5leHRfZ2FtbWEgPSBnYW1tYXNbbG9vcF0gXiB0bXBfcG9seTsKKwkJCWlmICgoMiAqIExMKSA8IChpdGVyYXRpb24gKyAxKSkgeworCQkJCS8qIEludGVybGVhdmluZyB3aXRoIFN0ZXAgMworCQkJCSAqIGZvciBwYXJhbGxlbGl6ZWQgdXBkYXRlIG9mIEVMUCh6KSBhbmQgRCh6KQorCQkJCSAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBVcGRhdGUgb2YgRUxQKHopIG9ubHkgLT4gc3RheSBpbiBTdGVwIDIgKi8KKwkJCQlnYW1tYXNbbG9vcF0gPSBuZXh0X2dhbW1hOworCQkJCWlmIChsb29wID09IChpdGVyYXRpb24gKyAxKSkgeworCQkJCQkvKiB0byBzdGVwIDQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBTdGVwIDMKKwkJCSAqIEFsd2F5cyBpbnRlcmxlYXZlZCB3aXRoIFN0ZXAgMiAoY2FzZSB3aGVuIEw8KG4taykpCisJCQkgKiBVcGRhdGUgb2YgRFtuLTFdKHopID0gRUxQW24tMV0oeikvZAorCQkJICovCisJCQlEW2xvb3BdID0gbXB5X21vZF9nZihnYW1tYXNbbG9vcF0sIGludmQpOworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTMgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIERbbG9vcF0pOyovCisKKwkJCS8qIENhbiBzYWZlbHkgdXBkYXRlIEVMUFtuXSh6KSAqLworCQkJZ2FtbWFzW2xvb3BdID0gbmV4dF9nYW1tYTsKKworCQkJaWYgKGxvb3AgPT0gKGl0ZXJhdGlvbiArIDEpKSB7CisJCQkJLyogSWYgdXBkYXRlIGZpbmlzaGVkICovCisJCQkJTEwgPSBpdGVyYXRpb24gLSBMTCArIDE7CisJCQkJLyogdG8gc3RlcCA0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBFbHNlLCBpbnRlcmxlYXZpbmcgdG8gc3RlcCAyKi8KKwkJfQorCisJCS8qIFN0ZXAgNDogVXBkYXRlIEQoeik6IGk6MC0+TCAqLworCQkvKiBGaW5hbCB1cGRhdGUgb2YgRFtuXSh6KSA9IERbbl0oeikueiovCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxNTsgbG9vcCsrKSAvKiBMZWZ0IFNoaWZ0ICovCisJCQlEWzE1IC0gbG9vcF0gPSBEWzE0IC0gbG9vcF07CisKKwkJRFswXSA9IDA7CisKKwkJaXRlcmF0aW9uKys7CisJfSAvKiB3aGlsZSAqLworCisJLyogUHJvY2Vzc2luZyBmaW5pc2hlZCwgY29weSBFTFAgdG8gZmluYWwgcmVnaXN0ZXJzIDogMC0+MnQtMSovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJZXJyW2xvb3BdID0gZ2FtbWFzW2xvb3ArMV07CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIEVyciBwb2x5OiIpOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgZXJyW2xvb3BdKTsKKwkqLworCXJldHVybiBMTDsKK30KKworLyoKKyAqIHN5bmRyb21lIC0gR2VuZXJhdGUgc3luZHJvbWUgY29tcG9uZW50cyBmcm9tIGh3IGdlbmVyYXRlIHN5bmRyb21lCisgKiByKHgpID0gYyh4KSArIGUoeCkKKyAqIHMoeCkgPSBjKHgpIG1vZCBnKHgpICsgZSh4KSBtb2QgZyh4KSA9ICBlKHgpIG1vZCBnKHgpCisgKiBzbyByZWNlaXZlciBjaGVja3MgaWYgdGhlIHN5bmRyb21lIHMoeCkgPSByKHgpIG1vZCBnKHgpIGlzIGVxdWFsIHRvIHplcm8uCisgKiB1bnNpZ25lZCBpbnQgc1sxNl07IC0gU3luZHJvbWVzCisgKi8KK3N0YXRpYyB2b2lkIHN5bmRyb21lKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LAorCQkJCQl1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCBzeW5bXSkKK3sKKwl1bnNpZ25lZCBpbnQgaywgbCwgdDsKKwl1bnNpZ25lZCBpbnQgYWxwaGFfYml0LCBSX2JpdDsKKwlpbnQgZWNjX3BvcywgZWNjX21pbjsKKworCS8qIDJ0LTEgPSAxNSAoZm9yIHQ9OCkgbWluaW1hbCBwb2x5bm9taWFscyBvZiB0aGUgZmlyc3QgMTUgcG93ZXJzIG9mIGEKKwkgKiBwcmltaXRpdmUgZWxlbW1hbnRzIG9mIEdGKG0pOyBFdmVuIHBvd2VycyBtaW5pbWFsIHBvbHlub21pYWxzIGFyZQorCSAqIGR1cGxpY2F0ZSBvZiBvZGQgcG93ZXJzJyBtaW5pbWFsIHBvbHlub21pYWxzLgorCSAqIE9kZCBwb3dlcnMgb2YgYWxwaGEgKDEgdG8gMTUpCisJICovCisJdW5zaWduZWQgaW50IHBvd19hbHBoYVs4XSA9IHsweDAwMDIsIDB4MDAwOCwgMHgwMDIwLCAweDAwODAsCisJCQkJIDB4MDIwMCwgMHgwODAwLCAweDAwMUIsIDB4MDA2Q307CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIEVDQ1swLi5uXTogIik7CisJZm9yIChrID0gMDsgayA8IDEzOyBrKyspCisJCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgZWNjW2tdKTsKKwkqLworCisJaWYgKHNlbGVjdF80XzggPT0gMCkgeworCQl0ID0gNDsKKwkJZWNjX3BvcyA9IDU1OyAvKiBiaXRzKDUyLWJpdHMpOiA1NS0+NCAqLworCQllY2NfbWluID0gNDsKKwl9IGVsc2UgeworCQl0ID0gODsKKwkJZWNjX3BvcyA9IDEwMzsgLyogYml0czogMTAzLT4wICovCisJCWVjY19taW4gPSAwOworCX0KKworCS8qIHRvdGFsIG51bWJiZXIgb2Ygc3luZHJvbSB0byBiZSB1c2VkIGlzIDJ0ICovCisJLyogU3RlcDE6IGNhbGN1bGF0ZSB0aGUgb2RkIHN5bmRyb21lKHMpICovCisJUl9iaXQgPSAoKGVjY1tlY2NfcG9zLzhdID4+ICg3IC0gZWNjX3BvcyU4KSkgJiAxKTsKKwllY2NfcG9zLS07CisJZm9yIChrID0gMDsgayA8IHQ7IGsrKykKKwkJc3luWzIgKiBrXSA9IFJfYml0OworCisJd2hpbGUgKGVjY19wb3MgPj0gZWNjX21pbikgeworCQlSX2JpdCA9ICgoZWNjW2VjY19wb3MvOF0gPj4gKDcgLSBlY2NfcG9zJTgpKSAmIDEpOworCQllY2NfcG9zLS07CisKKwkJZm9yIChrID0gMDsgayA8IHQ7IGsrKykgeworCQkJLyogQWNjdW11bGF0ZSB2YWx1ZSBvZiB4XmkgYXQgYWxwaGFeKDJrKzEpICovCisJCQlpZiAoUl9iaXQgPT0gMSkKKwkJCQlzeW5bMiprXSBePSBwb3dfYWxwaGFba107CisKKwkJCS8qIENvbXB1dGUgYSoqKDJrKzEpLCB1c2luZyBMU0ZSICovCisJCQlmb3IgKGwgPSAwOyBsIDwgKDIgKiBrICsgMSk7IGwrKykgeworCQkJCWFscGhhX2JpdCA9IChwb3dfYWxwaGFba10gPj4gUE9MWSkgJiAxOworCQkJCXBvd19hbHBoYVtrXSA9IChwb3dfYWxwaGFba10gPDwgMSkgJiAweDFGRkY7CisJCQkJaWYgKGFscGhhX2JpdCA9PSAxKQorCQkJCQlwb3dfYWxwaGFba10gXj0gUDsKKwkJCX0KKwkJfQorCX0KKworCS8qIFN0ZXAyOiBjYWxjdWxhdGUgdGhlIGV2ZW4gc3luZHJvbWUocykKKwkgKiBDb21wdXRlIFMoYSksIHdoZXJlIGEgaXMgYW4gZXZlbiBwb3dlciBvZiBhbHBoYQorCSAqIEV2ZW5yeSBldmVuIHBvd2VyIG9mIHByaW1pdGl2ZSBlbGVtZW50IGhhcyB0aGUgc2FtZSBtaW5pbWFsCisJICogcG9seW5vbWlhbCBhcyBzb21lIG9kZCBwb3dlciBvZiBlbGVtZXRzLgorCSAqIEFuZCBiYXNlZCBvbiBTKGFeMikgPSBTXjIoYSkKKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgdDsgaysrKQorCQlzeW5bMiprKzFdID0gbXB5X21vZF9nZihzeW5ba10sIHN5bltrXSk7CisKKwkvKnByaW50ayhLRVJOX0lORk8gIlxuIFN5bmRyb21lczogIik7CisJZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisJcHJpbnRrKEtFUk5fSU5GTyAiMHgleCAiLCBzeW5ba10pOyovCit9CisKKy8qKgorICogZGVjb2RlX2JjaCAtIEJDSCBkZWNvZGVyIGZvciA0LSBhbmQgOC1iaXQgZXJyb3IgY29ycmVjdGlvbgorICoKKyAqIEBlY2MgLSBFQ0Mgc3luZHJvbWUgZ2VuZXJhdGVkIGJ5IGh3IEJDSCBlbmdpbmUKKyAqIEBlcnJfbG9jIC0gcG9pbnRlciB0byBlcnJvciBsb2NhdGlvbiBhcnJheQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBwb3N0IHN5ZHJvbWUgZ2VuZXJhdGlvbiAoaHcgZ2VuZXJhdGVkKSBkZWNvZGluZworICogZm9yOi0KKyAqIERpbWVuc2lvbiBvZiBHYWxvaXNlIEZpZWxkOiBtID0gMTMKKyAqIExlbmd0aCBvZiBjb2Rld29yZDogbiA9IDIqKm0gLSAxCisgKiBOdW1iZXIgb2YgZXJyb3JzIHRoYXQgY2FuIGJlIGNvcnJlY3RlZDogNC0gb3IgOC1iaXRzCisgKiBMZW5ndGggb2YgaW5mb3JtYXRpb24gYml0OiBrayA9IG5uIC0gcnIKKyAqLworaW50IGRlY29kZV9iY2goaW50IHNlbGVjdF80XzgsIHVuc2lnbmVkIGNoYXIgKmVjYywgdW5zaWduZWQgaW50ICplcnJfbG9jKQoreworICAgICAgICBpbnQgbm9fb2ZfZXJyLCBpOworCXVuc2lnbmVkIGludCBzeW5bMTZdOwkvKiAxNiBTeW5kcm9tZXMgKi8KKwl1bnNpZ25lZCBpbnQgZXJyX3BvbHlbOF07CisJLyogQ29lZmZpY2llbnRzIHRvIHRoZSBlcnJvciBwb2x5bm9taWFsCisJICogRUxQKHgpID0gMSArIGVycjAueCArIGVycjEueF4yICsgLi4uICsgZXJyNy54XjgKKwkgKi8KKworCS8qIHBlcmZvcm0gbWFudWFsIGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIG1lbXNldCAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkgIHN5bltpXSA9IDA7CisJICBpZiAoaTw4KQorCSAgICBlcnJfcG9seVtpXSA9IDA7CisJfQorCisJLyogRGVjb3RpbmcgaW52b2xlcyB0aHJlZSBzdGVwcworCSAqIDEuIENvbXB1dGUgdGhlIHN5bmRyb20gZnJvbSB0ZWggcmVjZWl2ZWQgY29kZXdvcmQsCisJICogMi4gRmluZCB0aGUgZXJyb3IgbG9jYXRpb24gcG9seW5vbWlhbCBmcm9tIGEgc2V0IG9mIGVxdWF0aW9ucworCSAqICAgICBkZXJpdmVkIGZyb20gdGhlIHN5bmRyb21lLAorCSAqIDMuIFVzZSB0aGUgZXJyb3IgbG9jYXRpb24gcG9seW5vbWlhbCB0byBpZGVudGlmeSBlcnJhbnRzIGJpdHMsCisJICoKKwkgKiBBbmQgY29ycmVjdHRpb24gZG9uZSBieSBiaXQgZmxpcHMgdXNpbmcgZXJyb3IgbG9jYWl0b24gYW5kIGV4cGVjdGVkCisJICogdG8gYmUgb3V0c2VpZGUgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKwkgKi8KKwlzeW5kcm9tZShzZWxlY3RfNF84LCBlY2MsIHN5bik7CisJbm9fb2ZfZXJyID0gYmVybGVrYW1wKHNlbGVjdF80XzgsIHN5biwgZXJyX3BvbHkpOworCWlmIChub19vZl9lcnIgPD0gKDQgPDwgc2VsZWN0XzRfOCkpCisJCW5vX29mX2VyciA9IGNoaWVuKHNlbGVjdF80XzgsIG5vX29mX2VyciwgZXJyX3BvbHksIGVycl9sb2MpOworCisJcmV0dXJuIG5vX29mX2VycjsKK30KK0VYUE9SVF9TWU1CT0woZGVjb2RlX2JjaCk7CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvcHJpbnRmLmMgYi94LWxvYWRlci9saWIvcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9wcmludGYuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZmlsZToKKyAqICBsaW51eC9saWIvdnNwcmludGYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyogdnNwcmludGYuYyAtLSBMYXJzIFdpcnplbml1cyAmIExpbnVzIFRvcnZhbGRzLiAqLworLyoKKyAqIFdpcnplbml1cyB3cm90ZSB0aGlzIHBvcnRhYmx5LCBUb3J2YWxkcyBmdWNrZWQgaXQgdXAgOi0pCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX1BSSU5URgorIAorLyogd2UgdXNlIHRoaXMgc28gdGhhdCB3ZSBjYW4gZG8gd2l0aG91dCB0aGUgY3R5cGUgbGlicmFyeSAqLworI2RlZmluZSBpc19kaWdpdChjKQkoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICogcywgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnNjOworCisJZm9yIChzYyA9IHM7IGNvdW50LS0gJiYgKnNjICE9ICdcMCc7ICsrc2MpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIHNjIC0gczsKK30KKworc3RhdGljIGludCBza2lwX2F0b2koY29uc3QgY2hhciAqKnMpCit7CisJaW50IGk9MDsKKworCXdoaWxlIChpc19kaWdpdCgqKnMpKQorCQlpID0gaSoxMCArICooKCpzKSsrKSAtICcwJzsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBaRVJPUEFECTEJCS8qIHBhZCB3aXRoIHplcm8gKi8KKyNkZWZpbmUgU0lHTgkyCQkvKiB1bnNpZ25lZC9zaWduZWQgbG9uZyAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIExFRlQJMTYJCS8qIGxlZnQganVzdGlmaWVkICovCisjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCisjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLworCisjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKK2ludCBfX3JlczsgXAorX19yZXMgPSAoKHVuc2lnbmVkIGxvbmcpIG4pICUgKHVuc2lnbmVkKSBiYXNlOyBcCituID0gKCh1bnNpZ25lZCBsb25nKSBuKSAvICh1bnNpZ25lZCkgYmFzZTsgXAorX19yZXM7IH0pCisKK3N0YXRpYyBjaGFyICogbnVtYmVyKGNoYXIgKiBzdHIsIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24KKwksaW50IHR5cGUpCit7CisJY2hhciBjLHNpZ24sdG1wWzY2XTsKKwljb25zdCBjaGFyICpkaWdpdHM9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisJaW50IGk7CisKKwlpZiAodHlwZSAmIExBUkdFKQorCQlkaWdpdHMgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKwlpZiAodHlwZSAmIExFRlQpCisJCXR5cGUgJj0gflpFUk9QQUQ7CisJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKKwkJcmV0dXJuIDA7CisJYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJc2lnbiA9IDA7CisJaWYgKHR5cGUgJiBTSUdOKSB7CisJCWlmIChudW0gPCAwKSB7CisJCQlzaWduID0gJy0nOworCQkJbnVtID0gLW51bTsKKwkJCXNpemUtLTsKKwkJfSBlbHNlIGlmICh0eXBlICYgUExVUykgeworCQkJc2lnbiA9ICcrJzsKKwkJCXNpemUtLTsKKwkJfSBlbHNlIGlmICh0eXBlICYgU1BBQ0UpIHsKKwkJCXNpZ24gPSAnICc7CisJCQlzaXplLS07CisJCX0KKwl9CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlID09IDE2KQorCQkJc2l6ZSAtPSAyOworCQllbHNlIGlmIChiYXNlID09IDgpCisJCQlzaXplLS07CisJfQorCWkgPSAwOworCWlmIChudW0gPT0gMCkKKwkJdG1wW2krK109JzAnOworCWVsc2Ugd2hpbGUgKG51bSAhPSAwKQorCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLGJhc2UpXTsKKwlpZiAoaSA+IHByZWNpc2lvbikKKwkJcHJlY2lzaW9uID0gaTsKKwlzaXplIC09IHByZWNpc2lvbjsKKwlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkKKwkJd2hpbGUoc2l6ZS0tPjApCisJCQkqc3RyKysgPSAnICc7CisJaWYgKHNpZ24pCisJCSpzdHIrKyA9IHNpZ247CisJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJCWlmIChiYXNlPT04KQorCQkJKnN0cisrID0gJzAnOworCQllbHNlIGlmIChiYXNlPT0xNikgeworCQkJKnN0cisrID0gJzAnOworCQkJKnN0cisrID0gZGlnaXRzWzMzXTsKKwkJfQorCX0KKwlpZiAoISh0eXBlICYgTEVGVCkpCisJCXdoaWxlIChzaXplLS0gPiAwKQorCQkJKnN0cisrID0gYzsKKwl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKQorCQkqc3RyKysgPSAnMCc7CisJd2hpbGUgKGktLSA+IDApCisJCSpzdHIrKyA9IHRtcFtpXTsKKwl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJKnN0cisrID0gJyAnOworCXJldHVybiBzdHI7Cit9CisKKyAKK3N0YXRpYyBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgbnVtOworCWludCBpLCBiYXNlOworCWNoYXIgKiBzdHI7CisJY29uc3QgY2hhciAqczsKKworCWludCBmbGFnczsJCS8qIGZsYWdzIHRvIG51bWJlcigpICovCisKKwlpbnQgZmllbGRfd2lkdGg7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworCWludCBwcmVjaXNpb247CQkvKiBtaW4uICMgb2YgZGlnaXRzIGZvciBpbnRlZ2VyczsgbWF4CisJCQkJICAgbnVtYmVyIG9mIGNoYXJzIGZvciBmcm9tIHN0cmluZyAqLworCWludCBxdWFsaWZpZXI7CQkvKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcyAqLworCisJZm9yIChzdHI9YnVmIDsgKmZtdCA7ICsrZm10KSB7CisJCWlmICgqZm10ICE9ICclJykgeworCQkJKnN0cisrID0gKmZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcHJvY2VzcyBmbGFncyAqLworCQlmbGFncyA9IDA7CisJCXJlcGVhdDoKKwkJCSsrZm10OwkJLyogdGhpcyBhbHNvIHNraXBzIGZpcnN0ICclJyAqLworCQkJc3dpdGNoICgqZm10KSB7CisJCQkJY2FzZSAnLSc6IGZsYWdzIHw9IExFRlQ7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJysnOiBmbGFncyB8PSBQTFVTOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcgJzogZmxhZ3MgfD0gU1BBQ0U7IGdvdG8gcmVwZWF0OworCQkJCWNhc2UgJyMnOiBmbGFncyB8PSBTUEVDSUFMOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcwJzogZmxhZ3MgfD0gWkVST1BBRDsgZ290byByZXBlYXQ7CisJCQkJfQorCisJCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCQlmaWVsZF93aWR0aCA9IC0xOworCQlpZiAoaXNfZGlnaXQoKmZtdCkpCisJCQlmaWVsZF93aWR0aCA9IHNraXBfYXRvaSgmZm10KTsKKwkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCSsrZm10OworCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJZmllbGRfd2lkdGggPSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChmaWVsZF93aWR0aCA8IDApIHsKKwkJCQlmaWVsZF93aWR0aCA9IC1maWVsZF93aWR0aDsKKwkJCQlmbGFncyB8PSBMRUZUOworCQkJfQorCQl9CisKKwkJLyogZ2V0IHRoZSBwcmVjaXNpb24gKi8KKwkJcHJlY2lzaW9uID0gLTE7CisJCWlmICgqZm10ID09ICcuJykgeworCQkJKytmbXQ7CisJCQlpZiAoaXNfZGlnaXQoKmZtdCkpCisJCQkJcHJlY2lzaW9uID0gc2tpcF9hdG9pKCZmbXQpOworCQkJZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCQkrK2ZtdDsKKwkJCQkvKiBpdCdzIHRoZSBuZXh0IGFyZ3VtZW50ICovCisJCQkJcHJlY2lzaW9uID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQl9CisJCQlpZiAocHJlY2lzaW9uIDwgMCkKKwkJCQlwcmVjaXNpb24gPSAwOworCQl9CisKKwkJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLworCQlxdWFsaWZpZXIgPSAtMTsKKwkJaWYgKCpmbXQgPT0gJ2gnIHx8ICpmbXQgPT0gJ2wnIHx8ICpmbXQgPT0gJ0wnKSB7CisJCQlxdWFsaWZpZXIgPSAqZm10OworCQkJKytmbXQ7CisJCX0KKworCQkvKiBkZWZhdWx0IGJhc2UgKi8KKwkJYmFzZSA9IDEwOworCisJCXN3aXRjaCAoKmZtdCkgeworCQljYXNlICdjJzoKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7CisJCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+IDApCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncyc6CisJCQlzID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisJCQlpZiAoIXMpCisJCQkJcyA9ICI8TlVMTD4iOworCisJCQlsZW4gPSBzdHJubGVuKHMsIHByZWNpc2lvbik7CisKKwkJCWlmICghKGZsYWdzICYgTEVGVCkpCisJCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJCQkqc3RyKysgPSAqcysrOworCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pCisJCQkJKnN0cisrID0gJyAnOworCQkJY29udGludWU7CisKKwkJY2FzZSAncCc6CisJCQlpZiAoZmllbGRfd2lkdGggPT0gLTEpIHsKKwkJCQlmaWVsZF93aWR0aCA9IDIqc2l6ZW9mKHZvaWQgKik7CisJCQkJZmxhZ3MgfD0gWkVST1BBRDsKKwkJCX0KKwkJCXN0ciA9IG51bWJlcihzdHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHZhX2FyZyhhcmdzLCB2b2lkICopLCAxNiwKKwkJCQlmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJCQljb250aW51ZTsKKworCisJCWNhc2UgJ24nOgorCQkJaWYgKHF1YWxpZmllciA9PSAnbCcpIHsKKwkJCQlsb25nICogaXAgPSB2YV9hcmcoYXJncywgbG9uZyAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50ICogaXAgPSB2YV9hcmcoYXJncywgaW50ICopOworCQkJCSppcCA9IChzdHIgLSBidWYpOworCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSAnJSc6CisJCQkqc3RyKysgPSAnJSc7CisJCQljb250aW51ZTsKKworCQkvKiBpbnRlZ2VyIG51bWJlciBmb3JtYXRzIC0gc2V0IHVwIHRoZSBmbGFncyBhbmQgImJyZWFrIiAqLworCQljYXNlICdvJzoKKwkJCWJhc2UgPSA4OworCQkJYnJlYWs7CisKKwkJY2FzZSAnWCc6CisJCQlmbGFncyB8PSBMQVJHRTsKKwkJY2FzZSAneCc6CisJCQliYXNlID0gMTY7CisJCQlicmVhazsKKworCQljYXNlICdkJzoKKwkJY2FzZSAnaSc6CisJCQlmbGFncyB8PSBTSUdOOworCQljYXNlICd1JzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqc3RyKysgPSAnJSc7CisJCQlpZiAoKmZtdCkKKwkJCQkqc3RyKysgPSAqZm10OworCQkJZWxzZQorCQkJCS0tZm10OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHF1YWxpZmllciA9PSAnbCcpCisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisJCWVsc2UgaWYgKHF1YWxpZmllciA9PSAnaCcpIHsKKwkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaG9ydCkgbnVtOworCQl9IGVsc2UgaWYgKGZsYWdzICYgU0lHTikKKwkJCW51bSA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQllbHNlCisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKwkJc3RyID0gbnVtYmVyKHN0ciwgbnVtLCBiYXNlLCBmaWVsZF93aWR0aCwgcHJlY2lzaW9uLCBmbGFncyk7CisJfQorCSpzdHIgPSAnXDAnOworCXJldHVybiBzdHItYnVmOworfQorCit2b2lkIHNlcmlhbF9wcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwl1aW50IGk7CisJY2hhciBwcmludGJ1ZmZlcltDRkdfUEJTSVpFXTsKKworCXZhX3N0YXJ0IChhcmdzLCBmbXQpOworCisJLyogRm9yIHRoaXMgdG8gd29yaywgcHJpbnRidWZmZXIgbXVzdCBiZSBsYXJnZXIgdGhhbgorCSAqIGFueXRoaW5nIHdlIGV2ZXIgd2FudCB0byBwcmludC4KKwkgKi8KKwlpID0gdnNwcmludGYgKHByaW50YnVmZmVyLCBmbXQsIGFyZ3MpOworCXZhX2VuZCAoYXJncyk7CisKKwkvKiBQcmludCB0aGUgc3RyaW5nICovCisJc2VyaWFsX3B1dHMgKHByaW50YnVmZmVyKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL3N0cmluZy5jIGIveC1sb2FkZXIvbGliL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDg2NzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvc3RyaW5nLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBsaW51eC9saWIvc3RyaW5nLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBzdHVwaWQgbGlicmFyeSByb3V0aW5lcy4uIFRoZSBvcHRpbWl6ZWQgdmVyc2lvbnMgc2hvdWxkIGdlbmVyYWxseSBiZSBmb3VuZAorICogYXMgaW5saW5lIGNvZGUgaW4gPGFzbS14eC9zdHJpbmcuaD4KKyAqCisgKiBUaGVzZSBhcmUgYnVnZ3kgYXMgd2VsbC4uCisgKgorICogKiBGcmkgSnVuIDI1IDE5OTksIEluZ28gT2VzZXIgPGlvZUBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgorICogLSAgQWRkZWQgc3Ryc2VwKCkgd2hpY2ggd2lsbCByZXBsYWNlIHN0cnRvaygpIHNvb24gKGJlY2F1c2Ugc3Ryc2VwKCkgaXMKKyAqICAgIHJlZW50cmFudCBhbmQgc2hvdWxkIGJlIGZhc3RlcikuIFVzZSBvbmx5IHN0cnNlcCgpIGluIG5ldyBjb2RlLCBwbGVhc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTU1PVkUKKy8qKgorICogbWVtbW92ZSAtIENvcHkgb25lIGFyZWEgb2YgbWVtb3J5IHRvIGFub3RoZXIKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRvCisgKiBAc3JjOiBXaGVyZSB0byBjb3B5IGZyb20KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogVW5saWtlIG1lbWNweSgpLCBtZW1tb3ZlKCkgY29wZXMgd2l0aCBvdmVybGFwcGluZyBhcmVhcy4KKyAqLwordm9pZCAqIG1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICp0bXAsICpzOworCisJaWYgKGRlc3QgPD0gc3JjKSB7CisJCXRtcCA9IChjaGFyICopIGRlc3Q7CisJCXMgPSAoY2hhciAqKSBzcmM7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKnRtcCsrID0gKnMrKzsKKwkJfQorCWVsc2UgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0ICsgY291bnQ7CisJCXMgPSAoY2hhciAqKSBzcmMgKyBjb3VudDsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqLS10bXAgPSAqLS1zOworCQl9CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbWtjb25maWcgYi94LWxvYWRlci9ta2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTVhNjhjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbWtjb25maWcKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaCAtZQorCisjIFNjcmlwdCB0byBjcmVhdGUgaGVhZGVyIGZpbGVzIGFuZCBsaW5rcyB0byBjb25maWd1cmUKKyMgWC1Mb2FkZXIgZm9yIGEgc3BlY2lmaWMgYm9hcmQuCisjCisjIFBhcmFtZXRlcnM6ICBUYXJnZXQgIEFyY2hpdGVjdHVyZSAgQ1BVICBCb2FyZCBbVkVORE9SXSBbU09DXQorIworIyAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworIyAoQykgMjAwMi0yMDA2IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisjCisKK0FQUEVORD1ubwkjIERlZmF1bHQ6IENyZWF0ZSBuZXcgY29uZmlnIGZpbGUKK0JPQVJEX05BTUU9IiIJIyBOYW1lIHRvIHByaW50IGluIG1ha2Ugb3V0cHV0CitUQVJHRVRTPSIiCisKK2FyY2g9IiIKK2NwdT0iIgorYm9hcmQ9IiIKK3ZlbmRvcj0iIgorc29jPSIiCisKK2lmIFsgXCggJCMgLWVxIDIgXCkgLWEgXCggIiQxIiA9ICItQSIgXCkgXSA7IHRoZW4KKwkjIEF1dG9tYXRpYyBtb2RlCisJbGluZT1gZWdyZXAgLWkgIl5bWzpzcGFjZTpdXSokezJ9W1s6c3BhY2U6XV0iIGJvYXJkcy5jZmdgIHx8IHsKKwkJZWNobyAibWFrZTogKioqIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgXGAkMl9jb25maWcnLiAgU3RvcC4iID4mMgorCQlleGl0IDEKKwl9CisKKwlzZXQgJHtsaW5lfQorCSMgYWRkIGRlZmF1bHQgYm9hcmQgbmFtZSBpZiBuZWVkZWQKKwlbICQjID0gMyBdICYmIHNldCAke2xpbmV9ICR7MX0KK2ZpCisKK3doaWxlIFsgJCMgLWd0IDAgXSA7IGRvCisJY2FzZSAiJDEiIGluCisJLS0pIHNoaWZ0IDsgYnJlYWsgOzsKKwktYSkgc2hpZnQgOyBBUFBFTkQ9eWVzIDs7CisJLW4pIHNoaWZ0IDsgQk9BUkRfTkFNRT0iJHsxJV9jb25maWd9IiA7IHNoaWZ0IDs7CisJLXQpIHNoaWZ0IDsgVEFSR0VUUz0iYGVjaG8gJDEgfCBzZWQgJ3M6XzogOmcnYCAke1RBUkdFVFN9IiA7IHNoaWZ0IDs7CisJKikgIGJyZWFrIDs7CisJZXNhYworZG9uZQorCitbICQjIC1sdCA0IF0gJiYgZXhpdCAxCitbICQjIC1ndCA2IF0gJiYgZXhpdCAxCisKK0NPTkZJR19OQU1FPSIkezElX2NvbmZpZ30iCisKK1sgIiR7Qk9BUkRfTkFNRX0iIF0gfHwgQk9BUkRfTkFNRT0iJHtDT05GSUdfTkFNRX0iCisKK2FyY2g9IiQyIgorY3B1PSIkMyIKK2lmIFsgIiQ0IiA9ICItIiBdIDsgdGhlbgorCWJvYXJkPSR7Qk9BUkRfTkFNRX0KK2Vsc2UKKwlib2FyZD0iJDQiCitmaQorWyAkIyAtZ3QgNCBdICYmIFsgIiQ1IiAhPSAiLSIgXSAmJiB2ZW5kb3I9IiQ1IgorWyAkIyAtZ3QgNSBdICYmIFsgIiQ2IiAhPSAiLSIgXSAmJiBzb2M9IiQ2IgorCitpZiBbICIke0FSQ0h9IiAtYSAiJHtBUkNIfSIgIT0gIiR7YXJjaH0iIF07IHRoZW4KKwllY2hvICJGYWlsZWQ6IFwkQVJDSD0ke0FSQ0h9LCBzaG91bGQgYmUgJyR7YXJjaH0nIGZvciAke0JPQVJEX05BTUV9IiAxPiYyCisJZXhpdCAxCitmaQorCitlY2hvICJDb25maWd1cmluZyBmb3IgJHtCT0FSRF9OQU1FfSBib2FyZC4uLiIKKworIworIyBDcmVhdGUgbGluayB0byBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgaGVhZGVycworIworaWYgWyAiJFNSQ1RSRUUiICE9ICIkT0JKVFJFRSIgXSA7IHRoZW4KKwlta2RpciAtcCAke09CSlRSRUV9L2luY2x1ZGUKKwlta2RpciAtcCAke09CSlRSRUV9L2luY2x1ZGUyCisJY2QgJHtPQkpUUkVFfS9pbmNsdWRlMgorCXJtIC1mIGFzbQorCWxuIC1zICR7U1JDVFJFRX0vaW5jbHVkZS9hc20gYXNtCisJTE5QUkVGSVg9JHtTUkNUUkVFfS9pbmNsdWRlL2FzbS8KKwljZCAuLi9pbmNsdWRlCisJcm0gLWYgYXNtCisJbG4gLXMgJHtTUkNUUkVFfS9pbmNsdWRlL2FzbSBhc20KK2Vsc2UKKwljZCAuL2luY2x1ZGUKK2ZpCisKK3JtIC1mIGFzbS9hcmNoCisKK2lmIFsgLXogIiR7c29jfSIgXSA7IHRoZW4KKwlsbiAtcyAke0xOUFJFRklYfWFyY2gtJHtjcHV9IGFzbS9hcmNoCitlbHNlCisJbG4gLXMgJHtMTlBSRUZJWH1hcmNoLSR7c29jfSBhc20vYXJjaAorZmkKKworaWYgWyAiJHthcmNofSIgPSAiYXJtIiBdIDsgdGhlbgorCXJtIC1mIGFzbS9wcm9jCisJbG4gLXMgJHtMTlBSRUZJWH1wcm9jLWFybXYgYXNtL3Byb2MKK2ZpCisKKyMKKyMgQ3JlYXRlIGluY2x1ZGUgZmlsZSBmb3IgTWFrZQorIworZWNobyAiQVJDSCAgID0gJHthcmNofSIgID4gIGNvbmZpZy5taworZWNobyAiQ1BVICAgID0gJHtjcHV9IiAgID4+IGNvbmZpZy5taworZWNobyAiQk9BUkQgID0gJHtib2FyZH0iID4+IGNvbmZpZy5taworCitbICIke3ZlbmRvcn0iIF0gJiYgZWNobyAiVkVORE9SID0gJHt2ZW5kb3J9IiA+PiBjb25maWcubWsKKworWyAiJHtzb2N9IiAgICBdICYmIGVjaG8gIlNPQyAgICA9ICR7c29jfSIgICAgPj4gY29uZmlnLm1rCisKKyMgQXNzaWduIGJvYXJkIGRpcmVjdG9yeSB0byBCT0FSRElSIHZhcmlhYmxlCitpZiBbIC16ICIke3ZlbmRvcn0iIF0gOyB0aGVuCisgICAgQk9BUkRESVI9JHtib2FyZH0KK2Vsc2UKKyAgICBCT0FSRERJUj0ke3ZlbmRvcn0vJHtib2FyZH0KK2ZpCisKKyMKKyMgQ3JlYXRlIGJvYXJkIHNwZWNpZmljIGhlYWRlciBmaWxlCisjCitpZiBbICIkQVBQRU5EIiA9ICJ5ZXMiIF0JIyBBcHBlbmQgdG8gZXhpc3RpbmcgY29uZmlnIGZpbGUKK3RoZW4KKwllY2hvID4+IGNvbmZpZy5oCitlbHNlCisJPiBjb25maWcuaAkJIyBDcmVhdGUgbmV3IGNvbmZpZyBmaWxlCitmaQorZWNobyAiLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgLSBkbyBub3QgZWRpdCAqLyIgPj5jb25maWcuaAorCitmb3IgaSBpbiAke1RBUkdFVFN9IDsgZG8KKwllY2hvICIjZGVmaW5lIENPTkZJR19NS18ke2l9IDEiID4+Y29uZmlnLmggOworZG9uZQorCitjYXQgPDwgRU9GID4+IGNvbmZpZy5oCisjZGVmaW5lIENPTkZJR19CT0FSRERJUiBib2FyZC8kQk9BUkRESVIKKyNpbmNsdWRlIDxjb25maWdfZGVmYXVsdHMuaD4KKyNpbmNsdWRlIDxjb25maWdzLyR7Q09ORklHX05BTUV9Lmg+CisjaW5jbHVkZSA8YXNtL2NvbmZpZy5oPgorRU9GCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvcnVsZXMubWsgYi94LWxvYWRlci9ydWxlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY3MGFjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvcnVsZXMubWsKQEAgLTAsMCArMSw0NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitfZGVwZW5kOgkkKG9iaikuZGVwZW5kCisKKyQob2JqKS5kZXBlbmQ6CSQoc3JjKU1ha2VmaWxlICQoVE9QRElSKS9jb25maWcubWsgJChTUkNTKSAkKEhPU1RTUkNTKQorCQlAcm0gLWYgJEAKKwkJQGZvciBmIGluICQoU1JDUyk7IGRvIFwKKwkJCWc9YGJhc2VuYW1lICQkZiB8IHNlZCAtZSAncy9cKC4qXClcLlx3L1wxLm8vJ2A7IFwKKwkJCSQoQ0MpIC1NICQoQ1BQRkxBR1MpIC1NUSAkKG9iaikkJGcgJCRmID4+ICRAIDsgXAorCQlkb25lCisJCUBmb3IgZiBpbiAkKEhPU1RTUkNTKTsgZG8gXAorCQkJZz1gYmFzZW5hbWUgJCRmIHwgc2VkIC1lICdzL1woLipcKVwuXHcvXDEuby8nYDsgXAorCQkJJChIT1NUQ0MpIC1NICQoSE9TVENQUEZMQUdTKSAtTVEgJChvYmopJCRnICQkZiA+PiAkQCA7IFwKKwkJZG9uZQorCiskKEhPU1RPQkpTKTogJChvYmopJS5vOiAlLmMKKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSAkKEhPU1RDRkxBR1NfJChARikpICQoSE9TVENGTEFHU18kKEJDVVJESVIpKSAtbyAkQCAkPCAtYworJChOT1BFRE9CSlMpOiAkKG9iaiklLm86ICUuYworCSQoSE9TVENDKSAkKEhPU1RDRkxBR1NfTk9QRUQpICQoSE9TVENGTEFHU18kKEBGKSkgJChIT1NUQ0ZMQUdTXyQoQkNVUkRJUikpIC1vICRAICQ8IC1jCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoIGIveC1sb2FkZXIvc2NyaXB0cy9ta29uZWJvb3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4NjJhNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorCitJTUFHRTE9eC1sb2FkLmJpbi5pZnQKK0lNQUdFMj14LWxvYWQtc2lnbmVkLmlmdAorVE1QPW9uZWxvYWRlcgorUEFHRVNJWkU9MjA0OAorCitzaXplPWBscyAtbGEgJElNQUdFMSB8IGF3ayAtRicgJyAneyBwcmludGYgJDV9J2AKK2xldCByZW1haW49JFBBR0VTSVpFLSRzaXplCitkZCBpZj0vZGV2L3plcm8gb2Y9JElNQUdFMiBicz0xIGNvdW50PTUxMgorI2RkIGlmPS9kZXYvemVybyBvZj16ZXJvZmlsZSBicz0kcmVtYWluIGNvdW50PTEgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsCitjYXQgJElNQUdFMT4+JElNQUdFMgorCitybSAtZiAkSU1BR0UxCisKK2VjaG8gIkNyZWF0ZSAkSU1BR0UyIGNvbXBsZXRlZC4uLiIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlIGIveC1sb2FkZXIvdG9vbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NWIyYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVE9PTFNVQkRJUlMgPQorCisjCisjIHRvb2xjaGFpbnMgdGFyZ2V0aW5nIHdpbjMyIGdlbmVyYXRlIC5leGUgZmlsZXMKKyMKK2lmbmVxICgsJChmaW5kc3RyaW5nIFdJTjMyICwkKHNoZWxsICQoSE9TVENDKSAtRSAtZE0gLXhjIC9kZXYvbnVsbCkpKQorU0ZYID0gLmV4ZQorZWxzZQorU0ZYID0KK2VuZGlmCisKKyMKKyMgSW5jbHVkZSB0aGlzIGFmdGVyIEhPU1RPUyBIT1NUQVJDSCBjaGVjaworIyBzbyB0aGF0IHdlIGNhbiBhY3QgaW50ZWxsaWdlbnRseS4KKyMKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCisjIEdlbmVyYXRlZCBleGVjdXRhYmxlIGZpbGVzCitCSU5fRklMRVMteSArPSBzaWduR1AkKFNGWCkKK09CSl9GSUxFUy15ICs9IHNpZ25HUC5vCisKKyMgbm93ICQob2JqKSBpcyBkZWZpbmVkCitIT1NUU1JDUyArPSAkKGFkZHByZWZpeCAkKFNSQ1RSRUUpL3Rvb2xzLywkKE9CSl9GSUxFUy15Oi5vPS5jKSkKK0JJTlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoc29ydCAkKEJJTl9GSUxFUy15KSkpCitIT1NUT0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChPQkpfRklMRVMteSkpCitOT1BFRE9CSlMgOj0gJChhZGRwcmVmaXggJChvYmopLCQoTk9QRURfT0JKX0ZJTEVTLXkpKQorCisjCisjIFVzZSBuYXRpdmUgdG9vbHMgYW5kIG9wdGlvbnMKKyMgRGVmaW5lIF9fS0VSTkVMX1NUUklDVF9OQU1FUyB0byBwcmV2ZW50IHR5cGVkZWYgb3ZlcmxhcHMKKyMKK0hPU1RDUFBGTEFHUyA9CS1pZGlyYWZ0ZXIgJChTUkNUUkVFKS9pbmNsdWRlIFwKKwkJLWlkaXJhZnRlciAkKE9CSlRSRUUpL2luY2x1ZGUyIFwKKwkJLWlkaXJhZnRlciAkKE9CSlRSRUUpL2luY2x1ZGUgXAorCSAgICAgICAgLUkgJChTUkNUUkVFKS9saWIvbGliZmR0IFwKKwkJLUkgJChTUkNUUkVFKS90b29scyBcCisJCS1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKSAtRFVTRV9IT1NUQ0MgXAorCQktRF9fS0VSTkVMX1NUUklDVF9OQU1FUworCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKEJJTlMpICQoTE9HTy15KSBzdWJkaXJzCisKKyQob2JqKXNpZ25HUCQoU0ZYKToJJChvYmopc2lnbkdQLm8KKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTKSAkKEhPU1RMREZMQUdTKSAtbyAkQCAkXgorCSQoSE9TVFNUUklQKSAkQAorCitzdWJkaXJzOgoraWZlcSAoJChUT09MU1VCRElSUyksKQorCUA6CitlbHNlCisJQGZvciBkaXIgaW4gJChUT09MU1VCRElSUykgOyBkbyBcCisJICAgICQoTUFLRSkgXAorCQlIT1NUT1M9JChIT1NUT1MpIFwKKwkJSE9TVEFSQ0g9JChIT1NUQVJDSCkgXAorCQktQyAkJGRpciB8fCBleGl0IDEgOyBcCisJZG9uZQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbiBiL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTFmNTRmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvdG9vbHMvc2V0bG9jYWx2ZXJzaW9uCkBAIC0wLDAgKzEsNDAgQEAKKyMhL2Jpbi9zaAorIyBQcmludCBhZGRpdGlvbmFsIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIG5vbi1yZWxlYXNlIHRyZWVzLgorCit1c2FnZSgpIHsKKwllY2hvICJVc2FnZTogJDAgW3NyY3RyZWVdIiA+JjIKKwlleGl0IDEKK30KKworY2QgIiR7MTotLn0iIHx8IHVzYWdlCisKKyMgQ2hlY2sgZm9yIGdpdCBhbmQgYSBnaXQgcmVwby4KK2lmIGhlYWQ9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbGA7IHRoZW4KKwkjIERvIHdlIGhhdmUgYW4gdW50YWdnZWQgdmVyc2lvbj8KKwlpZiBnaXQgbmFtZS1yZXYgLS10YWdzIEhFQUQgfCBcCisJICAgZ3JlcCAtRSAnXkhFQURbWzpzcGFjZTpdXSsoLip+WzAtOV0qfHVuZGVmaW5lZCkkJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAgICAgKGdpdCBkZXNjcmliZSB8fCBnaXQgZGVzY3JpYmUgLS10YWdzIHx8IGdpdCBkZXNjcmliZSAtLWFsbCAtLWxvbmcpIFwKKwkJCQkyPi9kZXYvbnVsbCB8IGF3ayAtRi0gJ3twcmludGYoIi0lMDVkLSVzIiwgJChORi0xKSwkKE5GKSl9JworCWZpCisKKwkjIEFyZSB0aGVyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzPworCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoIC0tdW5tZXJnZWQgPiAvZGV2L251bGwKKwlpZiBnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEIHwgZ3JlcCAtdiAiXnNjcmlwdHMvcGFja2FnZSIgXAorCSAgICB8IHJlYWQgZHVtbXk7IHRoZW4KKwkJcHJpbnRmICclcycgLWRpcnR5CisJZmkKKworCSMgSXMgdGhpcyBnaXQgb24gc3ZuPworCWlmIGdpdCBjb25maWcgLS1nZXQgc3ZuLXJlbW90ZS5zdm4udXJsID4vZGV2L251bGw7IHRoZW4KKwkJcHJpbnRmIC0tICctc3ZuJXMnICJgZ2l0IHN2biBmaW5kLXJldiAkaGVhZGAiCisJZmkKK2ZpCisKKyMgQ2hlY2sgZm9yIHN2biBhbmQgYSBzdm4gcmVwby4KK2lmIHJldj1gc3ZuIGluZm8gMj4vZGV2L251bGxgIDsgdGhlbgorCXJldj1gZWNobyAiJHtyZXZ9IiB8IGdyZXAgJ15SZXZpc2lvbicgfCBhd2sgJ3twcmludCAkTkZ9J2AKKwlwcmludGYgLS0gJy1zdm4lcycgJHJldgorZmkKKworIyBDaGVjayBmb3IgYW55IGxvY2FsdmVyc2lvbi0qIGZpbGVzCitwcmludGYgJyVzJyAiYGNhdCBsb2NhbHZlcnNpb24tKiAyPi9kZXYvbnVsbGAiCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9zaWduR1AuYyBiL3gtbG9hZGVyL3Rvb2xzL3NpZ25HUC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOGVkMDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci90b29scy9zaWduR1AuYwpAQCAtMCwwICsxLDczIEBACisvLworLy8gc2lnbkdQLmMKKy8vIFJlYWQgdGhlIHgtbG9hZC5iaW4gZmlsZSBhbmQgd3JpdGUgb3V0IHRoZSB4LWxvYWQuYmluLmlmdCBmaWxlLgorLy8gVGhlIHNpZ25lZCBpbWFnZSBpcyB0aGUgb3JpZ2luYWwgcHJlLXBlbmRlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBpbWFnZQorLy8gYW5kIHRoZSBsb2FkIGFkZHJlc3MuICBJZiBub3QgZW50ZXJlZCBvbiBjb21tYW5kIGxpbmUsIGZpbGUgbmFtZSBpcworLy8gYXNzdW1lZCB0byBiZSB4LWxvYWQuYmluIGluIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBsb2FkIGFkZHJlc3MgaXMKKy8vIDB4NDAyMDA4MDAuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworCittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50CWk7CisJY2hhcglpZm5hbWVbRklMRU5BTUVfTUFYXSwgb2ZuYW1lW0ZJTEVOQU1FX01BWF0sIGNoOworCUZJTEUJKmlmaWxlLCAqb2ZpbGU7CisJdW5zaWduZWQgbG9uZwlsb2FkYWRkciwgbGVuOworCXN0cnVjdCBzdGF0CXNpbmZvOworCisKKwkvLyBEZWZhdWx0IHRvIHgtbG9hZC5iaW4gYW5kIDB4NDAyMDA4MDAuCisJc3RyY3B5KGlmbmFtZSwgIngtbG9hZC5iaW4iKTsKKwlsb2FkYWRkciA9IDB4NDAyMDA4MDA7CisKKwlpZiAoKGFyZ2MgPT0gMikgfHwgKGFyZ2MgPT0gMykpCisJCXN0cmNweShpZm5hbWUsIGFyZ3ZbMV0pOworCisJaWYgKGFyZ2MgPT0gMykKKwkJbG9hZGFkZHIgPSBzdHJ0b2woYXJndlsyXSwgTlVMTCwgMTYpOworCisJLy8gRm9ybSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKwlzdHJjcHkob2ZuYW1lLCBpZm5hbWUpOworCXN0cmNhdChvZm5hbWUsICIuaWZ0Iik7CisKKwkvLyBPcGVuIHRoZSBpbnB1dCBmaWxlLgorCWlmaWxlID0gZm9wZW4oaWZuYW1lLCAicmIiKTsKKwlpZiAoaWZpbGUgPT0gTlVMTCkgeworCQlwcmludGYoIkNhbm5vdCBvcGVuICVzXG4iLCBpZm5hbWUpOworCQlleGl0KDApOworCX0KKworCS8vIEdldCBmaWxlIGxlbmd0aC4KKwlzdGF0KGlmbmFtZSwgJnNpbmZvKTsKKwlsZW4gPSBzaW5mby5zdF9zaXplOworCisJLy8gT3BlbiB0aGUgb3V0cHV0IGZpbGUgYW5kIHdyaXRlIGl0LgorCW9maWxlID0gZm9wZW4ob2ZuYW1lLCAid2IiKTsKKwlpZiAob2ZpbGUgPT0gTlVMTCkgeworCQlwcmludGYoIkNhbm5vdCBvcGVuICVzXG4iLCBvZm5hbWUpOworCQlmY2xvc2UoaWZpbGUpOworCQlleGl0KDApOworCX0KKworCS8vIFBhZCAxIHNlY3RvciBvZiB6ZXJvZXMuCisJLy9jaCA9IDB4MDA7CisJLy9mb3IgKGk9MDsgaTwweDIwMDsgaSsrKQorCS8vCWZ3cml0ZSgmY2gsIDEsIDEsIG9maWxlKTsKKworCWZ3cml0ZSgmbGVuLCAxLCA0LCBvZmlsZSk7CisJZndyaXRlKCZsb2FkYWRkciwgMSwgNCwgb2ZpbGUpOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWZyZWFkKCZjaCwgMSwgMSwgaWZpbGUpOworCQlmd3JpdGUoJmNoLCAxLCAxLCBvZmlsZSk7CisJfQorCisJZmNsb3NlKGlmaWxlKTsKKwlmY2xvc2Uob2ZpbGUpOworfQo=