ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1ZDE1MgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA2IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdCBMYWJzLiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0IExhYnMuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCisjICAgICAgbG9hZGVyIChJUEwpIGZvciBlbWJlZGRlZCBib2FyZHMgYmFzZWQgb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMgICAgICBPTUFQIHByb2Nlc3NvcnMuCisjCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlUm9vdAkJOj0gLgorCitQYWNrYWdlTmFtZQkJOj0geC1sb2FkZXIKKworUGFja2FnZVNlcGFyYXRvcgk6PSAKKworUGFja2FnZVZlcnNpb24JCTo9IAorUGFja2FnZVNvdXJjZURpcgk6PSAkKFBhY2thZ2VSb290KS8kKFBhY2thZ2VOYW1lKSQoUGFja2FnZVNlcGFyYXRvcikkKFBhY2thZ2VWZXJzaW9uKQorCitQYWNrYWdlQnVpbGRNYWtlZmlsZQk9ICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMsaW5jbHVkZS9jb25maWcubWspCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvUkVBRE1FOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL1JFQURNRQorCSQoRWNobykgIkV4dHJhY3RpbmcgXCIkKGNhbGwgR2VuZXJhdGVCdWlsZFJvb3RFbGxpcHNlZFBhdGgsJChAKSlcIiIKKwkkKFZlcmJvc2UpJChTRUQpIC1uIC1lICcxMCwyNXAnIDwgJDwgPiAkQAorCisjIFdlIGFyZSBidWlsZGluZyB0aGlzIHBhY2thZ2UgZnJvbSB2ZXJzaW9uLWNvbnRyb2xsZXIgc291cmNlLCBzbworIyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciB0aGlzIHRhcmdldCBnb2FsLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpOgorCisjIFByZXBhcmUgdGhlIHNvdXJjZXMuCisKKy5QSE9OWTogc291cmNlCitzb3VyY2U6IHwgJChQYWNrYWdlU291cmNlRGlyKQorCisjIFBhdGNoIHRoZSBzb3VyY2VzLCBpZiBuZWNlc3NhcnkuCisKKy5QSE9OWTogcGF0Y2gKK3BhdGNoOiBzb3VyY2UKKworIyBYLUxvYWRlciBoYXMgbm8gd2F5IG9mIGV4cGxpY2l0bHkgc2V0dGluZyBDQywgTEQsIE9CSkNPUFksIGV0IGFsIGFuZAorIyBpbnN0ZWFkIHJlbGllcyBvbiB0aGUgdmFsdWUgb2YgQ1JPU1NfQ09NUElMRS4gQ29uc2VxdWVudGx5LCB3ZSBoYXZlCisjIHRvIGVuc3VyZSB0aGF0ICdUb29sQmluRGlyJyBpcyBpbiAnUEFUSCcgc28gdGhhdCB0aGUga2VybmVsIGJ1aWxkCisjIGluZnJhc3RydWN0dXJlIGNhbiBmaW5kICQoQ1JPU1NfQ09NUElMRSlnY2MsICQoQ1JPU1NfQ09NUElMRSlsZCwgZXQgYWwuCisKK2NvbmZpZ3VyZSBidWlsZCBzdGFnZTogUEFUSCA6PSAkKFBBVEgpOiQoVG9vbEJpbkRpcikKK2NvbmZpZ3VyZSBidWlsZCBzdGFnZTogQ1JPU1NfQ09NUElMRSA6PSAkKENDQUNIRSkgJChDUk9TU19DT01QSUxFKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGJ1aWxkIG1ha2VmaWxlLgorCiskKFBhY2thZ2VCdWlsZE1ha2VmaWxlKTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCSQoWExvYWRlclByb2R1Y3Rpb25Db25maWcpCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCWFsbAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgWC1Mb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBhIG5vdGlvbiBvZiBpbnN0YWxsaW5nLCBzbyB3ZSBoYXZlIHRvCisjIGNoZXJyeS1waWNrIHRoZSBjb21wb25lbnRzIHdlIHdhbnQgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZAorIyBjb3B5L2luc3RhbGwgdGhlbSB0byB0aGUgcmVzdWx0cyBkaXJlY3RvcnkuCisKKy5QSE9OWTogc3RhZ2UKK3N0YWdlOiBjb3B5CisKKy5QSE9OWTogY29weQorJChjYWxsIEdlbmVyYXRlUmVzdWx0UGF0aHMsZncveC1sb2FkZXIseC1sb2FkLmJpbikgY29weTogYnVpbGQgfCAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY3AgLWYgJCh3aWxkY2FyZCAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLHgtbG9hZCopKSAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY3AgLWYgJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxTeXN0ZW0ubWFwKSAkKFJlc3VsdERpcmVjdG9yeSkKKworY2xlYW46CisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEveC1sb2FkZXIudmVyc2lvbiBiL3gtbG9hZGVyLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMDk1YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyLnZlcnNpb24KQEAgLTAsMCArMSBAQAorMS40Nl9PTUFQUFNQXzAzLjAwLjAxLjA2CmRpZmYgLS1naXQgYS94LWxvYWRlci8uZmlsZS1saXN0IGIveC1sb2FkZXIvLmZpbGUtbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQ1MDY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvLmZpbGUtbGlzdApAQCAtMCwwICsxLDExMSBAQAorLkBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC81CisuL1JFQURNRUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vYXJtX2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmRAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2JvYXJkL29tYXAxNzEwaDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDRAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDMwc2RwQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNworLi9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9jcHVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2NwdS9hcm0xMTM2QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTExMzYvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNworLi9jcHUvYXJtMTEzNi9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTExMzYvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2NwdS9hcm05MjZlanMvY3B1LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm05MjZlanMvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vY3B1L29tYXAzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL3N0YXJ0LlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2RyaXZlcnMvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2RyaXZlcnMvazlmNTYxNi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9kcml2ZXJzL2s5azEyMTYuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVycy9uczE2NTUwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2RyaXZlcnMvb25lbmFuZC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL29uZW5hbmRfcmVncy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL3NlcmlhbC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvYml0cy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0MnguaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQzeC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9tZW0uaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MjAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDMwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zaXplcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc3lzX2luZm8uaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzL3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvYml0cy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY2xvY2tzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MzNDN4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jcHUuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21lbS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbXV4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMzQzMC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2l6ZXMuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19pbmZvLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfcHJvdG8uaAorLi9pbmNsdWRlL2FzbS9hdG9taWMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vcHJvYy1hcm12QEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zZXR1cC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zaXplcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9zdHJpbmcuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20veC1sb2FkLWFybS5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2NvbW1vbi5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9pbmNsdWRlL2NvbmZpZ3NAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE3MTBoMy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNAorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MzBzZHAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzYKKy4vaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvY29uZmlnLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbGludXgvcG9zaXhfdHlwZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9zdGRkZWYuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL25zMTY1NTAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vbGliQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9saWIvTWFrZWZpbGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2xpYi9fdWRpdnNpMy5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvX3Vtb2RzaTMuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL2JvYXJkLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC84CisuL2xpYi9kaXYwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9lY2MuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL3ByaW50Zi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ta2NvbmZpZ0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vc2NyaXB0c0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vc2NyaXB0cy9ta29uZWJvb3Quc2hAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCmRpZmYgLS1naXQgYS94LWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDNkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDM4NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiwgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAxMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1ZFUlNJT04gPSAxCitQQVRDSExFVkVMID0gNDYKK1NVQkxFVkVMID0KK0VYVFJBVkVSU0lPTiA9CitpZm5lcSAiJChTVUJMRVZFTCkiICIiCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pCitlbHNlCitYX0xPQURFUl9WRVJTSU9OID0gJChWRVJTSU9OKS4kKFBBVENITEVWRUwpJChFWFRSQVZFUlNJT04pCitlbmRpZgorVElNRVNUQU1QX0ZJTEUgPSAkKG9iailpbmNsdWRlL3RpbWVzdGFtcF9hdXRvZ2VuZXJhdGVkLmgKK1ZFUlNJT05fRklMRSA9ICQob2JqKWluY2x1ZGUvdmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgKKworSE9TVEFSQ0ggOj0gJChzaGVsbCB1bmFtZSAtbSB8IFwKKwlzZWQgLWUgcy9pLjg2L2kzODYvIFwKKwkgICAgLWUgcy9zdW40dS9zcGFyYzY0LyBcCisJICAgIC1lIHMvYXJtLiovYXJtLyBcCisJICAgIC1lIHMvc2ExMTAvYXJtLyBcCisJICAgIC1lIHMvcHBjNjQvcG93ZXJwYy8gXAorCSAgICAtZSBzL3BwYy9wb3dlcnBjLyBcCisJICAgIC1lIHMvbWFjcHBjL3Bvd2VycGMvXAorCSAgICAtZSBzL3NoLiovc2gvKQorCitIT1NUT1MgOj0gJChzaGVsbCB1bmFtZSAtcyB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgXAorCSAgICBzZWQgLWUgJ3MvXChjeWd3aW5cKS4qL2N5Z3dpbi8nKQorCisjIFNldCBzaGVsbCB0byBiYXNoIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHNoCitTSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXAorCWVsc2UgaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlbiBlY2hvIC9iaW4vYmFzaDsgXAorCWVsc2UgZWNobyBzaDsgZmk7IGZpKQorCitleHBvcnQJSE9TVEFSQ0ggSE9TVE9TIFNIRUxMCisKKyMgRGVhbCB3aXRoIGNvbGxpZGluZyBkZWZpbml0aW9ucyBmcm9tIHRjc2ggZXRjLgorVkVORE9SPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFsbG93IGZvciBzaWxlbnQgYnVpbGRzCitpZmVxICgsJChmaW5kc3RyaW5nIHMsJChNQUtFRkxBR1MpKSkKK1hFQ0hPID0gZWNobworZWxzZQorWEVDSE8gPSA6CitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFgtbG9hZGVyIGJ1aWxkIHN1cHBvcnRzIHByb2R1Y2luZyBhIG9iamVjdCBmaWxlcyB0byB0aGUgc2VwYXJhdGUgZXh0ZXJuYWwKKyMgZGlyZWN0b3J5LiBUd28gdXNlIGNhc2VzIGFyZSBzdXBwb3J0ZWQ6CisjCisjIDEpIEFkZCBPPSB0byB0aGUgbWFrZSBjb21tYW5kIGxpbmUKKyMgJ21ha2UgTz0vdG1wL2J1aWxkIGFsbCcKKyMKKyMgMikgU2V0IGVudmlyb25lbWVudCB2YXJpYWJsZSBCVUlMRF9ESVIgdG8gcG9pbnQgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24KKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJ21ha2UnCisjCisjIFRoZSBzZWNvbmQgYXBwcm9hY2ggY2FuIGFsc28gYmUgdXNlZCB3aXRoIGEgTUFLRUFMTCBzY3JpcHQKKyMgJ2V4cG9ydCBCVUlMRF9ESVI9L3RtcC9idWlsZCcKKyMgJy4vTUFLRUFMTCcKKyMKKyMgQ29tbWFuZCBsaW5lICdPPScgc2V0dGluZyBvdmVycmlkZXMgQlVJTERfRElSIGVudmlyb25lbnQgdmFyaWFibGUuCisjCisjIFdoZW4gbm9uZSBvZiB0aGUgYWJvdmUgbWV0aG9kcyBpcyB1c2VkIHRoZSBsb2NhbCBidWlsZCBpcyBwZXJmb3JtZWQgYW5kCisjIHRoZSBvYmplY3QgZmlsZXMgYXJlIHBsYWNlZCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyMKKworaWZkZWYgTworaWZlcSAoIiQob3JpZ2luIE8pIiwgImNvbW1hbmQgbGluZSIpCitCVUlMRF9ESVIgOj0gJChPKQorZW5kaWYKK2VuZGlmCisKK2lmbmVxICgkKEJVSUxEX0RJUiksKQorc2F2ZWQtb3V0cHV0IDo9ICQoQlVJTERfRElSKQorCisjIEF0dGVtcHQgdG8gY3JlYXRlIGEgb3V0cHV0IGRpcmVjdG9yeS4KKyQoc2hlbGwgWyAtZCAke0JVSUxEX0RJUn0gXSB8fCBta2RpciAtcCAke0JVSUxEX0RJUn0pCisKKyMgVmVyaWZ5IGlmIGl0IHdhcyBzdWNjZXNzZnVsLgorQlVJTERfRElSIDo9ICQoc2hlbGwgY2QgJChCVUlMRF9ESVIpICYmIC9iaW4vcHdkKQorJChpZiAkKEJVSUxEX0RJUiksLCQoZXJyb3Igb3V0cHV0IGRpcmVjdG9yeSAiJChzYXZlZC1vdXRwdXQpIiBkb2VzIG5vdCBleGlzdCkpCitlbmRpZiAjIGlmbmVxICgkKEJVSUxEX0RJUiksKQorCitPQkpUUkVFCQk6PSAkKGlmICQoQlVJTERfRElSKSwkKEJVSUxEX0RJUiksJChDVVJESVIpKQorU1JDVFJFRQkJOj0gJChDVVJESVIpCitUT1BESVIJCTo9ICQoU1JDVFJFRSkKK0xORElSCQk6PSAkKE9CSlRSRUUpCitleHBvcnQJVE9QRElSIFNSQ1RSRUUgT0JKVFJFRQorCitNS0NPTkZJRwk6PSAkKFNSQ1RSRUUpL21rY29uZmlnCitleHBvcnQgTUtDT05GSUcKKworaWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK1JFTU9URV9CVUlMRAk6PSAxCitleHBvcnQgUkVNT1RFX0JVSUxECitlbmRpZgorCisjICQob2JqKSBhbmQgKHNyYykgYXJlIGRlZmluZWQgaW4gY29uZmlnLm1rIGJ1dCBoZXJlIGluIG1haW4gTWFrZWZpbGUKKyMgd2UgYWxzbyBuZWVkIHRoZW0gYmVmb3JlIGNvbmZpZy5tayBpcyBpbmNsdWRlZCB3aGljaCBpcyB0aGUgY2FzZSBmb3IKKyMgc29tZSB0YXJnZXRzIGxpa2UgdW5jb25maWcsIGNsZWFuLCBjbG9iYmVyLCBkaXN0Y2xlYW4sIGV0Yy4KK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitvYmogOj0gJChPQkpUUkVFKS8KK3NyYyA6PSAkKFNSQ1RSRUUpLworZWxzZQorb2JqIDo9CitzcmMgOj0KK2VuZGlmCitleHBvcnQgb2JqIHNyYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlICJ0b29scyIgYXJlIG5lZWRlZCBlYXJseSwgc28gcHV0IHRoaXMgZmlyc3QKKyMgRG9uJ3QgaW5jbHVkZSBzdHVmZiBhbHJlYWR5IGRvbmUgaW4gJChMSUJTKQorU1VCRElSUyA9IHRvb2xzCisuUEhPTlkgOiAkKFNVQkRJUlMpCisKK2lmZXEgKCQob2JqKWluY2x1ZGUvY29uZmlnLm1rLCQod2lsZGNhcmQgJChvYmopaW5jbHVkZS9jb25maWcubWspKQorCisjIEluY2x1ZGUgYXV0b2NvbmYubWsgYmVmb3JlIGNvbmZpZy5tayBzbyB0aGF0IHRoZSBjb25maWcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlCisjIHRvIGFsbCB0b3AgbGV2ZWwgYnVpbGQgZmlsZXMuICBXZSBuZWVkIHRoZSBkdW1teSBhbGw6IHRhcmdldCB0byBwcmV2ZW50IHRoZQorIyBkZXBlbmRlbmN5IHRhcmdldCBpbiBhdXRvY29uZi5tay5kZXAgZnJvbSBiZWluZyB0aGUgZGVmYXVsdC4KK2FsbDoKK3NpbmNsdWRlICQob2JqKWluY2x1ZGUvYXV0b2NvbmYubWsuZGVwCitzaW5jbHVkZSAkKG9iailpbmNsdWRlL2F1dG9jb25mLm1rCisKKyMgbG9hZCBBUkNILCBCT0FSRCwgYW5kIENQVSBjb25maWd1cmF0aW9uCitpbmNsdWRlICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCitleHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQworCisjIHNldCBkZWZhdWx0IHRvIG5vdGhpbmcgZm9yIG5hdGl2ZSBidWlsZHMKK2lmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCitDUk9TU19DT01QSUxFID89CitlbmRpZgorCisjIGxvYWQgb3RoZXIgY29uZmlndXJhdGlvbgoraW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgWC1Mb2FkIG9iamVjdHMuLi4ub3JkZXIgaXMgaW1wb3J0YW50IChpLmUuIHN0YXJ0IG11c3QgYmUgZmlyc3QpCisKK09CSlMgID0gJChDUFVESVIpL3N0YXJ0Lm8KKworT0JKUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChPQkpTKSkKKworTElCUyArPSAkKHNoZWxsIGlmIFsgLWYgYm9hcmQvJChWRU5ET1IpL2NvbW1vbi9NYWtlZmlsZSBdOyB0aGVuIGVjaG8gXAorCSJib2FyZC8kKFZFTkRPUikvY29tbW9uL2xpYiQoVkVORE9SKS5hIjsgZmkpCitMSUJTICs9ICQoQ1BVRElSKS9saWIkKENQVSkuYQorTElCUyArPSBsaWIvbGliJChBUkNIKS5hCitMSUJTICs9IGNvbW1vbi9saWJjb21tb24uYQorTElCUyArPSBmcy9mYXQvbGliZmF0LmEKK0xJQlMgKz0gZGlzay9saWJkaXNrLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvbmFuZC9saWJuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9tdGQvb25lbmFuZC9saWJvbmVuYW5kLmEKK0xJQlMgKz0gZHJpdmVycy9ydGMvbGlicnRjLmEKK0xJQlMgKz0gZHJpdmVycy9zZXJpYWwvbGlic2VyaWFsLmEKK0xJQlMgKz0gZHJpdmVycy91c2IvbGlidXNiLmEKKworTElCUyA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChMSUJTKSkKKy5QSE9OWSA6ICQoTElCUykgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisKK0xJQkJPQVJEID0gYm9hcmQvJChCT0FSRERJUikvbGliJChCT0FSRCkuYQorTElCQk9BUkQgOj0gJChhZGRwcmVmaXggJChvYmopLCQoTElCQk9BUkQpKQorCisjIEFkZCBHQ0MgbGliCitQTEFURk9STV9MSUJHQ0MgPSAtTCAkKHNoZWxsIGRpcm5hbWUgYCQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZWApIC1sZ2NjCitQTEFURk9STV9MSUJTICs9ICQoUExBVEZPUk1fTElCR0NDKQorZXhwb3J0IFBMQVRGT1JNX0xJQlMKKworX19PQkpTIDo9ICQoc3Vic3QgJChvYmopLCwkKE9CSlMpKQorX19MSUJTIDo9ICQoc3Vic3QgJChvYmopLCwkKExJQlMpKSAkKHN1YnN0ICQob2JqKSwsJChMSUJCT0FSRCkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBbHdheXMgYXBwZW5kIEFMTCBzbyB0aGF0IGFyY2ggY29uZmlnLm1rJ3MgY2FuIGFkZCBjdXN0b20gb25lcworQUxMICs9ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gJChvYmopeC1sb2FkLmJpbi5pZnQgJChvYmopU3lzdGVtLm1hcAorCithbGw6CQkkKEFMTCkKKworJChvYmopeC1sb2FkLmhleDoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGloZXggJDwgJEAKKworJChvYmopeC1sb2FkLnNyZWM6CSQob2JqKXgtbG9hZAorCQkkKE9CSkNPUFkpIC1PIHNyZWMgJDwgJEAKKworJChvYmopeC1sb2FkLmJpbjoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGJpbmFyeSAkPCAkQAorCiskKG9iail4LWxvYWQuYmluLmlmdDoJJChvYmopeC1sb2FkLmJpbgorCQkkKG9iail0b29scy9zaWduR1AgJDwKKworJChvYmopeC1sb2FkLmRpczoJJChvYmopeC1sb2FkCisJCSQoT0JKRFVNUCkgLWQgJDwgPiAkQAorCitHRU5fWExPQUQgPSBcCisJCVVOREVGX1NZTT1gJChPQkpEVU1QKSAteCAkKExJQkJPQVJEKSAkKExJQlMpIHwgXAorCQlzZWQgIC1uIC1lICdzLy4qXCgkKFNZTV9QUkVGSVgpX191X2Jvb3RfY21kXy4qXCkvLXVcMS9wJ3xzb3J0fHVuaXFgO1wKKwkJY2QgJChMTkRJUikgJiYgJChMRCkgJChMREZMQUdTKSAkJFVOREVGX1NZTSAkKF9fT0JKUykgXAorCQkJLS1zdGFydC1ncm91cCAkKF9fTElCUykgLS1lbmQtZ3JvdXAgJChQTEFURk9STV9MSUJTKSBcCisJCQktTWFwIHgtbG9hZC5tYXAgLW8geC1sb2FkCQorJChvYmopeC1sb2FkOglkZXBlbmQgJChTVUJESVJTKSAkKE9CSlMpICQoTElCQk9BUkQpICQoTElCUykgJChMRFNDUklQVCkgJChvYmopeC1sb2FkLmxkcworCQkkKEdFTl9YTE9BRCkKKworJChPQkpTKToJZGVwZW5kCisJCSQoTUFLRSkgLUMgJChDUFVESVIpICQoaWYgJChSRU1PVEVfQlVJTEQpLCRALCQobm90ZGlyICRAKSkKKworJChMSUJTKToJZGVwZW5kICQoU1VCRElSUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKExJQkJPQVJEKToJZGVwZW5kICQoTElCUykKKwkJJChNQUtFKSAtQyAkKGRpciAkKHN1YnN0ICQob2JqKSwsJEApKQorCiskKFNVQkRJUlMpOglkZXBlbmQKKwkJJChNQUtFKSAtQyAkQCBhbGwKKworJChMRFNDUklQVCk6CWRlcGVuZAorCQkkKE1BS0UpIC1DICQoZGlyICRAKSAkKG5vdGRpciAkQCkKKworJChvYmopeC1sb2FkLmxkczogJChMRFNDUklQVCkKKwkJJChDUFApICQoQ1BQRkxBR1MpICQoTERQUEZMQUdTKSAtYW5zaSAtRF9fQVNTRU1CTFlfXyAtUCAtIDwkXiA+JEAKKworJChvYmopb25lYm9vdDoJJChvYmopeC1sb2FkLmJpbgorCQlzY3JpcHRzL21rb25lYm9vdC5zaAorJChWRVJTSU9OX0ZJTEUpOgorCQlAKCBwcmludGYgJyNkZWZpbmUgWF9MT0FERVJfVkVSU0lPTiAiVGV4YXMgSW5zdHJ1bWVudHMgWC1Mb2FkZXIgJXMlcyJcbicgIiQoWF9MT0FERVJfVkVSU0lPTikiIFwKKwkJICckKHNoZWxsICQoVE9QRElSKS90b29scy9zZXRsb2NhbHZlcnNpb24gJChUT1BESVIpKScgKSA+ICRALnRtcAorCQlAY21wIC1zICRAICRALnRtcCAmJiBybSAtZiAkQC50bXAgfHwgbXYgLWYgJEAudG1wICRACisKKyQoVElNRVNUQU1QX0ZJTEUpOgorCQlATENfQUxMPUMgZGF0ZSArJyNkZWZpbmUgWF9MT0FERVJfREFURSAiJWIgJWQgJUMleSInID4gJEAKKwkJQExDX0FMTD1DIGRhdGUgKycjZGVmaW5lIFhfTE9BREVSX1RJTUUgIiVUIicgPj4gJEAKKworIyBFeHBsaWNpdGx5IG1ha2UgX2RlcGVuZCBpbiBzdWJkaXJzIGNvbnRhaW5pbmcgbXVsdGlwbGUgdGFyZ2V0cyB0byBwcmV2ZW50CisjIHBhcmFsbGVsIHN1Yi1tYWtlcyBjcmVhdGluZyAuZGVwZW5kIGZpbGVzIHNpbXVsdGFuZW91c2x5LgorZGVwZW5kIGRlcDoJJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisJCWZvciBkaXIgaW4gJChTVUJESVJTKSAkKENQVURJUikgJChkaXIgJChMRFNDUklQVCkpIDsgZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpciBfZGVwZW5kIDsgZG9uZQorCitUQUdfU1VCRElSUyA9ICQoU1VCRElSUykKK1RBR19TVUJESVJTICs9ICQoZGlyICQoX19MSUJTKSkKK1RBR19TVUJESVJTICs9IGluY2x1ZGUKKwordGFncyBjdGFnczoKKwkJY3RhZ3MgLXcgLW8gJChvYmopY3RhZ3MgYGZpbmQgJChUQUdfU1VCRElSUykgXAorCQkJCQkJLW5hbWUgJyouW2NoU10nIC1wcmludGAKKworZXRhZ3M6CisJCWV0YWdzIC1hIC1vICQob2JqKWV0YWdzIGBmaW5kICQoVEFHX1NVQkRJUlMpIFwKKwkJCQkJCS1uYW1lICcqLltjaFNdJyAtcHJpbnRgCitjc2NvcGU6CisJCWZpbmQgJChUQUdfU1VCRElSUykgLW5hbWUgJyouW2NoU10nIC1wcmludCA+IGNzY29wZS5maWxlcworCQljc2NvcGUgLWIgLXEgLWsKKworU1lTVEVNX01BUCA9IFwKKwkJJChOTSkgJDEgfCBcCisJCWdyZXAgLXYgJ1woY29tcGlsZWRcKVx8XChcLm8kJFwpXHxcKCBbYVV3XSBcKVx8XChcLlwubmckJFwpXHxcKExBU0hbUkxdRElcKScgfCBcCisJCUxDX0FMTD1DIHNvcnQKKyQob2JqKVN5c3RlbS5tYXA6CSQob2JqKXgtbG9hZAorCQlAJChjYWxsIFNZU1RFTV9NQVAsJDwpID4gJChvYmopU3lzdGVtLm1hcAorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZWxzZQkjICFjb25maWcubWsKK2FsbCAkKG9iail4LWxvYWQuaGV4ICQob2JqKXgtbG9hZC5zcmVjICQob2JqKXgtbG9hZC5iaW4gXAorJChvYmopeC1sb2FkLmRpcyAkKG9iail4LWxvYWQgXAorJChvYmopb25lYm9vdCBcCiskKGZpbHRlci1vdXQgdG9vbHMsJChTVUJESVJTKSkgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpIFwKK2RlcGVuZCBkZXAgdGFncyBjdGFncyBldGFncyBjc2NvcGUgJChvYmopU3lzdGVtLm1hcDoKKwlAZWNobyAiU3lzdGVtIG5vdCBjb25maWd1cmVkIC0gc2VlIFJFQURNRSIgPiYyCisJQCBleGl0IDEKKwordG9vbHM6CisJJChNQUtFKSAtQyB0b29scwordG9vbHMtYWxsOgorCSQoTUFLRSkgLUMgdG9vbHMgSE9TVF9UT09MU19BTEw9eQorZW5kaWYJIyBjb25maWcubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit1bmNvbmZpZzoKKwlAcm0gLWYgJChvYmopaW5jbHVkZS9jb25maWcuaCAkKG9iailpbmNsdWRlL2NvbmZpZy5taworCislX2NvbmZpZzo6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpIC1BICQoQDpfY29uZmlnPSkKKworIworIyBGdW5jdGlvbnMgdG8gZ2VuZXJhdGUgY29tbW9uIGJvYXJkIGRpcmVjdG9yeSBuYW1lcworIworbGNuYW1lCT0gJChzaGVsbCBlY2hvICQoMSkgfCBzZWQgLWUgJ3MvXCguKlwpX2NvbmZpZy9cTFwxLycpCit1Y25hbWUJPSAkKHNoZWxsIGVjaG8gJCgxKSB8IHNlZCAtZSAncy9cKC4qXClfY29uZmlnL1xVXDEvJykKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBBUk0KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9NQVAxIChBUk05MnhUKSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29tYXAxNzEwaDNfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIG9tYXAxNzEwaDMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgT01BUDIgKEFSTTExMzYpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb21hcDI0MjBoNF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm0xMTM2IG9tYXAyNDIwaDQKKworb21hcDI0MzBzZHBfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtMTEzNiBvbWFwMjQzMHNkcAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBPTUFQMyAoQVJNLUNvcnRleEE4KSBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitvbWFwMzQzMHNkcF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBvbWFwMyBvbWFwMzQzMHNkcAorCitvbWFwMzQzMGxhYnJhZG9yX2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIG9tYXAzNDMwbGFicmFkb3IKKworb21hcDNldm1fY29uZmlnIDoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgb21hcDNldm0KKworYW0zNTE3ZXZtX2NvbmZpZyA6ICAgICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIGFtMzUxN2V2bQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGVhbjoKKwlAcm0gLWYgJChvYmopdG9vbHMvc2lnbkdQCisJQHJtIC1mICQoVElNRVNUQU1QX0ZJTEUpICQoVkVSU0lPTl9GSUxFKQorCUBmaW5kICQoT0JKVFJFRSkgLXR5cGUgZiBcCisJCVwoIC1uYW1lICdjb3JlJyAtbyAtbmFtZSAnKi5iYWsnIC1vIC1uYW1lICcqficgXAorCQktbyAtbmFtZSAnKi5vJwktbyAtbmFtZSAnKi5hJyAtbyAtbmFtZSAnKi5leGUnCVwpIC1wcmludCBcCisJCXwgeGFyZ3Mgcm0gLWYKKworY2xvYmJlcjoJY2xlYW4KKwlAZmluZCAkKE9CSlRSRUUpIC10eXBlIGYgXCggLW5hbWUgLmRlcGVuZCBcCisJCS1vIC1uYW1lICcqLnNyZWMnIC1vIC1uYW1lICcqLmJpbicgLW8gLW5hbWUgJyouYmluLmlmdCcgXCkgXAorCQktcHJpbnQwIFwKKwkJfCB4YXJncyAtMCBybSAtZgorCUBybSAtZiAkKE9CSlMpICQob2JqKSouYmFrICQob2JqKWN0YWdzICQob2JqKWV0YWdzICQob2JqKVRBR1MgXAorCQkkKG9iailjc2NvcGUuKiAkKG9iaikqLip+CisJQHJtIC1mICQob2JqKXgtbG9hZCAkKG9iail4LWxvYWQubWFwICQob2JqKXgtbG9hZC5oZXggJChBTEwpCisJQHJtIC1mICQob2JqKWluY2x1ZGUvYXNtL3Byb2MgJChvYmopaW5jbHVkZS9hc20vYXJjaCAkKG9iailpbmNsdWRlL2FzbQorCitpZmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCittcnByb3BlciBcCitkaXN0Y2xlYW46CWNsb2JiZXIgdW5jb25maWcKK2Vsc2UKK21ycHJvcGVyIFwKK2Rpc3RjbGVhbjoJY2xvYmJlciB1bmNvbmZpZworCXJtIC1yZiAkKG9iaikqCitlbmRpZgorCitiYWNrdXA6CisJRj1gYmFzZW5hbWUgJChUT1BESVIpYCA7IGNkIC4uIDsgXAorCWd0YXIgLS1mb3JjZS1sb2NhbCAtemN2ZiBgTENfQUxMPUMgZGF0ZSAiKyQkRi0lWS0lbS0lZC0lVC50YXIuZ3oiYCAkJEYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvUkVBRE1FIGIveC1sb2FkZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjY2MmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9SRUFETUUKQEAgLTAsMCArMSwxNTIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU29tZSBjdXQvcGFzdGUgZnJvbSBVLUJvb3QgUkVBRE1FCisjIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDQKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitTdW1tYXJ5OgorPT09PT09PT0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCitsb2FkZXIgZm9yIEVtYmVkZGVkIGJvYXJkcyBiYXNlZCBvbiBPTUFQIHByb2Nlc3NvcnMuIFgtTG9hZGVyIGNhbiBiZQorc2lnbmVkIGJ5IFRleGFzIEluc3RydW1lbnRzIElGVCBhbmQgaW5zdGFsbGVkIHRvIE5hbmQgZmxhc2ggdG8gYWNoaWV2ZQorTmFuZCBib290aW5nLgorCisKK1N0YXR1czoKKz09PT09PT0KKworVGhlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEgzIGJvYXJkIChPTUFQMTcxMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChNYXkgMjAwNCkKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBINCBib2FyZCAoT01BUDI0MjApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoTm92IDIwMDQpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMjQzMFNEUCBib2FyZCAoT01BUDI0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoSnVsIDIwMDYpCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgMzQzMFNEUCBib2FyZCAoT01BUDM0MzApIGhhcyBiZWVuIGltcGxlbWVudGVkCithbmQgdGVzdGVkLiAoRGVjIDIwMDYpCisKKworU3VwcG9ydCBmb3Igb3RoZXIgT01BUCBib2FyZHMgY2FuIGJlIGFkZGVkLgorIAorICAKK0RpcmVjdG9yeSBIaWVyYXJjaHk6Cis9PT09PT09PT09PT09PT09PT09PQorCistIGJvYXJkCQlCb2FyZCBkZXBlbmRlbnQgZmlsZXMKKy0gY3B1CQlDUFUgc3BlY2lmaWMgZmlsZXMKKy0gZHJpdmVycwlDb21tb25seSB1c2VkIGRldmljZSBkcml2ZXJzCistIGxpYgkJTGlicmFyaWVzCisgCistIGNwdS9hcm05MjZlanMgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIDkyNiBDUFVzCistIGNwdS9hcm0xMTM2IEZpbGVzIHNwZWNpZmljIHRvIEFSTSAxMTM2IENQVXMKKy0gY3B1L29tYXAzIEZpbGVzIHNwZWNpZmljIHRvIEFSTSBDb3J0ZXhBOCBDUFUKKworIAorLSBib2FyZC9vbWFwMTcxMGgzCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMTcxMCBIMyBib2FyZHMKKy0gYm9hcmQvb21hcDI0MjBoNAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDI0MjAgSDQgYm9hcmRzCistIGJvYXJkL29tYXAyNDMwc2RwCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMjQzMCAyNDMwc2RwIGJvYXJkcworLSBib2FyZC9vbWFwMzQzMHNkcAorCQlGaWxlcyBzcGVjaWZpYyB0byBPTUFQIDM0MjBzZHAgYm9hcmRzCisKKyAKK1NvZnR3YXJlIENvbmZpZ3VyYXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitDb25maWd1cmF0aW9uIGlzIHVzdWFsbHkgZG9uZSB1c2luZyBDIHByZXByb2Nlc3NvciBkZWZpbmVzLiBDb25maWd1cmF0aW9uCitkZXBlbmRzIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBib2FyZCBhbmQgQ1BVIHR5cGU7IGFsbCBzdWNoIGluZm9ybWF0aW9uIGlzCitrZXB0IGluIGEgY29uZmlndXJhdGlvbiBmaWxlICJpbmNsdWRlL2NvbmZpZ3MvPGJvYXJkX25hbWU+LmgiLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUsIGFsbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGFyZSBpbgorImluY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgiLgorICAKK0ZvciBhbGwgc3VwcG9ydGVkIGJvYXJkcyB0aGVyZSBhcmUgcmVhZHktdG8tdXNlIGRlZmF1bHQKK2NvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZTsganVzdCB0eXBlICJtYWtlIDxib2FyZF9uYW1lPl9jb25maWciLgorCitFeGFtcGxlOiBGb3IgYSBIMyBtb2R1bGUgdHlwZToKKworCWNkIHgtbG9hZAorCW1ha2Ugb21hcDE3MTBoM19jb25maWcKKworQWZ0ZXIgYSBib2FyZCBoYXMgYmVlbiBjb25maWd1cmVkLCB0eXBlICJtYWtlIiB0byBidWlsZCBpdCBzdXBwb3NpbmcgdGhlCituZWVkZWQgY3Jvc3MgdG9vbHMgYXJlIGluIHlvdXIgcGF0aC4KKworIAorSW1hZ2UgRm9ybWF0OgorPT09PT09PT09PT09PQorCitYLUxvYWRlciBleHBlY3RzIE9TIGJvb3QgbG9hZGVyIChlLmcuIFUtQm9vdCkgaW4gTmFuZCBmbGFzaCB1c2luZworSkZGUzIgc3R5bGUgRUNDLiAKKworCitQcmVwYXJlIEJvb3RpbmcgTmFuZCBGbGFzaDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBZnRlciB5b3UgaGF2ZSBidWlsdCB4LWxvYWQuYmluIGZvciB5b3VyIGJvYXJkLCB5b3UgbmVlZCB0byBkbyB0aGUKK2ZvbGxvd2luZ3MgdG8gZ2V0IGl0IGludG8gTmFuZCBmbGFzaDoKKworMS4gVXNlIFRleGFzIEluc3RydW1lbnRzIElGVCB0byBzaWduIHgtbG9hZC5iaW4uIFRoaXMgcmVzdWx0cyBpbiBhCitzaWduZWQgaW1hZ2UgY2FsbGVkIHgtbG9hZC5iaW4uaWZ0LgorMi4gVXNlIFRleGFzIEluc3RydW1lbnRzIEZsYXNoUHJlcCB0byBnZW5lcmF0ZSBhIC5vdXQgZmlsZSB1c2luZworRmxhc2hXcml0ZXJOYW5kIGFuZCBzcGVjaWZ5aW5nIDAgYXMgbmFuZCB0YXJnZXQgYWRkcmVzcy4KKzMuIFVzZSBUZXhhcyBpbnN0cnVtbmV0cyBDb2RlIENvbXBvc2VyIFN0dWRpbyB0byBydW4gdGhlIC5vdXQgZmlsZSAKK3doaWNoIGZsYXNoZXMgeC1sb2FkLmJpbi5pZnQgdG8gTmFuZCBmbGFzaC4KKworTmV4dCB5b3UgbmVlZCB0byBnZXQgeW91ciBPUyBib290IGxvYWRlciB0byBOYW5kIGF0IHRoZSBhZGRyZXNzIHlvdXIKK1gtTG9hZGVyIGV4cGVjdHMuIEZvciB0aGUgSDMgZXhhbXBsZSwgeW91IGNhbiB1c2UgVS1Cb290IHRvIGZsYXNoIFUtQm9vdC4KK1lvdSBjYW4ndCB1c2UgRmxhc2hXcml0ZXJOYW5kIGJlY2F1c2UgaXQgdXNlcyBST00gY29kZSBFQ0Mgc3R5bGUuICAKKworCitNb3JlIEluZm9ybWF0aW9uCis9PT09PT09PT09PT09PT09CisKK09NQVAxNzEwIE5BTkQgQm9vdGluZyBEZXNpZ24gRG9jdW1lbnQgaGFzIG1vcmUgaW5mb3JtYXRpb24uCisKK0ltcGxlbWVuYXRpb24gbm90ZXM6Cis9PT09PT09PT09PT09PT09PT09PQorSDMsIEg0IHN1cHBvcnQgTkFORCBmbGFzaCBib290aW5nCisyNDMwc2RwICYgMzQzMHNkcCBzdXBwb3J0IE9uZU5BTkQgYm9vdGluZworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2FybV9jb25maWcubWsgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDk2MjUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9hcm1fY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfQVJNIC1EX19BUk1fXwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzI5MjQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDkKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisjIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IGFtMzUxN2V2bS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2FtMzUxN2V2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDRiZTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyAqIFRoaXMgZmlsZSBpcyBjb3BpZWQgZnJvbSBib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRGVmaW5pdGlvbnMgZm9yIEVNSUY0IGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUAkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQ0QJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XUgkJMHgzCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQVMJMHg4CisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SQwkJMHhBCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9SUkQJMHgyCisjZGVmaW5lCUVNSUY0X1RJTTFfVF9XVFIJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hQCQkweDIKKyNkZWZpbmUJRU1JRjRfVElNMl9UX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1hTTlIJMHgxQworI2RlZmluZQlFTUlGNF9USU0yX1RfWFNSRAkweEM4CisjZGVmaW5lCUVNSUY0X1RJTTJfVF9SVFAJMHgxCisjZGVmaW5lCUVNSUY0X1RJTTJfVF9DS0UJMHgyCisKKyNkZWZpbmUJRU1JRjRfVElNM19UX1REUVNDS01BWAkweDAKKyNkZWZpbmUJRU1JRjRfVElNM19UX1JGQwkweDI1CisjZGVmaW5lCUVNSUY0X1RJTTNfVF9SQVNfTUFYCTB4NworCisjZGVmaW5lCUVNSUY0X1BXUl9JRExFCQkweDIKKyNkZWZpbmUJRU1JRjRfUFdSX0RQRF9FTgkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX0VOCQkweDAKKyNkZWZpbmUJRU1JRjRfUFdSX1BNX1RJTQkweDAKKworI2RlZmluZQlFTUlGNF9JTklUUkVGX0RJUwkweDAKKyNkZWZpbmUJRU1JRjRfUEFTUgkJMHgwCisjZGVmaW5lCUVNSUY0X1JFRlJFU0hfUkFURQkweDUwRgorCisvKgorICogU0RSQU0gQ29uZmlnIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUJRU1JRjRfQ0ZHX1NEUkFNX1RZUAkweDIKKyNkZWZpbmUJRU1JRjRfQ0ZHX0lCQU5LX1BPUwkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9URVJNCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSMl9ERFFTCTB4MQorI2RlZmluZQlFTUlGNF9DRkdfRFlOX09EVAkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0REUl9ESVNfRExMCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfU0RSX0RSVgkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0NXTAkJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19OQVJST1dfTUQJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19DTAkJMHg1CisjZGVmaW5lCUVNSUY0X0NGR19ST1dTSVpFCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfSUJBTksJCTB4MworI2RlZmluZQlFTUlGNF9DRkdfRUJBTksJCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfUEdTSVpFCTB4MgorCisvKgorICogRU1JRjQgUEhZIENvbnRyb2wgMSByZWdpc3RlciBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgRU1JRjRfRERSMV9SRF9MQVQJMHg2CisjZGVmaW5lCUVNSUY0X0REUjFfUFdSRE5fRElTCTB4MAorI2RlZmluZSBFTUlGNF9ERFIxX1NUUkJFTl9FWFQJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfRExMX01PREUJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfVlRQX0RZTgkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9MQl9DS19TRUwJMHgwCisKKy8qCisgKiBFTUlGNCBQSFkgQ29udHJvbCAyIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBFTUlGNF9ERFIyX1RYX0RBVEFfQUxJR04JMHgwCisjZGVmaW5lIEVNSUY0X0REUjJfUlhfRExMX0JZUEFTUwkweDAKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CisjaWYgMAorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKKyNlbmRpZgorZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gaW50IG1tY19pbml0KGludCB2ZXJib3NlKTsKK2V4dGVybiBibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogTW92ZSBpdCB0byBjb21tb24gcGxhY2Ugc28gdGhhdCBzaG91bGQgYmUgdXNlZAorICogZm9yIGFsbCBPTUFQIHNlcmllcyBvZiBkZXZpY2VzCisgKi8KK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJdTMyIGNwdWlkID0gMCwgY3B1X2ZhbWlseSA9IDA7CisJdTE2IGhhd2tleWU7CisKKwljcHVpZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCWhhd2tleWUgID0gKGNwdWlkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJc3dpdGNoIChoYXdrZXllKSB7CisJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwlkZWZhdWx0OgorCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBjcHVfZmFtaWx5OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNib290X3ZhbHVlKHZvaWQpIC0gcmV0dXJuIFNZU19CT09UWzQ6MF0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoU1lTQk9PVF9NQVNLKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZ2V0X21lbV90eXBlKHZvaWQpIC0gcmV0dXJucyB0aGUga2luZCBvZiBtZW1vcnkgY29ubmVjdGVkCisgKiB0byBHUE1DIHRoYXQgd2UgYXJlIHRyeWluZyB0byBib290IGZvcm0uIFVzZXMgU1lTIEJPT1Qgc2V0dGluZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfbWVtX3R5cGUodm9pZCkKK3sKKyAgICAgICAgdTMyICAgbWVtX3R5cGUgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworICAgICAgICBzd2l0Y2ggKG1lbV90eXBlKXsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgY2FzZSAyNzogICAgcmV0dXJuIEdQTUNfTkFORDsKKworCisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAJCXJldHVybiBNTUNfTkFORDsKKworICAgICAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEdQTUNfTkFORDsKKyAgICAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfZW1pZjRfZGRyKCkgLSBJbml0L0NvbmZpZ3VyZSBERFIgb24gQU0zNTE3IEVWTSBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ19lbWlmNF9kZHIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJLyogU2V0IHRoZSBERFIgUEhZIHBhcmFtZXRlcnMgaW4gUEhZIGN0cmwgcmVnaXN0ZXJzICovCisJcmVndmFsID0gKEVNSUY0X0REUjFfUkRfTEFUIHwgKEVNSUY0X0REUjFfUFdSRE5fRElTIDw8IDYpIHwKKwkJKEVNSUY0X0REUjFfU1RSQkVOX0VYVCA8PCA3KSB8IChFTUlGNF9ERFIxX0RMTF9NT0RFIDw8IDEyKSB8CisJCShFTUlGNF9ERFIxX1ZUUF9EWU4gPDwgMTUpIHwgKEVNSUY0X0REUjFfTEJfQ0tfU0VMIDw8IDIzKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwxX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X0REUjJfVFhfREFUQV9BTElHTiB8IChFTUlGNF9ERFIyX1JYX0RMTF9CWVBBU1MgPDwgMSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X0REUl9QSFlDVEwyKTsKKworCS8qIFJlc2V0IHRoZSBERFIgUEhZIGFuZCB3YWl0IHRpbGwgY29tcGxldGVkICovCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAxMCwgMSwgMSk7CisJLypXYWl0IHRpbGwgdGhhdCBiaXQgY2xlYXJzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X0lPREZUX1RMR0MpICYgQklUMTApID09IDB4MSk7CisJLypSZS12ZXJpZnkgdGhlIEREUiBQSFkgc3RhdHVzKi8KKwl3aGlsZSAoKF9fcmF3X3JlYWRsKEVNSUY0X1NEUkFNX1NUUykgJiBCSVQyKSA9PSAweDApOworCisJc3IzMihFTUlGNF9JT0RGVF9UTEdDLCAwLCAxLCAxKTsKKwkvKiBTZXQgU0RSIHRpbWluZyByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSAoRU1JRjRfVElNMV9UX1dUUiB8IChFTUlGNF9USU0xX1RfUlJEIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTFfVF9SQyA8PCA2KSB8IChFTUlGNF9USU0xX1RfUkFTIDw8IDEyKSB8CisJCShFTUlGNF9USU0xX1RfV1IgPDwgMTcpIHwgKEVNSUY0X1RJTTFfVF9SQ0QgPDwgMjEpIHwKKwkJKEVNSUY0X1RJTTFfVF9SUCA8PCAyNSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTEpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTFfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfVElNMl9UX0NLRSB8IChFTUlGNF9USU0yX1RfUlRQIDw8IDMpIHwKKwkJKEVNSUY0X1RJTTJfVF9YU1JEIDw8IDYpIHwgKEVNSUY0X1RJTTJfVF9YU05SIDw8IDE2KSB8CisJCShFTUlGNF9USU0yX1RfT0RUIDw8IDI1KSB8IChFTUlGNF9USU0yX1RfWFAgPDwgMjgpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9USU0yX1NIRFcpOworCisJcmVndmFsID0gKEVNSUY0X1RJTTNfVF9SQVNfTUFYIHwgKEVNSUY0X1RJTTNfVF9SRkMgPDwgNCkgfAorCQkoRU1JRjRfVElNM19UX1REUVNDS01BWCA8PCAxMykpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTMpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTNfU0hEVyk7CisKKwkvKiBTZXQgdGhlIFBXUiBjb250cm9sIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X1BXUl9QTV9USU0gfCAoRU1JRjRfUFdSX1BNX0VOIDw8IDgpIHwKKwkJKEVNSUY0X1BXUl9EUERfRU4gPDwgMTApIHwgKEVNSUY0X1BXUl9JRExFIDw8IDMwKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfUFdSX01HVF9DVFJMKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9QV1JfTUdUX0NUUkxfU0hEVyk7CisKKwkvKiBTZXQgdGhlIEREUiByZWZyZXNoIHJhdGUgY29udHJvbCByZWdpc3RlciAqLworCXJlZ3ZhbCA9IChFTUlGNF9SRUZSRVNIX1JBVEUgfCAoRU1JRjRfUEFTUiA8PCAyNCkgfAorCQkoRU1JRjRfSU5JVFJFRl9ESVMgPDwgMzEpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9SRkNSX1NIRFcpOworCisJLyogc2V0IHRoZSBTRFJBTSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X0NGR19QR1NJWkUgfCAoRU1JRjRfQ0ZHX0VCQU5LIDw8IDMpIHwKKwkJKEVNSUY0X0NGR19JQkFOSyA8PCA0KSB8IChFTUlGNF9DRkdfUk9XU0laRSA8PCA3KSB8CisJCShFTUlGNF9DRkdfQ0wgPDwgMTApIHwgKEVNSUY0X0NGR19OQVJST1dfTUQgPDwgMTQpIHwKKwkJKEVNSUY0X0NGR19DV0wgPDwgMTYpIHwgKEVNSUY0X0NGR19TRFJfRFJWIDw8IDE4KSB8CisJCShFTUlGNF9DRkdfRERSX0RJU19ETEwgPDwgMjApIHwgKEVNSUY0X0NGR19EWU5fT0RUIDw8IDIxKSB8CisJCShFTUlGNF9DRkdfRERSMl9ERFFTIDw8IDIzKSB8IChFTUlGNF9DRkdfRERSX1RFUk0gPDwgMjQpIHwKKwkJKEVNSUY0X0NGR19JQkFOS19QT1MgPDwgMjcpIHwgKEVNSUY0X0NGR19TRFJBTV9UWVAgPDwgMjkpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9TRFJBTV9DRkcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCSAqLworCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogQ09SRSBEUExMICovCisJLyogc3IzMihDTV9DTEtTRUwyX0VNVSkgc2V0IG92ZXJyaWRlIHRvIHdvcmsgd2hlbiBhc2xlZXAgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKworCS8qIGVuYWJsZSB0aGUgRERSUEhZIGNsayAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTg4KSwgMTUsIDE1LCAweDEpOworCS8qIGVuYWJsZSB0aGUgRU1JRjQgY2xrICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1ODgpLCAxNCwgMTQsIDB4MSk7CisJLyogRW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTlDKSwgMCwgNCwgMHhGKTsKKwlzcjMyKChPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDU5QyksIDgsIDEwLCAweDcpOworCisJLyogYnJpbmcgY3BnbWFjIG91dCBvZiByZXNldCAqLworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTk4KSwgMSwgMSwgMHgxKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgRU1JRjQgZm9yIG91ciBERFIgKi8KKwljb25maWdfZW1pZjRfZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCisJLyogRW5hYmxlIFVBUlQyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTQsIDEsIDB4MSk7CisKKwkvKiBFbmFibGUgVUFSVDIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTl9QRVIsIDExLCAxLCAweDEpOworI2VuZGlmCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKworCS8qIEVuYWJsZSBNTUMyIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjUsIDEsIDB4MSk7CisKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTApLCAgICAgIChNMCkpIC8qU0RSQ19DS0UwKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTEpLCAgICAgIChNMCkpIC8qU0RSQ19DS0UxKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1RYX0lSVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlRTX1NEKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQzX0NUU19SQ1RYKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlhfSVJSWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwkvKkV4cGFuc2lvbiBjYXJkICAqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ0xLKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qTU1DMV9DTEsqL1wKKwlNVVhfVkFMKENQKE1NQzFfQ01EKSwgICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9DTUQqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMCksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQwKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDEpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUMSovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQyKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDIqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMyksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQzKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDQpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNCovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQ1KSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDUqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNiksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ2Ki9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDcpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNyovXAorCU1VWF9WQUwoQ1AoTWNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChOQU5EX0JBU0VfQURSPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgICAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKworCX0KKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoT05FTkFORF9CQVNFPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgIAlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisKKyAgICAgICBsb25nIHNpemUgPSAwOworI2lmZGVmIENGR19DTURfRkFUCisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DIFxuIik7CisKKyAgICAgICByZXQgPSBtbWNfaW5pdCgxKTsKKyAgICAgICBpZihyZXQgPT0gMCl7CisgICAgICAgICAgICAgICBwcmludGYoIlxuIE1NQyBpbml0IGZhaWxlZCBcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsIGJ1ZiwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUMgXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisjZW5kaWYKKyAgICAgICByZXR1cm4gc2l6ZTsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjEyYTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMgKEMpIENvcHlyaWdodCAyMDA5CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThmNmU3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBNYW5pa2FuZGFuIFBpbGxhaSA8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUwY2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gZGlhbW9uZC5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMzgwYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsKQEAgLTAsMCArMSwyMSBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL2RpYW1vbmQuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwNmY2NwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUyAoMSkKKworCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CSAgICAgICAgICAgICAgICAgCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfCAKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworIAlkZWxheSgweDIwMDAwKTsKK30KKworLyoKKyAqICB2b2lkIHNfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHZlcnkgZWFybHkgc3lzdGVtIGluaXRpYWxpemF0aW9uIG9mIGNoaXAKKyAqICAgIHBpbiBtdWx0aXBsZXhpbmcgYW5kIGNsb2NrcyBhbmQgaXMgY2FsbGVkIHdoZW4gT05MWSBhbgorICogICAgU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8gU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCisJZGVsYXkoMTAwKTsKKworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnX2RpYW1vbmRfc2RyYW0oKTsKK30KKworLyoKKyAqICBpbnQgYm9hcmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBlYXJseSwgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqICAgIGZvbGxvd2luZyBjb3JlIENQVSBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK2JvYXJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIHUzMiBnZXRfZGV2aWNlX3R5cGUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiAgICBkZXZpY2UgaXMgb2YgVFNULCBFTVUsIEhTIG9yIEdQIHR5cGUuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisJY29uc3QgaW50IHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQsIGluZGljYXRpbmcgdGhlCisgKiAgICBvcmRlciBvZiBtZW1vcnkgaW50ZXJmYWNlcyBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzb3Igd2lsbCBhdHRlbXB0CisgKiAgICB0byBib290IGl0c2VsZi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLgorICoKKyAqLwordTMyCitnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9ESUFNT05EX0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisKKwljYXNlIDA6CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDE2OgorCWNhc2UgMjI6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX09ORU5BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDE6CisJY2FzZSAxMjoKKwljYXNlIDE1OgorCWNhc2UgMjE6CisJY2FzZSAyNzoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgMzoKKwljYXNlIDY6CisgICAgICAgIGxpc3RbMF0gPSBNTUNfT05FTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgODoKKwljYXNlIDExOgorCWNhc2UgMTQ6CisJY2FzZSAyMDoKKwljYXNlIDI2OgorICAgICAgICBsaXN0WzBdID0gR1BNQ19NRE9DOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSAxNzoKKwljYXNlIDE4OgorCWNhc2UgMjQ6CisgICAgICAgIGxpc3RbMF0gPSBNTUNfTkFORDsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgNzoKKwljYXNlIDEwOgorCWNhc2UgMTM6CisJY2FzZSAxOToKKwljYXNlIDI1OgorCisJZGVmYXVsdDoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTk9SOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJfQorICAgIHJldHVybiBudW1iZXJfb2ZfZGV2aWNlczsKK30KKworLyoKKyAqICBpbnQgbWlzY19pbml0X3IoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgbWlzY2VsbGFuZW91cywgYm9hcmQtc3BlY2lmaWMKKyAqICAgIGluaXRpYWxpemF0aW9uIGZvbGxvd2luZyBDUFUsIGVhcmx5IGJvYXJkLCBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBsb2FkaW5nIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIKKyAqICAgIHRvIFJBTS4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK21pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICB2b2lkIGZvb2JhcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lLi4uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworc3RhdGljIGludAorZ3BtY19jb25maWdfMCh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKQorCS8qCisJICogRmlyc3QsIGRpc2FibGUgdGhlIGludGVyZmFjZSBhbmQgd2FpdC4KKwkgKi8KKwlfX3Jhd193cml0ZWwoR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQsIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDEwMDApOworCisJLyoKKwkgKiBOZXh0LCBwcm9ncmFtIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzFfMCwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcyXzAsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHM18wLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzRfMCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc1XzAsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNl8wLCBHUE1DX0NPTkZJRzZfMCk7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgR1BNQyBtYXBwaW5nIGFuZCBzcGluIGZvciB0aGUgcGFyYW1ldGVycyB0bworCSAqIGJlY29tZSBhY3RpdmUuCisJICovCisJX19yYXdfd3JpdGVsKChDRkdfR1BNQ19DT05GSUc3XzAgfCBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVEKSwKKwkJCQkgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMjAwMCk7CisKKwlpZiAobmFuZF9jaGlwKCkpeworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgaW50IG5hbmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIKKyAqICAgIChHUE1DKSBzdWNoIHRoYXQgb24tYm9hcmQgTkFORCBkZXZpY2VzIG1heSBiZSBhY2Nlc3NlZCBmb3IKKyAqICAgIHNlY29uZC1zdGFnZSBib290LgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgTkFORCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkOyBvdGhlcndpc2UsIDEuCisgKgorICovCitpbnQKK25hbmRfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSAxOworCisJLyoKKwkgKiBFc3RhYmxpc2ggR1BNQyBnbG9iYWwgc2V0dGluZ3MuCisJICovCisKKwlfX3Jhd193cml0ZWwoR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQsIEdQTUNfU1lTQ09ORklHKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRSwgR1BNQ19JUlFFTkFCTEUpOworCisJX19yYXdfd3JpdGVsKEdQTUNfVElNRU9VVEVOQUJMRV9PRkYsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKworCWlmIChncG1jX2NvbmZpZ18wKCkpIHsKKwkJcHV0cygiVW5zdXBwb3J0ZWQgTkFORCBkZXZpY2UgQCBHUE1DMCFcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3RhdHVzID0gMDsKKworIGRvbmU6CisJLyogRHVtcCBHUE1DIGFuZCBTRFJDIHJlZ2lzdGVycyBpZiBzbyBjb25maWd1cmVkLiAqLworCisJb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiAgdm9pZCBib2FyZF9oYW5nKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGJvYXJkLXNwZWNpZmljIGFjdGlvbnMgd2hlbiB0aGUgc3lzdGVtCisgKiAgICBoYW5ncyBieSBleGVjdXRpbmcgaGFuZygpLiBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOworICogICAgaG93ZXZlciwgd2UgbWlnaHQgbGF0ZXIgZHJpdmUgdGhlIHBpZXpvIG9yIGEgTEVELgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorYm9hcmRfaGFuZyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmOTJmOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9tdXguYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IEkvTyBwYWQgbXVsdGlwbGV4ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdm9pZCBzZXRfbXV4Y29uZl9yZWdzKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmVzIHNldHMgdGhlIEkvTyBwYWQgbXVsdGlwbGV4ZXJzIGZvciBVQVJULCBHUE1DLCBTRFJDLAorICogICAgR1BJTy4KKyAqCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKi8KK3ZvaWQKK3NldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBiaXQgZmllbGRzIGZvciB0aGVzZSBzZXR0aW5ncyBhcmUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgSXtFTixESVN9CSAJLSBJbnB1dCBFbmFibGUvRGlzYWJsZQorCSAqICAgUFRbRFVdCQkgCS0gUHVsbC1kb3duLCAtdXAKKwkgKiAgIERJUyxFTgkJICAJLSBQdWxsLWRvd24sIC11cCBkaXNhYmxlZC9lbmFibGVkCisJICogICBNWzAxMjM0NTY3XQktIENvbmZpZ3VyYXRpb24gbW9kZSAwLTcKKwkgKi8KKworCS8qCisJICogU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKwkgKgorCSAqIE1vc3Qgb2YgdGhlIFNEUkMgc2lnbmFscyBhcmUgdXNlZCB0byBkcml2ZSB0aGUgU2Ftc3VuZworCSAqIEs0WDUxMTYzUEktRkNHNiA1MTIgTWIgeCAxNi1iaXQgKDY0IE1pQikgRERSIFNEUkFNLiBCZWNhdXNlIHdlCisJICogaW50ZXJmYWNlIGluIDE2LWJpdCByYXRoZXIgdGhhbiAzMi1iaXQgbW9kZSwgd2UgcGxhY2UgdGhlCisJICogdW51c2VkIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCSAqLworCisJTVVYX1ZBTChDUChTRFJDX0QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEKKwlNVVhfVkFMKENQKFNEUkNfRDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QyCisJTVVYX1ZBTChDUChTRFJDX0QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMworCU1VWF9WQUwoQ1AoU0RSQ19ENCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDQKKwlNVVhfVkFMKENQKFNEUkNfRDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q1CisJTVVYX1ZBTChDUChTRFJDX0Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENgorCU1VWF9WQUwoQ1AoU0RSQ19ENyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDcKKwlNVVhfVkFMKENQKFNEUkNfRDgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q4CisJTVVYX1ZBTChDUChTRFJDX0Q5KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOQorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMQorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMgorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMworCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNQorCisJLy8gQmVjYXVzZSB3ZSBpbnRlcmZhY2UgU0RSQU0gaW4gMTYtYml0IG1vZGUsIHBsYWNlCisJLy8gU0RSQ19EQVRBWzMxOjE2XSBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19DTEsKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMxCisKKwkvLyBQbGFjZSB1bnVzZWQgRFEgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChHUE1DX0ExKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMQorCU1VWF9WQUwoQ1AoR1BNQ19BMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTIKKwlNVVhfVkFMKENQKEdQTUNfQTMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EzCisJTVVYX1ZBTChDUChHUE1DX0E0KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTUKKwlNVVhfVkFMKENQKEdQTUNfQTYpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E2CisJTVVYX1ZBTChDUChHUE1DX0E3KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNworCisJLy8gUGxhY2UgdGhlIHVudXNlZCBHUE1DX0E4IHBpbiBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKEdQTUNfQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX0E5IHRvIEdQSU9fNDIgdXNlZCBhcyBhIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBpbnB1dAorCS8vIGZyb20gdGhlIFVTQiBQSFkgZm9yIFVTQiBzdXNwZW5kIG5vdGlmaWNhdGlvbi4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOSksCQkoSUVOICB8IFBUVSB8IERJUyB8IE00KSk7CS8vIEdQSU9fNDIKKworI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIEdQTUNfQTEwIHRvIEdQSU9fNDMgdXNlZCBhcyBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgb3V0cHV0CisJLy8gTENEX25FTkJVRkZFUiBmb3IgdGhlIDEuOFYgdG8gMy4zViBMQ0QgYnVmZmVyIGVuYWJsZS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTMyBmb3IgU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQKKwkvLyBGbGFzaAorCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzMKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjaWYgZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkKKwkvLyBBc3NpZ24gdG8gR1BNQ19OQ1M1IGZvciBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDCisJLy8gYW5kIFBIWQorCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzUKKyNlbHNlCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKSAqLworCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRU4gIHwgUFRVIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElFTiAgfCBQVEQgfCBESVMgfCBNNSkpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElFTiAgfCBQVEQgfCBESVMgfCBNNSkpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKyNkZWZpbmUgX05FU1RfRElBTU9ORF9QTEFURk9STV9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAqIFR5cGUgRGVmaW5pdGlvbnMKKyAqLworCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCisKK3N0cnVjdCBkcGxsX3BhcmFtIHsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgZnNlbDsKKwl1MzIgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1MzIgc3lzX2NsazsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgbTI7CisJdTMyIG0zOworCXUzMiBtNDsKKwl1MzIgbTU7CisJdTMyIG02OworCXUzMiBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworLyoKKyAqIElubGluZSBGdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIHBsYXRmb3JtLlMuCisgKi8KKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX05FU1RfRElBTU9ORF9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWFkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNGE5MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gajQ5Lm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDk2MGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDIxIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworCitURVhUX0JBU0UgPSAweDQwMjAwMDAwCitTVEFDS19CQVNFID0gMHg0MDIwRkNCMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9qNDkuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwOWJiYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9KNDlfQk9PVF9ERVZJQ0VTICgzKQorCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CSAgICAgICAgICAgICAgICAgCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfCAKKwkJIFNEUkNfRExMQV9DVFJMX0RMTF9FTkFCTEUJCQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19ETExBX0NUUkwpOworCisJLyoKKwkgKiBEZWxheSBmb3IgYSAicmVhc29uYWJseSBsb25nIiBwZXJpb2Qgb2YgdGltZSB0byBhbGxvdyB0aGUKKwkgKiByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KKwkgKi8KKworIAlkZWxheSgweDIwMDAwKTsKK30KKworLyoKKyAqICB2b2lkIHNfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIHZlcnkgZWFybHkgc3lzdGVtIGluaXRpYWxpemF0aW9uIG9mIGNoaXAKKyAqICAgIHBpbiBtdWx0aXBsZXhpbmcgYW5kIGNsb2NrcyBhbmQgaXMgY2FsbGVkIHdoZW4gT05MWSBhbgorICogICAgU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8gU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCisJZGVsYXkoMTAwKTsKKworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnX2RpYW1vbmRfc2RyYW0oKTsKK30KKworLyoKKyAqICBpbnQgYm9hcmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBlYXJseSwgYm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqICAgIGZvbGxvd2luZyBjb3JlIENQVSBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK2JvYXJkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIHUzMiBnZXRfZGV2aWNlX3R5cGUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiAgICBkZXZpY2UgaXMgb2YgVFNULCBFTVUsIEhTIG9yIEdQIHR5cGUuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisJY29uc3QgaW50IHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0RFQ09ERSh2YWx1ZSkpOworfQorCisvKgorICogIHUzMiBnZXRfc3lzYm9vdF92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQsIGluZGljYXRpbmcgdGhlCisgKiAgICBvcmRlciBvZiBtZW1vcnkgaW50ZXJmYWNlcyBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzb3Igd2lsbCBhdHRlbXB0CisgKiAgICB0byBib290IGl0c2VsZi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLgorICoKKyAqLwordTMyCitnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworI2lmIDAKKwljb25zdCB1MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisJY29uc3QgdTMyIHBlcmlwaGVyYWxfdHlwZSA9IENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYW5kIGNhbGxlcnMgb2YgaXQgYXJlIGltcGxpY2l0bHkgZXhwZWN0aW5nIHRoZQorCSAqIE1FTU9SWSBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMCkgbm90IHRoZSBQRVJISVBIRVJBTAorCSAqIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAxKSBib290IG9yZGVyLCBzbyBjaGVjayB0aGF0IGlzCisJICogYWN0dWFsbHkgdGhlIGNhc2UuCisJICovCisKKwlpZiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2YWx1ZSkgPT0gcGVyaXBoZXJhbF90eXBlKSB7CisJCWhhbmcoKTsKKwl9CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHZhbHVlKSk7CisjZWxzZQorICAgICAgICByZXR1cm4gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgMHgzZjsKKyNlbmRpZgorfQorCisvKgorICogIGludCBnZXRfYm9vdF9kZXZpY2VfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VfbGlzdCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIGNvbnN0YW50IGxpc3QgaW5kaWNhdGluZyB0aGUgcHJlZmVycmVkCisgKiAgICBkZXZpY2UgYm9vdCBsaXN0LgorICogICAgSXQgZ2V0cyBjYWxsZWQgZnJvbSBzdGFydF9hcm1ib290IGluIGJvYXJkLmMKKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcHJlZmVycmVkIGZpcnN0IHByb2Nlc3NvciBtZW1vcnkgYm9vdCBpbnRlcmZhY2UuCisgKgorICovCisKK2ludAorZ2V0X2Jvb3RfZGV2aWNlc19saXN0KGNvbnN0IHUzMioqIGRldmljZXNfbGlzdCkKK3sKKwlzdGF0aWMgdTMyIGxpc3RbTUFYX0o0OV9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCWNhc2UgMTU6CisJCWxpc3RbMF0gPSBHUE1DX05BTkQ7CisJCWxpc3RbMV0gPSBVU0JfUEVSSVBIRVJBTDsKKwkJbGlzdFsyXSA9IE1NQ19OQU5EOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwljYXNlIDQ3OgorCQlsaXN0WzBdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMV0gPSBNTUNfTkFORDsKKwkJbGlzdFsyXSA9IEdQTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBudW1iZXJfb2ZfZGV2aWNlczsKK30KKworLyoKKyAqICBpbnQgbWlzY19pbml0X3IoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgbWlzY2VsbGFuZW91cywgYm9hcmQtc3BlY2lmaWMKKyAqICAgIGluaXRpYWxpemF0aW9uIGZvbGxvd2luZyBDUFUsIGVhcmx5IGJvYXJkLCBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBsb2FkaW5nIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIKKyAqICAgIHRvIFJBTS4KKyAqCisgKiAgICBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIGJvYXJkLXNwZWNpZmljIHRvIGRvLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgT0s7IG90aGVyd2lzZSwgbm9uLXplcm8gb24gZXJyb3IuCisgKgorICovCitpbnQKK21pc2NfaW5pdF9yKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCit3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICB2b2lkIGZvb2JhcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lLi4uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01NQworCS8qIEVuYWJsZSBNTUMxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworc3RhdGljIGludAorZ3BtY19jb25maWdfMCh2b2lkKQoreworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKQorCS8qCisJICogRmlyc3QsIGRpc2FibGUgdGhlIGludGVyZmFjZSBhbmQgd2FpdC4KKwkgKi8KKwlfX3Jhd193cml0ZWwoR1BNQ19DT05GSUc3X0NTVkFMSURfRElTQUJMRUQsIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDEwMDApOworCisJLyoKKwkgKiBOZXh0LCBwcm9ncmFtIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzFfMCwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcyXzAsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHM18wLCBHUE1DX0NPTkZJRzNfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzRfMCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc1XzAsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNl8wLCBHUE1DX0NPTkZJRzZfMCk7CisKKwkvKgorCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgR1BNQyBtYXBwaW5nIGFuZCBzcGluIGZvciB0aGUgcGFyYW1ldGVycyB0bworCSAqIGJlY29tZSBhY3RpdmUuCisJICovCisJX19yYXdfd3JpdGVsKChDRkdfR1BNQ19DT05GSUc3XzAgfCBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVEKSwKKwkJCQkgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMjAwMCk7CisKKwlpZiAobmFuZF9jaGlwKCkpeworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkgKi8KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgaW50IG5hbmRfaW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIKKyAqICAgIChHUE1DKSBzdWNoIHRoYXQgb24tYm9hcmQgTkFORCBkZXZpY2VzIG1heSBiZSBhY2Nlc3NlZCBmb3IKKyAqICAgIHNlY29uZC1zdGFnZSBib290LgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIDAgaWYgTkFORCB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkOyBvdGhlcndpc2UsIDEuCisgKgorICovCitpbnQKK25hbmRfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXMgPSAxOworCisJLyoKKwkgKiBFc3RhYmxpc2ggR1BNQyBnbG9iYWwgc2V0dGluZ3MuCisJICovCisKKwlfX3Jhd193cml0ZWwoR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQsIEdQTUNfU1lTQ09ORklHKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRSwgR1BNQ19JUlFFTkFCTEUpOworCisJX19yYXdfd3JpdGVsKEdQTUNfVElNRU9VVEVOQUJMRV9PRkYsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKworCWlmIChncG1jX2NvbmZpZ18wKCkpIHsKKwkJcHV0cygiVW5zdXBwb3J0ZWQgTkFORCBkZXZpY2UgQCBHUE1DMCFcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3RhdHVzID0gMDsKKworIGRvbmU6CisJLyogRHVtcCBHUE1DIGFuZCBTRFJDIHJlZ2lzdGVycyBpZiBzbyBjb25maWd1cmVkLiAqLworCisJb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCk7CisJb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiAgdm9pZCBib2FyZF9oYW5nKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGJvYXJkLXNwZWNpZmljIGFjdGlvbnMgd2hlbiB0aGUgc3lzdGVtCisgKiAgICBoYW5ncyBieSBleGVjdXRpbmcgaGFuZygpLiBBdCBwcmVzZW50LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOworICogICAgaG93ZXZlciwgd2UgbWlnaHQgbGF0ZXIgZHJpdmUgdGhlIHBpZXpvIG9yIGEgTEVELgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorYm9hcmRfaGFuZyAodm9pZCkKK3sKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IEkvTyBwYWQgbXVsdGlwbGV4ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdm9pZCBzZXRfbXV4Y29uZl9yZWdzKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmVzIHNldHMgdGhlIEkvTyBwYWQgbXVsdGlwbGV4ZXJzIGZvciBVQVJULCBHUE1DLCBTRFJDLAorICogICAgR1BJTy4KKyAqCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKi8KK3ZvaWQKK3NldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwkvKgorCSAqIFRoZSBiaXQgZmllbGRzIGZvciB0aGVzZSBzZXR0aW5ncyBhcmUgYXMgZm9sbG93czoKKwkgKgorCSAqICAgSXtFTixESVN9CSAJLSBJbnB1dCBFbmFibGUvRGlzYWJsZQorCSAqICAgUFRbRFVdCQkgCS0gUHVsbC1kb3duLCAtdXAKKwkgKiAgIERJUyxFTgkJICAJLSBQdWxsLWRvd24sIC11cCBkaXNhYmxlZC9lbmFibGVkCisJICogICBNWzAxMjM0NTY3XQktIENvbmZpZ3VyYXRpb24gbW9kZSAwLTcKKwkgKi8KKworCS8qCisJICogU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKwkgKgorCSAqIE1vc3Qgb2YgdGhlIFNEUkMgc2lnbmFscyBhcmUgdXNlZCB0byBkcml2ZSB0aGUgU2Ftc3VuZworCSAqIEs0WDUxMTYzUEktRkNHNiA1MTIgTWIgeCAxNi1iaXQgKDY0IE1pQikgRERSIFNEUkFNLiBCZWNhdXNlIHdlCisJICogaW50ZXJmYWNlIGluIDE2LWJpdCByYXRoZXIgdGhhbiAzMi1iaXQgbW9kZSwgd2UgcGxhY2UgdGhlCisJICogdW51c2VkIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCSAqLworCisJTVVYX1ZBTChDUChTRFJDX0QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEKKwlNVVhfVkFMKENQKFNEUkNfRDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QyCisJTVVYX1ZBTChDUChTRFJDX0QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMworCU1VWF9WQUwoQ1AoU0RSQ19ENCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDQKKwlNVVhfVkFMKENQKFNEUkNfRDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q1CisJTVVYX1ZBTChDUChTRFJDX0Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENgorCU1VWF9WQUwoQ1AoU0RSQ19ENyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDcKKwlNVVhfVkFMKENQKFNEUkNfRDgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q4CisJTVVYX1ZBTChDUChTRFJDX0Q5KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOQorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMQorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMgorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxMworCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxNQorCisJLy8gQmVjYXVzZSB3ZSBpbnRlcmZhY2UgU0RSQU0gaW4gMTYtYml0IG1vZGUsIHBsYWNlCisJLy8gU0RSQ19EQVRBWzMxOjE2XSBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19DTEsKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMxCisKKwkvLyBQbGFjZSB1bnVzZWQgRFEgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQykKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChHUE1DX0ExKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMQorCU1VWF9WQUwoQ1AoR1BNQ19BMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTIKKwlNVVhfVkFMKENQKEdQTUNfQTMpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EzCisJTVVYX1ZBTChDUChHUE1DX0E0KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTUKKwlNVVhfVkFMKENQKEdQTUNfQTYpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E2CisJTVVYX1ZBTChDUChHUE1DX0E3KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNworCisJLy8gUGxhY2UgdGhlIHVudXNlZCBHUE1DX0E4IHBpbiBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisKKwlNVVhfVkFMKENQKEdQTUNfQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX0E5IHRvIEdQSU9fNDIgdXNlZCBhcyBhIHB1c2gtcHVsbCwgYWN0aXZlIGxvdyBpbnB1dAorCS8vIGZyb20gdGhlIFVTQiBQSFkgZm9yIFVTQiBzdXNwZW5kIG5vdGlmaWNhdGlvbi4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIEdQSU9fNDIKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwlNVVhfVkFMKENQKEdQTUNfRDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QwCisJTVVYX1ZBTChDUChHUE1DX0QxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMQorCU1VWF9WQUwoQ1AoR1BNQ19EMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDIKKwlNVVhfVkFMKENQKEdQTUNfRDMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QzCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDUKKwlNVVhfVkFMKENQKEdQTUNfRDYpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q2CisJTVVYX1ZBTChDUChHUE1DX0Q3KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENworCU1VWF9WQUwoQ1AoR1BNQ19EOCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDgKKwlNVVhfVkFMKENQKEdQTUNfRDkpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q5CisJTVVYX1ZBTChDUChHUE1DX0QxMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEwCisJTVVYX1ZBTChDUChHUE1DX0QxMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDExCisJTVVYX1ZBTChDUChHUE1DX0QxMiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEyCisJTVVYX1ZBTChDUChHUE1DX0QxMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEzCisJTVVYX1ZBTChDUChHUE1DX0QxNCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE0CisJTVVYX1ZBTChDUChHUE1DX0QxNSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDE1CisJTVVYX1ZBTChDUChHUE1DX05DUzApLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzAKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MyCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M2IHRvIEdQVDExX1BXTV9FVlQgdXNlZCBhcyBhIHB1c2gtcHVsbCBwdWxzZSB3aWR0aAorCS8vIG1vZHVsYXRlZCAoUFdNKSBzaWduYWwgZm9yIHRoZSBwaWV6by4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTMpKTsJLy8gR1BUMTFfUFdNX0VWVAorCisJLy8gQXNzaWduIEdQTUNfTkNTNyB0byBHUElPXzU4IHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0CisJLy8gUElFWk9fTkVOQUJMRSB0byB0aGUgVEkgU043NExWQzJHMjQwIER1YWwgQnVmZmVyL0RyaXZlciBXaXRoCisJLy8gMy1TdGF0ZSBPdXRwdXRzIGlucHV0cy4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT181OAorCisJTVVYX1ZBTChDUChHUE1DX0NMSyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQ0xLCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25BRFZfQUxFCisJTVVYX1ZBTChDUChHUE1DX05PRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbk9FCisJTVVYX1ZBTChDUChHUE1DX05XRSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldFCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25CRTBfQ0xFCisKKwkvLyBBc3NpZ24gR1BNQ19OQkUxIHRvIEdQSU9fNjEgdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQgdG8gdGhlCisJLy8gWmlnQmVlIGFjdGl2ZS1sb3cgcmVzZXQuCisKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjEKKworCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XUAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDAKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQxCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW5hdmFpbGFibGUKKworCS8vIEFzc2lnbiBHUE1DX1dBSVQzIHRvIEdQSU9fNjUgdXNlZCBhcyBhbiBhY3RpdmUtaGlnaCwgcHVzaC1wdWxsCisJLy8gYmFja3BsYXRlIGRldGVjdCBpbnB1dC4KKworCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNjUKKworCS8qCisJICogRGlzcGxheSBTdWJzeXN0ZW0gKERTUykKKwkgKgorCSAqIEFsbCBEU1Mgc2lnbmFscyBhcmUgdXNlZCBpbiB0aGVpciBub3JtYWwsIGRlZmF1bHQgbW9kZSAoTW9kZSAwKQorCSAqIHRvIGRyaXZlIHRoZSBTYW1zdW5nIExNUzM1MERGMFsxM10gTENEIGRpc3BsYXkgcGFuZWwuCisJICovCisKKwlNVVhfVkFMKENQKERTU19QQ0xLKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1BDTEsKKwlNVVhfVkFMKENQKERTU19IU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19IU1lOQworCU1VWF9WQUwoQ1AoRFNTX1ZTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX1ZTWU5DCisJTVVYX1ZBTChDUChEU1NfQUNCSUFTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0FDQklBUworCU1VWF9WQUwoQ1AoRFNTX0RBVEEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEwCisJTVVYX1ZBTChDUChEU1NfREFUQTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEKKwlNVVhfVkFMKENQKERTU19EQVRBMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEzCisJTVVYX1ZBTChDUChEU1NfREFUQTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTQKKwlNVVhfVkFMKENQKERTU19EQVRBNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE2CisJTVVYX1ZBTChDUChEU1NfREFUQTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTcKKwlNVVhfVkFMKENQKERTU19EQVRBOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE5CisJTVVYX1ZBTChDUChEU1NfREFUQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTEKKwlNVVhfVkFMKENQKERTU19EQVRBMTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEyCisJTVVYX1ZBTChDUChEU1NfREFUQTEzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMworCU1VWF9WQUwoQ1AoRFNTX0RBVEExNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTQKKwlNVVhfVkFMKENQKERTU19EQVRBMTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE1CisJTVVYX1ZBTChDUChEU1NfREFUQTE2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTcKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE4CisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjAKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIxCisJTVVYX1ZBTChDUChEU1NfREFUQTIyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjMKKworCU1VWF9WQUwoQ1AoQ0FNX1dFTiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyIC8gVHJhbnNtaXR0ZXIgKFVBUlQpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9UWAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfUlRTCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9DVFMKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfUlgKKwkvKgorCSAqIENvbnRyb2wgYW5kIERlYnVnCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoU1lTXzMySyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU18zMksKKwlNVVhfVkFMKENQKFNZU19CT09UMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QxCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDIKKwlNVVhfVkFMKENQKFNZU19CT09UMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMworCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q0CisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDUKKwlNVVhfVkFMKENQKFNZU19CT09UNiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNgorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIFNZU19DTEtPVVQxCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19uVFJTVAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RDSworCU1VWF9WQUwoQ1AoSlRBR19UTVMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RNUworCU1VWF9WQUwoQ1AoSlRBR19UREkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX1RESQorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUwCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTEKKwlNVVhfVkFMKENQKEVUS19DTEtfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19DVExfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EM19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19ENl9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EN19FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOF9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EOV9FUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTBfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTFfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTJfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEVUS19EMTNfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBFVEtfRDFbNDVdIGFzIE1NMl9SWFJDViBhbmQgTU0yX1RYU0UwIFVTQiBGUy9MUyBIb3N0CisJLy8gKE1vZGUgNSkKKworCU1VWF9WQUwoQ1AoRVRLX0QxNF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9SWFJDVgorCU1VWF9WQUwoQ1AoRVRLX0QxNV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIE1NMl9UWFNFMAorfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldHVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICAgICAgSXQgaW5oZXJpdHMgZW50aXJlbHkgZnJvbSB0aGUgZXF1aXZhbGVudCBUSSBPTUFQMyBFVk0KKyAqCWZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUcxXzApCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJRzNfMCkKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc0XzApCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNV8wKQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorI2VuZGlmIC8qICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICovCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzMwME1IWikKKy53b3JkIDE1MCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDE1MCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsIDE1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKQorLndvcmQgMzAwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDYwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICAzLCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiTVBVIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfNjAwTUhaKSAqLworCitpdmFfMzZ4X2RwbGxfcGFyYW06CisvLyAgICAgTSAgIE4gICBGUyBNMgorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgIDEwLCAgMCwgMCwgMQkvLyAxNi44IE1IegorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzIwME1IWikKKy53b3JkIDEwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDEwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgNzEsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMzMyTUhaKQorLndvcmQgMTY2LCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMzMyLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgNDE1LCAyMywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTY2LCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgNDE1LCA0NywgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopCisud29yZCAyMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCA0MDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDE3LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxzZQorIyBlcnJvciAiQ29yZSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFopICovCisKKy8qCisgKiBGb3IgdGhlIHBlcmlwaGVyYWwgKFBFUikgKGFrYSBEUExMNCkgY2xvY2sgc2V0dGluZ3MsIHRoZXJlIGFyZSBvbmx5CisgKiBlZmZlY3RpdmVseSB0d28gY2xvY2sgY2hvaWNlcywgOTYgTUh6IG9yIDE5MiBNSHouIEhvd2V2ZXIsIHRoZSBvbmx5CisgKiB0aW1lIDE5MiBNSHogaXMgYXB0IHRvIGJlIHVzZWQgaW4gYW4gYXBwbGljYXRpb24gaXMgaWYgYm90aCBTR1ggYW5kCisgKiBUViBvdXRwdXQgYXJlIHVzZWQuCisgKgorICogICBGb3IgYW55IGdpdmVuIHN5c3RlbSBjbG9jaywgdGhlIGRpdmlkZXJzIGFyZSBjb25maWd1cmVkIHRodXMgKHBlcgorICogICBTZWN0aW9uIDMuNS4zLjMuMy4yICJUeXBlIEIgRFBMTCAoTG93LUppdHRlcikiIG9mIHRoZSBPTUFQMyBUUk0pOgorICoKKyAqICAgICBQRVJbY2xrb3V0XSA9IChTWVNbY2xrb3V0XSAqIE0pIC8gKE4gKyAxKQorICoKKyAqICAgICAgIE0yW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTIgICAgICAgICAgIHVzZWQgYnkgVUFSVCwgTU1DLCBJMkMsIGV0Yy4KKyAqICAgICAgIE0zW2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTMgICAgICAgICAgIHVzZWQgYnkgVFYgb3V0LgorICogICAgICAgTTRbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNCAgICAgICAgICAgdXNlZCBieSBEU1MuCisgKiAgICAgICBNNVtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE01ICAgICAgICAgICB1c2VkIGJ5IGNhbWVyYS4KKyAqICAgICAgIE02W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTYgICAgICAgICAgIHVzZWQgYnkgZW11bGF0aW9uLgorICoKKyAqICBTbywgZm9yIGEgMTkuMiBNSHogc3lzdGVtIGNsb2NrIGFuZCB0aGUgc2NhbGFyIGVudHJpZXMgYmVsb3c6CisgKgorICogICAgICAgUEVSW2Nsa291dF0gPSAoMTkuMiAqIDU0MCkgLyAoMTEgKyAxKSA9IDg2NAorICoKKyAqICAgICAgIE0yW2Nsa291dF06IDg2NCAvICA5ID0gIDk2ICAgTUh6CisgKiAgICAgICBNM1tjbGtvdXRdOiA4NjQgLyAxNiA9ICA1NCAgIE1IegorICogICAgICAgTTRbY2xrb3V0XTogODY0IC8gIDUgPSAxNzIuOCBNSHoKKyAqICAgICAgIE01W2Nsa291dF06IDg2NCAvICA0ID0gMjE2ICAgTUh6CisgKiAgICAgICBNNltjbGtvdXRdOiA4NjQgLyAgMyA9IDI4OCAgIE1IegorICovCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBTWVNfQ0xLICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYKKy53b3JkIDEyMDAwLCAgICA0MzIsICAgIDUsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMiAgIE1IegorLndvcmQgMTMwMDAsICAgIDg2NCwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEzICAgTUh6Cisud29yZCAxOTIwMCwgICAgNTQwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTkuMiBNSHoKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAyNiAgIE1IegorLndvcmQgMzg0MDAsICAgIDI3MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDM4LjQgTUh6Cisud29yZCAxNjgwMCwgICAgMzYwLCAgICA2LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTYuOCBNSHoKKworLmdsb2JsIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0KK2dldF8zNnhfbXB1X2RwbGxfcGFyYW06CisJYWRyCXIwLCBtcHVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtCitnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtOgorCWFkcglyMCwgaXZhXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0KK2dldF8zNnhfY29yZV9kcGxsX3BhcmFtOgorCWFkcglyMCwgY29yZV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0KK2dldF8zNnhfcGVyX2RwbGxfcGFyYW06CisJYWRyCXIwLCBwZXJfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YzEyZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IKKyAqICAgICAgYWNjZXNzaW5nIERpZ2l0YWwgUGhhc2VkIExvY2sgTG9vcCAoRFBMTCkgcGFyYW1ldGVycyBhbmQKKyAqICAgICAgc2V0dGluZ3MuCisgKgorICovCisKKyNpZm5kZWYgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0o0OV9QTEFURk9STV9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoKKyAqIFR5cGUgRGVmaW5pdGlvbnMKKyAqLworCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCisKK3N0cnVjdCBkcGxsX3BhcmFtIHsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgZnNlbDsKKwl1MzIgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1MzIgc3lzX2NsazsKKwl1MzIgbTsKKwl1MzIgbjsKKwl1MzIgbTI7CisJdTMyIG0zOworCXUzMiBtNDsKKwl1MzIgbTU7CisJdTMyIG02OworCXUzMiBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworLyoKKyAqIElubGluZSBGdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIHBsYXRmb3JtLlMuCisgKi8KKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX05FU1RfSjQ5X1BMQVRGT1JNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0NVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IGNsb2NrIHNldC11cCBmb3IgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQKKyAqICAgICAgQ2xvY2sgTWFuYWdlciAoUFJDTSkKKyAqCisgKiAgICAgIFRoaXMgaXMgb3JpZ2luYWxseSBpbmhlcml0ZWQgYW5kIHNwbGl0IGZyb20gdGhlIE9NQVAzIEVWTQorICogICAgICBib2FyZCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qCisgKiAgdTMyIGdldF9vc2NfY2xrX3NwZWVkKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQgYmFzZWQgb24KKyAqICAgIGEga25vd24gMzIga0h6IGNsb2NrIGFuZCBnZW5lcmFsIHB1cnBvc2UgdGltZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIGNsb2NrIHNwZWVkLgorICoKKyAqLworc3RhdGljIHUzMgorZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIGNkaXYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisKKwlpZiAodmFsICYgQklUNykKKwkJY2RpdiA9IDI7CisJZWxzZSBpZiAodmFsICYgQklUNikKKwkJY2RpdiA9IDE7CisJZWxzZQorCQkvKgorCQkgKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSEKKwkJICogVEJEOiBBZGQgYSBXQVJOKCkvQlVHKCkKKwkJICogICAgICBGb3Igbm93LCBhc3N1bWUgZGl2aWRlciBhcyAxLgorCQkgKi8KKwkJY2RpdiA9IDE7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJaWYgKGNkaXYgPT0gMikKKwl7CisJCWNkaWZmICo9IDI7CisJfQorCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qCisgKiAgdm9pZCBnZXRfc3lzX2Nsa2luX3NlbCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgUFJDTSBQUk0gc3lzdGVtIGNsb2NrCisgKiAgICBmcmVxdWVuY3kgc2VsZWN0b3IsIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIHRvIFBSTV9DTEtTRUwuCisgKgorICogIElucHV0KHMpOgorICogICAgaGVydHogIC0gVGhlIHNwZWVkLCBpbiBNSHosIHRoYXQgdGhlIHN5c3RlbSBjbG9jayBpcyBiZWxpZXZlZAorICogICAgICAgICAgICAgICB0byBiZSBydW5uaW5nIGF0LgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgaW5kZXggdXNlZCB0byBhY2Nlc3MgdGhlCisgKiAgICAgICAgICAgICAgIGRpZ2l0YWwgUExMIHNldHRpbmdzLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBmb3IgdGhlIGRpZ2l0YWwgUExMIHNldHRpbmdzCisgKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjbG9jayByYXRlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorZ2V0X3N5c19jbGtpbl9zZWwodTMyIGhlcnR6LCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJc3dpdGNoIChoZXJ0eikgeworCisJY2FzZSBTMzhfNE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzM4XzRfTUhaOworCQlicmVhazsKKworCWNhc2UgUzI2TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMjZfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTlfMk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE2XzhNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxM006CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEzXzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEyTToKKwlkZWZhdWx0OgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWjsKKwkJYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgPSBwdHIgKyBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJCS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CQkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJCS8qIHNldCBNMyAqLworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoUEVSSVBIX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFsyMDoyM10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKSA6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2RwbGwzX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzZYKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAoraXZhX2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogIHZvaWQgcHJjbV9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgY2xvY2tzIGluIGEgYm9hcmQtc3BlY2lmaWMgbWFubmVyIGZvcgorICogICAgdGhlIHByb2Nlc3NvcidzIFBvd2VyLCBSZXNldCBhbmQgQ2xvY2sgTWFuYWdlciAoUFJDTSkgYW5kIGlzCisgKiAgICBjYWxsZWQgb25seSB3aGVuIGFuIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vCisgKiAgICBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgc3lzX2Nsa19yYXRlID0gMCwgc3lzX2Nsa2luX3NlbCwgc3lzX2Nsa19kaXY7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCXN5c19jbGtfcmF0ZSA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwoc3lzX2Nsa19yYXRlLCAmc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBTZXQgdGhlIFBSTV9DTEtTRUxfU1lTX0NMS0lOX1NFTCB2YWx1ZSBpbiB0aGUgcHJvY2Vzc29yLiAqLworCisJc3IzMihQUkNNX1BSTV9DQ1JfQ0xLU0VMLAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJULAorCQkgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMsCisJCSBzeXNfY2xraW5fc2VsKTsKKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZSBieSB0d28uCisJICoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisKKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYKKwkgICAoc3lzX2Nsa2luX3NlbCA+IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWikpIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMjsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDI7CisKKwl9IGVsc2UgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8xOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMTsKKworCX0KKworCXNyMzIoUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfU1RBUlQsCisJCSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUywKKwkJIHN5c19jbGtfZGl2KTsKKworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCWRwbGwzX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci94LWxvYWQubGRzCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIFgtTG9hZGVyIGxpbmtlciBzY2F0dGVyIGZpbGUgZm9yIHRoZSBOZXN0CisgKiAgICAgIExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICovCisKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTRhOTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBqNDkubyBtdXgubyBwcmNtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikKKworU1JDUyAgICA6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUyAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoU09CSlMpICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoU09CSlMpICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46ICBjbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEzODBjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjEgQEAKKworCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDA4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvajQ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNGM1MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfSjQ5X0JPT1RfREVWSUNFUyAoMykKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9KNDlfQk9PVF9ERVZJQ0VTXTsKKwljb25zdCB1MzIgbWVtX29yZGVyID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKworCS8vIHNldCBkZWZhdWx0cworCWludCBudW1iZXJfb2ZfZGV2aWNlcyA9IDA7CisJKmRldmljZXNfbGlzdCA9ICZsaXN0WzBdOworCisJc3dpdGNoIChtZW1fb3JkZXIpIHsKKwljYXNlIDE1OgorCQlsaXN0WzBdID0gR1BNQ19OQU5EOworCQlsaXN0WzFdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMl0gPSBNTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJbGlzdFswXSA9IE1NQ19OQU5EOworCQlsaXN0WzFdID0gR1BNQ19OQU5EOworCQlsaXN0WzJdID0gVVNCX1BFUklQSEVSQUw7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM3ZGYwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBHUElPXzQyCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uaCBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YzEyZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0o0OV9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0o0OV9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMjBhZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMTcxMGgzLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUzYzc2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIyBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDQKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBLc2hpdGlqIEd1cHRhIDxLc2hpdGlqQHRpLmNvbT4KKyMKKyMgVEkgSDMgYm9hcmQgd2l0aCBPTUFQMTcxMCAoQVJNOTI1RUpTKSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBJbm5vdmF0b3IgaGFzIDEgYmFuayBvZiAyNTYgTUIgU0RSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgMTAwMCcwMDAwIHRvIDIwMDAnMDAwMAorIworIworIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgMTAwMCc4MDAwLCBlbnRyeSAxMDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byAxMTA4JzAwMDAKKyMKKyMKKworUExBVEZPUk1fTERGTEFHUyArPSAtbm8td2Fybi1taXNtYXRjaAorVEVYVF9CQVNFID0gMHgxMTA4MDAwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL29tYXAxNzEwaDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVjZmUyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE3MTApCisjaW5jbHVkZSA8Li9jb25maWdzL29tYXAxNTEwLmg+CisjZW5kaWYKKyAgCisjZGVmaW5lIENPTVBfTU9ERV9FTkFCTEUgKCh1bnNpZ25lZCBpbnQpMHgwMDAwRUFFRikKKworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisjaWZkZWYgQ0ZHX1BSSU5URiAKKworICAJLyogc2V0dXAgZm9yIFVBUlQxICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF8wKSAmPSB+KDB4MDIwMDAwMDApOwkvKiBiaXQgMjUgKi8KKyAgCS8qIGJpdCAyOSBmb3IgVUFSVDEgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClNT0RfQ09ORl9DVFJMXzApICY9IH4oMHgwMDAwMjAwMCk7CisgIAorCS8qIEVuYWJsZSB0aGUgcG93ZXIgZm9yIFVBUlQxICovCisjZGVmaW5lIFVBUlQxXzQ4TUhaX0VOQUJMRQkoKHVuc2lnbmVkIHNob3J0KTB4MDIwMCkKKyNkZWZpbmUgU1dfQ0xPQ0tfUkVRVUVTVAkweEZGRkUwODM0CisJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilTV19DTE9DS19SRVFVRVNUKSB8PSBVQVJUMV80OE1IWl9FTkFCTEU7CisKKyNlbmRpZgorCisgCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUNPTVBfTU9ERV9DVFJMXzApID0gQ09NUF9NT0RFX0VOQUJMRTsKKyAgCXJldHVybiAwOworfQorCisjZGVmaW5lIEdQSU8xX0RJUkVDVElPTgkJMHhGRkZCRTQzNAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0YJCTB4RkZGRTEwOTQKKyNkZWZpbmUgUFVfUERfU0VMXzQJCQkweEZGRkUxMEM0CisvKgorICogT24gSDMgYm9hcmQsIE5hbmQgUi9CIGlzIHRpZWQgdG8gR1BJT18xMAorICogV2Ugc2V0dXAgdGhpcyBHUElPIHBpbiAKKyAqLworaW50IG5hbmRfaW5pdCAodm9pZCkKK3sKKyAgIAkKKyAJLyogR1BJT18xMCBmb3IgaW5wdXQuIGl0IGlzIGluIEdQSU8xIG1vZHVsZSAqLworIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClHUElPMV9ESVJFQ1RJT04pIHw9IDB4MDQwMDsgCisJCisJLyogR1BJTzEwIEZ1bmNfTVVYX0NUUkwgcmVnIGJpdCAyOToyNywgQ29uZmlndXJlIFYyIHRvIG1vZGUxIGFzIEdQSU8gKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClGVU5DX01VWF9DVFJMX0YpICY9IDB4QzdGRkZGRkY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF9GKSB8PSAweDA4MDAwMDAwOworCSAgCisJLyogR1BJTzEwIHB1bGx1cC9kb3duIHJlZ2lzdGVyLCBFbmFibGUgcHVsbHVwIG9uIEdQSU8xMCAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KVBVX1BEX1NFTF80KSB8PSAweDA4OworIAkgCisgCWlmIChuYW5kX2NoaXAoKSl7CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7fQorIApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjRlM2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogS3NoaXRpaiBHdXB0YSA8S3NoaXRpakB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2luY2x1ZGUgPC4vY29uZmlncy9vbWFwMTUxMC5oPgorI2VuZGlmCisKKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKy5nbG9ibCBwbGF0Zm9ybXNldHVwCitwbGF0Zm9ybXNldHVwOgorCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBTZXQgdXAgQVJNIENMTSByZWdpc3RlcnMgKElETEVDVDEpICAgICAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfQVJNX0lETEVDVDEKKwlsZHIJcjEsCVZBTF9BUk1fSURMRUNUMQorCXN0cglyMSwJW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QyKSAgCQkgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfQVJNX0lETEVDVDIKKwlsZHIJcjEsCVZBTF9BUk1fSURMRUNUMgorCXN0cglyMSwJW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QzKQkJICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QzCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDMKKwlzdHIJcjEsCVtyMF0KKworCisJbW92CXIxLAkjMHgwNQkJLyogUEVSX0VOIGJpdCAqLworCWxkcglyMCwJUkVHX0FSTV9SU1RDVDIKKwlzdHJoCXIxLAlbcjBdCQkvKiBDTEtNOyBQZXJpcGhlcmFsIHJlc2V0LiAqLworCisJLyogU2V0IENMS00gdG8gU3luYy1TY2FsYWJsZQkqLworCS8qIEkgc3VwcG9zZWRseSBuZWVkIHRvIGVuYWJsZSB0aGUgZHNwIGNsb2NrIGJlZm9yZSBzd2l0Y2hpbmcgKi8KKwlsZHIJcjEsCVZBTF9BUk1fU1lTU1QKKwlsZHIJcjAsCVJFR19BUk1fU1lTU1QKKwlzdHJoCXIxLAlbcjBdCisJbW92CXIwLAkjMHg0MDAKKzE6CisJc3VicwlyMCwJcjAsCSMweDEJLyogd2FpdCBmb3IgYW55IGJ1YmJsZXMgdG8gZmluaXNoICovCisJYm5lCTFiCisJbGRyCXIxLAlWQUxfQVJNX0NLQ1RMCisJbGRyCXIwLAlSRUdfQVJNX0NLQ1RMCisJc3RyaAlyMSwJW3IwXQorCisJLyogYSBmZXcgbm9wcyB0byBsZXQgc2V0dGxlICovCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisKKwkvKiBzZXR1cCBEUExMIDEgKi8KKwkvKiBSYW1wIHVwIHRoZSBjbG9jayB0byA5Nk1oeiAqLworCWxkcglyMSwJVkFMX0RQTEwxX0NUTAorCWxkcglyMCwJUkVHX0RQTEwxX0NUTAorCXN0cmgJcjEsCVtyMF0KKwlhbmRzCXIxLAlyMSwJIzB4MTAJLyogQ2hlY2sgaWYgUExMIGlzIGVuYWJsZWQuICovCisJYmVxCWxvY2tfZW5kCS8qIERvIG5vdCBsb29rIGZvciBsb2NrIGlmIEJZUEFTUyBzZWxlY3RlZCAqLworMjoKKwlsZHJoCXIxLAlbcjBdCisJYW5kcwlyMSwJcjEsCSMweDAxCS8qCUNoZWNrIHRoZSBMT0NLIGJpdC4qLworCWJlcSAyYgkJCS8qCWxvb3AgdW50aWwgYml0IGdvZXMgaGkuICovCitsb2NrX2VuZDoKKworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogVHVybiBvZmYgdGhlIHdhdGNoZG9nIGR1cmluZyBpbml0Li4uCQkJKgorIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXIwLAlSRUdfV0FUQ0hET0cKKwlsZHIJcjEsCVdBVENIRE9HX1ZBTDEKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjEsCVdBVENIRE9HX1ZBTDIKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XU1BSRE9HCisJbGRyCXIxLAlXU1BSRE9HX1ZBTDEKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XV1BTRE9HCisKK3dhdGNoMVdhaXQ6CisJbGRyCXIxLAlbcjBdCisJdHN0CXIxLAkjMHgxMAorCWJuZQl3YXRjaDFXYWl0CisKKwlsZHIJcjAsCVJFR19XU1BSRE9HCisJbGRyCXIxLAlXU1BSRE9HX1ZBTDIKKwlzdHIJcjEsCVtyMF0KKwlsZHIJcjAsCVJFR19XV1BTRE9HCit3YXRjaDJXYWl0OgorCWxkcglyMSwJW3IwXQorCXRzdAlyMSwJIzB4MTAKKwlibmUJd2F0Y2gyV2FpdAorCisKKwkvKiBTZXQgbWVtb3J5IHRpbWluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbmV3IGNsb2NrIHNwZWVkICovCisgCSAKKwkvKgorCSogRGVsYXkgZm9yIFNEUkFNIGluaXRpYWxpemF0aW9uLgorCSovCisJbW92CXIzLAkjMHgxODAwCQkvKiB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCAqLworMzoKKwlzdWJzCXIzLAlyMywJIzB4MQkvKiBEZWNyZW1lbnQgY291bnQgKi8KKwlibmUgCTNiCisKKworCS8qCisJICogU2V0IFNEUkFNIGNvbnRyb2wgdmFsdWVzLiBEaXNhYmxlIHJlZnJlc2ggYmVmb3JlIE1SUyBjb21tYW5kLgorCSAqLworCisJLyogbW9iaWxlIGRkciBvcGVyYXRpb24gKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9PUEVSQVRJT04KKwltb3YJcjIsCSMwNworCXN0cglyMiwJW3IwXQorCisJLyogY29uZmlnIHJlZ2lzdGVyICovCisJbGRyCXIwLAlSRUdfU0RSQU1fQ09ORklHCisJbGRyCXIxLAlTRFJBTV9DT05GSUdfVkFMCisJc3RyCXIxLAlbcjBdCisKKwkvKiBtYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX01BTlVBTF9DTUQKKwkvKiBpc3N1ZSBzZXQgY2tlIGhpZ2ggKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fQ0tFX1NFVF9ISUdICisJc3RyCXIxLAlbcjBdCisJLyogaXNzdWUgbm9wICovCisJbW92CXIxLAkjQ01EX1NEUkFNX05PUAorCXN0cglyMSwJW3IwXQorCisJbW92CXIyLAkjMHgwMTAwCit3YWl0TUREUjE6CisJc3VicwlyMiwJcjIsCSAjMQorCWJuZQl3YWl0TUREUjEJLyogZGVsYXkgbG9vcCAqLworCisJLyogaXNzdWUgcHJlY2hhcmdlICovCisJbW92CXIxLAkjQ01EX1NEUkFNX1BSRUNIQVJHRQorCXN0cglyMSwJW3IwXQorCisKKwkvKiBpc3N1ZSBhdXRvcmVmcmVzaCB4IDIgKi8KKwltb3YJcjEsCSNDTURfU0RSQU1fQVVUT1JFRlJFU0gKKwlzdHIJcjEsCVtyMF0KKwlzdHIJcjEsCVtyMF0KKworCS8qIG1ycyByZWdpc3RlciBkZHIgbW9iaWxlICovCisJbGRyCXIwLAlSRUdfU0RSQU1fTVJTCisJbW92CXIxLAkjMHgzMworCXN0cglyMSwJW3IwXQorCisJLyogZW1yczEgbG93LXBvd2VyIHJlZ2lzdGVyICovCisJbGRyCXIwLAlSRUdfU0RSQU1fRU1SUzEKKwkvKiBzZWxmIHJlZnJlc2ggb24gYWxsIGJhbmtzICovCisJbW92CXIxLAkjMAorCXN0cglyMSwJW3IwXQorCisJbGRyCXIwLAlSRUdfRExMX1VSRF9DT05UUk9MCisJbGRyCXIxLAlETExfVVJEX0NPTlRST0xfVkFMCisJc3RyCXIxLAlbcjBdCisKKwlsZHIJcjAsCVJFR19ETExfTFJEX0NPTlRST0wKKwlsZHIJcjEsCURMTF9MUkRfQ09OVFJPTF9WQUwKKwlzdHIJcjEsCVtyMF0KKworCWxkcglyMCwJUkVHX0RMTF9XUlRfQ09OVFJPTAorCWxkcglyMSwJRExMX1dSVF9DT05UUk9MX1ZBTAorCXN0cglyMSwJW3IwXQorCisJLyogZGVsYXkgbG9vcCAqLworCW1vdglyMiwJIzB4MDEwMAord2FpdE1ERFIyOgorCXN1YnMJcjIsCXIyLAkjMQorCWJuZQl3YWl0TUREUjIKKworCS8qCisJICogRGVsYXkgZm9yIFNEUkFNIGluaXRpYWxpemF0aW9uLgorCSAqLworCW1vdglyMywJIzB4MTgwMAorNDoKKwlzdWJzCXIzLAlyMywJIzEJLyogRGVjcmVtZW50IGNvdW50LiAqLworCWJuZQk0YgorCWIJY29tbW9uX3RjCisKK3NraXBfc2RyYW06CisKKwlsZHIJcjAsCVJFR19TRFJBTV9DT05GSUcKKwlsZHIJcjEsCVNEUkFNX0NPTkZJR19WQUwKKwlzdHIJcjEsCVtyMF0KKworCS8qIEVuYWJsZSBFTUlGRiBUQyBEb3VibGVyIGluIE9NQVAxNzEwICovCisJbGRyCXIwLAlSRUdfRU1JRkZfRE9VQkxFUgorCW1vdglyMCwJIzB4MTsKKworY29tbW9uX3RjOgorCS8qIHNsb3cgaW50ZXJmYWNlICovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ09ORklHCisJbGRyCXIwLAlSRUdfVENfRU1JRlNfQ09ORklHCisJc3RyCXIxLAlbcjBdCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKKwkvKiBDaGlwIFNlbGVjdCAzIGZvciBOQU5EKi8KKwlsZHIJcjEsCVZBTF9UQ19FTUlGU19DUzNfQ09ORklHCisJbGRyCXIwLAlSRUdfVENfRU1JRlNfQ1MzX0NPTkZJRworCXN0cglyMSwJW3IwXSAKKyNlbHNlCisJLyogQ2hpcCBTZWxlY3QgMiBmb3IgTkFORCovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ1MyX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NTMl9DT05GSUcKKwlzdHIJcjEsCVtyMF0gCisjZW5kaWYKKyAgCisgICAgICAgIC8qIFN0YXJ0IE1QVSBUaW1lciAxICovCisgICAgICAgIGxkciAgICAgcjAsICAgICBSRUdfTVBVX0xPQURfVElNRVIKKyAgICAgICAgbGRyICAgICByMSwgICAgIFZBTF9NUFVfTE9BRF9USU1FUgorICAgICAgICBzdHIgICAgIHIxLCAgICAgW3IwXQorCisgICAgICAgIGxkciAgICAgcjAsICAgICBSRUdfTVBVX0NOVExfVElNRVIKKyAgICAgICAgbGRyICAgICByMSwgICAgIFZBTF9NUFVfQ05UTF9USU1FUgorICAgICAgICBzdHIgICAgIHIxLCAgICAgW3IwXQorCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCisKK1JFR19UQ19FTUlGU19DT05GSUc6CQkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MwYworI2lmZGVmIENGR19CT09UX0NTMAorUkVHX1RDX0VNSUZTX0NTM19DT05GSUc6CS8qIDMyIGJpdHMgKi8KKwkud29yZCAweGZmZmVjYzFjCisjZWxzZQorUkVHX1RDX0VNSUZTX0NTMl9DT05GSUc6CS8qIDMyIGJpdHMgKi8KKwkud29yZCAweGZmZmVjYzE4CisjZW5kaWYKKyAKKy8qIE1QVSBjbG9jay9yZXNldC9wb3dlciBtb2RlIGNvbnRyb2wgcmVnaXN0ZXJzICovCitSRUdfQVJNX0NLQ1RMOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTAwCisKK1JFR19BUk1fSURMRUNUMzoJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTI0CitSRUdfQVJNX0lETEVDVDI6CQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UwOAorUkVHX0FSTV9JRExFQ1QxOgkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMDQKKworUkVHX0FSTV9SU1RDVDI6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMTQKK1JFR19BUk1fU1lTU1Q6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMTgKKy8qIERQTEwgY29udHJvbCByZWdpc3RlcnMgKi8KK1JFR19EUExMMV9DVEw6CQkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNmMDAKKworLyogV2F0Y2ggRG9nIHJlZ2lzdGVyICovCisvKiBzZWN1cmUgd2F0Y2hkb2cgc3RvcCAqLworUkVHX1dTUFJET0c6CisJLndvcmQgMHhmZmZlYjA0OAorLyogd2F0Y2hkb2cgd3JpdGUgcGVuZGluZyAqLworUkVHX1dXUFNET0c6CisJLndvcmQgMHhmZmZlYjAzNAorCitXU1BSRE9HX1ZBTDE6CisJLndvcmQgMHgwMDAwYWFhYQorV1NQUkRPR19WQUwyOgorCS53b3JkIDB4MDAwMDU1NTUKKworLyogU0RSQU0gY29uZmlnIGlzOiBhdXRvIHJlZnJlc2ggZW5hYmxlZCwgMTYgYml0IDQgYmFuaywKKyBjb3VudGVyIEA4MTkyIHJvd3MsIDEwIG5zLCA4IGJ1cnN0ICovCitSRUdfU0RSQU1fQ09ORklHOgorCS53b3JkIDB4ZmZmZWNjMjAKKworLyogT3BlcmF0aW9uIHJlZ2lzdGVyICovCitSRUdfU0RSQU1fT1BFUkFUSU9OOgorCS53b3JkIDB4ZmZmZWNjODAKKworUkVHX0VNSUZGX0RPVUJMRVI6CisJLndvcmQgMHhmZmZlY2M2MAorCisvKiBNYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworUkVHX1NEUkFNX01BTlVBTF9DTUQ6CisJLndvcmQgMHhmZmZlY2M4NAorCisvKiBTRFJBTSBNUlMgKE5ldykgY29uZmlnIGlzOiBDQVMgbGF0ZW5jeSBpcyAyLCBidXJzdCBsZW5ndGggOCAqLworUkVHX1NEUkFNX01SUzoKKwkud29yZCAweGZmZmVjYzcwCisKKy8qIFNEUkFNIE1SUyAoTmV3KSBjb25maWcgaXM6IENBUyBsYXRlbmN5IGlzIDIsIGJ1cnN0IGxlbmd0aCA4ICovCitSRUdfU0RSQU1fRU1SUzE6CisJLndvcmQgMHhmZmZlY2M3OAorCisvKiBXUlQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX1dSVF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjNjQKK0RMTF9XUlRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMzUwMDAwMgorCisvKiBVUkQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX1VSRF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjYzAKK0RMTF9VUkRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMDAwMDAwNgorCisvKiBMUkQgRExMIHJlZ2lzdGVyICovCitSRUdfRExMX0xSRF9DT05UUk9MOgorCS53b3JkIDB4ZmZmZWNjY2MKKworUkVHX1dBVENIRE9HOgorCS53b3JkIDB4ZmZmZWM4MDgKKworUkVHX01QVV9MT0FEX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmVjNjAwCitSRUdfTVBVX0NOVExfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZWM1MDAKKworLyogOTYgTUh6IFNhbXN1bmcgTW9iaWxlIEREUiAqLworU0RSQU1fQ09ORklHX1ZBTDoKKwkud29yZCAweDBjMDI4YWY0CisKK0RMTF9MUkRfQ09OVFJPTF9WQUw6CisJLndvcmQgMHgwMDAwMDAwNgorCitWQUxfQVJNX0NLQ1RMOgorCS53b3JkIDB4MzUwZQorVkFMX0FSTV9TWVNTVDoKKwkud29yZCAweDEwMDEKKworVkFMX0RQTEwxX0NUTDoKKwkud29yZCAweDI4MTAKKworI2lmZGVmIENGR19CT09UX0NTMAorVkFMX1RDX0VNSUZTX0NPTkZJRzoKKwkud29yZCAweDAwMDAwMDEwIAorVkFMX1RDX0VNSUZTX0NTM19DT05GSUc6CQorIAkud29yZCAweGZmODBmZmYzICAgCisjZWxzZQorVkFMX1RDX0VNSUZTX0NPTkZJRzoKKwkud29yZCAweDAwMDAwMDEyICAgLypzd2FwIENTMC9DUzMgYWRkcmVzc2luZyAqLworVkFMX1RDX0VNSUZTX0NTMl9DT05GSUc6CQorIAkud29yZCAweGZmODBmZmYzICAgCisjZW5kaWYKKworIAorVkFMX1RDX0VNSUZGX1NEUkFNX0NPTkZJRzoKKwkud29yZCAweDAxMDI5MGZjCitWQUxfVENfRU1JRkZfTVJTOgorCS53b3JkIDB4MDAwMDAwMjcKKworVkFMX0FSTV9JRExFQ1QxOgorCS53b3JkIDB4MDAwMDE0YzYKKworVkFMX0FSTV9JRExFQ1QyOgorCS53b3JkIDB4MDAwMDA5ZmYKK1ZBTF9BUk1fSURMRUNUMzoKKwkud29yZCAweDAwMDAwMDNmCisKK1dBVENIRE9HX1ZBTDE6CisJLndvcmQgMHgwMDAwMDBmNQorV0FUQ0hET0dfVkFMMjoKKwkud29yZCAweDAwMDAwMGEwCisKK1ZBTF9NUFVfTE9BRF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZmZmZmZgorVkFMX01QVV9DTlRMX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmZmZmExCisKKy8qIGNvbW1hbmQgdmFsdWVzICovCisuZXF1IENNRF9TRFJBTV9OT1AsCQkweDAwMDAwMDAwCisuZXF1IENNRF9TRFJBTV9QUkVDSEFSR0UsCTB4MDAwMDAwMDEKKy5lcXUgQ01EX1NEUkFNX0FVVE9SRUZSRVNILAkweDAwMDAwMDAyCisuZXF1IENNRF9TRFJBTV9DS0VfU0VUX0hJR0gsCTB4MDAwMDAwMDcKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg0ZWVhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy94LWxvYWQubGRzCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCS4gPSBBTElHTig0KTsKKwkudGV4dAk6CisJeworCSAgY3B1L2FybTkyNmVqcy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKyAJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDc0MjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDI0MjBoNC5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3NzBmMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgVEkgSDQgYm9hcmQgd2l0aCBPTUFQMjQyMCAoQVJNMTEzNikgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDY0TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgSDQgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMC8wMDAwIChiYW5rMSkgRVMyIHdpbGwgYmUgY29uZmlndXJhYmxlCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCA4MDAwJzgwMDAsIGVudHJ5IDgwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKworIyBGb3IgdXNlIHdpdGggZXh0ZXJuYWwgb3IgaW50ZXJuYWwgYm9vdHMuCisjIENPTkZJR19QQVJUSUFMX1NSQU0gbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSB0aGlzLgorVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIFVzZWQgd2l0aCBmdWxsIFNSQU0gYm9vdC4KKyMgVGhpcyBpcyBlaXRoZXIgd2l0aCBhIEdQIHN5c3RlbSBvciBhIHNpZ25lZCBib290IGltYWdlLgorIyBlYXNpZXN0LCBhbmQgc2FmZXN0IHdheSB0byBnbyBpZiB5b3UgY2FuLgorIyBDb21tZW50IG91dCAvL0NPTkZJR19QQVJUSUFMX1NSQU0gZm9yIHRoaXMgb25lLgorIworI1RFWFRfQkFTRSA9IDB4NDAyODAwMDAKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjgxYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MjAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKTsKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIG11eFNldHVwVUFSVDEodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfY3B1X3Jldih2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgordm9pZAorY29uZmlnX3NkcmFtX2Rkcih1MzIgcmV2KQoreworCS8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKwlfX3Jhd193cml0ZWIoMHgwOCwgMHg0ODAwMDAzMik7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJCV9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwl9IGVsc2UgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwl9CisKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQV8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxCXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisKKwkvKiAKKwkgKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyCisJICogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkKKwkgKiBTZXJpYWwgbW9kZQorCSAqIENBUyBsYXRlbmN5ID0gMyAKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgU0RSQ19NUl8wKTsKKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgU0RSQ19ETExCX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KKworfQorI2VuZGlmIC8vIENGR19TRFJBTV9ERFIKKworCisjaWZkZWYgQ0ZHX1NEUkFNX0NPTUJPIAordm9pZAorY29uZmlnX3NkcmFtX2NvbWJvKHUzMiByZXYpCit7CisKKwl1MzIgZGxsY3RybD0wOworCisgICAgICAgIC8qIGJhbGwgQzEyLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOworICAgICAgICAvKiBiYWxsIEQxMSwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKyAgICAgICAgLyogYmFsbCBCMTMsIG1vZGUgMCAtIGZvciBDS0UxIChub3QgbmVlZGVkIHJrdyBmb3IgY29tYm8pICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsKKworICAgICAgICAvKmNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtLiBJc3N1ZSBzb2Z0IHJlc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgIGRlbGF5KDIwMDAwMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKyAgICAgICAgLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisKKyAgICAgICAgLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisgICAgICAgIC8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKyAgICAgICAgLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisgICAgICAgIC8qIENTMSBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHosIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgMHg2ODAwOTBkNCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMSk7CisKKyAgICAgICAgLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorCQlkbGxjdHJsID0gKEJJVDB8QklUMyk7CisJZWxzZQorCQlkbGxjdHJsID0gQklUMDsJCQorCisgICAgICAgIGlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9jayBhbmQgZ28gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOyAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54ID8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQl9DVFJMKTsgLy8gRVMyLngKKyAgICAgICAgfQorfQorCisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0NPTUJPCisKKyNpZmRlZiBDRkdfU0RSQU1fU0RSIAordm9pZAorY29uZmlnX3NkcmFtX3Nkcih1MzIgcmV2KQoreworCXUzMiBkbGxjdHJsPTA7CisKKwkvKiBiYWxsIEQxMSwgbW9kZSAwICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOworCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBDaGlwLWxldmVsIHNoYXJlZCBpbnRlcmZhY2UgbWFuYWdlbWVudCAqLworCS8qIFNEUkNUcmlTdGF0ZTogbm8gVHJpcyAqLworCS8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCS8qIENTMU11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpCisJCV9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwllbHNlCisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworCS8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworCS8qIENvbmZpZ3VyZSB0byBNVVgxNDogMzJNYngzMiAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTURDRkdfMF9TRFIsIFNEUkNfTUNGR18wKTsgLyogZGlmZiBmcm9tIGNvbWJvIGNhc2UgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gMiAtIFNEUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01SXzBfU0RSLCBTRFJDX01SXzApOyAgLyogZGlmZiBmcm9tIGNvbWJvIGNhc2UgKi8KKworCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorICAgICAgICAgICAgICAgIGRsbGN0cmwgPSAoQklUMHxCSVQzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRsbGN0cmwgPSBCSVQwOworCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvY2sgYW5kIGdvICovCisJfQorCWVsc2UgeworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KKyAgIAorfQorI2VuZGlmIC8vIENGR19TRFJBTV9TRFIKKworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VEIAordm9pZAorY29uZmlnX3NkcmFtX3N0YWNrZWQodTMyIHJldikKK3sKKworCS8qIFBpbiBNdXhpbmcgZm9yIFNEUkMgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CS8qIG11eCBtb2RlIDAgKENTMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CS8qIG11eCBtb2RlIDAgKENLRTEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOwkvKiBjb25uZWN0IHNkcmNfYTEyICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzEpOwkvKiBjb25uZWN0IHNkcmNfYTEzICovCisKKwkvKiBjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIG5vIGlkbGUgYWNrIGFuZCBSRVNFVCBlbmFibGUgKi8KKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgbW9kZSAqLworCisJLyogU0RSQ19TSEFSSU5HICovCisJLyogVS1ib290IGlzIHdyaXRpbmcgMHgwMDAwMDEwMCB0aG91Z2ggKEg0XzI0MjBfU0RSQ19TSEFSSU5HICkgKi8KKwkvL19fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDA0OTAwLCBTRFJDX1NIQVJJTkcpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCS8qIE5vbmUgZm9yIEVTMi4xICovCisKKwkvKiAgU0RSQ19DUzEgQ29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX0NTX0NGRyk7CS8qIFJlbWFwIENTMSB0byAweDgwMDAwMDAwICovCisKKwkvKiBEaXNhYmxlIHBvd2VyIGRvd24gb2YgQ0tFICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwODUsIFNEUkNfUE9XRVIpOworCisJX19yYXdfd3JpdGVsKDB4MDFBMDIwMTksIFNEUkNfTUNGR18xKTsJLyogU0RSQ19NQ0ZHMSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDNERDAzLCBTRFJDX1JGUl9DVFJMMSk7CS8qIFNEUkNfUkZSX0NUUkwxICovCisJX19yYXdfd3JpdGVsKDB4OTJEREM0ODUsIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEEwICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTQsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEIwICovCisKKwkvKk1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzEpOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKworCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCBTRFJDX01SXzEpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDIwLCBTRFJDX0VNUjJfMSk7CS8qIHdlYWstc3RyZW5ndGggZHJpdmVyICovCisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9CisJZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU1RBQ0tFRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHNfaW5pdChpbnQgc2tpcCkKK3sKKwl1MzIgICByZXY7CisKKwlyZXYgPSBnZXRfY3B1X3JldigpOworCisJd2F0Y2hkb2dfaW5pdCgpOworCW11eFNldHVwVUFSVDEoKTsKKwlkZWxheSgxMDApOworCisJLypEUExMIG91dCA9IDJ4IERQTEwgLS0+IGNvcmUgY2xvY2sgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9PVVQsIENNX0NMS1NFTDJfUExMKTsKKworCS8qRFBMTCBpbnRvIGxvdyBwb3dlciBieXBhc3MgKG90aGVycyBvZmYpICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIENNX0NMS0VOX1BMTCk7CisKKwkvKk1QVSBjb3JlIGNsb2NrID0gQ29yZSAvMiA9IDMwMCAqLworCV9fcmF3X3dyaXRlbChNUFVfRElWLCBDTV9DTEtTRUxfTVBVKTsKKworCS8qRFNQaWY9MjAwLCBEU1BpZj0xMDAsIElWQT0yMDAgKi8KKwlfX3Jhd193cml0ZWwoRFNQX0RJViwgQ01fQ0xLU0VMX0RTUCk7CisKKwkvKkdGWCBjbG9jayAoTDMvMikgNTBNSHogKi8KKwlfX3Jhd193cml0ZWwoR0ZYX0RJViwgQ01fQ0xLU0VMX0dGWCk7CisKKwkvKkwzPTEwMCwgTDQ9MTAwLCBEaXNwbGF5U1M9NTAgVmx5bmM9OTZNaHosc3NpPTEwMCwgdXNiPTUwICovCisJX19yYXdfd3JpdGVsKEJVU19ESVYsIENNX0NMS1NFTDFfQ09SRSk7CisKKwkvKjEyTUh6IGFwbGwgc3JjLCAxMi8oMSsxKSo1MD0zMDAgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9WQUwsIENNX0NMS1NFTDFfUExMKTsKKworCS8qVmFsaWQgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgUFJDTV9DTEtDRkdfQ1RSTCk7CisJZGVsYXkoMTAwMCk7CisKKwkvKkVuYWJsZSBEUExMPTMwMCwgOTZNSHogQVBMTCBsb2NrZWQuICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMEYsIENNX0NMS0VOX1BMTCk7CisJZGVsYXkoMjAwMDAwKTsKKworI2lmZGVmIENGR19TRFJBTV9ERFIKKwljb25maWdfc2RyYW1fZGRyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9DT01CTykKKwljb25maWdfc2RyYW1fY29tYm8ocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX1NEUikKKwljb25maWdfc2RyYW1fc2RyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TVEFDS0VEKQorCWNvbmZpZ19zZHJhbV9zdGFja2VkKHJldik7CisjZWxzZQorI2Vycm9yIFNEUkFNIHR5cGUgbm90IHN1cHBvcnRlZAorI2VuZGlmCQorCisJZGVsYXkoMjAwMDApOworCXBlcmlwaGVyYWxfZW5hYmxlKCk7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworI2RlZmluZSBHUCAoQklUOHxCSVQ5KQorCisJLyogVGhlcmUgYXJlIDQgd2F0Y2ggZG9ncy4gIDEgc2VjdXJlLCBhbmQgMyBnZW5lcmFsIHB1cnBvc2UuCisJICogSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgUk9NIHRha2VzIGNhcmUgb2YgdGhlIHNlY3VyZSBvbmUsCisJICogYnV0IHdlIHdpbGwgdHJ5IGFsc28uICBPZiB0aGUgMyBHUCBvbmVzLCAxIGNhbiByZXNldCB1cworCSAqIGRpcmVjdGx5LCB0aGUgb3RoZXIgMiBvbmx5IGdlbmVyYXRlIE1QVSBpbnRlcnJ1cHRzLgorCSAqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDJfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QyX0JBU0UrV1NQUik7CisKKyNpZiBNUFVfV0RfQ0xPQ0tFRCAvKiB2YWx1ZSAweDEwIHN0aWNrIG9uIGFwdGl4LCBCSVQ0IHBvbGFyaXR5IHNlZW1zIG9wcHNpdGUqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDNfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEM19CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QzX0JBU0UrV1NQUik7CisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0Q0X0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDRfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdENF9CQVNFK1dTUFIpOworI2VuZGlmCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZStXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIGlmX2Nsa3M9MCwgZnVuY19jbGtzPTA7CisKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiovCisJaWZfY2xrcyB8PSBCSVQ0OworCWZ1bmNfY2xrcyB8PSBCSVQ0OworCXYgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OwkvKiBTeXNfY2xrIGlucHV0IE9NQVAyNDIwX0dQVDIgKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fQ0xLU0VMMl9DT1JFKTsKKwlfX3Jhd193cml0ZWwoMHgxLCBDTV9DTEtTRUxfV0tVUCk7CisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9jayAqLworCWZ1bmNfY2xrcyB8PSBCSVQyMTsKKwlpZl9jbGtzIHw9IEJJVDIxOworI2VuZGlmCisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjFfQ09SRSkgfCBmdW5jX2Nsa3M7IC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjFfQ09SRSk7CisJZGVsYXkoMTAwMCk7CisKKyNpZm5kZWYgS0VSTkVMX1VQREFURUQKKwl7CisjZGVmaW5lIFYxIDB4ZmZmZmZmZmYKKyNkZWZpbmUgVjIgMHgwMDAwMDAwNworCisJCV9fcmF3X3dyaXRlbChWMSwgQ01fRkNMS0VOMV9DT1JFKTsKKwkJX19yYXdfd3JpdGVsKFYyLCBDTV9GQ0xLRU4yX0NPUkUpOworCQlfX3Jhd193cml0ZWwoVjEsIENNX0lDTEtFTjFfQ09SRSk7CisJCV9fcmF3X3dyaXRlbChWMSwgQ01fSUNMS0VOMl9DT1JFKTsKKwl9CisjZW5kaWYKKworfQorCisvKiBQaW4gTXV4aW5nIHJlZ2lzdGVycyB1c2VkIGZvciBVQVJUMSAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfQ1RTICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzUpCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9SVFMgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDNikKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1RYICAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM3KQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlggICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzgpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbXV4U2V0dXBVQVJUMSAgKG9zdGJvb3QpCisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIHVhcnQxIG11eGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXV4U2V0dXBVQVJUMSh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICpNdXhDb25maWdSZWc7CisKKwkvKiBVQVJUMV9DVFMgcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEQyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX0NUUzsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCisKKwkvKiBVQVJUMV9SVFMgcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEgyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1JUUzsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCisKKwkvKiBVQVJUMV9UWCBwaW4gY29uZmlndXJhdGlvbiwgUElOID0gTDIwICovCisJTXV4Q29uZmlnUmVnID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilDT05UUk9MX1BBRENPTkZfVUFSVDFfVFg7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfUlggcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IFQyMSAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1JYOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KK30KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCXUzMglyZXY7CisKKwlyZXYgPSBnZXRfY3B1X3JldigpOworCisKKwkvKiBHUE1DIHBpbiBtdXhpbmcgKi8gCisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDcwKSAmPSAweDAwMDAwMEZGOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3NCkgJj0gMHgwMDAwMDAwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwNzgpICY9IDB4MDAwMDAwMDA7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDdDKSAmPSAweDAwMDAwMDAwOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA4MCkgJj0gMHhGRjAwMDAwMDsKKworCS8qIEdQTUNfSU9fRElSICovCisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDhDKSA9IDB4MTkwMDAwMDA7CisKKwkvKiBHUE1DIENvbmZpZ3VyYXRpb24gKi8KKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwMTApID0gMHgwMDAwMDAwQTsKKwl3aGlsZSAoKCgqKHZvbGF0aWxlIGludCAqKTB4NjgwMEEwMTQpICYgMHgwMDAwMDAwMSkgPT0gMCk7CisKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNTApID0gMHgwMDAwMDAwMTsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDYwKSA9IDB4MDAwMDE4MDA7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2NCkgPSAweDAwMTQxNDAwOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNjgpID0gMHgwMDE0MTQwMDsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDZDKSA9IDB4MEYwMTBGMDE7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3MCkgPSAweDAxMEMxNDE0OworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3NCkgPSAweDAwMDAwQTgwOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA3OCkgPSAweDAwMDAwQzQ0OyAJLy9iYXNlIDB4MDQwMDAwMDAKKworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBOCkgPSAweDAwMDAwMDAwOworCWRlbGF5KDEwMDApOworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VECisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDkwKSA9IDB4MDAwMTEwMDA7CisjZWxzZQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5MCkgPSAweDAwMDExMjAwOworI2VuZGlmCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDk0KSA9IDB4MDAxZjFmMDA7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDk4KSA9IDB4MDAwODA4MDI7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDlDKSA9IDB4MUMwOTFDMDk7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEEwKSA9IDB4MDMxQTFGMUY7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEE0KSA9IDB4MDAwMDAzQzI7CisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMEE4KSA9IDB4MDAwMDBGNDg7CisKKwlpZiAocmV2ICE9IENQVV8yNDIwXzI0MjJfRVMxKQorCQkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNDApID0gMHgxRkYwOwkvLyBlczIueAorCisgCWlmIChuYW5kX2NoaXAoKSl7CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKyAgICAgICAgdTMyIHY7CisgICAgICAgIHYgPSBfX3Jhd19yZWFkbChUQVBfSURDT0RFX1JFRyk7CisgICAgICAgIHYgPSB2ID4+IDI4OworICAgICAgICByZXR1cm4odisxKTsgIC8qIGN1cnJlbnRseSAyNDIyIGFuZCAyNDIwIG1hdGNoIHVwICovCit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7fQorCisKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDIwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWZkZWYgQ09ORklHX1BBUlRJQUxfU1JBTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBQUkNNX0NMS0NGR19DVFJMIC0gYWRkciBvZiB2YWxpZCByZWcKKyAqICBSMSA9IENNX0NMS0VOX1BMTCAtIGFkZHIgZHBsbCBjdGxyIHJlZworICogIFIyID0gZHBsbCB2YWx1ZQorICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN1YiAgICAgc3AsIHNwLCAjMHg0IC8qIGdldCBzb21lIHN0YWNrIHNwYWNlICovCisgICAgICAgIHN0ciAgICAgcjQsIFtzcF0gICAgIC8qIHNhdmUgcjQncyB2YWx1ZSAqLworCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByOCwgcGxsX2N0bF9hZGQKKyAgICAgICAgbW92ICAgICByNCwgIzB4MgorICAgICAgICBzdHIgICAgIHI0LCBbcjhdCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9zdGF0CitibG9jazoKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQkvKiB3YWl0IGZvciBieXBhc3MgdG8gdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDMKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBibmUgICAgIGJsb2NrCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI0LCBwbGxfZGl2X2FkZAorCWxkciAgICAgcjgsIHBsbF9kaXZfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI0LCBjZmczXzBfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBjZmczXzBfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgY2ZnNF8wX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgY2ZnNF8wX3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGNmZzFfMF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIFtyNF0KKyAgICAgICAgb3JyICAgICByOCwgcjgsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisKKwkvKiBzZXR1cCB0byAyeCBsb29wIHRob3VnaCBjb2RlLiAgVGhlIGZpcnN0IGxvb3AgcHJlLWxvYWRzIHRoZSAKKyAgICAgICAgICogaWNhY2hlLCB0aGUgMm5kIGNvbW1pdHMgdGhlIHByY20gY29uZmlnLCBhbmQgbG9ja3MgdGhlIGRwbGwKKyAgICAgICAgICovCisgICAgICAgIG1vdiAgICAgcjQsICMweDEwMDAgICAgICAvKiBzcGluIHNwaW4gc3BpbiAqLworICAgICAgICBtb3YgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgcGFzcyBjb25kaXRpb24gJiBzZXQgcmVnaXN0ZXJzICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQKKzI6CisgICAgICAgIGxkcm5lICAgcjgsIFtyM10gICAgICAgICAvKiBEUExMIGxvY2sgY2hlY2sgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDcKKyAgICAgICAgY21wICAgICByOCwgIzB4MgorICAgICAgICBiZXEgICAgIDRmCiszOgorICAgICAgICBzdWJlcSAgIHI4LCByOCwgIzB4MQorICAgICAgICBzdHJlcSAgIHI4LCBbcjBdICAgICAgICAgLyogY29tbWl0IGRpdmlkZXJzICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDE6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIExvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMQorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBzdHJlcSAgIHIyLCBbcjFdICAgICAgICAvKiBsb2NrIGRwbGwgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMjoKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogbG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AyCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIGxkcmVxICAgcjgsIFtyM10gICAgICAgICAvKiBnZXQgbG9jayBjb25kaXRpb24gZm9yIGRwbGwgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHRpbWUgdGhvdWdoPyAqLworICAgICAgICBibmUgICAgIDJiCisgICAgICAgIG1vdmVxICAgcjgsICMweDIgICAgICAgICAvKiBzZXQgdG8gZHBsbCBjaGVjayBjb25kaXRpb24uICovCisgICAgICAgIGJlcSAgICAgM2IgICAgICAgICAgICAgICAvKiBpZiBjb25kaXRpb24gbm90IHRydWUgYnJhbmNoICovCis0OiAgCisgICAgICAgIGxkciAgICAgcjQsIFtzcF0KKyAgICAgICAgYWRkICAgICBzcCwgc3AsICMweDQgICAgIC8qIHJldHVybiBzdGFjayBzcGFjZSAqLworICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCitjZmczXzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUczXzAKK2NmZzNfMF92YWw6IAorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUczCitjZmc0XzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUc0XzAKK2NmZzRfMF92YWw6CisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzQKK2NmZzFfMF9hZGRyOgorICAgIC53b3JkICBHUE1DX0NPTkZJRzFfMAorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfc3RhdDoKKyAgICAud29yZCBDTV9JRExFU1RfQ0tHRU4KK3BsbF9kaXZfYWRkOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl92YWw6CisgICAgLndvcmQgRFBMTF9WQUwJLyogRFBMTCBzZXR0aW5nICgzMDBNSHogZGVmYXVsdCkgKi8KKyNlbmRpZiAgICAgICAgICAgIAorCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKwltb3YgcjMsIHIwICAgICAvKiBzYXZlIHNraXAgaW5mb3JtYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfQVBUSVgKKwlsZHIJcjAsCVJFR19TRFJDX01DRkdfMAorCWxkcglyMSwJVkFMX1NEUkNfTUNGR18wCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfU0RSQ19NUl8wCisJbGRyCXIxLAlWQUxfU0RSQ19NUl8wCisJc3RyCXIxLAlbcjBdCisJLyogYSBkZHIgbmVlZHMgZW1yMSBzZXQgaGVyZSAqLworCWxkcglyMCwJUkVHX1NEUkNfU0hBUklORworCWxkcglyMSwJVkFMX1NEUkNfU0hBUklORworCXN0cglyMSwJW3IwXQorICAgICAgIAlsZHIJcjAsCVJFR19TRFJDX1JGUl9DVFJMXzAKKwlsZHIJcjEsCVZBTF9TRFJDX1JGUl9DVFJMXzAKKwlzdHIJcjEsCVtyMF0KKworICAgICAgIC8qIGxpdHRsZSBkZWxheSBhZnRlciBpbml0ICovCisgICAgICAgbW92IHIyLCAjMHgxODAwICAgICAgICAgICAgICAgICAgICAgICAgCisxOiAgICAgICAKKyAgICAgICAgc3VicyByMiwgcjIsICMweDEKKyAgICAgICAgYm5lIDFiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFSVElBTF9TUkFNCisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgbW92ICAgICByMCwgICAgIHIzICAgICAgLyogcGFzcyBza2lwIGluZm8gdG8gc19pbml0ICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisjZW5kaWYKKworCS8qIG1hcCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWxkcglyMCwJVkFMX0lOVEhfU0VUVVAKKwltY3IJcDE1LCAwLCByMCwgYzE1LCBjMiwgNAorCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1ZBTF9JTlRIX1NFVFVQOgorCS53b3JkIFBFUklGRVJBTF9QT1JUX0JBU0UKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY0Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBKYW51YXJ5IDIwMDQgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgSDQgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTExMzYvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjOTQxZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDI0MzBzZHAubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI4IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNAorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFRJIEg0IGJvYXJkIHdpdGggT01BUDI0MjAgKEFSTTExMzYpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciA2NE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAvMDAwMCAoYmFuazEpIEVTMiB3aWxsIGJlIGNvbmZpZ3VyYWJsZQorIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisKKyMgMjQzMCBoNCBoYXMgc2FtZSBtZW0gY29uZmlndXJhdGlvbiBhcyBoNC4KKworIyBGb3IgdXNlIHdpdGggZXh0ZXJuYWwgb3IgaW50ZXJuYWwgYm9vdHMuCisjIENPTkZJR19QQVJUSUFMX1NSQU0gbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSB0aGlzLgorVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIFVzZWQgd2l0aCBmdWxsIFNSQU0gYm9vdC4KKyMgVGhpcyBpcyBlaXRoZXIgd2l0aCBhIEdQIHN5c3RlbSBvciBhIHNpZ25lZCBib290IGltYWdlLgorIyBlYXNpZXN0LCBhbmQgc2FmZXN0IHdheSB0byBnbyBpZiB5b3UgY2FuLgorIyBDb21tZW50IG91dCAvL0NPTkZJR19QQVJUSUFMX1NSQU0gZm9yIHRoaXMgb25lLgorIworI1RFWFRfQkFTRSA9IDB4NDAyODAwMDAKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvb21hcDI0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhN2I0MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpOworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpOworc3RhdGljIHZvaWQgbXV4U2V0dXBBbGwodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfY3B1X3Jldih2b2lkKTsKK3N0YXRpYyB1MzIgIGdldF9kZXZpY2VfdHlwZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHByY21faW5pdCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisgICAgICAgIHUzMiB2OworICAgICAgICB2ID0gX19yYXdfcmVhZGwoVEFQX0lEQ09ERV9SRUcpOworICAgICAgICB2ID0gdiA+PiAyODsKKyAgICAgICAgcmV0dXJuKHYrMSk7ICAvKiBjdXJyZW50bHkgMjQyMiBhbmQgMjQyMCBtYXRjaCB1cCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIZWxwZXIgZnVuY3Rpb24gdG8gd2FpdCBmb3IgdGhlIHN0YXR1cyBvZiBhIHJlZ2lzdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKyAgICAgICAgdTMyIGkgPSAwLCB2YWw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgICAgICBpZiAoaT09Ym91bmQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFN1cHBvcnQgZm9yIG11bHRpcGxlIHR5cGUgb2YgbWVtb3J5IHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDRkdfU0RSQU1fRERSCit2b2lkCitjb25maWdfc2RyYW1fZGRyKHUzMiByZXYpCit7CisJLyogYmFsbCBEMTEsIG1vZGUgMCAqLworCV9fcmF3X3dyaXRlYigweDA4LCAweDQ4MDAwMDMyKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEFfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQl8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCisJLyogCisJICogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlcgorCSAqIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5CisJICogU2VyaWFsIG1vZGUKKwkgKiBDQVMgbGF0ZW5jeSA9IDMgCisJICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIFNEUkNfTVJfMCk7CisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fRERSCisKKyNpZmRlZiBDRkdfU0RSQU1fQ09NQk8gCit2b2lkCitjb25maWdfc2RyYW1fY29tYm8odTMyIHJldikKK3sKKworCXUzMiBkbGxjdHJsPTA7CisKKyAgICAgICAgLyogYmFsbCBDMTIsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CisgICAgICAgIC8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOworICAgICAgICAvKiBiYWxsIEIxMywgbW9kZSAwIC0gZm9yIENLRTEgKG5vdCBuZWVkZWQgcmt3IGZvciBjb21ibykgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOworCisgICAgICAgIC8qY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0uIElzc3VlIHNvZnQgcmVzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOyAvKiB3YWl0IHRpbGwgcmVzZXQgZG9uZSBzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfU1lTQ09ORklHKTsKKworICAgICAgICAvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKyAgICAgICAgLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkKKwkgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKwllbHNlCisgICAgICAgCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKworICAgICAgICAvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCisJLyogVGhpcyBpcyByZXFkIG9ubHkgZm9yIEVTMSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorICAgICAgICAJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKyAgICAgICAgLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworICAgICAgICAvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfQ09NQk9fTURDRkdfMF9ERFIsIFNEUkNfTUNGR18xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEwME1IeiwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzEpOworCS8qIFRoaXMgaXMgcmVxZCBvbmx5IGZvciBFUzEgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCAweDY4MDA5MGQ0KTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCAweDY4MDA5MGQ4KTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIDB4NjgwMDkwZDgpOworCisgICAgICAgIC8qIENTMSBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworICAgICAgICAvKiBTZXJpYWwgbW9kZSAqLworICAgICAgICAvKiBDQVMgbGF0ZW5jeSA9IDMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgMHg2ODAwOTBiNCk7CisKKyAgICAgICAgLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisJCWRsbGN0cmwgPSAoQklUMHxCSVQzKTsKKwllbHNlCisJCWRsbGN0cmwgPSBCSVQwOwkJCisKKyAgICAgICAgaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9hZCBjdHIgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2NrIGFuZCBnbyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgIC8vIF9fcmF3X3dyaXRlbCgweDAwMDA5ODA4LCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueCA/CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICAvL19fcmF3X3dyaXRlbCgweDAwMDA5ODA4LCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgfQorfQorCisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0NPTUJPCisKKyNpZmRlZiBDRkdfMjQzMFNEUkFNX0REUgordm9pZAorY29uZmlnXzI0MzBzZHJhbV9kZHIodTMyIHJldikKK3sKKwl1MzIgZGxsc3RhdCwgZGxsY3RybDsKKworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7IC8qIHdhaXQgdGlsbCByZXNldCBkb25lIHNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogQ2hpcC1sZXZlbCBzaGFyZWQgaW50ZXJmYWNlIG1hbmFnZW1lbnQgKi8KKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKwkvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwkvKiBDUzFNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKwkvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKwkvKiBDb25maWd1cmUgdG8gTVVYMTQ6IDMyTWJ4MzIgKi8KKwlfX3Jhd193cml0ZWwoU0RQXzI0MzBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCV9fcmF3X3dyaXRlbChTRFBfMjQzMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDIgLSBTRFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIFNldCB1cCBTRFJDIERMTCB2YWx1ZXMgZm9yIDI0MzAgRERSICovCisJZGxsY3RybCA9IChTRFBfMjQzMF9TRFJDX0RMTEFCX0NUUkwgJiB+QklUMik7IC8qIHNldCB0YXJnZXQgY3RybCB2YWwgKi8KKwlfX3Jhd193cml0ZWwoZGxsY3RybCwgU0RSQ19ETExBX0NUUkwpOwkvKiBzZXQgbG9jayBtb2RlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQl9DVFJMKTsJLyogc2V0IGxvY2sgbW9kZSAqLworCWRlbGF5KDB4MTAwMCk7IC8qIHRpbWUgdG8gdHJhY2sgdG8gY2VudGVyICovCQorCWRsbHN0YXQgPSBfX3Jhd19yZWFkbChTRFJDX0RMTEFfU1RBVFVTKSAmIDB4RkYwMDsgLyogZ2V0IHN0YXR1cyAqLworCWRsbGN0cmwgPSAoZGxsY3RybCAmIDB4MDBGRikgfCBkbGxzdGF0IHwgQklUMjsgLyogYnVpbGQgdW5sb2NrIHZhbHVlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQV9DVFJMKTsJLyogc2V0IHVubG9jayBtb2RlICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQl9DVFJMKTsJLyogc2V0IHVubG9jayBtb2RlICovCit9CisjZW5kaWYgLy8gQ0ZHXzI0MzBTRFJBTV9ERFIKKworI2lmZGVmIENGR19TRFJBTV9TVEFDS0VEIAordm9pZAorY29uZmlnX3NkcmFtX3N0YWNrZWQodTMyIHJldikKK3sKKworCS8qIFBpbiBNdXhpbmcgZm9yIFNEUkMgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMSk7CS8qIG11eCBtb2RlIDAgKENTMSkgKi8KKwlfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CS8qIG11eCBtb2RlIDAgKENLRTEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzIpOwkvKiBjb25uZWN0IHNkcmNfYTEyICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwMzEpOwkvKiBjb25uZWN0IHNkcmNfYTEzICovCisKKwkvKiBjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIG5vIGlkbGUgYWNrIGFuZCBSRVNFVCBlbmFibGUgKi8KKwlkZWxheSgyMDAwMDApOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEwLCBTRFJDX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgbW9kZSAqLworCisJLyogU0RSQ19TSEFSSU5HICovCisJLyogVS1ib290IGlzIHdyaXRpbmcgMHgwMDAwMDEwMCB0aG91Z2ggKEg0XzI0MjBfU0RSQ19TSEFSSU5HICkgKi8KKwkvL19fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDA0OTAwLCBTRFJDX1NIQVJJTkcpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCS8qIE5vbmUgZm9yIEVTMi4xICovCisKKwkvKiAgU0RSQ19DUzEgQ29uZmlndXJhdGlvbiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX0NTX0NGRyk7CS8qIFJlbWFwIENTMSB0byAweDgwMDAwMDAwICovCisKKwkvKiBEaXNhYmxlIHBvd2VyIGRvd24gb2YgQ0tFICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwODUsIFNEUkNfUE9XRVIpOworCisJX19yYXdfd3JpdGVsKDB4MDFBMDIwMTksIFNEUkNfTUNGR18xKTsJLyogU0RSQ19NQ0ZHMSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDNERDAzLCBTRFJDX1JGUl9DVFJMMSk7CS8qIFNEUkNfUkZSX0NUUkwxICovCisJX19yYXdfd3JpdGVsKDB4OTJEREM0ODUsIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEEwICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMTQsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CS8qIFNEUkNfQUNUSU1fQ1RSTEIwICovCisKKwkvKk1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIDB4NjgwMDkwRDgpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCAweDY4MDA5MEQ4KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMiwgMHg2ODAwOTBEOCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIDB4NjgwMDkwRDgpOworCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIDB4NjgwMDkwQjQpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDIwLCAweDY4MDA5MEJDKTsJLyogd2Vhay1zdHJlbmd0aCBkcml2ZXIgKi8KKworIAkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOworCX0KKwllbHNlIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEJfQ1RSTCk7CS8vIEVTMi54CisJfQorfQorI2VuZGlmIC8vIENGR19TRFJBTV9TVEFDS0VECisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodTMyICpzaGlmdCkKK3sKKyNkZWZpbmUgR1BUX0VOICAoKDA8PDIpfEJJVDF8QklUMCkgICAgICAvKiBlbmFibGUgc3lzX2NsayBOTy1wcmVzY2FsZSAvMSAqLworI2RlZmluZSBHUFRfQ1RSIE9NQVAyNFhYX0dQVDIrVENSUiAgICAgIC8qIHJlYWQgY291bnRlciBhZGRyZXNzICovCisgICAgICAgIHUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgdmFsOworCXVuc2lnbmVkIGludCB2LCBpZl9jbGtzPTAsIGZ1bmNfY2xrcz0wIDsKKworCisKKyAgICAgICAgaWYoX19yYXdfcmVhZGwoUFJDTV9DTEtTUkNfQ1RSTCkgJiBCSVQ3KXsgICAgLyogaWYgY3VycmVudGx5IC8yICovCisgICAgICAgICAgICAgICAgKnNoaWZ0ID0gMTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgKnNoaWZ0ID0gMDsKKyAgICAgICAgfQorCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTDJfQ09SRSkgfCAweDQ7ICAgICAgLyogbWFzayBmb3Igc3lzX2NsayB1c2UgKi8KKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUwyX0NPUkUpOyAgICAgICAgICAgIC8qIHRpbWVyMiBzb3VyY2UgdG8gc3lzX2NsayAqLworCV9fcmF3X3dyaXRlbChCSVQ0LCBDTV9JQ0xLRU4xX0NPUkUpOyAgICAgICAgICAgLyogdGltZXIyIGludGVyZmFjZSBjbG9jayBvbiAqLworCV9fcmF3X3dyaXRlbChCSVQ0LCBDTV9GQ0xLRU4xX0NPUkUpOyAgICAgICAgICAgLyogdGltZXIyIGZ1bmN0aW9uIGNsb2NrIG9uICovCisJLyogRW5hYmxlIEdQMiB0aW1lci4qLworCWlmX2Nsa3MgfD0gQklUNDsKKwlmdW5jX2Nsa3MgfD0gQklUNDsKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMV9DT1JFKSB8IGlmX2Nsa3M7CS8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodixDTV9JQ0xLRU4xX0NPUkUgKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMV9DT1JFKSB8IGZ1bmNfY2xrczsgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMV9DT1JFKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKDAsIE9NQVAyNFhYX0dQVDIrVExEUik7ICAgICAgICAgICAvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisgICAgICAgIF9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAyNFhYX0dQVDIrVENMUik7ICAgICAgLyogZW5hYmxlIGNsb2NrICovCisgICAgICAgIC8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8gICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKyAgICAgICAgLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKyAgICAgICAgc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOyAgICAgICAgICAgICAvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyovCisgICAgICAgIHdoaWxlKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOyAgICAgICAgICAgLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworICAgICAgICBjc3RhcnQgPSBfX3Jhd19yZWFkbChHUFRfQ1RSKTsgICAgICAgICAgICAgICAgIC8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisgICAgICAgIHdoaWxlKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0KzIwKSk7ICAgICAgLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisgICAgICAgIGNlbmQgPSBfX3Jhd19yZWFkbChHUFRfQ1RSKTsgICAgICAgICAgICAgICAgICAgLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisgICAgICAgIGNkaWZmID0gY2VuZCAtIGNzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKyAgICAgICAgLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworICAgICAgICBpZihjZGlmZiA+ICgxOTAwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMzhfNE0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICgxNTIwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMjZNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoMTMwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzI0TSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDkwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzE5XzJNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoNzYwMCA+PiAqc2hpZnQpKQorICAgICAgICAgICAgICAgIHJldHVybihTMTNNKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybihTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaCAoY29uZmlnIElJIGRlZmF1bHQpLgorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorcHJjbV9pbml0KCkKK3sKKwl1MzIgZGl2LCBzcGVlZCwgdmFsLCBkaXZfYnlfMjsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpICYgfihCSVQxIHwgQklUMCk7CisjaWYgZGVmaW5lZChPTUFQMjQzMF9TUVVBUkVfQ0xPQ0tfSU5QVVQpCisJX19yYXdfd3JpdGVsKHZhbCwgUFJDTV9DTEtTUkNfQ1RSTCk7CisjZWxzZQorCV9fcmF3X3dyaXRlbCgodmFsIHwgQklUMCksIFBSQ01fQ0xLU1JDX0NUUkwpOworI2VuZGlmCisJc3BlZWQgPSBnZXRfb3NjX2Nsa19zcGVlZCgmZGl2X2J5XzIpOworICAgICAgICBpZigoc3BlZWQgPiBTMTlfMk0pICYmICghZGl2X2J5XzIpKXsgLyogaWYgZmFzdCAmJiAvMiBvZmYsIGVuYWJsZSBpdCAqLworICAgICAgICAgICAgICAgIHZhbCA9IH4oQklUNnxCSVQ3KSAmIF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpOworICAgICAgICAgICAgICAgIHZhbCB8PSAoMHgyIDw8IDYpOyAvKiBkaXZpZGUgYnkgMiBpZiAoMjQsMjYsMzguNCkgLT4gKDEyLzEzLzE5LjIpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCh2YWwsIFBSQ01fQ0xLU1JDX0NUUkwpOworICAgICAgICB9CisKKwlfX3Jhd193cml0ZWwoMCwgQ01fRkNMS0VOMV9DT1JFKTsJLyogc3RvcCBhbGwgY2xvY2tzIHRvIHJlZHVjZSByaW5naW5nICovCisJX19yYXdfd3JpdGVsKDAsIENNX0ZDTEtFTjJfQ09SRSk7CS8qIG1heSBub3QgYmUgbmVjZXNzYXJ5ICovCisJX19yYXdfd3JpdGVsKDAsIENNX0lDTEtFTjFfQ09SRSk7CisJX19yYXdfd3JpdGVsKDAsIENNX0lDTEtFTjJfQ09SRSk7CisKKwkvKkRQTEwgaW50byBsb3cgcG93ZXIgYnlwYXNzIChvdGhlcnMgb2ZmKSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBDTV9DTEtFTl9QTEwpOworCisJX19yYXdfd3JpdGVsKERQTExfT1VULCBDTV9DTEtTRUwyX1BMTCk7IC8qIHNldCBEUExMIG91dCAqLworICAgICAgICBfX3Jhd193cml0ZWwoTVBVX0RJViwgQ01fQ0xLU0VMX01QVSk7ICAgLyogc2V0IE1QVSBkaXZpZGVyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChEU1BfRElWLCBDTV9DTEtTRUxfRFNQKTsgICAvKiBzZXQgZHNwIGFuZCBpdmEgZGl2aWRlcnMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEdGWF9ESVYsIENNX0NMS1NFTF9HRlgpOyAgIC8qIHNldCBnZnggZGl2aWRlcnMgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKE1ETV9ESVYsIENNX0NMS1NFTF9NRE0pOyAgIC8qIHNldCBtZG0gZGl2aWRlcnMgKi8KKworCWRpdiA9IEJVU19ESVY7CisJX19yYXdfd3JpdGVsKGRpdiwgQ01fQ0xLU0VMMV9DT1JFKTsvKiBzZXQgTDMvTDQvVVNCL0Rpc3BsYXkvU1NpIGRpdmlkZXJzICovCisJZGVsYXkoMTAwMCk7CisKKwkvKjEzTUh6IGFwbGwgc3JjLCBQUkNNICd4JyBEUExMIHJhdGUgKi8KKwlfX3Jhd193cml0ZWwoRFBMTF9WQUwsIENNX0NMS1NFTDFfUExMKTsKKworCS8qVmFsaWQgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgUFJDTV9DTEtDRkdfQ1RSTCk7CisJZGVsYXkoMTAwMCk7CisKKwkvKiBzZXQgdXAgQVBMTFNfQ0xLSU4gcGVyIGNyeXN0YWwgKi8KKwlpZiAoc3BlZWQgPiBTMTlfMk0pCisgICAgICAgICAgICAgICAgc3BlZWQgPj49IDE7ICAgIC8qIGlmIGZhc3Qgc2hpZnQgdG8gLzIgcmFuZ2UgKi8KKyAgICAgICAgdmFsID0gKDB4MiA8PCAyMyk7ICAgICAgLyogZGVmYXVsdCB0byAxM01oeiBmb3IgMjQzMGMgKi8KKyAgICAgICAgaWYgKHNwZWVkID09IFMxMk0pCisgICAgICAgICAgICAgICAgdmFsID0gKDB4MyA8PCAyMyk7CisgICAgICAgIGVsc2UgaWYgKHNwZWVkID09IFMxOV8yTSkKKyAgICAgICAgICAgICAgICB2YWwgPSAoMHgwIDw8IDIzKTsKKyAgICAgICAgdmFsIHw9ICh+KEJJVDIzfEJJVDI0fEJJVDI1KSAmIF9fcmF3X3JlYWRsKENNX0NMS1NFTDFfUExMKSk7CisgICAgICAgIF9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTDFfUExMKTsKKworICAgICAgICBfX3Jhd193cml0ZWwoRFBMTF9MT0NLfEFQTExfTE9DSywgQ01fQ0xLRU5fUExMKTsgICAvKiBlbmFibGUgYXBsbCAqLworICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDgsIEJJVDgsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsvKiB3YWl0IGZvciBhcGxsIGxvY2sgKi8KKworICAgICAgICBkZWxheSgyMDAwMDApOworfQorCit2b2lkIFNFQ19nZW5lcmljKHZvaWQpCit7CisvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKyNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg2OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMSBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1MCk7ICAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1OCk7ICAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjApOyAvKiBBRERSX01BVENIXzEgTCovCisKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fR1BNQ19CQVNFX0FERFJfQVJNICsgMHg0OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTApOyAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg4MCk7ICAvKiBBRERSX01BVENIXzIgTCovCisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg0OCk7IC8qIFJFUV9JTkZPX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTApOyAvKiBSRUFEX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAvKiBXUklURV9QRVJNSVNTSU9OXzAgTCovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvciBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19zcmFtKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworCisgICAgICAgIC8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisgICAgICAgIG1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworICAgICAgICBpZiAoKG1vZGUgPT0gR1BfREVWSUNFKSB8fCAobW9kZSA9PSBIU19ERVZJQ0UpIHx8IChtb2RlID09IEVNVV9ERVZJQ0UpCisgICAgICAgICAgICB8fCAobW9kZSA9PSBUU1RfREVWSUNFKSkgeworICAgICAgICAgICAgICAgIC8qIFNlY3VyZSBvciBFbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UICovCisgICAgICAgICAgICAgICAgU0VDX2dlbmVyaWMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzX2luaXQoaW50IHNraXApCit7CisgICAgICAgIHUzMiAgIHJldjsKKworICAgICAgICByZXYgPSBnZXRfY3B1X3JldigpOworCisgICAgICAgIHdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX3NyYW0oKTsgICAKKyAgICAgICAgbXV4U2V0dXBBbGwoKTsKKyAgICAgICAgZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKworI2lmZGVmIENGR19TRFJBTV9ERFIKKyAgICAgICAgY29uZmlnX3NkcmFtX2RkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fQ09NQk8pCisgICAgICAgIGNvbmZpZ19zZHJhbV9jb21ibyhyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfMjQzMFNEUkFNX0REUikKKyAgICAgICAgY29uZmlnXzI0MzBzZHJhbV9kZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX1NUQUNLRUQpCisgICAgICAgIGNvbmZpZ19zZHJhbV9zdGFja2VkKHJldik7CisjZWxzZQorI2Vycm9yIFNEUkFNIHR5cGUgbm90IHN1cHBvcnRlZAorI2VuZGlmCisKKyAgICAgICAgZGVsYXkoMjAwMDApOworICAgICAgICBwZXJpcGhlcmFsX2VuYWJsZSgpOworICAgICAgICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisjZGVmaW5lIEdQIChCSVQ4fEJJVDkpCisKKwkvKiBUaGVyZSBhcmUgNCB3YXRjaCBkb2dzLiAgMSBzZWN1cmUsIGFuZCAzIGdlbmVyYWwgcHVycG9zZS4KKwkgKiBJIHdvdWxkIGV4cGVjdCB0aGF0IHRoZSBST00gdGFrZXMgY2FyZSBvZiB0aGUgc2VjdXJlIG9uZSwKKwkgKiBidXQgd2Ugd2lsbCB0cnkgYWxzby4gIE9mIHRoZSAzIEdQIG9uZXMsIDEgY2FuIHJlc2V0IHVzCisJICogZGlyZWN0bHksIHRoZSBvdGhlciAyIG9ubHkgZ2VuZXJhdGUgTVBVIGludGVycnVwdHMuCisJICovCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdEMl9CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDJfQkFTRStXU1BSKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlK1dXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgaWZfY2xrcz0wLCBpZl9jbGtzMiA9IDAsIGZ1bmNfY2xrcz0wLCBmdW5jX2Nsa3MyID0gMDsKKworCS8qIEVuYWJsZSBHUDIgdGltZXIuKi8KKwlpZl9jbGtzIHw9IEJJVDQ7CisJZnVuY19jbGtzIHw9IEJJVDQ7CisJdiA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTDJfQ09SRSkgfCAweDQ7CS8qIFN5c19jbGsgaW5wdXQgT01BUDI0WFhfR1BUMiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9DTEtTRUwyX0NPUkUpOworCV9fcmF3X3dyaXRlbCgweDEsIENNX0NMS1NFTF9XS1VQKTsKKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrICovCisJZnVuY19jbGtzIHw9IEJJVDIxOworCWlmX2Nsa3MgfD0gQklUMjE7CisjZW5kaWYKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMV9DT1JFKSB8IGlmX2Nsa3M7CS8qIEludGVyZmFjZSBjbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodixDTV9JQ0xLRU4xX0NPUkUgKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOMl9DT1JFKSB8IGlmX2Nsa3MyOyAgICAvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisgICAgICAgIF9fcmF3X3dyaXRlbCh2LCBDTV9JQ0xLRU4yX0NPUkUpOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4xX0NPUkUpIHwgZnVuY19jbGtzOyAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4xX0NPUkUpOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4yX0NPUkUpIHwgZnVuY19jbGtzMjsgIC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisgICAgICAgIF9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4yX0NPUkUpOworCWRlbGF5KDEwMDApOworCit9CisKKy8qIERvIHBpbiBtdXhpbmcgZm9yIGFsbCB0aGUgZGV2aWNlcyB1c2VkIGluIFgtTG9hZGVyICovCisjZGVmaW5lIE1VWF9WQUwoT0ZGU0VULFZBTFVFKVwKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWIoVkFMVUUsIE9NQVAyNFhYX0NUUkxfQkFTRSArIE9GRlNFVCk7CitzdGF0aWMgdm9pZCBtdXhTZXR1cEFsbCh2b2lkKQoreworCS8qIFVBUlQgMSovCisJTVVYX1ZBTCgweDAwQjEsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9jdHMtIEVOLCBISSwgMywgLT5ncGlvXzMyICovCisJTVVYX1ZBTCgweDAwQjIsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9ydHMtIEVOLCBISSwgMywgLT5ncGlvXzggKi8KKwlNVVhfVkFMKDB4MDBCMywgMHgxQikgICAgICAgIC8qIHVhcnQxX3R4LSBFTiwgSEksIDMsIC0+Z3Bpb185ICovCisJTVVYX1ZBTCgweDAwQjQsIDB4MUIpICAgICAgICAvKiB1YXJ0MV9yeC0gRU4sIEhJLCAzLCAtPmdwaW9fMTAgKi8KKwlNVVhfVkFMKDB4MDEwNywgMHgwMSkgICAgICAgIC8qIHNzaTFfZGF0X3R4LSBEaXMsIDEsIC0+dWFydDFfdHggKi8KKwlNVVhfVkFMKDB4MDEwOCwgMHgwMSkgICAgICAgIC8qIHNzaTFfZmxhZ190eC0gRGlzLCAxLCAtPnVhcnQxX3J0cyAqLworCU1VWF9WQUwoMHgwMTA5LCAweDAxKSAgICAgICAgLyogc3NpMV9yZHlfdHgtIERpcywgMSwgLT51YXJ0MV9jdHMgKi8KKwlNVVhfVkFMKDB4MDEwQSwgMHgwMSkgICAgICAgIC8qIHNzaTFfZGF0X3J4LSBEaXMsIDEsIC0+dWFydDFfcnggKi8KKworCS8qIE11eCBzZXR0aW5ncyBmb3IgU0RSQyAqLworCU1VWF9WQUwoMHgwMDU0LCAweDFCKSAgICAgICAgLyogc2RyY19hMTQgLSBFTiwgSEksIDMsIC0+Z3Bpb18wICovCisJTVVYX1ZBTCgweDAwNTUsIDB4MUIpICAgICAgICAvKiBzZHJjX2ExMyAtIEVOLCBISSwgMywgLT5ncGlvXzEgKi8KKwlNVVhfVkFMKDB4MDA1NiwgMHgwMCkgICAgICAgIC8qIHNkcmNfYTEyIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDYsIDB4MDApICAgICAgICAvKiBzZHJjX25jczEgLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0OCwgMHgwMCkgICAgICAgIC8qIHNkcmNfY2tlMSAtIERpcywgMCAqLworCS8qIEdQTUMgKi8KKwlNVVhfVkFMKDB4MDAzMCwgMHgwMCkgICAgICAgIC8qIGdwbWNfY2xrIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzIsIDB4MDApICAgICAgICAvKiBncG1jX25jczEtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDMzLCAweDAwKSAgICAgICAgLyogZ3BtY19uY3MyLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzNCwgMHgwMykgICAgICAgIC8qIGdwbWNfbmNzMy0gRGlzLCAzLCAtPmdwaW9fMjQgKi8KKwlNVVhfVkFMKDB4MDAzNSwgMHgwMykgICAgICAgIC8qIGdwbWNfbmNzNC0gRGlzLCAzLCAtPmdwaW9fMjUgKi8KKwlNVVhfVkFMKDB4MDAzNiwgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzNS0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzcsIDB4MDMpICAgICAgICAvKiBncG1jX25jczYtIERpcywgMywgLT5ncGlvXzI3ICovCisJTVVYX1ZBTCgweDAwMzgsIDB4MDApICAgICAgICAvKiBncG1jX25jczctIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQwLCAweDE4KSAgICAgICAgLyogZ3BtY193YWl0MS0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDEsIDB4MTgpICAgICAgICAvKiBncG1jX3dhaXQyLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0MiwgMHgxQikgICAgICAgIC8qIGdwbWNfd2FpdDMtIEVOLCBISSwgMywgLT5ncGlvXzM1ICovCisJTVVYX1ZBTCgweDAwODUsIDB4MUIpICAgICAgICAvKiBncG1jX2ExMC0gRU4sIEhJLCAzLCAtPmdwaW9fMyAqLworfQorCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJdTMyCXJldjsKKworCS8qIEdQTUMgQ29uZmlndXJhdGlvbiAqLworCXJldiAgPSBnZXRfY3B1X3JldigpOworCisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKDB4MDAxLCBHUE1DX0NPTkZJRyk7CS8qIHNldCBuV1AsIGRpc2FibGUgbGltaXRlZCBhZGRyICovCisjZW5kaWYKKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAyNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzUuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMgCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfQ09ORklHN18wKTsKKwlzZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0XzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2XzApOworCisjZWxzZSAvKiBDRkdfT05FTkFORCAqLworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2XzApOworI2VuZGlmCisKKwkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworCV9fcmF3X3dyaXRlbCgoICgoT01BUDI0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKwkJICAgICAoKE9NQVAyNFhYX0dQTUNfQ1MwX01BUD4+MjQpICYgMHgzRikgfAorCQkgICAgICgxPDw2KSApLCBHUE1DX0NPTkZJRzdfMCk7CisJc2RlbGF5KDIwMDApOworI2lmZGVmIENGR19OQU5ECisgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorCisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjFkN2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA1CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBQUkNNX0NMS0NGR19DVFJMIC0gYWRkciBvZiB2YWxpZCByZWcKKyAqICBSMSA9IENNX0NMS0VOX1BMTCAtIGFkZHIgZHBsbCBjdGxyIHJlZworICogIFIyID0gZHBsbCB2YWx1ZQorICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN1YiAgICAgc3AsIHNwLCAjMHg0IC8qIGdldCBzb21lIHN0YWNrIHNwYWNlICovCisgICAgICAgIHN0ciAgICAgcjQsIFtzcF0gICAgIC8qIHNhdmUgcjQncyB2YWx1ZSAqLworCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByOCwgcGxsX2N0bF9hZGQKKyAgICAgICAgbW92ICAgICByNCwgIzB4MgorICAgICAgICBzdHIgICAgIHI0LCBbcjhdCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9zdGF0CitibG9jazoKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQkvKiB3YWl0IGZvciBieXBhc3MgdG8gdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDMKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBibmUgICAgIGJsb2NrCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI0LCBwbGxfZGl2X2FkZAorCWxkciAgICAgcjgsIHBsbF9kaXZfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgW3I0XQorICAgICAgICBvcnIgICAgIHI4LCByOCwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKworCS8qIHNldHVwIHRvIDJ4IGxvb3AgdGhvdWdoIGNvZGUuICBUaGUgZmlyc3QgbG9vcCBwcmUtbG9hZHMgdGhlIAorICAgICAgICAgKiBpY2FjaGUsIHRoZSAybmQgY29tbWl0cyB0aGUgcHJjbSBjb25maWcsIGFuZCBsb2NrcyB0aGUgZHBsbAorICAgICAgICAgKi8KKyAgICAgICAgbW92ICAgICByNCwgIzB4MTAwMCAgICAgIC8qIHNwaW4gc3BpbiBzcGluICovCisgICAgICAgIG1vdiAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCBwYXNzIGNvbmRpdGlvbiAmIHNldCByZWdpc3RlcnMgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NAorMjoKKyAgICAgICAgbGRybmUgICByOCwgW3IzXSAgICAgICAgIC8qIERQTEwgbG9jayBjaGVjayAqLworICAgICAgICBhbmQgICAgIHI4LCByOCwgIzB4NworICAgICAgICBjbXAgICAgIHI4LCAjMHgyCisgICAgICAgIGJlcSAgICAgNGYKKzM6CisgICAgICAgIHN1YmVxICAgcjgsIHI4LCAjMHgxCisgICAgICAgIHN0cmVxICAgcjgsIFtyMF0gICAgICAgICAvKiBjb21taXQgZGl2aWRlcnMgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMToKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogTG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AxCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIHN0cmVxICAgcjIsIFtyMV0gICAgICAgIC8qIGxvY2sgZHBsbCAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AyOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBsb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDIKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgbGRyZXEgICByOCwgW3IzXSAgICAgICAgIC8qIGdldCBsb2NrIGNvbmRpdGlvbiBmb3IgZHBsbCAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgdGltZSB0aG91Z2g/ICovCisgICAgICAgIGJuZSAgICAgMmIKKyAgICAgICAgbW92ZXEgICByOCwgIzB4MiAgICAgICAgIC8qIHNldCB0byBkcGxsIGNoZWNrIGNvbmRpdGlvbi4gKi8KKyAgICAgICAgYmVxICAgICAzYiAgICAgICAgICAgICAgIC8qIGlmIGNvbmRpdGlvbiBub3QgdHJ1ZSBicmFuY2ggKi8KKzQ6ICAKKyAgICAgICAgbGRyICAgICByNCwgW3NwXQorICAgICAgICBhZGQgICAgIHNwLCBzcCwgIzB4NCAgICAgLyogcmV0dXJuIHN0YWNrIHNwYWNlICovCisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKyNpZmRlZiBDRkdfT05FTkFORAorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHM18wIAorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBPTkVOQU5EX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHNF8wCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgT05FTkFORF9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzFfMAorI2Vsc2UKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzNfMCAKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHNF8wCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIEdQTUNfQ09ORklHMV8wCisjZW5kaWYKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX3N0YXQ6CisgICAgLndvcmQgQ01fSURMRVNUX0NLR0VOCitwbGxfZGl2X2FkZDoKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfdmFsOgorICAgIC53b3JkIERQTExfVkFMCS8qIERQTEwgc2V0dGluZyAoMzAwTUh6IGRlZmF1bHQpICovCisKKy5nbG9ibCBwbGF0Zm9ybXNldHVwCitwbGF0Zm9ybXNldHVwOgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBtYXAgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlsZHIJcjAsCVZBTF9JTlRIX1NFVFVQCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDQKKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitWQUxfSU5USF9TRVRVUDoKKwkud29yZCBQRVJJRkVSQUxfUE9SVF9CQVNFCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmU4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBKYW51YXJ5IDIwMDQgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgSDQgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtMTEzNi9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDc4YjhhMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwMzQzMHNkcC5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmFkNmM1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBTRFAzNDMwIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMTI4TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwJzAwMDAgKGJhbmsxKSAtIHJlLW1hcHBhYmxlIGJlbG93IENTMQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwODgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOWZlZGIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL29tYXAzNDMwc2RwLmMKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYtMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcjMyIC0gY2xlYXIgJiBzZXQgYSB2YWx1ZSBpbiBhIGJpdCByYW5nZSBmb3IgYSAzMiBiaXQgYWRkcmVzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCW1zayA9IDEgPDwgbnVtX2JpdHM7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YWl0X29uX3ZhbHVlKCkgLSBjb21tb24gcm91dGluZSB0byBhbGxvdyB3YWl0aW5nIGZvciBjaGFuZ2VzIGluCisgKiAgIHZvbGF0aWxlIHJlZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworI2lmZGVmIENGR18zNDMwU0RSQU1fRERSCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfMzQzMHNkcmFtX2RkcigpIC0gSW5pdCBERFIgb24gMzQzMFNEUCBkZXYgYm9hcmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWdfMzQzMHNkcmFtX2Rkcih2b2lkKQoreworCS8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworCV9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisJX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIHNldCBtZGNmZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCisJLyogc2V0IHRpbWluZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzIChERFIgaXMgZGlmZmVyZW50KSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKwkvKiBzZXQgbXIwICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogc2V0IHVwIGRsbCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CisJZGVsYXkoMHgyMDAwKTsJLyogZ2l2ZSB0aW1lIHRvIGxvY2sgKi8KKworfQorI2VuZGlmIC8vIENGR18zNDMwU0RSQU1fRERSCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisJLyogSWYgU1lTX0NMSyBpcyBiZWluZyBkaXZpZGVkIGJ5IDIsIHJlbW92ZSBmb3Igbm93ICovCisJdmFsID0gKHZhbCAmICh+QklUNykpIHwgQklUNjsKKwlfX3Jhd193cml0ZWwodmFsLCBQUk1fQ0xLU1JDX0NUUkwpOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbiAKKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKiAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDAsIDIsIDApOy8qIEJ5cGFzcyBtb2RlOiBUMiBpbnB1dHMgYSBzcXVhcmUgY2xvY2sgKi8KKworCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUgCisJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuIAorCSAqLworCWlmKGNwdV9pc18zNDEwKCkpCisJCXNpbF9pbmRleCA9IDI7CisJZWxzZSB7CisJCWlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMxKQorCQkJc2lsX2luZGV4ID0gMDsKKwkJZWxzZSBpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMikKKwkJCXNpbF9pbmRleCA9IDE7CisJfQkKKworCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIENPUkUgRFBMTCAqLworCS8qIHNyMzIoQ01fQ0xLU0VMMl9FTVUpIHNldCBvdmVycmlkZSB0byB3b3JrIHdoZW4gYXNsZWVwICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCQkvKiBGb3IgMzQzMCBFUzEuMCBFcnJhdGEgMS41MCwgZGVmYXVsdCB2YWx1ZSBkaXJlY3RseSBkb2VzbnQKKwkJICAgd29yay4gd3JpdGUgYW5vdGhlciB2YWx1ZSBhbmQgdGhlbiBkZWZhdWx0IHZhbHVlLiAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIgKyAxKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOwkJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiBFUzEgb25seSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAwLCAzLCBHRlhfRElWKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogSVZBIERQTEwgKHNldCB0byAxMioyMD0yNDBNSHopICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBNICovCisgIAlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IgCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisvLy8vI2lmZGVmIENPTkZJR19TRVJJQUwzCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTl9QRVIsIDExLCAxLCAweDEpOworLy8vLyNlbHNlCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisvLy8vI2VuZGlmCisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJLypTRFJDKi9cCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJLypHUE1DKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQ1M1IGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0xKSkgLypzeXNfbmRtYXJlcTEgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTEpKSAvKkdQTUNfSU9fRElSIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUxIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qZ3BtY19uV2FpdCBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qZ3BtY19uV2FpdCBsYWIqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qRFNTX0RBVEExOCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypEU1NfREFUQTE5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkRTU19EQVRBMjAqL1wKKwlNVVhfVkFMKENQKENBTV9YQ0xLQiksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qQ0FNX1hDTEtCKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypVQVJUMV9DVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwlNVVhfVkFMKENQKE1DQlNQMV9EWCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNTgqL1wKKwlNVVhfVkFMKENQKFNZU18zMkspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU1lTXzMySyovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzIgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT180ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzUgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT183ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzggKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKnN5c19jbGtvdXQyIGxhYiovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypzeXNfY2xrb3V0MiBsYWIqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovXAorCU1VWF9WQUwoQ1AoVUFSVDNfQ1RTX1JDVFgpLCAoSUVOICB8IFBURCB8IEVOICB8IE0wKSkgLypVQVJUM19DVFNfUkNUWCAqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1JUU19TRCksICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDNfUlRTX1NEICovXAorCU1VWF9WQUwoQ1AoVUFSVDNfUlhfSVJSWCApLCAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUM19SWF9JUlJYKi9cCisJTVVYX1ZBTChDUChVQVJUM19UWF9JUlRYICksIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQzX1RYX0lSVFgqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qc2RyY19ja2UwICovXAorCU1VWF9WQUwoQ1Aoc2RyY19ja2UxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSkgLypzZHJjX2NrZTEgbm90IHVzZWQqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoMHgwMDEsIEdQTUNfQ09ORklHKTsJLyogc2V0IG5XUCwgZGlzYWJsZSBsaW1pdGVkIGFkZHIgKi8KKyNlbmRpZgorCisJLyogc2V0dXAgQ1MwIGZvciBNaWNyb24gTkFORCwgbGVhdmUgb3RoZXIgQ1MncyB0byB1LWJvb3QgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisjZWxzZSAvKiBDRkdfT05FTkFORCAqLworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworI2VuZGlmCisKKwkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKwkJICAgICAoKE9NQVAzNFhYX0dQTUNfQ1MwX01BUD4+MjQpICYgMHgzRikgfAorCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworCWRlbGF5KDIwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbHNlCisJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODY5MjcwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLyAKKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLiAgCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNCAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgIAorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovICAgICAKKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzQpCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNSkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMIAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkgCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApIAorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKworI2VuZGlmCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLiAKKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFLDB4MDcsMHgwNSwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDFGNCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKyAKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzksMHgxMiwweDA0LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgxNywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MTksMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBLDB4MzIsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MkYsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MDUsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MDUsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDA1LDB4MDcsMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQSwweDBDLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDE2OCwweDBDLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxMEEsMHgwQywweDAzLDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MiwweDA5LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDBCLDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwQywweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YsMHgzMCwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgxNywweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIENvcmUgRFBMTCB0YXJnZXRzIGZvciBMMyBhdCAxNjYgJiBMMTMzICovCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzEyX0VTMSxNXzEyX0VTMSxGU0xfMTJfRVMxLE0yXzEyX0VTMQorLyogRVMyICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorLyogMzQxMCAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xM19FUzEsTl8xM19FUzEsRlNMXzEzX0VTMSxNMl8xM19FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xOXAyX0VTMSxOXzE5cDJfRVMxLEZTTF8xOXAyX0VTMSxNMl8xOXAyX0VTMQorLyogRVMyICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisvKiAzNDEwICovCisud29yZCBNXzE5cDIsTl8xOXAyLEZTRUxfMTlwMixNMl8xOXAyCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMjZfRVMxLE5fMjZfRVMxLEZTTF8yNl9FUzEsTTJfMjZfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisvKiAzNDEwICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMzhwNF9FUzEsTl8zOHA0X0VTMSxGU0xfMzhwNF9FUzEsTTJfMzhwNF9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorLyogMzQxMCAqLworLndvcmQgTV8zOHA0LE5fMzhwNCxGU0VMXzM4cDQsTTJfMzhwNAorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4LDB4MDUsMHgwNywweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMCwweDBDLDB4MDMsMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxLDB4MDksMHgwNywweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4LDB4MEMsMHgwNywweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEsMHgxMywweDA3LDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDAyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMgCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1Y2UxNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDM0MzBzZHAubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhZDZjNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL2NvbmZpZy5tawpAQCAtMCwwICsxLDIyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFNEUDM0MzAgYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAxMjhNQiBtRERSLVNEUkFNIG9uIENTMAorIyBTRFAzNDMwIGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAnMDAwMCAoYmFuazEpIC0gcmUtbWFwcGFibGUgYmVsb3cgQ1MxCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjA4ODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjA5YWFmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYwpAQCAtMCwwICsxLDc3NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfbXB1X2RwbGxfcGFyYW0oKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0oKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfMzQzMFNEUkFNX0REUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAoRERSIGlzIGRpZmZlcmVudCkgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisJLyogc2V0IG1yMCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIHNldCB1cCBkbGwgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOworCWRlbGF5KDB4MjAwMCk7CS8qIGdpdmUgdGltZSB0byBsb2NrICovCisKK30KKyNlbmRpZiAvLyBDRkdfMzQzMFNEUkFNX0REUgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCWRwbGxfcGFyYW0gKmRwbGxfcGFyYW1fcDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJaWYoc3lzX2Nsa2luX3NlbCA+IDIpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCSAqLworCWlmKGNwdV9pc18zNDEwKCkpCisJCXNpbF9pbmRleCA9IDI7CisJZWxzZSB7CisJCWlmKGdldF9jcHVfcmV2KCkgPT0gQ1BVXzM0MzBfRVMxKQorCQkJc2lsX2luZGV4ID0gMDsKKwkJZWxzZSBpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMikKKwkJCXNpbF9pbmRleCA9IDE7CisJfQkKKworCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIENPUkUgRFBMTCAqLworCS8qIHNyMzIoQ01fQ0xLU0VMMl9FTVUpIHNldCBvdmVycmlkZSB0byB3b3JrIHdoZW4gYXNsZWVwICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOwkvKiBtM3gyICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDIsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsJCQkvKiA5Nk0gU3JjICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKwlzcjMyKENNX0NMS1NFTF9HRlgsIDAsIDMsIEdGWF9ESVYpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gUEVSICBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBjbGtfaW5kZXg7CisJLyogUEVSIERQTEwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkvKiBzZXQgTTMgKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBtICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IG4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7LyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsgLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBJVkEgRFBMTCAoc2V0IHRvIDEyKjIwPTI0ME1IeikgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IE0gKi8KKyAgCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvciAKKwkgKiAzNDMwIHRvIHdvcmsgaW4gMzQxMCBtb2RlCisJICovCisJX19yYXdfd3JpdGVsKDB4NUFCRixDT05UUk9MX1NDQUxBQkxFX09NQVBfT0NQKTsKKyNlbmRpZgorCXRyeV91bmxvY2tfbWVtb3J5KCk7CisJc2V0X211eGNvbmZfcmVncygpOworCWRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfMzQzMHNkcmFtX2RkcigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogcGVyaXBoZXJhbF9lbmFibGUKKyAqIERlc2NyaXB0aW9uOiBFbmFibGUgdGhlIGNsa3MgJiBwb3dlciBmb3IgcGVyaWZzIChHUFQyLCBVQVJUMSwuLi4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwZXJfY2xvY2tzX2VuYWJsZSh2b2lkKQoreworCS8qIEVuYWJsZSBHUDIgdGltZXIuICovCisJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCAxLCAweDEpOyAvKiBHUFQyID0gc3lzIGNsayAqLworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogSUNLZW4gR1BUMiAqLworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMywgMSwgMHgxKTsgLyogRkNLZW4gR1BUMiAqLworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKyNkZWZpbmUgCU1VWF9WQUwoT0ZGU0VULFZBTFVFKVwKKwkJX19yYXdfd3JpdGV3KChWQUxVRSksIE9NQVAzNFhYX0NUUkxfQkFTRSArIChPRkZTRVQpKTsKKworI2RlZmluZQkJQ1AoeCkJKENPTlRST0xfUEFEQ09ORl8jI3gpCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICovCisjZGVmaW5lIE1VWF9ERUZBVUxUKClcCisJTVVYX1ZBTChDUChTRFJDX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENCovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDE5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMTkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjMqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjYqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI4KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMjkqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMxKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfQ0xLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19DTEsqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMzKi9cCisJTVVYX1ZBTChDUChHUE1DX0ExKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTIpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EzKi9cCisJTVVYX1ZBTChDUChHUE1DX0E0KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTUpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E3KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTgpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0ExMCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENCovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q2KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDYqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDcpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q5KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDkqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MwKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MyKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MzKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M2Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19DTEspLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0NMSyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05BRFZfQUxFKi9cCisJTVVYX1ZBTChDUChHUE1DX05PRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTk9FKi9cCisJTVVYX1ZBTChDUChHUE1DX05XRSksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTBfQ0xFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMF9DTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182MSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV1ApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XUCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMCksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQwKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMyksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY1Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkwKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTEqL1wKKwlNVVhfVkFMKENQKENBTV9XRU4pLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNjcqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfVFgqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlRTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9DVFMpLCAgICAgIChJRU4gfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SWCksICAgICAgIChJRU4gfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDFfUlgqL1wKKwlNVVhfVkFMKENQKE1DQlNQMV9EWCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNTgqL1wKKwlNVVhfVkFMKENQKFNZU18zMkspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU1lTXzMySyovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzIgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT180ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzUgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT183ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzggKi9cCisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMiksICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fMTg2Ki9cCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfblRSU1QqL1wKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UQ0sqL1wKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UTVMqL1wKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UREkqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUwKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMSovXAorCU1VWF9WQUwoQ1AoRVRLX0NMSyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEyKi9cCisJTVVYX1ZBTChDUChFVEtfQ1RMKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTMqL1wKKwlNVVhfVkFMKENQKEVUS19EMCApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDIgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNyovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI4Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2V0X211eGNvbmZfcmVncworICogRGVzY3JpcHRpb246IFNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24gTXV4IHJlZ2lzdGVycworICogICAgICAgICAgICAgIHNwZWNpZmljIHRvIHRoZSBoYXJkd2FyZS4gTWFueSBwaW5zIG5lZWQKKyAqICAgICAgICAgICAgICB0byBiZSBtb3ZlZCBmcm9tIHByb3RlY3QgdG8gcHJpbWFyeSBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCU1VWF9ERUZBVUxUKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBuYW5kK19pbml0CisgKiBEZXNjcmlwdGlvbjogU2V0IHVwIG5hbmQgZm9yIG5hbmQgYW5kIGpmZnMyIGNvbW1hbmRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCgweDAwMSwgR1BNQ19DT05GSUcpOwkvKiBzZXQgbldQLCBkaXNhYmxlIGxpbWl0ZWQgYWRkciAqLworI2VuZGlmCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMzRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKwlkZWxheSgyMDAwKTsKKyNpZiBkZWZpbmVkKENGR19OQU5EKQorIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2VsaWYgZGVmaW5lZChDRkdfT05FTkFORCkKKwlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ0ZHX0NNRF9GQVQKK3R5cGVkZWYgaW50IChtbWNfYm9vdF9hZGRyKSAodm9pZCk7CitpbnQgbW1jX2Jvb3Qodm9pZCkKK3sKKyAgICAgICBsb25nIHNpemUsIGk7CisgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBDRkdfTE9BREFERFI7CisgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgICAgICBjaGFyIGJ1ZlsxMl07CisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIGludCBkZXYgPSAwOworICAgICAgIGludCBwYXJ0ID0gMTsKKyAgICAgICBjaGFyICplcDsKKyAgICAgICB1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIFgtbG9hZGVyIG9uIE1NQyBcbiIpOworCisgICAgICAgcmV0ID0gbW1jX2luaXQoMSk7CisgICAgICAgaWYocmV0ID09IDApeworICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBNTUMgaW5pdCBmYWlsZWQgXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoMCk7CisgICAgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgMSk7CisgICAgICAgc2l6ZSA9IGZpbGVfZmF0X3JlYWQoInUtYm9vdC5iaW4iLCAodW5zaWduZWQgY2hhciAqKW9mZnNldCwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUMgXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisKKyAgICAgICAoKG1tY19ib290X2FkZHIgKikgQ0ZHX0xPQURBRERSKSAoKTsKKworICAgICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY5MjcwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4gIAorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAKKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLyAgICAgCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpIAorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKSAKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4gCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRSwweDA3LDB4MDUsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisgCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5LDB4MTIsMHgwNCwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MTcsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDE5LDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQSwweDMyLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDJGLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDA1LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIsMHgwOSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgwQiwweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MEMsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGLDB4MzAsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MTcsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBDb3JlIERQTEwgdGFyZ2V0cyBmb3IgTDMgYXQgMTY2ICYgTDEzMyAqLworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xMl9FUzEsTV8xMl9FUzEsRlNMXzEyX0VTMSxNMl8xMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTNfRVMxLE5fMTNfRVMxLEZTTF8xM19FUzEsTTJfMTNfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisvKiAzNDEwICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTlwMl9FUzEsTl8xOXAyX0VTMSxGU0xfMTlwMl9FUzEsTTJfMTlwMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorLyogMzQxMCAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCBNXzI2X0VTMSxOXzI2X0VTMSxGU0xfMjZfRVMxLE0yXzI2X0VTMQorLyogRVMyICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorLyogMzQxMCAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCBNXzM4cDRfRVMxLE5fMzhwNF9FUzEsRlNMXzM4cDRfRVMxLE0yXzM4cDRfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKy8qIDM0MTAgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOCwweDA1LDB4MDcsMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAsMHgwQywweDAzLDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMSwweDA5LDB4MDcsMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOCwweDBDLDB4MDcsMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxLDB4MTMsMHgwNywweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzOTljNWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAzZXZtLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0NWVjMjIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9jb25maWcubWsKQEAgLTAsMCArMSwxOSBAQAorIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9vbWFwM2V2bS5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDdiOTk0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXVuc2lnbmVkIGludCBzeXNfY2xrOworCXVuc2lnbmVkIGludCBtOworCXVuc2lnbmVkIGludCBuOworCXVuc2lnbmVkIGludCBtMjsKKwl1bnNpZ25lZCBpbnQgbTM7CisJdW5zaWduZWQgaW50IG00OworCXVuc2lnbmVkIGludCBtNTsKKwl1bnNpZ25lZCBpbnQgbTY7CisJdW5zaWduZWQgaW50IG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCit2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkgLSByZXR1cm4gU1lTX0JPT1RbNDowXQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChTWVNCT09UX01BU0spOworICAgICAgICByZXR1cm4gbW9kZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBnZXRfbWVtX3R5cGUodm9pZCkgLSByZXR1cm5zIHRoZSBraW5kIG9mIG1lbW9yeSBjb25uZWN0ZWQKKyAqIHRvIEdQTUMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGJvb3QgZm9ybS4gVXNlcyBTWVMgQk9PVCBzZXR0aW5ncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9tZW1fdHlwZSh2b2lkKQoreworICAgICAgICB1MzIgICBtZW1fdHlwZSA9IGdldF9zeXNib290X3ZhbHVlKCk7CisgICAgICAgIHN3aXRjaCAobWVtX3R5cGUpeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGNhc2UgMjI6ICAgIHJldHVybiBHUE1DX09ORU5BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIGNhc2UgMjc6ICAgIHJldHVybiBHUE1DX05BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNhc2UgNjogICAgIHJldHVybiBNTUNfT05FTkFORDsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgY2FzZSAyNjogICAgcmV0dXJuIEdQTUNfTURPQzsKKworICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICBjYXNlIDI0OglyZXR1cm4gTU1DX05BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICBkZWZhdWx0OiAgICByZXR1cm4gR1BNQ19OT1I7CisgICAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworCXUzMiBjcHVpZD0wOworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCWlmKChjcHVpZCAgJiAweGYpID09IDB4MCkKKwkJcmV0dXJuIENQVV8zNDMwX0VTMTsKKwllbHNlCisJCXJldHVybiBDUFVfMzQzMF9FUzI7CisKK30KKwordTMyIGlzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwLCBjcHVfZmFtaWx5ID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiKGNwdWlkKSk7CisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJfSBlbHNlIHsKKwkJY3B1aWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAoY3B1aWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisJCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gY3B1X2ZhbWlseTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzcjMyIC0gY2xlYXIgJiBzZXQgYSB2YWx1ZSBpbiBhIGJpdCByYW5nZSBmb3IgYSAzMiBiaXQgYWRkcmVzcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCW1zayA9IDEgPDwgbnVtX2JpdHM7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YWl0X29uX3ZhbHVlKCkgLSBjb21tb24gcm91dGluZSB0byBhbGxvdyB3YWl0aW5nIGZvciBjaGFuZ2VzIGluCisgKiAgIHZvbGF0aWxlIHJlZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHdhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworI2lmZGVmIENGR19PTUFQRVZNX0REUgorI2lmZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWtlX2NzMV9jb250aWd1b3VzKCkgLSBmb3IgZXMyIGFuZCBhYm92ZSByZW1hcCBjczEgYmVoaW5kIGNzMCB0byBhbGxvdworICogIGNvbW1hbmQgbGluZSBtZW09eHl6IHVzZSBhbGwgbWVtb3J5IHdpdGggb3V0IGRpc2NvbnRpbnVvdXMgc3VwcG9ydAorICogIGNvbXBpbGVkIGluLiAgQ291bGQgZG8gaXQgYXQgdGhlIEFUQUcsIGJ1dCB0aGVyZSByZWFsbHkgaXMgdHdvIGJhbmtzLi4uCisgKiBDYWxsZWQgYXMgcGFydCBvZiAybmQgcGhhc2UgRERSIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1ha2VfY3MxX2NvbnRpZ3VvdXModm9pZCkKK3sKKwl1MzIgc2l6ZSwgYV9hZGRfbG93LCBhX2FkZF9oaWdoOworCisJc2l6ZSA9IGdldF9zZHJfY3Nfc2l6ZShTRFJDX0NTMF9PU0VUKTsKKwlzaXplIC89IFNaXzMyTTsgICAgICAgICAvKiBmaW5kIHNpemUgdG8gb2Zmc2V0IENTMSAqLworCWFfYWRkX2hpZ2ggPSAoc2l6ZSAmIDMpIDw8IDg7ICAgLyogc2V0IHVwIGxvdyBmaWVsZCAqLworCWFfYWRkX2xvdyA9IChzaXplICYgMHgzQykgPj4gMjsgLyogc2V0IHVwIGhpZ2ggZmllbGQgKi8KKwlfX3Jhd193cml0ZWwoKGFfYWRkX2hpZ2ggfCBhX2FkZF9sb3cpLCBTRFJDX0NTX0NGRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NzMF9zaXplKCkgLSBnZXQgc2l6ZSBvZiBjaGlwIHNlbGVjdCAwLzEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3Nkcl9jc19zaXplKHUzMiBvZmZzZXQpCit7CisJdTMyIHNpemU7CisKKwkvKiBnZXQgcmFtIHNpemUgZmllbGQgKi8KKwlzaXplID0gX19yYXdfcmVhZGwoU0RSQ19NQ0ZHXzAgKyBvZmZzZXQpID4+IDg7CisJc2l6ZSAmPSAweDNGRjsgICAgICAgICAgLyogcmVtb3ZlIHVud2FudGVkIGJpdHMgKi8KKwlzaXplICo9IFNaXzJNOyAgICAgICAgICAvKiBmaW5kIHNpemUgaW4gTUIgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb25maWdfMzQzMHNkcmFtX2RkcigpIC0gSW5pdCBERFIgb24gMzQzMFNEUCBkZXYgYm9hcmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWdfMzQzMHNkcmFtX2Rkcih2b2lkKQoreworCisjaWZuZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorCS8qIHJlc2V0IHNkcmMgY29udHJvbGxlciAqLworCV9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisJX19yYXdfd3JpdGVsKDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCS8qIHNldCBtZGNmZyAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCisJLyogc2V0IHRpbWluZyAqLworCWlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCV9fcmF3X3dyaXRlbChIWU5JWF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJCV9fcmF3X3dyaXRlbChIWU5JWF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwl9IGVsc2UgeworCQlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfT05FTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19PTkVOQU5EKSl7CisJCQlfX3Jhd193cml0ZWwoSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQkJX19yYXdfd3JpdGVsKElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwkJfQorCQlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwoZ2V0X21lbV90eXBlKCkgPT0gTU1DX05BTkQpKXsKKwkJCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQkJX19yYXdfd3JpdGVsKE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCX0KKwkgfQorCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUE9XRVJfUE9QLCBTRFJDX1BPV0VSKTsKKworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKEREUiBpcyBkaWZmZXJlbnQpICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCS8qIHNldCBtcjAgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBzZXQgdXAgZGxsICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsKKwlkZWxheSgweDIwMDApOwkvKiBnaXZlIHRpbWUgdG8gbG9jayAqLworI2Vsc2UKKyAgICAgICAvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKyAgICAgICAgIF9fcmF3X3dyaXRlbChTT0ZUUkVTRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgIHdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKyAgICAgICAgIF9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKyAgICAgICAgIC8qIHNldHVwIHNkcmMgdG8gYmFsbCBtdXggKi8KKyAgICAgICAgIF9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisgICAgICAgICAvKiBTRFJDX01DRkcwIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwODApID0gMHgwMjU4NDA5OTsvL2Zyb20gTWljcm9uCisKKwkgaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEEwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwOWMpID0gMHg5MmUxYzRjNjsvLyBmb3IgMjAwTQorCQkgLyogU0RSQ19BQ1RJTV9DVFJMQjAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhMCkgPSAweDAwMDIxMTFjOworCSB9IGVsc2UgeworCQkgLyogU0RSQ19BQ1RJTV9DVFJMQTAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA5YykgPSAweGFhOWRiNGM2Oy8vIGZvciAxNjZNIGZyb20gcmt3CisJCSAvKiBTRFJDX0FDVElNX0NUUkxCMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGEwKSA9IDB4MDAwMTE1MTc7CisJIH0KKworCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTQpID0weDAwMDREQzAxOworCisgICAgICAgICAvKiBEaXNibGUgUG93ZXIgRG93biBvZiBDS0UgY3V6IG9mIDEgQ0tFIG9uIGNvbWJvIHBhcnQgKi8KKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDA3MCkgPSAweDAwMDAwMDgxOworCisgICAgICAgICAvKiBTRFJDX01hbnVhbCBjb21tYW5kIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMDsgLy8gTk9QIGNvbW1hbmQKKyAgICAgICAgIGRlbGF5KDUwMDApOworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDE7IC8vIFByZWNoYXJnZSBjb21tYW5kCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMjsgLy8gQXV0by1yZWZyZXNoIGNvbW1hbmQKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAyOyAvLyBBdXRvLXJlZnJlc2ggY29tbWFuZAorCisgICAgICAgICAvKiBTRFJDIE1SMCByZWdpc3RlciAqLworICAgICAgICAgKCooaW50KikweDZEMDAwMDg0KSA9IDB4MDAwMDAwMzI7IC8vIEJ1cnN0IGxlbmd0aCA9NAorICAgICAgICAgLy8gQ0FTIGxhdGVuY3kgPSAzCisgICAgICAgICAvLyBXcml0ZSBCdXJzdCA9IFJlYWQgQnVyc3QKKyAgICAgICAgIC8vIFNlcmlhbCBNb2RlCisKKyAgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwNjApID0gMHgwMDAwQTsKKyAgICAgICAgIGRlbGF5KDB4MjAwMDApOyAvLyBzb21lIGRlbGF5CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisJbWFrZV9jczFfY29udGlndW91cygpOworCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzEpOworCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzEpOworCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMICsgU0RSQ19DUzFfT1NFVCk7CisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJZGVsYXkoNTAwMCk7ICAgLyogc3VwcG9zZWQgdG8gYmUgMTAwdXMgcGVyIGRlc2lnbiBzcGVjIGZvciBtZGRyL21zZHIgKi8KKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzAgKyBTRFJDX0NTMV9PU0VUKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENGR19PTUFQRVZNX0REUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbgorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qCisgKiBPTUFQMzR4LzM1eCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGRwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKE1QVV9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX01QVVs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBwdHItPmZzZWwpOworfQorCitzdGF0aWMgdm9pZCBpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGRwbGw0X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCXN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICopZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciArPSBjbGtfaW5kZXg7CisKKwkvKiBFTl9QRVJJUEhfRFBMTDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogTTYgKERJVl9EUExMNCk6IENNX0NMS1NFTDFfRU1VWzI0OjI5XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA2LCBwdHItPm02KTsKKworCS8qIE01IChDTEtTRUxfQ0FNKTogQ01fQ0xLU0VMMV9FTVVbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNiwgcHRyLT5tNSk7CisKKwkvKiBNNCAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDYsIHB0ci0+bTQpOworCisJLyogTTMgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1s4OjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNiwgcHRyLT5tMyk7CisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE5XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDEyLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBNMkRJViAoQ0xLU0VMXzk2TSk6IENNX0NMS1NFTF9DT1JFWzEyOjEzXSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDEyLCAyLCBwdHItPm0yZGl2KTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwcmNtX2luaXQoKSAtIGluaXRzIGNsb2NrcyBmb3IgUFJDTSBhcyBkZWZpbmVkIGluIGNsb2Nrcy5oCisgKiAgIC0tIGNhbGxlZCBmcm9tIFNSQU0sIG9yIEZsYXNoICh1c2luZyB0ZW1wIFNSQU0gc3RhY2spLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmNtX2luaXQodm9pZCkKK3sKKwl1MzIgb3NjX2Nsaz0wLCBzeXNfY2xraW5fc2VsOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwkvKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKwlpZigoaXNfY3B1X2ZhbWlseSgpICE9IENQVV9PTUFQMzZYWCkgJiYgKHN5c19jbGtpbl9zZWwgPiAyKSkgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWludCBtb2RlOworCisJLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKwkvKiBzZWN1cmUgY29kZSBicmVha3MgZm9yIFNlY3VyZS9FbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UKi8KKwltb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisJaWYgKG1vZGUgPT0gR1BfREVWSUNFKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfMzQzMF9BU18zNDEwCisJLyogc2V0dXAgdGhlIHNjYWxhYmlsaXR5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKKy8qIFNldCBNVVggZm9yIFVBUlQsIEdQTUMsIFNEUkMsIEdQSU8gKi8KKworLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNjEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjQqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg4Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODkqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkxKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLCAgICAgICAoSUVOIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAzNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzMuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKwlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyAgICAgICAgCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisgICAgICAgIAlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisgICAgICAgIAkJICAgICAoKE5BTkRfQkFTRV9BRFI+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCisJfQorCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChPTkVOQU5EX0JBU0U+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorICAgICAgICAJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKworICAgICAgIGxvbmcgc2l6ZSA9IDA7CisjaWZkZWYgQ0ZHX0NNRF9GQVQKKyAgICAgICBibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUNcbiIpOworCisgICAgICAgcmV0ID0gbW1jX2luaXQoMSk7CisgICAgICAgaWYocmV0ID09IDApeworICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBNTUMgaW5pdCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgZGV2X2Rlc2MgPSBtbWNfZ2V0X2RldigwKTsKKyAgICAgICBmYXRfcmVnaXN0ZXJfZGV2aWNlKGRldl9kZXNjLCAxKTsKKyAgICAgICBzaXplID0gZmlsZV9mYXRfcmVhZCgidS1ib290LmJpbiIsIGJ1ZiwgMCk7CisgICAgICAgaWYgKHNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuJWxkIEJ5dGVzIFJlYWQgZnJvbSBNTUNcbiIsIHNpemUpOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBPUyBCb290bG9hZGVyIGZyb20gTU1DLi4uXG4iKTsKKyNlbmRpZgorICAgICAgIHJldHVybiBzaXplOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzNhM2M0OAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzEpCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzMpCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpCitwbGxfZGl2X2FkZDQ6CisgICAgLndvcmQgQ01fQ0xLU0VMX0dGWAorcGxsX2Rpdl92YWw0OgorICAgIC53b3JkIChHRlhfRElWIDw8IDApCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorLndvcmQgMzAwLCAxMiwgMCwgMQorCitpdmFfMzZ4X2RwbGxfcGFyYW06Cisud29yZCAxMCwgMCwgMCwgMQorLndvcmQgMTAsIDAsIDAsIDEKKy53b3JkIDEwLCAwLCAwLCAxCisud29yZCAxMCwgMCwgMCwgMQorCitjb3JlXzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorLndvcmQgMjAwLCAxMiwgMCwgMQorCitwZXJfMzZ4X2RwbGxfcGFyYW06CisvKiAgICBTWVNDTEsgICAgIE0gICAgICBOICAgICAgTTIgICAgICBNMyAgICAgIE00ICAgICBNNSAgICAgIE02ICAgICAgbTJESVYgKi8KKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWYzNTJkMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkcy5jZmcgYi94LWxvYWRlci9ib2FyZHMuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjM0NTQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZHMuY2ZnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTGlzdCBvZiBib2FyZHMKKyMKKyMgU3ludGF4OgorIyAgICAgICAgd2hpdGUtc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZW50cmllczsKKyMgICAgICAgIGVhY2ggZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorIworIyAgICAgICAgVGFyZ2V0bmFtZSAgQXJjaGl0ZWN0dXJlICBDUFUgIEJvYXJkbmFtZSAgVmVuZG9yICBTb0MKKyMKKyMgICAgICAgIFVudXNlZCBmaWVsZHMgY2FuIGJlIHNwZWNpZmllZCBhcyAiLSIsIG9yIG9taXR0ZWQgaWYgdGhleQorIyAgICAgICAgYXJlIHRoZSBsYXN0IGZpZWxkIG9uIHRoZSBsaW5lLgorIworIyAgICAgICAgTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgorIyAgICAgICAgQmxhbmsgbGluZXMgYXJlIGlnbm9yZWQuCisjCisjIFRvIGtlZXAgdGhlIGxpc3Qgc29ydGVkLCB1c2Ugc29tZXRoaW5nIGxpa2UKKyMKKyMgICAgICAgIDouLCQhIHNvcnQgLWYgLWsyLDIgLWszLDMgLWs2LDYgLWs1LDUgLWsxLDEKKyMKKyMgVGFyZ2V0ICAgICAgICAgICAgQVJDSCAgICAgICBTb0MgICAgICAgICAgICAgQm9hcmQgbmFtZSAgICAgICAgVmVuZG9yICAgICAgICAgICAgICAgIFNvQworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RpYW1vbmQgICAgICAgICAgICAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgZGlhbW9uZCAgICAgICAgICAgbmVzdAorajQ5ICAgICAgICAgICAgICAgICBhcm0gICAgICAgIG9tYXAzICAgICAgICAgICBqNDkgICAgICAgICAgICAgICBuZXN0CitqNDktdXNiLWxvYWRlciAgICAgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGo0OS11c2ItbG9hZGVyICAgIG5lc3QKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZSBiL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY3MmJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliY29tbW9uLmEKKworQU9CSlMJPQorCisjIGNvcmUKK0NPQkpTLXkgKz0gYm9vdG0ubworQ09CSlMteSArPSBtYWluLm8KK0NPQkpTLXkgKz0gY29uc29sZS5vCitDT0JKUy15ICs9IGltYWdlLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKEFPQkpTKSAkKENPQkpTKSkKKworQ1BQRkxBR1MgKz0gLUkuLgorCithbGw6CSQoTElCKSAkKEFPQkpTKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMgYi94LWxvYWRlci9jb21tb24vYm9vdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJhMjIwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgR3JhbnQgRXJpY2tzb24gPG1hcmF0aG9uOTZAZ21haWwuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0aGF0IGJvb3QgdGhlIHNlY29uZC1zdGFnZQorICogICAgICBib290IGxvYWRlciBmcm9tIG1lbW9yeSwgaW4gZWl0aGVyIHJhdywgYmluYXJ5IGZvcm1hdCBvcgorICogICAgICBpbiB1LWJvb3QgJ21raW1hZ2UnIGZvcm1hdC4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Ym9vdG0uaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorCit0eXBlZGVmIHZvaWQgKHNwbCkodm9pZCk7CisKK3N0YXRpYyB2b2lkIGV4ZWModWxvbmcgYWRkcmVzcywgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlwcmludGYoIlxuU3RhcnRpbmcgJXMgLi4uIiwgd2hhdCk7CisKKwkoKHNwbCAqKWFkZHJlc3MpKCk7Cit9CisKK2ludCBib290bShjb25zdCB1aW50OF90ICpidWZmZXIpCit7CisJaW50IHN0YXR1cyA9IEJPT1RNX1NUQVRVU19GQUlMVVJFOworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorCWNvbnN0IGludCBmb3JtYXQgPSBnZW5pbWdfZ2V0X2Zvcm1hdCgodm9pZCAqKWJ1ZmZlcik7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKiBoZWFkZXIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilidWZmZXI7CisKKwlzd2l0Y2ggKGZvcm1hdCkgeworCisJY2FzZSBJTUFHRV9GT1JNQVRfTEVHQUNZOgorCQlzdGF0dXMgPSBib290bV9pbWFnZShoZWFkZXIpOworCQlicmVhazsKKworCWNhc2UgSU1BR0VfRk9STUFUX0ZJVDoKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgRklUICglZClcbiIsIGZvcm1hdCk7CisJCWJyZWFrOworCisJY2FzZSBJTUFHRV9GT1JNQVRfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gb3IgaW52YWxpZCBpbWFnZSBmb3JtYXQgKCVkKVxuIiwgZm9ybWF0KTsKKwkJYnJlYWs7CisKKwl9CisjZWxzZQorCXN0YXR1cyA9IGJvb3RtX2JpbmFyeShidWZmZXIpOworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKSAqLworCisJcmV0dXJuIChzdGF0dXMpOworfQorCitpbnQgYm9vdG1fYmluYXJ5KGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKwkvKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4uICovCisKKwlleGVjKCh1bG9uZylidWZmZXIsICJzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIiKTsKKworCS8qIEhvd2V2ZXIsIGlmIGl0IGRvZXMsIHJldHVybiBmYWlsZWQgc3RhdHVzLiAqLworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKK2ludCBib290bV9pbWFnZShjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGVhZGVyKQoreworCWNvbnN0IGNoYXIgKiBmYWlsdXJlID0gTlVMTDsKKwljb25zdCBjaGFyICogdHlwZV9uYW1lID0gTlVMTDsKKwl1aW50MzJfdCBsb2FkLCBpbWFnZV9zdGFydCwgaW1hZ2VfbGVuOworCisJLyogRGlzcGxheSB0byBzdGFuZGFyZCBvdXRwdXQgdGhlIGltYWdlIGNvbnRlbnRzLiAqLworCisJaW1hZ2VfcHJpbnRfY29udGVudHMoaGVhZGVyKTsKKworCS8qIFZhbGlkYXRlIHRoZSBpbWFnZSBoZWFkZXIgYW5kIGltYWdlIGRhdGEgQ1JDcyAqLworCisJcHV0cygiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKworCXsKKwkJaWYgKCFpbWFnZV9jaGVja19oY3JjKGhlYWRlcikpIHsKKwkJCWZhaWx1cmUgPSAiSGVhZGVyIEludmFsaWRcbiI7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoIWltYWdlX2NoZWNrX2RjcmMoaGVhZGVyKSkgeworCQkJZmFpbHVyZSA9ICJEYXRhIEludmFsaWRcbiI7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlwdXRzKCJPS1xuIik7CisKKwkvKiBXZSBPTkxZIHN1cHBvcnQgdW5jb21wcmVzc2VkIEFSTSBVLUJvb3QgZmlybXdhcmUgaW1hZ2VzLiBDaGVjaworCSAqIHRvIG1ha2Ugc3VyZSB0aGF0J3Mgd2hhdCB3ZSBhcmUgZ29pbmcgdG8gYm9vdC4KKwkgKi8KKworCWlmICghaW1hZ2VfY2hlY2tfdHlwZShoZWFkZXIsIElIX1RZUEVfRklSTVdBUkUpKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgbm90IGEgZmlybXdhcmUgaW1hZ2VcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWltYWdlX2NoZWNrX29zKGhlYWRlciwgSUhfT1NfVV9CT09UKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCB1LWJvb3QgZmlybXdhcmVcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoaW1hZ2VfZ2V0X2NvbXAoaGVhZGVyKSAhPSBJSF9DT01QX05PTkUpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBjb21wcmVzc2VkXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFpbWFnZV9jaGVja190YXJnZXRfYXJjaChoZWFkZXIpKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgbm90IGJ1aWx0IGZvciB0aGlzIHByb2Nlc3NvclxuIjsKKwkJZ290byBmYWlsOworCX0KKworCXR5cGVfbmFtZSA9IGdlbmltZ19nZXRfdHlwZV9uYW1lKGltYWdlX2dldF90eXBlKGhlYWRlcikpOworCisJcHJpbnRmKCIgICBMb2FkaW5nICVzIC4uLiAiLCB0eXBlX25hbWUpOworCisJeworCQlsb2FkID0gaW1hZ2VfZ2V0X2xvYWQoaGVhZGVyKTsKKwkJaW1hZ2Vfc3RhcnQgPSBpbWFnZV9nZXRfZGF0YShoZWFkZXIpOworCQlpbWFnZV9sZW4gPSBpbWFnZV9nZXRfZGF0YV9zaXplKGhlYWRlcik7CisKKwkJbWVtbW92ZV93ZCgodm9pZCAqKWxvYWQsICh2b2lkICopaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbiwgQ0hVTktTWik7CisJfQorCisJcHV0cygiT0tcbiIpOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCisJZXhlYyhsb2FkLCB0eXBlX25hbWUpOworCisJLyogSG93ZXZlciwgaWYgaXQgZG9lcywgcmV0dXJuIGZhaWxlZCBzdGF0dXMuICovCisKKyBmYWlsOgorCXB1dHMoZmFpbHVyZSk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9jb25zb2xlLmMgYi94LWxvYWRlci9jb21tb24vY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTNjYjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vY29uc29sZS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFBhb2xvIFNjYWZmYXJkaSwgQUlSVkVOVCBTQU0gcy5wLmEgLSBSSU1JTkkoSVRBTFkpLCBhcnNlbmlvQHRpbi5pdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKwordm9pZCBwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJc2VyaWFsX3B1dHMocyk7Cit9CisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jIGIveC1sb2FkZXIvY29tbW9uL2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxNmU5NQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jCkBAIC0wLDAgKzEsMjU0MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOCBTZW1paGFsZgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgVVNFX0hPU1RDQworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCisjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSEFTX0RBVEFGTEFTSAorI2luY2x1ZGUgPGRhdGFmbGFzaC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTE9HQlVGRkVSCisjaW5jbHVkZSA8bG9nYnVmZi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQorI2luY2x1ZGUgPHJ0Yy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbWFnZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkIChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKyNpbmNsdWRlIDx1LWJvb3QvbWQ1Lmg+CisjaW5jbHVkZSA8c2hhMS5oPgorCitzdGF0aWMgaW50IGZpdF9jaGVja19yYW1kaXNrIChjb25zdCB2b2lkICpmaXQsIGludCBvc19ub2Zmc2V0LAorCQl1aW50OF90IGFyY2gsIGludCB2ZXJpZnkpOworI2VuZGlmCisKKyNlbHNlCisjaW5jbHVkZSAibWtpbWFnZS5oIgorI2luY2x1ZGUgPHUtYm9vdC9tZDUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyovCisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9hcmNoW10gPSB7CisJewlJSF9BUkNIX0lOVkFMSUQsCU5VTEwsCQkiSW52YWxpZCBBUkNIIiwJfSwKKwl7CUlIX0FSQ0hfQUxQSEEsCQkiYWxwaGEiLAkiQWxwaGEiLAl9LAorCXsJSUhfQVJDSF9BUk0sCQkiYXJtIiwJCSJBUk0iLAkJfSwKKwl7CUlIX0FSQ0hfSTM4NiwJCSJ4ODYiLAkJIkludGVsIHg4NiIsCX0sCisJewlJSF9BUkNIX0lBNjQsCQkiaWE2NCIsCQkiSUE2NCIsCQl9LAorCXsJSUhfQVJDSF9NNjhLLAkJIm02OGsiLAkJIk02OEsiLAkJfSwKKwl7CUlIX0FSQ0hfTUlDUk9CTEFaRSwJIm1pY3JvYmxhemUiLAkiTWljcm9CbGF6ZSIsCX0sCisJewlJSF9BUkNIX01JUFMsCQkibWlwcyIsCQkiTUlQUyIsCQl9LAorCXsJSUhfQVJDSF9NSVBTNjQsCQkibWlwczY0IiwJIk1JUFMgNjQgQml0IiwJfSwKKwl7CUlIX0FSQ0hfTklPUzIsCQkibmlvczIiLAkiTklPUyBJSSIsCX0sCisJewlJSF9BUkNIX1BQQywJCSJwb3dlcnBjIiwJIlBvd2VyUEMiLAl9LAorCXsJSUhfQVJDSF9QUEMsCQkicHBjIiwJCSJQb3dlclBDIiwJfSwKKwl7CUlIX0FSQ0hfUzM5MCwJCSJzMzkwIiwJCSJJQk0gUzM5MCIsCX0sCisJewlJSF9BUkNIX1NILAkJInNoIiwJCSJTdXBlckgiLAl9LAorCXsJSUhfQVJDSF9TUEFSQywJCSJzcGFyYyIsCSJTUEFSQyIsCX0sCisJewlJSF9BUkNIX1NQQVJDNjQsCSJzcGFyYzY0IiwJIlNQQVJDIDY0IEJpdCIsCX0sCisJewlJSF9BUkNIX0JMQUNLRklOLAkiYmxhY2tmaW4iLAkiQmxhY2tmaW4iLAl9LAorCXsJSUhfQVJDSF9BVlIzMiwJCSJhdnIzMiIsCSJBVlIzMiIsCX0sCisJewktMSwJCQkiIiwJCSIiLAkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9vc1tdID0geworCXsJSUhfT1NfSU5WQUxJRCwJTlVMTCwJCSJJbnZhbGlkIE9TIiwJCX0sCisJewlJSF9PU19MSU5VWCwJImxpbnV4IiwJIkxpbnV4IiwJCX0sCisjaWYgZGVmaW5lZChDT05GSUdfTFlOWEtESSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXsJSUhfT1NfTFlOWE9TLAkibHlueG9zIiwJIkx5bnhPUyIsCQl9LAorI2VuZGlmCisJewlJSF9PU19ORVRCU0QsCSJuZXRic2QiLAkiTmV0QlNEIiwJCX0sCisJewlJSF9PU19SVEVNUywJInJ0ZW1zIiwJIlJURU1TIiwJCX0sCisJewlJSF9PU19VX0JPT1QsCSJ1LWJvb3QiLAkiVS1Cb290IiwJCX0sCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VMRikgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXsJSUhfT1NfUU5YLAkicW54IiwJCSJRTlgiLAkJCX0sCisJewlJSF9PU19WWFdPUktTLAkidnh3b3JrcyIsCSJWeFdvcmtzIiwJCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JTlRFR1JJVFkpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX0lOVEVHUklUWSwiaW50ZWdyaXR5IiwJIklOVEVHUklUWSIsCQl9LAorI2VuZGlmCisjaWZkZWYgVVNFX0hPU1RDQworCXsJSUhfT1NfNF80QlNELAkiNF80YnNkIiwJIjRfNEJTRCIsCQl9LAorCXsJSUhfT1NfREVMTCwJImRlbGwiLAkJIkRlbGwiLAkJCX0sCisJewlJSF9PU19FU0lYLAkiZXNpeCIsCQkiRXNpeCIsCQkJfSwKKwl7CUlIX09TX0ZSRUVCU0QsCSJmcmVlYnNkIiwJIkZyZWVCU0QiLAkJfSwKKwl7CUlIX09TX0lSSVgsCSJpcml4IiwJCSJJcml4IiwJCQl9LAorCXsJSUhfT1NfTkNSLAkibmNyIiwJCSJOQ1IiLAkJCX0sCisJewlJSF9PU19PUEVOQlNELAkib3BlbmJzZCIsCSJPcGVuQlNEIiwJCX0sCisJewlJSF9PU19QU09TLAkicHNvcyIsCQkicFNPUyIsCQkJfSwKKwl7CUlIX09TX1NDTywJInNjbyIsCQkiU0NPIiwJCQl9LAorCXsJSUhfT1NfU09MQVJJUywJInNvbGFyaXMiLAkiU29sYXJpcyIsCQl9LAorCXsJSUhfT1NfU1ZSNCwJInN2cjQiLAkJIlNWUjQiLAkJCX0sCisjZW5kaWYKKwl7CS0xLAkJIiIsCQkiIiwJCQl9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX3R5cGVbXSA9IHsKKwl7CUlIX1RZUEVfSU5WQUxJRCwgICAgTlVMTCwJICAiSW52YWxpZCBJbWFnZSIsCX0sCisJewlJSF9UWVBFX0ZJTEVTWVNURU0sICJmaWxlc3lzdGVtIiwgIkZpbGVzeXN0ZW0gSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9GSVJNV0FSRSwgICAiZmlybXdhcmUiLAkgICJGaXJtd2FyZSIsCQl9LAorCXsJSUhfVFlQRV9LRVJORUwsCSAgICAia2VybmVsIiwJICAiS2VybmVsIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfTVVMVEksCSAgICAibXVsdGkiLAkgICJNdWx0aS1GaWxlIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfUkFNRElTSywgICAgInJhbWRpc2siLAkgICJSQU1EaXNrIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfU0NSSVBULCAgICAgInNjcmlwdCIsCSAgIlNjcmlwdCIsCQl9LAorCXsJSUhfVFlQRV9TVEFOREFMT05FLCAic3RhbmRhbG9uZSIsICJTdGFuZGFsb25lIFByb2dyYW0iLCB9LAorCXsJSUhfVFlQRV9GTEFURFQsICAgICAiZmxhdF9kdCIsICAgICJGbGF0IERldmljZSBUcmVlIiwJfSwKKwl7CUlIX1RZUEVfS1dCSU1BR0UsICAgImt3YmltYWdlIiwgICAiS2lya3dvb2QgQm9vdCBJbWFnZSIsfSwKKwl7CUlIX1RZUEVfSU1YSU1BR0UsICAgImlteGltYWdlIiwgICAiRnJlZXNjYWxlIGkuTVggQm9vdCBJbWFnZSIsfSwKKwl7CS0xLAkJICAgICIiLAkJICAiIiwJCQl9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5X3QgdWltYWdlX2NvbXBbXSA9IHsKKwl7CUlIX0NPTVBfTk9ORSwJIm5vbmUiLAkJInVuY29tcHJlc3NlZCIsCQl9LAorCXsJSUhfQ09NUF9CWklQMiwJImJ6aXAyIiwJImJ6aXAyIGNvbXByZXNzZWQiLAl9LAorCXsJSUhfQ09NUF9HWklQLAkiZ3ppcCIsCQkiZ3ppcCBjb21wcmVzc2VkIiwJfSwKKwl7CUlIX0NPTVBfTFpNQSwJImx6bWEiLAkJImx6bWEgY29tcHJlc3NlZCIsCX0sCisJewlJSF9DT01QX0xaTywJImx6byIsCQkibHpvIGNvbXByZXNzZWQiLAl9LAorCXsJLTEsCQkiIiwJCSIiLAkJCX0sCit9OworCit1aW50MzJfdCBjcmMzMiAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCk7Cit1aW50MzJfdCBjcmMzMl93ZCAodWludDMyX3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdWludCwgdWludCk7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorc3RhdGljIHZvaWQgZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVfdCB0aW1lc3RhbXApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExlZ2FjeSBmb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpbWFnZV9jaGVja19oY3JjIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXVsb25nIGhjcmM7CisJdWxvbmcgbGVuID0gaW1hZ2VfZ2V0X2hlYWRlcl9zaXplICgpOworCWltYWdlX2hlYWRlcl90IGhlYWRlcjsKKworCS8qIENvcHkgaGVhZGVyIHNvIHdlIGNhbiBibGFuayBDUkMgZmllbGQgZm9yIHJlLWNhbGN1bGF0aW9uICovCisJbWVtbW92ZSAoJmhlYWRlciwgKGNoYXIgKiloZHIsIGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKSk7CisJaW1hZ2Vfc2V0X2hjcmMgKCZoZWFkZXIsIDApOworCisJaGNyYyA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSZoZWFkZXIsIGxlbik7CisKKwlyZXR1cm4gKGhjcmMgPT0gaW1hZ2VfZ2V0X2hjcmMgKGhkcikpOworfQorCitpbnQgaW1hZ2VfY2hlY2tfZGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBkYXRhID0gaW1hZ2VfZ2V0X2RhdGEgKGhkcik7CisJdWxvbmcgbGVuID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoaGRyKTsKKwl1bG9uZyBkY3JjID0gY3JjMzJfd2QgKDAsICh1bnNpZ25lZCBjaGFyICopZGF0YSwgbGVuLCBDSFVOS1NaX0NSQzMyKTsKKworCXJldHVybiAoZGNyYyA9PSBpbWFnZV9nZXRfZGNyYyAoaGRyKSk7Cit9CisKKy8qKgorICogaW1hZ2VfbXVsdGlfY291bnQgLSBnZXQgY29tcG9uZW50IChzdWItaW1hZ2UpIGNvdW50CisgKiBAaGRyOiBwb2ludGVyIHRvIHRoZSBoZWFkZXIgb2YgdGhlIG11bHRpIGNvbXBvbmVudCBpbWFnZQorICoKKyAqIGltYWdlX211bHRpX2NvdW50KCkgcmV0dXJucyBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBhIG11bHRpCisgKiBjb21wb25lbnQgaW1hZ2UuCisgKgorICogTm90ZTogbm8gY2hlY2tpbmcgb2YgdGhlIGltYWdlIHR5cGUgaXMgZG9uZSwgY2FsbGVyIG11c3QgcGFzcworICogYSB2YWxpZCBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBudW1iZXIgb2YgY29tcG9uZW50cworICovCit1bG9uZyBpbWFnZV9tdWx0aV9jb3VudCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBpLCBjb3VudCA9IDA7CisJdWludDMyX3QgKnNpemU7CisKKwkvKiBnZXQgc3RhcnQgb2YgdGhlIGltYWdlIHBheWxvYWQsIHdoaWNoIGluIGNhc2Ugb2YgbXVsdGkKKwkgKiBjb21wb25lbnQgaW1hZ2VzIHRoYXQgcG9pbnRzIHRvIGEgdGFibGUgb2YgY29tcG9uZW50IHNpemVzICovCisJc2l6ZSA9ICh1aW50MzJfdCAqKWltYWdlX2dldF9kYXRhIChoZHIpOworCisJLyogY291bnQgbm9uIGVtcHR5IHNsb3RzICovCisJZm9yIChpID0gMDsgc2l6ZVtpXTsgKytpKQorCQljb3VudCsrOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGltYWdlX211bHRpX2dldGltZyAtIGdldCBjb21wb25lbnQgZGF0YSBhZGRyZXNzIGFuZCBzaXplCisgKiBAaGRyOiBwb2ludGVyIHRvIHRoZSBoZWFkZXIgb2YgdGhlIG11bHRpIGNvbXBvbmVudCBpbWFnZQorICogQGlkeDogaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBjb21wb25lbnQKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBjb21wb25lbnQgZGF0YSBhZGRyZXNzCisgKiBAbGVuOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBjb21wb25lbnQgc2l6ZQorICoKKyAqIGltYWdlX211bHRpX2dldGltZygpIHJldHVybnMgc2l6ZSBhbmQgZGF0YSBhZGRyZXNzIGZvciB0aGUgcmVxdWVzdGVkCisgKiBjb21wb25lbnQgaW4gYSBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogTm90ZTogbm8gY2hlY2tpbmcgb2YgdGhlIGltYWdlIHR5cGUgaXMgZG9uZSwgY2FsbGVyIG11c3QgcGFzcworICogYSB2YWxpZCBtdWx0aSBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBkYXRhIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIGNvbXBvbmVudCwgaWYgaWR4IGlzIHZhbGlkCisgKiAgICAgMCBpbiBkYXRhIGFuZCBsZW4sIGlmIGlkeCBpcyBvdXQgb2YgcmFuZ2UKKyAqLwordm9pZCBpbWFnZV9tdWx0aV9nZXRpbWcgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVsb25nIGlkeCwKKwkJCXVsb25nICpkYXRhLCB1bG9uZyAqbGVuKQoreworCWludCBpOworCXVpbnQzMl90ICpzaXplOworCXVsb25nIG9mZnNldCwgY291bnQsIGltZ19kYXRhOworCisJLyogZ2V0IG51bWJlciBvZiBjb21wb25lbnQgKi8KKwljb3VudCA9IGltYWdlX211bHRpX2NvdW50IChoZHIpOworCisJLyogZ2V0IHN0YXJ0IG9mIHRoZSBpbWFnZSBwYXlsb2FkLCB3aGljaCBpbiBjYXNlIG9mIG11bHRpCisJICogY29tcG9uZW50IGltYWdlcyB0aGF0IHBvaW50cyB0byBhIHRhYmxlIG9mIGNvbXBvbmVudCBzaXplcyAqLworCXNpemUgPSAodWludDMyX3QgKilpbWFnZV9nZXRfZGF0YSAoaGRyKTsKKworCS8qIGdldCBhZGRyZXNzIG9mIHRoZSBwcm9wZXIgY29tcG9uZW50IGRhdGEgc3RhcnQsIHdoaWNoIG1lYW5zCisJICogc2tpcHBpbmcgc2l6ZXMgdGFibGUgKGFkZCAxIGZvciBsYXN0LCBudWxsIGVudHJ5KSAqLworCWltZ19kYXRhID0gaW1hZ2VfZ2V0X2RhdGEgKGhkcikgKyAoY291bnQgKyAxKSAqIHNpemVvZiAodWludDMyX3QpOworCisJaWYgKGlkeCA8IGNvdW50KSB7CisJCSpsZW4gPSB1aW1hZ2VfdG9fY3B1IChzaXplW2lkeF0pOworCQlvZmZzZXQgPSAwOworCisJCS8qIGdvIG92ZXIgYWxsIGluZGljZXMgcHJlY2VkaW5nIHJlcXVlc3RlZCBjb21wb25lbnQgaWR4ICovCisJCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworCQkJLyogYWRkIHVwIGktdGggY29tcG9uZW50IHNpemUsIHJvdW5kaW5nIHVwIHRvIDQgYnl0ZXMgKi8KKwkJCW9mZnNldCArPSAodWltYWdlX3RvX2NwdSAoc2l6ZVtpXSkgKyAzKSAmIH4zIDsKKwkJfQorCisJCS8qIGNhbGN1bGF0ZSBpZHgtdGggY29tcG9uZW50IGRhdGEgYWRkcmVzcyAqLworCQkqZGF0YSA9IGltZ19kYXRhICsgb2Zmc2V0OworCX0gZWxzZSB7CisJCSpsZW4gPSAwOworCQkqZGF0YSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbWFnZV9wcmludF90eXBlIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCWNvbnN0IGNoYXIgKm9zLCAqYXJjaCwgKnR5cGUsICpjb21wOworCisJb3MgPSBnZW5pbWdfZ2V0X29zX25hbWUgKGltYWdlX2dldF9vcyAoaGRyKSk7CisJYXJjaCA9IGdlbmltZ19nZXRfYXJjaF9uYW1lIChpbWFnZV9nZXRfYXJjaCAoaGRyKSk7CisJdHlwZSA9IGdlbmltZ19nZXRfdHlwZV9uYW1lIChpbWFnZV9nZXRfdHlwZSAoaGRyKSk7CisJY29tcCA9IGdlbmltZ19nZXRfY29tcF9uYW1lIChpbWFnZV9nZXRfY29tcCAoaGRyKSk7CisKKwlwcmludGYgKCIlcyAlcyAlcyAoJXMpXG4iLCBhcmNoLCBvcywgdHlwZSwgY29tcCk7Cit9CisKKy8qKgorICogaW1hZ2VfcHJpbnRfY29udGVudHMgLSBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgbGVnYWN5IGZvcm1hdCBpbWFnZQorICogQHB0cjogcG9pbnRlciB0byB0aGUgbGVnYWN5IGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBpbWFnZV9wcmludF9jb250ZW50cygpIGZvcm1hdHMgYSBtdWx0aSBsaW5lIGxlZ2FjeSBpbWFnZSBjb250ZW50cyBkZXNjcmlwdGlvbi4KKyAqIFRoZSByb3V0aW5lIHByaW50cyBvdXQgYWxsIGhlYWRlciBmaWVsZHMgZm9sbG93ZWQgYnkgdGhlIHNpemUvb2Zmc2V0IGRhdGEKKyAqIGZvciBNVUxUSS9TQ1JJUFQgaW1hZ2VzLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGltYWdlX3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpwdHIpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciA9IChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKXB0cjsKKwljb25zdCBjaGFyICpwOworCisjaWZkZWYgVVNFX0hPU1RDQworCXAgPSAiIjsKKyNlbHNlCisJcCA9ICIgICAiOworI2VuZGlmCisKKwlwcmludGYgKCIlc0ltYWdlIE5hbWU6ICAgJS4qc1xuIiwgcCwgSUhfTk1MRU4sIGltYWdlX2dldF9uYW1lIChoZHIpKTsKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJcHJpbnRmICgiJXNDcmVhdGVkOiAgICAgICIsIHApOworCWdlbmltZ19wcmludF90aW1lICgodGltZV90KWltYWdlX2dldF90aW1lIChoZHIpKTsKKyNlbmRpZgorCXByaW50ZiAoIiVzSW1hZ2UgVHlwZTogICAiLCBwKTsKKwlpbWFnZV9wcmludF90eXBlIChoZHIpOworCXByaW50ZiAoIiVzRGF0YSBTaXplOiAgICAiLCBwKTsKKwlnZW5pbWdfcHJpbnRfc2l6ZSAoaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoaGRyKSk7CisJcHJpbnRmICgiJXNMb2FkIEFkZHJlc3M6ICUwOHhcbiIsIHAsIGltYWdlX2dldF9sb2FkIChoZHIpKTsKKwlwcmludGYgKCIlc0VudHJ5IFBvaW50OiAgJTA4eFxuIiwgcCwgaW1hZ2VfZ2V0X2VwIChoZHIpKTsKKworCWlmIChpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfTVVMVEkpIHx8CisJCQlpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfU0NSSVBUKSkgeworCQlpbnQgaTsKKwkJdWxvbmcgZGF0YSwgbGVuOworCQl1bG9uZyBjb3VudCA9IGltYWdlX211bHRpX2NvdW50IChoZHIpOworCisJCXByaW50ZiAoIiVzQ29udGVudHM6XG4iLCBwKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWltYWdlX211bHRpX2dldGltZyAoaGRyLCBpLCAmZGF0YSwgJmxlbik7CisKKwkJCXByaW50ZiAoIiVzICAgSW1hZ2UgJWQ6ICIsIHAsIGkpOworCQkJZ2VuaW1nX3ByaW50X3NpemUgKGxlbik7CisKKwkJCWlmIChpbWFnZV9jaGVja190eXBlIChoZHIsIElIX1RZUEVfU0NSSVBUKSAmJiBpID4gMCkgeworCQkJCS8qCisJCQkJICogdGhlIHVzZXIgbWF5IG5lZWQgdG8ga25vdyBvZmZzZXRzCisJCQkJICogaWYgcGxhbm5pbmcgdG8gZG8gc29tZXRoaW5nIHdpdGgKKwkJCQkgKiBtdWx0aXBsZSBmaWxlcworCQkJCSAqLworCQkJCXByaW50ZiAoIiVzICAgIE9mZnNldCA9IDB4JTA4bHhcbiIsIHAsIGRhdGEpOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTaGFyZWQgZHVhbC1mb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVVNFX0hPU1RDQwordm9pZCBtZW1tb3ZlX3dkICh2b2lkICp0bywgdm9pZCAqZnJvbSwgc2l6ZV90IGxlbiwgdWxvbmcgY2h1bmtzeikKK3sKKwlpZiAodG8gPT0gZnJvbSkKKwkJcmV0dXJuOworCisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCXdoaWxlIChsZW4gPiAwKSB7CisJCXNpemVfdCB0YWlsID0gKGxlbiA+IGNodW5rc3opID8gY2h1bmtzeiA6IGxlbjsKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisJCW1lbW1vdmUgKHRvLCBmcm9tLCB0YWlsKTsKKwkJdG8gKz0gdGFpbDsKKwkJZnJvbSArPSB0YWlsOworCQlsZW4gLT0gdGFpbDsKKwl9CisjZWxzZQkvKiAhKENPTkZJR19IV19XQVRDSERPRyB8fCBDT05GSUdfV0FUQ0hET0cpICovCisJbWVtbW92ZSAodG8sIGZyb20sIGxlbik7CisjZW5kaWYJLyogQ09ORklHX0hXX1dBVENIRE9HIHx8IENPTkZJR19XQVRDSERPRyAqLworfQorI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKK3ZvaWQgZ2VuaW1nX3ByaW50X3NpemUgKHVpbnQzMl90IHNpemUpCit7CisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlwcmludGYgKCIlZCBCeXRlcyA9ICIsIHNpemUpOworCXByaW50X3NpemUgKHNpemUsICJcbiIpOworI2Vsc2UKKwlwcmludGYgKCIlZCBCeXRlcyA9ICUuMmYga0IgPSAlLjJmIE1CXG4iLAorCQkJc2l6ZSwgKGRvdWJsZSlzaXplIC8gMS4wMjRlMywKKwkJCShkb3VibGUpc2l6ZSAvIDEuMDQ4NTc2ZTYpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCitzdGF0aWMgdm9pZCBnZW5pbWdfcHJpbnRfdGltZSAodGltZV90IHRpbWVzdGFtcCkKK3sKKyNpZm5kZWYgVVNFX0hPU1RDQworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCXRvX3RtICh0aW1lc3RhbXAsICZ0bSk7CisJcHJpbnRmICgiJTRkLSUwMmQtJTAyZCAgJTJkOiUwMmQ6JTAyZCBVVENcbiIsCisJCQl0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCisJCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisjZWxzZQorCXByaW50ZiAoIiVzIiwgY3RpbWUoJnRpbWVzdGFtcCkpOworI2VuZGlmCit9CisjZW5kaWYgLyogQ09ORklHX1RJTUVTVEFNUCB8fCBDT05GSUdfQ01EX0RBVEUgfHwgVVNFX0hPU1RDQyAqLworCisvKioKKyAqIGdldF90YWJsZV9lbnRyeV9uYW1lIC0gdHJhbnNsYXRlIGVudHJ5IGlkIHRvIGxvbmcgbmFtZQorICogQHRhYmxlOiBwb2ludGVyIHRvIGEgdHJhbnNsYXRpb24gdGFibGUgZm9yIGVudHJpZXMgb2YgYSBzcGVjaWZpYyB0eXBlCisgKiBAbXNnOiBtZXNzYWdlIHRvIGJlIHJldHVybmVkIHdoZW4gdHJhbnNsYXRpb24gZmFpbHMKKyAqIEBpZDogZW50cnkgaWQgdG8gYmUgdHJhbnNsYXRlZAorICoKKyAqIGdldF90YWJsZV9lbnRyeV9uYW1lKCkgd2lsbCBnbyBvdmVyIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgZ2l2ZW4gaWQuIElmIG1hdGNoaW5nIGVudHJ5IGlzIGZvdW5kLCBpdHMgbG9uZworICogbmFtZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbG9uZyBlbnRyeSBuYW1lIGlmIHRyYW5zbGF0aW9uIHN1Y2NlZWRzCisgKiAgICAgbXNnIG90aGVyd2lzZQorICovCitjaGFyICpnZXRfdGFibGVfZW50cnlfbmFtZSAodGFibGVfZW50cnlfdCAqdGFibGUsIGNoYXIgKm1zZywgaW50IGlkKQoreworCWZvciAoOyB0YWJsZS0+aWQgPj0gMDsgKyt0YWJsZSkgeworCQlpZiAodGFibGUtPmlkID09IGlkKQorCQkJcmV0dXJuIHRhYmxlLT5sbmFtZTsKKwl9CisJcmV0dXJuIChtc2cpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X29zX25hbWUgKHVpbnQ4X3Qgb3MpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX29zLCAiVW5rbm93biBPUyIsIG9zKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfYXJjaF9uYW1lICh1aW50OF90IGFyY2gpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX2FyY2gsICJVbmtub3duIEFyY2hpdGVjdHVyZSIsIGFyY2gpKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF90eXBlX25hbWUgKHVpbnQ4X3QgdHlwZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9uYW1lICh1aW1hZ2VfdHlwZSwgIlVua25vd24gSW1hZ2UiLCB0eXBlKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfY29tcF9uYW1lICh1aW50OF90IGNvbXApCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX2NvbXAsICJVbmtub3duIENvbXByZXNzaW9uIiwgY29tcCkpOworfQorCisvKioKKyAqIGdldF90YWJsZV9lbnRyeV9pZCAtIHRyYW5zbGF0ZSBzaG9ydCBlbnRyeSBuYW1lIHRvIGlkCisgKiBAdGFibGU6IHBvaW50ZXIgdG8gYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgZW50cmllcyBvZiBhIHNwZWNpZmljIHR5cGUKKyAqIEB0YWJsZV9uYW1lOiB0byBiZSB1c2VkIGluIGNhc2Ugb2YgZXJyb3IKKyAqIEBuYW1lOiBlbnRyeSBzaG9ydCBuYW1lIHRvIGJlIHRyYW5zbGF0ZWQKKyAqCisgKiBnZXRfdGFibGVfZW50cnlfaWQoKSB3aWxsIGdvIG92ZXIgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQKKyAqIGVudHJ5IHRoYXQgbWF0Y2hlcyBnaXZlbiBzaG9ydCBuYW1lLiBJZiBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwKKyAqIGl0cyBpZCByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZW50cnkgaWQgaWYgdHJhbnNsYXRpb24gc3VjY2VlZHMKKyAqICAgICAtMSBvdGhlcndpc2UKKyAqLworaW50IGdldF90YWJsZV9lbnRyeV9pZCAodGFibGVfZW50cnlfdCAqdGFibGUsCisJCWNvbnN0IGNoYXIgKnRhYmxlX25hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdGFibGVfZW50cnlfdCAqdDsKKyNpZmRlZiBVU0VfSE9TVENDCisJaW50IGZpcnN0ID0gMTsKKworCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lICYmIHN0cmNhc2VjbXAodC0+c25hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gKHQtPmlkKTsKKwl9CisKKwlmcHJpbnRmIChzdGRlcnIsICJcbkludmFsaWQgJXMgVHlwZSAtIHZhbGlkIG5hbWVzIGFyZSIsIHRhYmxlX25hbWUpOworCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZnByaW50ZiAoc3RkZXJyLCAiJWMgJXMiLCAoZmlyc3QpID8gJzonIDogJywnLCB0LT5zbmFtZSk7CisJCWZpcnN0ID0gMDsKKwl9CisJZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyNlbHNlCisJZm9yICh0ID0gdGFibGU7IHQtPmlkID49IDA7ICsrdCkgeworCQlpZiAodC0+c25hbWUgJiYgc3RyY21wKHQtPnNuYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh0LT5pZCk7CisJfQorCWRlYnVnICgiSW52YWxpZCAlcyBUeXBlOiAlc1xuIiwgdGFibGVfbmFtZSwgbmFtZSk7CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCXJldHVybiAoLTEpOworfQorCitpbnQgZ2VuaW1nX2dldF9vc19pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX29zLCAiT1MiLCBuYW1lKSk7Cit9CisKK2ludCBnZW5pbWdfZ2V0X2FyY2hfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV9hcmNoLCAiQ1BVIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF90eXBlX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfdHlwZSwgIkltYWdlIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF9jb21wX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfY29tcCwgIkNvbXByZXNzaW9uIiwgbmFtZSkpOworfQorCisjaWZuZGVmIFVTRV9IT1NUQ0MKKy8qKgorICogZ2VuaW1nX2dldF9mb3JtYXQgLSBnZXQgaW1hZ2UgZm9ybWF0IHR5cGUKKyAqIEBpbWdfYWRkcjogaW1hZ2Ugc3RhcnQgYWRkcmVzcworICoKKyAqIGdlbmltZ19nZXRfZm9ybWF0KCkgY2hlY2tzIHdoZXRoZXIgcHJvdmlkZWQgYWRkcmVzcyBwb2ludHMgdG8gYSB2YWxpZAorICogbGVnYWN5IG9yIEZJVCBpbWFnZS4KKyAqCisgKiBOZXcgdUltYWdlIGZvcm1hdCBhbmQgRkRUIGJsb2IgYXJlIGJhc2VkIG9uIGEgbGliZmR0LiBGRFQgYmxvYgorICogbWF5IGJlIHBhc3NlZCBkaXJlY3RseSBvciBlbWJlZGRlZCBpbiBhIEZJVCBpbWFnZS4gSW4gYm90aCBzaXR1YXRpb25zCisgKiBnZW5pbWdfZ2V0X2Zvcm1hdCgpIG11c3QgYmUgYWJsZSB0byBkZWN0ZWN0IGxpYmZkdCBoZWFkZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBmb3JtYXQgdHlwZSBvciBJTUFHRV9GT1JNQVRfSU5WQUxJRCBpZiBubyBpbWFnZSBpcyBwcmVzZW50CisgKi8KK2ludCBnZW5pbWdfZ2V0X2Zvcm1hdCAodm9pZCAqaW1nX2FkZHIpCit7CisJdWxvbmcgZm9ybWF0ID0gSU1BR0VfRk9STUFUX0lOVkFMSUQ7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcjsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpIHx8IGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKwljaGFyICpmaXRfaGRyOworI2VuZGlmCisKKwloZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilpbWdfYWRkcjsKKwlpZiAoaW1hZ2VfY2hlY2tfbWFnaWMoaGRyKSkKKwkJZm9ybWF0ID0gSU1BR0VfRk9STUFUX0xFR0FDWTsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpIHx8IGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKwllbHNlIHsKKwkJZml0X2hkciA9IChjaGFyICopaW1nX2FkZHI7CisJCWlmIChmZHRfY2hlY2tfaGVhZGVyIChmaXRfaGRyKSA9PSAwKQorCQkJZm9ybWF0ID0gSU1BR0VfRk9STUFUX0ZJVDsKKwl9CisjZW5kaWYKKworCXJldHVybiBmb3JtYXQ7Cit9CisKKy8qKgorICogZ2VuaW1nX2dldF9pbWFnZSAtIGdldCBpbWFnZSBmcm9tIHNwZWNpYWwgc3RvcmFnZSAoaWYgbmVjZXNzYXJ5KQorICogQGltZ19hZGRyOiBpbWFnZSBzdGFydCBhZGRyZXNzCisgKgorICogZ2VuaW1nX2dldF9pbWFnZSgpIGNoZWNrcyBpZiBwcm92aWRlZCBpbWFnZSBzdGFydCBhZGRkcmVzcyBpcyBsb2NhdGVkCisgKiBpbiBhIGRhdGFmbGFzaCBzdG9yYWdlLiBJZiBzbywgaW1hZ2UgaXMgbW92ZWQgdG8gYSBzeXN0ZW0gUkFNIG1lbW9yeS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIHN0YXJ0IGFkZHJlc3MgYWZ0ZXIgcG9zc2libGUgcmVsb2NhdGlvbiBmcm9tIHNwZWNpYWwgc3RvcmFnZQorICovCit1bG9uZyBnZW5pbWdfZ2V0X2ltYWdlICh1bG9uZyBpbWdfYWRkcikKK3sKKwl1bG9uZyByYW1fYWRkciA9IGltZ19hZGRyOworCisjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKKwl1bG9uZyBoX3NpemUsIGRfc2l6ZTsKKworCWlmIChhZGRyX2RhdGFmbGFzaCAoaW1nX2FkZHIpKXsKKwkJLyogZ2VyIFJBTSBhZGRyZXNzICovCisJCXJhbV9hZGRyID0gQ09ORklHX1NZU19MT0FEX0FERFI7CisKKwkJLyogZ2V0IGhlYWRlciBzaXplICovCisJCWhfc2l6ZSA9IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWlmIChzaXplb2Yoc3RydWN0IGZkdF9oZWFkZXIpID4gaF9zaXplKQorCQkJaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKTsKKyNlbmRpZgorCisJCS8qIHJlYWQgaW4gaGVhZGVyICovCisJCWRlYnVnICgiICAgUmVhZGluZyBpbWFnZSBoZWFkZXIgZnJvbSBkYXRhZmxhc2ggYWRkcmVzcyAiCisJCQkiJTA4bHggdG8gUkFNIGFkZHJlc3MgJTA4bHhcbiIsIGltZ19hZGRyLCByYW1fYWRkcik7CisKKwkJcmVhZF9kYXRhZmxhc2ggKGltZ19hZGRyLCBoX3NpemUsIChjaGFyICopcmFtX2FkZHIpOworCisJCS8qIGdldCBkYXRhIHNpemUgKi8KKwkJc3dpdGNoIChnZW5pbWdfZ2V0X2Zvcm1hdCAoKHZvaWQgKilyYW1fYWRkcikpIHsKKwkJY2FzZSBJTUFHRV9GT1JNQVRfTEVHQUNZOgorCQkJZF9zaXplID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoKGNvbnN0IGltYWdlX2hlYWRlcl90ICopcmFtX2FkZHIpOworCQkJZGVidWcgKCIgICBMZWdhY3kgZm9ybWF0IGltYWdlIGZvdW5kIGF0IDB4JTA4bHgsIHNpemUgMHglMDhseFxuIiwKKwkJCQkJcmFtX2FkZHIsIGRfc2l6ZSk7CisJCQlicmVhazsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWNhc2UgSU1BR0VfRk9STUFUX0ZJVDoKKwkJCWRfc2l6ZSA9IGZpdF9nZXRfc2l6ZSAoKGNvbnN0IHZvaWQgKilyYW1fYWRkcikgLSBoX3NpemU7CisJCQlkZWJ1ZyAoIiAgIEZJVC9GRFQgZm9ybWF0IGltYWdlIGZvdW5kIGF0IDB4JTA4bHgsIHNpemUgMHglMDhseFxuIiwKKwkJCQkJcmFtX2FkZHIsIGRfc2l6ZSk7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcHJpbnRmICgiICAgTm8gdmFsaWQgaW1hZ2UgZm91bmQgYXQgMHglMDhseFxuIiwgaW1nX2FkZHIpOworCQkJcmV0dXJuIHJhbV9hZGRyOworCQl9CisKKwkJLyogcmVhZCBpbiBpbWFnZSBkYXRhICovCisJCWRlYnVnICgiICAgUmVhZGluZyBpbWFnZSByZW1haW5pbmcgZGF0YSBmcm9tIGRhdGFmbGFzaCBhZGRyZXNzICIKKwkJCSIlMDhseCB0byBSQU0gYWRkcmVzcyAlMDhseFxuIiwgaW1nX2FkZHIgKyBoX3NpemUsCisJCQlyYW1fYWRkciArIGhfc2l6ZSk7CisKKwkJcmVhZF9kYXRhZmxhc2ggKGltZ19hZGRyICsgaF9zaXplLCBkX3NpemUsCisJCQkJKGNoYXIgKikocmFtX2FkZHIgKyBoX3NpemUpKTsKKworCX0KKyNlbmRpZiAvKiBDT05GSUdfSEFTX0RBVEFGTEFTSCAqLworCisJcmV0dXJuIHJhbV9hZGRyOworfQorCisvKioKKyAqIGZpdF9oYXNfY29uZmlnIC0gY2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBGSVQgY29uZmlndXJhdGlvbgorICogQGltYWdlczogcG9pbnRlciB0byB0aGUgYm9vdG0gY29tbWFuZCBoZWFkZXJzIHN0cnVjdHVyZQorICoKKyAqIGZpdF9oYXNfY29uZmlnKCkgY2hlY2tzIGlmIHRoZXJlIGlzIGEgRklUIGNvbmZpZ3VyYXRpb24gaW4gdXNlCisgKiAoaWYgRlRJIHN1cHBvcnQgaXMgcHJlc2VudCkuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBubyBGSVQgc3VwcG9ydCBvciBubyBjb25maWd1cmF0aW9uIGZvdW5kCisgKiAgICAgMSwgY29uZmlndXJhdGlvbiBmb3VuZAorICovCitpbnQgZ2VuaW1nX2hhc19jb25maWcgKGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwlpZiAoaW1hZ2VzLT5maXRfdW5hbWVfY2ZnKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorc3RhdGljIHZvaWQgZmR0X2Vycm9yIChjb25zdCBjaGFyICptc2cpCit7CisJcHV0cyAoIkVSUk9SOiAiKTsKKwlwdXRzIChtc2cpOworCXB1dHMgKCIgLSBtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7Cit9CisKK3N0YXRpYyBjb25zdCBpbWFnZV9oZWFkZXJfdCAqaW1hZ2VfZ2V0X2ZkdCAodWxvbmcgZmR0X2FkZHIpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmZkdF9oZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilmZHRfYWRkcjsKKworCWltYWdlX3ByaW50X2NvbnRlbnRzIChmZHRfaGRyKTsKKworCXB1dHMgKCIgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOworCWlmICghaW1hZ2VfY2hlY2tfaGNyYyAoZmR0X2hkcikpIHsKKwkJZmR0X2Vycm9yICgiZmR0IGhlYWRlciBjaGVja3N1bSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghaW1hZ2VfY2hlY2tfZGNyYyAoZmR0X2hkcikpIHsKKwkJZmR0X2Vycm9yICgiZmR0IGNoZWNrc3VtIGludmFsaWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXB1dHMgKCJPS1xuIik7CisKKwlpZiAoIWltYWdlX2NoZWNrX3R5cGUgKGZkdF9oZHIsIElIX1RZUEVfRkxBVERUKSkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaW1hZ2VfZ2V0X2NvbXAgKGZkdF9oZHIpICE9IElIX0NPTVBfTk9ORSkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgaXMgY29tcHJlc3NlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGZkdF9jaGVja19oZWFkZXIgKChjaGFyICopaW1hZ2VfZ2V0X2RhdGEgKGZkdF9oZHIpKSAhPSAwKSB7CisJCWZkdF9lcnJvciAoInVJbWFnZSBkYXRhIGlzIG5vdCBhIGZkdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZkdF9oZHI7Cit9CisKKy8qKgorICogZml0X2NoZWNrX2ZkdCAtIHZlcmlmeSBGSVQgZm9ybWF0IEZEVCBzdWJpbWFnZQorICogQGZpdF9oZHI6IHBvaW50ZXIgdG8gdGhlIEZJVCAgaGVhZGVyCisgKiBmZHRfbm9mZnNldDogRkRUIHN1YmltYWdlIG5vZGUgb2Zmc2V0IHdpdGhpbiBGSVQgaW1hZ2UKKyAqIEB2ZXJpZnk6IGRhdGEgQ1JDIHZlcmlmaWNhdGlvbiBmbGFnCisgKgorICogZml0X2NoZWNrX2ZkdCgpIHZlcmlmaWVzIGludGVncml0eSBvZiB0aGUgRkRUIHN1YmltYWdlIGFuZCBmcm9tCisgKiBzcGVjaWZpZWQgRklUIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgb24gc3VjY2VzcworICogICAgIDAsIG9uIGZhaWx1cmUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKK3N0YXRpYyBpbnQgZml0X2NoZWNrX2ZkdCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgZmR0X25vZmZzZXQsIGludCB2ZXJpZnkpCit7CisJZml0X2ltYWdlX3ByaW50IChmaXQsIGZkdF9ub2Zmc2V0LCAiICAgIik7CisKKwlpZiAodmVyaWZ5KSB7CisJCXB1dHMgKCIgICBWZXJpZnlpbmcgSGFzaCBJbnRlZ3JpdHkgLi4uICIpOworCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgZmR0X25vZmZzZXQpKSB7CisJCQlmZHRfZXJyb3IgKCJCYWQgRGF0YSBIYXNoIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwdXRzICgiT0tcbiIpOworCX0KKworCWlmICghZml0X2ltYWdlX2NoZWNrX3R5cGUgKGZpdCwgZmR0X25vZmZzZXQsIElIX1RZUEVfRkxBVERUKSkgeworCQlmZHRfZXJyb3IgKCJOb3QgYSBGRFQgaW1hZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfY29tcCAoZml0LCBmZHRfbm9mZnNldCwgSUhfQ09NUF9OT05FKSkgeworCQlmZHRfZXJyb3IgKCJGRFQgaW1hZ2UgaXMgY29tcHJlc3NlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfRklUICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19GRFRfUEFECisjZGVmaW5lIENPTkZJR19TWVNfRkRUX1BBRCAweDMwMDAKKyNlbmRpZgorCisvKioKKyAqIGJvb3RfcmVsb2NhdGVfZmR0IC0gcmVsb2NhdGUgZmxhdCBkZXZpY2UgdHJlZQorICogQGxtYjogcG9pbnRlciB0byBsbWIgaGFuZGxlLCB3aWxsIGJlIHVzZWQgZm9yIG1lbW9yeSBtZ210CisgKiBAYm9vdG1hcF9iYXNlOiBiYXNlIGFkZHJlc3Mgb2YgdGhlIGJvb3RtYXAgcmVnaW9uCisgKiBAb2ZfZmxhdF90cmVlOiBwb2ludGVyIHRvIGEgY2hhciogdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgc3RhcnQgYWRkcmVzcworICogQG9mX3NpemU6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBsZW5ndGgKKyAqCisgKiBib290X3JlbG9jYXRlX2ZkdCgpIGRldGVybWluZXMgaWYgdGhlIG9mX2ZsYXRfdHJlZSBhZGRyZXNzIGlzIHdpdGhpbgorICogdGhlIGJvb3RtYXAgYW5kIGlmIG5vdCByZWxvY2F0ZXMgaXQgaW50byB0aGF0IHJlZ2lvbgorICoKKyAqIG9mX2ZsYXRfdHJlZSBhbmQgb2Zfc2l6ZSBhcmUgc2V0IHRvIGZpbmFsIChhZnRlciByZWxvY2F0aW9uKSB2YWx1ZXMKKyAqCisgKiByZXR1cm5zOgorICogICAgICAwIC0gc3VjY2VzcworICogICAgICAxIC0gZmFpbHVyZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JPT1RNQVBTWikKK2ludCBib290X3JlbG9jYXRlX2ZkdCAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyBib290bWFwX2Jhc2UsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKQoreworCWNoYXIJKmZkdF9ibG9iID0gKm9mX2ZsYXRfdHJlZTsKKwl1bG9uZwlyZWxvY2F0ZSA9IDA7CisJdWxvbmcJb2ZfbGVuID0gMDsKKworCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoKm9mX3NpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZmR0X2Jsb2IpICE9IDApIHsKKwkJZmR0X2Vycm9yICgiaW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCWdvdG8gZXJyb3I7CisJfQorCisjaWZuZGVmIENPTkZJR19TWVNfTk9fRkxBU0gKKwkvKiBtb3ZlIHRoZSBibG9iIGlmIGl0IGlzIGluIGZsYXNoIChzZXQgcmVsb2NhdGUpICovCisJaWYgKGFkZHIyaW5mbyAoKHVsb25nKWZkdF9ibG9iKSAhPSBOVUxMKQorCQlyZWxvY2F0ZSA9IDE7CisjZW5kaWYKKworCS8qCisJICogVGhlIGJsb2IgbmVlZHMgdG8gYmUgaW5zaWRlIHRoZSBib290IG1hcHBpbmcuCisJICovCisJaWYgKGZkdF9ibG9iIDwgKGNoYXIgKilib290bWFwX2Jhc2UpCisJCXJlbG9jYXRlID0gMTsKKworCWlmICgoZmR0X2Jsb2IgKyAqb2Zfc2l6ZSArIENPTkZJR19TWVNfRkRUX1BBRCkgPj0KKwkJCSgoY2hhciAqKUNPTkZJR19TWVNfQk9PVE1BUFNaICsgYm9vdG1hcF9iYXNlKSkKKwkJcmVsb2NhdGUgPSAxOworCisJLyogbW92ZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBpZiBuZWVkZWQgKi8KKwlpZiAocmVsb2NhdGUpIHsKKwkJaW50IGVycjsKKwkJdWxvbmcgb2Zfc3RhcnQgPSAwOworCisJCS8qIHBvc2l0aW9uIG9uIGEgNEsgYm91bmRhcnkgYmVmb3JlIHRoZSBhbGxvY19jdXJyZW50ICovCisJCS8qIFBhZCB0aGUgRkRUIGJ5IGEgc3BlY2lmaWVkIGFtb3VudCAqLworCQlvZl9sZW4gPSAqb2Zfc2l6ZSArIENPTkZJR19TWVNfRkRUX1BBRDsKKwkJb2Zfc3RhcnQgPSAodW5zaWduZWQgbG9uZylsbWJfYWxsb2NfYmFzZShsbWIsIG9mX2xlbiwgMHgxMDAwLAorCQkJCShDT05GSUdfU1lTX0JPT1RNQVBTWiArIGJvb3RtYXBfYmFzZSkpOworCisJCWlmIChvZl9zdGFydCA9PSAwKSB7CisJCQlwdXRzKCJkZXZpY2UgdHJlZSAtIGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWRlYnVnICgiIyMgZGV2aWNlIHRyZWUgYXQgMHglMDhsWCAuLi4gMHglMDhsWCAobGVuPSVsZD0weCVsWClcbiIsCisJCQkodWxvbmcpZmR0X2Jsb2IsICh1bG9uZylmZHRfYmxvYiArICpvZl9zaXplIC0gMSwKKwkJCW9mX2xlbiwgb2ZfbGVuKTsKKworCQlwcmludGYgKCIgICBMb2FkaW5nIERldmljZSBUcmVlIHRvICUwOGx4LCBlbmQgJTA4bHggLi4uICIsCisJCQlvZl9zdGFydCwgb2Zfc3RhcnQgKyBvZl9sZW4gLSAxKTsKKworCQllcnIgPSBmZHRfb3Blbl9pbnRvIChmZHRfYmxvYiwgKHZvaWQgKilvZl9zdGFydCwgb2ZfbGVuKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlmZHRfZXJyb3IgKCJmZHQgbW92ZSBmYWlsZWQiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcHV0cyAoIk9LXG4iKTsKKworCQkqb2ZfZmxhdF90cmVlID0gKGNoYXIgKilvZl9zdGFydDsKKwkJKm9mX3NpemUgPSBvZl9sZW47CisJfSBlbHNlIHsKKwkJKm9mX2ZsYXRfdHJlZSA9IGZkdF9ibG9iOworCQlvZl9sZW4gPSAoQ09ORklHX1NZU19CT09UTUFQU1ogKyBib290bWFwX2Jhc2UpIC0gKHVsb25nKWZkdF9ibG9iOworCQlsbWJfcmVzZXJ2ZShsbWIsICh1bG9uZylmZHRfYmxvYiwgb2ZfbGVuKTsKKwkJZmR0X3NldF90b3RhbHNpemUoKm9mX2ZsYXRfdHJlZSwgb2ZfbGVuKTsKKworCQkqb2Zfc2l6ZSA9IG9mX2xlbjsKKwl9CisKKwlzZXRfd29ya2luZ19mZHRfYWRkcigqb2ZfZmxhdF90cmVlKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX1NZU19CT09UTUFQU1ogKi8KKworLyoqCisgKiBib290X2dldF9mZHQgLSBtYWluIGZkdCBoYW5kbGluZyByb3V0aW5lCisgKiBAYXJnYzogY29tbWFuZCBhcmd1bWVudCBjb3VudAorICogQGFyZ3Y6IGNvbW1hbmQgYXJndW1lbnQgbGlzdAorICogQGltYWdlczogcG9pbnRlciB0byB0aGUgYm9vdG0gaW1hZ2VzIHN0cnVjdHVyZQorICogQG9mX2ZsYXRfdHJlZTogcG9pbnRlciB0byBhIGNoYXIqIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IHN0YXJ0IGFkZHJlc3MKKyAqIEBvZl9zaXplOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgbGVuZ3RoCisgKgorICogYm9vdF9nZXRfZmR0KCkgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSB2YWxpZCBmbGF0IGRldmljZSB0cmVlIGltYWdlLgorICogQ3VyZW50bHkgc3VwcG9ydGVkIGFyZSB0aGUgZm9sbG93aW5nIHJhbWRpc2sgc291cmNlczoKKyAqICAgICAgLSBtdWx0aWNvbXBvbmVudCBrZXJuZWwvcmFtZGlzayBpbWFnZSwKKyAqICAgICAgLSBjb21tYW5kbGluZSBwcm92aWRlZCBhZGRyZXNzIG9mIGRlY2ljYXRlZCByYW1kaXNrIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgaWYgZmR0IGltYWdlIHdhcyBmb3VuZCBhbmQgdmFsaWQsIG9yIHNraXBwZWQKKyAqICAgICBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byBmZHQgc3RhcnQgYWRkcmVzcyBhbmQgbGVuZ3RoIGlmCisgKiAgICAgZmR0IGltYWdlIGlzIGZvdW5kIGFuZCB2YWxpZAorICoKKyAqICAgICAxLCBpZiBmZHQgaW1hZ2UgaXMgZm91bmQgYnV0IGNvcnJ1cHRlZAorICogICAgIG9mX2ZsYXRfdHJlZSBhbmQgb2Zfc2l6ZSBhcmUgc2V0IHRvIDAgaWYgbm8gZmR0IGV4aXN0cworICovCitpbnQgYm9vdF9nZXRfZmR0IChpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSkKK3sKKwljb25zdCBpbWFnZV9oZWFkZXJfdCAqZmR0X2hkcjsKKwl1bG9uZwkJZmR0X2FkZHI7CisJY2hhcgkJKmZkdF9ibG9iID0gTlVMTDsKKwl1bG9uZwkJaW1hZ2Vfc3RhcnQsIGltYWdlX2VuZDsKKwl1bG9uZwkJbG9hZF9zdGFydCwgbG9hZF9lbmQ7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCXZvaWQJCSpmaXRfaGRyOworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9jb25maWcgPSBOVUxMOworCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9mZHQgPSBOVUxMOworCXVsb25nCQlkZWZhdWx0X2FkZHI7CisJaW50CQljZmdfbm9mZnNldDsKKwlpbnQJCWZkdF9ub2Zmc2V0OworCWNvbnN0IHZvaWQJKmRhdGE7CisJc2l6ZV90CQlzaXplOworI2VuZGlmCisKKwkqb2ZfZmxhdF90cmVlID0gTlVMTDsKKwkqb2Zfc2l6ZSA9IDA7CisKKwlpZiAoYXJnYyA+IDMgfHwgZ2VuaW1nX2hhc19jb25maWcgKGltYWdlcykpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCWlmIChhcmdjID4gMykgeworCQkJLyoKKwkJCSAqIElmIHRoZSBGRFQgYmxvYiBjb21lcyBmcm9tIHRoZSBGSVQgaW1hZ2UgYW5kIHRoZQorCQkJICogRklUIGltYWdlIGFkZHJlc3MgaXMgb21pdHRlZCBpbiB0aGUgY29tbWFuZCBsaW5lCisJCQkgKiBhcmd1bWVudCwgdHJ5IHRvIHVzZSByYW1kaXNrIG9yIG9zIEZJVCBpbWFnZQorCQkJICogYWRkcmVzcyBvciBkZWZhdWx0IGxvYWQgYWRkcmVzcy4KKwkJCSAqLworCQkJaWYgKGltYWdlcy0+Zml0X3VuYW1lX3JkKQorCQkJCWRlZmF1bHRfYWRkciA9ICh1bG9uZylpbWFnZXMtPmZpdF9oZHJfcmQ7CisJCQllbHNlIGlmIChpbWFnZXMtPmZpdF91bmFtZV9vcykKKwkJCQlkZWZhdWx0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX29zOworCQkJZWxzZQorCQkJCWRlZmF1bHRfYWRkciA9IGxvYWRfYWRkcjsKKworCQkJaWYgKGZpdF9wYXJzZV9jb25mIChhcmd2WzNdLCBkZWZhdWx0X2FkZHIsCisJCQkJCQkmZmR0X2FkZHIsICZmaXRfdW5hbWVfY29uZmlnKSkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBjb25maWcgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCQlmaXRfdW5hbWVfY29uZmlnLCBmZHRfYWRkcik7CisJCQl9IGVsc2UgaWYgKGZpdF9wYXJzZV9zdWJpbWFnZSAoYXJndlszXSwgZGVmYXVsdF9hZGRyLAorCQkJCQkJJmZkdF9hZGRyLCAmZml0X3VuYW1lX2ZkdCkpIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogc3ViaW1hZ2UgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCQlmaXRfdW5hbWVfZmR0LCBmZHRfYWRkcik7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCWZkdF9hZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCQkJCWRlYnVnICgiKiAgZmR0OiBjbWRsaW5lIGltYWdlIGFkZHJlc3MgPSAweCUwOGx4XG4iLAorCQkJCQkJZmR0X2FkZHIpOworCQkJfQorI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwkJfSBlbHNlIHsKKwkJCS8qIHVzZSBGSVQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBpbiBmaXJzdCBib290bQorCQkJICogY29tbWFuZCBhcmd1bWVudAorCQkJICovCisJCQlmZHRfYWRkciA9ICh1bG9uZylpbWFnZXMtPmZpdF9oZHJfb3M7CisJCQlmaXRfdW5hbWVfY29uZmlnID0gaW1hZ2VzLT5maXRfdW5hbWVfY2ZnOworCQkJZGVidWcgKCIqICBmZHQ6IHVzaW5nIGNvbmZpZyAnJXMnIGZyb20gaW1hZ2UgYXQgMHglMDhseFxuIiwKKwkJCQkJZml0X3VuYW1lX2NvbmZpZywgZmR0X2FkZHIpOworCisJCQkvKgorCQkJICogQ2hlY2sgd2hldGhlciBjb25maWd1cmF0aW9uIGhhcyBGRFQgYmxvYiBkZWZpbmVkLAorCQkJICogaWYgbm90IHF1aXQgc2lsZW50bHkuCisJCQkgKi8KKwkJCWZpdF9oZHIgPSAodm9pZCAqKWZkdF9hZGRyOworCQkJY2ZnX25vZmZzZXQgPSBmaXRfY29uZl9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJZml0X3VuYW1lX2NvbmZpZyk7CisJCQlpZiAoY2ZnX25vZmZzZXQgPCAwKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IG5vIHN1Y2ggY29uZmlnXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJZmR0X25vZmZzZXQgPSBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGZpdF9oZHIsCisJCQkJCWNmZ19ub2Zmc2V0KTsKKwkJCWlmIChmZHRfbm9mZnNldCA8IDApIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogbm8gZmR0IGluIGNvbmZpZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWRlYnVnICgiIyMgQ2hlY2tpbmcgZm9yICdGRFQnLydGRFQgSW1hZ2UnIGF0ICUwOGx4XG4iLAorCQkJCWZkdF9hZGRyKTsKKworCQkvKiBjb3B5IGZyb20gZGF0YWZsYXNoIGlmIG5lZWRlZCAqLworCQlmZHRfYWRkciA9IGdlbmltZ19nZXRfaW1hZ2UgKGZkdF9hZGRyKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBGRFQgaW1hZ2UgYXQgdGhlCisJCSAqIGFkZHJlc3MgcHJvdmlkZWQgaW4gdGhlIHNlY29uZCBib290bSBhcmd1bWVudAorCQkgKiBjaGVjayBpbWFnZSB0eXBlLCBmb3IgRklUIGltYWdlcyBnZXQgYSBGSVQgbm9kZS4KKwkJICovCisJCXN3aXRjaCAoZ2VuaW1nX2dldF9mb3JtYXQgKCh2b2lkICopZmR0X2FkZHIpKSB7CisJCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJCS8qIHZlcmlmeSBmZHRfYWRkciBwb2ludHMgdG8gYSB2YWxpZCBpbWFnZSBoZWFkZXIgKi8KKwkJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBmcm9tIExlZ2FjeSBJbWFnZSBhdCAlMDhseFxuIiwKKwkJCQkJZmR0X2FkZHIpOworCQkJZmR0X2hkciA9IGltYWdlX2dldF9mZHQgKGZkdF9hZGRyKTsKKwkJCWlmICghZmR0X2hkcikKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKgorCQkJICogbW92ZSBpbWFnZSBkYXRhIHRvIHRoZSBsb2FkIGFkZHJlc3MsCisJCQkgKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGluaXRpYWwgaW1hZ2UKKwkJCSAqLworCQkJaW1hZ2Vfc3RhcnQgPSAodWxvbmcpZmR0X2hkcjsKKwkJCWltYWdlX2VuZCA9IGltYWdlX2dldF9pbWFnZV9lbmQgKGZkdF9oZHIpOworCisJCQlsb2FkX3N0YXJ0ID0gaW1hZ2VfZ2V0X2xvYWQgKGZkdF9oZHIpOworCQkJbG9hZF9lbmQgPSBsb2FkX3N0YXJ0ICsgaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoZmR0X2hkcik7CisKKwkJCWlmICgobG9hZF9zdGFydCA8IGltYWdlX2VuZCkgJiYgKGxvYWRfZW5kID4gaW1hZ2Vfc3RhcnQpKSB7CisJCQkJZmR0X2Vycm9yICgiZmR0IG92ZXJ3cml0dGVuIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJZGVidWcgKCIgICBMb2FkaW5nIEZEVCBmcm9tIDB4JTA4bHggdG8gMHglMDhseFxuIiwKKwkJCQkJaW1hZ2VfZ2V0X2RhdGEgKGZkdF9oZHIpLCBsb2FkX3N0YXJ0KTsKKworCQkJbWVtbW92ZSAoKHZvaWQgKilsb2FkX3N0YXJ0LAorCQkJCQkodm9pZCAqKWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSwKKwkJCQkJaW1hZ2VfZ2V0X2RhdGFfc2l6ZSAoZmR0X2hkcikpOworCisJCQlmZHRfYmxvYiA9IChjaGFyICopbG9hZF9zdGFydDsKKwkJCWJyZWFrOworCQljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCQkvKgorCQkJICogVGhpcyBjYXNlIHdpbGwgY2F0Y2ggYm90aDogbmV3IHVJbWFnZSBmb3JtYXQKKwkJCSAqIChsaWJmZHQgYmFzZWQpIGFuZCByYXcgRkRUIGJsb2IgKGFsc28gbGliZmR0CisJCQkgKiBiYXNlZCkuCisJCQkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCQkvKiBjaGVjayBGRFQgYmxvYiB2cyBGSVQgYmxvYiAqLworCQkJaWYgKGZpdF9jaGVja19mb3JtYXQgKChjb25zdCB2b2lkICopZmR0X2FkZHIpKSB7CisJCQkJLyoKKwkJCQkgKiBGSVQgaW1hZ2UKKwkJCQkgKi8KKwkJCQlmaXRfaGRyID0gKHZvaWQgKilmZHRfYWRkcjsKKwkJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgZnJvbSBGSVQgSW1hZ2UgYXQgJTA4bHhcbiIsCisJCQkJCQlmZHRfYWRkcik7CisKKwkJCQlpZiAoIWZpdF91bmFtZV9mZHQpIHsKKwkJCQkJLyoKKwkJCQkJICogbm8gRkRUIGJsb2IgaW1hZ2Ugbm9kZSB1bml0IG5hbWUsCisJCQkJCSAqIHRyeSB0byBnZXQgY29uZmlnIG5vZGUgZmlyc3QuIElmCisJCQkJCSAqIGNvbmZpZyB1bml0IG5vZGUgbmFtZSBpcyBOVUxMCisJCQkJCSAqIGZpdF9jb25mX2dldF9ub2RlKCkgd2lsbCB0cnkgdG8KKwkJCQkJICogZmluZCBkZWZhdWx0IGNvbmZpZyBub2RlCisJCQkJCSAqLworCQkJCQljZmdfbm9mZnNldCA9IGZpdF9jb25mX2dldF9ub2RlIChmaXRfaGRyLAorCQkJCQkJCWZpdF91bmFtZV9jb25maWcpOworCisJCQkJCWlmIChjZmdfbm9mZnNldCA8IDApIHsKKwkJCQkJCWZkdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gbm9kZVxuIik7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisKKwkJCQkJZml0X3VuYW1lX2NvbmZpZyA9IGZkdF9nZXRfbmFtZSAoZml0X2hkciwKKwkJCQkJCQljZmdfbm9mZnNldCwgTlVMTCk7CisJCQkJCXByaW50ZiAoIiAgIFVzaW5nICclcycgY29uZmlndXJhdGlvblxuIiwKKwkJCQkJCQlmaXRfdW5hbWVfY29uZmlnKTsKKworCQkJCQlmZHRfbm9mZnNldCA9IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQljZmdfbm9mZnNldCk7CisJCQkJCWZpdF91bmFtZV9mZHQgPSBmaXRfZ2V0X25hbWUgKGZpdF9oZHIsCisJCQkJCQkJZmR0X25vZmZzZXQsIE5VTEwpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGdldCBGRFQgY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0ICovCisJCQkJCWZkdF9ub2Zmc2V0ID0gZml0X2ltYWdlX2dldF9ub2RlIChmaXRfaGRyLAorCQkJCQkJCWZpdF91bmFtZV9mZHQpOworCQkJCX0KKwkJCQlpZiAoZmR0X25vZmZzZXQgPCAwKSB7CisJCQkJCWZkdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHN1YmltYWdlIG5vZGVcbiIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCXByaW50ZiAoIiAgIFRyeWluZyAnJXMnIEZEVCBibG9iIHN1YmltYWdlXG4iLAorCQkJCQkJZml0X3VuYW1lX2ZkdCk7CisKKwkJCQlpZiAoIWZpdF9jaGVja19mZHQgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCWltYWdlcy0+dmVyaWZ5KSkKKwkJCQkJZ290byBlcnJvcjsKKworCQkJCS8qIGdldCByYW1kaXNrIGltYWdlIGRhdGEgYWRkcmVzcyBhbmQgbGVuZ3RoICovCisJCQkJaWYgKGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0X2hkciwgZmR0X25vZmZzZXQsCisJCQkJCQkJJmRhdGEsICZzaXplKSkgeworCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBGRFQgc3ViaW1hZ2UgZGF0YSIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCS8qIHZlcmlmdCB0aGF0IGltYWdlIGRhdGEgaXMgYSBwcm9wZXIgRkRUIGJsb2IgKi8KKwkJCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoKGNoYXIgKilkYXRhKSAhPSAwKSB7CisJCQkJCWZkdF9lcnJvciAoIlN1YmltYWdlIGRhdGEgaXMgbm90IGEgRlREIik7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBtb3ZlIGltYWdlIGRhdGEgdG8gdGhlIGxvYWQgYWRkcmVzcywKKwkJCQkgKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGluaXRpYWwgaW1hZ2UKKwkJCQkgKi8KKwkJCQlpbWFnZV9zdGFydCA9ICh1bG9uZylmaXRfaGRyOworCQkJCWltYWdlX2VuZCA9IGZpdF9nZXRfZW5kIChmaXRfaGRyKTsKKworCQkJCWlmIChmaXRfaW1hZ2VfZ2V0X2xvYWQgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCSZsb2FkX3N0YXJ0KSA9PSAwKSB7CisJCQkJCWxvYWRfZW5kID0gbG9hZF9zdGFydCArIHNpemU7CisKKwkJCQkJaWYgKChsb2FkX3N0YXJ0IDwgaW1hZ2VfZW5kKSAmJgorCQkJCQkJCShsb2FkX2VuZCA+IGltYWdlX3N0YXJ0KSkgeworCQkJCQkJZmR0X2Vycm9yICgiRkRUIG92ZXJ3cml0dGVuIik7CisJCQkJCQlnb3RvIGVycm9yOworCQkJCQl9CisKKwkJCQkJcHJpbnRmICgiICAgTG9hZGluZyBGRFQgZnJvbSAweCUwOGx4IHRvIDB4JTA4bHhcbiIsCisJCQkJCQkJKHVsb25nKWRhdGEsIGxvYWRfc3RhcnQpOworCisJCQkJCW1lbW1vdmUgKCh2b2lkICopbG9hZF9zdGFydCwKKwkJCQkJCQkodm9pZCAqKWRhdGEsIHNpemUpOworCisJCQkJCWZkdF9ibG9iID0gKGNoYXIgKilsb2FkX3N0YXJ0OworCQkJCX0gZWxzZSB7CisJCQkJCWZkdF9ibG9iID0gKGNoYXIgKilkYXRhOworCQkJCX0KKworCQkJCWltYWdlcy0+Zml0X2hkcl9mZHQgPSBmaXRfaGRyOworCQkJCWltYWdlcy0+Zml0X3VuYW1lX2ZkdCA9IGZpdF91bmFtZV9mZHQ7CisJCQkJaW1hZ2VzLT5maXRfbm9mZnNldF9mZHQgPSBmZHRfbm9mZnNldDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJLyoKKwkJCQkgKiBGRFQgYmxvYgorCQkJCSAqLworCQkJCWZkdF9ibG9iID0gKGNoYXIgKilmZHRfYWRkcjsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogcmF3IEZEVCBibG9iXG4iKTsKKwkJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgYmxvYiBhdCAlMDhseFxuIiwgKGxvbmcpZmR0X2Jsb2IpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRzICgiRVJST1I6IERpZCBub3QgZmluZCBhIGNtZGxpbmUgRmxhdHRlbmVkIERldmljZSBUcmVlXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlwcmludGYgKCIgICBCb290aW5nIHVzaW5nIHRoZSBmZHQgYmxvYiBhdCAweCV4XG4iLCAoaW50KWZkdF9ibG9iKTsKKworCX0gZWxzZSBpZiAoaW1hZ2VzLT5sZWdhY3lfaGRyX3ZhbGlkICYmCisJCQlpbWFnZV9jaGVja190eXBlICgmaW1hZ2VzLT5sZWdhY3lfaGRyX29zX2NvcHksIElIX1RZUEVfTVVMVEkpKSB7CisKKwkJdWxvbmcgZmR0X2RhdGEsIGZkdF9sZW47CisKKwkJLyoKKwkJICogTm93IGNoZWNrIGlmIHdlIGhhdmUgYSBsZWdhY3kgbXVsdGktY29tcG9uZW50IGltYWdlLAorCQkgKiBnZXQgc2Vjb25kIGVudHJ5IGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgbGVuLgorCQkgKi8KKwkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGZyb20gbXVsdGkgIgorCQkJImNvbXBvbmVudCBJbWFnZSBhdCAlMDhsWFxuIiwKKwkJCSh1bG9uZylpbWFnZXMtPmxlZ2FjeV9oZHJfb3MpOworCisJCWltYWdlX211bHRpX2dldGltZyAoaW1hZ2VzLT5sZWdhY3lfaGRyX29zLCAyLCAmZmR0X2RhdGEsICZmZHRfbGVuKTsKKwkJaWYgKGZkdF9sZW4pIHsKKworCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWZkdF9kYXRhOworCQkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyB0aGUgZmR0IGF0IDB4JXhcbiIsIChpbnQpZmR0X2Jsb2IpOworCisJCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZmR0X2Jsb2IpICE9IDApIHsKKwkJCQlmZHRfZXJyb3IgKCJpbWFnZSBpcyBub3QgYSBmZHQiKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlpZiAoYmUzMl90b19jcHUgKGZkdF90b3RhbHNpemUgKGZkdF9ibG9iKSkgIT0gZmR0X2xlbikgeworCQkJCWZkdF9lcnJvciAoImZkdCBzaXplICE9IGltYWdlIHNpemUiKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVidWcgKCIjIyBObyBGbGF0dGVuZWQgRGV2aWNlIFRyZWVcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlkZWJ1ZyAoIiMjIE5vIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZVxuIik7CisJCXJldHVybiAwOworCX0KKworCSpvZl9mbGF0X3RyZWUgPSBmZHRfYmxvYjsKKwkqb2Zfc2l6ZSA9IGJlMzJfdG9fY3B1IChmZHRfdG90YWxzaXplIChmZHRfYmxvYikpOworCWRlYnVnICgiICAgb2ZfZmxhdF90cmVlIGF0IDB4JTA4bHggc2l6ZSAweCUwOGx4XG4iLAorCQkJKHVsb25nKSpvZl9mbGF0X3RyZWUsICpvZl9zaXplKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwkqb2ZfZmxhdF90cmVlID0gMDsKKwkqb2Zfc2l6ZSA9IDA7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLworI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOZXcgdUltYWdlIGZvcm1hdCByb3V0aW5lcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW50IGZpdF9wYXJzZV9zcGVjIChjb25zdCBjaGFyICpzcGVjLCBjaGFyIHNlcGMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipuYW1lKQoreworCWNvbnN0IGNoYXIgKnNlcDsKKworCSphZGRyID0gYWRkcl9jdXJyOworCSpuYW1lID0gTlVMTDsKKworCXNlcCA9IHN0cmNociAoc3BlYywgc2VwYyk7CisJaWYgKHNlcCkgeworCQlpZiAoc2VwIC0gc3BlYyA+IDApCisJCQkqYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzcGVjLCBOVUxMLCAxNik7CisKKwkJKm5hbWUgPSBzZXAgKyAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfcGFyc2VfY29uZiAtIHBhcnNlIEZJVCBjb25maWd1cmF0aW9uIHNwZWMKKyAqIEBzcGVjOiBpbnB1dCBzdHJpbmcsIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBzcGVjCisgKiBAYWRkX2N1cnI6IGN1cnJlbnQgaW1hZ2UgYWRkcmVzcyAodG8gYmUgdXNlZCBhcyBhIHBvc3NpYmxlIGRlZmF1bHQpCisgKiBAYWRkcjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgRklUIGltYWdlIGFkZHJlc3Mgb2YgYSBnaXZlbgorICogY29uZmlndXJhdGlvbgorICogQGNvbmZfbmFtZSBkb3VibGUgcG9pbnRlciB0byBhIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIGEgY29uZmlndXJhdGlvbgorICogdW5pdCBuYW1lCisgKgorICogZml0X3BhcnNlX2NvbmYoKSBleHBlY3RzIGNvbmZpZ3VyYXRpb24gc3BlYyBpbiB0aGUgZm9yIG9mIFs8YWRkcj5dIzxjb25mPiwKKyAqIHdoZXJlIDxhZGRyPiBpcyBhIEZJVCBpbWFnZSBhZGRyZXNzIHRoYXQgY29udGFpbnMgY29uZmlndXJhdGlvbgorICogd2l0aCBhIDxjb25mPiB1bml0IG5hbWUuCisgKgorICogQWRkcmVzcyBwYXJ0IGlzIG9wdGlvbmFsLCBhbmQgaWYgb21pdHRlZCBkZWZhdWx0IGFkZF9jdXJyIHdpbGwKKyAqIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgc3BlYyBpcyBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gc3RyaW5nLAorICogICAgIGFkZHIgYW5kIGNvbmZfbmFtZSBhcmUgc2V0IGFjY29yZGluZ2x5CisgKiAgICAgMCBvdGhlcndpc2UKKyAqLworaW5saW5lIGludCBmaXRfcGFyc2VfY29uZiAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmNvbmZfbmFtZSkKK3sKKwlyZXR1cm4gZml0X3BhcnNlX3NwZWMgKHNwZWMsICcjJywgYWRkcl9jdXJyLCBhZGRyLCBjb25mX25hbWUpOworfQorCisvKioKKyAqIGZpdF9wYXJzZV9zdWJpbWFnZSAtIHBhcnNlIEZJVCBzdWJpbWFnZSBzcGVjCisgKiBAc3BlYzogaW5wdXQgc3RyaW5nLCBjb250YWluaW5nIHN1YmltYWdlIHNwZWMKKyAqIEBhZGRfY3VycjogY3VycmVudCBpbWFnZSBhZGRyZXNzICh0byBiZSB1c2VkIGFzIGEgcG9zc2libGUgZGVmYXVsdCkKKyAqIEBhZGRyOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBGSVQgaW1hZ2UgYWRkcmVzcyBvZiBhIGdpdmVuCisgKiBzdWJpbWFnZQorICogQGltYWdlX25hbWU6IGRvdWJsZSBwb2ludGVyIHRvIGEgY2hhciwgd2lsbCBob2xkIHBvaW50ZXIgdG8gYSBzdWJpbWFnZSBuYW1lCisgKgorICogZml0X3BhcnNlX3N1YmltYWdlKCkgZXhwZWN0cyBzdWJpbWFnZSBzcGVjIGluIHRoZSBmb3Igb2YKKyAqIFs8YWRkcj5dOjxzdWJpbWFnZT4sIHdoZXJlIDxhZGRyPiBpcyBhIEZJVCBpbWFnZSBhZGRyZXNzIHRoYXQgY29udGFpbnMKKyAqIHN1YmltYWdlIHdpdGggYSA8c3ViaW1nPiB1bml0IG5hbWUuCisgKgorICogQWRkcmVzcyBwYXJ0IGlzIG9wdGlvbmFsLCBhbmQgaWYgb21pdHRlZCBkZWZhdWx0IGFkZF9jdXJyIHdpbGwKKyAqIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgc3BlYyBpcyBhIHZhbGlkIHN1YmltYWdlIHN0cmluZywKKyAqICAgICBhZGRyIGFuZCBpbWFnZV9uYW1lIGFyZSBzZXQgYWNjb3JkaW5nbHkKKyAqICAgICAwIG90aGVyd2lzZQorICovCitpbmxpbmUgaW50IGZpdF9wYXJzZV9zdWJpbWFnZSAoY29uc3QgY2hhciAqc3BlYywgdWxvbmcgYWRkcl9jdXJyLAorCQl1bG9uZyAqYWRkciwgY29uc3QgY2hhciAqKmltYWdlX25hbWUpCit7CisJcmV0dXJuIGZpdF9wYXJzZV9zcGVjIChzcGVjLCAnOicsIGFkZHJfY3VyciwgYWRkciwgaW1hZ2VfbmFtZSk7Cit9CisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKworc3RhdGljIHZvaWQgZml0X2dldF9kZWJ1ZyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJY2hhciAqcHJvcF9uYW1lLCBpbnQgZXJyKQoreworCWRlYnVnICgiQ2FuJ3QgZ2V0ICclcycgcHJvcGVydHkgZnJvbSBGSVQgMHglMDhseCwgIgorCQkibm9kZTogb2Zmc2V0ICVkLCBuYW1lICVzICglcylcbiIsCisJCXByb3BfbmFtZSwgKHVsb25nKWZpdCwgbm9mZnNldCwKKwkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQlmZHRfc3RyZXJyb3IgKGVycikpOworfQorCisvKioKKyAqIGZpdF9wcmludF9jb250ZW50cyAtIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBGSVQgZm9ybWF0IGltYWdlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9wcmludF9jb250ZW50cygpIGZvcm1hdHMgYSBtdWx0aSBsaW5lIEZJVCBpbWFnZSBjb250ZW50cyBkZXNjcmlwdGlvbi4KKyAqIFRoZSByb3V0aW5lIHByaW50cyBvdXQgRklUIGltYWdlIHByb3BlcnRpZXMgKHJvb3Qgbm9kZSBsZXZlbCkgZm9sbHdlZCBieQorICogdGhlIGRldGFpbHMgb2YgZWFjaCBjb21wb25lbnQgaW1hZ2UuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X3ByaW50X2NvbnRlbnRzIChjb25zdCB2b2lkICpmaXQpCit7CisJY2hhciAqZGVzYzsKKwljaGFyICp1bmFtZTsKKwlpbnQgaW1hZ2VzX25vZmZzZXQ7CisJaW50IGNvbmZzX25vZmZzZXQ7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgY291bnQgPSAwOworCWludCByZXQ7CisJY29uc3QgY2hhciAqcDsKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJdGltZV90IHRpbWVzdGFtcDsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0hPU1RDQworCXAgPSAiIjsKKyNlbHNlCisJcCA9ICIgICAiOworI2VuZGlmCisKKwkvKiBSb290IG5vZGUgcHJvcGVydGllcyAqLworCXJldCA9IGZpdF9nZXRfZGVzYyAoZml0LCAwLCAmZGVzYyk7CisJcHJpbnRmICgiJXNGSVQgZGVzY3JpcHRpb246ICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCBkZXNjKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwlyZXQgPSBmaXRfZ2V0X3RpbWVzdGFtcCAoZml0LCAwLCAmdGltZXN0YW1wKTsKKwlwcmludGYgKCIlc0NyZWF0ZWQ6ICAgICAgICAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVzdGFtcCk7CisjZW5kaWYKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29tcG9uZW50IGltYWdlcyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBjb3VudCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIlcyBJbWFnZSAldSAoJXMpXG4iLCBwLCBjb3VudCsrLAorCQkJCQlmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSk7CisKKwkJCWZpdF9pbWFnZV9wcmludCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KKworCS8qIEZpbmQgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJY29uZnNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfQ09ORlNfUEFUSCk7CisJaWYgKGNvbmZzX25vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9DT05GU19QQVRILCBmZHRfc3RyZXJyb3IgKGNvbmZzX25vZmZzZXQpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lIGZyb20gZGVmYXVsdCBwcm9wZXJ0eSAqLworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCBOVUxMKTsKKwlpZiAodW5hbWUpCisJCXByaW50ZiAoIiVzIERlZmF1bHQgQ29uZmlndXJhdGlvbjogJyVzJ1xuIiwgcCwgdW5hbWUpOworCisJLyogUHJvY2VzcyBpdHMgc3Vibm9kZXMsIHByaW50IG91dCBjb25maWd1cmF0aW9ucyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBjb3VudCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGNvbmZzX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb25maWd1cmF0aW9uIG5vZGUuCisJCQkgKi8KKwkJCXByaW50ZiAoIiVzIENvbmZpZ3VyYXRpb24gJXUgKCVzKVxuIiwgcCwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlmaXRfY29uZl9wcmludCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaXRfaW1hZ2VfcHJpbnQgLSBwcmludHMgb3V0IHRoZSBGSVQgY29tcG9uZW50IGltYWdlIGRldGFpbHMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2Vfbm9mZnNldDogb2Zmc2V0IG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9pbWFnZV9wcmludCgpIGxpc3RzIGFsbCBtYW5kYXRvcnkgcHJvcGVyaWVzIGZvciB0aGUgcHJvY2Vzc2VkIGNvbXBvbmVudAorICogaW1hZ2UuIElmIHByZXNlbnQsIGhhc2ggbm9kZXMgYXJlIHByaW50ZWQgb3V0IGFzIHdlbGwuIExvYWQKKyAqIGFkZHJlc3MgZm9yIGltYWdlcyBvZiB0eXBlIGZpcm13YXJlIGlzIGFsc28gcHJpbnRlZCBvdXQuIFNpbmNlIHRoZSBsb2FkCisgKiBhZGRyZXNzIGlzIG5vdCBtYW5kYXRvcnkgZm9yIGZpcm13YXJlIGltYWdlcywgaXQgd2lsbCBiZSBvdXRwdXQgYXMKKyAqICJ1bmF2YWlsYWJsZSIgd2hlbiBub3QgcHJlc2VudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfaW1hZ2VfcHJpbnQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQsIGNvbnN0IGNoYXIgKnApCit7CisJY2hhciAqZGVzYzsKKwl1aW50OF90IHR5cGUsIGFyY2gsIG9zLCBjb21wOworCXNpemVfdCBzaXplOworCXVsb25nIGxvYWQsIGVudHJ5OworCWNvbnN0IHZvaWQgKmRhdGE7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgcmV0OworCisJLyogTWFuZGF0b3J5IHByb3BlcnRpZXMgKi8KKwlyZXQgPSBmaXRfZ2V0X2Rlc2MgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRlc2MpOworCXByaW50ZiAoIiVzICBEZXNjcmlwdGlvbjogICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCBkZXNjKTsKKworCWZpdF9pbWFnZV9nZXRfdHlwZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmdHlwZSk7CisJcHJpbnRmICgiJXMgIFR5cGU6ICAgICAgICAgJXNcbiIsIHAsIGdlbmltZ19nZXRfdHlwZV9uYW1lICh0eXBlKSk7CisKKwlmaXRfaW1hZ2VfZ2V0X2NvbXAgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmNvbXApOworCXByaW50ZiAoIiVzICBDb21wcmVzc2lvbjogICVzXG4iLCBwLCBnZW5pbWdfZ2V0X2NvbXBfbmFtZSAoY29tcCkpOworCisJcmV0ID0gZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworCXByaW50ZiAoIiVzICBEYXRhIFN0YXJ0OiAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIjB4JTA4bHhcbiIsICh1bG9uZylkYXRhKTsKKyNlbmRpZgorCisJcHJpbnRmICgiJXMgIERhdGEgU2l6ZTogICAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJZ2VuaW1nX3ByaW50X3NpemUgKHNpemUpOworCisJLyogUmVtYWluaW5nLCB0eXBlIGRlcGVuZGVudCBwcm9wZXJ0aWVzICovCisJaWYgKCh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB8fCAodHlwZSA9PSBJSF9UWVBFX1NUQU5EQUxPTkUpIHx8CisJICAgICh0eXBlID09IElIX1RZUEVfUkFNRElTSykgfHwgKHR5cGUgPT0gSUhfVFlQRV9GSVJNV0FSRSkgfHwKKwkgICAgKHR5cGUgPT0gSUhfVFlQRV9GTEFURFQpKSB7CisJCWZpdF9pbWFnZV9nZXRfYXJjaCAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmYXJjaCk7CisJCXByaW50ZiAoIiVzICBBcmNoaXRlY3R1cmU6ICVzXG4iLCBwLCBnZW5pbWdfZ2V0X2FyY2hfbmFtZSAoYXJjaCkpOworCX0KKworCWlmICh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB7CisJCWZpdF9pbWFnZV9nZXRfb3MgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm9zKTsKKwkJcHJpbnRmICgiJXMgIE9TOiAgICAgICAgICAgJXNcbiIsIHAsIGdlbmltZ19nZXRfb3NfbmFtZSAob3MpKTsKKwl9CisKKwlpZiAoKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHx8ICh0eXBlID09IElIX1RZUEVfU1RBTkRBTE9ORSkgfHwKKwkJKHR5cGUgPT0gSUhfVFlQRV9GSVJNV0FSRSkpIHsKKwkJcmV0ID0gZml0X2ltYWdlX2dldF9sb2FkIChmaXQsIGltYWdlX25vZmZzZXQsICZsb2FkKTsKKwkJcHJpbnRmICgiJXMgIExvYWQgQWRkcmVzczogIiwgcCk7CisJCWlmIChyZXQpCisJCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJCWVsc2UKKwkJCXByaW50ZiAoIjB4JTA4bHhcbiIsIGxvYWQpOworCX0KKworCWlmICgodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgfHwgKHR5cGUgPT0gSUhfVFlQRV9TVEFOREFMT05FKSkgeworCQlmaXRfaW1hZ2VfZ2V0X2VudHJ5IChmaXQsIGltYWdlX25vZmZzZXQsICZlbnRyeSk7CisJCXByaW50ZiAoIiVzICBFbnRyeSBQb2ludDogICIsIHApOworCQlpZiAocmV0KQorCQkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCQllbHNlCisJCQlwcmludGYgKCIweCUwOGx4XG4iLCBlbnRyeSk7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwkJCWZpdF9pbWFnZV9wcmludF9oYXNoIChmaXQsIG5vZmZzZXQsIHApOworCQl9CisJfQorfQorCisvKioKKyAqIGZpdF9pbWFnZV9wcmludF9oYXNoIC0gcHJpbnRzIG91dCB0aGUgaGFzaCBub2RlIGRldGFpbHMKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogb2Zmc2V0IG9mIHRoZSBoYXNoIG5vZGUKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfaW1hZ2VfcHJpbnRfaGFzaCgpIGxpc3RzIHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZCBoYXNoIG5vZGUKKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfaW1hZ2VfcHJpbnRfaGFzaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCkKK3sKKwljaGFyICphbGdvOworCXVpbnQ4X3QgKnZhbHVlOworCWludCB2YWx1ZV9sZW47CisJaW50IGksIHJldDsKKworCS8qCisJICogQ2hlY2sgc3Vibm9kZSBuYW1lLCBtdXN0IGJlIGVxdWFsIHRvICJoYXNoIi4KKwkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCSAqIG5hbWVzLCBlLmcuIGhhc2hAMSwgaGFzaEAyLCBldGMuCisJICovCisJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQlzdHJsZW4oRklUX0hBU0hfTk9ERU5BTUUpKSAhPSAwKQorCQlyZXR1cm47CisKKwlkZWJ1ZyAoIiVzICBIYXNoIG5vZGU6ICAgICclcydcbiIsIHAsCisJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJcHJpbnRmICgiJXMgIEhhc2ggYWxnbzogICAgIiwgcCk7CisJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQlwcmludGYgKCJpbnZhbGlkL3Vuc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYgKCIlc1xuIiwgYWxnbyk7CisKKwlyZXQgPSBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGZpdCwgbm9mZnNldCwgJnZhbHVlLAorCQkJCQkmdmFsdWVfbGVuKTsKKwlwcmludGYgKCIlcyAgSGFzaCB2YWx1ZTogICAiLCBwKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgdmFsdWVfbGVuOyBpKyspCisJCQlwcmludGYgKCIlMDJ4IiwgdmFsdWVbaV0pOworCQlwcmludGYgKCJcbiIpOworCX0KKworCWRlYnVnICAoIiVzICBIYXNoIGxlbjogICAgICVkXG4iLCBwLCB2YWx1ZV9sZW4pOworfQorCisvKioKKyAqIGZpdF9nZXRfZGVzYyAtIGdldCBub2RlIGRlc2NyaXB0aW9uIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAZGVzYzogZG91YmxlIHBvaW50ZXIgdG8gdGhlIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIHRoZSBkZXNjcnB0aW9uCisgKgorICogZml0X2dldF9kZXNjKCkgcmVhZHMgZGVzY3JpcHRpb24gcHJvcGVydHkgZnJvbSBhIGdpdmVuIG5vZGUsIGlmCisgKiBkZXNjcmlwdGlvbiBpcyBmb3VuZCBwb2ludGVyIHRvIGl0IGlzIHJldHVyZW5lZCBpbiB0aGlyZCBjYWxsIGFyZ3VtZW50LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfZ2V0X2Rlc2MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKipkZXNjKQoreworCWludCBsZW47CisKKwkqZGVzYyA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RFU0NfUFJPUCwgJmxlbik7CisJaWYgKCpkZXNjID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfREVTQ19QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2dldF90aW1lc3RhbXAgLSBnZXQgbm9kZSB0aW1lc3RhbXAgcHJvcGVydHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogbm9kZSBvZmZzZXQKKyAqIEB0aW1lc3RhbXA6IHBvaW50ZXIgdG8gdGhlIHRpbWVfdCwgd2lsbCBob2xkIHJlYWQgdGltZXN0YW1wCisgKgorICogZml0X2dldF90aW1lc3RhbXAoKSByZWFkcyB0aW1lc3RhbXAgcG9wZXJ0eSBmcm9tIGdpdmVuIG5vZGUsIGlmIHRpbWVzdGFtcAorICogaXMgZm91bmQgYW5kIGhhcyBhIGNvcnJlY3Qgc2l6ZSBpdHMgdmFsdWUgaXMgcmV0dXJlZCBpbiB0aGlyZCBjYWxsCisgKiBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gcHJvcGVydHkgcmVhZCBmYWlsdXJlCisgKiAgICAgLTIsIG9uIHdyb25nIHRpbWVzdGFtcCBzaXplCisgKi8KK2ludCBmaXRfZ2V0X3RpbWVzdGFtcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90ICp0aW1lc3RhbXApCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobGVuICE9IHNpemVvZiAodWludDMyX3QpKSB7CisJCWRlYnVnICgiRklUIHRpbWVzdGFtcCB3aXRoIGluY29ycmVjdCBzaXplIG9mICgldSlcbiIsIGxlbik7CisJCXJldHVybiAtMjsKKwl9CisKKwkqdGltZXN0YW1wID0gdWltYWdlX3RvX2NwdSAoKigodWludDMyX3QgKilkYXRhKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9ub2RlIC0gZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb21wb25lbnQgaW1hZ2Ugb2YgYSBnaXZlbiB1bml0IG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2VfdW5hbWU6IGNvbXBvbmVudCBpbWFnZSBub2RlIHVuaXQgbmFtZQorICoKKyAqIGZpdF9pbWFnZV9nZXRfbm9kZSgpIGZpbmRzIGEgY29tcG9uZW50IGltYWdlICh3aXRoaW5nIHRoZSAnL2ltYWdlcycKKyAqIG5vZGUpIG9mIGEgcHJvdmlkZWQgdW5pdCBuYW1lLiBJZiBpbWFnZSBpcyBmb3VuZCBpdHMgbm9kZSBvZmZzZXQgaXMKKyAqIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2ltYWdlX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmltYWdlX3VuYW1lKQoreworCWludCBub2Zmc2V0LCBpbWFnZXNfbm9mZnNldDsKKworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gaW1hZ2VzX25vZmZzZXQ7CisJfQorCisJbm9mZnNldCA9IGZkdF9zdWJub2RlX29mZnNldCAoZml0LCBpbWFnZXNfbm9mZnNldCwgaW1hZ2VfdW5hbWUpOworCWlmIChub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGdldCBub2RlIG9mZnNldCBmb3IgaW1hZ2UgdW5pdCBuYW1lOiAnJXMnICglcylcbiIsCisJCQlpbWFnZV91bmFtZSwgZmR0X3N0cmVycm9yIChub2Zmc2V0KSk7CisJfQorCisJcmV0dXJuIG5vZmZzZXQ7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9vcyAtIGdldCBvcyBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBvczogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIG9zIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X29zKCkgZmluZHMgb3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfb3MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKm9zKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBPUyBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfT1NfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9PU19QUk9QLCBsZW4pOworCQkqb3MgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBPUyBuYW1lIHRvIGlkICovCisJKm9zID0gZ2VuaW1nX2dldF9vc19pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9hcmNoIC0gZ2V0IGFyY2ggaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAYXJjaDogcG9pbnRlciB0byB0aGUgdWludDhfdCwgd2lsbCBob2xkIGFyY2ggbnVtZXJpYyBpZAorICoKKyAqIGZpdF9pbWFnZV9nZXRfYXJjaCgpIGZpbmRzIGFyY2ggcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIChzdHJpbmcpIHZhbHVlIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIG51bWVyaWMKKyAqIGlkIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfYXJjaCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqYXJjaCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgYXJjaGl0ZWN0dXJlIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9BUkNIX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQVJDSF9QUk9QLCBsZW4pOworCQkqYXJjaCA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGFyY2hpdGVjdHVyZSBuYW1lIHRvIGlkICovCisJKmFyY2ggPSBnZW5pbWdfZ2V0X2FyY2hfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfdHlwZSAtIGdldCB0eXBlIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQHR5cGU6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCB0eXBlIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X3R5cGUoKSBmaW5kcyB0eXBlIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnR5cGUpCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGltYWdlIHR5cGUgbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1RZUEVfUFJPUCwgJmxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9UWVBFX1BST1AsIGxlbik7CisJCSp0eXBlID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgaW1hZ2UgdHlwZSBuYW1lIHRvIGlkICovCisJKnR5cGUgPSBnZW5pbWdfZ2V0X3R5cGVfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfY29tcCAtIGdldCBjb21wIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGNvbXA6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBjb21wIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2NvbXAoKSBmaW5kcyBjb21wIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmNvbXApCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGNvbXByZXNzaW9uIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9DT01QX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQ09NUF9QUk9QLCBsZW4pOworCQkqY29tcCA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGNvbXByZXNzaW9uIG5hbWUgdG8gaWQgKi8KKwkqY29tcCA9IGdlbmltZ19nZXRfY29tcF9pZCAoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9sb2FkIC0gZ2V0IGxvYWQgYWRkcmVzcyBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBsb2FkOiBwb2ludGVyIHRvIHRoZSB1aW50MzJfdCwgd2lsbCBob2xkIGxvYWQgYWRkcmVzcworICoKKyAqIGZpdF9pbWFnZV9nZXRfbG9hZCgpIGZpbmRzIGxvYWQgYWRkcmVzcyBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9sb2FkIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqbG9hZCkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVpbnQzMl90ICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9MT0FEX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfTE9BRF9QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJKmxvYWQgPSB1aW1hZ2VfdG9fY3B1ICgqZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9lbnRyeSAtIGdldCBlbnRyeSBwb2ludCBhZGRyZXNzIHByb3BlcnR5IGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGVudHJ5OiBwb2ludGVyIHRvIHRoZSB1aW50MzJfdCwgd2lsbCBob2xkIGVudHJ5IHBvaW50IGFkZHJlc3MKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2VudHJ5KCkgZmluZHMgZW50cnkgcG9pbnQgYWRkcmVzcyBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9lbnRyeSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmVudHJ5KQoreworCWludCBsZW47CisJY29uc3QgdWludDMyX3QgKmRhdGE7CisKKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0VOVFJZX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfRU5UUllfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSplbnRyeSA9IHVpbWFnZV90b19jcHUgKCpkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2RhdGEgLSBnZXQgZGF0YSBwcm9wZXJ0eSBhbmQgaXRzIHNpemUgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAZGF0YTogZG91YmxlIHBvaW50ZXIgdG8gdm9pZCwgd2lsbCBob2xkIGRhdGEgcHJvcGVydHkncyBkYXRhIGFkZHJlc3MKKyAqIEBzaXplOiBwb2ludGVyIHRvIHNpemVfdCwgd2lsbCBob2xkIGRhdGEgcHJvcGVydHkncyBkYXRhIHNpemUKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2RhdGEoKSBmaW5kcyBkYXRhIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZSBhcmUgcmV0dXJuZWQgdG8KKyAqIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfZGF0YSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwKKwkJY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkKK3sKKwlpbnQgbGVuOworCisJKmRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfREFUQV9QUk9QLCAmbGVuKTsKKwlpZiAoKmRhdGEgPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9EQVRBX1BST1AsIGxlbik7CisJCSpzaXplID0gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCSpzaXplID0gbGVuOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIC0gZ2V0IGhhc2ggYWxnb3JpdGhtIG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogaGFzaCBub2RlIG9mZnNldAorICogQGFsZ286IGRvdWJsZSBwb2ludGVyIHRvIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIHRoZSBhbGdvcml0aG0gbmFtZQorICoKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvKCkgZmluZHMgaGFzaCBhbGdvcml0aG0gcHJvcGVydHkgaW4gYSBnaXZlbiBoYXNoIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmFsZ28pCit7CisJaW50IGxlbjsKKworCSphbGdvID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQUxHT19QUk9QLCAmbGVuKTsKKwlpZiAoKmFsZ28gPT0gTlVMTCkgeworCQlmaXRfZ2V0X2RlYnVnIChmaXQsIG5vZmZzZXQsIEZJVF9BTEdPX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgLSBnZXQgaGFzaCB2YWx1ZSBhbmQgbGVuZ3RoCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEB2YWx1ZTogZG91YmxlIHBvaW50ZXIgdG8gdWludDhfdCwgd2lsbCBob2xkIGFkZHJlc3Mgb2YgYSBoYXNoIHZhbHVlIGRhdGEKKyAqIEB2YWx1ZV9sZW46IHBvaW50ZXIgdG8gYW4gaW50LCB3aWxsIGhvbGQgaGFzaCBkYXRhIGxlbmd0aAorICoKKyAqIGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSgpIGZpbmRzIGhhc2ggdmFsdWUgcHJvcGVydHkgaW4gYSBnaXZlbiBoYXNoIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQgaXRzIGRhdGEgc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZSBhcmUgcmV0dXJuZWQgdG8KKyAqIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqKnZhbHVlLAorCQkJCWludCAqdmFsdWVfbGVuKQoreworCWludCBsZW47CisKKwkqdmFsdWUgPSAodWludDhfdCAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9WQUxVRV9QUk9QLCAmbGVuKTsKKwlpZiAoKnZhbHVlID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgbGVuKTsKKwkJKnZhbHVlX2xlbiA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkqdmFsdWVfbGVuID0gbGVuOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9zZXRfdGltZXN0YW1wIC0gc2V0IG5vZGUgdGltZXN0YW1wIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAdGltZXN0YW1wOiB0aW1lc3RhbXAgdmFsdWUgdG8gYmUgc2V0CisgKgorICogZml0X3NldF90aW1lc3RhbXAoKSBhdHRlbXB0cyB0byBzZXQgdGltZXN0YW1wIHByb3BlcnR5IGluIHRoZSByZXF1ZXN0ZWQKKyAqIG5vZGUgYW5kIHJldHVybnMgb3BlcmF0aW9uIHN0YXR1cyB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBwcm9wZXJ0eSByZWFkIGZhaWx1cmUKKyAqLworaW50IGZpdF9zZXRfdGltZXN0YW1wICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgdGltZXN0YW1wKQoreworCXVpbnQzMl90IHQ7CisJaW50IHJldDsKKworCXQgPSBjcHVfdG9fdWltYWdlICh0aW1lc3RhbXApOworCXJldCA9IGZkdF9zZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9USU1FU1RBTVBfUFJPUCwgJnQsCisJCQkJc2l6ZW9mICh1aW50MzJfdCkpOworCWlmIChyZXQpIHsKKwkJcHJpbnRmICgiQ2FuJ3Qgc2V0ICclcycgcHJvcGVydHkgZm9yICclcycgbm9kZSAoJXMpXG4iLAorCQkJRklUX1RJTUVTVEFNUF9QUk9QLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmZHRfc3RyZXJyb3IgKHJldCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FsY3VsYXRlX2hhc2ggLSBjYWxjdWxhdGUgYW5kIHJldHVybiBoYXNoIGZvciBwcm92aWRlZCBpbnB1dCBkYXRhCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YQorICogQGRhdGFfbGVuOiBkYXRhIGxlbmd0aAorICogQGFsZ286IHJlcXVlc3RlZCBoYXNoIGFsZ29yaXRobQorICogQHZhbHVlOiBwb2ludGVyIHRvIHRoZSBjaGFyLCB3aWxsIGhvbGQgaGFzaCB2YWx1ZSBkYXRhIChjYWxsZXIgbXVzdAorICogYWxsb2NhdGUgZW5vdWdoIGZyZWUgc3BhY2UpCisgKiB2YWx1ZV9sZW46IGxlbmd0aCBvZiB0aGUgY2FsY3VsYXRlZCBoYXNoCisgKgorICogY2FsY3VsYXRlX2hhc2goKSBjb21wdXRlcyBpbnB1dCBkYXRhIGhhc2ggYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgYWxnb3JpdGhtLgorICogUmVzdWx0aW5nIGhhc2ggdmFsdWUgaXMgcGxhY2VkIGluIGNhbGxlciBwcm92aWRlZCAndmFsdWUnIGJ1ZmZlciwgbGVuZ3RoCisgKiBvZiB0aGUgY2FsY3VsYXRlZCBoYXNoIGlzIHJldHVybmVkIHZpYSB2YWx1ZV9sZW4gcG9pbnRlciBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgIC0xLCB3aGVuIGFsZ28gaXMgdW5zdXBwb3J0ZWQKKyAqLworc3RhdGljIGludCBjYWxjdWxhdGVfaGFzaCAoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuLCBjb25zdCBjaGFyICphbGdvLAorCQkJdWludDhfdCAqdmFsdWUsIGludCAqdmFsdWVfbGVuKQoreworCWlmIChzdHJjbXAgKGFsZ28sICJjcmMzMiIpID09IDAgKSB7CisJCSooKHVpbnQzMl90ICopdmFsdWUpID0gY3JjMzJfd2QgKDAsIGRhdGEsIGRhdGFfbGVuLAorCQkJCQkJCUNIVU5LU1pfQ1JDMzIpOworCQkqKCh1aW50MzJfdCAqKXZhbHVlKSA9IGNwdV90b191aW1hZ2UgKCooKHVpbnQzMl90ICopdmFsdWUpKTsKKwkJKnZhbHVlX2xlbiA9IDQ7CisJfSBlbHNlIGlmIChzdHJjbXAgKGFsZ28sICJzaGExIikgPT0gMCApIHsKKwkJc2hhMV9jc3VtX3dkICgodW5zaWduZWQgY2hhciAqKSBkYXRhLCBkYXRhX2xlbiwKKwkJCQkodW5zaWduZWQgY2hhciAqKSB2YWx1ZSwgQ0hVTktTWl9TSEExKTsKKwkJKnZhbHVlX2xlbiA9IDIwOworCX0gZWxzZSBpZiAoc3RyY21wIChhbGdvLCAibWQ1IikgPT0gMCApIHsKKwkJbWQ1X3dkICgodW5zaWduZWQgY2hhciAqKWRhdGEsIGRhdGFfbGVuLCB2YWx1ZSwgQ0hVTktTWl9NRDUpOworCQkqdmFsdWVfbGVuID0gMTY7CisJfSBlbHNlIHsKKwkJZGVidWcgKCJVbnN1cHBvcnRlZCBoYXNoIGFsb2dyaXRobVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBVU0VfSE9TVENDCisvKioKKyAqIGZpdF9zZXRfaGFzaGVzIC0gcHJvY2VzcyBGSVQgY29tcG9uZW50IGltYWdlIG5vZGVzIGFuZCBjYWxjdWxhdGUgaGFzaGVzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9zZXRfaGFzaGVzKCkgYWRkcyBoYXNoIHZhbHVlcyBmb3IgYWxsIGNvbXBvbmVudCBpbWFnZXMgaW4gdGhlIEZJVCBibG9iLgorICogSGFzaGVzIGFyZSBjYWxjdWxhdGVkIGZvciBhbGwgY29tcG9uZW50IGltYWdlcyB3aGljaCBoYXZlIGhhc2ggc3Vibm9kZXMKKyAqIHdpdGggYWxnb3JpdGhtIHByb3BlcnR5IHNldCB0byBvbmUgb2YgdGhlIHN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobXMuCisgKgorICogcmV0dXJucworICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICBsaWJmZHQgZXJyb3IgY29kZSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X3NldF9oYXNoZXMgKHZvaWQgKmZpdCkKK3sKKwlpbnQgaW1hZ2VzX25vZmZzZXQ7CisJaW50IG5vZmZzZXQ7CisJaW50IG5kZXB0aDsKKwlpbnQgcmV0OworCisJLyogRmluZCBpbWFnZXMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gaW1hZ2VzX25vZmZzZXQ7CisJfQorCisJLyogUHJvY2VzcyBpdHMgc3Vibm9kZXMsIHByaW50IG91dCBjb21wb25lbnQgaW1hZ2VzIGRldGFpbHMgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlyZXQgPSBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAoZml0LCBub2Zmc2V0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9zZXRfaGFzaGVzIC0gY2FsY3VsYXRlL3NldCBoYXNoZXMgZm9yIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IHJlcXVlc3RlZCBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICoKKyAqIGZpdF9pbWFnZV9zZXRfaGFzaGVzKCkgYWRkcyBoYXNoIHZhbHVlcyBmb3IgYW4gY29tcG9uZW50IGltYWdlIG5vZGUuIEFsbAorICogZXhpc3RpbmcgaGFzaCBzdWJub2RlcyBhcmUgY2hlY2tlZCwgaWYgYWxnb3JpdGhtIHByb3BlcnR5IGlzIHNldCB0byBvbmUgb2YKKyAqIHRoZSBzdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG1zLCBoYXNoIHZhbHVlIGlzIGNvbXB1dGVkIGFuZCBjb3JyZXNwb25kaW5nCisgKiBoYXNoIG5vZGUgcHJvcGVydHkgaXMgc2V0LCBmb3IgZXhhbXBsZToKKyAqCisgKiBJbnB1dCBjb21wb25lbnQgaW1hZ2Ugbm9kZSBzdHJ1Y3R1cmU6CisgKgorICogbyBpbWFnZUAxIChhdCBpbWFnZV9ub2Zmc2V0KQorICogICB8IC0gZGF0YSA9IFtiaW5hcnkgZGF0YV0KKyAqICAgbyBoYXNoQDEKKyAqICAgICB8LSBhbGdvID0gInNoYTEiCisgKgorICogT3V0cHV0IGNvbXBvbmVudCBpbWFnZSBub2RlIHN0cnVjdHVyZToKKyAqCisgKiBvIGltYWdlQDEgKGF0IGltYWdlX25vZmZzZXQpCisgKiAgIHwgLSBkYXRhID0gW2JpbmFyeSBkYXRhXQorICogICBvIGhhc2hAMQorICogICAgIHwtIGFsZ28gPSAic2hhMSIKKyAqICAgICB8LSB2YWx1ZSA9IHNoYTEoZGF0YSkKKyAqCisgKiByZXR1cm5zOgorICogICAgIDAgb24gc3VjZXNzCisgKiAgICA8MCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAodm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCkKK3sKKwljb25zdCB2b2lkICpkYXRhOworCXNpemVfdCBzaXplOworCWNoYXIgKmFsZ287CisJdWludDhfdCB2YWx1ZVtGSVRfTUFYX0hBU0hfTEVOXTsKKwlpbnQgdmFsdWVfbGVuOworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisKKwkvKiBHZXQgaW1hZ2UgZGF0YSBhbmQgZGF0YSBsZW5ndGggKi8KKwlpZiAoZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZ2V0IGltYWdlIGRhdGEvc2l6ZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBoYXNoIHN1Ym5vZGVzIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCWZvciAobmRlcHRoID0gMCwgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb21wb25lbnQgaW1hZ2Ugbm9kZSAqLworCisJCQkvKgorCQkJICogQ2hlY2sgc3Vibm9kZSBuYW1lLCBtdXN0IGJlIGVxdWFsIHRvICJoYXNoIi4KKwkJCSAqIE11bHRpcGxlIGhhc2ggbm9kZXMgcmVxdWlyZSB1bmlxdWUgdW5pdCBub2RlCisJCQkgKiBuYW1lcywgZS5nLiBoYXNoQDEsIGhhc2hAMiwgZXRjLgorCQkJICovCisJCQlpZiAoc3RybmNtcCAoZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCQlGSVRfSEFTSF9OT0RFTkFNRSwKKwkJCQkJCXN0cmxlbihGSVRfSEFTSF9OT0RFTkFNRSkpICE9IDApIHsKKwkJCQkvKiBOb3QgYSBoYXNoIHN1Ym5vZGUsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQkJCXByaW50ZiAoIkNhbid0IGdldCBoYXNoIGFsZ28gcHJvcGVydHkgZm9yICIKKwkJCQkJIiclcycgaGFzaCBub2RlIGluICclcycgaW1hZ2Ugbm9kZVxuIiwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKGNhbGN1bGF0ZV9oYXNoIChkYXRhLCBzaXplLCBhbGdvLCB2YWx1ZSwgJnZhbHVlX2xlbikpIHsKKwkJCQlwcmludGYgKCJVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSAoJXMpIGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWFsZ28sIGZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgKGZpdCwgbm9mZnNldCwgdmFsdWUsCisJCQkJCQkJdmFsdWVfbGVuKSkgeworCQkJCXByaW50ZiAoIkNhbid0IHNldCBoYXNoIHZhbHVlIGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUgLSBzZXQgaGFzaCB2YWx1ZSBpbiByZXF1ZXN0ZWQgaGFzIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogaGFzaCBub2RlIG9mZnNldAorICogQHZhbHVlOiBoYXNoIHZhbHVlIHRvIGJlIHNldAorICogQHZhbHVlX2xlbjogaGFzaCB2YWx1ZSBsZW5ndGgKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9zZXRfdmFsdWUoKSBhdHRlbXB0cyB0byBzZXQgaGFzaCB2YWx1ZSBpbiBhIG5vZGUgYXQgb2Zmc2V0CisgKiBnaXZlbiBhbmQgcmV0dXJucyBvcGVyYXRpb24gc3RhdHVzIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJucworICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp2YWx1ZSwKKwkJCQlpbnQgdmFsdWVfbGVuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmZHRfc2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgdmFsdWUsIHZhbHVlX2xlbik7CisJaWYgKHJldCkgeworCQlwcmludGYgKCJDYW4ndCBzZXQgaGFzaCAnJXMnIHByb3BlcnR5IGZvciAnJXMnIG5vZGUgKCVzKVxuIiwKKwkJCUZJVF9WQUxVRV9QUk9QLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmZHRfc3RyZXJyb3IgKHJldCkpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19oYXNoZXMgLSB2ZXJpZnkgZGF0YSBpbnRlcmdpdHkKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAaW1hZ2Vfbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2ltYWdlX2NoZWNrX2hhc2hlcygpIGdvZXMgb3ZlciBjb21wb25lbnQgaW1hZ2UgaGFzaCBub2RlcywKKyAqIHJlLWNhbGN1bGF0ZXMgZWFjaCBkYXRhIGhhc2ggYW5kIGNvbXBhcmVzIHdpdGggdGhlIHZhbHVlIHN0b3JlZCBpbiBoYXNoCisgKiBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgaWYgYWxsIGhhc2hlcyBhcmUgdmFsaWQKKyAqICAgICAwLCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCkKK3sKKwljb25zdCB2b2lkCSpkYXRhOworCXNpemVfdAkJc2l6ZTsKKwljaGFyCQkqYWxnbzsKKwl1aW50OF90CQkqZml0X3ZhbHVlOworCWludAkJZml0X3ZhbHVlX2xlbjsKKwl1aW50OF90CQl2YWx1ZVtGSVRfTUFYX0hBU0hfTEVOXTsKKwlpbnQJCXZhbHVlX2xlbjsKKwlpbnQJCW5vZmZzZXQ7CisJaW50CQluZGVwdGg7CisJY2hhcgkJKmVycl9tc2cgPSAiIjsKKworCS8qIEdldCBpbWFnZSBkYXRhIGFuZCBkYXRhIGxlbmd0aCAqLworCWlmIChmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmRhdGEsICZzaXplKSkgeworCQlwcmludGYgKCJDYW4ndCBnZXQgaW1hZ2UgZGF0YS9zaXplXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKworCQkJLyoKKwkJCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJCQkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCQkJICogbmFtZXMsIGUuZy4gaGFzaEAxLCBoYXNoQDIsIGV0Yy4KKwkJCSAqLworCQkJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQlGSVRfSEFTSF9OT0RFTkFNRSwKKwkJCQkJc3RybGVuKEZJVF9IQVNIX05PREVOQU1FKSkgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF9hbGdvIChmaXQsIG5vZmZzZXQsICZhbGdvKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQ2FuJ3QgZ2V0IGhhc2ggYWxnbyAiCisJCQkJCQkicHJvcGVydHkiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlwcmludGYgKCIlcyIsIGFsZ28pOworCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsICZmaXRfdmFsdWUsCisJCQkJCQkJJmZpdF92YWx1ZV9sZW4pKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5DYW4ndCBnZXQgaGFzaCB2YWx1ZSAiCisJCQkJCQkicHJvcGVydHkiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmIChjYWxjdWxhdGVfaGFzaCAoZGF0YSwgc2l6ZSwgYWxnbywgdmFsdWUsICZ2YWx1ZV9sZW4pKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IhXG5VbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobSI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJaWYgKHZhbHVlX2xlbiAhPSBmaXRfdmFsdWVfbGVuKSB7CisJCQkJZXJyX21zZyA9ICIgZXJyb3IgIVxuQmFkIGhhc2ggdmFsdWUgbGVuIjsKKwkJCQlnb3RvIGVycm9yOworCQkJfSBlbHNlIGlmIChtZW1jbXAgKHZhbHVlLCBmaXRfdmFsdWUsIHZhbHVlX2xlbikgIT0gMCkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQmFkIGhhc2ggdmFsdWUiOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlwcmludGYgKCIrICIpOworCQl9CisJfQorCisJcmV0dXJuIDE7CisKK2Vycm9yOgorCXByaW50ZiAoIiVzIGZvciAnJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQllcnJfbXNnLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQlmaXRfZ2V0X25hbWUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgTlVMTCkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIC0gdmVyaWZ5IGRhdGEgaW50ZXJnaXR5IGZvciBhbGwgaW1hZ2VzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzKCkgZ29lcyBvdmVyIGFsbCBpbWFnZXMgaW4gdGhlIEZJVCBhbmQKKyAqIGZvciBldmVyeSBpbWFnZXMgY2hlY2tzIGlmIGFsbCBpdCdzIGhhc2hlcyBhcmUgdmFsaWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBpZiBhbGwgaGFzaGVzIG9mIGFsbCBpbWFnZXMgYXJlIHZhbGlkCisgKiAgICAgMCwgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQpCit7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IGNvdW50OworCisJLyogRmluZCBpbWFnZXMgcGFyZW50IG5vZGUgb2Zmc2V0ICovCisJaW1hZ2VzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0lNQUdFU19QQVRIKTsKKwlpZiAoaW1hZ2VzX25vZmZzZXQgPCAwKSB7CisJCXByaW50ZiAoIkNhbid0IGZpbmQgaW1hZ2VzIHBhcmVudCBub2RlICclcycgKCVzKVxuIiwKKwkJCUZJVF9JTUFHRVNfUEFUSCwgZmR0X3N0cmVycm9yIChpbWFnZXNfbm9mZnNldCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBpbWFnZSBzdWJub2RlcywgY2hlY2sgaGFzaGVzIGZvciBlYWNoICovCisJcHJpbnRmICgiIyMgQ2hlY2tpbmcgaGFzaChlcykgZm9yIEZJVCBJbWFnZSBhdCAlMDhseCAuLi5cbiIsCisJCSh1bG9uZylmaXQpOworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLAorCQlub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJCShub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkJbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGltYWdlcyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29tcG9uZW50IGltYWdlIG5vZGUuCisJCQkgKi8KKwkJCXByaW50ZiAoIiAgIEhhc2goZXMpIGZvciBJbWFnZSAldSAoJXMpOiAiLCBjb3VudCsrLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgbm9mZnNldCkpCisJCQkJcmV0dXJuIDA7CisJCQlwcmludGYgKCJcbiIpOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19vcyAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIG9zIHR5cGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAb3M6IHJlcXVlc3RlZCBpbWFnZSBvcworICoKKyAqIGZpdF9pbWFnZV9jaGVja19vcygpIHJlYWRzIGltYWdlIG9zIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMgbnVtZXJpYworICogaWQgd2l0aCB0aGUgcmVxdWVzdGVkIG9zLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiBvcyB0eXBlCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IG9zKQoreworCXVpbnQ4X3QgaW1hZ2Vfb3M7CisKKwlpZiAoZml0X2ltYWdlX2dldF9vcyAoZml0LCBub2Zmc2V0LCAmaW1hZ2Vfb3MpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKG9zID09IGltYWdlX29zKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfYXJjaCAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIGFyY2gKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAYXJjaDogcmVxdWVzdGVkIGltYWdlYXJjaAorICoKKyAqIGZpdF9pbWFnZV9jaGVja19hcmNoKCkgcmVhZHMgaW1hZ2UgYXJjaCBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBhcmNoLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiBhcmNoCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgYXJjaCkKK3sKKwl1aW50OF90IGltYWdlX2FyY2g7CisKKwlpZiAoZml0X2ltYWdlX2dldF9hcmNoIChmaXQsIG5vZmZzZXQsICZpbWFnZV9hcmNoKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChhcmNoID09IGltYWdlX2FyY2gpOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja190eXBlIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIGlzIG9mIGEgZ2l2ZW4gdHlwZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEB0eXBlOiByZXF1ZXN0ZWQgaW1hZ2UgdHlwZQorICoKKyAqIGZpdF9pbWFnZV9jaGVja190eXBlKCkgcmVhZHMgaW1hZ2UgdHlwZSBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCB0eXBlLiBDb21wYXJpc29uIHJlc3VsdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSBpcyBvZiBnaXZlbiB0eXBlCisgKiAgICAgMCBvdGhlcndpc2UgKG9yIG9uIGVycm9yKQorICovCitpbnQgZml0X2ltYWdlX2NoZWNrX3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgdHlwZSkKK3sKKwl1aW50OF90IGltYWdlX3R5cGU7CisKKwlpZiAoZml0X2ltYWdlX2dldF90eXBlIChmaXQsIG5vZmZzZXQsICZpbWFnZV90eXBlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICh0eXBlID09IGltYWdlX3R5cGUpOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9jaGVja19jb21wIC0gY2hlY2sgd2hldGhlciBpbWFnZSBub2RlIHVzZXMgZ2l2ZW4gY29tcHJlc3Npb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAY29tcDogcmVxdWVzdGVkIGltYWdlIGNvbXByZXNzaW9uIHR5cGUKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfY29tcCgpIHJlYWRzIGltYWdlIGNvbXByZXNzaW9uIHByb3BlcnR5IGFuZCBjb21wYXJlcyBpdHMKKyAqIG51bWVyaWMgaWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbXByZXNzaW9uIHR5cGUuIENvbXBhcmlzb24gcmVzdWx0IGlzCisgKiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSBpZiBpbWFnZSB1c2VzIHJlcXVlc3RlZCBjb21wcmVzc2lvbgorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGNvbXApCit7CisJdWludDhfdCBpbWFnZV9jb21wOworCisJaWYgKGZpdF9pbWFnZV9nZXRfY29tcCAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfY29tcCkpCisJCXJldHVybiAwOworCXJldHVybiAoY29tcCA9PSBpbWFnZV9jb21wKTsKK30KKworLyoqCisgKiBmaXRfY2hlY2tfZm9ybWF0IC0gc2FuaXR5IGNoZWNrIEZJVCBpbWFnZSBmb3JtYXQKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKgorICogZml0X2NoZWNrX2Zvcm1hdCgpIHJ1bnMgYSBiYXNpYyBzYW5pdHkgRklUIGltYWdlIHZlcmlmaWNhdGlvbi4KKyAqIFJvdXRpbmUgY2hlY2tzIGZvciBtYW5kYXRvcnkgcHJvcGVydGllcywgbm9kZXMsIGV0Yy4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfY2hlY2tfZm9ybWF0IChjb25zdCB2b2lkICpmaXQpCit7CisJLyogbWFuZGF0b3J5IC8gbm9kZSAnZGVzY3JpcHRpb24nIHByb3BlcnR5ICovCisJaWYgKGZkdF9nZXRwcm9wIChmaXQsIDAsIEZJVF9ERVNDX1BST1AsIE5VTEwpID09IE5VTEwpIHsKKwkJZGVidWcgKCJXcm9uZyBGSVQgZm9ybWF0OiBubyBkZXNjcmlwdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwkvKiBtYW5kYXRvcnkgLyBub2RlICd0aW1lc3RhbXAnIHByb3BlcnR5ICovCisJaWYgKGZkdF9nZXRwcm9wIChmaXQsIDAsIEZJVF9USU1FU1RBTVBfUFJPUCwgTlVMTCkgPT0gTlVMTCkgeworCQlkZWJ1ZyAoIldyb25nIEZJVCBmb3JtYXQ6IG5vIHRpbWVzdGFtcFxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJLyogbWFuZGF0b3J5IHN1YmltYWdlcyBwYXJlbnQgJy9pbWFnZXMnIG5vZGUgKi8KKwlpZiAoZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCkgPCAwKSB7CisJCWRlYnVnICgiV3JvbmcgRklUIGZvcm1hdDogbm8gaW1hZ2VzIHBhcmVudCBub2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X25vZGUgLSBnZXQgbm9kZSBvZmZzZXQgZm9yIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB1bml0IG5hbWUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAY29uZl91bmFtZTogY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZQorICoKKyAqIGZpdF9jb25mX2dldF9ub2RlKCkgZmluZHMgYSBjb25maWd1cmF0aW9uICh3aXRoaW5nIHRoZSAnL2NvbmZpZ3VyYXRpb25zJworICogcGFyYW50IG5vZGUpIG9mIGEgcHJvdmlkZWQgdW5pdCBuYW1lLiBJZiBjb25maWd1cmF0aW9uIGlzIGZvdW5kIGl0cyBub2RlIG9mZnNldAorICogaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBXaGVuIE5VTEwgaXMgcHJvdmlkZWQgaW4gc2Vjb25kIGFyZ3VtZW50IGZpdF9jb25mX2dldF9ub2RlKCkgd2lsbCBzZWFyY2gKKyAqIGZvciBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBub2RlIGluc3RlYWQuIERlZmF1bHQgY29uZmlndXJhdGlvbiBub2RlIHVuaXQgbmFtZQorICogaXMgcmV0cml2ZWQgZnJvbSBGSVRfREVGQVVMVF9QUk9QIHByb3BlcnR5IG9mIHRoZSAnL2NvbmZpZ3VyYXRpb25zJyBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgY29uZmlndXJhdGlvbiBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgY29uc3QgY2hhciAqY29uZl91bmFtZSkKK3sKKwlpbnQgbm9mZnNldCwgY29uZnNfbm9mZnNldDsKKwlpbnQgbGVuOworCisJY29uZnNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfQ09ORlNfUEFUSCk7CisJaWYgKGNvbmZzX25vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZmluZCBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfQ09ORlNfUEFUSCwgZmR0X3N0cmVycm9yIChjb25mc19ub2Zmc2V0KSk7CisJCXJldHVybiBjb25mc19ub2Zmc2V0OworCX0KKworCWlmIChjb25mX3VuYW1lID09IE5VTEwpIHsKKwkJLyogZ2V0IGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lIGZyb20gdGhlIGRlZmF1bHQgcHJvcGVydHkgKi8KKwkJZGVidWcgKCJObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZCwgdHJ5aW5nIGRlZmF1bHQuLi5cbiIpOworCQljb25mX3VuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBjb25mc19ub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCAmbGVuKTsKKwkJaWYgKGNvbmZfdW5hbWUgPT0gTlVMTCkgeworCQkJZml0X2dldF9kZWJ1ZyAoZml0LCBjb25mc19ub2Zmc2V0LCBGSVRfREVGQVVMVF9QUk9QLCBsZW4pOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCQlkZWJ1ZyAoIkZvdW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbjogJyVzJ1xuIiwgY29uZl91bmFtZSk7CisJfQorCisJbm9mZnNldCA9IGZkdF9zdWJub2RlX29mZnNldCAoZml0LCBjb25mc19ub2Zmc2V0LCBjb25mX3VuYW1lKTsKKwlpZiAobm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBnZXQgbm9kZSBvZmZzZXQgZm9yIGNvbmZpZ3VyYXRpb24gdW5pdCBuYW1lOiAnJXMnICglcylcbiIsCisJCQljb25mX3VuYW1lLCBmZHRfc3RyZXJyb3IgKG5vZmZzZXQpKTsKKwl9CisKKwlyZXR1cm4gbm9mZnNldDsKK30KKworc3RhdGljIGludCBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNvbnN0IGNoYXIgKnByb3BfbmFtZSkKK3sKKwljaGFyICp1bmFtZTsKKwlpbnQgbGVuOworCisJLyogZ2V0IGtlcm5lbCBpbWFnZSB1bml0IG5hbWUgZnJvbSBjb25maWd1cmF0aW9uIGtlcm5lbCBwcm9wZXJ0eSAqLworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBwcm9wX25hbWUsICZsZW4pOworCWlmICh1bmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCisJcmV0dXJuIGZpdF9pbWFnZV9nZXRfbm9kZSAoZml0LCB1bmFtZSk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X2tlcm5lbF9ub2RlIC0gZ2V0IGtlcm5lbCBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSgpIHJldHJpdmVzIGtlcm5lbCBpbWFnZSBub2RlIHVuaXQgbmFtZSBmcm9tCisgKiBjb25maWd1cmF0aW9uIEZJVF9LRVJORUxfUFJPUCBwcm9wZXJ0eSBhbmQgdHJhbnNsYXRlcyBpdCB0byB0aGUgbm9kZQorICogb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9LRVJORUxfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAtIGdldCByYW1kaXNrIGltYWdlIG5vZGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8KKyAqIGEgZ2l2ZW4gY29uZmlndXJhdGlvbgorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb25maWd1cmF0aW9uIG5vZGUgb2Zmc2V0CisgKgorICogZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSgpIHJldHJpdmVzIHJhbWRpc2sgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfcmFtZGlza19ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KQoreworCXJldHVybiBfX2ZpdF9jb25mX2dldF9wcm9wX25vZGUgKGZpdCwgbm9mZnNldCwgRklUX1JBTURJU0tfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIC0gZ2V0IGZkdCBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9mZHRfbm9kZSgpIHJldHJpdmVzIGZkdCBpbWFnZSBub2RlIHVuaXQgbmFtZSBmcm9tCisgKiBjb25maWd1cmF0aW9uIEZJVF9LRVJORUxfUFJPUCBwcm9wZXJ0eSBhbmQgdHJhbnNsYXRlcyBpdCB0byB0aGUgbm9kZQorICogb2Zmc2V0LgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9mZHRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9GRFRfUFJPUCk7Cit9CisKKy8qKgorICogZml0X2NvbmZfcHJpbnQgLSBwcmludHMgb3V0IHRoZSBGSVQgY29uZmlndXJhdGlvbiBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG9mZnNldCBvZiB0aGUgY29uZmlndXJhdGlvbiBub2RlCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X2NvbmZfcHJpbnQoKSBsaXN0cyBhbGwgbWFuZGF0b3J5IHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZAorICogY29uZmlndXJhdGlvbiBub2RlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9jb25mX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmRlc2M7CisJY2hhciAqdW5hbWU7CisJaW50IHJldDsKKworCS8qIE1hbmRhdG9yeSBwcm9wZXJ0aWVzICovCisJcmV0ID0gZml0X2dldF9kZXNjIChmaXQsIG5vZmZzZXQsICZkZXNjKTsKKwlwcmludGYgKCIlcyAgRGVzY3JpcHRpb246ICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0tFUk5FTF9QUk9QLCBOVUxMKTsKKwlwcmludGYgKCIlcyAgS2VybmVsOiAgICAgICAiLCBwKTsKKwlpZiAodW5hbWUgPT0gTlVMTCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIHVuYW1lKTsKKworCS8qIE9wdGlvbmFsIHByb3BlcnRpZXMgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1JBTURJU0tfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyAgSW5pdCBSYW1kaXNrOiAlc1xuIiwgcCwgdW5hbWUpOworCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9GRFRfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyAgRkRUOiAgICAgICAgICAlc1xuIiwgcCwgdW5hbWUpOworfQorCisvKioKKyAqIGZpdF9jaGVja19yYW1kaXNrIC0gdmVyaWZ5IEZJVCBmb3JtYXQgcmFtZGlzayBzdWJpbWFnZQorICogQGZpdF9oZHI6IHBvaW50ZXIgdG8gdGhlIEZJVCByYW1kaXNrIGhlYWRlcgorICogQHJkX25vZmZzZXQ6IHJhbWRpc2sgc3ViaW1hZ2Ugbm9kZSBvZmZzZXQgd2l0aGluIEZJVCBpbWFnZQorICogQGFyY2g6IHJlcXVlc3RlZCByYW1kaXNrIGltYWdlIGFyY2hpdGVjdHVyZSB0eXBlCisgKiBAdmVyaWZ5OiBkYXRhIENSQyB2ZXJpZmljYXRpb24gZmxhZworICoKKyAqIGZpdF9jaGVja19yYW1kaXNrKCkgdmVyaWZpZXMgaW50ZWdyaXR5IG9mIHRoZSByYW1kaXNrIHN1YmltYWdlIGFuZCBmcm9tCisgKiBzcGVjaWZpZWQgRklUIGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgb24gc3VjY2VzcworICogICAgIDAsIG9uIGZhaWx1cmUKKyAqLworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW50IGZpdF9jaGVja19yYW1kaXNrIChjb25zdCB2b2lkICpmaXQsIGludCByZF9ub2Zmc2V0LCB1aW50OF90IGFyY2gsIGludCB2ZXJpZnkpCit7CisJZml0X2ltYWdlX3ByaW50IChmaXQsIHJkX25vZmZzZXQsICIgICAiKTsKKworCWlmICh2ZXJpZnkpIHsKKwkJcHV0cyAoIiAgIFZlcmlmeWluZyBIYXNoIEludGVncml0eSAuLi4gIik7CisJCWlmICghZml0X2ltYWdlX2NoZWNrX2hhc2hlcyAoZml0LCByZF9ub2Zmc2V0KSkgeworCQkJcHV0cyAoIkJhZCBEYXRhIEhhc2hcbiIpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTI1KTsKKwkJCXJldHVybiAwOworCQl9CisJCXB1dHMgKCJPS1xuIik7CisJfQorCisJc2hvd19ib290X3Byb2dyZXNzICgxMjYpOworCWlmICghZml0X2ltYWdlX2NoZWNrX29zIChmaXQsIHJkX25vZmZzZXQsIElIX09TX0xJTlVYKSB8fAorCSAgICAhZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZpdCwgcmRfbm9mZnNldCwgYXJjaCkgfHwKKwkgICAgIWZpdF9pbWFnZV9jaGVja190eXBlIChmaXQsIHJkX25vZmZzZXQsIElIX1RZUEVfUkFNRElTSykpIHsKKwkJcHJpbnRmICgiTm8gTGludXggJXMgUmFtZGlzayBJbWFnZVxuIiwKKwkJCQlnZW5pbWdfZ2V0X2FyY2hfbmFtZShhcmNoKSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyNik7CisJCXJldHVybiAwOworCX0KKworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTI3KTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29tbW9uL21haW4uYyBiL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNzg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBBZGQgdG8gcmVhZGxpbmUgY21kbGluZS1lZGl0aW5nIGJ5CisgKiAoQykgQ29weXJpZ2h0IDIwMDUKKyAqIEppbkh1YSBMdW8sIEd1YW5nRG9uZyBMaW51eCBDZW50ZXIsIDxsdW8uamluaHVhQGdkLWxpbnV4LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiAjZGVmaW5lCURFQlVHCSovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgaW5saW5lIF9fc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSB7fQordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3Nob3dfYm9vdF9wcm9ncmVzcyIpKSk7CmRpZmYgLS1naXQgYS94LWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MGM2MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDI1NCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitpZmVxICgkKENVUkRJUiksJChTUkNUUkVFKSkKK2RpciA6PQorZWxzZQorZGlyIDo9ICQoc3Vic3QgJChTUkNUUkVFKS8sLCQoQ1VSRElSKSkKK2VuZGlmCisKK29iaiA6PSAkKGlmICQoZGlyKSwkKE9CSlRSRUUpLyQoZGlyKS8sJChPQkpUUkVFKS8pCitzcmMgOj0gJChpZiAkKGRpciksJChTUkNUUkVFKS8kKGRpcikvLCQoU1JDVFJFRSkvKQorCiskKHNoZWxsIG1rZGlyIC1wICQob2JqKSkKK2Vsc2UKK29iaiA6PQorc3JjIDo9CitlbmRpZgorCisjIGNsZWFuIHRoZSBzbGF0ZSAuLi4KK1BMQVRGT1JNX1JFTEZMQUdTID0KK1BMQVRGT1JNX0NQUEZMQUdTID0KK1BMQVRGT1JNX0xERkxBR1MgPQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0hPU1RDRkxBR1MJPSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJCSAgJChIT1NUQ1BQRkxBR1MpCitIT1NUU1RSSVAJPSBzdHJpcAorCisjCisjIE1hYyBPUyBYIC8gRGFyd2luJ3MgQyBwcmVwcm9jZXNzb3IgaXMgQXBwbGUgc3BlY2lmaWMuICBJdAorIyBnZW5lcmF0ZXMgbnVtZXJvdXMgZXJyb3JzIGFuZCB3YXJuaW5ncy4gIFdlIHdhbnQgdG8gYnlwYXNzIGl0CisjIGFuZCB1c2UgR05VIEMncyBjcHAuICBUbyBkbyB0aGlzIHdlIHBhc3MgdGhlIC10cmFkaXRpb25hbC1jcHAKKyMgb3B0aW9uIHRvIHRoZSBjb21waWxlci4gIE5vdGUgdGhhdCB0aGUgLXRyYWRpdGlvbmFsLWNwcCBmbGFnCisjIERPRVMgTk9UIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIEdOVSBDJ3MgZmxhZywgYWxsIGl0IGRvZXMKKyMgaXMgaW52b2tlIHRoZSBHTlUgcHJlcHJvY2Vzc29yIGluIHN0b2NrIEFOU0kvSVNPIEMgZmFzaGlvbi4KKyMKKyMgQXBwbGUncyBsaW5rZXIgaXMgc2ltaWxhciwgdGhhbmtzIHRvIHRoZSBuZXcgMiBzdGFnZSBsaW5raW5nCisjIG11bHRpcGxlIHN5bWJvbCBkZWZpbml0aW9ucyBhcmUgdHJlYXRlZCBhcyBlcnJvcnMsIGhlbmNlIHRoZQorIyAtbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcyBvcHRpb24gdG8gdHVybiBvZmYgdGhpcyBlcnJvci4KKyMKKworaWZlcSAoJChIT1NUT1MpLGRhcndpbikKKyMgZ2V0IG1ham9yIGFuZCBtaW5vciBwcm9kdWN0IHZlcnNpb24gKGUuZy4gJzEwJyBhbmQgJzYnIGZvciBTbm93IExlb3BhcmQpCitEQVJXSU5fTUFKT1JfVkVSU0lPTgk9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBjdXQgLWYgMSAtZCAnLicpCitEQVJXSU5fTUlOT1JfVkVSU0lPTgk9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBjdXQgLWYgMiAtZCAnLicpCisKK29zX3hfYmVmb3JlCT0gJChzaGVsbCBpZiBbICQoREFSV0lOX01BSk9SX1ZFUlNJT04pIC1sZSAkKDEpIC1hIFwKKwkkKERBUldJTl9NSU5PUl9WRVJTSU9OKSAtbGUgJCgyKSBdIDsgdGhlbiBlY2hvICIkKDMpIjsgZWxzZSBlY2hvICIkKDQpIjsgZmkgOykKKworIyBTbm93IExlb3BhcmRzIGJ1aWxkIGVudmlyb25tZW50IGhhcyBubyBsb25nZXIgcmVzdHJpY3Rpb25zIGFzIGRlc2NyaWJlZCBhYm92ZQorSE9TVENDCQkgPSAkKGNhbGwgb3NfeF9iZWZvcmUsIDEwLCA1LCAiY2MiLCAiZ2NjIikKK0hPU1RDRkxBR1MJKz0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNCwgIi10cmFkaXRpb25hbC1jcHAiKQorSE9TVExERkxBR1MJKz0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNSwgIi1tdWx0aXBseV9kZWZpbmVkIHN1cHByZXNzIikKK2Vsc2UKK0hPU1RDQwkJPSBnY2MKK2VuZGlmCisKK2lmZXEgKCQoSE9TVE9TKSxjeWd3aW4pCitIT1NUQ0ZMQUdTCSs9IC1hbnNpCitlbmRpZgorCisjIFdlIGJ1aWxkIHNvbWUgZmlsZXMgd2l0aCBleHRyYSBwZWRhbnRpYyBmbGFncyB0byB0cnkgdG8gbWluaW1pemUgdGhpbmdzCisjIHRoYXQgd29uJ3QgYnVpbGQgb24gc29tZSB3ZWlyZCBob3N0IGNvbXBpbGVyIC0tIHRob3VnaCB0aGVyZSBhcmUgbG90cyBvZgorIyBleGNlcHRpb25zIGZvciBmaWxlcyB0aGF0IGFyZW4ndCBjb21wbGFpbnQuCisKK0hPU1RDRkxBR1NfTk9QRUQgPSAkKGZpbHRlci1vdXQgLXBlZGFudGljLCQoSE9TVENGTEFHUykpCitIT1NUQ0ZMQUdTCSs9IC1wZWRhbnRpYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9wdGlvbiBjaGVja2VyIChjb3VydGVzeSBsaW51eCBrZXJuZWwpIHRvIGVuc3VyZQorIyBvbmx5IHN1cHBvcnRlZCBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkCisjCitjYy1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKKwkJPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgZWxzZSBlY2hvICIkKDIpIjsgZmkgOykKKworIworIyBJbmNsdWRlIHRoZSBtYWtlIHZhcmlhYmxlcyAoQ0MsIGV0Yy4uLikKKyMKK0FTCT0gJChDUk9TU19DT01QSUxFKWFzCitMRAk9ICQoQ1JPU1NfQ09NUElMRSlsZAorQ0MJPSAkKENST1NTX0NPTVBJTEUpZ2NjCitDUFAJPSAkKENDKSAtRQorQVIJPSAkKENST1NTX0NPTVBJTEUpYXIKK05NCT0gJChDUk9TU19DT01QSUxFKW5tCitTVFJJUAk9ICQoQ1JPU1NfQ09NUElMRSlzdHJpcAorT0JKQ09QWSA9ICQoQ1JPU1NfQ09NUElMRSlvYmpjb3B5CitPQkpEVU1QID0gJChDUk9TU19DT01QSUxFKW9iamR1bXAKK1JBTkxJQgk9ICQoQ1JPU1NfQ09NUElMRSlSQU5MSUIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIExvYWQgZ2VuZXJhdGVkIGJvYXJkIGNvbmZpZ3VyYXRpb24KK3NpbmNsdWRlICQoT0JKVFJFRSkvaW5jbHVkZS9hdXRvY29uZi5taworCisjIFNvbWUgYXJjaGl0ZWN0dXJlIGNvbmZpZy5tayBmaWxlcyBuZWVkIHRvIGtub3cgd2hhdCBDUFVESVIgaXMgc2V0IHRvLAorIyBzbyBjYWxjdWxhdGUgQ1BVRElSIGJlZm9yZSBpbmNsdWRpbmcgQVJDSC9TT0MvQ1BVIGNvbmZpZy5tayBmaWxlcy4KKyMgQ2hlY2sgaWYgYXJjaC8kQVJDSC9jcHUvJENQVSBleGlzdHMsIG90aGVyd2lzZSBhc3N1bWUgYXJjaC8kQVJDSC9jcHUgY29udGFpbnMKKyMgQ1BVLXNwZWNpZmljIGNvZGUuCitDUFVESVI9Y3B1LyQoQ1BVKQoraWZuZXEgKCQoU1JDVFJFRSkvJChDUFVESVIpLCQod2lsZGNhcmQgJChTUkNUUkVFKS8kKENQVURJUikpKQorQ1BVRElSPWNwdQorZW5kaWYKKworc2luY2x1ZGUgJChUT1BESVIpLyQoQVJDSClfY29uZmlnLm1rCQkjIGluY2x1ZGUgYXJjaGl0ZWN0dXJlIGRlcGVuZGVuZCBydWxlcworc2luY2x1ZGUgJChUT1BESVIpLyQoQ1BVRElSKS9jb25maWcubWsJCSMgaW5jbHVkZSAgQ1BVCXNwZWNpZmljIHJ1bGVzCisKK2lmZGVmCVNPQworc2luY2x1ZGUgJChUT1BESVIpLyQoQ1BVRElSKS8kKFNPQykvY29uZmlnLm1rCSMgaW5jbHVkZSAgU29DCXNwZWNpZmljIHJ1bGVzCitlbmRpZgoraWZkZWYJVkVORE9SCitCT0FSRERJUiA9ICQoVkVORE9SKS8kKEJPQVJEKQorZWxzZQorQk9BUkRESVIgPSAkKEJPQVJEKQorZW5kaWYKK2lmZGVmCUJPQVJECitzaW5jbHVkZSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikvY29uZmlnLm1rCSMgaW5jbHVkZSBib2FyZCBzcGVjaWZpYyBydWxlcworZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5lcSAoLCQoZmluZHN0cmluZyBzLCQoTUFLRUZMQUdTKSkpCitBUkZMQUdTID0gY3IKK2Vsc2UKK0FSRkxBR1MgPSBjcnYKK2VuZGlmCitSRUxGTEFHUz0gJChQTEFURk9STV9SRUxGTEFHUykKK0RCR0ZMQUdTPSAtZyAjIC1EREVCVUcKK09QVEZMQUdTPSAtT3MgIy1mb21pdC1mcmFtZS1wb2ludGVyCitpZm5kZWYgTERTQ1JJUFQKKyNMRFNDUklQVCA6PSAkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikveC1sb2FkLmxkcy5kZWJ1ZworTERTQ1JJUFQgOj0gJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL3gtbG9hZC5sZHMKK2VuZGlmCitPQkpDRkxBR1MgKz0gLS1nYXAtZmlsbD0weGZmCisKK2djY2luY2RpciA6PSAkKHNoZWxsICQoQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKKworQ1BQRkxBR1MgOj0gJChEQkdGTEFHUykgJChPUFRGTEFHUykgJChSRUxGTEFHUykJCVwKKwktRF9fS0VSTkVMX18KK2lmbmVxICgkKFRFWFRfQkFTRSksKQorQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpCitlbmRpZgorCitpZm5lcSAoJChTVEFDS19CQVNFKSwpCitDUFBGTEFHUyArPSAtRFNUQUNLX0JBU0U9JChTVEFDS19CQVNFKQorZW5kaWYKKworaWZuZXEgKCQoUkVTRVRfVkVDVE9SX0FERFJFU1MpLCkKK0NQUEZMQUdTICs9IC1EUkVTRVRfVkVDVE9SX0FERFJFU1M9JChSRVNFVF9WRUNUT1JfQUREUkVTUykKK2VuZGlmCisKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCitDUFBGTEFHUyArPSAtSSQoT0JKVFJFRSkvaW5jbHVkZTIgLUkkKE9CSlRSRUUpL2luY2x1ZGUKK2VuZGlmCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2luY2x1ZGUKK0NQUEZMQUdTICs9IC1mbm8tYnVpbHRpbiAtZmZyZWVzdGFuZGluZyAtbm9zdGRpbmMJXAorCS1pc3lzdGVtICQoZ2NjaW5jZGlyKSAtcGlwZSAkKFBMQVRGT1JNX0NQUEZMQUdTKQorCitpZmRlZiBCVUlMRF9UQUcKK0NGTEFHUyA6PSAkKENQUEZMQUdTKSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIFwKKwktREJVSUxEX1RBRz0nIiQoQlVJTERfVEFHKSInCitlbHNlCitDRkxBR1MgOj0gJChDUFBGTEFHUykgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcworZW5kaWYKKworQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1zdGFjay1wcm90ZWN0b3IpCisKKyMgJChDUFBGTEFHUykgc2V0cyAtZywgd2hpY2ggY2F1c2VzIGdjYyB0byBwYXNzIGEgc3VpdGFibGUgLWc8Zm9ybWF0PgorIyBvcHRpb24gdG8gdGhlIGFzc2VtYmxlci4KK0FGTEFHU19ERUJVRyA6PQorCitBRkxBR1NfREVCVUcgOj0gLVdhLC1nc3RhYnMKK0FGTEFHUyA6PSAkKEFGTEFHU19ERUJVRykgLURfX0FTU0VNQkxZX18gJChDUFBGTEFHUykKKworTERGTEFHUyArPSAtQnN0YXRpYyAtVCAkKG9iail4LWxvYWQubGRzICQoUExBVEZPUk1fTERGTEFHUykKK2lmbmVxICgkKFRFWFRfQkFTRSksKQorTERGTEFHUyArPSAtVHRleHQgJChURVhUX0JBU0UpCitlbmRpZgorCisjIExvY2F0aW9uIG9mIGEgdXNhYmxlIEJGRCBsaWJyYXJ5LCB3aGVyZSB3ZSBkZWZpbmUgInVzYWJsZSIgYXMKKyMgImJ1aWx0IGZvciAke0hPU1R9LCBzdXBwb3J0cyAke1RBUkdFVH0iLiAgU2Vuc2libGUgdmFsdWVzIGFyZQorIyAtIFdoZW4gY3Jvc3MtY29tcGlsaW5nOiB0aGUgcm9vdCBvZiB0aGUgY3Jvc3MtZW52aXJvbm1lbnQKKyMgLSBMaW51eC9wcGMgKG5hdGl2ZSk6IC91c3IKKyMgLSBOZXRCU0QvcHBjIChuYXRpdmUpOiB5b3UgbG9zZSAuLi4gKG11c3QgZXh0cmFjdCB0aGVzZSBmcm9tIHRoZQorIyAgIGJpbnV0aWxzIGJ1aWxkIGRpcmVjdG9yeSwgcGx1cyB0aGUgbmF0aXZlIGFuZCBVLUJvb3QgaW5jbHVkZQorIyAgIGZpbGVzIGRvbid0IGxpa2UgZWFjaCBvdGhlcikKKyMKKyMgU28gZmFyLCB0aGlzIGlzIHVzZWQgb25seSBieSB0b29scy9nZGIvTWFrZWZpbGUuCisKK2lmZXEgKCQoSE9TVE9TKSxkYXJ3aW4pCitCRkRfUk9PVF9ESVIgPQkJL3Vzci9sb2NhbC90b29scworZWxzZQoraWZlcSAoJChIT1NUQVJDSCksJChBUkNIKSkKKyMgbmF0aXZlCitCRkRfUk9PVF9ESVIgPQkJL3VzcgorZWxzZQorI0JGRF9ST09UX0RJUiA9CQkvTGludXhQUEMvQ0RLCQkjIExpbnV4L2kzODYKKyNCRkRfUk9PVF9ESVIgPQkJL3Vzci9wa2cvY3Jvc3MJCSMgTmV0QlNEL2kzODYKK0JGRF9ST09UX0RJUiA9CQkvb3B0L3Bvd2VycGMKK2VuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2V4cG9ydAlIT1NUQ0MgSE9TVENGTEFHUyBIT1NUTERGTEFHUyBQRURDRkxBR1MgSE9TVFNUUklQIENST1NTX0NPTVBJTEUgXAorCUFTIExEIENDIENQUCBBUiBOTSBTVFJJUCBPQkpDT1BZIE9CSkRVTVAgTUFLRQorZXhwb3J0CVRFWFRfQkFTRSBQTEFURk9STV9DUFBGTEFHUyBQTEFURk9STV9SRUxGTEFHUyBDUFBGTEFHUyBDRkxBR1MgQUZMQUdTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBbGxvdyBib2FyZHMgdG8gdXNlIGN1c3RvbSBvcHRpbWl6ZSBmbGFncyBvbiBhIHBlciBkaXIvZmlsZSBiYXNpcworQkNVUkRJUiA9ICQoc3Vic3QgJChTUkNUUkVFKS8sLCQoQ1VSRElSOiQob2JqKSU9JSkpCiskKG9iaiklLnM6CSUuUworCSQoQ1BQKSAkKEFGTEFHUykgJChBRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChBRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPAorJChvYmopJS5vOgklLlMKKwkkKENDKSAgJChBRkxBR1MpICQoQUZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQUZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMKKyQob2JqKSUubzoJJS5jCisJJChDQykgICQoQ0ZMQUdTKSAkKENGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKENGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jCiskKG9iaiklLmk6CSUuYworCSQoQ1BQKSAkKENGTEFHUykgJChDRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChDRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYworJChvYmopJS5zOgklLmMKKwkkKENDKSAgJChDRkxBR1MpICQoQ0ZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQ0ZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMgLVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEzNGFjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gY3B1Lm8KKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA2ODI0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZm5vLWNvbW1vbiAtZmZpeGVkLXI4CisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1tYXJjaD1hcm12NQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFN1cHBseSBvcHRpb25zIGFjY29yZGluZyB0byBjb21waWxlciB2ZXJzaW9uCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbWFwY3MtMzIsLW1hYmk9YXBjcy1nbnUpCitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1uby10aHVtYi1pbnRlcndvcmssKQorUExBVEZPUk1fUkVMRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpCisjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjhmYjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3R1cm1lbnRzCisgKgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiB1ZGVsYXkoKSBpcyBDUFUgc3BlY2lmaWMgY29kZQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyogU2VlIGFsc28gQVJNIFJlZi4gTWFuLiAqLworI2RlZmluZSBDMV9NTVUJCSgxPDwwKQkJLyogbW11IG9mZi9vbiAqLworI2RlZmluZSBDMV9BTElHTgkoMTw8MSkJCS8qIGFsaWdubWVudCBmYXVsdHMgb2ZmL29uICovCisjZGVmaW5lIEMxX0RDCQkoMTw8MikJCS8qIGRjYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfV0IJCSgxPDwzKQkJLyogbWVyZ2luZyB3cml0ZSBidWZmZXIgb24vb2ZmICovCisjZGVmaW5lIEMxX0JJR19FTkRJQU4JKDE8PDcpCS8qIGJpZyBlbmRpYW4gb2ZmL29uICovCisjZGVmaW5lIEMxX1NZU19QUk9UCSgxPDw4KQkJLyogc3lzdGVtIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfUk9NX1BST1QJKDE8PDkpCQkvKiBST00gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9JQwkJKDE8PDEyKQkJLyogaWNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9ISUdIX1ZFQ1RPUlMJKDE8PDEzKQkvKiBsb2NhdGlvbiBvZiB2ZWN0b3JzOiBsb3cvaGlnaCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUkVTRVJWRURfMQkoMHhmIDw8IDMpCS8qIG11c3QgYmUgMTExYiBmb3IgUi9XICovCisKK2ludCBjcHVfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIHR1cm4gb2ZmIEkvRC1jYWNoZSAqLworCWFzbSAoIm1yYyBwMTUsIDAsICUwLCBjMSwgYzAsIDAiOiI9ciIgKGkpKTsKKwlpICY9IH4oQzFfREMgfCBDMV9JQyk7CisJYXNtICgibWNyIHAxNSwgMCwgJTAsIGMxLCBjMCwgMCI6IDoiciIgKGkpKTsKKworCS8qIGZsdXNoIEkvRC1jYWNoZSAqLworCWkgPSAwOworCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjNywgYzcsIDAiOiA6InIiIChpKSk7ICAvLyBpbnZhbGlkYXRlIGJvdGggY2FjaGVzIGFuZCBmbHVzaCBidGIKKwlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGMxMCwgNCI6IDoiciIgKGkpKTsgLy8gbWVtIGJhcnJpZXIgdG8gc3luYyB0aGluZ3MKKworCXJldHVybiAwOworfQorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTA4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE9NUDI0MjAvQVJNMTEzNiBDUFUtY29yZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQgIFRleGFzIEluc3RydW1lbnRzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMQlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdqQGRlbnguZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCVJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CUppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CQorCWIJcmVzZXQKKyAJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCitfaGFuZzoKKyAJLndvcmQgZG9faGFuZworCQorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzggLyogbm93IDE2KjQ9NjQgKi8KKworLmdsb2JhbCBfZW5kX3ZlY3QKK19lbmRfdmVjdDoKKworCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKyAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiBzZXR1cCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKKworLmdsb2JsIF9hcm1ib290X3N0YXJ0CitfYXJtYm9vdF9zdGFydDoKKwkud29yZCBfc3RhcnQKKworLyoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgorICovCisuZ2xvYmwgX2Jzc19zdGFydAorX2Jzc19zdGFydDoKKwkud29yZCBfX2Jzc19zdGFydAorCisuZ2xvYmwgX2Jzc19lbmQKK19ic3NfZW5kOgorCS53b3JkIF9lbmQKKworLyoKKyAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQorICovCisKK3Jlc2V0OiAKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisKKwkvKiBDb3B5IHZlY3RvcnMgdG8gbWFzayBST00gaW5kaXJlY3QgYWRkciAqLyAKKwlhZHIgICAgIHIwLCBfc3RhcnQgICAgICAgICAgICAgIC8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJYWRkICAgICByMCwgcjAsICM0CQkJCS8qIHNraXAgcmVzZXQgdmVjdG9yCQkJKi8KKwltb3YgICAgIHIyLCAjNjQgICAgICAgICAgICAgICAgIC8qIHIyIDwtIHNpemUgdG8gY29weSAgKi8KKwlhZGQgICAgIHIyLCByMCwgcjIgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisJbW92ICAgICByMSwgIzB4NDAwMDAwMDAgICAgICAgICAvKiBidWlsZCB2ZWN0IGFkZHIgKi8KKwltb3YgICAgIHIzLCAjMHgwMDIwMDAwMAorCWFkZCAgICAgcjEsIHIxLCByMworCW1vdiAgICAgcjMsICMweGY4MDAKKwlhZGQgICAgIHIxLCByMSwgcjMKK25leHQ6CisJbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYm5lICAgICBuZXh0ICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVudGlsIGVxdWFsICovCisKKwlibAljcHlfY2xrX2NvZGUgICAgICAgICAgICAvKiBwdXQgZHBsbCBhZGp1c3QgY29kZSBiZWhpbmQgdmVjdG9ycyAqLworIAorCS8qIHRoZSBtYXNrIFJPTSBjb2RlIHNob3VsZCBoYXZlIFBMTCBhbmQgb3RoZXJzIHN0YWJsZSAqLworCWJsICBjcHVfaW5pdF9jcml0CisKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVsb2MgZHVyaW5nIGRlYnVnICAgICAgICAgKi8KKwkvKiBiZXEgc3RhY2tfc2V0dXAgKi8KKworCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKKwlsZHIJcjMsIF9ic3Nfc3RhcnQKKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKworY29weV9sb29wOgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZWVlIFtyMl0gICAgKi8KKwlibGUJY29weV9sb29wCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCitzdGFja19zZXR1cDoKKwlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCB1Ym9vdCAgICovCisJc3ViCXNwLCByMCwgIzEyOAkJLyogbGVhdmUgMzIgd29yZHMgZm9yIGFib3J0LXN0YWNrICAgICovCisKK2NsZWFyX2JzczoKKwlsZHIJcjAsIF9ic3Nfc3RhcnQJCS8qIGZpbmQgc3RhcnQgb2YgYnNzIHNlZ21lbnQgICAgICAgICovCisJbGRyCXIxLCBfYnNzX2VuZAkJLyogc3RvcCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwltb3YgCXIyLCAjMHgwMDAwMDAwMAkJLyogY2xlYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLy9jbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKy8vCWFkZAlyMCwgcjAsICM0CisvLwljbXAJcjAsIHIxCisvLwlibmUJY2xic3NfbAorCisJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAorCitfc3RhcnRfYXJtYm9vdDoJLndvcmQgc3RhcnRfYXJtYm9vdAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycworICoKKyAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKKyAqIHNldHVwIG1lbW9yeSB0aW1pbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitjcHVfaW5pdF9jcml0OgorCS8qCisJICogZmx1c2ggdjQgSS9EIGNhY2hlcworCSAqLworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCS8qIGZsdXNoIHYzL3Y0IGNhY2hlICovCisJbWNyCXAxNSwgMCwgcjAsIGM4LCBjNywgMAkvKiBmbHVzaCB2NCBUTEIgKi8KKworCS8qCisJICogZGlzYWJsZSBNTVUgc3R1ZmYgYW5kIGNhY2hlcworCSAqLworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwliaWMJcjAsIHIwLCAjMHgwMDAwMjMwMAlAIGNsZWFyIGJpdHMgMTMsIDk6OCAoLS1WLSAtLVJTKQorCWJpYwlyMCwgcjAsICMweDAwMDAwMDg3CUAgY2xlYXIgYml0cyA3LCAyOjAgKEItLS0gLUNBTSkKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMDAwMglAIHNldCBiaXQgMiAoQSkgQWxpZ24KKyNpZm5kZWYgQ09ORklHX0lDQUNIRV9PRkYKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMTAwMAlAIHNldCBiaXQgMTIgKEkpIEktQ2FjaGUKKyNlbmRpZgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworCS8qCisgICAgICAgICAqIEp1bXAgdG8gYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uLi4gVGhlIE1hc2sgUk9NIHdpbGwgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICAgICAqIGJhc2ljIG1lbW9yeS4gIEdvIGhlcmUgdG8gYnVtcCB1cCBjbG9jayByYXRlIGFuZCBoYW5kbGUgd2FrZSB1cCBjb25kaXRpb25zLgorCSAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIHBhc3Mgb24gaW5mbyBhYm91dCBza2lwcGluZyBzb21lIGluaXQgcG9ydGlvbnMgKi8KKwltb3ZlcSAgIHIwLCMweDEgICAgICAgICAgICAgICAgIC8qIGZsYWcgdG8gc2tpcCBwcmNtIGFuZCBzZHJjIHNldHVwICovCisJbW92bmUgICByMCwjMHgwCisKKy8vbW92IHIwLCAjMSAgICAvKiB0aGlzIHNraXAgbWVtb3J5IGluaXQgKi8KKworCW1vdglpcCwgbHIgICAgICAgICAgLyogcGVyc2V2ZXJlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJcGxhdGZvcm1zZXR1cCAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisKKwltb3YJbHIsIGlwICAgICAgICAgIC8qIHJlc3RvcmUgbGluayAqLworCW1vdglwYywgbHIgICAgICAgICAgLyogYmFjayB0byBteSBjYWxsZXIgKi8KKworCisvKgorICogZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworIAkuYWxpZ24gIDUKK2RvX2hhbmc6CisJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KKyAgIAlibAloYW5nCQkJCS8qIGhhbmcgYW5kIG5ldmVyIHJldHVybiAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNjM2QwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8KK09CSlMJPSBjcHUubyAgCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWRiMTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tawpAQCAtMCwwICsxLDMyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCitQTEFURk9STV9SRUxGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAgLWZuby1jb21tb24gLWZmaXhlZC1yOAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFyY2g9YXJtdjUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fUkVMRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc2hvcnQtbG9hZC1ieXRlcywkKGNhbGwgY2Mtb3B0aW9uLC1tYWxpZ25tZW50LXRyYXBzLCkpCisjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NwdS5jIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJmYThhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorICAKKyNkZWZpbmUgVElNRVJfTE9BRF9WQUwgMHhmZmZmZmZmZgorCisvKiBtYWNybyB0byByZWFkIHRoZSAzMiBiaXQgdGltZXIgKi8KKyNkZWZpbmUgUkVBRF9USU1FUiAoKih2b2xhdGlsZSB1bG9uZyAqKShDRkdfVElNRVJCQVNFKzgpKQorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RkZWM7CisKK3N0YXRpYyB2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCk7CisKKy8qIG5vdGhpbmcgcmVhbGx5IHRvIGRvIHdpdGggY3B1LCBqdXN0IHN0YXJ0cyB1cCBhIGNvdW50ZXIuICovCitpbnQgY3B1X2luaXQgKHZvaWQpCit7CisgCWludDMyX3QgdmFsOworCisJLyogU3RhcnQgdGhlIGRlY3JlbWVudGVyIHRpY2tpbmcgZG93biBmcm9tIDB4ZmZmZmZmZmYgKi8KKwkqKChpbnQzMl90ICopIChDRkdfVElNRVJCQVNFICsgTE9BRF9USU0pKSA9IFRJTUVSX0xPQURfVkFMOworCXZhbCA9IE1QVVRJTV9TVCB8IE1QVVRJTV9BUiB8IE1QVVRJTV9DTE9DS19FTkFCTEUgfCAoQ0ZHX1BWVCA8PCBNUFVUSU1fUFRWX0JJVCk7CisJKigoaW50MzJfdCAqKSAoQ0ZHX1RJTUVSQkFTRSArIENOVExfVElNRVIpKSA9IHZhbDsKKworCS8qIGluaXQgdGhlIHRpbWVzdGFtcCBhbmQgbGFzdGRlYyB2YWx1ZSAqLworCXJlc2V0X3RpbWVyX21hc2tlZCgpOworIAkKKyAJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXJfbWFza2VkICh2b2lkKQoreworCS8qIHJlc2V0IHRpbWUgKi8KKwlsYXN0ZGVjID0gUkVBRF9USU1FUjsgIC8qIGNhcHVyZSBjdXJyZW50IGRlY3JlbWVudGVyIHZhbHVlIHRpbWUgKi8KKwl0aW1lc3RhbXAgPSAwOyAgICAgICAgIC8qIHN0YXJ0ICJhZHZhbmNpbmciIHRpbWUgc3RhbXAgZnJvbSAwICovCit9CisKKyNpZmRlZiAgQ0ZHX1VERUxBWQorCitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyX21hc2tlZCAodm9pZCk7CitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKTsKKworLyogZGVsYXkgeCB1c2Vjb25kcyBBTkQgcGVyc2VydmUgYWR2YW5jZSB0aW1zdGFtcCB2YWx1ZSAqLwordm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW8sIHRtcDsKKworCWlmKHVzZWMgPj0gMTAwMCl7ICAgICAgICAgICAgICAgLyogaWYgImJpZyIgbnVtYmVyLCBzcHJlYWQgbm9ybWFsaXphdGlvbiB0byBzZWNvbmRzICovCisJCXRtbyA9IHVzZWMgLyAxMDAwOyAgICAgIC8qIHN0YXJ0IHRvIG5vcm1hbGl6ZSBmb3IgdXNlYyB0byB0aWNrcyBwZXIgc2VjICovCisJCXRtbyAqPSBDRkdfSFo7ICAgICAgICAgIC8qIGZpbmQgbnVtYmVyIG9mICJ0aWNrcyIgdG8gd2FpdCB0byBhY2hpZXZlIHRhcmdldCAqLworCQl0bW8gLz0gMTAwMDsgICAgICAgICAgICAvKiBmaW5pc2ggbm9ybWFsaXplLiAqLworCX1lbHNleyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSBzbWFsbCBudW1iZXIsIGRvbid0IGtpbGwgaXQgcHJpb3IgdG8gSFogbXVsdGlwbHkgKi8KKwkJdG1vID0gdXNlYyAqIENGR19IWjsKKwkJdG1vIC89ICgxMDAwKjEwMDApOworCX0KKworCXRtcCA9IGdldF90aW1lciAoMCk7CQkvKiBnZXQgY3VycmVudCB0aW1lc3RhbXAgKi8KKwlpZiggKHRtbyArIHRtcCkgPCB0bXAgKSAJLyogaWYgc2V0dGluZyB0aGlzIGZvcmR3YXJkIHdpbGwgcm9sbCB0aW1lIHN0YW1wICovCisJCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsJLyogcmVzZXQgImFkdmFuY2luZyIgdGltZXN0YW1wIHRvIDAsIHNldCBsYXN0ZGVjIHZhbHVlICovCisJZWxzZQorCQl0bW8gKz0gdG1wOwkJLyogZWxzZSwgc2V0IGFkdmFuY2luZyBzdGFtcCB3YWtlIHVwIHRpbWUgKi8KKworCXdoaWxlIChnZXRfdGltZXJfbWFza2VkICgpIDwgdG1vKS8qIGxvb3AgdGlsbCBldmVudCAqLworCQkvKk5PUCovOworfQorIAorc3RhdGljIHVsb25nIGdldF90aW1lcl9tYXNrZWQgKHZvaWQpCit7CisJdWxvbmcgbm93ID0gUkVBRF9USU1FUjsJCS8qIGN1cnJlbnQgdGljayB2YWx1ZSAqLworCisJaWYgKGxhc3RkZWMgPj0gbm93KSB7CQkvKiBub3JtYWwgbW9kZSAobm9uIHJvbGwpICovCisJCS8qIG5vcm1hbCBtb2RlICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjIC0gbm93OyAvKiBtb3ZlIHN0YW1wIGZvcmR3YXJkIHdpdGggYWJzb3VsdGUgZGlmZiB0aWNrcyAqLworCX0gZWxzZSB7CQkJLyogd2UgaGF2ZSBvdmVyZmxvdyBvZiB0aGUgY291bnQgZG93biB0aW1lciAqLworCQkvKiBudHMgPSB0cyArIGxkICsgKFRMViAtIG5vdykKKwkJICogdHM9b2xkIHN0YW1wLCBsZD10aW1lIHRoYXQgcGFzc2VkIGJlZm9yZSBwYXNzaW5nIHRocm91Z2ggLTEKKwkJICogKFRMVi1ub3cpIGFtb3VudCBvZiB0aW1lIGFmdGVyIHBhc3NpbmcgdGhvdWdoIC0xCisJCSAqIG50cyA9IG5ldyAiYWR2YW5jaW5nIHRpbWUgc3RhbXAiLi4uaXQgY291bGQgYWxzbyByb2xsIGFuZCBjYXVzZSBwcm9ibGVtcy4KKwkJICovCisJCXRpbWVzdGFtcCArPSBsYXN0ZGVjICsgVElNRVJfTE9BRF9WQUwgLSBub3c7CisJfQorCWxhc3RkZWMgPSBub3c7CisKKwlyZXR1cm4gdGltZXN0YW1wOworfQorCitzdGF0aWMgdWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKQoreworCXJldHVybiBnZXRfdGltZXJfbWFza2VkICgpIC0gYmFzZTsKK30KKworI2VuZGlmIAkJLyogQ0ZHX1VERUxBWSAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxMWRhZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvc3RhcnQuUwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBBUk05MjZFSlMgQ1BVLWNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICAtLS0tLSBBZGFwdGVkIGZvciBPTUFQMTYxMCBmcm9tIEFSTTkyNXQgY29kZSAtLS0tLS0KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJQWxleCBa/HBrZSA8YXp1QHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwMwlLc2hpdGlqIDxrc2hpdGlqQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQJSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTYxMCkKKyNpbmNsdWRlIDwuL2NvbmZpZ3Mvb21hcDE1MTAuaD4KKyNlbmRpZgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBKdW1wIHZlY3RvciB0YWJsZSBhcyBpbiB0YWJsZSAzLjEgaW4gWzFdCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKy5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwliCXJlc2V0CisgCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKworX2hhbmc6CisgCS53b3JkIGRvX2hhbmcKKyAgCisJLmJhbGlnbmwgMTYsMHhkZWFkYmVlZgorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKyAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiBzZXR1cCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKKworLmdsb2JsIF9hcm1ib290X3N0YXJ0CitfYXJtYm9vdF9zdGFydDoKKwkud29yZCBfc3RhcnQKKworLyoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0LgorICovCisuZ2xvYmwgX2Jzc19zdGFydAorX2Jzc19zdGFydDoKKwkud29yZCBfX2Jzc19zdGFydAorCisuZ2xvYmwgX2Jzc19lbmQKK19ic3NfZW5kOgorCS53b3JkIF9lbmQKKworIAorLyoKKyAqIHRoZSBhY3R1YWwgcmVzZXQgY29kZQorICovCisKK3Jlc2V0OgorCS8qCisJICogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQorCSAqLworCW1ycwlyMCxjcHNyCisJYmljCXIwLHIwLCMweDFmCisJb3JyCXIwLHIwLCMweGQzCisJbXNyCWNwc3IscjAKKyAgCisJLyoKKwkgKiB0dXJuIG9mZiB0aGUgd2F0Y2hkb2csIHVubG9jay9kaWFibGUgc2VxdWVuY2UKKwkgKi8KKwltb3YJcjEsICMweEY1CisJbGRyCXIwLCA9V0RUSU1fTU9ERQorCXN0cmgJcjEsIFtyMF0KKwltb3YJcjEsICMweEEwCisJc3RyaAlyMSwgW3IwXQorCisKKwkvKgorCSAqIG1hc2sgYWxsIElSUXMgYnkgc2V0dGluZyBhbGwgYml0cyBpbiB0aGUgSU5UTVIgLSBkZWZhdWx0CisJICovCisKKwltb3YJcjEsICMweGZmZmZmZmZmCisJbGRyCXIwLCA9UkVHX0lITDFfTUlSCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCA9UkVHX0lITDJfTUlSCisJc3RyCXIxLCBbcjBdCisgCisJLyoKKwkgKiB3ZSBkbyBzeXMtY3JpdGljYWwgaW5pdHMgYXQgcmVib290LAorIAkgKi8KKyAJYmwJY3B1X2luaXRfY3JpdCAKKyAgCisJLyogCisJICogcmVsb2NhdGUgZXhjZXB0aW9uIHZlY3RvcnMgdG8gU1JBTSB3aGVyZSBST00gY29kZSBleHBlY3RzCisJICovCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCisKKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKyAJYWRkICAgICByMCwgcjAsICM0CS8qIHNraXAgcmVzZXQgdmVjdG9yCQkJKi8KKwltb3YJcjIsICMzNgkJLyogcjIgPC0gc2l6ZSBvZiBkYXRhICg4KzEgd29yZHMpICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKwltb3YgcjEsICMweDIwMDAwMDAwCituZXh0OgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibGUJbmV4dAorCisjZW5kaWYKKyAKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBYLUxvYWRlciB0byBSQU0JICAgICovCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJbGRyCXIxLCBfVEVYVF9CQVNFCQkvKiB0ZXN0IGlmIHdlIHJ1biBmcm9tIGZsYXNoIG9yIFJBTSAqLworCWNtcCAgICAgcjAsIHIxICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcmVsb2MgZHVyaW5nIGRlYnVnICAgICAgICAgKi8KKwkvKmJlcSAgICAgc3RhY2tfc2V0dXAqLworCisJbGRyCXIyLCBfYXJtYm9vdF9zdGFydAorCWxkcglyMywgX2Jzc19zdGFydAorCXN1YglyMiwgcjMsIHIyCQkvKiByMiA8LSBzaXplIG9mIGFybWJvb3QgICAgICAgICAgICAqLworCWFkZAlyMiwgcjAsIHIyCQkvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCitjb3B5X2xvb3A6CisJbGRtaWEJcjAhLCB7cjMtcjEwfQkJLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYQlyMSEsIHtyMy1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworCWNtcAlyMCwgcjIJCQkvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJsZQljb3B5X2xvb3AKKworCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8KK3N0YWNrX3NldHVwOgorCWxkcglyMCwgX1RFWFRfQkFTRQkJLyogdXBwZXIgMTI4IEtpQjogcmVsb2NhdGVkIFgtTG9hZGVyICAgKi8KKyAgCXN1YglzcCwgcjAsICMxMjgJCS8qIGxlYXZlIDMyIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICAqLworCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWFkZAlyMCwgcjAsICM0CQkvKiBzdGFydCBhdCBmaXJzdCBieXRlIG9mIGJzcyAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2NsYnNzX2w6c3RyCXIyLCBbcjBdCQkvKiBjbGVhciBsb29wLi4uICAgICAgICAgICAgICAgICAgICAqLworCWFkZAlyMCwgcjAsICM0CisJY21wCXIwLCByMQorCWJuZQljbGJzc19sCisKKyAJbGRyCXBjLCBfc3RhcnRfYXJtYm9vdAorCitfc3RhcnRfYXJtYm9vdDoKKwkud29yZCAgc3RhcnRfYXJtYm9vdAorCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENQVV9pbml0X2NyaXRpY2FsIHJlZ2lzdGVycworICoKKyAqIHNldHVwIGltcG9ydGFudCByZWdpc3RlcnMKKyAqIHNldHVwIG1lbW9yeSB0aW1pbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIGZsdXNoIHY0IEkvRCBjYWNoZXMKKwkgKi8KKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNywgMAkvKiBmbHVzaCB2My92NCBjYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggdjQgVExCICovCisKKwkvKgorCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKKwkgKi8KKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJLyogY2xlYXIgYml0cyAxMywgOTo4ICgtLVYtIC0tUlMpICovCisJYmljCXIwLCByMCwgIzB4MDAwMDAwODcJLyogY2xlYXIgYml0cyA3LCAyOjAgKEItLS0gLUNBTSkgKi8KKwlvcnIJcjAsIHIwLCAjMHgwMDAwMDAwMgkvKiBzZXQgYml0IDIgKEEpIEFsaWduICovCisJb3JyCXIwLCByMCwgIzB4MDAwMDEwMDAJLyogc2V0IGJpdCAxMiAoSSkgSS1DYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworCS8qCisJICogR28gc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisJICovCisJbW92CWlwLCBscgkJLyogcGVyc2VydmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibAlwbGF0Zm9ybXNldHVwCS8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisJbW92CWxyLCBpcAkJLyogcmVzdG9yZSBsaW5rICovCisJbW92CXBjLCBscgkJLyogYmFjayB0byBteSBjYWxsZXIgKi8KKyAgCisvKgorICogZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworIAkuYWxpZ24gIDUKK2RvX2hhbmc6CisJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KKyAgIAlibAloYW5nCQkJCS8qIGhhbmcgYW5kIG5ldmVyIHJldHVybiAqLworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZSBiL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFlNzY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCTo9IHN0YXJ0Lm8KK0NPQkpTCTo9IGNwdS5vIG1tYy5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL2NvbmZpZy5tayBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiZTMyOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsKQEAgLTAsMCArMSwzMyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1mbm8tY29tbW9uIC1mZml4ZWQtcjgKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY3LWEKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jIGIveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjQyMmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvY3B1LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2IFRleGFzIEluc3R1cm1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisvKiBTZWUgYWxzbyBBUk0gUmVmLiBNYW4uICovCisjZGVmaW5lIEMxX01NVQkJKDE8PDApCQkvKiBtbXUgb2ZmL29uICovCisjZGVmaW5lIEMxX0FMSUdOCSgxPDwxKQkJLyogYWxpZ25tZW50IGZhdWx0cyBvZmYvb24gKi8KKyNkZWZpbmUgQzFfREMJCSgxPDwyKQkJLyogZGNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9XQgkJKDE8PDMpCQkvKiBtZXJnaW5nIHdyaXRlIGJ1ZmZlciBvbi9vZmYgKi8KKyNkZWZpbmUgQzFfQklHX0VORElBTgkoMTw8NykJLyogYmlnIGVuZGlhbiBvZmYvb24gKi8KKyNkZWZpbmUgQzFfU1lTX1BST1QJKDE8PDgpCQkvKiBzeXN0ZW0gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9ST01fUFJPVAkoMTw8OSkJCS8qIFJPTSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX0lDCQkoMTw8MTIpCQkvKiBpY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX0hJR0hfVkVDVE9SUwkoMTw8MTMpCS8qIGxvY2F0aW9uIG9mIHZlY3RvcnM6IGxvdy9oaWdoIGFkZHJlc3NlcyAqLworI2RlZmluZSBSRVNFUlZFRF8xCSgweGYgPDwgMykJLyogbXVzdCBiZSAxMTFiIGZvciBSL1cgKi8KKworaW50IGNwdV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzY1ZGY0OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWMuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPGtoYXNpbUB0aS5jb20+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+cGFydF90eXBlID0gUEFSVF9UWVBFX0FNSUdBOworCSAgICByZXR1cm47CisJfQorI2VuZGlmCit9CisKKworaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKQoreworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mb19tYWMoZGV2X2Rlc2MscGFydCxpbmZvKSA9PSAwKSB7CisJCQlQUklOVEYgKCIjIyBWYWxpZCBNQUMgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfRE9TOgorCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX2RvcyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKKwkJCVBSSU5URiAoIiMjIFZhbGlkIERPUyBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9JU086CisJCWlmIChnZXRfcGFydGl0aW9uX2luZm9faXNvKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgeworCQkJUFJJTlRGICgiIyMgVmFsaWQgSVNPIGJvb3QgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQV9QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9BTUlHQToKKwkgICAgaWYgKGdldF9wYXJ0aXRpb25faW5mb19hbWlnYShkZXZfZGVzYywgcGFydCwgaW5mbykgPT0gMCkKKwkgICAgeworCQlQUklOVEYgKCIjIyBWYWxpZCBBbWlnYSBwYXJ0aXRpb24gZm91bmQgIyNcbiIpOworCQlyZXR1cm4gKDApOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wYXJ0X2hlYWRlciAoY29uc3QgY2hhciAqdHlwZSwgYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjKQoreworCXN3aXRjaCAoZGV2X2Rlc2MtPmlmX3R5cGUpIHsKKwkJY2FzZSBJRl9UWVBFX0lERTogIAlwcmludGYgKCJJREUiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9TQ1NJOiAJcHJpbnRmICgiU0NTSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX0FUQVBJOglwcmludGYgKCJBVEFQSSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQjoJcHJpbnRmICgiVVNCIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfRE9DOglwcmludGYgKCJET0MiKTsKKwkJCQkJYnJlYWs7CisJCWRlZmF1bHQ6IAkJcHJpbnRmICgiVU5LTk9XTiIpOworCQkJCQlicmVhazsKKwl9CisJcHJpbnRmICgiIGRldmljZSAlZCAgLS0gICBQYXJ0aXRpb24gVHlwZTogJXNcblxuIiwKKwkJCWRldl9kZXNjLT5kZXYsIHR5cGUpOworfQorCit2b2lkIHByaW50X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKworCQlzd2l0Y2ggKGRldl9kZXNjLT5wYXJ0X3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX01BQzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgTUFDIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiTUFDIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X21hYyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0RPUzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgRE9TIHBhcnRpdGlvbiAjI1xuIik7CisJCXByaW50X3BhcnRfaGVhZGVyICgiRE9TIiwgZGV2X2Rlc2MpOworCQlwcmludF9wYXJ0X2RvcyAoZGV2X2Rlc2MpOworCQlyZXR1cm47CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfSVNPOgorCQlQUklOVEYgKCIjIyBUZXN0aW5nIGZvciB2YWxpZCBJU08gQm9vdCBwYXJ0aXRpb24gIyNcbiIpOworCQlwcmludF9wYXJ0X2hlYWRlciAoIklTTyIsIGRldl9kZXNjKTsKKwkJcHJpbnRfcGFydF9pc28gKGRldl9kZXNjKTsKKwkJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfQU1JR0E6CisJICAgIFBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIGEgdmFsaWQgQW1pZ2EgcGFydGl0aW9uICMjXG4iKTsKKwkgICAgcHJpbnRfcGFydF9oZWFkZXIgKCJBTUlHQSIsIGRldl9kZXNjKTsKKwkgICAgcHJpbnRfcGFydF9hbWlnYSAoZGV2X2Rlc2MpOworCSAgICByZXR1cm47CisjZW5kaWYKKwl9Cit9CisKKworI2Vsc2UJLyogbmVpdGhlciBNQUMgbm9yIERPUyBub3IgSVNPIHBhcnRpdGlvbiBjb25maWd1cmVkICovCisjIGVycm9yIG5laXRoZXIgQ09ORklHX01BQ19QQVJUSVRJT04gbm9yIENPTkZJR19ET1NfUEFSVElUSU9OIG5vciBDT05GSUdfSVNPX1BBUlRJVElPTiBjb25maWd1cmVkIQorI2VuZGlmCisKKyNlbmRpZgkvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGQ5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJuYW5kLmEKKworaWZlcSAoJChCT0FSRCksIG9tYXAzNDMwc2RwKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMzQzMGxhYnJhZG9yKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwM2V2bSkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgYW0zNTE3ZXZtKQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQyMGg0KQorQ09CSlMteQkrPSBrOWsxMjE2Lm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMjQzMHNkcCkKK0NPQkpTLXkJKz0gazlrMTIxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDE3MTBoMykKK0NPQkpTLXkJKz0gazlmNTYxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgZGlhbW9uZCkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgajQ5KQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBqNDktdXNiLWxvYWRlcikKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCisjIyBEaXNhYmxlZCBmb3Igbm93OgorIyMJICBjczg5MDAubyBjdDY5MDAwLm8gZGF0YWZsYXNoLm8gZGMyMTE0eC5vIGRzMTcyMi5vIFwKKyMjCSAgbGFuOTFjOTYubyBtd19lZXByb20ubyBuYXRzZW1pLm8gXAorIyMJICBzbWM5MTExMS5vIHNtaUx5bnhFTS5vIHNwaV9lZXByb20ubyBzeW01M2M4eHgubyBcCisjIworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWYxZzA4cjBhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqICBTYW1zdW5nIEs5RjFHMDhSMEFRMEMgTkFORCBjaGlwIGRyaXZlciBmb3IgYW4gT01BUDI0MjAgYm9hcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfSzlGMUcwOFIwQSkgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCisjZGVmaW5lIEs5RjFHMDhSMEFfTUZSCQkweGVjICAvKiBTYW1zdW5nICovCisjZGVmaW5lIEs5RjFHMDhSMEFfSUQJCTB4YTEgIC8qIHBhcnQgIyAqLworCisjZGVmaW5lIFMzNE1TMDFHMV9NRlIJCTB4MDEgIC8qIFNwYW5zaW9uICovCisjZGVmaW5lIFMzNE1TMDFHMV9JRAkJMHhiYSAgLyogcGFydCAjIC0gMTZiaXQsIDJHQiAqLworCisvKiBTaW5jZSBNaWNyb24gYW5kIFNhbXN1bmcgcGFydHMgYXJlIHNpbWlsYXIgaW4gZ2VvbWV0cnkgYW5kIGJ1cyB3aWR0aAorICogd2UgY2FuIHVzZSB0aGUgc2FtZSBkcml2ZXIuIE5lZWQgdG8gcmV2aXNpdCB0byBtYWtlIHRoaXMgZmlsZSBpbmRlcGVuZGVudAorICogb2YgcGFydC9tYW51ZmFjdHVyZXIKKyAqLworI2RlZmluZSBNVDI5RjFHX01GUgkJMHgyYyAgLyogTWljcm9uICovCisjZGVmaW5lIE1UMjlGMUdfSUQJCTB4YTEgIC8qIHg4LCAxR2lCICovCisjZGVmaW5lIE1UMjlGMkdfSUQJCTB4YmEgIC8qIHgxNiwgMkdpQiAqLworCisjZGVmaW5lIEhZTklYNEdpQl9NRlIJCTB4QUQgIC8qIEh5bml4ICovCisjZGVmaW5lIEhZTklYNEdpQl9JRAkJMHhCQyAgLyogeDE2LCA0R2lCICovCisKKyNkZWZpbmUgQUREUl9DT0xVTU4JCTEKKyNkZWZpbmUgQUREUl9QQUdFCQkyCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJKEFERFJfQ09MVU1OIHwgQUREUl9QQUdFKQorCisjZGVmaW5lIEFERFJfT09CCQkoMHg0IHwgQUREUl9DT0xVTU5fUEFHRSkKKworI2RlZmluZSBQQUdFX1NJWkUJCTIwNDgKKyNkZWZpbmUgT09CX1NJWkUJCTY0CisjZGVmaW5lIE1BWF9OVU1fUEFHRVMJCTY0CisKKyNkZWZpbmUgRUNDX0NIRUNLX0VOQUJMRQorCisjaWYgQ0ZHX05BTkRfRUNDXzFCSVQKKyNkZWZpbmUgRUNDX1NJWkUJCTI0CisjZGVmaW5lIEVDQ19TVEVQUwkJMworI2RlZmluZSBvbWFwX2VuYWJsZV9od2VjYworI2RlZmluZSBvbWFwX2NvcnJlY3RfZGF0YQorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MKKyNlbGlmIENGR19OQU5EX0VDQ180QklUCisjZGVmaW5lIEVDQ19TSVpFCQkyOCAKKyNkZWZpbmUgRUNDX1NURVBTCQkyOCAKKworZXh0ZXJuIGVuYWJsZV9od2VjY19iY2g0KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoNCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDQKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoNAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCisjZGVmaW5lIEVDQ19TSVpFCQk1MgorI2RlZmluZSBFQ0NfU1RFUFMJCTUyIAorCitleHRlcm4gdm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g4KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoOCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoOAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgKKyNlbHNlCisjZXJyb3IgIk5vbmUgb2YgQ0ZHX05BTkRfRUNDX3sxLDQsOH1CSVQgaXMgZGVmaW5lZC4iCisjZW5kaWYgLyogQ0ZHX05BTkRfRUNDXzFCSVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUwLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICogYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworCisjaWZkZWYgQ0ZHX05BTkRfRUNDXzFCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkJNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorCQk1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9OworI2VsaWYgQ0ZHX05BTkRfRUNDXzRCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCAKKwkJNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIAorCQk1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgCisJCTU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzfTsKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9CisJCXsxMiwgMTMsIDE0LAorCQkxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkJMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisJCTI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LAorCQkzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgCisJCTQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCAKKwkJNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIAorCQk1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2M307CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hpcHNpemUgPSAoMjU2IDw8IDIwKTsKKworI2lmZGVmIE5BTkRfMTZCSVQKK3N0YXRpYyBpbnQgYnVzX3dpZHRoID0gMTY7CisjZWxzZQorc3RhdGljIGludCBidXNfd2lkdGggPSA4OworI2VuZGlmCisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisKKyAJV1JJVEVfTkFORF9DT01NQU5EKGNvbW1hbmQsIE5BTkRfQUREUik7CisgCU5BTkRfQ1RMX0NMUkNMRShOQU5EX0FERFIpOworCisgIAlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdW5zaWduZWQgY2hhciByZXRfdmFsOworCQlOYW5EX0NvbW1hbmQoTkFORF9DTURfU1RBVFVTKTsKKwkJZG97CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7Lyogd2FpdCB0aWxsIHJlYWR5ICovCisgIAkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworIAl9CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3ModW5zaWduZWQgaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKwl1Y2hhciB1OworCisgCU5BTkRfQ1RMX1NFVEFMRShOQU5EX0FERFIpOworCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UKKwkJCQl8fCBudW1ieXRlcyA9PSBBRERSX09PQikKKwl7CisJCXVzaG9ydCBjb2wgPSBvZnM7CisKKwkJdSA9IGNvbCAgJiAweGZmOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKworCQl1ID0gKGNvbCA+PiA4KSAmIDB4MDc7CisJCWlmIChudW1ieXRlcyA9PSBBRERSX09PQikKKwkJCXUgPSB1IHwgKChidXNfd2lkdGggPT0gMTYpID8gKDEgPDwgMikgOiAoMSA8PCAzKSk7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCX0KKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRQorCQkJCXx8IG51bWJ5dGVzID09IEFERFJfT09CKQorCXsKKwkJdSA9IChvZnMgPj4gMTEpICYgMHhmZjsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisJCXUgPSAob2ZzID4+IDE5KSAmIDB4ZmY7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCisJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGRldmljZXMgPiAxMjhNaUIgKi8KKwkJaWYgKGNoaXBzaXplID4gKDEyOCA8PCAyMCkpIHsKKwkJCXUgPSAob2ZzID4+IDI3KSAmIDB4ZmY7CisJCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKwkJfQorCX0KKworIAlOQU5EX0NUTF9DTFJBTEUoTkFORF9BRERSKTsKKworIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBjaGlwIG1mciBhbmQgaWQKKyAqIHJldHVybiAwIGlmIHRoZXkgbWF0Y2ggYm9hcmQgY29uZmlnCisgKiByZXR1cm4gMSBpZiBub3QKKyAqLworaW50IG5hbmRfY2hpcCgpCit7CisJY29uc3QgaW50IHN1cHBvcnRlZCA9IDA7CisJaW50IG1mciwgaWQ7CisKKyAJTkFORF9FTkFCTEVfQ0UoKTsKKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFU0VUKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFU0VUXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCX0KKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAoIXN1cHBvcnRlZCk7CisgCX0KKworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlkZWJ1ZygiTkFORDogJXg6JXhcbiIsIG1mciwgaWQpOworCisJTkFORF9ESVNBQkxFX0NFKCk7CisKKwlzd2l0Y2ggKG1mcikgeworCisJY2FzZSBLOUYxRzA4UjBBX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSzlGMUcwOFIwQV9JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBNVDI5RjFHX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgTVQyOUYxR19JRDoJCQorCQljYXNlIE1UMjlGMkdfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWNhc2UgSFlOSVg0R2lCX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSFlOSVg0R2lCX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTMzRNUzAxRzFfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBTMzRNUzAxRzFfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJfQorCisJcmV0dXJuICghc3VwcG9ydGVkKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLworaW50IG5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpCit7CisJaW50IGksIG9mZnNldCA9IDA7CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJdTE2IG9vYl9idWZbT09CX1NJWkUgPj4gMV07CisKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggd29yZCBpbiBzcGFyZSBhcmVhIG5lZWRzIGJlIDB4ZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYigodW5zaWduZWQgY2hhciAqKW9vYl9idWYsIGJsb2NrX2FkZHIpCisJCXx8IChvb2JfYnVmWzBdICYgMHhmZikgIT0gMHhmZikgeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworCQlyZXR1cm4gTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLOyAgICAvKiBza2lwIGJhZCBibG9jayAqLworCX0KKyNlbmRpZgorCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChpPTA7IGk8TUFYX05VTV9QQUdFUzsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW50IGNvdW50OworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJLyogaW5jcmVhc2VkIHNpemUgb2YgZWNjX2NvZGUgYW5kIGVjY19jYWxjIHRvIG1hdGNoIHRoZSBPT0Igc2l6ZSwgCisJICAgYXMgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCisJdV9jaGFyIGVjY19jb2RlW09PQl9TSVpFXTsKKwl1X2NoYXIgZWNjX2NhbGNbT09CX1NJWkVdOworCXVfY2hhciBvb2JfYnVmW09PQl9TSVpFXTsKKyNlbmRpZgorCXUxNiB2YWw7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCisJTkFORF9FTkFCTEVfQ0UoKTsKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKworCW9tYXBfZW5hYmxlX2h3ZWNjKGJ1c193aWR0aCwgMCk7CisKKwkvKiByZWFkIHRoZSBwYWdlICovCisJbGVuID0gKGJ1c193aWR0aCA9PSAxNikgPyBQQUdFX1NJWkUgPj4gMSA6IFBBR0VfU0laRTsKKwlwID0gKHUxNiAqKWJ1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAgIAl9CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJb21hcF9jYWxjdWxhdGVfZWNjKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKworCS8qIHJlYWQgdGhlIE9PQiBhcmVhICovCisJcCA9ICh1MTYgKilvb2JfYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAJfQorCWNvdW50ID0gMDsKKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCS8qIE5lZWQgdG8gZW5hYmxlIEhXRUNDIGZvciBSRUFESU5HICovCisKKyAJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgRUNDX1NJWkU7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgRUNDX1NJWkU7IGNvdW50ICs9IEVDQ19TVEVQUykgeworI2lmIENGR19OQU5EX0VDQ18xQklUCisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbHNlCisJCWlmIChvbWFwX2NvcnJlY3RfZGF0YShidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbmRpZgorIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIpOworCQkJZm9yICh2YWw9MDsgdmFsIDwyNTY7IHZhbCsrKQorCQkJCXByaW50ZigiJXggIiwgYnVmW3ZhbF0pOworCQkJcHJpbnRmKCJcbiIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwkJYnVmICs9IDI1NjsKKwkJcGFnZV9hZGRyICs9IDI1NjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgLyAyMDQ4IGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCXAgPSAodTE2ICopYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKworICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKyAJTmFuRF9BZGRyZXNzKEFERFJfT09CLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspCisJCSpwKysgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0s5RjFHMDhSMEEpIHx8CisJCSogZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSB8fAorCQkqIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCQkqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjU2MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGIxNDJiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogIFNhbXN1bmcgSzlGNTYxNlEwQyBOQU5EIGNoaXAgZHJpdmVyIGZvciBhbiBPTUFQMTZ4eCBib2FyZAorICogCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX05BTkRfSzlGNTYxNgorCisjZGVmaW5lIEs5RjU2MTZfTUZSCQkweGVjCisjZGVmaW5lIEs5RjU2MTZfSUQJCTB4NDUKKworI2RlZmluZSBBRERSX0NPTFVNTgkJMSAgICAgICAgICAKKyNkZWZpbmUgQUREUl9QQUdFCQkyICAgICAgICAgICAgIAorI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCTMKKworI2RlZmluZSBQQUdFX1NJWkUJCTUxMgorCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqIGJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKKworLyogSkZGUzIgNTEyLWJ5dGUtcGFnZSBFQ0MgbGF5b3V0ICovCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9IHswLDEsMiwzLDYsN307CitzdGF0aWMgdV9jaGFyIGVjY3ZhbGlkX3BvcyA9IDQ7CisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisgCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBOQU5EX0FERFIpOworIAlOQU5EX0NUTF9DTFJDTEUoTkFORF9BRERSKTsKKworICAJaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7CisJCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwkJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1NUQVRVUyk7CisJCWRveworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworICAJCX0gd2hpbGUoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKKyAJfQorIAkKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5hbkRfQWRkcmVzczogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgZm9yIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyhpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworIAlpbnQgaTsKKworIAlOQU5EX0NUTF9TRVRBTEUoTkFORF9BRERSKTsKKyAKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworCW9mcyA9IG9mcyA+PiA4OworCisJaWYgKG51bWJ5dGVzID09IEFERFJfUEFHRSB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCBvZnMgPSBvZnMgPj4gOCkKKwkJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKyAJTkFORF9DVExfQ0xSQUxFKE5BTkRfQUREUik7CisKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgY2hpcCBtZnIgYW5kIGlkCisgKiByZXR1cm4gMCBpZiB0aGV5IG1hdGNoIGJvYXJkIGNvbmZpZworICogcmV0dXJuIDEgaWYgbm90CisgKi8KK2ludCBuYW5kX2NoaXAoKQoreworCWludCBtZnIsIGlkOworCisgCU5BTkRfRU5BQkxFX0NFKCk7CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRVNFVCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRVNFVFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsgICAKKwkJcmV0dXJuIDE7CisJfQorIAorIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAxOworIAl9CisgCisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTiwgMCk7CisKKyAJbWZyID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJaWQgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfRElTQUJMRV9DRSgpOworCisgIAlyZXR1cm4gKG1mciAhPSBLOUY1NjE2X01GUiB8fCBpZCAhPSBLOUY1NjE2X0lEKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKK2ludCBuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKQoreworCWludCBpLCBvZmZzZXQgPSAwOworCXVjaGFyIG9vYl9idWZbMTZdOworIAkKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggYW5kIDV0aCB3b3JkcyBuZWVkIGJlIDB4ZmZmZiAqLworCWlmIChuYW5kX3JlYWRfb29iKG9vYl9idWYsIGJsb2NrX2FkZHIpIHx8CisvLwkJb29iX2J1ZlswXSAhPSAweGZmIHx8IG9vYl9idWZbMV0gIT0gMHhmZiB8fAorLy8JCW9vYl9idWZbMTBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxMV0gIT0gMHhmZiApeworCQlvb2JfYnVmWzVdICE9IDB4ZmYpeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworIAkJcmV0dXJuIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSzsgICAgLyogc2tpcCBiYWQgYmxvY2sgKi8KKwl9CisKKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAoaT0wOyBpPDMyOyBpKyspeworCQlpZiAobmFuZF9yZWFkX3BhZ2UoYnVmK29mZnNldCwgYmxvY2tfYWRkciArIG9mZnNldCkpCisJCQlyZXR1cm4gTkFORF9SRUFEX0VDQ19GQUlMVVJFOworCQlvZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBOQU5EX1JFQURfU1VDQ0VTUzsKK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCisJTkFORF9XQUlUX1JFQURZKCk7CisgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKworCXAgPSBvb2JfYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworIAkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworIAkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLworCWZvciAoY250ciA9IDA7IGNudHIgPCA2OyBjbnRyKyspCisJCWVjY19jb2RlW2NudHJdID0gIG9vYl9idWZbZWNjX3Bvc1tjbnRyXV07CisKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKyAgICAJCisgIAlOQU5EX0VOQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBsb3cgKi8KKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRE9PQik7CisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqYnVmKysgPSB2YWwgJiAweGZmOworCQkqYnVmKysgPSB2YWwgPj4gODsKKyAgCX0KKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlrMTIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAgU2Ftc3VuZyBLOUsxMjE2UTBDIE5BTkQgY2hpcCBkcml2ZXIgZm9yIGFuIE9NQVAyNDIwIGJvYXJkCisgKiAKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9LOUsxMjE2CisKKyNkZWZpbmUgSzlLMTIxNl9NRlIJCTB4ZWMKKyNkZWZpbmUgSzlLMTIxNl9JRAkJMHg0NgorCisjZGVmaW5lIEFERFJfQ09MVU1OCQkxICAgICAgICAgIAorI2RlZmluZSBBRERSX1BBR0UJCTIgICAgICAgICAgICAgCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJMworCisjZGVmaW5lIFBBR0VfU0laRQkJNTEyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKiBidWYsIHVsb25nIHBhZ2VfYWRkcik7CisKKy8qIEpGRlMyIDUxMi1ieXRlLXBhZ2UgRUNDIGxheW91dCAqLworc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPSB7MCwxLDIsMyw2LDd9Oworc3RhdGljIHVfY2hhciBlY2N2YWxpZF9wb3MgPSA0OworCisvKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQ29tbWFuZCh1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCit7CisgCU5BTkRfQ1RMX1NFVENMRShOQU5EX0FERFIpOworIAlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgTkFORF9BRERSKTsKKyAJTkFORF9DVExfQ0xSQ0xFKE5BTkRfQUREUik7CisKKyAgCWlmKGNvbW1hbmQgPT0gTkFORF9DTURfUkVTRVQpeworCQl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9TVEFUVVMpOworCQlkb3sKKwkJCXJldF92YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKyAgCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisgCX0KKyAJCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3MoaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKyAJaW50IGk7CisKKyAJTkFORF9DVExfU0VUQUxFKE5BTkRfQUREUik7CisgCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKwlvZnMgPSBvZnMgPj4gOTsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKywgb2ZzID0gb2ZzID4+IDgpCisJCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisgCU5BTkRfQ1RMX0NMUkFMRShOQU5EX0FERFIpOworCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiByZWFkIGNoaXAgbWZyIGFuZCBpZAorICogcmV0dXJuIDAgaWYgdGhleSBtYXRjaCBib2FyZCBjb25maWcKKyAqIHJldHVybiAxIGlmIG5vdAorICovCitpbnQgbmFuZF9jaGlwKCkKK3sKKwlpbnQgbWZyLCBpZDsKKworIAlOQU5EX0VOQUJMRV9DRSgpOworCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVTRVQpKSB7CisgCQlwcmludGYoIkVycjogUkVTRVRcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7ICAgCisJCXJldHVybiAxOworCX0KKyAKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFESUQpKSB7CisgCQlwcmludGYoIkVycjogUkVBRElEXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gMTsKKyAJfQorIAorIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlOQU5EX0RJU0FCTEVfQ0UoKTsKKworICAJcmV0dXJuIChtZnIgIT0gSzlLMTIxNl9NRlIgfHwgaWQgIT0gSzlLMTIxNl9JRCk7Cit9CisKKy8qIHJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogcmV0dXJuIDEgaWYgdGhlIGJsb2NrIGlzIGJhZCBvciBFQ0MgZXJyb3IgY2FuJ3QgYmUgY29ycmVjdGVkIGZvciBhbnkgcGFnZQorICogcmV0dXJuIDAgb24gc3VjZXNzCisgKi8gCitpbnQgbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcikKK3sKKwlpbnQgaSwgb2Zmc2V0ID0gMDsKKwl1Y2hhciBvb2JfYnVmWzE2XTsKKyAJCisJLyogY2hlY2sgYmFkIGJsb2NrICovCisJLyogMHRoIGFuZCA1dGggd29yZHMgbmVlZCBiZSAweGZmZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYihvb2JfYnVmLCBibG9ja19hZGRyKSB8fAorLy8JCW9vYl9idWZbMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzFdICE9IDB4ZmYgfHwKKy8vCQlvb2JfYnVmWzEwXSAhPSAweGZmIHx8IG9vYl9idWZbMTFdICE9IDB4ZmYgKXsKKwkJb29iX2J1Zls1XSAhPSAweGZmKXsKKwkJcHJpbnRmKCJTa2lwcGVkIGJhZCBibG9jayBhdCAweCV4XG4iLCBibG9ja19hZGRyKTsKKyAJCXJldHVybiBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0s7ICAgIC8qIHNraXAgYmFkIGJsb2NrICovCisJfQorCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKGk9MDsgaTwzMjsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgY291bnQgPSAwOworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZGVsYXkoNTAwKTsgLyogd2UgZ28gdGhyb3VnaCBORkMgbmVlZCBhIGJpZ2dlciBkZWxheS4gMjAwIGlzIG5vdCBlbm91Z2ggKi8KKyAKKyAgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisgCQkqcCsrID0gdmFsICYgMHhmZjsKKyAJCSpwKysgPSB2YWwgPj4gODsKKyAgIAl9CisKKwlwID0gb29iX2J1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKyAJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqcCsrID0gdmFsICYgMHhmZjsKKwkJKnArKyA9IHZhbCA+PiA4OworIAl9CisJY291bnQgPSAxOworIAlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisgCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJZm9yIChjbnRyID0gMDsgY250ciA8IDY7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWxdKTsKKwkJCXByaW50ZigiXG4iKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWwrMjU2XSk7CisJCQlwcmludGYoIlxuIik7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiBieXRlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworCXUxNiB2YWw7CisJaW50IGNudHI7CisgICAgCQorICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURPT0IpOworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworLyoJZG8geworCQkqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDdjKSA9IE5BTkRfQ01EX1NUQVRVUzsKKwkgIHZhbCA9ICoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwODQpOworCSAgcHJpbnRmKCJ2YWwgPSAleFxuIiwgdmFsKTsJCisJfSB3aGlsZSAoKHZhbCAmIDB4NDApICE9IDB4NDApOworKi8KKwkvKiB0aGUgYWJvdmUgY29kZSBmcm9tIE9TVEJvb3QgZG9lc24ndCB3b3JrLCB3ZSB1c2UgZGVsYXkgKi8KKwlkZWxheSg1MDApOyAvKiB3ZSBnbyB0aHJvdWdoIE5GQyBuZWVkIGEgYmlnZ2VyIGRlbGF5LiAyMDAgaXMgbm90IGVub3VnaCAqLworIAorCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKmJ1ZisrID0gdmFsICYgMHhmZjsKKwkJKmJ1ZisrID0gdmFsID4+IDg7CisgIAl9CisgIAorCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYxOTVjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IFNhbXN1bmcgRWxlY3Ryb25pY3MuCisjIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJvbmVuYW5kLmEKKworQ09CSlMteQk6PSBvbmVuYW5kLm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNmNzA2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUgU2Ftc3VuZyBFbGVjdHJvbmlzCisgKiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgIm9uZW5hbmRfcmVncy5oIgorCisjaWYgZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKyNkZWZpbmUgb25lbmFuZF9yZWFkdyhhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkKKyNkZWZpbmUgb25lbmFuZF93cml0ZXcodiwgYSkJKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKSA9ICh1MTYpICh2KSkKKworI2RlZmluZSBTQU1TVU5HX01GUl9JRAkJMHhFQworI2RlZmluZSBLRk0xRzE2UTJBX0RFVl9JRAkweDMwCisjZGVmaW5lIEtGTjJHMTZRMkFfREVWX0lECTB4NDAKKworCisjZGVmaW5lIFRISVNfT05FTkFORChhKQkJKE9ORU5BTkRfQUREUiArIChhKSkKKworI2RlZmluZSBSRUFEX0lOVEVSUlVQVCgpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpCisKKyNkZWZpbmUgUkVBRF9DVFJMX1NUQVRVUygpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NUUkxfU1RBVFVTKSkKKworI2RlZmluZSBSRUFEX0VDQ19TVEFUVVMoKQkJCQkJCVwKKwlvbmVuYW5kX3JlYWR3KFRISVNfT05FTkFORChPTkVOQU5EX1JFR19FQ0NfU1RBVFVTKSkKKwkKKyNkZWZpbmUgU0VUX0VNSUZTX0NTX0NPTkZJRyh2KQkJCQkJXAorCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoT01BUF9FTUlGU19DU19DT05GSUcpID0gKHYpKQorCisjZGVmaW5lIG9uZW5hbmRfYmxvY2tfYWRkcmVzcyhibG9jaykJCShibG9jaykKKyNkZWZpbmUgb25lbmFuZF9zZWN0b3JfYWRkcmVzcyhwYWdlKQkJKHBhZ2UgPDwgMikKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJfYWRkcmVzcygpCQkoKDEgPDwgMykgPDwgOCkKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyhibG9jaykJKDApCisKKyNpZiBkZWZpbmVkKENGR19TWU5DX0JVUlNUX1JFQUQpICYmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9zeW5jX2J1cnN0X3JlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdmFsdWUgPSAwCisJCXwgKDB4MSA8PCAxNSkJCS8qIFJlYWQgTW9kZTogU3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDQgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogOCB3b3JkICovCisJCXwgKDB4MSA8PCA3KQkJLyogUkRZIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA2KQkJLyogSU5UIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA1KQkJLyogSS9PIGJ1ZmZlciBlbmFibGUgKi8KKwkJOworCW9uZW5hbmRfd3JpdGV3KHZhbHVlLCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1lTX0NGRzEpKTsKKworCXZhbHVlID0gMAorCQl8ICg0IDw8IDE2KQkJLyogU3luY2hyb25vdXMgQnVyc3QgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoNCA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXN5bmNfcmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl2YWx1ZSA9IDAKKwkJfCAoMHgwIDw8IDE1KQkJLyogUmVhZCBNb2RlOiBBc3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDAgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogY29udGludW91cyAqLworCQl8ICgweDEgPDwgNykJCS8qIFJEWSBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDEgPDwgNikJCS8qIElOVCBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDAgPDwgNSkJCS8qIEkvTyBidWZmZXIgZGlzYWJsZSAqLworCQk7CisJb25lbmFuZF93cml0ZXcodmFsdWUsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19TWVNfQ0ZHMSkpOworCisJdmFsdWUgPSAwCisJCXwgKDAgPDwgMTYpCQkvKiBBc3luY2hyb25vdXMgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoMyA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisjZWxzZQorI2RlZmluZSBzZXRfc3luY19idXJzdF9yZWFkKC4uLikJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfYXN5bmNfcmVhZCguLi4pCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworaW50CitvbmVuYW5kX2NoaXAoKQoreworCXVuc2lnbmVkIHNob3J0IG1mX2lkLCBkZXZfaWQ7CisJbWZfaWQgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShUSElTX09ORU5BTkQoT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lEKSkpOworCWRldl9pZCA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKFRISVNfT05FTkFORChPTkVOQU5EX1JFR19ERVZJQ0VfSUQpKSk7CisKKwlpZihtZl9pZCA9PSBTQU1TVU5HX01GUl9JRCkgeworCQlpZiAoZGV2X2lkID09IEtGTTFHMTZRMkFfREVWX0lEKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMUcgRmxhc2ggXHJcbiIpOworCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChkZXZfaWQgPT0gS0ZOMkcxNlEyQV9ERVZfSUQpIHsKKwkJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMkcgRmxhc2ggXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiBPTkVOQU5EIEZsYXNoIHVuc3VwcG9ydGVkXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIk9ORU5BTkQgRmxhc2ggVW5zdXBwb3J0ZWRcclxuIik7CisJCXJldHVybiAxOworCX0KK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9uZW5hbmRfcmVhZF9wYWdlKHVsb25nIGJsb2NrLCB1bG9uZyBwYWdlLCB1X2NoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nICpiYXNlOworCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJdW5zaWduZWQgaW50IG9mZnNldCwgdmFsdWU7CisJdW5zaWduZWQgbG9uZyAqcDsKKwl1bnNpZ25lZCBpbnQgY3RybCwgZWNjOworCXVuc2lnbmVkIHNob3J0IGJibWFya2VyOworI2VuZGlmCisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2Jsb2NrX2FkZHJlc3MoYmxvY2spLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzEpKTsKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfc2VjdG9yX2FkZHJlc3MocGFnZSksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTOCkpOworCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9idWZmZXJfYWRkcmVzcygpLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSKSk7CisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2J1ZmZlcnJhbV9hZGRyZXNzKGJsb2NrKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyKSk7CisKKwlvbmVuYW5kX3dyaXRldyhPTkVOQU5EX0lOVF9DTEVBUiwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpOworCisJb25lbmFuZF93cml0ZXcoT05FTkFORF9DTURfUkVBRCwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NPTU1BTkQpKTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkzMgorIAlwID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmOworI2VuZGlmCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX0RBVEFSQU0pOworCisJd2hpbGUgKCEoUkVBRF9JTlRFUlJVUFQoKSAmIE9ORU5BTkRfSU5UX01BU1RFUikpCisJCWNvbnRpbnVlOworCS8qIENoZWNrIGlmIHRoZSBibG9jayBpcyBiYWQuIEJhZCBibG9jayBtYXJrZXJzICAgICovCisJLyogYXJlIHN0b3JlZCBpbiBzcGFyZSBhcmVhIG9mIDFzdCBvciAybmQgcGFnZSAqLworCWlmICgocGFnZSA9PSAwKSB8fCAocGFnZSA9PSAxKSkKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgKnNwYXJlQXJlYSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX1NQQVJFUkFNKTsKKwkgICAgYmJtYXJrZXIgPSAqc3BhcmVBcmVhOworICAgICAgICAgICAgLyogZm9yIGJhZCBibG9jayBtYXJrZXJzICovCisgICAgICAgICAgICBpZiAoYmJtYXJrZXIgIT0gMHhGRkZGKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKwl9CisKKwljdHJsID0gUkVBRF9DVFJMX1NUQVRVUygpOworCQorCWlmIChjdHJsICYgT05FTkFORF9DVFJMX0VSUk9SKSB7CisJCWhhbmcoKTsKKwl9CisJCisJaWYgKFJFQURfSU5URVJSVVBUKCkgJiBPTkVOQU5EX0lOVF9SRUFEKSB7CisKKwkJZWNjID0gUkVBRF9FQ0NfU1RBVFVTKCk7CisJCWlmIChlY2MgJiBPTkVOQU5EX0VDQ18yQklUX0FMTCkgeworCQkJaGFuZygpOworCQl9CisJfQorCQorI2lmZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJLyogMzIgYnl0ZXMgYm91bmRhcnkgbWVtb3J5IGNvcHkgKi8KKwltZW1jcHkzMihidWYsIGJhc2UsIE9ORU5BTkRfUEFHRV9TSVpFKTsKKyNlbHNlCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAoT05FTkFORF9QQUdFX1NJWkUgPj4gMik7IG9mZnNldCsrKSB7CisJCXZhbHVlID0gKihiYXNlICsgb2Zmc2V0KTsKKwkJKnArKyA9IHZhbHVlOworIAl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfUEFHRQkJMAorI2RlZmluZSBPTkVOQU5EX1BBR0VTX1BFUl9CTE9DSwkJNjQKKworLyoqCisgKiBvbmVuYW5kX3JlYWRfYmxvY2sgLSBSZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIEByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKKworaW50IG9uZW5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrKQoreworCWludCBwYWdlLCBvZmZzZXQgPSAwOworCisJc2V0X3N5bmNfYnVyc3RfcmVhZCgpOworCisJLyogTk9URTogeW91IG11c3QgcmVhZCBwYWdlIGZyb20gcGFnZSAxIG9mIGJsb2NrIDAgKi8KKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAocGFnZSA9IE9ORU5BTkRfU1RBUlRfUEFHRTsKKwkgICAgcGFnZSA8IE9ORU5BTkRfUEFHRVNfUEVSX0JMT0NLOyBwYWdlKyspIHsKKworCQlpZiAob25lbmFuZF9yZWFkX3BhZ2UoYmxvY2ssIHBhZ2UsIGJ1ZiArIG9mZnNldCkpeworCQkgICAgc2V0X2FzeW5jX3JlYWQoKTsKKwkJICAgIHJldHVybiAxOworCQl9CisKKwkJb2Zmc2V0ICs9IE9ORU5BTkRfUEFHRV9TSVpFOworCX0KKworCXNldF9hc3luY19yZWFkKCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfcmVncy5oIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFjYzhjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaAorICoKKyAqICBPbmVOQU5EIFJlZ2lzdGVyIGhlYWRlciBmaWxlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fT05FTkFORF9SRUdfSAorI2RlZmluZSBfX09ORU5BTkRfUkVHX0gKKworLyogTWVtb3J5IEFkZHJlc3MgTWFwIFRyYW5zbGF0aW9uIChXb3JkIG9yZGVyKSAqLworI2RlZmluZSBPTkVOQU5EX01FTU9SWV9NQVAoeCkJCSgoeCkgPDwgMSkKKworLyoKKyAqIEV4dGVybmFsIEJ1ZmZlclJBTSBhcmVhCisgKi8KKyNkZWZpbmUJT05FTkFORF9CT09UUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDAwMCkKKyNkZWZpbmUJT05FTkFORF9EQVRBUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDIwMCkKKyNkZWZpbmUJT05FTkFORF9TUEFSRVJBTQkJT05FTkFORF9NRU1PUllfTUFQKDB4ODAxMCkKKworLyoKKyAqIE9uZU5BTkQgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lECU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0RFVklDRV9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfVkVSU0lPTl9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMikKKyNkZWZpbmUgT05FTkFORF9SRUdfREFUQV9CVUZGRVJfU0laRQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAzKQorI2RlZmluZSBPTkVOQU5EX1JFR19CT09UX0JVRkZFUl9TSVpFCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX05VTV9CVUZGRVJTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA1KQorI2RlZmluZSBPTkVOQU5EX1JFR19URUNITk9MT0dZCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA2KQorCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MxCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MzCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M0CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M1CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M2CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M3CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDYpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M4CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDcpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0NPTU1BTkQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMjApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NZU19DRkcxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjIxKQorI2RlZmluZSBPTkVOQU5EX1JFR19TWVNfQ0ZHMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RjIyMikKKyNkZWZpbmUgT05FTkFORF9SRUdfQ1RSTF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0lOVEVSUlVQVAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0MSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjRDKQorI2RlZmluZSBPTkVOQU5EX1JFR19FTkRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjREKQorI2RlZmluZSBPTkVOQU5EX1JFR19XUF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNEUpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1NUQVRVUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00wCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAxKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzAJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMQkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMykKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA0KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTIJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNikKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00zCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA3KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDgpCisKKy8qCisgKiBEZXZpY2UgSUQgUmVnaXN0ZXIgRjAwMWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVAkoNCkKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfSVNfRERQCQkoMSA8PCAzKQorI2RlZmluZSBPTkVOQU5EX0RFVklDRV9JU19ERU1VWAkJKDEgPDwgMikKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfVkNDX01BU0sJCSgweDMpCisKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV81MTJNYgkoMHgwMDIpCisKKy8qCisgKiBWZXJzaW9uIElEIFJlZ2lzdGVyIEYwMDJoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfVkVSU0lPTl9QUk9DRVNTX1NISUZUCSg4KQorCisvKgorICogU3RhcnQgQWRkcmVzcyAxIEYxMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERFBfU0hJRlQJCSgxNSkKKworLyoKKyAqIFN0YXJ0IEFkZHJlc3MgOCBGMTA3aCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfRlBBX01BU0sJCSgweDNmKQorI2RlZmluZSBPTkVOQU5EX0ZQQV9TSElGVAkJKDIpCisjZGVmaW5lIE9ORU5BTkRfRlNBX01BU0sJCSgweDAzKQorCisvKgorICogU3RhcnQgQnVmZmVyIFJlZ2lzdGVyIEYyMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9CU0FfTUFTSwkJKDB4MDMpCisjZGVmaW5lIE9ORU5BTkRfQlNBX1NISUZUCQkoOCkKKyNkZWZpbmUgT05FTkFORF9CU0FfQk9PVFJBTQkJKDAgPDwgMikKKyNkZWZpbmUgT05FTkFORF9CU0FfREFUQVJBTTAJCSgyIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfQlNBX0RBVEFSQU0xCQkoMyA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0JTQ19NQVNLCQkoMHgwMykKKworLyoKKyAqIENvbW1hbmQgUmVnaXN0ZXIgRjIyMGggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0NNRF9SRUFECQkoMHgwMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRE9PQgkJKDB4MTMpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1BST0cJCSgweDgwKQorI2RlZmluZSBPTkVOQU5EX0NNRF9QUk9HT09CCQkoMHgxQSkKKyNkZWZpbmUgT05FTkFORF9DTURfVU5MT0NLCQkoMHgyMykKKyNkZWZpbmUgT05FTkFORF9DTURfTE9DSwkJKDB4MkEpCisjZGVmaW5lIE9ORU5BTkRfQ01EX0xPQ0tfVElHSFQJCSgweDJDKQorI2RlZmluZSBPTkVOQU5EX0NNRF9FUkFTRQkJKDB4OTQpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFU0VUCQkoMHhGMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRElECQkoMHg5MCkKKworLyogTk9URTogVGhvc2UgYXJlIG5vdCAqUkVBTCogY29tbWFuZHMgKi8KKyNkZWZpbmUgT05FTkFORF9DTURfQlVGRkVSUkFNCQkoMHgxOTc4KQorCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciBGMjIxaCAoUiwgUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfU1lOQ19SRUFECSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JSTAkJKDEyKQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JMCQkoOSkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9OT19FQ0MJCSgxIDw8IDgpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfUkRZCQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0lOVAkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9JT0JFCQkoMSA8PCA1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX1JEWV9DT05GCSgxIDw8IDQpCisKKy8qCisgKiBDb250cm9sbGVyIFN0YXR1cyBSZWdpc3RlciBGMjQwaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0NUUkxfT05HTwkJKDEgPDwgMTUpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9MT0NLCQkoMSA8PCAxNCkKKyNkZWZpbmUgT05FTkFORF9DVFJMX0xPQUQJCSgxIDw8IDEzKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfUFJPR1JBTQkJKDEgPDwgMTIpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUkFTRQkJKDEgPDwgMTEpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUlJPUgkJKDEgPDwgMTApCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9SU1RCCQkoMSA8PCA3KQorCisvKgorICogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBGMjQxaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0lOVF9NQVNURVIJCSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX0lOVF9SRUFECQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX0lOVF9XUklURQkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9JTlRfRVJBU0UJCSgxIDw8IDUpCisjZGVmaW5lIE9ORU5BTkRfSU5UX1JFU0VUCQkoMSA8PCA0KQorI2RlZmluZSBPTkVOQU5EX0lOVF9DTEVBUgkJKDAgPDwgMCkKKworLyoKKyAqIE5BTkQgRmxhc2ggV3JpdGUgUHJvdGVjdGlvbiBTdGF0dXMgUmVnaXN0ZXIgRjI0RWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9XUF9VUwkJCSgxIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfV1BfTFMJCQkoMSA8PCAxKQorI2RlZmluZSBPTkVOQU5EX1dQX0xUUwkJCSgxIDw8IDApCisKKy8qCisgKiBFQ0MgU3RhdHVzIFJlaWdzZXIgRkYwMGggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9FQ0NfMUJJVAkJKDEgPDwgMCkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVAkJKDEgPDwgMSkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVF9BTEwJCSgweEFBQUEpCisKKyNlbmRpZgkvKiBfX09ORU5BTkRfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYnJ0Yy5hCisKK0NPQkpTLXkgKz0gZGF0ZS5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL2RhdGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRGF0ZSAmIFRpbWUgc3VwcG9ydCBmb3IgUGhpbGlwcyBQQ0Y4NTYzIFJUQworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cnRjLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorCisjZGVmaW5lIEZFQlJVQVJZCQkyCisjZGVmaW5lCVNUQVJUT0ZUSU1FCQkxOTcwCisjZGVmaW5lIFNFQ0RBWQkJCTg2NDAwTAorI2RlZmluZSBTRUNZUgkJCShTRUNEQVkgKiAzNjUpCisjZGVmaW5lCWxlYXB5ZWFyKHllYXIpCQkoKHllYXIpICUgNCA9PSAwKQorI2RlZmluZQlkYXlzX2luX3llYXIoYSkJCShsZWFweWVhcihhKSA/IDM2NiA6IDM2NSkKKyNkZWZpbmUJZGF5c19pbl9tb250aChhKQkobW9udGhfZGF5c1soYSkgLSAxXSkKKworc3RhdGljIGludCBtb250aF9kYXlzWzEyXSA9IHsKKwkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisvKgorICogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIC0gaS5lLiBhZnRlciAxNzUyIChpbiB0aGUgVUspCisgKi8KK3ZvaWQgR3JlZ29yaWFuRGF5KHN0cnVjdCBydGNfdGltZSAqIHRtKQoreworCWludCBsZWFwc1RvRGF0ZTsKKwlpbnQgbGFzdFllYXI7CisJaW50IGRheTsKKwlpbnQgTW9udGhPZmZzZXRbXSA9IHsgMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0IH07CisKKwlsYXN0WWVhcj10bS0+dG1feWVhci0xOworCisJLyoKKwkgKiBOdW1iZXIgb2YgbGVhcCBjb3JyZWN0aW9ucyB0byBhcHBseSB1cCB0byBlbmQgb2YgbGFzdCB5ZWFyCisJICovCisJbGVhcHNUb0RhdGUgPSBsYXN0WWVhci80IC0gbGFzdFllYXIvMTAwICsgbGFzdFllYXIvNDAwOworCisJLyoKKwkgKiBUaGlzIHllYXIgaXMgYSBsZWFwIHllYXIgaWYgaXQgaXMgZGl2aXNpYmxlIGJ5IDQgZXhjZXB0IHdoZW4gaXQgaXMKKwkgKiBkaXZpc2libGUgYnkgMTAwIHVubGVzcyBpdCBpcyBkaXZpc2libGUgYnkgNDAwCisJICoKKwkgKiBlLmcuIDE5MDQgd2FzIGEgbGVhcCB5ZWFyLCAxOTAwIHdhcyBub3QsIDE5OTYgaXMsIGFuZCAyMDAwIHdpbGwgYmUKKwkgKi8KKwlpZigodG0tPnRtX3llYXIlND09MCkgJiYKKwkgICAoKHRtLT50bV95ZWFyJTEwMCE9MCkgfHwgKHRtLT50bV95ZWFyJTQwMD09MCkpICYmCisJICAgKHRtLT50bV9tb24+MikpIHsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgRmViLiAyOSBpbiBhIGxlYXAgeWVhcgorCQkgKi8KKwkJZGF5PTE7CisJfSBlbHNlIHsKKwkJZGF5PTA7CisJfQorCisJZGF5ICs9IGxhc3RZZWFyKjM2NSArIGxlYXBzVG9EYXRlICsgTW9udGhPZmZzZXRbdG0tPnRtX21vbi0xXSArIHRtLT50bV9tZGF5OworCisJdG0tPnRtX3dkYXk9ZGF5JTc7Cit9CisKK3ZvaWQgdG9fdG0oaW50IHRpbSwgc3RydWN0IHJ0Y190aW1lICogdG0pCit7CisJcmVnaXN0ZXIgaW50ICAgIGk7CisJcmVnaXN0ZXIgbG9uZyAgIGhtcywgZGF5OworCisJZGF5ID0gdGltIC8gU0VDREFZOworCWhtcyA9IHRpbSAlIFNFQ0RBWTsKKworCS8qIEhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFyZSBlYXN5ICovCisJdG0tPnRtX2hvdXIgPSBobXMgLyAzNjAwOworCXRtLT50bV9taW4gPSAoaG1zICUgMzYwMCkgLyA2MDsKKwl0bS0+dG1fc2VjID0gKGhtcyAlIDM2MDApICUgNjA7CisKKwkvKiBOdW1iZXIgb2YgeWVhcnMgaW4gZGF5cyAqLworCWZvciAoaSA9IFNUQVJUT0ZUSU1FOyBkYXkgPj0gZGF5c19pbl95ZWFyKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5feWVhcihpKTsKKwl9CisJdG0tPnRtX3llYXIgPSBpOworCisJLyogTnVtYmVyIG9mIG1vbnRocyBpbiBkYXlzIGxlZnQgKi8KKwlpZiAobGVhcHllYXIodG0tPnRtX3llYXIpKSB7CisJCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjk7CisJfQorCWZvciAoaSA9IDE7IGRheSA+PSBkYXlzX2luX21vbnRoKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5fbW9udGgoaSk7CisJfQorCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjg7CisJdG0tPnRtX21vbiA9IGk7CisKKwkvKiBEYXlzIGFyZSB3aGF0IGlzIGxlZnQgb3ZlciAoKzEpIGZyb20gYWxsIHRoYXQuICovCisJdG0tPnRtX21kYXkgPSBkYXkgKyAxOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIGRheSBvZiB3ZWVrCisJICovCisJR3JlZ29yaWFuRGF5KHRtKTsKK30KKworLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQorICogPT4geWVhcj0xOTgwLCBtb249MTIsIGRheT0zMSwgaG91cj0yMywgbWluPTU5LCBzZWM9NTkuCisgKgorICogW0ZvciB0aGUgSnVsaWFuIGNhbGVuZGFyICh3aGljaCB3YXMgdXNlZCBpbiBSdXNzaWEgYmVmb3JlIDE5MTcsCisgKiBCcml0YWluICYgY29sb25pZXMgYmVmb3JlIDE3NTIsIGFueXdoZXJlIGVsc2UgYmVmb3JlIDE1ODIsCisgKiBhbmQgaXMgc3RpbGwgaW4gdXNlIGJ5IHNvbWUgY29tbXVuaXRpZXMpIGxlYXZlIG91dCB0aGUKKyAqIC15ZWFyLzEwMCt5ZWFyLzQwMCB0ZXJtcywgYW5kIGFkZCAxMC5dCisgKgorICogVGhpcyBhbGdvcml0aG0gd2FzIGZpcnN0IHB1Ymxpc2hlZCBieSBHYXVzcyAoSSB0aGluaykuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJmbG93IG9uIDIxMDYtMDItMDcgMDY6Mjg6MTYgb24KKyAqIG1hY2hpbmVzIHdlcmUgbG9uZyBpcyAzMi1iaXQhIChIb3dldmVyLCBhcyB0aW1lX3QgaXMgc2lnbmVkLCB3ZQorICogd2lsbCBhbHJlYWR5IGdldCBwcm9ibGVtcyBhdCBvdGhlciBwbGFjZXMgb24gMjAzOC0wMS0xOSAwMzoxNDowOCkKKyAqLwordW5zaWduZWQgbG9uZworbWt0aW1lICh1bnNpZ25lZCBpbnQgeWVhciwgdW5zaWduZWQgaW50IG1vbiwKKwl1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgaG91ciwKKwl1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgc2VjKQoreworCWlmICgwID49IChpbnQpIChtb24gLT0gMikpIHsJLyogMS4uMTIgLT4gMTEsMTIsMS4uMTAgKi8KKwkJbW9uICs9IDEyOwkJLyogUHV0cyBGZWIgbGFzdCBzaW5jZSBpdCBoYXMgbGVhcCBkYXkgKi8KKwkJeWVhciAtPSAxOworCX0KKworCXJldHVybiAoKCgKKwkJKHVuc2lnbmVkIGxvbmcpICh5ZWFyLzQgLSB5ZWFyLzEwMCArIHllYXIvNDAwICsgMzY3Km1vbi8xMiArIGRheSkgKworCQkJeWVhciozNjUgLSA3MTk0OTkKKwkgICAgKSoyNCArIGhvdXIgLyogbm93IGhhdmUgaG91cnMgKi8KKwkgICkqNjAgKyBtaW4gLyogbm93IGhhdmUgbWludXRlcyAqLworCSkqNjAgKyBzZWM7IC8qIGZpbmFsbHkgc2Vjb25kcyAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4NGJlNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnNlcmlhbC5hCisKK0NPQkpTLXkgKz0gbnMxNjU1MC5vCitDT0JKUy15ICs9IHNlcmlhbC5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNWMxMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL25zMTY1NTAuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICogIAorICogQ09NMSBOUzE2NTUwIHN1cHBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5jKQorICogbW9kaWZpZWQgdG8gdXNlIENGR19JU0FfTUVNIGFuZCBuZXcgZGVmaW5lcworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIENGR19QUklOVEYKKyNpZmRlZiBDRkdfTlMxNjU1MAorCisjaW5jbHVkZSA8bnMxNjU1MC5oPgorCisjZGVmaW5lIExDUlZBTCBMQ1JfOE4xCQkJCQkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCisjZGVmaW5lIE1DUlZBTCAoTUNSX0RUUiB8IE1DUl9SVFMpCQkJLyogUlRTL0RUUiAqLworI2RlZmluZSBGQ1JWQUwgKEZDUl9GSUZPX0VOIHwgRkNSX1JYU1IgfCBGQ1JfVFhTUikJLyogQ2xlYXIgJiBlbmFibGUgRklGT3MgKi8KKwordm9pZCBOUzE2NTUwX2luaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcikKK3sKKwljb21fcG9ydC0+aWVyID0gMHgwMDsKKyNpZmRlZiBDT05GSUdfT01BUAorCWNvbV9wb3J0LT5tZHIxID0gMHg3OyAgIC8qIG1vZGUgc2VsZWN0IHJlc2V0IFRMMTZDNzUwKi8KKyNlbmRpZgorCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRSB8IExDUlZBTDsKKwljb21fcG9ydC0+ZGxsID0gYmF1ZF9kaXZpc29yICYgMHhmZjsKKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUlZBTDsKKwljb21fcG9ydC0+bWNyID0gTUNSVkFMOworCWNvbV9wb3J0LT5mY3IgPSBGQ1JWQUw7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUCkKKwljb21fcG9ydC0+bWRyMSA9IDA7CS8qIHNlbGVjdCB1YXJ0IG1vZGUgKi8KKyNlbmRpZgorfQorCit2b2lkIE5TMTY1NTBfcmVpbml0IChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpCit7CisJY29tX3BvcnQtPmllciA9IDB4MDA7CisJY29tX3BvcnQtPmxjciA9IExDUl9CS1NFOworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOworCWNvbV9wb3J0LT5kbG0gPSAoYmF1ZF9kaXZpc29yID4+IDgpICYgMHhmZjsKKwljb21fcG9ydC0+bGNyID0gTENSVkFMOworCWNvbV9wb3J0LT5tY3IgPSBNQ1JWQUw7CisJY29tX3BvcnQtPmZjciA9IEZDUlZBTDsKK30KKwordm9pZCBOUzE2NTUwX3B1dGMgKE5TMTY1NTBfdCBjb21fcG9ydCwgY2hhciBjKQoreworCXdoaWxlICgoY29tX3BvcnQtPmxzciAmIExTUl9USFJFKSA9PSAwKTsKKwljb21fcG9ydC0+dGhyID0gYzsKK30KKworY2hhciBOUzE2NTUwX2dldGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwl3aGlsZSAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfRFIpID09IDApOworCXJldHVybiAoY29tX3BvcnQtPnJicik7Cit9CisKK2ludCBOUzE2NTUwX3RzdGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwlyZXR1cm4gKChjb21fcG9ydC0+bHNyICYgTFNSX0RSKSAhPSAwKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBSb2IgVGF5bG9yLCBGbHlpbmcgUGlnIFN5c3RlbXMuIHJvYnRAZmx5aW5ncGlnLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfUFJJTlRGCisjaWZkZWYgQ0ZHX05TMTY1NTBfU0VSSUFMCisKKyNpbmNsdWRlIDxuczE2NTUwLmg+CisjaWZkZWYgQ0ZHX05TODczMDgKKyNpbmNsdWRlIDxuczg3MzA4Lmg+CisjZW5kaWYKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTE7CisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAyCitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT00yOworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMworc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMzsKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTQ7CisjZWxzZQorI2Vycm9yIG5vIHZhbGlkIGNvbnNvbGUgZGVmaW5lZAorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2FsY19kaXZpc29yICh2b2lkKQoreworLy8JREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJLyogSWYgY2FuJ3QgY2xlYW5seSBjbG9jayAxMTUyMDAgc2V0IGRpdiB0byAxICovCisJaWYgKChDRkdfTlMxNjU1MF9DTEsgPT0gMTIwMDAwMDApICYmIChDT05GSUdfQkFVRFJBVEUgPT0gMTE1MjAwKSkgeworCQljb25zb2xlLT5vc2NfMTJtX3NlbCA9IE9TQ18xMk1fU0VMOwkvKiBlbmFibGUgNi41ICogZGl2aXNvciAqLworCQlyZXR1cm4gKDEpOwkJCQkvKiByZXR1cm4gMSBmb3IgYmFzZSBkaXZpc29yICovCisJfQorCWNvbnNvbGUtPm9zY18xMm1fc2VsID0gMDsJCQkvKiBjbGVhciBpZiBwcmV2aXNvdWx5IHNldCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorCS8qIElmIGNhbid0IGNsZWFubHkgY2xvY2sgMTE1MjAwIHNldCBkaXYgdG8gMSAqLworCWlmICgoQ0ZHX05TMTY1NTBfQ0xLID09IDQ4MDAwMDAwKSAmJiAoQ09ORklHX0JBVURSQVRFID09IDExNTIwMCkpIHsKKwkJcmV0dXJuICgyNik7CQkvKiByZXR1cm4gMjYgZm9yIGJhc2UgZGl2aXNvciAqLworCX0KKyNlbmRpZgorCXJldHVybiAoQ0ZHX05TMTY1NTBfQ0xLIC8gMTYgLyBDT05GSUdfQkFVRFJBVEUpOworfQorCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJaW50IGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKworI2lmZGVmIENGR19OUzg3MzA4CisJaW5pdGlhbGlzZV9uczg3MzA4KCk7CisjZW5kaWYKKworCU5TMTY1NTBfaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlOUzE2NTUwX3B1dGMoY29uc29sZSwgJ1xyJyk7CisKKwlOUzE2NTUwX3B1dGMoY29uc29sZSwgYyk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCisKK2ludAorc2VyaWFsX2dldGModm9pZCkKK3sKKwlyZXR1cm4gTlMxNjU1MF9nZXRjKGNvbnNvbGUpOworfQorCitpbnQKK3NlcmlhbF90c3RjKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfdHN0Yyhjb25zb2xlKTsKK30KKwordm9pZAorc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwlpbnQgY2xvY2tfZGl2aXNvcjsKKworICAgIGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKwlOUzE2NTUwX3JlaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy91c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5ZDEwMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnVzYi5hCisKK0NPQkpTLXkgKz0gdXNiLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExZGRkNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVVNCIGJvb3Rsb2FkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmljayBCcm9uc29uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisjaW5jbHVkZSAidXNiLmgiCisKK2V4dGVybiB2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisKK3R5cGVkZWYgaW50IGJvb3Rfb3NfZm4gKHZvaWQpOworCisvKiBzZW5kIGEgYnVmZmVyIHZpYSBVU0IgKi8KK2ludCB1c2Jfc2VuZCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBidWZmZXJfc2l6ZSkKKyAgIHsKKyAgIGludCByZXQgPSAwOworCisgICBpZiAoISgqcGVyaV90eGNzciAmIE1VU0JfVFhDU1JfVFhQS1RSRFkpKQorICAgICAgIHsKKyAgICAgICB1bnNpZ25lZCBpbnQgY250cjsKKworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBidWZmZXJfc2l6ZTsgY250cisrKQorICAgICAgICAgICAqYnVsa19maWZvID0gYnVmZmVyW2NudHJdOworCisgICAgICAgKnBlcmlfdHhjc3IgfD0gTVVTQl9UWENTUl9UWFBLVFJEWTsKKworICAgICAgIHJldCA9IGJ1ZmZlcl9zaXplOworICAgICAgIH0KKyAgIHJldHVybiByZXQ7CisgICB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgdXNiX3JlY3YgKHU4ICpidWZmZXIsIGludCBzaXplKQoreworICAgaW50IGNudHI7CisgICB1MTYgY291bnQgPSAwOworCisgICBpZiAoKnBlcmlfcnhjc3IgJiBNVVNCX1JYQ1NSX1JYUEtUUkRZKQorICAgICAgIHsKKyAgICAgICBjb3VudCA9ICpyeGNvdW50OworICAgICAgIGZvciAoY250ciA9IDA7IGNudHIgPCBjb3VudDsgY250cisrKQorICAgICAgICAgICB7CisgICAgICAgICAgICpidWZmZXIrKyA9ICpidWxrX2ZpZm87CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLyogQ2xlYXIgdGhlIFJYUEtUUkRZIGJpdCAqLworICAgICAgICpwZXJpX3J4Y3NyICY9IH5NVVNCX1JYQ1NSX1JYUEtUUkRZOworICAgICAgIH0KKyAgIHJldHVybiBjb3VudDsgIC8qIEZJWE1FICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVzYl9vdXRidWZmZXJbNjRdOworCitzdGF0aWMgdm9pZCB1c2JfbXNnICh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyICptc2cpCisgICB7CisgICB1bnNpZ25lZCBjaGFyICpwX2NoYXIgPSB1c2Jfb3V0YnVmZmVyOworCisgICAqIChpbnQgKikgcF9jaGFyID0gY21kOworICAgcF9jaGFyICs9IHNpemVvZiAoY21kKTsKKyAgIGlmIChtc2cpCisgICAgICAgeworICAgICAgIHdoaWxlICgqbXNnKQorICAgICAgICAgICAqcF9jaGFyKys9ICptc2crKzsKKyAgICAgICAqcF9jaGFyKys9IDA7CisgICAgICAgfQorICAgdXNiX3NlbmQgKHVzYl9vdXRidWZmZXIsIHBfY2hhciAtIHVzYl9vdXRidWZmZXIpOworICAgfQorCitzdGF0aWMgdm9pZCB1c2JfY29kZSAodW5zaWduZWQgaW50IGNtZCwgdTMyIGNvZGUpCisgICB7CisgICB1bnNpZ25lZCBpbnQgKnBfaW50ID0gKHVuc2lnbmVkIGludCAqKSB1c2Jfb3V0YnVmZmVyOworCisgICAqcF9pbnQrKyA9IGNtZDsKKyAgICpwX2ludCsrID0gY29kZTsKKyAgIHVzYl9zZW5kICh1c2Jfb3V0YnVmZmVyLCAoKHVuc2lnbmVkIGNoYXIgKikgcF9pbnQpIC0gdXNiX291dGJ1ZmZlcik7CisgICB9CisKK3ZvaWQgZG9fdXNiICh2b2lkKQorICAgeworICAgYm9vdF9vc19mbiAqYm9vdF9mbjsKKyAgIGludCByZXM7CisgICB1MzIgdXNiX2luYnVmZmVyWzUxMl07CisgICB1MzIgdG90YWw7CisgICB1OCAqYWRkcjsKKyAgIHUzMiBieXRlczsKKyAgIGludCBzaXplOworICAgaW50IGNudHIgPSAwOworCisgICB1c2JfbXNnIChVU0JMT0FEX0NNRF9GSUxFX1JFUSwgImZpbGUgcmVxIik7CisgICB3aGlsZSgrK2NudHIgPCAyMDAwMDApICAvKiB0cnkgZm9yIDEgc2Vjb25kIHRoZW4gYmFpbCBvdXQgKi8KKyAgICAgICB7CisgICAgICAgcmVzID0gdXNiX3JlY3YgKCh1OCAqKSB1c2JfaW5idWZmZXIsIHNpemVvZiAodXNiX2luYnVmZmVyKSk7CisgICAgICAgc3dpdGNoICh1c2JfaW5idWZmZXJbMF0pCisgICAgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSBVU0JMT0FEX0NNRF9GSUxFOgorICAgICAgICAgICAgICAgcHJpbnRmICgiVVNCTE9BRF9DTURfRklMRSB0b3RhbCA9ICVkIGNtZCA9ICVjJWMlYyVjIHZhbCA9IDB4JXggdmFsID0gMHgleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgIHJlcywgCisgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMF0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMV0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbMl0sICgoY2hhciopJnVzYl9pbmJ1ZmZlclswXSlbM10sCisgICAgICAgICAgICAgICAgICAgICAgIHVzYl9pbmJ1ZmZlclsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgdXNiX2luYnVmZmVyWzJdKTsKKyAgICAgICAgICAgICAgIHRvdGFsID0gdXNiX2luYnVmZmVyWzFdOyAgLyogZ2V0IHNpemUgYW5kIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgIGFkZHIgPSAodTggKikgdXNiX2luYnVmZmVyWzJdOworICAgICAgICAgICAgICAgdXNiX2NvZGUgKFVTQkxPQURfQ01EX0VDSE9fU1osIHRvdGFsKTsKKworICAgICAgICAgICAgICAgYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzIDwgdG90YWwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHNpemUgPSB1c2JfcmVjdiAoKHU4ICopIHVzYl9pbmJ1ZmZlciwgc2l6ZW9mICh1c2JfaW5idWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWRkciwgdXNiX2luYnVmZmVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICBhZGRyICs9IHNpemU7CisgICAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB1c2JfY29kZSAoVVNCTE9BRF9DTURfUkVQT1JUX1NaLCB0b3RhbCk7ICAvKiB0ZWxsIGhpbSB3ZSBnb3QgdGhpcyBtYW55IGJ5dGVzICovCisgICAgICAgICAgICAgICBwcmludGYgKCJnb3QgZmlsZSBhZGRyID0gMHgleCBjb3VudGVyID0gJWRcbiIsIGFkZHIsIGNudHIpOworICAgICAgICAgICAgICAgdXNiX21zZyAoVVNCTE9BRF9DTURfRklMRV9SRVEsICJmaWxlIHJlcSIpOyAgLyogc2VlIGlmIHRoZXkgaGF2ZSBhbm90aGVyIGZpbGUgZm9yIHVzICovCisgICAgICAgICAgICAgICBjbnRyID0gMDsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIFVTQkxPQURfQ01EX0pVTVA6CisgICAgICAgICAgICAgICBwcmludGYgKCJVU0JMT0FEX0NNRF9KVU1QIHRvdGFsID0gJWQgYWRkciA9IDB4JXggdmFsID0gMHgleFxuIiwgcmVzLCB1c2JfaW5idWZmZXJbMF0sIHVzYl9pbmJ1ZmZlclsxXSk7CisgICAgICAgICAgICAgICBib290X2ZuID0gKGJvb3Rfb3NfZm4gKikgdXNiX2luYnVmZmVyWzFdOworICAgICAgICAgICAgICAgYm9vdF9mbigpOyAgLyogZ28gdG8gdS1ib290IGFuZCBtYXliZSBrZXJuZWwgKi8KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICB1ZGVsYXkoMTApOyAgLyogZGVsYXkgMTAgdXMgKi8KKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJVU0IgZG9uZVxuIik7CisgICAgICAgaGFuZygpOworICAgfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmggYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MyZWJjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFVTQiBib290bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2sgQnJvbnNvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9VU0JfSF8KKyNkZWZpbmUgX1VTQl9IXworCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9CQVNFICAgICAoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHhBQjAwMCkKKworI2RlZmluZSBPTUFQMzRYWF9VU0JfRVAobikgICAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDEwMCArIDB4MTAqKG4pKQorCisjZGVmaW5lIE1VU0JfUlhDU1IgICAgIDB4MDYKKyNkZWZpbmUgTVVTQl9SWENPVU5UICAgICAgIDB4MDgKKyNkZWZpbmUgTVVTQl9UWENTUiAgICAgMHgwMgorI2RlZmluZSBNVVNCX0ZJRk9TSVpFICAgICAgMHgwRgorI2RlZmluZSBPTUFQMzRYWF9VU0JfUlhDU1IobikgICAgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9SWENTUikKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1JYQ09VTlQobikgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfUlhDT1VOVCkKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1RYQ1NSKG4pICAgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfVFhDU1IpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9GSUZPU0laRShuKSAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX0ZJRk9TSVpFKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfRklGTyhuKSAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDIwICsgKChuKSAqIDQpKQorCisvKiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBCVUxLX0VORFBPSU5UIDEKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfcnhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9SWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9SWENTUl9SWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTE2ICpyeGNvdW50ICAgID0gKHZvbGF0aWxlIHUxNiAqKSBPTUFQMzRYWF9VU0JfUlhDT1VOVChCVUxLX0VORFBPSU5UKTsKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfdHhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9UWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9UWENTUl9UWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTggICpidWxrX2ZpZm8gID0gKHZvbGF0aWxlIHU4ICAqKSBPTUFQMzRYWF9VU0JfRklGTyhCVUxLX0VORFBPSU5UKTsKKworLyogSW4gaGlnaCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDUxMgorICAgSW4gZnVsbCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDY0ICovCisjZGVmaW5lIFJYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wICAoMHgwMjAwKQorI2RlZmluZSBSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzFfMSAgKDB4MDA0MCkKKworI2RlZmluZSBNSU4oYSxiKSAoICgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIFBBQ0s0KGEsYixjLGQpICAgICAoKChkKTw8MjQpIHwgKChjKTw8MTYpIHwgKChiKTw8OCkgfCAoYSkpCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEUgUEFDSzQoJ1UnLCAnUycsICdCJywgJ3MnKSAgLyogc2VuZCBmaWxlIHNpemUgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfSlVNUCBQQUNLNCgnVScsICdTJywgJ0InLCAnaicpICAvKiBnbyB3aGVyZSBJIHRlbGwgeW91ICovCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEVfUkVRIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdmJykgIC8qIGZpbGUgcmVxdWVzdCAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9FQ0hPX1NaIFBBQ0s0KCdVJywgJ1MnLCAnQicsICduJykgIC8qIGVjaG8gZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX1JFUE9SVF9TWiBQQUNLNCgnVScsICdTJywgJ0InLCAnbycpICAvKiByZXBvcnQgZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX01FU1NBR0UgUEFDSzQoJ1UnLCAnUycsICdCJywgJ20nKSAgLyogbWVzc2FnZSBmb3IgZGVidWcgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL01ha2VmaWxlIGIveC1sb2FkZXIvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQxOWI5OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisjCisKK1NVQkRJUlMJOj0gZmF0CisKKy5kZXBlbmQgYWxsOgorCUBmb3IgZGlyIGluICQoU1VCRElSUykgOyBkbyBcCisJCSQoTUFLRSkgLUMgJCRkaXIgJEAgOyBkb25lCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUgYi94LWxvYWRlci9mcy9mYXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODdhZjczYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL2ZhdC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWJmYXQuYQorCitBT0JKUwk9CitDT0JKUwk9IGZhdC5vIGZpbGUubworCitTUkNTCTo9ICQoQU9CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKEFPQkpTKSAkKENPQkpTKSkKKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvZmF0L2ZhdC5jIGIveC1sb2FkZXIvZnMvZmF0L2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzNjM4ODEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9mYXQvZmF0LmMKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiBmYXQuYworICoKKyAqIFIvTyAoVilGQVQgMTIvMTYvMzIgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbiBieSBNYXJjdXMgU3VuZGJlcmcKKyAqCisgKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CisgKiAyMDAzLTAzLTEwIC0ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byB1Ym9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgQ0ZHX0NNRF9GQVQKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gbG93ZXJjYXNlLgorICovCitzdGF0aWMgdm9pZAorZG93bmNhc2UoY2hhciAqc3RyKQoreworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJVE9MT1dFUigqc3RyKTsKKwkJc3RyKys7CisJfQorfQorCitzdGF0aWMgIGJsb2NrX2Rldl9kZXNjX3QgKmN1cl9kZXYgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQgPSAwOworc3RhdGljIGludCBjdXJfcGFydCA9IDE7CisKKyNkZWZpbmUgRE9TX1BBUlRfVEJMX09GRlNFVAkweDFiZQorI2RlZmluZSBET1NfUEFSVF9NQUdJQ19PRkZTRVQJMHgxZmUKKyNkZWZpbmUgRE9TX0ZTX1RZUEVfT0ZGU0VUCTB4NTIKKworaW50IHN0cm5jbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCxzaXplX3QgY291bnQpCit7CisgICAgICAgIHJlZ2lzdGVyIHNpZ25lZCBjaGFyIF9fcmVzID0gMDsKKworICAgICAgICB3aGlsZSAoY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9fcmVzID0gKmNzIC0gKmN0KyspICE9IDAgfHwgISpjcysrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfX3JlczsKK30KKworY2hhciAqIHN0cmNweShjaGFyICogZGVzdCxjb25zdCBjaGFyICpzcmMpCit7CisgICAgICAgIGNoYXIgKnRtcCA9IGRlc3Q7CisKKyAgICAgICAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgKi87CisgICAgICAgIHJldHVybiB0bXA7Cit9CisKK2ludCBzdHJjbXAoY29uc3QgY2hhciAqIGNzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKyAgICAgICAgcmVnaXN0ZXIgc2lnbmVkIGNoYXIgX19yZXM7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9fcmVzID0gKmNzIC0gKmN0KyspICE9IDAgfHwgISpjcysrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX19yZXM7Cit9Cit2b2lkICogbWVtY3B5KHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgY291bnQpCit7CisgICAgICAgIGNoYXIgKnRtcCA9IChjaGFyICopIGRlc3QsICpzID0gKGNoYXIgKikgc3JjOworCisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICp0bXArKyA9ICpzKys7CisKKyAgICAgICAgcmV0dXJuIGRlc3Q7Cit9CisKKworaW50IGRpc2tfcmVhZCAoX191MzIgc3RhcnRibG9jaywgX191MzIgZ2V0c2l6ZSwgX191OCAqIGJ1ZnB0cikKK3sKKwlzdGFydGJsb2NrICs9IHBhcnRfb2Zmc2V0OworCWlmIChjdXJfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoY3VyX2Rldi0+YmxvY2tfcmVhZCkgeworCQlyZXR1cm4gY3VyX2Rldi0+YmxvY2tfcmVhZCAoY3VyX2Rldi0+ZGV2LCBzdGFydGJsb2NrLCBnZXRzaXplLCAodW5zaWduZWQgbG9uZyAqKWJ1ZnB0cik7CisJfQorCXJldHVybiAtMTsKK30KKworCitpbnQKK2ZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyW1NFQ1RPUl9TSVpFXTsKKworCWlmICghZGV2X2Rlc2MtPmJsb2NrX3JlYWQpCisJCXJldHVybiAtMTsKKwljdXJfZGV2PWRldl9kZXNjOworCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBNQlIgKG9uIGZsb3BwaWVzIHdlIGhhdmUgb25seSBhIFBCUikgKi8KKwlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQgKGRldl9kZXNjLT5kZXYsIDAsIDEsICh1bG9uZyAqKSBidWZmZXIpICE9IDEpIHsKKwkJcHJpbnRmICgiKiogQ2FuJ3QgcmVhZCBmcm9tIGRldmljZSAlZCAqKlxuIiwgZGV2X2Rlc2MtPmRldik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGJ1ZmZlcltET1NfUEFSVF9NQUdJQ19PRkZTRVRdICE9IDB4NTUgfHwKKwkJYnVmZmVyW0RPU19QQVJUX01BR0lDX09GRlNFVCArIDFdICE9IDB4YWEpIHsKKwkJLyogbm8gc2lnbmF0dXJlIGZvdW5kICovCisJCXJldHVybiAtMTsKKwl9CisJaWYoIXN0cm5jbXAoKGNoYXIgKikmYnVmZmVyW0RPU19GU19UWVBFX09GRlNFVF0sIkZBVCIsMykpIHsKKwkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLworCQljdXJfcGFydCA9IDE7CisJCXBhcnRfb2Zmc2V0PTA7CisJfQorCWVsc2UgeworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgfHwgXAorICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpCisJCWRpc2tfcGFydGl0aW9uX3QgaW5mbzsKKwkJaWYoIWdldF9wYXJ0aXRpb25faW5mbyhkZXZfZGVzYywgcGFydF9ubywgJmluZm8pKSB7CisJCQlwYXJ0X29mZnNldCA9IGluZm8uc3RhcnQ7CisJCQljdXJfcGFydCA9IHBhcnRfbm87CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IHZhbGlkIG9uIGRldmljZSAlZCAqKlxuIixwYXJ0X25vLGRldl9kZXNjLT5kZXYpOworCQkJcmV0dXJuIC0xOworCQl9CisjZWxzZQorCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlCisJCSAqIHBhcnRpdGlvbiB3aGVyZSB0aGUgRE9TIEZTIHJlc2lkZXMuIFRoaXMgY2FuIGJlIGRvbmUKKwkJICogYnkgdXNpbmcgdGhlIGdldF9wYXJ0aXRpb25faW5mbyByb3V0aW5lLiBGb3IgdGhpcworCQkgKiBwdXJwb3NlIHRoZSBsaWJwYXJ0IG11c3QgYmUgaW5jbHVkZWQuCisJCSAqLworCQlwYXJ0X29mZnNldD02MzsKKwkJLy9wYXJ0X29mZnNldD0wOworCQljdXJfcGFydCA9IDE7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEdldCB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgZGlyZWN0b3J5IGRlbGltaXRlciAoJy8nIG9yICdcJykgaW4gYSBzdHJpbmcuCisgKiBSZXR1cm4gaW5kZXggaW50byBzdHJpbmcgaWYgZm91bmQsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorZGlyZGVsaW0oY2hhciAqc3RyKQoreworCWNoYXIgKnN0YXJ0ID0gc3RyOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlpZiAoSVNESVJERUxJTSgqc3RyKSkgcmV0dXJuIHN0ciAtIHN0YXJ0OworCQlzdHIrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCisKKy8qCisgKiBNYXRjaCB2b2x1bWVfaW5mbyBmc190eXBlIHN0cmluZ3MuCisgKiBSZXR1cm4gMCBvbiBtYXRjaCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50Citjb21wYXJlX3NpZ24oY2hhciAqc3RyMSwgY2hhciAqc3RyMikKK3sKKwljaGFyICplbmQgPSBzdHIxK1NJR05MRU47CisKKwl3aGlsZSAoc3RyMSAhPSBlbmQpIHsKKwkJaWYgKCpzdHIxICE9ICpzdHIyKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RyMSsrOworCQlzdHIyKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEV4dHJhY3QgemVybyB0ZXJtaW5hdGVkIHNob3J0IG5hbWUgZnJvbSBhIGRpcmVjdG9yeSBlbnRyeS4KKyAqLworc3RhdGljIHZvaWQgZ2V0X25hbWUgKGRpcl9lbnRyeSAqZGlyZW50LCBjaGFyICpzX25hbWUpCit7CisJY2hhciAqcHRyOworCisJbWVtY3B5IChzX25hbWUsIGRpcmVudC0+bmFtZSwgOCk7CisJc19uYW1lWzhdID0gJ1wwJzsKKwlwdHIgPSBzX25hbWU7CisJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCisJCXB0cisrOworCWlmIChkaXJlbnQtPmV4dFswXSAmJiBkaXJlbnQtPmV4dFswXSAhPSAnICcpIHsKKwkJKnB0ciA9ICcuJzsKKwkJcHRyKys7CisJCW1lbWNweSAocHRyLCBkaXJlbnQtPmV4dCwgMyk7CisJCXB0clszXSA9ICdcMCc7CisJCXdoaWxlICgqcHRyICYmICpwdHIgIT0gJyAnKQorCQkJcHRyKys7CisJfQorCSpwdHIgPSAnXDAnOworCWlmICgqc19uYW1lID09IERFTEVURURfRkxBRykKKwkJKnNfbmFtZSA9ICdcMCc7CisJZWxzZSBpZiAoKnNfbmFtZSA9PSBhUklORykKKwkJKnNfbmFtZSA9ICflJzsKKwlkb3duY2FzZSAoc19uYW1lKTsKK30KKworLyoKKyAqIEdldCB0aGUgZW50cnkgYXQgaW5kZXggJ2VudHJ5JyBpbiBhIEZBVCAoMTIvMTYvMzIpIHRhYmxlLgorICogT24gZmFpbHVyZSAweDAwIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgX191MzIKK2dldF9mYXRlbnQoZnNkYXRhICpteWRhdGEsIF9fdTMyIGVudHJ5KQoreworCV9fdTMyIGJ1Zm51bTsKKwlfX3UzMiBvZmZzZXQ7CisJX191MzIgcmV0ID0gMHgwMDsKKworCXN3aXRjaCAobXlkYXRhLT5mYXRzaXplKSB7CisJY2FzZSAzMjoKKwkJYnVmbnVtID0gZW50cnkgLyBGQVQzMkJVRlNJWkU7CisJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMzJCVUZTSVpFOworCQlicmVhazsKKwljYXNlIDE2OgorCQlidWZudW0gPSBlbnRyeSAvIEZBVDE2QlVGU0laRTsKKwkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQxNkJVRlNJWkU7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMTJCVUZTSVpFOworCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDEyQlVGU0laRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbnN1cHBvcnRlZCBGQVQgc2l6ZSAqLworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZWFkIGEgbmV3IGJsb2NrIG9mIEZBVCBlbnRyaWVzIGludG8gdGhlIGNhY2hlLiAqLworCWlmIChidWZudW0gIT0gbXlkYXRhLT5mYXRidWZudW0pIHsKKwkJaW50IGdldHNpemUgPSBGQVRCVUZTSVpFL0ZTX0JMT0NLX1NJWkU7CisJCV9fdTggKmJ1ZnB0ciA9IChfX3U4ICopbXlkYXRhLT5mYXRidWY7CisJCV9fdTMyIGZhdGxlbmd0aCA9IG15ZGF0YS0+ZmF0bGVuZ3RoOworCQlfX3UzMiBzdGFydGJsb2NrID0gYnVmbnVtICogRkFUQlVGQkxPQ0tTOworCisJCWZhdGxlbmd0aCAqPSBTRUNUT1JfU0laRTsJLyogV2Ugd2FudCBpdCBpbiBieXRlcyBub3cgKi8KKwkJc3RhcnRibG9jayArPSBteWRhdGEtPmZhdF9zZWN0OwkvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBkaXNrICovCisKKwkJaWYgKGdldHNpemUgPiBmYXRsZW5ndGgpIGdldHNpemUgPSBmYXRsZW5ndGg7CisJCWlmIChkaXNrX3JlYWQoc3RhcnRibG9jaywgZ2V0c2l6ZSwgYnVmcHRyKSA8IDApIHsKKwkJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgRkFUIGJsb2Nrc1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW15ZGF0YS0+ZmF0YnVmbnVtID0gYnVmbnVtOworCX0KKworCS8qIEdldCB0aGUgYWN0dWFsIGVudHJ5IGZyb20gdGhlIHRhYmxlICovCisJc3dpdGNoIChteWRhdGEtPmZhdHNpemUpIHsKKwljYXNlIDMyOgorCQlyZXQgPSBGQVQyQ1BVMzIoKChfX3UzMiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOworCQlicmVhazsKKwljYXNlIDE2OgorCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOworCQlicmVhazsKKwljYXNlIDEyOiB7CisJCV9fdTMyIG9mZjE2ID0gKG9mZnNldCozKS80OworCQlfX3UxNiB2YWwxLCB2YWwyOworCisJCXN3aXRjaCAob2Zmc2V0ICYgMHgzKSB7CisJCWNhc2UgMDoKKwkJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKKwkJCXJldCAmPSAweGZmZjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl2YWwxID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOworCQkJdmFsMSAmPSAweGYwMDA7CisJCQl2YWwyID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNisxXSk7CisJCQl2YWwyICY9IDB4MDBmZjsKKwkJCXJldCA9ICh2YWwyIDw8IDQpIHwgKHZhbDEgPj4gMTIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXZhbDEgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CisJCQl2YWwxICY9IDB4ZmYwMDsKKwkJCXZhbDIgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2KzFdKTsKKwkJCXZhbDIgJj0gMHgwMDBmOworCQkJcmV0ID0gKHZhbDIgPDwgOCkgfCAodmFsMSA+PiA4KTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7OworCQkJcmV0ID0gKHJldCAmIDB4ZmZmMCkgPj4gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJYnJlYWs7CisJfQorCUZBVF9EUFJJTlQoInJldDogJWQsIG9mZnNldDogJWRcbiIsIHJldCwgb2Zmc2V0KTsKKworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFJlYWQgYXQgbW9zdCAnc2l6ZScgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGNsdXN0ZXIgaW50byAnYnVmZmVyJy4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorZ2V0X2NsdXN0ZXIoZnNkYXRhICpteWRhdGEsIF9fdTMyIGNsdXN0bnVtLCBfX3U4ICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgaWR4ID0gMDsKKwlfX3UzMiBzdGFydHNlY3Q7CisKKwlpZiAoY2x1c3RudW0gPiAwKSB7CisJCXN0YXJ0c2VjdCA9IG15ZGF0YS0+ZGF0YV9iZWdpbiArIGNsdXN0bnVtKm15ZGF0YS0+Y2x1c3Rfc2l6ZTsKKwl9IGVsc2UgeworCQlzdGFydHNlY3QgPSBteWRhdGEtPnJvb3RkaXJfc2VjdDsKKwl9CisKKwlpZiAoZGlza19yZWFkKHN0YXJ0c2VjdCwgc2l6ZS9GU19CTE9DS19TSVpFICwgYnVmZmVyKSA8IDApIHsKKwkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZihzaXplICUgRlNfQkxPQ0tfU0laRSkgeworCQlfX3U4IHRtcGJ1ZltGU19CTE9DS19TSVpFXTsKKwkJaWR4PSBzaXplL0ZTX0JMT0NLX1NJWkU7CisJCWlmIChkaXNrX3JlYWQoc3RhcnRzZWN0ICsgaWR4LCAxLCB0bXBidWYpIDwgMCkgeworCQkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWZmZXIgKz0gaWR4KkZTX0JMT0NLX1NJWkU7CisKKwkJbWVtY3B5KGJ1ZmZlciwgdG1wYnVmLCBzaXplICUgRlNfQkxPQ0tfU0laRSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZWFkIGF0IG1vc3QgJ21heHNpemUnIGJ5dGVzIGZyb20gdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoICdkZW50cHRyJworICogaW50byAnYnVmZmVyJy4KKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgb24gZmF0YWwgZXJyb3JzLgorICovCitzdGF0aWMgbG9uZworZ2V0X2NvbnRlbnRzKGZzZGF0YSAqbXlkYXRhLCBkaXJfZW50cnkgKmRlbnRwdHIsIF9fdTggKmJ1ZmZlciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZpbGVzaXplID0gRkFUMkNQVTMyKGRlbnRwdHItPnNpemUpLCBnb3RzaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNwZXJjbHVzdCA9IG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFOworCV9fdTMyIGN1cmNsdXN0ID0gU1RBUlQoZGVudHB0cik7CisJX191MzIgZW5kY2x1c3QsIG5ld2NsdXN0OworCXVuc2lnbmVkIGxvbmcgYWN0c2l6ZTsKKworCUZBVF9EUFJJTlQoIkZpbGVzaXplOiAlbGQgYnl0ZXNcbiIsIGZpbGVzaXplKTsKKworCWlmIChtYXhzaXplID4gMCAmJiBmaWxlc2l6ZSA+IG1heHNpemUpIGZpbGVzaXplID0gbWF4c2l6ZTsKKworCUZBVF9EUFJJTlQoIlJlYWRpbmc6ICVsZCBieXRlc1xuIiwgZmlsZXNpemUpOworCisJYWN0c2l6ZT1ieXRlc3BlcmNsdXN0OworCWVuZGNsdXN0PWN1cmNsdXN0OworCWRvIHsKKwkJLyogc2VhcmNoIGZvciBjb25zZWN1dGl2ZSBjbHVzdGVycyAqLworCQl3aGlsZShhY3RzaXplIDwgZmlsZXNpemUpIHsKKwkJCW5ld2NsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKKwkJCWlmKChuZXdjbHVzdCAtMSkhPWVuZGNsdXN0KQorCQkJCWdvdG8gZ2V0aXQ7CisJCQlpZiAobmV3Y2x1c3QgPD0gMHgwMDAxIHx8IG5ld2NsdXN0ID49IDB4ZmZmMCkgeworCQkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBuZXdjbHVzdCk7CisJCQkJRkFUX0RQUklOVCgiSW52YWxpZCBGQVQgZW50cnlcbiIpOworCQkJCXJldHVybiBnb3RzaXplOworCQkJfQorCQkJZW5kY2x1c3Q9bmV3Y2x1c3Q7CisJCQlhY3RzaXplKz0gYnl0ZXNwZXJjbHVzdDsKKwkJfQorCQkvKiBhY3RzaXplID49IGZpbGUgc2l6ZSAqLworCQlhY3RzaXplIC09IGJ5dGVzcGVyY2x1c3Q7CisJCS8qIGdldCByZW1haW5pbmcgY2x1c3RlcnMgKi8KKwkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CisJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogZ2V0IHJlbWFpbmluZyBieXRlcyAqLworCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKKwkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKKwkJYnVmZmVyICs9IGFjdHNpemU7CisJCWFjdHNpemU9IGZpbGVzaXplOworCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBlbmRjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKKwkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlnb3RzaXplKz1hY3RzaXplOworCQlyZXR1cm4gZ290c2l6ZTsKK2dldGl0OgorCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBjdXJjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKKwkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlnb3RzaXplICs9IChpbnQpYWN0c2l6ZTsKKwkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKKwkJYnVmZmVyICs9IGFjdHNpemU7CisJCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGVuZGNsdXN0KTsKKwkJaWYgKGN1cmNsdXN0IDw9IDB4MDAwMSB8fCBjdXJjbHVzdCA+PSAweGZmZjApIHsKKwkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CisJCQlGQVRfRVJST1IoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKKwkJCXJldHVybiBnb3RzaXplOworCQl9CisJCWFjdHNpemU9Ynl0ZXNwZXJjbHVzdDsKKwkJZW5kY2x1c3Q9Y3VyY2x1c3Q7CisJfSB3aGlsZSAoMSk7Cit9CisKKworI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKyNpZiAwCisvKgorICogRXh0cmFjdCB0aGUgZmlsZSBuYW1lIGluZm9ybWF0aW9uIGZyb20gJ3Nsb3RwdHInIGludG8gJ2xfbmFtZScsCisgKiBzdGFydGluZyBhdCBsX25hbWVbKmlkeF0uCisgKiBSZXR1cm4gMSBpZiB0ZXJtaW5hdG9yICh6ZXJvIGJ5dGUpIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorc2xvdDJzdHIoZGlyX3Nsb3QgKnNsb3RwdHIsIGNoYXIgKmxfbmFtZSwgaW50ICppZHgpCit7CisJaW50IGo7CisKKwlmb3IgKGogPSAwOyBqIDw9IDg7IGogKz0gMikgeworCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lMF80W2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisJZm9yIChqID0gMDsgaiA8PSAxMDsgaiArPSAyKSB7CisJCWxfbmFtZVsqaWR4XSA9IHNsb3RwdHItPm5hbWU1XzEwW2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisJZm9yIChqID0gMDsgaiA8PSAyOyBqICs9IDIpIHsKKwkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTExXzEyW2pdOworCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOworCQkoKmlkeCkrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorLyogQ2FsY3VsYXRlIHNob3J0IG5hbWUgY2hlY2tzdW0gKi8KK3N0YXRpYyBfX3U4Citta2Nrc3VtKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKwlfX3U4IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworCQlyZXQgPSAoKChyZXQmMSk8PDcpfCgocmV0JjB4ZmUpPj4xKSkgKyBzdHJbaV07CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBHZXQgdGhlIGRpcmVjdG9yeSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggJ2ZpbGVuYW1lJyBmcm9tIHRoZSBkaXJlY3RvcnkKKyAqIHN0YXJ0aW5nIGF0ICdzdGFydHNlY3QnCisgKi8KKworCitzdGF0aWMgZGlyX2VudHJ5ICpnZXRfZGVudGZyb21kaXIgKGZzZGF0YSAqIG15ZGF0YSwgaW50IHN0YXJ0c2VjdCwKKwkJCQkgICBjaGFyICpmaWxlbmFtZSwgZGlyX2VudHJ5ICogcmV0ZGVudCwKKwkJCQkgICBpbnQgZG9scykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIDAKK19fdTggZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrW01BWF9DTFVTVFNJWkVdOworc3RhdGljIGRpcl9lbnRyeSAqZ2V0X2RlbnRmcm9tZGlyIChmc2RhdGEgKiBteWRhdGEsIGludCBzdGFydHNlY3QsCisJCQkJICAgY2hhciAqZmlsZW5hbWUsIGRpcl9lbnRyeSAqIHJldGRlbnQsCisJCQkJICAgaW50IGRvbHMpCit7CisgICAgX191MTYgcHJldmNrc3VtID0gMHhmZmZmOworICAgIF9fdTMyIGN1cmNsdXN0ID0gU1RBUlQgKHJldGRlbnQpOworICAgIGludCBmaWxlcyA9IDAsIGRpcnMgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKwlkaXJfZW50cnkgKmRlbnRwdHI7CisJaW50IGk7CisKKwlpZiAoZ2V0X2NsdXN0ZXIgKG15ZGF0YSwgY3VyY2x1c3QsIGdldF9kZW50ZnJvbWRpcl9ibG9jaywKKwkJIG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFKSAhPSAwKSB7CisJICAgIEZBVF9EUFJJTlQgKCJFcnJvcjogcmVhZGluZyBkaXJlY3RvcnkgYmxvY2tcbiIpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisJZGVudHB0ciA9IChkaXJfZW50cnkgKikgZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQ0xVU1Q7IGkrKykgeworCSAgICBjaGFyIHNfbmFtZVsxNF0sIGxfbmFtZVsyNTZdOworCisJICAgIGxfbmFtZVswXSA9ICdcMCc7CisJICAgIGlmIChkZW50cHRyLT5uYW1lWzBdID09IERFTEVURURfRkxBRykgeworCQkgICAgZGVudHB0cisrOworCQkgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKChkZW50cHRyLT5hdHRyICYgQVRUUl9WT0xVTUUpKSB7CisJCSAgICAvKiBWb2x1bWUgbGFiZWwgb3IgVkZBVCBlbnRyeSAqLworCQkgICAgZGVudHB0cisrOworCQkgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gMCkgeworCQlpZiAoZG9scykgeworCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwgZmlsZXMsIGRpcnMpOworCQl9CisJCUZBVF9EUFJJTlQgKCJEZW50bmFtZSA9PSBOVUxMIC0gJWRcbiIsIGkpOworCQlyZXR1cm4gTlVMTDsKKwkgICAgfQorI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKwkgICAgaWYgKGRvbHMgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCSAgICBnZXRfbmFtZSAoZGVudHB0ciwgc19uYW1lKTsKKwkgICAgaWYgKGRvbHMpIHsKKwkJaW50IGlzZGlyID0gKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUik7CisJCWNoYXIgZGlyYzsKKwkJaW50IGRvaXQgPSAwOworCisJCWlmIChpc2RpcikgeworCQkgICAgZGlycysrOworCQkgICAgZGlyYyA9ICcvJzsKKwkJICAgIGRvaXQgPSAxOworCQl9IGVsc2UgeworCQkgICAgZGlyYyA9ICcgJzsKKwkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgeworCQkJZmlsZXMrKzsKKwkJCWRvaXQgPSAxOworCQkgICAgfQorCQl9CisJCWlmIChkb2l0KSB7CisJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKKwkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKKwkJCQkobG9uZykgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgc19uYW1lLAorCQkJCWRpcmMpOworCQkgICAgfSBlbHNlIHsKKwkJCXByaW50ZiAoIiAgICAgICAgICAgICVzJWNcbiIsIHNfbmFtZSwgZGlyYyk7CisJCSAgICB9CisJCX0KKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoc3RyY21wIChmaWxlbmFtZSwgc19uYW1lKSAmJiBzdHJjbXAgKGZpbGVuYW1lLCBsX25hbWUpKSB7CisJCUZBVF9EUFJJTlQgKCJNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIG1lbWNweSAocmV0ZGVudCwgZGVudHB0ciwgc2l6ZW9mIChkaXJfZW50cnkpKTsKKworCSAgICBGQVRfRFBSSU5UICgiRGVudE5hbWU6ICVzIiwgc19uYW1lKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOworCSAgICBGQVRfRFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKKwkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksCisJCQkoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSA/ICIoRElSKSIgOiAiIik7CisKKwkgICAgcmV0dXJuIHJldGRlbnQ7CisJfQorCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudCAobXlkYXRhLCBjdXJjbHVzdCk7CisJaWYgKGN1cmNsdXN0IDw9IDB4MDAwMSB8fCBjdXJjbHVzdCA+PSAweGZmZjApIHsKKwkgICAgRkFUX0RQUklOVCAoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CisJICAgIEZBVF9FUlJPUiAoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKworLyoKKyAqIFJlYWQgYm9vdCBzZWN0b3IgYW5kIHZvbHVtZSBpbmZvIGZyb20gYSBGQVQgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50CityZWFkX2Jvb3RzZWN0YW5kdmkoYm9vdF9zZWN0b3IgKmJzLCB2b2x1bWVfaW5mbyAqdm9saW5mbywgaW50ICpmYXRzaXplKQoreworCV9fdTggYmxvY2tbRlNfQkxPQ0tfU0laRV07CisJdm9sdW1lX2luZm8gKnZpc3RhcnQ7CisKKwlwcmludGYoIlJlYWRpbmcgYm9vdCBzZWN0b3JcbiIpOworCisJaWYgKGRpc2tfcmVhZCgwLCAxLCBibG9jaykgPCAwKSB7CisJCUZBVF9EUFJJTlQoIkVycm9yOiByZWFkaW5nIGJsb2NrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbWNweShicywgYmxvY2ssIHNpemVvZihib290X3NlY3RvcikpOworCWJzLT5yZXNlcnZlZAk9IEZBVDJDUFUxNihicy0+cmVzZXJ2ZWQpOworCWJzLT5mYXRfbGVuZ3RoCT0gRkFUMkNQVTE2KGJzLT5mYXRfbGVuZ3RoKTsKKwlicy0+c2Vjc190cmFjawk9IEZBVDJDUFUxNihicy0+c2Vjc190cmFjayk7CisJYnMtPmhlYWRzCT0gRkFUMkNQVTE2KGJzLT5oZWFkcyk7CisjaWYgMCAvKiBVTlVTRUQgKi8KKwlicy0+aGlkZGVuCT0gRkFUMkNQVTMyKGJzLT5oaWRkZW4pOworI2VuZGlmCisJYnMtPnRvdGFsX3NlY3QJPSBGQVQyQ1BVMzIoYnMtPnRvdGFsX3NlY3QpOworCisJLyogRkFUMzIgZW50cmllcyAqLworCWlmIChicy0+ZmF0X2xlbmd0aCA9PSAwKSB7CisJCS8qIEFzc3VtZSBGQVQzMiAqLworCQlicy0+ZmF0MzJfbGVuZ3RoID0gRkFUMkNQVTMyKGJzLT5mYXQzMl9sZW5ndGgpOworCQlicy0+ZmxhZ3MJID0gRkFUMkNQVTE2KGJzLT5mbGFncyk7CisJCWJzLT5yb290X2NsdXN0ZXIgPSBGQVQyQ1BVMzIoYnMtPnJvb3RfY2x1c3Rlcik7CisJCWJzLT5pbmZvX3NlY3RvciAgPSBGQVQyQ1BVMTYoYnMtPmluZm9fc2VjdG9yKTsKKwkJYnMtPmJhY2t1cF9ib290ICA9IEZBVDJDUFUxNihicy0+YmFja3VwX2Jvb3QpOworCQl2aXN0YXJ0ID0gKHZvbHVtZV9pbmZvKikgKGJsb2NrICsgc2l6ZW9mKGJvb3Rfc2VjdG9yKSk7CisJCSpmYXRzaXplID0gMzI7CisJfSBlbHNlIHsKKwkJdmlzdGFydCA9ICh2b2x1bWVfaW5mbyopICYoYnMtPmZhdDMyX2xlbmd0aCk7CisJCSpmYXRzaXplID0gMDsKKwl9CisJbWVtY3B5KHZvbGluZm8sIHZpc3RhcnQsIHNpemVvZih2b2x1bWVfaW5mbykpOworCisJLyogVGVybWluYXRlIGZzX3R5cGUgc3RyaW5nLiBXcml0aW5nIHBhc3QgdGhlIGVuZCBvZiB2aXN0YXJ0CisJICAgaXMgb2sgLSBpdCdzIGp1c3QgdGhlIGJ1ZmZlci4gKi8KKwl2aXN0YXJ0LT5mc190eXBlWzddID0gJ1wwJzsKKworCWlmICgqZmF0c2l6ZSA9PSAzMikgeworCQlpZiAoY29tcGFyZV9zaWduKEZBVDMyX1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbXBhcmVfc2lnbihGQVQxMl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CisJCQkqZmF0c2l6ZSA9IDEyOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNvbXBhcmVfc2lnbihGQVQxNl9TSUdOLCB2aXN0YXJ0LT5mc190eXBlKSA9PSAwKSB7CisJCQkqZmF0c2l6ZSA9IDE2OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlGQVRfRFBSSU5UKCJFcnJvcjogYnJva2VuIGZzX3R5cGUgc2lnblxuIik7CisJcmV0dXJuIC0xOworfQorCisjaWYgMAorX191OCBkb19mYXRfcmVhZF9ibG9ja1tNQVhfQ0xVU1RTSVpFXTsgIC8qIEJsb2NrIGJ1ZmZlciAqLworI2VuZGlmCisKK19fdTggKmZuYW1lY29weSA9IChfX3U4ICopMHg4MDUwMDAwMDsKK19fdTggKmRvX2ZhdF9yZWFkX2Jsb2NrID0gKF9fdTggKikweDgwNTAwODgwOworCitib290X3NlY3RvciBiczsKK3ZvbHVtZV9pbmZvIHZvbGluZm87Citmc2RhdGEgZGF0YWJsb2NrOworCitsb25nCitkb19mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUsCisJICAgICBpbnQgZG9scykKK3sKKyNpZiBDT05GSUdfTklPUyAvKiBOSU9TIENQVSBjYW5ub3QgYWNjZXNzIGJpZyBhdXRvbWF0aWMgYXJyYXlzICovCisgICAgc3RhdGljCisjZW5kaWYKKyAgICBmc2RhdGEgKm15ZGF0YSA9ICZkYXRhYmxvY2s7CisgICAgZGlyX2VudHJ5ICpkZW50cHRyOworICAgIF9fdTE2IHByZXZja3N1bSA9IDB4ZmZmZjsKKyAgICBjaGFyICpzdWJuYW1lID0gIiI7CisgICAgaW50IHJvb3RkaXJfc2l6ZSwgY3Vyc2VjdDsKKyAgICBpbnQgaWR4LCBpc2RpciA9IDA7CisgICAgaW50IGZpbGVzID0gMCwgZGlycyA9IDA7CisgICAgbG9uZyByZXQgPSAwOworICAgIGludCBmaXJzdHRpbWU7CisKKyAgICBpZiAocmVhZF9ib290c2VjdGFuZHZpICgmYnMsICZ2b2xpbmZvLCAmbXlkYXRhLT5mYXRzaXplKSkgeworCXByaW50ZiAoIkVycm9yOiByZWFkaW5nIGJvb3Qgc2VjdG9yXG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChteWRhdGEtPmZhdHNpemUgPT0gMzIpIHsKKwlteWRhdGEtPmZhdGxlbmd0aCA9IGJzLmZhdDMyX2xlbmd0aDsKKyAgICB9IGVsc2UgeworCW15ZGF0YS0+ZmF0bGVuZ3RoID0gYnMuZmF0X2xlbmd0aDsKKyAgICB9CisgICAgbXlkYXRhLT5mYXRfc2VjdCA9IGJzLnJlc2VydmVkOworICAgIGN1cnNlY3QgPSBteWRhdGEtPnJvb3RkaXJfc2VjdAorCSAgICA9IG15ZGF0YS0+ZmF0X3NlY3QgKyBteWRhdGEtPmZhdGxlbmd0aCAqIGJzLmZhdHM7CisgICAgbXlkYXRhLT5jbHVzdF9zaXplID0gYnMuY2x1c3Rlcl9zaXplOworICAgIGlmIChteWRhdGEtPmZhdHNpemUgPT0gMzIpIHsKKwlyb290ZGlyX3NpemUgPSBteWRhdGEtPmNsdXN0X3NpemU7CisJbXlkYXRhLT5kYXRhX2JlZ2luID0gbXlkYXRhLT5yb290ZGlyX3NlY3QgICAvKiArIHJvb3RkaXJfc2l6ZSAqLworCQktIChteWRhdGEtPmNsdXN0X3NpemUgKiAyKTsKKyAgICB9IGVsc2UgeworCXJvb3RkaXJfc2l6ZSA9ICgoYnMuZGlyX2VudHJpZXNbMV0gKiAoaW50KSAyNTYgKyBicy5kaXJfZW50cmllc1swXSkKKwkJCSogc2l6ZW9mIChkaXJfZW50cnkpKSAvIFNFQ1RPUl9TSVpFOworCW15ZGF0YS0+ZGF0YV9iZWdpbiA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0ICsgcm9vdGRpcl9zaXplCisJCS0gKG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIDIpOworICAgIH0KKyAgICBteWRhdGEtPmZhdGJ1Zm51bSA9IC0xOworCisgICAgRkFUX0RQUklOVCAoIkZBVCVkLCBmYXRsZW5ndGg6ICVkXG4iLCBteWRhdGEtPmZhdHNpemUsCisJCW15ZGF0YS0+ZmF0bGVuZ3RoKTsKKyAgICBGQVRfRFBSSU5UICgiUm9vdGRpciBiZWdpbnMgYXQgc2VjdG9yOiAlZCwgb2Zmc2V0OiAleCwgc2l6ZTogJWRcbiIKKwkJIkRhdGEgYmVnaW5zIGF0OiAlZFxuIiwKKwkJbXlkYXRhLT5yb290ZGlyX3NlY3QsIG15ZGF0YS0+cm9vdGRpcl9zZWN0ICogU0VDVE9SX1NJWkUsCisJCXJvb3RkaXJfc2l6ZSwgbXlkYXRhLT5kYXRhX2JlZ2luKTsKKyAgICBGQVRfRFBSSU5UICgiQ2x1c3RlciBzaXplOiAlZFxuIiwgbXlkYXRhLT5jbHVzdF9zaXplKTsKKworICAgIC8qICJjd2QiIGlzIGFsd2F5cyB0aGUgcm9vdC4uLiAqLworICAgIHdoaWxlIChJU0RJUkRFTElNICgqZmlsZW5hbWUpKQorCWZpbGVuYW1lKys7CisgICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZpbGVuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGxvd2VyY2FzZSAqLworICAgIHN0cmNweSgoY2hhciAqKWZuYW1lY29weSwgZmlsZW5hbWUpOworICAgIGRvd25jYXNlKChjaGFyICopZm5hbWVjb3B5KTsKKyAgICBpZiAoKmZuYW1lY29weSA9PSAnXDAnKSB7CisJaWYgKCFkb2xzKXsKKwkJcHJpbnRmKCJcbiBub3QgdGhlcmVcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWRvbHMgPSBMU19ST09UOworICAgIH0gZWxzZSBpZigoaWR4ID0gZGlyZGVsaW0oKGNoYXIgKilmbmFtZWNvcHkpKSA+PSAwKSB7CisJaXNkaXIgPSAxOworCWZuYW1lY29weVtpZHhdID0gJ1wwJzsKKwlzdWJuYW1lID0gKGNoYXIgKilmbmFtZWNvcHkgKyBpZHggKyAxOworCS8qIEhhbmRsZSBtdWx0aXBsZSBkZWxpbWl0ZXJzICovCisJd2hpbGUgKElTRElSREVMSU0gKCpzdWJuYW1lKSkKKwkgICAgc3VibmFtZSsrOworICAgIH0gZWxzZSBpZiAoZG9scykgeworCWlzZGlyID0gMTsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworCWludCBpOworCisJaWYgKGRpc2tfcmVhZCAoY3Vyc2VjdCwgbXlkYXRhLT5jbHVzdF9zaXplLCBkb19mYXRfcmVhZF9ibG9jaykgPCAwKSB7CisJICAgIHByaW50ZiAoIkVycm9yOiByZWFkaW5nIHJvb3RkaXIgYmxvY2tcbiIpOworCSAgICByZXR1cm4gLTE7CisJfQorCWRlbnRwdHIgPSAoZGlyX2VudHJ5ICopIGRvX2ZhdF9yZWFkX2Jsb2NrOworCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQkxPQ0s7IGkrKykgeworCSAgICBjaGFyIHNfbmFtZVsxNF0sIGxfbmFtZVsyNTZdOworCisJICAgIGxfbmFtZVswXSA9ICdcMCc7CisJICAgIGlmICgoZGVudHB0ci0+YXR0ciAmIEFUVFJfVk9MVU1FKSkgeworCQkgICAgLyogVm9sdW1lIGxhYmVsIG9yIFZGQVQgZW50cnkgKi8KKwkJICAgIGRlbnRwdHIrKzsKKwkJICAgIGNvbnRpbnVlOworCSAgICB9IGVsc2UgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gMCkgeworCQlGQVRfRFBSSU5UICgiUm9vdERlbnRuYW1lID09IE5VTEwgLSAlZFxuIiwgaSk7CisJCWlmIChkb2xzID09IExTX1JPT1QpIHsKKwkJICAgIHByaW50ZiAoIlxuJWQgZmlsZShzKSwgJWQgZGlyKHMpXG5cbiIsIGZpbGVzLCBkaXJzKTsKKwkJICAgIHJldHVybiAwOworCQl9CisJCXJldHVybiAtMTsKKwkgICAgfQorI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKKwkgICAgZWxzZSBpZiAoZG9scyA9PSBMU19ST09UCisJCSAgICAgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKyNlbmRpZgorCSAgICBnZXRfbmFtZSAoZGVudHB0ciwgc19uYW1lKTsKKwkgICAgaWYgKGRvbHMgPT0gTFNfUk9PVCkgeworCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKKwkJY2hhciBkaXJjOworCQlpbnQgZG9pdCA9IDA7CisKKwkJaWYgKGlzZGlyKSB7CisJCSAgICBkaXJjID0gJy8nOworCQkgICAgaWYgKHNfbmFtZVswXSAhPSAwKSB7CisJCQlkaXJzKys7CisJCQlkb2l0ID0gMTsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIGRpcmMgPSAnICc7CisJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKKwkJCWZpbGVzKys7CisJCQlkb2l0ID0gMTsKKwkJICAgIH0KKwkJfQorCQlpZiAoZG9pdCkgeworCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CisJCQlwcmludGYgKCIgJThsZCAgICVzJWNcbiIsCisJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHNfbmFtZSwKKwkJCQlkaXJjKTsKKwkJICAgIH0gZWxzZSB7CisJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBzX25hbWUsIGRpcmMpOworCQkgICAgfQorCQl9CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKHN0cmNtcCgoY2hhciAqKWZuYW1lY29weSwgc19uYW1lKSAmJgorCQlzdHJjbXAoKGNoYXIgKilmbmFtZWNvcHksIGxfbmFtZSkpIHsKKwkJRkFUX0RQUklOVCAoIlJvb3RNaXNtYXRjaDogfCVzfCVzfFxuIiwgc19uYW1lLCBsX25hbWUpOworCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChpc2RpciAmJiAhKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCisJCXJldHVybiAtMTsKKworCSAgICBGQVRfRFBSSU5UICgiUm9vdE5hbWU6ICVzIiwgc19uYW1lKTsKKwkgICAgRkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOworCSAgICBGQVRfRFBSSU5UICgiLCBzaXplOiAgMHgleCAlc1xuIiwKKwkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIGlzZGlyID8gIihESVIpIiA6ICIiKTsKKworCSAgICBnb3RvIHJvb3RkaXJfZG9uZTsgIC8qIFdlIGdvdCBhIG1hdGNoICovCisJfQorCWN1cnNlY3QrKzsKKyAgICB9CisgIHJvb3RkaXJfZG9uZToKKworICAgIGZpcnN0dGltZSA9IDE7CisgICAgd2hpbGUgKGlzZGlyKSB7CisJaW50IHN0YXJ0c2VjdCA9IG15ZGF0YS0+ZGF0YV9iZWdpbgorCQkrIFNUQVJUIChkZW50cHRyKSAqIG15ZGF0YS0+Y2x1c3Rfc2l6ZTsKKwlkaXJfZW50cnkgZGVudDsKKwljaGFyICpuZXh0bmFtZSA9IE5VTEw7CisKKwlkZW50ID0gKmRlbnRwdHI7CisJZGVudHB0ciA9ICZkZW50OworCWlkeCA9IGRpcmRlbGltIChzdWJuYW1lKTsKKwlpZiAoaWR4ID49IDApIHsKKwkgICAgc3VibmFtZVtpZHhdID0gJ1wwJzsKKwkgICAgbmV4dG5hbWUgPSBzdWJuYW1lICsgaWR4ICsgMTsKKwkgICAgLyogSGFuZGxlIG11bHRpcGxlIGRlbGltaXRlcnMgKi8KKwkgICAgd2hpbGUgKElTRElSREVMSU0gKCpuZXh0bmFtZSkpCisJCW5leHRuYW1lKys7CisJICAgIGlmIChkb2xzICYmICpuZXh0bmFtZSA9PSAnXDAnKQorCQlmaXJzdHRpbWUgPSAwOworCX0gZWxzZSB7CisJICAgIGlmIChkb2xzICYmIGZpcnN0dGltZSkgeworCQlmaXJzdHRpbWUgPSAwOworCSAgICB9IGVsc2UgeworCQlpc2RpciA9IDA7CisJICAgIH0KKwl9CisKKwlpZiAoZ2V0X2RlbnRmcm9tZGlyIChteWRhdGEsIHN0YXJ0c2VjdCwgc3VibmFtZSwgZGVudHB0ciwKKwkJCSAgICAgaXNkaXIgPyAwIDogZG9scykgPT0gTlVMTCkgeworCSAgICBpZiAoZG9scyAmJiAhaXNkaXIpCisJCXJldHVybiAwOworCSAgICByZXR1cm4gLTE7CisJfQorCisJaWYgKGlkeCA+PSAwKSB7CisJICAgIGlmICghKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCisJCXJldHVybiAtMTsKKwkgICAgc3VibmFtZSA9IG5leHRuYW1lOworCX0KKyAgICB9CisgICAgcmV0ID0gZ2V0X2NvbnRlbnRzIChteWRhdGEsIGRlbnRwdHIsIGJ1ZmZlciwgbWF4c2l6ZSk7CisgICAgRkFUX0RQUklOVCAoIlNpemU6ICVkLCBnb3Q6ICVsZFxuIiwgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworaW50CitmaWxlX2ZhdF9kZXRlY3Rmcyh2b2lkKQoreworCWJvb3Rfc2VjdG9yCWJzOworCXZvbHVtZV9pbmZvCXZvbGluZm87CisJaW50CQlmYXRzaXplOworCWNoYXIJdm9sX2xhYmVsWzEyXTsKKworCWlmKGN1cl9kZXY9PU5VTEwpIHsKKwkJcHJpbnRmKCJObyBjdXJyZW50IGRldmljZVxuIik7CisJCXJldHVybiAxOworCX0KKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpIHx8IFwKKyAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpIHx8IChDT05GSUdfTU1DKQorCXByaW50ZigiSW50ZXJmYWNlOiAgIik7CisJc3dpdGNoKGN1cl9kZXYtPmlmX3R5cGUpIHsKKwkJY2FzZSBJRl9UWVBFX0lERSA6CXByaW50ZigiSURFIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfU0NTSSA6CXByaW50ZigiU0NTSSIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX0FUQVBJIDoJcHJpbnRmKCJBVEFQSSIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX1VTQiA6CXByaW50ZigiVVNCIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfRE9DIDoJcHJpbnRmKCJET0MiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9NTUMgOglwcmludGYoIk1NQyIpOyBicmVhazsKKwkJZGVmYXVsdCA6CQlwcmludGYoIlVua25vd24iKTsKKwl9CisJcHJpbnRmKCJcbiAgRGV2aWNlICVkOiAiLGN1cl9kZXYtPmRldik7CisJZGV2X3ByaW50KGN1cl9kZXYpOworI2VuZGlmCisJaWYocmVhZF9ib290c2VjdGFuZHZpKCZicywgJnZvbGluZm8sICZmYXRzaXplKSkgeworCQlwcmludGYoIlxuTm8gdmFsaWQgRkFUIGZzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbWNweSAodm9sX2xhYmVsLCB2b2xpbmZvLnZvbHVtZV9sYWJlbCwgMTEpOworCXZvbF9sYWJlbFsxMV0gPSAnXDAnOworCXZvbGluZm8uZnNfdHlwZVs1XT0nXDAnOworCXByaW50ZigiUGFydGl0aW9uICVkOiBGaWxlc3lzdGVtOiAlcyBcIiVzXCJcbiIsY3VyX3BhcnQsdm9saW5mby5mc190eXBlLHZvbF9sYWJlbCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50CitmaWxlX2ZhdF9scyhjb25zdCBjaGFyICpkaXIpCit7CisJcmV0dXJuIGRvX2ZhdF9yZWFkKGRpciwgTlVMTCwgMCwgTFNfWUVTKTsKK30KKworCitsb25nCitmaWxlX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSkKK3sKKwlsb25nIHJldDsKKwlyZXQgPSBkb19mYXRfcmVhZChmaWxlbmFtZSwgYnVmZmVyLCBtYXhzaXplLCBMU19OTyk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvZmlsZS5jIGIveC1sb2FkZXIvZnMvZmF0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTk0MjcxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZnMvZmF0L2ZpbGUuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIGZpbGUuYworICoKKyAqIE1pbmkgIlZGUyIgYnkgTWFyY3VzIFN1bmRiZXJnCisgKgorICogMjAwMi0wNy0yOCAtIHJqb25lc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byBwcGNib290IHYxLjEuNgorICogMjAwMy0wMy0xMCAtIGtoYXJyaXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gdWJvb3QKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCisKKy8qIFN1cHBvcnRlZCBmaWxlc3lzdGVtcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlc3lzdGVtIGZpbGVzeXN0ZW1zW10gPSB7CisJeyBmaWxlX2ZhdF9kZXRlY3RmcywgIGZpbGVfZmF0X2xzLCAgZmlsZV9mYXRfcmVhZCwgICJGQVQiIH0sCit9OworI2RlZmluZSBOVU1fRklMRVNZUwkoc2l6ZW9mKGZpbGVzeXN0ZW1zKS9zaXplb2Yoc3RydWN0IGZpbGVzeXN0ZW0pKQorCisvKiBUaGUgZmlsZXN5c3RlbSB3aGljaCB3YXMgbGFzdCBkZXRlY3RlZCAqLworc3RhdGljIGludCBjdXJyZW50X2ZpbGVzeXN0ZW0gPSBGU1RZUEVfTk9ORTsKKworLyogVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgQ1dEX0xFTgkJNTExCitjaGFyIGZpbGVfY3dkW0NXRF9MRU4rMV0gPSAiLyI7CisKK2NvbnN0IGNoYXIgKgorZmlsZV9nZXRmc25hbWUoaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gTlVNX0ZJTEVTWVMpIHJldHVybiBOVUxMOworCisJcmV0dXJuIGZpbGVzeXN0ZW1zW2lkeF0ubmFtZTsKK30KKworCitzdGF0aWMgdm9pZAorcGF0aGNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqb3JpZ2Rlc3QgPSBkZXN0OworCisJZG8geworCQlpZiAoZGVzdC1maWxlX2N3ZCA+PSBDV0RfTEVOKSB7CisJCQkqZGVzdCA9ICdcMCc7CisJCQlyZXR1cm47CisJCX0KKwkJKihkZXN0KSA9ICooc3JjKTsKKwkJaWYgKCpzcmMgPT0gJ1wwJykgeworCQkJaWYgKGRlc3QtLSAhPSBvcmlnZGVzdCAmJiBJU0RJUkRFTElNKCpkZXN0KSkgeworCQkJCSpkZXN0ID0gJ1wwJzsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkrK2Rlc3Q7CisJCWlmIChJU0RJUkRFTElNKCpzcmMpKSB7CisJCQl3aGlsZSAoSVNESVJERUxJTSgqc3JjKSkgc3JjKys7CisJCX0gZWxzZSB7CisJCQlzcmMrKzsKKwkJfQorCX0gd2hpbGUgKDEpOworfQorCisKK2ludAorZmlsZV9jZChjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChJU0RJUkRFTElNKCpwYXRoKSkgeworCQl3aGlsZSAoSVNESVJERUxJTSgqcGF0aCkpIHBhdGgrKzsKKwkJc3RybmNweShmaWxlX2N3ZCsxLCBwYXRoLCBDV0RfTEVOLTEpOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKm9yaWdwYXRoID0gcGF0aDsKKwkJY2hhciAqdG1wc3RyID0gZmlsZV9jd2Q7CisJCWludCBiYWNrID0gMDsKKworCQl3aGlsZSAoKnRtcHN0ciAhPSAnXDAnKSB0bXBzdHIrKzsKKwkJZG8geworCQkJdG1wc3RyLS07CisJCX0gd2hpbGUgKElTRElSREVMSU0oKnRtcHN0cikpOworCisJCXdoaWxlICgqcGF0aCA9PSAnLicpIHsKKwkJCXBhdGgrKzsKKwkJCXdoaWxlICgqcGF0aCA9PSAnLicpIHsKKwkJCQlwYXRoKys7CisJCQkJYmFjaysrOworCQkJfQorCQkJaWYgKCpwYXRoICE9ICdcMCcgJiYgIUlTRElSREVMSU0oKnBhdGgpKSB7CisJCQkJcGF0aCA9IG9yaWdwYXRoOworCQkJCWJhY2sgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJd2hpbGUgKElTRElSREVMSU0oKnBhdGgpKSBwYXRoKys7CisJCQlvcmlncGF0aCA9IHBhdGg7CisJCX0KKworCQl3aGlsZSAoYmFjay0tKSB7CisJCQkvKiBTdHJpcCBvZmYgcGF0aCBjb21wb25lbnQgKi8KKwkJCXdoaWxlICghSVNESVJERUxJTSgqdG1wc3RyKSkgeworCQkJCXRtcHN0ci0tOworCQkJfQorCQkJaWYgKHRtcHN0ciA9PSBmaWxlX2N3ZCkgeworCQkJCS8qIEluY3JlbWVudGVkIGFnYWluIHJpZ2h0IGFmdGVyIHRoZSBsb29wLiAqLworCQkJCXRtcHN0ci0tOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2tpcCBkZWxpbWl0ZXJzICovCisJCQl3aGlsZSAoSVNESVJERUxJTSgqdG1wc3RyKSkgdG1wc3RyLS07CisJCX0KKwkJdG1wc3RyKys7CisJCWlmICgqcGF0aCA9PSAnXDAnKSB7CisJCQlpZiAodG1wc3RyID09IGZpbGVfY3dkKSB7CisJCQkJKnRtcHN0ciA9ICcvJzsKKwkJCQl0bXBzdHIrKzsKKwkJCX0KKwkJCSp0bXBzdHIgPSAnXDAnOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKnRtcHN0ciA9ICcvJzsKKwkJcGF0aGNweSh0bXBzdHIrMSwgcGF0aCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50CitmaWxlX2RldGVjdGZzKHZvaWQpCit7CisJaW50IGk7CisKKwljdXJyZW50X2ZpbGVzeXN0ZW0gPSBGU1RZUEVfTk9ORTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRklMRVNZUzsgaSsrKSB7CisJCWlmIChmaWxlc3lzdGVtc1tpXS5kZXRlY3QoKSA9PSAwKSB7CisJCQlzdHJjcHkoZmlsZV9jd2QsICIvIik7CisJCQljdXJyZW50X2ZpbGVzeXN0ZW0gPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gY3VycmVudF9maWxlc3lzdGVtOworfQorCisKK2ludAorZmlsZV9scyhjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciBmdWxscGF0aFsxMDI0XTsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoY3VycmVudF9maWxlc3lzdGVtID09IEZTVFlQRV9OT05FKSB7CisJCXByaW50ZigiQ2FuJ3QgbGlzdCBmaWxlcyB3aXRob3V0IGEgZmlsZXN5c3RlbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKElTRElSREVMSU0oKmRpcikpIHsKKwkJYXJnID0gZGlyOworCX0gZWxzZSB7CisJCXNwcmludGYoZnVsbHBhdGgsICIlcy8lcyIsIGZpbGVfY3dkLCBkaXIpOworCQlhcmcgPSBmdWxscGF0aDsKKwl9CisJcmV0dXJuIGZpbGVzeXN0ZW1zW2N1cnJlbnRfZmlsZXN5c3RlbV0ubHMoYXJnKTsKK30KKworCitsb25nCitmaWxlX3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKQoreworCWNoYXIgZnVsbHBhdGhbMTAyNF07CisJY29uc3QgY2hhciAqYXJnOworCisJaWYgKGN1cnJlbnRfZmlsZXN5c3RlbSA9PSBGU1RZUEVfTk9ORSkgeworCQlwcmludGYoIkNhbid0IGxvYWQgZmlsZSB3aXRob3V0IGEgZmlsZXN5c3RlbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKElTRElSREVMSU0oKmZpbGVuYW1lKSkgeworCQlhcmcgPSBmaWxlbmFtZTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGZ1bGxwYXRoLCAiJXMvJXMiLCBmaWxlX2N3ZCwgZmlsZW5hbWUpOworCQlhcmcgPSBmdWxscGF0aDsKKwl9CisKKwlyZXR1cm4gZmlsZXN5c3RlbXNbY3VycmVudF9maWxlc3lzdGVtXS5yZWFkKGFyZywgYnVmZmVyLCBtYXhzaXplKTsKK30KKworI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iZmNiNzUyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaApAQCAtMCwwICsxIEBACisvaG9tZS9kb24vUmVwb3Mvc2FwcGhpcmUvcHJvZHVjdGlvbi9mdy94LWxvYWRlci94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2JpdHMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMjczZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmgKQEAgLTAsMCArMSw0OSBAQAorLyogYml0cy5oCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBmb3VuZCBpbiB0aGUgZmlsZQorICogbmFtZWQgQ09QWUlORyB0aGF0IHNob3VsZCBoYXZlIGFjY29tcGFuaWVkIHRoaXMgZmlsZS4KKyAqCisgKiBUSElTIFBBQ0tBR0UgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaWZuZGVmIF9fYml0c19oCisjZGVmaW5lIF9fYml0c19oIDEKKworI2RlZmluZSBCSVQwICAoMTw8MCkKKyNkZWZpbmUgQklUMSAgKDE8PDEpCisjZGVmaW5lIEJJVDIgICgxPDwyKQorI2RlZmluZSBCSVQzICAoMTw8MykKKyNkZWZpbmUgQklUNCAgKDE8PDQpCisjZGVmaW5lIEJJVDUgICgxPDw1KQorI2RlZmluZSBCSVQ2ICAoMTw8NikKKyNkZWZpbmUgQklUNyAgKDE8PDcpCisjZGVmaW5lIEJJVDggICgxPDw4KQorI2RlZmluZSBCSVQ5ICAoMTw8OSkKKyNkZWZpbmUgQklUMTAgKDE8PDEwKQorI2RlZmluZSBCSVQxMSAoMTw8MTEpCisjZGVmaW5lIEJJVDEyICgxPDwxMikKKyNkZWZpbmUgQklUMTMgKDE8PDEzKQorI2RlZmluZSBCSVQxNCAoMTw8MTQpCisjZGVmaW5lIEJJVDE1ICgxPDwxNSkKKyNkZWZpbmUgQklUMTYgKDE8PDE2KQorI2RlZmluZSBCSVQxNyAoMTw8MTcpCisjZGVmaW5lIEJJVDE4ICgxPDwxOCkKKyNkZWZpbmUgQklUMTkgKDE8PDE5KQorI2RlZmluZSBCSVQyMCAoMTw8MjApCisjZGVmaW5lIEJJVDIxICgxPDwyMSkKKyNkZWZpbmUgQklUMjIgKDE8PDIyKQorI2RlZmluZSBCSVQyMyAoMTw8MjMpCisjZGVmaW5lIEJJVDI0ICgxPDwyNCkKKyNkZWZpbmUgQklUMjUgKDE8PDI1KQorI2RlZmluZSBCSVQyNiAoMTw8MjYpCisjZGVmaW5lIEJJVDI3ICgxPDwyNykKKyNkZWZpbmUgQklUMjggKDE8PDI4KQorI2RlZmluZSBCSVQyOSAoMTw8MjkpCisjZGVmaW5lIEJJVDMwICgxPDwzMCkKKyNkZWZpbmUgQklUMzEgKDE8PDMxKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDBkMmUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAyNFhYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDI0WFhfQ0xPQ0tTX0hfCisKKyNkZWZpbmUgQ09NTUlUX0RJVklERVJTICAweDEKKyNkZWZpbmUgTU9ERV9CWVBBU1NfRkFTVCAweDIKKyNkZWZpbmUgQVBMTF9MT0NLICAgICAgICAweGMKKyNkZWZpbmUgRFBMTF9MT0NLICAgICAgICAweDMgICAvKiBEUExMIGxvY2sgKi8KKyNkZWZpbmUgTERFTEFZICAgICAgICAgICAxMjAwMDAwMAorCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDI0MlgpCisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzMjQyeC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfT01BUDI0M1gpCisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzMjQzeC5oPgorI2VuZGlmCisKKyNkZWZpbmUgUzEyTQkJMTIwMDAwMDAKKyNkZWZpbmUgUzEzTQkJMTMwMDAwMDAKKyNkZWZpbmUgUzE5XzJNCQkxOTIwMDAwMAorI2RlZmluZSBTMjRNCQkyNDAwMDAwMAorI2RlZmluZSBTMjZNCQkyNjAwMDAwMAorI2RlZmluZSBTMzhfNE0JCTM4NDAwMDAwCisKKyNlbmRpZgorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDJ4LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTFjNGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+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+ZmRzX2JpdHNbZmQgPj4gNV0gJiAoMTw8KGZkICYgMzEpKSkgIT0gMCkKKworI3VuZGVmCV9fRkRfWkVSTworI2RlZmluZSBfX0ZEX1pFUk8oZmRzZXRwKSBcCisJCShtZW1zZXQgKGZkc2V0cCwgMCwgc2l6ZW9mICgqKGZkX3NldCAqKWZkc2V0cCkpKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9wcm9jIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vcHJvYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xNDlmNGRkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vcHJvYwpAQCAtMCwwICsxIEBACisvaG9tZS9kb24vUmVwb3Mvc2FwcGhpcmUvcHJvZHVjdGlvbi9mdy94LWxvYWRlci94LWxvYWRlci9pbmNsdWRlL2FzbS9wcm9jLWFybXYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9zZXR1cC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRmNGRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS9zZXR1cC5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFN0cnVjdHVyZSBwYXNzZWQgdG8ga2VybmVsIHRvIHRlbGwgaXQgYWJvdXQgdGhlCisgKiAgaGFyZHdhcmUgaXQncyBydW5uaW5nIG9uLiAgU2VlIGxpbnV4L0RvY3VtZW50YXRpb24vYXJtL1NldHVwCisgKiAgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBOT1RFOgorICogIFRoaXMgZmlsZSBjb250YWlucyB0d28gd2F5cyB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIGJvb3QKKyAqICBsb2FkZXIgdG8gdGhlIGtlcm5lbC4gVGhlIG9sZCBzdHJ1Y3QgcGFyYW1fc3RydWN0IGlzIGRlcHJlY2F0ZWQsCisgKiAgYnV0IGl0IHdpbGwgYmUga2VwdCBpbiB0aGUga2VybmVsIGZvciA1IHllYXJzIGZyb20gbm93CisgKiAgKDIwMDEpLiBUaGlzIHdpbGwgYWxsb3cgYm9vdCBsb2FkZXJzIHRvIGNvbnZlcnQgdG8gdGhlIG5ldyBzdHJ1Y3QKKyAqICB0YWcgd2F5LgorICovCisjaWZuZGVmIF9fQVNNQVJNX1NFVFVQX0gKKyNkZWZpbmUgX19BU01BUk1fU0VUVVBfSAorCisvKgorICogVXNhZ2U6CisgKiAgLSBkbyBub3QgZ28gYmxpbmRseSBhZGRpbmcgZmllbGRzLCBhZGQgdGhlbSBhdCB0aGUgZW5kCisgKiAgLSB3aGVuIGFkZGluZyBmaWVsZHMsIGRvbid0IHJlbHkgb24gdGhlIGFkZHJlc3MgdW50aWwKKyAqICAgIGEgcGF0Y2ggZnJvbSBtZSBoYXMgYmVlbiByZWxlYXNlZAorICogIC0gdW51c2VkIGZpZWxkcyBzaG91bGQgYmUgemVybyAoZm9yIGZ1dHVyZSBleHBhbnNpb24pCisgKiAgLSB0aGlzIHN0cnVjdHVyZSBpcyByZWxhdGl2ZWx5IHNob3J0LWxpdmVkIC0gb25seQorICogICAgZ3VhcmFudGVlZCB0byBjb250YWluIHVzZWZ1bCBkYXRhIGluIHNldHVwX2FyY2goKQorICovCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDEwMjQKKworLyogVGhpcyBpcyB0aGUgb2xkIGRlcHJlY2F0ZWQgd2F5IHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUga2VybmVsICovCitzdHJ1Y3QgcGFyYW1fc3RydWN0IHsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CQkvKiAgMCAqLworCSAgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwkJLyogIDQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyByYW1kaXNrX3NpemU7CQkvKiAgOCAqLworCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogMTIgKi8KKyNkZWZpbmUgRkxBR19SRUFET05MWQkxCisjZGVmaW5lIEZMQUdfUkRMT0FECTQKKyNkZWZpbmUgRkxBR19SRFBST01QVAk4CisJICAgIHVuc2lnbmVkIGxvbmcgcm9vdGRldjsJCS8qIDE2ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX2NvbHM7CS8qIDIwICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbnVtX3Jvd3M7CS8qIDI0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feDsJCS8qIDI4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgdmlkZW9feTsJCS8qIDMyICovCisJICAgIHVuc2lnbmVkIGxvbmcgbWVtY19jb250cm9sX3JlZzsJLyogMzYgKi8KKwkgICAgdW5zaWduZWQgY2hhciBzb3VuZGRlZmF1bHQ7CQkvKiA0MCAqLworCSAgICB1bnNpZ25lZCBjaGFyIGFkZnNkcml2ZXM7CQkvKiA0MSAqLworCSAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX2g7CS8qIDQyICovCisJICAgIHVuc2lnbmVkIGNoYXIgYnl0ZXNfcGVyX2NoYXJfdjsJLyogNDMgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlc19pbl9iYW5rWzRdOwkvKiA0NCAqLworCSAgICB1bnNpZ25lZCBsb25nIHBhZ2VzX2luX3ZyYW07CS8qIDYwICovCisJICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0OwkJLyogNjQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZTsJCS8qIDY4ICovCisJICAgIHVuc2lnbmVkIGxvbmcgcmRfc3RhcnQ7CQkvKiA3MiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9yZXY7CQkvKiA3NiAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfbG93OwkvKiA4MCAqLworCSAgICB1bnNpZ25lZCBsb25nIHN5c3RlbV9zZXJpYWxfaGlnaDsJLyogODQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBtZW1fZmNsa18yMTI4NTsgICAgICAgLyogODggKi8KKwl9IHM7CisJY2hhciB1bnVzZWRbMjU2XTsKKyAgICB9IHUxOworICAgIHVuaW9uIHsKKwljaGFyIHBhdGhzWzhdWzEyOF07CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgbG9uZyBtYWdpYzsKKwkgICAgY2hhciBuWzEwMjQgLSBzaXplb2YodW5zaWduZWQgbG9uZyldOworCX0gczsKKyAgICB9IHUyOworICAgIGNoYXIgY29tbWFuZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworfTsKKworCisvKgorICogVGhlIG5ldyB3YXkgb2YgcGFzc2luZyBpbmZvcm1hdGlvbjogYSBsaXN0IG9mIHRhZ2dlZCBlbnRyaWVzCisgKi8KKworLyogVGhlIGxpc3QgZW5kcyB3aXRoIGFuIEFUQUdfTk9ORSBub2RlLiAqLworI2RlZmluZSBBVEFHX05PTkUJMHgwMDAwMDAwMAorCitzdHJ1Y3QgdGFnX2hlYWRlciB7CisJdTMyIHNpemU7CisJdTMyIHRhZzsKK307CisKKy8qIFRoZSBsaXN0IG11c3Qgc3RhcnQgd2l0aCBhbiBBVEFHX0NPUkUgbm9kZSAqLworI2RlZmluZSBBVEFHX0NPUkUJMHg1NDQxMDAwMQorCitzdHJ1Y3QgdGFnX2NvcmUgeworCXUzMiBmbGFnczsJCS8qIGJpdCAwID0gcmVhZC1vbmx5ICovCisJdTMyIHBhZ2VzaXplOworCXUzMiByb290ZGV2OworfTsKKworLyogaXQgaXMgYWxsb3dlZCB0byBoYXZlIG11bHRpcGxlIEFUQUdfTUVNIG5vZGVzICovCisjZGVmaW5lIEFUQUdfTUVNCTB4NTQ0MTAwMDIKKworc3RydWN0IHRhZ19tZW0zMiB7CisJdTMyCXNpemU7CisJdTMyCXN0YXJ0OwkvKiBwaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCit9OworCisvKiBWR0EgdGV4dCB0eXBlIGRpc3BsYXlzICovCisjZGVmaW5lIEFUQUdfVklERU9URVhUCTB4NTQ0MTAwMDMKKworc3RydWN0IHRhZ192aWRlb3RleHQgeworCXU4CQl4OworCXU4CQl5OworCXUxNgkJdmlkZW9fcGFnZTsKKwl1OAkJdmlkZW9fbW9kZTsKKwl1OAkJdmlkZW9fY29sczsKKwl1MTYJCXZpZGVvX2VnYV9ieDsKKwl1OAkJdmlkZW9fbGluZXM7CisJdTgJCXZpZGVvX2lzdmdhOworCXUxNgkJdmlkZW9fcG9pbnRzOworfTsKKworLyogZGVzY3JpYmVzIGhvdyB0aGUgcmFtZGlzayB3aWxsIGJlIHVzZWQgaW4ga2VybmVsICovCisjZGVmaW5lIEFUQUdfUkFNRElTSwkweDU0NDEwMDA0CisKK3N0cnVjdCB0YWdfcmFtZGlzayB7CisJdTMyIGZsYWdzOwkvKiBiaXQgMCA9IGxvYWQsIGJpdCAxID0gcHJvbXB0ICovCisJdTMyIHNpemU7CS8qIGRlY29tcHJlc3NlZCByYW1kaXNrIHNpemUgaW4gX2tpbG9fIGJ5dGVzICovCisJdTMyIHN0YXJ0OwkvKiBzdGFydGluZyBibG9jayBvZiBmbG9wcHktYmFzZWQgUkFNIGRpc2sgaW1hZ2UgKi8KK307CisKKy8qIGRlc2NyaWJlcyB3aGVyZSB0aGUgY29tcHJlc3NlZCByYW1kaXNrIGltYWdlIGxpdmVzICh2aXJ0dWFsIGFkZHJlc3MpICovCisvKgorICogdGhpcyBvbmUgYWNjaWRlbnRhbGx5IHVzZWQgdmlydHVhbCBhZGRyZXNzZXMgLSBhcyBzdWNoLAorICogaXRzIGRlcHJlY2lhdGVkLgorICovCisjZGVmaW5lIEFUQUdfSU5JVFJECTB4NTQ0MTAwMDUKKworLyogZGVzY3JpYmVzIHdoZXJlIHRoZSBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgbGl2ZXMgKHBoeXNpY2FsIGFkZHJlc3MpICovCisjZGVmaW5lIEFUQUdfSU5JVFJEMgkweDU0NDIwMDA1CisKK3N0cnVjdCB0YWdfaW5pdHJkIHsKKwl1MzIgc3RhcnQ7CS8qIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3MgKi8KKwl1MzIgc2l6ZTsJLyogc2l6ZSBvZiBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgaW4gYnl0ZXMgKi8KK307CisKKy8qIGJvYXJkIHNlcmlhbCBudW1iZXIuICI2NCBiaXRzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGV2ZXJ5Ym9keSIgKi8KKyNkZWZpbmUgQVRBR19TRVJJQUwJMHg1NDQxMDAwNgorCitzdHJ1Y3QgdGFnX3NlcmlhbG5yIHsKKwl1MzIgbG93OworCXUzMiBoaWdoOworfTsKKworLyogYm9hcmQgcmV2aXNpb24gKi8KKyNkZWZpbmUgQVRBR19SRVZJU0lPTgkweDU0NDEwMDA3CisKK3N0cnVjdCB0YWdfcmV2aXNpb24geworCXUzMiByZXY7Cit9OworCisvKiBpbml0aWFsIHZhbHVlcyBmb3IgdmVzYWZiLXR5cGUgZnJhbWVidWZmZXJzLiBzZWUgc3RydWN0IHNjcmVlbl9pbmZvCisgKiBpbiBpbmNsdWRlL2xpbnV4L3R0eS5oCisgKi8KKyNkZWZpbmUgQVRBR19WSURFT0xGQgkweDU0NDEwMDA4CisKK3N0cnVjdCB0YWdfdmlkZW9sZmIgeworCXUxNgkJbGZiX3dpZHRoOworCXUxNgkJbGZiX2hlaWdodDsKKwl1MTYJCWxmYl9kZXB0aDsKKwl1MTYJCWxmYl9saW5lbGVuZ3RoOworCXUzMgkJbGZiX2Jhc2U7CisJdTMyCQlsZmJfc2l6ZTsKKwl1OAkJcmVkX3NpemU7CisJdTgJCXJlZF9wb3M7CisJdTgJCWdyZWVuX3NpemU7CisJdTgJCWdyZWVuX3BvczsKKwl1OAkJYmx1ZV9zaXplOworCXU4CQlibHVlX3BvczsKKwl1OAkJcnN2ZF9zaXplOworCXU4CQlyc3ZkX3BvczsKK307CisKKy8qIGNvbW1hbmQgbGluZTogXDAgdGVybWluYXRlZCBzdHJpbmcgKi8KKyNkZWZpbmUgQVRBR19DTURMSU5FCTB4NTQ0MTAwMDkKKworc3RydWN0IHRhZ19jbWRsaW5lIHsKKwljaGFyCWNtZGxpbmVbMV07CS8qIHRoaXMgaXMgdGhlIG1pbmltdW0gc2l6ZSAqLworfTsKKworLyogYWNvcm4gUmlzY1BDIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEFUQUdfQUNPUk4JMHg0MTAwMDEwMQorCitzdHJ1Y3QgdGFnX2Fjb3JuIHsKKwl1MzIgbWVtY19jb250cm9sX3JlZzsKKwl1MzIgdnJhbV9wYWdlczsKKwl1OCBzb3VuZGRlZmF1bHQ7CisJdTggYWRmc2RyaXZlczsKK307CisKKy8qIGZvb3RicmlkZ2UgbWVtb3J5IGNsb2NrLCBzZWUgYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2FyY2guYyAqLworI2RlZmluZSBBVEFHX01FTUNMSwkweDQxMDAwNDAyCisKK3N0cnVjdCB0YWdfbWVtY2xrIHsKKwl1MzIgZm1lbWNsazsKK307CisKK3N0cnVjdCB0YWcgeworCXN0cnVjdCB0YWdfaGVhZGVyIGhkcjsKKwl1bmlvbiB7CisJCXN0cnVjdCB0YWdfY29yZQkJY29yZTsKKwkJc3RydWN0IHRhZ19tZW0zMgltZW07CisJCXN0cnVjdCB0YWdfdmlkZW90ZXh0CXZpZGVvdGV4dDsKKwkJc3RydWN0IHRhZ19yYW1kaXNrCXJhbWRpc2s7CisJCXN0cnVjdCB0YWdfaW5pdHJkCWluaXRyZDsKKwkJc3RydWN0IHRhZ19zZXJpYWxucglzZXJpYWxucjsKKwkJc3RydWN0IHRhZ19yZXZpc2lvbglyZXZpc2lvbjsKKwkJc3RydWN0IHRhZ192aWRlb2xmYgl2aWRlb2xmYjsKKwkJc3RydWN0IHRhZ19jbWRsaW5lCWNtZGxpbmU7CisKKwkJLyoKKwkJICogQWNvcm4gc3BlY2lmaWMKKwkJICovCisJCXN0cnVjdCB0YWdfYWNvcm4JYWNvcm47CisKKwkJLyoKKwkJICogREMyMTI4NSBzcGVjaWZpYworCQkgKi8KKwkJc3RydWN0IHRhZ19tZW1jbGsJbWVtY2xrOworCX0gdTsKK307CisKK3N0cnVjdCB0YWd0YWJsZSB7CisJdTMyIHRhZzsKKwlpbnQgKCpwYXJzZSkoY29uc3Qgc3RydWN0IHRhZyAqKTsKK307CisKKyNkZWZpbmUgX190YWcgX19hdHRyaWJ1dGVfXygodW51c2VkLCBfX3NlY3Rpb25fXygiLnRhZ2xpc3QiKSkpCisjZGVmaW5lIF9fdGFndGFibGUodGFnLCBmbikgXAorc3RhdGljIHN0cnVjdCB0YWd0YWJsZSBfX3RhZ3RhYmxlXyMjZm4gX190YWcgPSB7IHRhZywgZm4gfQorCisjZGVmaW5lIHRhZ19tZW1iZXJfcHJlc2VudCh0YWcsbWVtYmVyKQkJCQlcCisJKCh1bnNpZ25lZCBsb25nKSgmKChzdHJ1Y3QgdGFnICopMEwpLT5tZW1iZXIgKyAxKQlcCisJCTw9ICh0YWcpLT5oZHIuc2l6ZSAqIDQpCisKKyNkZWZpbmUgdGFnX25leHQodCkJKChzdHJ1Y3QgdGFnICopKCh1MzIgKikodCkgKyAodCktPmhkci5zaXplKSkKKyNkZWZpbmUgdGFnX3NpemUodHlwZSkJKChzaXplb2Yoc3RydWN0IHRhZ19oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCB0eXBlKSkgPj4gMikKKworI2RlZmluZSBmb3JfZWFjaF90YWcodCxiYXNlKQkJXAorCWZvciAodCA9IGJhc2U7IHQtPmhkci5zaXplOyB0ID0gdGFnX25leHQodCkpCisKKy8qCisgKiBNZW1vcnkgbWFwIGRlc2NyaXB0aW9uCisgKi8KKyNkZWZpbmUgTlJfQkFOS1MgOAorCitzdHJ1Y3QgbWVtaW5mbyB7CisJaW50IG5yX2JhbmtzOworCXVuc2lnbmVkIGxvbmcgZW5kOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJaW50ICAgICAgICAgICBub2RlOworCX0gYmFua1tOUl9CQU5LU107Cit9OworCitleHRlcm4gc3RydWN0IG1lbWluZm8gbWVtaW5mbzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9zaXplcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQ5MmNhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc2l6ZXMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKiBETyBOT1QgRURJVCEhIC0gdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgZnJvbSAucyBmaWxlIGJ5IGF3ayAtZiBzMmguYXdrCisgKi8KKy8qICBTaXplIGRlZmludGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIEFSTSBMaW1pdGVkIDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX3NpemVzX2gKKyNkZWZpbmUgX19zaXplc19oICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIGhhbmR5IHNpemVzICovCisjZGVmaW5lIFNaXzFLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBTWl80SyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU1pfOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFNaXzE2SyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTWl82NEsgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU1pfMTI4SyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFNaXzI1NksgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBTWl81MTJLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKworI2RlZmluZSBTWl8xTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgU1pfMk0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFNaXzRNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBTWl84TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgU1pfMTZNICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIFNaXzMyTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBTWl82NE0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgU1pfMTI4TSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIFNaXzI1Nk0gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBTWl81MTJNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKworI2RlZmluZSBTWl8xRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgU1pfMkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNlbmRpZgorCisvKiAgICAgICAgIEVORCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vc3RyaW5nLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2VhNTgyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc3RyaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfX0FTTV9BUk1fU1RSSU5HX0gKKyNkZWZpbmUgX19BU01fQVJNX1NUUklOR19ICisKKy8qCisgKiBXZSBkb24ndCBkbyBpbmxpbmUgc3RyaW5nIGZ1bmN0aW9ucywgc2luY2UgdGhlCisgKiBvcHRpbWlzZWQgaW5saW5lIGFzbSB2ZXJzaW9ucyBhcmUgbm90IHNtYWxsLgorICovCisKKyN1bmRlZiBfX0hBVkVfQVJDSF9TVFJSQ0hSCitleHRlcm4gY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX01FTUNQWQorZXh0ZXJuIHZvaWQgKiBtZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gdm9pZCAqIG1lbW1vdmUodm9pZCAqLCBjb25zdCB2b2lkICosIF9fa2VybmVsX3NpemVfdCk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1DSFIKK2V4dGVybiB2b2lkICogbWVtY2hyKGNvbnN0IHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNWkVSTworI3VuZGVmIF9fSEFWRV9BUkNIX01FTVNFVAorZXh0ZXJuIHZvaWQgKiBtZW1zZXQodm9pZCAqLCBpbnQsIF9fa2VybmVsX3NpemVfdCk7CisKKyNpZiAwCitleHRlcm4gdm9pZCBfX21lbXplcm8odm9pZCAqcHRyLCBfX2tlcm5lbF9zaXplX3Qgbik7CisKKyNkZWZpbmUgbWVtc2V0KHAsdixuKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJaWYgKChuKSAhPSAwKSB7CQkJCQkJXAorCQkJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKCh2KSkgJiYgKHYpID09IDApCVwKKwkJCQlfX21lbXplcm8oKHApLChuKSk7CQkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQltZW1zZXQoKHApLCh2KSwobikpOwkJCVwKKwkJfQkJCQkJCQlcCisJCShwKTsJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgbWVtemVybyhwLG4pICh7IGlmICgobikgIT0gMCkgX19tZW16ZXJvKChwKSwobikpOyAocCk7IH0pCisjZWxzZQorZXh0ZXJuIHZvaWQgbWVtemVybyh2b2lkICpwdHIsIF9fa2VybmVsX3NpemVfdCBuKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzk5MjMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX19BU01fQVJNX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fQVJNX1RZUEVTX0gKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bW9kZV90OworCisvKgorICogX194eCBpcyBvazogaXQgZG9lc24ndCBwb2xsdXRlIHRoZSBQT1NJWCBuYW1lc3BhY2UuIFVzZSB0aGVzZSBpbiB0aGUKKyAqIGhlYWRlciBmaWxlcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBsb25nIF9fczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZW4ndCBleHBvcnRlZCBvdXRzaWRlIHRoZSBrZXJuZWwgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzCisgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OworCit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKKworLyogRG1hIGFkZHJlc3NlcyBhcmUgMzItYml0cyB3aWRlLiAgKi8KKwordHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfc2l6ZV90OworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWYyNjhlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20veC1sb2FkLWFybS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9YX0xPQURfQVJNX0hfCisjZGVmaW5lIF9YX0xPQURfQVJNX0hfCTEKKworLyogZm9yIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLCBzZWUgc3RhcnQuUyAqLworZXh0ZXJuIHVsb25nIF9hcm1ib290X3N0YXJ0OwkvKiBjb2RlIHN0YXJ0ICovCitleHRlcm4gdWxvbmcgX2Jzc19zdGFydDsJLyogY29kZSArIGRhdGEgZW5kID09IEJTUyBzdGFydCAqLworZXh0ZXJuIHVsb25nIF9ic3NfZW5kOwkJLyogQlNTIGVuZCAqLworICAgCisjZW5kaWYJLyogX1hfTE9BRF9BUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYmNkLmggYi94LWxvYWRlci9pbmNsdWRlL2JjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNGFhOWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2JjZC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlCisgKiBpbiB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyIG9yIGxhdGVyLAorICogYXQgeW91ciBvcHRpb24uCisgKi8KKworLyogaW5saW5lIGZ1bmN0aW9ucyB0byB0cmFuc2xhdGUgdG8vZnJvbSBiaW5hcnkgYW5kIGJpbmFyeS1jb2RlZCBkZWNpbWFsCisgKiAoZnJlcXVlbnRseSBmb3VuZCBpbiBSVEMgY2hpcHMpLgorICovCisKKyNpZm5kZWYgX0JDRF9ICisjZGVmaW5lIF9CQ0RfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmNkMmJpbih1OCB2YWwpCit7CisJcmV0dXJuICgodmFsKSAmIDB4MGYpICsgKCh2YWwpID4+IDQpICogMTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYmluMmJjZCAodW5zaWduZWQgaW50IHZhbCkKK3sKKwlyZXR1cm4gKCgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKSk7Cit9CisKKyNlbmRpZiAvKiBfQkNEX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYm9vdG0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvYm9vdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVkMjU5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9ib290bS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgR3JhbnQgRXJpY2tzb24gPG1hcmF0aG9uOTZAZ21haWwuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfX0JPT1RNX0hfXworI2RlZmluZQlfX0JPT1RNX0hfXworCisjaW5jbHVkZSAiY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGltYWdlLmg+CisKKyNkZWZpbmUgQk9PVE1fU1RBVFVTX0ZBSUxVUkUgMAorI2RlZmluZSBCT09UTV9TVEFUVVNfU1VDQ0VTUyAxCisKKyNkZWZpbmUgQk9PVE1fSU5ERVhfU1RBUlQgIDAKKyNkZWZpbmUgQk9PVE1fSU5ERVhfU1RPUCAgLTEKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdF9leHRlbnQgeworCXVsb25nIHN0YXJ0OworCXVsb25nIHNpemU7Cit9IGJvb3RfZXh0ZW50X3Q7CisKK3R5cGVkZWYgaW50ICgqZGV2aWNlX2xvYWQpKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJvb3RtX2xvYWRfc3VjY2Vzc2Z1bChpbnQgc3RhdHVzKQoreworCXJldHVybiAoc3RhdHVzID09IEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm9vdG1fbG9hZF9jb250aW51ZShpbnQgc3RhdHVzLCBpbnQgaW5kZXgpCit7CisJcmV0dXJuICgoc3RhdHVzICE9IEJPT1RNX1NUQVRVU19TVUNDRVNTKSAmJiAoaW5kZXggIT0gQk9PVE1fSU5ERVhfU1RPUCkpOworfQorCitleHRlcm4gaW50IGJvb3RtKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlcik7CitleHRlcm4gaW50IGJvb3RtX2JpbmFyeShjb25zdCB1aW50OF90ICpidWZmZXIpOworI2lmIGRlZmluZWQoQ09ORklHX0JPT1RNX0lNQUdFKQorZXh0ZXJuIGludCBib290bV9pbWFnZShjb25zdCBpbWFnZV9oZWFkZXJfdCAqaW1hZ2UpOworI2VuZGlmCisKKyNlbmRpZgkvKiBfX0JPT1RNX0hfXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21tYW5kLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjkzNmFkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb21tYW5kLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqICBEZWZpbml0aW9ucyBmb3IgQ29tbWFuZCBQcm9jZXNzb3IKKyAqLworI2lmbmRlZiBfX0NPTU1BTkRfSAorI2RlZmluZSBfX0NPTU1BTkRfSAorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTAkwCisjZW5kaWYKKworI2lmbmRlZglfX0FTU0VNQkxZX18KKy8qCisgKiBNb25pdG9yIENvbW1hbmQgVGFibGUKKyAqLworCitzdHJ1Y3QgY21kX3RibF9zIHsKKwljaGFyCQkqbmFtZTsJCS8qIENvbW1hbmQgTmFtZQkJCSovCisJaW50CQltYXhhcmdzOwkvKiBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMJKi8KKwlpbnQJCXJlcGVhdGFibGU7CS8qIGF1dG9yZXBlYXQgYWxsb3dlZD8JCSovCisJCQkJCS8qIEltcGxlbWVudGF0aW9uIGZ1bmN0aW9uCSovCisJaW50CQkoKmNtZCkoc3RydWN0IGNtZF90YmxfcyAqLCBpbnQsIGludCwgY2hhciAqW10pOworCWNoYXIJCSp1c2FnZTsJCS8qIFVzYWdlIG1lc3NhZ2UJKHNob3J0KQkqLworI2lmZGVmCUNGR19MT05HSEVMUAorCWNoYXIJCSpoZWxwOwkJLyogSGVscCAgbWVzc2FnZQkobG9uZykJKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVVRPX0NPTVBMRVRFCisJLyogZG8gYXV0byBjb21wbGV0aW9uIG9uIHRoZSBhcmd1bWVudHMgKi8KKwlpbnQJCSgqY29tcGxldGUpKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgbGFzdF9jaGFyLCBpbnQgbWF4diwgY2hhciAqY21kdltdKTsKKyNlbmRpZgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgY21kX3RibF9zCWNtZF90YmxfdDsKKworZXh0ZXJuIGNtZF90YmxfdCAgX191X2Jvb3RfY21kX3N0YXJ0OworZXh0ZXJuIGNtZF90YmxfdCAgX191X2Jvb3RfY21kX2VuZDsKKworCisvKiBjb21tb24vY29tbWFuZC5jICovCitjbWRfdGJsX3QgKmZpbmRfY21kKGNvbnN0IGNoYXIgKmNtZCk7CisKKyNpZmRlZiBDT05GSUdfQVVUT19DT01QTEVURQorZXh0ZXJuIHZvaWQgaW5zdGFsbF9hdXRvX2NvbXBsZXRlKHZvaWQpOworZXh0ZXJuIGludCBjbWRfYXV0b19jb21wbGV0ZShjb25zdCBjaGFyICpjb25zdCBwcm9tcHQsIGNoYXIgKmJ1ZiwgaW50ICpucCwgaW50ICpjb2xwKTsKKyNlbmRpZgorCisvKgorICogTW9uaXRvciBDb21tYW5kCisgKgorICogQWxsIGNvbW1hbmRzIHVzZSBhIGNvbW1vbiBhcmd1bWVudCBmb3JtYXQ6CisgKgorICogdm9pZCBmdW5jdGlvbiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworICovCisKK3R5cGVkZWYJdm9pZCAJY29tbWFuZF90IChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisvKgorICogQ29tbWFuZCBGbGFnczoKKyAqLworI2RlZmluZSBDTURfRkxBR19SRVBFQVQJCTB4MDAwMQkvKiByZXBlYXQgbGFzdCBjb21tYW5kCQkqLworI2RlZmluZSBDTURfRkxBR19CT09URAkJMHgwMDAyCS8qIGNvbW1hbmQgaXMgZnJvbSBib290ZAkqLworCisvKgorICogQ29uZmlndXJhYmxlIG1vbml0b3IgY29tbWFuZHMgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1vdmVkCisgKiB0byBpbmNsdWRlL2NtZF9jb25mZGVmcy5oCisgKi8KKworCisjZGVmaW5lIFN0cnVjdF9TZWN0aW9uICBfX2F0dHJpYnV0ZV9fICgodW51c2VkLHNlY3Rpb24gKCIudV9ib290X2NtZCIpKSkKKworI2lmZGVmICBDRkdfTE9OR0hFTFAKKworI2RlZmluZSBVX0JPT1RfQ01EKG5hbWUsbWF4YXJncyxyZXAsY21kLHVzYWdlLGhlbHApIFwKK2NtZF90YmxfdCBfX3VfYm9vdF9jbWRfIyNuYW1lIFN0cnVjdF9TZWN0aW9uID0geyNuYW1lLCBtYXhhcmdzLCByZXAsIGNtZCwgdXNhZ2UsIGhlbHB9CisKKyNlbHNlCS8qIG5vIGxvbmcgaGVscCBpbmZvICovCisKKyNkZWZpbmUgVV9CT09UX0NNRChuYW1lLG1heGFyZ3MscmVwLGNtZCx1c2FnZSxoZWxwKSBcCitjbWRfdGJsX3QgX191X2Jvb3RfY21kXyMjbmFtZSBTdHJ1Y3RfU2VjdGlvbiA9IHsjbmFtZSwgbWF4YXJncywgcmVwLCBjbWQsIHVzYWdlfQorCisjZW5kaWYJLyogQ0ZHX0xPTkdIRUxQICovCisKKyNlbmRpZgkvKiBfX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21tb24uaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxOGFjOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbW9uLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDkKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTU1PTl9IXworI2RlZmluZSBfX0NPTU1PTl9IXwkxCisKKyN1bmRlZglfTElOVVhfQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUJKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18JCS8qIHB1dCBDIG9ubHkgc3R1ZmYgaW4gdGhpcyBzZWN0aW9uICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJdWNoYXI7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJdnVfbG9uZzsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgdnVfc2hvcnQ7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJdnVfY2hhcjsKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBDT05GSUdfQVJNCisjZGVmaW5lIGFzbWxpbmthZ2UJLyogbm90aGluZyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJNCisjIGluY2x1ZGUgPGFzbS9zZXR1cC5oPgorIyBpbmNsdWRlIDxhc20veC1sb2FkLWFybS5oPgkvKiBBUk0gdmVyc2lvbiB0byBiZSBmaXhlZCEgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJNICovCisKKyNpZmRlZglDRkdfUFJJTlRGCisjZGVmaW5lIHByaW50ZihmbXQsYXJncy4uLikJc2VyaWFsX3ByaW50ZiAoZm10ICwjI2FyZ3MpCisjZGVmaW5lIGdldGMoKSBzZXJpYWxfZ2V0YygpCisjZWxzZQorI2RlZmluZSBwcmludGYoZm10LGFyZ3MuLi4pCisjZGVmaW5lIGdldGMoKSAnICcKKyNlbmRpZgkvKiBDRkdfUFJJTlRGICovCisKKyNkZWZpbmUgRFVNUF9SRUcodGFnLCByZWcsIHR5cGUsIG9wLCBmb3JtYXQpIGRvIHsJCQlcCisgICAgICAgIHJlZ2lzdGVyIHUzMiBfcmVndmFyID0gcmVnOwkJCQkJCQlcCisJCXJlZ2lzdGVyIHR5cGUgX2RhdGF2YXIgPSBvcChfcmVndmFyKTsJCQkJXAorICAgICAgICBwcmludGYoIiAgICAlLTMwcyBAIDB4JTA4eCA9ICIgI2Zvcm1hdCAiXG4iLAkJXAorCQkJICAgdGFnLCBfcmVndmFyLCBfZGF0YXZhcik7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEVU1QX1JFR0IobW5lbW9uaWMpCQkJCQkJCQkJXAorCURVTVBfUkVHKCNtbmVtb25pYywgbW5lbW9uaWMsIHU4LCBfX3Jhd19yZWFkYiwgMHglMDJ4KQorCisjZGVmaW5lIERVTVBfUkVHVyhtbmVtb25pYykJCQkJCQkJCQlcCisJRFVNUF9SRUcoI21uZW1vbmljLCBtbmVtb25pYywgdTE2LCBfX3Jhd19yZWFkdywgMHglMDR4KQorCisjZGVmaW5lIERVTVBfUkVHTChtbmVtb25pYykJCQkJCQkJCQlcCisJRFVNUF9SRUcoI21uZW1vbmljLCBtbmVtb25pYywgdTMyLCBfX3Jhd19yZWFkbCwgMHglMDh4KQorCisjaWZkZWYJREVCVUcKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZGVmaW5lIGRlYnVnWChsZXZlbCxmbXQsYXJncy4uLikgaWYgKERFQlVHPj1sZXZlbCkgcHJpbnRmKGZtdCwjI2FyZ3MpOworI2Vsc2UKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCisjZGVmaW5lIGRlYnVnWChsZXZlbCxmbXQsYXJncy4uLikKKyNlbmRpZgkvKiBERUJVRyAqLworCisjZGVmaW5lIGVycm9yKGZtdCwgYXJncy4uLikgZG8gewkJCQkJXAorCQlwcmludGYoIkVSUk9SOiAiIGZtdCAiXG5hdCAlczolZC8lcygpXG4iLAkJXAorCQkJIyNhcmdzLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNpZm5kZWYgQlVHCisjZGVmaW5lIEJVRygpIGRvIHsgXAorCXByaW50ZigiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IFwKKwlwYW5pYygiQlVHISIpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIEJVRygpOyB9IHdoaWxlKDApCisjZW5kaWYgLyogQlVHICovCisKKy8qCisgKiBHZW5lcmFsIFB1cnBvc2UgVXRpbGl0aWVzCisgKi8KKyNkZWZpbmUgbWluKFgsIFkpCQkJCVwKKwkoeyB0eXBlb2YgKFgpIF9feCA9IChYKSwgX195ID0gKFkpOwlcCisJCShfX3ggPCBfX3kpID8gX194IDogX195OyB9KQorCisjZGVmaW5lIG1heChYLCBZKQkJCQlcCisJKHsgdHlwZW9mIChYKSBfX3ggPSAoWCksIF9feSA9IChZKTsJXAorCQkoX194ID4gX195KSA/IF9feCA6IF9feTsgfSkKKworI2RlZmluZSBNSU4oeCwgeSkgIG1pbih4LCB5KQorI2RlZmluZSBNQVgoeCwgeSkgIG1heCh4LCB5KQorCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKy8qICovCitpbnQJZGlzcGxheV9vcHRpb25zICh2b2lkKTsKK3ZvaWQJcHJpbnRfc2l6ZSh1bnNpZ25lZCBsb25nIGxvbmcsIGNvbnN0IGNoYXIgKik7CitpbnQJcHJpbnRfYnVmZmVyICh1bG9uZyBhZGRyLCB2b2lkKiBkYXRhLCB1aW50IHdpZHRoLCB1aW50IGNvdW50LCB1aW50IGxpbmVsZW4pOworCisvKiBib2FyZC8kKEJPQVJEKS8kKEJPQVJEKS5jICovCitpbnQgCWJvYXJkX2luaXQgKHZvaWQpOworaW50IAluYW5kX2luaXQgKHZvaWQpOworaW50ICAgICBtbWNfYm9vdCAodW5zaWduZWQgY2hhciAqYnVmKTsKK3ZvaWQJYm9hcmRfaGFuZyAodm9pZCk7Cit2b2lkICAgIGRvX3VzYih2b2lkKTsKKworCisvKiBjcHUvJChDUFUpL2NwdS5jICovCitpbnQgCWNwdV9pbml0ICh2b2lkKTsKKyNpZmRlZiAgQ0ZHX1VERUxBWQordm9pZCAJdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpOworI2VuZGlmCisKKy8qIG5hbmQgZHJpdmVyICovCisjZGVmaW5lIE5BTkRfQ01EX1JFQUQwCQkwCisjZGVmaW5lIE5BTkRfQ01EX1JFQUQxCQkxCisjZGVmaW5lIE5BTkRfQ01EX1JFQURPT0IJMHg1MAorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVMJCTB4NzAKKyNkZWZpbmUgTkFORF9DTURfUkVBRElECQkweDkwCisjZGVmaW5lIE5BTkRfQ01EX1JFU0VUCQkweGZmCisKKy8qIEV4dGVuZGVkIENvbW1hbmRzIGZvciBMYXJnZSBwYWdlIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9DTURfUkVBRFNUQVJUCTB4MzAKKworLyogUmV0dXJuIGNvZGVzIGZvciBuYW5kIHJlYWRzICovCisjZGVmaW5lIE5BTkRfUkVBRF9TVUNDRVNTICAgICAgICAgICAgICAwCisjZGVmaW5lIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSyAgICAxCisjZGVmaW5lIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRSAgICAgICAgICAyCisKK2ludCAJbmFuZF9jaGlwKHZvaWQpOworaW50IAluYW5kX3JlYWRfYmxvY2sodWNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcik7CisKK2ludCAJb25lbmFuZF9jaGlwKHZvaWQpOworaW50CW9uZW5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrKTsKKworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisvKiBzZXJpYWwgZHJpdmVyICovCitpbnQJc2VyaWFsX2luaXQgICAodm9pZCk7Cit2b2lkCXNlcmlhbF9zZXRicmcgKHZvaWQpOwordm9pZAlzZXJpYWxfcHV0YyAgIChjb25zdCBjaGFyKTsKK3ZvaWQJc2VyaWFsX3B1dHMgICAoY29uc3QgY2hhciAqKTsKK2ludAlzZXJpYWxfZ2V0YyAgICh2b2lkKTsKK2ludAlzZXJpYWxfdHN0YyAgICh2b2lkKTsKKworLyogbGliL3ByaW50Zi5jICovCit2b2lkCXNlcmlhbF9wcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisvKiBsaWIvY3JjLmMgKi8KK3ZvaWQgCW5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpOworCisvKiBsaWIvdnNwcmludGYuYyAqLworCitpbnQgCW5hbmRfY29ycmVjdF9kYXRhICh1X2NoYXIgKmRhdCwgdV9jaGFyICpyZWFkX2VjYywgdV9jaGFyICpjYWxjX2VjYyk7CisKKy8qIGxpYi9ib2FyZC5jICovCit2b2lkCWhhbmcJCSh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworLyogc3Rkb3V0ICovCit2b2lkCXB1dHMoY29uc3QgY2hhciAqcyk7CisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qIFB1dCBvbmx5IHN0dWZmIGhlcmUgdGhhdCB0aGUgYXNzZW1ibGVyIGNhbiBkaWdlc3QgKi8KKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKKworI2RlZmluZSBST1VORChhLGIpCQkoKChhKSArIChiKSkgJiB+KChiKSAtIDEpKQorI2RlZmluZSBESVZfUk9VTkQobixkKQkJKCgobikgKyAoKGQpLzIpKSAvIChkKSkKKyNkZWZpbmUgRElWX1JPVU5EX1VQKG4sZCkJKCgobikgKyAoZCkgLSAxKSAvIChkKSkKKyNkZWZpbmUgcm91bmR1cCh4LCB5KQkJKCgoKHgpICsgKCh5KSAtIDEpKSAvICh5KSkgKiAoeSkpCisKKyNkZWZpbmUgQUxJR04oeCxhKQkJX19BTElHTl9NQVNLKCh4KSwodHlwZW9mKHgpKShhKS0xKQorI2RlZmluZSBfX0FMSUdOX01BU0soeCxtYXNrKQkoKCh4KSsobWFzaykpJn4obWFzaykpCisKKyNlbmRpZgkvKiBfX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb21waWxlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjRiODMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbXBpbGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBLZWVwIGFsbCB0aGUgdWdseSAjaWZkZWYgZm9yIHN5c3RlbSBzdHVmZiBoZXJlCisgKi8KKworI2lmbmRlZiBfX0NPTVBJTEVSX0hfXworI2RlZmluZSBfX0NPTVBJTEVSX0hfXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBVU0VfSE9TVENDCisKKyNpZiBkZWZpbmVkKF9fQkVPU19fKQkgfHwgXAorICAgIGRlZmluZWQoX19OZXRCU0RfXykgIHx8IFwKKyAgICBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBcCisgICAgZGVmaW5lZChfX3N1bl9fKQkgfHwgXAorICAgIGRlZmluZWQoX19BUFBMRV9fKQorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgIWRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorCisvKiBOb3QgYWxsIHN5c3RlbXMgKGxpa2UgV2luZG93cykgaGFzIHRoaXMgZGVmaW5lLCBhbmQgeWVzCisgKiB3ZSBkbyByZXBsYWNlL2VtdWxhdGUgbW1hcCgpIG9uIHRob3NlIHN5c3RlbXMgLi4uCisgKi8KKyNpZm5kZWYgTUFQX0ZBSUxFRAorIyBkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQgKiktMSkKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZm5kZWYgT19CSU5BUlkJCS8qIHNob3VsZCBiZSBkZWZpbmUnZCBvbiBfX1dJTjMyX18gKi8KKyNkZWZpbmUgT19CSU5BUlkJMAorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZWxpZiBkZWZpbmVkKF9fTUFDSF9fKQorIyBpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgIHVpbnQ7CisjZW5kaWYKKwordHlwZWRlZiB1aW50OF90IF9fdTg7Cit0eXBlZGVmIHVpbnQxNl90IF9fdTE2OwordHlwZWRlZiB1aW50MzJfdCBfX3UzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisKKyNkZWZpbmUgdXN3YXBfMTYoeCkgXAorCSgoKCh4KSAmIDB4ZmYwMCkgPj4gOCkgfCBcCisJICgoKHgpICYgMHgwMGZmKSA8PCA4KSkKKyNkZWZpbmUgdXN3YXBfMzIoeCkgXAorCSgoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKwkgKCgoeCkgJiAweDAwZmYwMDAwKSA+PiAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKyNkZWZpbmUgX3Vzd2FwXzY0KHgsIHNmeCkgXAorCSgoKCh4KSAmIDB4ZmYwMDAwMDAwMDAwMDAwMCMjc2Z4KSA+PiA1NikgfCBcCisJICgoKHgpICYgMHgwMGZmMDAwMDAwMDAwMDAwIyNzZngpID4+IDQwKSB8IFwKKwkgKCgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDAjI3NmeCkgPj4gMjQpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwZmYwMDAwMDAwMCMjc2Z4KSA+PiAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMGZmMDAwMDAwIyNzZngpIDw8ICA4KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMDAwMDBmZjAwMDAjI3NmeCkgPDwgMjQpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMCMjc2Z4KSA8PCA0MCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMDAwMDAwMGZmIyNzZngpIDw8IDU2KSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgdXN3YXBfNjQoeCkgX3Vzd2FwXzY0KHgsIHVsbCkKKyNlbHNlCisjIGRlZmluZSB1c3dhcF82NCh4KSBfdXN3YXBfNjQoeCwgKQorI2VuZGlmCisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBjcHVfdG9fbGUxNih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fbGUzMih4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fbGU2NCh4KQkJKHgpCisjIGRlZmluZSBsZTE2X3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBsZTMyX3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBsZTY0X3RvX2NwdSh4KQkJKHgpCisjIGRlZmluZSBjcHVfdG9fYmUxNih4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGNwdV90b19iZTMyKHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgY3B1X3RvX2JlNjQoeCkJCXVzd2FwXzY0KHgpCisjIGRlZmluZSBiZTE2X3RvX2NwdSh4KQkJdXN3YXBfMTYoeCkKKyMgZGVmaW5lIGJlMzJfdG9fY3B1KHgpCQl1c3dhcF8zMih4KQorIyBkZWZpbmUgYmU2NF90b19jcHUoeCkJCXVzd2FwXzY0KHgpCisjZWxzZQorIyBkZWZpbmUgY3B1X3RvX2xlMTYoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBjcHVfdG9fbGUzMih4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGNwdV90b19sZTY0KHgpCQl1c3dhcF82NCh4KQorIyBkZWZpbmUgbGUxNl90b19jcHUoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBsZTMyX3RvX2NwdSh4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGxlNjRfdG9fY3B1KHgpCQl1c3dhcF82NCh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMTYoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMzIoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlNjQoeCkJCSh4KQorIyBkZWZpbmUgYmUxNl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgYmUzMl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgYmU2NF90b19jcHUoeCkJCSh4KQorI2VuZGlmCisKKyNlbHNlIC8qICFVU0VfSE9TVENDICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogVHlwZXMgZm9yIGB2b2lkIConIHBvaW50ZXJzLiAqLworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgICAgdWludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgdWludHB0cl90OworI2VuZGlmCisKKyNlbmRpZgorCisvKiBjb21waWxlciBvcHRpb25zICovCisjZGVmaW5lIHVuaW5pdGlhbGl6ZWRfdmFyKHgpCQl4ID0geAorCisjZGVmaW5lIGxpa2VseSh4KQlfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQorI2RlZmluZSB1bmxpa2VseSh4KQlfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlnX2RlZmF1bHRzLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ19kZWZhdWx0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjA0OGEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ19kZWZhdWx0cy5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIGNvbmZpZ19kZWZhdWx0cy5oIC0gc2FuZSBkZWZhdWx0cyBmb3IgZXZlcnlvbmUKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQ09ORklHX0RFRkFVTFRTX0hfCisjZGVmaW5lIF9DT05GSUdfREVGQVVMVFNfSF8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2FtMzUxN2V2bS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2FtMzUxN2V2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmI5MjYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvYW0zNTE3ZXZtLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyAqIFgtTG9hZGVyIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIEFNMzUxN0VWTSBib2FyZC4KKyAqCisgKiBEZXJpdmVkIGZyb20gL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKworI2RlZmluZSBDT05GSUdfQU0zNTE3RVZNICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEFNMzUxNyBFVk0gKi8KKy8vI2RlZmluZSBDT05GSUdfQU0zNTE3VEVCICAgICAgIDEgICAgLyogd29ya2luZyB3aXRoIEFNMzUxNyBURUIgKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisjZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDI2MDAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTM4MU1IeiAtIFZERDE9MS4yMHYgKi8KKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTMgICAgICAgICBPTUFQMzRYWF9VQVJUMworCisvKgorICogc2VsZWN0IHNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU0VSSUFMMyAgICAgICAgICAgMyAgICAvKiBVQVJUMSBvbiBPTUFQM0VWTSAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMworCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfMTZCSVQKKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDdGRkZGICBCb290aW5nIEltYWdlCisgKiAweDAwMDgwMDAwIC0gMHgwMDIzRkZGRiAgVS1Cb290IEltYWdlCisgKiAweDAwMjQwMDAwIC0gMHgwMDI3RkZGRiAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwMjgwMDAwIC0gMHgwMDc3RkZGRiAgS2VybmVsIEltYWdlCisgKiAweDAwNzgwMDAwIC0gMHgwODAwMDAwMCAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisjZGVmaW5lIE5BTkRfVUJPT1RfU1RBUlQgICAgICAgICAweDAwODAwMDAgLyogTGVhdmluZyBmaXJzdCA0IGJsb2NrcyBmb3IgeC1sb2FkICovCisjZGVmaW5lIE5BTkRfVUJPT1RfRU5EICAgICAgICAgICAweDAyNDAwMDAgLyogR2l2aW5nIGEgc3BhY2Ugb2YgMiBibG9ja3MgPSAyNTZLQiAqLworI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgMHgyMDAwMAorCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisKKyNpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorI2VsaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN1RFQikKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhEQykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhFMCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHhFNCkKKyNlbmRpZgorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQJMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyCisgKiAgIDB4MDA4MDAwMCAtIDB4MDI0MDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAyNDAwMDAgLSAweDAyODAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMjgwMDAwIC0gMHgwNzgwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDc4MDAwMCAtIDB4ODAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICAxOAorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgLyogX19DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTZmZTEyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQuaApAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIFRoZSBmaWxlIHdhcyBvcmlnaW5hbGx5IGRlcml2ZWQgZnJvbSBvbWFwM2V2bS5oLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0RJQU1PTkRfQ09ORklHX0gKKyNkZWZpbmUgX19ESUFNT05EX0NPTkZJR19ICisKKy8qCisgKiBBUk0gUHJvY2Vzc29yIEFyY2hpdGVjdHVyZSwgRmFtaWx5IGFuZCBQcm9kdWN0IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTgJCTEKKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAxCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgIDEKKworLyoKKyAqIFdpdGggdGhlIGFyY2hpdGVjdHVyZSwgZmFtaWx5IGFuZCBwcm9kdWN0IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCwKKyAqIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIENQVSBoZWFkZXIgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisKKy8qCisgKiBBc3NlcnQgdGhlIGJvYXJkIHR5cGUocykgd2UgYXJlIGJ1aWxkaW5nIGZvci4KKyAqCisgKi8KKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX1BST1RPVFlQRQorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0VWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX1BWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX01QCisjZGVmaW5lIENPTkZJR19ESUFNT05EX0JPQVJEX01VTFRJCQkJMQorCisvKgorICogRW5hYmxlIHNlcmlhbCBjb25zb2xlIHByaW50ZiBmYWNpbGl0eSAoY29uc3VtZXMgYWJvdXQgMy41IEtpQikKKyAqLworI2RlZmluZSBDRkdfUFJJTlRGCisKKy8qCisgKiBDT05GSUdfQk9PVE1fSU1BR0UgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBYLUxvYWRlcgorICogc3VwcG9ydHMgYm9vdGluZyBmcm9tICdta2ltYWdlJyB1LWJvb3QgaW1hZ2UgZmlsZXMgcmF0aGVyIHRoYW4ganVzdAorICogcmF3LCB1LWJvb3QgYmluYXJpZXMuCisgKgorICogRW5hYmxpbmcgdGhpcyBhZGRzIHN1cHBvcnQgZm9yIGF0dGVtcHRpbmcgdG8gYm9vdCBmcm9tIG9uZSBvciBtb3JlCisgKiBpbWFnZXMgYmVjYXVzZSBpdCBhbGxvd3MgYW4gaW1hZ2UgdG8gYmUgc2FuaXR5LWNoZWNrZWQgYmVmb3JlCisgKiBhdHRlbXB0aW5nIHRvIGJvb3QgaXQuCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RNX0lNQUdFCisKKy8qCisgKiBEaXNwbGF5IGltYWdlIGluZm9ybWF0aW9uIHdpdGggdGltZXN0YW1wcworICovCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUFJJTlRGKQorLyoKKyAqIFVzZSBhIHByaW50ZiBidWZmZXIgc2l6ZSBvZiAyNTYgQgorICovCisjIGRlZmluZSBDRkdfUEJTSVpFCQkJCTI1NgorCisvKgorICogSW5kaWNhdGUgdGhhdCB3ZSB3YW50IHRvIHVzZSBDRkdfTlMxNjU1MF9DT00xIChzZWUgYmVsb3cpIGF0IGEgYmF1ZAorICogcmF0ZSBvZiAxMTUsMjAwIGJwcyBmb3IgdGhlIHNlcmlhbCBjb25zb2xlLgorICovCisjIGRlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgIDEKKyMgZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgMTE1MjAwCisKKy8qCisgKiBOUzE2NTUwLWNvbXBhdGlibGUgc2VyaWFsIGRyaXZlciBjb25maWd1cmF0aW9uCisgKi8KKyMgZGVmaW5lIENGR19OUzE2NTUwCisjIGRlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyMgZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgKC00KQorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAoNDgwMDAwMDApCisjIGRlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgIE9NQVAzNFhYX1VBUlQxCisjZW5kaWYgLyogZGVmaW5lZChDRkdfUFJJTlRGKSAqLworCisvKgorICogRGlzYWJsZSB0aW1lci1iYXNlZCBkZWxheSAoY29uc3VtZXMgYWJvdXQgMjUwIEIpIHNpbmNlIHRoaXMgaXMgb25seQorICogYXZhaWxhYmxlIGF0IHByZXNlbnQgb24gdGhlIEFSTTkyNkVKUy4KKyAqLworI3VuZGVmCUNGR19VREVMQVkKKworLyoKKyAqIFRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgZGV2ZWxvcG1lbnQgYm9hcmQgaGFzIGFuIFNEL01NQworICogY29ubmVjdG9yLCBzbyBlbmFibGUgc3VwcG9ydCBmb3IgaXQsIHdoaWNoIGltcGxpY2l0bHkgZW5hYmxlcworICogcnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgTVMtRE9TIChNQlIpIHBhcnRpdGlvbnMgYW5kIEZBVCBmaWxlCisgKiBzeXN0ZW1zLgorICovCisjZGVmaW5lIENPTkZJR19NTUMJCQkJMQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorIyBkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAxCisjIGRlZmluZSBDRkdfQ01EX0ZBVCAgICAgICAgICAgIDEKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19NTUMpICovCisKKy8qCisgKiBDbG9jayBDb25maWd1cmF0aW9uCisgKgorICogIENob29zZSBQUkNNIENvbmZpZ3VyYXRpb24gMiB3aGljaCBzdWJzZWxlY3RzIGEgTDMgaW50ZXJjb25uZWN0CisgKiAgY2xvY2sgb2YgMTY2IE1IeiBmb3IgU0RSQU0uCisgKi8KKworI3VuZGVmIENGR19QUkNNX0RFQlVHCisKKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIAkJMQorCisjZGVmaW5lCUNPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaCQkxCisjdW5kZWYJQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFoKKworI2RlZmluZQlDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFoJCTEKKyN1bmRlZglDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFoKKyN1bmRlZglDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFoKKworI2RlZmluZSBDRkdfU0RSQU1fU0laRV9NQgkJCQk2NAorI3VuZGVmIENGR19TRFJBTV9ERUJVRworCisvKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBtYXkgaGF2ZSBvbmUgb2YgdGhyZWUgU0RSQU1zCisgKiAxYSlTYW1zdW5nIEktRGllIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICogCisgKiAxYilTYW1zdW5nIEstRGllIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICoKKyAqIDIpIE5hbnlhIE5UNkRNIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICoKKyAqLworCisjdW5kZWYgQ0ZHX1NEUkFNX1NNR19LNFgKKyN1bmRlZiBDRkdfU0RSQU1fTllBX05URDYKKyNkZWZpbmUgQ0ZHX1NEUkFNX0NPTUJJTkVECisvKgorICogVGhlc2UgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BLLUZHQzYgZGF0YXNoZWV0IAorICogKGFwcGxpY2FibGUgdG8gdGhlIEktZGllIGFuZCB0aGUgSy1kaWUpIGFuZCB0aGUgVEkgc3ByZWFkc2hlZXQgCisgKiBhdCBodHRwOi8vcHJvY2Vzc29ycy53aWtpLnRpLmNvbS9pbmRleC5waHA/dGl0bGU9CisgKiBTZXR0aW5nX3VwX0FNMzd4X1NEUkNfcmVnaXN0ZXJzLgorICovCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fU01HX0s0WCkKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQwkJMTIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDCQkxMAorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTCQkgNworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlAJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwJCSA1CisKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUgkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRQkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSCQkyMAorI2VuZGlmCisKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBOYW55YSBOVDZETSBkYXRhc2hlZXQgYW5kIHRoZSBUSQorICogc3ByZWFkc2hlZXQgYXQgaHR0cDovL3Byb2Nlc3NvcnMud2lraS50aS5jb20vaW5kZXgucGhwP3RpdGxlPQorICogU2V0dGluZ191cF9BTTM3eF9TRFJDX3JlZ2lzdGVycy4KKyAqLworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX05ZQV9OVEQ2KQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkgICAgICAgICA2CQorCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYUAkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUgkJMTkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9DT01CSU5FRCkKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQwkJMTIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDCQkxMAorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTCQkgNworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlAJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwJICAgICAgICAgNgkKKworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFCQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFAJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IJICAgICAgICAyMAkKKyNlbmRpZgorCisKKworLyoKKyAqIE5BTkQgQ29uZmlndXJhdGlvbgorICoKKyAqIFRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQgbWF5IGhhdmUgdHdvIE5BTkQgZGV2aWNlczoKKyAqCisgKiAgIDFhKSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgQCBHUE1DIENTMAorICoKKyAqICAgICAgLSAyIEdiIHggMTYgKDI1NiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMS44VgorICogICAgICAtIFNMQworICogICAgICAtIDEtYml0IEVDQworICoKKyAqICAgMWIpIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IEAgR1BNQyBDUzAKKyAqCisgKiAgICAgIC0gMiBHYiB4IDE2ICgyNTYgTWlCKQorICogICAgICAtIDIgS2lCIHBhZ2Ugc2l6ZQorICogICAgICAtIDEyOCBLaUIgZXJhc2Ugc2l6ZQorICogICAgICAtIDEuOFYKKyAqICAgICAgLSBTTEMKKyAqICAgICAgLSA0LWJpdCBFQ0MKKyAqCisgKiAgIDIpIFNhbXN1bmcgSzlGNEcwOFUwQyBAIEdQTUMgQ1MzCisgKgorICogICAgICAtIDQgR2IgeCA4ICg1MTIgTWlCKQorICogICAgICAtIDIgS2lCIHBhZ2Ugc2l6ZQorICogICAgICAtIDEyOCBLaUIgZXJhc2Ugc2l6ZQorICogICAgICAtIDMuM1YKKyAqICAgICAgLSBTTEMKKyAqLworCisjZGVmaW5lIENGR19HUE1DX05BTkQKKyNkZWZpbmUgQ0ZHX01NQ19OQU5ECisjdW5kZWYJQ0ZHX0dQTUNfT05FTkFORAorI3VuZGVmCUNGR19NTUNfT05FTkFORAorCisjdW5kZWYgQ0ZHX0dQTUNfREVCVUcKKworI3VuZGVmCUNGR19OQU5EX0s5RjRHMDhVMEMJCS8vIFNhbXN1bmcgSzlGNEcwOFUwQworI2RlZmluZSBDRkdfTkFORF9NVDI5RjJHMTYJCS8vIE1pY3JvbiBNVDI5RjJHMTYKKworI3VuZGVmICBDRkdfTkFORF9FQ0NfMUJJVAorI2RlZmluZSBDRkdfTkFORF9FQ0NfNEJJVAkxCisjdW5kZWYgIENGR19OQU5EX0VDQ184QklUCisKKyNkZWZpbmUgQ0ZHX0dQTUNfTkFORF9CQVNFCU5BTkRfQkFTRQorI2RlZmluZSBDRkdfR1BNQ19OQU5EX1NJWkUJR1BNQ19TSVpFXzEyOE0KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcxXzAJTV9OQU5EX0dQTUNfQ09ORklHMQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcyXzAJTV9OQU5EX0dQTUNfQ09ORklHMgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUczXzAJTV9OQU5EX0dQTUNfQ09ORklHMworI2RlZmluZSBDRkdfR1BNQ19DT05GSUc0XzAJTV9OQU5EX0dQTUNfQ09ORklHNAorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc1XzAJTV9OQU5EX0dQTUNfQ09ORklHNQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc2XzAJTV9OQU5EX0dQTUNfQ09ORklHNgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc3XzAJXAorCShHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfU0laRSkgfCBcCisJIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9CQVNFKSkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikgKi8KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMV8zCU1fTkFORF9HUE1DX0NPTkZJRzEgLy9TTU5BTkRfR1BNQ19DT05GSUcxCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzJfMwlNX05BTkRfR1BNQ19DT05GSUcyIC8vU01OQU5EX0dQTUNfQ09ORklHMgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUczXzMJTV9OQU5EX0dQTUNfQ09ORklHMyAvL1NNTkFORF9HUE1DX0NPTkZJRzMKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNF8zCU1fTkFORF9HUE1DX0NPTkZJRzQgLy9TTU5BTkRfR1BNQ19DT05GSUc0CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzVfMwlNX05BTkRfR1BNQ19DT05GSUc1IC8vU01OQU5EX0dQTUNfQ09ORklHNQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc2XzMJTV9OQU5EX0dQTUNfQ09ORklHNiAvL1NNTkFORF9HUE1DX0NPTkZJRzYKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHN18zCVwKKwkoR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX1NJWkUpIHwgXAorCSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfQkFTRSkpCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSAqLworCisvKgorICogQXJjaGl0ZWN0dXJlLCBwcm9jZXNzb3IgYW5kL29yIGJvYXJkLXNwZWNpZmljIE5BTkQgYWNjZXNzIG1hY3JvcworICogYW5kIGRyaXZlciBwYXJhbWV0ZXJzLgorICovCisKKyNpZiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikKKyMgZGVmaW5lIE5BTkRfMTZCSVQKKyMgZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkoMTI4IDw8IDEwKQorI2VsaWYgZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKQorIyB1bmRlZglOQU5EXzE2QklUCisjIGRlZmluZSBOQU5EX0JMT0NLX1NJWkUJKDEyOCA8PCAxMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikgKi8KKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IEdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+R1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSBHUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfkdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2VuZGlmIC8qIE5BTkRfMTZCSVQgKi8KKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKQorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKQorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpCisKKy8qCisgKiBMb2NhdGlvbiB3aGVyZSB3ZSBleHBlY3QgdG8gZmluZCB0aGUgc2Vjb25kLXN0YWdlIGJvb3QgbG9hZGVyIGluCisgKiB0aGUgYm9vdCBOQU5EIGRldmljZS4KKyAqCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgQWxpYXMgRGVzY3JpcHRpb24gICAgICAgICAgICBTaXplICAgIEJsb2NrcyAgQmxvY2sgICAgIEFkZHJlc3MgICAgIFNpemUKKyAqICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIGlwbAkgWC1Mb2FkZXIgSW1hZ2UJICAgICAgMjU2IEtpQiAgICAgIDIgICAgICAwCSAgMHgwMDAwMDAwMCAgICAwIEIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIHNwbDAJIFByaW1hcnkgVS1Cb290IEltYWdlIDEuNSBNaUIgICAgIDEyICAgICAgMgkgIDB4MDAwNDAwMDAgIDI1NiBLaUIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIHNwbDEJIFJlc2VydmVkIGZvciBGdXR1cmUgIDEuNSBNaUIgICAgIDEyICAgICAxNAkgIDB4MDAxQzAwMDAgMS43NSBNaUIKKyAqICAgICAgICAgICBTZWNvbmRhcnkgVS1Cb290CisgKiAgICAgICAgICAgSW1hZ2UKKyAqICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVDFfU1RBUlQJCTB4MDAxQzAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFCQkweDE4MDAwMAorCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lIENPTkZJR19OQU5EX0JPT1RFWFRFTlRfTElTVAkJeyB7IENGR19OQU5EX0JPT1RFWFRFTlQwX1NUQVJULCBcCisJCQkJCQkJCQkJCUNGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9LAlcCisJCQkJCQkJCQkJICB7IENGR19OQU5EX0JPT1RFWFRFTlQxX1NUQVJULCBcCisJCQkJCQkJCQkJCUNGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9IH0KKyNlbHNlCisjZGVmaW5lIENPTkZJR19OQU5EX0JPT1RFWFRFTlQJCQl7IENGR19OQU5EX0JPT1RFWFRFTlQwX1NUQVJULCBcCisJCQkJCQkJCQkJICBDRkdfTkFORF9CT09URVhURU5UX1NJWkUgfQorI2VuZGlmCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKworLyoKKyAqIENPTkZJR19CT09URklMRSAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgKiBzZWNvbmQtc3RhZ2UgYm9vdCBmaWxlIGxvYWRlZCBmcm9tIFNEIGNhcmQgaWYgdGhlIHN5c3RlbSBoYXMgYmVlbgorICogY29uZmlndXJlZCB0byBib290IGFzIHN1Y2guCisgKgorICogQ09ORklHX0JPT1RGSUxFX0xJU1QgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIGEgbGlzdCBvZiBkZWZhdWx0IHZhbHVlcworICogZm9yIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBmaWxlIGxvYWRlZCBmcm9tIFNEIGNhcmQgaWYgdGhlIHN5c3RlbSBoYXMgYmVlbgorICogY29uZmlndXJlZCB0byBib290IGFzIHN1Y2guCisgKgorICogVHJ5IHRvIGJvb3QgYW4gJ21raW1hZ2UnIHUtYm9vdCBpbWFnZSBmaXJzdDsgb3RoZXJ3aXNlLCB0cnkgdG8gYm9vdCBhCisgKiByYXcgdS1ib290IGJpbmFyeSBpZiBpdCBleGlzdHMgYXMgYSBmYWxsYmFjay4KKyAqLworI2lmZGVmIENPTkZJR19CT09UTV9JTUFHRQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEVfTElTVCAJCQl7ICJ1LWJvb3QuaW1nIiwgInUtYm9vdC5iaW4iIH0KKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJCQkJInUtYm9vdC5pbWciCisjZW5kaWYKKworLyoKKyAqIExvY2F0aW9uIGluIFNEUkFNIHdoZXJlIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIgd2lsbCBiZSBsb2FkZWQKKyAqIHRvIGFuZCBleGVjdXRlZCBmcm9tLgorICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAJCTB4ODAwMDgwMDAKKworI2VuZGlmIC8qIF9fRElBTU9ORF9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LXVzYi1sb2FkZXIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTRjN2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LXVzYi1sb2FkZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEyIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBKNDkgYm9hcmQuICBUaGUgaXRlbXMgYmVsb3cgc2hvdWxkCisgKiAgICAgIGJlIHVwZGF0ZWQgYXMgdGhlIGhhcmR3YXJlIHNldHRsZXMuCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fSjQ5X0NPTkZJR19ICisjZGVmaW5lIF9fSjQ5X0NPTkZJR19ICisKKyNpbmNsdWRlICJkaWFtb25kLmgiCisKKy8qCisgKiBBc3NlcnQgdGhlIGJvYXJkIHR5cGUocykgd2UgYXJlIGJ1aWxkaW5nIGZvci4KKyAqCisgKi8KKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BST1RPVFlQRQorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRVZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9EVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BSRV9QVlQKKyNkZWZpbmUgQ09ORklHX0o0OV9CT0FSRF9NVUxUSQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCIDEKKworI2VuZGlmIC8qIF9fSjQ5X0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDkuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY1OGRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IEo0OSBib2FyZC4gIFRoZSBpdGVtcyBiZWxvdyBzaG91bGQKKyAqICAgICAgYmUgdXBkYXRlZCBhcyB0aGUgaGFyZHdhcmUgc2V0dGxlcy4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19KNDlfQ09ORklHX0gKKyNkZWZpbmUgX19KNDlfQ09ORklHX0gKKworI2luY2x1ZGUgImRpYW1vbmQuaCIKKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9FVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJFX1BWVAorI2RlZmluZSBDT05GSUdfSjQ5X0JPQVJEX01VTFRJCQkJMQorCisjZW5kaWYgLyogX19KNDlfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRlYWNlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmgKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKiAgIE9NQVAgaGFyZHdhcmUgbWFwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuIChodHRwOi8vd3d3LnJpZGdlcnVuLmNvbSkKKyAqIEF1dGhvcjogUmlkZ2VSdW4sIEluYy4KKyAqCSAgIEdyZWcgTG9ubm9uIChnbG9ubm9uQHJpZGdlcnVuLmNvbSkgb3IgaW5mb0ByaWRnZXJ1bi5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZgkgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUJTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQJICBgYEFTCUlTJycgQU5EICAgQU5ZCUVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsCSAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PCUVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCSBMSUFCTEUgRk9SIEFOWQkgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQJICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMJT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsCU9SIFBST0ZJVFM7IE9SCUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4JIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qCisgIFRoZXJlIGFyZSAyIHNldHMgb2YgZ2VuZXJhbCBJL08gLS0+CisgIDEuIEdQSU8gKHNoYXJlZCBiZXR3ZWVuIEFSTSAmIERTUCwgY29uZmlndXJlZCBieSBBUk0pCisgIDIuIE1QVUlPIHdoaWNoIGNhbiBiZSB1c2VkIG9ubHkgYnkgdGhlIEFSTS4KKworICBCYXNlIGFkZHJlc3MgRkZGQjo1MDAwIGlzIHdoZXJlIHRoZSBBUk0gYWNjZXNzZXMgdGhlIE1QVUlPIGNvbnRyb2wgcmVnaXN0ZXJzCisgIChzZWUgNy4yLjIgb2YgdGhlIFRSTSBmb3IgTVBVSU8gcmVnIGRlZmluaXRpb25zKS4KKworICBCYXNlIGFkZHJlc3MgRTEwMTo1MDAwIGlzIHJlc2VydmVkIGZvciBBUk0gYWNjZXNzIG9mIHRoZSBzYW1lIE1QVUlPIGNvbnRyb2wKKyAgcmVncywgYnV0IHZpYSB0aGUgRFNQIEkvTyBtYXAuICBUaGlzIGFkZHJlc3MgaXMgdW5hdmFpbGFibGUgb24gMTUxMC4KKworICBCYXNlIGFkZHJlc3MgRkZGQzpFMDAwIGlzIHdoZXJlIHRoZSBBUk0gYWNjZXNzZXMgdGhlIEdQSU8gY29uZmlnIHJlZ2lzdGVycworICBkaXJlY3RseSB2aWEgaXRzIG93biBwZXJpcGhlcmFsIGJ1cy4KKworICBCYXNlIGFkZHJlc3MgRTEwMTpFMDAwIGlzIHdoZXJlIHRoZSBBUk0gY2FuIGFjY2VzcyB0aGUgc2FtZSBHUElPIGNvbmZpZworICByZWdpc3RlcnMsIGJ1dCB0aGUgYWNjZXNzIHRha2VzIHBsYWNlIHRocm91Z2ggdGhlIEFSTSBwb3J0IGludGVyZmFjZSAoY2FsbGVkCisgIEFQSSBvciBNUFVJKSB2aWEgdGhlIERTUCdzIHBlcmlwaGVyYWwgYnVzIChEU1AgSS9PIHNwYWNlKS4KKworICBUaGVyZWZvcmUsIHRoZSBBUk0gc2hvdWxkIHNldHVwIHRoZSBHUElPIHJlZ3MgdGhydSB0aGUgRkZGQzpFMDAwIGFkZHJlc3NlcworICBpbnN0ZWFkIG9mIHRoZSBFMTAxOkUwMDAgYWRkcmVzc2VzLiAgVGhlIERTUCBoYXMgb25seSByZWFkIGFjY2VzcyBvZiB0aGUgcGluCisgIGNvbnRyb2wgcmVnaXN0ZXIsIHNvIHRoaXMgbWF5IGV4cGxhaW4gdGhlIGluYWJpbGl0eSB0byB3cml0ZSB0byBFMTAxOkUwMTguCisgIFRyeSBhY2Nlc3NpbmcgcGluIGNvbnRyb2wgcmVnIGF0IEZGRkM6RTAxOC4KKyAqLworI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJIDB4ZmZmY2UwMDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19TVEFSVAkgT01BUDE1MTBfR1BJT19CQVNFCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fU0laRQkgU1pfNEsKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfQkFTRQkgMHhFMTAxMTAwMAorI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfU0laRQkgU1pfNEsKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX1NUQVJUCSAweEUxMDExMDAwCisKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AyX0JBU0UJIDB4RkZGQjEwMDAKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfQkFTRQkgMHhFMTAxNzAwMAorI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfU0laRQkgU1pfNEsKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AzX1NUQVJUCSAweEUxMDE3MDAwCisKKy8qCisgKiBXaGVyZSdzIHRoZSBmbHVzaCBhZGRyZXNzIChmb3IgZmx1c2hpbmcgRCBhbmQgSSBjYWNoZT8pCisgKi8KKyNkZWZpbmUgRkxVU0hfQkFTRQkJMHhkZjAwMDAwMAorI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMgMHgwMDAwMDAwMAorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKworI2RlZmluZSBQQ0lPX0JBU0UJCTAKKworLyoKKyAqIFJBTSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE1BUFRPUEhZUyhhKQkJKCh1bnNpZ25lZCBsb25nKShhKSAtIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBLRVJOVE9QSFlTKGEpCQkoKHVuc2lnbmVkIGxvbmcpKCZhKSkKKyNkZWZpbmUgS0VSTkVMX0JBU0UJCSgweDEwMDA4MDAwKQorI2VuZGlmCisKKy8qIG1hY3JvIHRvIGdldCBhdCBJTyBzcGFjZSB3aGVuIHJ1bm5pbmcgdmlydHVhbGx5ICovCisjZGVmaW5lIElPX0FERFJFU1MoeCkgKCh4KSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIHN5c3RlbSByZWdpc3RlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIE9NQVAxNTEwX1VBUlQxX0JBU0UJICAgIDB4ZmZmYjAwMDAJIC8qICJCTFVFVE9PVEgtVUFSVCIgKi8KKyNkZWZpbmUgT01BUDE1MTBfVUFSVDJfQkFTRQkgICAgMHhmZmZiMDgwMAkgLyogIk1PREVNLVVBUlQiICovCisjZGVmaW5lIE9NQVAxNTEwX1JUQ19CQVNFCSAgICAweGZmZmI0ODAwCSAvKiBSVEMgKi8KKyNkZWZpbmUgT01BUDE1MTBfVUFSVDNfQkFTRQkgICAgMHhmZmZiOTgwMAkgLyogU2hhcmVkIE1QVS9EU1AgVUFSVCAqLworI2RlZmluZSBPTUFQMTUxMF9DT01fTUNCU1AyX0JBU0UgICAgMHhmZmZmMTAwMAkgLyogQ29tIE1jQlNQMiAqLworI2RlZmluZSBPTUFQMTUxMF9BVURJT19NQ0JTUF9CQVNFICAgMHhmZmZmMTgwMAkgLyogQXVkaW8gTWNCU1AyICovCisjZGVmaW5lIE9NQVAxNTEwX0FSTUlPX0JBU0UJICAgIDB4ZmZmYjUwMDAJIC8qIGtleWJvYXJkL2dwaW8gKi8KKworLyoKKyAqIE9NQVAxNTEwIFVBUlQzIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgT01BUF9NUFVfVUFSVDNfQkFTRSAgMHhGRkZCOTgwMCAvKiBVQVJUMyB0aHJvdWdoIE1QVSBidXMgKi8KKworLyogVUFSVDMgUmVnaXN0ZXJzIE1hcGluZyB0aHJvdWdoIE1QVSBidXMgKi8KKworI2RlZmluZSBVQVJUM19SSFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMCkKKyNkZWZpbmUgVUFSVDNfVEhSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDApCisjZGVmaW5lIFVBUlQzX0RMTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAwKQorI2RlZmluZSBVQVJUM19JRVIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgNCkKKyNkZWZpbmUgVUFSVDNfRExICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDQpCisjZGVmaW5lIFVBUlQzX0lJUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA4KQorI2RlZmluZSBVQVJUM19GQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgOCkKKyNkZWZpbmUgVUFSVDNfRUZSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDgpCisjZGVmaW5lIFVBUlQzX0xDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDBDKQorI2RlZmluZSBVQVJUM19NQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxMCkKKyNkZWZpbmUgVUFSVDNfWE9OMV9BRERSMSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTApCisjZGVmaW5lIFVBUlQzX1hPTjJfQUREUjIgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE0KQorI2RlZmluZSBVQVJUM19MU1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxNCkKKyNkZWZpbmUgVUFSVDNfVENSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX01TUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUM19YT0ZGMQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUM19YT0ZGMgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDFDKQorI2RlZmluZSBVQVJUM19TUFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxQykKKyNkZWZpbmUgVUFSVDNfVExSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MUMpCisjZGVmaW5lIFVBUlQzX01EUjEJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyMCkKKyNkZWZpbmUgVUFSVDNfTURSMgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI0KQorI2RlZmluZSBVQVJUM19TRkxTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI4KQorI2RlZmluZSBVQVJUM19UWEZMTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI4KQorI2RlZmluZSBVQVJUM19SRVNVTUUJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyQykKKyNkZWZpbmUgVUFSVDNfVFhGTEgJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyQykKKyNkZWZpbmUgVUFSVDNfU0ZSRUdMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzApCisjZGVmaW5lIFVBUlQzX1JYRkxMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzApCisjZGVmaW5lIFVBUlQzX1NGUkVHSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM0KQorI2RlZmluZSBVQVJUM19SWEZMSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM0KQorI2RlZmluZSBVQVJUM19CTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzOCkKKyNkZWZpbmUgVUFSVDNfQUNSRUcJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzQykKKyNkZWZpbmUgVUFSVDNfRElWMTYJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzQykKKyNkZWZpbmUgVUFSVDNfU0NSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDApCisjZGVmaW5lIFVBUlQzX1NTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDQ0KQorI2RlZmluZSBVQVJUM19FQkxSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDgpCisjZGVmaW5lIFVBUlQzX09TQ18xMk1fU0VMIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0QykKKyNkZWZpbmUgVUFSVDNfTVZSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NTApCisKKy8qCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVycworICovCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMAkJMHhmZmZlMTAwMAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzEJCTB4ZmZmZTEwMDQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8yCQkweGZmZmUxMDA4CisjZGVmaW5lIENPTVBfTU9ERV9DVFJMXzAJMHhmZmZlMTAwYworI2RlZmluZSBGVU5DX01VWF9DVFJMXzMJCTB4ZmZmZTEwMTAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF80CQkweGZmZmUxMDE0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNQkJMHhmZmZlMTAxOAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzYJCTB4ZmZmZTEwMUMKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF83CQkweGZmZmUxMDIwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfOAkJMHhmZmZlMTAyNAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzkJCTB4ZmZmZTEwMjgKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9BCQkweGZmZmUxMDJDCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfQgkJMHhmZmZlMTAzMAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0MJCTB4ZmZmZTEwMzQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9ECQkweGZmZmUxMDM4CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMAkJMHhmZmZlMTA0MAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzEJCTB4ZmZmZTEwNDQKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8yCQkweGZmZmUxMDQ4CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMwkJMHhmZmZlMTA0YworI2RlZmluZSBHQVRFX0lOSF9DVFJMXzAJCTB4ZmZmZTEwNTAKKyNkZWZpbmUgVk9MVEFHRV9DVFJMXzAJCTB4ZmZmZTEwNjAKKyNkZWZpbmUgVEVTVF9EQkdfQ1RSTF8wCQkweGZmZmUxMDcwCisKKyNkZWZpbmUgTU9EX0NPTkZfQ1RSTF8wCQkweGZmZmUxMDgwCisKKy8qIDE2MTAgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKyNkZWZpbmUgVVNCX09UR19DVFJMCQkweEZGRkIwNDBDCisjZGVmaW5lIFVTQl9UUkFOU0NFSVZFUl9DVFJMCTB4RkZGRTEwNjQKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF80CQkweEZGRkUxMEFDCisjZGVmaW5lIFBVX1BEX1NFTF8wCQkweEZGRkUxMEI0CisjZGVmaW5lIFBVX1BEX1NFTF8xCQkweEZGRkUxMEI4CisjZGVmaW5lIFBVX1BEX1NFTF8yCQkweEZGRkUxMEJDCisjZGVmaW5lIFBVX1BEX1NFTF8zCQkweEZGRkUxMEMwCisjZGVmaW5lIFBVX1BEX1NFTF80CQkweEZGRkUxMEM0CisKKyNlbmRpZgorLyoKKyAqIFRyYWZmaWMgQ29udHJvbGxlciBNZW1vcnkgSW50ZXJmYWNlIFJlZ2lzdGVycworICovCisjZGVmaW5lIFRDTUlGX0JBU0UJCTB4ZmZmZWNjMDAKKyNkZWZpbmUgSU1JRl9QUklPCQkoVENNSUZfQkFTRSArIDB4MDApCisjZGVmaW5lIEVNSUZTX1BSSU9fUkVHCQkoVENNSUZfQkFTRSArIDB4MDQpCisjZGVmaW5lIEVNSUZGX1BSSU9fUkVHCQkoVENNSUZfQkFTRSArIDB4MDgpCisjZGVmaW5lIEVNSUZTX0NPTkZJR19SRUcJKFRDTUlGX0JBU0UgKyAweDBjKQorI2RlZmluZSBFTUlGU19DUzBfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxMCkKKyNkZWZpbmUgRU1JRlNfQ1MxX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MTQpCisjZGVmaW5lIEVNSUZTX0NTMl9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDE4KQorI2RlZmluZSBFTUlGU19DUzNfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxYykKKyNkZWZpbmUgRU1JRkZfU0RSQU1fQ09ORklHCShUQ01JRl9CQVNFICsgMHgyMCkKKyNkZWZpbmUgRU1JRkZfTVJTCQkoVENNSUZfQkFTRSArIDB4MjQpCisjZGVmaW5lIFRDX1RJTUVPVVQxCQkoVENNSUZfQkFTRSArIDB4MjgpCisjZGVmaW5lIFRDX1RJTUVPVVQyCQkoVENNSUZfQkFTRSArIDB4MmMpCisjZGVmaW5lIFRDX1RJTUVPVVQzCQkoVENNSUZfQkFTRSArIDB4MzApCisjZGVmaW5lIFRDX0VORElBTklTTQkJKFRDTUlGX0JBU0UgKyAweDM0KQorI2RlZmluZSBFTUlGRl9TRFJBTV9DT05GSUdfMgkoVENNSUZfQkFTRSArIDB4M2MpCisjZGVmaW5lIEVNSUZfQ0ZHX0RZTkFNSUNfV1MJKFRDTUlGX0JBU0UgKyAweDQwKQorCisvKgorICogTENEIFBhbmVsCisgKi8KKyNkZWZpbmUgVEk5MjVfTENEX0JBU0UJCTB4RkZGRUMwMDAKKyNkZWZpbmUgVEk5MjVfTENEX0NPTlRST0wJKFRJOTI1X0xDRF9CQVNFKQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMAkoVEk5MjVfTENEX0JBU0UrMHg0KQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMQkoVEk5MjVfTENEX0JBU0UrMHg4KQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMgkoVEk5MjVfTENEX0JBU0UrMHhjKQorI2RlZmluZSBUSTkyNV9MQ0RfU1RBVFVTCShUSTkyNV9MQ0RfQkFTRSsweDEwKQorI2RlZmluZSBUSTkyNV9MQ0RfU1VCUEFORUwJKFRJOTI1X0xDRF9CQVNFKzB4MTQpCisKKyNkZWZpbmUgT01BUF9MQ0RfQ09OVFJPTAlUSTkyNV9MQ0RfQ09OVFJPTAorCisvKgorICogTU1DL1NEIEhvc3QgQ29udHJvbGxlciBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE9NQVBfTU1DX0NNRAkgMHhGRkZCNzgwMCAvKiBNTUMgQ29tbWFuZCAqLworI2RlZmluZSBPTUFQX01NQ19BUkdMCSAweEZGRkI3ODA0IC8qIE1NQyBhcmd1bWVudCBsb3cgKi8KKyNkZWZpbmUgT01BUF9NTUNfQVJHSAkgMHhGRkZCNzgwOCAvKiBNTUMgYXJndW1lbnQgaGlnaCAqLworI2RlZmluZSBPTUFQX01NQ19DT04JIDB4RkZGQjc4MEMgLyogTU1DIHN5c3RlbSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NUQVQJIDB4RkZGQjc4MTAgLyogTU1DIHN0YXR1cyAqLworI2RlZmluZSBPTUFQX01NQ19JRQkgMHhGRkZCNzgxNCAvKiBNTUMgc3lzdGVtIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ1RPCSAweEZGRkI3ODE4IC8qIE1NQyBjb21tYW5kIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0RUTwkgMHhGRkZCNzgxQyAvKiBNTUMgZGF0YSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBCSAweEZGRkI3ODIwIC8qIE1NQyBUWC9SWCBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgT01BUF9NTUNfQkxFTgkgMHhGRkZCNzgyNCAvKiBNTUMgYmxvY2sgbGVuZ3RoICovCisjZGVmaW5lIE9NQVBfTU1DX05CTEsJIDB4RkZGQjc4MjggLyogTU1DIG51bWJlciBvZiBibG9ja3MgKi8KKyNkZWZpbmUgT01BUF9NTUNfQlVGCSAweEZGRkI3ODJDIC8qIE1NQyBidWZmZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPTUFQX01NQ19TUEkJIDB4RkZGQjc4MzAgLyogTU1DIHNlcmlhbCBwb3J0IGludGVyZmFjZSAqLworI2RlZmluZSBPTUFQX01NQ19TRElPCSAweEZGRkI3ODM0IC8qIE1NQyBTRElPIG1vZGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPTUFQX01NQ19TWVNUCSAweEZGRkI3ODM4IC8qIE1NQyBzeXN0ZW0gdGVzdCAqLworI2RlZmluZSBPTUFQX01NQ19SRVYJIDB4RkZGQjc4M0MgLyogTU1DIG1vZHVsZSB2ZXJzaW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDAJIDB4RkZGQjc4NDAgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMCAqLworI2RlZmluZSBPTUFQX01NQ19SU1AxCSAweEZGRkI3ODQ0IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDEgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMgkgMHhGRkZCNzg0OCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAyICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDMJIDB4RkZGQjc4NEMgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMyAqLworI2RlZmluZSBPTUFQX01NQ19SU1A0CSAweEZGRkI3ODUwIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDQgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNQkgMHhGRkZCNzg1NCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA1ICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDYJIDB4RkZGQjc4NTggLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNiAqLworI2RlZmluZSBPTUFQX01NQ19SU1A3CSAweEZGRkI3ODVDIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDQgKi8KKworLyogTU1DIG1hc2tzICovCisKKyNkZWZpbmUgT01BUF9NTUNfRU5EX09GX0NNRAkoMSA8PCAwKQkvKiBFbmQgb2YgY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0JVU1kJKDEgPDwgMikJLyogQ2FyZCBlbnRlciBidXN5IHN0YXRlICovCisjZGVmaW5lIE9NQVBfTU1DX0JMT0NLX1JTCSgxIDw8IDMpCS8qIEJsb2NrIHJlY2VpdmVkL3NlbnQgKi8KKyNkZWZpbmUgT01BUF9NTUNfRU9GX0JVU1kJKDEgPDwgNCkJLyogQ2FyZCBleGl0IGJ1c3kgc3RhdGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfREFUQV9USU1FT1VUCSgxIDw8IDUpCS8qIERhdGEgcmVzcG9uc2UgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfREFUQV9DUkMJKDEgPDwgNikJLyogRGF0ZSBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ01EX1RJTUVPVVQJKDEgPDwgNykJLyogQ29tbWFuZCByZXNwb25zZSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19DTURfQ1JDCSgxIDw8IDgpCS8qIENvbW1hbmQgQ1JDIGVycm9yICovCisjZGVmaW5lIE9NQVBfTU1DX0FfRlVMTAkJKDEgPDwgMTApCS8qIEJ1ZmZlciBhbG1vc3QgZnVsbCAqLworI2RlZmluZSBPTUFQX01NQ19BX0VNUFRZCSgxIDw8IDExKQkvKiBCdWZmZXIgYWxtb3N0IGVtcHR5ICovCisjZGVmaW5lIE9NQVBfTU1DX09DUl9CVVNZCSgxIDw8IDEyKQkvKiBPQ1IgYnVzeSAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0lSUQkoMSA8PCAxMykJLyogQ2FyZCBJUlEgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ0FSRF9FUlIJKDEgPDwgMTQpCS8qIENhcmQgc3RhdHVzIGVycm9yIGluIHJlc3BvbnNlICovCisKKy8qIDIuOS4yIE1QVUkgSW50ZXJmYWNlIFJlZ2lzdGVycyBGRkZFOkM5MDAgKi8KKworI2RlZmluZSBNUFVJX0NUUkxfUkVHCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwMCkKKyNkZWZpbmUgTVBVSV9ERUJVR19BRERSCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwNCkKKyNkZWZpbmUgTVBVSV9ERUJVR19EQVRBCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwOCkKKyNkZWZpbmUgTVBVSV9ERUJVR19GTEFHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkwYykKKyNkZWZpbmUgTVBVSV9TVEFUVVNfUkVHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxMCkKKyNkZWZpbmUgTVBVSV9EU1BfU1RBVFVTX1JFRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxNCkKKyNkZWZpbmUgTVBVSV9EU1BfQk9PVF9DT05GSUcJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MTgpCisjZGVmaW5lIE1QVUlfRFNQX0FQSV9DT05GSUcJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MWMpCisKKy8qIDIuOS42IFRyYWZmaWMgQ29udHJvbGxlciBNZW1vcnkgSW50ZXJmYWNlIFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgT01BUF9JTUlGX1BSSU9fUkVHCQkweGZmZmVjYzAwCisjZGVmaW5lIE9NQVBfRU1JRlNfUFJJT19SRUcJCTB4ZmZmZWNjMDQKKyNkZWZpbmUgT01BUF9FTUlGRl9QUklPX1JFRwkJMHhmZmZlY2MwOAorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19SRUcJCTB4ZmZmZWNjMGMKKyNkZWZpbmUgT01BUF9FTUlGU19DUzBfQ09ORklHCQkweGZmZmVjYzEwCisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MxX0NPTkZJRwkJMHhmZmZlY2MxNAorI2RlZmluZSBPTUFQX0VNSUZTX0NTMl9DT05GSUcJCTB4ZmZmZWNjMTgKKyNkZWZpbmUgT01BUF9FTUlGU19DUzNfQ09ORklHCQkweGZmZmVjYzFjCisjZGVmaW5lIE9NQVBfRU1JRkZfU0RSQU1fQ09ORklHCQkweGZmZmVjYzIwCisjZGVmaW5lIE9NQVBfRU1JRkZfTVJTCQkJMHhmZmZlY2MyNAorI2RlZmluZSBPTUFQX1RJTUVPVVQxCQkJMHhmZmZlY2MyOAorI2RlZmluZSBPTUFQX1RJTUVPVVQyCQkJMHhmZmZlY2MyYworI2RlZmluZSBPTUFQX1RJTUVPVVQzCQkJMHhmZmZlY2MzMAorI2RlZmluZSBPTUFQX0VORElBTklTTQkJCTB4ZmZmZWNjMzQKKworLyogMi45LjEwIEVNSUYgU2xvdyBJbnRlcmZhY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoRU1JRlNfQ09ORklHX1JFRyk6ICovCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX0ZSCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19QREUJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1BXRF9FTgkoMSA8PCAyKQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19CTQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfV1AJCSgxIDw8IDApCisKKy8qCisgKiBNZW1vcnkgY2h1bmsgc2V0IGFzaWRlIGZvciB0aGUgRnJhbWVidWZmZXIgaW4gU1JBTQorICovCisjZGVmaW5lIFNSQU1fRlJBTUVCVUZGRVJfTUVNT1JZIE9NQVAxNTEwX1NSQU1fQkFTRQorCisKKy8qCisgKiBETUEKKyAqLworCisjZGVmaW5lIE9NQVAxNTEwX0RNQV9CQVNFIDB4RkZGRUQ4MDAKKyNkZWZpbmUgT01BUF9ETUFfQkFTRQkgIE9NQVAxNTEwX0RNQV9CQVNFCisKKy8qIEdsb2JhbCBSZWdpc3RlciBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTk9fR0xPQkFMX0RNQV9BQ0NFU1MgMAorCisvKiBDaGFubmVsIHNlbGVjdCBmaWVsZAorICogTk9URTogYWxsIG90aGVyIGNoYW5uZWxzIGFyZSBsaW5lYXIsIGNoYW4wIGlzIDAsIGNoYW4xIGlzIDEsIGV0Yy4uLgorICovCisjZGVmaW5lIExDRF9DSEFOTkVMIDB4YworCisvKiBSZWdpc3RlciBTZWxlY3QgRmllbGQgKExDRCkgKi8KKyNkZWZpbmUgRE1BX0xDRF9DVFJMCQkwCisjZGVmaW5lIERNQV9MQ0RfVE9QX0YxX0wJMQorI2RlZmluZSBETUFfTENEX1RPUF9GMV9VCTIKKyNkZWZpbmUgRE1BX0xDRF9CT1RfRjFfTAkzCisjZGVmaW5lIERNQV9MQ0RfQk9UX0YxX1UJNAorCisjZGVmaW5lIExDRF9GUkFNRV9NT0RFCQkoMTw8MCkKKyNkZWZpbmUgTENEX0ZSQU1FX0lUX0lFCQkoMTw8MSkKKyNkZWZpbmUgTENEX0JVU19FUlJPUl9JVF9JRQkoMTw8MikKKyNkZWZpbmUgTENEX0ZSQU1FXzFfSVRfQ09ORAkoMTw8MykKKyNkZWZpbmUgTENEX0ZSQU1FXzJfSVRfQ09ORAkoMTw8NCkKKyNkZWZpbmUgTENEX0JVU19FUlJPUl9JVF9DT05ECSgxPDw1KQorI2RlZmluZSBMQ0RfU09VUkNFX0lNSUYJCSgxPDw2KQorCisvKgorICogUmVhbC1UaW1lIENsb2NrCisgKi8KKworI2RlZmluZSBSVENfU0VDT05EUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDAwKQorI2RlZmluZSBSVENfTUlOVVRFUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDA0KQorI2RlZmluZSBSVENfSE9VUlMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgUlRDX0RBWVMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwQykKKyNkZWZpbmUgUlRDX01PTlRIUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDEwKQorI2RlZmluZSBSVENfWUVBUlMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgUlRDX0NUUkwJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHg0MCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBJbnRlcnJ1cHQgSGFuZGxlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBPTUFQX0lIMV9CQVNFCQkweGZmZmVjYjAwCisjZGVmaW5lIE9NQVBfSUgyX0JBU0UJCTB4ZmZmZTAwMDAKKyNkZWZpbmUgT01BUDE1MTBfSVRSCQkweDAKKyNkZWZpbmUgT01BUDE1MTBfTUFTSwkJMHg0CisKKyNkZWZpbmUgSU5URVJSVVBUX0hBTkRMRVJfQkFTRQkgT01BUF9JSDFfQkFTRQorI2RlZmluZSBJTlRFUlJVUFRfSU5QVVRfUkVHSVNURVIgT01BUDE1MTBfSVRSCisjZGVmaW5lIElOVEVSUlVQVF9NQVNLX1JFR0lTVEVSCSBPTUFQMTUxMF9NQVNLCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgVElNRVJTCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2RlZmluZSBPTUFQMTUxMF8zMmtIel9USU1FUl9CQVNFIDB4ZmZmYjkwMDAKKworLyogMzJrIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FUjMya19DUgkweDA4CisjZGVmaW5lIFRJTUVSMzJrX1RWUgkweDAwCisjZGVmaW5lIFRJTUVSMzJrX1RDUgkweDA0CisKKy8qIDMyayBUaW1lciBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVElNRVIzMmtfVFNTCSgxPDwwKQorI2RlZmluZSBUSU1FUjMya19UUkIJKDE8PDEpCisjZGVmaW5lIFRJTUVSMzJrX0lOVAkoMTw8MikKKyNkZWZpbmUgVElNRVIzMmtfQVJMCSgxPDwzKQorCisvKiBNUFUgVGltZXIgYmFzZSBhZGRyZXNzZXMgICovCisjZGVmaW5lIE9NQVAxNTEwX01QVVRJTUVSX0JBU0UJMHhmZmZlYzUwMAorI2RlZmluZSBPTUFQMTUxMF9NUFVUSU1FUl9PRkYJMHgwMDAwMDEwMAorCisjZGVmaW5lIE9NQVAxNTEwX1RJTUVSMV9CQVNFCTB4ZmZmZWM1MDAKKyNkZWZpbmUgT01BUDE1MTBfVElNRVIyX0JBU0UJMHhmZmZlYzYwMAorI2RlZmluZSBPTUFQMTUxMF9USU1FUjNfQkFTRQkweGZmZmVjNzAwCisKKy8qIE1QVSBUaW1lciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ05UTF9USU1FUgkwCisjZGVmaW5lIExPQURfVElNCTQKKyNkZWZpbmUgUkVBRF9USU0JOAorCisvKiAgQ05UTF9USU1FUiByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1QVVRJTV9GUkVFCQkoMTw8NikKKyNkZWZpbmUgTVBVVElNX0NMT0NLX0VOQUJMRQkoMTw8NSkKKyNkZWZpbmUgTVBVVElNX1BUVl9NQVNLCQkoMHg3PDxQVFZfQklUKQorI2RlZmluZSBNUFVUSU1fUFRWX0JJVAkJMgorI2RlZmluZSBNUFVUSU1fQVIJCSgxPDwxKQorI2RlZmluZSBNUFVUSU1fU1QJCSgxPDwwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBHUElPIChTSEFSRUQpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgR1BJT19EQVRBX0lOUFVUX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgwKQorI2RlZmluZSBHUElPX0RBVEFfT1VUUFVUX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHg0KQorI2RlZmluZSBHUElPX0RJUl9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHg4KQorI2RlZmluZSBHUElPX0lOVF9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHhjKQorI2RlZmluZSBHUElPX0lOVF9NQVNLX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxMCkKKyNkZWZpbmUgR1BJT19JTlRfU1RBVFVTX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxNCkKKyNkZWZpbmUgR1BJT19QSU5fQ09OVFJPTF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4MTgpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPTUFQMTUxMCBNUFVJTyAoQVJNIG9ubHkpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBPTUFQMTUxMF9NUFVJT19CQVNFCTB4RkZGQjUwMDAKKyNkZWZpbmUgTVBVSU9fREFUQV9JTlBVVF9SRUcJKE9NQVAxNTEwX01QVUlPX0JBU0UgKyAweDApCisjZGVmaW5lIE1QVUlPX0RBVEFfT1VUUFVUX1JFRwkoT01BUDE1MTBfTVBVSU9fQkFTRSArIDB4NCkKKyNkZWZpbmUgTVBVSU9fRElSX0NPTlRST0xfUkVHCShPTUFQMTUxMF9NUFVJT19CQVNFICsgMHg4KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBUSVBCIChvbmx5KQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIFRJUEJfUFVCTElDX0NOVExfQkFTRQkJMHhmZmZlZDMwMAorI2RlZmluZSBNUFVfUFVCTElDX1RJUEJfQ05UTF9SRUcJKFRJUEJfUFVCTElDX0NOVExfQkFTRSArIDB4OCkKKyNkZWZpbmUgVElQQl9QUklWQVRFX0NOVExfQkFTRQkJMHhmZmZlY2EwMAorI2RlZmluZSBNUFVfUFJJVkFURV9USVBCX0NOVExfUkVHCShUSVBCX1BSSVZBVEVfQ05UTF9CQVNFICsgMHg4KQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgQ2FtZXJhIEludGVyZmFjZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ0FNRVJBX0JBU0UJCShJT19CQVNFICsgMHg2ODAwKQorI2RlZmluZSBDQU1fQ1RSTENMT0NLX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDAwKQorI2RlZmluZSBDQU1fSVRfU1RBVFVTX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDA0KQorI2RlZmluZSBDQU1fTU9ERV9SRUcJCShDQU1FUkFfQkFTRSArIDB4MDgpCisjZGVmaW5lIENBTV9TVEFUVVNfUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDBDKQorI2RlZmluZSBDQU1fQ0FNREFUQV9SRUcJCShDQU1FUkFfQkFTRSArIDB4MTApCisjZGVmaW5lIENBTV9HUElPX1JFRwkJKENBTUVSQV9CQVNFICsgMHgxNCkKKyNkZWZpbmUgQ0FNX1BFQUtfQ1RSX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDE4KQorCisjaWYgMAorI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBjdHJsY2xvY2s7CisJX191MzIgaXRfc3RhdHVzOworCV9fdTMyIG1vZGU7CisJX191MzIgc3RhdHVzOworCV9fdTMyIGNhbWRhdGE7CisJX191MzIgZ3BpbzsKKwlfX3UzMiBwZWFrX2NvdW50ZXI7Cit9IGNhbWVyYV9yZWdzX3Q7CisjZW5kaWYKKyNlbmRpZgorCisvKiBDVFJMQ0xPQ0sgYml0IHNoaWZ0cyAqLworI2RlZmluZSBGT1NDTU9EX0JJVAkwCisjZGVmaW5lIEZPU0NNT0RfTUFTSwkoMHg3IDw8IEZPU0NNT0RfQklUKQorI2RlZmluZQkgRk9TQ01PRF8xMk1IegkweDAKKyNkZWZpbmUJIEZPU0NNT0RfNk1IegkweDIKKyNkZWZpbmUJIEZPU0NNT0RfOV82TUh6IDB4NAorI2RlZmluZQkgRk9TQ01PRF8yNE1IegkweDUKKyNkZWZpbmUJIEZPU0NNT0RfOE1IegkweDYKKyNkZWZpbmUgUE9MQ0xLCQkoMTw8MykKKyNkZWZpbmUgQ0FNRVhDTEtfRU4JKDE8PDQpCisjZGVmaW5lIE1DTEtfRU4JCSgxPDw1KQorI2RlZmluZSBEUExMX0VOCQkoMTw8NikKKyNkZWZpbmUgTENMS19FTgkJKDE8PDcpCisKKy8qIElUX1NUQVRVUyBiaXQgc2hpZnRzICovCisjZGVmaW5lIFZfVVAJCSgxPDwwKQorI2RlZmluZSBWX0RPV04JCSgxPDwxKQorI2RlZmluZSBIX1VQCQkoMTw8MikKKyNkZWZpbmUgSF9ET1dOCQkoMTw8MykKKyNkZWZpbmUgRklGT19GVUxMCSgxPDw0KQorI2RlZmluZSBEQVRBX1hGRVIJKDE8PDUpCisKKy8qIE1PREUgYml0IHNoaWZ0cyAqLworI2RlZmluZSBDQU1PU0MJCSgxPDwwKQorI2RlZmluZSBJTUdTSVpFX0JJVAkxCisjZGVmaW5lIElNR1NJWkVfTUFTSwkoMHgzIDw8IElNR1NJWkVfQklUKQorI2RlZmluZQkgSU1HU0laRV9DSUYJKDB4MCA8PCBJTUdTSVpFX0JJVCkJLyogMzUyeDI4OCAqLworI2RlZmluZQkgSU1HU0laRV9RQ0lGCSgweDEgPDwgSU1HU0laRV9CSVQpCS8qIDE3NngxNDQgKi8KKyNkZWZpbmUJIElNR1NJWkVfVkdBCSgweDIgPDwgSU1HU0laRV9CSVQpCS8qIDY0MHg0ODAgKi8KKyNkZWZpbmUJIElNR1NJWkVfUVZHQQkoMHgzIDw8IElNR1NJWkVfQklUKQkvKiAzMjB4MjQwICovCisjZGVmaW5lIE9SREVSQ0FNRAkoMTw8MykKKyNkZWZpbmUgRU5fVl9VUAkJKDE8PDQpCisjZGVmaW5lIEVOX1ZfRE9XTgkoMTw8NSkKKyNkZWZpbmUgRU5fSF9VUAkJKDE8PDYpCisjZGVmaW5lIEVOX0hfRE9XTgkoMTw8NykKKyNkZWZpbmUgRU5fRE1BCQkoMTw8OCkKKyNkZWZpbmUgVEhSRVNIT0xECSgxPDw5KQorI2RlZmluZSBUSFJFU0hPTERfQklUCTkKKyNkZWZpbmUgVEhSRVNIT0xEX01BU0sJKDB4N2Y8PDkpCisjZGVmaW5lIEVOX05JUlEJCSgxPDwxNikKKyNkZWZpbmUgRU5fRklGT19GVUxMCSgxPDwxNykKKyNkZWZpbmUgUkFaX0ZJRk8JKDE8PDE4KQorCisvKiBTVEFUVVMgYml0IHNoaWZ0cyAqLworI2RlZmluZSBWU1RBVFVTCQkoMTw8MCkKKyNkZWZpbmUgSFNUQVRVUwkJKDE8PDEpCisKKy8qIEdQSU8gYml0IHNoaWZ0cyAqLworI2RlZmluZSBDQU1fUlNUCQkoMTw8MCkKKworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiBXYXRjaGRvZyB0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdEVElNX0JBU0UJMHhmZmZlYzgwMAorI2RlZmluZSBXRFRJTV9DT05UUk9MCShXRFRJTV9CQVNFKzB4MDApCisjZGVmaW5lIFdEVElNX0xPQUQJKFdEVElNX0JBU0UrMHgwNCkKKyNkZWZpbmUgV0RUSU1fUkVBRAkoV0RUSU1fQkFTRSsweDA0KQorI2RlZmluZSBXRFRJTV9NT0RFCShXRFRJTV9CQVNFKzB4MDgpCisKKy8qIFZhbHVlcyB0byB3cml0ZSB0byBtb2RlIHJlZ2lzdGVyIHRvIGRpc2FibGUgdGhlIHdhdGNoZG9nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBESVNBQkxFX1NFUTEJMHhGNQorI2RlZmluZSBESVNBQkxFX1NFUTIJMHhBMAorCisvKiBXRFRJTV9DT05UUk9MIGJpdCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgV0RUSU1fQ09OVFJPTF9TVAlCSVQ3CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRGlmZmVyZW50aWF0aW5nIHByb2Nlc3NvciB2ZXJzaW9ucyBmb3IgdGhvc2Ugd2hvIGNhcmUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgT01BUDE1MDkgMAorI2RlZmluZSBPTUFQMTUxMCAxCisKKyNkZWZpbmUgT01BUDE1MTBfSURfQ09ERV9SRUcgMHhmZmZlZDQwNAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworaW50IGNwdV90eXBlKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBFVk0gSW1wbGVtZW50YXRpb24gU3BlY2lmaWNzLgorICoKKyAqICoqKiBOT1RFICoqKgorICogQW55IGRlZmluaXRpb25zIGluIHRoZXNlIGZpbGVzIHNob3VsZCBiZSBwcmVmaXhlZCBieSBhbiBpZGVudGlmaWVyIC0KKyAqIGVnLiBPTUFQMTUxMFAxX0ZMQVNIMF9CQVNFIC4KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfT01BUF9JTk5PVkFUT1IKKyNpbmNsdWRlICJpbm5vdmF0b3IuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09NQVBfMTUxMFAxCisjaW5jbHVkZSAib21hcDE1MTBwMS5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTEtHRU5fUkVTRVRfQkFTRSAoMHhmZmZlY2UwMCkKKyNkZWZpbmUgQVJNX0NLQ1RMCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MCkKKyNkZWZpbmUgQVJNX0lETEVDVDEJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHg0KQorI2RlZmluZSBBUk1fSURMRUNUMgkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDgpCisjZGVmaW5lIEFSTV9FV1VQQ1QJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHhDKQorI2RlZmluZSBBUk1fUlNUQ1QxCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MTApCisjZGVmaW5lIEFSTV9SU1RDVDIJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxNCkKKyNkZWZpbmUgQVJNX1NZU1NUCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MTgpCisKKworI2RlZmluZSBDS19DTEtJTgkxMiAvKiBNSHogKi8KKyNkZWZpbmUgQ0tfUkFURUYJMQorI2RlZmluZSBDS19JRExFRgkyCisjZGVmaW5lIENLX0VOQUJMRUYJNAorI2RlZmluZSBDS19TRUxFQ1RGCTgKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBDS19EUExMMQkoKHZvbGF0aWxlIF9fdTE2ICopMHhmZmZlY2YwMCkKKyNlbHNlCisjZGVmaW5lIENLX0RQTEwxICgweGZmZmVjZjAwKQorI2VuZGlmCisjZGVmaW5lIFNFVEFSTV9JRExFX1NISUZUCisKKy8qIEFSTV9DS0NUTCBiaXQgc2hpZnRzICovCisjZGVmaW5lIFBFUkRJVgkJMAorI2RlZmluZSBMQ0RESVYJCTIKKyNkZWZpbmUgQVJNRElWCQk0CisjZGVmaW5lIERTUERJVgkJNgorI2RlZmluZSBUQ0RJVgkJOAorI2RlZmluZSBEU1BNTVVESVYJMTAKKyNkZWZpbmUgQVJNX1RJTVhPCTEyCisjZGVmaW5lIEVOX0RTUENLCTEzCisjZGVmaW5lIEFSTV9JTlRIQ0tfU0VMCTE0IC8qIFJFVklTSVQgLS0gd2hlcmUgaXMgdGhpcyB1c2VkPyAqLworCisjZGVmaW5lIEFSTV9DS0NUTF9SU1JWRF9CSVQxNQkJKDEgPDwgMTUpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1fSU5USENLX1NFTAkoMSA8PCAxNCkKKyNkZWZpbmUgQVJNX0NLQ1RMX0VOX0RTUENLCQkoMSA8PCAxMykKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTV9USU1YTwkJKDEgPDwgMTIpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BNTVVfRElWMQkJKDEgPDwgMTEpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BNTVVfRElWMgkJKDEgPDwgMTApCisjZGVmaW5lIEFSTV9DS0NUTF9UQ0RJVjEJCSgxIDw8IDkpCisjZGVmaW5lIEFSTV9DS0NUTF9UQ0RJVjIJCSgxIDw8IDgpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BESVYxCQkoMSA8PCA3KQorI2RlZmluZSBBUk1fQ0tDVExfRFNQRElWMAkJKDEgPDwgNikKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTURJVjEJCSgxIDw8IDUpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1ESVYwCQkoMSA8PCA0KQorI2RlZmluZSBBUk1fQ0tDVExfTENERElWMQkJKDEgPDwgMykKKyNkZWZpbmUgQVJNX0NLQ1RMX0xDRERJVjAJCSgxIDw8IDIpCisjZGVmaW5lIEFSTV9DS0NUTF9QRVJESVYxCQkoMSA8PCAxKQorI2RlZmluZSBBUk1fQ0tDVExfUEVSRElWMAkJKDEgPDwgMCkKKworLyogQVJNX0lETEVDVDEgYml0IHNoaWZ0cyAqLworI2RlZmluZSBJRExXRFRfQVJNCTAKKyNkZWZpbmUgSURMWE9SUF9BUk0JMQorI2RlZmluZSBJRExQRVJfQVJNCTIKKyNkZWZpbmUgSURMTENEX0FSTQkzCisjZGVmaW5lIElETExCX0FSTQk0CisjZGVmaW5lIElETEhTQUJfQVJNCTUKKyNkZWZpbmUgSURMSUZfQVJNCTYKKyNkZWZpbmUgSURMRFBMTF9BUk0JNworI2RlZmluZSBJRExBUElfQVJNCTgKKyNkZWZpbmUgSURMVElNX0FSTQk5CisjZGVmaW5lIFNFVEFSTV9JRExFCTExCisKKy8qIEFSTV9JRExFQ1QyIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fV0RUQ0sJMAorI2RlZmluZSBFTl9YT1JQQ0sJMQorI2RlZmluZSBFTl9QRVJDSwkyCisjZGVmaW5lIEVOX0xDRENLCTMKKyNkZWZpbmUgRU5fTEJDSwkJNAorI2RlZmluZSBFTl9IU0FCQ0sJNQorI2RlZmluZSBFTl9BUElDSwk2CisjZGVmaW5lIEVOX1RJTUNLCTcKKyNkZWZpbmUgRE1BQ0tfUkVRCTgKKyNkZWZpbmUgRU5fR1BJT0NLCTkKKyNkZWZpbmUgRU5fTEJGUkVFQ0sJMTAKKworI2RlZmluZSBBUk1fUlNUQ1QxX1NXX1JTVAkoMSA8PCAzKQorI2RlZmluZSBBUk1fUlNUQ1QxX0RTUF9SU1QJKDEgPDwgMikKKyNkZWZpbmUgQVJNX1JTVENUMV9EU1BfRU4JKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1JTVENUMV9BUk1fUlNUCSgxIDw8IDApCisKKy8qIEFSTV9SU1RDVDIgYml0IHNoaWZ0cyAqLworI2RlZmluZSBFTl9QRVIJCTAKKworI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUMTUJKDEgPDwgMTUpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQxNAkoMSA8PCAxNCkKKyNkZWZpbmUgQVJNX1NZU1NUX0NMT0NLX1NFTEVDVDIgKDEgPDwgMTMpCisjZGVmaW5lIEFSTV9TWVNTVF9DTE9DS19TRUxFQ1QxICgxIDw8IDEyKQorI2RlZmluZSBBUk1fU1lTU1RfQ0xPQ0tfU0VMRUNUMCAoMSA8PCAxMSkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDEwCSgxIDw8IDEwKQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUOQkoMSA8PCA5KQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUOAkoMSA8PCA4KQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUNwkoMSA8PCA3KQorI2RlZmluZSBBUk1fU1lTU1RfSURMRV9EU1AJKDEgPDwgNikKKyNkZWZpbmUgQVJNX1NZU1NUX1BPUgkJKDEgPDwgNSkKKyNkZWZpbmUgQVJNX1NZU1NUX0VYVF9SU1QJKDEgPDwgNCkKKyNkZWZpbmUgQVJNX1NZU1NUX0FSTV9NQ1JTVAkoMSA8PCAzKQorI2RlZmluZSBBUk1fU1lTU1RfQVJNX1dEUlNUCSgxIDw8IDIpCisjZGVmaW5lIEFSTV9TWVNTVF9HTE9CX1NXUlNUCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9TWVNTVF9EU1BfV0RSU1QJKDEgPDwgMCkKKworLyogVGFibGUgMTUtMjMuIERQTEwgQ29udHJvbCBSZWdpc3RlcnM6ICovCisjZGVmaW5lIERQTExfQ1RMX1JFRwkJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWNmMDApCisKKy8qIFRhYmxlIDE1LTI0LiBDb250cm9sIFJlZ2lzdGVyIChDVExfUkVHKTogKi8KKworI2RlZmluZSBEUExMX0NUTF9SRUdfSU9CCQkoMSA8PCAxMykKKyNkZWZpbmUgRFBMTF9DVExfUkVHX1BMTF9NVUxUCQlGbGQoNSwwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9NQVAgSU5URVJSVVBUIFJFR0lTVEVSUyAqLworI2RlZmluZSBJUlFfSVRSCQkJMHgwMAorI2RlZmluZSBJUlFfTUlSCQkJMHgwNAorI2RlZmluZSBJUlFfU0lSX0lSUQkJMHgxMAorI2RlZmluZSBJUlFfU0lSX0ZJUQkJMHgxNAorI2RlZmluZSBJUlFfQ09OVFJPTF9SRUcJCTB4MTgKKyNkZWZpbmUgSVJRX0lTUgkJCTB4OWMKKyNkZWZpbmUgSVJRX0lMUjAJCTB4MWMKKworI2RlZmluZSBSRUdfSUhMMV9NSVIgIChPTUFQX0lIMV9CQVNFK0lSUV9NSVIpCisjZGVmaW5lIFJFR19JSEwyX01JUiAgKE9NQVBfSUgyX0JBU0UrSVJRX01JUikKKworLyogSU5URVJSVVBUIExFVkVMIFJFR0lTVEVSIEJJVFMgKi8KKyNkZWZpbmUgSUxSX1BSSU9SSVRZX01BU0sJKDB4M2MpCisjZGVmaW5lIElMUl9QUklPUklUWV9TSElGVAkoMikKKyNkZWZpbmUgSUxSX0xFVkVMX1RSSUdHRVIJKDE8PDEpCisjZGVmaW5lIElMUl9GSVEJCQkoMTw8MCkKKworI2RlZmluZSBJUlFfTEVWRUxfSU5UCQkxCisjZGVmaW5lIElSUV9FREdFX0lOVAkJMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4sIEtzaGl0aWogR3VwdGEgPGtzaGl0aWpAdGkuY29tPgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBIMyBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBleGFjdGx5IHVuY29tbWVudCBvbmUgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RfQ1MwCSAgLyogUk9NIGNvZGUgLT4gc2lnbmVkIFgtTG9hZGVyIGluIE5OQUQgKi8KKy8vI2RlZmluZSBDRkdfQk9PVF9DUzMJICAvKiB1bnNpZ25lZCBYLWxvYWRlciBpbiBOT1IgZm9yIGRldmVsb3BtZW50ICovCisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJLyogVGhpcyBpcyBhbiBhcm05MjZlanMgQ1BVIGNvcmUgICovCisjZGVmaW5lIENPTkZJR19PTUFQCTEJCQkvKiBpbiBhIFRJIE9NQVAgY29yZSAgICAqLworI2RlZmluZSBDT05GSUdfT01BUDE3MTAJMQkJLyogd2hpY2ggaXMgaW4gYSAxNzEwICAqLworI2RlZmluZSBDT05GSUdfSDNfT01BUDE3MTAJMQkvKiAgYSBIMyBCb2FyZCAgKi8KKworLyogaW5wdXQgY2xvY2sgb2YgUExMICovCisvKiB0aGUgT01BUDE3MTAgSDMgaGFzIDEyTUh6IGlucHV0IGNsb2NrICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMTIwMDAwMDAKKworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHhmZmZiMDAwMAkvKiB1YXJ0MSwgYmx1ZXRvb3RoIHVhcnQgb24gaGVsZW4gKi8KKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkxMTUyMDAKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfUEJTSVpFCTI1NgorI2RlZmluZSBDRkdfTE9BREFERFIgCTB4MTEwMDAwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qIFRoZSAxNzEwIGhhcyA2IHRpbWVycywgdGhleSBjYW4gYmUgZHJpdmVuIGJ5IHRoZSBSZWZDbGsgKDEyTWh6KSBvciBieQorICogRFBMTDEuIFRoaXMgdGltZSBpcyBmdXJ0aGVyIHN1YmRpdmlkZWQgYnkgYSBsb2NhbCBkaXZpc29yLgorICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJMHhGRkZFQzUwMAkvKiB1c2UgdGltZXIgMSAqLworI2RlZmluZSBDRkdfUFZUCTcJLyogMl4ocHZ0KzEpLCBkaXZpZGUgYnkgMjU2ICovCisjZGVmaW5lIENGR19IWgkoKENPTkZJR19TWVNfQ0xLX0ZSRVEpLygyIDw8IENGR19QVlQpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19OQU5EX0s5RjU2MTYgICAgLyogU2Ftc3VuZyAxNi1iaXQgMzJNQiBjaGlwICovCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKKyNkZWZpbmUgTkFORF9BRERSIDB4MGMwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MzKi8KKyNlbHNlCisjZGVmaW5lIE5BTkRfQUREUiAweDBhMDAwMDAwICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBuYW5kIGF0IENTMkIqLworI2VuZGlmCisKKy8qIEgzIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAgLSAweDAwMTAwMDAgCUJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAxMDAwMCAtIDB4MDA1MDAwMCAJVS1Cb290IEltYWdlCisgKiAweDAwNTAwMDAgLSAweDAwODAwMDAgCVUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDgwMDAwIC0gMHgyMDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwMTAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA1MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZylhZHIgKyAyKSA9IChfX3U4KShkKTsgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4ICopKCh1bnNpZ25lZCBsb25nKWFkciArIDQpID0gKF9fdTgpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3UxNiAqKSgodW5zaWduZWQgbG9uZylhZHIpID0gKF9fdTE2KShkKTsgfSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSAoKHZvbGF0aWxlIF9fdTE2KSgqKHZvbGF0aWxlIF9fdTE2ICopKHVuc2lnbmVkIGxvbmcpYWRyKSkKKworI2RlZmluZSBHUElPMV9EQVRBSU4JCTB4ZmZmYmU0MmMKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkgIAl3aGlsZSghKCgqKHZvbGF0aWxlIF9fdTE2ICopKEdQSU8xX0RBVEFJTikgJiAweDA0MDApID09IDB4MDQwMCkpOworIAorI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworCisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICogCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNMTEzNiAgICAgICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIGFybTExMzYgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDIwCSAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAyNDIwICovCisjZGVmaW5lIENPTkZJR19PTUFQMjQyMEg0ICAgICAgICAxICAgIC8qIGFuZCBvbiBhIEg0IGJvYXJkICovCisKKyNkZWZpbmUgQ09ORklHX09NQVAyNDJYCisKKyNkZWZpbmUgUFJDTV9DT05GSUdfSUkgICAgICAgICAgIDEgICAgCisvLyNkZWZpbmUgUFJDTV9DT05GSUdfSUlJICAgICAgICAgICAxICAgIAorI2RlZmluZSBDT05GSUdfUEFSVElBTF9TUkFNICAgICAgMQorCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX0REUgkJCTEKKyNkZWZpbmUgQ0ZHX1NEUkFNX0NPTUJPCQkyCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX1NEUgkJCTMKKy8vI2RlZmluZSBDRkdfU0RSQU1fU1RBQ0tFRAkJNAorCSAKKy8qIENoaXBzZWxlY3QgYW5kIE5BTkQgaW5mb3JtYXRpb24gOgorICAgU2luY2Ugd2Ugc2hhcmUgdGhlIG1lbS5oIGZyb20gdS1ib290LCB3ZSBkZWZpbmUgZmV3IG1hY3JvcyBoZXJlCisgICBzbyBhcyB0byBwaWNrIHRoZSByaWdodCBncG1jIHZhbHVlcyBmcm9tIHRoZXJlIGZvciB0aGUgbWFjcm9zIGluIG1lbS5oCisqLworLyogTkFORCBmaXhlZCBhdCBDUzUgKi8KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzAgU01OQU5ECisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzY0TQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9NQVAgQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVAorI2RlZmluZSBOQU5EX0xFR0FDWQorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MjAuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIDEyMDAwMDAwCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMjQyMCBINCBoYXMgMTJNSHosIDEzTUh6LCBvciAxOS4yTWh6IGNyeXN0YWwgaW5wdXQgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgIFZfU0NMSworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMjQyMF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gSDQgKi8KKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSIAkweDgwMDAwMDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19OQU5EX0s5SzEyMTYgICAgLyogU2Ftc3VuZyAxNi1iaXQgNjRNQiBjaGlwICovCisKKyNkZWZpbmUgTkFORF9BRERSIDB4MDQwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MwKi8KKyAKKy8qIEg0IE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAgLSAweDAwMTAwMDAgCUJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAxMDAwMCAtIDB4MDA1MDAwMCAJVS1Cb290IEltYWdlCisgKiAweDAwNTAwMDAgLSAweDAwODAwMDAgCVUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDgwMDAwIC0gMHg0MDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwNDAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA4MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA3QyA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDgwID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDg0ID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpICgqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODQpCisKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyAgCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDUwKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoMHg2ODAwQTA1MCkgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAgICAgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgICAgICAgCisKKworI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYTYxZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzLgorICogCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNMTEzNiAgICAgICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIGFybTExMzYgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDMwSDQgICAgICAgIDEgICAgLyogYW5kIG9uIGEgSDQgYm9hcmQgKi8KKworI2RlZmluZSBDT05GSUdfT01BUDI0M1ggMQorCisvLyNkZWZpbmUgUFJDTV9DT05GSUdfNUEJCSAxCisjZGVmaW5lIFBSQ01fQ09ORklHXzIgICAgICAgICAgIDEgLyogMjQzMCBFUzIrMzMwQVJNK0REUi0xNjUtUElTTU8gKi8KKworI2RlZmluZSBPTUFQMjQzMF9TUVVBUkVfQ0xPQ0tfSU5QVVQgMQorCisvKiBNZW1vcnkgdHlwZSAqLworLy8jZGVmaW5lIENGR19TRFJBTV9ERFIJCQkxIC8qIG5vdCB0ZXN0ZWQgKi8KKy8vI2RlZmluZSBDRkdfU0RSQU1fQ09NQk8JCTIgLyogbm90IHRlc3RlZCAqLworI2RlZmluZSBDRkdfMjQzMFNEUkFNX0REUgkJMworLy8jZGVmaW5lIENGR19TRFJBTV9TVEFDS0VECQk0IC8qIG5vdCB0ZXN0ZWQgKi8KKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgMQorCisvKiBCb290IHR5cGUgKi8KKy8vI2RlZmluZSBDRkdfTkFORCAxCisjZGVmaW5lIENGR19PTkVOQU5EIDEKKworIyBkZWZpbmUgTkFORF9CQVNFICAgICAgICAgICAgMHgwQzAwMDAwMCAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFCSAgICAgIDB4MjAwMDAwMDAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2lmZGVmIENGR19OQU5ECisjZGVmaW5lIE5BTkRfTEVHQUNZCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzY0TQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9NQVAgTkFORF9CQVNFCisjZWxzZQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBPTkVOQU5EX0JBU0UKKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgT25lTkFORCBhdCBDUzAqLworI2VuZGlmCisKKy8qIEFub3RoZXIgZGVwZW5kZW5jeSBvbiB1LWJvb3QgKi8KKyNkZWZpbmUgc2RlbGF5IGRlbGF5CisJIAorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAxMzAwMDAwMAorLyogaW5wdXQgY2xvY2sgb2YgUExMICovCisvKiB0aGUgT01BUDI0MjAgSDQgaGFzIDEyTUh6LCAxM01Ieiwgb3IgMTkuMk1oeiBjcnlzdGFsIGlucHV0ICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgICBWX1NDTEsKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCSg0ODAwMDAwMCkJLyogY2FuIGJlIDEyTS8zMktoeiBvciA0OE1oeiAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDI0MzBfVUFSVDEKKyAKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIDI0MzBTRFAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFCTI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAJMHg4MDAwODAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisKKyNpZmRlZiBDRkdfTkFORAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlLMTIxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCA2NE1CIGNoaXAgKi8KKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDAwQjAwMDAgCUtlcm5lbCBJbWFnZQorICogMHgwMEIwMDAwIC0gMHg0MDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwNDAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA4MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgR1BNQ19DT05GSUcJCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMAkoT01BUDI0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgICAgICAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgICAgICAgVS1ib290IEltYWdlCisgKiAgIDB4MDBjMDAwMCAtIDB4MDBlMDAwMCAgICAgICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDBlMDAwMCAtIDB4MDEyMDAwMCAgICAgICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgICAgICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgICAgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICAgICAgIAk2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAgICAgICAgMjA0OCAgICAgICAgICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgICAgIDB4MjAwMDAgICAgICAgICAvKiAxMjhLQiAqLworCisjZW5kaWYgLy8gb25lTkFORAorI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBsYWJyYWRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2MDg4NzIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBsYWJyYWRvci5oCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2IAorICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBTRFAzNDMwIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgYSAzNFhYICovCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMzQzMCAqLworI2RlZmluZSBDT05GSUdfMzQzMExBQlJBRE9SICAgICAgMSAgICAvKiB3b3JraW5nIG9uIExhYnJhZG9yICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBfQVNfMzQxMCAgICAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMjYwMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApICAgICAgICAgIAorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTUwME1IeiAtIFZERDE9MS4yMHYgKi8KKworLyogTWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHXzM0MzBTRFJBTV9ERFIgICAgICAgIDEKKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgICAgMQorCisvKiBCb290IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHX05BTkQgMQorLy8jZGVmaW5lIENGR19PTkVOQU5EIDEKKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjaWZkZWYgQ0ZHX05BTkQKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TSAgLyogdSA9IG9mZG9uJ3QgbmVlZCBzbyBtdWNoIGZvciBuYW5kIHBvcnQgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE5BTkRfQkFTRV9BRFIKKyNlbHNlCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKyNlbmRpZgorCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTMgICAgICAgICBPTUFQMzRYWF9VQVJUMworIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDMgICAgICAgICAgIDMgICAgLyogVUFSVDMgb24gYm9hcmQgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDMKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworI2lmZGVmIENGR19OQU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBNaWNyb24gMTYtYml0IDI1Nk1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzE2QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAwQkZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDBDMDAwMCAtIDB4MDAwRkZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDEwMDAwMCAtIDB4MDAyRkZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDMwMDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMEMwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKyAgCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAwYzAwMDAgLSAweDAwZTAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICA2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAgLyogb25lTkFORCAqLworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg4MGVkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgCisgKiBUZXhhcyBJbnN0cnVtZW50cyA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIFNEUDM0MzAgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBhIDM0WFggKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAzNDMwICovCisjZGVmaW5lIENPTkZJR18zNDMwU0RQICAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBTRFAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwCSAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKy8qIEVuYWJsZSB0aGUgYmVsb3cgbWFjcm8gaWYgTU1DIGJvb3Qgc3VwcG9ydCBpcyByZXF1aXJlZCAqLworLy8jZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAxOTIwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkgICAgICAgICAgCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfMzQzMFNEUkFNX0REUiAgICAgICAgMQorCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworI2RlZmluZSBDRkdfTkFORCAxCisvLyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNpZmRlZiBDRkdfTkFORAorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBOQU5EX0JBU0VfQURSCisjZWxzZQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBPTkVOQU5EX0JBU0UKKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisjZW5kaWYKKyAKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMzRYWF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gMzQzMFNEUCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisjaWZkZWYgQ0ZHX05BTkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfOEJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMEJGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAwQzAwMDAgLSAweDAwMEZGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAxMDAwMDAgLSAweDAwMkZGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDAzMDAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDBDMDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisgIAorI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAKKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAgMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyIAorICogICAweDAwODAwMDAgLSAweDAwYzAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMGMwMDAwIC0gMHgwMGUwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDBlMDAwMCAtIDB4MDEyMDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDAxMjAwMDAgLSAweDQwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgNgorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgIC8qIG9uZU5BTkQgKi8KKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzgxMGExNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pc3RyYWwgU29sdXRpb25zIFB2dCBMdGQuCisgKgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgT01BUDNFVk0gYm9hcmQuCisgKgorICogRGVyaXZlZCBmcm9tIC9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGCisvLyN1bmRlZiBDRkdfUFJJTlRGCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGEgMzRYWCAqLworI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDM0MzAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMFNEUCAgICAgICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggU0RQICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBfQVNfMzQxMAkgMSAgICAvKiB0cnVlIGZvciAzNDMwIGluIDM0MTAgbW9kZSAqLworCisjZGVmaW5lIENPTkZJR19PTUFQM0VWTSAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBFVk0gKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisjZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDI2MDAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTM4MU1IeiAtIFZERDE9MS4yMHYgKi8KKworLyogTWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHX09NQVBFVk1fRERSCQkxCisjZGVmaW5lIENGR18zNDMwU0RSQU1fRERSCTEKKyNkZWZpbmUgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgICAgIDEKKworCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAzNFhYX1VBUlQxCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIE9NQVAzRVZNICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKworI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBTYW1zdW5nIDgtYml0IDEyOE1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzE2QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAyM0ZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDI0MDAwMCAtIDB4MDAyN0ZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDI4MDAwMCAtIDB4MDA3N0ZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDc4MDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMjQwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKworI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIKKyAqICAgMHgwMDgwMDAwIC0gMHgwMjQwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDI0MDAwMCAtIDB4MDI4MDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAyODAwMDAgLSAweDA3ODAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwNzgwMDAwIC0gMHg4MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDE4CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmggYi94LWxvYWRlci9pbmNsdWRlL2ZhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTczYmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2ZhdC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZworICoKKyAqIDIwMDItMDctMjggLSByam9uZXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gcHBjYm9vdCB2MS4xLjYKKyAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHUtYm9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9GQVRfSF8KKyNkZWZpbmUgX0ZBVF9IXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKKworI2RlZmluZSBTRUNUT1JfU0laRSBGU19CTE9DS19TSVpFCisKKyNkZWZpbmUgRlNfQkxPQ0tfU0laRSA1MTIKKworI2lmIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUKKyNlcnJvciBGU19CTE9DS19TSVpFICE9IFNFQ1RPUl9TSVpFIC0gVGhpcyBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0NMVVNUU0laRQk2NTUzNgorI2RlZmluZSBESVJFTlRTUEVSQkxPQ0sJKEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGRpcl9lbnRyeSkpCisjZGVmaW5lIERJUkVOVFNQRVJDTFVTVAkoKG15ZGF0YS0+Y2x1c3Rfc2l6ZSpTRUNUT1JfU0laRSkvc2l6ZW9mKGRpcl9lbnRyeSkpCisKKyNkZWZpbmUgRkFUQlVGQkxPQ0tTCTYKKyNkZWZpbmUgRkFUQlVGU0laRQkoRlNfQkxPQ0tfU0laRSpGQVRCVUZCTE9DS1MpCisjZGVmaW5lIEZBVDEyQlVGU0laRQkoKEZBVEJVRlNJWkUqMikvMykKKyNkZWZpbmUgRkFUMTZCVUZTSVpFCShGQVRCVUZTSVpFLzIpCisjZGVmaW5lIEZBVDMyQlVGU0laRQkoRkFUQlVGU0laRS80KQorCisKKy8qIEZpbGVzeXN0ZW0gaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgRkFUMTJfU0lHTgkiRkFUMTIgICAiCisjZGVmaW5lIEZBVDE2X1NJR04JIkZBVDE2ICAgIgorI2RlZmluZSBGQVQzMl9TSUdOCSJGQVQzMiAgICIKKyNkZWZpbmUgU0lHTkxFTgkJNworCisvKiBGaWxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgQVRUUl9STyAgICAgIDEKKyNkZWZpbmUgQVRUUl9ISURERU4gIDIKKyNkZWZpbmUgQVRUUl9TWVMgICAgIDQKKyNkZWZpbmUgQVRUUl9WT0xVTUUgIDgKKyNkZWZpbmUgQVRUUl9ESVIgICAgIDE2CisjZGVmaW5lIEFUVFJfQVJDSCAgICAzMgorCisjZGVmaW5lIEFUVFJfVkZBVCAgICAgKEFUVFJfUk8gfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTIHwgQVRUUl9WT0xVTUUpCisKKyNkZWZpbmUgREVMRVRFRF9GTEFHCSgoY2hhcikweGU1KSAvKiBNYXJrcyBkZWxldGVkIGZpbGVzIHdoZW4gaW4gbmFtZVswXSAqLworI2RlZmluZSBhUklORwkJMHgwNQkgICAgIC8qIFVzZWQgdG8gcmVwcmVzZW50ICflJyBpbiBuYW1lWzBdICovCisKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBpcyB0aGUgbGFzdCBsb25nIGVudHJ5IGluIGEgc2V0IG9mIGxvbmcKKyAqIGRpciBlbnRyaWVzCisgKi8KKyNkZWZpbmUgTEFTVF9MT05HX0VOVFJZX01BU0sJMHg0MAorCisvKiBGbGFncyB0ZWxsaW5nIHdoZXRoZXIgd2Ugc2hvdWxkIHJlYWQgYSBmaWxlIG9yIGxpc3QgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgTFNfTk8JMAorI2RlZmluZSBMU19ZRVMJMQorI2RlZmluZSBMU19ESVIJMQorI2RlZmluZSBMU19ST09UCTIKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikJcHJpbnRmKGFyZ3MpCisjZWxzZQorI2RlZmluZSBGQVRfRFBSSU5UKGFyZ3MuLi4pCisjZW5kaWYKKyNkZWZpbmUgRkFUX0VSUk9SKGFyZykJCXByaW50ZihhcmcpCisKKyNkZWZpbmUgSVNESVJERUxJTShjKSAgICgoYykgPT0gJy8nIHx8IChjKSA9PSAnXFwnKQorCisjZGVmaW5lIEZTVFlQRV9OT05FCSgtMSkKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjZGVmaW5lIEZBVDJDUFUxNglsZTE2X3RvX2NwdQorI2RlZmluZSBGQVQyQ1BVMzIJbGUzMl90b19jcHUKKyNlbHNlCisjaWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEZBVDJDUFUxNih4KQkoeCkKKyNkZWZpbmUgRkFUMkNQVTMyKHgpCSh4KQorI2Vsc2UKKyNkZWZpbmUgRkFUMkNQVTE2KHgpCSgoKCh4KSAmIDB4MDBmZikgPDwgOCkgfCAoKCh4KSAmIDB4ZmYwMCkgPj4gOCkpCisjZGVmaW5lIEZBVDJDUFUzMih4KQkoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgIHwJXAorCSAJCSAoKCh4KSAmIDB4MDAwMGZmMDApIDw8IDgpICB8CVwKKwkJCSAoKCh4KSAmIDB4MDBmZjAwMDApID4+IDgpICB8CVwKKwkJCSAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVE9MT1dFUihjKQlpZigoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpeyhjKSs9KCdhJyAtICdBJyk7fQorI2RlZmluZSBTVEFSVChkZW50KQkoRkFUMkNQVTE2KChkZW50KS0+c3RhcnQpIFwKKwkJCSsgKG15ZGF0YS0+ZmF0c2l6ZSAhPSAzMiA/IDAgOiBcCisJCQkgIChGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydGhpKSA8PCAxNikpKQorCisKK3R5cGVkZWYgc3RydWN0IGJvb3Rfc2VjdG9yIHsKKwlfX3U4CWlnbm9yZWRbM107CS8qIEJvb3RzdHJhcCBjb2RlICovCisJY2hhcglzeXN0ZW1faWRbOF07CS8qIE5hbWUgb2YgZnMgKi8KKwlfX3U4CXNlY3Rvcl9zaXplWzJdOwkvKiBCeXRlcy9zZWN0b3IgKi8KKwlfX3U4CWNsdXN0ZXJfc2l6ZTsJLyogU2VjdG9ycy9jbHVzdGVyICovCisJX191MTYJcmVzZXJ2ZWQ7CS8qIE51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzICovCisJX191OAlmYXRzOwkJLyogTnVtYmVyIG9mIEZBVHMgKi8KKwlfX3U4CWRpcl9lbnRyaWVzWzJdOwkvKiBOdW1iZXIgb2Ygcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCV9fdTgJc2VjdG9yc1syXTsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKi8KKwlfX3U4CW1lZGlhOwkJLyogTWVkaWEgY29kZSAqLworCV9fdTE2CWZhdF9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCisJX191MTYJc2Vjc190cmFjazsJLyogU2VjdG9ycy90cmFjayAqLworCV9fdTE2CWhlYWRzOwkJLyogTnVtYmVyIG9mIGhlYWRzICovCisJX191MzIJaGlkZGVuOwkJLyogTnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzICovCisJX191MzIJdG90YWxfc2VjdDsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKGlmIHNlY3RvcnMgPT0gMCkgKi8KKworCS8qIEZBVDMyIG9ubHkgKi8KKwlfX3UzMglmYXQzMl9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCisJX191MTYJZmxhZ3M7CQkvKiBCaXQgODogZmF0IG1pcnJvcmluZywgbG93IDQ6IGFjdGl2ZSBmYXQgKi8KKwlfX3U4CXZlcnNpb25bMl07CS8qIEZpbGVzeXN0ZW0gdmVyc2lvbiAqLworCV9fdTMyCXJvb3RfY2x1c3RlcjsJLyogRmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLworCV9fdTE2CWluZm9fc2VjdG9yOwkvKiBGaWxlc3lzdGVtIGluZm8gc2VjdG9yICovCisJX191MTYJYmFja3VwX2Jvb3Q7CS8qIEJhY2t1cCBib290IHNlY3RvciAqLworCV9fdTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCit9IGJvb3Rfc2VjdG9yOworCit0eXBlZGVmIHN0cnVjdCB2b2x1bWVfaW5mbworeworCV9fdTggZHJpdmVfbnVtYmVyOwkvKiBCSU9TIGRyaXZlIG51bWJlciAqLworCV9fdTggcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KKwlfX3U4IGV4dF9ib290X3NpZ247CS8qIDB4MjkgaWYgZmllbGRzIGJlbG93IGV4aXN0IChET1MgMy4zKykgKi8KKwlfX3U4IHZvbHVtZV9pZFs0XTsJLyogVm9sdW1lIElEIG51bWJlciAqLworCWNoYXIgdm9sdW1lX2xhYmVsWzExXTsJLyogVm9sdW1lIGxhYmVsICovCisJY2hhciBmc190eXBlWzhdOwkvKiBUeXBpY2FsbHkgRkFUMTIsIEZBVDE2LCBvciBGQVQzMiAqLworCS8qIEJvb3QgY29kZSBjb21lcyBuZXh0LCBhbGwgYnV0IDIgYnl0ZXMgdG8gZmlsbCB1cCBzZWN0b3IgKi8KKwkvKiBCb290IHNpZ24gY29tZXMgbGFzdCwgMiBieXRlcyAqLworfSB2b2x1bWVfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX2VudHJ5IHsKKwljaGFyCW5hbWVbOF0sZXh0WzNdOwkvKiBOYW1lIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWF0dHI7CQkvKiBBdHRyaWJ1dGUgYml0cyAqLworCV9fdTgJbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWN0aW1lX21zOwkvKiBDcmVhdGlvbiB0aW1lLCBtaWxsaXNlY29uZHMgKi8KKwlfX3UxNgljdGltZTsJCS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX3UxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KKwlfX3UxNglhZGF0ZTsJCS8qIExhc3QgYWNjZXNzIGRhdGUgKi8KKwlfX3UxNglzdGFydGhpOwkvKiBIaWdoIDE2IGJpdHMgb2YgY2x1c3RlciBpbiBGQVQzMiAqLworCV9fdTE2CXRpbWUsZGF0ZSxzdGFydDsvKiBUaW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCisJX191MzIJc2l6ZTsJCS8qIEZpbGUgc2l6ZSBpbiBieXRlcyAqLworfSBkaXJfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IGRpcl9zbG90IHsKKwlfX3U4ICAgIGlkOwkJLyogU2VxdWVuY2UgbnVtYmVyIGZvciBzbG90ICovCisJX191OCAgICBuYW1lMF80WzEwXTsJLyogRmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3U4ICAgIGF0dHI7CQkvKiBBdHRyaWJ1dGUgYnl0ZSAqLworCV9fdTggICAgcmVzZXJ2ZWQ7CS8qIFVudXNlZCAqLworCV9fdTggICAgYWxpYXNfY2hlY2tzdW07LyogQ2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLworCV9fdTggICAgbmFtZTVfMTBbMTJdOwkvKiA2IG1vcmUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX191MTYgICBzdGFydDsJCS8qIFVudXNlZCAqLworCV9fdTggICAgbmFtZTExXzEyWzRdOwkvKiBMYXN0IDIgY2hhcmFjdGVycyBpbiBuYW1lICovCit9IGRpcl9zbG90OworCisvKiBQcml2YXRlIGZpbGVzeXN0ZW0gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlmYXRzaXplOwkvKiBTaXplIG9mIEZBVCBpbiBiaXRzICovCisJX191MTYJZmF0bGVuZ3RoOwkvKiBMZW5ndGggb2YgRkFUIGluIHNlY3RvcnMgKi8KKwlfX3UxNglmYXRfc2VjdDsJLyogU3RhcnRpbmcgc2VjdG9yIG9mIHRoZSBGQVQgKi8KKwlfX3UxNglyb290ZGlyX3NlY3Q7CS8qIFN0YXJ0IHNlY3RvciBvZiByb290IGRpcmVjdG9yeSAqLworCV9fdTE2CWNsdXN0X3NpemU7CS8qIFNpemUgb2YgY2x1c3RlcnMgaW4gc2VjdG9ycyAqLworCXNob3J0CWRhdGFfYmVnaW47CS8qIFRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0IGNsdXN0ZXIsIGNhbiBiZSBuZWdhdGl2ZSAqLworCV9fdTMyCWZhdGJ1ZltGQVRCVUZTSVpFXTsgLyogQ3VycmVudCBGQVQgYnVmZmVyICovCisJaW50CWZhdGJ1Zm51bTsJLyogVXNlZCBieSBnZXRfZmF0ZW50LCBpbml0IHRvIC0xICovCit9IGZzZGF0YTsKKwordHlwZWRlZiBpbnQJKGZpbGVfZGV0ZWN0ZnNfZnVuYykodm9pZCk7Cit0eXBlZGVmIGludAkoZmlsZV9sc19mdW5jKShjb25zdCBjaGFyICpkaXIpOwordHlwZWRlZiBsb25nCShmaWxlX3JlYWRfZnVuYykoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJCQkgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKKworc3RydWN0IGZpbGVzeXN0ZW0geworCWZpbGVfZGV0ZWN0ZnNfZnVuYyAqZGV0ZWN0OworCWZpbGVfbHNfZnVuYwkgICAqbHM7CisJZmlsZV9yZWFkX2Z1bmMJICAgKnJlYWQ7CisJY29uc3QgY2hhcgkgICAgbmFtZVsxMl07Cit9OworCisvKiBGQVQgdGFibGVzICovCitmaWxlX2RldGVjdGZzX2Z1bmMJZmlsZV9mYXRfZGV0ZWN0ZnM7CitmaWxlX2xzX2Z1bmMJCWZpbGVfZmF0X2xzOworZmlsZV9yZWFkX2Z1bmMJCWZpbGVfZmF0X3JlYWQ7CisKKy8qIEN1cnJlbnRseSB0aGlzIGRvZXNuJ3QgY2hlY2sgaWYgdGhlIGRpciBleGlzdHMgb3IgaXMgdmFsaWQuLi4gKi8KK2ludCBmaWxlX2NkKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGZpbGVfZmF0X2RldGVjdGZzKHZvaWQpOworaW50IGZpbGVfZmF0X2xzKGNvbnN0IGNoYXIgKmRpcik7Citsb25nIGZpbGVfZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKK2NvbnN0IGNoYXIgKmZpbGVfZ2V0ZnNuYW1lKGludCBpZHgpOworaW50IGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKTsKKworI2VuZGlmIC8qIF9GQVRfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmggYi94LWxvYWRlci9pbmNsdWRlL2lkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWYzMmYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2lkZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfSURFX0gKKyNkZWZpbmUgX0lERV9ICisKKyNkZWZpbmUJSURFX0JVUyhkZXYpCShkZXYgPj4gMSkKKworI2lmZGVmIENPTkZJR19JREVfTEVECisKKy8qCisgKiBMRUQgUG9ydAorICovCisjZGVmaW5lCUxFRF9QT1JUCSgodWNoYXIgKikoUEVSOF9CQVNFICsgMHgzMDAwKSkKKyNkZWZpbmUgTEVEX0lERTEJMHgwMQorI2RlZmluZSBMRURfSURFMgkweDAyCisjZGVmaW5lCURFVklDRV9MRUQoZCkJKChkICYgMikgfCAoKGQgJiAyKSA9PSAwKSkgLyogZGVwZW5kcyBvbiBiaXQgcG9zaXRpb25zISAqLworCisjZW5kaWYgLyogQ09ORklHX0lERV9MRUQgKi8KKworI2lmZGVmIENGR182NEJJVF9MQkEKK3R5cGVkZWYgdWludDY0X3QgbGJhaW50X3Q7CisjZWxzZQordHlwZWRlZiB1bG9uZyBsYmFpbnRfdDsKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICovCisKK3ZvaWQgIGlkZV9pbml0ICAodm9pZCk7Cit1bG9uZyBpZGVfcmVhZAkoaW50IGRldmljZSwgbGJhaW50X3QgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmJ1ZmZlcik7Cit1bG9uZyBpZGVfd3JpdGUgKGludCBkZXZpY2UsIGxiYWludF90IGJsa25yLCB1bG9uZyBibGtjbnQsIHVsb25nICpidWZmZXIpOworCisjZW5kaWYgLyogX0lERV9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2ltYWdlLmggYi94LWxvYWRlci9pbmNsdWRlL2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3OGU5MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaApAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOCBTZW1paGFsZgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA1CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGFuIGludGVyZmFjZSB0byBVLUJvb3QuIEluY2x1ZGluZworICogdGhpcyAodW5tb2RpZmllZCkgaGVhZGVyIGZpbGUgaW4gYW5vdGhlciBmaWxlIGlzIGNvbnNpZGVyZWQgbm9ybWFsCisgKiB1c2Ugb2YgVS1Cb290LCBhbmQgZG9lcyAqbm90KiBmYWxsIHVuZGVyIHRoZSBoZWFkaW5nIG9mICJkZXJpdmVkCisgKiB3b3JrIi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19JTUFHRV9IX18KKyNkZWZpbmUgX19JTUFHRV9IX18KKworI2luY2x1ZGUgImNvbXBpbGVyLmgiCisKKyNpZmRlZiBVU0VfSE9TVENDCisKKy8qIG5ldyB1SW1hZ2UgZm9ybWF0IHN1cHBvcnQgZW5hYmxlZCBvbiBob3N0ICovCisjZGVmaW5lIENPTkZJR19GSVQJCTEKKyNkZWZpbmUgQ09ORklHX09GX0xJQkZEVAkxCisjZGVmaW5lIENPTkZJR19GSVRfVkVSQk9TRQkxIC8qIGVuYWJsZSBmaXRfZm9ybWF0X3tlcnJvcix3YXJuaW5nfSgpICovCisKKyNlbHNlCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisjaW5jbHVkZSA8ZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNkZWZpbmUgQ09ORklHX01ENQkJLyogRklUIGltYWdlcyBuZWVkIE1ENSBzdXBwb3J0ICovCisjZGVmaW5lIENPTkZJR19TSEExCQkvKiBhbmQgU0hBMSAqLworI2VuZGlmCisKKy8qCisgKiBPcGVyYXRpbmcgU3lzdGVtIENvZGVzCisgKi8KKyNkZWZpbmUgSUhfT1NfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIE9TCSovCisjZGVmaW5lIElIX09TX09QRU5CU0QJCTEJLyogT3BlbkJTRAkqLworI2RlZmluZSBJSF9PU19ORVRCU0QJCTIJLyogTmV0QlNECSovCisjZGVmaW5lIElIX09TX0ZSRUVCU0QJCTMJLyogRnJlZUJTRAkqLworI2RlZmluZSBJSF9PU180XzRCU0QJCTQJLyogNC40QlNECSovCisjZGVmaW5lIElIX09TX0xJTlVYCQk1CS8qIExpbnV4CSovCisjZGVmaW5lIElIX09TX1NWUjQJCTYJLyogU1ZSNAkJKi8KKyNkZWZpbmUgSUhfT1NfRVNJWAkJNwkvKiBFc2l4CQkqLworI2RlZmluZSBJSF9PU19TT0xBUklTCQk4CS8qIFNvbGFyaXMJKi8KKyNkZWZpbmUgSUhfT1NfSVJJWAkJOQkvKiBJcml4CQkqLworI2RlZmluZSBJSF9PU19TQ08JCTEwCS8qIFNDTwkJKi8KKyNkZWZpbmUgSUhfT1NfREVMTAkJMTEJLyogRGVsbAkJKi8KKyNkZWZpbmUgSUhfT1NfTkNSCQkxMgkvKiBOQ1IJCSovCisjZGVmaW5lIElIX09TX0xZTlhPUwkJMTMJLyogTHlueE9TCSovCisjZGVmaW5lIElIX09TX1ZYV09SS1MJCTE0CS8qIFZ4V29ya3MJKi8KKyNkZWZpbmUgSUhfT1NfUFNPUwkJMTUJLyogcFNPUwkJKi8KKyNkZWZpbmUgSUhfT1NfUU5YCQkxNgkvKiBRTlgJCSovCisjZGVmaW5lIElIX09TX1VfQk9PVAkJMTcJLyogRmlybXdhcmUJKi8KKyNkZWZpbmUgSUhfT1NfUlRFTVMJCTE4CS8qIFJURU1TCSovCisjZGVmaW5lIElIX09TX0FSVE9TCQkxOQkvKiBBUlRPUwkqLworI2RlZmluZSBJSF9PU19VTklUWQkJMjAJLyogVW5pdHkgT1MJKi8KKyNkZWZpbmUgSUhfT1NfSU5URUdSSVRZCQkyMQkvKiBJTlRFR1JJVFkJKi8KKworLyoKKyAqIENQVSBBcmNoaXRlY3R1cmUgQ29kZXMgKHN1cHBvcnRlZCBieSBMaW51eCkKKyAqLworI2RlZmluZSBJSF9BUkNIX0lOVkFMSUQJCTAJLyogSW52YWxpZCBDUFUJKi8KKyNkZWZpbmUgSUhfQVJDSF9BTFBIQQkJMQkvKiBBbHBoYQkqLworI2RlZmluZSBJSF9BUkNIX0FSTQkJMgkvKiBBUk0JCSovCisjZGVmaW5lIElIX0FSQ0hfSTM4NgkJMwkvKiBJbnRlbCB4ODYJKi8KKyNkZWZpbmUgSUhfQVJDSF9JQTY0CQk0CS8qIElBNjQJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlQUwkJNQkvKiBNSVBTCQkqLworI2RlZmluZSBJSF9BUkNIX01JUFM2NAkJNgkvKiBNSVBTCSA2NCBCaXQgKi8KKyNkZWZpbmUgSUhfQVJDSF9QUEMJCTcJLyogUG93ZXJQQwkqLworI2RlZmluZSBJSF9BUkNIX1MzOTAJCTgJLyogSUJNIFMzOTAJKi8KKyNkZWZpbmUgSUhfQVJDSF9TSAkJOQkvKiBTdXBlckgJKi8KKyNkZWZpbmUgSUhfQVJDSF9TUEFSQwkJMTAJLyogU3BhcmMJKi8KKyNkZWZpbmUgSUhfQVJDSF9TUEFSQzY0CQkxMQkvKiBTcGFyYyA2NCBCaXQgKi8KKyNkZWZpbmUgSUhfQVJDSF9NNjhLCQkxMgkvKiBNNjhLCQkqLworI2RlZmluZSBJSF9BUkNIX01JQ1JPQkxBWkUJMTQJLyogTWljcm9CbGF6ZSAgICovCisjZGVmaW5lIElIX0FSQ0hfTklPUzIJCTE1CS8qIE5pb3MtSUkJKi8KKyNkZWZpbmUgSUhfQVJDSF9CTEFDS0ZJTgkxNgkvKiBCbGFja2ZpbgkqLworI2RlZmluZSBJSF9BUkNIX0FWUjMyCQkxNwkvKiBBVlIzMgkqLworI2RlZmluZSBJSF9BUkNIX1NUMjAwCSAgICAgICAgMTgJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMjAwICAqLworCisvKgorICogSW1hZ2UgVHlwZXMKKyAqCisgKiAiU3RhbmRhbG9uZSBQcm9ncmFtcyIgYXJlIGRpcmVjdGx5IHJ1bm5hYmxlIGluIHRoZSBlbnZpcm9ubWVudAorICoJcHJvdmlkZWQgYnkgVS1Cb290OyBpdCBpcyBleHBlY3RlZCB0aGF0IChpZiB0aGV5IGJlaGF2ZQorICoJd2VsbCkgeW91IGNhbiBjb250aW51ZSB0byB3b3JrIGluIFUtQm9vdCBhZnRlciByZXR1cm4gZnJvbQorICoJdGhlIFN0YW5kYWxvbmUgUHJvZ3JhbS4KKyAqICJPUyBLZXJuZWwgSW1hZ2VzIiBhcmUgdXN1YWxseSBpbWFnZXMgb2Ygc29tZSBFbWJlZGRlZCBPUyB3aGljaAorICoJd2lsbCB0YWtlIG92ZXIgY29udHJvbCBjb21wbGV0ZWx5LiBVc3VhbGx5IHRoZXNlIHByb2dyYW1zCisgKgl3aWxsIGluc3RhbGwgdGhlaXIgb3duIHNldCBvZiBleGNlcHRpb24gaGFuZGxlcnMsIGRldmljZQorICoJZHJpdmVycywgc2V0IHVwIHRoZSBNTVUsIGV0Yy4gLSB0aGlzIG1lYW5zLCB0aGF0IHlvdSBjYW5ub3QKKyAqCWV4cGVjdCB0byByZS1lbnRlciBVLUJvb3QgZXhjZXB0IGJ5IHJlc2V0dGluZyB0aGUgQ1BVLgorICogIlJBTURpc2sgSW1hZ2VzIiBhcmUgbW9yZSBvciBsZXNzIGp1c3QgZGF0YSBibG9ja3MsIGFuZCB0aGVpcgorICoJcGFyYW1ldGVycyAoYWRkcmVzcywgc2l6ZSkgYXJlIHBhc3NlZCB0byBhbiBPUyBrZXJuZWwgdGhhdCBpcworICoJYmVpbmcgc3RhcnRlZC4KKyAqICJNdWx0aS1GaWxlIEltYWdlcyIgY29udGFpbiBzZXZlcmFsIGltYWdlcywgdHlwaWNhbGx5IGFuIE9TCisgKgkoTGludXgpIGtlcm5lbCBpbWFnZSBhbmQgb25lIG9yIG1vcmUgZGF0YSBpbWFnZXMgbGlrZQorICoJUkFNRGlza3MuIFRoaXMgY29uc3RydWN0IGlzIHVzZWZ1bCBmb3IgaW5zdGFuY2Ugd2hlbiB5b3Ugd2FudAorICoJdG8gYm9vdCBvdmVyIHRoZSBuZXR3b3JrIHVzaW5nIEJPT1RQIGV0Yy4sIHdoZXJlIHRoZSBib290CisgKglzZXJ2ZXIgcHJvdmlkZXMganVzdCBhIHNpbmdsZSBpbWFnZSBmaWxlLCBidXQgeW91IHdhbnQgdG8gZ2V0CisgKglmb3IgaW5zdGFuY2UgYW4gT1Mga2VybmVsIGFuZCBhIFJBTURpc2sgaW1hZ2UuCisgKgorICoJIk11bHRpLUZpbGUgSW1hZ2VzIiBzdGFydCB3aXRoIGEgbGlzdCBvZiBpbWFnZSBzaXplcywgZWFjaAorICoJaW1hZ2Ugc2l6ZSAoaW4gYnl0ZXMpIHNwZWNpZmllZCBieSBhbiAidWludDMyX3QiIGluIG5ldHdvcmsKKyAqCWJ5dGUgb3JkZXIuIFRoaXMgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGFuICIodWludDMyX3QpMCIuCisgKglJbW1lZGlhdGVseSBhZnRlciB0aGUgdGVybWluYXRpbmcgMCBmb2xsb3cgdGhlIGltYWdlcywgb25lIGJ5CisgKglvbmUsIGFsbCBhbGlnbmVkIG9uICJ1aW50MzJfdCIgYm91bmRhcmllcyAoc2l6ZSByb3VuZGVkIHVwIHRvCisgKglhIG11bHRpcGxlIG9mIDQgYnl0ZXMgLSBleGNlcHQgZm9yIHRoZSBsYXN0IGZpbGUpLgorICoKKyAqICJGaXJtd2FyZSBJbWFnZXMiIGFyZSBiaW5hcnkgaW1hZ2VzIGNvbnRhaW5pbmcgZmlybXdhcmUgKGxpa2UKKyAqCVUtQm9vdCBvciBGUEdBIGltYWdlcykgd2hpY2ggdXN1YWxseSB3aWxsIGJlIHByb2dyYW1tZWQgdG8KKyAqCWZsYXNoIG1lbW9yeS4KKyAqCisgKiAiU2NyaXB0IGZpbGVzIiBhcmUgY29tbWFuZCBzZXF1ZW5jZXMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5CisgKglVLUJvb3QncyBjb21tYW5kIGludGVycHJldGVyOyB0aGlzIGZlYXR1cmUgaXMgZXNwZWNpYWxseQorICoJdXNlZnVsIHdoZW4geW91IGNvbmZpZ3VyZSBVLUJvb3QgdG8gdXNlIGEgcmVhbCBzaGVsbCAoaHVzaCkKKyAqCWFzIGNvbW1hbmQgaW50ZXJwcmV0ZXIgKD0+IFNoZWxsIFNjcmlwdHMpLgorICovCisKKyNkZWZpbmUgSUhfVFlQRV9JTlZBTElECQkwCS8qIEludmFsaWQgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfU1RBTkRBTE9ORQkxCS8qIFN0YW5kYWxvbmUgUHJvZ3JhbQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9LRVJORUwJCTIJLyogT1MgS2VybmVsIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX1JBTURJU0sJCTMJLyogUkFNRGlzayBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9NVUxUSQkJNAkvKiBNdWx0aS1GaWxlIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX0ZJUk1XQVJFCTUJLyogRmlybXdhcmUgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfU0NSSVBUCQk2CS8qIFNjcmlwdCBmaWxlCQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GSUxFU1lTVEVNCTcJLyogRmlsZXN5c3RlbSBJbWFnZSAoYW55IHR5cGUpCSovCisjZGVmaW5lIElIX1RZUEVfRkxBVERUCQk4CS8qIEJpbmFyeSBGbGF0IERldmljZSBUcmVlIEJsb2IJKi8KKyNkZWZpbmUgSUhfVFlQRV9LV0JJTUFHRQk5CS8qIEtpcmt3b29kIEJvb3QgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfSU1YSU1BR0UJMTAJLyogRnJlZXNjYWxlIElNWEJvb3QgSW1hZ2UJKi8KKworLyoKKyAqIENvbXByZXNzaW9uIFR5cGVzCisgKi8KKyNkZWZpbmUgSUhfQ09NUF9OT05FCQkwCS8qICBObwkgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0daSVAJCTEJLyogZ3ppcAkgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0JaSVAyCQkyCS8qIGJ6aXAyIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9MWk1BCQkzCS8qIGx6bWEgIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9MWk8JCTQJLyogbHpvICAgQ29tcHJlc3Npb24gVXNlZAkqLworCisjZGVmaW5lIElIX01BR0lDCTB4MjcwNTE5NTYJLyogSW1hZ2UgTWFnaWMgTnVtYmVyCQkqLworI2RlZmluZSBJSF9OTUxFTgkJMzIJLyogSW1hZ2UgTmFtZSBMZW5ndGgJCSovCisKKy8qCisgKiBMZWdhY3kgZm9ybWF0IGltYWdlIGhlYWRlciwKKyAqIGFsbCBkYXRhIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYWthIG5hdHVyYWwgYWthIGJpZ2VuZGlhbikuCisgKi8KK3R5cGVkZWYgc3RydWN0IGltYWdlX2hlYWRlciB7CisJdWludDMyX3QJaWhfbWFnaWM7CS8qIEltYWdlIEhlYWRlciBNYWdpYyBOdW1iZXIJKi8KKwl1aW50MzJfdAlpaF9oY3JjOwkvKiBJbWFnZSBIZWFkZXIgQ1JDIENoZWNrc3VtCSovCisJdWludDMyX3QJaWhfdGltZTsJLyogSW1hZ2UgQ3JlYXRpb24gVGltZXN0YW1wCSovCisJdWludDMyX3QJaWhfc2l6ZTsJLyogSW1hZ2UgRGF0YSBTaXplCQkqLworCXVpbnQzMl90CWloX2xvYWQ7CS8qIERhdGEJIExvYWQgIEFkZHJlc3MJCSovCisJdWludDMyX3QJaWhfZXA7CQkvKiBFbnRyeSBQb2ludCBBZGRyZXNzCQkqLworCXVpbnQzMl90CWloX2RjcmM7CS8qIEltYWdlIERhdGEgQ1JDIENoZWNrc3VtCSovCisJdWludDhfdAkJaWhfb3M7CQkvKiBPcGVyYXRpbmcgU3lzdGVtCQkqLworCXVpbnQ4X3QJCWloX2FyY2g7CS8qIENQVSBhcmNoaXRlY3R1cmUJCSovCisJdWludDhfdAkJaWhfdHlwZTsJLyogSW1hZ2UgVHlwZQkJCSovCisJdWludDhfdAkJaWhfY29tcDsJLyogQ29tcHJlc3Npb24gVHlwZQkJKi8KKwl1aW50OF90CQlpaF9uYW1lW0lIX05NTEVOXTsJLyogSW1hZ2UgTmFtZQkJKi8KK30gaW1hZ2VfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGltYWdlX2luZm8geworCXVsb25nCQlzdGFydCwgZW5kOwkJLyogc3RhcnQvZW5kIG9mIGJsb2IgKi8KKwl1bG9uZwkJaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbjsgLyogc3RhcnQgb2YgaW1hZ2Ugd2l0aGluIGJsb2IsIGxlbiBvZiBpbWFnZSAqLworCXVsb25nCQlsb2FkOwkJCS8qIGxvYWQgYWRkciBmb3IgdGhlIGltYWdlICovCisJdWludDhfdAkJY29tcCwgdHlwZSwgb3M7CQkvKiBjb21wcmVzc2lvbiwgdHlwZSBvZiBpbWFnZSwgb3MgdHlwZSAqLworfSBpbWFnZV9pbmZvX3Q7CisKKy8qCisgKiBMZWdhY3kgYW5kIEZJVCBmb3JtYXQgaGVhZGVycyB1c2VkIGJ5IGRvX2Jvb3RtKCkgYW5kIGRvX2Jvb3RtXzxvcz4oKQorICogcm91dGluZXMuCisgKi8KK3N0cnVjdCBiZDsKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdG1faGVhZGVycyB7CisJLyoKKwkgKiBMZWdhY3kgb3MgaW1hZ2UgaGVhZGVyLCBpZiBpdCBpcyBhIG11bHRpIGNvbXBvbmVudCBpbWFnZQorCSAqIHRoZW4gYm9vdF9nZXRfcmFtZGlzaygpIGFuZCBnZXRfZmR0KCkgd2lsbCBhdHRlbXB0IHRvIGdldAorCSAqIGRhdGEgZnJvbSBzZWNvbmQgYW5kIHRoaXJkIGNvbXBvbmVudCBhY2NvcmRpbmdseS4KKwkgKi8KKwlpbWFnZV9oZWFkZXJfdAkqbGVnYWN5X2hkcl9vczsJCS8qIGltYWdlIGhlYWRlciBwb2ludGVyICovCisJaW1hZ2VfaGVhZGVyX3QJbGVnYWN5X2hkcl9vc19jb3B5OwkvKiBoZWFkZXIgY29weSAqLworCXVsb25nCQlsZWdhY3lfaGRyX3ZhbGlkOworCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9jZmc7CS8qIGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUgKi8KKworCXZvaWQJCSpmaXRfaGRyX29zOwkvKiBvcyBGSVQgaW1hZ2UgaGVhZGVyICovCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX29zOwkvKiBvcyBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfb3M7CS8qIG9zIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisKKwl2b2lkCQkqZml0X2hkcl9yZDsJLyogaW5pdCByYW1kaXNrIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfcmQ7CS8qIGluaXQgcmFtZGlzayBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfcmQ7CS8qIGluaXQgcmFtZGlzayBzdWJpbWFnZSBub2RlIG9mZnNldCAqLworCisJdm9pZAkJKmZpdF9oZHJfZmR0OwkvKiBGRFQgYmxvYiBGSVQgaW1hZ2UgaGVhZGVyICovCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2ZkdDsJLyogRkRUIGJsb2Igc3ViaW1hZ2Ugbm9kZSB1bml0IG5hbWUgKi8KKwlpbnQJCWZpdF9ub2Zmc2V0X2ZkdDsvKiBGRFQgYmxvYiBzdWJpbWFnZSBub2RlIG9mZnNldCAqLworI2VuZGlmCisKKyNpZm5kZWYgVVNFX0hPU1RDQworCWltYWdlX2luZm9fdAlvczsJCS8qIG9zIGltYWdlIGluZm8gKi8KKwl1bG9uZwkJZXA7CQkvKiBlbnRyeSBwb2ludCBvZiBPUyAqLworCisJdWxvbmcJCXJkX3N0YXJ0LCByZF9lbmQ7LyogcmFtZGlzayBzdGFydC9lbmQgKi8KKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKKwljaGFyCQkqZnRfYWRkcjsJLyogZmxhdCBkZXYgdHJlZSBhZGRyZXNzICovCisjZW5kaWYKKwl1bG9uZwkJZnRfbGVuOwkJLyogbGVuZ3RoIG9mIGZsYXQgZGV2aWNlIHRyZWUgKi8KKworCXVsb25nCQlpbml0cmRfc3RhcnQ7CisJdWxvbmcJCWluaXRyZF9lbmQ7CisJdWxvbmcJCWNtZGxpbmVfc3RhcnQ7CisJdWxvbmcJCWNtZGxpbmVfZW5kOworCXN0cnVjdCBiZAkqa2JkOworI2VuZGlmCisKKwlpbnQJCXZlcmlmeTsJCS8qIGdldGVudigidmVyaWZ5IilbMF0gIT0gJ24nICovCisKKyNkZWZpbmUJQk9PVE1fU1RBVEVfU1RBUlQJKDB4MDAwMDAwMDEpCisjZGVmaW5lCUJPT1RNX1NUQVRFX0xPQURPUwkoMHgwMDAwMDAwMikKKyNkZWZpbmUJQk9PVE1fU1RBVEVfUkFNRElTSwkoMHgwMDAwMDAwNCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfRkRUCQkoMHgwMDAwMDAwOCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfQ01ETElORQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfQkRfVAkoMHgwMDAwMDAyMCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfUFJFUAkoMHgwMDAwMDA0MCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfR08JKDB4MDAwMDAwODApCisJaW50CQlzdGF0ZTsKKworI2lmZGVmIENPTkZJR19MTUIKKwlzdHJ1Y3QgbG1iCWxtYjsJCS8qIGZvciBtZW1vcnkgbWdtdCAqLworI2VuZGlmCit9IGJvb3RtX2hlYWRlcnNfdDsKKworLyoKKyAqIFNvbWUgc3lzdGVtcyAoZm9yIGV4YW1wbGUgTFdNT04pIGhhdmUgdmVyeSBzaG9ydCB3YXRjaGRvZyBwZXJpb2RzOworICogd2UgbXVzdCBtYWtlIHN1cmUgdG8gc3BsaXQgbG9uZyBvcGVyYXRpb25zIGxpa2UgbWVtbW92ZSgpIG9yCisgKiBjaGVja3N1bSBjYWxjdWxhdGlvbnMgaW50byByZWFzb25hYmxlIGNodW5rcy4KKyAqLworI2lmbmRlZiBDSFVOS1NaCisjZGVmaW5lIENIVU5LU1ogKDY0ICogMTAyNCkKKyNlbmRpZgorCisjaWZuZGVmIENIVU5LU1pfQ1JDMzIKKyNkZWZpbmUgQ0hVTktTWl9DUkMzMiAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9NRDUKKyNkZWZpbmUgQ0hVTktTWl9NRDUgKDY0ICogMTAyNCkKKyNlbmRpZgorCisjaWZuZGVmIENIVU5LU1pfU0hBMQorI2RlZmluZSBDSFVOS1NaX1NIQTEgKDY0ICogMTAyNCkKKyNlbmRpZgorCisjZGVmaW5lIHVpbWFnZV90b19jcHUoeCkJCWJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b191aW1hZ2UoeCkJCWNwdV90b19iZTMyKHgpCisKKy8qCisgKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3IgZW50cmllcyBvZiBhIHNwZWNpZmljIHR5cGU7IHVzZWQgYnkKKyAqIGdldF90YWJsZV9lbnRyeV9pZCgpIGFuZCBnZXRfdGFibGVfZW50cnlfbmFtZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWJsZV9lbnRyeSB7CisJaW50CWlkOworCWNoYXIJKnNuYW1lOwkJLyogc2hvcnQgKGlucHV0KSBuYW1lIHRvIGZpbmQgdGFibGUgZW50cnkgKi8KKwljaGFyCSpsbmFtZTsJCS8qIGxvbmcgKG91dHB1dCkgbmFtZSB0byBwcmludCBmb3IgbWVzc2FnZXMgKi8KK30gdGFibGVfZW50cnlfdDsKKworLyoKKyAqIGdldF90YWJsZV9lbnRyeV9pZCgpIHNjYW5zIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZCBhbgorICogZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzaG9ydCBuYW1lLiBJZiBhIG1hdGNoaW5nIGVudHJ5IGlzCisgKiBmb3VuZCwgaXQncyBpZCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICovCitpbnQgZ2V0X3RhYmxlX2VudHJ5X2lkICh0YWJsZV9lbnRyeV90ICp0YWJsZSwKKwkJY29uc3QgY2hhciAqdGFibGVfbmFtZSwgY29uc3QgY2hhciAqbmFtZSk7CisvKgorICogZ2V0X3RhYmxlX2VudHJ5X25hbWUoKSBzY2FucyB0aGUgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQKKyAqIGFuIGVudHJ5IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaWQuIElmIGEgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsCisgKiBpdHMgbG9uZyBuYW1lIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKi8KK2NoYXIgKmdldF90YWJsZV9lbnRyeV9uYW1lICh0YWJsZV9lbnRyeV90ICp0YWJsZSwgY2hhciAqbXNnLCBpbnQgaWQpOworCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X29zX25hbWUgKHVpbnQ4X3Qgb3MpOworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9hcmNoX25hbWUgKHVpbnQ4X3QgYXJjaCk7Citjb25zdCBjaGFyICpnZW5pbWdfZ2V0X3R5cGVfbmFtZSAodWludDhfdCB0eXBlKTsKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfY29tcF9uYW1lICh1aW50OF90IGNvbXApOworaW50IGdlbmltZ19nZXRfb3NfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdlbmltZ19nZXRfYXJjaF9pZCAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2VuaW1nX2dldF90eXBlX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZW5pbWdfZ2V0X2NvbXBfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBnZW5pbWdfcHJpbnRfc2l6ZSAodWludDMyX3Qgc2l6ZSk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworLyogSW1hZ2UgZm9ybWF0IHR5cGVzLCByZXR1cm5lZCBieSBfZ2V0X2Zvcm1hdCgpIHJvdXRpbmUgKi8KKyNkZWZpbmUgSU1BR0VfRk9STUFUX0lOVkFMSUQJMHgwMAorI2RlZmluZSBJTUFHRV9GT1JNQVRfTEVHQUNZCTB4MDEJLyogbGVnYWN5IGltYWdlX2hlYWRlciBiYXNlZCBmb3JtYXQgKi8KKyNkZWZpbmUgSU1BR0VfRk9STUFUX0ZJVAkweDAyCS8qIG5ldywgbGliZmR0IGJhc2VkIGZvcm1hdCAqLworCitpbnQgZ2VuaW1nX2dldF9mb3JtYXQgKHZvaWQgKmltZ19hZGRyKTsKK2ludCBnZW5pbWdfaGFzX2NvbmZpZyAoYm9vdG1faGVhZGVyc190ICppbWFnZXMpOwordWxvbmcgZ2VuaW1nX2dldF9pbWFnZSAodWxvbmcgaW1nX2FkZHIpOworCitpbnQgYm9vdF9nZXRfcmFtZGlzayAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzLAorCQl1aW50OF90IGFyY2gsIHVsb25nICpyZF9zdGFydCwgdWxvbmcgKnJkX2VuZCk7CisKKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKK2ludCBib290X2dldF9mZHQgKGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKTsKK2ludCBib290X3JlbG9jYXRlX2ZkdCAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyBib290bWFwX2Jhc2UsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKSB8fCBkZWZpbmVkKENPTkZJR19NNjhLKQoraW50IGJvb3RfcmFtZGlza19oaWdoIChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nIHJkX2RhdGEsIHVsb25nIHJkX2xlbiwKKwkJICB1bG9uZyAqaW5pdHJkX3N0YXJ0LCB1bG9uZyAqaW5pdHJkX2VuZCk7CisKK2ludCBib290X2dldF9jbWRsaW5lIChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nICpjbWRfc3RhcnQsIHVsb25nICpjbWRfZW5kLAorCQkJdWxvbmcgYm9vdG1hcF9iYXNlKTsKK2ludCBib290X2dldF9rYmQgKHN0cnVjdCBsbWIgKmxtYiwgYmRfdCAqKmtiZCwgdWxvbmcgYm9vdG1hcF9iYXNlKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDIHx8IENPTkZJR19NNjhLICovCisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMZWdhY3kgZm9ybWF0IHNwZWNpZmljIGNvZGUgKHByZWZpeGVkIHdpdGggaW1hZ2VfKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAodm9pZCkKK3sKKwlyZXR1cm4gKHNpemVvZiAoaW1hZ2VfaGVhZGVyX3QpKTsKK30KKworI2RlZmluZSBpbWFnZV9nZXRfaGRyX2woZikgXAorCXN0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0XyMjZihjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKSBcCisJeyBcCisJCXJldHVybiB1aW1hZ2VfdG9fY3B1IChoZHItPmloXyMjZik7IFwKKwl9CitpbWFnZV9nZXRfaGRyX2wgKG1hZ2ljKQkJLyogaW1hZ2VfZ2V0X21hZ2ljICovCitpbWFnZV9nZXRfaGRyX2wgKGhjcmMpCQkvKiBpbWFnZV9nZXRfaGNyYyAqLworaW1hZ2VfZ2V0X2hkcl9sICh0aW1lKQkJLyogaW1hZ2VfZ2V0X3RpbWUgKi8KK2ltYWdlX2dldF9oZHJfbCAoc2l6ZSkJCS8qIGltYWdlX2dldF9zaXplICovCitpbWFnZV9nZXRfaGRyX2wgKGxvYWQpCQkvKiBpbWFnZV9nZXRfbG9hZCAqLworaW1hZ2VfZ2V0X2hkcl9sIChlcCkJCS8qIGltYWdlX2dldF9lcCAqLworaW1hZ2VfZ2V0X2hkcl9sIChkY3JjKQkJLyogaW1hZ2VfZ2V0X2RjcmMgKi8KKworI2RlZmluZSBpbWFnZV9nZXRfaGRyX2IoZikgXAorCXN0YXRpYyBpbmxpbmUgdWludDhfdCBpbWFnZV9nZXRfIyNmKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpIFwKKwl7IFwKKwkJcmV0dXJuIGhkci0+aWhfIyNmOyBcCisJfQoraW1hZ2VfZ2V0X2hkcl9iIChvcykJCS8qIGltYWdlX2dldF9vcyAqLworaW1hZ2VfZ2V0X2hkcl9iIChhcmNoKQkJLyogaW1hZ2VfZ2V0X2FyY2ggKi8KK2ltYWdlX2dldF9oZHJfYiAodHlwZSkJCS8qIGltYWdlX2dldF90eXBlICovCitpbWFnZV9nZXRfaGRyX2IgKGNvbXApCQkvKiBpbWFnZV9nZXRfY29tcCAqLworCitzdGF0aWMgaW5saW5lIGNoYXIgKmltYWdlX2dldF9uYW1lIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoY2hhciAqKWhkci0+aWhfbmFtZTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfZGF0YV9zaXplIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiBpbWFnZV9nZXRfc2l6ZSAoaGRyKTsKK30KKworLyoqCisgKiBpbWFnZV9nZXRfZGF0YSAtIGdldCBpbWFnZSBwYXlsb2FkIHN0YXJ0IGFkZHJlc3MKKyAqIEBoZHI6IGltYWdlIGhlYWRlcgorICoKKyAqIGltYWdlX2dldF9kYXRhKCkgcmV0dXJucyBhZGRyZXNzIG9mIHRoZSBpbWFnZSBwYXlsb2FkLiBGb3Igc2luZ2xlCisgKiBjb21wb25lbnQgaW1hZ2VzIGl0IGlzIGltYWdlIGRhdGEgc3RhcnQuIEZvciBtdWx0aSBjb21wb25lbnQKKyAqIGltYWdlcyBpdCBwb2ludHMgdG8gdGhlIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBzdWItaW1hZ2VzIHNpemVzLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2UgcGF5bG9hZCBkYXRhIHN0YXJ0IGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1bG9uZyBpbWFnZV9nZXRfZGF0YSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKCh1bG9uZyloZHIgKyBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9pbWFnZV9zaXplIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X3NpemUgKGhkcikgKyBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworfQorc3RhdGljIGlubGluZSB1bG9uZyBpbWFnZV9nZXRfaW1hZ2VfZW5kIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoKHVsb25nKWhkciArIGltYWdlX2dldF9pbWFnZV9zaXplIChoZHIpKTsKK30KKworI2RlZmluZSBpbWFnZV9zZXRfaGRyX2woZikgXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfIyNmKGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQzMl90IHZhbCkgXAorCXsgXAorCQloZHItPmloXyMjZiA9IGNwdV90b191aW1hZ2UgKHZhbCk7IFwKKwl9CitpbWFnZV9zZXRfaGRyX2wgKG1hZ2ljKQkJLyogaW1hZ2Vfc2V0X21hZ2ljICovCitpbWFnZV9zZXRfaGRyX2wgKGhjcmMpCQkvKiBpbWFnZV9zZXRfaGNyYyAqLworaW1hZ2Vfc2V0X2hkcl9sICh0aW1lKQkJLyogaW1hZ2Vfc2V0X3RpbWUgKi8KK2ltYWdlX3NldF9oZHJfbCAoc2l6ZSkJCS8qIGltYWdlX3NldF9zaXplICovCitpbWFnZV9zZXRfaGRyX2wgKGxvYWQpCQkvKiBpbWFnZV9zZXRfbG9hZCAqLworaW1hZ2Vfc2V0X2hkcl9sIChlcCkJCS8qIGltYWdlX3NldF9lcCAqLworaW1hZ2Vfc2V0X2hkcl9sIChkY3JjKQkJLyogaW1hZ2Vfc2V0X2RjcmMgKi8KKworI2RlZmluZSBpbWFnZV9zZXRfaGRyX2IoZikgXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfIyNmKGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3QgdmFsKSBcCisJeyBcCisJCWhkci0+aWhfIyNmID0gdmFsOyBcCisJfQoraW1hZ2Vfc2V0X2hkcl9iIChvcykJCS8qIGltYWdlX3NldF9vcyAqLworaW1hZ2Vfc2V0X2hkcl9iIChhcmNoKQkJLyogaW1hZ2Vfc2V0X2FyY2ggKi8KK2ltYWdlX3NldF9oZHJfYiAodHlwZSkJCS8qIGltYWdlX3NldF90eXBlICovCitpbWFnZV9zZXRfaGRyX2IgKGNvbXApCQkvKiBpbWFnZV9zZXRfY29tcCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW1hZ2Vfc2V0X25hbWUgKGltYWdlX2hlYWRlcl90ICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RybmNweSAoaW1hZ2VfZ2V0X25hbWUgKGhkciksIG5hbWUsIElIX05NTEVOKTsKK30KKworaW50IGltYWdlX2NoZWNrX2hjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOworaW50IGltYWdlX2NoZWNrX2RjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOworI2lmbmRlZiBVU0VfSE9TVENDCitpbnQgZ2V0ZW52X3llc25vIChjaGFyICp2YXIpOwordWxvbmcgZ2V0ZW52X2Jvb3RtX2xvdyh2b2lkKTsKK3BoeXNfc2l6ZV90IGdldGVudl9ib290bV9zaXplKHZvaWQpOwordm9pZCBtZW1tb3ZlX3dkICh2b2lkICp0bywgdm9pZCAqZnJvbSwgc2l6ZV90IGxlbiwgdWxvbmcgY2h1bmtzeik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfbWFnaWMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfbWFnaWMgKGhkcikgPT0gSUhfTUFHSUMpOworfQorc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfdHlwZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCB0eXBlKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X3R5cGUgKGhkcikgPT0gdHlwZSk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja19hcmNoIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IGFyY2gpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfYXJjaCAoaGRyKSA9PSBhcmNoKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX29zIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IG9zKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X29zIChoZHIpID09IG9zKTsKK30KKwordWxvbmcgaW1hZ2VfbXVsdGlfY291bnQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOwordm9pZCBpbWFnZV9tdWx0aV9nZXRpbWcgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVsb25nIGlkeCwKKwkJCXVsb25nICpkYXRhLCB1bG9uZyAqbGVuKTsKKwordm9pZCBpbWFnZV9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqaGRyKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja190YXJnZXRfYXJjaCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKyNpZiBkZWZpbmVkKF9fQVJNX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQVJNKSkKKyNlbGlmIGRlZmluZWQoX19hdnIzMl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0FWUjMyKSkKKyNlbGlmIGRlZmluZWQoX19iZmluX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQkxBQ0tGSU4pKQorI2VsaWYgZGVmaW5lZChfX0kzODZfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9JMzg2KSkKKyNlbGlmIGRlZmluZWQoX19NNjhLX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTTY4SykpCisjZWxpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX01JQ1JPQkxBWkUpKQorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9NSVBTKSkKKyNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX05JT1MyKSkKKyNlbGlmIGRlZmluZWQoX19QUENfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9QUEMpKQorI2VsaWYgZGVmaW5lZChfX3NoX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfU0gpKQorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfU1BBUkMpKQorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBDUFUgdHlwZQorI2VuZGlmCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5ldyB1SW1hZ2UgZm9ybWF0IHNwZWNpZmljIGNvZGUgKHByZWZpeGVkIHdpdGggZml0XykgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKworI2RlZmluZSBGSVRfSU1BR0VTX1BBVEgJCSIvaW1hZ2VzIgorI2RlZmluZSBGSVRfQ09ORlNfUEFUSAkJIi9jb25maWd1cmF0aW9ucyIKKworLyogaGFzaCBub2RlICovCisjZGVmaW5lIEZJVF9IQVNIX05PREVOQU1FCSJoYXNoIgorI2RlZmluZSBGSVRfQUxHT19QUk9QCQkiYWxnbyIKKyNkZWZpbmUgRklUX1ZBTFVFX1BST1AJCSJ2YWx1ZSIKKworLyogaW1hZ2Ugbm9kZSAqLworI2RlZmluZSBGSVRfREFUQV9QUk9QCQkiZGF0YSIKKyNkZWZpbmUgRklUX1RJTUVTVEFNUF9QUk9QCSJ0aW1lc3RhbXAiCisjZGVmaW5lIEZJVF9ERVNDX1BST1AJCSJkZXNjcmlwdGlvbiIKKyNkZWZpbmUgRklUX0FSQ0hfUFJPUAkJImFyY2giCisjZGVmaW5lIEZJVF9UWVBFX1BST1AJCSJ0eXBlIgorI2RlZmluZSBGSVRfT1NfUFJPUAkJIm9zIgorI2RlZmluZSBGSVRfQ09NUF9QUk9QCQkiY29tcHJlc3Npb24iCisjZGVmaW5lIEZJVF9FTlRSWV9QUk9QCQkiZW50cnkiCisjZGVmaW5lIEZJVF9MT0FEX1BST1AJCSJsb2FkIgorCisvKiBjb25maWd1cmF0aW9uIG5vZGUgKi8KKyNkZWZpbmUgRklUX0tFUk5FTF9QUk9QCQkia2VybmVsIgorI2RlZmluZSBGSVRfUkFNRElTS19QUk9QCSJyYW1kaXNrIgorI2RlZmluZSBGSVRfRkRUX1BST1AJCSJmZHQiCisjZGVmaW5lIEZJVF9ERUZBVUxUX1BST1AJImRlZmF1bHQiCisKKyNkZWZpbmUgRklUX01BWF9IQVNIX0xFTgkyMAkvKiBtYXgoY3JjMzJfbGVuKDQpLCBzaGExX2xlbigyMCkpICovCisKKy8qIGNtZGxpbmUgYXJndW1lbnQgZm9ybWF0IHBhcnNpbmcgKi8KK2lubGluZSBpbnQgZml0X3BhcnNlX2NvbmYgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipjb25mX25hbWUpOworaW5saW5lIGludCBmaXRfcGFyc2Vfc3ViaW1hZ2UgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKippbWFnZV9uYW1lKTsKKwordm9pZCBmaXRfcHJpbnRfY29udGVudHMgKGNvbnN0IHZvaWQgKmZpdCk7Cit2b2lkIGZpdF9pbWFnZV9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCk7Cit2b2lkIGZpdF9pbWFnZV9wcmludF9oYXNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKKworLyoqCisgKiBmaXRfZ2V0X2VuZCAtIGdldCBGSVQgaW1hZ2Ugc2l6ZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiByZXR1cm5zOgorICogICAgIHNpemUgb2YgdGhlIEZJVCBpbWFnZSAoYmxvYikgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZml0X2dldF9zaXplIChjb25zdCB2b2lkICpmaXQpCit7CisJcmV0dXJuIGZkdF90b3RhbHNpemUgKGZpdCk7Cit9CisKKy8qKgorICogZml0X2dldF9lbmQgLSBnZXQgRklUIGltYWdlIGVuZAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiByZXR1cm5zOgorICogICAgIGVuZCBhZGRyZXNzIG9mIHRoZSBGSVQgaW1hZ2UgKGJsb2IpIGluIG1lbW9yeQorICovCitzdGF0aWMgaW5saW5lIHVsb25nIGZpdF9nZXRfZW5kIChjb25zdCB2b2lkICpmaXQpCit7CisJcmV0dXJuICh1bG9uZylmaXQgKyBmZHRfdG90YWxzaXplIChmaXQpOworfQorCisvKioKKyAqIGZpdF9nZXRfbmFtZSAtIGdldCBGSVQgbm9kZSBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgTlVMTCwgb24gZXJyb3IKKyAqICAgICBwb2ludGVyIHRvIG5vZGUgbmFtZSwgb24gc3VjY2VzcworICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZpdF9nZXRfbmFtZSAoY29uc3Qgdm9pZCAqZml0X2hkciwKKwkJaW50IG5vZmZzZXQsIGludCAqbGVuKQoreworCXJldHVybiBmZHRfZ2V0X25hbWUgKGZpdF9oZHIsIG5vZmZzZXQsIGxlbik7Cit9CisKK2ludCBmaXRfZ2V0X2Rlc2MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKipkZXNjKTsKK2ludCBmaXRfZ2V0X3RpbWVzdGFtcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90ICp0aW1lc3RhbXApOworCitpbnQgZml0X2ltYWdlX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmltYWdlX3VuYW1lKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpvcyk7CitpbnQgZml0X2ltYWdlX2dldF9hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICphcmNoKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnR5cGUpOworaW50IGZpdF9pbWFnZV9nZXRfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqY29tcCk7CitpbnQgZml0X2ltYWdlX2dldF9sb2FkIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqbG9hZCk7CitpbnQgZml0X2ltYWdlX2dldF9lbnRyeSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmVudHJ5KTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2RhdGEgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCQkJY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSk7CisKK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmFsZ28pOworaW50IGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqKnZhbHVlLAorCQkJCWludCAqdmFsdWVfbGVuKTsKKworaW50IGZpdF9zZXRfdGltZXN0YW1wICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgdGltZXN0YW1wKTsKK2ludCBmaXRfc2V0X2hhc2hlcyAodm9pZCAqZml0KTsKK2ludCBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAodm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCk7CitpbnQgZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp2YWx1ZSwKKwkJCQlpbnQgdmFsdWVfbGVuKTsKKworaW50IGZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworaW50IGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQpOworaW50IGZpdF9pbWFnZV9jaGVja19vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBvcyk7CitpbnQgZml0X2ltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgYXJjaCk7CitpbnQgZml0X2ltYWdlX2NoZWNrX3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgdHlwZSk7CitpbnQgZml0X2ltYWdlX2NoZWNrX2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgY29tcCk7CitpbnQgZml0X2NoZWNrX2Zvcm1hdCAoY29uc3Qgdm9pZCAqZml0KTsKKworaW50IGZpdF9jb25mX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmNvbmZfdW5hbWUpOworaW50IGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKKwordm9pZCBmaXRfY29uZl9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGlubGluZSBpbnQgZml0X2ltYWdlX2NoZWNrX3RhcmdldF9hcmNoIChjb25zdCB2b2lkICpmZHQsIGludCBub2RlKQoreworI2lmIGRlZmluZWQoX19BUk1fXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfQVJNKSkKKyNlbGlmIGRlZmluZWQoX19hdnIzMl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9BVlIzMikpCisjZWxpZiBkZWZpbmVkKF9fYmZpbl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9CTEFDS0ZJTikpCisjZWxpZiBkZWZpbmVkKF9fSTM4Nl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9JMzg2KSkKKyNlbGlmIGRlZmluZWQoX19NNjhLX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX002OEspKQorI2VsaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTUlDUk9CTEFaRSkpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9NSVBTKSkKKyNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9OSU9TMikpCisjZWxpZiBkZWZpbmVkKF9fUFBDX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX1BQQykpCisjZWxpZiBkZWZpbmVkKF9fc2hfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfU0gpKQorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX1NQQVJDKSkKKyNlbHNlCisjIGVycm9yIFVua25vd24gQ1BVIHR5cGUKKyNlbmRpZgorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworI2lmZGVmIENPTkZJR19GSVRfVkVSQk9TRQorI2RlZmluZSBmaXRfdW5zdXBwb3J0ZWQobXNnKQlwcmludGYgKCIhICVzOiVkICIgXAorCQkJCSJGSVQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQgZm9yICclcydcbiIsIFwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIChtc2cpKQorCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZF9yZXNldChtc2cpCXByaW50ZiAoIiEgJXM6JWQgIiBcCisJCQkJIkZJVCBpbWFnZXMgbm90IHN1cHBvcnRlZCBmb3IgJyVzJyAiIFwKKwkJCQkiLSBtdXN0IHJlc2V0IGJvYXJkIHRvIHJlY292ZXIhXG4iLCBcCisJCQkJX19GSUxFX18sIF9fTElORV9fLCAobXNnKSkKKyNlbHNlCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZChtc2cpCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZF9yZXNldChtc2cpCisjZW5kaWYgLyogQ09ORklHX0ZJVF9WRVJCT1NFICovCisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLworCisjZW5kaWYJLyogX19JTUFHRV9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOWIwYzg2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKworI2lmbmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIDQzMjEKKyNlbmRpZgorI2lmbmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19CSUdfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKyNkZWZpbmUJX19CWVRFX09SREVSCV9fQklHX0VORElBTgorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpIF9fX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgX19fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUzMih4KSBfX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpIF9fX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgX19fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KSBfX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZmODUwZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyX2dlbmVyaWMuaAorICogR2VuZXJpYyBCeXRlLXJlb3JkZXJpbmcgc3VwcG9ydAorICoKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzA3MDcKKyAqICAgIGdhdGhlcmVkIGFsbCB0aGUgZ29vZCBpZGVhcyBmcm9tIGFsbCBhc20tZm9vL2J5dGVvcmRlci5oIGludG8gb25lIGZpbGUsCisgKiAgICBjbGVhbmVkIHRoZW0gdXAuCisgKiAgICBJIGhvcGUgaXQgaXMgY29tcGxpYW50IHdpdGggbm9uLUdDQyBjb21waWxlcnMuCisgKiAgICBJIGRlY2lkZWQgdG8gcHV0IF9fQllURU9SREVSX0hBU19VNjRfXyBpbiBieXRlb3JkZXIuaCwKKyAqICAgIGJlY2F1c2UgSSB3YXNuJ3Qgc3VyZSBpdCB3b3VsZCBiZSBvayB0byBwdXQgaXQgaW4gdHlwZXMuaAorICogICAgVXBncmFkZWQgaXQgdG8gMi4xLjQzCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMDEyCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNTcKKyAqICAgIHRvIHBsZWFzZSBMaW51cyBULiwgcmVwbGFjZWQgaHVnZSAjaWZkZWYncyBiZXR3ZWVuIGxpdHRsZS9iaWcgZW5kaWFuCisgKiAgICBieSBuZXN0ZWRseSAjaW5jbHVkZSdkIGZpbGVzLgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQorICogICAgTWFkZSBpdCB0byAyLjEuNzE7IG5vdyBhIGZhY2VsaWZ0OgorICogICAgUHV0IGZpbGVzIHVuZGVyIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyLworICogICAgU3BsaXQgc3dhYiBmcm9tIGdlbmVyaWMgc3VwcG9ydC4KKyAqCisgKiBUT0RPOgorICogICA9IFJlZ3VsYXIga2VybmVsIG1haW50YWluZXJzIGNvdWxkIGFsc28gcmVwbGFjZSBhbGwgdGhlc2UgbWFudWFsCisgKiAgICBieXRlc3dhcCBtYWNyb3MgdGhhdCByZW1haW4sIGRpc3NlbWluYXRlZCBhbW9uZyBkcml2ZXJzLAorICogICAgYWZ0ZXIgc29tZSBncmVwIG9yIHRoZSBzb3VyY2VzLi4uCisgKiAgID0gTGludXMgbWlnaHQgd2FudCB0byByZW5hbWUgYWxsIHRoZXNlIG1hY3JvcyBhbmQgZmlsZXMgdG8gZml0IGhpcyB0YXN0ZSwKKyAqICAgIHRvIGZpdCBoaXMgcGVyc29uYWwgbmFtaW5nIHNjaGVtZS4KKyAqICAgPSBpdCBzZWVtcyB0aGF0IGEgZmV3IGRyaXZlcnMgd291bGQgYWxzbyBhcHByZWNpYXRlCisgKiAgICBueWJibGUgc3dhcHBpbmcgc3VwcG9ydC4uLgorICogICA9IGV2ZXJ5IGFyY2hpdGVjdHVyZSBjb3VsZCBhZGQgdGhlaXIgYnl0ZXN3YXAgbWFjcm8gaW4gYXNtL2J5dGVvcmRlci5oCisgKiAgICBzZWUgaG93IHNvbWUgYXJjaGl0ZWN0dXJlcyBhbHJlYWR5IGRvIChpMzg2LCBhbHBoYSwgcHBjLCBldGMpCisgKiAgID0gY3B1X3RvX2JlWFggYW5kIGJlWFhfdG9fY3B1IG1pZ2h0IHNvbWUgZGF5IG5lZWQgdG8gYmUgd2VsbAorICogICAgZGlzdGluZ3Vpc2hlZCB0aHJvdWdob3V0IHRoZSBrZXJuZWwuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGN1cnJlbnRseSwKKyAqICAgIHNpbmNlIGxpdHRsZSBlbmRpYW4sIGJpZyBlbmRpYW4sIGFuZCBwZHAgZW5kaWFuIG1hY2hpbmVzIG5lZWRuJ3QgaXQuCisgKiAgICBCdXQgdGhpcyBtaWdodCBiZSB0aGUgY2FzZSBmb3IsIHNheSwgYSBwb3J0IG9mIExpbnV4IHRvIDIwLzIxIGJpdAorICogICAgYXJjaGl0ZWN0dXJlcyAoYW5kIEYyMSBMaW51eCBhZGRpY3QgYXJvdW5kPykuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB0byBiZSBkZWZpbmVkIGJ5IDxhc20vYnl0ZW9yZGVyLmg+OgorICoKKyAqIENvbnZlcnNpb24gb2YgbG9uZyBhbmQgc2hvcnQgaW50IGJldHdlZW4gbmV0d29yayBhbmQgaG9zdCBmb3JtYXQKKyAqCW50b2hsKF9fdTMyIHgpCisgKgludG9ocyhfX3UxNiB4KQorICoJaHRvbmwoX191MzIgeCkKKyAqCWh0b25zKF9fdTE2IHgpCisgKiBJdCBzZWVtcyB0aGF0IHNvbWUgcHJvZ3JhbXMgKHdoaWNoPyB3aGVyZT8gb3IgcGVyaGFwcyBhIHN0YW5kYXJkPyBQT1NJWD8pCisgKiBtaWdodCBsaWtlIHRoZSBhYm92ZSB0byBiZSBmdW5jdGlvbnMsIG5vdCBtYWNyb3MgKHdoeT8pLgorICogaWYgdGhhdCdzIHRydWUsIHRoZW4gZGV0ZWN0IHRoZW0sIGFuZCB0YWtlIG1lYXN1cmVzLgorICogQW55d2F5LCB0aGUgbWVhc3VyZSBpczogZGVmaW5lIG9ubHkgX19fbnRvaGwgYXMgYSBtYWNybyBpbnN0ZWFkLAorICogYW5kIGluIGEgc2VwYXJhdGUgZmlsZSwgaGF2ZQorICogdW5zaWduZWQgbG9uZyBpbmxpbmUgbnRvaGwoeCl7cmV0dXJuIF9fX250b2hsKHgpO30KKyAqCisgKiBUaGUgc2FtZSBmb3IgY29uc3RhbnQgYXJndW1lbnRzCisgKglfX2NvbnN0YW50X250b2hsKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X250b2hzKF9fdTE2IHgpCisgKglfX2NvbnN0YW50X2h0b25sKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X2h0b25zKF9fdTE2IHgpCisgKgorICogQ29udmVyc2lvbiBvZiBYWC1iaXQgaW50ZWdlcnMgKDE2LSAzMi0gb3IgNjQtKQorICogYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdCBhbmQgbGl0dGxlL2JpZyBlbmRpYW4gZm9ybWF0CisgKiA2NC1iaXQgc3R1ZmYgb25seSBkZWZpbmVkIGZvciBwcm9wZXIgYXJjaGl0ZWN0dXJlcworICoJY3B1X3RvX1tibF1lWFgoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1KF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGNvbnZlcnQKKyAqCWNwdV90b19bYmxdZVhYcChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHVwKF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCBjaGFuZ2UgaW4gc2l0dQorICoJY3B1X3RvX1tibF1lWFhzKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXMoX191WFggeCkKKyAqCisgKiBTZWUgYXNtLWZvby9ieXRlb3JkZXIuaCBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1vcHRpbWl6ZWQgdmVyc2lvbnMKKyAqCisgKi8KKworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorLyoKKyAqIGluc2lkZSB0aGUga2VybmVsLCB3ZSBjYW4gdXNlIG5pY2tuYW1lczsKKyAqIG91dHNpZGUgb2YgaXQsIHdlIG11c3QgYXZvaWQgUE9TSVggbmFtZXNwYWNlIHBvbGx1dGlvbi4uLgorICovCisjZGVmaW5lIGNwdV90b19sZTY0IF9fY3B1X3RvX2xlNjQKKyNkZWZpbmUgbGU2NF90b19jcHUgX19sZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGUzMiBfX2NwdV90b19sZTMyCisjZGVmaW5lIGxlMzJfdG9fY3B1IF9fbGUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlMTYgX19jcHVfdG9fbGUxNgorI2RlZmluZSBsZTE2X3RvX2NwdSBfX2xlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTY0IF9fY3B1X3RvX2JlNjQKKyNkZWZpbmUgYmU2NF90b19jcHUgX19iZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmUzMiBfX2NwdV90b19iZTMyCisjZGVmaW5lIGJlMzJfdG9fY3B1IF9fYmUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlMTYgX19jcHVfdG9fYmUxNgorI2RlZmluZSBiZTE2X3RvX2NwdSBfX2JlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTY0cCBfX2NwdV90b19sZTY0cAorI2RlZmluZSBsZTY0X3RvX2NwdXAgX19sZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlMzJwIF9fY3B1X3RvX2xlMzJwCisjZGVmaW5lIGxlMzJfdG9fY3B1cCBfX2xlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGUxNnAgX19jcHVfdG9fbGUxNnAKKyNkZWZpbmUgbGUxNl90b19jcHVwIF9fbGUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTY0cCBfX2NwdV90b19iZTY0cAorI2RlZmluZSBiZTY0X3RvX2NwdXAgX19iZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlMzJwIF9fY3B1X3RvX2JlMzJwCisjZGVmaW5lIGJlMzJfdG9fY3B1cCBfX2JlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmUxNnAgX19jcHVfdG9fYmUxNnAKKyNkZWZpbmUgYmUxNl90b19jcHVwIF9fYmUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTY0cyBfX2NwdV90b19sZTY0cworI2RlZmluZSBsZTY0X3RvX2NwdXMgX19sZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2xlMzJzIF9fY3B1X3RvX2xlMzJzCisjZGVmaW5lIGxlMzJfdG9fY3B1cyBfX2xlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fbGUxNnMgX19jcHVfdG9fbGUxNnMKKyNkZWZpbmUgbGUxNl90b19jcHVzIF9fbGUxNl90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTY0cyBfX2NwdV90b19iZTY0cworI2RlZmluZSBiZTY0X3RvX2NwdXMgX19iZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlMzJzIF9fY3B1X3RvX2JlMzJzCisjZGVmaW5lIGJlMzJfdG9fY3B1cyBfX2JlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmUxNnMgX19jcHVfdG9fYmUxNnMKKyNkZWZpbmUgYmUxNl90b19jcHVzIF9fYmUxNl90b19jcHVzCisjZW5kaWYKKworCisvKgorICogSGFuZGxlIG50b2hsIGFuZCBzdWNoZXMuIFRoZXNlIGhhdmUgdmFyaW91cyBjb21wYXRpYmlsaXR5CisgKiBpc3N1ZXMgLSBsaWtlIHdlIHdhbnQgdG8gZ2l2ZSB0aGUgcHJvdG90eXBlIGV2ZW4gdGhvdWdoIHdlCisgKiBhbHNvIGhhdmUgYSBtYWNybyBmb3IgdGhlbSBpbiBjYXNlIHNvbWUgc3RyYW5nZSBwcm9ncmFtCisgKiB3YW50cyB0byB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyBvciBzb21ldGhpbmcuLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSB1c2VkIHRvIHJldHVybiBhICJsb25nIiBpbiBsaWJjNSwgZXZlbiB0aG91Z2gKKyAqIGxvbmcgaXMgb2Z0ZW4gNjQtYml0IHRoZXNlIGRheXMuLiBUaHVzIHRoZSBjYXN0cy4KKyAqCisgKiBUaGV5IGhhdmUgdG8gYmUgbWFjcm9zIGluIG9yZGVyIHRvIGRvIHRoZSBjb25zdGFudCBmb2xkaW5nCisgKiBjb3JyZWN0bHkgLSBpZiB0aGUgYXJndW1lbnQgcGFzc2VkIGludG8gYSBpbmxpbmUgZnVuY3Rpb24KKyAqIGl0IGlzIG5vIGxvbmdlciBjb25zdGFudCBhY2NvcmRpbmcgdG8gZ2NjLi4KKyAqLworCisjdW5kZWYgbnRvaGwKKyN1bmRlZiBudG9ocworI3VuZGVmIGh0b25sCisjdW5kZWYgaHRvbnMKKworLyoKKyAqIERvIHRoZSBwcm90b3R5cGVzLiBTb21lYm9keSBtaWdodCB3YW50IHRvIHRha2UgdGhlCisgKiBhZGRyZXNzIG9yIHNvbWUgc3VjaCBzaWNrIHRoaW5nLi4KKyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgKGRlZmluZWQgKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID49IDIpCitleHRlcm4gX191MzIJCQludG9obChfX3UzMik7CitleHRlcm4gX191MzIJCQlodG9ubChfX3UzMik7CisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50CW50b2hsKHVuc2lnbmVkIGxvbmcgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludAlodG9ubCh1bnNpZ25lZCBsb25nIGludCk7CisjZW5kaWYKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJbnRvaHModW5zaWduZWQgc2hvcnQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJaHRvbnModW5zaWduZWQgc2hvcnQgaW50KTsKKworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDIpCisKKyNkZWZpbmUgX19faHRvbmwoeCkgX19jcHVfdG9fYmUzMih4KQorI2RlZmluZSBfX19odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCisjZGVmaW5lIF9fX250b2hsKHgpIF9fYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgX19fbnRvaHMoeCkgX19iZTE2X3RvX2NwdSh4KQorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAoZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMikKKyNkZWZpbmUgaHRvbmwoeCkgX19faHRvbmwoeCkKKyNkZWZpbmUgbnRvaGwoeCkgX19fbnRvaGwoeCkKKyNlbHNlCisjZGVmaW5lIGh0b25sKHgpICgodW5zaWduZWQgbG9uZylfX19odG9ubCh4KSkKKyNkZWZpbmUgbnRvaGwoeCkgKCh1bnNpZ25lZCBsb25nKV9fX250b2hsKHgpKQorI2VuZGlmCisjZGVmaW5lIGh0b25zKHgpIF9fX2h0b25zKHgpCisjZGVmaW5lIG50b2hzKHgpIF9fX250b2hzKHgpCisKKyNlbmRpZiAvKiBPUFRJTUlaRSAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0NmYzZWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSAorCisjaWZuZGVmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorI2VuZGlmCisjaWZuZGVmIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNlbmRpZgorI2RlZmluZQlfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSBfX19jb25zdGFudF9zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlNjRfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGU2NF90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxZDU3MGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKQEAgLTAsMCArMSwxNTggQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKKworLyoKKyAqIGxpbnV4L2J5dGVvcmRlci9zd2FiLmgKKyAqIEJ5dGUtc3dhcHBpbmcsIGluZGVwZW5kZW50bHkgZnJvbSBDUFUgZW5kaWFubmVzcworICoJc3dhYlhYW3BzXT8oZm9vKQorICoKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEyMDUKKyAqICAgIHNlcGFyYXRlZCBzd2FiIGZ1bmN0aW9ucyBmcm9tIGNwdV90b19YWCwKKyAqICAgIHRvIGNsZWFuIHVwIHN1cHBvcnQgZm9yIGJpemFycmUtZW5kaWFuIGFyY2hpdGVjdHVyZXMuCisgKgorICogU2VlIGFzbS1pMzg2L2J5dGVvcmRlci5oIGFuZCBzdWNoZXMgZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBwcm92aWRlCisgKiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG9wdGltaXplZCB2ZXJzaW9ucworICoKKyAqLworCisvKiBjYXN0cyBhcmUgbmVjZXNzYXJ5IGZvciBjb25zdGFudHMsIGJlY2F1c2Ugd2UgbmV2ZXIga25vdyBob3cgZm9yIHN1cmUKKyAqIGhvdyBVL1VML1VMTCBtYXAgdG8gX191MTYsIF9fdTMyLCBfX3U2NC4gQXQgbGVhc3Qgbm90IGluIGEgcG9ydGFibGUgd2F5LgorICovCisjZGVmaW5lIF9fX3N3YWIxNih4KSBcCisJKChfX3UxNikoIFwKKwkJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4MDBmZlUpIDw8IDgpIHwgXAorCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkgKSkKKyNkZWZpbmUgX19fc3dhYjMyKHgpIFwKKwkoKF9fdTMyKSggXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKKyNkZWZpbmUgX19fc3dhYjY0KHgpIFwKKwkoKF9fdTY0KSggXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCisKKy8qCisgKiBwcm92aWRlIGRlZmF1bHRzIHdoZW4gbm8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBpcyBkZXRlY3RlZAorICovCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2CisjICBkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fc3dhYjE2KHgpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzIKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19zd2FiMzIoeCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX3N3YWI2NCh4KQorI2VuZGlmCisKKyNpZm5kZWYgX19hcmNoX19zd2FiMTZwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMTZwKHgpIF9fc3dhYjE2KCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzJwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzJwKHgpIF9fc3dhYjMyKCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjRwCisjICBkZWZpbmUgX19hcmNoX19zd2FiNjRwKHgpIF9fc3dhYjY0KCooeCkpCisjZW5kaWYKKworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnMoeCkgZG8geyAqKHgpID0gX19zd2FiMTZwKCh4KSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzJzCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzJzKHgpIGRvIHsgKih4KSA9IF9fc3dhYjMycCgoeCkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjY0cworIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0cyh4KSBkbyB7ICooeCkgPSBfX3N3YWI2NHAoKHgpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qCisgKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCisjICBkZWZpbmUgX19zd2FiMTYoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UxNikoeCkpID8gXAorIF9fX3N3YWIxNigoeCkpIDogXAorIF9fZnN3YWIxNigoeCkpKQorIyAgZGVmaW5lIF9fc3dhYjMyKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKKyBfX19zd2FiMzIoKHgpKSA6IFwKKyBfX2Zzd2FiMzIoKHgpKSkKKyMgIGRlZmluZSBfX3N3YWI2NCh4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPyBcCisgX19fc3dhYjY0KCh4KSkgOiBcCisgX19mc3dhYjY0KCh4KSkpCisjZWxzZQorIyAgZGVmaW5lIF9fc3dhYjE2KHgpIF9fZnN3YWIxNih4KQorIyAgZGVmaW5lIF9fc3dhYjMyKHgpIF9fZnN3YWIzMih4KQorIyAgZGVmaW5lIF9fc3dhYjY0KHgpIF9fZnN3YWI2NCh4KQorI2VuZGlmIC8qIE9QVElNSVpFICovCisKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3UxNiBfX2Zzd2FiMTYoX191MTYgeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMTYoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoX191MTYgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjE2cCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICphZGRyKQoreworCV9fYXJjaF9fc3dhYjE2cyhhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3UzMiBfX2Zzd2FiMzIoX191MzIgeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMzIoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWIzMnAoX191MzIgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjMycCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMzJzKF9fdTMyICphZGRyKQoreworCV9fYXJjaF9fc3dhYjMycyhhZGRyKTsKK30KKworI2lmZGVmIF9fQllURU9SREVSX0hBU19VNjRfXworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3U2NCBfX2Zzd2FiNjQoX191NjQgeCkKK3sKKyMgIGlmZGVmIF9fU1dBQl82NF9USFJVXzMyX18KKwlfX3UzMiBoID0geCA+PiAzMjsKKwlfX3UzMiBsID0geCAmICgoMVVMTDw8MzIpLTEpOworCXJldHVybiAoKChfX3U2NClfX3N3YWIzMihsKSkgPDwgMzIpIHwgKChfX3U2NCkoX19zd2FiMzIoaCkpKTsKKyMgIGVsc2UKKwlyZXR1cm4gX19hcmNoX19zd2FiNjQoeCk7CisjICBlbmRpZgorfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19zd2FiNjRwKF9fdTY0ICp4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWI2NHAoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjY0cyhfX3U2NCAqYWRkcikKK3sKKwlfX2FyY2hfX3N3YWI2NHMoYWRkcik7Cit9CisjZW5kaWYgLyogX19CWVRFT1JERVJfSEFTX1U2NF9fICovCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCisjZGVmaW5lIHN3YWIxNiBfX3N3YWIxNgorI2RlZmluZSBzd2FiMzIgX19zd2FiMzIKKyNkZWZpbmUgc3dhYjY0IF9fc3dhYjY0CisjZGVmaW5lIHN3YWIxNnAgX19zd2FiMTZwCisjZGVmaW5lIHN3YWIzMnAgX19zd2FiMzJwCisjZGVmaW5lIHN3YWI2NHAgX19zd2FiNjRwCisjZGVmaW5lIHN3YWIxNnMgX19zd2FiMTZzCisjZGVmaW5lIHN3YWIzMnMgX19zd2FiMzJzCisjZGVmaW5lIHN3YWI2NHMgX19zd2FiNjRzCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE5NGNiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jb25maWcuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0xJTlVYX0NPTkZJR19ICisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSAorCisvKiAjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2N0eXBlLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMzYzOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9MSU5VWF9DVFlQRV9ICisjZGVmaW5lIF9MSU5VWF9DVFlQRV9ICisKKy8qCisgKiBOT1RFISBUaGlzIGN0eXBlIGRvZXMgbm90IGhhbmRsZSBFT0YgbGlrZSB0aGUgc3RhbmRhcmQgQworICogbGlicmFyeSBpcyByZXF1aXJlZCB0by4KKyAqLworCisjZGVmaW5lIF9VCTB4MDEJLyogdXBwZXIgKi8KKyNkZWZpbmUgX0wJMHgwMgkvKiBsb3dlciAqLworI2RlZmluZSBfRAkweDA0CS8qIGRpZ2l0ICovCisjZGVmaW5lIF9DCTB4MDgJLyogY250cmwgKi8KKyNkZWZpbmUgX1AJMHgxMAkvKiBwdW5jdCAqLworI2RlZmluZSBfUwkweDIwCS8qIHdoaXRlIHNwYWNlIChzcGFjZS9sZi90YWIpICovCisjZGVmaW5lIF9YCTB4NDAJLyogaGV4IGRpZ2l0ICovCisjZGVmaW5lIF9TUAkweDgwCS8qIGhhcmQgc3BhY2UgKDB4MjApICovCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIF9jdHlwZVtdOworCisjZGVmaW5lIF9faXNtYXNrKHgpIChfY3R5cGVbKGludCkodW5zaWduZWQgY2hhcikoeCldKQorCisjZGVmaW5lIGlzYWxudW0oYykJKChfX2lzbWFzayhjKSYoX1V8X0x8X0QpKSAhPSAwKQorI2RlZmluZSBpc2FscGhhKGMpCSgoX19pc21hc2soYykmKF9VfF9MKSkgIT0gMCkKKyNkZWZpbmUgaXNjbnRybChjKQkoKF9faXNtYXNrKGMpJihfQykpICE9IDApCisjZGVmaW5lIGlzZGlnaXQoYykJKChfX2lzbWFzayhjKSYoX0QpKSAhPSAwKQorI2RlZmluZSBpc2dyYXBoKGMpCSgoX19pc21hc2soYykmKF9QfF9VfF9MfF9EKSkgIT0gMCkKKyNkZWZpbmUgaXNsb3dlcihjKQkoKF9faXNtYXNrKGMpJihfTCkpICE9IDApCisjZGVmaW5lIGlzcHJpbnQoYykJKChfX2lzbWFzayhjKSYoX1B8X1V8X0x8X0R8X1NQKSkgIT0gMCkKKyNkZWZpbmUgaXNwdW5jdChjKQkoKF9faXNtYXNrKGMpJihfUCkpICE9IDApCisjZGVmaW5lIGlzc3BhY2UoYykJKChfX2lzbWFzayhjKSYoX1MpKSAhPSAwKQorI2RlZmluZSBpc3VwcGVyKGMpCSgoX19pc21hc2soYykmKF9VKSkgIT0gMCkKKyNkZWZpbmUgaXN4ZGlnaXQoYykJKChfX2lzbWFzayhjKSYoX0R8X1gpKSAhPSAwKQorCisjZGVmaW5lIGlzYXNjaWkoYykgKCgodW5zaWduZWQgY2hhcikoYykpPD0weDdmKQorI2RlZmluZSB0b2FzY2lpKGMpICgoKHVuc2lnbmVkIGNoYXIpKGMpKSYweDdmKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX190b2xvd2VyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXN1cHBlcihjKSkKKwkJYyAtPSAnQSctJ2EnOworCXJldHVybiBjOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX190b3VwcGVyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXNsb3dlcihjKSkKKwkJYyAtPSAnYSctJ0EnOworCXJldHVybiBjOworfQorCisjZGVmaW5lIHRvbG93ZXIoYykgX190b2xvd2VyKGMpCisjZGVmaW5lIHRvdXBwZXIoYykgX190b3VwcGVyKGMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzdlMWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfTElOVVhfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfUE9TSVhfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKy8qCisgKiBUaGlzIGFsbG93cyBmb3IgMTAyNCBmaWxlIGRlc2NyaXB0b3JzOiBpZiBOUl9PUEVOIGlzIGV2ZXIgZ3Jvd24KKyAqIGJleW9uZCB0aGF0IHlvdSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzIHRvby4gQnV0IDEwMjQgZmQncyBzZWVtIHRvIGJlCisgKiBlbm91Z2ggZXZlbiBmb3Igc3VjaCAicmVhbCIgdW5pY2VzIGxpa2UgT1NGLzEsIHNvIGhvcGVmdWxseSB0aGlzIGlzCisgKiBvbmUgbGltaXQgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUgY2hhbmdlZCBbYWdhaW5dLgorICoKKyAqIE5vdGUgdGhhdCBQT1NJWCB3YW50cyB0aGUgRkRfQ0xFQVIoZmQsZmRzZXRwKSBkZWZpbmVzIHRvIGJlIGluCisgKiA8c3lzL3RpbWUuaD4gKGFuZCB0aHVzIDxsaW51eC90aW1lLmg+KSAtIGJ1dCB0aGlzIGlzIGEgbW9yZSBsb2dpY2FsCisgKiBwbGFjZSBmb3IgdGhlbS4gU29sdmVkIGJ5IGhhdmluZyBkdW1teSBkZWZpbmVzIGluIDxzeXMvdGltZS5oPi4KKyAqLworCisvKgorICogVGhvc2UgbWFjcm9zIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiA8Z251L3R5cGVzLmg+LiBCdXQgd2UgYWx3YXlzCisgKiB1c2UgdGhlIG9uZXMgaGVyZS4KKyAqLworI3VuZGVmIF9fTkZEQklUUworI2RlZmluZSBfX05GREJJVFMJKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisKKyN1bmRlZiBfX0ZEX1NFVFNJWkUKKyNkZWZpbmUgX19GRF9TRVRTSVpFCTEwMjQKKworI3VuZGVmIF9fRkRTRVRfTE9OR1MKKyNkZWZpbmUgX19GRFNFVF9MT05HUwkoX19GRF9TRVRTSVpFL19fTkZEQklUUykKKworI3VuZGVmIF9fRkRFTFQKKyNkZWZpbmUJX19GREVMVChkKQkoKGQpIC8gX19ORkRCSVRTKQorCisjdW5kZWYgX19GRE1BU0sKKyNkZWZpbmUJX19GRE1BU0soZCkJKDFVTCA8PCAoKGQpICUgX19ORkRCSVRTKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgZmRzX2JpdHMgW19fRkRTRVRfTE9OR1NdOworfSBfX2tlcm5lbF9mZF9zZXQ7CisKKy8qIFR5cGUgb2YgYSBzaWduYWwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKCpfX2tlcm5lbF9zaWdoYW5kbGVyX3QpKGludCk7CisKKy8qIFR5cGUgb2YgYSBTWVNWIElQQyBrZXkuICAqLwordHlwZWRlZiBpbnQgX19rZXJuZWxfa2V5X3Q7CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0YXQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5NDIyY2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0YXQuaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfTElOVVhfU1RBVF9ICisjZGVmaW5lIF9MSU5VWF9TVEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBTX0lGTVQgIDAwMTcwMDAwCS8qIHR5cGUgb2YgZmlsZSAqLworI2RlZmluZSBTX0lGU09DSyAwMTQwMDAwCS8qIG5hbWVkIHNvY2tldCAqLworI2RlZmluZSBTX0lGTE5LCSAwMTIwMDAwCS8qIHN5bWJvbGljIGxpbmsgKi8KKyNkZWZpbmUgU19JRlJFRyAgMDEwMDAwMAkvKiByZWd1bGFyICovCisjZGVmaW5lIFNfSUZCTEsgIDAwNjAwMDAJLyogYmxvY2sgc3BlY2lhbCAqLworI2RlZmluZSBTX0lGRElSICAwMDQwMDAwCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBTX0lGQ0hSICAwMDIwMDAwCS8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZJRk8gIDAwMTAwMDAJLyogZmlmbyAqLworI2RlZmluZSBTX0lTVUlEICAwMDA0MDAwCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTX0lTR0lEICAwMDAyMDAwCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUgU19JU1ZUWCAgMDAwMTAwMAkvKiBzYXZlIHN3YXBwZWQgdGV4dCBldmVuIGFmdGVyIHVzZSAqLworCisjZGVmaW5lIFNfSVNMTksobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZGVmaW5lIFNfSVNCTEsobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZCTEspCisjZGVmaW5lIFNfSVNGSUZPKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2RlZmluZSBTX0lTU09DSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisKKyNkZWZpbmUgU19JUldYVSAwMDcwMAkJLyogcnd4IGZvciBvd25lciAqLworI2RlZmluZSBTX0lSVVNSIDAwNDAwCQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVdVU1IgMDAyMDAJCS8qIHdyaXRlIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVhVU1IgMDAxMDAJCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisKKyNkZWZpbmUgU19JUldYRyAwMDA3MAkJLyogcnd4IGZvciBncm91cCAqLworI2RlZmluZSBTX0lSR1JQIDAwMDQwCQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVdHUlAgMDAwMjAJCS8qIHdyaXRlIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAJCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisKKyNkZWZpbmUgU19JUldYTyAwMDAwNwkJLyogcnd4IGZvciBvdGhlciAqLworI2RlZmluZSBTX0lST1RIIDAwMDA0CQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIG90aGVyICovCisjZGVmaW5lIFNfSVdPVEggMDAwMDIJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKyNkZWZpbmUgU19JWE9USCAwMDAwMQkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKworI2lmZGVmCV9fUFBDX18KKworc3RydWN0IHN0YXQgeworCWRldl90CQlzdF9kZXY7CQkvKiBmaWxlIHN5c3RlbSBpZCAqLworCWlub190CQlzdF9pbm87CQkvKiBmaWxlIGlkICovCisJbW9kZV90CQlzdF9tb2RlOwkvKiBvd25lcnNoaXAvcHJvdGVjdGlvbiAqLworCW5saW5rX3QJCXN0X25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgKi8KKwl1aWRfdCAJCXN0X3VpZDsJCS8qIHVzZXIgaWQgKi8KKwlnaWRfdCAJCXN0X2dpZDsJCS8qIGdyb3VwIGlkICovCisJZGV2X3QJCXN0X3JkZXY7CisJb2ZmX3QJCXN0X3NpemU7CS8qIGZpbGUgc2l6ZSBpbiAjIG9mIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyAgCXN0X2Jsa3NpemU7CS8qIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYmxvY2tzOwkvKiBmaWxlIHNpemUgaW4gIyBvZiBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBhY2Nlc3NlZCAqLworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZyAgCXN0X210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcgIAlzdF9jdGltZTsJLyogdGltZSBmaWxlIHN0YXR1cyB3YXMgbGFzdCBjaGFuZ2VkICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDU7Cit9OworCisjZW5kaWYJLyogX19QUENfXyAqLworCisjaWYgZGVmaW5lZCAoX19BUk1fXykgfHwgZGVmaW5lZCAoX19JMzg2X18pIHx8IGRlZmluZWQgKF9fTTY4S19fKSB8fCBkZWZpbmVkIChfX2JsYWNrZmluX18pCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7CisJdW5zaWduZWQgc2hvcnQgX19wYWQxOworCXVuc2lnbmVkIGxvbmcgc3RfaW5vOworCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7CisJdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7CisJdW5zaWduZWQgc2hvcnQgc3RfdWlkOworCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nICBzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZW5kaWYJLyogX19BUk1fXyAqLworCisjaWYgZGVmaW5lZCAoX19NSVBTX18pCisKK3N0cnVjdCBzdGF0IHsKKwlkZXZfdCAgICAgICAgICAgc3RfZGV2OworCWxvbmcgICAgICAgICAgICBzdF9wYWQxWzNdOworCWlub190ICAgICAgICAgICBzdF9pbm87CisJbW9kZV90ICAgICAgICAgIHN0X21vZGU7CisJbmxpbmtfdCAgICAgICAgIHN0X25saW5rOworCXVpZF90ICAgICAgICAgICBzdF91aWQ7CisJZ2lkX3QgICAgICAgICAgIHN0X2dpZDsKKwlkZXZfdCAgICAgICAgICAgc3RfcmRldjsKKwlsb25nICAgICAgICAgICAgc3RfcGFkMlsyXTsKKwlvZmZfdCAgICAgICAgICAgc3Rfc2l6ZTsKKwlsb25nICAgICAgICAgICAgc3RfcGFkMzsKKwkvKgorCSAqIEFjdHVhbGx5IHRoaXMgc2hvdWxkIGJlIHRpbWVzdHJ1Y190IHN0X2F0aW1lLCBzdF9tdGltZSBhbmQgc3RfY3RpbWUKKwkgKiBidXQgd2UgZG9uJ3QgaGF2ZSBpdCB1bmRlciBMaW51eC4KKwkgKi8KKwl0aW1lX3QgICAgICAgICAgc3RfYXRpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMDsKKwl0aW1lX3QgICAgICAgICAgc3RfbXRpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMTsKKwl0aW1lX3QgICAgICAgICAgc3RfY3RpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMjsKKwlsb25nICAgICAgICAgICAgc3RfYmxrc2l6ZTsKKwlsb25nICAgICAgICAgICAgc3RfYmxvY2tzOworCWxvbmcgICAgICAgICAgICBzdF9wYWQ0WzE0XTsKK307CisKKyNlbmRpZgkvKiBfX01JUFNfXyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0xJTlVYX1NURERFRl9ICisjZGVmaW5lIF9MSU5VWF9TVERERUZfSAorCisjdW5kZWYgTlVMTAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5VTEwgMAorI2Vsc2UKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyNpZm5kZWYgX1NJWkVfVAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKworI3VuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChzaXplX3QpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzkwMzkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC0wLDAgKzEsODkgQEAKKyNpZm5kZWYgX0xJTlVYX1NUUklOR19IXworI2RlZmluZSBfTElOVVhfU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBmb3Igc2l6ZV90ICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIGZvciBOVUxMICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKiBfX19zdHJ0b2s7CitleHRlcm4gY2hhciAqIHN0cnBicmsoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqIHN0cnRvayhjaGFyICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBjaGFyICogc3Ryc2VwKGNoYXIgKiosY29uc3QgY2hhciAqKTsKK2V4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworCisKKy8qCisgKiBJbmNsdWRlIG1hY2hpbmUgc3BlY2lmaWMgaW5saW5lIHJvdXRpbmVzCisgKi8KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ1BZCitleHRlcm4gY2hhciAqIHN0cmNweShjaGFyICosY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ1BZCitleHRlcm4gY2hhciAqIHN0cm5jcHkoY2hhciAqLGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVQKK2V4dGVybiBjaGFyICogc3RyY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ0FUCitleHRlcm4gY2hhciAqIHN0cm5jYXQoY2hhciAqLCBjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ01QCitleHRlcm4gaW50IHN0cmNtcChjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ01QCitleHRlcm4gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWYgMCAvKiBub3QgdXNlZCAtIHdhczogI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOSUNNUCAqLworZXh0ZXJuIGludCBzdHJuaWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDSFIKK2V4dGVybiBjaGFyICogc3RyY2hyKGNvbnN0IGNoYXIgKixpbnQpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlJDSFIKK2V4dGVybiBjaGFyICogc3RycmNocihjb25zdCBjaGFyICosaW50KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTVFIKK2V4dGVybiBjaGFyICogc3Ryc3RyKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkxFTgorZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOTEVOCitleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSRFVQCitleHRlcm4gY2hhciAqIHN0cmR1cChjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNXQUIKK2V4dGVybiBjaGFyICogc3Ryc3dhYihjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUCitleHRlcm4gdm9pZCAqIG1lbXNldCh2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZCitleHRlcm4gdm9pZCAqIG1lbWNweSh2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNTU9WRQorZXh0ZXJuIHZvaWQgKiBtZW1tb3ZlKHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TQ0FOCitleHRlcm4gdm9pZCAqIG1lbXNjYW4odm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNNUAorZXh0ZXJuIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNIUgorZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfU1RSSU5HX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmMTJiOTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMCwwICsxLDE1OCBAQAorI2lmbmRlZiBfTElOVVhfVElNRV9ICisjZGVmaW5lIF9MSU5VWF9USU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX0RFRlVOKGEsYixjKSBhKGMpCisjZGVmaW5lIF9DT05TVCBjb25zdAorI2RlZmluZSBfQU5EICwKKworI2RlZmluZSBfUkVFTlRfT05MWQorCisjZGVmaW5lIFNFQ1NQRVJNSU4JNjBMCisjZGVmaW5lIE1JTlNQRVJIT1VSCTYwTAorI2RlZmluZSBIT1VSU1BFUkRBWQkyNEwKKyNkZWZpbmUgU0VDU1BFUkhPVVIJKFNFQ1NQRVJNSU4gKiBNSU5TUEVSSE9VUikKKyNkZWZpbmUgU0VDU1BFUkRBWQkoU0VDU1BFUkhPVVIgKiBIT1VSU1BFUkRBWSkKKyNkZWZpbmUgREFZU1BFUldFRUsJNworI2RlZmluZSBNT05TUEVSWUVBUgkxMgorCisjZGVmaW5lIFlFQVJfQkFTRQkxOTAwCisjZGVmaW5lIEVQT0NIX1lFQVIgICAgICAxOTcwCisjZGVmaW5lIEVQT0NIX1dEQVkgICAgICA0CisKKyNkZWZpbmUgaXNsZWFwKHkpICgoKCh5KSAlIDQpID09IDAgJiYgKCh5KSAlIDEwMCkgIT0gMCkgfHwgKCh5KSAlIDQwMCkgPT0gMCkKKworCisvKiBVc2VkIGJ5IG90aGVyIHRpbWUgZnVuY3Rpb25zLiAgKi8KK3N0cnVjdCB0bSB7CisgICAgaW50IHRtX3NlYzsgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kcy4gICAgIFswLTYwXSAoMSBsZWFwIHNlY29uZCkgKi8KKyAgICBpbnQgdG1fbWluOyAgICAgICAgICAgICAgICAgICAvKiBNaW51dGVzLiAgICAgWzAtNTldICovCisgICAgaW50IHRtX2hvdXI7ICAgICAgICAgICAgICAgICAgLyogSG91cnMuICAgICAgIFswLTIzXSAqLworICAgIGludCB0bV9tZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheS4gICAgICAgICBbMS0zMV0gKi8KKyAgICBpbnQgdG1fbW9uOyAgICAgICAgICAgICAgICAgICAvKiBNb250aC4gICAgICAgWzAtMTFdICovCisgICAgaW50IHRtX3llYXI7ICAgICAgICAgICAgICAgICAgLyogWWVhciAtIDE5MDAuICAqLworICAgIGludCB0bV93ZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheSBvZiB3ZWVrLiBbMC02XSAqLworICAgIGludCB0bV95ZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheXMgaW4geWVhci5bMC0zNjVdICovCisgICAgaW50IHRtX2lzZHN0OyAgICAgICAgICAgICAgICAgLyogRFNULiAgICAgICAgIFstMS8wLzFdKi8KKworIyBpZmRlZiBfX1VTRV9CU0QKKyAgICBsb25nIGludCB0bV9nbXRvZmY7ICAgICAgICAgICAvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgICBfX2NvbnN0IGNoYXIgKnRtX3pvbmU7ICAgICAgICAvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworIyBlbHNlCisgICAgbG9uZyBpbnQgX190bV9nbXRvZmY7ICAgICAgICAgLyogU2Vjb25kcyBlYXN0IG9mIFVUQy4gICovCisgICAgX19jb25zdCBjaGFyICpfX3RtX3pvbmU7ICAgICAgLyogVGltZXpvbmUgYWJicmV2aWF0aW9uLiAgKi8KKyMgZW5kaWYKK307CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitfREVGVU4gKGFzY3RpbWVfciwgKHRpbV9wLCByZXN1bHQpLAorCV9DT05TVCBzdHJ1Y3QgdG0gKnRpbV9wIF9BTkQKKwljaGFyICpyZXN1bHQpCit7CisgICAgc3RhdGljIF9DT05TVCBjaGFyIGRheV9uYW1lWzddWzNdID0geworCSJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiCisgICAgfTsKKyAgICBzdGF0aWMgX0NPTlNUIGNoYXIgbW9uX25hbWVbMTJdWzNdID0geworCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgorICAgIH07CisKKyAgICBzcHJpbnRmIChyZXN1bHQsICIlLjNzICUuM3MgJS4yZCAlLjJkOiUuMmQ6JS4yZCAlZFxuIiwKKwkgICAgZGF5X25hbWVbdGltX3AtPnRtX3dkYXldLAorCSAgICBtb25fbmFtZVt0aW1fcC0+dG1fbW9uXSwKKwkgICAgdGltX3AtPnRtX21kYXksIHRpbV9wLT50bV9ob3VyLCB0aW1fcC0+dG1fbWluLAorCSAgICB0aW1fcC0+dG1fc2VjLCAxOTAwICsgdGltX3AtPnRtX3llYXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRtICoKK19ERUZVTiAobG9jYWx0aW1lX3IsICh0aW1fcCwgcmVzKSwKKwlfQ09OU1QgdGltZV90ICogdGltX3AgX0FORAorCXN0cnVjdCB0bSAqcmVzKQoreworICAgIHN0YXRpYyBfQ09OU1QgaW50IG1vbl9sZW5ndGhzWzJdW01PTlNQRVJZRUFSXSA9IHsKKyAgICAgIHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfSwKKyAgICAgIHszMSwgMjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfQorICAgIH0gOworCisgICAgc3RhdGljIF9DT05TVCBpbnQgeWVhcl9sZW5ndGhzWzJdID0geworICAgICAgMzY1LAorICAgICAgMzY2CisgICAgfSA7CisKKyAgICBsb25nIGRheXMsIHJlbTsKKyAgICBpbnQgeTsKKyAgICBpbnQgeWxlYXA7CisgICAgX0NPTlNUIGludCAqaXA7CisKKyAgICBkYXlzID0gKChsb25nKSAqdGltX3ApIC8gU0VDU1BFUkRBWTsKKyAgICByZW0gPSAoKGxvbmcpICp0aW1fcCkgJSBTRUNTUEVSREFZOworICAgIHdoaWxlIChyZW0gPCAwKQorICAgIHsKKwlyZW0gKz0gU0VDU1BFUkRBWTsKKwktLWRheXM7CisgICAgfQorICAgIHdoaWxlIChyZW0gPj0gU0VDU1BFUkRBWSkKKyAgICB7CisJcmVtIC09IFNFQ1NQRVJEQVk7CisJKytkYXlzOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgaG91ciwgbWluLCBhbmQgc2VjICovCisgICAgcmVzLT50bV9ob3VyID0gKGludCkgKHJlbSAvIFNFQ1NQRVJIT1VSKTsKKyAgICByZW0gJT0gU0VDU1BFUkhPVVI7CisgICAgcmVzLT50bV9taW4gPSAoaW50KSAocmVtIC8gU0VDU1BFUk1JTik7CisgICAgcmVzLT50bV9zZWMgPSAoaW50KSAocmVtICUgU0VDU1BFUk1JTik7CisKKyAgICAvKiBjb21wdXRlIGRheSBvZiB3ZWVrICovCisgICAgaWYgKChyZXMtPnRtX3dkYXkgPSAoKEVQT0NIX1dEQVkgKyBkYXlzKSAlIERBWVNQRVJXRUVLKSkgPCAwKQorCXJlcy0+dG1fd2RheSArPSBEQVlTUEVSV0VFSzsKKworICAgIC8qIGNvbXB1dGUgeWVhciAmIGRheSBvZiB5ZWFyICovCisgICAgeSA9IEVQT0NIX1lFQVI7CisgICAgaWYgKGRheXMgPj0gMCkKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIHlsZWFwID0gaXNsZWFwKHkpOworCSAgICBpZiAoZGF5cyA8IHllYXJfbGVuZ3Roc1t5bGVhcF0pCisJCWJyZWFrOworCSAgICB5Kys7CisJICAgIGRheXMgLT0geWVhcl9sZW5ndGhzW3lsZWFwXTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZG8KKwl7CisJICAgIC0teTsKKwkgICAgeWxlYXAgPSBpc2xlYXAoeSk7CisJICAgIGRheXMgKz0geWVhcl9sZW5ndGhzW3lsZWFwXTsKKwl9IHdoaWxlIChkYXlzIDwgMCk7CisgICAgfQorCisgICAgcmVzLT50bV95ZWFyID0geSAtIFlFQVJfQkFTRTsKKyAgICByZXMtPnRtX3lkYXkgPSBkYXlzOworICAgIGlwID0gbW9uX2xlbmd0aHNbeWxlYXBdOworICAgIGZvciAocmVzLT50bV9tb24gPSAwOyBkYXlzID49IGlwW3Jlcy0+dG1fbW9uXTsgKytyZXMtPnRtX21vbikKKwlkYXlzIC09IGlwW3Jlcy0+dG1fbW9uXTsKKyAgICByZXMtPnRtX21kYXkgPSBkYXlzICsgMTsKKworICAgIC8qIHNldCBkYXlsaWdodCBzYXZpbmcgdGltZSBmbGFnICovCisgICAgcmVzLT50bV9pc2RzdCA9IC0xOworCisgICAgcmV0dXJuIChyZXMpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorX0RFRlVOIChjdGltZV9yLCAodGltX3AsIHJlc3VsdCksCisJX0NPTlNUIHRpbWVfdCAqIHRpbV9wIF9BTkQKKwljaGFyICogcmVzdWx0KQorCit7CisgICAgc3RydWN0IHRtIHRtOworICAgIHJldHVybiBhc2N0aW1lX3IgKGxvY2FsdGltZV9yICh0aW1fcCwgJnRtKSwgcmVzdWx0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ODA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfVFlQRVNfSAorCisjaWZkZWYJX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZuZGVmIF9fS0VSTkVMX1NUUklDVF9OQU1FUworCit0eXBlZGVmIF9fa2VybmVsX2ZkX3NldAkJZmRfc2V0OwordHlwZWRlZiBfX2tlcm5lbF9kZXZfdAkJZGV2X3Q7Cit0eXBlZGVmIF9fa2VybmVsX2lub190CQlpbm9fdDsKK3R5cGVkZWYgX19rZXJuZWxfbW9kZV90CQltb2RlX3Q7Cit0eXBlZGVmIF9fa2VybmVsX25saW5rX3QJbmxpbmtfdDsKK3R5cGVkZWYgX19rZXJuZWxfb2ZmX3QJCW9mZl90OwordHlwZWRlZiBfX2tlcm5lbF9waWRfdAkJcGlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2RhZGRyX3QJZGFkZHJfdDsKK3R5cGVkZWYgX19rZXJuZWxfa2V5X3QJCWtleV90OwordHlwZWRlZiBfX2tlcm5lbF9zdXNlY29uZHNfdAlzdXNlY29uZHNfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgX19rZXJuZWxfdWlkMzJfdAl1aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkMzJfdAlnaWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkMTZfdCAgICAgICAgdWlkMTZfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkMTZfdCAgICAgICAgZ2lkMTZfdDsKKworI2lmZGVmIENPTkZJR19VSUQxNgorLyogVGhpcyBpcyBkZWZpbmVkIGJ5IGluY2x1ZGUvYXNtLXthcmNofS9wb3NpeF90eXBlcy5oICovCit0eXBlZGVmIF9fa2VybmVsX29sZF91aWRfdAlvbGRfdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX29sZF9naWRfdAlvbGRfZ2lkX3Q7CisjZW5kaWYgLyogQ09ORklHX1VJRDE2ICovCisKKy8qIGxpYmM1IGluY2x1ZGVzIHRoaXMgZmlsZSB0byBkZWZpbmUgdWlkX3QsIHRodXMgdWlkX3QgY2FuIG5ldmVyIGNoYW5nZQorICogd2hlbiBpdCBpcyBpbmNsdWRlZCBieSBub24ta2VybmVsIGNvZGUKKyAqLworI2Vsc2UKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QJCXVpZF90OwordHlwZWRlZiBfX2tlcm5lbF9naWRfdAkJZ2lkX3Q7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZiBfX2tlcm5lbF9sb2ZmX3QJCWxvZmZfdDsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBpZmRlZnMgZm9yCisgKiBoaXN0b3JpY2FsIHJlYXNvbnM6CisgKi8KKyNpZm5kZWYgX1NJWkVfVAorI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIF9fa2VybmVsX3NpemVfdAkJc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1NTSVpFX1QKKyNkZWZpbmUgX1NTSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc3NpemVfdAlzc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1BUUkRJRkZfVAorI2RlZmluZSBfUFRSRElGRl9UCit0eXBlZGVmIF9fa2VybmVsX3B0cmRpZmZfdAlwdHJkaWZmX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVElNRV9UCisjZGVmaW5lIF9USU1FX1QKK3R5cGVkZWYgX19rZXJuZWxfdGltZV90CQl0aW1lX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0xPQ0tfVAorI2RlZmluZSBfQ0xPQ0tfVAordHlwZWRlZiBfX2tlcm5lbF9jbG9ja190CWNsb2NrX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0FERFJfVAorI2RlZmluZSBfQ0FERFJfVAordHlwZWRlZiBfX2tlcm5lbF9jYWRkcl90CWNhZGRyX3Q7CisjZW5kaWYKKworLyogYnNkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCXVfbG9uZzsKKworLyogc3lzdiAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1bmNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdWxvbmc7CisKKyNpZm5kZWYgX19CSVRfVFlQRVNfREVGSU5FRF9fCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXworCit0eXBlZGVmCQlfX3U4CQl1X2ludDhfdDsKK3R5cGVkZWYJCV9fczgJCWludDhfdDsKK3R5cGVkZWYJCV9fdTE2CQl1X2ludDE2X3Q7Cit0eXBlZGVmCQlfX3MxNgkJaW50MTZfdDsKK3R5cGVkZWYJCV9fdTMyCQl1X2ludDMyX3Q7Cit0eXBlZGVmCQlfX3MzMgkJaW50MzJfdDsKKworI2VuZGlmIC8qICEoX19CSVRfVFlQRVNfREVGSU5FRF9fKSAqLworCit0eXBlZGVmCQlfX3U4CQl1aW50OF90OwordHlwZWRlZgkJX191MTYJCXVpbnQxNl90OwordHlwZWRlZgkJX191MzIJCXVpbnQzMl90OworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZgkJX191NjQJCXVpbnQ2NF90OwordHlwZWRlZgkJX191NjQJCXVfaW50NjRfdDsKK3R5cGVkZWYJCV9fczY0CQlpbnQ2NF90OworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgKi8KKworLyoKKyAqIEJlbG93IGFyZSB0cnVseSBMaW51eC1zcGVjaWZpYyB0eXBlcyB0aGF0IHNob3VsZCBuZXZlciBjb2xsaWRlIHdpdGgKKyAqIGFueSBhcHBsaWNhdGlvbi9saWJyYXJ5IHRoYXQgd2FudHMgbGludXgvdHlwZXMuaC4KKyAqLworCitzdHJ1Y3QgdXN0YXQgeworCV9fa2VybmVsX2RhZGRyX3QJZl90ZnJlZTsKKwlfX2tlcm5lbF9pbm9fdAkJZl90aW5vZGU7CisJY2hhcgkJCWZfZm5hbWVbNl07CisJY2hhcgkJCWZfZnBhY2tbNl07Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmggYi94LWxvYWRlci9pbmNsdWRlL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTU0YjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL21hbGxvYy5oCkBAIC0wLDAgKzEsOTQyIEBACisvKgorICBBIHZlcnNpb24gb2YgbWFsbG9jL2ZyZWUvcmVhbGxvYyB3cml0dGVuIGJ5IERvdWcgTGVhIGFuZCByZWxlYXNlZCB0byB0aGUKKyAgcHVibGljIGRvbWFpbi4gIFNlbmQgcXVlc3Rpb25zL2NvbW1lbnRzL2NvbXBsYWludHMvcGVyZm9ybWFuY2UgZGF0YQorICB0byBkbEBjcy5vc3dlZ28uZWR1CisKKyogVkVSU0lPTiAyLjYuNiAgU3VuIE1hciAgNSAxOToxMDowMyAyMDAwICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKworICAgTm90ZTogVGhlcmUgbWF5IGJlIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hbGxvYyBvYnRhaW5hYmxlIGF0CisJICAgZnRwOi8vZy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy5jCisJIENoZWNrIGJlZm9yZSBpbnN0YWxsaW5nIQorCisqIFdoeSB1c2UgdGhpcyBtYWxsb2M/CisKKyAgVGhpcyBpcyBub3QgdGhlIGZhc3Rlc3QsIG1vc3Qgc3BhY2UtY29uc2VydmluZywgbW9zdCBwb3J0YWJsZSwgb3IKKyAgbW9zdCB0dW5hYmxlIG1hbGxvYyBldmVyIHdyaXR0ZW4uIEhvd2V2ZXIgaXQgaXMgYW1vbmcgdGhlIGZhc3Rlc3QKKyAgd2hpbGUgYWxzbyBiZWluZyBhbW9uZyB0aGUgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBwb3J0YWJsZSBhbmQgdHVuYWJsZS4KKyAgQ29uc2lzdGVudCBiYWxhbmNlIGFjcm9zcyB0aGVzZSBmYWN0b3JzIHJlc3VsdHMgaW4gYSBnb29kIGdlbmVyYWwtcHVycG9zZQorICBhbGxvY2F0b3IuIEZvciBhIGhpZ2gtbGV2ZWwgZGVzY3JpcHRpb24sIHNlZQorICAgICBodHRwOi8vZy5vc3dlZ28uZWR1L2RsL2h0bWwvbWFsbG9jLmh0bWwKKworKiBTeW5vcHNpcyBvZiBwdWJsaWMgcm91dGluZXMKKworICAoTXVjaCBmdWxsZXIgZGVzY3JpcHRpb25zIGFyZSBjb250YWluZWQgaW4gdGhlIHByb2dyYW0gZG9jdW1lbnRhdGlvbiBiZWxvdy4pCisKKyAgbWFsbG9jKHNpemVfdCBuKTsKKyAgICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBhdCBsZWFzdCBuIGJ5dGVzLCBvciBudWxsCisgICAgIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZS4KKyAgZnJlZShWb2lkX3QqIHApOworICAgICBSZWxlYXNlIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCBvciBubyBlZmZlY3QgaWYgcCBpcyBudWxsLgorICByZWFsbG9jKFZvaWRfdCogcCwgc2l6ZV90IG4pOworICAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgY2h1bmsgb2Ygc2l6ZSBuIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgZGF0YQorICAgICBhcyBkb2VzIGNodW5rIHAgdXAgdG8gdGhlIG1pbmltdW0gb2YgKG4sIHAncyBzaXplKSBieXRlcywgb3IgbnVsbAorICAgICBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUuIFRoZSByZXR1cm5lZCBwb2ludGVyIG1heSBvciBtYXkgbm90IGJlCisgICAgIHRoZSBzYW1lIGFzIHAuIElmIHAgaXMgbnVsbCwgZXF1aXZhbGVudCB0byBtYWxsb2MuICBVbmxlc3MgdGhlCisgICAgICNkZWZpbmUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIGJlbG93IGlzIHNldCwgcmVhbGxvYyB3aXRoIGEKKyAgICAgc2l6ZSBhcmd1bWVudCBvZiB6ZXJvIChyZSlhbGxvY2F0ZXMgYSBtaW5pbXVtLXNpemVkIGNodW5rLgorICBtZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgbik7CisgICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY2h1bmsgb2YgbiBieXRlcywgYWxpZ25lZAorICAgICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgcG93ZXIgb2YKKyAgICAgdHdvLgorICB2YWxsb2Moc2l6ZV90IG4pOworICAgICBFcXVpdmFsZW50IHRvIG1lbWFsaWduKHBhZ2VzaXplLCBuKSwgd2hlcmUgcGFnZXNpemUgaXMgdGhlIHBhZ2UKKyAgICAgc2l6ZSBvZiB0aGUgc3lzdGVtIChvciBhcyBuZWFyIHRvIHRoaXMgYXMgY2FuIGJlIGZpZ3VyZWQgb3V0IGZyb20KKyAgICAgYWxsIHRoZSBpbmNsdWRlcy9kZWZpbmVzIGJlbG93LikKKyAgcHZhbGxvYyhzaXplX3Qgbik7CisgICAgIEVxdWl2YWxlbnQgdG8gdmFsbG9jKG1pbmltdW0tcGFnZS10aGF0LWhvbGRzKG4pKSwgdGhhdCBpcywKKyAgICAgcm91bmQgdXAgbiB0byBuZWFyZXN0IHBhZ2VzaXplLgorICBjYWxsb2Moc2l6ZV90IHVuaXQsIHNpemVfdCBxdWFudGl0eSk7CisgICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHF1YW50aXR5ICogdW5pdCBieXRlcywgd2l0aCBhbGwgbG9jYXRpb25zCisgICAgIHNldCB0byB6ZXJvLgorICBjZnJlZShWb2lkX3QqIHApOworICAgICBFcXVpdmFsZW50IHRvIGZyZWUocCkuCisgIG1hbGxvY190cmltKHNpemVfdCBwYWQpOworICAgICBSZWxlYXNlIGFsbCBidXQgcGFkIGJ5dGVzIG9mIGZyZWVkIHRvcC1tb3N0IG1lbW9yeSBiYWNrCisgICAgIHRvIHRoZSBzeXN0ZW0uIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgMC4KKyAgbWFsbG9jX3VzYWJsZV9zaXplKFZvaWRfdCogcCk7CisgICAgIFJlcG9ydCB0aGUgbnVtYmVyIHVzYWJsZSBhbGxvY2F0ZWQgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRlZAorICAgICBjaHVuayBwLiBUaGlzIG1heSBvciBtYXkgbm90IHJlcG9ydCBtb3JlIGJ5dGVzIHRoYW4gd2VyZSByZXF1ZXN0ZWQsCisgICAgIGR1ZSB0byBhbGlnbm1lbnQgYW5kIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50cy4KKyAgbWFsbG9jX3N0YXRzKCk7CisgICAgIFByaW50cyBicmllZiBzdW1tYXJ5IHN0YXRpc3RpY3Mgb24gc3RkZXJyLgorICBtYWxsaW5mbygpCisgICAgIFJldHVybnMgKGJ5IGNvcHkpIGEgc3RydWN0IGNvbnRhaW5pbmcgdmFyaW91cyBzdW1tYXJ5IHN0YXRpc3RpY3MuCisgIG1hbGxvcHQoaW50IHBhcmFtZXRlcl9udW1iZXIsIGludCBwYXJhbWV0ZXJfdmFsdWUpCisgICAgIENoYW5nZXMgb25lIG9mIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGJlbG93LiBSZXR1cm5zCisgICAgIDEgaWYgc3VjY2Vzc2Z1bCBpbiBjaGFuZ2luZyB0aGUgcGFyYW1ldGVyLCBlbHNlIDAuCisKKyogVml0YWwgc3RhdGlzdGljczoKKworICBBbGlnbm1lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYnl0ZQorICAgICAgIDggYnl0ZSBhbGlnbm1lbnQgaXMgY3VycmVudGx5IGhhcmR3aXJlZCBpbnRvIHRoZSBkZXNpZ24uICBUaGlzCisgICAgICAgc2VlbXMgdG8gc3VmZmljZSBmb3IgYWxsIGN1cnJlbnQgbWFjaGluZXMgYW5kIEMgY29tcGlsZXJzLgorCisgIEFzc3VtZWQgcG9pbnRlciByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCisgICAgICAgQ29kZSBmb3IgOC1ieXRlIHBvaW50ZXJzIGlzIHVudGVzdGVkIGJ5IG1lIGJ1dCBoYXMgd29ya2VkCisgICAgICAgcmVsaWFibHkgYnkgV29sZnJhbSBHbG9nZXIsIHdobyBjb250cmlidXRlZCBtb3N0IG9mIHRoZQorICAgICAgIGNoYW5nZXMgc3VwcG9ydGluZyB0aGlzLgorCisgIEFzc3VtZWQgc2l6ZV90ICByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCisgICAgICAgTm90ZSB0aGF0IHNpemVfdCBpcyBhbGxvd2VkIHRvIGJlIDQgYnl0ZXMgZXZlbiBpZiBwb2ludGVycyBhcmUgOC4KKworICBNaW5pbXVtIG92ZXJoZWFkIHBlciBhbGxvY2F0ZWQgY2h1bms6IDQgb3IgOCBieXRlcworICAgICAgIEVhY2ggbWFsbG9jZWQgY2h1bmsgaGFzIGEgaGlkZGVuIG92ZXJoZWFkIG9mIDQgYnl0ZXMgaG9sZGluZyBzaXplCisgICAgICAgYW5kIHN0YXR1cyBpbmZvcm1hdGlvbi4KKworICBNaW5pbXVtIGFsbG9jYXRlZCBzaXplOiA0LWJ5dGUgcHRyczogIDE2IGJ5dGVzICAgIChpbmNsdWRpbmcgNCBvdmVyaGVhZCkKKwkJCSAgOC1ieXRlIHB0cnM6ICAyNC8zMiBieXRlcyAoaW5jbHVkaW5nLCA0Lzggb3ZlcmhlYWQpCisKKyAgICAgICBXaGVuIGEgY2h1bmsgaXMgZnJlZWQsIDEyIChmb3IgNGJ5dGUgcHRycykgb3IgMjAgKGZvciA4IGJ5dGUKKyAgICAgICBwdHJzIGJ1dCA0IGJ5dGUgc2l6ZSkgb3IgMjQgKGZvciA4LzgpIGFkZGl0aW9uYWwgYnl0ZXMgYXJlCisgICAgICAgbmVlZGVkOyA0ICg4KSBmb3IgYSB0cmFpbGluZyBzaXplIGZpZWxkCisgICAgICAgYW5kIDggKDE2KSBieXRlcyBmb3IgZnJlZSBsaXN0IHBvaW50ZXJzLiBUaHVzLCB0aGUgbWluaW11bQorICAgICAgIGFsbG9jYXRhYmxlIHNpemUgaXMgMTYvMjQvMzIgYnl0ZXMuCisKKyAgICAgICBFdmVuIGEgcmVxdWVzdCBmb3IgemVybyBieXRlcyAoaS5lLiwgbWFsbG9jKDApKSByZXR1cm5zIGEKKyAgICAgICBwb2ludGVyIHRvIHNvbWV0aGluZyBvZiB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplLgorCisgIE1heGltdW0gYWxsb2NhdGVkIHNpemU6IDQtYnl0ZSBzaXplX3Q6IDJeMzEgLSAgOCBieXRlcworCQkJICA4LWJ5dGUgc2l6ZV90OiAyXjYzIC0gMTYgYnl0ZXMKKworICAgICAgIEl0IGlzIGFzc3VtZWQgdGhhdCAocG9zc2libHkgc2lnbmVkKSBzaXplX3QgYml0IHZhbHVlcyBzdWZmaWNlIHRvCisgICAgICAgcmVwcmVzZW50IGNodW5rIHNpemVzLiBgUG9zc2libHkgc2lnbmVkJyBpcyBkdWUgdG8gdGhlIGZhY3QKKyAgICAgICB0aGF0IGBzaXplX3QnIG1heSBiZSBkZWZpbmVkIG9uIGEgc3lzdGVtIGFzIGVpdGhlciBhIHNpZ25lZCBvcgorICAgICAgIGFuIHVuc2lnbmVkIHR5cGUuIFRvIGJlIGNvbnNlcnZhdGl2ZSwgdmFsdWVzIHRoYXQgd291bGQgYXBwZWFyCisgICAgICAgYXMgbmVnYXRpdmUgbnVtYmVycyBhcmUgYXZvaWRlZC4KKyAgICAgICBSZXF1ZXN0cyBmb3Igc2l6ZXMgd2l0aCBhIG5lZ2F0aXZlIHNpZ24gYml0IHdoZW4gdGhlIHJlcXVlc3QKKyAgICAgICBzaXplIGlzIHRyZWFkZWQgYXMgYSBsb25nIHdpbGwgcmV0dXJuIG51bGwuCisKKyAgTWF4aW11bSBvdmVyaGVhZCB3YXN0YWdlIHBlciBhbGxvY2F0ZWQgY2h1bms6IG5vcm1hbGx5IDE1IGJ5dGVzCisKKyAgICAgICBBbGlnbm5tZW50IGRlbWFuZHMsIHBsdXMgdGhlIG1pbmltdW0gYWxsb2NhdGFibGUgc2l6ZSByZXN0cmljdGlvbgorICAgICAgIG1ha2UgdGhlIG5vcm1hbCB3b3JzdC1jYXNlIHdhc3RhZ2UgMTUgYnl0ZXMgKGkuZS4sIHVwIHRvIDE1CisgICAgICAgbW9yZSBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCB0aGFuIHdlcmUgcmVxdWVzdGVkIGluIG1hbGxvYyksIHdpdGgKKyAgICAgICB0d28gZXhjZXB0aW9uczoKKwkgMS4gQmVjYXVzZSByZXF1ZXN0cyBmb3IgemVybyBieXRlcyBhbGxvY2F0ZSBub24temVybyBzcGFjZSwKKwkgICAgdGhlIHdvcnN0IGNhc2Ugd2FzdGFnZSBmb3IgYSByZXF1ZXN0IG9mIHplcm8gYnl0ZXMgaXMgMjQgYnl0ZXMuCisJIDIuIEZvciByZXF1ZXN0cyA+PSBtbWFwX3RocmVzaG9sZCB0aGF0IGFyZSBzZXJ2aWNlZCB2aWEKKwkgICAgbW1hcCgpLCB0aGUgd29yc3QgY2FzZSB3YXN0YWdlIGlzIDggYnl0ZXMgcGx1cyB0aGUgcmVtYWluZGVyCisJICAgIGZyb20gYSBzeXN0ZW0gcGFnZSAodGhlIG1pbmltYWwgbW1hcCB1bml0KTsgdHlwaWNhbGx5IDQwOTYgYnl0ZXMuCisKKyogTGltaXRhdGlvbnMKKworICAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcmUgTk9UIGN1cnJlbnRseSBzdXBwb3J0ZWQKKworICAgICogTm8gdXNlci1kZWZpbmFibGUgaG9va3MgZm9yIGNhbGxiYWNrcyBhbmQgdGhlIGxpa2UuCisgICAgKiBObyBhdXRvbWF0ZWQgbWVjaGFuaXNtIGZvciBmdWxseSBjaGVja2luZyB0aGF0IGFsbCBhY2Nlc3NlcworICAgICAgdG8gbWFsbG9jZWQgbWVtb3J5IHN0YXkgd2l0aGluIHRoZWlyIGJvdW5kcy4KKyAgICAqIE5vIHN1cHBvcnQgZm9yIGNvbXBhY3Rpb24uCisKKyogU3lub3BzaXMgb2YgY29tcGlsZS10aW1lIG9wdGlvbnM6CisKKyAgICBQZW9wbGUgaGF2ZSByZXBvcnRlZCB1c2luZyBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIG1hbGxvYyBvbiBhbGwKKyAgICB2ZXJzaW9ucyBvZiBVbml4LCBzb21ldGltZXMgYnkgdHdlYWtpbmcgc29tZSBvZiB0aGUgZGVmaW5lcworICAgIGJlbG93LiBJdCBoYXMgYmVlbiB0ZXN0ZWQgbW9zdCBleHRlbnNpdmVseSBvbiBTb2xhcmlzIGFuZAorICAgIExpbnV4LiBJdCBpcyBhbHNvIHJlcG9ydGVkIHRvIHdvcmsgb24gV0lOMzIgcGxhdGZvcm1zLgorICAgIFBlb3BsZSBoYXZlIGFsc28gcmVwb3J0ZWQgYWRhcHRpbmcgdGhpcyBtYWxsb2MgZm9yIHVzZSBpbgorICAgIHN0YW5kLWFsb25lIGVtYmVkZGVkIHN5c3RlbXMuCisKKyAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW4gc3RyYWlnaHQsIGhhbmQtdHVuZWQgQU5TSSBDLiAgQW1vbmcgb3RoZXIKKyAgICBjb25zZXF1ZW5jZXMsIGl0IHVzZXMgYSBsb3Qgb2YgbWFjcm9zLiAgQmVjYXVzZSBvZiB0aGlzLCB0byBiZSBhdAorICAgIGFsbCB1c2FibGUsIHRoaXMgY29kZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgYW4gb3B0aW1pemluZyBjb21waWxlcgorICAgIChmb3IgZXhhbXBsZSBnY2MgLU8yKSB0aGF0IGNhbiBzaW1wbGlmeSBleHByZXNzaW9ucyBhbmQgY29udHJvbAorICAgIHBhdGhzLgorCisgIF9fU1REX0MgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIEMgY29tcGlsZXIgZGVmaW5lcykKKyAgICAgTm9uemVybyBpZiB1c2luZyBBTlNJLXN0YW5kYXJkIEMgY29tcGlsZXIsIGEgQysrIGNvbXBpbGVyLCBvcgorICAgICBhIEMgY29tcGlsZXIgc3VmZmljaWVudGx5IGNsb3NlIHRvIEFOU0kgdG8gZ2V0IGF3YXkgd2l0aCBpdC4KKyAgREVCVUcgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgRGVmaW5lIHRvIGVuYWJsZSBkZWJ1Z2dpbmcuIEFkZHMgZmFpcmx5IGV4dGVuc2l2ZSBhc3NlcnRpb24tYmFzZWQKKyAgICAgY2hlY2tpbmcgdG8gaGVscCB0cmFjayBkb3duIG1lbW9yeSBlcnJvcnMsIGJ1dCBub3RpY2VhYmx5IHNsb3dzIGRvd24KKyAgICAgZXhlY3V0aW9uLgorICBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBEZWZpbmUgdGhpcyBpZiB5b3UgdGhpbmsgdGhhdCByZWFsbG9jKHAsIDApIHNob3VsZCBiZSBlcXVpdmFsZW50CisgICAgIHRvIGZyZWUocCkuIE90aGVyd2lzZSwgc2luY2UgbWFsbG9jIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IKKyAgICAgbWFsbG9jKDApLCBzbyBkb2VzIHJlYWxsb2MocCwgMCkuCisgIEhBVkVfTUVNQ1BZICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQpCisgICAgIERlZmluZSBpZiB5b3UgYXJlIG5vdCBvdGhlcndpc2UgdXNpbmcgQU5TSSBTVEQgQywgYnV0IHN0aWxsCisgICAgIGhhdmUgbWVtY3B5IGFuZCBtZW1zZXQgaW4geW91ciBDIGxpYnJhcnkgYW5kIHdhbnQgdG8gdXNlIHRoZW0uCisgICAgIE90aGVyd2lzZSwgc2ltcGxlIGludGVybmFsIHZlcnNpb25zIGFyZSBzdXBwbGllZC4KKyAgVVNFX01FTUNQWSAgICAgICAgICAgICAgIChkZWZhdWx0OiAxIGlmIEhBVkVfTUVNQ1BZIGlzIGRlZmluZWQsIDAgb3RoZXJ3aXNlKQorICAgICBEZWZpbmUgYXMgMSBpZiB5b3Ugd2FudCB0aGUgQyBsaWJyYXJ5IHZlcnNpb25zIG9mIG1lbXNldCBhbmQKKyAgICAgbWVtY3B5IGNhbGxlZCBpbiByZWFsbG9jIGFuZCBjYWxsb2MgKG90aGVyd2lzZSBtYWNybyB2ZXJzaW9ucyBhcmUgdXNlZCkuCisgICAgIEF0IGxlYXN0IG9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgc2ltcGxlIG1hY3JvIHZlcnNpb25zIHVzdWFsbHkKKyAgICAgb3V0cGVyZm9ybSBsaWJjIHZlcnNpb25zLgorICBIQVZFX01NQVAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZWZpbmVkIGFzIDEpCisgICAgIERlZmluZSB0byBub24temVybyB0byBvcHRpb25hbGx5IG1ha2UgbWFsbG9jKCkgdXNlIG1tYXAoKSB0bworICAgICBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4KKyAgSEFWRV9NUkVNQVAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZWZpbmVkIGFzIDAgdW5sZXNzIExpbnV4IGxpYmMgc2V0KQorICAgICBEZWZpbmUgdG8gbm9uLXplcm8gdG8gb3B0aW9uYWxseSBtYWtlIHJlYWxsb2MoKSB1c2UgbXJlbWFwKCkgdG8KKyAgICAgcmVhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4KKyAgbWFsbG9jX2dldHBhZ2VzaXplICAgICAgICAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIHN5c3RlbSAjaW5jbHVkZXMpCisgICAgIEVpdGhlciBhIGNvbnN0YW50IG9yIHJvdXRpbmUgY2FsbCByZXR1cm5pbmcgdGhlIHN5c3RlbSBwYWdlIHNpemUuCisgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBPcHRpb25hbGx5IGRlZmluZSBpZiB5b3UgYXJlIG9uIGEgc3lzdGVtIHdpdGggYSAvdXNyL2luY2x1ZGUvbWFsbG9jLmgKKyAgICAgdGhhdCBkZWNsYXJlcyBzdHJ1Y3QgbWFsbGluZm8uIEl0IGlzIG5vdCBhdCBhbGwgbmVjZXNzYXJ5IHRvCisgICAgIGRlZmluZSB0aGlzIGV2ZW4gaWYgeW91IGRvLCBidXQgd2lsbCBlbnN1cmUgY29uc2lzdGVuY3kuCisgIElOVEVSTkFMX1NJWkVfVCAgICAgICAgICAgKGRlZmF1bHQ6IHNpemVfdCkKKyAgICAgRGVmaW5lIHRvIGEgMzItYml0IHR5cGUgKHByb2JhYmx5IGB1bnNpZ25lZCBpbnQnKSBpZiB5b3UgYXJlIG9uIGEKKyAgICAgNjQtYml0IG1hY2hpbmUsIHlldCBkbyBub3Qgd2FudCBvciBuZWVkIHRvIGFsbG93IG1hbGxvYyByZXF1ZXN0cyBvZgorICAgICBncmVhdGVyIHRoYW4gMl4zMSB0byBiZSBoYW5kbGVkLiBUaGlzIHNhdmVzIHNwYWNlLCBlc3BlY2lhbGx5IGZvcgorICAgICB2ZXJ5IHNtYWxsIGNodW5rcy4KKyAgSU5URVJOQUxfTElOVVhfQ19MSUIgICAgICAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIERlZmluZWQgb25seSB3aGVuIGNvbXBpbGVkIGFzIHBhcnQgb2YgTGludXggbGliYy4KKyAgICAgQWxzbyBub3RlIHRoYXQgdGhlcmUgaXMgc29tZSBvZGQgaW50ZXJuYWwgbmFtZS1tYW5nbGluZyB2aWEgZGVmaW5lcworICAgICAoZm9yIGV4YW1wbGUsIGludGVybmFsbHksIGBtYWxsb2MnIGlzIG5hbWVkIGBtQUxMT2MnKSBuZWVkZWQKKyAgICAgd2hlbiBjb21waWxpbmcgaW4gdGhpcyBjYXNlLiBUaGVzZSBsb29rIGZ1bm55IGJ1dCBkb24ndCBvdGhlcndpc2UKKyAgICAgYWZmZWN0IGFueXRoaW5nLgorICBXSU4zMiAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQpCisgICAgIERlZmluZSB0aGlzIG9uIE1TIHdpbiAoOTUsIG50KSBwbGF0Zm9ybXMgdG8gY29tcGlsZSBpbiBzYnJrIGVtdWxhdGlvbi4KKyAgTEFDS1NfVU5JU1REX0ggICAgICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkIGlmIG5vdCBXSU4zMikKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIDx1bmlzdGQuaD4uCisgIExBQ0tTX1NZU19QQVJBTV9IICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCBpZiBub3QgV0lOMzIpCisgICAgIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSA8c3lzL3BhcmFtLmg+LgorICBNT1JFQ09SRSAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBzYnJrKQorICAgICBUaGUgbmFtZSBvZiB0aGUgcm91dGluZSB0byBjYWxsIHRvIG9idGFpbiBtb3JlIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uCisgIE1PUkVDT1JFX0ZBSUxVUkUgICAgICAgICAgKGRlZmF1bHQ6IC0xKQorICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgdXBvbiBmYWlsdXJlIG9mIE1PUkVDT1JFLgorICBNT1JFQ09SRV9DTEVBUlMgICAgICAgICAgIChkZWZhdWx0IDEpCisgICAgIFRydWUgKDEpIGlmIHRoZSByb3V0aW5lIG1hcHBlZCB0byBNT1JFQ09SRSB6ZXJvZXMgb3V0IG1lbW9yeSAod2hpY2gKKyAgICAgaG9sZHMgZm9yIHNicmspLgorICBERUZBVUxUX1RSSU1fVEhSRVNIT0xECisgIERFRkFVTFRfVE9QX1BBRAorICBERUZBVUxUX01NQVBfVEhSRVNIT0xECisgIERFRkFVTFRfTU1BUF9NQVgKKyAgICAgRGVmYXVsdCB2YWx1ZXMgb2YgdHVuYWJsZSBwYXJhbWV0ZXJzIChkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93KQorICAgICBjb250cm9sbGluZyBpbnRlcmFjdGlvbiB3aXRoIGhvc3Qgc3lzdGVtIHJvdXRpbmVzIChzYnJrLCBtbWFwLCBldGMpLgorICAgICBUaGVzZSB2YWx1ZXMgbWF5IGFsc28gYmUgY2hhbmdlZCBkeW5hbWljYWxseSB2aWEgbWFsbG9wdCgpLiBUaGUKKyAgICAgcHJlc2V0IGRlZmF1bHRzIGFyZSB0aG9zZSB0aGF0IGdpdmUgYmVzdCBwZXJmb3JtYW5jZSBmb3IgdHlwaWNhbAorICAgICBwcm9ncmFtcy9zeXN0ZW1zLgorICBVU0VfRExfUFJFRklYICAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQpCisgICAgIFByZWZpeCBhbGwgcHVibGljIHJvdXRpbmVzIHdpdGggdGhlIHN0cmluZyAnZGwnLiAgVXNlZnVsIHRvCisgICAgIHF1aWNrbHkgYXZvaWQgcHJvY2VkdXJlIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyBhbmQgbGlua2VyIHN5bWJvbAorICAgICBjb25mbGljdHMgd2l0aCBleGlzdGluZyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKworCisqLworCisMCisKKworLyogUHJlbGltaW5hcmllcyAqLworCisjaWZuZGVmIF9fU1REX0MKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBfX1NURF9DICAgICAxCisjZWxzZQorI2lmIF9fY3BsdXNwbHVzCisjZGVmaW5lIF9fU1REX0MgICAgIDEKKyNlbHNlCisjZGVmaW5lIF9fU1REX0MgICAgIDAKKyNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KKyNlbmRpZiAvKl9fU1REQ19fKi8KKyNlbmRpZiAvKl9fU1REX0MqLworCisjaWZuZGVmIFZvaWRfdAorI2lmIChfX1NURF9DIHx8IGRlZmluZWQoV0lOMzIpKQorI2RlZmluZSBWb2lkX3QgICAgICB2b2lkCisjZWxzZQorI2RlZmluZSBWb2lkX3QgICAgICBjaGFyCisjZW5kaWYKKyNlbmRpZiAvKlZvaWRfdCovCisKKyNpZiBfX1NURF9DCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIGZvciBzaXplX3QgKi8KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYJLyogX19TVERfQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCS8qIG5vdCBmb3IgVS1Cb290ICovCisjaW5jbHVkZSA8c3RkaW8uaD4JLyogbmVlZGVkIGZvciBtYWxsb2Nfc3RhdHMgKi8KKyNlbmRpZgorCisKKy8qCisgIENvbXBpbGUtdGltZSBvcHRpb25zCisqLworCisKKy8qCisgICAgRGVidWdnaW5nOgorCisgICAgQmVjYXVzZSBmcmVlZCBjaHVua3MgbWF5IGJlIG92ZXJ3cml0dGVuIHdpdGggbGluayBmaWVsZHMsIHRoaXMKKyAgICBtYWxsb2Mgd2lsbCBvZnRlbiBkaWUgd2hlbiBmcmVlZCBtZW1vcnkgaXMgb3ZlcndyaXR0ZW4gYnkgdXNlcgorICAgIHByb2dyYW1zLiAgVGhpcyBjYW4gYmUgdmVyeSBlZmZlY3RpdmUgKGFsYmVpdCBpbiBhbiBhbm5veWluZyB3YXkpCisgICAgaW4gaGVscGluZyB0cmFjayBkb3duIGRhbmdsaW5nIHBvaW50ZXJzLgorCisgICAgSWYgeW91IGNvbXBpbGUgd2l0aCAtRERFQlVHLCBhIG51bWJlciBvZiBhc3NlcnRpb24gY2hlY2tzIGFyZQorICAgIGVuYWJsZWQgdGhhdCB3aWxsIGNhdGNoIG1vcmUgbWVtb3J5IGVycm9ycy4gWW91IHByb2JhYmx5IHdvbid0IGJlCisgICAgYWJsZSB0byBtYWtlIG11Y2ggc2Vuc2Ugb2YgdGhlIGFjdHVhbCBhc3NlcnRpb24gZXJyb3JzLCBidXQgdGhleQorICAgIHNob3VsZCBoZWxwIHlvdSBsb2NhdGUgaW5jb3JyZWN0bHkgb3ZlcndyaXR0ZW4gbWVtb3J5LiAgVGhlCisgICAgY2hlY2tpbmcgaXMgZmFpcmx5IGV4dGVuc2l2ZSwgYW5kIHdpbGwgc2xvdyBkb3duIGV4ZWN1dGlvbgorICAgIG5vdGljZWFibHkuIENhbGxpbmcgbWFsbG9jX3N0YXRzIG9yIG1hbGxpbmZvIHdpdGggREVCVUcgc2V0IHdpbGwKKyAgICBhdHRlbXB0IHRvIGNoZWNrIGV2ZXJ5IG5vbi1tbWFwcGVkIGFsbG9jYXRlZCBhbmQgZnJlZSBjaHVuayBpbiB0aGUKKyAgICBjb3Vyc2Ugb2YgY29tcHV0aW5nIHRoZSBzdW1tbWFyaWVzLiAoQnkgbmF0dXJlLCBtbWFwcGVkIHJlZ2lvbnMKKyAgICBjYW5ub3QgYmUgY2hlY2tlZCB2ZXJ5IG11Y2ggYXV0b21hdGljYWxseS4pCisKKyAgICBTZXR0aW5nIERFQlVHIG1heSBhbHNvIGJlIGhlbHBmdWwgaWYgeW91IGFyZSB0cnlpbmcgdG8gbW9kaWZ5CisgICAgdGhpcyBjb2RlLiBUaGUgYXNzZXJ0aW9ucyBpbiB0aGUgY2hlY2sgcm91dGluZXMgc3BlbGwgb3V0IGluIG1vcmUKKyAgICBkZXRhaWwgdGhlIGFzc3VtcHRpb25zIGFuZCBpbnZhcmlhbnRzIHVuZGVybHlpbmcgdGhlIGFsZ29yaXRobXMuCisKKyovCisKKyNpZmRlZiBERUJVRworLyogI2luY2x1ZGUgPGFzc2VydC5oPiAqLworI2RlZmluZSBhc3NlcnQoeCkgKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoeCkgKCh2b2lkKTApCisjZW5kaWYKKworCisvKgorICBJTlRFUk5BTF9TSVpFX1QgaXMgdGhlIHdvcmQtc2l6ZSB1c2VkIGZvciBpbnRlcm5hbCBib29ra2VlcGluZworICBvZiBjaHVuayBzaXplcy4gT24gYSA2NC1iaXQgbWFjaGluZSwgeW91IGNhbiByZWR1Y2UgbWFsbG9jCisgIG92ZXJoZWFkIGJ5IGRlZmluaW5nIElOVEVSTkFMX1NJWkVfVCB0byBiZSBhIDMyIGJpdCBgdW5zaWduZWQgaW50JworICBhdCB0aGUgZXhwZW5zZSBvZiBub3QgYmVpbmcgYWJsZSB0byBoYW5kbGUgcmVxdWVzdHMgZ3JlYXRlciB0aGFuCisgIDJeMzEuIFRoaXMgbGltaXRhdGlvbiBpcyBoYXJkbHkgZXZlciBhIGNvbmNlcm47IHlvdSBhcmUgZW5jb3VyYWdlZAorICB0byBzZXQgdGhpcy4gSG93ZXZlciwgdGhlIGRlZmF1bHQgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyBzaXplX3QuCisqLworCisjaWZuZGVmIElOVEVSTkFMX1NJWkVfVAorI2RlZmluZSBJTlRFUk5BTF9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyoKKyAgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIHNob3VsZCBiZSBzZXQgaWYgYSBjYWxsIHRvCisgIHJlYWxsb2Mgd2l0aCB6ZXJvIGJ5dGVzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBhIGNhbGwgdG8gZnJlZS4KKyAgU29tZSBwZW9wbGUgdGhpbmsgaXQgc2hvdWxkLiBPdGhlcndpc2UsIHNpbmNlIHRoaXMgbWFsbG9jCisgIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IgbWFsbG9jKDApLCBzbyBkb2VzIHJlYWxsb2MocCwgMCkuCisqLworCisKKy8qICAgI2RlZmluZSBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKi8KKworCisvKgorICBXSU4zMiBjYXVzZXMgYW4gZW11bGF0aW9uIG9mIHNicmsgdG8gYmUgY29tcGlsZWQgaW4KKyAgbW1hcC1iYXNlZCBvcHRpb25zIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBXSU4zMi4KKyovCisKKy8qICNkZWZpbmUgV0lOMzIgKi8KKyNpZmRlZiBXSU4zMgorI2RlZmluZSBNT1JFQ09SRSB3c2JyaworI2RlZmluZSBIQVZFX01NQVAgMAorCisjZGVmaW5lIExBQ0tTX1VOSVNURF9ICisjZGVmaW5lIExBQ0tTX1NZU19QQVJBTV9ICisKKy8qCisgIEluY2x1ZGUgJ3dpbmRvd3MuaCcgdG8gZ2V0IHRoZSBuZWNlc3NhcnkgZGVjbGFyYXRpb25zIGZvciB0aGUKKyAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcyB1c2VkIGluIHRoZSAnc2JyaycKKyAgZW11bGF0aW9uLgorCisgIERlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIHNvIHRoYXQgb25seSB0aGUgZXNzZW50aWFsIE1pY3Jvc29mdAorICBWaXN1YWwgQysrIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisqLworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKworLyoKKyAgSEFWRV9NRU1DUFkgc2hvdWxkIGJlIGRlZmluZWQgaWYgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIHVzaW5nCisgIEFOU0kgU1REIEMsIGJ1dCBzdGlsbCBoYXZlIG1lbWNweSBhbmQgbWVtc2V0IGluIHlvdXIgQyBsaWJyYXJ5CisgIGFuZCB3YW50IHRvIHVzZSB0aGVtIGluIGNhbGxvYyBhbmQgcmVhbGxvYy4gT3RoZXJ3aXNlIHNpbXBsZQorICBtYWNybyB2ZXJzaW9ucyBhcmUgZGVmaW5lZCBoZXJlLgorCisgIFVTRV9NRU1DUFkgc2hvdWxkIGJlIGRlZmluZWQgYXMgMSBpZiB5b3UgYWN0dWFsbHkgd2FudCB0bworICBoYXZlIG1lbXNldCBhbmQgbWVtY3B5IGNhbGxlZC4gUGVvcGxlIHJlcG9ydCB0aGF0IHRoZSBtYWNybworICB2ZXJzaW9ucyBhcmUgb2Z0ZW4gZW5vdWdoIGZhc3RlciB0aGFuIGxpYmMgdmVyc2lvbnMgb24gbWFueQorICBzeXN0ZW1zIHRoYXQgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGVtLgorCisqLworCisjZGVmaW5lIEhBVkVfTUVNQ1BZCisKKyNpZm5kZWYgVVNFX01FTUNQWQorI2lmZGVmIEhBVkVfTUVNQ1BZCisjZGVmaW5lIFVTRV9NRU1DUFkgMQorI2Vsc2UKKyNkZWZpbmUgVVNFX01FTUNQWSAwCisjZW5kaWYKKyNlbmRpZgorCisjaWYgKF9fU1REX0MgfHwgZGVmaW5lZChIQVZFX01FTUNQWSkpCisKKyNpZiBfX1NURF9DCit2b2lkKiBtZW1zZXQodm9pZCosIGludCwgc2l6ZV90KTsKK3ZvaWQqIG1lbWNweSh2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisjZWxzZQorI2lmZGVmIFdJTjMyCisvKiBPbiBXaW4zMiBwbGF0Zm9ybXMsICdtZW1zZXQoKScgYW5kICdtZW1jcHkoKScgYXJlIGFscmVhZHkgZGVjbGFyZWQgaW4gKi8KKy8qICd3aW5kb3dzLmgnICovCisjZWxzZQorVm9pZF90KiBtZW1zZXQoKTsKK1ZvaWRfdCogbWVtY3B5KCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBVU0VfTUVNQ1BZCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBvbmx5IGludm9rZWQgd2l0aCAoMm4rMSktbXVsdGlwbGVzIG9mCisgICBJTlRFUk5BTF9TSVpFX1QgdW5pdHMsIHdpdGggYSBwb3NpdGl2ZSBpbnRlZ2VyIG4uIFRoaXMgaXMgZXhwbG9pdGVkCisgICBmb3IgZmFzdCBpbmxpbmUgZXhlY3V0aW9uIHdoZW4gbiBpcyBzbWFsbC4gKi8KKworI2RlZmluZSBNQUxMT0NfWkVSTyhjaGFycCwgbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QgbXpzeiA9IChuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZihtenN6IDw9IDkqc2l6ZW9mKG16c3opKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbXogPSAoSU5URVJOQUxfU0laRV9UKikgKGNoYXJwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKG16c3ogPj0gNSpzaXplb2YobXpzeikpIHsgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZihtenN6ID49IDcqc2l6ZW9mKG16c3opKSB7ICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZihtenN6ID49IDkqc2l6ZW9mKG16c3opKSB7ICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyB9fX0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16ICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBtZW1zZXQoKGNoYXJwKSwgMCwgbXpzeik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgTUFMTE9DX0NPUFkoZGVzdCxzcmMsbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UIG1jc3ogPSAobmJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYobWNzeiA8PSA5KnNpemVvZihtY3N6KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5BTF9TSVpFX1QqIG1jc3JjID0gKElOVEVSTkFMX1NJWkVfVCopIChzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5BTF9TSVpFX1QqIG1jZHN0ID0gKElOVEVSTkFMX1NJWkVfVCopIChkZXN0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZihtY3N6ID49IDUqc2l6ZW9mKG1jc3opKSB7ICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYobWNzeiA+PSA3KnNpemVvZihtY3N6KSkgeyAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJaWYobWNzeiA+PSA5KnNpemVvZihtY3N6KSkgeyAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7IH19fSAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCAgID0gKm1jc3JjICA7ICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgbWVtY3B5KGRlc3QsIHNyYywgbWNzeik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZWxzZSAvKiAhVVNFX01FTUNQWSAqLworCisvKiBVc2UgRHVmZidzIGRldmljZSBmb3IgZ29vZCB6ZXJvaW5nL2NvcHlpbmcgcGVyZm9ybWFuY2UuICovCisKKyNkZWZpbmUgTUFMTE9DX1pFUk8oY2hhcnAsIG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UKiBtenAgPSAoSU5URVJOQUxfU0laRV9UKikoY2hhcnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbG9uZyBtY3RtcCA9IChuYnl0ZXMpL3NpemVvZihJTlRFUk5BTF9TSVpFX1QpLCBtY247ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKG1jdG1wIDwgOCkgbWNuID0gMDsgZWxzZSB7IG1jbiA9IChtY3RtcC0xKS84OyBtY3RtcCAlPSA4OyB9ICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChtY3RtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IGZvcig7OykgeyAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDc6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDY6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDU6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDQ6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDE6ICAgICAgICAgICAqbXpwKysgPSAwOyBpZihtY24gPD0gMCkgYnJlYWs7IG1jbi0tOyB9ICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBNQUxMT0NfQ09QWShkZXN0LHNyYyxuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG1jc3JjID0gKElOVEVSTkFMX1NJWkVfVCopIHNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG1jZHN0ID0gKElOVEVSTkFMX1NJWkVfVCopIGRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsb25nIG1jdG1wID0gKG5ieXRlcykvc2l6ZW9mKElOVEVSTkFMX1NJWkVfVCksIG1jbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobWN0bXAgPCA4KSBtY24gPSAwOyBlbHNlIHsgbWNuID0gKG1jdG1wLTEpLzg7IG1jdG1wICU9IDg7IH0gICAgICAgICAgICAgXAorICBzd2l0Y2ggKG1jdG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogZm9yKDs7KSB7ICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNzogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNjogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNTogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNDogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMjogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7IGlmKG1jbiA8PSAwKSBicmVhazsgbWNuLS07IH0gICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZW5kaWYKKworCisvKgorICBEZWZpbmUgSEFWRV9NTUFQIHRvIG9wdGlvbmFsbHkgbWFrZSBtYWxsb2MoKSB1c2UgbW1hcCgpIHRvCisgIGFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLiAgVGhlc2Ugd2lsbCBiZSByZXR1cm5lZCB0byB0aGUKKyAgb3BlcmF0aW5nIHN5c3RlbSBpbW1lZGlhdGVseSBhZnRlciBhIGZyZWUoKS4KKyovCisKKy8qKioKKyNpZm5kZWYgSEFWRV9NTUFQCisjZGVmaW5lIEhBVkVfTU1BUCAxCisjZW5kaWYKKyoqKi8KKyN1bmRlZglIQVZFX01NQVAJLyogTm90IGF2YWlsYWJsZSBmb3IgVS1Cb290ICovCisKKy8qCisgIERlZmluZSBIQVZFX01SRU1BUCB0byBtYWtlIHJlYWxsb2MoKSB1c2UgbXJlbWFwKCkgdG8gcmUtYWxsb2NhdGUKKyAgbGFyZ2UgYmxvY2tzLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBwb3NzaWJsZSBvbiBMaW51eCB3aXRoCisgIGtlcm5lbCB2ZXJzaW9ucyBuZXdlciB0aGFuIDEuMy43Ny4KKyovCisKKy8qKioKKyNpZm5kZWYgSEFWRV9NUkVNQVAKKyNpZmRlZiBJTlRFUk5BTF9MSU5VWF9DX0xJQgorI2RlZmluZSBIQVZFX01SRU1BUCAxCisjZWxzZQorI2RlZmluZSBIQVZFX01SRU1BUCAwCisjZW5kaWYKKyNlbmRpZgorKioqLworI3VuZGVmCUhBVkVfTVJFTUFQCS8qIE5vdCBhdmFpbGFibGUgZm9yIFUtQm9vdCAqLworCisjaWYgSEFWRV9NTUFQCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkKE1BUF9BTk9OKQorI2RlZmluZSBNQVBfQU5PTllNT1VTIE1BUF9BTk9OCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfTU1BUCAqLworCisvKgorICBBY2Nlc3MgdG8gc3lzdGVtIHBhZ2Ugc2l6ZS4gVG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhpcyBtYWxsb2MKKyAgbWFuYWdlcyBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGluIHBhZ2Utc2l6ZSB1bml0cy4KKworICBUaGUgZm9sbG93aW5nIG1lY2hhbmljcyBmb3IgZ2V0cGFnZXNpemUgd2VyZSBhZGFwdGVkIGZyb20KKyAgYnNkL2dudSBnZXRwYWdlc2l6ZS5oCisqLworCisjZGVmaW5lCUxBQ0tTX1VOSVNURF9ICS8qIFNob3J0Y3V0IGZvciBVLUJvb3QgKi8KKyNkZWZpbmUJbWFsbG9jX2dldHBhZ2VzaXplCTQwOTYKKworI2lmbmRlZiBMQUNLU19VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBtYWxsb2NfZ2V0cGFnZXNpemUKKyMgIGlmZGVmIF9TQ19QQUdFU0laRSAgICAgICAgIC8qIHNvbWUgU1ZSNCBzeXN0ZW1zIG9taXQgYW4gdW5kZXJzY29yZSAqLworIyAgICBpZm5kZWYgX1NDX1BBR0VfU0laRQorIyAgICAgIGRlZmluZSBfU0NfUEFHRV9TSVpFIF9TQ19QQUdFU0laRQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9TQ19QQUdFX1NJWkUKKyMgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQoQlNEKSB8fCBkZWZpbmVkKERHVVgpIHx8IGRlZmluZWQoSEFWRV9HRVRQQUdFU0laRSkKKyAgICAgICBleHRlcm4gc2l6ZV90IGdldHBhZ2VzaXplKCk7CisjICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBnZXRwYWdlc2l6ZSgpCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBXSU4zMgorIyAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoNDA5NikgLyogVEJEOiBVc2UgJ0dldFN5c3RlbUluZm8nIGluc3RlYWQgKi8KKyMgICAgICBlbHNlCisjICAgICAgICBpZm5kZWYgTEFDS1NfU1lTX1BBUkFNX0gKKyMgICAgICAgICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIEVYRUNfUEFHRVNJWkUKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgaWZkZWYgTkJQRworIyAgICAgICAgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQRworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKE5CUEcgKiBDTFNJWkUpCisjICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgIGlmZGVmIE5CUEMKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQQworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgUEFHRVNJWkUKKyMgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoNDA5NikgLyoganVzdCBndWVzcyAqLworIyAgICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisKKy8qCisKKyAgVGhpcyB2ZXJzaW9uIG9mIG1hbGxvYyBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgU1ZJRC9YUEcgbWFsbGluZm8KKyAgcm91dGluZSB0aGF0IHJldHVybnMgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgc2FtZSBraW5kIG9mCisgIGluZm9ybWF0aW9uIHlvdSBjYW4gZ2V0IGZyb20gbWFsbG9jX3N0YXRzLiBJdCBzaG91bGQgd29yayBvbgorICBhbnkgU1ZJRC9YUEcgY29tcGxpYW50IHN5c3RlbSB0aGF0IGhhcyBhIC91c3IvaW5jbHVkZS9tYWxsb2MuaAorICBkZWZpbmluZyBzdHJ1Y3QgbWFsbGluZm8uIChJZiB5b3UnZCBsaWtlIHRvIGluc3RhbGwgc3VjaCBhIHRoaW5nCisgIHlvdXJzZWxmLCBjdXQgb3V0IHRoZSBwcmVsaW1pbmFyeSBkZWNsYXJhdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlCisgIGFuZCBiZWxvdyBhbmQgc2F2ZSB0aGVtIGluIGEgbWFsbG9jLmggZmlsZS4gQnV0IHRoZXJlJ3Mgbm8KKyAgY29tcGVsbGluZyByZWFzb24gdG8gYm90aGVyIHRvIGRvIHRoaXMuKQorCisgIFRoZSBtYWluIGRlY2xhcmF0aW9uIG5lZWRlZCBpcyB0aGUgbWFsbGluZm8gc3RydWN0IHRoYXQgaXMgcmV0dXJuZWQKKyAgKGJ5LWNvcHkpIGJ5IG1hbGxpbmZvKCkuICBUaGUgU1ZJRC9YUEcgbWFsbG9pbmZvIHN0cnVjdCBjb250YWlucyBhCisgIGJ1bmNoIG9mIGZpZWxkcywgbW9zdCBvZiB3aGljaCBhcmUgbm90IGV2ZW4gbWVhbmluZ2Z1bCBpbiB0aGlzCisgIHZlcnNpb24gb2YgbWFsbG9jLiBTb21lIG9mIHRoZXNlIGZpZWxkcyBhcmUgYXJlIGluc3RlYWQgZmlsbGVkIGJ5CisgIG1hbGxpbmZvKCkgd2l0aCBvdGhlciBudW1iZXJzIHRoYXQgbWlnaHQgcG9zc2libHkgYmUgb2YgaW50ZXJlc3QuCisKKyAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBzaG91bGQgYmUgc2V0IGlmIHlvdSBoYXZlIGEKKyAgL3Vzci9pbmNsdWRlL21hbGxvYy5oIGZpbGUgdGhhdCBpbmNsdWRlcyBhIGRlY2xhcmF0aW9uIG9mIHN0cnVjdAorICBtYWxsaW5mby4gIElmIHNvLCBpdCBpcyBpbmNsdWRlZDsgZWxzZSBhbiBTVklEMi9YUEcyIGNvbXBsaWFudAorICB2ZXJzaW9uIGlzIGRlY2xhcmVkIGJlbG93LiAgVGhlc2UgbXVzdCBiZSBwcmVjaXNlbHkgdGhlIHNhbWUgZm9yCisgIG1hbGxpbmZvKCkgdG8gd29yay4KKworKi8KKworLyogI2RlZmluZSBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCisKKyNpZiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19ICisjaW5jbHVkZSAiL3Vzci9pbmNsdWRlL21hbGxvYy5oIgorI2Vsc2UKKworLyogU1ZJRDIvWFBHIG1hbGxpbmZvIHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgbWFsbGluZm8geworICBpbnQgYXJlbmE7ICAgIC8qIHRvdGFsIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLworICBpbnQgb3JkYmxrczsgIC8qIG51bWJlciBvZiBub24taW51c2UgY2h1bmtzICovCisgIGludCBzbWJsa3M7ICAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCBoYmxrczsgICAgLyogbnVtYmVyIG9mIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgaGJsa2hkOyAgIC8qIHRvdGFsIHNwYWNlIGluIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgdXNtYmxrczsgIC8qIHVudXNlZCAtLSBhbHdheXMgemVybyAqLworICBpbnQgZnNtYmxrczsgIC8qIHVudXNlZCAtLSBhbHdheXMgemVybyAqLworICBpbnQgdW9yZGJsa3M7IC8qIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLworICBpbnQgZm9yZGJsa3M7IC8qIHRvdGFsIG5vbi1pbnVzZSBzcGFjZSAqLworICBpbnQga2VlcGNvc3Q7IC8qIHRvcC1tb3N0LCByZWxlYXNhYmxlICh2aWEgbWFsbG9jX3RyaW0pIHNwYWNlICovCit9OworCisvKiBTVklEMi9YUEcgbWFsbG9wdCBvcHRpb25zICovCisKKyNkZWZpbmUgTV9NWEZBU1QgIDEgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZGVmaW5lIE1fTkxCTEtTICAyICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2RlZmluZSBNX0dSQUlOICAgMyAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNkZWZpbmUgTV9LRUVQICAgIDQgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisKKyNlbmRpZgorCisvKiBtYWxsb3B0IG9wdGlvbnMgdGhhdCBhY3R1YWxseSBkbyBzb21ldGhpbmcgKi8KKworI2RlZmluZSBNX1RSSU1fVEhSRVNIT0xEICAgIC0xCisjZGVmaW5lIE1fVE9QX1BBRCAgICAgICAgICAgLTIKKyNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAtMworI2RlZmluZSBNX01NQVBfTUFYICAgICAgICAgIC00CisKKworI2lmbmRlZiBERUZBVUxUX1RSSU1fVEhSRVNIT0xECisjZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKDEyOCAqIDEwMjQpCisjZW5kaWYKKworLyoKKyAgICBNX1RSSU1fVEhSRVNIT0xEIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bnVzZWQgdG9wLW1vc3QgbWVtb3J5CisgICAgICB0byBrZWVwIGJlZm9yZSByZWxlYXNpbmcgdmlhIG1hbGxvY190cmltIGluIGZyZWUoKS4KKworICAgICAgQXV0b21hdGljIHRyaW1taW5nIGlzIG1haW5seSB1c2VmdWwgaW4gbG9uZy1saXZlZCBwcm9ncmFtcy4KKyAgICAgIEJlY2F1c2UgdHJpbW1pbmcgdmlhIHNicmsgY2FuIGJlIHNsb3cgb24gc29tZSBzeXN0ZW1zLCBhbmQgY2FuCisgICAgICBzb21ldGltZXMgYmUgd2FzdGVmdWwgKGluIGNhc2VzIHdoZXJlIHByb2dyYW1zIGltbWVkaWF0ZWx5CisgICAgICBhZnRlcndhcmQgYWxsb2NhdGUgbW9yZSBsYXJnZSBjaHVua3MpIHRoZSB2YWx1ZSBzaG91bGQgYmUgaGlnaAorICAgICAgZW5vdWdoIHNvIHRoYXQgeW91ciBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZSB3b3VsZCBpbXByb3ZlIGJ5CisgICAgICByZWxlYXNpbmcuCisKKyAgICAgIFRoZSB0cmltIHRocmVzaG9sZCBhbmQgdGhlIG1tYXAgY29udHJvbCBwYXJhbWV0ZXJzIChzZWUgYmVsb3cpCisgICAgICBjYW4gYmUgdHJhZGVkIG9mZiB3aXRoIG9uZSBhbm90aGVyLiBUcmltbWluZyBhbmQgbW1hcHBpbmcgYXJlCisgICAgICB0d28gZGlmZmVyZW50IHdheXMgb2YgcmVsZWFzaW5nIHVudXNlZCBtZW1vcnkgYmFjayB0byB0aGUKKyAgICAgIHN5c3RlbS4gQmV0d2VlbiB0aGVzZSB0d28sIGl0IGlzIG9mdGVuIHBvc3NpYmxlIHRvIGtlZXAKKyAgICAgIHN5c3RlbS1sZXZlbCBkZW1hbmRzIG9mIGEgbG9uZy1saXZlZCBwcm9ncmFtIGRvd24gdG8gYSBiYXJlCisgICAgICBtaW5pbXVtLiBGb3IgZXhhbXBsZSwgaW4gb25lIHRlc3Qgc3VpdGUgb2Ygc2Vzc2lvbnMgbWVhc3VyaW5nCisgICAgICB0aGUgWEY4NiBYIHNlcnZlciBvbiBMaW51eCwgdXNpbmcgYSB0cmltIHRocmVzaG9sZCBvZiAxMjhLIGFuZCBhCisgICAgICBtbWFwIHRocmVzaG9sZCBvZiAxOTJLIGxlZCB0byBuZWFyLW1pbmltYWwgbG9uZyB0ZXJtIHJlc291cmNlCisgICAgICBjb25zdW1wdGlvbi4KKworICAgICAgSWYgeW91IGFyZSB1c2luZyB0aGlzIG1hbGxvYyBpbiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSwgaXQgc2hvdWxkCisgICAgICBwYXkgdG8gZXhwZXJpbWVudCB3aXRoIHRoZXNlIHZhbHVlcy4gIEFzIGEgcm91Z2ggZ3VpZGUsIHlvdQorICAgICAgbWlnaHQgc2V0IHRvIGEgdmFsdWUgY2xvc2UgdG8gdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiBhIHByb2Nlc3MKKyAgICAgIChwcm9ncmFtKSBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLiAgUmVsZWFzaW5nIHRoaXMgbXVjaCBtZW1vcnkKKyAgICAgIHdvdWxkIGFsbG93IHN1Y2ggYSBwcm9jZXNzIHRvIHJ1biBpbiBtZW1vcnkuICBHZW5lcmFsbHksIGl0J3MKKyAgICAgIHdvcnRoIGl0IHRvIHR1bmUgZm9yIHRyaW1taW5nIHJhdGhlciB0aGFtIG1lbW9yeSBtYXBwaW5nIHdoZW4gYQorICAgICAgcHJvZ3JhbSB1bmRlcmdvZXMgcGhhc2VzIHdoZXJlIHNldmVyYWwgbGFyZ2UgY2h1bmtzIGFyZQorICAgICAgYWxsb2NhdGVkIGFuZCByZWxlYXNlZCBpbiB3YXlzIHRoYXQgY2FuIHJldXNlIGVhY2ggb3RoZXIncworICAgICAgc3RvcmFnZSwgcGVyaGFwcyBtaXhlZCB3aXRoIHBoYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8gc3VjaAorICAgICAgY2h1bmtzIGF0IGFsbC4gIEFuZCBpbiB3ZWxsLWJlaGF2ZWQgbG9uZy1saXZlZCBwcm9ncmFtcywKKyAgICAgIGNvbnRyb2xsaW5nIHJlbGVhc2Ugb2YgbGFyZ2UgYmxvY2tzIHZpYSB0cmltbWluZyB2ZXJzdXMgbWFwcGluZworICAgICAgaXMgdXN1YWxseSBmYXN0ZXIuCisKKyAgICAgIEhvd2V2ZXIsIGluIG1vc3QgcHJvZ3JhbXMsIHRoZXNlIHBhcmFtZXRlcnMgc2VydmUgbWFpbmx5IGFzCisgICAgICBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIHN5c3RlbS1sZXZlbCBlZmZlY3RzIG9mIGNhcnJ5aW5nIGFyb3VuZAorICAgICAgbWFzc2l2ZSBhbW91bnRzIG9mIHVubmVlZGVkIG1lbW9yeS4gU2luY2UgZnJlcXVlbnQgY2FsbHMgdG8KKyAgICAgIHNicmssIG1tYXAsIGFuZCBtdW5tYXAgb3RoZXJ3aXNlIGRlZ3JhZGUgcGVyZm9ybWFuY2UsIHRoZSBkZWZhdWx0CisgICAgICBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gcmVsYXRpdmVseSBoaWdoIHZhbHVlcyB0aGF0IHNlcnZlIG9ubHkgYXMKKyAgICAgIHNhZmVndWFyZHMuCisKKyAgICAgIFRoZSBkZWZhdWx0IHRyaW0gdmFsdWUgaXMgaGlnaCBlbm91Z2ggdG8gY2F1c2UgdHJpbW1pbmcgb25seSBpbgorICAgICAgZmFpcmx5IGV4dHJlbWUgKGJ5IGN1cnJlbnQgbWVtb3J5IGNvbnN1bXB0aW9uIHN0YW5kYXJkcykgY2FzZXMuCisgICAgICBJdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUgdG8gaGF2ZSBhbnkgdXNlZnVsIGVmZmVjdC4gIFRvCisgICAgICBkaXNhYmxlIHRyaW1taW5nIGNvbXBsZXRlbHksIHlvdSBjYW4gc2V0IHRvICh1bnNpZ25lZCBsb25nKSgtMSk7CisKKworKi8KKworCisjaWZuZGVmIERFRkFVTFRfVE9QX1BBRAorI2RlZmluZSBERUZBVUxUX1RPUF9QQUQgICAgICAgICgwKQorI2VuZGlmCisKKy8qCisgICAgTV9UT1BfUEFEIGlzIHRoZSBhbW91bnQgb2YgZXh0cmEgYHBhZGRpbmcnIHNwYWNlIHRvIGFsbG9jYXRlIG9yCisgICAgICByZXRhaW4gd2hlbmV2ZXIgc2JyayBpcyBjYWxsZWQuIEl0IGlzIHVzZWQgaW4gdHdvIHdheXMgaW50ZXJuYWxseToKKworICAgICAgKiBXaGVuIHNicmsgaXMgY2FsbGVkIHRvIGV4dGVuZCB0aGUgdG9wIG9mIHRoZSBhcmVuYSB0byBzYXRpc2Z5CisJYSBuZXcgbWFsbG9jIHJlcXVlc3QsIHRoaXMgbXVjaCBwYWRkaW5nIGlzIGFkZGVkIHRvIHRoZSBzYnJrCisJcmVxdWVzdC4KKworICAgICAgKiBXaGVuIG1hbGxvY190cmltIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gZnJlZSgpLAorCWl0IGlzIHVzZWQgYXMgdGhlIGBwYWQnIGFyZ3VtZW50LgorCisgICAgICBJbiBib3RoIGNhc2VzLCB0aGUgYWN0dWFsIGFtb3VudCBvZiBwYWRkaW5nIGlzIHJvdW5kZWQKKyAgICAgIHNvIHRoYXQgdGhlIGVuZCBvZiB0aGUgYXJlbmEgaXMgYWx3YXlzIGEgc3lzdGVtIHBhZ2UgYm91bmRhcnkuCisKKyAgICAgIFRoZSBtYWluIHJlYXNvbiBmb3IgdXNpbmcgcGFkZGluZyBpcyB0byBhdm9pZCBjYWxsaW5nIHNicmsgc28KKyAgICAgIG9mdGVuLiBIYXZpbmcgZXZlbiBhIHNtYWxsIHBhZCBncmVhdGx5IHJlZHVjZXMgdGhlIGxpa2VsaWhvb2QKKyAgICAgIHRoYXQgbmVhcmx5IGV2ZXJ5IG1hbGxvYyByZXF1ZXN0IGR1cmluZyBwcm9ncmFtIHN0YXJ0LXVwIChvcgorICAgICAgYWZ0ZXIgdHJpbW1pbmcpIHdpbGwgaW52b2tlIHNicmssIHdoaWNoIG5lZWRsZXNzbHkgd2FzdGVzCisgICAgICB0aW1lLgorCisgICAgICBBdXRvbWF0aWMgcm91bmRpbmctdXAgdG8gcGFnZS1zaXplIHVuaXRzIGlzIG5vcm1hbGx5IHN1ZmZpY2llbnQKKyAgICAgIHRvIGF2b2lkIG1lYXN1cmFibGUgb3ZlcmhlYWQsIHNvIHRoZSBkZWZhdWx0IGlzIDAuICBIb3dldmVyLCBpbgorICAgICAgc3lzdGVtcyB3aGVyZSBzYnJrIGlzIHJlbGF0aXZlbHkgc2xvdywgaXQgY2FuIHBheSB0byBpbmNyZWFzZQorICAgICAgdGhpcyB2YWx1ZSwgYXQgdGhlIGV4cGVuc2Ugb2YgY2FycnlpbmcgYXJvdW5kIG1vcmUgbWVtb3J5IHRoYW4KKyAgICAgIHRoZSBwcm9ncmFtIG5lZWRzLgorCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9NTUFQX1RIUkVTSE9MRAorI2RlZmluZSBERUZBVUxUX01NQVBfVEhSRVNIT0xEICgxMjggKiAxMDI0KQorI2VuZGlmCisKKy8qCisKKyAgICBNX01NQVBfVEhSRVNIT0xEIGlzIHRoZSByZXF1ZXN0IHNpemUgdGhyZXNob2xkIGZvciB1c2luZyBtbWFwKCkKKyAgICAgIHRvIHNlcnZpY2UgYSByZXF1ZXN0LiBSZXF1ZXN0cyBvZiBhdCBsZWFzdCB0aGlzIHNpemUgdGhhdCBjYW5ub3QKKyAgICAgIGJlIGFsbG9jYXRlZCB1c2luZyBhbHJlYWR5LWV4aXN0aW5nIHNwYWNlIHdpbGwgYmUgc2VydmljZWQgdmlhIG1tYXAuCisgICAgICAoSWYgZW5vdWdoIG5vcm1hbCBmcmVlZCBzcGFjZSBhbHJlYWR5IGV4aXN0cyBpdCBpcyB1c2VkIGluc3RlYWQuKQorCisgICAgICBVc2luZyBtbWFwIHNlZ3JlZ2F0ZXMgcmVsYXRpdmVseSBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5IHNvIHRoYXQKKyAgICAgIHRoZXkgY2FuIGJlIGluZGl2aWR1YWxseSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQgZnJvbSB0aGUgaG9zdAorICAgICAgc3lzdGVtLiBBIHJlcXVlc3Qgc2VydmljZWQgdGhyb3VnaCBtbWFwIGlzIG5ldmVyIHJldXNlZCBieSBhbnkKKyAgICAgIG90aGVyIHJlcXVlc3QgKGF0IGxlYXN0IG5vdCBkaXJlY3RseTsgdGhlIHN5c3RlbSBtYXkganVzdCBzbworICAgICAgaGFwcGVuIHRvIHJlbWFwIHN1Y2Nlc3NpdmUgcmVxdWVzdHMgdG8gdGhlIHNhbWUgbG9jYXRpb25zKS4KKworICAgICAgU2VncmVnYXRpbmcgc3BhY2UgaW4gdGhpcyB3YXkgaGFzIHRoZSBiZW5lZml0IHRoYXQgbW1hcHBlZCBzcGFjZQorICAgICAgY2FuIEFMV0FZUyBiZSBpbmRpdmlkdWFsbHkgcmVsZWFzZWQgYmFjayB0byB0aGUgc3lzdGVtLCB3aGljaAorICAgICAgaGVscHMga2VlcCB0aGUgc3lzdGVtIGxldmVsIG1lbW9yeSBkZW1hbmRzIG9mIGEgbG9uZy1saXZlZAorICAgICAgcHJvZ3JhbSBsb3cuIE1hcHBlZCBtZW1vcnkgY2FuIG5ldmVyIGJlY29tZSBgbG9ja2VkJyBiZXR3ZWVuCisgICAgICBvdGhlciBjaHVua3MsIGFzIGNhbiBoYXBwZW4gd2l0aCBub3JtYWxseSBhbGxvY2F0ZWQgY2h1bmtzLCB3aGljaAorICAgICAgbWVuYXMgdGhhdCBldmVuIHRyaW1taW5nIHZpYSBtYWxsb2NfdHJpbSB3b3VsZCBub3QgcmVsZWFzZSB0aGVtLgorCisgICAgICBIb3dldmVyLCBpdCBoYXMgdGhlIGRpc2FkdmFudGFnZXMgdGhhdDoKKworCSAxLiBUaGUgc3BhY2UgY2Fubm90IGJlIHJlY2xhaW1lZCwgY29uc29saWRhdGVkLCBhbmQgdGhlbgorCSAgICB1c2VkIHRvIHNlcnZpY2UgbGF0ZXIgcmVxdWVzdHMsIGFzIGhhcHBlbnMgd2l0aCBub3JtYWwgY2h1bmtzLgorCSAyLiBJdCBjYW4gbGVhZCB0byBtb3JlIHdhc3RhZ2UgYmVjYXVzZSBvZiBtbWFwIHBhZ2UgYWxpZ25tZW50CisJICAgIHJlcXVpcmVtZW50cworCSAzLiBJdCBjYXVzZXMgbWFsbG9jIHBlcmZvcm1hbmNlIHRvIGJlIG1vcmUgZGVwZW5kZW50IG9uIGhvc3QKKwkgICAgc3lzdGVtIG1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgcm91dGluZXMgd2hpY2ggbWF5IHZhcnkgaW4KKwkgICAgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBhbmQgbWF5IGltcG9zZSBhcmJpdHJhcnkKKwkgICAgbGltaXRhdGlvbnMuIEdlbmVyYWxseSwgc2VydmljaW5nIGEgcmVxdWVzdCB2aWEgbm9ybWFsCisJICAgIG1hbGxvYyBzdGVwcyBpcyBmYXN0ZXIgdGhhbiBnb2luZyB0aHJvdWdoIGEgc3lzdGVtJ3MgbW1hcC4KKworICAgICAgQWxsIHRvZ2V0aGVyLCB0aGVzZSBjb25zaWRlcmF0aW9ucyBzaG91bGQgbGVhZCB5b3UgdG8gdXNlIG1tYXAKKyAgICAgIG9ubHkgZm9yIHJlbGF0aXZlbHkgbGFyZ2UgcmVxdWVzdHMuCisKKworKi8KKworCisjaWZuZGVmIERFRkFVTFRfTU1BUF9NQVgKKyNpZiBIQVZFX01NQVAKKyNkZWZpbmUgREVGQVVMVF9NTUFQX01BWCAgICAgICAoNjQpCisjZWxzZQorI2RlZmluZSBERUZBVUxUX01NQVBfTUFYICAgICAgICgwKQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAgICBNX01NQVBfTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB0byBzaW11bHRhbmVvdXNseQorICAgICAgc2VydmljZSB1c2luZyBtbWFwLiBUaGlzIHBhcmFtZXRlciBleGlzdHMgYmVjYXVzZToKKworCSAxLiBTb21lIHN5c3RlbXMgaGF2ZSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGludGVybmFsIHRhYmxlcyBmb3IKKwkgICAgdXNlIGJ5IG1tYXAuCisJIDIuIEluIG1vc3Qgc3lzdGVtcywgb3ZlcnJlbGlhbmNlIG9uIG1tYXAgY2FuIGRlZ3JhZGUgb3ZlcmFsbAorCSAgICBwZXJmb3JtYW5jZS4KKwkgMy4gSWYgYSBwcm9ncmFtIGFsbG9jYXRlcyBtYW55IGxhcmdlIHJlZ2lvbnMsIGl0IGlzIHByb2JhYmx5CisJICAgIGJldHRlciBvZmYgdXNpbmcgbm9ybWFsIHNicmstYmFzZWQgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0CisJICAgIGNhbiByZWNsYWltIGFuZCByZWFsbG9jYXRlIG5vcm1hbCBoZWFwIG1lbW9yeS4gVXNpbmcgYQorCSAgICBzbWFsbCB2YWx1ZSBhbGxvd3MgdHJhbnNpdGlvbiBpbnRvIHRoaXMgbW9kZSBhZnRlciB0aGUKKwkgICAgZmlyc3QgZmV3IGFsbG9jYXRpb25zLgorCisgICAgICBTZXR0aW5nIHRvIDAgZGlzYWJsZXMgYWxsIHVzZSBvZiBtbWFwLiAgSWYgSEFWRV9NTUFQIGlzIG5vdCBzZXQsCisgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBhbmQgYXR0ZW1wdHMgdG8gc2V0IGl0IHRvIG5vbi16ZXJvIHZhbHVlcworICAgICAgaW4gbWFsbG9wdCB3aWxsIGZhaWwuCisqLworCisKKy8qCisgICAgVVNFX0RMX1BSRUZJWCB3aWxsIHByZWZpeCBhbGwgcHVibGljIHJvdXRpbmVzIHdpdGggdGhlIHN0cmluZyAnZGwnLgorICAgICAgVXNlZnVsIHRvIHF1aWNrbHkgYXZvaWQgcHJvY2VkdXJlIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyBhbmQgbGlua2VyCisgICAgICBzeW1ib2wgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKyovCisKKy8qICNkZWZpbmUgVVNFX0RMX1BSRUZJWCAqLworCisKKy8qCisKKyAgU3BlY2lhbCBkZWZpbmVzIGZvciBsaW51eCBsaWJjCisKKyAgRXhjZXB0IHdoZW4gY29tcGlsZWQgdXNpbmcgdGhlc2Ugc3BlY2lhbCBkZWZpbmVzIGZvciBMaW51eCBsaWJjCisgIHVzaW5nIHdlYWsgYWxpYXNlcywgdGhpcyBtYWxsb2MgaXMgTk9UIGRlc2lnbmVkIHRvIHdvcmsgaW4KKyAgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbnMuICBObyBzZW1hcGhvcmVzIG9yIG90aGVyIGNvbmN1cnJlbmN5CisgIGNvbnRyb2wgYXJlIHByb3ZpZGVkIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIG1hbGxvYyBvciBmcmVlIGNhbGxzCisgIGRvbid0IHJ1biBhdCB0aGUgc2FtZSB0aW1lLCB3aGljaCBjb3VsZCBiZSBkaXNhc3Rlcm91cy4gQSBzaW5nbGUKKyAgc2VtYXBob3JlIGNvdWxkIGJlIHVzZWQgYWNyb3NzIG1hbGxvYywgcmVhbGxvYywgYW5kIGZyZWUgKHdoaWNoIGlzCisgIGVzc2VudGlhbGx5IHRoZSBlZmZlY3Qgb2YgdGhlIGxpbnV4IHdlYWsgYWxpYXMgYXBwcm9hY2gpLiBJdCB3b3VsZAorICBiZSBoYXJkIHRvIG9idGFpbiBmaW5lciBncmFudWxhcml0eS4KKworKi8KKworCisjaWZkZWYgSU5URVJOQUxfTElOVVhfQ19MSUIKKworI2lmIF9fU1REX0MKKworVm9pZF90ICogX19kZWZhdWx0X21vcmVjb3JlX2luaXQgKHB0cmRpZmZfdCk7CitWb2lkX3QgKigqX19tb3JlY29yZSkocHRyZGlmZl90KSA9IF9fZGVmYXVsdF9tb3JlY29yZV9pbml0OworCisjZWxzZQorCitWb2lkX3QgKiBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdCAoKTsKK1ZvaWRfdCAqKCpfX21vcmVjb3JlKSgpID0gX19kZWZhdWx0X21vcmVjb3JlX2luaXQ7CisKKyNlbmRpZgorCisjZGVmaW5lIE1PUkVDT1JFICgqX19tb3JlY29yZSkKKyNkZWZpbmUgTU9SRUNPUkVfRkFJTFVSRSAwCisjZGVmaW5lIE1PUkVDT1JFX0NMRUFSUyAxCisKKyNlbHNlIC8qIElOVEVSTkFMX0xJTlVYX0NfTElCICovCisKKyNpZiBfX1NURF9DCitleHRlcm4gVm9pZF90KiAgICAgc2JyayhwdHJkaWZmX3QpOworI2Vsc2UKK2V4dGVybiBWb2lkX3QqICAgICBzYnJrKCk7CisjZW5kaWYKKworI2lmbmRlZiBNT1JFQ09SRQorI2RlZmluZSBNT1JFQ09SRSBzYnJrCisjZW5kaWYKKworI2lmbmRlZiBNT1JFQ09SRV9GQUlMVVJFCisjZGVmaW5lIE1PUkVDT1JFX0ZBSUxVUkUgLTEKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFX0NMRUFSUworI2RlZmluZSBNT1JFQ09SRV9DTEVBUlMgMQorI2VuZGlmCisKKyNlbmRpZiAvKiBJTlRFUk5BTF9MSU5VWF9DX0xJQiAqLworCisjaWYgZGVmaW5lZChJTlRFUk5BTF9MSU5VWF9DX0xJQikgJiYgZGVmaW5lZChfX0VMRl9fKQorCisjZGVmaW5lIGNBTExPYwkJX19saWJjX2NhbGxvYworI2RlZmluZSBmUkVlCQlfX2xpYmNfZnJlZQorI2RlZmluZSBtQUxMT2MJCV9fbGliY19tYWxsb2MKKyNkZWZpbmUgbUVNQUxJR24JX19saWJjX21lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCV9fbGliY19yZWFsbG9jCisjZGVmaW5lIHZBTExPYwkJX19saWJjX3ZhbGxvYworI2RlZmluZSBwdkFMTE9jCQlfX2xpYmNfcHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwlfX2xpYmNfbWFsbGluZm8KKyNkZWZpbmUgbUFMTE9QdAkJX19saWJjX21hbGxvcHQKKworI3ByYWdtYSB3ZWFrIGNhbGxvYyA9IF9fbGliY19jYWxsb2MKKyNwcmFnbWEgd2VhayBmcmVlID0gX19saWJjX2ZyZWUKKyNwcmFnbWEgd2VhayBjZnJlZSA9IF9fbGliY19mcmVlCisjcHJhZ21hIHdlYWsgbWFsbG9jID0gX19saWJjX21hbGxvYworI3ByYWdtYSB3ZWFrIG1lbWFsaWduID0gX19saWJjX21lbWFsaWduCisjcHJhZ21hIHdlYWsgcmVhbGxvYyA9IF9fbGliY19yZWFsbG9jCisjcHJhZ21hIHdlYWsgdmFsbG9jID0gX19saWJjX3ZhbGxvYworI3ByYWdtYSB3ZWFrIHB2YWxsb2MgPSBfX2xpYmNfcHZhbGxvYworI3ByYWdtYSB3ZWFrIG1hbGxpbmZvID0gX19saWJjX21hbGxpbmZvCisjcHJhZ21hIHdlYWsgbWFsbG9wdCA9IF9fbGliY19tYWxsb3B0CisKKyNlbHNlCisKKyNpZmRlZiBVU0VfRExfUFJFRklYCisjZGVmaW5lIGNBTExPYwkJZGxjYWxsb2MKKyNkZWZpbmUgZlJFZQkJZGxmcmVlCisjZGVmaW5lIG1BTExPYwkJZGxtYWxsb2MKKyNkZWZpbmUgbUVNQUxJR24JZGxtZW1hbGlnbgorI2RlZmluZSByRUFMTE9jCQlkbHJlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQlkbHZhbGxvYworI2RlZmluZSBwdkFMTE9jCQlkbHB2YWxsb2MKKyNkZWZpbmUgbUFMTElORm8JZGxtYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQlkbG1hbGxvcHQKKyNlbHNlIC8qIFVTRV9ETF9QUkVGSVggKi8KKyNkZWZpbmUgY0FMTE9jCQljYWxsb2MKKyNkZWZpbmUgZlJFZQkJZnJlZQorI2RlZmluZSBtQUxMT2MJCW1hbGxvYworI2RlZmluZSBtRU1BTElHbgltZW1hbGlnbgorI2RlZmluZSByRUFMTE9jCQlyZWFsbG9jCisjZGVmaW5lIHZBTExPYwkJdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCXB2YWxsb2MKKyNkZWZpbmUgbUFMTElORm8JbWFsbGluZm8KKyNkZWZpbmUgbUFMTE9QdAkJbWFsbG9wdAorI2VuZGlmIC8qIFVTRV9ETF9QUkVGSVggKi8KKworI2VuZGlmCisKKy8qIFB1YmxpYyByb3V0aW5lcyAqLworCisjaWYgX19TVERfQworCitWb2lkX3QqIG1BTExPYyhzaXplX3QpOwordm9pZCAgICBmUkVlKFZvaWRfdCopOworVm9pZF90KiByRUFMTE9jKFZvaWRfdCosIHNpemVfdCk7CitWb2lkX3QqIG1FTUFMSUduKHNpemVfdCwgc2l6ZV90KTsKK1ZvaWRfdCogdkFMTE9jKHNpemVfdCk7CitWb2lkX3QqIHB2QUxMT2Moc2l6ZV90KTsKK1ZvaWRfdCogY0FMTE9jKHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgICAgY2ZyZWUoVm9pZF90Kik7CitpbnQgICAgIG1hbGxvY190cmltKHNpemVfdCk7CitzaXplX3QgIG1hbGxvY191c2FibGVfc2l6ZShWb2lkX3QqKTsKK3ZvaWQgICAgbWFsbG9jX3N0YXRzKHZvaWQpOworaW50ICAgICBtQUxMT1B0KGludCwgaW50KTsKK3N0cnVjdCBtYWxsaW5mbyBtQUxMSU5Gbyh2b2lkKTsKKyNlbHNlCitWb2lkX3QqIG1BTExPYygpOwordm9pZCAgICBmUkVlKCk7CitWb2lkX3QqIHJFQUxMT2MoKTsKK1ZvaWRfdCogbUVNQUxJR24oKTsKK1ZvaWRfdCogdkFMTE9jKCk7CitWb2lkX3QqIHB2QUxMT2MoKTsKK1ZvaWRfdCogY0FMTE9jKCk7Cit2b2lkICAgIGNmcmVlKCk7CitpbnQgICAgIG1hbGxvY190cmltKCk7CitzaXplX3QgIG1hbGxvY191c2FibGVfc2l6ZSgpOwordm9pZCAgICBtYWxsb2Nfc3RhdHMoKTsKK2ludCAgICAgbUFMTE9QdCgpOworc3RydWN0IG1hbGxpbmZvIG1BTExJTkZvKCk7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK307ICAvKiBlbmQgb2YgZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL21tYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9tbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJhOTA3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9tbWMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfTU1DX0hfCisjZGVmaW5lIF9NTUNfSF8KKworI2luY2x1ZGUgPHBhcnQuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL21tYy5oPgorCitpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworaW50IG1tY19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNpemUpOworaW50IG1tY193cml0ZSh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgc2l6ZSk7CitpbnQgbW1jMmluZm8odW5zaWduZWQgaW50IGFkZHIpOworCitibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworI2VuZGlmIC8qIF9NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbnMxNjU1MC5oIGIveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkMmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbnMxNjU1MC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICpUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKiAgCisgKiBOUzE2NTUwIFNlcmlhbCBQb3J0CisgKiBvcmlnaW5hbGx5IGZyb20gbGludXggc291cmNlIChhcmNoL3BwYy9ib290L25zMTY1NTAuaCkKKyAqIG1vZGlmaWVkIHNsaWdodGx5IHRvCisgKiBoYXZlIGFkZHJlc3NlcyBhcyBvZmZzZXRzIGZyb20gQ0ZHX0lTQV9CQVNFCisgKiBhZGRlZCBhIGZldyBtb3JlIGRlZmluaXRpb25zCisgKiBhZGRlZCBwcm90b3R5cGVzIGZvciBuczE2NTUwLmMKKyAqIHJlZHVjZWQgbm8gb2YgY29tIHBvcnRzIHRvIDIKKyAqIG1vZGlmaWNhdGlvbnMgKGMpIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gMjAwMC4KKyAqLworCisjaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDEpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgY2hhciByYnI7CQkvKiAwICovCisJdW5zaWduZWQgY2hhciBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgY2hhciBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgY2hhciBsY3I7CQkvKiAzICovCisJdW5zaWduZWQgY2hhciBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgY2hhciBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgY2hhciBtc3I7CQkvKiA2ICovCisJdW5zaWduZWQgY2hhciBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSAyKQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIHNob3J0IHJicjsJCS8qIDAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgc2hvcnQgZmNyOwkJLyogMiAqLworCXVuc2lnbmVkIHNob3J0IGxjcjsJCS8qIDMgKi8KKwl1bnNpZ25lZCBzaG9ydCBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgc2hvcnQgbHNyOwkJLyogNSAqLworCXVuc2lnbmVkIHNob3J0IG1zcjsJCS8qIDYgKi8KKwl1bnNpZ25lZCBzaG9ydCBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSA0KQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIGxvbmcgcmJyOwkJLyogMCAqLworCXVuc2lnbmVkIGxvbmcgaWVyOwkJLyogMSAqLworCXVuc2lnbmVkIGxvbmcgZmNyOwkJLyogMiAqLworCXVuc2lnbmVkIGxvbmcgbGNyOwkJLyogMyAqLworCXVuc2lnbmVkIGxvbmcgbWNyOwkJLyogNCAqLworCXVuc2lnbmVkIGxvbmcgbHNyOwkJLyogNSAqLworCXVuc2lnbmVkIGxvbmcgbXNyOwkJLyogNiAqLworCXVuc2lnbmVkIGxvbmcgc2NyOwkJLyogNyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gLTQpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgY2hhciByYnI7CQkvKiAwICovCisJaW50IHBhZDE6MjQ7CisJdW5zaWduZWQgY2hhciBpZXI7CQkvKiAxICovCisJaW50IHBhZDI6MjQ7CisJdW5zaWduZWQgY2hhciBmY3I7CQkvKiAyICovCisJaW50IHBhZDM6MjQ7CisJdW5zaWduZWQgY2hhciBsY3I7CQkvKiAzICovCisJaW50IHBhZDQ6MjQ7CisJdW5zaWduZWQgY2hhciBtY3I7CQkvKiA0ICovCisJaW50IHBhZDU6MjQ7CisJdW5zaWduZWQgY2hhciBsc3I7CQkvKiA1ICovCisJaW50IHBhZDY6MjQ7CisJdW5zaWduZWQgY2hhciBtc3I7CQkvKiA2ICovCisJaW50IHBhZDc6MjQ7CisJdW5zaWduZWQgY2hhciBzY3I7CQkvKiA3ICovCisJaW50IHBhZDg6MjQ7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUCkKKwl1bnNpZ25lZCBjaGFyIG1kcjE7CQkvKiBtb2RlIHNlbGVjdCByZXNldCBUTDE2Qzc1MCovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKKwlpbnQgcGFkOToyNDsKKwl1bnNpZ25lZCBsb25nIHBhZFsxMF07CisJdW5zaWduZWQgY2hhciBvc2NfMTJtX3NlbDsKKwlpbnQgcGFkMTA6MjQ7CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGRlZmluZSBOUzE2NTUwIHJlZ2lzdGVycyBzaXplLiIKKyNlbmRpZgorCisjZGVmaW5lIHRociByYnIKKyNkZWZpbmUgaWlyIGZjcgorI2RlZmluZSBkbGwgcmJyCisjZGVmaW5lIGRsbSBpZXIKKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgTlMxNjU1MCAqTlMxNjU1MF90OworCisjZGVmaW5lIEZDUl9GSUZPX0VOICAgICAweDAxCQkvKiBGaWZvIGVuYWJsZSAqLworI2RlZmluZSBGQ1JfUlhTUiAgICAgICAgMHgwMgkJLyogUmVjZWl2ZXIgc29mdCByZXNldCAqLworI2RlZmluZSBGQ1JfVFhTUiAgICAgICAgMHgwNAkJLyogVHJhbnNtaXR0ZXIgc29mdCByZXNldCAqLworCisjZGVmaW5lIE1DUl9EVFIgICAgICAgICAweDAxCisjZGVmaW5lIE1DUl9SVFMgICAgICAgICAweDAyCisjZGVmaW5lIE1DUl9ETUFfRU4gICAgICAweDA0CisjZGVmaW5lIE1DUl9UWF9ERlIgICAgICAweDA4CisKKyNkZWZpbmUgTENSX1dMU19NU0sJMHgwMwkJLyogY2hhcmFjdGVyIGxlbmd0aCBzbGVjdCBtYXNrICovCisjZGVmaW5lIExDUl9XTFNfNQkweDAwCQkvKiA1IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfNgkweDAxCQkvKiA2IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfNwkweDAyCQkvKiA3IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfOAkweDAzCQkvKiA4IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9TVEIJCTB4MDQJCS8qIE51bWJlciBvZiBzdG9wIEJpdHMsIG9mZiA9IDEsIG9uID0gMS41IG9yIDIpICovCisjZGVmaW5lIExDUl9QRU4JCTB4MDgJCS8qIFBhcml0eSBlbmVibGUgKi8KKyNkZWZpbmUgTENSX0VQUwkJMHgxMAkJLyogRXZlbiBQYXJpdHkgU2VsZWN0ICovCisjZGVmaW5lIExDUl9TVEtQCTB4MjAJCS8qIFN0aWNrIFBhcml0eSAqLworI2RlZmluZSBMQ1JfU0JSSwkweDQwCQkvKiBTZXQgQnJlYWsgKi8KKyNkZWZpbmUgTENSX0JLU0UJMHg4MAkJLyogQmFuayBzZWxlY3QgZW5hYmxlICovCisKKyNkZWZpbmUgTFNSX0RSCQkweDAxCQkvKiBEYXRhIHJlYWR5ICovCisjZGVmaW5lIExTUl9PRQkJMHgwMgkJLyogT3ZlcnJ1biAqLworI2RlZmluZSBMU1JfUEUJCTB4MDQJCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMU1JfRkUJCTB4MDgJCS8qIEZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgTFNSX0JJCQkweDEwCQkvKiBCcmVhayAqLworI2RlZmluZSBMU1JfVEhSRQkweDIwCQkvKiBYbWl0IGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgTFNSX1RFTVQJMHg0MAkJLyogWG1pdHRlciBlbXB0eSAqLworI2RlZmluZSBMU1JfRVJSCQkweDgwCQkvKiBFcnJvciAqLworCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisjZGVmaW5lIE9TQ18xMk1fU0VMCTB4MDEJCS8qIHNlbGVjdHMgNi41ICogY3VycmVudCBjbGsgZGl2ICovCisjZW5kaWYKKworLyogdXNlZnVsIGRlZmF1bHRzIGZvciBMQ1IgKi8KKyNkZWZpbmUgTENSXzhOMQkJMHgwMworCit2b2lkCU5TMTY1NTBfaW5pdCAgIChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpOwordm9pZAlOUzE2NTUwX3B1dGMgICAoTlMxNjU1MF90IGNvbV9wb3J0LCBjaGFyIGMpOworY2hhcglOUzE2NTUwX2dldGMgICAoTlMxNjU1MF90IGNvbV9wb3J0KTsKK2ludAlOUzE2NTUwX3RzdGMgICAoTlMxNjU1MF90IGNvbV9wb3J0KTsKK3ZvaWQJTlMxNjU1MF9yZWluaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcik7CmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3BhcnQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGFhM2MKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3BhcnQuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9QQVJUX0gKKyNkZWZpbmUgX1BBUlRfSAorI2luY2x1ZGUgPGlkZS5oPgorCit0eXBlZGVmIHN0cnVjdCBibG9ja19kZXZfZGVzYyB7CisJaW50CQlpZl90eXBlOwkvKiB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgKi8KKwlpbnQJICAgICAgICBkZXY7CSAgCS8qIGRldmljZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyCXBhcnRfdHlwZTsgIAkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXVuc2lnbmVkIGNoYXIJdGFyZ2V0OwkJLyogdGFyZ2V0IFNDU0kgSUQgKi8KKwl1bnNpZ25lZCBjaGFyCWx1bjsJCS8qIHRhcmdldCBMVU4gKi8KKwl1bnNpZ25lZCBjaGFyCXR5cGU7CQkvKiBkZXZpY2UgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIJcmVtb3ZhYmxlOwkvKiByZW1vdmFibGUgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX0xCQTQ4CisJdW5zaWduZWQgY2hhcglsYmE0ODsJCS8qIGRldmljZSBjYW4gdXNlIDQ4Yml0IGFkZHIgKEFUQS9BVEFQSSB2NykgKi8KKyNlbmRpZgorCWxiYWludF90CQlsYmE7CSAgCS8qIG51bWJlciBvZiBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nCWJsa3N6OwkJLyogYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yIFs0MCsxXTsgCS8qIElERSBtb2RlbCwgU0NTSSBWZW5kb3IgKi8KKwl1bnNpZ25lZCBjaGFyCXByb2R1Y3RbMjArMV07CS8qIElERSBTZXJpYWwgbm8sIFNDU0kgcHJvZHVjdCAqLworCXVuc2lnbmVkIGNoYXIJcmV2aXNpb25bOCsxXTsJLyogZmlybXdhcmUgcmV2aXNpb24gKi8KKwl1bnNpZ25lZCBsb25nCSgqYmxvY2tfcmVhZCkoaW50IGRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCSAgICAgIGxiYWludF90IGJsa2NudCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpidWZmZXIpOworfWJsb2NrX2Rldl9kZXNjX3Q7CisKKy8qIEludGVyZmFjZSB0eXBlczogKi8KKyNkZWZpbmUgSUZfVFlQRV9VTktOT1dOCQkwCisjZGVmaW5lIElGX1RZUEVfSURFCQkxCisjZGVmaW5lIElGX1RZUEVfU0NTSQkJMgorI2RlZmluZSBJRl9UWVBFX0FUQVBJCQkzCisjZGVmaW5lIElGX1RZUEVfVVNCCQk0CisjZGVmaW5lIElGX1RZUEVfRE9DCQk1CisjZGVmaW5lIElGX1RZUEVfTU1DCQk2CisKKy8qIFBhcnQgdHlwZXMgKi8KKyNkZWZpbmUgUEFSVF9UWVBFX1VOS05PV04JMHgwMAorI2RlZmluZSBQQVJUX1RZUEVfTUFDCQkweDAxCisjZGVmaW5lIFBBUlRfVFlQRV9ET1MJCTB4MDIKKyNkZWZpbmUgUEFSVF9UWVBFX0lTTwkJMHgwMworI2RlZmluZSBQQVJUX1RZUEVfQU1JR0EJCTB4MDQKKworLyoKKyAqIFR5cGUgc3RyaW5nIGZvciBVLUJvb3QgYm9vdGFibGUgcGFydGl0aW9ucworICovCisjZGVmaW5lIEJPT1RfUEFSVF9UWVBFCSJVLUJvb3QiCS8qIHByaW1hcnkgYm9vdCBwYXJ0aXRpb24gdHlwZQkqLworI2RlZmluZSBCT09UX1BBUlRfQ09NUAkiUFBDQm9vdCIJLyogUFBDQm9vdCBjb21wYXRpYmlsaXR5IHR5cGUJKi8KKworLyogZGV2aWNlIHR5cGVzICovCisjZGVmaW5lIERFVl9UWVBFX1VOS05PV04JMHhmZgkvKiBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIERFVl9UWVBFX0hBUkRESVNLCTB4MDAJLyogaGFyZGRpc2sgKi8KKyNkZWZpbmUgREVWX1RZUEVfVEFQRQkJMHgwMQkvKiBUYXBlICovCisjZGVmaW5lIERFVl9UWVBFX0NEUk9NCQkweDA1CS8qIENELVJPTSAqLworI2RlZmluZSBERVZfVFlQRV9PUERJU0sJCTB4MDcJLyogb3B0aWNhbCBkaXNrICovCisKK3R5cGVkZWYgc3RydWN0IGRpc2tfcGFydGl0aW9uIHsKKwl1bG9uZwlzdGFydDsJCS8qICMgb2YgZmlyc3QgYmxvY2sgaW4gcGFydGl0aW9uCSovCisJdWxvbmcJc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gcGFydGl0aW9uCSovCisJdWxvbmcJYmxrc3o7CQkvKiBibG9jayBzaXplIGluIGJ5dGVzCQkJKi8KKwl1Y2hhcgluYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUJCQkqLworCXVjaGFyCXR5cGVbMzJdOwkvKiBzdHJpbmcgdHlwZSBkZXNjcmlwdGlvbgkJKi8KK30gZGlza19wYXJ0aXRpb25fdDsKKworLyogZGlzay9wYXJ0LmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm8gKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7Cit2b2lkICBpbml0X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK3ZvaWQgZGV2X3ByaW50KGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKworCisjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKy8qIGRpc2svcGFydF9tYWMuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19tYWMgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X2Rvcy5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX2RvcyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfZG9zIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfZG9zIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfaXNvLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9faXNvIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9pc28gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9pc28gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X2FtaWdhLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X2FtaWdhIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1BBUlRfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9ydGMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvcnRjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogR2VuZXJpYyBSVEMgaW50ZXJmYWNlLgorICovCisjaWZuZGVmIF9SVENfSF8KKyNkZWZpbmUgX1JUQ19IXworCisvKiBiY2Q8LT5iaW4gZnVuY3Rpb25zIGFyZSBuZWVkZWQgYnkgYWxtb3N0IGFsbCB0aGUgUlRDIGRyaXZlcnMsIGxldCdzIGluY2x1ZGUKKyAqIGl0IHRoZXJlIGluc3RlYWQgb2YgaW4gZXZleSBzaW5nbGUgZHJpdmVyICovCisKKyNpbmNsdWRlIDxiY2QuaD4KKworLyoKKyAqIFRoZSBzdHJ1Y3QgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UgY29kZSB0bworICogdGhlIGhhcmR3YXJlIGRlcGVuZGVuZCBsb3ctbGV2ZWwgY29kZSBhbmRlIHZpY2UgdmVyc2EuIElkZW50aWNhbAorICogdG8gc3RydWN0IHJ0Y190aW1lIHVzZWQgYnkgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHNtYWxsIGJ1dCBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyB0byB0aGUKKyAqIGNvbW1vbiAic3RydWN0IHRpbWUiOgorICoKKyAqCQlzdHJ1Y3QgdGltZToJCXN0cnVjdCBydGNfdGltZToKKyAqIHRtX21vbgkwIC4uLiAxMQkJMSAuLi4gMTIKKyAqIHRtX3llYXIJeWVhcnMgc2luY2UgMTkwMAl5ZWFycyBzaW5jZSAwCisgKi8KKworc3RydWN0IHJ0Y190aW1lIHsKKwlpbnQgdG1fc2VjOworCWludCB0bV9taW47CisJaW50IHRtX2hvdXI7CisJaW50IHRtX21kYXk7CisJaW50IHRtX21vbjsKKwlpbnQgdG1feWVhcjsKKwlpbnQgdG1fd2RheTsKKwlpbnQgdG1feWRheTsKKwlpbnQgdG1faXNkc3Q7Cit9OworCit2b2lkIEdyZWdvcmlhbkRheSAoc3RydWN0IHJ0Y190aW1lICopOwordm9pZCB0b190bSAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7Cit1bnNpZ25lZCBsb25nIG1rdGltZSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkJICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgkvKiBfUlRDX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oIGIveC1sb2FkZXIvaW5jbHVkZS90aW1lc3RhbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY0Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS90aW1lc3RhbXAuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRXh0cmVtZSBFbmdpbmVlcmluZyBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fVElNRVNUQU1QX0hfXworI2RlZmluZQlfX1RJTUVTVEFNUF9IX18KKworI2lmbmRlZiBET19ERVBTX09OTFkKKyNpbmNsdWRlICJ0aW1lc3RhbXBfYXV0b2dlbmVyYXRlZC5oIgorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1RJTUVTVEFNUF9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvdmVyc2lvbi5oIGIveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0MjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fVkVSU0lPTl9IX18KKyNkZWZpbmUJX19WRVJTSU9OX0hfXworCisjaWZuZGVmIERPX0RFUFNfT05MWQorI2luY2x1ZGUgInZlcnNpb25fYXV0b2dlbmVyYXRlZC5oIgorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3dhdGNoZG9nLmggYi94LWxvYWRlci9pbmNsdWRlL3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBFcmlrIFRoZWlzZW4sICBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogV2F0Y2hkb2cgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCisgKi8KKyNpZm5kZWYgX1dBVENIRE9HX0hfCisjZGVmaW5lIF9XQVRDSERPR19IXworCisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpICYmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorIyAgZXJyb3IgIkNvbmZpZ3VyYXRpb24gZXJyb3I6IENPTkZJR19IV19XQVRDSERPRyBhbmQgQ09ORklHX1dBVENIRE9HIGNhbid0IGJlIHVzZWQgdG9nZXRoZXIuIgorI2VuZGlmCisKKy8qCisgKiBIYXJkd2FyZSB3YXRjaGRvZworICovCisjaWZkZWYgQ09ORklHX0hXX1dBVENIRE9HCisJI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKQorCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGJsIGh3X3dhdGNoZG9nX3Jlc2V0CisJI2Vsc2UKKwkJZXh0ZXJuIHZvaWQgaHdfd2F0Y2hkb2dfcmVzZXQodm9pZCk7CisKKwkJI2RlZmluZSBXQVRDSERPR19SRVNFVCBod193YXRjaGRvZ19yZXNldAorCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbHNlCisJLyoKKwkgKiBNYXliZSBhIHNvZnR3YXJlIHdhdGNoZG9nPworCSAqLworCSNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkJI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKQorCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCBibCB3YXRjaGRvZ19yZXNldAorCQkjZWxzZQorCQkJZXh0ZXJuIHZvaWQgd2F0Y2hkb2dfcmVzZXQodm9pZCk7CisKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgd2F0Y2hkb2dfcmVzZXQKKwkJI2VuZGlmCisJI2Vsc2UKKwkJLyoKKwkJICogTm8gaGFyZHdhcmUgb3Igc29mdHdhcmUgd2F0Y2hkb2cuCisJCSAqLworCQkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIC8qWFhYIERPX05PVF9ERUxfVEhJU19DT01NRU5UKi8KKwkJI2Vsc2UKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQoKSB7fQorCQkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisJI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAmJiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogQ09ORklHX0hXX1dBVENIRE9HICovCisKKyNlbmRpZiAvKiBfV0FUQ0hET0dfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL2NyYy5oIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MWNhYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL2NyYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIE1hcnZlbGwgU2VtaWNvbmR1Y3RvciA8d3d3Lm1hcnZlbGwuY29tPgorICogV3JpdHRlbi1ieTogUHJhZnVsbGEgV2FkYXNrYXIgPHByYWZ1bGxhQG1hcnZlbGwuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9YTE9BRF9DUkNfSAorI2RlZmluZSBfWExPQURfQ1JDX0gKKworLyogbGliL2NyYzMyLmMgKi8KK3VpbnQzMl90IGNyYzMyICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKK3VpbnQzMl90IGNyYzMyX3dkICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50LCB1aW50KTsKK3VpbnQzMl90IGNyYzMyX25vX2NvbXAgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOworCisjZW5kaWYgLyogX1hMT0FEX0NSQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC96bGliLmggYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNzA4MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaApAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gemxpYi5oIGFuZCB6Y29uZi5oIGZyb20gdGhlIHpsaWItMS4yLjMKKyAqIGRpc3RyaWJ1dGlvbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLCB3aXRoIHNvbWUgYWRkaXRpb25zCisgKiBieSBQYXVsIE1hY2tlcnJhcyB0byBhaWQgaW4gaW1wbGVtZW50aW5nIERlZmxhdGUgY29tcHJlc3Npb24gYW5kCisgKiBkZWNvbXByZXNzaW9uIGZvciBQUFAgcGFja2V0cy4KKyAqLworCisgLyoKKyAgKiA9PUZJTEVWRVJTSU9OIDk2MDEyMj09CisgICoKKyAgKiBUaGlzIG1hcmtlciBpcyB1c2VkIGJ5IHRoZSBMaW51eCBpbnN0YWxsYXRpb24gc2NyaXB0IHRvIGRldGVybWluZQorICAqIHdoZXRoZXIgYW4gdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgKi8KKworLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjMsIEp1bHkgMTh0aCwgMjAwNQorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMi4zIgorI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyMzAKKworLyogI2luY2x1ZGUgInpjb25mLmgiICovICAgICAgICAvKiBpbmNsdWRlZCBkaXJlY3RseSBoZXJlICovCisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBCZWdpbiBvZiBuZXcgemNvbmYuaCAqLworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICovCisjaWZkZWYgWl9QUkVGSVgKKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKworIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjICBkZWZpbmUgel9vZmZfdCBvZmZfdAorI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBpZmRlZiBGQVIKKyMgICAgdW5kZWYgRkFSCisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyNlbmRpZgorLyogRW5kIG9mIG5ldyB6Y29uZi5oICovCisKKy8qCisgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCisgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQorICBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKKyAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorKi8KKwordHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmNiX2Z1bmMpICAgIE9GKChCeXRlZiAqYnVmLCB1SW50IGxlbikpOworCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgeworCUJ5dGVmCSpuZXh0X2luOyAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKwl1SW50CWF2YWlsX2luOyAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KKwl1TG9uZwl0b3RhbF9pbjsgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKwlCeXRlZgkqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLworCXVJbnQJYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLworCXVMb25nCXRvdGFsX291dDsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCWNoYXIJKm1zZzsJLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisJc3RydWN0CWludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCWFsbG9jX2Z1bmMJemFsbG9jOwkvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCWZyZWVfZnVuYwl6ZnJlZTsJLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXZvaWRwZglvcGFxdWU7CS8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKwlpbnQJZGF0YV90eXBlOwkvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6CisJCQkJCWJpbmFyeSBvciB0ZXh0ICovCisJY2JfZnVuYwlvdXRjYjsJLyogY2FsbGVkIHJlZ3VsYXJseSBqdXN0IGJlZm9yZSBibG9ja3Mgb2Ygb3V0cHV0ICovCisJdUxvbmcJYWRsZXI7CS8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisJdUxvbmcJcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHpfc3RyZWFtOworCit0eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOworCisvKgorICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgorICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCisqLwordHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgeworCWludAl0ZXh0OwkvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCisJdUxvbmcJdGltZTsJLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKwlpbnQJeGZsYWdzOwkvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworCWludAlvczsJLyogb3BlcmF0aW5nIHN5c3RlbSAqLworCUJ5dGVmCSpleHRyYTsJLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqLworCXVJbnQJZXh0cmFfbGVuOyAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KKwl1SW50CWV4dHJhX21heDsgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlCeXRlZgkqbmFtZTsgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqLworCXVJbnQJbmFtZV9tYXg7IC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlCeXRlZgkqY29tbWVudDsgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi8KKwl1SW50CWNvbW1fbWF4OyAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisJaW50CWhjcmM7IC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovCisJaW50CWRvbmU7IC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCisJCQl3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCit9IGd6X2hlYWRlcjsKKwordHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEgLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQgKi8KKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKyNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9URVhUICAgICAxCisjZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLworI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLworCisvKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcworICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgorICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKwkJCQlpbnQgc3RyZWFtX3NpemUpKTsKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCisgICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZQorICAgIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cKKyAgICBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgorICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCisgIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2gKKyAgY2FsbCBvZiBpbmZsYXRlKCkuIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdAorICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCisgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBUaGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBjYW4gYmUgWl9OT19GTFVTSCwgWl9TWU5DX0ZMVVNILAorICBaX0ZJTklTSCwgb3IgWl9CTE9DSy4gWl9TWU5DX0ZMVVNIIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIGZsdXNoIGFzIG11Y2gKKyAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIHN0b3AKKyAgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQorICB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlcgorICB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsIGluZmxhdGUoKQorICB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuIHdoZW4gaXQgZ2V0cyB0bworICB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KKworICAgIFRoZSBaX0JMT0NLIG9wdGlvbiBhc3Npc3RzIGluIGFwcGVuZGluZyB0byBvciBjb21iaW5pbmcgZGVmbGF0ZSBzdHJlYW1zLgorICBBbHNvIHRvIGFzc2lzdCBpbiB0aGlzLCBvbiByZXR1cm4gaW5mbGF0ZSgpIHdpbGwgc2V0IHN0cm0tPmRhdGFfdHlwZSB0byB0aGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luLCBwbHVzIDY0CisgIGlmIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGRlZmxhdGUgc3RyZWFtLAorICBwbHVzIDEyOCBpZiBpbmZsYXRlKCkgcmV0dXJuZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcgYW4gZW5kLW9mLWJsb2NrCisgIGNvZGUgb3IgZGVjb2RpbmcgdGhlIGNvbXBsZXRlIGhlYWRlciB1cCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAgZGVmbGF0ZSBzdHJlYW0uIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4KKyAgYml0IDcgb2YgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUKKyAgbGVzcyB0aGFuIGVpZ2h0LgorCisgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KKyAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKKyAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bworICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKKyAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAorICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKKyAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAorICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKworICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKKyAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQorICBmaXJzdCBjYWxsLiBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5CisgIGJlY2F1c2UgWl9CTE9DSyBpcyB1c2VkLgorCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZSBkaWN0aW9uYXJ5CisgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKKyAgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCisgIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkCisgIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAorICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIHdpbGwgZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKKyAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuICBBbnkgaW5mb3JtYXRpb24KKyAgY29udGFpbmVkIGluIHRoZSBnemlwIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdAorICBpbmZvcm1hdGlvbiBzaG91bGQgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IKKyAgaW5mbGF0ZUJhY2soKSBhbmQgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kCisgIHRyYWlsZXIuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKKyAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKKyAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KKyAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyovCisKKy8qCisgICAgIENvbWJpbmUgdHdvIEFkbGVyLTMyIGNoZWNrc3VtcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLCBzZXExCisgICBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQWRsZXItMzIgY2hlY2tzdW1zIHdlcmUgY2FsY3VsYXRlZCBmb3IKKyAgIGVhY2gsIGFkbGVyMSBhbmQgYWRsZXIyLiAgYWRsZXIzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YKKyAgIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBhZGxlcjEsIGFkbGVyMiwgYW5kIGxlbjIuCisqLworCitaRVhURVJOICB1SW50IFpFWFBPUlQgY3JjMzIgIE9GKCh1SW50IGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQ1JDLTMyIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUKKyAgIHVwZGF0ZWQgQ1JDLTMyLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsCisgICB2YWx1ZSBmb3IgdGhlIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMKKyAgIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisJaW5mbGF0ZUluaXRfKChzdHJtKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorCWluZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKworI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCisJc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFpMSUJfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL01ha2VmaWxlIGIveC1sb2FkZXIvbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDM0NDIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQVJDSCkuYQorCitTT0JKUwkrPSBfYXNobGRpMy5vCitTT0JKUwkrPSBfZGl2c2kzLm8KK1NPQkpTCSs9IF9sc2hyZGkzLm8KK1NPQkpTCSs9IF9tb2RzaTMubworU09CSlMJKz0gX3VkaXZzaTMubworU09CSlMJKz0gX3Vtb2RzaTMubworCitDT0JKUy15ICs9IGNyYzMyLm8KK0NPQkpTLXkgKz0gY3R5cGUubworQ09CSlMteSArPSBkaXNwbGF5X29wdGlvbnMubworQ09CSlMteQkrPSBkaXYwLm8KK0NPQkpTLXkJKz0gYm9hcmQubworQ09CSlMteSArPSBzdHJpbmcubworQ09CSlMteQkrPSBlY2MubworQ09CSlMteQkrPSBwcmludGYubworQ09CSlMteQkrPSBvbWFwX2JjaF9kZWNvZGVyLm8KK0NPQkpTLXkJKz0gb21hcF9iY2gubworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fYXNobGRpMy5TIGIveC1sb2FkZXIvbGliL19hc2hsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZGRjMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fYXNobGRpMy5TCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgYWwgcjEKKyNkZWZpbmUgYWggcjAKKyNlbHNlCisjZGVmaW5lIGFsIHIwCisjZGVmaW5lIGFoIHIxCisjZW5kaWYKKworLmdsb2JsIF9fYXNobGRpMworLmdsb2JsCV9fYWVhYmlfbGxzbAorX19hc2hsZGkzOgorX19hZWFiaV9sbHNsOgorCisJc3VicwlyMywgcjIsICMzMgorCXJzYglpcCwgcjIsICMzMgorCW1vdm1pCWFoLCBhaCwgbHNsIHIyCisJbW92cGwJYWgsIGFsLCBsc2wgcjMKKwlvcnJtaQlhaCwgYWgsIGFsLCBsc3IgaXAKKwltb3YJYWwsIGFsLCBsc2wgcjIKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX2RpdnNpMy5TIGIveC1sb2FkZXIvbGliL19kaXZzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJhZGIyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19kaXZzaTMuUwpAQCAtMCwwICsxLDE0MiBAQAorCisubWFjcm8gQVJNX0RJVl9CT0RZIGRpdmlkZW5kLCBkaXZpc29yLCByZXN1bHQsIGN1cmJpdAorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcY3VyYml0LCBcZGl2aXNvcgorCWNseglccmVzdWx0LCBcZGl2aWRlbmQKKwlzdWIJXHJlc3VsdCwgXGN1cmJpdCwgXHJlc3VsdAorCW1vdglcY3VyYml0LCAjMQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCBccmVzdWx0CisJbW92CVxjdXJiaXQsIFxjdXJiaXQsIGxzbCBccmVzdWx0CisJbW92CVxyZXN1bHQsICMwCisKKyNlbHNlCisKKwlAIEluaXRpYWxseSBzaGlmdCB0aGUgZGl2aXNvciBsZWZ0IDMgYml0cyBpZiBwb3NzaWJsZSwKKwlAIHNldCBjdXJiaXQgYWNjb3JkaW5nbHkuICBUaGlzIGFsbG93cyBmb3IgY3VyYml0IHRvIGJlIGxvY2F0ZWQKKwlAIGF0IHRoZSBsZWZ0IGVuZCBvZiBlYWNoIDQgYml0IG5pYmJsZXMgaW4gdGhlIGRpdmlzaW9uIGxvb3AKKwlAIHRvIHNhdmUgb25lIGxvb3AgaW4gbW9zdCBjYXNlcy4KKwl0c3QJXGRpdmlzb3IsICMweGUwMDAwMDAwCisJbW92ZXEJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzMKKwltb3ZlcQlcY3VyYml0LCAjOAorCW1vdm5lCVxjdXJiaXQsICMxCisKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorMToJY21wCVxkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjNAorCW1vdmxvCVxjdXJiaXQsIFxjdXJiaXQsIGxzbCAjNAorCWJsbwkxYgorCisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisxOgljbXAJXGRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICMxCisJbW92bG8JXGN1cmJpdCwgXGN1cmJpdCwgbHNsICMxCisJYmxvCTFiCisKKwltb3YJXHJlc3VsdCwgIzAKKworI2VuZGlmCisKKwlAIERpdmlzaW9uIGxvb3AKKzE6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMQorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMxCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzEKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMyCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzIKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMworCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMzCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzMKKwljbXAJXGRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCVxjdXJiaXQsICAgXGN1cmJpdCwgIGxzciAjNAlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCVxkaXZpc29yLCAgXGRpdmlzb3IsIGxzciAjNAorCWJuZQkxYgorCisuZW5kbQorCisubWFjcm8gQVJNX0RJVjJfT1JERVIgZGl2aXNvciwgb3JkZXIKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXG9yZGVyLCBcZGl2aXNvcgorCXJzYglcb3JkZXIsIFxvcmRlciwgIzMxCisKKyNlbHNlCisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCAxNikKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjMTYKKwltb3Zocwlcb3JkZXIsICMxNgorCW1vdmxvCVxvcmRlciwgIzAKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDgpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzgKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzgKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDQpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzQKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzQKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDIpCisJYWRkaGkJXG9yZGVyLCBcb3JkZXIsICMzCisJYWRkbHMJXG9yZGVyLCBcb3JkZXIsIFxkaXZpc29yLCBsc3IgIzEKKworI2VuZGlmCisKKy5lbmRtCisKKwkuYWxpZ24JNQorLmdsb2JsIF9fZGl2c2kzCisuZ2xvYmwgX19hZWFiaV9pZGl2CitfX2RpdnNpMzoKK19fYWVhYmlfaWRpdjoKKwljbXAJcjEsICMwCisJZW9yCWlwLCByMCwgcjEJCQlAIHNhdmUgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdC4KKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJc3VicwlyMiwgcjEsICMxCQkJQCBkaXZpc2lvbiBieSAxIG9yIC0xID8KKwliZXEJMTBmCisJbW92cwlyMywgcjAKKwlyc2JtaQlyMywgcjAsICMwCQkJQCBwb3NpdGl2ZSBkaXZpZGVuZCB2YWx1ZQorCWNtcAlyMywgcjEKKwlibHMJMTFmCisJdHN0CXIxLCByMgkJCQlAIGRpdmlzb3IgaXMgcG93ZXIgb2YgMiA/CisJYmVxCTEyZgorCisJQVJNX0RJVl9CT0RZIHIzLCByMSwgcjAsIHIyCisKKwljbXAJaXAsICMwCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworMTA6CXRlcQlpcCwgcjAJCQkJQCBzYW1lIHNpZ24gPworCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKzExOgltb3ZsbwlyMCwgIzAKKwltb3ZlcQlyMCwgaXAsIGFzciAjMzEKKwlvcnJlcQlyMCwgcjAsICMxCisJbW92CXBjLCBscgorCisxMjoJQVJNX0RJVjJfT1JERVIgcjEsIHIyCisKKwljbXAJaXAsICMwCisJbW92CXIwLCByMywgbHNyIHIyCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworTGRpdjA6CisKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAlfX2RpdjAKKwltb3YJcjAsICMwCQkJQCBBYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZS4KKwlsZHIJcGMsIFtzcF0sICM0CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX2xzaHJkaTMuUyBiL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmE3OTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX2xzaHJkaTMuUwpAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKK0Jvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKworCisjaWZkZWYgX19BUk1FQl9fCisjZGVmaW5lIGFsIHIxCisjZGVmaW5lIGFoIHIwCisjZWxzZQorI2RlZmluZSBhbCByMAorI2RlZmluZSBhaCByMQorI2VuZGlmCisKKy5nbG9ibCBfX2xzaHJkaTMKKy5nbG9ibCBfX2FlYWJpX2xsc3IKK19fbHNocmRpMzoKK19fYWVhYmlfbGxzcjoKKworCXN1YnMJcjMsIHIyLCAjMzIKKwlyc2IJaXAsIHIyLCAjMzIKKwltb3ZtaQlhbCwgYWwsIGxzciByMgorCW1vdnBsCWFsLCBhaCwgbHNyIHIzCisJb3JybWkJYWwsIGFsLCBhaCwgbHNsIGlwCisJbW92CWFoLCBhaCwgbHNyIHIyCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19tb2RzaTMuUyBiL3gtbG9hZGVyL2xpYi9fbW9kc2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YzU4NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fbW9kc2kzLlMKQEAgLTAsMCArMSw5OSBAQAorCisubWFjcm8gQVJNX01PRF9CT0RZIGRpdmlkZW5kLCBkaXZpc29yLCBvcmRlciwgc3BhcmUKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXG9yZGVyLCBcZGl2aXNvcgorCWNseglcc3BhcmUsIFxkaXZpZGVuZAorCXN1Yglcb3JkZXIsIFxvcmRlciwgXHNwYXJlCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNsIFxvcmRlcgorCisjZWxzZQorCisJbW92CVxvcmRlciwgIzAKKworCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisxOgljbXAJXGRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICM0CisJYWRkbG8JXG9yZGVyLCBcb3JkZXIsICM0CisJYmxvCTFiCisKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKzE6CWNtcAlcZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzEKKwlhZGRsbwlcb3JkZXIsIFxvcmRlciwgIzEKKwlibG8JMWIKKworI2VuZGlmCisKKwlAIFBlcmZvcm0gYWxsIG5lZWRlZCBzdWJzdHJhY3Rpb25zIHRvIGtlZXAgb25seSB0aGUgcmVtaW5kZXIuCisJQCBEbyBjb21wYXJpc29ucyBpbiBiYXRjaCBvZiA0IGZpcnN0LgorCXN1YnMJXG9yZGVyLCBcb3JkZXIsICMzCQlAIHllcywgMyBpcyBpbnRlbmRlZCBoZXJlCisJYmx0CTJmCisKKzE6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzEKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMQorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMyCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzIKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMworCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMzCisJY21wCVxkaXZpZGVuZCwgIzEKKwltb3YJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzQKKwlzdWJnZXMJXG9yZGVyLCBcb3JkZXIsICM0CisJYmdlCTFiCisKKwl0c3QJXG9yZGVyLCAjMworCXRlcW5lCVxkaXZpZGVuZCwgIzAKKwliZXEJNWYKKworCUAgRWl0aGVyIDEsIDIgb3IgMyBjb21wYXJpc29uL3N1YnN0cmFjdGlvbnMgYXJlIGxlZnQuCisyOgljbW4JXG9yZGVyLCAjMgorCWJsdAk0ZgorCWJlcQkzZgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJbW92CVxkaXZpc29yLCAgXGRpdmlzb3IsICBsc3IgIzEKKzM6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJbW92CVxkaXZpc29yLCAgXGRpdmlzb3IsICBsc3IgIzEKKzQ6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCis1OgorLmVuZG0KKworCS5hbGlnbgk1CisuZ2xvYmwgX19tb2RzaTMKK19fbW9kc2kzOgorCWNtcAlyMSwgIzAKKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJbW92cwlpcCwgcjAJCQkJQCBwcmVzZXJ2ZSBzaWduIG9mIGRpdmlkZW5kCisJcnNibWkJcjAsIHIwLCAjMAkJCUAgaWYgbmVnYXRpdmUgbWFrZSBwb3NpdGl2ZQorCXN1YnMJcjIsIHIxLCAjMQkJCUAgY29tcGFyZSBkaXZpc29yIHdpdGggMQorCWNtcG5lCXIwLCByMQkJCQlAIGNvbXBhcmUgZGl2aWRlbmQgd2l0aCBkaXZpc29yCisJbW92ZXEJcjAsICMwCisJdHN0aGkJcjEsIHIyCQkJCUAgc2VlIGlmIGRpdmlzb3IgaXMgcG93ZXIgb2YgMgorCWFuZGVxCXIwLCByMCwgcjIKKwlibHMJMTBmCisKKwlBUk1fTU9EX0JPRFkgcjAsIHIxLCByMiwgcjMKKworMTA6CWNtcAlpcCwgIzAKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisKK0xkaXYwOgorCisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJX19kaXYwCisJbW92CXIwLCAjMAkJCUAgQWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuCisJbGRyCXBjLCBbc3BdLCAjNApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL191ZGl2c2kzLlMgYi94LWxvYWRlci9saWIvX3VkaXZzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2RjZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL191ZGl2c2kzLlMKQEAgLTAsMCArMSw3NyBAQAorLyogIyAxICJsaWJnY2MxLlMiICovCitAIGxpYmdjYzEgcm91dGluZXMgZm9yIEFSTSBjcHUuCitAIERpdmlzaW9uIHJvdXRpbmVzLCB3cml0dGVuIGJ5IFJpY2hhcmQgRWFybnNoYXcsIChyZWFybnNoYUBhcm1sdGQuY28udWspCitkaXZpZGVuZAkucmVxCXIwCitkaXZpc29yCQkucmVxCXIxCityZXN1bHQJCS5yZXEJcjIKK2N1cmJpdAkJLnJlcQlyMworLyogaXAJCS5yZXEJcjEyCSovCisvKiBzcAkJLnJlcQlyMTMJKi8KKy8qIGxyCQkucmVxCXIxNAkqLworLyogcGMJCS5yZXEJcjE1CSovCisJLnRleHQKKwkuZ2xvYmwJIF9fdWRpdnNpMworCS50eXBlICBfX3VkaXZzaTMgICAgICAgLGZ1bmN0aW9uCisJLmFsaWduCTAKKyBfX3VkaXZzaTMgICAgICA6CisJY21wCWRpdmlzb3IsICMwCisJYmVxCUxkaXYwCisJbW92CWN1cmJpdCwgIzEKKwltb3YJcmVzdWx0LCAjMAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCWJjYwlMZ290X3Jlc3VsdAorTG9vcDE6CisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKwljbXAJZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjNAorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzQKKwliY2MJTG9vcDEKK0xiaWdudW06CisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisJY21wCWRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzEKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICMxCisJYmNjCUxiaWdudW0KK0xvb3AzOgorCUAgVGVzdCBmb3IgcG9zc2libGUgc3VidHJhY3Rpb25zLCBhbmQgbm90ZSB3aGljaCBiaXRzCisJQCBhcmUgZG9uZSBpbiB0aGUgcmVzdWx0LiAgT24gdGhlIGZpbmFsIHBhc3MsIHRoaXMgbWF5IHN1YnRyYWN0CisJQCB0b28gbXVjaCBmcm9tIHRoZSBkaXZpZGVuZCwgYnV0IHRoZSByZXN1bHQgd2lsbCBiZSBvaywgc2luY2UgdGhlCisJQCAiYml0IiB3aWxsIGhhdmUgYmVlbiBzaGlmdGVkIG91dCBhdCB0aGUgYm90dG9tLgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvcgorCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzMKKwljbXAJZGl2aWRlbmQsICMwCQkJQCBFYXJseSB0ZXJtaW5hdGlvbj8KKwltb3ZuZXMJY3VyYml0LCBjdXJiaXQsIGxzciAjNAkJQCBObywgYW55IG1vcmUgYml0cyB0byBkbz8KKwltb3ZuZQlkaXZpc29yLCBkaXZpc29yLCBsc3IgIzQKKwlibmUJTG9vcDMKK0xnb3RfcmVzdWx0OgorCW1vdglyMCwgcmVzdWx0CisJbW92IAlwYywgbHIKK0xkaXYwOgorCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCSBfX2RpdjAgICAgICAgKFBMVCkKKwltb3YJcjAsICMwCQkJQCBhYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZQorCWxkbWlhCXNwISwge3BjfQorCS5zaXplICBfX3VkaXZzaTMgICAgICAgLCAuIC0gIF9fdWRpdnNpMworLyogIyAyMzUgImxpYmdjYzEuUyIgKi8KKy8qICMgMzIwICJsaWJnY2MxLlMiICovCisvKiAjIDQyMSAibGliZ2NjMS5TIiAqLworLyogIyA0MzMgImxpYmdjYzEuUyIgKi8KKy8qICMgNDU2ICJsaWJnY2MxLlMiICovCisvKiAjIDUwMCAibGliZ2NjMS5TIiAqLworLyogIyA1ODAgImxpYmdjYzEuUyIgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fdW1vZHNpMy5TIGIveC1sb2FkZXIvbGliL191bW9kc2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhZWJlOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fdW1vZHNpMy5TCkBAIC0wLDAgKzEsODggQEAKKy8qICMgMSAibGliZ2NjMS5TIiAqLworQCBsaWJnY2MxIHJvdXRpbmVzIGZvciBBUk0gY3B1LgorQCBEaXZpc2lvbiByb3V0aW5lcywgd3JpdHRlbiBieSBSaWNoYXJkIEVhcm5zaGF3LCAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorLyogIyAxNDUgImxpYmdjYzEuUyIgKi8KK2RpdmlkZW5kCS5yZXEJcjAKK2Rpdmlzb3IJCS5yZXEJcjEKK292ZXJkb25lCS5yZXEJcjIKK2N1cmJpdAkJLnJlcQlyMworLyogaXAJCS5yZXEJcjEyCSovCisvKiBzcAkJLnJlcQlyMTMJKi8KKy8qIGxyCQkucmVxCXIxNAkqLworLyogcGMJCS5yZXEJcjE1CSovCisJLnRleHQKKwkuZ2xvYmwJIF9fdW1vZHNpMworCS50eXBlICBfX3Vtb2RzaTMgICAgICAgLGZ1bmN0aW9uCisJLmFsaWduIDAKKyBfX3Vtb2RzaTMgICAgICA6CisJY21wCWRpdmlzb3IsICMwCisJYmVxCUxkaXYwCisJbW92CWN1cmJpdCwgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwltb3ZjYyAgCXBjLCBscgorTG9vcDE6CisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKwljbXAJZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjNAorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzQKKwliY2MJTG9vcDEKK0xiaWdudW06CisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisJY21wCWRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzEKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICMxCisJYmNjCUxiaWdudW0KK0xvb3AzOgorCUAgVGVzdCBmb3IgcG9zc2libGUgc3VidHJhY3Rpb25zLiAgT24gdGhlIGZpbmFsIHBhc3MsIHRoaXMgbWF5CisJQCBzdWJ0cmFjdCB0b28gbXVjaCBmcm9tIHRoZSBkaXZpZGVuZCwgc28ga2VlcCB0cmFjayBvZiB3aGljaAorCUAgc3VidHJhY3Rpb25zIGFyZSBkb25lLCB3ZSBjYW4gZml4IHRoZW0gdXAgYWZ0ZXJ3YXJkcy4uLgorCW1vdglvdmVyZG9uZSwgIzAKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMyCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzMKKwltb3YJaXAsIGN1cmJpdAorCWNtcAlkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwljdXJiaXQsIGN1cmJpdCwgbHNyICM0CQlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCWRpdmlzb3IsIGRpdmlzb3IsIGxzciAjNAorCWJuZQlMb29wMworCUAgQW55IHN1YnRyYWN0aW9ucyB0aGF0IHdlIHNob3VsZCBub3QgaGF2ZSBkb25lIHdpbGwgYmUgcmVjb3JkZWQgaW4KKwlAIHRoZSB0b3AgdGhyZWUgYml0cyBvZiAib3ZlcmRvbmUiLiAgRXhhY3RseSB3aGljaCB3ZXJlIG5vdCBuZWVkZWQKKwlAIGFyZSBnb3Zlcm5lZCBieSB0aGUgcG9zaXRpb24gb2YgdGhlIGJpdCwgc3RvcmVkIGluIGlwLgorCUAgSWYgd2UgdGVybWluYXRlZCBlYXJseSwgYmVjYXVzZSBkaXZpZGVuZCBiZWNhbWUgemVybywKKwlAIHRoZW4gbm9uZSBvZiB0aGUgYmVsb3cgd2lsbCBtYXRjaCwgc2luY2UgdGhlIGJpdCBpbiBpcCB3aWxsIG5vdCBiZQorCUAgaW4gdGhlIGJvdHRvbSBuaWJibGUuCisJYW5kcwlvdmVyZG9uZSwgb3ZlcmRvbmUsICMweGUwMDAwMDAwCisJbW92ZXEgIAlwYywgbHIJCQkJQCBObyBmaXh1cHMgbmVlZGVkCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMzCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzIKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMQorCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJbW92IAlwYywgbHIKK0xkaXYwOgorCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCSBfX2RpdjAgICAgICAgKFBMVCkKKwltb3YJcjAsICMwCQkJQCBhYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZQorCWxkbWlhCXNwISwge3BjfQorCS5zaXplICBfX3Vtb2RzaTMgICAgICAgLCAuIC0gIF9fdW1vZHNpMworLyogIyAzMjAgImxpYmdjYzEuUyIgKi8KKy8qICMgNDIxICJsaWJnY2MxLlMiICovCisvKiAjIDQzMyAibGliZ2NjMS5TIiAqLworLyogIyA0NTYgImxpYmdjYzEuUyIgKi8KKy8qICMgNTAwICJsaWJnY2MxLlMiICovCisvKiAjIDU4MCAibGliZ2NjMS5TIiAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2JvYXJkLmMgYi94LWxvYWRlci9saWIvYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkzNTg0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2JvYXJkLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBKaWFuIFpoYW5nLCBUZXhhcyBJbnN0cnVtZW50cywganpoYW5nQHRpLmNvbS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDItMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxib290bS5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPG1tYy5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyoKKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucworICovCisjaWZuZGVmIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORyAiIgorI2VuZGlmCisKKy8qIFR5cGUgRGVmaW5pdGlvbiAqLworCit0eXBlZGVmIGludCAoaW5pdF9mbmNfdCkodm9pZCk7CisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KK2V4dGVybiBpbnQgbWlzY19pbml0X3IgKHZvaWQpOworZXh0ZXJuIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldik7CitleHRlcm4gaW50IGdldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpOworCisvKgorICogR2xvYmFsIFZhcmlhYmxlcworICovCitjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW10gPQorCVhfTE9BREVSX1ZFUlNJT04iICgiIFhfTE9BREVSX0RBVEUgIiAtICIgWF9MT0FERVJfVElNRSAiKSJDT05GSUdfSURFTlRfU1RSSU5HOworCitpbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7CisJY3B1X2luaXQsCQkvKiBiYXNpYyBjcHUgZGVwZW5kZW50IHNldHVwICovCisJYm9hcmRfaW5pdCwJCS8qIGJhc2ljIGJvYXJkIGRlcGVuZGVudCBzZXR1cCAqLworI2lmZGVmIENGR19QUklOVEYKKyAJc2VyaWFsX2luaXQsCQkvKiBzZXJpYWwgY29tbXVuaWNhdGlvbnMgc2V0dXAgKi8KKwlkaXNwbGF5X29wdGlvbnMsCisjZW5kaWYKKyAgCW5hbmRfaW5pdCwJCS8qIGJvYXJkIHNwZWNpZmljIG5hbmQgaW5pdCAqLworICAJTlVMTCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2xvYWRfcGFyYW1zKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgY29uc3QgaW50ICppbmRleCwgaW50IGNvdW50KQoreworCWlmIChidWZmZXIgPT0gTlVMTCB8fCBpbmRleCA9PSBOVUxMIHx8IGNvdW50ID09IDAgfHwgKmluZGV4IDwgQk9PVE1fSU5ERVhfU1RBUlQgfHwgKmluZGV4ID49IGNvdW50KSB7CisJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworfQorCisjaWYgKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKQorLyoKKyAqICBpbnQgZmF0X2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gdGhlIGZpcnN0IGluaXRpYWxpemVkCisgKiAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgZGV2aWNlLCBvbmUgb2Ygb25lIG9yIG1vcmUgZGVzaWduYXRlZAorICogICAgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBmcm9tIHRoZSBhIEZBVCBmaWxlIHN5c3RlbSBvbgorICogICAgdGhlIGZpcnN0IHBhcnRpdGlvbiBvZiBhIE1hc3RlciBCb290IFJlY29yZCB2b2x1bWUuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIGJvb3QgZmlsZSB0byBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBib290IGZpbGUgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBmYXRfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQk9PVEZJTEUpCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7IENPTkZJR19CT09URklMRSB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQk9PVEZJTEVfTElTVCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSBDT05GSUdfQk9PVEZJTEVfTElTVDsKKyNlbHNlCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09URklMRSkgKi8KKwljb25zdCBjaGFyICogZmlsZSA9IE5VTEw7CisJY29uc3QgY2hhciAqIGZhaWx1cmUgPSBOVUxMOworCWNvbnN0IGludCBjb3VudCA9IEFSUkFZX1NJWkUoZmlsZXMpOworCWNvbnN0IGludCBkZXZpY2UgPSAwOworCWNvbnN0IGludCBwYXJ0aXRpb24gPSAxOworCWNvbnN0IGludCBtYXhzaXplID0gMDsKKwljb25zdCBpbnQgdmVyYm9zZSA9IDE7CisJbG9uZyBzaXplID0gMDsKKwlibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOworCisJaWYgKCFjaGVja19sb2FkX3BhcmFtcyhidWZmZXIsIGluZGV4LCBjb3VudCkpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJZmlsZSA9IGZpbGVzWygqaW5kZXgpKytdOworCisJaWYgKCppbmRleCA+PSBjb3VudCkgeworCQkqaW5kZXggPSBCT09UTV9JTkRFWF9TVE9QOworCX0KKworCXN0YXR1cyA9IG1tY19pbml0KHZlcmJvc2UpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWZhaWx1cmUgPSAiTU1DIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIjsKKwkJZ290byBmYWlsOworCX0KKworICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoZGV2aWNlKTsKKworICAgIGlmIChkZXZfZGVzYyA9PSBOVUxMKSB7CisJCWZhaWx1cmUgPSAiQ291bGQgbm90IGFjY2VzcyBNTUMgZGV2aWNlXG4iOworCQlnb3RvIGZhaWw7CisgICAgfQorCisgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgcGFydGl0aW9uKTsKKworCXNpemUgPSBmaWxlX2ZhdF9yZWFkKGZpbGUsIGJ1ZmZlciwgbWF4c2l6ZSk7CisKKwlpZiAoc2l6ZSA9PSAtMSkgeworCQlwcmludGYoIkNvdWxkIG5vdCByZWFkIGZpbGUgXCIlc1wiXG4iLCBmaWxlKTsKKwkJZ290byBmYWlsOworCX0KKworCXByaW50ZigiXG4lbGQgYnl0ZXMgcmVhZFxuIiwgc2l6ZSk7CisKKwlwcmludGYoIkxvYWRpbmcgZnJvbSBNTUMlZCwgZmlsZSBcIiVzXCJcbiIsIGRldmljZSwgZmlsZSk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKKworIGZhaWw6CisJaWYgKGZhaWx1cmUgIT0gTlVMTCkgeworCQlwdXRzKGZhaWx1cmUpOworCX0KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworfQorI2VuZGlmIC8qIChkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZCAoQ0ZHX01NQ19OQU5EKSkgJiYgZGVmaW5lZChDRkdfQ01EX0ZBVCkgKi8KKworLyoKKyAqICBpbnQgYmxvY2tfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIGJsb2NrIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAgICAgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggICAgICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgICAgIGxvYWQuCisgKiAgICBjb3VudCAgICAgIC0gVGhlIHRvdGFsIG51bWJlciBvZiBleHRlbnRzLgorICogICAgZXh0ZW50cyAgICAtIFRoZSBhcnJheSBvZiBib290IGZpbGUgZXh0ZW50cyB0byBhdHRlbXB0IHRvIGxvYWQuCisgKiAgICBkZXZpY2UgICAgIC0gQSBwb2ludGVyIHRvIGEgQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYmxvY2sgZGV2aWNlIAorICogICAgICAgICAgICAgICAgIGJlaW5nIGxvYWRlZCBmcm9tLgorICogICAgcmVhZCAgICAgICAtIEEgcG9pbnRlciB0byB0aGUgZGV2aWNlLXNwZWNpZmljIGZ1bmN0aW9uIHRoYXQgd2lsbAorICogICAgICAgICAgICAgICAgIHJlYWQgdGhlIGJsb2NrcyB0byBsb2FkLgorICogICAgYmxvY2tfc2l6ZSAtIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGRldmljZSdzIGZ1bmRhbWVudGFsIHJlYWQKKyAqICAgICAgICAgICAgICAgICBibG9jayBzaXplLgorICogICAgCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IGJsb2NrX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4LCBpbnQgY291bnQsIGNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdLCBjb25zdCBjaGFyICpkZXZpY2UsIGludCAoKnJlYWQpKHVuc2lnbmVkIGNoYXIgKiwgdWxvbmcpLCB1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUpCit7CisJY29uc3QgYm9vdF9leHRlbnRfdCAqZXh0ZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IHJlYWRfc3RhdHVzOworCisJaWYgKCFjaGVja19sb2FkX3BhcmFtcyhidWZmZXIsIGluZGV4LCBjb3VudCkpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJZXh0ZW50ID0gJmV4dGVudHNbKCppbmRleCkrK107CisKKwlpZiAoKmluZGV4ID49IGNvdW50KSB7CisJCSppbmRleCA9IEJPT1RNX0lOREVYX1NUT1A7CisJfQorCisJZW5kID0gZXh0ZW50LT5zdGFydCArIGV4dGVudC0+c2l6ZSArIDE7CisKKwlmb3IgKGFkZHJlc3MgPSBleHRlbnQtPnN0YXJ0OyBhZGRyZXNzIDwgZW5kOyBhZGRyZXNzICs9IGJsb2NrX3NpemUpIHsKKwkJcmVhZF9zdGF0dXMgPSByZWFkKGJ1ZmZlciwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgCisJCS8qIElmIHN1Y2Nlc3NmdWwsIG1vdmUgdGhlIGRhdGEgcG9pbnRlci4gIElmIEVDQyBmYWlscywKKwkJICogcmVwb3J0IGZhaWx1cmUgdG8gY2FsbGVyLiAgSWYgc2tpcHBpbmcgYmFkIGJsb2NrLAorCQkgKiBqdXN0IGNvbnRpbnVlIGxvb3Bpbmcgd2l0aG91dCBtb3ZpbmcgdGhlIGRhdGEgcG9pbnRlci4KKwkJICovCisJCWlmIChyZWFkX3N0YXR1cyA9PSBOQU5EX1JFQURfU1VDQ0VTUykKKwkJeworCQkJYnVmZmVyICs9IGJsb2NrX3NpemU7CisJCX0KKwkJZWxzZSBpZiAocmVhZF9zdGF0dXMgPT0gTkFORF9SRUFEX0VDQ19GQUlMVVJFKQorCQl7CisJCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCXByaW50ZigiTG9hZGluZyBmcm9tICVzLCBvZmZzZXQgJSMwOGx4XG4iLCBkZXZpY2UsIGV4dGVudC0+c3RhcnQpOworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpCisvKgorICogIGludCBvbmVuYW5kX2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gYSBPbmVOQU5EIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgb25lbmFuZF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQgfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVF9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlRfTElTVDsKKyNlbHNlCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQpICovCisKKwlyZXR1cm4gYmxvY2tfbG9hZChidWZmZXIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgQVJSQVlfU0laRShleHRlbnRzKSwKKwkJCQkJICBleHRlbnRzLAorCQkJCQkgICJPbmVOQU5EIiwKKwkJCQkJICBvbmVuYW5kX3JlYWRfYmxvY2ssCisJCQkJCSAgT05FTkFORF9CTE9DS19TSVpFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX05BTkQpCisvKgorICogIGludCBuYW5kX2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gYSBOQU5EIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1RFWFRFTlQpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IENPTkZJR19OQU5EX0JPT1RFWFRFTlQgfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IENPTkZJR19OQU5EX0JPT1RFWFRFTlRfTElTVDsKKyNlbHNlCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1RFWFRFTlQpICovCisKKwlyZXR1cm4gYmxvY2tfbG9hZChidWZmZXIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgQVJSQVlfU0laRShleHRlbnRzKSwKKwkJCQkJICBleHRlbnRzLAorCQkJCQkgICJOQU5EIiwKKwkJCQkJICBuYW5kX3JlYWRfYmxvY2ssCisJCQkJCSAgTkFORF9CTE9DS19TSVpFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX05BTkQpICovCisKKy8qCisgKiAgdm9pZCBkb19hcm1fYm9vdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIGJvb3QgdGhlIHN5c3RlbSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAqICAgIGJvb3QgZGV2aWNlIGFmdGVyIGNvcHlpbmcgdGhlIHNlY29uZGFyeS1wcm9ncmFtIGxvYWRlciBpbnRvCisgKiAgICB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgdHlwZSAgIC0gVGhlIGJvb3QgZGV2aWNlIHRvIGJvb3QgZnJvbS4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRvX2FybV9ib290KHVpbnQ4X3QgKmJ1ZmZlciwgdTMyIHR5cGUpCit7CisJaW50IGluZGV4ID0gQk9PVE1fSU5ERVhfU1RBUlQ7CisgCWludCBzdGF0dXMgPSBCT09UTV9TVEFUVVNfRkFJTFVSRTsKKwlkZXZpY2VfbG9hZCBsb2FkX2ltYWdlID0gTlVMTDsKKworCS8qIERldGVybWluZSwgYmFzZWQgb24gdGhlIGJvb3Qgc2V0dGluZywgdGhlIHNvdXJjZSB3ZSBhcmUgZ29pbmcKKwkgKiB0byBhdHRlbXB0IHRvIGJvb3QgZnJvbS4KKwkgKi8KKworCXN3aXRjaCAodHlwZSkgeworCisjaWYgKChkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZCAoQ0ZHX01NQ19OQU5EKSkgJiYgZGVmaW5lZChDRkdfQ01EX0ZBVCkpCisJY2FzZSBNTUNfTkFORDoKKwljYXNlIE1NQ19PTkVOQU5EOgorCQlsb2FkX2ltYWdlID0gZmF0X2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpCisJY2FzZSBHUE1DX09ORU5BTkQ6CisJCWxvYWRfaW1hZ2UgPSBvbmVuYW5kX2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX05BTkQpCisJY2FzZSBHUE1DX05BTkQ6CisJCWxvYWRfaW1hZ2UgPSBuYW5kX2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisKKwl9CisKKwkvKiBBdHRlbXB0IHRvIGxvYWQgYW5kIGJvb3QgYW55IGNvbmZpZ3VyZWQgaW1hZ2VzIHVudGlsIHdlCisJICogc3VjY2Vzc2Z1bGx5IGJvb3Qgb3IgdW50aWwgd2UndmUgZXhoYXVzdGVkIGFsbCBwb3NzaWJsZSBpbWFnZXMuCisJICovCisKKwlkbyB7CisJCXN0YXR1cyA9IGxvYWRfaW1hZ2UoYnVmZmVyLCAmaW5kZXgpOworCisJCWlmIChib290bV9sb2FkX3N1Y2Nlc3NmdWwoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYm9vdG0oYnVmZmVyKTsKKwkJfQorCisJfSB3aGlsZSAoYm9vdG1fbG9hZF9jb250aW51ZShzdGF0dXMsIGluZGV4KSk7CitmYWlsOgorCXJldHVybjsKK30KKwordm9pZCBzdGFydF9hcm1ib290ICh2b2lkKQoreworCWNvbnN0IHUzMiogZGV2aWNlc19saXN0ID0gTlVMTDsKKwlpbnQgZGV2SWR4OworCWludCBib290X2RldmljZXNfY291bnQgPSBnZXRfYm9vdF9kZXZpY2VzX2xpc3QoJmRldmljZXNfbGlzdCk7CisJY29uc3QgY2hhciAqIGJvb3RfbmFtZSA9IE5VTEw7CisJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKKwl1aW50OF90ICpidWZmZXIgPSAodWludDhfdCAqKUNGR19MT0FEQUREUjsKKworICAgCWZvciAoaW5pdF9mbmNfcHRyID0gaW5pdF9zZXF1ZW5jZTsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIpIHsKKwkJaWYgKCgqaW5pdF9mbmNfcHRyKSgpICE9IDApIHsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCW1pc2NfaW5pdF9yKCk7CisKKwlmb3IoIGRldklkeCA9IDA7IGRldklkeCA8IGJvb3RfZGV2aWNlc19jb3VudDsgZGV2SWR4KysgKQorCXsKKwkJdTMyIGJvb3RfZGV2ID0gZGV2aWNlc19saXN0W2RldklkeF07CisJCXN3aXRjaCAoYm9vdF9kZXYpIHsKKworCQljYXNlIE1NQ19OQU5EOgorCQljYXNlIE1NQ19PTkVOQU5EOgorCQkJYm9vdF9uYW1lID0gIk1NQyI7CisJCQlicmVhazsKKworCQljYXNlIEdQTUNfT05FTkFORDoKKwkJCWJvb3RfbmFtZSA9ICJPbmVOQU5EIjsKKwkJCWJyZWFrOworCisJCWNhc2UgR1BNQ19OQU5EOgorCQkJYm9vdF9uYW1lID0gIk5BTkQiOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BFUklQSEVSQUw6CisJCQlib290X25hbWUgPSAiIjsKKwkJCXByaW50ZigiVHJ5aW5nIGxvYWQgZnJvbSBVU0JcbiIpOworCQkJZG9fdXNiKCk7ICAvKiBjaGVjayBmb3IgdXNiIGRvd25sb2FkICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJvb3RfbmFtZSA9ICI8dW5rbm93bj4iOworCQkJYnJlYWs7CisKKwkJfQorCisJCWRlYnVnKCJUcnlpbmcgWC1Mb2FkZXIgb24gJXNcbiIsIGJvb3RfbmFtZSk7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybi4gKi8KKwkJZG9fYXJtX2Jvb3QoYnVmZmVyLCBib290X2Rldik7CisJfQorCisJLyogSWYgZm9yIHNvbWUgcmVhc29uIGl0IGRvZXMsIHdlIGhhdmUgb25seSBvbmUgY2hvaWNlLCBoYW5nLiAqLworCXB1dHMoIkltYWdlcyBleGhhdXN0ZWRcbiIpOworZmFpbDoKKwloYW5nKCk7Cit9CisKK3ZvaWQgaGFuZyAodm9pZCkKK3sKKwkvKiBjYWxsIGJvYXJkIHNwZWNpZmljIGhhbmcgZnVuY3Rpb24gKi8KKwlib2FyZF9oYW5nKCk7CisKKwkvKiBpZiBib2FyZF9oYW5nKCkgcmV0dXJucywgaGFuZ2UgaGVyZSAqLworCXB1dHMoIlgtTG9hZGVyIGhhbmdzXG4iKTsKKworCWZvciAoOzspOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2Jvb3RtLmMgYi94LWxvYWRlci9saWIvYm9vdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAxMzIxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2Jvb3RtLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgRXJpayBNb3V3IChKLkEuSy5Nb3V3QGl0cy50dWRlbGZ0Lm5sKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPHUtYm9vdC96bGliLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorc3RhdGljIHZvaWQgc2V0dXBfc3RhcnRfdGFnIChiZF90ICpiZCk7CisKKyMgaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyAoYmRfdCAqYmQpOworIyBlbmRpZgorc3RhdGljIHZvaWQgc2V0dXBfY29tbWFuZGxpbmVfdGFnIChiZF90ICpiZCwgY2hhciAqY29tbWFuZGxpbmUpOworCisjIGlmZGVmIENPTkZJR19JTklUUkRfVEFHCitzdGF0aWMgdm9pZCBzZXR1cF9pbml0cmRfdGFnIChiZF90ICpiZCwgdWxvbmcgaW5pdHJkX3N0YXJ0LAorCQkJICAgICAgdWxvbmcgaW5pdHJkX2VuZCk7CisjIGVuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9lbmRfdGFnIChiZF90ICpiZCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGFnICpwYXJhbXM7CisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLworCitpbnQgZG9fYm9vdG1fbGludXgoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcykKK3sKKwliZF90CSpiZCA9IGdkLT5iZDsKKwljaGFyCSpzOworCWludAltYWNoaWQgPSBiZC0+YmlfYXJjaF9udW1iZXI7CisJdm9pZAkoKnRoZUtlcm5lbCkoaW50IHplcm8sIGludCBhcmNoLCB1aW50IHBhcmFtcyk7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9UQUcKKwljaGFyICpjb21tYW5kbGluZSA9IGdldGVudiAoImJvb3RhcmdzIik7CisjZW5kaWYKKworCWlmICgoZmxhZyAhPSAwKSAmJiAoZmxhZyAhPSBCT09UTV9TVEFURV9PU19HTykpCisJCXJldHVybiAxOworCisJdGhlS2VybmVsID0gKHZvaWQgKCopKGludCwgaW50LCB1aW50KSlpbWFnZXMtPmVwOworCisJcyA9IGdldGVudiAoIm1hY2hpZCIpOworCWlmIChzKSB7CisJCW1hY2hpZCA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CisJCXByaW50ZiAoIlVzaW5nIG1hY2hpZCAweCV4IGZyb20gZW52aXJvbm1lbnRcbiIsIG1hY2hpZCk7CisJfQorCisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CisKKwlkZWJ1ZyAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIExpbnV4IChhdCBhZGRyZXNzICUwOGx4KSAuLi5cbiIsCisJICAgICAgICh1bG9uZykgdGhlS2VybmVsKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorCXNldHVwX3N0YXJ0X3RhZyAoYmQpOworI2lmZGVmIENPTkZJR19TRVJJQUxfVEFHCisJc2V0dXBfc2VyaWFsX3RhZyAoJnBhcmFtcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkVWSVNJT05fVEFHCisJc2V0dXBfcmV2aXNpb25fdGFnICgmcGFyYW1zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworCXNldHVwX21lbW9yeV90YWdzIChiZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ01ETElORV9UQUcKKwlzZXR1cF9jb21tYW5kbGluZV90YWcgKGJkLCBjb21tYW5kbGluZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworCWlmIChpbWFnZXMtPnJkX3N0YXJ0ICYmIGltYWdlcy0+cmRfZW5kKQorCQlzZXR1cF9pbml0cmRfdGFnIChiZCwgaW1hZ2VzLT5yZF9zdGFydCwgaW1hZ2VzLT5yZF9lbmQpOworI2VuZGlmCisJc2V0dXBfZW5kX3RhZyAoYmQpOworI2VuZGlmCisKKwkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGlzIGluIHBsYWNlICovCisJcHJpbnRmICgiXG5TdGFydGluZyBrZXJuZWwgLi4uXG5cbiIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0UKKwl7CisJCWV4dGVybiB2b2lkIHVkY19kaXNjb25uZWN0ICh2b2lkKTsKKwkJdWRjX2Rpc2Nvbm5lY3QgKCk7CisJfQorI2VuZGlmCisKKwljbGVhbnVwX2JlZm9yZV9saW51eCAoKTsKKworCXRoZUtlcm5lbCAoMCwgbWFjaGlkLCBiZC0+YmlfYm9vdF9wYXJhbXMpOworCS8qIGRvZXMgbm90IHJldHVybiAqLworCisJcmV0dXJuIDE7Cit9CisKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorc3RhdGljIHZvaWQgc2V0dXBfc3RhcnRfdGFnIChiZF90ICpiZCkKK3sKKwlwYXJhbXMgPSAoc3RydWN0IHRhZyAqKSBiZC0+YmlfYm9vdF9wYXJhbXM7CisKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX0NPUkU7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfY29yZSk7CisKKwlwYXJhbXMtPnUuY29yZS5mbGFncyA9IDA7CisJcGFyYW1zLT51LmNvcmUucGFnZXNpemUgPSAwOworCXBhcmFtcy0+dS5jb3JlLnJvb3RkZXYgPSAwOworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisKKworI2lmZGVmIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworc3RhdGljIHZvaWQgc2V0dXBfbWVtb3J5X3RhZ3MgKGJkX3QgKmJkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKKwkJcGFyYW1zLT5oZHIudGFnID0gQVRBR19NRU07CisJCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX21lbTMyKTsKKworCQlwYXJhbXMtPnUubWVtLnN0YXJ0ID0gYmQtPmJpX2RyYW1baV0uc3RhcnQ7CisJCXBhcmFtcy0+dS5tZW0uc2l6ZSA9IGJkLT5iaV9kcmFtW2ldLnNpemU7CisKKwkJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAqLworCisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbW1hbmRsaW5lX3RhZyAoYmRfdCAqYmQsIGNoYXIgKmNvbW1hbmRsaW5lKQoreworCWNoYXIgKnA7CisKKwlpZiAoIWNvbW1hbmRsaW5lKQorCQlyZXR1cm47CisKKwkvKiBlYXQgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworCWZvciAocCA9IGNvbW1hbmRsaW5lOyAqcCA9PSAnICc7IHArKyk7CisKKwkvKiBza2lwIG5vbi1leGlzdGVudCBjb21tYW5kIGxpbmVzIHNvIHRoZSBrZXJuZWwgd2lsbCBzdGlsbAorCSAqIHVzZSBpdHMgZGVmYXVsdCBjb21tYW5kIGxpbmUuCisJICovCisJaWYgKCpwID09ICdcMCcpCisJCXJldHVybjsKKworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfQ01ETElORTsKKwlwYXJhbXMtPmhkci5zaXplID0KKwkJKHNpemVvZiAoc3RydWN0IHRhZ19oZWFkZXIpICsgc3RybGVuIChwKSArIDEgKyA0KSA+PiAyOworCisJc3RyY3B5IChwYXJhbXMtPnUuY21kbGluZS5jbWRsaW5lLCBwKTsKKworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorCisKKyNpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworc3RhdGljIHZvaWQgc2V0dXBfaW5pdHJkX3RhZyAoYmRfdCAqYmQsIHVsb25nIGluaXRyZF9zdGFydCwgdWxvbmcgaW5pdHJkX2VuZCkKK3sKKwkvKiBhbiBBVEFHX0lOSVRSRCBub2RlIHRlbGxzIHRoZSBrZXJuZWwgd2hlcmUgdGhlIGNvbXByZXNzZWQKKwkgKiByYW1kaXNrIGNhbiBiZSBmb3VuZC4gQVRBR19SRElNRyBpcyBhIGJldHRlciBuYW1lLCBhY3R1YWxseS4KKwkgKi8KKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX0lOSVRSRDI7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfaW5pdHJkKTsKKworCXBhcmFtcy0+dS5pbml0cmQuc3RhcnQgPSBpbml0cmRfc3RhcnQ7CisJcGFyYW1zLT51LmluaXRyZC5zaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKKworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorI2VuZGlmIC8qIENPTkZJR19JTklUUkRfVEFHICovCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1RBRwordm9pZCBzZXR1cF9zZXJpYWxfdGFnIChzdHJ1Y3QgdGFnICoqdG1wKQoreworCXN0cnVjdCB0YWcgKnBhcmFtcyA9ICp0bXA7CisJc3RydWN0IHRhZ19zZXJpYWxuciBzZXJpYWxucjsKKwl2b2lkIGdldF9ib2FyZF9zZXJpYWwoc3RydWN0IHRhZ19zZXJpYWxuciAqc2VyaWFsbnIpOworCisJZ2V0X2JvYXJkX3NlcmlhbCgmc2VyaWFsbnIpOworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfU0VSSUFMOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX3NlcmlhbG5yKTsKKwlwYXJhbXMtPnUuc2VyaWFsbnIubG93ID0gc2VyaWFsbnIubG93OworCXBhcmFtcy0+dS5zZXJpYWxuci5oaWdoPSBzZXJpYWxuci5oaWdoOworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworCSp0bXAgPSBwYXJhbXM7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SRVZJU0lPTl9UQUcKK3ZvaWQgc2V0dXBfcmV2aXNpb25fdGFnKHN0cnVjdCB0YWcgKippbl9wYXJhbXMpCit7CisJdTMyIHJldiA9IDA7CisJdTMyIGdldF9ib2FyZF9yZXYodm9pZCk7CisKKwlyZXYgPSBnZXRfYm9hcmRfcmV2KCk7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19SRVZJU0lPTjsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19yZXZpc2lvbik7CisJcGFyYW1zLT51LnJldmlzaW9uLnJldiA9IHJldjsKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKyNlbmRpZiAgLyogQ09ORklHX1JFVklTSU9OX1RBRyAqLworCisKK3N0YXRpYyB2b2lkIHNldHVwX2VuZF90YWcgKGJkX3QgKmJkKQoreworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfTk9ORTsKKwlwYXJhbXMtPmhkci5zaXplID0gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyB8fCBDT05GSUdfQ01ETElORV9UQUcgfHwgQ09ORklHX0lOSVRSRF9UQUcgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9jcmMzMi5jIGIveC1sb2FkZXIvbGliL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NDk0YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9jcmMzMi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBjcmMzMi5jIGZyb20gdGhlIHpsaWItMS4xLjMgZGlzdHJpYnV0aW9uCisgKiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLgorICovCisKKy8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNvbXBpbGVyLmg+CisjaW5jbHVkZSA8eC1sb2FkL2NyYy5oPgorCisjaW5jbHVkZSAieC1sb2FkL3psaWIuaCIKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKyNkZWZpbmUgWkVYUE9SVAkvKiBlbXB0eSAqLworCisjZGVmaW5lIHRvbGUoeCkgY3B1X3RvX2xlMzIoeCkKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisKK2xvY2FsIGludCBjcmNfdGFibGVfZW1wdHkgPSAxOworbG9jYWwgdWludDMyX3QgY3JjX3RhYmxlWzI1Nl07Citsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CisKKy8qCisgIEdlbmVyYXRlIGEgdGFibGUgZm9yIGEgYnl0ZS13aXNlIDMyLWJpdCBDUkMgY2FsY3VsYXRpb24gb24gdGhlIHBvbHlub21pYWw6CisgIHheMzIreF4yNit4XjIzK3heMjIreF4xNit4XjEyK3heMTEreF4xMCt4XjgreF43K3heNSt4XjQreF4yK3grMS4KKworICBQb2x5bm9taWFscyBvdmVyIEdGKDIpIGFyZSByZXByZXNlbnRlZCBpbiBiaW5hcnksIG9uZSBiaXQgcGVyIGNvZWZmaWNpZW50LAorICB3aXRoIHRoZSBsb3dlc3QgcG93ZXJzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRoZW4gYWRkaW5nIHBvbHlub21pYWxzCisgIGlzIGp1c3QgZXhjbHVzaXZlLW9yLCBhbmQgbXVsdGlwbHlpbmcgYSBwb2x5bm9taWFsIGJ5IHggaXMgYSByaWdodCBzaGlmdCBieQorICBvbmUuICBJZiB3ZSBjYWxsIHRoZSBhYm92ZSBwb2x5bm9taWFsIHAsIGFuZCByZXByZXNlbnQgYSBieXRlIGFzIHRoZQorICBwb2x5bm9taWFsIHEsIGFsc28gd2l0aCB0aGUgbG93ZXN0IHBvd2VyIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCAoc28gdGhlCisgIGJ5dGUgMHhiMSBpcyB0aGUgcG9seW5vbWlhbCB4XjcreF4zK3grMSksIHRoZW4gdGhlIENSQyBpcyAocSp4XjMyKSBtb2QgcCwKKyAgd2hlcmUgYSBtb2QgYiBtZWFucyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGEgYnkgYi4KKworICBUaGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlIHNoaWZ0LXJlZ2lzdGVyIG1ldGhvZCBvZiBtdWx0aXBseWluZyBhbmQKKyAgdGFraW5nIHRoZSByZW1haW5kZXIuICBUaGUgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgYW5kIGZvciBlYWNoCisgIGluY29taW5nIGJpdCwgeF4zMiBpcyBhZGRlZCBtb2QgcCB0byB0aGUgcmVnaXN0ZXIgaWYgdGhlIGJpdCBpcyBhIG9uZSAod2hlcmUKKyAgeF4zMiBtb2QgcCBpcyBwK3heMzIgPSB4XjI2Ky4uLisxKSwgYW5kIHRoZSByZWdpc3RlciBpcyBtdWx0aXBsaWVkIG1vZCBwIGJ5CisgIHggKHdoaWNoIGlzIHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBhbmQgYWRkaW5nIHheMzIgbW9kIHAgaWYgdGhlIGJpdCBzaGlmdGVkCisgIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCisgIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KKworICBUaGUgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzIGFsbAorICB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQydzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4KKyovCitsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKK3sKKyAgdWludDMyX3QgYzsKKyAgaW50IG4sIGs7CisgIHVMb25nIHBvbHk7CQkvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KKyAgc3RhdGljIGNvbnN0IEJ5dGUgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworCisgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwTCkgKi8KKyAgcG9seSA9IDBMOworICBmb3IgKG4gPSAwOyBuIDwgc2l6ZW9mKHApL3NpemVvZihCeXRlKTsgbisrKQorICAgIHBvbHkgfD0gMUwgPDwgKDMxIC0gcFtuXSk7CisKKyAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorICB7CisgICAgYyA9ICh1TG9uZyluOworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7CisgICAgY3JjX3RhYmxlW25dID0gdG9sZShjKTsKKyAgfQorICBjcmNfdGFibGVfZW1wdHkgPSAwOworfQorI2Vsc2UKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGUgb2YgQ1JDLTMyJ3Mgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcyAobWFkZSBieSBtYWtlX2NyY190YWJsZSkKKyAqLworCitsb2NhbCBjb25zdCB1aW50MzJfdCBjcmNfdGFibGVbMjU2XSA9IHsKK3RvbGUoMHgwMDAwMDAwMEwpLCB0b2xlKDB4NzcwNzMwOTZMKSwgdG9sZSgweGVlMGU2MTJjTCksIHRvbGUoMHg5OTA5NTFiYUwpLAordG9sZSgweDA3NmRjNDE5TCksIHRvbGUoMHg3MDZhZjQ4ZkwpLCB0b2xlKDB4ZTk2M2E1MzVMKSwgdG9sZSgweDllNjQ5NWEzTCksCit0b2xlKDB4MGVkYjg4MzJMKSwgdG9sZSgweDc5ZGNiOGE0TCksIHRvbGUoMHhlMGQ1ZTkxZUwpLCB0b2xlKDB4OTdkMmQ5ODhMKSwKK3RvbGUoMHgwOWI2NGMyYkwpLCB0b2xlKDB4N2ViMTdjYmRMKSwgdG9sZSgweGU3YjgyZDA3TCksIHRvbGUoMHg5MGJmMWQ5MUwpLAordG9sZSgweDFkYjcxMDY0TCksIHRvbGUoMHg2YWIwMjBmMkwpLCB0b2xlKDB4ZjNiOTcxNDhMKSwgdG9sZSgweDg0YmU0MWRlTCksCit0b2xlKDB4MWFkYWQ0N2RMKSwgdG9sZSgweDZkZGRlNGViTCksIHRvbGUoMHhmNGQ0YjU1MUwpLCB0b2xlKDB4ODNkMzg1YzdMKSwKK3RvbGUoMHgxMzZjOTg1NkwpLCB0b2xlKDB4NjQ2YmE4YzBMKSwgdG9sZSgweGZkNjJmOTdhTCksIHRvbGUoMHg4YTY1YzllY0wpLAordG9sZSgweDE0MDE1YzRmTCksIHRvbGUoMHg2MzA2NmNkOUwpLCB0b2xlKDB4ZmEwZjNkNjNMKSwgdG9sZSgweDhkMDgwZGY1TCksCit0b2xlKDB4M2I2ZTIwYzhMKSwgdG9sZSgweDRjNjkxMDVlTCksIHRvbGUoMHhkNTYwNDFlNEwpLCB0b2xlKDB4YTI2NzcxNzJMKSwKK3RvbGUoMHgzYzAzZTRkMUwpLCB0b2xlKDB4NGIwNGQ0NDdMKSwgdG9sZSgweGQyMGQ4NWZkTCksIHRvbGUoMHhhNTBhYjU2YkwpLAordG9sZSgweDM1YjVhOGZhTCksIHRvbGUoMHg0MmIyOTg2Y0wpLCB0b2xlKDB4ZGJiYmM5ZDZMKSwgdG9sZSgweGFjYmNmOTQwTCksCit0b2xlKDB4MzJkODZjZTNMKSwgdG9sZSgweDQ1ZGY1Yzc1TCksIHRvbGUoMHhkY2Q2MGRjZkwpLCB0b2xlKDB4YWJkMTNkNTlMKSwKK3RvbGUoMHgyNmQ5MzBhY0wpLCB0b2xlKDB4NTFkZTAwM2FMKSwgdG9sZSgweGM4ZDc1MTgwTCksIHRvbGUoMHhiZmQwNjExNkwpLAordG9sZSgweDIxYjRmNGI1TCksIHRvbGUoMHg1NmIzYzQyM0wpLCB0b2xlKDB4Y2ZiYTk1OTlMKSwgdG9sZSgweGI4YmRhNTBmTCksCit0b2xlKDB4MjgwMmI4OWVMKSwgdG9sZSgweDVmMDU4ODA4TCksIHRvbGUoMHhjNjBjZDliMkwpLCB0b2xlKDB4YjEwYmU5MjRMKSwKK3RvbGUoMHgyZjZmN2M4N0wpLCB0b2xlKDB4NTg2ODRjMTFMKSwgdG9sZSgweGMxNjExZGFiTCksIHRvbGUoMHhiNjY2MmQzZEwpLAordG9sZSgweDc2ZGM0MTkwTCksIHRvbGUoMHgwMWRiNzEwNkwpLCB0b2xlKDB4OThkMjIwYmNMKSwgdG9sZSgweGVmZDUxMDJhTCksCit0b2xlKDB4NzFiMTg1ODlMKSwgdG9sZSgweDA2YjZiNTFmTCksIHRvbGUoMHg5ZmJmZTRhNUwpLCB0b2xlKDB4ZThiOGQ0MzNMKSwKK3RvbGUoMHg3ODA3YzlhMkwpLCB0b2xlKDB4MGYwMGY5MzRMKSwgdG9sZSgweDk2MDlhODhlTCksIHRvbGUoMHhlMTBlOTgxOEwpLAordG9sZSgweDdmNmEwZGJiTCksIHRvbGUoMHgwODZkM2QyZEwpLCB0b2xlKDB4OTE2NDZjOTdMKSwgdG9sZSgweGU2NjM1YzAxTCksCit0b2xlKDB4NmI2YjUxZjRMKSwgdG9sZSgweDFjNmM2MTYyTCksIHRvbGUoMHg4NTY1MzBkOEwpLCB0b2xlKDB4ZjI2MjAwNGVMKSwKK3RvbGUoMHg2YzA2OTVlZEwpLCB0b2xlKDB4MWIwMWE1N2JMKSwgdG9sZSgweDgyMDhmNGMxTCksIHRvbGUoMHhmNTBmYzQ1N0wpLAordG9sZSgweDY1YjBkOWM2TCksIHRvbGUoMHgxMmI3ZTk1MEwpLCB0b2xlKDB4OGJiZWI4ZWFMKSwgdG9sZSgweGZjYjk4ODdjTCksCit0b2xlKDB4NjJkZDFkZGZMKSwgdG9sZSgweDE1ZGEyZDQ5TCksIHRvbGUoMHg4Y2QzN2NmM0wpLCB0b2xlKDB4ZmJkNDRjNjVMKSwKK3RvbGUoMHg0ZGIyNjE1OEwpLCB0b2xlKDB4M2FiNTUxY2VMKSwgdG9sZSgweGEzYmMwMDc0TCksIHRvbGUoMHhkNGJiMzBlMkwpLAordG9sZSgweDRhZGZhNTQxTCksIHRvbGUoMHgzZGQ4OTVkN0wpLCB0b2xlKDB4YTRkMWM0NmRMKSwgdG9sZSgweGQzZDZmNGZiTCksCit0b2xlKDB4NDM2OWU5NmFMKSwgdG9sZSgweDM0NmVkOWZjTCksIHRvbGUoMHhhZDY3ODg0NkwpLCB0b2xlKDB4ZGE2MGI4ZDBMKSwKK3RvbGUoMHg0NDA0MmQ3M0wpLCB0b2xlKDB4MzMwMzFkZTVMKSwgdG9sZSgweGFhMGE0YzVmTCksIHRvbGUoMHhkZDBkN2NjOUwpLAordG9sZSgweDUwMDU3MTNjTCksIHRvbGUoMHgyNzAyNDFhYUwpLCB0b2xlKDB4YmUwYjEwMTBMKSwgdG9sZSgweGM5MGMyMDg2TCksCit0b2xlKDB4NTc2OGI1MjVMKSwgdG9sZSgweDIwNmY4NWIzTCksIHRvbGUoMHhiOTY2ZDQwOUwpLCB0b2xlKDB4Y2U2MWU0OWZMKSwKK3RvbGUoMHg1ZWRlZjkwZUwpLCB0b2xlKDB4MjlkOWM5OThMKSwgdG9sZSgweGIwZDA5ODIyTCksIHRvbGUoMHhjN2Q3YThiNEwpLAordG9sZSgweDU5YjMzZDE3TCksIHRvbGUoMHgyZWI0MGQ4MUwpLCB0b2xlKDB4YjdiZDVjM2JMKSwgdG9sZSgweGMwYmE2Y2FkTCksCit0b2xlKDB4ZWRiODgzMjBMKSwgdG9sZSgweDlhYmZiM2I2TCksIHRvbGUoMHgwM2I2ZTIwY0wpLCB0b2xlKDB4NzRiMWQyOWFMKSwKK3RvbGUoMHhlYWQ1NDczOUwpLCB0b2xlKDB4OWRkMjc3YWZMKSwgdG9sZSgweDA0ZGIyNjE1TCksIHRvbGUoMHg3M2RjMTY4M0wpLAordG9sZSgweGUzNjMwYjEyTCksIHRvbGUoMHg5NDY0M2I4NEwpLCB0b2xlKDB4MGQ2ZDZhM2VMKSwgdG9sZSgweDdhNmE1YWE4TCksCit0b2xlKDB4ZTQwZWNmMGJMKSwgdG9sZSgweDkzMDlmZjlkTCksIHRvbGUoMHgwYTAwYWUyN0wpLCB0b2xlKDB4N2QwNzllYjFMKSwKK3RvbGUoMHhmMDBmOTM0NEwpLCB0b2xlKDB4ODcwOGEzZDJMKSwgdG9sZSgweDFlMDFmMjY4TCksIHRvbGUoMHg2OTA2YzJmZUwpLAordG9sZSgweGY3NjI1NzVkTCksIHRvbGUoMHg4MDY1NjdjYkwpLCB0b2xlKDB4MTk2YzM2NzFMKSwgdG9sZSgweDZlNmIwNmU3TCksCit0b2xlKDB4ZmVkNDFiNzZMKSwgdG9sZSgweDg5ZDMyYmUwTCksIHRvbGUoMHgxMGRhN2E1YUwpLCB0b2xlKDB4NjdkZDRhY2NMKSwKK3RvbGUoMHhmOWI5ZGY2ZkwpLCB0b2xlKDB4OGViZWVmZjlMKSwgdG9sZSgweDE3YjdiZTQzTCksIHRvbGUoMHg2MGIwOGVkNUwpLAordG9sZSgweGQ2ZDZhM2U4TCksIHRvbGUoMHhhMWQxOTM3ZUwpLCB0b2xlKDB4MzhkOGMyYzRMKSwgdG9sZSgweDRmZGZmMjUyTCksCit0b2xlKDB4ZDFiYjY3ZjFMKSwgdG9sZSgweGE2YmM1NzY3TCksIHRvbGUoMHgzZmI1MDZkZEwpLCB0b2xlKDB4NDhiMjM2NGJMKSwKK3RvbGUoMHhkODBkMmJkYUwpLCB0b2xlKDB4YWYwYTFiNGNMKSwgdG9sZSgweDM2MDM0YWY2TCksIHRvbGUoMHg0MTA0N2E2MEwpLAordG9sZSgweGRmNjBlZmMzTCksIHRvbGUoMHhhODY3ZGY1NUwpLCB0b2xlKDB4MzE2ZThlZWZMKSwgdG9sZSgweDQ2NjliZTc5TCksCit0b2xlKDB4Y2I2MWIzOGNMKSwgdG9sZSgweGJjNjY4MzFhTCksIHRvbGUoMHgyNTZmZDJhMEwpLCB0b2xlKDB4NTI2OGUyMzZMKSwKK3RvbGUoMHhjYzBjNzc5NUwpLCB0b2xlKDB4YmIwYjQ3MDNMKSwgdG9sZSgweDIyMDIxNmI5TCksIHRvbGUoMHg1NTA1MjYyZkwpLAordG9sZSgweGM1YmEzYmJlTCksIHRvbGUoMHhiMmJkMGIyOEwpLCB0b2xlKDB4MmJiNDVhOTJMKSwgdG9sZSgweDVjYjM2YTA0TCksCit0b2xlKDB4YzJkN2ZmYTdMKSwgdG9sZSgweGI1ZDBjZjMxTCksIHRvbGUoMHgyY2Q5OWU4YkwpLCB0b2xlKDB4NWJkZWFlMWRMKSwKK3RvbGUoMHg5YjY0YzJiMEwpLCB0b2xlKDB4ZWM2M2YyMjZMKSwgdG9sZSgweDc1NmFhMzljTCksIHRvbGUoMHgwMjZkOTMwYUwpLAordG9sZSgweDljMDkwNmE5TCksIHRvbGUoMHhlYjBlMzYzZkwpLCB0b2xlKDB4NzIwNzY3ODVMKSwgdG9sZSgweDA1MDA1NzEzTCksCit0b2xlKDB4OTViZjRhODJMKSwgdG9sZSgweGUyYjg3YTE0TCksIHRvbGUoMHg3YmIxMmJhZUwpLCB0b2xlKDB4MGNiNjFiMzhMKSwKK3RvbGUoMHg5MmQyOGU5YkwpLCB0b2xlKDB4ZTVkNWJlMGRMKSwgdG9sZSgweDdjZGNlZmI3TCksIHRvbGUoMHgwYmRiZGYyMUwpLAordG9sZSgweDg2ZDNkMmQ0TCksIHRvbGUoMHhmMWQ0ZTI0MkwpLCB0b2xlKDB4NjhkZGIzZjhMKSwgdG9sZSgweDFmZGE4MzZlTCksCit0b2xlKDB4ODFiZTE2Y2RMKSwgdG9sZSgweGY2YjkyNjViTCksIHRvbGUoMHg2ZmIwNzdlMUwpLCB0b2xlKDB4MThiNzQ3NzdMKSwKK3RvbGUoMHg4ODA4NWFlNkwpLCB0b2xlKDB4ZmYwZjZhNzBMKSwgdG9sZSgweDY2MDYzYmNhTCksIHRvbGUoMHgxMTAxMGI1Y0wpLAordG9sZSgweDhmNjU5ZWZmTCksIHRvbGUoMHhmODYyYWU2OUwpLCB0b2xlKDB4NjE2YmZmZDNMKSwgdG9sZSgweDE2NmNjZjQ1TCksCit0b2xlKDB4YTAwYWUyNzhMKSwgdG9sZSgweGQ3MGRkMmVlTCksIHRvbGUoMHg0ZTA0ODM1NEwpLCB0b2xlKDB4MzkwM2IzYzJMKSwKK3RvbGUoMHhhNzY3MjY2MUwpLCB0b2xlKDB4ZDA2MDE2ZjdMKSwgdG9sZSgweDQ5Njk0NzRkTCksIHRvbGUoMHgzZTZlNzdkYkwpLAordG9sZSgweGFlZDE2YTRhTCksIHRvbGUoMHhkOWQ2NWFkY0wpLCB0b2xlKDB4NDBkZjBiNjZMKSwgdG9sZSgweDM3ZDgzYmYwTCksCit0b2xlKDB4YTliY2FlNTNMKSwgdG9sZSgweGRlYmI5ZWM1TCksIHRvbGUoMHg0N2IyY2Y3ZkwpLCB0b2xlKDB4MzBiNWZmZTlMKSwKK3RvbGUoMHhiZGJkZjIxY0wpLCB0b2xlKDB4Y2FiYWMyOGFMKSwgdG9sZSgweDUzYjM5MzMwTCksIHRvbGUoMHgyNGI0YTNhNkwpLAordG9sZSgweGJhZDAzNjA1TCksIHRvbGUoMHhjZGQ3MDY5M0wpLCB0b2xlKDB4NTRkZTU3MjlMKSwgdG9sZSgweDIzZDk2N2JmTCksCit0b2xlKDB4YjM2NjdhMmVMKSwgdG9sZSgweGM0NjE0YWI4TCksIHRvbGUoMHg1ZDY4MWIwMkwpLCB0b2xlKDB4MmE2ZjJiOTRMKSwKK3RvbGUoMHhiNDBiYmUzN0wpLCB0b2xlKDB4YzMwYzhlYTFMKSwgdG9sZSgweDVhMDVkZjFiTCksIHRvbGUoMHgyZDAyZWY4ZEwpCit9OworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIERPX0NSQyh4KSBjcmMgPSB0YWJbKGNyYyBeICh4KSkgJiAyNTVdIF4gKGNyYyA+PiA4KQorIyBlbHNlCisjICBkZWZpbmUgRE9fQ1JDKHgpIGNyYyA9IHRhYlsoKGNyYyA+PiAyNCkgXiAoeCkpICYgMjU1XSBeIChjcmMgPDwgOCkKKyMgZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBObyBvbmVzIGNvbXBsZW1lbnQgdmVyc2lvbi4gSkZGUzIgKGFuZCBvdGhlciB0aGluZ3MgPykKKyAqIGRvbid0IHVzZSBvbmVzIGNvbXBsaW1lbnQgaW4gdGhlaXIgQ1JDIGNhbGN1bGF0aW9ucy4KKyAqLwordWludDMyX3QgWkVYUE9SVCBjcmMzMl9ub19jb21wKHVpbnQzMl90IGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pCit7CisgICAgY29uc3QgdWludDMyX3QgKnRhYiA9IGNyY190YWJsZTsKKyAgICBjb25zdCB1aW50MzJfdCAqYiA9KGNvbnN0IHVpbnQzMl90ICopYnVmOworICAgIHNpemVfdCByZW1fbGVuOworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CisjZW5kaWYKKyAgICBjcmMgPSBjcHVfdG9fbGUzMihjcmMpOworICAgIC8qIEFsaWduIGl0ICovCisgICAgaWYgKCgobG9uZyliKSAmIDMgJiYgbGVuKSB7CisJIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKWI7CisJIGRvIHsKKwkgICAgICBET19DUkMoKnArKyk7CisJIH0gd2hpbGUgKCgtLWxlbikgJiYgKChsb25nKXApJjMpOworCSBiID0gKHVpbnQzMl90ICopcDsKKyAgICB9CisKKyAgICByZW1fbGVuID0gbGVuICYgMzsKKyAgICBsZW4gPSBsZW4gPj4gMjsKKyAgICBmb3IgKC0tYjsgbGVuOyAtLWxlbikgeworCSAvKiBsb2FkIGRhdGEgMzIgYml0cyB3aWRlLCB4b3IgZGF0YSAzMiBiaXRzIHdpZGUuICovCisJIGNyYyBePSAqKytiOyAvKiB1c2UgcHJlIGluY3JlbWVudCBmb3Igc3BlZWQgKi8KKwkgRE9fQ1JDKDApOworCSBET19DUkMoMCk7CisJIERPX0NSQygwKTsKKwkgRE9fQ1JDKDApOworICAgIH0KKyAgICBsZW4gPSByZW1fbGVuOworICAgIC8qIEFuZCB0aGUgbGFzdCBmZXcgYnl0ZXMgKi8KKyAgICBpZiAobGVuKSB7CisJIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKShiICsgMSkgLSAxOworCSBkbyB7CisJICAgICAgRE9fQ1JDKCorK3ApOyAvKiB1c2UgcHJlIGluY3JlbWVudCBmb3Igc3BlZWQgKi8KKwkgfSB3aGlsZSAoLS1sZW4pOworICAgIH0KKworICAgIHJldHVybiBsZTMyX3RvX2NwdShjcmMpOworfQorI3VuZGVmIERPX0NSQworCit1aW50MzJfdCBaRVhQT1JUIGNyYzMyICh1aW50MzJfdCBjcmMsIGNvbnN0IEJ5dGVmICpwLCB1SW50IGxlbikKK3sKKyAgICAgcmV0dXJuIGNyYzMyX25vX2NvbXAoY3JjIF4gMHhmZmZmZmZmZkwsIHAsIGxlbikgXiAweGZmZmZmZmZmTDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgY3JjMzIgY2hlY2tzdW0gdHJpZ2dlcmluZyB0aGUgd2F0Y2hkb2cgZXZlcnkgJ2NodW5rX3N6JyBieXRlcworICogb2YgaW5wdXQuCisgKi8KK3VpbnQzMl90IFpFWFBPUlQgY3JjMzJfd2QgKHVpbnQzMl90IGNyYywKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgIHVJbnQgbGVuLCB1SW50IGNodW5rX3N6KQoreworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwljb25zdCB1bnNpZ25lZCBjaGFyICplbmQsICpjdXJyOworCWludCBjaHVuazsKKworCWN1cnIgPSBidWY7CisJZW5kID0gYnVmICsgbGVuOworCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCWNodW5rID0gZW5kIC0gY3VycjsKKwkJaWYgKGNodW5rID4gY2h1bmtfc3opCisJCQljaHVuayA9IGNodW5rX3N6OworCQljcmMgPSBjcmMzMiAoY3JjLCBjdXJyLCBjaHVuayk7CisJCWN1cnIgKz0gY2h1bms7CisJCVdBVENIRE9HX1JFU0VUICgpOworCX0KKyNlbHNlCisJY3JjID0gY3JjMzIgKGNyYywgYnVmLCBsZW4pOworI2VuZGlmCisKKwlyZXR1cm4gY3JjOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2N0eXBlLmMgYi94LWxvYWRlci9saWIvY3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQwNDY4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2N0eXBlLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogIGxpbnV4L2xpYi9jdHlwZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKwordW5zaWduZWQgY2hhciBfY3R5cGVbXSA9IHsKK19DLF9DLF9DLF9DLF9DLF9DLF9DLF9DLAkJCS8qIDAtNyAqLworX0MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0MsX0MsCQkvKiA4LTE1ICovCitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkvKiAxNi0yMyAqLworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJLyogMjQtMzEgKi8KK19TfF9TUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiAzMi0zOSAqLworX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsCQkJLyogNDAtNDcgKi8KK19ELF9ELF9ELF9ELF9ELF9ELF9ELF9ELAkJCS8qIDQ4LTU1ICovCitfRCxfRCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiA1Ni02MyAqLworX1AsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1UsCS8qIDY0LTcxICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwJCQkvKiA3Mi03OSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsCQkJLyogODAtODcgKi8KK19VLF9VLF9VLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDg4LTk1ICovCitfUCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTCwJLyogOTYtMTAzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJCQkvKiAxMDQtMTExICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJCQkvKiAxMTItMTE5ICovCitfTCxfTCxfTCxfUCxfUCxfUCxfUCxfQywJCQkvKiAxMjAtMTI3ICovCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAkJLyogMTI4LTE0MyAqLworMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwJCS8qIDE0NC0xNTkgKi8KK19TfF9TUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwgICAvKiAxNjAtMTc1ICovCitfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwgICAgICAgLyogMTc2LTE5MSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsICAgICAgIC8qIDE5Mi0yMDcgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9QLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9MLCAgICAgICAvKiAyMDgtMjIzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwgICAgICAgLyogMjI0LTIzOSAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX1AsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0x9OyAgICAgIC8qIDI0MC0yNTUgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9kaXNwbGF5X29wdGlvbnMuYyBiL3gtbG9hZGVyL2xpYi9kaXNwbGF5X29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ3NGJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CitpbnQgZGlzcGxheV9vcHRpb25zICh2b2lkKQoreworCWV4dGVybiBjaGFyIHZlcnNpb25fc3RyaW5nW107CisKKyNpZiBkZWZpbmVkKEJVSUxEX1RBRykKKwlwcmludGYgKCJcblxuJXMsIEJ1aWxkOiAlc1xuXG4iLCB2ZXJzaW9uX3N0cmluZywgQlVJTERfVEFHKTsKKyNlbHNlCisJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogcHJpbnQgc2l6ZXMgYXMgInh4eCBLaUIiLCAieHh4LnkgS2lCIiwgInh4eCBNaUIiLCAieHh4LnkgTWlCIiwKKyAqIHh4eCBHaUIsIHh4eC55IEdpQiwgZXRjIGFzIG5lZWRlZDsgYWxsb3cgZm9yIG9wdGlvbmFsIHRyYWlsaW5nIHN0cmluZworICogKGxpa2UgIlxuIikKKyAqLwordm9pZCBwcmludF9zaXplKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGxvbmcgbSA9IDAsIG47CisJdW5zaWduZWQgbG9uZyBsb25nIGY7CisJc3RhdGljIGNvbnN0IGNoYXIgbmFtZXNbXSA9IHsnRScsICdQJywgJ1QnLCAnRycsICdNJywgJ0snfTsKKwl1bnNpZ25lZCBsb25nIGQgPSAxMCAqIEFSUkFZX1NJWkUobmFtZXMpOworCWNoYXIgYyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lcyk7IGkrKywgZCAtPSAxMCkgeworCQlpZiAoc2l6ZSA+PiBkKSB7CisJCQljID0gbmFtZXNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYykgeworCQlwcmludGYoIiVsbHUgQnl0ZXMlcyIsIHNpemUsIHMpOworCQlyZXR1cm47CisJfQorCisJbiA9IHNpemUgPj4gZDsKKwlmID0gc2l6ZSAmICgoMVVMTCA8PCBkKSAtIDEpOworCisJLyogSWYgdGhlcmUncyBhIHJlbWFpbmRlciwgZGVhbCB3aXRoIGl0ICovCisJaWYgKGYpIHsKKwkJbSA9ICgxMFVMTCAqIGYgKyAoMVVMTCA8PCAoZCAtIDEpKSkgPj4gZDsKKworCQlpZiAobSA+PSAxMCkgeworCQkJbSAtPSAxMDsKKwkJCW4gKz0gMTsKKwkJfQorCX0KKworCXByaW50ZiAoIiVsdSIsIG4pOworCWlmIChtKSB7CisJCXByaW50ZiAoIi4lbGQiLCBtKTsKKwl9CisJcHJpbnRmICgiICVjaUIlcyIsIGMsIHMpOworfQorCisvKgorICogUHJpbnQgZGF0YSBidWZmZXIgaW4gaGV4IGFuZCBhc2NpaSBmb3JtIHRvIHRoZSB0ZXJtaW5hbC4KKyAqCisgKiBkYXRhIHJlYWRzIGFyZSBidWZmZXJlZCBzbyB0aGF0IGVhY2ggbWVtb3J5IGFkZHJlc3MgaXMgb25seSByZWFkIG9uY2UuCisgKiBVc2VmdWwgd2hlbiBkaXNwbGF5aW5nIHRoZSBjb250ZW50cyBvZiB2b2xhdGlsZSByZWdpc3RlcnMuCisgKgorICogcGFyYW1ldGVyczoKKyAqICAgIGFkZHI6IFN0YXJ0aW5nIGFkZHJlc3MgdG8gZGlzcGxheSBhdCBzdGFydCBvZiBsaW5lCisgKiAgICBkYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiAgICB3aWR0aDogZGF0YSB2YWx1ZSB3aWR0aC4gIE1heSBiZSAxLCAyLCBvciA0LgorICogICAgY291bnQ6IG51bWJlciBvZiB2YWx1ZXMgdG8gZGlzcGxheQorICogICAgbGluZWxlbjogTnVtYmVyIG9mIHZhbHVlcyB0byBwcmludCBwZXIgbGluZTsgc3BlY2lmeSAwIGZvciBkZWZhdWx0IGxlbmd0aAorICovCisjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSF9CWVRFUyAoNjQpCisjZGVmaW5lIERFRkFVTFRfTElORV9MRU5HVEhfQllURVMgKDE2KQoraW50IHByaW50X2J1ZmZlciAodWxvbmcgYWRkciwgdm9pZCogZGF0YSwgdWludCB3aWR0aCwgdWludCBjb3VudCwgdWludCBsaW5lbGVuKQoreworCS8qIGxpbmVidWYgYXMgYSB1bmlvbiBjYXVzZXMgcHJvcGVyIGFsaWdubWVudCAqLworCXVuaW9uIGxpbmVidWYgeworCQl1aW50MzJfdCB1aVtNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQzMl90KSArIDFdOworCQl1aW50MTZfdCB1c1tNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQxNl90KSArIDFdOworCQl1aW50OF90ICB1Y1tNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQ4X3QpICsgMV07CisJfSBsYjsKKwlpbnQgaTsKKworCWlmIChsaW5lbGVuKndpZHRoID4gTUFYX0xJTkVfTEVOR1RIX0JZVEVTKQorCQlsaW5lbGVuID0gTUFYX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisJaWYgKGxpbmVsZW4gPCAxKQorCQlsaW5lbGVuID0gREVGQVVMVF9MSU5FX0xFTkdUSF9CWVRFUyAvIHdpZHRoOworCisJd2hpbGUgKGNvdW50KSB7CisJCXByaW50ZigiJTA4bHg6IiwgYWRkcik7CisKKwkJLyogY2hlY2sgZm9yIG92ZXJmbG93IGNvbmRpdGlvbiAqLworCQlpZiAoY291bnQgPCBsaW5lbGVuKQorCQkJbGluZWxlbiA9IGNvdW50OworCisJCS8qIENvcHkgZnJvbSBtZW1vcnkgaW50byBsaW5lYnVmIGFuZCBwcmludCBoZXggdmFsdWVzICovCisJCWZvciAoaSA9IDA7IGkgPCBsaW5lbGVuOyBpKyspIHsKKwkJCXVpbnQzMl90IHg7CisJCQlpZiAod2lkdGggPT0gNCkKKwkJCQl4ID0gbGIudWlbaV0gPSAqKHZvbGF0aWxlIHVpbnQzMl90ICopZGF0YTsKKwkJCWVsc2UgaWYgKHdpZHRoID09IDIpCisJCQkJeCA9IGxiLnVzW2ldID0gKih2b2xhdGlsZSB1aW50MTZfdCAqKWRhdGE7CisJCQllbHNlCisJCQkJeCA9IGxiLnVjW2ldID0gKih2b2xhdGlsZSB1aW50OF90ICopZGF0YTsKKwkJCXByaW50ZigiICUwKngiLCB3aWR0aCAqIDIsIHgpOworCQkJZGF0YSArPSB3aWR0aDsKKwkJfQorCisJCS8qIFByaW50IGRhdGEgaW4gQVNDSUkgY2hhcmFjdGVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGluZWxlbiAqIHdpZHRoOyBpKyspIHsKKwkJCWlmICghaXNwcmludChsYi51Y1tpXSkgfHwgbGIudWNbaV0gPj0gMHg4MCkKKwkJCQlsYi51Y1tpXSA9ICcuJzsKKwkJfQorCQlsYi51Y1tpXSA9ICdcMCc7CisJCXByaW50ZigiICAgICVzXG4iLCBsYi51Yyk7CisKKwkJLyogdXBkYXRlIHJlZmVyZW5jZXMgKi8KKwkJYWRkciArPSBsaW5lbGVuICogd2lkdGg7CisJCWNvdW50IC09IGxpbmVsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvZGl2MC5jIGIveC1sb2FkZXIvbGliL2RpdjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY3YmYxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2RpdjAuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIFJlcGxhY2VtZW50ICg9ZHVtbXkpIGZvciBHTlUvTGludXggZGl2aXNpb24tYnkgemVybyBoYW5kbGVyICovCit2b2lkIF9fZGl2MCAodm9pZCkKK3sKKwlleHRlcm4gdm9pZCBoYW5nICh2b2lkKTsKKworCWhhbmcoKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9lY2MuYyBiL3gtbG9hZGVyL2xpYi9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGZjNDBkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2VjYy5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwIFRleGFzIEluc3RydW1lbnRzCisgKiAKKyAqIFRoaXMgZmlsZSBvcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisNCisvKgorICogUHJlLWNhbGN1bGF0ZWQgMjU2LXdheSAxIGJ5dGUgY29sdW1uIHBhcml0eQorICovCitzdGF0aWMgY29uc3QgdV9jaGFyIG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbXSA9IHsKKwkweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwLAorCTB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwKKwkweDAzLCAweDU2LCAweDU1LCAweDAwLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDAwLCAweDU1LCAweDU2LCAweDAzLAorCTB4NjksIDB4M2MsIDB4M2YsIDB4NmEsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4NmEsIDB4M2YsIDB4M2MsIDB4NjksCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywKKwkweDBmLCAweDVhLCAweDU5LCAweDBjLCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDBjLCAweDU5LCAweDVhLCAweDBmLAorCTB4NmEsIDB4M2YsIDB4M2MsIDB4NjksIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4NjksIDB4M2MsIDB4M2YsIDB4NmEsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwKKwkweDBmLCAweDVhLCAweDU5LCAweDBjLCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDBjLCAweDU5LCAweDVhLCAweDBmLAorCTB4MGMsIDB4NTksIDB4NWEsIDB4MGYsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4MGYsIDB4NWEsIDB4NTksIDB4MGMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwKKwkweDAzLCAweDU2LCAweDU1LCAweDAwLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDAwLCAweDU1LCAweDU2LCAweDAzLAorCTB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwKKwkweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwCit9OworCisKKy8qCisgKiBDcmVhdGVzIG5vbi1pbnZlcnRlZCBFQ0MgY29kZSBmcm9tIGxpbmUgcGFyaXR5CisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfdHJhbnNfcmVzdWx0KHVfY2hhciByZWcyLCB1X2NoYXIgcmVnMywKKwl1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBhLCBiLCBpLCB0bXAxLCB0bXAyOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlhID0gYiA9IDB4ODA7CisJdG1wMSA9IHRtcDIgPSAwOworCisJLyogQ2FsY3VsYXRlIGZpcnN0IEVDQyBieXRlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVnMyAmIGEpCQkvKiBMUDE1LDEzLDExLDkgLS0+IGVjY19jb2RlWzBdICovCisJCQl0bXAxIHw9IGI7CisJCWIgPj49IDE7CisJCWlmIChyZWcyICYgYSkJCS8qIExQMTQsMTIsMTAsOCAtLT4gZWNjX2NvZGVbMF0gKi8KKwkJCXRtcDEgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJYSA+Pj0gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgc2Vjb25kIEVDQyBieXRlICovCisJYiA9IDB4ODA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVnMyAmIGEpCQkvKiBMUDcsNSwzLDEgLS0+IGVjY19jb2RlWzFdICovCisJCQl0bXAyIHw9IGI7CisJCWIgPj49IDE7CisJCWlmIChyZWcyICYgYSkJCS8qIExQNiw0LDIsMCAtLT4gZWNjX2NvZGVbMV0gKi8KKwkJCXRtcDIgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJYSA+Pj0gMTsKKwl9CisKKwkvKiBTdG9yZSB0d28gb2YgdGhlIEVDQyBieXRlcyAqLworCWVjY19jb2RlWzBdID0gdG1wMTsKKwllY2NfY29kZVsxXSA9IHRtcDI7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgMyBieXRlIEVDQyBjb2RlIGZvciAyNTYgYnl0ZSBibG9jaworICovCisvKiBFQ0MgQ2FsY3VsYXRpb24gaXMgZGlmZmVyZW50IGJldHdlZW4gTkFORCBhbmQgTkFORCBMZWdhY3kgY29kZQorICogaW4gVS1Cb290LiBJZiBOQU5EX0xFR0FDWSBpcyBlbmFibGVkIGluIHUtYm9vdCBpdCBzaG91bGQgYmUgCisgKiBlbmFibGVkIGluIHRoZSBjb25maWcgZmlsZSBpbiB4LWxvYWRlciBhbHNvIAorICovCisjaWZkZWYgTkFORF9MRUdBQ1kKK3ZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgaWR4LCByZWcxLCByZWczOworCWludCBqOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlyZWcxID0gcmVnMyA9IDA7CisJZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKKworCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KKwlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgeworCisJCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLworCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07CisJCXJlZzEgXj0gaWR4OworCisJCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCisJCWlmIChpZHggJiAweDQwKSB7CisJCQlyZWczIF49ICh1X2NoYXIpIGo7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KKwluYW5kX3RyYW5zX3Jlc3VsdCgocmVnMSAmIDB4NDApID8gfnJlZzMgOiByZWczLCByZWczLCBlY2NfY29kZSk7CisKKwkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KKwllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKKwllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKKwllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKK30KKyNlbHNlCit2b2lkIG5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9jaGFyIGlkeCwgcmVnMSwgcmVnMiwgcmVnMzsKKwlpbnQgajsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJcmVnMSA9IHJlZzIgPSByZWczID0gMDsKKwllY2NfY29kZVswXSA9IGVjY19jb2RlWzFdID0gZWNjX2NvZGVbMl0gPSAwOworCisJLyogQnVpbGQgdXAgY29sdW1uIHBhcml0eSAqLworCWZvcihqID0gMDsgaiA8IDI1NjsgaisrKSB7CisKKwkJLyogR2V0IENQMCAtIENQNSBmcm9tIHRhYmxlICovCisJCWlkeCA9IG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbZGF0W2pdXTsKKwkJcmVnMSBePSAoaWR4ICYgMHgzZik7CisKKwkJLyogQWxsIGJpdCBYT1IgPSAxID8gKi8KKwkJaWYgKGlkeCAmIDB4NDApIHsKKwkJCXJlZzMgXj0gKHVfY2hhcikgajsKKwkJCXJlZzIgXj0gfigodV9jaGFyKSBqKTsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eSAqLworCW5hbmRfdHJhbnNfcmVzdWx0KHJlZzIsIHJlZzMsIGVjY19jb2RlKTsKKworCS8qIENhbGN1bGF0ZSBmaW5hbCBFQ0MgY29kZSAqLworCWVjY19jb2RlWzBdID0gfmVjY19jb2RlWzBdOworCWVjY19jb2RlWzFdID0gfmVjY19jb2RlWzFdOworCWVjY19jb2RlWzJdID0gKCh+cmVnMSkgPDwgMikgfCAweDAzOworfQorI2VuZGlmCisvKgorICogRGV0ZWN0IGFuZCBjb3JyZWN0IGEgMSBiaXQgZXJyb3IgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KK2ludCBuYW5kX2NvcnJlY3RfZGF0YSAodV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpCit7CisJdV9jaGFyIGEsIGIsIGMsIGQxLCBkMiwgZDMsIGFkZCwgYml0LCBpOworCisJLyogRG8gZXJyb3IgZGV0ZWN0aW9uICovCisJZDEgPSBjYWxjX2VjY1swXSBeIHJlYWRfZWNjWzBdOworCWQyID0gY2FsY19lY2NbMV0gXiByZWFkX2VjY1sxXTsKKwlkMyA9IGNhbGNfZWNjWzJdIF4gcmVhZF9lY2NbMl07CisKKwlpZiAoKGQxIHwgZDIgfCBkMykgPT0gMCkgeworCQkvKiBObyBlcnJvcnMgKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlhID0gKGQxIF4gKGQxID4+IDEpKSAmIDB4NTU7CisJCWIgPSAoZDIgXiAoZDIgPj4gMSkpICYgMHg1NTsKKwkJYyA9IChkMyBeIChkMyA+PiAxKSkgJiAweDU0OworCisJCS8qIEZvdW5kIGFuZCB3aWxsIGNvcnJlY3Qgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgZGF0YSAqLworCQlpZiAoKGEgPT0gMHg1NSkgJiYgKGIgPT0gMHg1NSkgJiYgKGMgPT0gMHg1NCkpIHsKKwkJCWMgPSAweDgwOworCQkJYWRkID0gMDsKKwkJCWEgPSAweDgwOworCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCQkJaWYgKGQxICYgYykKKwkJCQkJYWRkIHw9IGE7CisJCQkJYyA+Pj0gMjsKKwkJCQlhID4+PSAxOworCQkJfQorCQkJYyA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDIgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQliaXQgPSAwOworCQkJYiA9IDB4MDQ7CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQkJCWlmIChkMyAmIGMpCisJCQkJCWJpdCB8PSBiOworCQkJCWMgPj49IDI7CisJCQkJYiA+Pj0gMTsKKwkJCX0KKwkJCWIgPSAweDAxOworCQkJYSA9IGRhdFthZGRdOworCQkJYSBePSAoYiA8PCBiaXQpOworCQkJZGF0W2FkZF0gPSBhOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQlpID0gMDsKKwkJCXdoaWxlIChkMSkgeworCQkJCWlmIChkMSAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMSA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMikgeworCQkJCWlmIChkMiAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMiA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMykgeworCQkJCWlmIChkMyAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMyA+Pj0gMTsKKwkJCX0KKwkJCWlmIChpID09IDEpIHsKKwkJCQkvKiBFQ0MgQ29kZSBFcnJvciBDb3JyZWN0aW9uICovCisJCQkJcmVhZF9lY2NbMF0gPSBjYWxjX2VjY1swXTsKKwkJCQlyZWFkX2VjY1sxXSA9IGNhbGNfZWNjWzFdOworCQkJCXJlYWRfZWNjWzJdID0gY2FsY19lY2NbMl07CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBVbmNvcnJlY3RhYmxlIEVycm9yICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCXJldHVybiAtMTsKK30KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL29tYXBfYmNoLmMgYi94LWxvYWRlci9saWIvb21hcF9iY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQyNGE2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL29tYXBfYmNoLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBvbWFwX2JjaC5jCisgKgorICogU3VwcG9ydCBtb2R1bGVzIGZvciBCQ0ggNC1iaXQvOC1iaXQgZXJyb3IgY29ycmVjdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIHsyMDExfSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjZGVmaW5lIEdQTUNfRUNDX0JDSF9SRVNVTFRfMCAgIDB4MjQwCisjZGVmaW5lIFBBR0VfU0laRSAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTkFORF9FQ0NfUkVBRCAgICAgICAgICAgMAorI2RlZmluZSBOQU5EX0VDQ19XUklURSAgICAgICAgICAxCisjZGVmaW5lIF9fcmF3X3dyaXRlbCh2LGEpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhKSA9ICh2KSkKKyNkZWZpbmUgX19yYXdfcmVhZGwoYSkgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpKQorCitpbnQgZGVjb2RlX2JjaChpbnQgc2VsZWN0XzRfOCwgdW5zaWduZWQgY2hhciAqZWNjLCB1bnNpZ25lZCBpbnQgKmVycl9sb2MpOworCisvKgorICogIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4IC0gVmVyc2lvbiBmb3IgOEJJVCBCQ0ggY29ycmVjdGlvbi4KKyAqCisgKiAgQGRhdDoJdW51c2VkCisgKiAgQGVjY19jb2RlOgllY2NfY29kZSBidWZmZXIKKyAqLworaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGNvbnN0IHVpbnQ4X3QgKmRhdCwKKwkJCQkgICB1aW50OF90ICplY2NfY29kZSkKK3sKKyAgdW5zaWduZWQgbG9uZyByZWcsIHZhbDEgPSAweDAsIHZhbDIgPSAweDA7CisgIHVuc2lnbmVkIGxvbmcgdmFsMyA9IDB4MCwgdmFsNCA9IDB4MDsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRS81MTI7IGkrKykgeworICAgIC8qIFJlYWRpbmcgSFcgRUNDX0JDSF9SZXN1bHRzCisgICAgICogMHgyNDAtMHgyNEMsIDB4MjUwLTB4MjVDLCAweDI2MC0weDI2QywgMHgyNzAtMHgyN0MKKyAgICAgKi8KKyAgICByZWcgPSAodW5zaWduZWQgbG9uZykoR1BNQ19CQVNFICsKKwkJCSAgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICsgKDB4MTAgKiBpKSk7CisgICAgdmFsMSA9IF9fcmF3X3JlYWRsKHJlZyk7CisgICAgdmFsMiA9IF9fcmF3X3JlYWRsKHJlZyArIDQpOworICAgIHZhbDMgPSBfX3Jhd19yZWFkbChyZWcgKyA4KTsKKyAgICB2YWw0ID0gX19yYXdfcmVhZGwocmVnICsgMTIpOworCisgICAgKmVjY19jb2RlKysgPSAodmFsNCAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDI0KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMyAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDI0KSAmIDB4RkYpOworCisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwyICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwxICYgMHhGRik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQgLSBWZXJzaW9uIGZvciA0QklUIEJDSCBjb3JyZWN0aW9uLgorICoKKyAqICBAZGF0Ogl1bnVzZWQKKyAqICBAZWNjX2NvZGU6CWVjY19jb2RlIGJ1ZmZlcgorICovCitpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQoY29uc3QgdWludDhfdCAqZGF0LAorCQkJCSAgIHVpbnQ4X3QgKmVjY19jb2RlKQoreworICB1bnNpZ25lZCBsb25nIHJlZywgdmFsMSA9IDB4MCwgdmFsMiA9IDB4MDsJCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUvNTEyOyBpKyspIHsKKyAgICAvKiBSZWFkaW5nIEhXIEVDQ19CQ0hfUmVzdWx0cworICAgICAqIDB4MjQwLTB4MjRDLCAweDI1MC0weDI1QywgMHgyNjAtMHgyNkMsIDB4MjcwLTB4MjdDCisgICAgICovCisgICAgcmVnID0gKHVuc2lnbmVkIGxvbmcpKEdQTUNfQkFTRSArCisJCQkgIEdQTUNfRUNDX0JDSF9SRVNVTFRfMCArICgweDEwICogaSkpOworICAgIHZhbDEgPSBfX3Jhd19yZWFkbChyZWcpOworICAgIHZhbDIgPSBfX3Jhd19yZWFkbChyZWcgKyA0KTsKKworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMiAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDI0KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMSAmIDB4RkYpOworICB9CisgIHJldHVybiAwOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBmb3IgNGIvOGIgQkNIIGNvcnJlY3Rpb24uICBQYXNzIGVpdGhlciA0IG9yIDggaW50byB0aGUgCisgICBjb3JyZWN0X2JpdHMgcGFyYW1ldGVyLiAqLworc3RhdGljIGludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2goaW50IGNvcnJlY3RfYml0cywgdWludDhfdCAqZGF0LAorCQkJCSB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIGludCBpPTAsIGJsb2NrQ250PTQsIGosIGVjY2ZsYWcsIGNvdW50LCBjb3JyZWN0ZWQ9MDsKKyAgaW50IGVjY3NpemUgPSAoY29ycmVjdF9iaXRzID09IDgpID8gMTMgOiA3OworICBpbnQgbW9kZSA9IChjb3JyZWN0X2JpdHMgPT0gOCkgPyAxIDogMDsKKyAgdW5zaWduZWQgaW50IGVycl9sb2NbOF07CisKKyAgaWYgKGNvcnJlY3RfYml0cyA9PSA0KQorICAgIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGRhdCwgY2FsY19lY2MpOworICBlbHNlIGlmIChjb3JyZWN0X2JpdHMgPT0gOCkKKyAgICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOChkYXQsIGNhbGNfZWNjKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsgIC8qIHVuc3VwcG9ydGVkIG51bWJlciBvZiBjb3JyZWN0aW9uIGJpdHMgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDbnQ7IGkrKykgeworICAgIC8qIGNoZWNrIGlmIGFueSBlY2MgZXJyb3IgKi8KKyAgICBlY2NmbGFnID0gMDsKKyAgICBmb3IgKGogPSAwOyAoaiA8IGVjY3NpemUpICYmIChlY2NmbGFnID09IDApOyBqKyspCisgICAgICBpZiAoY2FsY19lY2Nbal0gIT0gMCkKKwllY2NmbGFnID0gMTsKKworICAgIGlmIChlY2NmbGFnID09IDEpIHsKKyAgICAgIGVjY2ZsYWcgPSAwOworICAgICAgZm9yIChqID0gMDsgKGogPCBlY2NzaXplKSAmJiAoZWNjZmxhZyA9PSAwKTsgaisrKQorCWlmIChyZWFkX2VjY1tqXSAhPSAweEZGKQorCSAgZWNjZmxhZyA9IDE7CisgICAgfQorCisgICAgaWYgKGVjY2ZsYWcgPT0gMSkgeworICAgICAgY291bnQgPSAwOworICAgICAgLypwcmludGsoS0VSTl9JTkZPICIuLi5iY2ggY29ycmVjdCglZCA1MTIgYnl0ZSlcbiIsIGkrMSk7Ki8KKyAgICAgIGNvdW50ID0gZGVjb2RlX2JjaChtb2RlLCBjYWxjX2VjYywgZXJyX2xvYyk7CisgICAgICAKKyAgICAgIC8qCisgICAgICAgKiBJZiB1bmNvcnJlY3RhYmxlIGVycm9yIGRldGVjdGVkIGluIHN1Yi1wYWdlLAorICAgICAgICoga2VlcCB1bmNvcnJlY3RhYmxlIGZsYWcgdG8gdXBwZXIgbGF5ZXIKKyAgICAgICAqLworICAgICAgaWYoY291bnQgPT0gLTEpCisgICAgICAgIGNvcnJlY3RlZCA9IC0xOworICAgICAgLyoKKyAgICAgICAqIElmIG5vIHVuY29ycmVjdGFibGUgZXJyb3IgdGhlbiBpbmNyZW1lbnQKKyAgICAgICAqIGNvcnJlY3RlZCBjb3VudAorICAgICAgICovCisgICAgICBpZihjb3JyZWN0ZWQgIT0gLTEpCisgICAgICAgIGNvcnJlY3RlZCArPSBjb3VudDsKKwkJCQorICAgICAgZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkvKnByaW50ayhLRVJOX0lORk8gImVycl9sb2M9JWRcbiIsIGVycl9sb2Nbal0pOyovCisgICAgICAgIHByaW50ZigiZXJyX2xvYz0lZFxuIiwgZXJyX2xvY1tqXSk7CisJaWYgKGVycl9sb2Nbal0gPCA0MDk2KQorCSAgZGF0W2Vycl9sb2Nbal0gPj4gM10gXj0gMSA8PCAoZXJyX2xvY1tqXSAmIDcpOworCS8qIGVsc2UsIG5vdCBpbnRlcmVzdGVkIHRvIGNvcnJlY3QgZWNjICovCisgICAgICB9CisKKyAgICB9CisKKyAgICBjYWxjX2VjYyA9IGNhbGNfZWNjICsgZWNjc2l6ZTsKKyAgICByZWFkX2VjYyA9IHJlYWRfZWNjICsgZWNjc2l6ZTsKKyAgICBkYXQgKz0gNTEyOworICB9CisKKyAgcmV0dXJuIGNvcnJlY3RlZDsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbiBmb3IgNCBiaXQgQkNIIGNvcnJlY3Rpb24gKi8KK2ludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g0KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworICByZXR1cm4gb21hcF9jb3JyZWN0X2RhdGFfYmNoKDQsIGRhdCwgcmVhZF9lY2MsIGNhbGNfZWNjKTsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbiBmb3IgOCBiaXQgQkNIIGNvcnJlY3Rpb24gKi8KK2ludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g4KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworICByZXR1cm4gb21hcF9jb3JyZWN0X2RhdGFfYmNoKDgsIGRhdCwgcmVhZF9lY2MsIGNhbGNfZWNjKTsKK30KKworLyoKKyAqIG9tYXBfZW5hYmxlX2VjYyAtIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgZWNjIGZ1bmN0aW9uYWxpdHkKKyAqIEBtdGQ6ICAgICAgICBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1vZGU6ICAgICAgIFJlYWQvV3JpdGUgbW9kZQorICovCit2b2lkIG9tYXBfZW5hYmxlX2h3ZWNjX2JjaDQodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpCit7CisgIHVpbnQzMl90IGJjaF9tb2Q9MDsKKyAgdWludDMyX3QgZGV2X3dpZHRoID0gKGJ1c193aWR0aD09OCk/MDoxOworICB1bnNpZ25lZCBpbnQgZWNjc2l6ZTEsIGVjY3NpemUwOworICB1bnNpZ25lZCBpbnQgZWNjX2NvbmZfdmFsID0gMCwgZWNjX3NpemVfY29uZl92YWwgPSAwOworCisgIHN3aXRjaCAobW9kZSkgeworICBjYXNlIE5BTkRfRUNDX1JFQUQgICAgOgorICAgIGVjY3NpemUxID0gMHhEOyBlY2NzaXplMCA9IDB4NDg7CisgICAgLyogRUNDU0laRTE9MjYgfCBFQ0NTSVpFMD0xMiAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDkgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBjYXNlIE5BTkRfRUNDX1dSSVRFICAgOgorICAgIGVjY3NpemUxID0gMHgyMDsgZWNjc2l6ZTAgPSAweDAwOworCisgICAgLyogRUNDU0laRTE9MzIgfCBFQ0NTSVpFMD0wMCAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDYgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHByaW50ZigiRXJyb3I6IFVucmVjb2duaXplZCBNb2RlWyVkXSFcbiIsIG1vZGUpOworICAgIGJyZWFrOworICB9CisKKyAgX19yYXdfd3JpdGVsKDB4MSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19zaXplX2NvbmZfdmFsLCAoR1BNQ19FQ0NfU0laRV9DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19jb25mX3ZhbCwgKEdQTUNfRUNDX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoMHgxMDEsIChHUE1DX0VDQ19DT05UUk9MKSk7Cit9CisKKy8qCisgKiBvbWFwX2VuYWJsZV9lY2MgLSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGhhcmR3YXJlIGVjYyBmdW5jdGlvbmFsaXR5CisgKiBAbXRkOiAgICAgICAgTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtb2RlOiAgICAgICBSZWFkL1dyaXRlIG1vZGUKKyAqLwordm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g4KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKQoreworICB1aW50MzJfdCBiY2hfbW9kPTE7CisgIHVpbnQzMl90IGRldl93aWR0aCA9IChidXNfd2lkdGg9PTgpPzA6MTsKKyAgdW5zaWduZWQgaW50IGVjY3NpemUxLCBlY2NzaXplMDsKKyAgdW5zaWduZWQgaW50IGVjY19jb25mX3ZhbCA9IDAsIGVjY19zaXplX2NvbmZfdmFsID0gMDsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgY2FzZSBOQU5EX0VDQ19SRUFEICAgIDoKKyAgICBlY2NzaXplMSA9IDB4MUE7IGVjY3NpemUwID0gMHgxODsKKyAgICAvKiBFQ0NTSVpFMT0yNiB8IEVDQ1NJWkUwPTEyICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNCA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTkFORF9FQ0NfV1JJVEUgICA6CisgICAgZWNjc2l6ZTEgPSAweDIwOyBlY2NzaXplMCA9IDB4MDA7CisKKyAgICAvKiBFQ0NTSVpFMT0zMiB8IEVDQ1NJWkUwPTAwICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNiA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcHJpbnRmKCJFcnJvcjogVW5yZWNvZ25pemVkIE1vZGVbJWRdIVxuIiwgbW9kZSk7CisgICAgYnJlYWs7CisgIH0KKworICBfX3Jhd193cml0ZWwoMHgxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworICBfX3Jhd193cml0ZWwoZWNjX3NpemVfY29uZl92YWwsIChHUE1DX0VDQ19TSVpFX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoZWNjX2NvbmZfdmFsLCAoR1BNQ19FQ0NfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbCgweDEwMSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMgYi94LWxvYWRlci9saWIvb21hcF9iY2hfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3N2U5M2MKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvb21hcF9iY2hfZGVjb2Rlci5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogbGliL29tYXBfYmNoX2RlY29kZXIuYworICoKKyAqIFdob2xlIEJDSCBFQ0MgRGVjb2RlciAoUG9zdCBoYXJkd2FyZSBnZW5lcmF0ZWQgc3luZHJvbWUgZGVjb2RpbmcpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRleGFzIEluc3RydW1lbnRzCisgKgorICogQXV0aG9yOiBTdWt1bWFyIEdob3JhaSA8cy1naG9yYWlAdGkuY29tCisgKgkJICAgTWljaGFlbCBGaWxsaW5nZXIgPG0tZmlsbGluZ2VyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgcHJpbnRrIC8vcHJpbnRmCisKKyNkZWZpbmUgbW0JCTEzCisjZGVmaW5lIGtrX3Nob3J0ZW4JNDA5NgorI2RlZmluZSBubgkJODE5MQkvKiBMZW5ndGggb2YgY29kZXdvcmQsIG4gPSAyKiptbSAtIDEgKi8KKworI2RlZmluZSBQUFAJMHgyMDFCCS8qIFByaW1hcnkgUG9seW5vbWlhbCA6IHheMTMgKyB4XjQgKyB4XjMgKyB4ICsgMSAqLworI2RlZmluZSBQCTB4MDAxQgkvKiBXaXRoIG9taXR0ZWQgeF4xMyAqLworI2RlZmluZSBQT0xZCTEyCS8qIGRlZ3JlZSBvZiB0aGUgcHJpbWFyeSBQb2x5bm9taWFsIGxlc3Mgb25lICovCisKKy8qKgorICogbXB5X21vZF9nZiAtIEdBTE9JUyBmaWVsZCBtdWx0aXBsaWVyCisgKiBJbnB1dCAgOiBBKHgpLCBCKHgpCisgKiBPdXRwdXQgOiBBKHgpKkIoeCkgbW9kIFAoeCkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtcHlfbW9kX2dmKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYikKK3sKKwl1bnNpZ25lZCBpbnQgUiA9IDA7CisJdW5zaWduZWQgaW50IFIxID0gMDsKKwl1bnNpZ25lZCBpbnQgayA9IDA7CisKKwlmb3IgKGsgPSAwOyBrIDwgbW07IGsrKykgeworCisJCVIgPSAoUiA8PCAxKSAmIDB4MUZGRTsKKwkJaWYgKFIxID09IDEpCisJCQlSIF49IFA7CisKKwkJaWYgKCgoYSA+PiAoUE9MWSAtIGspKSAmIDEpID09IDEpCisJCQlSIF49IGI7CisKKwkJaWYgKGsgPCBQT0xZKQorCQkJUjEgPSAoUiA+PiBQT0xZKSAmIDE7CisJfQorCXJldHVybiBSOworfQorCisvKioKKyAqIGNoaWVuIC0gQ0hJRU4gc2VhcmNoCisgKgorICogQGxvY2F0aW9uIC0gRXJyb3IgbG9jYXRpb24gdmVjdG9yIHBvaW50ZXIKKyAqCisgKiBJbnB1dHMgIDogRUxQKHopCisgKgkgICAgIE5vLiBvZiBmb3VuZCBlcnJvcnMKKyAqCSAgICAgU2l6ZSBvZiBpbnB1dCBjb2Rld29yZAorICogT3V0cHV0cyA6IFVwIHRvIDggbG9jYXRpb25zCisgKgkgICAgIE5vLiBvZiBlcnJvcnMKKyAqLworc3RhdGljIGludCBjaGllbih1bnNpZ25lZCBpbnQgc2VsZWN0XzRfOCwgaW50IGVycl9udW1zLAorCQkJCXVuc2lnbmVkIGludCBlcnJbXSwgdW5zaWduZWQgaW50ICpsb2NhdGlvbikKK3sKKwlpbnQgaSwgY291bnQ7IC8qIE51bWJlciBvZiBkZWN0ZWN0ZWQgZXJyb3JzICovCisJLyogQ29udGFpbnMgYWNjdW11bGF0aW9uIG9mIGV2YWx1YXRpb24gYXQgeF5pIChpOjEtPjgpICovCisJdW5zaWduZWQgaW50IGdhbW1hc1s4XTsKKwl1bnNpZ25lZCBpbnQgYWxwaGE7CisJdW5zaWduZWQgaW50IGJpdCwgZWNjX2JpdHM7CisJdW5zaWduZWQgaW50IGVscF9zdW07CisKKwllY2NfYml0cyA9IChzZWxlY3RfNF84ID09IDApID8gNTIgOiAxMDQ7CisJCisJLyogU3RhcnQgZXZhbHVhdGlvbiBhdCBBbHBoYSoqODE5MiBhbmQgZGVjcmVhc2luZyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWdhbW1hc1tpXSA9IGVycltpXTsKKworCWNvdW50ID0gMDsKKwlmb3IgKGkgPSAxOyAoaSA8PSBubikgJiYgKGNvdW50IDwgZXJyX251bXMpOyBpKyspIHsKKworCQkvKiBSZXN1bHQgb2YgZXZhbHVhdGlvbiBhdCByb290ICovCisJCWVscF9zdW0gPSAxIF4gZ2FtbWFzWzBdIF4gZ2FtbWFzWzFdIF4KKwkJCQlnYW1tYXNbMl0gXiBnYW1tYXNbM10gXgorCQkJCWdhbW1hc1s0XSBeIGdhbW1hc1s1XSBeCisJCQkJZ2FtbWFzWzZdIF4gZ2FtbWFzWzddOworCisJCWFscGhhID0gUFBQID4+IDE7CisJCWdhbW1hc1swXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzBdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0yICovCisJCWdhbW1hc1sxXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzFdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0yICovCisJCWdhbW1hc1syXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzJdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0zICovCisJCWdhbW1hc1szXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzNdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi00ICovCisJCWdhbW1hc1s0XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzRdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi01ICovCisJCWdhbW1hc1s1XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzVdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi02ICovCisJCWdhbW1hc1s2XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzZdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi03ICovCisJCWdhbW1hc1s3XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzddLCBhbHBoYSk7CisKKwkJaWYgKGVscF9zdW0gPT0gMCkgeworCQkJLyogY2FsY3VsYXRlIGxvY2F0aW9uICovCisJCQliaXQgPSAoKGktMSkgJiB+Nyl8KDctKChpLTEpICYgNykpOworCQkJbG9jYXRpb25bY291bnQrK10gPSBra19zaG9ydGVuIC0gKGJpdCAtIDIgKiBlY2NfYml0cykgLSAxOworCQl9CisJfQorCisJLyogRmFpbHVyZTogTm8uIG9mIGRldGVjdGVkIGVycm9ycyAhPSBOby4gb3IgY29ycmVjdGVkIGVycm9ycyAqLworCWlmIChjb3VudCAhPSBlcnJfbnVtcykgeworCQljb3VudCA9IC0xOworCQkvKglwcmludGsoS0VSTl9JTkZPICJCQ0ggZGVjb2RpbmcgZmFpbGVkXG4iKTsqLworCX0KKwkvKgorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICIlZCAiLCBsb2NhdGlvbltpXSk7CisJKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHN5bmQgOiAxNiBTeW5kcm9tZXMKKyAqIHJldHVybjogZ2FtYWFzIC0gQ29lZmZpY2llbnRzIHRvIHRoZSBlcnJvciBwb2x5bm9taWFsCisgKiByZXR1cm46IDogTnVtYmVyIG9mIGRldGVjdGVkIGVycm9ycworKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmVybGVrYW1wKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LAorCQkJdW5zaWduZWQgaW50IHN5bmRbXSwgdW5zaWduZWQgaW50IGVycltdKQoreworCWludCBsb29wLCBpdGVyYXRpb247CisJdW5zaWduZWQgaW50IExMID0gMDsJCS8qIERldGVjdGVkIGVycm9ycyAqLworCXVuc2lnbmVkIGludCBkID0gMDsJLyogRGlzdGFuY2UgYmV0d2VlbiBTeW5kcm9tZXMgYW5kIEVMUFtuXSh6KSAqLworCXVuc2lnbmVkIGludCBpbnZkID0gMDsJCS8qIEludmVyc2Ugb2YgZCAqLworCS8qIEludGVybWVkaWF0ZSBFTFBbbl0oeikuCisJICogRmluYWwgRUxQW25dKHopIGlzIEVycm9yIExvY2F0aW9uIFBvbHlub21pYWwKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZ2FtbWFzWzE2XTsKKwkvKiBJbnRlcm1lZGlhdGUgbm9ybWFsaXplZCBFTFBbbl0oeikgOiBEW25dKHopICovCisJdW5zaWduZWQgaW50IERbMTZdOworCS8qIFRlbXBvcmFyeSB2YWx1ZSB0aGF0IGhvbGRzIGFuIEVMUFtuXSh6KSBjb2VmZmljaWVudCAqLworCXVuc2lnbmVkIGludCBuZXh0X2dhbW1hID0gMDsKKworCWludCBlID0gMDsKKwl1bnNpZ25lZCBpbnQgc2lnbiA9IDA7CisJdW5zaWduZWQgaW50IHUgPSAwOworCXVuc2lnbmVkIGludCB2ID0gMDsKKwl1bnNpZ25lZCBpbnQgQzEgPSAwLCBDMiA9IDA7CisJdW5zaWduZWQgaW50IHNzID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wX3YgPSAwLCB0bXBfcyA9IDA7CisJdW5zaWduZWQgaW50IHRtcF9wb2x5OworCisJLyotLS0tLS0tLS0tLS0tLSBTdGVwIDAgLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTY7IGxvb3ArKykgeworCQlnYW1tYXNbbG9vcF0gPSAwOworCQlEW2xvb3BdID0gMDsKKwl9CisKKwlnYW1tYXNbMF0gPSAxOworCURbMV0gPSAxOworCisJaXRlcmF0aW9uID0gMDsKKwlMTCA9IDA7CisJd2hpbGUgKChpdGVyYXRpb24gPCAoKHNlbGVjdF80XzgrMSkqMio0KSkgJiYKKwkJCShMTCA8PSAoKHNlbGVjdF80XzgrMSkqNCkpKSB7CisKKwkgIC8qcHJpbnRrKEtFUk5fSU5GTyAiXG5JdGVyYXRpb24uLi4uLi4uLi4uLi4uJWRcbiIsIGl0ZXJhdGlvbik7Ki8KKwkJZCA9IDA7CisJCS8qIFN0ZXA6IDAgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8PSBMTDsgbG9vcCsrKSB7CisJCQl0bXBfcG9seSA9IG1weV9tb2RfZ2YoCisJCQkJCWdhbW1hc1tsb29wXSwgc3luZFtpdGVyYXRpb24gLSBsb29wXSk7CisJCQlkIF49IHRtcF9wb2x5OworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTAgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIHRtcF9wb2x5KTsqLworCQl9CisKKwkJLyogU3RlcCAxOiAxIGN5Y2xlIG9ubHkgdG8gcGVyZm9ybSBpbnZlcnNpb24gKi8KKwkJdiA9IGQgPDwgMTsKKwkJZSA9IC0xOworCQlzaWduID0gMTsKKwkJc3MgPSAweDIwMDA7CisJCWludmQgPSAwOworCQl1ID0gUFBQOworCQlmb3IgKGxvb3AgPSAwOyAoZCAhPSAwKSAmJiAobG9vcCA8PSAoMiAqIFBPTFkpKTsgbG9vcCsrKSB7CisJCSAgLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTEgTEw9JXggcG9seSBOVUxMXG4iLAorCQkgICAgbG9vcCwgTEwpOyovCisJCQlDMSA9ICh2ID4+IDEzKSAmIDE7CisJCQlDMiA9IEMxICYgc2lnbjsKKworCQkJc2lnbiBePSBDMiBeIChlID09IDApOworCisJCQl0bXBfdiA9IHY7CisJCQl0bXBfcyA9IHNzOworCisJCQlpZiAoQzEgPT0gMSkgeworCQkJCXYgXj0gdTsKKwkJCQlzcyBePSBpbnZkOworCQkJfQorCQkJdiA9ICh2IDw8IDEpICYgMHgzRkZGOworCQkJaWYgKEMyID09IDEpIHsKKwkJCQl1ID0gdG1wX3Y7CisJCQkJaW52ZCA9IHRtcF9zOworCQkJCWUgPSAtZTsKKwkJCX0KKwkJCWludmQgPj49IDE7CisJCQllLS07CisJCX0KKworCQlmb3IgKGxvb3AgPSAwOyAoZCAhPSAwKSAmJiAobG9vcCA8PSAoaXRlcmF0aW9uICsgMSkpOyBsb29wKyspIHsKKwkJCS8qIFN0ZXAgMgorCQkJICogSW50ZXJsZWF2ZWQgd2l0aCBTdGVwIDMsIGlmIEw8KG4taykKKwkJCSAqIGludmQ6IFVwZGF0ZSBvZiBFTFBbbl0oeikgPSBFTFBbbi0xXSh6KSAtIGQuRFtuLTFdKHopCisJCQkgKi8KKworCQkJLyogSG9sZHMgdmFsdWUgb2YgRUxQIGNvZWZmaWNpZW50IHVudGlsIHByZWNlZGVudAorCQkJICogdmFsdWUgZG9lcyBub3QgaGF2ZSB0byBiZSB1c2VkIGFueW1vcmUKKwkJCSAqLworCQkJdG1wX3BvbHkgPSBtcHlfbW9kX2dmKGQsIERbbG9vcF0pOworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTIgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIHRtcF9wb2x5KTsqLworCisJCQluZXh0X2dhbW1hID0gZ2FtbWFzW2xvb3BdIF4gdG1wX3BvbHk7CisJCQlpZiAoKDIgKiBMTCkgPCAoaXRlcmF0aW9uICsgMSkpIHsKKwkJCQkvKiBJbnRlcmxlYXZpbmcgd2l0aCBTdGVwIDMKKwkJCQkgKiBmb3IgcGFyYWxsZWxpemVkIHVwZGF0ZSBvZiBFTFAoeikgYW5kIEQoeikKKwkJCQkgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogVXBkYXRlIG9mIEVMUCh6KSBvbmx5IC0+IHN0YXkgaW4gU3RlcCAyICovCisJCQkJZ2FtbWFzW2xvb3BdID0gbmV4dF9nYW1tYTsKKwkJCQlpZiAobG9vcCA9PSAoaXRlcmF0aW9uICsgMSkpIHsKKwkJCQkJLyogdG8gc3RlcCA0ICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLyogU3RlcCAzCisJCQkgKiBBbHdheXMgaW50ZXJsZWF2ZWQgd2l0aCBTdGVwIDIgKGNhc2Ugd2hlbiBMPChuLWspKQorCQkJICogVXBkYXRlIG9mIERbbi0xXSh6KSA9IEVMUFtuLTFdKHopL2QKKwkJCSAqLworCQkJRFtsb29wXSA9IG1weV9tb2RfZ2YoZ2FtbWFzW2xvb3BdLCBpbnZkKTsKKwkJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJTAyZC4gcz0zIExMPSV4IHBvbHkgJXhcbiIsCisJCQkgIGxvb3AsIExMLCBEW2xvb3BdKTsqLworCisJCQkvKiBDYW4gc2FmZWx5IHVwZGF0ZSBFTFBbbl0oeikgKi8KKwkJCWdhbW1hc1tsb29wXSA9IG5leHRfZ2FtbWE7CisKKwkJCWlmIChsb29wID09IChpdGVyYXRpb24gKyAxKSkgeworCQkJCS8qIElmIHVwZGF0ZSBmaW5pc2hlZCAqLworCQkJCUxMID0gaXRlcmF0aW9uIC0gTEwgKyAxOworCQkJCS8qIHRvIHN0ZXAgNCAqLworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRWxzZSwgaW50ZXJsZWF2aW5nIHRvIHN0ZXAgMiovCisJCX0KKworCQkvKiBTdGVwIDQ6IFVwZGF0ZSBEKHopOiBpOjAtPkwgKi8KKwkJLyogRmluYWwgdXBkYXRlIG9mIERbbl0oeikgPSBEW25dKHopLnoqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTU7IGxvb3ArKykgLyogTGVmdCBTaGlmdCAqLworCQkJRFsxNSAtIGxvb3BdID0gRFsxNCAtIGxvb3BdOworCisJCURbMF0gPSAwOworCisJCWl0ZXJhdGlvbisrOworCX0gLyogd2hpbGUgKi8KKworCS8qIFByb2Nlc3NpbmcgZmluaXNoZWQsIGNvcHkgRUxQIHRvIGZpbmFsIHJlZ2lzdGVycyA6IDAtPjJ0LTEqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVycltsb29wXSA9IGdhbW1hc1tsb29wKzFdOworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBFcnIgcG9seToiKTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQlwcmludGsoS0VSTl9JTkZPICIweCV4ICIsIGVycltsb29wXSk7CisJKi8KKwlyZXR1cm4gTEw7Cit9CisKKy8qCisgKiBzeW5kcm9tZSAtIEdlbmVyYXRlIHN5bmRyb21lIGNvbXBvbmVudHMgZnJvbSBodyBnZW5lcmF0ZSBzeW5kcm9tZQorICogcih4KSA9IGMoeCkgKyBlKHgpCisgKiBzKHgpID0gYyh4KSBtb2QgZyh4KSArIGUoeCkgbW9kIGcoeCkgPSAgZSh4KSBtb2QgZyh4KQorICogc28gcmVjZWl2ZXIgY2hlY2tzIGlmIHRoZSBzeW5kcm9tZSBzKHgpID0gcih4KSBtb2QgZyh4KSBpcyBlcXVhbCB0byB6ZXJvLgorICogdW5zaWduZWQgaW50IHNbMTZdOyAtIFN5bmRyb21lcworICovCitzdGF0aWMgdm9pZCBzeW5kcm9tZSh1bnNpZ25lZCBpbnQgc2VsZWN0XzRfOCwKKwkJCQkJdW5zaWduZWQgY2hhciAqZWNjLCB1bnNpZ25lZCBpbnQgc3luW10pCit7CisJdW5zaWduZWQgaW50IGssIGwsIHQ7CisJdW5zaWduZWQgaW50IGFscGhhX2JpdCwgUl9iaXQ7CisJaW50IGVjY19wb3MsIGVjY19taW47CisKKwkvKiAydC0xID0gMTUgKGZvciB0PTgpIG1pbmltYWwgcG9seW5vbWlhbHMgb2YgdGhlIGZpcnN0IDE1IHBvd2VycyBvZiBhCisJICogcHJpbWl0aXZlIGVsZW1tYW50cyBvZiBHRihtKTsgRXZlbiBwb3dlcnMgbWluaW1hbCBwb2x5bm9taWFscyBhcmUKKwkgKiBkdXBsaWNhdGUgb2Ygb2RkIHBvd2VycycgbWluaW1hbCBwb2x5bm9taWFscy4KKwkgKiBPZGQgcG93ZXJzIG9mIGFscGhhICgxIHRvIDE1KQorCSAqLworCXVuc2lnbmVkIGludCBwb3dfYWxwaGFbOF0gPSB7MHgwMDAyLCAweDAwMDgsIDB4MDAyMCwgMHgwMDgwLAorCQkJCSAweDAyMDAsIDB4MDgwMCwgMHgwMDFCLCAweDAwNkN9OworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBFQ0NbMC4ubl06ICIpOworCWZvciAoayA9IDA7IGsgPCAxMzsgaysrKQorCQlwcmludGsoS0VSTl9JTkZPICIweCV4ICIsIGVjY1trXSk7CisJKi8KKworCWlmIChzZWxlY3RfNF84ID09IDApIHsKKwkJdCA9IDQ7CisJCWVjY19wb3MgPSA1NTsgLyogYml0cyg1Mi1iaXRzKTogNTUtPjQgKi8KKwkJZWNjX21pbiA9IDQ7CisJfSBlbHNlIHsKKwkJdCA9IDg7CisJCWVjY19wb3MgPSAxMDM7IC8qIGJpdHM6IDEwMy0+MCAqLworCQllY2NfbWluID0gMDsKKwl9CisKKwkvKiB0b3RhbCBudW1iYmVyIG9mIHN5bmRyb20gdG8gYmUgdXNlZCBpcyAydCAqLworCS8qIFN0ZXAxOiBjYWxjdWxhdGUgdGhlIG9kZCBzeW5kcm9tZShzKSAqLworCVJfYml0ID0gKChlY2NbZWNjX3Bvcy84XSA+PiAoNyAtIGVjY19wb3MlOCkpICYgMSk7CisJZWNjX3Bvcy0tOworCWZvciAoayA9IDA7IGsgPCB0OyBrKyspCisJCXN5blsyICoga10gPSBSX2JpdDsKKworCXdoaWxlIChlY2NfcG9zID49IGVjY19taW4pIHsKKwkJUl9iaXQgPSAoKGVjY1tlY2NfcG9zLzhdID4+ICg3IC0gZWNjX3BvcyU4KSkgJiAxKTsKKwkJZWNjX3Bvcy0tOworCisJCWZvciAoayA9IDA7IGsgPCB0OyBrKyspIHsKKwkJCS8qIEFjY3VtdWxhdGUgdmFsdWUgb2YgeF5pIGF0IGFscGhhXigyaysxKSAqLworCQkJaWYgKFJfYml0ID09IDEpCisJCQkJc3luWzIqa10gXj0gcG93X2FscGhhW2tdOworCisJCQkvKiBDb21wdXRlIGEqKigyaysxKSwgdXNpbmcgTFNGUiAqLworCQkJZm9yIChsID0gMDsgbCA8ICgyICogayArIDEpOyBsKyspIHsKKwkJCQlhbHBoYV9iaXQgPSAocG93X2FscGhhW2tdID4+IFBPTFkpICYgMTsKKwkJCQlwb3dfYWxwaGFba10gPSAocG93X2FscGhhW2tdIDw8IDEpICYgMHgxRkZGOworCQkJCWlmIChhbHBoYV9iaXQgPT0gMSkKKwkJCQkJcG93X2FscGhhW2tdIF49IFA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdGVwMjogY2FsY3VsYXRlIHRoZSBldmVuIHN5bmRyb21lKHMpCisJICogQ29tcHV0ZSBTKGEpLCB3aGVyZSBhIGlzIGFuIGV2ZW4gcG93ZXIgb2YgYWxwaGEKKwkgKiBFdmVucnkgZXZlbiBwb3dlciBvZiBwcmltaXRpdmUgZWxlbWVudCBoYXMgdGhlIHNhbWUgbWluaW1hbAorCSAqIHBvbHlub21pYWwgYXMgc29tZSBvZGQgcG93ZXIgb2YgZWxlbWV0cy4KKwkgKiBBbmQgYmFzZWQgb24gUyhhXjIpID0gU14yKGEpCisJICovCisJZm9yIChrID0gMDsgayA8IHQ7IGsrKykKKwkJc3luWzIqaysxXSA9IG1weV9tb2RfZ2Yoc3luW2tdLCBzeW5ba10pOworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBTeW5kcm9tZXM6ICIpOworCWZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgc3luW2tdKTsqLworfQorCisvKioKKyAqIGRlY29kZV9iY2ggLSBCQ0ggZGVjb2RlciBmb3IgNC0gYW5kIDgtYml0IGVycm9yIGNvcnJlY3Rpb24KKyAqCisgKiBAZWNjIC0gRUNDIHN5bmRyb21lIGdlbmVyYXRlZCBieSBodyBCQ0ggZW5naW5lCisgKiBAZXJyX2xvYyAtIHBvaW50ZXIgdG8gZXJyb3IgbG9jYXRpb24gYXJyYXkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgcG9zdCBzeWRyb21lIGdlbmVyYXRpb24gKGh3IGdlbmVyYXRlZCkgZGVjb2RpbmcKKyAqIGZvcjotCisgKiBEaW1lbnNpb24gb2YgR2Fsb2lzZSBGaWVsZDogbSA9IDEzCisgKiBMZW5ndGggb2YgY29kZXdvcmQ6IG4gPSAyKiptIC0gMQorICogTnVtYmVyIG9mIGVycm9ycyB0aGF0IGNhbiBiZSBjb3JyZWN0ZWQ6IDQtIG9yIDgtYml0cworICogTGVuZ3RoIG9mIGluZm9ybWF0aW9uIGJpdDoga2sgPSBubiAtIHJyCisgKi8KK2ludCBkZWNvZGVfYmNoKGludCBzZWxlY3RfNF84LCB1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCAqZXJyX2xvYykKK3sKKyAgICAgICAgaW50IG5vX29mX2VyciwgaTsKKwl1bnNpZ25lZCBpbnQgc3luWzE2XTsJLyogMTYgU3luZHJvbWVzICovCisJdW5zaWduZWQgaW50IGVycl9wb2x5WzhdOworCS8qIENvZWZmaWNpZW50cyB0byB0aGUgZXJyb3IgcG9seW5vbWlhbAorCSAqIEVMUCh4KSA9IDEgKyBlcnIwLnggKyBlcnIxLnheMiArIC4uLiArIGVycjcueF44CisJICovCisKKwkvKiBwZXJmb3JtIG1hbnVhbCBpbml0aWFsaXphdGlvbiB0byBhdm9pZCBtZW1zZXQgKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJICBzeW5baV0gPSAwOworCSAgaWYgKGk8OCkKKwkgICAgZXJyX3BvbHlbaV0gPSAwOworCX0KKworCS8qIERlY290aW5nIGludm9sZXMgdGhyZWUgc3RlcHMKKwkgKiAxLiBDb21wdXRlIHRoZSBzeW5kcm9tIGZyb20gdGVoIHJlY2VpdmVkIGNvZGV3b3JkLAorCSAqIDIuIEZpbmQgdGhlIGVycm9yIGxvY2F0aW9uIHBvbHlub21pYWwgZnJvbSBhIHNldCBvZiBlcXVhdGlvbnMKKwkgKiAgICAgZGVyaXZlZCBmcm9tIHRoZSBzeW5kcm9tZSwKKwkgKiAzLiBVc2UgdGhlIGVycm9yIGxvY2F0aW9uIHBvbHlub21pYWwgdG8gaWRlbnRpZnkgZXJyYW50cyBiaXRzLAorCSAqCisJICogQW5kIGNvcnJlY3R0aW9uIGRvbmUgYnkgYml0IGZsaXBzIHVzaW5nIGVycm9yIGxvY2FpdG9uIGFuZCBleHBlY3RlZAorCSAqIHRvIGJlIG91dHNlaWRlIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uCisJICovCisJc3luZHJvbWUoc2VsZWN0XzRfOCwgZWNjLCBzeW4pOworCW5vX29mX2VyciA9IGJlcmxla2FtcChzZWxlY3RfNF84LCBzeW4sIGVycl9wb2x5KTsKKwlpZiAobm9fb2ZfZXJyIDw9ICg0IDw8IHNlbGVjdF80XzgpKQorCQlub19vZl9lcnIgPSBjaGllbihzZWxlY3RfNF84LCBub19vZl9lcnIsIGVycl9wb2x5LCBlcnJfbG9jKTsKKworCXJldHVybiBub19vZl9lcnI7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZV9iY2gpOwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL3ByaW50Zi5jIGIveC1sb2FkZXIvbGliL3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvcHJpbnRmLmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBCYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZpbGU6CisgKiAgbGludXgvbGliL3ZzcHJpbnRmLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qIHZzcHJpbnRmLmMgLS0gTGFycyBXaXJ6ZW5pdXMgJiBMaW51cyBUb3J2YWxkcy4gKi8KKy8qCisgKiBXaXJ6ZW5pdXMgd3JvdGUgdGhpcyBwb3J0YWJseSwgVG9ydmFsZHMgZnVja2VkIGl0IHVwIDotKQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19QUklOVEYKKyAKKy8qIHdlIHVzZSB0aGlzIHNvIHRoYXQgd2UgY2FuIGRvIHdpdGhvdXQgdGhlIGN0eXBlIGxpYnJhcnkgKi8KKyNkZWZpbmUgaXNfZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiBzYyAtIHM7Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9hdG9pKGNvbnN0IGNoYXIgKipzKQoreworCWludCBpPTA7CisKKwl3aGlsZSAoaXNfZGlnaXQoKipzKSkKKwkJaSA9IGkqMTAgKyAqKCgqcykrKykgLSAnMCc7CisJcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgWkVST1BBRAkxCQkvKiBwYWQgd2l0aCB6ZXJvICovCisjZGVmaW5lIFNJR04JMgkJLyogdW5zaWduZWQvc2lnbmVkIGxvbmcgKi8KKyNkZWZpbmUgUExVUwk0CQkvKiBzaG93IHBsdXMgKi8KKyNkZWZpbmUgU1BBQ0UJOAkJLyogc3BhY2UgaWYgcGx1cyAqLworI2RlZmluZSBMRUZUCTE2CQkvKiBsZWZ0IGp1c3RpZmllZCAqLworI2RlZmluZSBTUEVDSUFMCTMyCQkvKiAweCAqLworI2RlZmluZSBMQVJHRQk2NAkJLyogdXNlICdBQkNERUYnIGluc3RlYWQgb2YgJ2FiY2RlZicgKi8KKworI2RlZmluZSBkb19kaXYobixiYXNlKSAoeyBcCitpbnQgX19yZXM7IFwKK19fcmVzID0gKCh1bnNpZ25lZCBsb25nKSBuKSAlICh1bnNpZ25lZCkgYmFzZTsgXAorbiA9ICgodW5zaWduZWQgbG9uZykgbikgLyAodW5zaWduZWQpIGJhc2U7IFwKK19fcmVzOyB9KQorCitzdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uCisJLGludCB0eXBlKQoreworCWNoYXIgYyxzaWduLHRtcFs2Nl07CisJY29uc3QgY2hhciAqZGlnaXRzPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCWludCBpOworCisJaWYgKHR5cGUgJiBMQVJHRSkKKwkJZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJaWYgKHR5cGUgJiBMRUZUKQorCQl0eXBlICY9IH5aRVJPUEFEOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCXJldHVybiAwOworCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworCXNpZ24gPSAwOworCWlmICh0eXBlICYgU0lHTikgeworCQlpZiAobnVtIDwgMCkgeworCQkJc2lnbiA9ICctJzsKKwkJCW51bSA9IC1udW07CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFBMVVMpIHsKKwkJCXNpZ24gPSAnKyc7CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFNQQUNFKSB7CisJCQlzaWduID0gJyAnOworCQkJc2l6ZS0tOworCQl9CisJfQorCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCQlpZiAoYmFzZSA9PSAxNikKKwkJCXNpemUgLT0gMjsKKwkJZWxzZSBpZiAoYmFzZSA9PSA4KQorCQkJc2l6ZS0tOworCX0KKwlpID0gMDsKKwlpZiAobnVtID09IDApCisJCXRtcFtpKytdPScwJzsKKwllbHNlIHdoaWxlIChudW0gIT0gMCkKKwkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSxiYXNlKV07CisJaWYgKGkgPiBwcmVjaXNpb24pCisJCXByZWNpc2lvbiA9IGk7CisJc2l6ZSAtPSBwcmVjaXNpb247CisJaWYgKCEodHlwZSYoWkVST1BBRCtMRUZUKSkpCisJCXdoaWxlKHNpemUtLT4wKQorCQkJKnN0cisrID0gJyAnOworCWlmIChzaWduKQorCQkqc3RyKysgPSBzaWduOworCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCQlpZiAoYmFzZT09OCkKKwkJCSpzdHIrKyA9ICcwJzsKKwkJZWxzZSBpZiAoYmFzZT09MTYpIHsKKwkJCSpzdHIrKyA9ICcwJzsKKwkJCSpzdHIrKyA9IGRpZ2l0c1szM107CisJCX0KKwl9CisJaWYgKCEodHlwZSAmIExFRlQpKQorCQl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJCSpzdHIrKyA9IGM7CisJd2hpbGUgKGkgPCBwcmVjaXNpb24tLSkKKwkJKnN0cisrID0gJzAnOworCXdoaWxlIChpLS0gPiAwKQorCQkqc3RyKysgPSB0bXBbaV07CisJd2hpbGUgKHNpemUtLSA+IDApCisJCSpzdHIrKyA9ICcgJzsKKwlyZXR1cm4gc3RyOworfQorCisgCitzdGF0aWMgaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIG51bTsKKwlpbnQgaSwgYmFzZTsKKwljaGFyICogc3RyOworCWNvbnN0IGNoYXIgKnM7CisKKwlpbnQgZmxhZ3M7CQkvKiBmbGFncyB0byBudW1iZXIoKSAqLworCisJaW50IGZpZWxkX3dpZHRoOwkvKiB3aWR0aCBvZiBvdXRwdXQgZmllbGQgKi8KKwlpbnQgcHJlY2lzaW9uOwkJLyogbWluLiAjIG9mIGRpZ2l0cyBmb3IgaW50ZWdlcnM7IG1heAorCQkJCSAgIG51bWJlciBvZiBjaGFycyBmb3IgZnJvbSBzdHJpbmcgKi8KKwlpbnQgcXVhbGlmaWVyOwkJLyogJ2gnLCAnbCcsIG9yICdMJyBmb3IgaW50ZWdlciBmaWVsZHMgKi8KKworCWZvciAoc3RyPWJ1ZiA7ICpmbXQgOyArK2ZtdCkgeworCQlpZiAoKmZtdCAhPSAnJScpIHsKKwkJCSpzdHIrKyA9ICpmbXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHByb2Nlc3MgZmxhZ3MgKi8KKwkJZmxhZ3MgPSAwOworCQlyZXBlYXQ6CisJCQkrK2ZtdDsJCS8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KKwkJCXN3aXRjaCAoKmZtdCkgeworCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBMRUZUOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcrJzogZmxhZ3MgfD0gUExVUzsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnICc6IGZsYWdzIHw9IFNQQUNFOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnMCc6IGZsYWdzIHw9IFpFUk9QQUQ7IGdvdG8gcmVwZWF0OworCQkJCX0KKworCQkvKiBnZXQgZmllbGQgd2lkdGggKi8KKwkJZmllbGRfd2lkdGggPSAtMTsKKwkJaWYgKGlzX2RpZ2l0KCpmbXQpKQorCQkJZmllbGRfd2lkdGggPSBza2lwX2F0b2koJmZtdCk7CisJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkrK2ZtdDsKKwkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCWZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmllbGRfd2lkdGggPCAwKSB7CisJCQkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCQkJZmxhZ3MgfD0gTEVGVDsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgcHJlY2lzaW9uICovCisJCXByZWNpc2lvbiA9IC0xOworCQlpZiAoKmZtdCA9PSAnLicpIHsKKwkJCSsrZm10OworCQkJaWYgKGlzX2RpZ2l0KCpmbXQpKQorCQkJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKKwkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkJKytmbXQ7CisJCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJCXByZWNpc2lvbiA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQkJfQorCQkJaWYgKHByZWNpc2lvbiA8IDApCisJCQkJcHJlY2lzaW9uID0gMDsKKwkJfQorCisJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KKwkJcXVhbGlmaWVyID0gLTE7CisJCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJykgeworCQkJcXVhbGlmaWVyID0gKmZtdDsKKwkJCSsrZm10OworCQl9CisKKwkJLyogZGVmYXVsdCBiYXNlICovCisJCWJhc2UgPSAxMDsKKworCQlzd2l0Y2ggKCpmbXQpIHsKKwkJY2FzZSAnYyc6CisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKKwkJCQkJKnN0cisrID0gJyAnOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3MnOgorCQkJcyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJaWYgKCFzKQorCQkJCXMgPSAiPE5VTEw+IjsKKworCQkJbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQkJKnN0cisrID0gKnMrKzsKKwkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3AnOgorCQkJaWYgKGZpZWxkX3dpZHRoID09IC0xKSB7CisJCQkJZmllbGRfd2lkdGggPSAyKnNpemVvZih2b2lkICopOworCQkJCWZsYWdzIHw9IFpFUk9QQUQ7CisJCQl9CisJCQlzdHIgPSBudW1iZXIoc3RyLAorCQkJCSh1bnNpZ25lZCBsb25nKSB2YV9hcmcoYXJncywgdm9pZCAqKSwgMTYsCisJCQkJZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCQkJY29udGludWU7CisKKworCQljYXNlICduJzoKKwkJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQkJbG9uZyAqIGlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWludCAqIGlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJyUnOgorCQkJKnN0cisrID0gJyUnOworCQkJY29udGludWU7CisKKwkJLyogaW50ZWdlciBudW1iZXIgZm9ybWF0cyAtIHNldCB1cCB0aGUgZmxhZ3MgYW5kICJicmVhayIgKi8KKwkJY2FzZSAnbyc6CisJCQliYXNlID0gODsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJZmxhZ3MgfD0gTEFSR0U7CisJCWNhc2UgJ3gnOgorCQkJYmFzZSA9IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2knOgorCQkJZmxhZ3MgfD0gU0lHTjsKKwkJY2FzZSAndSc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnN0cisrID0gJyUnOworCQkJaWYgKCpmbXQpCisJCQkJKnN0cisrID0gKmZtdDsKKwkJCWVsc2UKKwkJCQktLWZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKQorCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworCQllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CisJCQludW0gPSAodW5zaWduZWQgc2hvcnQpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJaWYgKGZsYWdzICYgU0lHTikKKwkJCQludW0gPSAoc2hvcnQpIG51bTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIFNJR04pCisJCQludW0gPSB2YV9hcmcoYXJncywgaW50KTsKKwkJZWxzZQorCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCXN0ciA9IG51bWJlcihzdHIsIG51bSwgYmFzZSwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCX0KKwkqc3RyID0gJ1wwJzsKKwlyZXR1cm4gc3RyLWJ1ZjsKK30KKwordm9pZCBzZXJpYWxfcHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdWludCBpOworCWNoYXIgcHJpbnRidWZmZXJbQ0ZHX1BCU0laRV07CisKKwl2YV9zdGFydCAoYXJncywgZm10KTsKKworCS8qIEZvciB0aGlzIHRvIHdvcmssIHByaW50YnVmZmVyIG11c3QgYmUgbGFyZ2VyIHRoYW4KKwkgKiBhbnl0aGluZyB3ZSBldmVyIHdhbnQgdG8gcHJpbnQuCisJICovCisJaSA9IHZzcHJpbnRmIChwcmludGJ1ZmZlciwgZm10LCBhcmdzKTsKKwl2YV9lbmQgKGFyZ3MpOworCisJLyogUHJpbnQgdGhlIHN0cmluZyAqLworCXNlcmlhbF9wdXRzIChwcmludGJ1ZmZlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9zdHJpbmcuYyBiL3gtbG9hZGVyL2xpYi9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ4Njc1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL3N0cmluZy5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgbGludXgvbGliL3N0cmluZy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogc3R1cGlkIGxpYnJhcnkgcm91dGluZXMuLiBUaGUgb3B0aW1pemVkIHZlcnNpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgZm91bmQKKyAqIGFzIGlubGluZSBjb2RlIGluIDxhc20teHgvc3RyaW5nLmg+CisgKgorICogVGhlc2UgYXJlIGJ1Z2d5IGFzIHdlbGwuLgorICoKKyAqICogRnJpIEp1biAyNSAxOTk5LCBJbmdvIE9lc2VyIDxpb2VAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyAqIC0gIEFkZGVkIHN0cnNlcCgpIHdoaWNoIHdpbGwgcmVwbGFjZSBzdHJ0b2soKSBzb29uIChiZWNhdXNlIHN0cnNlcCgpIGlzCisgKiAgICByZWVudHJhbnQgYW5kIHNob3VsZCBiZSBmYXN0ZXIpLiBVc2Ugb25seSBzdHJzZXAoKSBpbiBuZXcgY29kZSwgcGxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCisvKioKKyAqIG1lbW1vdmUgLSBDb3B5IG9uZSBhcmVhIG9mIG1lbW9yeSB0byBhbm90aGVyCisgKiBAZGVzdDogV2hlcmUgdG8gY29weSB0bworICogQHNyYzogV2hlcmUgdG8gY29weSBmcm9tCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIFVubGlrZSBtZW1jcHkoKSwgbWVtbW92ZSgpIGNvcGVzIHdpdGggb3ZlcmxhcHBpbmcgYXJlYXMuCisgKi8KK3ZvaWQgKiBtZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgY291bnQpCit7CisJY2hhciAqdG1wLCAqczsKKworCWlmIChkZXN0IDw9IHNyYykgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0OworCQlzID0gKGNoYXIgKikgc3JjOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSp0bXArKyA9ICpzKys7CisJCX0KKwllbHNlIHsKKwkJdG1wID0gKGNoYXIgKikgZGVzdCArIGNvdW50OworCQlzID0gKGNoYXIgKikgc3JjICsgY291bnQ7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKi0tdG1wID0gKi0tczsKKwkJfQorCisJcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL21rY29uZmlnIGIveC1sb2FkZXIvbWtjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE1YTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL21rY29uZmlnCkBAIC0wLDAgKzEsMTM4IEBACisjIS9iaW4vc2ggLWUKKworIyBTY3JpcHQgdG8gY3JlYXRlIGhlYWRlciBmaWxlcyBhbmQgbGlua3MgdG8gY29uZmlndXJlCisjIFgtTG9hZGVyIGZvciBhIHNwZWNpZmljIGJvYXJkLgorIworIyBQYXJhbWV0ZXJzOiAgVGFyZ2V0ICBBcmNoaXRlY3R1cmUgIENQVSAgQm9hcmQgW1ZFTkRPUl0gW1NPQ10KKyMKKyMgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyMgKEMpIDIwMDItMjAwNiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorIworCitBUFBFTkQ9bm8JIyBEZWZhdWx0OiBDcmVhdGUgbmV3IGNvbmZpZyBmaWxlCitCT0FSRF9OQU1FPSIiCSMgTmFtZSB0byBwcmludCBpbiBtYWtlIG91dHB1dAorVEFSR0VUUz0iIgorCithcmNoPSIiCitjcHU9IiIKK2JvYXJkPSIiCit2ZW5kb3I9IiIKK3NvYz0iIgorCitpZiBbIFwoICQjIC1lcSAyIFwpIC1hIFwoICIkMSIgPSAiLUEiIFwpIF0gOyB0aGVuCisJIyBBdXRvbWF0aWMgbW9kZQorCWxpbmU9YGVncmVwIC1pICJeW1s6c3BhY2U6XV0qJHsyfVtbOnNwYWNlOl1dIiBib2FyZHMuY2ZnYCB8fCB7CisJCWVjaG8gIm1ha2U6ICoqKiBObyBydWxlIHRvIG1ha2UgdGFyZ2V0IFxgJDJfY29uZmlnJy4gIFN0b3AuIiA+JjIKKwkJZXhpdCAxCisJfQorCisJc2V0ICR7bGluZX0KKwkjIGFkZCBkZWZhdWx0IGJvYXJkIG5hbWUgaWYgbmVlZGVkCisJWyAkIyA9IDMgXSAmJiBzZXQgJHtsaW5lfSAkezF9CitmaQorCit3aGlsZSBbICQjIC1ndCAwIF0gOyBkbworCWNhc2UgIiQxIiBpbgorCS0tKSBzaGlmdCA7IGJyZWFrIDs7CisJLWEpIHNoaWZ0IDsgQVBQRU5EPXllcyA7OworCS1uKSBzaGlmdCA7IEJPQVJEX05BTUU9IiR7MSVfY29uZmlnfSIgOyBzaGlmdCA7OworCS10KSBzaGlmdCA7IFRBUkdFVFM9ImBlY2hvICQxIHwgc2VkICdzOl86IDpnJ2AgJHtUQVJHRVRTfSIgOyBzaGlmdCA7OworCSopICBicmVhayA7OworCWVzYWMKK2RvbmUKKworWyAkIyAtbHQgNCBdICYmIGV4aXQgMQorWyAkIyAtZ3QgNiBdICYmIGV4aXQgMQorCitDT05GSUdfTkFNRT0iJHsxJV9jb25maWd9IgorCitbICIke0JPQVJEX05BTUV9IiBdIHx8IEJPQVJEX05BTUU9IiR7Q09ORklHX05BTUV9IgorCithcmNoPSIkMiIKK2NwdT0iJDMiCitpZiBbICIkNCIgPSAiLSIgXSA7IHRoZW4KKwlib2FyZD0ke0JPQVJEX05BTUV9CitlbHNlCisJYm9hcmQ9IiQ0IgorZmkKK1sgJCMgLWd0IDQgXSAmJiBbICIkNSIgIT0gIi0iIF0gJiYgdmVuZG9yPSIkNSIKK1sgJCMgLWd0IDUgXSAmJiBbICIkNiIgIT0gIi0iIF0gJiYgc29jPSIkNiIKKworaWYgWyAiJHtBUkNIfSIgLWEgIiR7QVJDSH0iICE9ICIke2FyY2h9IiBdOyB0aGVuCisJZWNobyAiRmFpbGVkOiBcJEFSQ0g9JHtBUkNIfSwgc2hvdWxkIGJlICcke2FyY2h9JyBmb3IgJHtCT0FSRF9OQU1FfSIgMT4mMgorCWV4aXQgMQorZmkKKworZWNobyAiQ29uZmlndXJpbmcgZm9yICR7Qk9BUkRfTkFNRX0gYm9hcmQuLi4iCisKKyMKKyMgQ3JlYXRlIGxpbmsgdG8gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGhlYWRlcnMKKyMKK2lmIFsgIiRTUkNUUkVFIiAhPSAiJE9CSlRSRUUiIF0gOyB0aGVuCisJbWtkaXIgLXAgJHtPQkpUUkVFfS9pbmNsdWRlCisJbWtkaXIgLXAgJHtPQkpUUkVFfS9pbmNsdWRlMgorCWNkICR7T0JKVFJFRX0vaW5jbHVkZTIKKwlybSAtZiBhc20KKwlsbiAtcyAke1NSQ1RSRUV9L2luY2x1ZGUvYXNtIGFzbQorCUxOUFJFRklYPSR7U1JDVFJFRX0vaW5jbHVkZS9hc20vCisJY2QgLi4vaW5jbHVkZQorCXJtIC1mIGFzbQorCWxuIC1zICR7U1JDVFJFRX0vaW5jbHVkZS9hc20gYXNtCitlbHNlCisJY2QgLi9pbmNsdWRlCitmaQorCitybSAtZiBhc20vYXJjaAorCitpZiBbIC16ICIke3NvY30iIF0gOyB0aGVuCisJbG4gLXMgJHtMTlBSRUZJWH1hcmNoLSR7Y3B1fSBhc20vYXJjaAorZWxzZQorCWxuIC1zICR7TE5QUkVGSVh9YXJjaC0ke3NvY30gYXNtL2FyY2gKK2ZpCisKK2lmIFsgIiR7YXJjaH0iID0gImFybSIgXSA7IHRoZW4KKwlybSAtZiBhc20vcHJvYworCWxuIC1zICR7TE5QUkVGSVh9cHJvYy1hcm12IGFzbS9wcm9jCitmaQorCisjCisjIENyZWF0ZSBpbmNsdWRlIGZpbGUgZm9yIE1ha2UKKyMKK2VjaG8gIkFSQ0ggICA9ICR7YXJjaH0iICA+ICBjb25maWcubWsKK2VjaG8gIkNQVSAgICA9ICR7Y3B1fSIgICA+PiBjb25maWcubWsKK2VjaG8gIkJPQVJEICA9ICR7Ym9hcmR9IiA+PiBjb25maWcubWsKKworWyAiJHt2ZW5kb3J9IiBdICYmIGVjaG8gIlZFTkRPUiA9ICR7dmVuZG9yfSIgPj4gY29uZmlnLm1rCisKK1sgIiR7c29jfSIgICAgXSAmJiBlY2hvICJTT0MgICAgPSAke3NvY30iICAgID4+IGNvbmZpZy5taworCisjIEFzc2lnbiBib2FyZCBkaXJlY3RvcnkgdG8gQk9BUkRJUiB2YXJpYWJsZQoraWYgWyAteiAiJHt2ZW5kb3J9IiBdIDsgdGhlbgorICAgIEJPQVJERElSPSR7Ym9hcmR9CitlbHNlCisgICAgQk9BUkRESVI9JHt2ZW5kb3J9LyR7Ym9hcmR9CitmaQorCisjCisjIENyZWF0ZSBib2FyZCBzcGVjaWZpYyBoZWFkZXIgZmlsZQorIworaWYgWyAiJEFQUEVORCIgPSAieWVzIiBdCSMgQXBwZW5kIHRvIGV4aXN0aW5nIGNvbmZpZyBmaWxlCit0aGVuCisJZWNobyA+PiBjb25maWcuaAorZWxzZQorCT4gY29uZmlnLmgJCSMgQ3JlYXRlIG5ldyBjb25maWcgZmlsZQorZmkKK2VjaG8gIi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IGVkaXQgKi8iID4+Y29uZmlnLmgKKworZm9yIGkgaW4gJHtUQVJHRVRTfSA7IGRvCisJZWNobyAiI2RlZmluZSBDT05GSUdfTUtfJHtpfSAxIiA+PmNvbmZpZy5oIDsKK2RvbmUKKworY2F0IDw8IEVPRiA+PiBjb25maWcuaAorI2RlZmluZSBDT05GSUdfQk9BUkRESVIgYm9hcmQvJEJPQVJERElSCisjaW5jbHVkZSA8Y29uZmlnX2RlZmF1bHRzLmg+CisjaW5jbHVkZSA8Y29uZmlncy8ke0NPTkZJR19OQU1FfS5oPgorI2luY2x1ZGUgPGFzbS9jb25maWcuaD4KK0VPRgorCitleGl0IDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3J1bGVzLm1rIGIveC1sb2FkZXIvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2NzBhYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3J1bGVzLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworX2RlcGVuZDoJJChvYmopLmRlcGVuZAorCiskKG9iaikuZGVwZW5kOgkkKHNyYylNYWtlZmlsZSAkKFRPUERJUikvY29uZmlnLm1rICQoU1JDUykgJChIT1NUU1JDUykKKwkJQHJtIC1mICRACisJCUBmb3IgZiBpbiAkKFNSQ1MpOyBkbyBcCisJCQlnPWBiYXNlbmFtZSAkJGYgfCBzZWQgLWUgJ3MvXCguKlwpXC5cdy9cMS5vLydgOyBcCisJCQkkKENDKSAtTSAkKENQUEZMQUdTKSAtTVEgJChvYmopJCRnICQkZiA+PiAkQCA7IFwKKwkJZG9uZQorCQlAZm9yIGYgaW4gJChIT1NUU1JDUyk7IGRvIFwKKwkJCWc9YGJhc2VuYW1lICQkZiB8IHNlZCAtZSAncy9cKC4qXClcLlx3L1wxLm8vJ2A7IFwKKwkJCSQoSE9TVENDKSAtTSAkKEhPU1RDUFBGTEFHUykgLU1RICQob2JqKSQkZyAkJGYgPj4gJEAgOyBcCisJCWRvbmUKKworJChIT1NUT0JKUyk6ICQob2JqKSUubzogJS5jCisJJChIT1NUQ0MpICQoSE9TVENGTEFHUykgJChIT1NUQ0ZMQUdTXyQoQEYpKSAkKEhPU1RDRkxBR1NfJChCQ1VSRElSKSkgLW8gJEAgJDwgLWMKKyQoTk9QRURPQkpTKTogJChvYmopJS5vOiAlLmMKKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTX05PUEVEKSAkKEhPU1RDRkxBR1NfJChARikpICQoSE9TVENGTEFHU18kKEJDVVJESVIpKSAtbyAkQCAkPCAtYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9zY3JpcHRzL21rb25lYm9vdC5zaCBiL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODYyYTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9zY3JpcHRzL21rb25lYm9vdC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKKworSU1BR0UxPXgtbG9hZC5iaW4uaWZ0CitJTUFHRTI9eC1sb2FkLXNpZ25lZC5pZnQKK1RNUD1vbmVsb2FkZXIKK1BBR0VTSVpFPTIwNDgKKworc2l6ZT1gbHMgLWxhICRJTUFHRTEgfCBhd2sgLUYnICcgJ3sgcHJpbnRmICQ1fSdgCitsZXQgcmVtYWluPSRQQUdFU0laRS0kc2l6ZQorZGQgaWY9L2Rldi96ZXJvIG9mPSRJTUFHRTIgYnM9MSBjb3VudD01MTIKKyNkZCBpZj0vZGV2L3plcm8gb2Y9emVyb2ZpbGUgYnM9JHJlbWFpbiBjb3VudD0xID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbAorY2F0ICRJTUFHRTE+PiRJTUFHRTIKKworcm0gLWYgJElNQUdFMQorCitlY2hvICJDcmVhdGUgJElNQUdFMiBjb21wbGV0ZWQuLi4iCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9NYWtlZmlsZSBiL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDViMmIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci90b29scy9NYWtlZmlsZQpAQCAtMCwwICsxLDg5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1RPT0xTVUJESVJTID0KKworIworIyB0b29sY2hhaW5zIHRhcmdldGluZyB3aW4zMiBnZW5lcmF0ZSAuZXhlIGZpbGVzCisjCitpZm5lcSAoLCQoZmluZHN0cmluZyBXSU4zMiAsJChzaGVsbCAkKEhPU1RDQykgLUUgLWRNIC14YyAvZGV2L251bGwpKSkKK1NGWCA9IC5leGUKK2Vsc2UKK1NGWCA9CitlbmRpZgorCisjCisjIEluY2x1ZGUgdGhpcyBhZnRlciBIT1NUT1MgSE9TVEFSQ0ggY2hlY2sKKyMgc28gdGhhdCB3ZSBjYW4gYWN0IGludGVsbGlnZW50bHkuCisjCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworIyBHZW5lcmF0ZWQgZXhlY3V0YWJsZSBmaWxlcworQklOX0ZJTEVTLXkgKz0gc2lnbkdQJChTRlgpCitPQkpfRklMRVMteSArPSBzaWduR1AubworCisjIG5vdyAkKG9iaikgaXMgZGVmaW5lZAorSE9TVFNSQ1MgKz0gJChhZGRwcmVmaXggJChTUkNUUkVFKS90b29scy8sJChPQkpfRklMRVMteToubz0uYykpCitCSU5TCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKHNvcnQgJChCSU5fRklMRVMteSkpKQorSE9TVE9CSlMgOj0gJChhZGRwcmVmaXggJChvYmopLCQoT0JKX0ZJTEVTLXkpKQorTk9QRURPQkpTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKE5PUEVEX09CSl9GSUxFUy15KSkKKworIworIyBVc2UgbmF0aXZlIHRvb2xzIGFuZCBvcHRpb25zCisjIERlZmluZSBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgdG8gcHJldmVudCB0eXBlZGVmIG92ZXJsYXBzCisjCitIT1NUQ1BQRkxBR1MgPQktaWRpcmFmdGVyICQoU1JDVFJFRSkvaW5jbHVkZSBcCisJCS1pZGlyYWZ0ZXIgJChPQkpUUkVFKS9pbmNsdWRlMiBcCisJCS1pZGlyYWZ0ZXIgJChPQkpUUkVFKS9pbmNsdWRlIFwKKwkgICAgICAgIC1JICQoU1JDVFJFRSkvbGliL2xpYmZkdCBcCisJCS1JICQoU1JDVFJFRSkvdG9vbHMgXAorCQktRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkgLURVU0VfSE9TVENDIFwKKwkJLURfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKworCithbGw6CSQob2JqKS5kZXBlbmQgJChCSU5TKSAkKExPR08teSkgc3ViZGlycworCiskKG9iailzaWduR1AkKFNGWCk6CSQob2JqKXNpZ25HUC5vCisJJChIT1NUQ0MpICQoSE9TVENGTEFHUykgJChIT1NUTERGTEFHUykgLW8gJEAgJF4KKwkkKEhPU1RTVFJJUCkgJEAKKworc3ViZGlyczoKK2lmZXEgKCQoVE9PTFNVQkRJUlMpLCkKKwlAOgorZWxzZQorCUBmb3IgZGlyIGluICQoVE9PTFNVQkRJUlMpIDsgZG8gXAorCSAgICAkKE1BS0UpIFwKKwkJSE9TVE9TPSQoSE9TVE9TKSBcCisJCUhPU1RBUkNIPSQoSE9TVEFSQ0gpIFwKKwkJLUMgJCRkaXIgfHwgZXhpdCAxIDsgXAorCWRvbmUKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9zZXRsb2NhbHZlcnNpb24gYi94LWxvYWRlci90b29scy9zZXRsb2NhbHZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTExZjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbgpAQCAtMCwwICsxLDQwIEBACisjIS9iaW4vc2gKKyMgUHJpbnQgYWRkaXRpb25hbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBub24tcmVsZWFzZSB0cmVlcy4KKwordXNhZ2UoKSB7CisJZWNobyAiVXNhZ2U6ICQwIFtzcmN0cmVlXSIgPiYyCisJZXhpdCAxCit9CisKK2NkICIkezE6LS59IiB8fCB1c2FnZQorCisjIENoZWNrIGZvciBnaXQgYW5kIGEgZ2l0IHJlcG8uCitpZiBoZWFkPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGxgOyB0aGVuCisJIyBEbyB3ZSBoYXZlIGFuIHVudGFnZ2VkIHZlcnNpb24/CisJaWYgZ2l0IG5hbWUtcmV2IC0tdGFncyBIRUFEIHwgXAorCSAgIGdyZXAgLUUgJ15IRUFEW1s6c3BhY2U6XV0rKC4qflswLTldKnx1bmRlZmluZWQpJCcgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIChnaXQgZGVzY3JpYmUgfHwgZ2l0IGRlc2NyaWJlIC0tdGFncyB8fCBnaXQgZGVzY3JpYmUgLS1hbGwgLS1sb25nKSBcCisJCQkJMj4vZGV2L251bGwgfCBhd2sgLUYtICd7cHJpbnRmKCItJTA1ZC0lcyIsICQoTkYtMSksJChORikpfScKKwlmaQorCisJIyBBcmUgdGhlcmUgdW5jb21taXR0ZWQgY2hhbmdlcz8KKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAtLXVubWVyZ2VkID4gL2Rldi9udWxsCisJaWYgZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCB8IGdyZXAgLXYgIl5zY3JpcHRzL3BhY2thZ2UiIFwKKwkgICAgfCByZWFkIGR1bW15OyB0aGVuCisJCXByaW50ZiAnJXMnIC1kaXJ0eQorCWZpCisKKwkjIElzIHRoaXMgZ2l0IG9uIHN2bj8KKwlpZiBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLnVybCA+L2Rldi9udWxsOyB0aGVuCisJCXByaW50ZiAtLSAnLXN2biVzJyAiYGdpdCBzdm4gZmluZC1yZXYgJGhlYWRgIgorCWZpCitmaQorCisjIENoZWNrIGZvciBzdm4gYW5kIGEgc3ZuIHJlcG8uCitpZiByZXY9YHN2biBpbmZvIDI+L2Rldi9udWxsYCA7IHRoZW4KKwlyZXY9YGVjaG8gIiR7cmV2fSIgfCBncmVwICdeUmV2aXNpb24nIHwgYXdrICd7cHJpbnQgJE5GfSdgCisJcHJpbnRmIC0tICctc3ZuJXMnICRyZXYKK2ZpCisKKyMgQ2hlY2sgZm9yIGFueSBsb2NhbHZlcnNpb24tKiBmaWxlcworcHJpbnRmICclcycgImBjYXQgbG9jYWx2ZXJzaW9uLSogMj4vZGV2L251bGxgIgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvdG9vbHMvc2lnbkdQLmMgYi94LWxvYWRlci90b29scy9zaWduR1AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZThlZDA3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvdG9vbHMvc2lnbkdQLmMKQEAgLTAsMCArMSw3MyBAQAorLy8KKy8vIHNpZ25HUC5jCisvLyBSZWFkIHRoZSB4LWxvYWQuYmluIGZpbGUgYW5kIHdyaXRlIG91dCB0aGUgeC1sb2FkLmJpbi5pZnQgZmlsZS4KKy8vIFRoZSBzaWduZWQgaW1hZ2UgaXMgdGhlIG9yaWdpbmFsIHByZS1wZW5kZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UKKy8vIGFuZCB0aGUgbG9hZCBhZGRyZXNzLiAgSWYgbm90IGVudGVyZWQgb24gY29tbWFuZCBsaW5lLCBmaWxlIG5hbWUgaXMKKy8vIGFzc3VtZWQgdG8gYmUgeC1sb2FkLmJpbiBpbiBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9hZCBhZGRyZXNzIGlzCisvLyAweDQwMjAwODAwLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKworbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludAlpOworCWNoYXIJaWZuYW1lW0ZJTEVOQU1FX01BWF0sIG9mbmFtZVtGSUxFTkFNRV9NQVhdLCBjaDsKKwlGSUxFCSppZmlsZSwgKm9maWxlOworCXVuc2lnbmVkIGxvbmcJbG9hZGFkZHIsIGxlbjsKKwlzdHJ1Y3Qgc3RhdAlzaW5mbzsKKworCisJLy8gRGVmYXVsdCB0byB4LWxvYWQuYmluIGFuZCAweDQwMjAwODAwLgorCXN0cmNweShpZm5hbWUsICJ4LWxvYWQuYmluIik7CisJbG9hZGFkZHIgPSAweDQwMjAwODAwOworCisJaWYgKChhcmdjID09IDIpIHx8IChhcmdjID09IDMpKQorCQlzdHJjcHkoaWZuYW1lLCBhcmd2WzFdKTsKKworCWlmIChhcmdjID09IDMpCisJCWxvYWRhZGRyID0gc3RydG9sKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCS8vIEZvcm0gdGhlIG91dHB1dCBmaWxlIG5hbWUuCisJc3RyY3B5KG9mbmFtZSwgaWZuYW1lKTsKKwlzdHJjYXQob2ZuYW1lLCAiLmlmdCIpOworCisJLy8gT3BlbiB0aGUgaW5wdXQgZmlsZS4KKwlpZmlsZSA9IGZvcGVuKGlmbmFtZSwgInJiIik7CisJaWYgKGlmaWxlID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW5ub3Qgb3BlbiAlc1xuIiwgaWZuYW1lKTsKKwkJZXhpdCgwKTsKKwl9CisKKwkvLyBHZXQgZmlsZSBsZW5ndGguCisJc3RhdChpZm5hbWUsICZzaW5mbyk7CisJbGVuID0gc2luZm8uc3Rfc2l6ZTsKKworCS8vIE9wZW4gdGhlIG91dHB1dCBmaWxlIGFuZCB3cml0ZSBpdC4KKwlvZmlsZSA9IGZvcGVuKG9mbmFtZSwgIndiIik7CisJaWYgKG9maWxlID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW5ub3Qgb3BlbiAlc1xuIiwgb2ZuYW1lKTsKKwkJZmNsb3NlKGlmaWxlKTsKKwkJZXhpdCgwKTsKKwl9CisKKwkvLyBQYWQgMSBzZWN0b3Igb2YgemVyb2VzLgorCS8vY2ggPSAweDAwOworCS8vZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKKwkvLwlmd3JpdGUoJmNoLCAxLCAxLCBvZmlsZSk7CisKKwlmd3JpdGUoJmxlbiwgMSwgNCwgb2ZpbGUpOworCWZ3cml0ZSgmbG9hZGFkZHIsIDEsIDQsIG9maWxlKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQlmcmVhZCgmY2gsIDEsIDEsIGlmaWxlKTsKKwkJZndyaXRlKCZjaCwgMSwgMSwgb2ZpbGUpOworCX0KKworCWZjbG9zZShpZmlsZSk7CisJZmNsb3NlKG9maWxlKTsKK30K